/* ==========================================================================
   CHOUFLEURS - Design System
   Stack : HTML/CSS/JS vanilla
   Auteur : Refonte 2026
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. RESET & BASE
   -------------------------------------------------------------------------- */
*, *::before, *::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}

body {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.6;
  color: var(--color-text);
  background: var(--color-bg);
  overflow-x: hidden;
  transition: background-color 0.4s ease, color 0.4s ease;
}

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

a {
  color: inherit;
  text-decoration: none;
  transition: color 0.3s ease;
}

button {
  font-family: inherit;
  cursor: pointer;
  border: none;
  background: none;
}

/* --------------------------------------------------------------------------
   2. DESIGN TOKENS - Variables (Mode Clair par défaut)
   -------------------------------------------------------------------------- */
:root {
  /* Couleurs principales — gris Choufleurs + doré */
  --color-primary: #3D4242;        /* Gris foncé Choufleurs */
  --color-primary-dark: #2A2E2E;
  --color-primary-light: #5C6464;
  --color-secondary: #D49100;      /* Doré Choufleurs */
  --color-secondary-dark: #A87300;
  --color-secondary-light: #E5A93D;

  /* Palette végétale (finitions) */
  --color-sage: #8FB89A;           /* Vert sauge doux */
  --color-sage-dark: #6B9676;
  --color-rose: #F4D4D4;           /* Rose poudré */
  --color-rose-dark: #E8A5A5;
  --color-beige: #F5EFE6;          /* Beige chaleureux */
  --color-beige-dark: #E8DCC8;
  --color-leaf: #4A7C59;           /* Vert feuillage profond */

  /* Couleurs neutres - Mode Clair */
  --color-bg: #FFFFFF;
  --color-bg-alt: #FAF7F2;         /* Beige très clair */
  --color-bg-card: #FFFFFF;
  --color-text: #3D4242;           /* Gris Choufleurs (au lieu du bleu-noir #1A1F2E) */
  --color-text-muted: #5A6573;
  --color-border: #E8E2D6;
  --color-shadow: rgba(61, 66, 66, 0.08);
  --color-shadow-strong: rgba(61, 66, 66, 0.15);

  /* Typographie */
  --font-display: 'Fraunces', Georgia, serif;          /* Titres élégants */
  --font-heading: 'Plus Jakarta Sans', system-ui, sans-serif;  /* Sous-titres modernes */
  --font-body: 'Plus Jakarta Sans', system-ui, sans-serif;
  --font-mono: 'JetBrains Mono', monospace;

  /* Échelle typographique fluide */
  --fs-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem);
  --fs-sm: clamp(0.875rem, 0.8rem + 0.375vw, 1rem);
  --fs-base: clamp(1rem, 0.9rem + 0.5vw, 1.125rem);
  --fs-lg: clamp(1.125rem, 1rem + 0.625vw, 1.375rem);
  --fs-xl: clamp(1.5rem, 1.3rem + 1vw, 2rem);
  --fs-2xl: clamp(2rem, 1.6rem + 2vw, 3rem);
  --fs-3xl: clamp(2.5rem, 2rem + 2.5vw, 4rem);
  --fs-4xl: clamp(3rem, 2.4rem + 3vw, 5rem);

  /* Espacements */
  --space-xs: 0.5rem;
  --space-sm: 1rem;
  --space-md: 1.5rem;
  --space-lg: 2.5rem;
  --space-xl: 4rem;
  --space-2xl: 6rem;
  --space-3xl: 8rem;

  /* Mise en page */
  --container-max: 1280px;
  --container-narrow: 960px;
  --header-height: 80px;

  /* Bordures & Rayons */
  --radius-sm: 0.5rem;
  --radius-md: 1rem;
  --radius-lg: 1.5rem;
  --radius-xl: 2rem;
  --radius-full: 9999px;

  /* Animations */
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  --duration-fast: 0.2s;
  --duration-base: 0.4s;
  --duration-slow: 0.7s;

  /* Ombres */
  --shadow-sm: 0 2px 8px var(--color-shadow);
  --shadow-md: 0 8px 24px var(--color-shadow);
  --shadow-lg: 0 20px 60px var(--color-shadow-strong);
  --shadow-glow: 0 0 40px rgba(61, 66, 66, 0.15);
}

/* --------------------------------------------------------------------------
   3. MODE SOMBRE
   -------------------------------------------------------------------------- */
[data-theme="dark"] {
  /* "Le noir passe gris" — fond gris au lieu de très sombre */
  --color-bg: #2A2E2E;
  --color-bg-alt: #353838;
  --color-bg-card: #3D4242;
  /* Tous les textes en blanc en mode sombre (texte principal + texte muted) */
  --color-text: #FFFFFF;
  --color-text-muted: #FFFFFF;
  --color-border: #4A4F4F;
  --color-shadow: rgba(0, 0, 0, 0.45);
  --color-shadow-strong: rgba(0, 0, 0, 0.65);

  /* "Le bleu en doré" — le primary devient doré en mode sombre */
  --color-primary: #C68F1E;
  --color-primary-dark: #A87300;
  --color-primary-light: #D49100;
  /* Doré secondary : version plus sobre pour ne pas éblouir sur fond gris */
  --color-secondary: #B7841C;
  --color-secondary-dark: #8B6315;
  --color-secondary-light: #C68F1E;

  /* Adaptations couleurs en mode sombre */
  --color-beige: #2A2418;
  --color-rose: #3D2828;
  --color-sage: #1F2E22;

  --shadow-glow: 0 0 50px rgba(229, 169, 61, 0.25);
}


