/* ============================================================
   LE CUBE À COMICS — DESIGN SYSTEM v1 · tokens (version de prod, child theme)
   Direction : « La Loupe du Collectionneur » (gate 1 du 07/07/2026)
   - Musée-maison de ventes ouvert la nuit : les couvertures sont des
     pièces exposées sous spot, l'expertise (grading, cotes, rareté)
     fait foi, l'achat est l'adjudication.
   - LOI DES 2 COULEURS : BLEU = je choisis · OR = j'achète.
     Aucun composant ne la contourne (le focus est bleu : c'est une
     sélection ; le hover du CTA approfondit l'or, il ne bascule
     jamais côté bleu — correctif gate 1).

   ARCHITECTURE (méthode de build, étape 4) :
   - COUCHE 1 : les valeurs (hex, familles) vivent dans theme.json —
     UNE SEULE définition. Ici, un pont mappe les presets WordPress
     (--wp--preset--*) sur les alias maison (--brand-*, --font-*) :
     le CSS du registre (design-system/components/) se transporte
     sans réécriture.
   - COUCHES 2-3 : signature, rôles, utilitaires, typo, formes,
     mouvement, contexte nuit — identiques au design system éprouvé
     (design-system/tokens.css de l'atelier, référence de conception).
   - Parent-agnostique : aucune variable ni hook Kadence
     (pas de --global-palette*, pas de classes Kadence).
   - Polices auto-hébergées : @font-face générés par WordPress depuis
     theme.json (fontFace), woff2 servis par le child.
   ============================================================ */

/* ============================================================
   REPLIS À MÉTRIQUES ALIGNÉES — correctif F42 (recette É5, S5 du 07/08/2026)

   LE DÉFAUT, mesuré : CLS du panier à 0,101 sur staging pour un seuil à
   0,100, dont 99,6 % attribués par Lighthouse à « Web font loaded ». Les
   polices sont préchargées et auto-hébergées, mais `font-display: swap`
   peint d'abord le texte avec la police système, puis rebascule : les deux
   n'occupent pas la même place, et tout ce qui suit se déplace. Reproduit
   au banc local (preuves/recette-s5-cls.mjs, polices retardées) : le
   paragraphe `.pan-livr-txt` du bordereau change de hauteur et pousse le
   bouton Commander, le code promo et le pied de page de ~21 px.

   LE CORRECTIF : on ne change ni la police, ni `swap`, ni le préchargement.
   On donne au REPLI les métriques de la police web, pour qu'il occupe
   exactement la même place — la bascule ne déplace alors plus rien.

   LES CHIFFRES viennent d'une mesure, pas d'une table :
   `node preuves/recette-s5-metriques-polices.mjs` charge chaque woff2 du
   child dans un vrai navigateur et relève au Canvas (TextMetrics) la chasse
   et les boîtes ascendante/descendante, sur un échantillon de texte
   réellement rendu par le site. Rejouable ; toute mise à jour de police
   impose de le rejouer et de reporter les valeurs ici.

   PORTÉE HONNÊTE : les surcharges sont exactes pour la police locale nommée
   par `src: local(...)`. Là où le système ne la fournit pas (Android n'a pas
   Arial et l'alias résout vers Roboto), le repli reste approché : le
   reflux est réduit, pas annulé.
   ============================================================ */

@font-face {
  font-family: "Bebas Neue repli";
  src: local("Arial");
  size-adjust: 71.29%;
  ascent-override: 133.26%;
  descent-override: 49.09%;
  line-gap-override: 0%;
}

@font-face {
  font-family: "Inter repli";
  src: local("Arial");
  size-adjust: 105.15%;
  ascent-override: 92.25%;
  descent-override: 22.83%;
  line-gap-override: 0%;
}

@font-face {
  font-family: "IBM Plex Mono repli";
  src: local("Courier New");
  size-adjust: 99.98%;
  ascent-override: 103.02%;
  descent-override: 28%;
  line-gap-override: 0%;
}

