/* === /assets/css/tokens.css === */
/* ============================================================
   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;
  }
}

/* === /assets/css/kadence-neutralisation.css === */
/* ------------------------------------------------------------
   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);
}

/* === /assets/css/components/cta.css === */
/* ------------------------------------------------------------
   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; }
}

/* === /assets/css/components/btn.css === */
/* ------------------------------------------------------------
   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);
}

/* === /assets/css/components/eyebrow.css === */
/* ------------------------------------------------------------
   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); }

/* === /assets/css/components/formmsg.css === */
/* ------------------------------------------------------------
   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; }

/* === /assets/css/chrome.css === */
/* ============================================================
   CHROME RÉEL DU SITE — Le Cube à Comics (É4 Bloc 2)
   Transporté de maquettes/assets/chrome.css (source unique É3,
   gatée avec home + PDP) le 09/07/2026, puis complété des parties
   que la maquette laissait « PROVISOIRE » pour l'É4 :
   menu WordPress (ul/li), dropdown Comic-Shop, menu mobile plein
   écran, barre de recherche, tiroir panier (fragments Woo).
   Adaptations du transport marquées [É4] en commentaire.
   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;
  /* [É4] header fixé : le flux commence sous lui. Les pages à hero
     (bloc 3+) poseront body.ch-has-hero pour repasser dessous.
     --ch-notice-h (É4-f) = hauteur du bandeau promo fixé en haut,
     mesurée par chrome.js (0 sans bandeau) : flux et fixed la suivent. */
  padding-top: calc(var(--ch-head-h) + var(--ch-notice-h, 0px));
}
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; }

/* [2.8 · retouche de gate 30/07] HAUTEUR DE LA BARRE, constante de
   plomberie nommée. Elle valait 64px en dur, recopiée dans 14 fichiers
   (compensations de flux, heros, sticky, scroll-margin) ; le lockup
   empilé officiel du header réclame 90px, et une constante recopiée ne
   se déplace pas d'un seul geste. Un seul foyer désormais :
   --ch-head-h = hauteur de la barre · --ch-logo-h = hauteur du lockup
   dedans (90 − 2×9 d'air optique). Sous 680px, la barre garde ses 64px :
   le montage mobile (cube + wordmark, retour Julien du 14/07) est
   inchangé, seul le desktop porte le lockup empilé.
   Toute déclaration qui dégage le header fixe lit --ch-head-h : pas de
   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; } }

/* [polissage header 30/07, verdict Julien] Au scroll, la barre s'amincit et la
   marque bascule sur le cube seul (la signature compacte, déjà celle du mobile).
   --ch-bar-h = hauteur VIVANTE de la barre (repli : --ch-head-h). Ne la lisent
   que la barre elle-même et ce qui s'accroche à son bord bas (panneau recherche,
   panneau mobile, toolbar boutique). Les offsets de mise en page (héros,
   scroll-margins, padding du body) restent sur --ch-head-h : le contenu ne
   bouge pas d'un pixel quand la barre respire. */
@media (min-width: 681px) {
  html[data-head='scrolled'] body { --ch-bar-h: 64px; }
}

/* [É4] décalage des éléments fixés quand la barre d'admin WP est là
   (le html est déjà poussé par WP ; seuls les fixed 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) est un composant du registre :
   components/eyebrow.css (transporté au bloc 3 avec sa première page).
   Restent ici ses adaptations de contexte chrome. */
.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 : toute la famille vit au registre (components/cta.css
   pour la conversion, components/btn.css pour le service). Les ex-variantes
   chrome (.btn-ghost-light, .btn-blue, .btn-line) sont mortes à la passe de
   cohérence du 12/07 : .btn-blue est monté au registre, les deux filets ont
   fusionné en .btn-ghost. ---------- */

/* ---------- 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; }
/* [É4] sans hero sous le header (toute page tant que le bloc 3 n'a pas
   livré les pages à hero), le scrim n'a rien à voiler : header solide. */
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; }
/* [É4] combinateur enfant : le header 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; }
/* [polissage header 30/07] Menu CENTRÉ dans la barre (verdict Julien : le logo
   étroit laissait tout le poids à gauche). Grille 1fr auto 1fr : logo à gauche,
   nav au centre optique de la barre, actions à droite. 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; }
/* [2.8 · retouche 30/07] le lockup empilé se lit à 72px de haut (mesuré :
   sous 60px les deux mots décrochent) ; sa largeur suit son ratio 0,73:1,
   soit ~53px — le bloc de marque du header est désormais étroit et haut.
   SÉLECTEUR PRÉFIXÉ .cube-head, obligatoire : Kadence charge son
   woocommerce.min.css APRÈS le CSS du child (bundle du combineur en
   position 5, woo en 7 — constaté au navigateur le 30/07), 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 lockup
   repartait à sa taille native (533×728 mesuré sur la PDP) sur toute page
   à classe woocommerce — PDP, boutique, panier, compte. Le dépôt connaît
   déjà le piège (tunnel-woo.css et compte-woo.css contrent pareil pour
   .cko-logo). Les deux règles suivantes sont montées d'un cran ensemble
   pour garder leur ordre interne (l'icône mobile doit rester au-dessus). */
.cube-head .ch-logo img { height: var(--ch-logo-h); width: auto; transition: height .28s ease; }
/* [décision Julien 30/07, définitive] UN SEUL logo dans toutes les barres : le
   lockup empilé officiel du client, à toutes les tailles. Au scroll il rétrécit
   avec la barre (90→64, logo 72→48), il ne cède la place à rien. */
@media (min-width: 681px) {
  .cube-head[data-state='scrolled'] .ch-logo img { height: 48px; }
}
/* wordmark mobile : le cube seul laissait le site anonyme sous 680px
   (retour Julien 14/07) — le nom en Bebas accompagne la marque, motif
   du lockup tunnel (cko-logo). Affiché par le bloc responsive, qui
   resserre aussi boîtes d'action et gouttières pour que le lockup
   nommé + 5 actions tiennent au mm près (budget constaté : 344/347px
   à 390 de viewport). */
