/*
Theme Name: Glass ShowDark
Theme URI: https://peteratweb.fr
Author: PeterAtWeb - Régis Peter
Author URI: https://peteratweb.fr
Description: Un thème WordPress moderne et épuré avec des effets glassmorphism dark, parfait pour les sites vitrines élégants. Compatible WordPress 7.0.
Version: 1.0.0
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 8.4
License: Copyright © 2026 PeterAtWeb. Ce thème est distribué sous licence GNU General Public. License version 2 ou ultérieure (GPL-2.0-or-later). Les prestations de conception, développement, personnalisation, installation, configuration et maintenance sont facturées indépendamment de la licence du logiciel.
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: vitrine-glass
Tags: glassmorphism, modern, minimal, business, portfolio, showcase, accessibility-ready, full-site-editing, block-styles, custom-logo, custom-menu, featured-images, theme-options, translation-ready, darkmode
*/

/* 
   Polices locales Inter (auto-hébergées)
   */
@font-face {
  font-family: 'Inter';
  src: url('../assets/fonts/Inter-Regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Inter';
  src: url('../assets/fonts/Inter-Medium.woff2') format('woff2');
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Inter';
  src: url('../assets/fonts/Inter-SemiBold.woff2') format('woff2');
  font-weight: 600;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Inter';
  src: url('../assets/fonts/Inter-Bold.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}

/* 
   Variables CSS & Reset
    */
:root {
  /* Palette Dark Premium */
  --color-primary: #6E8CFF;      /* Bleu signature */
  --color-secondary: #B98CFF;    /* Violet accent */
  --color-accent: #6E8CFF;       /* Accent CTA / hover */
  --color-light: #F5F6FA;        /* Blanc cassé (texte clair) */
  --color-dark: #05060A;         /* Fond quasi noir */
  --color-text: rgba(245, 246, 250, 0.72); /* Texte gris clair */
  
  /* Glassmorphism sombre — même verre que le header partout (cartes, hero, boutons...) */
  --glass-bg: rgba(5, 6, 10, 0.45);
  --glass-border: rgba(255, 255, 255, 0.08);
  --glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.05);
  --glass-backdrop: blur(20px);

  /* Badges/pastilles (réseaux sociaux header + footer) — verre plus clair que les
     cartes/le header, pour rester bien identifiables comme éléments cliquables */
  --badge-bg: rgba(255, 255, 255, 0.08);
  --badge-border: rgba(255, 255, 255, 0.22);
  --badge-bg-hover: rgba(255, 255, 255, 0.18);

  /* Boutons (CTA, "voir tous les services", envoyer, retour en haut, nav carrousel)
     — même logique : plus clairs que le fond glass sombre des cartes/du header */
  --btn-bg: rgba(255, 255, 255, 0.08);
  --btn-border: rgba(255, 255, 255, 0.22);
  --btn-bg-hover: rgba(255, 255, 255, 0.16);
  
  /* Espacements */
  --spacing-xs: 0.5rem;
  --spacing-sm: 1rem;
  --spacing-md: 2rem;
  --spacing-lg: 4rem;
  --spacing-xl: 6rem;
  
  /* Transitions Premium 2026 */
  --transition-fast: 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  --transition-normal: 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  --transition-slow: 0.7s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  --transition-spring: 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  --header-height: 80px;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 16px;
  /* Corrige un bug iOS Safari : en rubber-band (overscroll élastique en
     haut/bas de la page), la zone visible sort de <body> et montre le fond
     par défaut du navigateur (blanc) à travers le header fixe en verre
     (backdrop-filter), qui semble alors "devenir blanc/transparent" un
     instant. Une couleur de fond sur <html>, assortie au fond sombre du
     thème, comble ce vide. */
  background-color: #05060A;
}

body {
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  color: var(--color-text);
  line-height: 1.7;
  background: radial-gradient(circle at 20% 15%, rgba(110, 140, 255, 0.10) 0%, transparent 45%), radial-gradient(circle at 85% 80%, rgba(185, 140, 255, 0.08) 0%, transparent 50%), linear-gradient(160deg, #05060A 0%, #0A0C14 45%, #05060A 100%);
  background-size: 200% 200%;
  background-attachment: fixed;
  min-height: 100vh;
  position: relative;
  overflow-x: hidden;
  /* isolation:isolate force <body> à former son propre contexte
     d'empilement : son fond (ci-dessus) se peint alors TOUJOURS en premier
     dans ce contexte, et .animated-bg-scene (z-index:-1, voir plus bas)
     juste après, par-dessus - quel que soit le fond de <html>. Avant cet
     ajout, la scène animée n'était visible que parce que <html> n'avait
     aucun fond (le navigateur "propageait" alors le fond de <body> vers le
     canevas de la page, qui laissait la scène s'afficher par-dessus) ; dès
     que <html> a reçu une couleur de fond (correctif iOS du rebond
     élastique, voir plus bas), cette propagation s'est arrêtée et le fond
     de <body> s'est mis à se peindre par-dessus la scène au lieu d'en
     dessous, la masquant complètement. isolation:isolate rend ce bon
     ordre d'empilement explicite, sans dépendre de cet effet de bord. */
  isolation: isolate;
}

@keyframes gradientShift {
  0% { background-position: 0% 50%; }
  25% { background-position: 100% 0%; }
  50% { background-position: 100% 100%; }
  75% { background-position: 0% 100%; }
  100% { background-position: 0% 50%; }
}

.background-logo-watermark {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 80%;
  max-width: 800px;
  z-index: 0;
  pointer-events: none;
  opacity: 0.05;
  will-change: transform;
}

.background-logo-watermark img {
  width: 100%;
  height: auto;
  filter: blur(8px);
  object-fit: contain;
}

img {
  max-width: 100%;
  height: auto;
  display: block;
}

a {
  text-decoration: none;
  color: inherit;
  transition: var(--transition-fast);
}

/* 
   Loader / Preloader
    */
.site-loader {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 99999;
  transition: opacity 0.5s ease, visibility 0.5s ease;
}

.site-loader.loaded {
  opacity: 0;
  visibility: hidden;
}

.loader-content {
  text-align: center;
}

.loader-logo {
  width: 180px;
  height: auto;
  animation: rotate 2s linear infinite;
  filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.5));
}

.loader-spinner {
  width: 60px;
  height: 60px;
  border: 6px solid rgba(255, 255, 255, 0.3);
  border-top-color: white;
  border-radius: 50%;
  animation: rotate 1s linear infinite;
}

@keyframes rotate {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

/* 
   Effets Glassmorphism
    */
.glass-card {
  background: var(--glass-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--glass-border);
  border-radius: 18px;
  box-shadow: var(--glass-shadow);
  transition: var(--transition-normal);
  position: relative;
  overflow: hidden;
  /* Même correctif de composition Chrome que .site-header (voir plus haut) :
     les cartes en verre utilisent aussi backdrop-filter et peuvent garder
     des fantômes du contenu défilé derrière elles. */
  will-change: transform;
}

.glass-card::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 50%;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.06) 0%, transparent 100%);
  pointer-events: none;
  border-radius: 18px 18px 0 0;
}

.glass-card:not(a):not([data-gsap-card]):hover {
  transform: translateY(-4px);
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.06);
}

/* Repli CSS pour le survol des cartes de service : n'agit que quand GSAP
   n'est pas disponible (classe posée côté PHP, voir front-page.php) —
   sinon js/animations.js pilote seul le survol pour éviter que les deux
   mécanismes ne se disputent le même transform. */
.service-card.card-hover-fallback:not(a):hover {
  transform: translateY(-4px);
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.06);
}

/* 
   Header avec effet glass
    */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 1000;
  background: var(--glass-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border-bottom: 1px solid var(--glass-border);
  padding: var(--spacing-sm) 0;
  transition: background var(--transition-normal), box-shadow var(--transition-normal), border-color var(--transition-normal);
  /* Corrige un bug de rendu Chrome : sans indice de composition dédié, un
     élément position:fixed avec backdrop-filter peut garder à l'écran des
     "fantômes" du contenu qui a défilé en dessous (le flou n'est pas
     recalculé correctement pendant le scroll). will-change force Chrome à
     traiter le header comme son propre calque GPU, qui se repeint bien. */
  will-change: transform;
}