:root {

  /* ------------------------------------------------------------
     COUCHE 1 — PONT presets theme.json → alias maison
     (source des valeurs : theme.json, ne rien redéfinir ici)
     ------------------------------------------------------------ */

  /* La nuit du musée — l'écrin des temps forts ; jamais de noir pur */
  --brand-midnight:   var(--wp--preset--color--brand-midnight);
  --brand-night:      var(--wp--preset--color--brand-night);
  --brand-vault:      var(--wp--preset--color--brand-vault);

  /* La lueur — les textes sur nuit */
  --brand-glow:       var(--wp--preset--color--brand-glow);
  --brand-dusk:       var(--wp--preset--color--brand-dusk);

  /* Le bleu Cube — la sélection, l'interaction (couleur du logo) */
  --brand-cube:       var(--wp--preset--color--brand-cube);
  --brand-cube-light: var(--wp--preset--color--brand-cube-light);
  --brand-cube-deep:  var(--wp--preset--color--brand-cube-deep);

  /* L'or champagne — l'achat, la cote */
  --brand-gold:       var(--wp--preset--color--brand-gold);
  --brand-gold-deep:  var(--wp--preset--color--brand-gold-deep);
  --brand-gold-ink:   var(--wp--preset--color--brand-gold-ink);
  --brand-gold-soft:  var(--wp--preset--color--brand-gold-soft);

  /* Le papier — le corps de page clair, là où vit le catalogue */
  --brand-paper:      var(--wp--preset--color--brand-paper);
  --brand-page:       var(--wp--preset--color--brand-page);
  --brand-ink:        var(--wp--preset--color--brand-ink);
  --brand-ink-soft:   var(--wp--preset--color--brand-ink-soft);
  --brand-line:       var(--wp--preset--color--brand-line);

  /* L'alerte — un seul rouge */
  --brand-alert:       var(--wp--preset--color--brand-alert);
  --brand-alert-light: var(--wp--preset--color--brand-alert-light);

  /* Extensions passe d'absorption (gate 08/07/2026) */
  --brand-gold-line:  var(--wp--preset--color--brand-gold-line);
  --brand-grade-mid:  var(--wp--preset--color--brand-grade-mid);
  --brand-grade-high: var(--wp--preset--color--brand-grade-high);

  /* Typo : familles servies par theme.json */
  --font-display: var(--wp--preset--font-family--display);
  --font-body:    var(--wp--preset--font-family--body);
  --font-data:    var(--wp--preset--font-family--data);

  /* ------------------------------------------------------------
     SIGNATURE — la vitrine de minuit
     L'audace est dépensée ICI (les temps forts sur nuit), nulle part
     ailleurs : le catalogue vit en clair, la nuit est un écrin, pas
     un fond d'écran. Le hero est une salle d'exposition : fond radial
     de nuit (showcase), spot doré discret (spotlight), l'objet porte
     l'ombre de scène (--shadow-showcase). La loupe (zoom circulaire,
     geste du grader) est LE composant signature.
     (Les hex et rgba littéraux sont des étapes de dégradé : la valeur
     brute vit DANS le token, pacte de la signature.)
     ------------------------------------------------------------ */
  --brand-showcase: radial-gradient(120% 90% at 72% 18%,
      #0c2f74 0%,                        /* cœur de lumière — n'existe que dans ce dégradé */
      var(--brand-vault) 38%,
      var(--brand-midnight) 100%);
  --brand-spotlight: radial-gradient(40% 50% at 30% 40%,
      rgba(243, 201, 105, .16), transparent 70%);   /* le spot du musée, posé SUR showcase */
  /* filet doré : la tranche dorée des séparations (bords de bande, tête de section) */
  --brand-giltline: linear-gradient(90deg,
      transparent, rgba(217, 159, 46, .45) 50%, transparent);
  /* papier jauni des back-issues : bande newsletter, encarts chauds */
  --brand-newsprint: linear-gradient(120deg, #fdf7e7 0%, #f6ecca 55%, #efe1b2 100%);
  /* bande nuit courte (CGC, encarts sombres hors hero) */
  --brand-band-night: linear-gradient(100deg, var(--brand-midnight), var(--brand-vault));

  /* ------------------------------------------------------------
     SIGNATURE — extensions passe d'absorption (gate 08/07/2026)
     ------------------------------------------------------------ */

  /* rampe sémantique de grading : état de conservation rouge→or→vert.
     SÉMANTIQUE MÉTIER, hors loi des 2 couleurs (condition, pas
     interaction). grade-mid/high : fonds et graduations UNIQUEMENT,
     jamais en texte (contrastes insuffisants). */
  --scale-grade: linear-gradient(90deg,
      var(--brand-alert) 0%, var(--brand-gold-deep) 38%,
      var(--brand-grade-mid) 62%, var(--brand-grade-high) 100%);

  /* signature home : le triple radial du hero (spot or + lueur bleue + nuit) */
  --brand-showcase-home:
      radial-gradient(1100px 680px at 16% 6%, rgba(243, 201, 105, .15), transparent 55%),
      radial-gradient(900px 620px at 86% 92%, rgba(14, 105, 255, .20), transparent 60%),
      radial-gradient(150% 130% at 50% 0%, var(--brand-vault) 0%, var(--brand-midnight) 72%);

  /* fond complet du footer (radial or + descente vers l'abîme #020b22) */
  --brand-footer-night:
      radial-gradient(900px 500px at 85% 0%, rgba(243, 201, 105, .08), transparent 60%),
      linear-gradient(180deg, var(--brand-vault) 0%, var(--brand-midnight) 58%, #020b22 100%);

  /* voile de lisibilité du header transparent (état top) */
  --brand-head-scrim: linear-gradient(180deg, rgba(3, 16, 47, .6) 0%, rgba(3, 16, 47, 0) 100%);

  /* spot or des panneaux nuit (dédoublonne .fb-dark::before et .ch-feat-panel::before) */
  --brand-night-spot: radial-gradient(42% 75% at 84% 12%, rgba(243, 201, 105, .14), transparent 70%);

  /* radial du sceau or (cœur de lumière #fbe6a8 — la valeur vit ici) */
  --brand-gold-burst: radial-gradient(circle at 50% 38%, #fbe6a8, var(--brand-gold) 60%, var(--brand-gold-deep));

  /* ------------------------------------------------------------
     COUCHE 2 — TOKENS SÉMANTIQUES (les rôles, remappables par contexte)
     Noms standard Progweb. Extensions e-commerce marquées [e-comm] :
     proposées au standard à l'occasion de ce 1er run e-commerce.
     ------------------------------------------------------------ */
  --surface-page:     var(--brand-page);
  --surface-warm:     #fdf7e7;              /* chaud newsprint uni (le dégradé = signature) */
  --surface-raised:   var(--brand-paper);
  --surface-inverse:  var(--brand-vault);
  --surface-night:    var(--brand-midnight);
  --surface-night-raised: rgba(238, 243, 255, .05);  /* panneau posé sur nuit (chips) */
  --border-night:         rgba(238, 243, 255, .16);

  --text-strong:      var(--brand-ink);
  --text-body:        var(--brand-ink);
  --text-soft:        var(--brand-ink-soft);
  --text-inverse:         var(--brand-glow);
  --text-inverse-strong:  #ffffff;          /* display sur nuit : titres, prix [e-comm nuit] */
  --text-inverse-soft:    var(--brand-dusk);

  --accent:           var(--brand-cube);
  --accent-strong:    var(--brand-cube-deep);
  --accent-alt:       var(--brand-gold);
  --link:             var(--brand-cube-deep);

  /* Encre du SURTITRE sur fond clair (recette É5, F33 — 06/08/2026).
     Le bleu Cube pur (#0e69ff) sur le fond de page (#f8f9fe) donne
     4,45:1 : sous les 4,5:1 exigés par l'AA pour du 12 px gras, seule
     violation de contraste du site. Jeton DÉDIÉ, et non un glissement
     de --accent : le bleu Cube porte aussi les icônes, les filets et
     les états de sélection, où il est juste. Le surtitre passe donc au
     bleu profond du DS (#0b54cc, déjà l'encre de --link : aucune
     couleur neuve n'entre à la palette) → 6,33:1 sur le fond de page,
     6,66:1 sur le papier blanc. Les contextes sombres gardent leurs
     surcharges explicites (cube-light), ils ne consomment pas ce jeton. */
  --eyebrow-ink:      var(--brand-cube-deep);

  --border-soft:      var(--brand-line);
  --border-strong:    var(--brand-ink-soft);

  /* Le CTA est LE geste du site (l'ajout au panier) : il ne change
     JAMAIS de couleur, quel que soit le contexte de page. Hover = or
     profond (le bleu au hover de la V2 était une faute de système). */
  --cta-bg:           var(--brand-gold);
  --cta-bg-hover:     var(--brand-gold-deep);
  --cta-text:         var(--brand-night);

  /* Le focus est une sélection → il est BLEU (loi des 2 couleurs).
     Visible sur clair, sur nuit, et sur l'or du CTA. */
  --focus-ring:       0 0 0 3px rgba(14, 105, 255, .55);

  /* Voix documentaire : grades (9.8, FN/VF), années, cotes, refs
     catalogue — en mono, jamais du texte courant */
  --data-ink:         var(--brand-ink-soft);
  --data-accent:      var(--brand-gold-ink);

  /* [e-comm] le prix est un objet de premier rang */
  --price-ink:        var(--brand-cube-deep);   /* prix sur clair (V2) ; blanc en contexte nuit */
  --stock-in:         var(--brand-gold-ink);    /* disponibilité sur clair ; or en contexte nuit */
  --state-alert:      var(--brand-alert);       /* épuisé, erreur, suppression */

  /* ------------------------------------------------------------
     COUCHE 2 — UTILITAIRES (passe d'absorption, gate 08/07/2026)
     Voiles, scrims, bordures translucides, ombres/halos, icônes :
     les primitives réutilisées par le chrome et les temps forts.
     Noms standard Progweb (proposés au standard à l'occasion du run).
     ------------------------------------------------------------ */

  /* voiles & scrims */
  --veil-night:       rgba(3, 16, 47, .8);      /* panneaux translucides sur photo : frise, pin, real-tag, figcap */
  --veil-night-solid: rgba(3, 16, 47, .97);     /* barres quasi opaques : sticky PDP */
  --scrim-modal:      rgba(2, 8, 20, .94);      /* fond de lightbox */
  --veil-accent-alt:  rgba(243, 201, 105, .15); /* fonds or translucides : pastilles d'étapes */
  --veil-accent:      rgba(14, 105, 255, .08);  /* fonds bleus translucides : icônes trust, hovers sur clair */
  --veil-accent-night: rgba(122, 191, 255, .15); /* hovers sur nuit : icônes header, social footer */

  /* bordures translucides */
  --border-night-strong: rgba(238, 243, 255, .28); /* input hero (le cran au-dessus de --border-night) */
  --border-accent-night: rgba(122, 191, 255, .18); /* filets bleutés du chrome nuit : footer, menu mobile */
  --border-accent-alt:   rgba(243, 201, 105, .4);  /* bordures or translucides : frise, sceau pointillé, étapes */
  --border-glass:        rgba(255, 255, 255, .5);  /* liserés blancs sur surfaces riches : ring du sceau or */

  /* ombres & halos (complètent soft / float / showcase / gold) */
  --shadow-deep:  0 36px 72px -36px rgba(3, 16, 47, .55); /* grands panneaux : acquisition, boutique, carte avis */
  --shadow-bar:   0 6px 24px rgba(3, 16, 47, .45);        /* barres fixes : header scrolled, menu mobile */
  --shadow-text:  0 1px 4px rgba(3, 16, 47, .6);          /* lisibilité du texte nav sur photo */
  --shadow-dot:   0 2px 8px rgba(3, 16, 47, .35);         /* curseurs d'échelle (marks) */
  --shadow-inset: inset 0 1px 3px rgba(3, 16, 47, .25);   /* creux : piste de grading, inputs creusés */
  --glow-accent:  0 0 8px 1px rgba(243, 201, 105, .7);    /* halo du point or CGC */

  /* iconographie (chantier gate 08/07). Icônes INTERACTIVES (liens
     sociaux…) : rôle --link existant, pas un token icône. */
  --icon:         var(--brand-cube);       /* icône informative sur clair */
  --icon-inverse: var(--brand-cube-light); /* icône informative sur nuit */

  /* ------------------------------------------------------------
     TYPOGRAPHIE
     Bebas Neue = la voix d'affiche (exigence client, assumée en
     signature) : titres + prix display, graisse 400 unique,
     letter-spacing .02-.04em, JAMAIS sous 20 px (--type-price-s est
     le plancher) — en dessous, Inter prend le relais.
     Inter = le corps (gate 1) ; `font-feature-settings:"tnum"` sur
     tout chiffre aligné (prix, cotes, tableaux).
     IBM Plex Mono = la voix documentaire (grades, années, cotes, refs).
     Familles : voir le pont couche 1 (servies par theme.json).
     ------------------------------------------------------------ */

  /* Échelle fluide — corps relevé à 17 px (la V2 vivait à 13-15 px :
     sous le plancher moderne et sous le confort de la cible 35-55 ans).
     PLANCHER ABSOLU : 12 px (--type-micro). Rien en dessous, nulle part. */
  --type-hero:     clamp(3rem, 6.5vw, 4.75rem);      /* display 400, lh .96, Bebas encaisse grand */
  --type-display:  clamp(2.25rem, 4.5vw, 3.375rem);  /* h1 PDP (54 px V2 conservé en plafond) */
  --type-title:    clamp(1.625rem, 2.6vw, 2.25rem);  /* titres de section */
  --type-subtitle: 1.375rem;                         /* Inter 600 */
  --type-lead:     1.3125rem;                        /* chapeaux, lh 1.5 */
  --type-body:     1.0625rem;                        /* 17 px — corps courant, lh 1.65 */
  --type-caption:  .875rem;                          /* 14 px — cartes denses, légendes */
  --type-micro:    .75rem;                           /* 12 px — tags, compteurs. PLANCHER */
  --type-data:     .8125rem;                         /* 13 px mono, ls .02em */
  --type-eyebrow:  .8125rem;                         /* 13 px caps, 600, ls .14em */
  /* [e-comm] les prix parlent Bebas (l'étiquette d'époque) */
  --type-price-hero: clamp(2.75rem, 4.5vw, 3.125rem);  /* PDP */
  --type-price:      1.625rem;                         /* cartes, sticky, tiroir */
  --type-price-s:    1.25rem;                          /* 20 px : le plus petit Bebas autorisé */

  /* ------------------------------------------------------------
     FORMES, PROFONDEUR, RYTHME
     3 crans + pilule (la V2 improvisait 16 valeurs). Rigueur de
     cadre de musée : rayons contenus. Ombres teintées nuit sur
     clair ; l'objet exposé sur nuit porte l'ombre de scène.
     ------------------------------------------------------------ */
  --radius-s:   8px;    /* vignettes, mini-objets */
  --radius-m:   12px;   /* boutons, chips, inputs, cadres de couverture */
  --radius-l:   18px;   /* cartes, bandes */
  --radius-arc: 999px;  /* pilules (tags, keytag) */

  --shadow-soft:     0 8px 28px -14px rgba(3, 16, 47, .25);
  --shadow-float:    0 18px 50px -20px rgba(3, 16, 47, .35);
  --shadow-showcase: 0 40px 80px -30px rgba(0, 0, 0, .75),
                     0 0 0 1px rgba(255, 255, 255, .06);   /* pièce exposée sur nuit */
  --shadow-cta:      0 16px 34px -16px rgba(243, 201, 105, .55);  /* halo du CTA */

  --space-1: .25rem;  --space-2: .5rem;  --space-3: .75rem;
  --space-4: 1rem;    --space-5: 1.5rem; --space-6: 2rem;
  --space-7: 3rem;    --space-8: 4.5rem; --space-9: 6.5rem;

  --container: 1180px;  /* constaté V2 → theme.json layout.contentSize (étape 4 : fait) */
  --container-wide: 1360px;

  /* ------------------------------------------------------------
     MOUVEMENT — feuilleter une pièce sous vitrine : départ franc,
     pose douce (l'easing des V2, conservé). CSS d'abord (décision 9
     du Modèle) ; l'orchestration vit à l'étape 3.
     ------------------------------------------------------------ */
  --ease-cube: cubic-bezier(.22, 1, .36, 1);
  --t-quick: 160ms;   /* micro-interactions */
  --t-soft:  320ms;   /* survols composés */
  --t-scene: 700ms;   /* séquences d'entrée (reveal V2 : .7s, conservé) */
}

/* ------------------------------------------------------------
   CONTEXTE NUIT — les temps forts (hero, bande CGC, sticky, footer).
   Un seul système : les rôles se remappent, les composants ne
   changent pas. Le CTA reste or (loi des 2 couleurs). Le bleu cube
   pur ne porte pas de texte ici (4.0:1) : l'interaction passe en
   bleu clair.
   ------------------------------------------------------------ */
[data-theme="night"] {
  --surface-page:     var(--brand-midnight);
  --surface-warm:     var(--brand-night);
  --surface-raised:   var(--brand-night);
  --surface-inverse:  var(--brand-paper);

  --text-strong:      var(--text-inverse-strong);
  --text-body:        var(--brand-glow);
  --text-soft:        var(--brand-dusk);

  --accent-strong:    var(--brand-cube-light);
  --link:             var(--brand-cube-light);

  --border-soft:      var(--border-night);
  --border-strong:    var(--brand-dusk);

  --data-ink:         var(--brand-dusk);
  --data-accent:      var(--brand-gold);

  --price-ink:        var(--text-inverse-strong);
  --stock-in:         var(--brand-gold);
  --state-alert:      var(--brand-alert-light);

  --shadow-soft:      0 8px 28px -14px rgba(0, 0, 0, .55);
  --shadow-float:     0 18px 50px -20px rgba(0, 0, 0, .65);
}

/* ------------------------------------------------------------
   ACCESSIBILITÉ — plancher non négociable
   Paires mesurées (WCAG, 07/07/2026) :
   - ink/paper 12.8:1 · ink/page 12.2:1 · ink-soft/page 5.1:1
   - cube-deep/paper 6.7:1 · cube/paper 4.7:1 (eyebrows AA)
   - glow/midnight 16.9:1 · dusk/midnight 9.9:1 · dusk/vault 7.1:1
   - cube-light/midnight 9.6:1 · blanc/vault 13.5:1
   - CTA : night/gold 10.8:1 · gold/midnight 12.0:1 (stockline nuit)
   - gold-ink/page 4.9:1 · alert/paper 5.1:1
   Règles : l'or #f3c969 ne porte JAMAIS de texte sur fond clair
   (gold-ink à la place) ; le bleu cube sur nuit = bordures et fonds
   uniquement (4.0:1), le texte interactif sur nuit = cube-light ;
   jamais de noir pur en texte ; rien sous 12 px.
   ------------------------------------------------------------ */
:focus-visible {
  outline: none;
  box-shadow: var(--focus-ring);
  border-radius: var(--radius-s);
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ------------------------------------------------------------
   NEUTRALISATION PARENT UNIQUE (passe de cohérence, 12/07/2026).
   Adaptateur d'environnement child-only : le registre reste
   parent-agnostique, ce fichier est le seul à parler Kadence.

   Le parent peint tous les états d'interaction non possédés avec
   sa palette : a:hover/:focus/:active → --global-palette-highlight-alt
   et button:hover/:focus/:active → --global-palette-btn-bg-hover,
   deux variables qui pointent sur --global-palette4 = #000000.
   C'était la racine du « noir au survol » constaté partout
   (accordéons FAQ, liens « En savoir plus », boutons RS, ajout
   panier au clic). Au lieu de multiplier les verrous ciblés, on
   repointe UNE FOIS les 6 variables d'interaction vers les tokens
   du DS : tout élément non verrouillé dégrade désormais vers le
   bleu du système, jamais vers le noir. Les composants du registre
   verrouillent en plus leurs propres états (double filet).

   :root:root (0-2-0) : le parent imprime sa palette (inline
   kadence-global) APRÈS les feuilles du child dans le head — un
   :root nu (0-1-0) perdrait à l'ordre des sources.
   ------------------------------------------------------------ */
:root:root {
  --global-palette-highlight: var(--link);
  --global-palette-highlight-alt: var(--accent-strong);
  --global-palette-btn: var(--text-inverse-strong);
  --global-palette-btn-hover: var(--text-inverse-strong);
  --global-palette-btn-bg: var(--accent);
  --global-palette-btn-bg-hover: var(--accent-strong);
}

/* ------------------------------------------------------------
   CTA — le bouton d'achat (l'adjudication) + bouton secondaire.
   Loi des 2 couleurs : or = j'achète (hover = or profond, jamais
   bleu, correctif gate 1) ; le secondaire est une sélection → bleu.
   Canonique depuis le gate 1 (07/07/2026). Les helpers de démo
   d'états (.is-hover, .is-focus) vivent sur la planche, pas ici.
   Les états :hover VERROUILLENT leur couleur (retour de gate É4
   Bloc 4) : posé sur un lien, le a:hover du parent Kadence
   (global.min.css, --global-palette-highlight-alt) volait le texte
   au survol — illisible sur la bande nuit. Un composant possède sa
   couleur dans tous ses états.
   ------------------------------------------------------------ */
.cta {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  background: var(--cta-bg); color: var(--cta-text); border: 0; cursor: pointer;
  border-radius: var(--radius-m); padding: 16px 28px;
  font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s);
  letter-spacing: .04em; text-transform: uppercase;
  box-shadow: var(--shadow-cta);
  transition: background var(--t-quick) var(--ease-cube), transform var(--t-quick) var(--ease-cube);
}
/* verrou sur les 3 états (passe de cohérence 12/07) : la recette du
   parent couvre hover, focus ET active (0-1-1) — l'active non
   verrouillé peignait l'ajout panier en noir le temps du clic, et
   son box-shadow de survol remplaçait le halo or sur hôte <button> */
.cta:hover, .cta:focus, .cta:active { background: var(--cta-bg-hover); color: var(--cta-text); box-shadow: var(--shadow-cta); }
.cta:hover { transform: translateY(-1px); }
/* le focus global (tokens.css) remplace le box-shadow : on recombine
   ring bleu + halo or, l'état démontré sur la planche */
.cta:focus-visible { box-shadow: var(--focus-ring), var(--shadow-cta); }

.btn-2nd {
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--surface-raised); color: var(--accent-strong);
  border: 1.5px solid var(--accent); border-radius: var(--radius-m);
  padding: 14px 24px; font-weight: 600; font-size: var(--type-caption); cursor: pointer;
  /* typo gravée (passe de cohérence 12/07) : sur hôte <button>, la
     recette du parent imposait sa Bebas — la voix se déclare */
  font-family: var(--font-body); letter-spacing: 0; text-transform: none; line-height: 1.2;
  box-shadow: none;
  transition: background var(--t-quick) var(--ease-cube);
}
.btn-2nd:hover, .btn-2nd:focus, .btn-2nd:active { background: rgba(14, 105, 255, .08); color: var(--accent-strong); box-shadow: none; }
.btn-2nd:focus-visible { box-shadow: var(--focus-ring); }

/* ------------------------------------------------------------
   Variantes de géométrie (passe d'absorption, gate 08/07/2026).
   Seule la boîte change selon l'hôte : la couleur, la typo et le
   geste (loi des 2 couleurs) restent ceux du .cta canonique.
   Les pages posent ces classes au lieu d'un override local.
   ------------------------------------------------------------ */
/* barre sticky PDP : bouton dense (hauteur de barre fixe) */
.cta--compact { padding: 11px 22px; }
/* CTA soudé dans un champ composé (recherche du hero) : la hauteur
   vient du champ, d'où le padding vertical nul */
.cta--field { padding: 0 22px; }
@media (max-width: 680px) {
  /* le champ se dé-compose en colonne : le CTA reprend sa hauteur propre */
  .cta--field { padding: 14px 22px; }
}

/* ------------------------------------------------------------
   BTN — la famille de boutons de service (passe de cohérence,
   12/07/2026). La paire de conversion vit dans cta.css (.cta or
   = l'adjudication, .btn-2nd = le choix) ; ici les voix hors
   conversion :
   - .btn-blue  : l'action de service (bleu plein). Le « primaire »
     des espaces sans or (compte, modal, lieux) : valider, envoyer,
     se connecter, voir sur Google Maps.
   - .btn-ghost : le rebond discret (filet, texte bleu profond).
     Tertiaire : « voir tout », Click & Collect. Fusion des ex
     .btn-line / .btn-ghost-light du chrome (deux recettes, une voix).
   - .btn-ico   : le carré d'icône 38px (réseaux sociaux). Une seule
     recette ; le contexte nuit ([data-theme="night"], motif du
     footer) remappe filet, veil et couleur.
   Chaque voix grave sa typographie complète (labeur Inter) et
   VERROUILLE hover + focus + active : la recette d'états du parent
   Kadence (button:hover/:focus/:active, 0-1-1) bat une classe nue
   (0-1-0) et peignait fond noir + Bebas condensée. Le remap global
   des variables d'interaction du parent vit côté child
   (kadence-neutralisation.css) ; ici, le composant possède ses
   états, sur tout hôte (<a> comme <button>).
   ------------------------------------------------------------ */
.btn-blue {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  background: var(--accent); color: var(--text-inverse-strong);
  border: 0; cursor: pointer; border-radius: var(--radius-m);
  padding: 14px 24px;
  font-family: var(--font-body); font-weight: 600; font-size: var(--type-caption);
  letter-spacing: 0; text-transform: none; line-height: 1.2;
  box-shadow: none;
  transition: background var(--t-quick) var(--ease-cube);
}
.btn-blue:hover, .btn-blue:focus, .btn-blue:active {
  background: var(--accent-strong); color: var(--text-inverse-strong); box-shadow: none;
}
.btn-blue:focus-visible { box-shadow: var(--focus-ring); }

.btn-ghost {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  background: transparent; color: var(--accent-strong);
  border: 1.5px solid var(--border-soft); cursor: pointer; border-radius: var(--radius-m);
  padding: 13px 22px;
  font-family: var(--font-body); font-weight: 600; font-size: var(--type-caption);
  letter-spacing: 0; text-transform: none; line-height: 1.2;
  box-shadow: none;
  transition: border-color var(--t-quick) var(--ease-cube), background var(--t-quick) var(--ease-cube);
}
.btn-ghost:hover, .btn-ghost:focus, .btn-ghost:active {
  border-color: var(--accent); background: var(--veil-accent);
  color: var(--accent-strong); box-shadow: none;
}
.btn-ghost:focus-visible { box-shadow: var(--focus-ring); }

.btn-ico {
  width: 38px; height: 38px;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; color: var(--link);
  border: 1px solid var(--border-soft); cursor: pointer; border-radius: var(--radius-m);
  box-shadow: none;
  transition: background var(--t-quick) var(--ease-cube), border-color var(--t-quick) var(--ease-cube), color var(--t-quick) var(--ease-cube);
}
.btn-ico:hover, .btn-ico:focus, .btn-ico:active {
  background: var(--veil-accent); border-color: var(--accent);
  color: var(--link); box-shadow: none;
}
.btn-ico:focus-visible { box-shadow: var(--focus-ring); }

/* contexte nuit (footer, bandes) : le veil clair ne se remappe pas,
   le motif du footer fait foi — filet bleuté, veil nuit, texte blanc */
[data-theme="night"] .btn-ico { border-color: var(--border-accent-night); }
[data-theme="night"] .btn-ico:hover,
[data-theme="night"] .btn-ico:focus,
[data-theme="night"] .btn-ico:active {
  background: var(--veil-accent-night); border-color: var(--brand-cube-light);
  color: var(--text-inverse-strong);
}

/* ------------------------------------------------------------
   SURTITRE (eyebrow) — le label de tête de section : petites
   capitales bleu cube précédées du TIRET OR signature. Atome
   récurrent (chaque section de la home et de la PDP en pose un).
   Entré au registre le 08/07 : le tiret or vivait dans le chrome,
   invisible à la planche (trou de vitrine relevé par Julien).

   - Constantes internes de l'atome (géométrie du tiret 26x2, gap,
     rythme, graisse) : elles vivent ici (règle : valeur propre à un
     composant -> son fichier). Le or et le bleu sont des tokens.
   - L'encre sur clair est --eyebrow-ink (F33, 06/08/2026), jeton dédié
     au surtitre : le bleu Cube pur ne tient pas l'AA à 12 px gras sur
     le fond de page. Voir tokens.css pour le motif.
   - Variante nuit : sur un contexte [data-theme="night"] le texte
     passe en cube-light (le bleu cube pur ne porte pas de texte sur
     nuit). Le chrome mappe EN PLUS ses sections sombres .fb-dark au
     même recolor et masque le tiret quand la tête est centrée
     (.sec-head.center) — adaptations de contexte laissées au chrome.
   ------------------------------------------------------------ */
.eyebrow {
  display: inline-flex; align-items: center; gap: 11px;
  font-size: var(--type-micro); font-weight: 700; letter-spacing: .16em;
  text-transform: uppercase; color: var(--eyebrow-ink); margin-bottom: 13px;
}
.eyebrow::before { content: ''; width: 26px; height: 2px; background: var(--brand-gold); }
[data-theme="night"] .eyebrow { color: var(--brand-cube-light); }

/* ------------------------------------------------------------
   Messages de formulaire (formmsg) — réponses serveur des
   Advanced Forms Kadence (newsletter, contact) : la carte nuit
   des notices Woo de la PDP généralisée (single-product § notices,
   gate maquette Julien 15/07, É5 temps 2). Succès = filet + coche
   or ; avertissement (rejet honeypot) et erreur d'envoi = filet +
   glyphe alerte. La validation de saisie (case consentement,
   e-mail vide) reste la bulle NATIVE du navigateur : rien ici.
   Sélecteur doublé : la classe de base bat les défauts bleus de
   Kadence (égalité de spécificité sinon, l'ordre déciderait).
   Anatomie : div.kb-adv-form-message.kb-adv-form-{success|warning|error}
   Consommé par : build É4 (toutes les vues à formulaire) ·
   planche de style (spécimens).
   ------------------------------------------------------------ */
.kb-adv-form-message.kb-adv-form-message { display: block; background: var(--brand-night); border: 1px solid var(--brand-night); border-left: 3px solid var(--brand-gold); border-radius: var(--radius-m); color: var(--text-inverse); padding: var(--space-3) var(--space-4); margin: var(--space-4) 0 0; font-family: var(--font-body); font-size: var(--type-caption); font-weight: 400; line-height: 1.55; letter-spacing: normal; text-transform: none; text-align: left; }
.kb-adv-form-message.kb-adv-form-message::before { content: "✓"; color: var(--brand-gold); font-weight: 700; margin-right: var(--space-2); }
.kb-adv-form-message.kb-adv-form-warning, .kb-adv-form-message.kb-adv-form-error { border-left-color: var(--state-alert); }
.kb-adv-form-message.kb-adv-form-warning::before, .kb-adv-form-message.kb-adv-form-error::before { content: "!"; color: var(--state-alert); }
/* Kadence déplace le focus sur le message (a11y, tabindex -1) : le
   comportement reste, l'anneau visuel n'a pas de sens sur une boîte
   non interactive. */
.kb-adv-form-message.kb-adv-form-message:focus { outline: none; box-shadow: none; }
/* Le rejet arrive enveloppé d'un <h2 class="kb-adv-form-error-title">
   (markup Kadence) : sans possession il prend la Bebas des titres et
   pousse le glyphe sur sa propre ligne. Inline, à la voix du message. */
.kb-adv-form-message.kb-adv-form-message .kb-adv-form-error-title { display: inline; font-family: var(--font-body); font-size: var(--type-caption); font-weight: 400; line-height: 1.55; letter-spacing: normal; text-transform: none; color: var(--text-inverse); margin: 0; }

/* ------------------------------------------------------------
   Rangée de réassurance compacte (trustrow) — motif de la fiche
   produit (colonne d'achat), PROMU au registre le 09/07/2026
   (passe de saveur fiche pack CGC). Rangée en ligne de garanties
   courtes (icône + libellé), plus sobre que la bande `trust` :
   se pose sous un CTA ou en pied de section « Comment ça marche ».
   Neutre au contexte : claire par défaut, bascule -inverse sous
   data-theme="night" (les rôles sémantiques y sont remappés).
   Anatomie : .trustrow > span > svg + texte.
   Consommé par : fiche-pack-cgc.html (§ Comment ça marche).
   (fiche-produit.html garde sa copie locale d'échafaudage :
   migration au composant différée, comme le strip de la home.)
   ------------------------------------------------------------ */
.trustrow { display: grid; grid-template-columns: repeat(4, auto); justify-content: center; align-items: center; gap: var(--space-3) var(--space-6); font-size: var(--type-micro); color: var(--text-soft); }
.trustrow span { display: inline-flex; align-items: center; gap: var(--space-2); }
.trustrow svg { flex: 0 0 auto; color: var(--icon); }

/* contexte nuit : la rangée bascule sur les rôles inverse */
[data-theme="night"] .trustrow { color: var(--text-inverse-soft); }
[data-theme="night"] .trustrow svg { color: var(--icon-inverse); }

/* étroit : 2 colonnes AU CONTENU, bloc centré (retour 19 de F-ter-a,
   12/07 : la colonne unique calée à gauche flottait comme une liste
   orpheline sous la section centrée — le cartouche 2×2 reste une
   composition, pas un empilement) */
@media (max-width: 720px) { .trustrow { grid-template-columns: repeat(2, auto); justify-content: center; gap: var(--space-3) var(--space-5); } }

/* ------------------------------------------------------------
   Carte nuit (nightcard) — l'écrin de conversion : panneau nuit
   posé dans une section CLAIRE (doctrine de fin de page,
   10/07/2026 : la dernière section avant le footer n'est jamais
   nuit ; quand la CTA finale mérite la nuit, c'est la carte qui
   la porte, jamais la section). PROMOTION du panneau
   « Acquisition remarquable » de la home (échafaudage
   .ch-feat-panel V2) : dégradé vault→midnight, spot or
   (--brand-night-spot), filet giltline en tranche, padding
   normalisé sur l'échelle (56px → space-7).
   La carte PORTE data-theme="night" dans son markup : ses
   enfants (eyebrow, cta, trustrow…) basculent par le remap des
   rôles, et le composant s'écrit en rôles purs.
   Anatomie : .nightcard[data-theme="night"] > .nightcard-cta
     ( .eyebrow · .nightcard-title · .nightcard-sub ·
       .nightcard-actions ( .cta · .nightcard-link ) ).
   La composition VITRINE de la home (grille cover + texte,
   .ch-feat-grid / .ch-feat-frame) reste un échafaudage local de
   la home : elle entrera ici quand une autre page la consommera
   (migration différée, même statut que news/strip/trustrow).
   Consommé par : service-cgc.html (CTA finale).
   ------------------------------------------------------------ */
.nightcard { position: relative; overflow: hidden; background: linear-gradient(118deg, var(--brand-vault), var(--brand-midnight)); color: var(--text-body); border-radius: var(--radius-l); padding: var(--space-7); box-shadow: var(--shadow-deep); }
.nightcard::before { content: ''; position: absolute; inset: 0; pointer-events: none; background: var(--brand-night-spot); }
.nightcard::after { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--brand-giltline); opacity: .6; }

/* composition CTA finale (doctrine de fin de page) : colonne centrée */
.nightcard-cta { position: relative; z-index: 1; text-align: center; max-width: 46rem; margin: 0 auto; }
.nightcard-title { font-family: var(--font-display); font-weight: 400; font-size: var(--type-title); line-height: 1.02; letter-spacing: .02em; color: var(--text-strong); margin-bottom: var(--space-3); }
.nightcard-sub { font-size: var(--type-lead); line-height: 1.5; color: var(--text-body); max-width: 52ch; margin: 0 auto var(--space-6); }
.nightcard-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--space-4) var(--space-6); }
.nightcard-link { font-size: var(--type-caption); font-weight: 600; color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
.nightcard-link:hover { color: var(--text-strong); }

@media (max-width: 1000px) { .nightcard { padding: var(--space-6); } }
@media (max-width: 560px)  { .nightcard { padding: var(--space-5) var(--space-4); } }

/* ============================================================
   CHROME DU SITE : en-tête, menus, recherche, tiroir panier, pied.
   Menu WordPress (ul/li), menu déroulant Comic-Shop, menu mobile plein
   écran, barre de recherche, tiroir panier (fragments WooCommerce).
   Charge APRÈS tokens.css + components/cta.css.
   ============================================================ */

/* ---------- socle ---------- */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
  font-family: var(--font-body);
  font-size: var(--type-body);
  line-height: 1.6;
  color: var(--brand-ink);
  background: var(--brand-paper);
  -webkit-font-smoothing: antialiased;
}
/* En-tête fixé : le flux commence sous lui. Les pages à héros posent
   body.ch-has-hero pour repasser dessous. --ch-notice-h = hauteur du
   bandeau promo fixé en haut, mesurée par chrome.js (0 sans bandeau) :
   flux et éléments fixés la suivent. Sélecteurs préfixés par `html` : une
   règle `body { padding… }` chargée après cette feuille (style d'une
   extension, copie de cache corrompue) ne peut plus écraser la marge. Les
   règles à classe du tunnel et du sas (`body.woocommerce-checkout`,
   `body.lecube-sas`) gardent la main sur `html body`. */
