/* ==========================================================================
   Esprit Smart — feuille de style principale
   --------------------------------------------------------------------------
   Système visuel : typographie monospace, trame de points, chrome
   entièrement en niveaux de gris, métadonnées entre crochets.

   Règle cardinale : LE CHROME NE PORTE AUCUNE COULEUR. La couleur n'existe
   que dans la tuile produit (couleur pastel propre à chaque article, servie
   en inline depuis la base) et dans les états sémantiques de commande
   (expédiée / livrée), qui encodent une information réelle.

   Polices : Geist Mono (interface, licence OFL) + Bodoni Moda (titres).
   Chargées dans includes/header.php.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Jetons
   --------------------------------------------------------------------------
   Les noms hérités (--bg, --ink, --border, --blue, --green…) sont conservés :
   tout le HTML des 84 pages les référence déjà. Seules leurs VALEURS changent.
   --blue ne pointe plus vers un bleu d'accent mais vers l'encre : les états
   « actif » deviennent noirs, ce qui supprime la couleur d'accent partout
   sans toucher au balisage.
   -------------------------------------------------------------------------- */
:root {
  /* Demi-largeur reelle de la page, posee par esMesurerLargeurPage() (footer).
     Sert au bord-a-bord des rangees defilantes. Le repli 50vw suffit au premier
     rendu mais compte la barre de defilement : ~7px de trop de chaque cote, soit
     une premiere et une derniere vignette rognees. Le JS corrige des qu'il
     s'execute ; overflow-x: clip sur body couvre l'intervalle. */
  --demi-page: 50vw;
  /* Gouttiere de page : la distance entre le bord de la fenetre et le debut du
     contenu du header. Les rangees defilantes s'y alignent (voir
     .scroll-row-wrap), d'ou un jeton partage plutot que 32px recopie aux deux
     endroits -- sinon les deux derivent au premier ajustement. */
  --gouttiere-page: 32px;
  --bg: #F2F2F2;
  --bg-panel: #E3E3E3;
  --card-bg: #E3E3E3;
  --card-hover: #DCDCDC;
  --surface: #FFFFFF;
  --ink: #1C1C1C;
  /* #656565 et non #8A8A8A : sur --card-bg (#E3E3E3), la surface la plus
     sombre du theme clair, l'ancien gris donnait 2,69:1 -- sous le seuil AA
     de 4,5. C'est la valeur la plus CLAIRE qui passe sur les trois surfaces
     claires : 4,54 sur #E3E3E3, 5,21 sur #F2F2F2, 5,83 sur #FFFFFF. Ne pas
     l'eclaircir sans refaire le calcul contre #E3E3E3, c'est elle qui
     contraint. Le --ink-soft du theme sombre est laisse tel quel : 4,92. */
  --ink-soft: #656565;
  --ink-faint: #ABABAB;
  --border: #D2D2D2;
  --shadow: rgba(0, 0, 0, .06);

  /* Ancien accent — neutralisé volontairement (voir en-tête de section). */
  --blue: #1C1C1C;
  --blue-bg: #E3E3E3;

  /* Couleurs sémantiques : réservées aux états de commande et aux alertes
     de stock, jamais à la décoration. Désaturées pour cohabiter avec le gris. */
  --green: #2F6B4C;
  --green-bg: #E2EBE5;
  --warn: #8A5A12;
  --warn-bg: #F0E8DA;
  --alert: #B33A28;
  /* Encre a poser SUR un fond --alert. Elle s'inverse d'un theme a l'autre :
     --alert est un rouge sombre en clair (blanc dessus : 5,91) mais un corail
     clair en sombre (blanc : 2,66, illisible ; encre : 6,42). */
  --sur-alert: #FFFFFF;
  --alert-bg: #F2E2DF;
  --star: #7A7A7A;

  --radius-card: 16px;
  --radius-tile: 12px;
  --radius-ctl: 8px;
}

[data-theme="dark"] {
  --bg: #141414;
  --bg-panel: #222222;
  --card-bg: #222222;
  --card-hover: #2A2A2A;
  --surface: #0E0E0E;
  --ink: #F2F2F2;
  --ink-soft: #8F8F8F;
  --ink-faint: #6A6A6A;
  --border: #333333;
  --shadow: rgba(0, 0, 0, .5);

  --blue: #F2F2F2;
  --blue-bg: #2E2E2E;
  --sur-alert: #1C1C1C;

  --green: #6BC095;
  --green-bg: rgba(107, 192, 149, .14);
  --warn: #D9A45B;
  --warn-bg: rgba(217, 164, 91, .14);
  --alert: #E8836F;
  --alert-bg: rgba(232, 131, 111, .14);
  --star: #9A9A9A;
}

/* Repli avant l'exécution du script de thème dans header.php : si le système
   est en sombre et qu'aucun data-theme n'est encore posé, on évite le flash
   d'un fond clair. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) {
    --bg: #141414;
    --bg-panel: #222222;
    --card-bg: #222222;
    --card-hover: #2A2A2A;
    --surface: #0E0E0E;
    --ink: #F2F2F2;
    --ink-soft: #8F8F8F;
    --ink-faint: #6A6A6A;
    --border: #333333;
    --blue: #F2F2F2;
    --blue-bg: #2E2E2E;
    /* Pas de --sur-alert ici, volontairement : ce repli ne redefinit pas
       --alert non plus, qui reste donc le rouge sombre du theme clair. Les
       deux vont par paire -- y poser l'encre sombre la mettrait sur ce rouge,
       a 2,88:1, soit pire que le blanc herite de :root. */
  }
}

/* --------------------------------------------------------------------------
   2. Base
   -------------------------------------------------------------------------- */
* { box-sizing: border-box; }

body {
  margin: 0;
  font-family: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 12.5px;
  line-height: 1.55;
  background-color: var(--bg);
  /* Le motif de fond n'est plus porté par body lui-même mais par un calque
     dédié — voir la section « Motifs de fond » plus bas. */
  color: var(--ink);
  -webkit-font-smoothing: antialiased;
  transition: background-color .15s, color .15s;
  /* Les rangees defilantes sortent des gouttieres en se tirant a 100vw (voir
     .scroll-row-wrap). Or 100vw compte la barre de defilement alors que la
     page ne fait que clientWidth : sans ce garde-fou, une quinzaine de pixels
     de debordement horizontal. clip plutot que hidden -- clip ne cree pas de
     conteneur de defilement, donc position:sticky et position:fixed
     continuent de fonctionner (le volet panier et .pdp-info en dependent). */
  overflow-x: clip;
}

a { color: inherit; }

img { max-width: 100%; }


:where(a, button, select, input, textarea, summary):focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 2px;
  border-radius: 2px;
}

@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; animation: none !important; }
}

/* --------------------------------------------------------------------------
   3. Primitives typographiques
   --------------------------------------------------------------------------
   .u-display : Bodoni Moda, graisse légère, pour les grands titres.
   .u-label   : étiquette monospace capitale — la brique de base du système.
   -------------------------------------------------------------------------- */
.u-display,
.hero-title,
.pdp-title,
.article-title,
.login-title,
.modal-title,
.cart-drawer-title,
.pricing-price,
.creator-banner-title,
.creator-about-title,
.creator-about-section-title,
.section-title {
  font-family: 'Bodoni Moda', Didot, 'Bodoni MT', Georgia, serif;
  font-weight: 400;
  letter-spacing: -.005em;
  text-wrap: balance;
}

.u-label,
.pdp-label,
.pdp-brand,
.pricing-name,
.creator-about-eyebrow,
.hero-eyebrow,
.site-footer-copy {
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ink-soft);
}

/* Les chiffres alignés en colonne ou comparés entre eux passent en chasse
   fixe tabulaire (prix, compteurs, notes). */
.product-price-row, .pdp-price, .price-old, .cart-line-price,
.cart-drawer-total, .pill-count, .review-count, .product-rating,
.pdp-rating, .creator-subnav-stats, .cat-toolbar-count, .search-result-price {
  font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   4. Barre supérieure
   -------------------------------------------------------------------------- */
.topbar {
  display: grid;
  grid-template-columns: 1fr minmax(160px, 480px) 1fr;
  align-items: center;
  gap: 24px;
  padding: 16px var(--gouttiere-page);
}
.topbar-left { display: flex; align-items: center; gap: 24px; justify-self: start; min-width: max-content; }

/* Identité — bloc typographique pur. L'ancien anneau bleu devient un carré
   d'encre : la marque se lit dans la typographie, pas dans un pictogramme. */
.brand-mark { display: flex; align-items: center; gap: 9px; text-decoration: none; flex-shrink: 0; }
.brand-ring {
  width: 12px; height: 12px;
  border-radius: 2px;
  border: none;
  background: var(--ink);
  flex-shrink: 0;
  box-sizing: border-box;
}
/* Bloc-marque sur deux lignes, avec l'étiquette de nature en exposant —
   structure typographique du système. Pas de symbole ® : Esprit Smart n'est
   pas une marque déposée à ma connaissance, et l'afficher serait une
   affirmation juridique, pas un choix graphique. */
.brand-wordmark {
  font-family: inherit;
  font-weight: 600;
  font-size: 11px;
  line-height: 1.22;
  letter-spacing: .10em;
  color: var(--ink);
  text-transform: uppercase;
  white-space: nowrap;
}
.brand-tag {
  font-size: 7px;
  letter-spacing: .16em;
  color: var(--ink-soft);
  margin-left: 5px;
  vertical-align: 1px;
}

.topbar-nav { display: flex; gap: 22px; font-size: 11px; font-weight: 500; letter-spacing: .07em; text-transform: uppercase; }
.topbar-nav a { text-decoration: none; color: var(--ink-soft); }
.topbar-nav a:hover { color: var(--ink); }
.topbar-nav a.active { color: var(--ink); text-decoration: underline; text-underline-offset: 4px; }

.topbar-nav-mobile {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  flex: 1;
  min-width: 0;
  gap: 14px;
  overflow-x: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.topbar-nav-mobile::-webkit-scrollbar { display: none; }
.topbar-nav-mobile a, .topbar-nav-mobile button {
  text-decoration: none;
  color: var(--ink-soft);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .07em;
  text-transform: uppercase;
  font-family: inherit;
  white-space: nowrap;
  flex-shrink: 0;
  border: none;
  background: none;
  padding: 0;
  cursor: pointer;
}
.topbar-nav-mobile a:hover, .topbar-nav-mobile button:hover { color: var(--ink); }
.topbar-nav-mobile a.active, .topbar-nav-mobile button.active { color: var(--ink); text-decoration: underline; text-underline-offset: 4px; }

/* Méga-menu mobile — panneau plein écran. */
.mobile-mega-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, .5);
  z-index: 45;
}
.mobile-mega-menu {
  position: fixed;
  left: 0; right: 0; bottom: 0; top: 12%;
  background: var(--bg);
  border-top: 1px solid var(--border);
  border-radius: var(--radius-card) var(--radius-card) 0 0;
  z-index: 46;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.mobile-mega-menu-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 20px;
  border-bottom: 1px solid var(--border);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
}
.mobile-mega-menu-body {
  overflow-y: auto;
  padding: 16px 20px 112px;
  display: flex;
  flex-direction: column;
  gap: 22px;
}
.mobile-mega-menu-body .mega-menu-col { display: flex; flex-direction: column; gap: 12px; }
.mobile-mega-menu-body .mega-menu-title { font-size: 13px; }
.mobile-mega-menu-body .mega-menu-sub { font-size: 13px; }