/* --------------------------------------------------------------------------
   4. UTILITAIRES
   -------------------------------------------------------------------------- */
.container {
  width: 100%;
  max-width: var(--container-max);
  margin: 0 auto;
  padding: 0 var(--space-md);
}

.container-narrow {
  max-width: var(--container-narrow);
  margin: 0 auto;
  padding: 0 var(--space-md);
}

.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.text-center { text-align: center; }
.text-balance { text-wrap: balance; }

/* --------------------------------------------------------------------------
   5. TYPOGRAPHIE
   -------------------------------------------------------------------------- */
h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-display);
  font-weight: 600;
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--color-text);
}

h1 { font-size: var(--fs-4xl); }
h2 { font-size: var(--fs-3xl); }
h3 { font-size: var(--fs-2xl); }
h4 { font-size: var(--fs-xl); }

p { font-size: var(--fs-base); }

.eyebrow {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: var(--fs-xs);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.15em;
  color: var(--color-primary);
  margin-bottom: var(--space-sm);
}

.title-accent {
  color: var(--color-secondary);
  font-style: italic;
  font-weight: 500;
}

.title-yellow {
  color: var(--color-secondary);
}

/* --------------------------------------------------------------------------
   6. BOUTONS
   -------------------------------------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.875rem 1.75rem;
  font-family: var(--font-heading);
  font-size: var(--fs-sm);
  font-weight: 600;
  border-radius: var(--radius-full);
  transition: all var(--duration-base) var(--ease-out);
  cursor: pointer;
  white-space: nowrap;
  position: relative;
  overflow: hidden;
}

.btn-primary {
  background: var(--color-primary);
  color: #FFFFFF;
  box-shadow: 0 4px 16px rgba(61, 66, 66, 0.25);
}

.btn-primary:hover {
  background: var(--color-primary-dark);
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(61, 66, 66, 0.35);
}

.btn-secondary {
  /* Bouton doré : texte BLANC pour ne pas paraître trop sombre. */
  background: var(--color-secondary);
  color: #FFFFFF;
  box-shadow: 0 4px 16px rgba(212, 145, 0, 0.3);
}

.btn-secondary:hover {
  background: var(--color-secondary-dark);
  color: #FFFFFF;
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(212, 145, 0, 0.4);
}

/* Mode sombre : doré plus sobre, halo lumineux atténué pour ne pas éblouir */
[data-theme="dark"] .btn-secondary {
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);
}

[data-theme="dark"] .btn-secondary:hover {
  box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);
}

.btn-outline {
  background: transparent;
  color: var(--color-text);
  border: 1.5px solid var(--color-border);
}

.btn-outline:hover {
  border-color: var(--color-primary);
  color: var(--color-primary);
  transform: translateY(-2px);
}

.btn-icon {
  width: 20px;
  height: 20px;
  transition: transform var(--duration-base) var(--ease-out);
}

.btn:hover .btn-icon {
  transform: translateX(4px);
}

/* Boutons réseaux sociaux : chacun adopte la couleur de marque au hover */
.btn-social {
  background: transparent;
  color: var(--color-text);
  border: 1.5px solid var(--color-border);
  transition: all var(--duration-base) var(--ease-out);
}

.btn-social svg { flex-shrink: 0; }

.btn-social-instagram:hover {
  background: linear-gradient(45deg, #F58529 0%, #DD2A7B 50%, #8134AF 100%);
  color: #FFFFFF;
  border-color: transparent;
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(221, 42, 123, 0.35);
}

.btn-social-facebook:hover {
  background: #1877F2;
  color: #FFFFFF;
  border-color: #1877F2;
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(24, 119, 242, 0.35);
}

.btn-social-tiktok:hover {
  background: #000000;
  color: #FFFFFF;
  border-color: #000000;
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(0, 0, 0, 0.45);
}


/* --------------------------------------------------------------------------
   7. HEADER & NAVIGATION
   -------------------------------------------------------------------------- */
.header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 1000;
  height: var(--header-height);
  background: rgba(255, 255, 255, 0.85);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border-bottom: 1px solid transparent;
  transition: all var(--duration-base) ease;
}

[data-theme="dark"] .header {
  background: rgba(15, 20, 25, 0.85);
}

.header.scrolled {
  border-bottom-color: var(--color-border);
  box-shadow: 0 4px 20px var(--color-shadow);
}

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

.logo {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 700;
  color: var(--color-primary);
  letter-spacing: -0.02em;
}

.logo-mark {
  width: 180px;
  height: 80px;
  /* Container au ratio 2.25:1 qui match exactement le PDF source du logo
     stacké (ChouFleurs + "Fleuriste depuis toujours" empilés dans un
     rectangle bleu nuit). background: contain → logo affiché en entier.
     Le PNG a maintenant un fond transparent — on remet la plaque grise en
     background-color uniquement en mode clair (voir règle ci-dessous),
     pour que le sous-titre blanc reste lisible sur bg clair. */
  background-color: #2f2e34;
  background-image: url('../assets/images/logo.png');
  background-position: center;
  background-size: contain;
  background-repeat: no-repeat;
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  /* Masque l'ancien caractère "C" sans modifier le HTML */
  font-size: 0;
  color: transparent;
  transition: transform var(--duration-base) var(--ease-out);
  flex-shrink: 0;
}

