34 terrassement | Création de jardins | Paysagiste | Créations de bassins
-
34 TERRASSEMENT
Plan du site
Plan du site
Veuillez trouver le plan du site de la SAS CONCEPTION PAYSAGE
SAS CONCEPTION PAYSAGE
34390 MONS
M. Kevin Marcade
☎ : 06 26 35 35 48
Sitemap
Nombre de pages : 11
Autres sites
Formation de Professeur de Yoga dans l'Hérault - Stages de Yoga dans l'Hérault - Haimavati Ashram Sadhana Peeth
Stages de Yoga dans l'Hérault
Yoga Live : Cours de Yoga en live et Etude de textes en live
Formation professeur Yoga
i7informatique Informatique, Sites internet, Téléphonie Sainte-MAxime
Forum sur la recherche spirituelle et le Yoga
Maisons Innovantes Écoénergétiques : LES MAISONS DE CAMILLE
Retraite de Yoga dans l'Hérault
Hôtel Kasbah Riad Amnir à Mahmid une nouvelle vision du luxe dans le désert Marocain
Hôtel Riad à Mahmid, hôtel de luxe dans le désert Marocain
Massage, Sophrologie, Natation, Hypnose à Villeneuve-Loubet : Corinne HOLISTIC
Entretien de piscines à Sainte-Maxime, Grimaud, Port Grimaud, les Issambres, le Plan de la Tour.
Lucie Yoga : Cours de Yoga Marseille 9ème et Cours de Yoga à La Penne sur Huveaune
Isabel Massage à Saint-Laurent-du-Var et à domicile dans les Alpes-Maritimes 06
Jade Haeckler Sainte-Maxime : Accompagnatrice en connaissance de Soi Conseillère agréée Fleurs de Bach - Connexion à l'âme Sophrologue - Praticienne en Hypnose Humaniste
Voyage Désert Maroc Agence de Voyage écotouristique familiale et locale.
La Cabane de Pascale : Objets de décoration mais aussi des créations artisanales.
Marine Technique Méditerranée, le spécialiste des composites dans le Golfe de Saint-Tropez
AZURBOX Grimaud Location de box, espaces pour rangement
Transfert aéroport gare Saint-Tropez, Taxi Sainte-Maxime, Taxi grimaud, Taxi Port-Grimaud
Robert Faure peintre sumi-e. Cours en ligne peinture encre de chine sumi-e
Shiatsu et massage à Monaco et Cap d'ail : Jonathan Oeslick
Randonnées, Excursions, Voyages sur mesure dans le désert Marocain avec Caravane Renard du Désert
Esprit Grimpe Eyguières
Pascale Rome Ostéopathe Sainte-Maxime, grimaud, Porte Grimaud, Le plan de la tour
Yachting Concept : Location de yachts PACA
Shakti hatha Yoga Maussane les Alpilles
/* =========================================================
34 TERRASSEMENT - JavaScript principal
Menu mobile + slider + reveal au scroll + retour en haut + cookies
========================================================= */
(function() {
'use strict';
/* =========================================================
1. MENU MOBILE - Hamburger animé
========================================================= */
function initMobileMenu() {
const mobileMenu = document.getElementById('mobile-menu');
const navList = document.querySelector('.nav-list');
if (!mobileMenu || !navList) return;
mobileMenu.addEventListener('click', function() {
navList.classList.toggle('active');
mobileMenu.classList.toggle('active');
const expanded = navList.classList.contains('active');
mobileMenu.setAttribute('aria-expanded', expanded);
});
// Fermer le menu au clic sur un lien
navList.querySelectorAll('a').forEach(function(link) {
link.addEventListener('click', function() {
navList.classList.remove('active');
mobileMenu.classList.remove('active');
});
});
}
/* =========================================================
2. SLIDER (avec autoplay, dots, swipe tactile)
========================================================= */
function initSlider() {
const slider = document.getElementById('slider1');
if (!slider) return;
const slides = Array.from(slider.querySelectorAll('li'));
if (slides.length === 0) return;
const sliderWrapper = slider.closest('.slider1');
const prevBtn = sliderWrapper.querySelector('.slider-arrow.prev');
const nextBtn = sliderWrapper.querySelector('.slider-arrow.next');
const dotsContainer = sliderWrapper.querySelector('.slider-dots');
let current = 0;
let interval = null;
const delay = 5000;
let touchStartX = 0;
function showSlide(index) {
slides.forEach(function(slide, i) {
slide.classList.toggle('active', i === index);
});
current = index;
updateDots();
}
function goToSlide(index) {
if (index < 0) index = slides.length - 1;
if (index >= slides.length) index = 0;
showSlide(index);
}
function nextSlide() { goToSlide(current + 1); }
function prevSlide() { goToSlide(current - 1); }
function startAutoplay() {
if (slides.length < 2) return;
stopAutoplay();
interval = setInterval(nextSlide, delay);
}
function stopAutoplay() {
if (interval) { clearInterval(interval); interval = null; }
}
function createDots() {
if (!dotsContainer) return;
dotsContainer.innerHTML = '';
slides.forEach(function(_, index) {
const dot = document.createElement('button');
dot.type = 'button';
dot.className = 'slider-dot' + (index === 0 ? ' active' : '');
dot.setAttribute('aria-label', 'Aller à la slide ' + (index + 1));
dot.addEventListener('click', function() {
goToSlide(index);
startAutoplay();
});
dotsContainer.appendChild(dot);
});
}
function updateDots() {
if (!dotsContainer) return;
dotsContainer.querySelectorAll('.slider-dot').forEach(function(dot, i) {
dot.classList.toggle('active', i === current);
});
}
// Une seule slide : tout cacher
if (slides.length < 2) {
if (prevBtn) prevBtn.style.display = 'none';
if (nextBtn) nextBtn.style.display = 'none';
if (dotsContainer) dotsContainer.style.display = 'none';
showSlide(0);
return;
}
createDots();
showSlide(0);
if (prevBtn) prevBtn.addEventListener('click', function() { prevSlide(); startAutoplay(); });
if (nextBtn) nextBtn.addEventListener('click', function() { nextSlide(); startAutoplay(); });
sliderWrapper.addEventListener('mouseenter', stopAutoplay);
sliderWrapper.addEventListener('mouseleave', startAutoplay);
// Swipe tactile
sliderWrapper.addEventListener('touchstart', function(e) {
touchStartX = e.changedTouches[0].clientX;
}, { passive: true });
sliderWrapper.addEventListener('touchend', function(e) {
const delta = e.changedTouches[0].clientX - touchStartX;
if (Math.abs(delta) > 50) { delta < 0 ? nextSlide() : prevSlide(); }
}, { passive: true });
// Pause si onglet inactif (économise CPU)
document.addEventListener('visibilitychange', function() {
document.hidden ? stopAutoplay() : startAutoplay();
});
startAutoplay();
}
/* =========================================================
3. RETOUR EN HAUT
========================================================= */
function initScrollToTop() {
const btn = document.getElementById('scrollToTopBtn');
if (!btn) return;
window.addEventListener('scroll', function() {
const scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
btn.classList.toggle('show', scrollTop > 150);
}, { passive: true });
btn.addEventListener('click', function() {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
}
/* =========================================================
4. ANIMATIONS REVEAL AU SCROLL
========================================================= */
function initReveal() {
if (!('IntersectionObserver' in window)) return;
const observer = new IntersectionObserver(function(entries, obs) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
obs.unobserve(entry.target);
}
});
}, { root: null, rootMargin: '0px', threshold: 0.1 });
// Ajout auto de la classe "reveal" sur h1/h2
document.querySelectorAll('h1, h2').forEach(function(el) {
el.classList.add('reveal');
observer.observe(el);
});
// Observation des reveal-* personnalisés
document.querySelectorAll('.reveal-left, .reveal-right, .reveal-up, .reveal-down').forEach(function(el) {
observer.observe(el);
});
}
/* =========================================================
5. COOKIE BANNER (RGPD - localStorage)
========================================================= */
function initCookieBanner() {
try {
if (localStorage.getItem('cookieConsent')) return;
} catch (e) {
return; // localStorage indisponible (mode privé)
}
const banner = document.createElement('div');
banner.id = 'cookie-banner';
banner.setAttribute('role', 'dialog');
banner.setAttribute('aria-label', 'Consentement aux cookies');
banner.innerHTML =
'Ce site utilise des cookies pour vous offrir la meilleure expérience. ' +
'En savoir plus.
' +
'' +
'' +
'' +
'
';
document.body.appendChild(banner);
document.getElementById('accept-cookies').addEventListener('click', function() {
try { localStorage.setItem('cookieConsent', 'accepted'); } catch (e) {}
banner.remove();
});
document.getElementById('reject-cookies').addEventListener('click', function() {
try { localStorage.setItem('cookieConsent', 'rejected'); } catch (e) {}
banner.remove();
});
}
/* =========================================================
6. INITIALISATION
========================================================= */
function init() {
initMobileMenu();
initSlider();
initScrollToTop();
initReveal();
initCookieBanner();
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();