/* .mobile-mega-menu/.mobile-mega-overlay fixent leur propre `display`
   ci-dessus, ce qui l'emporte sur le `display:none` de l'attribut HTML
   `hidden` — d'où ce sélecteur plus spécifique. */
.mobile-mega-overlay[hidden], .mobile-mega-menu[hidden] { display: none; }

@media (min-width: 901px) {
  .mobile-mega-overlay, .mobile-mega-menu { display: none !important; }
}

.mobile-bottom-header { display: none; }
.mobile-bottom-row {
  display: flex;
  align-items: center;
  gap: 12px;
  /* Cette rangee est FIXEE au bas de l'ecran : ses elements d'extremite
     tombent dans l'arc des coins arrondis du telephone, et l'icone la plus
     basse dans la zone du geste systeme.
     Mesure a 375x812 avant correction : le panier etait a 10px du bord bas
     et 16px du bord droit. Un coin d'iPhone a environ 44px de rayon -- a
     ces distances l'icone est litteralement dans la courbe.
     Une barre posee sur le bord a donc besoin de plus de gouttiere que le
     reste de la page : 22px au lieu du jeton a 16.
     Les env() sont inertes aujourd'hui (la page n'est pas en
     viewport-fit=cover, iOS insere donc deja la zone sure) ; ils sont la
     pour rester corrects si elle le devient un jour. */
  padding: 12px max(22px, env(safe-area-inset-right, 0px))
           max(16px, env(safe-area-inset-bottom, 0px))
           max(22px, env(safe-area-inset-left, 0px));
}

/* Méga-menu « Catalogue » */
.nav-dropdown { position: relative; }
.mega-menu {
  display: none;
  position: absolute;
  top: 100%; left: 0;
  padding-top: 14px; /* pont invisible : garde le survol actif */
  z-index: 50;
}
.nav-dropdown:hover .mega-menu,
.nav-dropdown:focus-within .mega-menu { display: block; }
.mega-menu-inner {
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 24px;
  box-shadow: 0 8px 24px var(--shadow);
  display: grid;
  grid-template-columns: repeat(4, 170px);
  gap: 20px 28px;
}
.mega-menu-col { display: flex; flex-direction: column; gap: 6px; }
.mega-menu-title {
  font-size: 10.5px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase;
  color: var(--ink); margin-bottom: 6px; text-decoration: none;
}
.mega-menu-title.active { text-decoration: underline; text-underline-offset: 3px; }
.mega-menu-sub { font-size: 12px; color: var(--ink-soft); text-decoration: none; }
.mega-menu-sub:hover { color: var(--ink); }
.mega-menu-sub.active { color: var(--ink); text-decoration: underline; text-underline-offset: 3px; }

/* --------------------------------------------------------------------------
   5. Recherche
   -------------------------------------------------------------------------- */
.search-wrap { position: relative; width: 100%; max-width: 90vw; }
.search-inline {
  display: flex;
  align-items: center;
  gap: 10px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-ctl);
  padding: 5px 14px 5px 5px;
}
.search-cat-wrap { position: relative; flex-shrink: 0; }
.search-cat-btn {
  display: flex;
  align-items: center;
  gap: 5px;
  max-width: 150px;
  border: none;
  background: none;
  color: var(--ink-soft);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
  font-family: inherit;
  padding: 7px 10px 7px 12px;
  border-radius: 6px;
  cursor: pointer;
}
.search-cat-btn:hover { color: var(--ink); background: var(--bg-panel); }
.search-cat-btn span:first-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.search-cat-chevron { font-size: 9px; flex-shrink: 0; }
.search-cat-panel {
  position: absolute;
  top: calc(100% + 8px);
  left: 0;
  min-width: 180px;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-ctl);
  padding: 6px;
  box-shadow: 0 8px 24px var(--shadow);
  z-index: 25;
}
.search-cat-option {
  display: block;
  width: 100%;
  text-align: left;
  border: none;
  background: none;
  color: var(--ink);
  font-size: 12px;
  font-family: inherit;
  padding: 8px 12px;
  border-radius: 6px;
  cursor: pointer;
}
.search-cat-option:hover { background: var(--bg-panel); }
.search-cat-option.active { background: var(--bg-panel); font-weight: 600; }
.search-cat-divider { flex-shrink: 0; width: 1px; height: 18px; background: var(--border); }
.search-inline-icon { font-size: 13px; color: var(--ink-soft); }
.search-inline input {
  flex: 1;
  min-width: 0;
  border: none;
  background: none;
  color: var(--ink);
  font-size: 12.5px;
  outline: none;
  font-family: inherit;
}
/* --ink-soft et non --ink-faint sur les placeholders : le champ de recherche
   n'a pas de libelle visible, son placeholder est donc sa seule etiquette.
   --ink-faint y donnait 2,30:1 en clair. Ce qui reste sur --ink-faint est
   decoratif (bordures au survol) et n'a aucune exigence de contraste. */
.search-inline input::placeholder { color: var(--ink-soft); }
.search-dropdown {
  position: absolute;
  top: calc(100% + 8px);
  left: 0; right: 0;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 8px;
  box-shadow: 0 8px 24px var(--shadow);
  z-index: 20;
}
.search-dropdown:empty { display: none; padding: 0; border: none; }

.search-result {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 8px;
  border-radius: var(--radius-ctl);
  text-decoration: none;
  color: var(--ink);
}
.search-result:hover { background: var(--bg-panel); }
.search-result-emoji {
  width: 40px; height: 40px;
  border-radius: var(--radius-tile);
  display: flex; align-items: center; justify-content: center;
  font-size: 20px;
  flex-shrink: 0;
}
.search-result-text { display: flex; flex-direction: column; flex: 1; min-width: 0; }
.search-result-text .name { font-size: 12.5px; font-weight: 500; }
.search-result-text .brand { font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-soft); }
.search-result-price { font-size: 12.5px; font-weight: 500; }
.search-empty { padding: 8px; color: var(--ink-soft); font-size: 12px; }

/* --------------------------------------------------------------------------
   6. Icônes, langue, panier
   -------------------------------------------------------------------------- */
.topbar-icons { display: flex; align-items: center; gap: 12px; justify-self: end; min-width: max-content; }
.lang-toggle {
  display: flex;
  align-items: center;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 999px;
  padding: 3px;
  gap: 2px;
  flex-shrink: 0;
}
.lang-toggle-opt {
  padding: 5px 10px;
  border-radius: 999px;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .08em;
  text-decoration: none;
  color: var(--ink-soft);
  line-height: 1;
}
.lang-toggle-opt:hover { color: var(--ink); }
.lang-toggle-opt.active { background: var(--ink); color: var(--bg); }
.icon-plain {
  position: relative;
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--ink);
  font-size: 14px;
  width: 32px; height: 32px;
  border-radius: 999px;
  display: flex; align-items: center; justify-content: center;
  text-decoration: none;
  cursor: pointer;
  transition: background .15s;
}
.icon-plain:hover { background: var(--bg-panel); }
/* Les icônes sont désormais des SVG au trait (voir uiIcon() dans
   includes/icons.php) : display:block supprime l'espace de ligne de base qui
   décalait le glyphe d'un pixel vers le bas dans le cercle. */
.icon-plain svg { display: block; }
.search-inline-icon { display: inline-flex; align-items: center; }
.search-inline-icon svg { display: block; }
.cart-badge {
  position: absolute; top: -3px; right: -3px;
  background: var(--ink); color: var(--bg);
  font-size: 9px; font-weight: 600;
  border-radius: 999px; min-width: 16px; height: 16px;
  display: flex; align-items: center; justify-content: center;
  padding: 0 3px;
  font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   7. Modales et volets
   -------------------------------------------------------------------------- */
.modal-overlay {
  position: fixed; inset: 0;
  background: rgba(0, 0, 0, .45);
  z-index: 60;
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
}
.modal-overlay[hidden] { display: none; }
.modal-box {
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  width: 420px;
  max-width: 100%;
  max-height: 90vh;
  overflow-y: auto;
  box-shadow: 0 16px 48px var(--shadow);
}
.modal-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 22px; border-bottom: 1px solid var(--border); }
.modal-title { font-size: 20px; }
.modal-close { border: none; background: none; color: var(--ink); font-size: 16px; cursor: pointer; font-family: inherit; }
.modal-body { padding: 20px 22px; }
.modal-body textarea {
  width: 100%;
  resize: vertical;
  border: 1px solid var(--border);
  border-radius: var(--radius-ctl);
  padding: 12px 14px;
  font-family: inherit;
  font-size: 12.5px;
  background: var(--surface);
  color: var(--ink);
}