.site-header.has-social-bar {
  /* 44px (hauteur de la barre sociale) + 8px d'espacement visible,
     au lieu d'un simple trait de séparation collé au header */
  top: 52px;
}

.site-social-bar {
  /* Pas de fond ni de flou : les icônes flottent directement sur le fond
     de la page, aucune "barre" visible - seuls les badges ronds de chaque
     icône (voir .social-badge) sont visibles. */
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 44px;
  z-index: 1001;
}

.site-social-bar-inner {
  width: 100%;
  height: 100%;
  margin: 0 auto;
  padding: 0 var(--spacing-md);
  display: flex;
  align-items: center;
  gap: 8px;
}

.site-social-bar.align-left .site-social-bar-inner {
  justify-content: flex-start;
}

.site-social-bar.align-right .site-social-bar-inner {
  justify-content: flex-end;
}

.social-badge {
  min-width: 30px;
  height: 30px;
  padding: 0 10px;
  border-radius: 40%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 0.72rem;
  font-weight: 700;
  color: #fff;
  /* Contrairement aux badges du footer (posés sur le fond sombre du
     footer), ceux-ci flottent seuls tout en haut de page : même
     superposition sombre que sur .services-btn pour ne pas dépendre du
     fond derrière. */
  background: linear-gradient(var(--badge-bg), var(--badge-bg)), rgba(5, 6, 10, 0.7);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--badge-border);
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.25);
  transition: var(--transition-fast);
}

.social-badge svg {
  width: 16px;
  height: 16px;
  display: block;
}

.social-badge:hover {
  background: linear-gradient(var(--badge-bg-hover), var(--badge-bg-hover)), rgba(5, 6, 10, 0.7);
}

.header-container {
  width: 100%;
  margin: 0 auto;
  padding: 0 var(--spacing-md);
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.site-logo {
  font-size: 1.5rem;
  font-weight: 700;
  color: white;
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
}

.site-logo-block {
  display: flex;
  align-items: center;
}

.site-logo-block.has-title-below {
  flex-direction: column;
  align-items: center;
  gap: 8px;
}

.site-logo-title-below {
  color: #ffffff;
  font-size: 0.95rem;
  font-weight: 600;
  line-height: 1.2;
  text-align: center;
  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}

.menu-toggle {
  display: none;
  width: 44px;
  height: 44px;
  border: 1px solid rgba(255, 255, 255, 0.25);
  border-radius: 12px;
  background: rgba(255, 255, 255, 0.12);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  cursor: pointer;
  padding: 10px;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 5px;
}

.menu-toggle span {
  display: block;
  width: 20px;
  height: 2px;
  border-radius: 2px;
  background: #ffffff;
  transition: transform var(--transition-normal), opacity var(--transition-normal);
}

.menu-toggle:hover {
  background: rgba(255, 255, 255, 0.2);
}

.menu-toggle.is-active span:nth-child(1) {
  transform: translateY(7px) rotate(45deg);
}

.menu-toggle.is-active span:nth-child(2) {
  opacity: 0;
}

.menu-toggle.is-active span:nth-child(3) {
  transform: translateY(-7px) rotate(-45deg);
}

.mobile-menu-overlay {
  display: none;
}

.site-logo.logo-circle {
  width: 80px;
  height: 80px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(255, 255, 255, 0.15);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border: 2px solid rgba(255, 255, 255, 0.3);
  box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.2);
  padding: 10px;
  transition: var(--transition-normal);
}

.site-logo.logo-circle:hover {
  transform: scale(1.05);
  box-shadow: 0 12px 48px 0 rgba(31, 38, 135, 0.3);
}

.site-logo.logo-circle a {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
}

.site-logo.logo-circle img,
.site-logo.logo-circle .custom-logo {
  max-width: 100%;
  max-height: 100%;
  width: 100%;
  height: 100%;
  object-fit: contain;
  border-radius: 50%;
}

.site-navigation ul {
  list-style: none;
  display: flex;
  gap: var(--spacing-md);
}

.site-navigation a {
  color: white;
  font-weight: 500;
  padding: var(--spacing-xs) var(--spacing-sm);
  border-radius: 10px;
  transition: var(--transition-fast);
}

.site-navigation a:hover {
  background: rgba(255, 255, 255, 0.2);
}

/* 
   Section Hero
    */
.hero-section {
  /* Le dégagement sous le header fixe est déjà géré par .site-main (padding-top) ;
     un margin-top ici doublait l'écart. */
  padding: var(--spacing-lg) var(--spacing-md);
  text-align: center;
  position: relative;
  z-index: 1;
}

.hero-content {
  max-width: 1200px;
  margin: 0 auto;
  padding: var(--spacing-lg);
  background: var(--glass-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--glass-border);
  border-radius: 30px;
  box-shadow: var(--glass-shadow);
  position: relative;
  overflow: hidden;
  perspective: 1000px;
}

.hero-content::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 50%;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.10) 0%, transparent 100%);
  pointer-events: none;
  border-radius: 30px 30px 0 0;
}

.hero-title {
  font-size: clamp(2.5rem, 5vw, 4rem);
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.01em;
  color: white;
  margin-bottom: var(--spacing-sm);
  text-shadow: 0 2px 30px rgba(0, 0, 0, 0.45);
}

.hero-subtitle {
  font-size: clamp(1.2rem, 2vw, 1.5rem);
  color: rgba(255, 255, 255, 0.9);
  margin-bottom: 0.5rem;
  line-height: 1.6;
}

.hero-description {
  font-size: clamp(0.95rem, 1.3vw, 1.1rem);
  color: rgba(255, 255, 255, 0.75);
  line-height: 1.7;
  margin-bottom: var(--spacing-md);
  max-width: 700px;
}