/* En mode sombre : le fond du header est déjà foncé, on retire la plaque
   grise pour que le logo se fonde naturellement (sinon rectangle visible). */
[data-theme="dark"] .logo-mark {
  background-color: transparent;
}

/* Sur mobile/tablette portrait (<= 768px), le header réduit à 70px et le
   logo à 80px de haut débordait. On downscale à 62px de haut (140px large,
   même ratio 2.25:1) pour rester dans le bandeau. */
@media (max-width: 768px) {
  .logo-mark {
    width: 140px;
    height: 62px;
  }
}

/* Sur écrans très étroits (<380px), on rétrécit encore un peu pour laisser
   la place au bouton téléphone + hamburger. */
@media (max-width: 380px) {
  .logo-mark {
    width: 118px;
    height: 52px;
  }
}

.logo:hover .logo-mark {
  transform: rotate(-3deg) scale(1.05);
}

/* Le logo image contient déjà "Choufleurs / Fleuriste depuis toujours",
   on masque le texte HTML à côté pour éviter le doublon visuel.
   (Conservé en DOM pour les lecteurs d'écran et le SEO.) */
.logo-text {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.logo-text small {
  display: block;
  font-family: var(--font-heading);
  font-size: 0.7rem;
  font-weight: 500;
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-top: -2px;
}

/* Navigation Desktop */
.nav-desktop {
  display: flex;
  align-items: center;
  gap: var(--space-lg);
}

.nav-list {
  display: flex;
  align-items: center;
  gap: var(--space-md);
  list-style: none;
}

.nav-link {
  position: relative;
  font-family: var(--font-heading);
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--color-text);
  padding: 0.5rem 0;
}

.nav-link::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  width: 0;
  height: 2px;
  background: var(--color-primary);
  transition: width var(--duration-base) var(--ease-out);
}

.nav-link:hover::after,
.nav-link.active::after {
  width: 100%;
}

.nav-link:hover {
  color: var(--color-primary);
}

/* Dropdown */
.nav-dropdown {
  position: relative;
}

.nav-dropdown-trigger {
  display: flex;
  align-items: center;
  gap: 0.25rem;
}