.cart-overlay {
  position: fixed; inset: 0;
  background: rgba(0, 0, 0, .45);
  z-index: 40;
}
.cart-drawer[hidden], .cart-overlay[hidden] { display: none; }
.cart-drawer {
  position: fixed;
  top: 0; right: 0;
  bottom: 0;
  width: 420px;
  max-width: 92vw;
  background: var(--bg);
  border-left: 1px solid var(--border);
  z-index: 41;
  display: flex;
  flex-direction: column;
  box-shadow: -4px 0 24px var(--shadow);
}
.cart-drawer-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 24px;
  border-bottom: 1px solid var(--border);
}
.cart-drawer-title { font-size: 24px; }
.cart-drawer-close { border: none; background: none; color: var(--ink); font-size: 16px; cursor: pointer; font-family: inherit; }
.cart-drawer-body { flex: 1; overflow-y: auto; padding: 16px 24px; }
.cart-empty { color: var(--ink-soft); font-size: 12.5px; }
.cart-line {
  display: flex; align-items: center; gap: 12px;
  padding: 14px 0;
  border-bottom: 1px solid var(--border);
}
.cart-line-thumb {
  position: relative;
  width: 52px; height: 52px;
  border-radius: var(--radius-tile);
  overflow: hidden;
  display: flex; align-items: center; justify-content: center;
  font-size: 26px;
  flex-shrink: 0;
}
.cart-line-info { flex: 1; min-width: 0; }
.cart-line-name { font-size: 12.5px; font-weight: 500; }
.cart-line-qty { font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-soft); }
.cart-line-price { font-size: 12.5px; font-weight: 500; white-space: nowrap; }
.cart-line-remove { border: none; background: none; color: var(--ink-soft); font-size: 13px; cursor: pointer; padding: 4px; font-family: inherit; }
.cart-line-remove:hover { color: var(--ink); }
.cart-line-save-link {
  border: none; background: none; padding: 0; margin-top: 4px;
  color: var(--ink-soft); font-size: 10.5px; letter-spacing: .05em; text-transform: uppercase;
  text-decoration: underline; text-underline-offset: 2px;
  cursor: pointer; font-family: inherit;
}
.cart-line-save-link:hover { color: var(--ink); }
.cart-drawer-footer { padding: 20px 24px; border-top: 1px solid var(--border); }
.cart-drawer-total { display: flex; align-items: center; justify-content: space-between; font-size: 13px; margin-bottom: 14px; }
.cart-drawer-view { width: 100%; }
/* Volet panier : plein ecran en mobile. En 420px large plafonnes a 92vw, il
   laissait une bande de page visible sur le cote -- une trentaine de pixels
   sur un ecran de 375px, qui continuaient de defiler derriere. On etire le
   volet d'un bord a l'autre.
   left:0 + width:auto plutot que width:100vw : sur mobile 100vw peut inclure
   la barre de defilement et provoquer un debordement horizontal, alors que
   les quatre cotes cales a 0 remplissent exactement le cadre.
   La bordure gauche et l'ombre portee vers la gauche disparaissent : elles ne
   separaient le volet que de ce qui se trouvait a cote, et il n'y a plus
   rien a cote. */
@media (max-width: 640px) {
  .cart-drawer {
    left: 0;
    width: auto;
    max-width: none;
    border-left: none;
    box-shadow: none;
  }
}
/* "Enregistre pour plus tard" dans le volet : un bloc detache sous le panier,
   pour qu'on ne confonde pas ces articles avec ceux qu'on s'apprete a payer.
   Les lignes reutilisent .cart-line telles quelles -- meme gabarit, seule
   l'entete et la rangee d'actions sont nouvelles. */
.cart-drawer-saved {
  margin-top: 22px;
  padding-top: 16px;
  border-top: 1px solid var(--border);
}
.cart-drawer-saved-title {
  font-size: 10.5px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ink-soft);
  margin-bottom: 6px;
}
/* Les deux liens d'action cote a cote. .cart-line-save-link porte deja un
   margin-top de 4px : le flex l'aligne sans qu'on ait a le neutraliser. */
.cart-line-actions { display: flex; gap: 14px; }
.cart-page-list { border-top: 1px solid var(--border); }
.cart-page-footer { margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--border); }

/* --------------------------------------------------------------------------
   8. Hero et sections
   -------------------------------------------------------------------------- */
.hero { max-width: 1360px; margin: 0 auto; padding: 32px; }
.hero-cat-grid {
  display: flex;
  flex: 1 1 0;
  min-width: 0;
  gap: 16px;
  overflow-x: auto;
  scroll-snap-type: x proximity;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.hero-cat-grid::-webkit-scrollbar { display: none; }
.hero-cat-card {
  flex: 1 1 260px;
  min-width: 260px;
  scroll-snap-align: start;
  background: var(--card-bg);
  border: 1px solid var(--card-bg);
  border-radius: var(--radius-card);
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  text-decoration: none;
  color: inherit;
  transition: background .18s, border-color .18s;
}
.hero-cat-card:hover { background: var(--card-hover); border-color: var(--ink-faint); }
.hero-cat-card-header {
  display: flex; align-items: center; gap: 8px;
  font-size: 10.5px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase;
}
.hero-cat-card-products { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.hero-cat-product {
  aspect-ratio: 1;
  border-radius: var(--radius-tile);
  display: flex; align-items: center; justify-content: center;
  font-size: 32px;
  overflow: hidden;
}
.hero-cat-product .product-photo { width: 100%; height: 100%; object-fit: cover; }
.hero-cat-card-cta { font-size: 10px; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-soft); }
.hero-cat-card:hover .hero-cat-card-cta { color: var(--ink); }

/* Masthead — ouverture de page du système : flèche de retour, grand titre
   serif, accroche. Remplace les pavés centrés dans un cadre, qui coupaient
   la page en deux au lieu de l'ouvrir. Partagé par le catalogue, l'accueil
   et les boutiques. */
.masthead {
  max-width: 1360px;
  margin: 0 auto;
  padding: 28px var(--gouttiere-page) 22px;
  display: grid;
  grid-template-columns: 56px minmax(0, 1fr);
  gap: 0 20px;
  align-items: start;
}
.masthead-back {
  width: 40px; height: 40px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: transparent;
  color: var(--ink);
  display: flex; align-items: center; justify-content: center;
  text-decoration: none;
  font-size: 15px;
  flex-shrink: 0;
  transition: background .15s;
}
.masthead-back:hover { background: var(--card-bg); }
.masthead-body { max-width: 780px; min-width: 0; }
.masthead .breadcrumb { margin-bottom: 14px; }
.masthead-title {
  font-family: 'Bodoni Moda', Didot, 'Bodoni MT', Georgia, serif;
  font-weight: 400;
  font-size: clamp(32px, 5vw, 50px);
  line-height: 1.04;
  letter-spacing: -.005em;
  margin: 0 0 14px;
  text-wrap: balance;
}
/* Le compteur entre parenthèses reprend la notation des métadonnées : il
   énonce un fait (combien d'articles), il n'est pas décoratif. */
.masthead-count { color: var(--ink-soft); font-family: 'Geist Mono', monospace; font-size: .42em; letter-spacing: .04em; vertical-align: .35em; }
.masthead-deck { margin: 0; font-size: 12.5px; line-height: 1.7; max-width: 62ch; color: var(--ink); }

/* Variante sans flèche de retour : l'accueil, où il n'y a nulle part où
   remonter. Une seule colonne plutôt qu'une gouttière de 56px vide. */
/* Variante pour les pages en colonne etroite (panier, tunnel de commande) :
   le masthead s'aligne sur la largeur du contenu au lieu de s'etaler sur
   toute la page, ce qui le laissait flotter loin a gauche du bloc central.
   784 = 720 de contenu + les 32px de marge interne de chaque cote. */
.masthead--narrow {
  /* Meme largeur que la .section de ces pages, pas 720+64 : box-sizing est en
     border-box, la marge interne est deja comprise dans le max-width. Ajouter
     le padding decalait le titre de 32px a gauche du contenu. */
  max-width: 720px;
  /* Colonne unique : la gouttiere de 56px reservee a la fleche decalait le
     titre de 44px vers la droite du contenu juste en dessous. Sur une page
     large l'ecart passe inapercu, sur une colonne etroite il se lit comme un
     defaut d'alignement. La fleche remonte donc au-dessus du titre. */
  grid-template-columns: minmax(0, 1fr);
  gap: 14px 0;
}
.masthead--narrow .masthead-back { margin-bottom: 2px; }

.masthead--plain { grid-template-columns: minmax(0, 1fr); padding-top: 34px; }
/* La mesure est posée sur le titre, pas sur son conteneur : `ch` se calcule
   d'après la police de l'élément, et sur le conteneur il aurait été résolu
   avec la mono à 12,5px — soit une colonne de 165px qui brisait le titre en
   sept lignes. */
.masthead--plain .masthead-title { max-width: 24ch; margin-bottom: 0; }

@media (max-width: 640px) {
  .masthead { grid-template-columns: 1fr; gap: 16px; padding: 20px var(--gouttiere-page) 16px; }
  .masthead--plain .masthead-body { max-width: none; }
}

/* .hero-text subsiste pour d'anciennes pages qui l'utilisent encore. */
.hero-text {
  background: var(--card-bg);
  border: 1px solid var(--border);
  padding: 48px 32px;
  border-radius: var(--radius-card);
  text-align: center;
}
.hero-eyebrow { margin-bottom: 10px; }
.hero-title { font-size: clamp(34px, 5vw, 48px); line-height: 1.05; margin-bottom: 14px; }
.hero-sub { font-size: 12.5px; color: var(--ink); max-width: 62ch; margin: 0 auto; line-height: 1.7; }

.section { max-width: 1360px; margin: 0 auto; padding: 48px 32px; }
.section-alt { max-width: none; margin: 0; background: var(--bg-panel); }
.section-inner { max-width: 1360px; margin: 0 auto; }
.section-title { font-size: 28px; margin: 0 0 28px; }
.section-title.center { text-align: center; }
.section-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 22px; }
.section-head .section-title { margin: 0; }
.view-all { font-size: 10.5px; letter-spacing: .07em; text-transform: uppercase; text-decoration: underline; text-underline-offset: 3px; color: var(--ink-soft); }
.view-all:hover { color: var(--ink); }

.breadcrumb { font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-soft); }
.breadcrumb a { text-decoration: none; }
.breadcrumb a:hover { color: var(--ink); }

/* --------------------------------------------------------------------------
   9. Fiche produit
   -------------------------------------------------------------------------- */