.hero-text-content {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.hero-cta {
  display: inline-block;
  padding: var(--spacing-sm) var(--spacing-lg);
  background: var(--btn-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--btn-border);
  color: white;
  font-weight: 700;
  font-size: 1.1rem;
  /* Même arrondi que .form-submit : tous les boutons texte partagent le
     même style (plus de pill à 50px). */
  border-radius: 12px;
  box-shadow: var(--glass-shadow);
  transition: var(--transition-normal);
  cursor: pointer;
  margin-top: var(--spacing-sm);
}

.hero-cta:hover {
  background: var(--btn-bg-hover);
  transform: translateY(-3px);
  box-shadow: 0 6px 30px rgba(0, 0, 0, 0.3);
}

/* 
   Section intermédiaire
    */
.mid-section {
  padding: var(--spacing-xl) var(--spacing-md);
  width: 100%;
  position: relative;
  z-index: 1;
}

.mid-container {
  max-width: 1440px;
  margin: 0 auto;
  padding: 0;
  overflow: hidden;
  border-radius: 30px;
}

.mid-container > .section-title {
  padding: var(--spacing-lg) var(--spacing-lg) 0;
  margin-bottom: var(--spacing-md);
}

.mid-content {
  position: relative;
  width: 100%;
}

/* Image plein écran à 75vh */
.mid-media {
  width: 100%;
  min-height: 75vh;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

.mid-media img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* Texte superposé sur l'image (1/3 de largeur) */
.mid-text-overlay {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 33.333%;
  padding: var(--spacing-lg);
  background: var(--glass-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--glass-border);
  border-radius: 20px;
  box-shadow: var(--glass-shadow);
  color: white;
  font-family: inherit;
  line-height: 1.8;
  font-size: 1.05rem;
  z-index: 2;
}

.mid-text-overlay.text_left {
  left: var(--spacing-lg);
}

.mid-text-overlay.text_right {
  right: var(--spacing-lg);
}

.mid-text-overlay p {
  color: white;
  margin-bottom: var(--spacing-sm);
}

/* Option : désactiver le glassmorphisme sur le texte overlay */
.mid-text-overlay.no-glass {
  background: none;
  border: none;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

/* Vidéo format 16:9 (YouTube) */
.mid-video-wrapper {
  width: 100%;
  max-width: 900px;
  margin: 0 auto;
  position: relative;
  padding-bottom: 56.25%;
  border-radius: 20px;
  overflow: hidden;
  border: 1px solid var(--glass-border);
  box-shadow: var(--glass-shadow);
}

.mid-video-wrapper iframe,
.mid-video-wrapper video {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

/* Cas sans image : texte et vidéo en colonne */
.mid-content.no-image .mid-text-overlay {
  position: relative;
  top: auto;
  transform: none;
  width: 100%;
  left: auto;
  right: auto;
  margin-bottom: var(--spacing-md);
  background: var(--glass-bg);
}

@media (max-width: 768px) {
  .mid-text-overlay {
    position: relative;
    top: auto;
    transform: none;
    width: 100%;
    left: auto !important;
    right: auto !important;
    margin: 0;
    border-radius: 0;
  }
  
  .mid-media {
    min-height: 40vh;
  }
}

/* Tablette : l'overlay à 33% devient illisible/trop serré, on l'élargit
   et on borne la hauteur de l'image avant de basculer en colonne à 768px */
@media (min-width: 769px) and (max-width: 1024px) {
  .mid-text-overlay {
    width: 50%;
  }

  .mid-media {
    min-height: 55vh;
  }

  .services-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* 
   Carrousel Premium 2026 — Coverflow + Cinématique
    */
.carousel-section {
  padding: var(--spacing-xl) var(--spacing-md);
  width: 100%;
  position: relative;
  z-index: 1;
}

.carousel-container {
  position: relative;
  max-width: 1440px;
  margin: 0 auto;
}

.carousel-wrapper {
  position: relative;
  padding: 40px 0;
  perspective: 1200px;
  overflow: hidden;
}

.carousel-track {
  display: flex;
  align-items: center;
  transition: transform 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  cursor: grab;
  touch-action: pan-y;
  will-change: transform;
}

.carousel-track:active {
  cursor: grabbing;
}

.carousel-slide {
  flex: 0 0 60%;
  max-width: 60%;
  padding: 0 10px;
  transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  position: relative;
  transform-style: preserve-3d;
  cursor: pointer;
  box-sizing: border-box;
}

.carousel-slide:not(.is-active) {
  opacity: 0.4;
  transform: scale(0.85) rotateY(12deg);
  filter: brightness(0.7);
}

.carousel-slide.is-prev {
  transform: scale(0.85) rotateY(12deg);
}

.carousel-slide.is-next {
  transform: scale(0.85) rotateY(-12deg);
}

.carousel-slide.is-active {
  opacity: 1;
  transform: scale(1) rotateY(0deg);
  filter: brightness(1);
  z-index: 10;
}

.carousel-image-wrapper {
  position: relative;
  width: 100%;
  padding-bottom: 56.25%; /* 16:9 */
  border-radius: 20px;
  overflow: hidden;
  border: 1px solid var(--glass-border);
  box-shadow: var(--glass-shadow);
}

/* Ken Burns — léger zoom animé */
.carousel-slide.is-active .carousel-image-wrapper img {
  animation: kenBurns 8s ease-in-out infinite alternate;
}

.carousel-image-wrapper img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.8s ease;
}

/* Texte animé */
.carousel-caption {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: var(--spacing-lg) var(--spacing-md) var(--spacing-md);
  background: linear-gradient(transparent, rgba(0, 0, 0, 0.7));
  border-radius: 0 0 20px 20px;
  opacity: 0;
  transform: translateY(20px);
  transition: all 0.6s ease 0.3s;
}

.carousel-slide.is-active .carousel-caption {
  opacity: 1;
  transform: translateY(0);
}

.carousel-caption-title {
  color: white;
  font-size: 1.3rem;
  font-weight: 600;
  margin-bottom: 0.25rem;
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.4);
}

.carousel-caption-desc {
  color: rgba(255, 255, 255, 0.8);
  font-size: 0.9rem;
  line-height: 1.5;
}

@keyframes kenBurns {
  0% { transform: scale(1); }
  100% { transform: scale(1.08); }
}

/* Navigation */
.carousel-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: var(--btn-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--btn-border);
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: var(--transition-normal);
  z-index: 20;
  opacity: 0.8;
}

.carousel-prev {
  left: 20px;
}

.carousel-next {
  right: 20px;
}

.carousel-wrapper:hover .carousel-nav {
  opacity: 1;
}

.carousel-nav:hover {
  background: var(--btn-bg-hover);
  transform: translateY(-50%) scale(1.1);
}

/* Dots */
.carousel-dots {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 8px;
  margin-top: var(--spacing-md);
}

.carousel-dots button {
  width: 8px;
  height: 8px;
  /* min-width/min-height explicites : la regle globale "button { min-width:44px;
     min-height:44px }" (cibles tactiles WCAG, cf. plus bas dans ce fichier)
     s'applique a tous les <button> du site et gagne toujours sur width/height
     (min-width prime sur width). Sans cette ligne, chaque dot se retrouvait
     rendu a 44x44px - un gros rond blanc, quelle que soit la taille demandee ici. */
  min-width: 8px;
  min-height: 8px;
  border-radius: 50%;
  background: var(--btn-border);
  border: none;
  cursor: pointer;
  transition: var(--transition-normal);
  padding: 0;
  -webkit-tap-highlight-color: transparent;
}

.carousel-dots button.is-active {
  /* Couleur des boutons du theme (nav du carrousel, CTA...) plutot qu'un bleu
     accent ou du blanc plat : meme fond que l'etat hover des boutons, avec le
     meme liseret, pour que le dot actif se distingue tout en restant dans le
     langage visuel "verre" sombre du theme. */
  background: var(--btn-bg-hover);
  border: 1px solid var(--btn-border);
}

/* Drag to slide */
.carousel-track {
  cursor: grab;
}

.carousel-track:active {
  cursor: grabbing;
}

/* Mode réorganisation pour les administrateurs */
.carousel-draggable {
  cursor: grab !important;
  user-select: none;
  transition: transform 0.2s ease, box-shadow 0.2s ease !important;
}

.carousel-draggable:active {
  cursor: grabbing !important;
}

.carousel-draggable.carousel-dragging {
  opacity: 0.5;
  transform: scale(0.95) !important;
  outline: 3px dashed #2271b1;
  outline-offset: 4px;
  border-radius: 20px;
}

.carousel-draggable.carousel-drag-over {
  transform: scale(1.05) !important;
  box-shadow: 0 0 30px rgba(34, 113, 177, 0.5) !important;
  outline: 3px solid #2271b1;
  outline-offset: 3px;
  border-radius: 20px;
}

.carousel-reorder-toggle-btn:hover {
  transform: scale(1.05);
  box-shadow: 0 4px 15px rgba(0,0,0,0.3);
}

.carousel-reorder-toggle-btn:active {
  transform: scale(0.97);
}

/* Responsive */
@media (max-width: 768px) {
  .carousel-section {
    padding: var(--spacing-md) var(--spacing-sm);
  }

  .carousel-wrapper {
    padding: 16px 0;
    perspective: none;
  }

  .carousel-slide {
    flex: 0 0 80%;
    max-width: 80%;
    padding: 0 6px;
  }

  .carousel-nav {
    display: none;
  }

  .carousel-slide:not(.is-active) {
    opacity: 0.45;
    transform: scale(0.92) rotateY(0deg);
    filter: brightness(0.85);
  }

  .carousel-slide.is-prev {
    transform: scale(0.92) translateX(-6%);
  }

  .carousel-slide.is-next {
    transform: scale(0.92) translateX(6%);
  }

  .carousel-caption {
    padding: var(--spacing-md) var(--spacing-sm) var(--spacing-sm);
  }

  .carousel-caption-title {
    font-size: 1.05rem;
  }

  .carousel-caption-desc {
    font-size: 0.8rem;
    line-height: 1.4;
  }

  .carousel-dots {
    margin-top: 14px;
    gap: 10px;
  }
}

/* Image secondaire à côté du sous-titre Hero */
.hero-subtitle-wrapper {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-md);
  margin-bottom: var(--spacing-sm);
}

.hero-side-image {
  width: auto;
  height: auto;
  border-radius: 20px;
  object-fit: contain;
  flex-shrink: 0;
  border: 2px solid rgba(255, 255, 255, 0.3);
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
  transition: var(--transition-normal);
}

.hero-side-video {
  background: rgba(0, 0, 0, 0.1);
}

.hero-side-image:hover {
  transform: scale(1.05);
  border-color: rgba(255, 255, 255, 0.5);
}

/* Comportement vidéo : pas de hover scale pour éviter le décalage */
.hero-side-video:hover {
  transform: none;
  border-color: rgba(255, 255, 255, 0.5);
}

/* Position : gauche */
.hero-side-image-left {
  flex-direction: row;
}

/* Position : droite */
.hero-side-image-right {
  flex-direction: row-reverse;
}

/* Position : haut (image au-dessus du texte) */
.hero-side-image-top {
  flex-direction: column;
}

/* Position : bas (image en dessous du texte) */
.hero-side-image-bottom {
  flex-direction: column-reverse;
}

.hero-side-image-left .hero-subtitle,
.hero-side-image-right .hero-subtitle,
.hero-side-image-left .hero-description,
.hero-side-image-right .hero-description,
.hero-side-image-left .hero-text-content,
.hero-side-image-right .hero-text-content {
  text-align: center;
}

.hero-side-image-left .hero-text-content,
.hero-side-image-right .hero-text-content {
  flex: 1;
}

.hero-side-image-top .hero-subtitle,
.hero-side-image-bottom .hero-subtitle {
  margin-bottom: 0;
}

/* 
   Section Services
    */
.services-section {
  padding: var(--spacing-xl) var(--spacing-md);
  width: 100%;
  position: relative;
  z-index: 1;
}

.section-title {
  font-size: clamp(2rem, 4vw, 3rem);
  font-weight: 700;
  color: white;
  text-align: center;
  margin-bottom: var(--spacing-lg);
  text-shadow: 0 2px 20px rgba(0, 0, 0, 0.4);
}

.services-grid {
  display: grid;
  grid-template-columns: repeat(var(--services-cols, 4), minmax(0, 1fr));
  gap: var(--spacing-md);
  max-width: 1440px;
  margin: 0 auto;
}

.services-btn-wrapper {
  text-align: center;
  margin-top: var(--spacing-lg);
}

.services-btn {
  display: inline-block;
  padding: var(--spacing-sm) var(--spacing-lg);
  /* Les autres boutons (hero-cta, form-submit...) sont posés sur une carte
     glass déjà sombre ; celui-ci est seul sur le fond de page, plus clair.
     On superpose une couche sombre plus opaque que --glass-bg sous
     --btn-bg pour ne plus dépendre de ce qu'il y a derrière. */
  background: linear-gradient(var(--btn-bg), var(--btn-bg)), rgba(5, 6, 10, 0.7);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--btn-border);
  color: white;
  font-weight: 700;
  font-size: 1.1rem;
  /* Même arrondi que .form-submit : tous les boutons texte partagent le
     même style (plus de pill à 50px). */
  border-radius: 12px;
  box-shadow: var(--glass-shadow);
  transition: var(--transition-normal);
  cursor: pointer;
  text-decoration: none;
}