.nav-dropdown-menu {
  position: absolute;
  top: calc(100% + 1rem);
  left: 50%;
  transform: translateX(-50%) translateY(-10px);
  background: var(--color-bg-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  padding: 0.75rem;
  min-width: 240px;
  opacity: 0;
  visibility: hidden;
  transition: all var(--duration-base) var(--ease-out);
  list-style: none;
}

.nav-dropdown:hover .nav-dropdown-menu,
.nav-dropdown:focus-within .nav-dropdown-menu {
  opacity: 1;
  visibility: visible;
  transform: translateX(-50%) translateY(0);
}

.nav-dropdown-menu li a {
  display: block;
  padding: 0.625rem 0.875rem;
  border-radius: var(--radius-sm);
  font-size: var(--fs-sm);
  transition: all var(--duration-fast) ease;
}

.nav-dropdown-menu li a:hover {
  background: var(--color-bg-alt);
  color: var(--color-primary);
  padding-left: 1.125rem;
}

/* Theme Toggle */
.theme-toggle {
  width: 44px;
  height: 44px;
  border-radius: var(--radius-full);
  background: var(--color-bg-alt);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all var(--duration-base) var(--ease-out);
  border: 1px solid var(--color-border);
}

.theme-toggle:hover {
  background: var(--color-primary);
  color: white;
  transform: rotate(15deg);
}

.theme-toggle svg {
  width: 20px;
  height: 20px;
}

/* Par défaut (mode clair) : soleil visible, lune masquée. */
.theme-toggle .icon-sun { display: block; }
.theme-toggle .icon-moon { display: none; }

/* Mode sombre : lune visible, soleil masqué. */
[data-theme="dark"] .theme-toggle .icon-sun { display: none; }
[data-theme="dark"] .theme-toggle .icon-moon { display: block; }

/* --------------------------------------------------------------------------
   PHONE BUTTON — bouton d'appel doré très visible, placé juste avant le
   theme-toggle dans le header. Un click = appel au numéro principal.
   -------------------------------------------------------------------------- */
.phone-btn {
  width: 44px;
  height: 44px;
  border-radius: var(--radius-full);
  /* Couleurs doré fixées en dur pour rester identiques en mode clair ET sombre
     (les variables --color-secondary changent de teinte entre les 2 modes). */
  background: #D49100;
  color: #ffffff;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform var(--duration-base) var(--ease-out),
              background 0.2s ease-out,
              box-shadow 0.25s ease-out;
  border: 2px solid #D49100;
  box-shadow: 0 6px 16px rgba(212, 145, 0, 0.45),
              0 2px 6px rgba(212, 145, 0, 0.25),
              0 0 0 3px rgba(212, 145, 0, 0.08);
  text-decoration: none;
  flex-shrink: 0;
}

.phone-btn:hover {
  background: #C68F1E;
  border-color: #C68F1E;
  color: #ffffff;
  transform: translateY(-2px);
  box-shadow: 0 10px 22px rgba(198, 143, 30, 0.55),
              0 4px 10px rgba(198, 143, 30, 0.30),
              0 0 0 5px rgba(212, 145, 0, 0.12);
}

.phone-btn:active {
  transform: translateY(0);
}

.phone-btn:focus-visible {
  outline: 3px solid #D49100;
  outline-offset: 3px;
}

.phone-btn svg {
  width: 20px;
  height: 20px;
  stroke-width: 2;
}

/* Pulse subtil pour attirer l'œil, pareil que les flèches stack */
@keyframes phone-btn-pulse {
  0%, 100% { box-shadow: 0 6px 16px rgba(212, 145, 0, 0.45), 0 2px 6px rgba(212, 145, 0, 0.25), 0 0 0 3px rgba(212, 145, 0, 0.08); }
  50%      { box-shadow: 0 6px 16px rgba(212, 145, 0, 0.55), 0 2px 6px rgba(212, 145, 0, 0.30), 0 0 0 8px rgba(212, 145, 0, 0.05); }
}
.phone-btn {
  animation: phone-btn-pulse 2.6s ease-in-out infinite;
}
.phone-btn:hover,
.phone-btn:active {
  animation: none;
}
@media (prefers-reduced-motion: reduce) {
  .phone-btn { animation: none; }
}

/* Réduit l'écart entre le bouton téléphone et le toggle thème dans le header desktop
   (par défaut ils héritent du gap var(--space-lg) = 40px de .nav-desktop). */
.nav-desktop .phone-btn + .theme-toggle {
  margin-left: calc(var(--space-xs) - var(--space-lg));
}

/* Sur mobile / tablette (< 1024px), le phone-btn du wrapper mobile devient
   visible, comme le theme-toggle. Le phone-btn de la nav desktop reste
   automatiquement masqué avec sa nav parente (nav-desktop { display: none }). */
@media (max-width: 1024px) {
  .header-inner > div .phone-btn {
    display: flex !important;
  }
}

/* Mobile menu button */
.menu-toggle {
  display: none;
  width: 44px;
  height: 44px;
  border-radius: var(--radius-full);
  background: var(--color-bg-alt);
  align-items: center;
  justify-content: center;
  position: relative;
}

.menu-toggle span {
  position: absolute;
  width: 20px;
  height: 2px;
  background: var(--color-text);
  border-radius: 2px;
  transition: all var(--duration-base) var(--ease-out);
}

.menu-toggle span:nth-child(1) { transform: translateY(-6px); }
.menu-toggle span:nth-child(2) { transform: translateY(0); }
.menu-toggle span:nth-child(3) { transform: translateY(6px); }

.menu-toggle.active span:nth-child(1) { transform: rotate(45deg); }
.menu-toggle.active span:nth-child(2) { opacity: 0; }
.menu-toggle.active span:nth-child(3) { transform: rotate(-45deg); }

/* Mobile Nav */
.nav-mobile {
  position: fixed;
  top: var(--header-height);
  left: 0;
  right: 0;
  bottom: 0;
  background: var(--color-bg);
  padding: var(--space-lg) var(--space-md);
  transform: translateX(100%);
  transition: transform var(--duration-base) var(--ease-out);
  overflow-y: auto;
  z-index: 999;
}

.nav-mobile.active {
  transform: translateX(0);
}

.nav-mobile ul {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: var(--space-xs);
}

.nav-mobile a {
  display: block;
  padding: var(--space-sm) var(--space-md);
  font-family: var(--font-heading);
  font-size: var(--fs-lg);
  font-weight: 500;
  border-radius: var(--radius-md);
  border-left: 3px solid transparent;
  transition: all var(--duration-base) ease;
}

.nav-mobile a:hover,
.nav-mobile a.active {
  background: var(--color-bg-alt);
  border-left-color: var(--color-primary);
  color: var(--color-primary);
  padding-left: calc(var(--space-md) + 0.5rem);
}

/* --------------------------------------------------------------------------
   8. SECTIONS COMMUNES
   -------------------------------------------------------------------------- */
.section {
  padding: var(--space-3xl) 0;
  position: relative;
}

.section-sm { padding: var(--space-2xl) 0; }

.section-header {
  text-align: center;
  max-width: 720px;
  margin: 0 auto var(--space-xl);
}

.section-header p {
  color: var(--color-text-muted);
  margin-top: var(--space-sm);
  font-size: var(--fs-lg);
}

/* Alignement par défaut des paragraphes : gauche naturel.
   Le text-align: justify global a été retiré car il étirait les espaces
   de manière disgracieuse sur les textes courts (3-5 lignes) qui sont
   majoritaires sur le site. */
main p {
  text-align: left;
  hyphens: manual;
}

/* Paragraphes centrés : sections d'en-tête, footer, badges, intros tarifs */
.section-header p,
.hero-stat-label,
.footer p,
.footer-bottom p,
.hero-floating-card p,
.avis-stagger p,
.page-hero p,
.lock-hero p,
.editorial-hero p,
.pricing-cards-intro,
.pricing-tile-note {
  text-align: center;
}

/* --------------------------------------------------------------------------
   9. FOOTER
   -------------------------------------------------------------------------- */
.footer {
  background: var(--color-bg-alt);
  padding: var(--space-2xl) 0 var(--space-lg);
  border-top: 1px solid var(--color-border);
}

.footer-grid {
  display: grid;
  grid-template-columns: 1.5fr 1fr 1fr 1fr;
  gap: var(--space-xl);
  margin-bottom: var(--space-xl);
}

/* Footer brand : logo centré au-dessus du paragraphe, tout aligné au centre. */
.footer-brand {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
}

.footer-brand .logo {
  justify-content: center;
}

.footer-brand p {
  color: var(--color-text-muted);
  margin-top: var(--space-sm);
  max-width: 320px;
  margin-left: auto;
  margin-right: auto;
}

.footer-col h4 {
  font-family: var(--font-heading);
  font-size: var(--fs-sm);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--color-primary);
  margin-bottom: var(--space-md);
}