/* [É4] la nav est un menu WordPress : le ul remplace la rangée de <a> nus
   de la maquette, 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 : items de pages/taxonomies seulement (un item custom dont
   l'URL matche la page se marque aussi : piège gravé au run 1) */
.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; }
/* [É4] point or CGC : la classe vit sur le <li> du menu ; la spécificité
   (0,3,1) remplace les !important de la maquette (interdits au build) */
.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 (passe de cohérence 12/07) : le parent peint les
   button:hover/:focus/:active — les icônes du chrome possèdent 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/ (dû de gate F-ter-a) : 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); }

/* ---------- [É4] DROPDOWN Comic-Shop (desktop) ----------
   Nouveau à l'É4 (le plan de site le prescrit, la maquette one-page ne
   l'avait pas). Panneau nuit sous l'item ; « Autres éditeurs » = colonne 2
   (groupe non cliquable, url vide → <a> sans href, non focalisable).
   Cloisonné desktop : 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); }
  /* l'entrée générale du dropdown (retour de gate F-ter-a, 12/07) : le
     parent cliquable ne se découvre pas — « 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 le
     panneau `hidden` reste survolable (surface fantôme sous le header,
     bug attrapé le 23/07 : le dropdown s'ouvrait depuis la zone 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; }
}

/* ---------- [É4] BARRE DE RECHERCHE (loupe du header) ----------
   V1 : recherche produits native (post_type=product), la mécanique S&F
   se branche à l'É4-e. Bandeau nuit sous le header. */
.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 + curseur épinglés à tous les états ((0,3,1) : le CSS
   dynamique Kadence passe après le child et peut gagner le focus à
   égalité (0,2,1)) ; autofill neutralisé — la saisie reste blanche en
   toute circonstance (retour Julien 14/07 : écriture bleue illisible) */
.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; }

/* ---------- [É4] MENU MOBILE PLEIN ÉCRAN ----------
   Standard du build (le panneau court de la maquette était provisoire) :
   fond opaque charte, liens aérés, CTA pleine largeur en bas, scroll du
   fond verrouillé (html.ch-nav-open), fermeture au passage desktop (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 recette générique des liens du menu (block, glow,
   padding 16/0) le dépouillait : texte glow sur or, débordant (retour
   18 de F-ter-a, prouvé au banc 390 le 12/07) */
.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; }

/* ---------- [É4] TIROIR PANIER (fragments Woo natifs) ----------
   Remplace le snippet « tiroir AJAX » du site actuel (décision tunnel 6
   du plan de site). Le commerce vit en clair : panneau papier. Le contenu
   est le mini-panier Woo (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 reste visible au-dessus,
   assombri par le scrim (bande noire attrapée au constat mobile 14/07) */
.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 recomposée (F-bis 11/07, motif zintense) : titre à l'ENCRE (le
   bleu jurait — loi des 2 couleurs, le tiroir est une zone d'achat),
   compteur en pastille or (écho du badge panier du header), fermeture
   cerclée, respiration élargie */
.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 scrolle plus en bloc (É4-f, référence zintense) : 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 » native du child (remplace celle de Kadence
   Pro à l'É4-f, seuil lu de la config transporteur). Réassurance =
   registre or du DS (newsprint + filet or), progression en or. */
/* plus grande et aérée (retour de gate F : elle se lisait comme une
   note de bas de page — c'est un argument de vente, il se voit) */
.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 */
/* paddings élargis à 24 + clairance de la colonne droite (retour de
   gate F : prix et croix collés au 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 cover FIXE (ratio comic) : une image cassée n'étire jamais la
   rangée — même durcissement que .ch-run-cover.
   Spécificité (0,3,3) NÉCESSAIRE (retour de gate F-bis : « deux paniers
   selon la page ») : sur les gabarits Woo, l'ancêtre .woocommerce arme
   la règle Kadence ul.product_list_widget li img (float:left, 50px) à
   (0,2,3), qui battait la version courte de cette règle — le tiroir
   changeait de visage entre vitrines et boutique/fiche. */
.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); }
/* [lot 9-12, 03/09/2026] données de ligne (`wc_get_formatted_cart_item_data`)
   — sur les packs CGC, « CGV service CGC : acceptées ». Woo les sort en
   <dl class="variation"> DIRECTEMENT sous le <li> ; sans placement, la
   grille les rangeait toute seule en COLONNE 1 (la boîte cover, 58px),
   où le <dt> déborde vers la droite et tombe SUR les contrôles de
   quantité (mesuré à 390×820, tiroir ouvert : dt 98→145 px contre bouton
   « − » 112→138 px, chevauchement de 26 px). Elles rejoignent la colonne
   de contenu, sous le nom et au-dessus des quantités, en flex qui
   retourne à la ligne — un libellé long ne recouvre plus rien. */
.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 cover FIXE (34×51, ratio comic) : une image cassée (banc, 404)
   n'étire jamais la rangée — l'alt reste enfermé 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; }
/* [lot 9-12 · décision Julien D1, 03/09/2026] « Complétez votre run » :
   DEUX suggestions sur ordinateur, UNE seule sur mobile (le tiroir n'a
   pas la hauteur à 390 : la seconde poussait le sous-total et le bouton
   Commander sous la ligne de flottaison). Le HTML garde les deux et le
   point de rupture mobile du chrome (680px, celui du header et du pied)
   masque la seconde : le tiroir est servi depuis le cache de page puis
   rafraîchi par les fragments Woo, une détection serveur du mobile y
   serait fausse un chargement sur deux. `display:none` sort aussi la
   rangée de l'ordre de tabulation — pas de lien fantôme au clavier. */
@media (max-width: 680px) {
  .ch-drawer .ch-run li:nth-child(n + 2) { display: none; }
}