.services-btn:hover {
  background: linear-gradient(var(--btn-bg-hover), var(--btn-bg-hover)), rgba(5, 6, 10, 0.7);
  transform: translateY(-3px);
  box-shadow: 0 12px 48px 0 rgba(0, 0, 0, 0.4);
}

.service-card {
  padding: var(--spacing-lg);
  text-align: left;
  position: relative;
  display: flex;
  flex-direction: column;
}

.service-card-btn {
  display: inline-block;
  align-self: flex-start;
  margin-top: var(--spacing-sm);
  padding: 0.5em 1.25em;
  background: var(--btn-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--btn-border);
  color: white;
  font-weight: 700;
  font-size: 0.95rem;
  border-radius: 12px;
  box-shadow: var(--glass-shadow);
  transition: var(--transition-normal);
  cursor: pointer;
  text-decoration: none;
}

.service-card-btn:hover {
  background: var(--btn-bg-hover);
  transform: translateY(-3px);
  box-shadow: 0 6px 30px rgba(0, 0, 0, 0.3);
}

.service-number {
  display: block;
  font-size: clamp(2.25rem, 4vw, 3.25rem);
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--color-primary);
  opacity: 0.9;
  margin-bottom: var(--spacing-sm);
}

a.service-card-link {
  display: block;
  text-decoration: none;
  color: inherit;
  cursor: pointer;
  transition: var(--transition-normal);
}

a.service-card-link.card-hover-fallback:hover {
  transform: translateY(-8px);
  box-shadow: 0 16px 48px 0 rgba(0, 0, 0, 0.4);
}

a.service-card-link .service-title {
  transition: var(--transition-normal);
}

a.service-card-link:hover .service-title {
  color: #fff;
  text-shadow: 0 2px 12px rgba(255, 255, 255, 0.5);
}

.service-icon {
  display: block;
  font-size: clamp(2rem, 3.5vw, 2.75rem);
  line-height: 1;
  margin-bottom: var(--spacing-sm);
}

.service-marker-text {
  display: inline-block;
  font-size: 0.85rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-primary);
  opacity: 0.9;
  padding: 4px 12px;
  border: 1px solid var(--glass-border);
  border-radius: 999px;
  margin-bottom: var(--spacing-sm);
}

.service-title {
  font-size: 1.5rem;
  font-weight: 600;
  color: white;
  margin-bottom: var(--spacing-sm);
}

.service-description {
  color: rgba(255, 255, 255, 0.85);
  line-height: 1.8;
}

.service-thumbnail {
  margin-top: var(--spacing-md);
  border-radius: 12px;
  overflow: hidden;
  border: 1px solid rgba(255, 255, 255, 0.2);
}

.service-thumbnail img {
  width: 100%;
  height: auto;
  display: block;
  transition: var(--transition-normal);
}

a.service-card-link:hover .service-thumbnail img {
  transform: scale(1.05);
}

/* 
   Section Avis
    */
.reviews-section {
  padding: var(--spacing-xl) var(--spacing-md);
  position: relative;
  z-index: 1;
}

.reviews-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: var(--spacing-md);
  width: 100%;
  max-width: 1440px;
  margin: 0 auto;
}

/* Widget tiers (Elfsight, Taggbox, EmbedSocial...) : on le recentre et on le limite
   a la meme largeur que le reste du contenu (1440px, comme .carousel-container et
   .services-grid) - sans cette regle il n'y a AUCUNE limite de largeur et le widget
   s'etire sur toute la largeur de l'ecran. overflow-x en secours si le widget impose
   une largeur minimale plus grande que l'ecran sur mobile. */
.reviews-widget-embed {
  max-width: 1440px;
  margin: 0 auto;
  width: 100%;
  overflow-x: auto;
}

.review-card {
  padding: var(--spacing-lg);
  text-align: center;
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sm);
}

.review-photo {
  width: 80px;
  height: 80px;
  margin: 0 auto var(--spacing-sm);
  border-radius: 50%;
  overflow: hidden;
  border: 2px solid rgba(255, 255, 255, 0.3);
}

.review-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.review-rating {
  display: flex;
  justify-content: center;
  gap: 0.25rem;
  font-size: 1.5rem;
}

.review-rating .star {
  color: rgba(255, 255, 255, 0.3);
  transition: var(--transition-fast);
}

.review-rating .star.filled {
  color: #FFD700;
  text-shadow: 0 0 10px rgba(255, 215, 0, 0.5);
}

.review-text {
  color: rgba(255, 255, 255, 0.9);
  line-height: 1.8;
  font-style: italic;
  flex: 1;
}

.review-author {
  color: white;
  font-weight: 600;
  font-size: 1.1rem;
  margin-top: var(--spacing-xs);
}

.review-source {
  margin-top: var(--spacing-xs);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0.8;
}

/* 
   Section Contact
    */
.contact-section {
  padding: var(--spacing-xl) var(--spacing-md);
  max-width: 700px;
  margin: 0 auto;
  position: relative;
  z-index: 1;
}

.contact-form {
  padding: var(--spacing-lg);
}

.form-group {
  margin-bottom: var(--spacing-md);
}