.footer-col ul {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 0.625rem;
}

.footer-col a {
  color: var(--color-text-muted);
  font-size: var(--fs-sm);
  transition: all var(--duration-fast) ease;
}

.footer-col a:hover {
  color: var(--color-primary);
  padding-left: 4px;
}

.footer-bottom {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-top: var(--space-lg);
  border-top: 1px solid var(--color-border);
  font-size: var(--fs-xs);
  color: var(--color-text-muted);
}

.footer-social {
  display: flex;
  gap: 0.75rem;
}

.footer-social a {
  width: 40px;
  height: 40px;
  border-radius: var(--radius-full);
  background: var(--color-bg);
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--color-border);
  transition: all var(--duration-base) var(--ease-out);
}

.footer-social a:hover {
  background: var(--color-primary);
  color: white;
  transform: translateY(-3px);
  border-color: var(--color-primary);
}

.footer-social svg { width: 18px; height: 18px; }

/* --------------------------------------------------------------------------
   10. ANIMATIONS - Reveal au scroll
   -------------------------------------------------------------------------- */
.reveal {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.8s var(--ease-out), transform 0.8s var(--ease-out);
}

.reveal.visible {
  opacity: 1;
  transform: translateY(0);
}

.reveal-delay-1 { transition-delay: 0.1s; }
.reveal-delay-2 { transition-delay: 0.2s; }
.reveal-delay-3 { transition-delay: 0.3s; }
.reveal-delay-4 { transition-delay: 0.4s; }

@keyframes float {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-12px); }
}

@keyframes pulse-glow {
  0%, 100% { opacity: 0.4; }
  50% { opacity: 0.8; }
}

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

@keyframes fade-in-up {
  from { opacity: 0; transform: translateY(40px); }
  to { opacity: 1; transform: translateY(0); }
}

/* --------------------------------------------------------------------------
   Balancement organique des photos hero — 9 keyframes suivant une courbe
   sinus, timing linear pour éviter les bumps. Utilisé via les propriétés
   individuelles rotate/translate pour composer sans conflit avec un
   transform: rotate(...) éventuellement présent sur la classe (ex: mariage,
   bouquets, deuil qui ont chacun leur inclinaison de base).
   -------------------------------------------------------------------------- */
@keyframes hero-sway-a {
  0%    { rotate: 0deg;     translate: 0 0; }
  12.5% { rotate: 0.85deg;  translate: 0 -1px; }
  25%   { rotate: 1.2deg;   translate: 0 -4px; }
  37.5% { rotate: 0.85deg;  translate: 0 -7px; }
  50%   { rotate: 0deg;     translate: 0 -8px; }
  62.5% { rotate: -0.85deg; translate: 0 -7px; }
  75%   { rotate: -1.2deg;  translate: 0 -4px; }
  87.5% { rotate: -0.85deg; translate: 0 -1px; }
  100%  { rotate: 0deg;     translate: 0 0; }
}

@keyframes hero-sway-b {
  0%    { rotate: 0deg;     translate: 0 0; }
  12.5% { rotate: -0.85deg; translate: 0 -1px; }
  25%   { rotate: -1.2deg;  translate: 0 -5px; }
  37.5% { rotate: -0.85deg; translate: 0 -8px; }
  50%   { rotate: 0deg;     translate: 0 -10px; }
  62.5% { rotate: 0.85deg;  translate: 0 -8px; }
  75%   { rotate: 1.2deg;   translate: 0 -5px; }
  87.5% { rotate: 0.85deg;  translate: 0 -1px; }
  100%  { rotate: 0deg;     translate: 0 0; }
}

/* --------------------------------------------------------------------------
   11. RESPONSIVE
   -------------------------------------------------------------------------- */
@media (max-width: 1024px) {
  .nav-desktop { display: none; }
  .menu-toggle { display: flex; }

  .footer-grid {
    grid-template-columns: 1fr 1fr;
    gap: var(--space-lg);
  }
}

@media (max-width: 768px) {
  :root {
    --header-height: 70px;
    --space-3xl: 5rem;
    --space-2xl: 4rem;
  }

  .footer-grid {
    grid-template-columns: 1fr;
    text-align: center;
  }

  .footer-col ul { align-items: center; }

  .footer-bottom {
    flex-direction: column;
    gap: var(--space-sm);
    text-align: center;
  }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
  html { scroll-behavior: auto; }
}