html body { padding-top: calc(var(--ch-head-h) + var(--ch-notice-h, 0px)); }
html body.ch-has-hero { padding-top: var(--ch-notice-h, 0px); }
img { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
ul { list-style: none; }
.wrap { max-width: var(--container); margin: 0 auto; padding: 0 24px; }
.data { font-family: var(--font-data); letter-spacing: .02em; }

/* Hauteur de la barre, constante unique : --ch-head-h = hauteur de la
   barre · --ch-logo-h = hauteur du logo dedans (90 − 2×9 d'air optique).
   Sous 680px, la barre garde 64px. Toute déclaration qui dégage l'en-tête
   fixe lit --ch-head-h, sans valeur de repli : une variable absente doit
   casser visiblement. */
body { --ch-head-h: 90px; --ch-logo-h: 72px; }
@media (max-width: 680px) { body { --ch-head-h: 64px; } }

/* Au défilement, la barre s'amincit. --ch-bar-h = hauteur courante de la
   barre (repli : --ch-head-h). Ne la lisent que la barre et ce qui
   s'accroche à son bord bas (panneau recherche, panneau mobile, barre
   d'outils de la boutique). Les décalages de mise en page (héros,
   scroll-margin, padding du body) restent sur --ch-head-h : le contenu ne
   bouge pas quand la barre change de hauteur. */
@media (min-width: 681px) {
  html[data-head='scrolled'] body { --ch-bar-h: 64px; }
}

/* Décalage des éléments fixés quand la barre d'administration est
   présente (le html est déjà poussé par WordPress ; seuls les éléments
   fixés doivent suivre). */
body { --ch-notice-h: 0px; --ch-head-top: var(--ch-notice-h, 0px); }
body.admin-bar { --ch-head-top: calc(32px + var(--ch-notice-h, 0px)); }
@media (max-width: 782px) { body.admin-bar { --ch-head-top: calc(46px + var(--ch-notice-h, 0px)); } }

/* ---------- reveals V2 (« emboîtement ») ---------- */
/* reveal au scroll : via ANIMATION (pas transition) pour ne pas capter le survol
   des composants enfants — .pcard, .ch-ed, .ch-pillar gardent leur propre transition.
   fill: backwards = état caché pendant le delay du stagger, sans verrouiller le
   transform APRÈS l'animation (le hover reste libre). */
.reveal { opacity: 0; }
.reveal.in { opacity: 1; animation: reveal-up .7s ease backwards; }
.stagger > * { opacity: 0; }
.stagger.in > * { opacity: 1; animation: stagger-up .6s ease backwards; }
.stagger.in > *:nth-child(2) { animation-delay: .06s; }
.stagger.in > *:nth-child(3) { animation-delay: .12s; }
.stagger.in > *:nth-child(4) { animation-delay: .18s; }
.stagger.in > *:nth-child(5) { animation-delay: .24s; }
.stagger.in > *:nth-child(6) { animation-delay: .30s; }
.stagger.in > *:nth-child(7) { animation-delay: .36s; }
.stagger.in > *:nth-child(8) { animation-delay: .42s; }
@keyframes reveal-up { from { opacity: 0; transform: translateY(28px); } to { opacity: 1; transform: none; } }
@keyframes stagger-up { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: none; } }

/* ---------- sections + sur-titres V2 ---------- */
.ch-section { padding: 92px 0; position: relative; }
.fb { position: relative; width: 100%; }
.fb-dark { background: linear-gradient(118deg, var(--brand-vault), var(--brand-midnight)); color: var(--brand-glow); }
.fb-dark::before { content: ''; position: absolute; inset: 0; pointer-events: none; background: var(--brand-night-spot); }
.fb-dark::after { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--brand-giltline); opacity: .6; }
.fb-dark.ch-section { padding: 104px 0; }
.fb-paper { background: var(--brand-paper); border-top: 1px solid var(--brand-line); border-bottom: 1px solid var(--brand-line); }
.fb-bg { background: var(--brand-page); border-top: 1px solid var(--brand-line); border-bottom: 1px solid var(--brand-line); }
.fb-gold { background: var(--brand-newsprint); border-top: 1px solid var(--brand-gold-line); }
.fb > .wrap { position: relative; z-index: 1; }
.sec-head { margin-bottom: 42px; }
.sec-head.center { text-align: center; }
/* .eyebrow (surtitre + tiret or) vit dans components/eyebrow.css. Restent
   ici ses adaptations de contexte. */
.sec-head.center .eyebrow::before { display: none; }
.fb-dark .eyebrow { color: var(--brand-cube-light); }
h2.sec-t {
  font-family: var(--font-display); font-weight: 400;
  font-size: var(--type-title); letter-spacing: .02em; line-height: 1.02;
  margin-bottom: 10px; color: var(--brand-cube);
}
.fb-dark h2.sec-t { color: var(--text-inverse-strong); }
.sec-lead { font-size: var(--type-caption); color: var(--brand-ink-soft); max-width: 60ch; }
.fb-dark .sec-lead { color: var(--brand-dusk); }
.sec-head.center .sec-lead { margin: 14px auto 0; }

/* ---------- boutons : la famille vit dans components/cta.css
   (conversion) et components/btn.css (service). ---------- */

/* ---------- HEADER (V2 portée au réel) ---------- */
.cube-head { position: fixed; top: var(--ch-head-top); left: 0; right: 0; z-index: 1000; height: var(--ch-bar-h, var(--ch-head-h)); transition: background .28s ease, box-shadow .28s ease, height .28s ease; }
.cube-head::before { content: ''; position: absolute; inset: 0 0 -30px 0; z-index: -1; background: var(--brand-head-scrim); opacity: 1; transition: opacity .28s ease; pointer-events: none; }
.cube-head[data-state='scrolled'] { background: linear-gradient(180deg, var(--brand-night), var(--brand-midnight)); box-shadow: var(--shadow-bar); }
.cube-head[data-state='scrolled']::before { opacity: 0; }
/* Sans héros sous l'en-tête, le voile n'a rien à couvrir : en-tête plein. */
body:not(.ch-has-hero) .cube-head { background: linear-gradient(180deg, var(--brand-night), var(--brand-midnight)); box-shadow: var(--shadow-bar); }
body:not(.ch-has-hero) .cube-head::before { opacity: 0; }
/* Combinateur enfant : l'en-tête contient d'autres .wrap (barre de
   recherche) qui ne doivent pas hériter du flex de la rangée. */
.cube-head > .wrap { height: 100%; display: flex; align-items: center; gap: 26px; }
/* Menu centré dans la barre. Grille 1fr auto 1fr : logo à gauche, nav au
   centre optique, actions à droite. Le mobile garde le flex. */
@media (min-width: 681px) {
  .cube-head > .wrap { display: grid; grid-template-columns: 1fr auto 1fr; }
  .cube-head .ch-logo { justify-self: start; }
  .cube-head .ch-nav { justify-self: center; margin-left: 0; flex: none; }
  .cube-head .ch-head-actions { justify-self: end; }
}
.ch-logo { display: flex; align-items: center; flex: 0 0 auto; }
/* Le logo empilé se lit à 72px de haut (sous 60px les deux mots
   décrochent) ; sa largeur suit son ratio 0,73:1, soit ~53px. Sélecteur
   préfixé .cube-head, obligatoire : Kadence charge son woocommerce.min.css
   après le CSS du thème enfant, et sa règle « .woocommerce img { height:
   auto } » a la même spécificité que « .ch-logo img » ; à égalité, la
   dernière feuille gagne et le logo reprendrait sa taille native sur toute
   page à classe woocommerce. tunnel-woo.css et compte-woo.css contrent de
   même pour .cko-logo. Les deux règles suivantes montent d'un cran ensemble
   pour garder leur ordre interne (l'icône mobile reste au-dessus). */
.cube-head .ch-logo img { height: var(--ch-logo-h); width: auto; transition: height .28s ease; }
/* Un seul logo dans toutes les barres : le logo empilé, à toutes les
   tailles. Au défilement il rétrécit avec la barre (90→64, logo 72→48). */
@media (min-width: 681px) {
  .cube-head[data-state='scrolled'] .ch-logo img { height: 48px; }
}
/* Nom de marque mobile, à côté du cube, dans la police des titres.
   Affiché par le bloc responsive, qui resserre aussi les boîtes d'action
   et les gouttières pour que le logo + 5 actions tiennent (344/347px à
   390px de large). */
/* La nav est un menu WordPress : le ul remplace une rangée de <a> nus,
   mêmes géométrie et styles au niveau 1. */
.ch-nav { display: flex; align-items: center; margin-left: 6px; flex: 1 1 auto; min-width: 0; }
.ch-nav > ul { display: flex; align-items: center; gap: 24px; margin: 0; padding: 0; list-style: none; }
.ch-nav > ul > li { position: relative; display: flex; align-items: center; }
.ch-nav > ul > li > a { font-size: var(--type-caption); font-weight: 600; color: var(--brand-glow); position: relative; padding: 6px 0; white-space: nowrap; text-shadow: var(--shadow-text); transition: color .2s ease; }
.ch-nav > ul > li > a:hover { color: var(--text-inverse-strong); }
/* État actif : éléments de pages et de taxonomies seulement (un élément
   personnalisé dont l'URL correspond à la page se marque aussi). */
.ch-nav > ul > li:not(.menu-item-type-custom).current-menu-item > a,
.ch-nav > ul > li:not(.menu-item-type-custom).current-menu-ancestor > a,
.ch-nav > ul > li:not(.menu-item-type-custom).current_page_parent > a { color: var(--text-inverse-strong); }
.ch-nav > ul > li:not(.menu-item-type-custom).current-menu-item > a::after,
.ch-nav > ul > li:not(.menu-item-type-custom).current-menu-ancestor > a::after,
.ch-nav > ul > li:not(.menu-item-type-custom).current_page_parent > a::after { content: ''; position: absolute; left: 0; right: 0; bottom: -2px; height: 2px; background: var(--brand-gold); border-radius: 2px; }
/* Point or CGC : la classe vit sur le <li> du menu ; la spécificité
   (0,3,1) évite tout !important. */
.ch-nav > ul > li.ch-nav-cgc > a { color: var(--brand-gold); font-weight: 700; display: inline-flex; align-items: center; gap: 6px; }
.ch-nav > ul > li.ch-nav-cgc > a::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--brand-gold); box-shadow: var(--glow-accent); }
.ch-nav > ul > li.ch-nav-cgc > a:hover { color: var(--brand-cube-light); }
.ch-head-actions { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; margin-left: auto; }
.ch-icn { width: 40px; height: 40px; padding: 0; display: flex; align-items: center; justify-content: center; color: var(--brand-glow); background: transparent; border: 0; border-radius: var(--radius-m); cursor: pointer; position: relative; transition: background .2s, color .2s; }
/* Verrou des 3 états : le thème parent peint button:hover/:focus/:active,
   les icônes du chrome portent les leurs. */
.ch-icn:hover, .ch-icn:focus, .ch-icn:active { background: var(--veil-accent-night); color: var(--text-inverse-strong); box-shadow: none; }
.ch-icn:focus-visible { box-shadow: var(--focus-ring); }
/* État actif du ♥ Favoris sur /wishlist/ : cœur plein or, tenu aussi au
   survol (déclaré après le verrou des 3 états). */
.ch-icn.is-active { color: var(--brand-gold); }
.ch-icn.is-active svg { fill: currentColor; }
.ch-cart-count { position: absolute; top: 2px; right: 2px; min-width: 17px; height: 17px; padding: 0 4px; background: var(--brand-gold); color: var(--brand-midnight); font-size: var(--type-micro); font-weight: 700; line-height: 17px; text-align: center; border-radius: var(--radius-s); }
.ch-burger { display: none; flex-direction: column; gap: 4px; width: 42px; height: 42px; padding: 0; align-items: center; justify-content: center; background: transparent; border: 0; cursor: pointer; }
.ch-burger:hover, .ch-burger:focus, .ch-burger:active { background: transparent; box-shadow: none; }
.ch-burger:focus-visible { box-shadow: var(--focus-ring); }
.ch-burger span { width: 21px; height: 2px; background: var(--brand-glow); border-radius: 2px; transition: transform .25s, opacity .2s; }
.ch-burger[aria-expanded='true'] span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.ch-burger[aria-expanded='true'] span:nth-child(2) { opacity: 0; }
.ch-burger[aria-expanded='true'] span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* ---------- MENU DÉROULANT Comic-Shop (ordinateur) ----------
   Panneau nuit sous l'élément ; « Autres éditeurs » = colonne 2 (groupe non
   cliquable : <a> sans href, non focalisable). Tout ce bloc vit sous
   min-width 981px, rien ne fuit vers le panneau mobile. Déclencheurs :
   survol + bouton caret (clic, clavier, aria-expanded) ; le lien parent
   reste une vraie navigation vers /comic-shop/. */