/* pied ancré : sous-total + l'adjudication, bordés du filet, toujours
   visibles — le grand vide sous les CTA du Bloc 2 disparaît */
.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); }
/* [lot 9-12 · décision Julien D2, 03/09/2026] 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 (gabarit tunnel, sans tiroir).
   Le réglage natif de l'extension (Pay Later Message → Mini Cart →
   Enabled) est DÉJÀ à « non » des deux côtés, et ne suffit pas : son
   script instancie le message du mini-panier dès que
   `.woocommerce-mini-cart__total` existe dans la page
   (`paylater-messages.js` : `minicartEnabled || document.querySelector(…)`),
   puis, faute d'emplacement configuré, le rend DANS ce sous-total —
   marqueur `data-pp-id` sur le <p>, nœud `span[id^="zoid-paypal-message-"]`
   dedans (constaté sur la prod le 03/09). 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 (F-bis 11/07) ---------- */
/* 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 Woo, É4-f) ---------- */
/* La bande BIENVENUE10 quitte le bas d'écran (elle recouvrait le pied du
   tiroir de filtres mobile et le contenu du checkout) : bandeau fin
   STATIQUE au-dessus du header — rendu au wp_body_open du child —, nuit
   et or, quel que soit le placement réglé côté Kadence (son fixed bottom
   est neutralisé). Retiré du tunnel par le filtre child. */
/* !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 (retour de gate F 10/07 : la version nuit était
   trop discrète et ses deux bleus juraient avec le header — l'or tranche
   net au-dessus de la bande nuit du header, night/gold 10.8:1) */
/* voix de LABEUR imposée (retour de gate F-bis : le bandeau héritait de
   la Bebas condensée du chrome — illisible en petit corps) : Inter 600.
   Corps CAPTION 14 px (retour de gate F-ter-a 12/07 : le 17 px, posé
   quand le problème était la Bebas, criait — en Inter le 14 est net ;
   ne pas remonter, ne pas redescendre : l'illisibilité de F-bis venait
   de la police, pas du corps) ; 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 (F34, 06/08/2026) : à 390 le « Ignorer » tombait
     à 23 px de haut, sous le confort au doigt de 24 px. Le bandeau grandit
     de 4 px, rien d'autre ne bouge. */
  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 Woo (message / info / erreur), F-bis ---------- */
/* 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; }
/* [2.8 · retouche de gate 30/07] le footer porte le lockup empilé COMPLET
   (badge CGC intégré, ratio 0,65:1). Le badge CGC autonome qui vivait sous
   la note Google est retiré, sa certification est dans le logo.
   90px de large → ~138px de haut (verdict Julien 30/07 : le 200px servi
   au premier re-gate écrasait la colonne). */
.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; }
/* [É4] 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 RS vivent dans la colonne adresse — la
   recette générique des liens de colonne (display block, dusk, padding)
   volait le composant (0-1-1 bat 0-1-0, attrapé au banc 12/07) */
.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; }
/* [É4] classe posée sur le <li> du menu : spécificité (0,3,1), plus de !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 = .btn-ico du registre 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; }
  /* [décision Julien 30/07] mobile aussi : le lockup empilé officiel,
     réduit à la barre de 64px. Cube seul et wordmark retirés du header. */
  .cube-head .ch-logo img { height: 48px; }
  /* place pour le nom : boîtes d'action 36px (pictogramme 20px
     inchangé), gaps et gouttières du wrap au strict — sans quoi le
     burger sortait de l'écran à 390 (constat Playwright 14/07) */
  .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-390) : un cran plus serré, constaté 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; }
}

/* === /assets/css/favoris-icone.css === */
/* ------------------------------------------------------------
   [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");
}

/* === /assets/css/sections/tunnel.css === */
/* ------------------------------------------------------------------
   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; }

/* === /assets/css/sections/compte.css === */
/* ------------------------------------------------------------------
   VOLET COMPTE (transport du 12/07/2026) — l'échafaudage des 2
   maquettes gatées (compte.html, connexion.html), préfixe .mc-, UNE
   copie pour le gabarit unifié des vues connectées (chrome vitrine),
   le sas d'authentification (chrome tunnel) et la modal de connexion
   du checkout.
   Transport VERBATIM de maquettes/assets/compte.css. Grammaire de
   champs .cko-field et chrome tunnel : CONSOMMÉS de tunnel.css (une
   seule copie). Composants (eyebrow, btn-blue/btn-2nd) : chrome + cta
   du registre, enqueue par functions.php.
   3 adaptations de plomberie documentées (les seules) :
   - .mc-head : la compensation de hauteur du header (--ch-head-h) saute —
     le body du child la porte déjà (chrome.css, padding-top des
     pages sans hero ; motif arch-head) ;
   - .mc-nav : le sticky ajoute var(--ch-head-top, 0px) (barre admin
     WP, motif tunnel.css) ;
   - .mc-demo (déclencheur de démo de la modal) : artefact de
     maquette, non transporté.
   Le mariage avec le markup RESTANT imposé de Woo (notices, champs
   woocommerce_form_field de l'édition d'adresse, détail de commande)
   vit dans compte-woo.css, l'adaptateur (motif facet-sf.css).
   LOI DES 2 COULEURS AU COMPTE : espace de service → BLEU = je
   choisis (nav active, éditer, soumettre) ; l'OR n'apparaît PAS
   (aucun accent de conversion ici — retour n° 15 du 11/07).
   ------------------------------------------------------------------ */