/* Deux colonnes : le visuel à gauche, la colonne d'achat à droite. Les avis
   descendent en pleine largeur sous la fiche (voir .pdp-feedback-section) —
   en troisième colonne, ils écrasaient à la fois le bloc d'achat et
   eux-mêmes. */
.pdp-grid {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  align-items: start;
  gap: 48px;
  margin-top: 20px;
}
/* .pdp-media regroupe l'image et ses vignettes en UN seul élément de grille.
   Sans cette enveloppe, .pdp-thumbs devenait un élément de grille à part
   entière et décalait toute la mise en page dès qu'un produit avait une
   galerie. */
.pdp-media { min-width: 0; }
.pdp-info {
  min-width: 0;
  position: sticky;
  top: 24px;
}
.pdp-image {
  position: relative;
  border-radius: var(--radius-card);
  overflow: hidden;
  aspect-ratio: 1 / 1;
  display: flex; align-items: center; justify-content: center;
  container-type: inline-size;
}
.pdp-emoji { font-size: clamp(88px, 34cqw, 200px); }
@supports not (width: 1cqw) { .pdp-emoji { font-size: 150px; } }

/* Section avis, pleine largeur sous la fiche. */
.pdp-feedback-section { padding-top: 8px; }
.pdp-feedback-col { max-width: 860px; }
.pdp-thumbs { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
.pdp-thumb {
  width: 56px; height: 56px;
  border-radius: var(--radius-tile);
  overflow: hidden;
  border: 1px solid var(--border);
  padding: 0; cursor: pointer;
  background: var(--card-bg);
  flex-shrink: 0;
}
.pdp-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pdp-thumb.active { border-color: var(--ink); border-width: 2px; }
.pdp-brand { margin-bottom: 10px; }
.pdp-brand-link { display: inline-block; text-decoration: none; }
.pdp-brand-link:hover { color: var(--ink); text-decoration: underline; text-underline-offset: 3px; }
.pdp-title { font-size: clamp(28px, 3.4vw, 38px); margin: 0 0 12px; line-height: 1.1; }

/* Note du produit en chiffres, comme sur les cartes : à cette taille, "4,6"
   se lit et se compare, cinq glyphes étoile non. Les étoiles restent sur les
   avis individuels, où le nombre de glyphes EST l'information. */
.pdp-rating { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.pdp-score { font-size: 14px; font-weight: 500; color: var(--ink); font-variant-numeric: tabular-nums; }
.pdp-score-max { font-size: 11px; color: var(--ink-soft); margin-left: -6px; }
.pdp-rating .review-count { font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; text-decoration: none; }
.pdp-rating .review-count:hover { color: var(--ink); text-decoration: underline; text-underline-offset: 3px; }
.pdp-stars { letter-spacing: 1px; color: var(--star); }

.pdp-price {
  font-size: 26px;
  font-weight: 500;
  margin-bottom: 26px;
  letter-spacing: .01em;
  font-variant-numeric: tabular-nums;
}
.pdp-price .price-old { font-size: 13px; margin-left: 10px; }

/* Caractéristiques : liste de définitions à deux colonnes, alignée par un
   filet pointillé. En chasse fixe, les valeurs se lisent en colonne. */
.pdp-specs { margin: 12px 0 0; display: grid; grid-template-columns: auto 1fr; gap: 8px 16px; }
.pdp-specs dt {
  font-size: 10px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ink-soft);
  white-space: nowrap;
}
.pdp-specs dd { margin: 0; font-size: 12px; color: var(--ink); }
.pdp-block { margin-bottom: 24px; }
.pdp-label { margin-bottom: 10px; }

.checkout-input {
  width: 100%;
  padding: 11px 14px;
  border-radius: var(--radius-ctl);
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--ink);
  font-size: 12.5px;
  font-family: inherit;
}
.checkout-input::placeholder { color: var(--ink-soft); }

.pdp-swatch-row { display: flex; gap: 10px; }
.pdp-swatch {
  width: 30px; height: 30px;
  border-radius: 50%;
  border: 1px solid var(--border);
  cursor: pointer;
  padding: 0;
}
.pdp-swatch.active { border-color: var(--ink); border-width: 2px; }
.pdp-size-row { display: flex; gap: 8px; flex-wrap: wrap; }
.pdp-size-btn {
  min-width: 44px;
  padding: 8px 14px;
  border-radius: var(--radius-ctl);
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--ink);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .05em;
  text-transform: uppercase;
  font-family: inherit;
  cursor: pointer;
}
.pdp-size-btn.active { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.pdp-buy { margin-bottom: 20px; }
.pdp-ask-seller {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  width: 100%; margin: 0 0 8px;
  border: none; background: none;
  font-family: inherit;
  font-size: 10.5px; font-weight: 500;
  letter-spacing: .07em; text-transform: uppercase;
  color: var(--ink-soft); text-decoration: none;
  cursor: pointer;
}
.pdp-ask-seller:hover { color: var(--ink); }

.pdp-accordion { border-top: 1px solid var(--border); padding: 14px 0; }
.pdp-accordion summary {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  font-size: 11px; font-weight: 500;
  letter-spacing: .07em; text-transform: uppercase;
  cursor: pointer;
  list-style: none;
}
.pdp-accordion summary::-webkit-details-marker { display: none; }
.pdp-accordion summary::after {
  content: '';
  width: 6px; height: 6px;
  flex-shrink: 0;
  border-right: 1.5px solid var(--ink-soft);
  border-bottom: 1.5px solid var(--ink-soft);
  transform: rotate(45deg);
  transition: transform .2s ease;
}
.pdp-accordion[open] summary::after { transform: rotate(-135deg); }
.pdp-accordion p { margin: 12px 0 0; color: var(--ink-soft); font-size: 12px; line-height: 1.7; max-width: 62ch; }

/* Onglets « Avis / Discussion » */
.feedback-tabs-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--border); margin-bottom: 20px; }
.feedback-tabs { display: flex; gap: 4px; }
.feedback-tabs-row .pdp-like-pill { flex-shrink: 0; margin-bottom: 8px; }
.feedback-tab {
  border: none; background: none; cursor: pointer;
  padding: 12px 4px 14px; margin-right: 20px;
  font-family: inherit;
  font-size: 10.5px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase;
  color: var(--ink-soft);
  border-bottom: 2px solid transparent;
}
.feedback-tab-count { font-weight: 400; }
.feedback-tab.active { color: var(--ink); border-bottom-color: var(--ink); }

/* Photos « en situation » */
.usage-photo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; }
.usage-photo-item { border-radius: var(--radius-tile); overflow: hidden; background: var(--card-bg); }
.usage-photo-item img { display: block; width: 100%; aspect-ratio: 4 / 5; object-fit: cover; }
.usage-photo-meta { padding: 8px 10px 10px; }
.usage-photo-credit { font-size: 10.5px; font-weight: 500; letter-spacing: .06em; text-transform: uppercase; }
.usage-photo-caption { margin: 4px 0 0; font-size: 11.5px; color: var(--ink-soft); line-height: 1.55; }

/* --------------------------------------------------------------------------
   10. Avis
   -------------------------------------------------------------------------- */
.review-item { padding: 16px 0; border-top: 1px solid var(--border); }
.review-item-head { display: flex; align-items: center; gap: 10px; }
.review-item-stars { color: var(--star); font-size: 11px; }
.review-item-date { font-size: 10.5px; letter-spacing: .05em; text-transform: uppercase; color: var(--ink-soft); margin-top: 2px; }
.review-item-comment { margin: 8px 0 0; font-size: 12px; color: var(--ink-soft); line-height: 1.7; max-width: 62ch; }

.review-composer {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 16px;
  margin-bottom: 28px;
}
.review-composer-top { display: flex; gap: 10px; margin-bottom: 10px; }
.review-rating-pill {
  appearance: none;
  -webkit-appearance: none;
  background: var(--surface) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M0 0l5 6 5-6z' fill='%238A8A8A'/></svg>") no-repeat right 12px center;
  border: 1px solid var(--border);
  border-radius: var(--radius-ctl);
  padding: 8px 30px 8px 14px;
  font-family: inherit;
  font-size: 11px;
  letter-spacing: .05em;
  color: var(--ink);
  cursor: pointer;
}
.review-composer-input {
  width: 100%;
  border: none;
  background: none;
  font-family: inherit;
  font-size: 12.5px;
  color: var(--ink);
  padding: 6px 4px;
  resize: vertical;
  outline: none;
}
.review-composer-input::placeholder { color: var(--ink-soft); }
.review-composer-bottom {
  display: flex; align-items: center; justify-content: space-between;
  padding-top: 12px;
  margin-top: 4px;
  border-top: 1px solid var(--border);
}
.review-composer-hint { font-size: 10.5px; letter-spacing: .05em; text-transform: uppercase; color: var(--ink-soft); }
.review-composer-send {
  background: var(--ink);
  color: var(--bg);
  border: none;
  border-radius: 999px;
  padding: 9px 22px;
  font-family: inherit;
  font-size: 10.5px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase;
  cursor: pointer;
}
.review-composer-send:hover { opacity: .85; }

/* --------------------------------------------------------------------------
   11. Messagerie
   -------------------------------------------------------------------------- */
.messaging-layout {
  display: flex;
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  overflow: hidden;
  height: 560px;
  background: var(--bg);
}
.messaging-list {
  width: 260px;
  flex-shrink: 0;
  border-right: 1px solid var(--border);
  overflow-y: auto;
}
.messaging-list-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  text-decoration: none;
  color: inherit;
  border-bottom: 1px solid var(--border);
  font-size: 12px;
}
.messaging-list-item:hover, .messaging-list-item.active { background: var(--bg-panel); }
.messaging-thread { flex: 1; display: flex; flex-direction: column; min-width: 0; }
.messaging-thread-header {
  padding: 14px 18px; border-bottom: 1px solid var(--border);
  font-size: 10.5px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase;
}
.messaging-thread-header a { text-decoration: none; color: inherit; }
.messaging-thread-body { flex: 1; overflow-y: auto; padding: 18px; display: flex; flex-direction: column; gap: 10px; }
.messaging-bubble {
  max-width: 70%;
  padding: 10px 14px;
  border-radius: var(--radius-tile);
  font-size: 12px;
  line-height: 1.55;
}
.messaging-bubble.them { align-self: flex-start; background: var(--bg-panel); }
.messaging-bubble.me { align-self: flex-end; background: var(--ink); color: var(--bg); }
.messaging-composer { display: flex; gap: 10px; padding: 14px; border-top: 1px solid var(--border); align-items: flex-end; }
.messaging-composer textarea {
  flex: 1;
  resize: none;
  border: 1px solid var(--border);
  border-radius: var(--radius-ctl);
  padding: 10px 14px;
  font-family: inherit;
  font-size: 12.5px;
  background: var(--surface);
  color: var(--ink);
}