.ch-sub-toggle { display: none; }
@media (min-width: 981px) {
  .ch-sub-toggle { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; padding: 0; margin-left: 2px; background: transparent; border: 0; border-radius: var(--radius-s); color: var(--brand-glow); cursor: pointer; transition: background .2s, color .2s, transform .2s; }
  .ch-sub-toggle:hover { color: var(--text-inverse-strong); background: var(--veil-accent-night); }
  .ch-sub-toggle svg { width: 12px; height: 12px; }
  .ch-sub-toggle[aria-expanded='true'] svg { transform: rotate(180deg); }
  .ch-nav .sub-menu { position: absolute; top: calc(100% + 14px); left: -22px; z-index: 1001; min-width: 230px; padding: 18px 24px 20px; margin: 0; list-style: none; background: linear-gradient(180deg, var(--brand-night), var(--brand-midnight)); border-radius: 0 0 var(--radius-m) var(--radius-m); box-shadow: var(--shadow-bar); opacity: 0; visibility: hidden; transform: translateY(6px); transition: opacity .18s ease, transform .18s ease, visibility .18s; display: grid; grid-template-columns: max-content; }
  .ch-nav .sub-menu::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--brand-giltline); opacity: .6; }
  .ch-nav > ul > li:hover > .sub-menu,
  .ch-nav > ul > li.is-open > .sub-menu,
  .ch-nav > ul > li:focus-within > .sub-menu { opacity: 1; visibility: visible; transform: none; }
  /* pont invisible entre l'item et le panneau : le survol ne tombe pas
     dans le trou des 14px d'écart */
  .ch-nav > ul > li.menu-item-has-children::after { content: ''; position: absolute; left: 0; right: 0; top: 100%; height: 14px; }
  .ch-nav .sub-menu > li { grid-column: 1; }
  .ch-nav .sub-menu a { display: block; padding: 7px 0; font-size: var(--type-caption); font-weight: 500; color: var(--brand-dusk); white-space: nowrap; transition: color .18s, padding-left .18s; }
  .ch-nav .sub-menu a[href]:hover { color: var(--text-inverse-strong); padding-left: 4px; }
  .ch-nav .sub-menu .current-menu-item > a { color: var(--brand-gold); }
  /* Entrée générale du menu déroulant : « Tout le catalogue » en tête,
   distinguée des rayons (graisse, encre vive, filet dessous). */
  .ch-nav .sub-menu > li.ch-sub-tout > a { font-weight: 600; color: var(--brand-glow); padding-bottom: 11px; margin-bottom: 6px; border-bottom: 1px solid var(--border-accent-night); }
  /* groupe « Autres éditeurs » : colonne 2 du panneau (span large : les
     entrées de la colonne 1 n'iront jamais au-delà) */
  .ch-nav .sub-menu > li.menu-item-has-children { grid-column: 2; grid-row: 1 / span 12; margin-left: 26px; padding-left: 26px; border-left: 1px solid var(--border-accent-night); }
  .ch-nav .sub-menu > li.menu-item-has-children > a { font-family: var(--font-data); font-size: var(--type-micro); font-weight: 500; letter-spacing: .1em; text-transform: uppercase; color: var(--brand-cube-light); cursor: default; padding-bottom: 9px; }
  /* visibility: inherit, jamais visible : un enfant `visible` dans un
   panneau `hidden` reste survolable (surface fantôme sous l'en-tête qui
   ouvrait le menu depuis la zone du H1). */
  .ch-nav .sub-menu .sub-menu { position: static; opacity: 1; visibility: inherit; transform: none; display: block; min-width: 0; padding: 0; background: none; box-shadow: none; border-radius: 0; }
  .ch-nav .sub-menu .sub-menu::before { content: none; }
}

/* ---------- BARRE DE RECHERCHE (loupe de l'en-tête) ----------
   Recherche produits (post_type=product). Bandeau nuit sous l'en-tête. */
.ch-search { position: fixed; top: calc(var(--ch-bar-h, var(--ch-head-h)) + var(--ch-head-top)); left: 0; right: 0; z-index: 985; background: linear-gradient(180deg, var(--brand-night), var(--brand-midnight)); box-shadow: var(--shadow-bar); border-top: 1px solid var(--border-accent-night); opacity: 0; visibility: hidden; transform: translateY(-8px); transition: opacity .2s ease, transform .2s ease, visibility 0s linear .2s; }
.ch-search.open { opacity: 1; visibility: visible; transform: none; transition: opacity .2s ease, transform .2s ease, visibility 0s; }
.ch-search form { display: flex; gap: 12px; padding: 16px 0; }
.ch-search input[type='search'] { flex: 1 1 auto; min-width: 0; height: 48px; padding: 0 18px; background: var(--veil-accent-night); border: 1px solid var(--border-accent-night); border-radius: var(--radius-m); color: var(--text-inverse-strong); font-family: var(--font-body); font-size: var(--type-caption); }
.ch-search input[type='search']::placeholder { color: var(--brand-dusk); }
.ch-search input[type='search']:focus-visible { outline: 0; border-color: var(--brand-cube-light); box-shadow: var(--focus-ring); }
/* Couleur et curseur épinglés à tous les états ((0,3,1) : le CSS
   dynamique de Kadence passe après le thème enfant et peut gagner le focus
   à égalité (0,2,1)) ; remplissage automatique neutralisé : la saisie reste
   blanche en toute circonstance. */
.ch-search input[type='search'] { caret-color: var(--brand-gold); }
.ch-search input[type='search']:focus, .ch-search input[type='search']:focus-visible { color: var(--text-inverse-strong); caret-color: var(--brand-gold); }
.ch-search input[type='search']:-webkit-autofill { -webkit-text-fill-color: var(--text-inverse-strong); caret-color: var(--brand-gold); transition: background-color 999999s; }
.ch-search .cta--field { height: 48px; }

/* ---------- MENU MOBILE PLEIN ÉCRAN ----------
   Fond opaque, liens aérés, CTA pleine largeur en bas, défilement du fond
   verrouillé (html.ch-nav-open), fermeture au passage en largeur
   ordinateur (JS). */
html.ch-nav-open { overflow: hidden; }
.ch-mobile { position: fixed; top: calc(var(--ch-bar-h, var(--ch-head-h)) + var(--ch-head-top)); left: 0; right: 0; bottom: 0; z-index: 990; display: none; flex-direction: column; overflow-y: auto; background: linear-gradient(180deg, var(--brand-night), var(--brand-midnight)); border-top: 1px solid var(--border-accent-night); padding: 10px 24px calc(24px + env(safe-area-inset-bottom, 0px)); }
.ch-mobile.open { display: flex; }
.ch-mobile ul { list-style: none; margin: 0; padding: 0; }
.ch-mobile > ul { flex: 1 1 auto; }
.ch-mobile > ul > li { border-bottom: 1px solid var(--border-accent-night); }
.ch-mobile > ul > li:last-child { border-bottom: 0; }
.ch-mobile li { display: block; }
/* lien + caret sur une ligne, sous-menu sur la ligne d'après */
.ch-mobile li.menu-item-has-children { display: flex; flex-wrap: wrap; align-items: center; }
.ch-mobile li.menu-item-has-children > a { flex: 1 1 auto; }
.ch-mobile li.menu-item-has-children > .sub-menu { flex-basis: 100%; }
/* :not(.cta) : le CTA « Tout le catalogue » du pied de menu est un
   composant ; la règle générique des liens du menu (block, glow, padding
   16/0) le déformait. */
.ch-mobile a:not(.cta) { display: block; padding: 16px 0; color: var(--brand-glow); font-size: var(--type-caption); font-weight: 600; }
.ch-mobile li.ch-nav-cgc > a { color: var(--brand-gold); font-weight: 700; }
/* accordéon Comic-Shop : bouton caret dédié, le lien navigue */
.ch-mobile .ch-sub-toggle { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 46px; height: 46px; padding: 0; background: transparent; border: 0; border-radius: var(--radius-m); color: var(--brand-glow); cursor: pointer; transition: transform .2s ease; }
.ch-mobile .ch-sub-toggle svg { width: 16px; height: 16px; }
.ch-mobile .ch-sub-toggle[aria-expanded='true'] { transform: rotate(180deg); }
.ch-mobile .sub-menu { display: none; margin: 0 0 12px; padding-left: 16px; border-left: 2px solid var(--border-accent-night); }
.ch-mobile li.is-open > .sub-menu { display: block; }
.ch-mobile .sub-menu a { padding: 11px 0; font-weight: 500; color: var(--brand-dusk); }
.ch-mobile .sub-menu a[href]:hover { color: var(--text-inverse-strong); }
/* groupe « Autres éditeurs » : titre de groupe + enfants toujours visibles */
.ch-mobile .sub-menu li.menu-item-has-children > a { font-family: var(--font-data); font-size: var(--type-micro); font-weight: 500; letter-spacing: .1em; text-transform: uppercase; color: var(--brand-cube-light); padding-bottom: 4px; }
.ch-mobile .sub-menu .sub-menu { display: block; margin: 0; }
.ch-mobile .cta { width: 100%; margin-top: 20px; flex: 0 0 auto; }

/* ---------- TIROIR PANIER (fragments WooCommerce natifs) ----------
   Panneau papier. Le contenu est le mini-panier WooCommerce
   (div.widget_shopping_cart_content, rafraîchi par wc-cart-fragments),
   habillé ici sur les tokens. */
.ch-scrim { position: fixed; inset: 0; z-index: 1100; background: var(--scrim-modal); opacity: 0; visibility: hidden; transition: opacity .24s ease, visibility 0s linear .24s; }
.ch-scrim.open { opacity: 1; visibility: visible; transition: opacity .24s ease, visibility 0s; }
/* top: 0 (pas var(--ch-head-top)) : le tiroir est une couche modale, il
   couvre aussi le bandeau promo, sinon le bandeau resterait visible
   au-dessus, assombri par le voile. */
.ch-drawer { position: fixed; top: 0; right: 0; bottom: 0; z-index: 1110; width: min(420px, 92vw); display: flex; flex-direction: column; background: var(--brand-paper); box-shadow: var(--shadow-bar); transform: translateX(100%); visibility: hidden; transition: transform .28s var(--ease-cube), visibility 0s linear .28s; }
.ch-drawer.open { transform: none; visibility: visible; transition: transform .28s var(--ease-cube), visibility 0s; }
/* Tête du tiroir : titre à l'encre (zone d'achat), compteur en pastille
   or (écho du badge panier de l'en-tête), fermeture cerclée. */
.ch-drawer-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 20px 24px; border-bottom: 1px solid var(--brand-line); }
.ch-drawer-head h2 { display: flex; align-items: center; gap: 10px; font-family: var(--font-display); font-weight: 400; font-size: var(--type-price); letter-spacing: .04em; text-transform: uppercase; color: var(--brand-ink); }
.ch-drawer-head .ch-drawer-count { display: inline-flex; align-items: center; justify-content: center; min-width: 24px; height: 24px; padding: 0 7px; border-radius: 999px; background: var(--brand-gold); color: var(--brand-night); font-family: var(--font-data); font-size: var(--type-micro); font-weight: 600; letter-spacing: 0; }
/* spécificité 0,2,0 : des styles de bouton englobants (parent/plugins)
   passent après nous dans l'ordre des feuilles */
.ch-drawer .ch-drawer-close { display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 0; background: transparent; border: 1px solid var(--brand-line); border-radius: 50%; color: var(--brand-ink-soft); cursor: pointer; transition: background .2s, color .2s, border-color .2s; }
.ch-drawer .ch-drawer-close:hover, .ch-drawer .ch-drawer-close:focus, .ch-drawer .ch-drawer-close:active { background: var(--veil-accent); color: var(--brand-ink); border-color: var(--brand-ink-soft); box-shadow: none; }
.ch-drawer .ch-drawer-close:focus-visible { box-shadow: var(--focus-ring); }
/* Le corps ne défile plus en bloc : la liste d'articles défile seule, la
   barre de livraison reste en tête, le pied (sous-total + Commander) reste
   ancré en bas quel que soit le panier. */
.ch-drawer-body { flex: 1 1 auto; display: flex; flex-direction: column; min-height: 0; overflow: hidden; padding: 0; }
.ch-drawer .widget_shopping_cart_content { flex: 1 1 auto; display: flex; flex-direction: column; min-height: 0; }
/* Barre « livraison offerte » du thème enfant (seuil lu de la
   configuration transporteur). Réassurance en registre or, progression en
   or. */
/* Plus grande et aérée : c'est un argument de vente, il doit se voir. */
.ch-drawer .ch-ship { flex: 0 0 auto; display: block; margin: 18px 24px 0; padding: 14px 16px; background: var(--brand-newsprint); border: 1px solid var(--brand-gold-line); border-radius: var(--radius-m); }
.ch-drawer .ch-ship-message { display: block; font-size: var(--type-caption); line-height: 1.5; color: var(--brand-ink); margin-bottom: 10px; }
.ch-drawer .ch-ship-message .woocommerce-Price-amount { font-family: var(--font-data); font-weight: 600; color: var(--price-ink); }
.ch-drawer .ch-ship-message.is-gagnee { color: var(--brand-ink); font-weight: 600; }
.ch-drawer .ch-ship-jauge { display: block; height: 8px; background: var(--brand-line); border-radius: var(--radius-s); overflow: hidden; }
.ch-drawer .ch-ship-avancee { display: block; height: 100%; background: var(--brand-gold); border-radius: var(--radius-s); }

/* habillage du markup mini-panier Woo, sur tokens */
/* Marges intérieures à 24 + dégagement de la colonne droite (prix et
   croix décollés du bord). */
.ch-drawer ul.woocommerce-mini-cart { list-style: none; flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; margin: 0; padding: 4px 24px 12px; }
.ch-drawer li.woocommerce-mini-cart-item { display: grid; grid-template-columns: 58px 1fr; gap: 14px; align-items: start; padding: 14px 0; margin: 0; border-bottom: 1px solid var(--brand-line); position: relative; }
/* Boîte de couverture FIXE (ratio comic) : une image cassée n'étire
   jamais la rangée. Spécificité (0,3,3) nécessaire : sur les gabarits
   WooCommerce, l'ancêtre .woocommerce arme la règle Kadence
   ul.product_list_widget li img (float:left, 50px) à (0,2,3), qui battait
   une version plus courte de cette règle ; le tiroir changeait d'aspect
   entre vitrines et boutique. */
.ch-drawer ul.woocommerce-mini-cart li.woocommerce-mini-cart-item img { display: block; float: none; width: 58px; height: 87px; margin: 0; object-fit: cover; overflow: hidden; border-radius: var(--radius-s); border: 1px solid var(--brand-line); grid-column: 1; grid-row: 1 / span 2; }
.ch-drawer li.woocommerce-mini-cart-item > a:not(.remove) { grid-column: 2; font-size: var(--type-caption); font-weight: 600; color: var(--brand-cube-deep); line-height: 1.35; padding-right: 36px; }
.ch-drawer li.woocommerce-mini-cart-item a.remove { position: absolute; top: 14px; right: 2px; width: 26px; height: 26px; display: flex; align-items: center; justify-content: center; border-radius: 50%; font-size: var(--type-body); line-height: 1; color: var(--brand-ink-soft); border: 1px solid var(--brand-line); transition: color .18s, border-color .18s; }
.ch-drawer li.woocommerce-mini-cart-item a.remove:hover { color: var(--state-alert); border-color: var(--state-alert); }
/* Données de ligne (`wc_get_formatted_cart_item_data`), par exemple sur
   les packs CGC. WooCommerce les sort en <dl class="variation"> directement
   sous le <li> ; sans placement, la grille les rangeait en colonne 1 (la
   boîte de couverture, 58px), où le <dt> débordait sur les contrôles de
   quantité. Elles rejoignent la colonne de contenu, sous le nom et
   au-dessus des quantités, en flex qui retourne à la ligne. */
.ch-drawer li.woocommerce-mini-cart-item > dl.variation { grid-column: 2; display: flex; flex-wrap: wrap; gap: 0 .35em; min-width: 0; margin: 4px 0 0; padding: 0; font-family: var(--font-body); font-size: var(--type-micro); line-height: 1.45; color: var(--brand-ink-soft); overflow-wrap: anywhere; }
.ch-drawer li.woocommerce-mini-cart-item > dl.variation dt { float: none; clear: none; min-width: 0; margin: 0; padding: 0; font-weight: 600; }
.ch-drawer li.woocommerce-mini-cart-item > dl.variation dd { min-width: 0; margin: 0; padding: 0; }
.ch-drawer li.woocommerce-mini-cart-item > dl.variation dd p { margin: 0; }
/* quantités pilotées (filtre child) : − n + à gauche, prix de ligne à
   droite ; une pièce unique s'annonce comme telle, sans steppers */
.ch-drawer .ch-qty, .ch-drawer .ch-qty-fixe { grid-column: 2; display: flex; align-items: center; gap: 10px; font-family: var(--font-data); font-size: var(--type-micro); color: var(--brand-ink-soft); }
.ch-drawer .ch-qty-btn { display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; padding: 0; background: transparent; border: 1px solid var(--brand-line); border-radius: 50%; color: var(--brand-ink); font-size: var(--type-caption); line-height: 1; cursor: pointer; transition: border-color .18s, color .18s; }
.ch-drawer .ch-qty-btn:hover:not(:disabled), .ch-drawer .ch-qty-btn:focus:not(:disabled), .ch-drawer .ch-qty-btn:active:not(:disabled) { border-color: var(--accent); color: var(--accent-strong); background: transparent; box-shadow: none; }
.ch-drawer .ch-qty-btn:focus-visible { box-shadow: var(--focus-ring); }
.ch-drawer .ch-qty-btn:disabled { opacity: .35; cursor: default; }
.ch-drawer .ch-qty-n { min-width: 18px; text-align: center; font-size: var(--type-caption); color: var(--brand-ink); }
.ch-drawer .ch-qty-prix { margin-left: auto; font-weight: 600; color: var(--price-ink); }
.ch-drawer .ch-qty-prix .woocommerce-Price-amount { font-family: var(--font-data); }
/* « la suite du run » : l'upsell entre la liste et le sous-total (le
   hook Woo le rend après le total, l'ordre flex le remonte — les
   enfants du flex portent chacun leur ordre explicite ci-dessous) */
.ch-drawer .ch-ship { order: 1; }
.ch-drawer ul.woocommerce-mini-cart { order: 2; }
.ch-drawer .ch-run { order: 3; }
.ch-drawer .woocommerce-mini-cart__total { order: 4; }
.ch-drawer .woocommerce-mini-cart__buttons { order: 5; }
.ch-drawer .ch-drawer-lien-panier { order: 6; }
.ch-drawer .ch-run { flex: 0 0 auto; margin: 12px 24px 0; padding: 12px 14px 6px; background: var(--brand-paper); border: 1px solid var(--brand-line); border-radius: var(--radius-m); }
.ch-drawer .ch-run-titre { margin: 0 0 4px; font-size: var(--type-micro); font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--brand-ink-soft); }
.ch-drawer .ch-run ul { list-style: none; margin: 0; padding: 0; }
.ch-drawer .ch-run li { display: grid; grid-template-columns: 34px minmax(0, 1fr) 30px; gap: 10px; align-items: center; padding: 8px 0; }
.ch-drawer .ch-run li + li { border-top: 1px solid var(--brand-line); }
/* Boîte de couverture FIXE (34×51, ratio comic) : une image cassée
   n'étire jamais la rangée, le texte alternatif reste dans la boîte. */