.form-label {
  display: block;
  color: white;
  font-weight: 500;
  margin-bottom: var(--spacing-xs);
}

.form-input,
.form-textarea {
  width: 100%;
  padding: var(--spacing-sm);
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: 12px;
  color: white;
  font-family: inherit;
  font-size: 1rem;
  transition: var(--transition-fast);
}

.form-input::placeholder,
.form-textarea::placeholder {
  color: rgba(245, 246, 250, 0.4);
}

.form-input:focus,
.form-textarea:focus {
  outline: none;
  background: rgba(255, 255, 255, 0.08);
  border-color: var(--color-primary);
}

.form-textarea {
  resize: vertical;
  min-height: 150px;
}

.form-submit {
  width: 100%;
  padding: var(--spacing-sm) var(--spacing-md);
  background: var(--btn-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--btn-border);
  color: white;
  font-weight: 600;
  border-radius: 12px;
  cursor: pointer;
  font-size: 1.1rem;
  transition: var(--transition-normal);
  box-shadow: var(--glass-shadow);
}

.form-submit:hover {
  background: var(--btn-bg-hover);
  transform: translateY(-2px);
  box-shadow: 0 12px 48px 0 rgba(0, 0, 0, 0.45);
}

/* 
   Image Parallaxe
    */
.parallax-image-section {
  padding: var(--spacing-lg) var(--spacing-md) var(--spacing-xl);
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;
  z-index: 1;
}

.parallax-image-container {
  width: 100%;
  max-width: 600px;
  height: 400px;
  overflow: hidden;
  border-radius: 20px;
  border: 1px solid rgba(255, 255, 255, 0.2);
  position: relative;
}

.parallax-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  will-change: transform;
  transition: transform 0.1s linear;
}

/* Quand le parallaxe est désactivé : l'image reste centrée et immobile */
.parallax-image-container[data-parallax-enabled="0"] .parallax-image {
  height: 100%;
  transform: none !important;
}

/* Parallaxe sur les images du contenu (mid-image, etc.) */
img.mid-image,
img.parallax-content-image {
  width: 100%;
  height: auto;
  border-radius: 20px;
  border: 1px solid rgba(255, 255, 255, 0.2);
  box-shadow: var(--glass-shadow);
  margin: var(--spacing-lg) 0;
  display: block;
  /* Retiré will-change et transition, on utilise JS directement */
}

/* Conteneur qui permet le parallaxe via perspective */
.entry-content {
  perspective: 1px;
  transform-style: preserve-3d;
}

/* 
   Footer avec effet glass
    */
.site-footer {
  position: relative;
  background: var(--glass-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border-top: 1px solid var(--glass-border);
  padding: var(--spacing-lg) var(--spacing-md);
  color: white;
  position: relative;
  z-index: 1;
}

.footer-container {
  width: 100%;
  margin: 0 auto;
}

.footer-social-bar {
  display: flex;
  flex-direction: column;
  gap: 8px;
  align-items: center;
  justify-content: center;
}

.footer-content {
  display: flex;
  gap: var(--spacing-sm);
  align-items: center;
  margin-bottom: var(--spacing-sm);
  justify-content: space-between;
}

.footer-image {
  flex-shrink: 0;
}

.footer-image img {
  height: auto;
  border-radius: 12px;
  border: 1px solid rgba(255, 255, 255, 0.2);
}

.footer-info {
  flex: 1;
  text-align: left;
}

.footer-breadcrumbs {
  flex-shrink: 0;
  text-align: right;
  padding-left: var(--spacing-md);
  max-width: 40%;
}

.footer-breadcrumbs nav {
  color: rgba(255, 255, 255, 0.7);
  font-size: 0.85rem;
  line-height: 1.8;
}

.footer-breadcrumbs a {
  color: rgba(255, 255, 255, 0.7);
  text-decoration: none;
  transition: var(--transition-fast);
}

.footer-breadcrumbs a:hover {
  color: white;
  text-decoration: underline;
}

.footer-breadcrumbs .breadcrumb-current {
  color: rgba(255, 255, 255, 0.9);
}

.footer-breadcrumbs .breadcrumb-sep {
  color: rgba(255, 255, 255, 0.4);
  margin: 0 4px;
}

.footer-details {
  color: rgba(255, 255, 255, 0.9);
  line-height: 1.8;
  margin-bottom: var(--spacing-sm);
  font-size: 0.95rem;
}

.footer-line {
  display: block;
  margin-bottom: 2px;
}

.footer-line a {
  color: rgba(255, 255, 255, 0.9);
  text-decoration: underline;
  text-underline-offset: 2px;
  transition: var(--transition-fast);
}

.footer-line a:hover {
  color: white;
  text-decoration-thickness: 2px;
}

.footer-copyright {
  color: rgba(255, 255, 255, 0.7);
  font-size: 0.9rem;
  margin-top: var(--spacing-md);
  text-align: center;
}

.footer-navigation {
  text-align: center;
  margin-top: var(--spacing-md);
  padding-top: var(--spacing-md);
  border-top: 1px solid rgba(255, 255, 255, 0.1);
}

.footer-links {
  list-style: none;
  display: flex;
  justify-content: center;
  gap: var(--spacing-md);
  flex-wrap: wrap;
}

.footer-links a {
  color: rgba(255, 255, 255, 0.8);
  transition: var(--transition-fast);
}

.footer-links a:hover {
  color: white;
}

.footer-legal {
  text-align: center;
  margin-top: var(--spacing-md);
  padding-top: var(--spacing-sm);
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  width: 100%;
}

.footer-legal-links {
  list-style: none;
  display: flex;
  justify-content: center;
  gap: var(--spacing-md);
  flex-wrap: wrap;
  margin: 0 auto;
  padding: 0;
}

.footer-legal-links li {
  display: inline-block;
}

.footer-legal-links a {
  color: rgba(255, 255, 255, 0.7);
  font-size: 0.9rem;
  text-decoration: none;
  text-underline-offset: 3px;
  transition: color 0.2s ease, text-decoration 0.2s ease;
}

.footer-legal-links a:hover {
  color: white;
  text-decoration: underline;
  text-decoration-thickness: 2px;
}

.footer-legal-links li + li::before {
  content: "|";
  color: rgba(255, 255, 255, 0.3);
  margin-right: var(--spacing-md);
}

@media (max-width: 768px) {
  .footer-legal-links li + li::before {
    display: none;
  }
  
  .footer-legal-links {
    flex-direction: column;
    gap: var(--spacing-xs);
  }
}

/* 
   Réseaux sociaux dans le footer
    */
.footer-social-badge {
  width: 36px;
  height: 36px;
  padding: 0;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 0.72rem;
  font-weight: 700;
  color: #fff;
  background: var(--badge-bg);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  border: 1px solid var(--badge-border);
  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.05);
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.25);
  transition: var(--transition-fast);
}

.footer-social-badge svg {
  width: 16px;
  height: 16px;
  display: block;
}

.footer-social-badge:hover {
  background: var(--badge-bg-hover);
  transform: translateY(-2px);
}

/* 
   Bouton retour en haut de page (glassmorphism)
    */
.back-to-top {
  position: fixed;
  right: 1.5rem;
  /* 110px = passe au-dessus du bouton de réouverture des cookies (bandeau RGPD :
     bottom 20px + hauteur 45px) avec un espace équivalent à sa taille (45px) */
  bottom: 110px;
  z-index: 999;
  width: 48px;
  height: 48px;
  padding: 0;
  border: 1px solid var(--btn-border);
  border-radius: 50%;
  /* Flotte au-dessus du contenu qui défile, sans carte derrière : même
     superposition sombre que sur .services-btn / .social-badge. */
  background: linear-gradient(var(--btn-bg), var(--btn-bg)), rgba(5, 6, 10, 0.7);
  backdrop-filter: var(--glass-backdrop);
  -webkit-backdrop-filter: var(--glass-backdrop);
  box-shadow: var(--glass-shadow);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  opacity: 0;
  visibility: hidden;
  transform: translateY(12px);
  transition: opacity var(--transition-normal), transform var(--transition-normal), visibility var(--transition-normal), background var(--transition-fast);
}