/* ---------- tête de page (motif arch-head, sous le header fixe) ---------- */
.mc-head { background: var(--surface-page); border-bottom: 1px solid var(--border-soft); padding: var(--space-6) 0 var(--space-5); }
.mc-head h1 { font-family: var(--font-display); font-weight: 400; font-size: var(--type-title); letter-spacing: .02em; line-height: 1.02; text-transform: uppercase; color: var(--text-strong); margin: 6px 0 4px; }
.mc-bonjour { font-size: var(--type-caption); color: var(--text-soft); }
.mc-bonjour b { color: var(--text-strong); font-weight: 600; }
.mc-bonjour a { color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
.mc-bonjour a:hover { color: var(--accent); }

/* ---------- la scène : rail de navigation + contenu ---------- */
/* padding vertical en propriétés longues : .mc-grid partage son élément
   avec .wrap, le raccourci écrasait ses 24px horizontaux (bords collés
   en mobile — retour de gate 12/07) */
.mc-grid { display: grid; grid-template-columns: 248px minmax(0, 1fr); column-gap: 56px; align-items: start; padding-top: var(--space-6); padding-bottom: var(--space-8); }

/* rail (desktop) : la nav est une SÉLECTION → l'actif est bleu */
.mc-nav { position: sticky; top: calc(var(--ch-head-h) + var(--ch-head-top, 0px) + var(--space-5)); }
.mc-nav ul { display: flex; flex-direction: column; gap: 2px; }
.mc-nav a { position: relative; display: flex; align-items: center; gap: 11px; padding: 11px 14px; border-radius: var(--radius-m); font-size: var(--type-caption); font-weight: 600; color: var(--text-body); transition: background var(--t-quick) var(--ease-cube), color var(--t-quick) var(--ease-cube); }
.mc-nav a svg { color: var(--icon); flex: 0 0 auto; }
.mc-nav a:hover { background: var(--veil-accent); color: var(--accent-strong); }
.mc-nav a.is-active { background: var(--veil-accent); color: var(--accent-strong); }
.mc-nav a.is-active::before { content: ''; position: absolute; left: 0; top: 9px; bottom: 9px; width: 3px; border-radius: var(--radius-arc); background: var(--accent); }
/* sortie du compte (Favoris → /wishlist/) : flèche de sortie discrète */
.mc-nav .mc-out { margin-left: auto; color: var(--text-soft); }
/* se déconnecter : séparé d'un filet, voix éteinte */
.mc-nav-sep { margin: 10px 0; border: 0; border-top: 1px solid var(--border-soft); }
.mc-nav .mc-logout { color: var(--text-soft); }
.mc-nav .mc-logout svg { color: var(--text-soft); }
.mc-nav .mc-logout:hover { color: var(--accent-strong); }
.mc-nav .mc-logout:hover svg { color: var(--icon); }

/* ---------- vues du gabarit ---------- */
.mc-view { display: none; }
.mc-view.is-active { display: block; }
.mc-view:focus { outline: none; }
.mc-view-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px 14px; margin-bottom: var(--space-5); }
.mc-view-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); }
.mc-view-sub { font-size: var(--type-caption); color: var(--text-soft); }

/* ---------- tableau de bord : raccourcis (les liens Woo natifs, habillés) ---------- */
.mc-shortcuts { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.mc-short { display: block; background: var(--surface-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-l); padding: var(--space-5); transition: border-color var(--t-quick) var(--ease-cube), box-shadow var(--t-quick) var(--ease-cube); }
.mc-short:hover { border-color: var(--accent); box-shadow: 0 0 0 3px var(--veil-accent); }
.mc-short svg { color: var(--icon); }
.mc-short b { display: flex; align-items: center; gap: 8px; font-size: var(--type-caption); font-weight: 600; color: var(--text-strong); margin: 12px 0 3px; }
.mc-short .mc-out { color: var(--text-soft); }
.mc-short span { display: block; font-size: var(--type-micro); color: var(--text-soft); line-height: 1.5; }

/* ---------- commandes : le registre des adjudications ---------- */
.mc-table { width: 100%; border-collapse: collapse; }
.mc-table th { font-size: var(--type-micro); font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--text-soft); text-align: left; padding: 0 14px 10px 0; border-bottom: 1px solid var(--border-soft); }
.mc-table th:last-child, .mc-table td:last-child { text-align: right; padding-right: 0; }
.mc-table td { padding: 18px 14px 18px 0; border-bottom: 1px solid var(--border-soft); font-size: var(--type-caption); color: var(--text-body); vertical-align: middle; }
.mc-num { font-family: var(--font-data); font-size: var(--type-data); font-weight: 500; letter-spacing: .02em; color: var(--link); }
.mc-num:hover { text-decoration: underline; text-underline-offset: 3px; }
.mc-date { font-feature-settings: "tnum"; }
.mc-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; }
.mc-prix .n { font-family: var(--font-body); font-size: var(--type-micro); font-weight: 400; color: var(--text-soft); white-space: nowrap; }
/* état : chip sobre — en cours = vivant (bleu), terminée = éteinte, annulée = alerte */
.mc-chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px; border-radius: var(--radius-arc); font-size: var(--type-micro); font-weight: 600; white-space: nowrap; }
.mc-chip::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.mc-chip--encours { background: var(--veil-accent); color: var(--accent-strong); }
.mc-chip--terminee { background: var(--surface-page); border: 1px solid var(--border-soft); color: var(--text-soft); }
.mc-chip--annulee { border: 1px solid var(--border-soft); color: var(--state-alert); }
/* actions : des liens, pas des boutons (la rangée reste légère) */
.mc-acts { display: inline-flex; align-items: center; gap: 18px; }
.mc-act { display: inline-flex; align-items: center; gap: 6px; font-size: var(--type-caption); font-weight: 600; color: var(--link); }
.mc-act:hover { text-decoration: underline; text-underline-offset: 3px; }
.mc-act--doc { color: var(--text-soft); font-weight: 400; }
.mc-act--doc:hover { color: var(--accent-strong); }
.mc-act svg { flex: 0 0 auto; }