.ch-drawer .ch-run-cover { display: block; width: 34px; height: 51px; overflow: hidden; border-radius: var(--radius-s); border: 1px solid var(--brand-line); }
.ch-drawer .ch-run-cover img { width: 100%; height: 100%; object-fit: cover; border: 0; }
.ch-drawer .ch-run-infos { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ch-drawer .ch-run-infos > a { font-size: var(--type-micro); font-weight: 600; color: var(--brand-cube-deep); line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.ch-drawer .ch-run-prix { font-family: var(--font-data); font-size: var(--type-micro); font-weight: 600; color: var(--price-ink); }
.ch-drawer .ch-run-add { display: flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 50%; background: var(--cta-bg); color: var(--cta-text); font-size: var(--type-caption); font-weight: 600; line-height: 1; box-shadow: var(--shadow-cta); transition: background var(--t-quick) var(--ease-cube); }
.ch-drawer .ch-run-add:hover { background: var(--cta-bg-hover); }
.ch-drawer .ch-run-add.loading { opacity: .5; pointer-events: none; }
/* « Complétez votre run » : deux suggestions sur ordinateur, une seule
   sur mobile (à 390px, la seconde poussait le sous-total et le bouton
   Commander hors de l'écran). Le HTML garde les deux et le point de
   rupture du chrome (680px) masque la seconde : le tiroir est servi depuis
   le cache de page puis rafraîchi par les fragments, une détection serveur
   du mobile y serait fausse. `display:none` sort aussi la rangée de l'ordre
   de tabulation. */
@media (max-width: 680px) {
  .ch-drawer .ch-run li:nth-child(n + 2) { display: none; }
}

/* Pied ancré : sous-total et bouton Commander, bordés du filet, toujours
   visibles. */
.ch-drawer .woocommerce-mini-cart__total { flex: 0 0 auto; display: flex; justify-content: space-between; align-items: baseline; margin: 0; padding: 16px 24px 0; border-top: 1px solid var(--brand-line); font-size: var(--type-caption); color: var(--brand-ink); }
.ch-drawer .woocommerce-mini-cart__total .woocommerce-Price-amount { font-family: var(--font-data); font-size: var(--type-price-s); font-weight: 600; color: var(--price-ink); }
/* La mention PayPal « payez en 4 fois » sort du tiroir, et de lui seul :
   elle reste sur la fiche produit, la page panier et la commande. Le
   réglage natif de l'extension (Pay Later Message → Mini Cart) ne suffit
   pas : son script instancie le message dès que
   `.woocommerce-mini-cart__total` existe dans la page, puis le rend dans ce
   sous-total (marqueur `data-pp-id` sur le <p>, nœud
   `span[id^="zoid-paypal-message-"]` dedans). On masque ce seul nœud. */
.ch-drawer .woocommerce-mini-cart__total > span[id^="zoid-paypal-message-"],
.ch-drawer .wc-ppcp-minicart-msg__container,
.ch-drawer #wc-ppcp-minicart-msg { display: none !important; }
.ch-drawer .woocommerce-mini-cart__buttons { flex: 0 0 auto; display: flex; flex-direction: column; gap: 0; margin: 0; padding: 14px 24px 4px; }
/* un seul geste fort : Commander = l'adjudication (grammaire du .cta) */
.ch-drawer .woocommerce-mini-cart__buttons a.button.checkout { display: inline-flex; align-items: center; justify-content: center; width: 100%; background: var(--cta-bg); color: var(--cta-text); border: 0; border-radius: var(--radius-m); font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .04em; text-transform: uppercase; box-shadow: var(--shadow-cta); padding: 15px 22px; transition: background var(--t-quick) var(--ease-cube); }
.ch-drawer .woocommerce-mini-cart__buttons a.button.checkout:hover { background: var(--cta-bg-hover); }
.ch-drawer .ch-drawer-lien-panier { display: block; flex: 0 0 auto; text-align: center; padding: 0 24px 18px; font-size: var(--type-micro); color: var(--brand-ink-soft); text-decoration: underline; text-underline-offset: 3px; }
.ch-drawer .ch-drawer-lien-panier:hover { color: var(--brand-cube); }
.ch-drawer .woocommerce-mini-cart__empty-message { padding: 26px 24px; text-align: center; font-size: var(--type-caption); color: var(--brand-ink-soft); }
/* mise à jour en vol : le contenu s'estompe, aucun clic ne double */
.ch-drawer.ch-busy .widget_shopping_cart_content { opacity: .55; pointer-events: none; transition: opacity .15s; }

/* ---------- VERROU DU TIROIR ---------- */
/* Le tiroir vit dans le footer : sur les gabarits Woo, l'ancêtre
   .woocommerce arme les règles du parent ET de Woo core (croix rouge
   à !important, retraits de product_list_widget), invisibles sur les
   vitrines — d'où « deux paniers selon la page ». Ce bloc scelle les
   propriétés contestées à l'ID (1,x,x) : aucune chaîne de classes ne
   passera au-dessus, le tiroir a UN visage. Les !important répondent
   à ceux de Woo core, ils ne s'étendent pas au-delà. */
#chDrawer ul.woocommerce-mini-cart { list-style: none !important; margin: 0 !important; padding: 12px 24px 12px !important; }
#chDrawer li.woocommerce-mini-cart-item { list-style: none !important; margin: 0 !important; padding: 16px 0 !important; border-bottom: 1px solid var(--brand-line); }
#chDrawer li.woocommerce-mini-cart-item img { float: none !important; width: 58px !important; height: 87px !important; margin: 0 !important; }
#chDrawer li.woocommerce-mini-cart-item a.remove { color: var(--brand-ink-soft) !important; background: transparent !important; width: 26px !important; height: 26px !important; font-size: var(--type-body) !important; line-height: 1 !important; border: 1px solid var(--brand-line) !important; border-radius: 50% !important; }
#chDrawer li.woocommerce-mini-cart-item a.remove:hover { color: var(--state-alert) !important; border-color: var(--state-alert) !important; background: transparent !important; }

/* ---------- BANDEAU PROMO (store notice WooCommerce) ---------- */
/* Bandeau fin STATIQUE au-dessus de l'en-tête (rendu au wp_body_open du
   thème enfant), nuit et or, quel que soit le placement réglé côté Kadence
   (son placement fixé en bas est neutralisé). Retiré du tunnel par un
   filtre du thème enfant. */
/* !important assumés : le CSS dynamique Kadence (customizer) passe après
   les feuilles du child et peint position + fond, il faut le gagner.
   Fixé en haut, hauteur mesurée par chrome.js (--ch-notice-h) : le
   header et le flux descendent d'autant, rien n'est recouvert. */
/* spécificité (0,2,1) assumée : la règle « placement bottom » de Kadence
   (.kadence-store-notice-placement-bottom .woocommerce-store-notice)
   porte top:auto !important à (0,2,0), il faut la battre */
/* Bande OR, texte NUIT : l'or tranche net au-dessus de la bande nuit de
   l'en-tête (contraste 10.8:1). */
/* Police de texte imposée (le bandeau héritait de la police condensée
   des titres, illisible en petit corps) : Inter 600, corps 14px ; mobile
   resserré (padding + Ignorer). */
body .woocommerce-store-notice.demo_store { position: fixed !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: auto !important; z-index: 1010; display: block; margin: 0; padding: 9px 20px; background: var(--brand-gold) !important; color: var(--brand-night) !important; font-family: var(--font-body); font-size: var(--type-caption); font-weight: 600; letter-spacing: 0; text-transform: none; text-align: center; line-height: 1.45; box-shadow: none; }
body.admin-bar .woocommerce-store-notice.demo_store { top: 32px !important; }
@media (max-width: 782px) { body.admin-bar .woocommerce-store-notice.demo_store { top: 46px !important; } }
body .woocommerce-store-notice.demo_store .woocommerce-store-notice__dismiss-link { color: var(--brand-night) !important; float: none; display: inline-block; margin: 0 0 0 14px; padding: 2px 12px; border: 1px solid var(--brand-night); border-radius: var(--radius-s); font-family: var(--font-body); font-size: var(--type-caption); font-weight: 600; text-transform: none; letter-spacing: 0; text-decoration: none; white-space: nowrap; transition: background .18s; }
@media (max-width: 680px) {
  body .woocommerce-store-notice.demo_store { padding: 7px 14px; line-height: 1.4; }
  /* Padding vertical 4px : à 390px le bouton « Ignorer » garde 24px de
   zone de touche. */
  body .woocommerce-store-notice.demo_store .woocommerce-store-notice__dismiss-link { font-size: var(--type-micro); padding: 4px 10px; margin-left: 10px; }
}
body .woocommerce-store-notice.demo_store .woocommerce-store-notice__dismiss-link:hover { background: var(--brand-gold-deep); }
body.kadence-store-notice-placement-bottom { padding-bottom: 0; }

/* ---------- notices WooCommerce (message / info / erreur) ---------- */
/* le bleu brut du thème parent sort du tunnel : chip newsprint à filet
   or (le langage des encarts du DS), l'erreur parle alerte. Le bouton
   embarqué (« Voir le panier ») = secondaire du DS. */
body .woocommerce-message,
body .woocommerce-info { display: flex; align-items: center; justify-content: space-between; gap: 14px; background: var(--brand-newsprint); border: 1px solid var(--brand-line); border-left: 3px solid var(--brand-gold); border-radius: var(--radius-m); color: var(--brand-ink); font-size: var(--type-caption); padding: 12px 16px; margin: 0 0 14px; }
body .woocommerce-error { background: var(--brand-newsprint); border: 1px solid var(--brand-line); border-left: 3px solid var(--state-alert); border-radius: var(--radius-m); color: var(--brand-ink); font-size: var(--type-caption); padding: 12px 16px; margin: 0 0 14px; }
body .woocommerce-error li { margin: 4px 0; }
body .woocommerce-message a.button,
body .woocommerce-info a.button { order: 2; flex: 0 0 auto; background: var(--surface-raised); color: var(--accent-strong); border: 1.5px solid var(--accent); border-radius: var(--radius-m); padding: 8px 16px; font-weight: 600; font-size: var(--type-micro); transition: background var(--t-quick) var(--ease-cube); }
body .woocommerce-message a.button:hover,
body .woocommerce-info a.button:hover { background: var(--veil-accent); }

/* ---------- FOOTER V2 ---------- */
.cube-foot { background: var(--brand-footer-night); color: var(--brand-glow); }
.cf-reassure { border-bottom: 1px solid var(--border-accent-night); }
.cf-reassure .wrap { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; padding-top: 22px; padding-bottom: 22px; }
.cf-re { display: flex; align-items: center; justify-content: center; gap: 10px; font-size: var(--type-micro); color: var(--brand-glow); }
.cf-re svg { color: var(--icon-inverse); flex: 0 0 auto; }
.cf-main { padding: 54px 0 42px; }
.cf-grid { display: grid; grid-template-columns: 1.6fr 1fr 1fr 1.4fr; gap: 40px; }
/* Le pied porte le logo empilé complet (badge CGC intégré, ratio 0,65:1).
   90px de large → ~138px de haut. */
.cf-logo img { width: 90px; max-width: 100%; height: auto; }
.cf-tag { color: var(--brand-dusk); font-size: var(--type-micro); line-height: 1.6; margin: 14px 0 18px; max-width: 36ch; }
.cf-rate { font-size: var(--type-micro); color: var(--brand-glow); }
.cf-rate b { color: var(--brand-gold); font-size: var(--type-caption); }
.cf-rate .stars { color: var(--brand-gold-deep); letter-spacing: 2px; }
.cf-grid h4 { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .06em; color: var(--text-inverse-strong); margin-bottom: 16px; text-transform: uppercase; }
/* Les colonnes de liens sont des menus WordPress (ul/li). */
.cf-col ul { list-style: none; margin: 0; padding: 0; }
/* :not(.btn-ico) : les carrés réseaux sociaux vivent dans la colonne
   adresse ; la règle générique des liens de colonne (display block,
   padding) déformait le composant (0-1-1 bat 0-1-0). */
.cf-col a:not(.btn-ico) { display: block; color: var(--brand-dusk); font-size: var(--type-caption); padding: 6px 0; transition: color .18s, padding-left .18s; }
.cf-col a:not(.btn-ico):hover { color: var(--text-inverse-strong); padding-left: 4px; }
/* Classe posée sur le <li> du menu : spécificité (0,3,1), sans !important. */
.cf-col li.cf-col-cgc > a { color: var(--brand-gold); font-weight: 700; }
.cf-col li.cf-col-cgc > a:hover { color: var(--brand-cube-light); }
.cf-addr, .cf-hours { font-size: var(--type-micro); line-height: 1.7; color: var(--brand-dusk); margin-bottom: 14px; }
.cf-addr strong { color: var(--text-inverse-strong); }
/* les icônes RS = composant .btn-ico en contexte nuit (data-theme posé
   au markup) ; le conteneur ne garde que la mise en rang */
.cf-social { display: flex; gap: 10px; margin-top: 6px; }
.cf-legal { border-top: 1px solid var(--border-accent-night); }
.cf-legal .wrap { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-top: 18px; padding-bottom: 18px; flex-wrap: wrap; }
.cf-legal span { font-size: var(--type-micro); color: var(--brand-dusk); }
.cf-legal span a { color: var(--brand-cube-light); }
.cf-legal nav ul { display: flex; gap: 20px; flex-wrap: wrap; list-style: none; margin: 0; padding: 0; }
.cf-legal nav a { font-size: var(--type-micro); color: var(--brand-dusk); transition: color .18s; }
.cf-legal nav a:hover { color: var(--text-inverse-strong); }

.ch-icn svg, .ch-burger svg, .ch-sub-toggle svg, .ch-drawer-close svg { flex: 0 0 auto; }

/* ---------- accessibilité : lien d'évitement ---------- */
.skip-link { position: absolute; top: -100px; left: 16px; z-index: 1200; padding: 12px 18px; background: var(--brand-midnight); color: var(--text-inverse-strong); border-radius: var(--radius-m); font-weight: 600; }
.skip-link:focus { top: calc(12px + var(--ch-head-top)); }

/* ---------- responsive du chrome ---------- */
@media (max-width: 1000px) {
  .cf-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 980px) {
  .ch-nav { display: none; }
  .ch-burger { display: flex; }
}
@media (max-width: 880px) {
  .cf-reassure .wrap { grid-template-columns: 1fr 1fr; gap: 14px; }
}
@media (max-width: 680px) {
  .cf-grid { grid-template-columns: 1fr; gap: 28px; }
  .cf-legal .wrap { flex-direction: column; align-items: flex-start; }
  /* Mobile : le logo empilé, réduit à la barre de 64px. */
  .cube-head .ch-logo img { height: 48px; }
  /* Place pour le logo : boîtes d'action 36px (pictogramme 20px
   inchangé), espacements et gouttières au plus juste, sans quoi le menu
   burger sortait de l'écran à 390px. */
  .cube-head > .wrap { gap: 12px; padding-left: 14px; padding-right: 14px; }
  .cube-head .ch-icn { width: 36px; height: 36px; }
  .cube-head .ch-burger { width: 36px; height: 36px; }
  .cube-head .ch-head-actions { gap: 3px; }
}
@media (max-width: 400px) {
  /* Très petits écrans (360-390px) : un cran plus serré (313/317px). */
  .cube-head > .wrap { gap: 8px; }
  .cube-head .ch-icn { width: 34px; height: 34px; }
  .cube-head .ch-burger { width: 34px; height: 34px; }
  .cube-head .ch-head-actions { gap: 2px; }
}
@media (max-width: 520px) {
  .cf-reassure .wrap { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------
   [lot 9 · item 7 · séance Bruno 21/08]
   Le cœur des favoris passe de l'icône par défaut du plugin à
   celle de la DA du site.

   CE QUI ÉTAIT LÀ. TI WooCommerce Wishlist 2.11.1 dessine son cœur
   avec une POLICE D'ICÔNES : `tinvwl-webfont`, un glyphe posé en
   `content: "\e909"` sur `.tinvwl-icon-heart-plus::before` (relevé au
   navigateur : `font-family: tinvwl-webfont`, `font-size: 20px`). Un
   cœur bombé, plein, avec un « + » collé — étranger au trait fin et
   régulier des icônes du site.

   CE QUI LE REMPLACE. Le tracé de cœur CANONIQUE du thème, celui aussi
   servi par le header (`header.php`, icône Favoris), le menu du compte
   (`inc/compte.php`, entrée `wishlist`) et la page Favoris vide
   (`inc/wishlist.php`) — même `viewBox 0 0 24 24`, même `fill: none`,
   même trait. Une seule et même main sur tout le site.

   [lot 9 · item 7-bis · retour Bruno via Julien, 26/08] Ce tracé canonique
   a lui-même changé. L'ancien était dessiné à main levée et n'était pas
   symétrique — lobe gauche plus petit et plus bas, échancrure et pointe
   décalées à gauche de l'axe médian (constat 07bis-traces-avant-apres.png,
   axe posé sur les deux tracés). Bruno le trouvait « bizarre et déformé »,
   et il l'était : c'est le cœur Lucide « heart » (licence MIT) qui prend
   sa place, aux QUATRE foyers en même temps, pour que « une seule main »
   reste vrai. `stroke-linejoin='round'` dans les masques n'est pas
   décoratif : en jointure miter, le sommet bas de ce tracé sort en pointe
   acérée (constat 07bis-essai-jointures.png).

   COMMENT. `mask-image` sur un SVG en data-URI, pas `content: url(…)` :
   le masque laisse `background-color: currentColor` peindre l'icône, donc
   elle suit la couleur de son contexte — dont l'or de l'état « déjà en
   favori » que `sections/single-product.css` (l. 130) pose déjà sur
   `.tinvwl-product-in-list`. Un `content: url()` aurait figé la couleur
   dans le fichier et il aurait fallu deux images.

   SPÉCIFICITÉ. La règle du plugin est en (0,3,1)
   (`.tinv-wishlist .tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus::before`).
   Le sélecteur ci-dessous ajoute le type `a` → (0,3,2) : il gagne même si
   l'ordre des feuilles change (aujourd'hui le paquet du child est en
   position 5, le plugin en 3 — mais Kadence s'imprime encore après, en 7,
   et le dépôt connaît déjà ce piège, cf. chrome.css § .cube-head .ch-logo img).

   ÉTAT « EN FAVORI ». Le cœur devient PLEIN (le même tracé, rempli au
   lieu d'être tracé) : la différence se voit sans dépendre de la seule
   couleur — condition d'accessibilité, et lisible sur la bande nuit.
   ------------------------------------------------------------ */

.tinv-wishlist a.tinvwl_add_to_wishlist_button.tinvwl-icon-heart::before,
.tinv-wishlist a.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus::before,
.tinv-wishlist button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart::before,
.tinv-wishlist button.tinvwl_add_to_wishlist_button.tinvwl-icon-heart-plus::before {
  content: '';
  display: inline-block;
  width: 20px;
  height: 20px;
  vertical-align: -4px;
  background-color: currentColor;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z'/%3E%3C/svg%3E");
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}

/* Déjà en favori : le même cœur, plein. */
.tinv-wishlist a.tinvwl_add_to_wishlist_button.tinvwl-product-in-list::before,
.tinv-wishlist button.tinvwl_add_to_wishlist_button.tinvwl-product-in-list::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23000' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23000' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z'/%3E%3C/svg%3E");
}

/* ------------------------------------------------------------------
   TUNNEL (F-bis v2, transport du 11/07/2026) — l'échafaudage des 3
   maquettes gatées (checkout.html, panier.html, confirmation.html),
   UNE copie pour les 3 vues (anti-cicatrice V2).
   Transport VERBATIM de maquettes/assets/tunnel.css + des blocs de
   page .pan- (panier.html <style>) et .cfm- (confirmation.html
   <style>). Composants consommés (nightcard, trustrow, cta, btn-2nd,
   news) : le registre, enqueue par functions.php.
   2 adaptations de plomberie documentées (les seules) :
   - .cko-head : top 0 → var(--ch-head-top, 0px) (barre admin WP) ;
   - .cko-side : le sticky ajoute var(--ch-head-top, 0px).
   Le mariage avec le markup RÉEL de WooCommerce (form-row, payment,
   notices…) vit dans tunnel-woo.css, l'adaptateur (motif
   facet-sf.css : child seulement, jamais au registre).
   ------------------------------------------------------------------ */

/* socle : chrome.css (.wrap) · nightcard, trustrow, cta, btn-2nd :
   registre. Ci-dessous : le SEUL échafaudage de page (mise en page du
   checkout), préfixé .cko-, zéro CSS de composant. 100 % tokens (le
   64px = hauteur de la barre DU TUNNEL, chrome allégé : constante
   propre à ce gabarit, indépendante de --ch-head-h, la barre de la
   vitrine, passée à 90px le 30/07 pour son lockup empilé). */

/* ---------- sticky footer du tunnel (retour de gate F-ter-a 12/07) ----
   Les vues COURTES du tunnel (vérification d'e-mail invité de Woo,
   commande invalide, panier vide) laissaient le pied de page flotter à
   mi-écran : le body devient la colonne, le main pousse le pied en bas.
   100dvh par-dessus 100vh : les barres des navigateurs mobiles. */
body.woocommerce-cart, body.woocommerce-checkout { display: flex; flex-direction: column; min-height: 100vh; min-height: 100dvh; }
body.woocommerce-cart .cko-head, body.woocommerce-checkout .cko-head,
body.woocommerce-cart .cko-foot, body.woocommerce-checkout .cko-foot { flex: 0 0 auto; }
body.woocommerce-cart .cko-main, body.woocommerce-checkout .cko-main { flex: 1 0 auto; }

/* ---------- chrome du tunnel : barre nuit allégée ---------- */
/* [retour Julien 30/07] barre élargie 64 → 84px pour que le logo respire */
.cko-head { position: sticky; top: var(--ch-head-top, 0px); z-index: 40; height: 84px; background: var(--brand-band-night); }
.cko-head::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: var(--brand-giltline); opacity: .6; }
.cko-head-in { position: relative; display: flex; align-items: center; justify-content: space-between; height: 100%; }
.cko-back { display: inline-flex; align-items: center; gap: 8px; font-size: var(--type-caption); font-weight: 600; color: var(--brand-glow); }
.cko-back:hover { color: var(--brand-cube-light); }
.cko-logo { position: absolute; left: 50%; transform: translateX(-50%); display: inline-flex; align-items: center; gap: 10px; }
/* [décision Julien 30/07, définitive] le même lockup empilé que partout ;
   64px dans la barre de 84 (retour de gate : « un peu plus gros ») */
.cko-logo img { height: 64px; width: auto; }
.cko-secure { display: inline-flex; align-items: center; gap: 7px; font-family: var(--font-data); font-size: var(--type-micro); letter-spacing: .04em; color: var(--brand-dusk); }
.cko-secure svg { color: var(--brand-gold); }

/* ---------- en-tête de page : titre, réassurance, stepper ---------- */
.cko-entete { text-align: center; padding: 42px 0 34px; }
.cko-entete h1 { font-family: var(--font-display); font-weight: 400; font-size: var(--type-title); letter-spacing: .02em; text-transform: uppercase; color: var(--text-strong); margin-bottom: 6px; }
.cko-sous { font-size: var(--type-caption); color: var(--text-soft); margin-bottom: 18px; }
.cko-entete .trustrow { grid-template-columns: repeat(3, auto); margin-bottom: 26px; }
.cko-entete .trustrow svg { color: var(--brand-gold-deep); }

/* stepper : 3 temps reliés d'un filet, le temps courant en or */
.cko-steps { display: flex; justify-content: center; align-items: center; list-style: none; font-size: var(--type-micro); letter-spacing: .05em; text-transform: uppercase; font-weight: 600; color: var(--text-soft); }
.cko-steps li { display: flex; align-items: center; white-space: nowrap; }
.cko-steps li::before { content: ''; display: inline-block; width: 9px; height: 9px; border-radius: 50%; border: 2px solid var(--border-soft); margin-right: 8px; background: var(--surface-raised); }
.cko-steps li + li { margin-left: 14px; padding-left: 46px; background: linear-gradient(var(--border-soft), var(--border-soft)) no-repeat left center / 32px 1px; }
.cko-steps li.is-done::before { border-color: var(--brand-gold-deep); background: var(--brand-gold); }
.cko-steps li.is-active { color: var(--text-strong); }
.cko-steps li.is-active::before { border-color: var(--brand-gold-deep); background: var(--brand-gold); box-shadow: 0 0 0 3px var(--brand-gold-soft); }
.cko-steps li a { color: inherit; text-decoration: underline; text-underline-offset: 3px; }
.cko-steps li a:hover { color: var(--accent); }

/* ---------- la scène : parcours à gauche, bordereau à droite ---------- */
.cko-grid { display: grid; grid-template-columns: minmax(0, 1fr) 404px; column-gap: 56px; align-items: start; padding-bottom: var(--space-8); }

/* ---------- les 4 actes du parcours ---------- */
.cko-act + .cko-act { margin-top: var(--space-6); padding-top: var(--space-6); border-top: 1px solid var(--border-soft); }
.cko-act-head { display: flex; align-items: baseline; gap: 14px; margin-bottom: var(--space-5); }
.cko-num { font-family: var(--font-data); font-size: var(--type-data); font-weight: 500; color: var(--data-accent); }
.cko-act-head h2 { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .05em; text-transform: uppercase; color: var(--text-strong); }
.cko-act-aside { margin-left: auto; font-size: var(--type-micro); color: var(--text-soft); }
.cko-act-aside a, .cko-link { color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
.cko-act-aside a:hover, .cko-link:hover { color: var(--accent); }

/* champs : boîte 48px, filet discret, focus = sélection (bleu) */
.cko-field { display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }
.cko-field label { font-size: var(--type-caption); font-weight: 600; color: var(--text-strong); }
.cko-field label .opt { font-weight: 400; color: var(--text-soft); }
.cko-field input, .cko-field select, .cko-field textarea { width: 100%; background: var(--surface-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-s); padding: 13px 14px; font-family: var(--font-body); font-size: var(--type-caption); color: var(--text-body); }
.cko-field input::placeholder, .cko-field textarea::placeholder { color: var(--text-soft); opacity: .75; }
.cko-field input:focus, .cko-field select:focus, .cko-field textarea:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--veil-accent); outline: none; }
.cko-field select { appearance: none; background-image: linear-gradient(45deg, transparent 50%, var(--brand-ink-soft) 50%), linear-gradient(135deg, var(--brand-ink-soft) 50%, transparent 50%); background-position: calc(100% - 19px) 50%, calc(100% - 14px) 50%; background-size: 5px 5px; background-repeat: no-repeat; }
.cko-field textarea { min-height: 76px; resize: vertical; }
.cko-cols2 { display: grid; grid-template-columns: 1fr 1fr; column-gap: 14px; }
.cko-cols-cp { display: grid; grid-template-columns: 180px 1fr; column-gap: 14px; }
.cko-hint { font-size: var(--type-micro); color: var(--text-soft); margin: -6px 0 14px; }