.back-to-top.is-visible {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.back-to-top:hover,
.back-to-top:focus-visible {
  background: linear-gradient(var(--btn-bg-hover), var(--btn-bg-hover)), rgba(5, 6, 10, 0.7);
  transform: translateY(-3px);
}

.back-to-top svg {
  width: 20px;
  height: 20px;
  pointer-events: none;
}

@media (max-width: 600px) {
  .back-to-top {
    right: 1rem;
    /* 90px = au-dessus du bouton cookie mobile (bottom 10px + hauteur 40px)
       avec un espace équivalent à sa taille (40px) */
    bottom: 90px;
    width: 42px;
    height: 42px;
  }
}

/* 
   Accessibilité - Conformité WCAG 2.1 AA
    */

/* Focus visible sur tous les éléments interactifs */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible {
  outline: 3px solid #FFD166 !important;
  outline-offset: 2px !important;
  box-shadow: 0 0 0 4px rgba(255, 209, 102, 0.3) !important;
}

/* Fallback pour les navigateurs sans :focus-visible */
a:focus,
button:focus,
input:focus,
textarea:focus,
select:focus {
  outline: 3px solid #FFD166 !important;
  outline-offset: 2px !important;
}

/* Supprimer le focus outline sur les clics souris (gracefully degrade) */
a:focus:not(:focus-visible),
button:focus:not(:focus-visible),
input:focus:not(:focus-visible) {
  outline: none !important;
  box-shadow: none !important;
}

/* Navigation au clavier - état actif */
a:active,
button:active {
  opacity: 0.85;
}

/* Contraste des couleurs WCAG 2.1 AA (ratio ≥ 4.5:1) */
.hero-title,
.section-title,
.service-title,
.entry-title {
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}

.hero-subtitle,
.service-description,
.footer-details {
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);
}

/* Ajustement pour les pages - éviter le header fixe */
.privacy-policy-page,
.legal-notice-page {
  padding-top: calc(var(--header-height) + 28px);
}

.site-main {
  padding-top: calc(var(--header-height) + 20px) !important;
}

/* Liens clairement identifiables : uniquement dans le texte de contenu
   (articles, pages) — la nav, les cartes et les boutons ont déjà leurs
   propres états visuels (couleur, hover, forme) et n'ont pas besoin d'un
   soulignement systématique. */
.entry-content a {
  text-decoration: underline;
  text-underline-offset: 2px;
}

.entry-content a:hover {
  text-decoration-thickness: 2px;
}

/* Support du mode "préfère mouvement réduit" */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  
  .hero-section,
  .glass-card,
  .fade-in-up {
    animation: none !important;
    opacity: 1 !important;
    transform: none !important;
  }
  
  .site-header {
    transition: none !important;
  }
  
  .parallax-image {
    transform: none !important;
  }
  
  .background-logo-watermark {
    transform: translate(-50%, -50%) !important;
  }
}

/* Support du mode "préfère contraste élevé" */
@media (prefers-contrast: high) {
  :root {
    --glass-bg: rgba(0, 0, 0, 0.3);
    --glass-border: rgba(255, 255, 255, 0.6);
  }
  
  .hero-content,
  .glass-card,
  .site-header {
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
    background: none;
  border: none;
  box-shadow: none;
    border-width: 2px;
  }
  
  .hero-title,
  .section-title,
  .service-title,
  .form-label,
  .site-logo,
  .review-author {
    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.8);
  }
  
  .hero-subtitle,
  .service-description,
  .review-text,
  .footer-details,
  .entry-content {
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
  }
  
  a {
    text-decoration: underline;
    text-decoration-thickness: 2px;
  }
  
  .form-input,
  .form-textarea {
    border-width: 2px;
  }
  
  .hero-cta,
  .form-submit {
    border: 2px solid #fff;
  }
}

/* Classes utilitaires d'accessibilité */
.screen-reader-text {
  border: 0;
  clip: rect(1px, 1px, 1px, 1px);
  clip-path: inset(50%);
  height: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
  width: 1px;
  word-wrap: normal !important;
}

/* Support des lecteurs d'écran - espacement et sémantique */
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 9999;
  background: #fff;
  color: #000;
  padding: 8px 16px;
  text-decoration: none;
  font-weight: 600;
}

.skip-link:focus {
  left: 5px;
  top: 5px;
}

/* Taille de texte minimum pour la lisibilité */
html {
  font-size: 16px;
}

body {
  font-size: 1rem;
  line-height: 1.6;
}

/* Cibles tactiles minimum (44x44px) pour les mobiles */
.menu-toggle,
.hero-cta,
.form-submit,
.social-badge,
button,
a.button {
  min-height: 44px;
  min-width: 44px;
}

/* 
   Responsive
    */
@media (max-width: 768px) {
  body.menu-open {
    overflow: hidden;
  }

  .menu-toggle {
    display: inline-flex;
    position: relative;
    z-index: 1003;
  }

  .mobile-menu-overlay {
    display: block;
    position: fixed;
    inset: 0;
    z-index: 1001;
    border: 0;
    padding: 0;
    margin: 0;
    background: rgba(10, 20, 35, 0.55);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity var(--transition-normal), visibility var(--transition-normal);
  }

  .mobile-menu-overlay.is-open {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
  }

  .site-navigation {
    position: fixed;
    top: 0;
    right: 0;
    width: min(320px, 85vw);
    height: 100dvh;
    display: flex;
    flex-direction: column;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translateX(100%);
    transition: opacity var(--transition-normal), transform var(--transition-slow), visibility var(--transition-normal);
    background: rgba(10, 20, 35, 0.92);
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    border-left: 1px solid rgba(255, 255, 255, 0.15);
    padding: calc(var(--header-height) + 20px) var(--spacing-md) var(--spacing-lg);
    z-index: 1002;
    box-shadow: -10px 0 40px rgba(0, 0, 0, 0.3);
    overflow-y: auto;
  }

  .site-navigation.is-open {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translateX(0);
  }

  .site-navigation ul {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin: 0;
    padding: 0;
  }

  .site-navigation a {
    display: block;
    color: #ffffff;
    font-weight: 600;
    padding: 10px 12px;
    border-radius: 10px;
    background: rgba(255, 255, 255, 0.12);
  }

  .site-navigation a:hover {
    background: rgba(255, 255, 255, 0.22);
  }
  
  .footer-content {
    flex-direction: column;
    align-items: center;
    text-align: center;
  }
  
  .footer-info {
    text-align: center;
  }
  
  .footer-social-bar {
    flex-direction: row;
    justify-content: center;
    margin-left: 0;
  }
  
  .footer-breadcrumbs {
    text-align: center;
    padding-left: 0;
    max-width: 100%;
    margin-top: var(--spacing-sm);
  }
  
  .footer-image img {
    max-width: 80%;
  }
  
  .hero-content {
    padding: var(--spacing-md);
  }
  
  .hero-subtitle-wrapper {
    flex-direction: column !important;
    text-align: center;
  }
  
  .hero-side-image {
    max-width: 140px !important;
    max-height: 140px !important;
  }
  
  .hero-side-image-left .hero-subtitle,
  .hero-side-image-right .hero-subtitle {
    text-align: center;
  }
  
  .services-grid {
    grid-template-columns: 1fr;
  }
  
  .reviews-grid {
    grid-template-columns: 1fr;
  }
}

/* 
   Animations Premium 2026
    */
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(40px) scale(0.97);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

.fade-in-up {
  animation: fadeInUp 0.9s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}

/* Entrée progressive du Hero (repli sans GSAP) : chaque élément semble
   venir du fond du bloc (petit, loin) et arriver à sa position/taille
   normale. Titre et sous-titre quasi simultanés (léger décalage), puis
   le reste du texte et le CTA, puis l'image en dernier. */
@keyframes heroEmerge {
  from {
    opacity: 0;
    transform: translateZ(-420px) scale(0.55);
  }
  to {
    opacity: 1;
    transform: translateZ(0) scale(1);
  }
}

.hero-enter-1 { animation: heroEmerge 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.05s both; }
.hero-enter-2 { animation: heroEmerge 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.12s both; }
.hero-enter-3 { animation: heroEmerge 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.35s both; }
.hero-enter-4 { animation: heroEmerge 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.55s both; }