/* ---------- adresses : deux cartes jumelles, Modifier ancré en tête ---------- */
.mc-intro { font-size: var(--type-caption); color: var(--text-soft); margin-bottom: var(--space-5); max-width: 60ch; }
.mc-adrs { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.mc-adr { display: flex; flex-direction: column; background: var(--surface-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-l); padding: var(--space-5); }
.mc-adr-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
.mc-adr-t { display: inline-flex; align-items: center; gap: 8px; font-size: var(--type-micro); font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--text-soft); }
.mc-adr-t svg { color: var(--icon); }
.mc-edit { display: inline-flex; align-items: center; gap: 6px; font-size: var(--type-caption); font-weight: 600; color: var(--link); }
.mc-edit:hover { text-decoration: underline; text-underline-offset: 3px; }
.mc-adr address { font-style: normal; font-size: var(--type-caption); line-height: 1.75; color: var(--text-body); }
.mc-adr address b { display: block; font-weight: 600; color: var(--text-strong); }
/* état vide : l'emplacement invite, sans crier */
.mc-adr--vide { align-items: flex-start; justify-content: center; border-style: dashed; background: var(--surface-page); }
.mc-adr--vide p { font-size: var(--type-caption); color: var(--text-soft); margin: 6px 0 14px; }

/* ---------- notices Woo à la grammaire (info / succès = bleu, erreur = alerte) ---------- */
.mc-notice { display: flex; align-items: flex-start; gap: 10px; background: var(--veil-accent); border: 1px solid var(--border-soft); border-left: 3px solid var(--accent); border-radius: var(--radius-s); padding: 13px 16px; font-size: var(--type-caption); color: var(--text-body); margin-bottom: var(--space-5); }
.mc-notice svg { color: var(--icon); flex: 0 0 auto; margin-top: 3px; }
.mc-notice--err { background: var(--surface-raised); border-left-color: var(--state-alert); }
.mc-notice--err svg { color: var(--state-alert); }

/* ---------- détails du compte : formulaire à la grammaire des champs ---------- */
.mc-form { max-width: 560px; }
.mc-fieldset { border: 1px solid var(--border-soft); border-radius: var(--radius-l); padding: var(--space-5); margin: var(--space-6) 0; }
.mc-fieldset legend { font-size: var(--type-micro); font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--text-soft); padding: 0 10px; margin-left: -10px; }
.mc-fieldset .cko-field:last-child { margin-bottom: 0; }

/* les submits du compte parlent .btn-blue du registre (components/btn.css) :
   la géométrie caption 14/24 gatée ici le 12/07 est devenue la base de la
   voix à la passe de cohérence — plus de surcharge locale */

/* ---------- authentification (page connexion + modal du checkout) ----------
   LA réponse au « trop de box » : UNE carte, un seul flux vertical,
   la hiérarchie par la typo (connexion d'abord, l'inscription après
   un filet « Première visite au Cube ? »). */
.mc-auth-wrap { max-width: 470px; margin: 0 auto; padding-bottom: var(--space-8); }
.mc-auth { background: var(--surface-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-l); padding: var(--space-6); box-shadow: var(--shadow-soft); }
.mc-auth .btn-blue, .mc-auth .btn-2nd { width: 100%; }
.mc-auth-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin: 2px 0 18px; }
.mc-auth-row .cko-check { margin: 0; }
.mc-lost { font-size: var(--type-caption); font-weight: 600; color: var(--link); white-space: nowrap; background: none; border: 0; padding: 0; cursor: pointer; font-family: inherit; }
.mc-lost:hover { text-decoration: underline; text-underline-offset: 3px; }
.mc-lead { font-size: var(--type-caption); color: var(--text-body); line-height: 1.55; margin-bottom: 14px; }
.mc-sep { display: flex; align-items: center; gap: 14px; margin: var(--space-6) 0 var(--space-5); font-size: var(--type-micro); font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--text-soft); white-space: nowrap; }
.mc-sep::before, .mc-sep::after { content: ''; flex: 1 1 auto; border-top: 1px solid var(--border-soft); }
.mc-register p { font-size: var(--type-caption); color: var(--text-body); line-height: 1.55; margin: 0 0 14px; }
.mc-privacy { font-size: var(--type-micro); color: var(--text-soft); line-height: 1.55; margin-top: 14px; }
.mc-privacy a { color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
/* état « mot de passe perdu » : même carte, le bloc bascule */
.mc-panel { display: none; }
.mc-panel.is-active { display: block; }
.mc-back { display: inline-flex; align-items: center; gap: 7px; font-size: var(--type-caption); font-weight: 600; color: var(--link); margin-top: 18px; background: none; border: 0; padding: 0; cursor: pointer; font-family: inherit; }
.mc-back:hover { text-decoration: underline; text-underline-offset: 3px; }

/* ---------- la modal de connexion (checkout, acte 01) ----------
   Motif déjà présent dans le tunnel (picker Mondial Relay) : scrim
   nuit, carte papier. MÊME composition que le bloc connexion de la
   page : l'authentification se compose UNE fois. */
.mc-modal { position: fixed; inset: 0; z-index: 90; display: none; align-items: center; justify-content: center; padding: 24px; background: var(--scrim-modal); }
.mc-modal.open { display: flex; }
.mc-modal-card { position: relative; width: min(440px, 100%); max-height: calc(100vh - 48px); overflow-y: auto; background: var(--surface-raised); border-radius: var(--radius-l); padding: var(--space-6); box-shadow: var(--shadow-float); }
.mc-modal-card .btn-blue { width: 100%; }
.mc-modal-head { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; margin-bottom: 6px; }
.mc-modal-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); }
.mc-modal-sub { font-size: var(--type-caption); color: var(--text-soft); margin-bottom: 18px; }
.mc-close { flex: 0 0 auto; width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center; border: 0; background: transparent; border-radius: var(--radius-s); color: var(--text-soft); cursor: pointer; transform: translateY(4px); transition: background var(--t-quick) var(--ease-cube), color var(--t-quick) var(--ease-cube); }
.mc-close:hover, .mc-close:focus, .mc-close:active { background: var(--veil-accent); color: var(--accent-strong); box-shadow: none; }
.mc-close:focus-visible { box-shadow: var(--focus-ring); }
.mc-modal-foot { font-size: var(--type-micro); color: var(--text-soft); line-height: 1.55; margin-top: 16px; }