/* ---------- RÉSERVE DE HAUTEUR DE LA RANGÉE E-MAIL — correctif F41-a
   (recette É5, S5 du 07/08/2026)

   LE DÉFAUT, mesuré : l'extension Cart Abandonment Recovery injecte SA
   mention RGPD (`#wcf_cf_gdpr_message_block`) en JS, après le champ
   `#billing_email`, 2,4 s après le chargement — pas de rendu serveur, pas
   de hook PHP (source lue : `cart-abandonment-tracking.js`,
   `_add_gdpr_message_section`). La rangée passe alors de 88 à 142 px et
   pousse tout l'acte 01, puis la page.

   La mention est une obligation légale activée volontairement
   (`wcf_ca_gdpr_status = on`) : elle reste. On lui réserve sa place, pour
   qu'elle s'installe sans rien déplacer.

   LES VALEURS sont mesurées, pas devinées : balayage de 16 largeurs sur le
   staging (_constats/recette-s5-mesure-rgpd2.mjs), hauteur finale de la
   rangée avec la mention en place. Elles tiennent à CE texte de mention :
   le modifier impose de rejouer le balayage.
     > 960 px : 142 px   ·   561-960 px : 139 px   ·   ≤ 560 px : 165 px
   Entre 768 et 960 px la mention tient sur 2 lignes (rangée 115 px) : la
   réserve y laisse ~24 px de mou, assumé — un mou ne décale rien. */
body.woocommerce-checkout #billing_email_field { min-height: 142px; }
@media (max-width: 960px) {
  body.woocommerce-checkout #billing_email_field { min-height: 139px; }
}
@media (max-width: 560px) {
  body.woocommerce-checkout #billing_email_field { min-height: 165px; }
}

/* cases à cocher discrètes (créer un compte, autre adresse) */
.cko-check { display: flex; align-items: baseline; gap: 9px; font-size: var(--type-caption); color: var(--text-body); margin: 4px 0 0; cursor: pointer; }
.cko-check input { accent-color: var(--accent); width: 15px; height: 15px; flex: 0 0 auto; transform: translateY(2px); }

/* ---------- rangées à choisir (transporteurs, paiement) :
   BLEU = je choisis. Une rangée = label entier cliquable. ---------- */
.cko-rows { display: flex; flex-direction: column; gap: 10px; }
.cko-row { display: grid; grid-template-columns: 16px minmax(0, 1fr) auto; column-gap: 12px; align-items: baseline; padding: 15px 16px; border: 1px solid var(--border-soft); border-radius: var(--radius-m); cursor: pointer; transition: border-color var(--t-quick) var(--ease-cube), background var(--t-quick) var(--ease-cube); }
.cko-row:hover { border-color: var(--accent); }
.cko-row:has(input:checked) { border-color: var(--accent); background: var(--veil-accent); }
.cko-row input { accent-color: var(--accent); width: 15px; height: 15px; transform: translateY(2px); }
.cko-row-name { font-size: var(--type-caption); font-weight: 600; color: var(--text-strong); }
.cko-row-desc { display: block; font-size: var(--type-micro); font-weight: 400; color: var(--text-soft); margin-top: 2px; }
.cko-row-prix { font-family: var(--font-data); font-size: var(--type-data); font-weight: 500; color: var(--text-body); font-feature-settings: "tnum"; white-space: nowrap; }
.cko-row-prix.is-libre { color: var(--stock-in); }
.cko-reco { display: inline-block; margin-left: 8px; padding: 2px 9px; border-radius: var(--radius-arc); background: var(--veil-accent); font-size: var(--type-micro); font-weight: 600; letter-spacing: .02em; color: var(--accent-strong); }

/* sous-volet d'une rangée choisie (point relais, champs carte) */
.cko-subrow { display: none; margin: -2px 0 0; padding: 14px 16px 4px 44px; }
.cko-row:has(input:checked) + .cko-subrow { display: block; }
.cko-relay { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; }
.cko-relay-etat { font-size: var(--type-micro); color: var(--text-soft); }
.cko-paybox { background: var(--brand-newsprint); border: 1px solid var(--brand-gold-line); border-radius: var(--radius-s); padding: 16px; max-width: 460px; }
.cko-paybox .cko-field:last-child, .cko-paybox .cko-cols2 .cko-field { margin-bottom: 0; }
.cko-paybox .cko-cols2 { margin-top: 14px; }

/* ---------- fin de parcours : privacy, CGV, l'adjudication ---------- */
.cko-fin { margin-top: var(--space-6); padding-top: var(--space-6); border-top: 1px solid var(--border-soft); }
.cko-privacy { font-size: var(--type-micro); color: var(--text-soft); line-height: 1.55; margin-bottom: 14px; }
.cko-privacy a { color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
.cko-cgv { margin-bottom: 18px; }
.cko-cgv a { color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
.cko-commander { width: 100%; }
.cko-pay-trust { display: flex; flex-direction: column; gap: 4px; margin-top: 14px; text-align: center; font-size: var(--type-micro); color: var(--text-soft); }
.cko-pay-trust svg { display: inline-block; vertical-align: -2px; margin-right: 4px; color: var(--brand-gold-deep); }

/* ---------- le bordereau d'adjudication (nightcard du registre) ---------- */
.cko-side { position: sticky; top: calc(64px + var(--space-5) + var(--ch-head-top, 0px)); }
.cko-side .nightcard { padding: var(--space-5); }
.cko-bord-head { display: flex; justify-content: space-between; align-items: baseline; position: relative; z-index: 1; margin-bottom: var(--space-2); }
.cko-bord-titre { font-size: var(--type-eyebrow); font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--text-soft); }
.cko-bord-count { font-family: var(--font-data); font-size: var(--type-micro); color: var(--text-soft); }
.cko-bord-items { position: relative; z-index: 1; list-style: none; }
.cko-item { display: grid; grid-template-columns: 44px minmax(0, 1fr) auto; column-gap: 12px; align-items: start; padding: 14px 0; border-bottom: 1px solid var(--border-soft); }
.cko-item-cover { width: 44px; aspect-ratio: 2 / 3; border-radius: var(--radius-s); overflow: hidden; border: 1px solid var(--border-soft); box-shadow: var(--shadow-soft); }
.cko-item-cover img { width: 100%; height: 100%; object-fit: cover; }
.cko-item-nom { font-size: var(--type-caption); font-weight: 600; line-height: 1.35; color: var(--text-strong); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.cko-item-meta { font-family: var(--font-data); font-size: var(--type-micro); letter-spacing: .02em; color: var(--data-accent); margin-top: 4px; }
.cko-item-meta .qte { color: var(--data-ink); }
.cko-item-prix { font-family: var(--font-data); font-size: var(--type-data); font-weight: 500; color: var(--price-ink); font-feature-settings: "tnum"; white-space: nowrap; padding-top: 2px; }
.cko-totaux { position: relative; z-index: 1; }
.cko-totaux > div { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 11px 0; border-bottom: 1px solid var(--border-soft); font-size: var(--type-caption); color: var(--text-body); }
.cko-totaux dd { font-family: var(--font-data); font-size: var(--type-data); font-weight: 500; color: var(--price-ink); font-feature-settings: "tnum"; }
/* mention non chiffrée dans une rangée de totaux (« à l'étape suivante ») */
.cko-totaux dd.cko-note { font-family: var(--font-body); font-size: var(--type-micro); font-weight: 400; color: var(--text-soft); }
.cko-totaux .cko-total { border-bottom: 0; padding: 16px 0 0; }
.cko-total dt { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .05em; text-transform: uppercase; color: var(--text-strong); }
.cko-total dd { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price); letter-spacing: .01em; color: var(--data-accent); }

/* code promo : sous le bordereau, sur papier — un choix, pas un achat */
.cko-promo { margin-top: var(--space-4); }
.cko-promo-label { display: block; font-size: var(--type-caption); font-weight: 600; color: var(--text-strong); margin-bottom: 6px; }
.cko-promo-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 10px; }
.cko-promo-row input { background: var(--surface-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-s); padding: 13px 14px; font-family: var(--font-body); font-size: var(--type-caption); color: var(--text-body); }
.cko-promo-row input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--veil-accent); outline: none; }

/* ---------- footer allégé du tunnel ---------- */
.cko-foot { margin-top: var(--space-7); background: var(--brand-midnight); position: relative; }
.cko-foot::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--brand-giltline); opacity: .6; }
.cko-foot-in { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 10px 24px; padding-top: 20px; padding-bottom: 20px; }
.cko-foot nav { display: flex; flex-wrap: wrap; gap: 8px 22px; font-size: var(--type-micro); }
.cko-foot nav a { color: var(--brand-dusk); }
.cko-foot nav a:hover { color: var(--brand-cube-light); }
.cko-copy { font-size: var(--type-micro); color: var(--brand-dusk); }

/* ---------- responsive ---------- */
@media (max-width: 960px) {
  .cko-grid { grid-template-columns: minmax(0, 1fr); }
  .cko-side { order: -1; position: static; margin-bottom: var(--space-6); }
  .cko-act-head { flex-wrap: wrap; }
  .cko-act-aside { margin-left: 0; flex-basis: 100%; }
}
@media (max-width: 560px) {
  .cko-entete { padding: 30px 0 26px; }
  .cko-entete .trustrow { grid-template-columns: 1fr; justify-items: center; row-gap: 8px; }
  /* plancher DS : jamais sous --type-micro (le 10px du child F-bis était
     une dérive) — on gagne la place sur les filets, pas sur la lisibilité */
  .cko-steps { letter-spacing: .03em; }
  .cko-steps li + li { margin-left: 6px; padding-left: 18px; background-size: 10px 1px; }
  .cko-cols2, .cko-cols-cp { grid-template-columns: 1fr; }
  .cko-back span { display: none; }
  .cko-secure em { display: none; }
  .cko-subrow { padding-left: 16px; }
  .cko-row-prix { justify-self: end; }
}

/* ==================================================================
   PANIER (.pan-) — bloc <style> de panier.html, transport verbatim.
   Échafaudage de page, zéro CSS de composant, 100 % tokens.
   ================================================================== */