/* Enveloppe neutre pour animer l'entrée des éléments qui ont leur propre
   effet au survol (CTA, image) sans que l'animation d'entrée ne bloque
   ensuite ce hover (un transform en fill-mode "both" resterait prioritaire
   sur le :hover s'il était posé directement sur l'élément interactif). */
.hero-enter-wrap {
  display: inline-block;
}

/* Stagger reveal pour les grilles */
.services-grid .glass-card:nth-child(1) { animation-delay: 0s; }
.services-grid .glass-card:nth-child(2) { animation-delay: 0.15s; }
.services-grid .glass-card:nth-child(3) { animation-delay: 0.3s; }
.services-grid .glass-card:nth-child(4) { animation-delay: 0.45s; }
.services-grid .glass-card:nth-child(5) { animation-delay: 0.6s; }
.services-grid .glass-card:nth-child(6) { animation-delay: 0.75s; }
.services-grid .glass-card:nth-child(7) { animation-delay: 0.9s; }
.services-grid .glass-card:nth-child(8) { animation-delay: 1.05s; }
.services-grid .glass-card:nth-child(9) { animation-delay: 1.2s; }
.services-grid .glass-card:nth-child(10) { animation-delay: 1.35s; }

.reviews-grid .glass-card:nth-child(1) { animation-delay: 0s; }
.reviews-grid .glass-card:nth-child(2) { animation-delay: 0.15s; }
.reviews-grid .glass-card:nth-child(3) { animation-delay: 0.3s; }

/* Spotlight / lueur au survol des cartes */
.glass-card {
  position: relative;
  isolation: isolate;
}

.glass-card::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: radial-gradient(600px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(255, 255, 255, 0.10), transparent 40%);
  opacity: 0;
  transition: opacity 0.3s ease;
  pointer-events: none;
  z-index: 1;
}

.glass-card:hover::after {
  opacity: 1;
}

.glass-card > * {
  position: relative;
  z-index: 2;
}

/*
   Transition entre grands panneaux (hero, galerie/avis si activés,
   section intermédiaire, services...), desktop/tablette + JS uniquement
   (voir js/animations.js). La liste des panneaux concernés et leur
   z-index sont calculés en JS au chargement (la position de la galerie
   carrousel/avis est réglable dans le Customizer, donc pas de liste
   d'identifiants fixe possible côté CSS) : chaque panneau qui participe
   reçoit la classe .js-panel-stack + un z-index inline croissant, pour
   que le panneau suivant passe toujours devant celui qu'il remplace.
   Le body ne reçoit .panels-scroll-enabled que si GSAP + ScrollTrigger
   sont dispos et qu'on n'est pas sur mobile : dans tous les autres cas
   (mobile, JS absent, prefers-reduced-motion), ces règles ne
   s'appliquent jamais.

   Pas de fond opaque ajouté ici à dessein : les panneaux restent
   transparents (même dégradé fixe que le body derrière), donc pas de
   bandeau uni pendant la transition. Le panneau sortant disparaît
   complètement (opacity 0) avant la fin de son fondu, ce qui suffit à
   éviter tout effet de "bleed-through" gênant.

   min-height : sans ça, un panneau plus bas que l'écran (donc la
   plupart d'entre eux hors services) voit son "bottom" atteindre le
   bas de la fenêtre quasiment dès qu'il est entré à l'écran -> le
   rétrécissement démarre presque immédiatement, avant même d'avoir eu
   le temps d'occuper l'écran normalement. On force donc chaque panneau
   concerné à au moins un écran de haut (moins le header) : le fond
   supplémentaire est transparent (même dégradé que le body), donc pas
   de bandeau visible, juste plus de distance de scroll avant que la
   transition ne commence.
*/
.panels-scroll-enabled .js-panel-stack {
  position: relative;
  min-height: calc(100vh - var(--header-height));
  /* GSAP anime scale + opacity + filter:blur() sur ces panneaux pendant
     le pin (voir js/animations.js). Sans indice de composition dédié,
     Chrome peut recalculer la couche à chaque frame au lieu de garder
     un calque GPU stable pour ces 3 propriétés -> saccades/scintillement
     pendant la transition (même famille de bug déjà rencontrée sur
     .site-header et .animated-bg-scene, cf. leurs commentaires plus haut
     dans ce fichier). Nombre de panneaux concernés toujours très limité
     (4-5 max), donc coût mémoire négligeable. */
  will-change: transform, opacity, filter;
}


/* =====================================================================
   Fond animé "scène code" (opt-in, Customizer : animated_code_background_enabled)
   ---------------------------------------------------------------------
   Scène portée depuis la maquette PeterAtWeb (peteratweb-wallpaper-html-v4),
   toutes les classes sont préfixées "animated-bg-" pour ne jamais entrer
   en collision avec le reste du thème (réutilisé sur d'autres sites).

   Dans la source, .scene est une page autonome (position:relative,
   100vw/100vh). Ici elle devient un calque de fond fixe derrière tout le
   contenu du site : position fixed, inset 0, z-index -1 (même profondeur
   que l'ancien body::before image de fond, qu'elle remplace), et
   pointer-events none pour ne jamais intercepter de clic. isolation:isolate
   garde les z-index internes (1 à 8) cantonnés à la scène elle-même.

   Le flou réglable du Customizer (background_blur) est appliqué à
   .animated-bg-scene entière via une règle générée dans header.php,
   exactement comme il l'était sur l'image de fond classique.
   ===================================================================== */
.animated-bg-scene {
  position: fixed;
  inset: 0;
  z-index: -1;
  overflow: hidden;
  pointer-events: none;
  isolation: isolate;
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
  /* Pas de scale ici : les fenêtres (code, CSS, terminal, réseau) sont
     positionnées par rapport aux bords du viewport (right/bottom en vw/vh,
     certaines volontairement à cheval sur le bord) ; un zoom fixe les
     recadrerait pour rien. L'agrandissement éventuel, pour masquer les
     bords adoucis quand le flou du Customizer est actif, est calculé
     dynamiquement dans header.php d'après le flou réel (0 flou = 0 zoom). */
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
  /* Couleur de texte par défaut de la scène (reprise de la maquette
     source) : sans ça, le texte non explicitement coloré — par exemple
     "npm run dev" après le "$" du terminal — hérite du text_color du
     thème (ou du noir par défaut du navigateur) au lieu de rester lisible
     sur ce fond sombre. */
  color: #dbeafe;
  /* Même correctif de composition Chrome que .site-header : cette scène est
     position:fixed avec un filter:blur() dynamique (voir header.php) — sans
     will-change, Chrome peut laisser des fantômes du contenu qui a défilé
     "gravés" dans le flou au lieu de repeindre correctement. */
  will-change: transform;
}
.animated-bg-scene:after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 1;
  background:
    radial-gradient(circle at 50% 50%, rgba(94, 178, 255, .07), transparent 30%),
    linear-gradient(90deg, rgba(20, 36, 54, .05), transparent 40%, rgba(10, 24, 42, .05));
}