@media (max-width: 640px) {
  .messaging-layout { flex-direction: column; height: auto; }
  .messaging-list { width: 100%; max-height: 180px; border-right: none; border-bottom: 1px solid var(--border); }
  .messaging-thread { height: 420px; }
}

@media (max-width: 900px) {
  /* Une colonne : le bloc d'achat passe sous le visuel et cesse d'être
     collant, sinon il resterait figé au-dessus du contenu qu'on fait défiler. */
  .pdp-grid { grid-template-columns: 1fr; gap: 24px; }
  .pdp-info { position: static; }
}

/* --------------------------------------------------------------------------
   12. Barre catégorie, catégories, pilules
   -------------------------------------------------------------------------- */
.cat-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin: 24px 0;
  padding-bottom: 20px;
}
.cat-toolbar-count { font-size: 10.5px; letter-spacing: .07em; text-transform: uppercase; color: var(--ink-soft); }
.cat-toolbar-filters { display: flex; gap: 8px; flex-wrap: wrap; }
/* Le bouton du menu maison est repris ici avec le <select> : le selecteur
   d'origine ne visait que l'element `select`, il aurait laisse le bouton nu. */
.cat-toolbar-filters select,
.cat-toolbar-filters .es-select-btn {
  padding: 9px 14px;
  border-radius: var(--radius-ctl);
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--ink);
  font-family: inherit;
  font-size: 11px;
  letter-spacing: .05em;
  cursor: pointer;
}
.cat-toolbar-filters .es-select-btn:hover { border-color: var(--ink-faint); }

/* --------------------------------------------------------------------------
   Menus déroulants
   --------------------------------------------------------------------------
   La liste d'un <select> natif est dessinee par le systeme d'exploitation :
   ni son fond, ni la surbrillance bleue de l'option active ne suivent le
   theme, et aucune propriete CSS ne permet de la reprendre de facon fiable.
   Le <select> est donc double par un menu maison (voir esEnhanceSelects()
   dans includes/footer.php), calque sur le selecteur de categorie de la
   recherche qui suivait deja ce motif.

   Le <select> d'origine reste dans le DOM et dans le formulaire : sans
   JavaScript, il fonctionne tel quel. Il est rendu transparent plutot que
   masque, parce qu'un champ `required` masque en display:none ne peut pas
   recevoir le focus et fait echouer la validation du navigateur.
   -------------------------------------------------------------------------- */
.es-select { position: relative; display: inline-flex; vertical-align: middle; }
.es-select-native {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  opacity: 0;
  pointer-events: none;
  border: none;
  padding: 0;
  margin: 0;
}
.es-select-btn {
  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  width: 100%;
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  /* Neutralise la fleche que certaines classes reprises dessinent en
     background-image : le chevron est fourni par le bouton lui-meme. */
  background-image: none;
  appearance: none;
  -webkit-appearance: none;
}
.es-select-chevron { flex-shrink: 0; font-size: 9px; color: var(--ink-soft); line-height: 1; }
.es-select[data-open="true"] .es-select-chevron { transform: rotate(180deg); }

.es-select-panel {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  min-width: 100%;
  /* Un libelle tres long ne doit jamais rendre le panneau plus large que la
     fenetre : le realignement a droite ne suffirait pas a le ramener dedans. */
  max-width: calc(100vw - 24px);
  max-height: 260px;
  overflow-y: auto;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-ctl);
  padding: 5px;
  box-shadow: 0 8px 24px var(--shadow);
  z-index: 30;
}
.es-select-panel[hidden] { display: none; }
.es-select-option {
  display: block;
  width: 100%;
  text-align: left;
  white-space: nowrap;
  border: none;
  background: none;
  color: var(--ink);
  font-family: inherit;
  font-size: 12px;
  padding: 8px 12px;
  border-radius: 6px;
  cursor: pointer;
}
.es-select-option:hover,
.es-select-option[data-highlighted="true"] { background: var(--bg-panel); }
/* L'option retenue se signale par l'encre pleine, pas par une surbrillance
   bleue systeme : c'est la meme convention que .pill.active. */
.es-select-option[aria-selected="true"] { background: var(--ink); color: var(--bg); }

.category-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 20px;
  padding-bottom: 8px;
}
.category-item {
  flex: 0 0 auto;
  scroll-snap-align: start;
  text-decoration: none;
  text-align: center;
  width: 120px;
}
.category-icon {
  width: 88px; height: 88px;
  border-radius: var(--radius-card);
  background: var(--card-bg);
  border: 1px solid var(--border);
  display: flex; align-items: center; justify-content: center;
  font-size: 36px;
  margin: 0 auto 10px;
  transition: background .18s, border-color .18s;
}
.category-item:hover .category-icon { background: var(--card-hover); border-color: var(--ink-faint); }
.category-name { font-size: 10.5px; font-weight: 500; letter-spacing: .07em; text-transform: uppercase; }

.scroll-row-wrap {
  position: relative;
  display: flex;
  align-items: center;
  gap: 8px;
  /* Bord a bord. Le conteneur (.hero, .section ou .section-inner) est centre
     avec une max-width de 1360px et 32px de padding : on annule les deux d'un
     coup en tirant chaque bord jusqu'a celui de la fenetre. Les titres et les
     textes voisins, eux, restent alignes sur la colonne.
     calc(50% - 50vw) : 50% se resout sur la largeur du conteneur, 50vw sur
     celle de la fenetre -- la difference est exactement la gouttiere a
     rattraper. Valable parce que les cinq conteneurs concernes sont centres
     et a padding symetrique (verifie sur les cinq). */
  margin-inline: calc(50% - var(--demi-page, 50vw));
}
/* Fleches superposees a la rangee plutot que posees a cote. Dans le flux flex
   elles occupaient ~40px de chaque cote, que la rangee recupere maintenant.
   .scroll-row-wrap porte deja position:relative, elles s'y accrochent. */
.scroll-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  flex-shrink: 0;
  width: 32px; height: 32px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--ink);
  font-size: 14px;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  font-family: inherit;
}
.scroll-arrow:hover { background: var(--bg-panel); }
/* Elles n'avaient aucune regle -left / -right : leur place venait seulement de
   l'ordre des enfants flex. En absolu il faut la leur donner. */
.scroll-arrow-left  { left: 12px; }
.scroll-arrow-right { right: 12px; }
/* Le contenu des rangees demarre au niveau du header, pas au bord de l'ecran.
   Le padding est porte par l'element defilant, pas par .scroll-row-wrap : ainsi
   les vignettes passent sous les bords pendant le defilement (l'affordance "il
   y en a d'autres") et se recalent sur la gouttiere aux deux extremites.
   padding-inline et non padding : .category-row a un padding-bottom a preserver.
   Selecteurs descendants de .scroll-row-wrap uniquement -- ces classes servent
   aussi hors rangee bord-a-bord, ou la gouttiere n'a pas lieu d'etre. */