/* ---------- la liste des pièces (plate, aux filets) ---------- */
.pan-items { list-style: none; border-top: 1px solid var(--border-soft); }
.pan-item { display: grid; grid-template-areas: "cover info qty prix suppr"; grid-template-columns: 72px minmax(0, 1fr) auto 90px 28px; column-gap: 18px; align-items: center; padding: 18px 0; border-bottom: 1px solid var(--border-soft); }
.pan-cover { grid-area: cover; width: 72px; aspect-ratio: 2 / 3; border-radius: var(--radius-s); overflow: hidden; border: 1px solid var(--border-soft); box-shadow: var(--shadow-soft); }
.pan-cover img { width: 100%; height: 100%; object-fit: cover; }
.pan-info { grid-area: info; min-width: 0; }
.pan-nom { display: block; font-size: var(--type-caption); font-weight: 600; line-height: 1.35; color: var(--text-strong); }
.pan-nom a { color: inherit; }
.pan-nom a:hover { color: var(--accent-strong); text-decoration: underline; text-underline-offset: 3px; }
.pan-meta { display: block; font-family: var(--font-data); font-size: var(--type-micro); letter-spacing: .02em; color: var(--data-accent); margin-top: 4px; }
.pan-meta .dispo { color: var(--stock-in); }

/* quantité : un choix → la voix bleue */
.pan-qty { grid-area: qty; display: inline-flex; align-items: center; border: 1px solid var(--border-soft); border-radius: var(--radius-m); overflow: hidden; }
.pan-qty button { width: 34px; height: 38px; background: none; border: 0; color: var(--accent-strong); font-size: var(--type-body); line-height: 1; cursor: pointer; transition: background var(--t-quick) var(--ease-cube); }
.pan-qty button:hover, .pan-qty button:focus, .pan-qty button:active { background: var(--veil-accent); color: var(--accent-strong); box-shadow: none; }
.pan-qty button:focus-visible { box-shadow: var(--focus-ring); }
.pan-qty output { min-width: 34px; text-align: center; font-family: var(--font-data); font-size: var(--type-data); color: var(--text-body); }
/* pièce unique (stock 1, le cas normal d'un back-issue) : pas de
   steppers inertes — la voix mono du tiroir (adaptation transport) */
.pan-qty-fixe { grid-area: qty; font-family: var(--font-data); font-size: var(--type-micro); color: var(--text-soft); }

.pan-prix { grid-area: prix; justify-self: end; font-family: var(--font-data); font-size: var(--type-data); font-weight: 500; color: var(--price-ink); font-feature-settings: "tnum"; white-space: nowrap; }
.pan-suppr { grid-area: suppr; justify-self: end; width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; background: none; border: 0; border-radius: var(--radius-s); color: var(--text-soft); cursor: pointer; transition: color var(--t-quick) var(--ease-cube), background var(--t-quick) var(--ease-cube); }
.pan-suppr:hover { color: var(--state-alert); background: var(--surface-page); }

.pan-continuer { display: inline-flex; align-items: center; gap: 8px; margin-top: 20px; font-size: var(--type-caption); font-weight: 600; color: var(--link); }
.pan-continuer:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }

/* ---------- bordereau : jauge livraison offerte + CTA ---------- */
.pan-livr { position: relative; z-index: 1; margin: var(--space-4) 0 var(--space-2); }
.pan-livr-txt { font-family: var(--font-data); font-size: var(--type-micro); letter-spacing: .02em; color: var(--text-soft); margin-bottom: 8px; }
.pan-livr-txt b { font-weight: 500; color: var(--data-accent); }
.pan-track { height: 6px; border-radius: var(--radius-arc); background: var(--surface-night-raised); border: 1px solid var(--border-soft); overflow: hidden; }
.pan-track i { display: block; height: 100%; border-radius: var(--radius-arc); background: var(--brand-gold); }
.pan-cmd { position: relative; z-index: 1; width: 100%; margin-top: var(--space-5); }

/* ---------- responsive panier ---------- */
@media (max-width: 960px) {
  /* au panier on vérifie d'abord ses pièces : liste avant bordereau */
  .pan-side { order: 0; margin: var(--space-6) 0 0; }
}
@media (max-width: 560px) {
  .pan-item { grid-template-areas: "cover info suppr" "cover qty prix"; grid-template-columns: 56px minmax(0, 1fr) auto; row-gap: 12px; align-items: start; }
  .pan-cover { width: 56px; }
  .pan-qty { align-self: center; }
  .pan-prix { align-self: center; }
}

/* ==================================================================
   CONFIRMATION (.cfm-) — bloc <style> de confirmation.html, transport
   verbatim. Échafaudage de page, zéro CSS de composant, 100 % tokens.
   ================================================================== */

/* ---------- en-tête réduit : le stepper seul (le héros parle) ---------- */
.cfm-entete { padding: 36px 0 30px; display: flex; justify-content: center; }

/* ---------- l'adjudication scellée (nightcard centrée) ---------- */
.cfm-hero .nightcard { padding: var(--space-7) var(--space-6); }
.cfm-covers { display: flex; justify-content: center; gap: 14px; margin-bottom: var(--space-5); }
.cfm-covers span { width: 56px; aspect-ratio: 2 / 3; border-radius: var(--radius-s); overflow: hidden; box-shadow: var(--shadow-showcase); }
.cfm-covers img { width: 100%; height: 100%; object-fit: cover; }
.cfm-meta { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; list-style: none; margin: 0 0 var(--space-6); text-align: left; }
.cfm-meta li { min-width: 0; background: var(--surface-night-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-m); padding: 12px 14px; }
.cfm-meta span { display: block; font-size: var(--type-micro); letter-spacing: .06em; text-transform: uppercase; color: var(--text-soft); margin-bottom: 4px; }
.cfm-meta strong { display: block; overflow-wrap: anywhere; font-family: var(--font-data); font-size: var(--type-caption); font-weight: 500; color: var(--text-strong); }
.cfm-meta .cfm-total strong { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .01em; color: var(--data-accent); }

/* ---------- sections papier : la suite, détails, adresses ---------- */
.cfm-sec { max-width: 760px; margin: 0 auto; padding: var(--space-7) 0 0; }
.cfm-sec-head { display: flex; align-items: baseline; gap: 14px; margin-bottom: var(--space-5); }
.cfm-sec-head h2 { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .05em; text-transform: uppercase; color: var(--text-strong); }
.cfm-fin { padding-bottom: var(--space-8); }

.cfm-suite { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-5); }
.cfm-step .cko-num { display: block; margin-bottom: 8px; }
/* typo gravée (retour de gate F-ter-a 12/07, motif pillar/pcard : sur
   WordPress le h3 recevait la Bebas condensée du parent — tout-caps
   14 px illisible) ; corps body = la voix des titres de carte (pillar) */
.cfm-step h3 { font-family: var(--font-body); font-size: var(--type-body); font-weight: 600; letter-spacing: 0; color: var(--text-strong); margin-bottom: 4px; }
.cfm-step p { font-size: var(--type-micro); line-height: 1.55; color: var(--text-soft); }

/* détails : les rangées de totaux du tunnel, sur papier */
.cfm-table .cko-total dd { color: var(--price-ink); }
.cfm-table dt .qte { font-family: var(--font-data); font-size: var(--type-micro); color: var(--text-soft); margin-left: 6px; }

.cfm-addr { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-5); }
.cfm-addr h3 { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .05em; text-transform: uppercase; color: var(--text-strong); margin-bottom: 12px; }
.cfm-addr address { border: 1px solid var(--border-soft); border-radius: var(--radius-m); padding: 16px 20px; font-style: normal; font-size: var(--type-caption); line-height: 1.7; color: var(--text-body); }

/* la newsletter clôt la page : le footer colle à la bande or */
body.woocommerce-order-received .cko-foot { margin-top: 0; }

/* ---------- responsive confirmation ---------- */
@media (max-width: 960px) {
  .cfm-meta { grid-template-columns: 1fr 1fr; }
  .cfm-suite { grid-template-columns: 1fr; }
  .cfm-addr { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
  .cfm-hero .nightcard { padding: var(--space-5) var(--space-4); }
  .cfm-meta { grid-template-columns: 1fr; }
  .cfm-covers span { width: 48px; }
}

/* ============================================================
   PANIER VIDE (15/07, retour de gate) — la scène .ch-cart-empty
   rendue par woocommerce/cart/cart-empty.php : même langue que
   l'état vide des favoris (.ch-wl-empty, wishlist.css), portes
   de sortie au lieu de l'impasse Woo. Le repli .cart-empty reste
   habillé par tunnel-woo.css (filet, plus jamais atteint).
   btn-blue / btn-2nd : famille toujours chargée (cta/btn). */
.ch-cart-empty { text-align: center; border: 1px dashed var(--border-strong); border-radius: var(--radius-l); padding: var(--space-8) var(--space-5); max-width: 620px; margin: var(--space-6) auto; }
.ch-cart-empty-ic { display: inline-grid; place-items: center; width: 64px; height: 64px; border-radius: var(--radius-arc); background: var(--veil-accent); color: var(--accent); margin-bottom: var(--space-4); }
.ch-cart-empty-t { font-family: var(--font-display); font-weight: 400; font-size: var(--type-title); letter-spacing: .02em; color: var(--text-strong); margin-bottom: var(--space-3); }
.ch-cart-empty-d { font-size: var(--type-body); line-height: 1.6; color: var(--text-soft); margin: 0 auto var(--space-6); max-width: 46ch; }
.ch-cart-doors { display: flex; flex-wrap: wrap; gap: var(--space-3); justify-content: center; }

/* ------------------------------------------------------------------
   TUNNEL — ADAPTATEUR WOO (F-bis v2, 11/07/2026). La grammaire de
   tunnel.css appliquée au markup RÉEL de WooCommerce et des plugins
   transporteurs (form-row, select2, payment, notices, order_details).
   Motif facet-sf.css : child seulement, jamais au registre — il style
   un markup tiers. Charge APRÈS tunnel.css.
   Sélecteurs préfixés body.woocommerce-* : la spécificité nécessaire
   contre Woo core et le parent (leçon « deux paniers » : l'ancêtre
   .woocommerce arme leurs règles sur les gabarits Woo).
   ------------------------------------------------------------------ */

/* ---------- neutralisations woocommerce-layout.css (Woo core) ----------
   Les classes body woocommerce-page/-checkout arment sur TOUTE la page
   les règles de layout du core (img height:auto, pourcentages flottés
   du panier, place_order flotté) : chaque pièce du tunnel qu'elles
   touchent est reprise ici à spécificité supérieure. */
body.woocommerce-page .cko-logo img,
body.woocommerce-checkout .cko-logo img { height: 64px; width: auto; max-width: none; }
body.woocommerce-page .cko-item-cover img,
body.woocommerce-checkout .cko-item-cover img,
body.woocommerce-page .pan-cover img,
body.woocommerce-checkout .cfm-covers img { height: 100%; }
body.woocommerce-cart .woocommerce-cart-form { width: 100%; float: none; }
body.woocommerce-cart .cart-collaterals { width: 100%; float: none; }
body.woocommerce-cart .cart-collaterals .cart_totals { width: 100%; float: none; }
/* le form du checkout reste UNE colonne : la mise en page 50/50 du
   parent ne décide de rien dans la scène cko-grid */
body.woocommerce-checkout form.checkout.cko-parcours { display: block; width: 100%; max-width: none; float: none; }
/* les rangées à choisir restent des grilles (le label:block des
   feuilles parent/core rend la main) */
body.woocommerce-checkout #cko-livraison label.cko-row,
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method > label { display: grid; }
/* les actes directement au form (03 livraison, 04 paiement) prennent
   leur filet : le motif .cko-act + .cko-act ne voit pas #customer_details */
body.woocommerce-checkout form.checkout.cko-parcours > .cko-act { margin-top: var(--space-6); padding-top: var(--space-6); border-top: 1px solid var(--border-soft); }
/* rangée CP 180px / Ville de la maquette, tenue en CSS sur les IDs :
   l'address-i18n de Woo redistribue les champs de locale dans le
   wrapper, un div d'échafaudage PHP ne survivrait pas */
body.woocommerce-checkout .woocommerce-billing-fields__field-wrapper,
body.woocommerce-checkout .woocommerce-shipping-fields__field-wrapper { display: grid; grid-template-columns: 180px minmax(0, 1fr); column-gap: 14px; }
body.woocommerce-checkout .woocommerce-billing-fields__field-wrapper > .form-row,
body.woocommerce-checkout .woocommerce-shipping-fields__field-wrapper > .form-row { grid-column: 1 / -1; }
body.woocommerce-checkout #billing_postcode_field,
body.woocommerce-checkout #shipping_postcode_field { grid-column: 1; }
body.woocommerce-checkout #billing_city_field,
body.woocommerce-checkout #shipping_city_field { grid-column: 2; }
@media (max-width: 560px) {
  body.woocommerce-checkout .woocommerce-billing-fields__field-wrapper,
  body.woocommerce-checkout .woocommerce-shipping-fields__field-wrapper { grid-template-columns: minmax(0, 1fr); }
  body.woocommerce-checkout #billing_postcode_field,
  body.woocommerce-checkout #shipping_postcode_field,
  body.woocommerce-checkout #billing_city_field,
  body.woocommerce-checkout #shipping_city_field { grid-column: 1; }
}

/* le body de la vitrine compense son header FIXE (padding-top
   --ch-head-h, chrome.css) : la barre du tunnel est STICKY, dans le flux — la
   compensation rendrait une bande blanche au-dessus (retour de gate
   11/07) */
body.woocommerce-cart,
body.woocommerce-checkout { padding-top: 0; }

/* ---------- peau de page : le tunnel vit sur le papier du site.
   !important assumé : le CSS dynamique du thème peint le fond après
   nous (réglages de page du clone). ---------- */
body.woocommerce-checkout,
body.woocommerce-checkout #inner-wrap,
body.woocommerce-checkout .site,
body.woocommerce-checkout .content-bg,
body.woocommerce-cart,
body.woocommerce-cart #inner-wrap,
body.woocommerce-cart .site,
body.woocommerce-cart .content-bg { background: var(--brand-paper) !important; }

/* ---------- CHECKOUT · champs Woo dans les actes ----------
   woocommerce_form_field rend <p class="form-row"><label>…<span
   class="woocommerce-input-wrapper"><input class="input-text">. On le
   fait parler .cko-field ; les moitiés flottées de Woo core
   (form-row-first/last 47 %) rendent la main aux grilles .cko-cols2. */
body.woocommerce-checkout .cko-parcours .form-row { display: flex; flex-direction: column; gap: 6px; margin: 0 0 14px; padding: 0; float: none; width: 100%; }
body.woocommerce-checkout .cko-parcours .form-row label { font-size: var(--type-caption); font-weight: 600; color: var(--text-strong); line-height: 1.4; }
body.woocommerce-checkout .cko-parcours .form-row label .optional { font-weight: 400; color: var(--text-soft); }
body.woocommerce-checkout .cko-parcours .form-row .woocommerce-input-wrapper { display: block; width: 100%; }
body.woocommerce-checkout .cko-parcours .form-row input.input-text,
body.woocommerce-checkout .cko-parcours .form-row textarea,
body.woocommerce-checkout .cko-parcours .form-row select { width: 100%; background: var(--surface-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-s); padding: 13px 14px; font-family: var(--font-body); font-size: var(--type-caption); color: var(--text-body); }
body.woocommerce-checkout .cko-parcours .form-row input.input-text::placeholder,
body.woocommerce-checkout .cko-parcours .form-row textarea::placeholder { color: var(--text-soft); opacity: .75; }
body.woocommerce-checkout .cko-parcours .form-row input.input-text:focus,
body.woocommerce-checkout .cko-parcours .form-row textarea:focus,
body.woocommerce-checkout .cko-parcours .form-row select:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--veil-accent); outline: none; }
body.woocommerce-checkout .cko-parcours .form-row textarea { min-height: 76px; resize: vertical; }
/* select2 (pays) : la même boîte 48px que les champs */
body.woocommerce-checkout .cko-parcours .select2-container .select2-selection--single { height: 48px; border: 1px solid var(--border-soft); border-radius: var(--radius-s); background: var(--surface-raised); }
body.woocommerce-checkout .cko-parcours .select2-selection--single .select2-selection__rendered { line-height: 46px; padding-left: 14px; font-size: var(--type-caption); color: var(--text-body); }
body.woocommerce-checkout .cko-parcours .select2-selection--single .select2-selection__arrow { height: 46px; }
/* validation : le filet parle l'alerte, jamais le vert */
body.woocommerce-checkout .cko-parcours .woocommerce-validated input.input-text,
body.woocommerce-checkout .cko-parcours .woocommerce-validated select,
body.woocommerce-checkout .cko-parcours .woocommerce-validated .select2-selection { border-color: var(--border-soft); }
body.woocommerce-checkout .cko-parcours .woocommerce-invalid input.input-text,
body.woocommerce-checkout .cko-parcours .woocommerce-invalid select,
body.woocommerce-checkout .cko-parcours .woocommerce-invalid .select2-selection { border-color: var(--state-alert); }
body.woocommerce-checkout .cko-parcours .required { color: var(--state-alert); text-decoration: none; }
/* cases à cocher Woo (créer un compte, autre adresse) : la voix cko-check */
body.woocommerce-checkout .cko-parcours .woocommerce-form__label-for-checkbox { display: flex; align-items: baseline; gap: 9px; font-size: var(--type-caption); font-weight: 400; color: var(--text-body); margin: 4px 0 0; cursor: pointer; }
body.woocommerce-checkout .cko-parcours .woocommerce-form__label-for-checkbox input[type='checkbox'] { accent-color: var(--accent); width: 15px; height: 15px; flex: 0 0 auto; transform: translateY(2px); }
body.woocommerce-checkout .cko-parcours .woocommerce-form__label-for-checkbox span { font-weight: 400; }
/* « Expédier à une adresse différente ? » : une simple option, pas un h3 */
body.woocommerce-checkout .cko-parcours h3#ship-to-different-address { font-family: var(--font-body); font-size: var(--type-caption); font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--text-body); margin: 4px 0 0; }

/* connexion de l'acte 01 (« Déjà client ? Se connecter ») : la MODAL
   du volet compte (12/07) a remplacé l'habillage sobre d'attente de
   F-bis v2 — composition dans compte.css (.mc-modal, une copie avec
   la page connexion), markup dans global/form-login.php, ouverture
   par tunnel.js. Ne restent ici que les mariages checkout : l'astérisque
   requis reste neutre dans la carte (le rouge Woo core parle ailleurs). */