/* Fenêtre principale : code qui s'écrit */
.animated-bg-code-window {
  position: absolute;
  z-index: 8;
  left: 2.1vw;
  /* Centrée verticalement dans l'espace SOUS le header (site-social-bar +
     site-header : hauteur réelle posée dans --header-height par le script
     en bas de header.php), plutôt que collée juste en dessous : top:50%
     centre par rapport à toute la fenêtre, translateY corrige ensuite pour
     ne centrer que sur la zone qui reste une fois le header retiré. */
  top: 50%;
  transform: translateY(calc(-50% + (var(--header-height) / 2)));
  width: min(32vw, 500px);
  height: min(58vh, 500px);
  min-width: 350px;
  border: 1px solid rgba(190, 220, 255, .35);
  border-radius: 15px;
  /* Pas de backdrop-filter ici : c'est une fausse fenêtre purement
     décorative (fond animé), le flou n'apportait rien de fonctionnel et
     coûtait du compositing/mémoire GPU en continu pour rien. Fond plus
     opaque pour garder un rendu propre sans avoir besoin de flouter ce
     qu'il y a derrière. */
  background: rgba(24, 42, 61, .58);
  box-shadow: 0 18px 50px rgba(3, 12, 25, .22), inset 0 1px rgba(255, 255, 255, .08);
  overflow: hidden;
}
.animated-bg-titlebar {
  height: 30px;
  display: flex;
  align-items: center;
  gap: 7px;
  padding: 0 12px;
  border-bottom: 1px solid rgba(220, 235, 255, .11);
  background: rgba(10, 24, 40, .2);
}
.animated-bg-dot {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  box-shadow: 0 0 8px currentColor;
}
.animated-bg-dot.animated-bg-red { color: #ff5f57; background: #ff5f57; }
.animated-bg-dot.animated-bg-yellow { color: #febc2e; background: #febc2e; }
.animated-bg-dot.animated-bg-green { color: #28c840; background: #28c840; }
.animated-bg-filename {
  margin-left: 8px;
  color: rgba(220, 235, 255, .52);
  font-size: 10px;
  letter-spacing: .4px;
}
.animated-bg-editor {
  padding: 14px 16px 20px;
  height: calc(100% - 30px);
  overflow: hidden;
  font-size: clamp(9px, .62vw, 11px);
  line-height: 1.55;
  letter-spacing: -.12px;
  text-shadow: 0 1px 2px rgba(0, 0, 0, .5);
}
.animated-bg-line {
  display: block;
  min-height: 1.55em;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.animated-bg-code { color: #d7e6f5; }
.animated-bg-tag { color: #ff9ca8; }
.animated-bg-attr { color: #7ee7d7; }
.animated-bg-str { color: #b9d77e; }
.animated-bg-cursor {
  display: inline-block;
  width: 6px;
  height: 1.05em;
  margin-left: 2px;
  vertical-align: -2px;
  background: #9bd6ff;
  box-shadow: 0 0 9px #6fc4ff;
  animation: animated-bg-blink .8s steps(1) infinite;
}
@keyframes animated-bg-blink { 50% { opacity: 0; } }

/* Logo central */
.animated-bg-hero-logo {
  position: absolute;
  z-index: 6;
  left: 50%;
  top: 50%;
  width: clamp(290px, 27vw, 410px);
  transform: translate(-50%, -50%);
  pointer-events: none;
  display: grid;
  place-items: center;
}
.animated-bg-hero-logo svg {
  display: block;
  width: 100%;
  height: auto;
  filter: drop-shadow(0 0 10px rgba(121, 197, 255, .28)) drop-shadow(0 18px 30px rgba(0, 0, 0, .3));
  animation: animated-bg-float 5s ease-in-out infinite;
}
@keyframes animated-bg-float {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-7px); }
}
.animated-bg-pulse {
  position: absolute;
  z-index: 5;
  left: 50%;
  top: calc(50% + clamp(135px, 11vw, 170px));
  width: min(28vw, 420px);
  height: 34px;
  transform: translateX(-50%);
  background: radial-gradient(ellipse, rgba(81, 181, 255, .3), transparent 68%);
  filter: blur(5px);
  animation: animated-bg-pulse-anim 3.2s ease-in-out infinite;
}
@keyframes animated-bg-pulse-anim {
  50% { opacity: .55; transform: translateX(-50%) scaleX(.82); }
}

/* Fenêtres secondaires (CSS, terminal), empilées dans .animated-bg-right-stack
   ci-dessous : ce conteneur gère seul la position et l'espacement, chaque
   fenêtre n'a plus qu'à définir sa propre taille. */
.animated-bg-right-stack {
  position: absolute;
  z-index: 7;
  right: 3.6vw;
  top: 8.8vh;
  transform: translateY(50%);
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 3vh;
}
.animated-bg-side-window,
.animated-bg-terminal {
  border: 1px solid rgba(190, 220, 255, .34);
  border-radius: 15px;
  /* Idem fenêtre principale : pas de backdrop-filter (fausses fenêtres
     décoratives), fond plus opaque à la place pour éviter le coût
     mémoire/compositing du flou en continu. */
  background: rgba(24, 42, 61, .55);
  box-shadow: 0 18px 45px rgba(3, 12, 25, .20), inset 0 1px rgba(255, 255, 255, .07);
  overflow: hidden;
}
.animated-bg-side-window {
  width: min(23.5vw, 365px);
}
.animated-bg-side-code {
  padding: 15px 20px;
  font-size: clamp(9px, .62vw, 11px);
  line-height: 1.5;
  color: #d9e7f5;
  white-space: pre-wrap;
}
.animated-bg-c-selector { color: #e5e7eb; }
.animated-bg-c-prop { color: #8fd3ff; }
.animated-bg-c-val { color: #dca7ff; }
.animated-bg-c-punc { color: #b8c9d9; }
.animated-bg-c-num { color: #b9d77e; }
.animated-bg-c-fx { color: #ff9ca8; }
.animated-bg-terminal {
  width: min(26vw, 400px);
  height: min(18vh, 155px);
  min-height: 120px;
}
.animated-bg-terminal-body {
  padding: 14px 22px;
  font-size: clamp(9px, .63vw, 11px);
  line-height: 1.65;
}
.animated-bg-prompt { color: #cda7ff; }
.animated-bg-ok { color: #b9d77e; }
.animated-bg-dim { color: #87a6bf; }

/* Réseau animé en SVG */
.animated-bg-network {
  position: absolute;
  z-index: 4;
  right: -1vw;
  bottom: -1vh;
  width: 31vw;
  min-width: 330px;
  max-width: 500px;
  height: 28vh;
  min-height: 210px;
  opacity: .78;
  filter: drop-shadow(0 0 5px rgba(64, 169, 255, .12));
}
.animated-bg-network svg { width: 100%; height: 100%; overflow: visible; }
.animated-bg-net-line { stroke: rgba(65, 165, 255, .32); stroke-width: 1; fill: none; }
.animated-bg-net-node { fill: #5bb7ff; filter: url(#animated-bg-glow); }
.animated-bg-net-node.animated-bg-soft { fill: #3d8fd0; opacity: .8; }
.animated-bg-net-pulse { animation: animated-bg-net-pulse-anim 3.8s ease-in-out infinite; }
.animated-bg-net-pulse:nth-child(2) { animation-delay: -1.3s; }
.animated-bg-net-pulse:nth-child(3) { animation-delay: -2.6s; }
@keyframes animated-bg-net-pulse-anim {
  0%, 100% { opacity: .35; transform: scale(1); }
  50% { opacity: 1; transform: scale(1.55); }
}

@media (max-width: 850px) {
  .animated-bg-code-window { left: 3vw; width: 44vw; min-width: 300px; }
  .animated-bg-right-stack { right: 2vw; }
  .animated-bg-side-window { width: 28vw; }
  .animated-bg-hero-logo { width: 32vw; min-width: 220px; }
  .animated-bg-network { width: 34vw; }
}
@media (max-width: 600px) {
  .animated-bg-code-window { width: 72vw; height: 48vh; min-width: 0; }
  .animated-bg-editor { font-size: 9px; }
  .animated-bg-side-window { display: none; }
  .animated-bg-terminal { width: 48vw; }
  .animated-bg-hero-logo { width: 40vw; min-width: 190px; }
  .animated-bg-pulse { top: calc(50% + 105px); width: 45vw; }
  .animated-bg-network { width: 50vw; min-width: 260px; opacity: .55; }
}
@media (prefers-reduced-motion: reduce) {
  .animated-bg-hero-logo svg,
  .animated-bg-pulse,
  .animated-bg-cursor,
  .animated-bg-net-pulse {
    animation: none;
  }
}

/* Onglet en arrière-plan (Page Visibility API, voir
   animated-code-background.js) : on fige les mêmes animations en continu
   que prefers-reduced-motion, pour ne pas consommer de CPU/GPU pour rien
   pendant que la page n'est pas affichée. */
body.animated-bg-paused .animated-bg-hero-logo svg,
body.animated-bg-paused .animated-bg-pulse,
body.animated-bg-paused .animated-bg-cursor,
body.animated-bg-paused .animated-bg-net-pulse {
  animation-play-state: paused;
}