/* ---------- responsive ---------- */
@media (max-width: 960px) {
  /* le rail devient une rangée de puces défilables (motif navchip) */
  .mc-grid { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-5); padding-top: var(--space-5); }
  /* pas de débord négatif ici : item de grille, la marge négative
     gonfle la piste (scroll horizontal du body constaté au banc).
     UNE seule rangée, Se déconnecter en dernier derrière un filet
     vertical (2 rangées empilées = fausse hiérarchie, retour de
     gate 12/07) */
  .mc-nav { position: static; display: flex; align-items: center; gap: 8px; overflow-x: auto; margin: 0; padding: 2px 0 8px; scrollbar-width: none; }
  .mc-nav::-webkit-scrollbar { display: none; }
  .mc-nav ul { flex-direction: row; gap: 8px; width: max-content; flex: 0 0 auto; }
  .mc-nav a { padding: 9px 15px; border: 1px solid var(--border-soft); border-radius: var(--radius-arc); background: var(--surface-raised); white-space: nowrap; }
  .mc-nav a svg { display: none; }
  .mc-nav a .mc-out { display: inline-flex; margin-left: 2px; }
  .mc-nav a.is-active { border-color: var(--accent); }
  .mc-nav a.is-active::before { display: none; }
  .mc-nav-sep { display: block; align-self: stretch; margin: 6px 2px; border: 0; border-left: 1px solid var(--border-soft); }
  .mc-shortcuts { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 700px) {
  /* le registre des commandes passe en cartes : le n° reste EN TÊTE
     (la table Woo stackée le perdait — constat du 12/07) */
  .mc-table, .mc-table tbody, .mc-table tr, .mc-table td { display: block; }
  .mc-table thead { display: none; }
  .mc-table tr { border: 1px solid var(--border-soft); border-radius: var(--radius-l); background: var(--surface-raised); padding: 4px 18px; margin-bottom: 14px; }
  .mc-table td { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; padding: 13px 0; }
  .mc-table td:last-child { border-bottom: 0; }
  .mc-table td[data-th]::before { content: attr(data-th); font-size: var(--type-micro); font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--text-soft); }
  .mc-row-head { border-bottom: 1px solid var(--border-soft); }
  .mc-adrs { grid-template-columns: 1fr; }
  .mc-shortcuts { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
  .mc-auth { padding: var(--space-5) var(--space-4); }
  .mc-auth-row { flex-wrap: wrap; row-gap: 10px; }
  .mc-acts { gap: 14px; }
}

/* === /assets/css/sections/compte-woo.css === */
/* ------------------------------------------------------------------
   VOLET COMPTE — ADAPTATEUR WOO (12/07/2026). La grammaire de
   compte.css appliquée au markup RESTANT imposé de WooCommerce sur
   l'espace client : notices, champs woocommerce_form_field de
   l'édition d'adresse, œil du mot de passe, select2, détail d'une
   commande (vue héritée, motif confirmation). Motif facet-sf.css :
   child seulement, jamais au registre — il style un markup tiers.
   Charge APRÈS compte.css.
   Sélecteurs préfixés body.woocommerce-account : la spécificité
   nécessaire contre Woo core et le parent (leçon « deux paniers »).
   ------------------------------------------------------------------ */

/* ---------- plomberie de page ----------
   Le sas porte la barre nuit STICKY (dans le flux) : la compensation
   du header fixe de la vitrine (padding-top du body, chrome.css)
   rendrait une bande blanche au-dessus (motif tunnel-woo). */
body.lecube-sas { padding-top: 0; }

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

/* chrome tunnel du sas : les mêmes neutralisations que le tunnel
   (tunnel-woo.css ne charge pas sur le compte) — le img height:auto
   de Woo core rendait la marque à sa taille intrinsèque (512px), et
   le menu légal du footer rendait en liste à puces. */
body.woocommerce-account .cko-logo img { height: 64px; width: auto; max-width: none; }
body.woocommerce-account .cko-foot nav ul { display: contents; list-style: none; margin: 0; padding: 0; }
body.woocommerce-account .cko-foot nav li { display: contents; }

/* ---------- notices Woo : la grammaire mc-notice ----------
   info / succès = bleu (le compte ne vend pas), erreur = alerte. */
body.woocommerce-account .woocommerce-message,
body.woocommerce-account .woocommerce-info {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 10px 14px;
	text-align: left;
	justify-content: flex-start;
	background: var(--veil-accent);
	border: 1px solid var(--border-soft);
	border-left: 3px solid var(--accent);
	border-radius: var(--radius-s);
	padding: 13px 16px;
	font-size: var(--type-caption);
	color: var(--text-body);
	margin: 0 0 var(--space-5);
}
body.woocommerce-account .woocommerce-error {
	list-style: none;
	background: var(--surface-raised);
	border: 1px solid var(--border-soft);
	border-left: 3px solid var(--state-alert);
	border-radius: var(--radius-s);
	padding: 13px 16px;
	font-size: var(--type-caption);
	color: var(--text-body);
	margin: 0 0 var(--space-5);
}
body.woocommerce-account .woocommerce-error li { margin: 0; }
body.woocommerce-account .woocommerce-message a:not(.button),
body.woocommerce-account .woocommerce-info a:not(.button),
body.woocommerce-account .woocommerce-error a:not(.button) {
	color: var(--link);
	text-decoration: underline;
	text-underline-offset: 3px;
}
/* le bouton d'action d'une notice (« Parcourir la boutique ») : voix
   btn-2nd, inline dans la bande */