/* ============================================================
   Typographie : justification des longs paragraphes
   La classe .long-text est ajoutée automatiquement par
   js/text-justify.js aux <p> de #content dépassant 30 mots.

   AUCUNE césure automatique : hyphens: manual.
   hyphens: auto coupait les mots en fin de ligne
   (« bou-quets », « com-pose », « ma-riée ») — jugé
   disgracieux. Ne pas remettre auto sans hyphenate-limit-chars.

   La justification est réservée aux écrans larges : sous 900px
   la mesure est trop courte et, sans césure, les espaces
   s'étireraient. En dessous : alignement à gauche.

   text-wrap: pretty améliore le line-breaking sur navigateurs
   modernes (Chrome 117+, Safari 17.5+, Firefox 121+).
   ============================================================ */
p.long-text {
  text-align: left;
  hyphens: manual;
  -webkit-hyphens: manual;
  -ms-hyphens: manual;
  text-wrap: pretty;
}

@media (min-width: 900px) {
  p.long-text {
    text-align: justify;
    text-align-last: left;
  }
}

/* Opt-out manuel : forcer l'alignement gauche même sur long <p> */
p.no-justify,
p.no-justify.long-text {
  text-align: left;
  hyphens: manual;
  -webkit-hyphens: manual;
  -ms-hyphens: manual;
}

/* ==========================================================================
   12. RAFFINEMENTS DESIGN — micro-détails pour signer la marque
   (typographie OpenType, marqueur jaune, reflet boutons, scrollbar branded,
    focus rings, sélection texte) — facilement retirable sans casser le site.
   ========================================================================== */

/* ---- Typographie : ligatures, kerning, optical sizing -------------------- */
html {
  font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
  font-optical-sizing: auto;
  text-rendering: optimizeLegibility;
}

h1, h2, h3, h4,
.title-accent,
.eyebrow {
  font-feature-settings: "kern" 1, "liga" 1, "calt" 1, "ss01" 1, "dlig" 1;
}

h1 {
  letter-spacing: -0.035em;
}

h1, h2 {
  text-wrap: balance;
}

p {
  text-wrap: pretty;
}

/* ---- Sélection texte (jaune Choufleurs) --------------------------------- */
::selection {
  background: var(--color-secondary);
  color: var(--color-text);
  text-shadow: none;
}

[data-theme="dark"] ::selection {
  background: var(--color-secondary);
  color: #3D4242;
}

/* ---- Scrollbar branded (limitée à la page entière) ---------------------- */
html {
  scrollbar-width: thin;
  scrollbar-color: var(--color-primary) var(--color-bg-alt);
}

html::-webkit-scrollbar {
  width: 12px;
}

html::-webkit-scrollbar-track {
  background: var(--color-bg-alt);
}

html::-webkit-scrollbar-thumb {
  background: var(--color-primary);
  border-radius: 10px;
  border: 3px solid var(--color-bg-alt);
}

html::-webkit-scrollbar-thumb:hover {
  background: var(--color-primary-dark);
}

/* ---- Focus rings unifiés ------------------------------------------------- */
*:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 3px;
  border-radius: var(--radius-sm);
  transition: outline-offset var(--duration-fast) ease;
}

.btn:focus-visible {
  outline-offset: 4px;
}

/* ---- Marqueur jaune sous les title-accent (signature graphique) --------- */
/* Donne l'impression que les mots-clés italiques sont "surlignés au marqueur" */
.title-accent {
  position: relative;
  display: inline-block;
  z-index: 0;
}

/* Marqueur jaune via background-image (au lieu d'un ::after en position absolute)
   pour fonctionner aussi quand le titre wrappe sur plusieurs lignes.
   ÉPAISSEUR FIXE (0.42em) + POSITION 88% → robuste au resize et au wrap multi-lignes. */
.title-accent {
  background-image: linear-gradient(
    to right,
    var(--title-marker, rgba(212, 145, 0, 0.42)),
    var(--title-marker, rgba(212, 145, 0, 0.42))
  );
  background-repeat: no-repeat;
  background-size: 100% 0.42em;
  background-position: 0 88%;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
  padding: 0 0.12em;
  border-radius: 0.15em;
  transition: filter 0.3s ease;
}

[data-theme="dark"] .title-accent {
  --title-marker: rgba(183, 132, 28, 0.5);
}

.title-accent:hover {
  filter: brightness(1.05) saturate(1.1);
}

/* Ancien marqueur ::after désactivé : remplacé par le background-image
   qui fonctionne aussi sur titres wrappés. */
.title-accent::after {
  display: none;
}

.title-accent:hover::after {
  opacity: 0.62;
}

[data-theme="dark"] .title-accent::after {
  opacity: 0.5;
}