body.woocommerce-checkout .mc-modal-card .required { color: inherit; border: 0; text-decoration: none; }
body.woocommerce-checkout .mc-modal-card form.login { border: 0; padding: 0; margin: 0; border-radius: 0; }
body.woocommerce-checkout .mc-modal-card .woocommerce-form-login__submit { float: none; margin-right: 0; }
/* la voix labeur centrée du submit vit désormais dans la base .btn-blue
   du registre (passe de cohérence 12/07) ; reste le mariage de l'œil du
   mot de passe, centré dans son champ */
body.woocommerce-checkout .mc-modal-card .password-input { position: relative; display: block; width: 100%; }
body.woocommerce-checkout .mc-modal-card .password-input input { padding-right: 44px; }
/* même zone de touche 24 px que sur le volet compte (F36, S5 du 07/08/2026) :
   c'est le même contrôle, dans la modale de connexion du checkout. */
body.woocommerce-checkout .mc-modal-card form .password-input .show-password-input { position: absolute; top: 50%; right: 13px; translate: 0 -50%; transform: none; display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; color: var(--text-soft); cursor: pointer; }

/* ---------- CHECKOUT · livraison (rendu child #cko-livraison) ----------
   Le renderer émet la grammaire cko-row nativement ; ici, seulement ce
   que les plugins transporteurs injectent (woocommerce_after_shipping_rate :
   bouton point relais, descriptions, relais choisi). */
#cko-livraison .cko-after { padding: 12px 16px 2px 44px; }
#cko-livraison .cko-after:empty { display: none; }
#cko-livraison .cko-after p, #cko-livraison .cko-after small, #cko-livraison .cko-after em,
#cko-livraison .cko-after .lpc_shipping_desc { display: block; font-size: var(--type-micro); font-style: normal; color: var(--text-soft); margin: 0 0 8px; }
#cko-livraison .cko-after button, #cko-livraison .cko-after .button, #cko-livraison .cko-after a.button,
#cko-livraison .cko-after input[type='button'] { display: inline-flex; align-items: center; background: var(--surface-raised); color: var(--accent-strong); border: 1.5px solid var(--accent); border-radius: var(--radius-m); padding: 9px 16px; font-family: var(--font-body); font-weight: 600; font-size: var(--type-caption); text-transform: none; letter-spacing: 0; box-shadow: none; cursor: pointer; transition: background var(--t-quick) var(--ease-cube); }
#cko-livraison .cko-after button:hover, #cko-livraison .cko-after .button:hover { background: var(--veil-accent); color: var(--accent-strong); }
/* rangée sans radio (zone à méthode unique) : la colonne puce s'efface */
#cko-livraison .cko-row.is-seule { grid-template-columns: minmax(0, 1fr) auto; cursor: default; }
/* sortie des plugins transporteurs après les rangées (sélecteur de
   point relais Mondial Relay : em d'état + lien modal) */
#cko-livraison .cko-relais-out { font-size: var(--type-micro); color: var(--text-soft); }
/* le wrapper .mrwp du plugin (masqué au chargement, montré par son JS quand Mondial Relay est coché)
   porte l'espace : bloc caché = zéro creux sous les rangées (constat J0 02/09) */
#cko-livraison .cko-relais-out .mrwp { padding: 14px 4px 0; }
#cko-livraison .cko-relais-out br { display: none; }
#cko-livraison .cko-relais-out em, #cko-livraison .cko-relais-out .parcel_shop_info { display: block; font-style: normal; font-size: var(--type-micro); color: var(--text-soft); margin: 2px 0 8px; }
/* le bouton du plugin = la recette btn-2nd du registre, à l'identique
   (retour de gate 11/07 : 2 voix de boutons, pas 4) */
#cko-livraison .cko-relais-out a { display: inline-flex; align-items: center; justify-content: center; background: var(--surface-raised); color: var(--accent-strong); border: 1.5px solid var(--accent); border-radius: var(--radius-m); padding: 14px 24px; font-family: var(--font-body); font-weight: 600; font-size: var(--type-caption); letter-spacing: 0; text-transform: none; text-decoration: none; box-shadow: none; cursor: pointer; transition: background var(--t-quick) var(--ease-cube); }
#cko-livraison .cko-relais-out a:hover { background: var(--veil-accent); color: var(--accent-strong); }

/* ---------- CHECKOUT · paiement (markup natif payment.php) ----------
   Les recettes Kadence sur ces rangées arment des sélecteurs à état
   (input:checked+label, li:first-child:last-child>label border:0
   !important pour la passerelle unique) : les nôtres les miroitent,
   préfixe body en plus — les 2 !important répondent aux siens. */
body.woocommerce-checkout #payment { background: transparent; }
body.woocommerce-checkout #payment ul.wc_payment_methods { display: flex; flex-direction: column; gap: 10px; margin: 0; padding: 0; list-style: none; border: 0; background: transparent; }
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method { display: block; padding: 0; margin: 0; background: transparent; }
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method > input.input-radio { position: absolute; opacity: 0; pointer-events: none; }
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method > label { display: grid; grid-template-columns: 16px minmax(0, 1fr) auto; column-gap: 12px; align-items: baseline; margin: 0; padding: 15px 16px; border: 1px solid var(--border-soft) !important; border-radius: var(--radius-m); cursor: pointer; font-size: var(--type-caption); font-weight: 600; color: var(--text-strong); background: transparent; transition: border-color var(--t-quick) var(--ease-cube), background var(--t-quick) var(--ease-cube); }
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method > label::before { content: ''; display: block; width: 15px; height: 15px; border: 2px solid var(--border-soft); border-radius: 50%; background: var(--surface-raised); margin: 0; transform: translateY(2px); }
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method > label:hover { border-color: var(--accent) !important; background: transparent; }
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method input[type='radio']:first-child:checked + label { border-color: var(--accent) !important; background: var(--veil-accent); }
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method input[type='radio']:first-child:checked + label::before { border-color: var(--accent); background: var(--accent); box-shadow: inset 0 0 0 3px var(--surface-raised); }
body.woocommerce-checkout #payment ul.wc_payment_methods li.wc_payment_method > label img { max-height: 20px; width: auto; justify-self: end; }
/* le volet du moyen choisi (description COD, champs CB) : la boîte papier.
   width: auto obligatoire : le parent impose width: 100 %, qui cumulé au
   margin-left de 28 px déborde du viewport mobile (constat 14/07) */
body.woocommerce-checkout #payment div.payment_box { background: var(--brand-newsprint); border: 1px solid var(--brand-gold-line); border-radius: var(--radius-s); padding: 12px 16px; margin: 8px 0 0 28px; width: auto; font-size: var(--type-micro); color: var(--text-soft); }
body.woocommerce-checkout #payment div.payment_box::before { display: none; }

/* fin de parcours : privacy, CGV, Commander (place-order natif) */
body.woocommerce-checkout #payment .place-order { margin-top: var(--space-6); padding: var(--space-6) 0 0; border-top: 1px solid var(--border-soft); float: none; width: 100%; }
body.woocommerce-checkout #payment .woocommerce-terms-and-conditions-wrapper,
body.woocommerce-checkout #payment .wc-terms-and-conditions { float: none; width: 100%; padding: 0; }
body.woocommerce-checkout .woocommerce-privacy-policy-text p { font-size: var(--type-micro); color: var(--text-soft); line-height: 1.55; margin-bottom: 14px; }
body.woocommerce-checkout .woocommerce-privacy-policy-text a,
body.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper a { color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
body.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper .woocommerce-form__label-for-checkbox { display: flex; align-items: baseline; gap: 9px; font-size: var(--type-caption); color: var(--text-body); margin-bottom: 18px; cursor: pointer; }
body.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper .woocommerce-form__label-for-checkbox input { accent-color: var(--accent); width: 15px; height: 15px; flex: 0 0 auto; transform: translateY(2px); }
/* le bouton Commander : la voix .cta écrite en clair — les recettes
   boutons du parent (bleu palette) et du core (float) parlent plus
   fort que la classe seule (constat banc 11/07) */
body.woocommerce-checkout #payment #place_order { float: none; display: inline-flex; align-items: center; justify-content: center; gap: 10px; width: 100%; background: var(--cta-bg); color: var(--cta-text); border: 0; border-radius: var(--radius-m); font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .04em; text-transform: uppercase; box-shadow: var(--shadow-cta); padding: 16px 22px; cursor: pointer; transition: background var(--t-quick) var(--ease-cube); }
body.woocommerce-checkout #payment #place_order:hover { background: var(--cta-bg-hover); color: var(--cta-text); }

/* le code promo reste visible : checkout.js pose un display:none
   inline au chargement (toggle natif retiré) — !important assumé.
   La boîte à filet du parent rend la main (le promo vit nu sous le
   bordereau, maquette). */
body.woocommerce-checkout form.checkout_coupon.cko-promo { display: block !important; border: 0; padding: 0; margin-bottom: 0; background: transparent; box-shadow: none; }

/* ---------- CHECKOUT · notices d'erreur : la voix d'alerte du DS ---------- */
body.woocommerce-checkout .woocommerce-error,
body.woocommerce-cart .woocommerce-error { background: var(--brand-paper); border: 1px solid var(--border-soft); border-left: 3px solid var(--state-alert); border-radius: var(--radius-m); color: var(--text-strong); font-size: var(--type-caption); padding: 12px 16px; list-style: none; margin-bottom: var(--space-5); }
body.woocommerce-checkout .woocommerce-message,
body.woocommerce-checkout .woocommerce-info,
body.woocommerce-cart .woocommerce-message,
body.woocommerce-cart .woocommerce-info { background: var(--brand-newsprint); border: 1px solid var(--border-soft); border-left: 3px solid var(--brand-gold); border-radius: var(--radius-m); color: var(--text-body); font-size: var(--type-caption); padding: 11px 16px; margin-bottom: var(--space-5); }
body.woocommerce-checkout .woocommerce-info a,
body.woocommerce-cart .woocommerce-info a { color: var(--link); text-decoration: underline; text-underline-offset: 3px; }

/* le bordereau ne parle jamais la table Woo : rangées de coupon
   appliqué (review-order rewrite) */
.cko-totaux .woocommerce-remove-coupon { font-size: var(--type-micro); color: var(--link); text-decoration: underline; text-underline-offset: 3px; margin-left: 8px; }
.cko-totaux .woocommerce-remove-coupon:hover { color: var(--state-alert); }
/* la méthode choisie sous « Livraison » (rangée d'affichage du bordereau) */
.cko-totaux .cko-ship-nom { display: block; font-family: var(--font-data); font-size: var(--type-micro); color: var(--text-soft); margin-top: 2px; }

/* le menu WP du footer tunnel s'efface devant la rangée de liens */
.cko-foot nav ul { display: contents; list-style: none; margin: 0; padding: 0; }
.cko-foot nav li { display: contents; }

/* ---------- PANIER · CTA Commander (hook natif proceed_to_checkout :
   les express pay des passerelles y gardent leur place) ---------- */
body.woocommerce-cart .wc-proceed-to-checkout { position: relative; z-index: 1; padding: 0; margin: var(--space-5) 0 0; }
body.woocommerce-cart .wc-proceed-to-checkout a.checkout-button { display: block; width: 100%; text-align: center; white-space: nowrap; background: var(--cta-bg); color: var(--cta-text); border: 0; border-radius: var(--radius-m); font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .04em; text-transform: uppercase; box-shadow: var(--shadow-cta); padding: 16px 18px; transition: background var(--t-quick) var(--ease-cube); }
body.woocommerce-cart .wc-proceed-to-checkout a.checkout-button:hover { background: var(--cta-bg-hover); }

/* ---------- PANIER · l'input de quantité vit dans le stepper ---------- */
body.woocommerce-cart .pan-qty input.qty { width: 40px; min-width: 0; text-align: center; background: none; border: 0; padding: 0; font-family: var(--font-data); font-size: var(--type-data); color: var(--text-body); appearance: textfield; -moz-appearance: textfield; }
body.woocommerce-cart .pan-qty input.qty::-webkit-outer-spin-button,
body.woocommerce-cart .pan-qty input.qty::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
body.woocommerce-cart .pan-qty input.qty:focus { outline: none; }
body.woocommerce-cart .pan-qty button:disabled { color: var(--text-soft); cursor: default; background: none; }
/* le bouton natif « Mettre à jour le panier » reste dans le form pour
   cart.js, mais le stepper est le seul pilote visible */
body.woocommerce-cart .pan-maj { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* panier vide : message sobre + retour boutique */
body.woocommerce-cart .cart-empty.woocommerce-info { margin-top: var(--space-5); }
body.woocommerce-cart .return-to-shop { margin-bottom: var(--space-8); }
body.woocommerce-cart .return-to-shop a.button { display: inline-flex; align-items: center; justify-content: center; background: var(--cta-bg); color: var(--cta-text); border-radius: var(--radius-m); font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); text-transform: uppercase; letter-spacing: .04em; box-shadow: var(--shadow-cta); padding: 13px 26px; transition: background var(--t-quick) var(--ease-cube); }
body.woocommerce-cart .return-to-shop a.button:hover { background: var(--cta-bg-hover); }

/* ---------- CONFIRMATION · le natif sous le héros nightcard ---------- */
body.woocommerce-checkout .woocommerce-order { max-width: none; }
/* le montant du chip TOTAL parle la voix display du chip (les spans
   wc_price portent ailleurs une voix de tiroir : ici ils héritent) */
body.woocommerce-checkout .cfm-meta .woocommerce-Price-amount,
body.woocommerce-checkout .cfm-meta .woocommerce-Price-amount bdi,
body.woocommerce-checkout .cfm-meta .woocommerce-Price-currencySymbol { font: inherit; color: inherit; display: inline; }
/* mention facture (invité : elle arrive par e-mail) */
.cfm-facture-note { font-size: var(--type-micro); color: var(--text-soft); }
/* instructions du moyen de paiement (Click & Collect : horaires) */
body.woocommerce-checkout .woocommerce-order > p { max-width: 760px; margin: var(--space-5) auto 0; background: var(--brand-newsprint); border: 1px solid var(--border-soft); border-left: 3px solid var(--brand-gold); border-radius: var(--radius-m); padding: 12px 18px; font-size: var(--type-caption); color: var(--text-body); }
/* détails de la commande : la table Woo parle les rangées du tunnel */
body.woocommerce-checkout .woocommerce-order-details { max-width: 760px; margin: 0 auto; padding-top: var(--space-7); }
body.woocommerce-checkout .woocommerce-order-details__title { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .05em; text-transform: uppercase; color: var(--text-strong); margin-bottom: var(--space-5); }
body.woocommerce-checkout table.order_details { width: 100%; border: 0; margin: 0; }
body.woocommerce-checkout table.order_details th,
body.woocommerce-checkout table.order_details td { border: 0; border-bottom: 1px solid var(--border-soft); padding: 11px 0; font-size: var(--type-caption); color: var(--text-body); text-align: left; background: transparent; }
body.woocommerce-checkout table.order_details td:last-child { font-family: var(--font-data); font-weight: 500; color: var(--price-ink); text-align: right; font-feature-settings: 'tnum'; }
body.woocommerce-checkout table.order_details .woocommerce-table__product-name a { color: var(--text-strong); font-weight: 600; }
body.woocommerce-checkout table.order_details .product-quantity { font-family: var(--font-data); font-size: var(--type-micro); color: var(--text-soft); font-weight: 400; margin-left: 6px; }
body.woocommerce-checkout table.order_details tfoot tr:last-child th,
body.woocommerce-checkout table.order_details tfoot tr:last-child td { border-bottom: 0; padding-top: 16px; }
body.woocommerce-checkout table.order_details tfoot tr:last-child th { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .05em; text-transform: uppercase; color: var(--text-strong); }
body.woocommerce-checkout table.order_details tfoot tr:last-child td { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); color: var(--price-ink); }
/* bouton facture du plugin PDF, s'il rend dans les détails : secondaire */
body.woocommerce-checkout table.order_details a.button,
body.woocommerce-checkout .woocommerce-order a.button { display: inline-flex; align-items: center; justify-content: center; background: var(--surface-raised) !important; color: var(--accent-strong) !important; border: 1.5px solid var(--accent) !important; border-radius: var(--radius-m); padding: 8px 18px; font-family: var(--font-body); font-weight: 600; font-size: var(--type-micro); text-transform: none; letter-spacing: 0; box-shadow: none; transition: background var(--t-quick) var(--ease-cube); }
body.woocommerce-checkout table.order_details a.button:hover,
body.woocommerce-checkout .woocommerce-order a.button:hover { background: var(--veil-accent) !important; }
/* adresses : les cartes cfm-addr sur le markup natif */
body.woocommerce-checkout .woocommerce-customer-details { max-width: 760px; margin: 0 auto; padding: var(--space-7) 0 var(--space-8); }
body.woocommerce-checkout .woocommerce-customer-details .woocommerce-columns--addresses { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-5); }
body.woocommerce-checkout .woocommerce-customer-details .woocommerce-column { width: 100%; float: none; }
/* clearfix Kadence (woocommerce.min.css : .col2-set::before/::after { content:" "; display:table }) : en grille, le
   pseudo-élément devenait le 1er item et poussait la facturation en colonne 2, la livraison à la ligne (constat J0 02/09) */
body.woocommerce-checkout .woocommerce-customer-details .woocommerce-columns--addresses::before,
body.woocommerce-checkout .woocommerce-customer-details .woocommerce-columns--addresses::after { content: none; display: none; }
body.woocommerce-checkout .woocommerce-customer-details h2,
body.woocommerce-checkout .woocommerce-column__title { font-family: var(--font-display); font-weight: 400; font-size: var(--type-price-s); letter-spacing: .05em; text-transform: uppercase; color: var(--text-strong); margin-bottom: 12px; }
body.woocommerce-checkout .woocommerce-customer-details address { border: 1px solid var(--border-soft); border-radius: var(--radius-m); padding: 16px 20px; font-style: normal; font-size: var(--type-caption); line-height: 1.7; color: var(--text-body); }
@media (max-width: 960px) {
  body.woocommerce-checkout .woocommerce-customer-details .woocommerce-columns--addresses { grid-template-columns: 1fr; }
}
/* la newsletter héritée clôt la confirmation en pleine largeur : rendue
   par le gabarit HORS du .wrap (grammaire du site, le .wrap vit dans la
   section) — le hack 100vw est mort, il débordait de la largeur de la
   barre de défilement dans un vrai navigateur (constat Julien 13/07) */