body.woocommerce-account .woocommerce-message .button,
body.woocommerce-account .woocommerce-info .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: 8px 15px;
	font-family: var(--font-body);
	font-weight: 600;
	font-size: var(--type-micro);
	letter-spacing: 0;
	text-transform: none;
	box-shadow: none;
	cursor: pointer;
	margin-left: auto;
	transition: background var(--t-quick) var(--ease-cube);
}
body.woocommerce-account .woocommerce-message .button:hover,
body.woocommerce-account .woocommerce-info .button:hover { background: var(--veil-accent); color: var(--accent-strong); }

/* ---------- l'enrobage Kadence de la nav rend la main ----------
   Le parent enveloppe la sortie de navigation.php dans
   .account-navigation-wrap (float left shrink-to-fit + filet) : le
   rail s'écrasait à ~73px. L'enrobage devient un item de grille
   neutre, le rail reprend sa colonne de 248px. */
body.woocommerce-account .account-navigation-wrap {
	grid-column: 1;
	float: none;
	width: auto;
	min-width: 0;
}
/* le filet vertical du parent survit à la spécificité (0,2,0) : le
   sélecteur se renforce d'un cran, le rail porte ses propres filets */
body.woocommerce-account .mc-grid > .account-navigation-wrap { border-right: 0; }
body.woocommerce-account .mc-grid > .mc-content { grid-column: 2; }
@media (max-width: 960px) {
	body.woocommerce-account .account-navigation-wrap,
	body.woocommerce-account .mc-grid > .mc-content { grid-column: 1; }
}

/* ---------- guichet : les boîtes Woo core meurent ----------
   woocommerce.css encadre form.login / form.register (border +
   padding + margin 2em) : la carte mc-auth est le seul cadre — le
   « trop de box » du retour Julien ne revient pas par le core. */
body.woocommerce-account .mc-auth form.login,
body.woocommerce-account .mc-auth form.register { border: 0; padding: 0; margin: 0; border-radius: 0; }
/* le core flotte le submit du login : il sortait du flux, le filet
   « Première visite » se coinçait à côté du flottant */
body.woocommerce-account .mc-auth .woocommerce-form-login__submit,
body.woocommerce-account .mc-auth .woocommerce-form-register__submit { float: none; margin-right: 0; }

/* ---------- l'astérisque requis : voix neutre (maquette) ----------
   Le 2e sélecteur bat le rouge Woo core sur les champs
   woocommerce_form_field de l'édition d'adresse. */
body.woocommerce-account .required,
body.woocommerce-account .mc-form .form-row .required { color: inherit; border: 0; text-decoration: none; }

/* ---------- texte de confidentialité de l'inscription ----------
   wc_registration_privacy_policy_text rend div > p : la typo vient de
   .mc-privacy (compte.css), le p interne rend juste sa marge. */
body.woocommerce-account .mc-privacy p { margin: 0; }

/* ---------- édition d'adresse : woocommerce_form_field parle cko-field
   (motif tunnel-woo : <p class="form-row"><label>…<span
   class="woocommerce-input-wrapper"><input class="input-text">) ---------- */
body.woocommerce-account .mc-form .form-row { display: flex; flex-direction: column; gap: 6px; margin: 0 0 14px; padding: 0; float: none; width: 100%; }
body.woocommerce-account .mc-form .form-row label { font-size: var(--type-caption); font-weight: 600; color: var(--text-strong); line-height: 1.4; }
body.woocommerce-account .mc-form .form-row label .optional { font-weight: 400; color: var(--text-soft); }
body.woocommerce-account .mc-form .form-row .woocommerce-input-wrapper { display: block; width: 100%; }
body.woocommerce-account .mc-form .form-row input.input-text,
body.woocommerce-account .mc-form .form-row textarea,
body.woocommerce-account .mc-form .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-account .mc-form .form-row input.input-text::placeholder,
body.woocommerce-account .mc-form .form-row textarea::placeholder { color: var(--text-soft); opacity: .75; }
body.woocommerce-account .mc-form .form-row input.input-text:focus,
body.woocommerce-account .mc-form .form-row textarea:focus,
body.woocommerce-account .mc-form .form-row select:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--veil-accent); outline: none; }
/* prénom / nom côte à côte : les moitiés flottées de Woo core rendent
   la main à la grille */
body.woocommerce-account .mc-form .woocommerce-address-fields__field-wrapper { display: grid; grid-template-columns: 1fr 1fr; column-gap: 14px; }
body.woocommerce-account .mc-form .woocommerce-address-fields__field-wrapper > .form-row { grid-column: 1 / -1; }
body.woocommerce-account .mc-form .woocommerce-address-fields__field-wrapper > .form-row-first { grid-column: 1; }
body.woocommerce-account .mc-form .woocommerce-address-fields__field-wrapper > .form-row-last { grid-column: 2; }
@media (max-width: 560px) {
	body.woocommerce-account .mc-form .woocommerce-address-fields__field-wrapper { grid-template-columns: minmax(0, 1fr); }
	body.woocommerce-account .mc-form .woocommerce-address-fields__field-wrapper > .form-row-first,
	body.woocommerce-account .mc-form .woocommerce-address-fields__field-wrapper > .form-row-last { grid-column: 1; }
}
/* select2 (pays) : la même boîte 48px que les champs */
body.woocommerce-account .mc-form .select2-container .select2-selection--single { height: 48px; border: 1px solid var(--border-soft); border-radius: var(--radius-s); background: var(--surface-raised); }
body.woocommerce-account .mc-form .select2-selection--single .select2-selection__rendered { line-height: 46px; padding-left: 14px; font-size: var(--type-caption); color: var(--text-body); }
body.woocommerce-account .mc-form .select2-selection--single .select2-selection__arrow { height: 46px; }
body.woocommerce-account .select2-dropdown { background: var(--surface-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-s); color: var(--text-body); font-size: var(--type-caption); }
body.woocommerce-account .select2-container--default .select2-results__option--highlighted[aria-selected] { background: var(--accent); color: var(--text-inverse-strong); }
body.woocommerce-account .select2-search--dropdown .select2-search__field { border: 1px solid var(--border-soft); border-radius: var(--radius-s); }
/* validation : le filet parle l'alerte, jamais le vert */
body.woocommerce-account .mc-form .woocommerce-validated input.input-text,
body.woocommerce-account .mc-form .woocommerce-validated select,
body.woocommerce-account .mc-form .woocommerce-validated .select2-selection { border-color: var(--border-soft); }
body.woocommerce-account .mc-form .woocommerce-invalid input.input-text,
body.woocommerce-account .mc-form .woocommerce-invalid select,
body.woocommerce-account .mc-form .woocommerce-invalid .select2-selection { border-color: var(--state-alert); }