.scroll-row-wrap .pill-row,
.scroll-row-wrap .category-row,
.scroll-row-wrap .product-scroll-row,
.scroll-row-wrap .thumb-scroll-row,
.scroll-row-wrap .collection-scroll-row,
.scroll-row-wrap .hero-cat-grid {
  padding-inline: var(--gouttiere-page);
  /* Indispensable des qu'il y a du scroll-snap (.hero-cat-grid est en
     scroll-snap-type: x proximity) : le point d'ancrage du snap est le bord du
     scrollport, pas celui du padding. Sans ce pendant, la rangee se rembobinait
     d'elle-meme de la valeur du padding pour recaler la premiere vignette sur
     zero -- le padding etait pose, et visuellement sans effet. */
  scroll-padding-inline: var(--gouttiere-page);
}
.pill-row {
  display: flex;
  gap: 6px;
  overflow-x: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.pill-row::-webkit-scrollbar { display: none; }
.pill {
  padding: 0 13px;
  height: 30px;
  display: inline-flex;
  align-items: center;
  border-radius: 999px;
  border: 1px solid var(--border);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: .07em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  color: var(--ink-soft);
  flex-shrink: 0;
  transition: color .15s, border-color .15s, background .15s;
}
.pill:hover { color: var(--ink); border-color: var(--ink-faint); }
.pill.active { background: var(--ink); color: var(--bg); border-color: var(--ink); }

/* --------------------------------------------------------------------------
   13. Cartes produit
   --------------------------------------------------------------------------
   La vignette devient une tuile carrée : c'est le seul endroit du site où la
   couleur existe. Les pastilles superposées passent en étiquettes monospace
   capitales, sur un voile d'encre plutôt qu'un noir pur.
   -------------------------------------------------------------------------- */
.product-row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
.product-scroll-row {
  display: flex;
  flex: 1 1 0;
  min-width: 0;
  gap: 16px;
  overflow-x: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.product-scroll-row::-webkit-scrollbar { display: none; }
.product-scroll-row .product-card { flex: 0 0 340px; }

.thumb-scroll-row {
  display: flex;
  gap: 12px;
  overflow-x: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.thumb-scroll-row::-webkit-scrollbar { display: none; }
.product-thumb-card { flex: 0 0 100px; text-decoration: none; }
.product-thumb-card-img {
  position: relative;
  width: 100px; height: 100px;
  border-radius: var(--radius-tile);
  overflow: hidden;
  border: 1px solid var(--border);
  background-color: var(--card-bg);
  display: flex; align-items: center; justify-content: center;
  font-size: 40px;
}
.product-photo { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }

/* La carte est un panneau à quatre bandes : tête (nom + prix + favori),
   tuile, pied (boutique + note + commentaires), action. Le visuel n'est plus
   le fond de la carte mais une tuile posée dedans — c'est ce qui donne le
   rythme de grille du système et libère le nom du dégradé qui le portait. */
.product-card {
  display: flex;
  flex-direction: column;
  gap: 11px;
  background: var(--card-bg);
  border: 1px solid var(--card-bg);
  border-radius: var(--radius-card);
  padding: 14px;
  transition: background .18s, border-color .18s;
}
.product-card:hover { background: var(--card-hover); border-color: var(--ink-faint); }

.pcard-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.pcard-name {
  font-size: 10.5px;
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--ink-soft);
  text-decoration: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.product-card:hover .pcard-name { color: var(--ink); }
.pcard-meta { display: flex; align-items: center; gap: 9px; flex-shrink: 0; }
.pcard-price {
  font-size: 10.5px;
  letter-spacing: .03em;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.pcard-price s { color: var(--ink-soft); margin-right: 5px; }

/* Bouton favori / commentaires : icône au trait + compteur, sans fond. Les
   pastilles sombres n'ont plus lieu d'être maintenant qu'ils ne reposent
   plus sur une image. */
.pcard-icon-btn {
  display: inline-flex; align-items: center; gap: 4px;
  border: none; background: none; padding: 0;
  cursor: pointer;
  /* --ink-soft : c'est le libelle d'un controle, a 9,5px. Sur une carte,
     --ink-faint tombait a 1,79:1. */
  color: var(--ink-soft);
  font-family: inherit;
  font-size: 9.5px;
  font-variant-numeric: tabular-nums;
  transition: color .15s;
}
.pcard-icon-btn:hover { color: var(--ink); }
.pcard-icon-btn.is-liked { color: #E0566F; }

/* container-type : permet de dimensionner l'emoji en cqw, donc relativement
   à la largeur de la tuile plutôt qu'à celle de la fenêtre — une carte en
   rangée défilante et une carte en grille n'ont pas la même largeur. */
.product-card-media { display: block; text-decoration: none; color: inherit; container-type: inline-size; }
.product-thumb {
  position: relative;
  aspect-ratio: 1 / 1;
  border-radius: var(--radius-tile);
  overflow: hidden;
  display: flex; align-items: center; justify-content: center;
  background-color: var(--card-bg);
}
.product-emoji { font-size: clamp(48px, 26cqw, 84px); }
/* Repli si les container queries ne sont pas disponibles. */
@supports not (width: 1cqw) { .product-emoji { font-size: 72px; } }

/* Drapeau d'état sur la tuile — un seul à la fois, voir productCard(). */
.tile-flag {
  position: absolute;
  top: 8px; right: 8px;
  font-size: 8px;
  font-weight: 600;
  letter-spacing: .10em;
  text-transform: uppercase;
  padding: 3px 7px;
  border-radius: 4px;
  background: rgba(28, 28, 28, .82);
  color: #F2F2F2;
}
.tile-flag.is-alert { background: var(--alert); color: var(--sur-alert); }
.tile-flag.is-sale { background: var(--alert); color: var(--sur-alert); }

.pcard-foot { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pcard-shop {
  display: flex; align-items: center; gap: 7px;
  min-width: 0;
  text-decoration: none;
  color: var(--ink);
  font-size: 11px;
}
.pcard-shop:hover { text-decoration: underline; text-underline-offset: 3px; }
.pcard-shop span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pcard-avatar {
  flex-shrink: 0;
  width: 20px; height: 20px;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 10px;
  object-fit: cover;
}
.pcard-rating {
  margin-left: auto;
  flex-shrink: 0;
  font-size: 9.5px;
  color: var(--ink-soft);
  font-variant-numeric: tabular-nums;
}
.pcard-foot .pcard-icon-btn { flex-shrink: 0; }
/* Sans note, le bouton commentaires doit quand même être repoussé à droite. */
.pcard-foot > .pcard-icon-btn:nth-child(2) { margin-left: auto; }

/* Alerte de stock sur la fiche produit — la carte utilise .tile-flag, mais
   produit.php pose cette classe directement, sans conteneur d'overlay. */
.product-stock-warning {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--warn);
  margin: 8px 0 0;
}
.product-stock-warning.out { color: var(--alert); }

/* .product-pill subsiste pour la fiche produit uniquement (produit.php la
   combine avec .pdp-like-pill) ; la carte utilise désormais .pcard-icon-btn.
   Les classes d'overlay (.product-overlay-*, .product-shop-pill,
   .product-social-pills) ont été retirées avec l'ancienne structure. */
.product-pill {
  display: inline-flex; align-items: center; gap: 5px;
  border: none;
  border-radius: 999px;
  padding: 4px 9px;
  background: rgba(28, 28, 28, .78);
  color: #F2F2F2;
  font-family: inherit;
  font-size: 9.5px; font-weight: 500;
  letter-spacing: .05em;
  cursor: pointer;
  text-decoration: none;
  vertical-align: middle;
  transition: color .15s, background-color .15s;
}
.pill-icon { display: inline-flex; line-height: 0; }
.pill-icon svg { display: block; }
.pill-count { font-variant-numeric: tabular-nums; }
.product-pill.is-liked { color: #FF7A90; }

/* Sur la fiche produit, les pastilles ne reposent pas sur une photo. */
.pdp-like-pill {
  background: var(--surface);
  border: 1px solid var(--border);
  color: var(--ink-soft);
}
.pdp-like-pill.is-liked { color: #E0566F; border-color: #E0566F; }
.pdp-like-pill:hover { color: var(--ink); }
.pdp-like-pill.is-liked:hover { color: #E0566F; }

/* Étiquette d'état sur la fiche produit — posée en absolu dans .pdp-image.
   Sur les cartes, c'est .tile-flag qui joue ce rôle. */
.badge {
  position: absolute;
  top: 10px; left: 10px;
  font-size: 8.5px;
  font-weight: 600;
  letter-spacing: .10em;
  text-transform: uppercase;
  padding: 3px 7px;
  border-radius: 4px;
  background: rgba(28, 28, 28, .82);
  color: #F2F2F2;
}
.badge-new { background: rgba(28, 28, 28, .82); color: #F2F2F2; }
.badge-sale { background: var(--alert); color: var(--sur-alert); }

.review-count { color: var(--ink-soft); }
.product-price-row { font-size: 12.5px; font-weight: 500; letter-spacing: .02em; }
.price-old { font-weight: 400; color: var(--ink-soft); text-decoration: line-through; font-size: 10.5px; margin-left: 4px; }

.product-comments-panel {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 14px 16px;
  margin-top: 10px;
}
.product-comment-item { padding: 8px 0; border-bottom: 1px solid var(--border); font-size: 12px; }
.product-comment-item:last-of-type { border-bottom: none; }
.product-comment-item b { font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; }
.product-comment-item p { margin: 2px 0 0; color: var(--ink-soft); }
.product-comments-empty { font-size: 11.5px; color: var(--ink-soft); text-align: center; padding: 8px 0; }
.product-comment-form { margin-top: 8px; }
.product-comment-form input {
  width: 100%;
  padding: 10px 14px;
  border-radius: var(--radius-ctl);
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--ink);
  font-family: inherit;
  font-size: 12px;
}

/* --------------------------------------------------------------------------
   14. Boutons
   -------------------------------------------------------------------------- */
.btn-buy {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  width: 100%;
  padding: 11px 18px;
  border-radius: 999px;
  border: none;
  background: var(--ink);
  color: var(--bg);
  font-family: inherit;
  font-weight: 600;
  font-size: 10.5px;
  letter-spacing: .09em;
  text-transform: uppercase;
  text-decoration: none;
  cursor: pointer;
  transition: opacity .15s, transform .1s;
}
.btn-buy:hover { opacity: .85; }
.btn-buy:active { transform: scale(.97); }
.btn-buy:disabled { opacity: .4; cursor: not-allowed; }
.btn-buy .price-old { color: inherit; opacity: .7; }

/* Action secondaire de fin de parcours — « Continuer mes achats », « Retour a
   l'accueil », « Decouvrir ». La classe existait dans le HTML de quatre pages
   mais n'avait aucune regle CSS, ni avant ni apres la refonte : ces liens
   s'affichaient en texte brut. */
.btn-hero {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 11px 22px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--ink);
  font-family: inherit;
  font-weight: 600;
  font-size: 10.5px;
  letter-spacing: .09em;
  text-transform: uppercase;
  text-decoration: none;
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
.btn-hero:hover { border-color: var(--ink-faint); background: var(--bg-panel); }

.btn-follow {
  padding: 8px 18px;
  border-radius: 999px;
  border: 1px solid var(--ink);
  background: transparent;
  color: var(--ink);
  font-family: inherit;
  font-weight: 600;
  font-size: 10.5px;
  letter-spacing: .08em;
  text-transform: uppercase;
  cursor: pointer;
  text-decoration: none;
  display: inline-block;
  transition: opacity .15s, transform .1s;
}
.btn-follow:hover { opacity: .85; }
.btn-follow:active { transform: scale(.97); }
.btn-follow.active { background: var(--ink); color: var(--bg); }

/* --------------------------------------------------------------------------
   15. Connexion, carte info, tarifs
   -------------------------------------------------------------------------- */
.login-page {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 32px;
  background: transparent;
}
.login-card {
  width: 400px;
  max-width: 100%;
  /* Panneau, pas fond de page : la carte est posée à plat sur la trame de
     points, elle doit donc s'en détacher par sa surface et pas seulement par
     sa bordure (contrairement aux menus flottants, qui ont une ombre). */
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 44px 36px;
  text-align: center;
  box-shadow: 0 4px 24px var(--shadow);
}
.login-logo { justify-content: center; margin-bottom: 26px; }
.login-logo .brand-ring { width: 16px; height: 16px; border-radius: 3px; }
.login-logo .brand-wordmark { font-size: 15px; }
.login-title { font-size: 26px; margin-bottom: 10px; }
.login-sub { font-size: 12px; color: var(--ink-soft); margin-bottom: 30px; line-height: 1.7; }
.login-error { color: var(--alert); font-size: 11px; letter-spacing: .05em; margin-bottom: 16px; }
.login-btn { margin-top: 4px; }

/* Page du verrou de developpement (includes/dev-gate-page.php). Elle reprend
   .login-page / .login-card / .login-title / .login-sub telles quelles : c'est
   le meme moment du parcours, elle doit se lire comme la meme famille. Seuls
   l'etiquette d'ouverture et le bloc de compte lui sont propres. */
/* Pas de couleur ici : .u-label donne deja --ink-soft, et l'ecraser en
   --ink-faint tombait a ~3:1 sur la carte, sous le seuil AA. On ne pose que le
   display (l'etiquette doit occuper sa ligne) et l'ecart au titre. */
.gate-eyebrow { display: block; margin-bottom: 16px; }
.gate-account {
  margin-top: 30px;
  padding-top: 22px;
  border-top: 1px solid var(--border);
}
/* --ink-soft et non --ink-faint : le visiteur doit pouvoir lire l'adresse avec
   laquelle il est connecte, c'est l'information qui lui dit quoi faire. */
.gate-account-line { margin: 0 0 14px; font-size: 11px; color: var(--ink-soft); }

.info-card {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 20px;
}

.pricing-card {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 32px;
  text-align: center;
}
.pricing-name { margin-bottom: 10px; }
.pricing-price { font-size: 46px; line-height: 1; }
.pricing-period { font-family: inherit; font-size: 12px; font-weight: 400; color: var(--ink-soft); letter-spacing: .05em; }
.pricing-billed { font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-soft); margin: 10px 0 24px; }
.pricing-features { list-style: none; padding: 0; margin: 0 0 24px; text-align: left; display: flex; flex-direction: column; gap: 12px; }
.pricing-features li { font-size: 12px; padding-left: 24px; position: relative; line-height: 1.6; }
.pricing-features li::before { content: '+'; position: absolute; left: 0; color: var(--ink); font-weight: 600; }
.pricing-note { font-size: 11px; color: var(--ink-soft); margin-top: 14px; line-height: 1.6; }

.become-creator-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}
.become-creator-item {
  text-align: left;
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 20px;
}
.become-creator-icon { font-size: 28px; margin-bottom: 12px; }
.become-creator-title { font-size: 10.5px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; margin-bottom: 8px; }
.become-creator-item p { font-size: 12px; color: var(--ink-soft); line-height: 1.7; margin: 0; }

@media (max-width: 640px) {
  .become-creator-grid { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------------------
   16. Blog
   -------------------------------------------------------------------------- */
.blog-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 20px;
}
.blog-card { text-decoration: none; color: var(--ink); }
.blog-card-cover {
  height: 180px;
  border-radius: var(--radius-card);
  display: flex; align-items: center; justify-content: center;
  font-size: 60px;
  margin-bottom: 14px;
}
.blog-card-date { font-size: 10px; letter-spacing: .07em; text-transform: uppercase; color: var(--ink-soft); margin-bottom: 6px; }
.blog-card-title { font-family: 'Bodoni Moda', Didot, Georgia, serif; font-weight: 400; font-size: 20px; margin-bottom: 8px; line-height: 1.15; }
.blog-card-excerpt { font-size: 12px; color: var(--ink-soft); line-height: 1.65; max-width: 62ch; }

.article-cover {
  height: 280px;
  border-radius: var(--radius-card);
  display: flex; align-items: center; justify-content: center;
  font-size: 96px;
  margin: 20px 0 24px;
}
.article-date { font-size: 10.5px; letter-spacing: .07em; text-transform: uppercase; color: var(--ink-soft); margin-bottom: 10px; }
.article-title { font-size: clamp(30px, 4vw, 42px); margin: 0 0 24px; line-height: 1.1; }
.article-body p { color: var(--ink); font-size: 13px; line-height: 1.9; margin-bottom: 20px; max-width: 66ch; }

/* --------------------------------------------------------------------------
   17. Créateurs
   -------------------------------------------------------------------------- */
.creator-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 16px;
}
.creator-item {
  text-decoration: none;
  text-align: left;
  background: var(--card-bg);
  border: 1px solid var(--card-bg);
  border-radius: var(--radius-card);
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  transition: background .18s, border-color .18s;
}
.creator-item:hover { background: var(--card-hover); border-color: var(--ink-faint); }

/* Reseaux sociaux d'une boutique. Etiquettes monospace capitales plutot que
   des logos de marque : le systeme est en niveaux de gris et n'admet ni emoji
   ni glyphe de marque dans le chrome. flex-wrap parce que six reseaux ne
   tiennent pas sur une ligne etroite. */
.creator-socials {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 16px;
  margin-top: 14px;
}
.creator-social {
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ink-soft);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.creator-social:hover { color: var(--ink); }

/* Aide sous un libelle de formulaire, et champs sociaux empiles. */
.form-aide { margin: 4px 0 10px; font-size: 11.5px; color: var(--ink-soft); line-height: 1.6; }
.form-social { margin-bottom: 8px; }
.form-social:last-of-type { margin-bottom: 0; }
.creator-avatar {
  width: 40px; height: 40px;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 19px;
  margin: 0;
}
.creator-name { font-size: 11px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; margin-bottom: 0; }
.creator-bio { font-size: 11.5px; color: var(--ink-soft); line-height: 1.6; }

.badge-halo {
  display: inline-block;
  font-family: inherit;
  font-size: 8.5px; font-weight: 600;
  letter-spacing: .10em; text-transform: uppercase;
  background: var(--ink); color: var(--bg);
  padding: 3px 8px; border-radius: 4px;
  vertical-align: middle; margin-left: 8px;
}

/* Statut d'expédition — seules pastilles colorées du site, parce qu'elles
   portent une information d'état que le gris ne transmettrait pas. */
.status-pill {
  display: inline-block;
  font-size: 8.5px; font-weight: 600;
  letter-spacing: .10em; text-transform: uppercase;
  padding: 3px 8px; border-radius: 4px;
  vertical-align: middle;
}
.status-pill-pending   { background: var(--blue-bg); color: var(--ink-soft); }
.status-pill-shipped   { background: var(--warn-bg); color: var(--warn); }
.status-pill-delivered { background: var(--green-bg); color: var(--green); }

/* Boutique créateur */
.creator-banner {
  position: relative;
  padding: 64px 32px;
  overflow: hidden;
  /* Couleur fixe : le bandeau garde toujours la pastel du créateur, quel que
     soit le thème — un texte qui suivrait le thème deviendrait illisible. */
  color: #1C1C1C;
}
.creator-banner-emoji {
  position: absolute;
  top: 50%; right: 6%;
  transform: translateY(-50%);
  font-size: 220px;
  opacity: .22;
  line-height: 1;
  pointer-events: none;
}
.creator-banner-inner { position: relative; max-width: 640px; }
.creator-banner-eyebrow { font-size: 10px; letter-spacing: .10em; text-transform: uppercase; font-weight: 600; opacity: .7; margin-bottom: 12px; }
.creator-banner-title { font-size: clamp(30px, 4.4vw, 46px); line-height: 1.05; margin: 0; }
/* Accroche du bandeau : couleur fixe comme le reste du bloc, qui repose
   toujours sur la pastel de la boutique quel que soit le thème. */
.creator-banner-deck {
  margin: 12px 0 0;
  font-size: 12.5px;
  line-height: 1.7;
  max-width: 54ch;
  opacity: .82;
}
.creator-banner.has-image .creator-banner-inner {
  background: rgba(255, 255, 255, .9);
  padding: 24px 28px;
  border-radius: var(--radius-card);
  display: inline-block;
  max-width: min(640px, 100%);
}
.creator-banner-about-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: 18px;
  padding: 9px 20px;
  border-radius: 999px;
  border: 1px solid currentColor;
  background: transparent;
  color: inherit;
  font-family: inherit;
  font-weight: 600;
  font-size: 10px;
  letter-spacing: .08em;
  text-transform: uppercase;
  text-decoration: none;
}
.creator-banner-about-btn:hover { background: rgba(28, 28, 28, .08); }

.creator-subnav {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 14px 32px;
  border-bottom: 1px solid var(--border);
  flex-wrap: wrap;
}
.creator-subnav-brand { display: flex; align-items: center; gap: 10px; }
.creator-subnav-name { font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; }
.creator-subnav-followers { font-size: 10.5px; letter-spacing: .05em; color: var(--ink-soft); }
.creator-subnav-stats { font-size: 10.5px; letter-spacing: .05em; color: var(--ink-soft); white-space: nowrap; }
.creator-subnav-stats b { color: var(--ink); font-weight: 600; }
.creator-subnav-share {
  width: 32px; height: 32px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--ink);
  cursor: pointer;
  font-size: 13px;
  font-family: inherit;
}
.creator-subnav-share:hover { background: var(--bg-panel); }
.creator-subnav-nav { display: flex; align-items: center; gap: 18px; margin-left: auto; flex-wrap: wrap; }
.creator-subnav-nav a { text-decoration: none; color: var(--ink-soft); font-size: 10.5px; font-weight: 500; letter-spacing: .07em; text-transform: uppercase; white-space: nowrap; }
.creator-subnav-nav a:hover { color: var(--ink); }

.creator-about { max-width: 720px; margin: 0 auto; }
.creator-about-header { text-align: center; margin-bottom: 40px; }
.creator-about-eyebrow { margin: 16px 0 8px; }
.creator-about-title { font-size: 32px; margin: 0; }
.creator-about-tagline { font-size: 13px; color: var(--ink-soft); margin: 12px auto 0; max-width: 52ch; line-height: 1.7; }
.creator-about-body { font-size: 13px; line-height: 1.9; color: var(--ink); white-space: pre-line; max-width: 66ch; margin: 0 auto; }

.creator-about-section { margin-top: 56px; }
.creator-about-section-title { font-size: 24px; text-align: center; margin: 0 0 24px; }
.creator-about-highlights { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; }
.creator-about-highlight-card { background: var(--card-bg); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 20px; }
.creator-about-highlight-title { font-size: 10.5px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; margin-bottom: 8px; }
.creator-about-highlight-card p { color: var(--ink-soft); font-size: 12px; line-height: 1.7; margin: 0; }
.creator-about-values { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.creator-about-values li { padding-left: 24px; position: relative; font-size: 12.5px; line-height: 1.7; color: var(--ink); }
.creator-about-values li::before { content: "+"; position: absolute; left: 0; top: 0; color: var(--ink); font-weight: 600; }

@media (max-width: 640px) {
  .creator-banner { padding: 44px 20px; }
  .creator-banner-emoji { font-size: 140px; opacity: .18; }
  .creator-subnav { padding: 12px 20px; }
  .creator-subnav-nav { margin-left: 0; gap: 14px; }
}

/* --------------------------------------------------------------------------
   18. Pied de page
   -------------------------------------------------------------------------- */
.site-footer {
  padding: 36px var(--gouttiere-page) 28px;
  border-top: 1px solid var(--border);
}
.site-footer-grid {
  /* CHOIX DÉLIBÉRÉ, confirmé le 2026-08-25 : le pied de page reste réduit à
     sa seule barre du bas. Ce n'est pas un masquage temporaire ni un oubli —
     ne pas « rétablir » cette grille. Le balisage et les styles restent en
     place au cas où la décision changerait ; il suffirait alors de retirer
     ce display:none. */
  display: none;
  grid-template-columns: 1.4fr 1fr 1fr 1.4fr;
  gap: 32px;
  max-width: 1360px;
  margin: 0 auto 28px;
  /* Le filet séparateur appartient à la grille, pas à la barre du bas : ainsi
     il disparaît avec elle. Auparavant .site-footer et .site-footer-bottom
     posaient chacun un border-top, ce qui dessinait deux traits séparés par
     du vide dès lors que cette grille était masquée. */
  padding-bottom: 28px;
  border-bottom: 1px solid var(--border);
}
.site-footer-brand .site-footer-tagline {
  margin: 12px 0 0;
  font-size: 11.5px;
  line-height: 1.7;
  color: var(--ink-soft);
  max-width: 240px;
}
.site-footer-col { display: flex; flex-direction: column; gap: 10px; font-size: 11.5px; }
.site-footer-col-title { font-size: 10px; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; margin-bottom: 4px; }
.site-footer-col a { text-decoration: none; color: var(--ink-soft); }
.site-footer-col a:hover { color: var(--ink); }
.site-footer-newsletter p { margin: 0; font-size: 11.5px; color: var(--ink-soft); line-height: 1.7; }
.site-footer-newsletter-form { display: flex; gap: 8px; margin-top: 4px; }
.site-footer-newsletter-form input {
  flex: 1;
  min-width: 0;
  padding: 10px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-ctl);
  background: var(--surface);
  color: var(--ink);
  font-family: inherit;
  font-size: 11.5px;
  outline: none;
}
.site-footer-newsletter-form button {
  padding: 10px 18px;
  border-radius: 999px;
  border: none;
  background: var(--ink);
  color: var(--bg);
  font-family: inherit;
  font-weight: 600;
  font-size: 10px;
  letter-spacing: .08em;
  text-transform: uppercase;
  cursor: pointer;
  white-space: nowrap;
}
.site-footer-newsletter-status { font-size: 11px; margin-top: 4px; color: var(--ink-soft); }
/* Barre du bas : carré de marque, mention de copyright, liens légaux poussés
   à droite, sélecteur d'apparence en bout de ligne. Pas de border-top ici —
   il vit sur .site-footer-grid (voir plus haut). */
.site-footer-bottom {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 14px;
  max-width: 1360px;
  margin: 0 auto;
}
.site-footer-bottom .brand-ring { width: 14px; height: 14px; }
.site-footer-copy { font-size: 10px; font-variant-numeric: tabular-nums; }
/* Deux groupes de liens sur la meme ligne, meme allure. Ils sont separes
   parce qu'ils ne disent pas la meme chose : .site-footer-links mene au
   contenu du site, .site-footer-legal aux mentions obligatoires -- et
   c'est cette derniere que margin-left:auto pousse a droite. */
.site-footer-links,
.site-footer-legal { display: flex; gap: 18px; font-size: 10px; letter-spacing: .07em; text-transform: uppercase; }
.site-footer-legal { margin-left: auto; }
.site-footer-links a,
.site-footer-legal a { text-decoration: none; color: var(--ink-soft); }
.site-footer-links a:hover,
.site-footer-legal a:hover { color: var(--ink); text-decoration: underline; text-underline-offset: 3px; }
/* Le sélecteur d'apparence ferme la ligne, détaché des liens légaux avec
   lesquels il n'a rien à voir. */
.site-footer-bottom #themeToggle { flex-shrink: 0; }

@media (max-width: 900px) {
  .site-footer-grid { grid-template-columns: 1fr 1fr; }
  .site-footer-brand, .site-footer-newsletter { grid-column: span 2; }
}
@media (max-width: 600px) {
  .site-footer-grid { grid-template-columns: 1fr; }
  .site-footer-brand, .site-footer-newsletter { grid-column: span 1; }
  .site-footer-bottom { justify-content: center; text-align: center; }
  .site-footer-legal { margin-left: 0; }
}

/* --------------------------------------------------------------------------
   19. Adaptations mobiles
   -------------------------------------------------------------------------- */
@media (max-width: 900px) {
  .topbar-nav { display: none; }

  /* Le logo/nav/icônes passent en bas (fixe) — seule la recherche reste en
     haut, la topbar passe donc à une colonne. */
  .topbar-left { display: none; }
  .topbar > .topbar-icons { display: none; }
  .topbar { grid-template-columns: 1fr; }
  .search-wrap { width: 100%; max-width: none; min-width: 0; }

  .mobile-bottom-header {
    display: block;
    position: fixed;
    left: 0; right: 0; bottom: 0;
    background: var(--bg);
    border-top: 1px solid var(--border);
    z-index: 30;
  }
  .mobile-bottom-row .brand-wordmark { display: none; }
  /* Hauteur de la barre fixe (57px depuis qu'elle respire) plus le meme
     degagement qu'avant, pour que le pied de page ne passe pas dessous. */
  body { padding-bottom: calc(104px + env(safe-area-inset-bottom, 0px)); }

  .section { padding: 32px 20px; }
  .hero { padding: 20px; }
  .product-row { grid-template-columns: repeat(2, 1fr); gap: 12px; }
  .product-scroll-row .product-card { flex: 0 0 300px; }
  .become-creator-grid { grid-template-columns: repeat(2, 1fr); }
  .category-row {
    flex-wrap: nowrap;
    justify-content: flex-start;
    overflow-x: auto;
    scrollbar-width: none;
    -ms-overflow-style: none;
  }
  .category-row::-webkit-scrollbar { display: none; }
  .category-item { width: 92px; }
  .category-icon { width: 72px; height: 72px; font-size: 30px; }
  .hero .scroll-arrow { display: none !important; }
  .hero-cat-card { flex: 0 0 86%; min-width: 0; }
  .creator-subnav { padding: 12px 20px; }
  /* Seules les hauteurs sont propres a ce palier : la gouttiere horizontale
     suit le header via le jeton (32px jusqu'a 640px, 16px en dessous).
     Elle valait 20px ici, une troisieme valeur qui n'existait nulle part
     ailleurs et decalait le pied de page du reste. */
  .site-footer { padding: 32px var(--gouttiere-page) 24px; }
}

@media (max-width: 640px) {
  /* Le header se resserre en mobile : le jeton suit, et les rangees avec lui. */
  :root { --gouttiere-page: 16px; }
  .topbar { padding: 12px var(--gouttiere-page); gap: 12px; }
  /* LE BUDGET DE LA BARRE BASSE, mesure a 375px le 2026-09-21.
     Elle porte un logo, deux entrees de menu, FR/EN et trois icones, et la
     somme depassait la largeur de l'ecran : « Createurs » etait coupe.
     Blog est parti dans le pied de page (decision du 2026-09-21), ce qui a
     ramene le manque de 72 a 29px. Les 29 restants sont pris ici, en air
     plutot qu'en contenu -- ecarts et interlettrage -- pour ne rien retirer
     d'autre.
     FR/EN passe de 77 a 55px : il occupait a lui seul plus que les trois
     icones reunies. Seule sa largeur bouge, la hauteur de la cible tactile
     est inchangee.
     Resultat : le menu tient entier a partir d'environ 355px. */
  .mobile-bottom-row { gap: 10px; }
  .mobile-bottom-row .topbar-nav-mobile { gap: 10px; letter-spacing: .03em; }
  .mobile-bottom-row .topbar-icons { gap: 6px; }
  .mobile-bottom-row .lang-toggle-opt { padding: 5px 5px; letter-spacing: .04em; }
  .icon-plain { width: 28px; height: 28px; font-size: 13px; }
  .search-inline { padding: 5px 10px 5px 4px; gap: 6px; }
  .search-inline input { font-size: 12px; }
  .search-cat-btn { max-width: 84px; padding: 7px 4px 7px 8px; font-size: 9.5px; }
  .product-row { grid-template-columns: 1fr; }
  .product-scroll-row .product-card { flex: 0 0 78%; }
  .product-thumb { min-height: 260px; }
  .product-emoji { font-size: 64px; }
  .cat-toolbar { flex-direction: column; align-items: stretch; gap: 12px; }
  /* C'est desormais l'enveloppe .es-select qui est l'element flex de la
     rangee ; le <select> natif, en position absolue, ne la dimensionne plus. */
  .cat-toolbar-filters .es-select,
  .cat-toolbar-filters > select { flex: 1; min-width: 130px; }
  /* .pdp-emoji n'a plus de surcharge ici : sa taille suit désormais la
     largeur de .pdp-image en cqw, donc elle s'adapte déjà toute seule. */
  .creator-about-body, .article-body p { font-size: 12.5px; }
}

/* Sous 380px -- les Android les plus etroits -- l'air ne suffit plus pour la
   barre basse : les libelles passent de 11 a 10px. C'est le dernier reglage
   possible sans retirer un element. En dessous d'environ 355px il faudrait
   en retirer un : c'est un arbitrage de contenu, pas un reglage.

   Ce bloc est en FIN DE FICHIER a dessein. Insere au milieu du palier
   640px, il coupait ce palier en deux et faisait basculer tout ce qui
   suivait -- .product-row, .cat-toolbar et le reste -- sous 380px. */
@media (max-width: 380px) {
  .mobile-bottom-row .topbar-nav-mobile > * { font-size: 10px; }
  /* Les derniers pixels : 4 manquaient encore a 360px, largeur Android la
     plus repandue. Ils sont pris sur les ecarts, jamais sur la gouttiere de
     22px -- c'est elle qui sort les icones des coins arrondis, et la rendre
     ramenerait le defaut qu'on vient de corriger. */
  .mobile-bottom-row { gap: 8px; }
  .mobile-bottom-row .topbar-icons { gap: 4px; }
}