/* ---- Reflet diagonal au survol des boutons primaires/secondaires -------- */
.btn-primary,
.btn-secondary {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.btn-primary::after,
.btn-secondary::after {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  left: -75%;
  width: 50%;
  background: linear-gradient(
    100deg,
    transparent 0%,
    rgba(255, 255, 255, 0.28) 50%,
    transparent 100%
  );
  pointer-events: none;
  transition: left 0.7s var(--ease-out);
  z-index: 0;
}

.btn-primary:hover::after,
.btn-secondary:hover::after {
  left: 175%;
}

.btn-primary > *,
.btn-secondary > * {
  position: relative;
  z-index: 1;
}

/* ---- Petit "tiret" devant les eyebrow non centrés ----------------------- */
/* (Marque visuelle subtile, façon revue de design) */
.eyebrow {
  position: relative;
}

main > section:not(:has(.section-header)) .eyebrow,
.hero .eyebrow,
.story .eyebrow,
.lockheure .eyebrow,
.livraison .eyebrow,
.editorial-hero .eyebrow {
  padding-left: 1.625rem;
}

main > section:not(:has(.section-header)) .eyebrow::before,
.hero .eyebrow::before,
.story .eyebrow::before,
.lockheure .eyebrow::before,
.livraison .eyebrow::before,
.editorial-hero .eyebrow::before {
  content: '';
  position: absolute;
  left: 0;
  top: 50%;
  width: 1.125rem;
  height: 2px;
  background: var(--color-primary);
  transform: translateY(-50%);
  border-radius: 2px;
}

/* ==========================================================================
   13. ÉDITORIAL BOTANIQUE — vision magazine de fleuriste
   Lettrines · rules décoratives · gradient mesh · typo dramatique
   ========================================================================== */

/* Note : les lettrines (drop caps) en bleu sur le 1er paragraphe d'intro/story
   ont été retirées (preference design). */

/* ---- Rule décorative au-dessus des section-header centrés --------------- */
.section-header {
  position: relative;
}

.section-header::before {
  content: '';
  display: block;
  width: 56px;
  height: 1px;
  background: var(--color-primary);
  margin: 0 auto var(--space-md);
  opacity: 0.4;
}

/* Sur les heros et page-heros, on ne met pas la rule (déjà décoré) */
.hero .section-header::before,
.page-hero .section-header::before,
.editorial-hero .section-header::before,
.lock-hero .section-header::before,
.livraison-hero .section-header::before {
  display: none;
}

/* ---- Typographie hero plus dramatique ---------------------------------- */
.hero h1 {
  font-size: clamp(3rem, 2rem + 5vw, 6.5rem);
  letter-spacing: -0.045em;
  line-height: 1.02;
}

.hero h1 .word {
  display: inline-block;
}

/* Plus de respiration sur le subtitle hero pour contraste */
.hero-subtitle {
  font-size: clamp(1.1rem, 1rem + 0.4vw, 1.35rem);
  line-height: 1.55;
  max-width: 540px;
}

/* ---- Gradient mesh sur le hero d'accueil (texture + profondeur) -------- */
.hero {
  background:
    radial-gradient(ellipse 60% 40% at 18% 28%, rgba(212, 145, 0, 0.18), transparent 70%),
    radial-gradient(ellipse 55% 45% at 82% 72%, rgba(61, 66, 66, 0.16), transparent 70%),
    radial-gradient(ellipse 70% 50% at 50% 100%, rgba(245, 239, 230, 0.65), transparent 65%),
    var(--color-bg);
}

[data-theme="dark"] .hero {
  background:
    radial-gradient(ellipse 60% 40% at 18% 28%, rgba(212, 145, 0, 0.08), transparent 70%),
    radial-gradient(ellipse 55% 45% at 82% 72%, rgba(61, 66, 66, 0.12), transparent 70%),
    radial-gradient(ellipse 70% 50% at 50% 100%, rgba(42, 36, 24, 0.5), transparent 65%),
    var(--color-bg);
}

/* ---- Eyebrow plus marqué (style folio de magazine) --------------------- */
.eyebrow {
  font-size: 0.78rem;
  letter-spacing: 0.18em;
  font-weight: 700;
}

/* ---- Marqueur sur title-accent qui « monte » au scroll (subtil) --------
   On anime maintenant background-size du span (au lieu d'un scale sur ::after),
   pour rester compatible avec les titres multi-lignes. */
@keyframes title-accent-reveal {
  from { background-size: 0% 0.42em; }
  to   { background-size: 100% 0.42em; }
}

.reveal.visible .title-accent {
  animation: title-accent-reveal 0.9s var(--ease-out) 0.3s backwards;
}

/* ==========================================================================
   TITRES DORÉS — effet TYPEWRITER char-par-char (règle globale du site).
   Testé initialement sur la home, étendu à toutes les pages. Un JS
   (page-home-typewriter.js) wrappe chaque char des .title-accent /
   .title-yellow dans <span class="ph-char"> avec --i pour le stagger.
   Le surlignage jaune est retiré partout et l'effet marker/reveal est
   désactivé pour éviter les conflits (les chars gèrent leur propre reveal).
   ========================================================================== */
.title-accent {
  background-image: none;
  padding: 0;
  border-radius: 0;
}

/* Chars : opacity + micro-slide, staggered via --i (défini par le JS).
   PAR DÉFAUT visibles (fallback graceful si JS lent ou observer manqué).
   Cachés UNIQUEMENT quand le parent a .ph-armed (JS a wrappé et va animer)
   MAIS pas encore .ph-visible. Dès que .ph-visible arrive → animation. */
.ph-char {
  display: inline-block;
}

/* .ph-word regroupe les chars d'un même mot en un bloc atomique nowrap,
   pour empêcher le browser de couper un mot au milieu (chaque .ph-char
   étant inline-block créerait sinon un breakpoint entre chaque lettre). */
.ph-word {
  display: inline-block;
  white-space: nowrap;
}

.ph-armed:not(.ph-visible) .ph-char {
  opacity: 0;
  transform: translateY(3px);
}

.ph-visible .ph-char {
  /* `both` = backwards+forwards : pendant animation-delay, applique l'état
     `from` (opacity 0). Sans ça, le char reste visible pendant son delay puis
     flash invisible → visible → effet de "sweep noir" qui parcourt le mot. */
  animation: page-home-char-in 0.35s ease-out both;
  animation-delay: calc(var(--i, 0) * 35ms);
}

@keyframes page-home-char-in {
  from { opacity: 0; transform: translateY(3px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Neutralise le fade-in-up des .word dorés du hero (sinon leur opacity
   parent multiplierait celle des chars → effet noyé). Les mots non-dorés
   du hero comme "Fleuriste" gardent leur fade-in-up existant. */
.hero h1 .title-accent .word,
.hero h1 .title-yellow .word,
.hero h1 .word.title-yellow {
  opacity: 1;
  transform: none;
  animation: none;
}

/* On désactive l'ancienne animation marker (title-accent-reveal) —
   elle animait un background qui n'existe plus. */
.reveal.visible .title-accent {
  animation: none;
}

/* Respect prefers-reduced-motion : les chars apparaissent tous en même
   temps, sans stagger ni translation. */
@media (prefers-reduced-motion: reduce) {
  .ph-char {
    animation: none;
    opacity: 1;
    transform: none;
  }
}


/* ---- Détail typographique : citations en italique avec barre ----------- */
blockquote {
  position: relative;
  padding-left: 1.5rem;
  font-style: italic;
  font-family: var(--font-display);
}

blockquote::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.4em;
  bottom: 0.4em;
  width: 3px;
  background: var(--color-secondary);
  border-radius: 2px;
}

/* ---- Liens en ligne dans les paragraphes : underline custom ------------ */
main p a:not(.btn),
.intro-content p a {
  color: var(--color-primary);
  font-weight: 600;
  text-decoration: none;
  background-image: linear-gradient(
    to top,
    transparent 0,
    transparent 0.05em,
    var(--color-secondary) 0.05em,
    var(--color-secondary) 0.25em,
    transparent 0.25em
  );
  background-position: 0 88%;
  background-repeat: no-repeat;
  background-size: 100% 100%;
  transition: background-size 0.3s ease, color 0.3s ease;
}

main p a:not(.btn):hover,
.intro-content p a:hover {
  color: var(--color-primary-dark);
  background-size: 100% 110%;
}

/* ==========================================================================
   14. TASTE PASS — Signatures graphiques (frontend-design / anti-AI-slop)
   Grain papier + squiggle jaune + marqueur nav + ornements eyebrows.
   ========================================================================== */

/* ---- Grain papier subtil (effet imprimé magazine) ---------------------- */
body::after {
  content: '';
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 100;
  opacity: 0.035;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 220 220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.92' numOctaves='2' seed='8'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0'/></filter><rect width='220' height='220' filter='url(%23n)'/></svg>");
  background-size: 220px 220px;
  mix-blend-mode: multiply;
}

[data-theme="dark"] body::after {
  opacity: 0.06;
  mix-blend-mode: screen;
}

@media print { body::after { display: none; } }

/* Note : le squiggle SVG (vague jaune) sous .title-yellow a été retiré
   (preference design). .title-yellow conserve juste la couleur jaune. */

/* ---- Marqueur jaune sur le menu (remplace l'underline basique) -------- */
.nav-link::after {
  content: '';
  position: absolute;
  bottom: 0.05em;
  left: -0.1em;
  right: -0.1em;
  width: auto;
  height: 0.55em;
  background: var(--color-secondary);
  opacity: 0;
  transform: scaleX(0);
  transform-origin: left center;
  transition:
    transform 0.4s var(--ease-out),
    opacity 0.3s ease;
  border-radius: 999px;
  z-index: -1;
}

.nav-link {
  position: relative;
  z-index: 0;
}

.nav-link:hover::after,
.nav-link.active::after {
  transform: scaleX(1);
  opacity: 0.48;
  width: auto;
}

/* On désactive la couleur primary qui était sur le hover de nav-link
   pour que le marqueur jaune soit la seule signature visuelle */
.nav-link:hover {
  color: var(--color-text);
}

[data-theme="dark"] .nav-link:hover {
  color: #F0F4F8;
}

.nav-link.active {
  color: var(--color-text);
  font-weight: 600;
}

/* ---- Ornement avant les eyebrows centrés (sections-headers) ----------- */
/* Petit ✦ ou trait avant le label, pour donner du caractère éditorial */
.section-header .eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
}

.section-header .eyebrow::before {
  content: '';
  display: inline-block;
  width: 1.25rem;
  height: 2px;
  background: var(--color-primary);
  border-radius: 2px;
  position: static;
  transform: none;
}

.section-header .eyebrow::after {
  content: '';
  display: inline-block;
  width: 1.25rem;
  height: 2px;
  background: var(--color-primary);
  border-radius: 2px;
}

/* ---- Refinements complémentaires --------------------------------------- */

/* Légère rotation organique sur les avatars d'avis (effet polaroid main) */
.retro-card-avatar {
  transform: rotate(-3deg);
  transition: transform 0.4s var(--ease-out);
}

.retro-card:hover .retro-card-avatar {
  transform: rotate(2deg) scale(1.04);
}

/* Stabilise l'animation marker-draw qui ne doit jamais cliper le marqueur */
.title-accent {
  isolation: isolate;
}