/* ---------- œil du mot de passe (woocommerce.js l'ajoute aux champs
   password des formulaires Woo) : positionné dans le champ.
   PIÈGE (retour de gate 2) : Kadence centre l'œil par la propriété
   INDIVIDUELLE `translate: 0 -50%` — un `transform: translateY(-50%)`
   maison SE COMPOSE avec elle (deux propriétés distinctes qui
   s'additionnent) et l'œil montait d'une demi-hauteur de trop. Le
   remède parle la même propriété (translate) et éteint transform. ---------- */
body.woocommerce-account .password-input { position: relative; display: block; width: 100%; }
body.woocommerce-account .password-input input.input-text { padding-right: 44px; }
/* zone de touche 24 px (F36, recette É5, S5 du 07/08/2026) : l'œil
   « afficher le mot de passe » de WooCommerce mesurait 21,6 × 21,6 sur le
   formulaire de connexion — seule violation `target-size` (WCAG 2.2 AA,
   `serious`) restée du scan axe-core du S3b. Remède par la BOÎTE, jamais par
   le glyphe (motif F34) : la boîte devient un carré de 24, le glyphe reste
   à sa taille, centré dedans. `right` passe de 14 à 13 px pour que le glyphe
   ne se déplace pas optiquement (la boîte s'élargit de 2,4 px, elle grandit
   donc de 1,2 px de chaque côté). */
body.woocommerce-account 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; }
body.woocommerce-account form .password-input .show-password-input.display-password { color: var(--accent); }

/* la voix labeur centrée des submits (attrapée au gate 2 du volet compte :
   l'hôte <button> volait la Bebas condensée du parent, 9e visage) vit
   désormais dans les bases .btn-blue / .btn-2nd du registre (passe de
   cohérence 12/07) — la réparation scopée est morte ici */

/* ---------- détail d'une commande (vue héritée, motif confirmation) ---------- */
/* les <mark> Woo (n°, date, statut de la phrase d'intro) : l'emphase
   parle le gras encre, pas le surligneur jaune du navigateur */
body.woocommerce-account .mc-view mark { background: transparent; color: var(--text-strong); font-weight: 600; }
body.woocommerce-account .mc-view .woocommerce-order-details__title,
body.woocommerce-account .mc-view .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: var(--space-5) 0 14px;
	word-break: normal;
	overflow-wrap: normal;
}
body.woocommerce-account .mc-view table.shop_table { width: 100%; border: 0; border-collapse: collapse; margin: 0 0 var(--space-5); }
body.woocommerce-account .mc-view table.shop_table th,
body.woocommerce-account .mc-view table.shop_table td { border: 0; border-bottom: 1px solid var(--border-soft); padding: 13px 12px 13px 0; font-size: var(--type-caption); color: var(--text-body); text-align: left; vertical-align: middle; }
body.woocommerce-account .mc-view table.shop_table thead th,
body.woocommerce-account .mc-view table.shop_table tfoot th { font-size: var(--type-micro); font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--text-soft); }
body.woocommerce-account .mc-view table.shop_table .woocommerce-Price-amount { font-family: var(--font-data); font-weight: 500; color: var(--price-ink); font-feature-settings: "tnum"; }
body.woocommerce-account .mc-view table.shop_table a { color: var(--link); }
body.woocommerce-account .mc-view table.shop_table a:hover { text-decoration: underline; text-underline-offset: 3px; }
/* adresses du détail de commande : cartes légères */
body.woocommerce-account .mc-view .woocommerce-columns--addresses { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
body.woocommerce-account .mc-view .woocommerce-columns--addresses::before,
body.woocommerce-account .mc-view .woocommerce-columns--addresses::after { content: none; }
body.woocommerce-account .mc-view .woocommerce-columns--addresses > .woocommerce-column { width: auto; float: none; }
body.woocommerce-account .mc-view .woocommerce-customer-details address { font-style: normal; font-size: var(--type-caption); line-height: 1.75; color: var(--text-body); background: var(--surface-raised); border: 1px solid var(--border-soft); border-radius: var(--radius-l); padding: var(--space-5); }
@media (max-width: 700px) {
	body.woocommerce-account .mc-view .woocommerce-columns--addresses { grid-template-columns: 1fr; }
}
/* boutons hérités d'une vue Woo (commander à nouveau, voir) : voix btn-2nd */
body.woocommerce-account .mc-view a.button,
body.woocommerce-account .mc-view button.button {
	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: 11px 20px;
	font-family: var(--font-body);
	font-weight: 600;
	font-size: var(--type-caption);
	letter-spacing: 0;
	text-transform: none;
	box-shadow: none;
	cursor: pointer;
	transition: background var(--t-quick) var(--ease-cube), border-color var(--t-quick) var(--ease-cube);
}
body.woocommerce-account .mc-view a.button:hover,
body.woocommerce-account .mc-view button.button:hover { background: var(--veil-accent); border-color: var(--accent); color: var(--accent-strong); }

/* ---------- pagination des commandes : deux boutons, aux bouts ---------- */
body.woocommerce-account .mc-pagination { display: flex; justify-content: space-between; gap: 14px; margin-top: var(--space-5); }
body.woocommerce-account .mc-pagination .woocommerce-button--next { margin-left: auto; }

