/* ════════════════════════════════════════════════════════════════════════════
   PANDA — feuille unique, écrite dans la GRAMMAIRE D'ORBITE.
   Réécrite le 08.09.2026. Ce qu'il y avait avant (vert bouteille, cartes à
   coins ronds de 14 px, ombres portées, blob radial flouté derrière le titre,
   pastille à point vert, hover en translateY(-2px)) était le gabarit standard
   d'une page générée : joli, immédiatement reconnaissable, et sans aucun lien
   avec ce dépôt. Phil, 08.09 : « too much ai style, too much classic, too much
   dark ». Les trois griefs se soignent au même endroit — la grammaire.

   CE QUI EST REPRIS D'ORBITE (/Users/phil/Desktop/ORBITE/orbite.css) :

   1. L'ÉCHELLE N (= L* ÷ 10, cf. TYPOLOGIE.md). Aucune couleur choisie à l'œil.
      Jour : fond N9,5 · surface N9,8 · encre N1,8 · encre forte N1,4 ·
      encre faible N6 · trait #e0e0e0. Nuit : fond N1,5 · surface N2 ·
      encre N8,2 · encre forte N8,5. Ni noir absolu ni blanc absolu.
   2. DEUX THÈMES, DEUX PHYSIQUES. De nuit c'est la LUMIÈRE qui porte
      l'information (lueur, halo) ; de jour il n'y a pas de lumière à émettre
      sur du papier, donc c'est la DENSITÉ D'ENCRE et l'ÉPAISSEUR. Le clair
      n'est PAS l'inversion du sombre : `--ep-vide`/`--ep-plein` changent de
      valeur, `--lueur` passe à `none`.
   3. LE POIDS DU MOUVEMENT. Courbes qui finissent lentement, durées longues
      (320/560/880 ms). Jamais de linéaire, jamais de rebond, jamais de
      `translateY(-2px)` au survol.
   4. LA TYPOGRAPHIE D'INSTRUMENT. Tout le chrome (nav, filtres, boutons,
      étiquettes, prix, cotes) est en MONO capitale, interlettrage large. La
      prose reste en sans. C'est la signature visuelle d'ORBITE : une page qui
      se lit comme un relevé, pas comme une brochure.
   5. LA GÉOMÉTRIE DU RELEVÉ. Filets d'1 px, angles droits, rayon 2 px maximum,
      ZÉRO ombre portée, zéro dégradé de remplissage. Les cellules sont
      séparées par des filets, pas par des cartes qui flottent.
   6. LA NAPPE (nappe.js, copié tel quel). Un fond plat est mort ; la matière
      vient de la variance basse fréquence. Réglée à n2:3.9 côté nuit — le
      plafond mesuré au-delà duquel l'encre N8,5 tombe sous 4,5:1 quand du
      texte pose DIRECTEMENT sur le fond, ce qui est le cas ici.

   CE QUI VIENT DE LA MARQUE, ET DE NULLE PART AILLEURS :
   le jaune, le bleu et le rouge sont relevés sur le packshot officiel
   (savon-de-marseille-1.jpg) : lettrage PANDA jaune cerné de bleu, fanion
   « FAMILY PACK » rouge. Ils ne servent QU'À la marque et au comptage des
   doses. La couleur d'ambiance d'une fiche, elle, est celle du bidon lui-même
   (`--c`, champ `color` de la base) : dix produits, dix teintes, jamais un
   accent unique plaqué sur toute la boutique.
   ════════════════════════════════════════════════════════════════════════════ */

:root{
  /* le poids — repris mot pour mot d'orbite.css */
  --lourd:cubic-bezier(.22,.61,.16,1);
  --tres-lourd:cubic-bezier(.16,.84,.12,1);
  --court:320ms; --moyen:560ms; --long:880ms;

  --mono:ui-monospace,"JetBrains Mono","SF Mono",Menlo,Consolas,monospace;
  --sans:-apple-system,BlinkMacSystemFont,"Inter","Segoe UI",Roboto,sans-serif;

  /* ── LES TROIS COULEURS DE LA MARQUE, RELEVÉES SUR LE PACKSHOT ──────────
     Échantillonnées à l'image le 08.09.2026 (quantification médiane sur la
     zone du lettrage de savon-de-marseille-1.jpg, fond blanc écarté), pas
     choisies : la teinte ET le niveau viennent du bidon.
       or du lettrage PANDA  #f2c318  h 44°  N8,07
       bleu du cerne         #273b48  h204°  N2,38   (l'aplat vaut ~h215)
       rouge du fanion       #ba2c2c  h  0°  N4,19
       crème de l'étiquette  #e2d7ba  h 44°  N8,62
     C'est cette dernière qui donne le PAPIER : la page est l'étiquette du
     bidon, pas une feuille blanche neutre.                               */
  --or:#f2c318;          /* aplat — le jaune du lettrage, tel quel        */
  --or-encre:#906116;    /* le même or ramené à N4,5 pour tenir 4,7:1 en
                            TEXTE sur le papier crème. Un aplat et un texte
                            ne peuvent pas être la même valeur.           */
  --rouge:#ba2c2c;
  --bleu:#1a2338;

  --max:1240px; --gouttiere:26px;
  --r:2px;                      /* le rayon maximal de toute la page */
}

/* ── JOUR : l'encre porte l'information ─────────────────────────────────
   Les niveaux sont ceux d'ORBITE, à la décimale près. Seules la TEINTE et
   la chroma changent — `niveauVersHexa(n,{h,c})` de nappe.js tient le L*
   par bissection pendant qu'on tire vers le crème ou vers le bleu, sinon
   teinter fait dériver la clarté et deux « N9,5 » ne se ressemblent plus.
   Contrastes mesurés sur ce papier : encre 12,3:1 · encre forte 13,8:1 ·
   encre faible 4,6:1 (AA) · or-encre 4,7:1 (AA).                        */
[data-theme="jour"]{
  --fond:#f6f0e6;               /* N9,5 h44 — le crème de l'étiquette      */
  --fond2:#fdf9f3;              /* N9,8 h44                                 */
  --encre:#222c41;              /* N1,8 h215 — le bleu du cerne             */
  --encre-fort:#1a2338;         /* N1,4 h215                                */
  /* N4,6 et non N6 : sur ce papier crème, le N6 d'ORBITE ne tient que
     2,8:1 — sous AA. Presque tout le chrome (cotes, formats, doses) est en
     encre faible, il ne peut pas échouer. */
  --encre-faible:#726c62;       /* N4,6 h44 → 4,59:1                        */
  --trait:#e1d9cc;              /* N8,7 h44                                 */
  --trait-fort:#beb5a6;         /* N7,4 h44                                 */
  --accent:#1a2338;             /* de jour, l'accent EST l'encre            */
  --ep-vide:1px; --ep-plein:3px;
  --lueur:none; --lueur-forte:none;
  --voile:rgba(26,35,56,.36);
  --nappe-n1:8; --nappe-n2:7.2; --nappe-teinte:44; --nappe-chroma:.18; --nappe-couv:.65;
  --creux:rgba(26,35,56,.045);
  --plaque:#faf6ee;             /* la plaque photo, à peine plus claire que
                                   le papier — voir §PLAQUE plus bas          */
}

/* ── NUIT : la lumière porte l'information ──────────────────────────────
   Le fond n'est plus un gris : c'est le BLEU de la marque descendu à N1,5,
   et l'encre est le crème de l'étiquette remonté à N8,2. L'accent est l'or
   du lettrage — il émet, ce qu'un bleu foncé ne sait pas faire.
   Contrastes : encre 9,4:1 · encre forte 10,3:1 · faible 4,8:1 · or 9,1:1. */
[data-theme="nuit"]{
  --fond:#1e2637;               /* N1,5 h215 */
  --fond2:#283043;              /* N2,0 h215 */
  --encre:#d4cbbc;              /* N8,2 h44  */
  --encre-fort:#dfd3c0;         /* N8,5 h44 — le plafond */
  --encre-faible:#989083;       /* N6,0 h44 → 4,79:1 */
  /* les filets prennent la teinte de l'accent, comme dans orbite.css */
  --trait:rgba(242,195,24,.22);
  --trait-fort:rgba(242,195,24,.44);
  --accent:#f2c318;
  --or-encre:#f2c318;           /* de nuit l'or est déjà lisible en texte  */
  --ep-vide:1px; --ep-plein:1px;
  --lueur:drop-shadow(0 0 6px rgba(242,195,24,.75));
  --lueur-forte:drop-shadow(0 0 14px rgba(242,195,24,.95));
  --voile:rgba(6,10,18,.72);
  --nappe-n1:3; --nappe-n2:3.9; --nappe-teinte:215; --nappe-chroma:.5; --nappe-couv:.65;
  --creux:rgba(242,195,24,.07);
  --plaque:#f0eae0;
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;background:var(--fond)}
body{margin:0;background:transparent;color:var(--encre);
  font:15.5px/1.62 var(--sans);letter-spacing:-.004em;overflow-x:hidden;
  transition:background var(--moyen) var(--lourd),color var(--moyen) var(--lourd)}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit}
h1,h2,h3{margin:0;line-height:1.06;letter-spacing:-.028em;font-weight:400}
.wrap{max-width:var(--max);margin:0 auto;padding:0 var(--gouttiere)}
.muted{color:var(--encre-faible)}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}

/* la nappe est posée par shop.js ; elle vit sous tout le reste */
#nappe{position:fixed;inset:0;z-index:0;pointer-events:none}
main,header.top,footer.bot,.ticker{position:relative;z-index:1}

/* ── LE COTE — l'unité typographique d'ORBITE ────────────────────────────
   Une étiquette de relevé : mono, capitale, interlettrage large, petit corps.
   Tout le chrome de la boutique en hérite. C'est ce qui remplace les pastilles
   arrondies et les puces colorées de la version précédente.               */
.cote,.kicker,.ligne-tag,.chip,.btn,nav.main a,.proof b,.fmt,.dose,.badge,
.sec-head .filters,.field label,.specs th,.tech,footer.bot strong,.qty,
.progress,.demo-flag,.note-source{
  font-family:var(--mono);text-transform:uppercase;letter-spacing:.14em;
  font-size:11px;font-weight:400;font-variant-numeric:tabular-nums}

/* ── ENTÊTE ──────────────────────────────────────────────────────────────
   Une bande d'instrument : filet en bas, rien d'autre. Pas de flou de fond,
   pas d'ombre, pas de coin arrondi.                                       */
header.top{position:sticky;top:0;z-index:60;background:var(--fond);
  border-bottom:1px solid var(--trait)}
.top .wrap{display:flex;align-items:center;gap:30px;height:56px}

/* le logo : le lettrage de la marque, cerné comme sur le bidon */
.logo{display:flex;align-items:baseline;gap:10px;font-family:var(--mono);
  font-size:15px;letter-spacing:.3em;text-transform:uppercase;color:var(--encre-fort)}
.logo .mark{width:15px;height:15px;position:relative;flex:0 0 auto;align-self:center;
  border:1.5px solid currentColor;border-radius:50%;
  transition:transform var(--long) var(--tres-lourd)}
.logo .mark::before,.logo .mark::after{content:"";position:absolute;width:4px;height:4px;
  border-radius:50%;background:currentColor;top:2.5px}
.logo .mark::before{left:1.5px}.logo .mark::after{right:1.5px}
/* le geste dit « le panda tourne la tête » — une seule fois, lentement */
.logo:hover .mark{transform:rotate(-22deg)}

nav.main{display:flex;gap:26px;margin-left:auto;align-items:center}
nav.main a{position:relative;padding:19px 0;color:var(--encre-faible);
  transition:color var(--court) var(--lourd)}
/* le soulignement ne glisse pas, il ÉPAISSIT : c'est la règle du thème clair
   (l'information est portée par l'épaisseur), et de nuit il s'allume en plus */
nav.main a::after{content:"";position:absolute;left:0;right:0;bottom:14px;
  height:var(--ep-vide);background:var(--trait);
  transition:height var(--court) var(--lourd),background var(--court) var(--lourd),
             filter var(--court) var(--lourd)}
nav.main a:hover,nav.main a[aria-current]{color:var(--encre-fort)}
nav.main a:hover::after,nav.main a[aria-current]::after{
  height:var(--ep-plein);background:var(--accent);filter:var(--lueur)}

.tools{display:flex;align-items:center;gap:0;margin-left:4px}
.icon-btn{width:40px;height:40px;border:1px solid var(--trait);background:transparent;
  border-radius:var(--r);display:grid;place-items:center;cursor:pointer;
  font-family:var(--mono);font-size:12px;letter-spacing:0;color:var(--encre-faible);
  margin-left:-1px;   /* les cellules se PARTAGENT leur filet, comme un tableau */
  transition:color var(--court) var(--lourd),background var(--court) var(--lourd),
             border-color var(--court) var(--lourd)}
.icon-btn:hover{color:var(--encre-fort);background:var(--creux);border-color:var(--trait-fort);z-index:1}
.cart-btn{position:relative;padding:0 14px;width:auto;gap:9px}
.cart-btn .n{min-width:18px;height:18px;padding:0 4px;border-radius:var(--r);
  background:var(--rouge);color:#fff;font-size:10px;letter-spacing:.06em;
  display:grid;place-items:center;font-variant-numeric:tabular-nums}
.cart-btn .n:empty,.cart-btn .n[data-n="0"]{background:transparent;color:var(--encre-faible);
  border:1px solid var(--trait)}
.cart-btn .n:empty::after{content:"0"}
.cart-btn.bump .n{animation:bump var(--moyen) var(--tres-lourd)}
@keyframes bump{40%{transform:scale(1.3)}100%{transform:scale(1)}}

/* ── BANDEAU ─────────────────────────────────────────────────────────────
   Il était en noir plein sur fond noir. Il devient un filet de relevé :
   même corps que les cotes, encre faible, une seule règle en dessous.     */
.ticker{border-bottom:1px solid var(--trait);color:var(--encre-faible);
  font-family:var(--mono);font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;
  padding:7px 0;overflow:hidden;white-space:nowrap;background:var(--fond2)}
.ticker span{display:inline-block;padding-right:60px;animation:slide 46s linear infinite}
@keyframes slide{to{transform:translateX(-50%)}}

/* ── HÉROS ───────────────────────────────────────────────────────────────
   Plus de blob radial flouté. La composition tient sur une seule chose :
   une colonne de cotes à gauche (le relevé) et le titre à droite.         */
.hero{padding:0;border-bottom:1px solid var(--trait)}
.hero .wrap{display:grid;grid-template-columns:170px 1fr;gap:0;align-items:stretch}
.hero .marge{border-right:1px solid var(--trait);padding:52px 22px 44px 0;
  display:flex;flex-direction:column;gap:14px}
.hero .corps{padding:52px 0 44px 34px}
.hero h1{font-size:clamp(40px,6.6vw,78px);max-width:15ch;font-weight:300;
  letter-spacing:-.038em;color:var(--encre-fort)}
.hero h1 em{font-style:normal;font-weight:500}
.hero p.lead{font-size:clamp(15px,1.5vw,17.5px);max-width:56ch;color:var(--encre-faible);
  margin:26px 0 32px;letter-spacing:0}
.hero p.lead b{color:var(--encre);font-weight:500}
/* la pastille verte à point est morte : une cote se pose sur un filet */
.kicker{display:block;color:var(--encre-faible);padding-bottom:9px;
  border-bottom:var(--ep-vide) solid var(--trait)}
.cta-row{display:flex;flex-wrap:wrap;gap:0}

/* ── BOUTONS ─────────────────────────────────────────────────────────────
   Rectangles à filet partagé. Le primaire est un aplat d'encre (jour) ou
   d'accent lumineux (nuit) — jamais un dégradé, jamais une ombre colorée.
   Au survol rien ne se soulève : le filet ÉPAISSIT.                       */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  padding:14px 26px;border-radius:var(--r);border:1px solid var(--trait-fort);
  background:transparent;color:var(--encre-fort);cursor:pointer;margin-left:-1px;
  position:relative;overflow:hidden;
  transition:color var(--court) var(--lourd),background var(--court) var(--lourd),
             border-color var(--court) var(--lourd),box-shadow var(--court) var(--lourd)}
.btn:first-child{margin-left:0}
/* le remplissage arrive par la GAUCHE : le geste a une direction, il ne
   « change pas de couleur ». Sur .primary il part déjà rempli.            */
.btn::before{content:"";position:absolute;inset:0;background:var(--encre-fort);
  transform:scaleX(0);transform-origin:left;z-index:-1;
  transition:transform var(--moyen) var(--tres-lourd)}
.btn:hover{border-color:var(--encre-fort);box-shadow:inset 0 0 0 1px var(--encre-fort)}
/* LE BOUTON EST LE LOGO. Sur le bidon, PANDA s'écrit en lettres OR cernées
   de BLEU. De jour on reprend ça tel quel : aplat bleu, texte or (9,4:1).
   De nuit on l'inverse — l'or passe en aplat et devient la source de lumière,
   le bleu redevient le texte. Même paire, deux physiques ; c'est la règle
   d'ORBITE appliquée à la marque au lieu d'un accent choisi au hasard. */
.btn.primary{background:var(--encre-fort);color:var(--or);border-color:var(--encre-fort)}
[data-theme="nuit"] .btn.primary{background:var(--or);color:var(--bleu);border-color:var(--or);
  box-shadow:0 0 18px -6px var(--or)}
.btn.primary:hover{background:var(--encre);box-shadow:inset 0 0 0 1px var(--or)}
[data-theme="nuit"] .btn.primary:hover{box-shadow:0 0 30px -6px var(--or)}
.btn.ghost{color:var(--encre-faible)}
.btn.ghost:hover{color:var(--encre-fort)}
.btn.wide{width:100%;margin-left:0}
.btn:disabled{opacity:.42;cursor:not-allowed;box-shadow:none!important}
.btn:disabled:hover{border-color:var(--trait-fort)}

/* ── PREUVE GMS ──────────────────────────────────────────────────────────
   Un tableau d'enseignes, filets partagés. Elles ne sont plus « en gras
   opacité .62 » : elles sont des cellules d'un relevé.                    */
.proof{border-bottom:1px solid var(--trait);background:var(--fond2)}
.proof .wrap{display:grid;grid-template-columns:170px repeat(4,1fr);align-items:stretch}
.proof b{display:flex;align-items:center;color:var(--encre-faible);font-weight:400;
  border-right:1px solid var(--trait);padding:16px 22px 16px 0}
.proof .shop{font-family:var(--mono);font-size:12.5px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--encre-faible);padding:16px 0 16px 22px;
  border-right:1px solid var(--trait);display:flex;align-items:center;
  transition:color var(--court) var(--lourd),background var(--court) var(--lourd)}
.proof .shop:last-child{border-right:0}
.proof .shop:hover{color:var(--encre-fort);background:var(--creux)}

/* ── SECTIONS ────────────────────────────────────────────────────────────
   L'INDEX LETTRÉ d'ORBITE : chaque section porte sa lettre dans la marge.
   C'est ce qui fait qu'une page se lit comme un catalogue d'archive et non
   comme une suite de blocs marketing.                                     */
section{border-bottom:1px solid var(--trait)}
.sec-head{display:grid;grid-template-columns:170px 1fr;gap:0;align-items:start;
  padding:0;border-bottom:1px solid var(--trait);margin:0 calc(var(--gouttiere)*-1);
  padding-left:var(--gouttiere);padding-right:var(--gouttiere)}
.sec-head::before{content:attr(data-lettre);font-family:var(--mono);font-size:11px;
  letter-spacing:.14em;color:var(--encre-faible);padding:44px 22px 40px 0;
  border-right:1px solid var(--trait);align-self:stretch}
.sec-head>div:first-of-type{padding:40px 0 36px 34px;grid-column:2}
.sec-head h2{font-size:clamp(26px,3.4vw,40px);font-weight:300;letter-spacing:-.03em;
  color:var(--encre-fort)}
.sec-head p{max-width:60ch;color:var(--encre-faible);margin:14px 0 0;font-size:14.5px}
.sec-head .filters{grid-column:2;padding:0 0 26px 34px;display:flex;flex-wrap:wrap;gap:0}

/* les filtres : des onglets de classeur, filets partagés, aucun arrondi */
.chip{padding:9px 16px;border:1px solid var(--trait);border-radius:var(--r);
  background:transparent;color:var(--encre-faible);cursor:pointer;margin-left:-1px;
  transition:color var(--court) var(--lourd),background var(--court) var(--lourd),
             border-color var(--court) var(--lourd)}
.chip:first-child{margin-left:0}
.chip:hover{color:var(--encre-fort);background:var(--creux);z-index:1;position:relative}
.chip[aria-pressed="true"]{color:var(--or);background:var(--encre-fort);
  border-color:var(--encre-fort);z-index:2;position:relative}
[data-theme="nuit"] .chip[aria-pressed="true"]{background:var(--or);color:var(--bleu);
  border-color:var(--or);box-shadow:0 0 14px -5px var(--or)}

/* ── LA GRILLE — un relevé, pas des cartes qui flottent ──────────────────
   Les fiches ne sont plus des rectangles ombrés espacés de 24 px : elles
   partagent leurs filets, comme les cases d'un tableau d'inventaire.      */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));
  gap:0;margin:0 calc(var(--gouttiere)*-1);
  border-top:1px solid var(--trait)}
.grid>*{border-right:1px solid var(--trait);border-bottom:1px solid var(--trait);
  margin-top:-1px}
.empty{grid-column:1/-1;padding:70px 0;text-align:center;color:var(--encre-faible);
  font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase}

.card{position:relative;background:transparent;display:flex;flex-direction:column;
  --c:var(--encre-faible);
  animation:entree var(--long) var(--tres-lourd) both;
  transition:background var(--court) var(--lourd)}
.card:hover{background:var(--creux)}
@keyframes entree{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
/* Une .card DANS la grille n'a pas de cadre : elle partage les filets de ses
   voisines. Une .card isolée (encadré de l'espace pro, bloc « pourquoi c'est
   moins cher ») en a un — sinon elle flotte sans contour dans la page. */
:not(.grid)>.card{border:1px solid var(--trait);border-radius:var(--r);animation:none}
:not(.grid)>.card:hover{background:transparent}

/* la cote produit : numéro d'ordre + SKU réel, dans le coin, en mono.
   C'est de la donnée relevée (fiche Stokomani), pas de la décoration.     */
.card .cote-produit{position:absolute;top:12px;left:14px;z-index:3;
  font-family:var(--mono);font-size:10px;letter-spacing:.12em;color:var(--encre-faible);
  text-transform:uppercase}
.badge{position:absolute;top:12px;right:14px;z-index:3;padding:4px 8px;border-radius:var(--r);
  background:var(--rouge);color:#fff;letter-spacing:.1em}
.badge.rupture{background:transparent;color:var(--encre-faible);border:1px solid var(--trait-fort)}

/* ── §PLAQUE — le fond sur lequel le bidon est posé ──────────────────────
   HISTORIQUE, parce qu'il explique la forme actuelle. Les packshots du
   fabricant sont détourés sur du BLANC PUR. Poser ce blanc sur la page donnait
   un grand rectangle froid au milieu de chaque carte. On l'a d'abord escamoté
   en `mix-blend-mode:multiply` : multiplier par du blanc ne change rien, donc
   le fond du packshot disparaissait et laissait voir la plaque.

   Ça a tenu trois jours. Un blend n'agit que DANS son groupe de composition,
   et presque tout en crée un nouveau : `transform-style:preserve-3d` du
   retournement, le `transform` du lot, puis `overflow:hidden` + `border-radius`
   des cartes rondes — qui ont vidé la grille entière d'un coup (plaque
   colorée, plus de bidon, aucune erreur console). On a rendu la plaque à
   chaque groupe, isolé, forcé des repeintures : chaque rustine tenait
   jusqu'au décor suivant.

   Le blend est donc parti. `outils/detourer-packshots.py` retire le fond blanc
   À LA SOURCE et écrit des WebP à canal alpha. La plaque est redevenue une
   simple couleur de fond, la photo une simple image : plus aucune condition de
   composition, et la teinte peut enfin être FRANCHE au lieu d'être limitée par
   ce que le `multiply` supportait sans noircir le bidon. */
.visual{display:block;position:relative;aspect-ratio:1/1;overflow:hidden;
  background:var(--plaque);border-bottom:1px solid var(--trait)}
/* même blanc de nuit : #eceded laissait voir le rectangle du packshot dans la
   plaque (deux blancs voisins = une couture). La plaque EST la table lumineuse
   sur laquelle la photo a été prise ; c'est le filet qui la pose dans la page. */
[data-theme="nuit"] .visual{border:1px solid var(--trait)}
.visual .halo{position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,transparent 46%,color-mix(in srgb,var(--c) 16%,transparent));
  opacity:0;transition:opacity var(--moyen) var(--lourd)}
.card:hover .halo{opacity:1}
.shot{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;padding:8%;
  transition:transform var(--long) var(--tres-lourd)}
.card:hover .shot{transform:scale(1.045)}
.bidon{position:absolute;inset:0;width:100%;height:100%;padding:12%}

/* le retournement : deux faces, la seconde est le DOS du bidon (mentions,
   dosage, pictos). Le geste apprend quelque chose, il ne décore pas.      */
.tourne{position:absolute;inset:0;transform-style:preserve-3d;
  transition:transform var(--long) var(--tres-lourd)}
.card:hover .tourne,.galerie:hover .tourne{transform:rotateY(180deg)}
/* plus de fond sur les faces ni sur les bidons du lot : elles n’avaient à en
   porter un que pour redonner un backdrop au `multiply`. Sans blend, un fond
   ici ne ferait que couper la plaque de la carte en rectangles. */
.tourne .face{position:absolute;inset:0;backface-visibility:hidden;background:transparent}
.tourne .face.ar{transform:rotateY(180deg)}

/* le lot s'écarte : on COMPTE les bidons */
.lot{position:absolute;inset:0;display:grid;place-items:center}
.lot span{position:absolute;width:62%;height:82%;background:transparent;transition:transform var(--long) var(--tres-lourd);
  transform:translateX(calc((var(--i) - (var(--n) - 1)/2) * 6px)) rotate(calc((var(--i) - (var(--n) - 1)/2) * 2deg))}
.card:hover .lot span,.galerie:hover .lot span{
  transform:translateX(calc((var(--i) - (var(--n) - 1)/2) * 44px)) rotate(calc((var(--i) - (var(--n) - 1)/2) * 7deg))}
.lot img{width:100%;height:100%;object-fit:contain}

.card .body{padding:18px 20px 20px;display:flex;flex-direction:column;gap:0;flex:1}
.ligne-tag{color:var(--encre-faible);display:block;margin-bottom:9px}
/* la ligne du produit se signale par un filet de sa propre teinte — une
   information, pas une pastille de couleur */
.ligne-tag::before{content:"";display:inline-block;width:16px;height:var(--ep-plein);
  background:var(--c);vertical-align:middle;margin-right:9px;
  transform:translateY(-1px)}
/* De nuit, la teinte du bidon ne peut pas porter l'information telle quelle :
   l'oud vaut N2, soit le niveau des surfaces — il disparaît. On le REMONTE
   vers l'encre forte (il garde sa dominante, il retrouve un niveau lisible) et
   on lui rend la lueur. C'est exactement la règle des deux physiques : de jour
   la teinte suffit parce qu'elle contraste avec le papier, de nuit il lui faut
   de la lumière. */
[data-theme="nuit"] .ligne-tag::before{
  background:color-mix(in srgb,var(--c) 42%,var(--encre-fort));
  height:2px;filter:drop-shadow(0 0 5px color-mix(in srgb,var(--c) 50%,var(--encre-fort)))}
.card h3{font-size:19px;font-weight:400;letter-spacing:-.022em;color:var(--encre-fort)}
.fmt{color:var(--encre-faible);margin-top:7px;letter-spacing:.1em}
.price{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:16px 0 16px;
  padding-top:14px;border-top:1px solid var(--trait);margin-top:auto}
.price .p{font-family:var(--mono);font-size:20px;letter-spacing:-.01em;color:var(--encre-fort);
  font-variant-numeric:tabular-nums}
.price .old{font-family:var(--mono);font-size:12px;color:var(--encre-faible);
  text-decoration:line-through}
.dose{color:var(--encre-faible);letter-spacing:.1em;width:100%}
.card .btn{width:100%;margin-left:0}

/* ── FICHE PRODUIT ───────────────────────────────────────────────────────── */
.fiche{display:grid;grid-template-columns:1.05fr 1fr;gap:0;
  margin:0 calc(var(--gouttiere)*-1);border-top:1px solid var(--trait)}
.fiche>*{padding:38px var(--gouttiere)}
.fiche>*:first-child{border-right:1px solid var(--trait)}
.galerie{position:relative;aspect-ratio:1/1;background:var(--plaque);border:1px solid var(--trait);
  border-radius:var(--r);overflow:hidden}

.thumb{width:74px;height:74px;object-fit:contain;background:#fff;
  border:1px solid var(--trait);border-radius:var(--r);padding:4px;cursor:pointer;
  overflow:hidden;position:relative;
  transition:border-color var(--court) var(--lourd)}
.thumb:hover{border-color:var(--encre-fort)}
/* dans le panier, `.thumb` est un conteneur : la photo (ou le bidon SVG)
   doit remplir la vignette, pas déborder */
.thumb>img,.thumb>svg{position:absolute;inset:4px;width:auto;height:auto;
  max-width:calc(100% - 8px);max-height:calc(100% - 8px);margin:auto;
  object-fit:contain;padding:0}
.cart-line>div:nth-child(2) b{font-weight:500;font-size:15.5px;color:var(--encre-fort)}
.cart-line>b:last-child{font-family:var(--mono);font-weight:400;
  color:var(--encre-fort);font-variant-numeric:tabular-nums}
/* la galerie de vignettes de la fiche produit */
.galerie+.galerie,.fiche .galerie:has(button){aspect-ratio:auto}
.fiche .galerie button{background:none;border:0;padding:0;cursor:pointer;margin:10px 8px 0 0}
.fiche .galerie button img{width:70px;height:70px;object-fit:contain;background:#fff;
  border:1px solid var(--trait);border-radius:var(--r);padding:4px;
  transition:border-color var(--court) var(--lourd)}
.fiche .galerie button[aria-pressed="true"] img{border-color:var(--encre-fort);
  border-width:var(--ep-plein)}
.big-price{font-family:var(--mono);font-size:34px;letter-spacing:-.02em;color:var(--encre-fort);
  font-variant-numeric:tabular-nums}
.specs{width:100%;border-collapse:collapse;margin-top:20px;font-size:13.5px}
/* La fiche est écrite en <ul><li><span>libellé</span><b>valeur</b></li> — deux
   colonnes, pas une puce. Le libellé reste en prose grise, la valeur passe en
   mono : c'est du RELEVÉ (SKU, EAN, prix constaté), ça se lit en colonne et ça
   s'aligne. Sans cette règle les deux se collaient (« Format3 L »). */
ul.specs,ul.tech{list-style:none;padding:0;margin:20px 0 0}
ul.specs li,ul.tech li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px;
  align-items:baseline;padding:9px 0;border-bottom:1px solid var(--trait)}
ul.specs li span,ul.tech li span{color:var(--encre-faible);font-size:13.5px;
  text-transform:none;letter-spacing:0;font-family:var(--sans)}
ul.specs li b,ul.tech li b{font-family:var(--mono);font-size:12px;letter-spacing:.04em;
  font-weight:400;color:var(--encre-fort);text-align:right;font-variant-numeric:tabular-nums}
/* la fiche technique est plus dense et plus longue : elle passe en une colonne
   quand la valeur est un pavé (liste d'ingrédients, mentions de danger) */
ul.tech li{grid-template-columns:1fr;gap:4px;padding:8px 0}
ul.tech li b{text-align:left;line-height:1.6}
details summary{font-family:var(--mono);font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--encre-faible);font-weight:400!important;
  padding:14px 0;border-top:1px solid var(--trait);list-style:none;cursor:pointer;
  transition:color var(--court) var(--lourd)}
details summary::-webkit-details-marker{display:none}
details summary::before{content:"› ";display:inline-block;
  transition:transform var(--court) var(--lourd)}
details[open] summary::before{transform:rotate(90deg)}
details summary:hover{color:var(--encre-fort)}
.specs th,.specs td{text-align:left;padding:10px 0;border-bottom:1px solid var(--trait);
  vertical-align:top}
.specs th{color:var(--encre-faible);font-weight:400;width:42%;padding-right:16px}
.specs td{font-family:var(--mono);font-size:12px;letter-spacing:.03em;color:var(--encre)}
.tech{color:var(--encre-faible);letter-spacing:.1em}
.note-source{color:var(--encre-faible);letter-spacing:.08em;font-size:10px;line-height:1.7;
  border-top:1px solid var(--trait);padding-top:12px;margin-top:22px;text-transform:none}

/* ── PANIER / FORMULAIRES ────────────────────────────────────────────────── */
.cols{display:grid;grid-template-columns:1.6fr 1fr;gap:0;
  margin:0 calc(var(--gouttiere)*-1);border-top:1px solid var(--trait)}
.cols>*{padding:32px var(--gouttiere)}
.cols>*:first-child{border-right:1px solid var(--trait)}
.two{display:grid;grid-template-columns:1fr 1fr;gap:0 18px}
.cart-line{display:grid;grid-template-columns:74px 1fr auto;gap:18px;align-items:center;
  padding:20px 0;border-bottom:1px solid var(--trait)}
.qty{display:inline-flex;border:1px solid var(--trait);border-radius:var(--r);overflow:hidden}
.qty button{width:32px;height:32px;background:transparent;border:0;cursor:pointer;
  color:var(--encre-faible);transition:background var(--court) var(--lourd),color var(--court) var(--lourd)}
.qty button:hover{background:var(--creux);color:var(--encre-fort)}
.qty span,.qty input{min-width:38px;width:38px;display:grid;place-items:center;text-align:center;
  font-variant-numeric:tabular-nums;font-family:var(--mono);font-size:13px;
  border:0;border-inline:1px solid var(--trait);background:transparent;padding:0;height:32px}
.qty input{-moz-appearance:textfield;appearance:textfield}
.qty input::-webkit-outer-spin-button,.qty input::-webkit-inner-spin-button{
  -webkit-appearance:none;margin:0}
.qty input:focus{outline:0;background:var(--creux)}
/* `.recap` est le CONTENEUR (un <aside>), les lignes à l'intérieur sont `.row`.
   Les styler au même sélecteur mettait tout le récapitulatif sur une seule
   ligne — sous-total, livraison, total et bouton côte à côte. */
.recap{display:block}
.recap .row{display:flex;justify-content:space-between;gap:16px;padding:11px 0;
  font-size:14px;border-bottom:1px solid var(--trait)}
.recap .row b,.recap .row span:last-child{font-family:var(--mono);font-size:13px;
  font-weight:400;color:var(--encre-fort);font-variant-numeric:tabular-nums}
.recap .row span:first-child{color:var(--encre-faible)}
.recap .row.total{border-bottom:0;padding-top:18px;margin-top:6px;
  border-top:var(--ep-plein) solid var(--encre-fort)}
.recap .row.total span{font-family:var(--mono);font-size:19px;color:var(--encre-fort)}
.recap .row.total span:first-child{color:var(--encre-fort)}

/* le franco : une jauge, pas une phrase. L'épaisseur porte l'avancement de
   jour, la lueur le porte de nuit — la règle des deux physiques, encore. */
.progress{display:block;height:var(--ep-plein);background:var(--trait-fort);
  margin:16px 0 8px;padding:0;overflow:hidden;border-radius:var(--r)}
.progress i{display:block;height:100%;background:var(--encre-fort);
  filter:var(--lueur);transition:width var(--long) var(--tres-lourd)}
[data-theme="nuit"] .progress i{background:var(--or)}
.field{margin-bottom:14px}
.field label{display:block;color:var(--encre-faible);margin-bottom:6px}
.field input,.field select,.field textarea{width:100%;padding:11px 13px;
  background:var(--fond2);border:1px solid var(--trait);border-radius:var(--r);
  transition:border-color var(--court) var(--lourd),box-shadow var(--court) var(--lourd)}
.field input:focus,.field select:focus,.field textarea:focus{outline:0;
  border-color:var(--encre-fort);box-shadow:inset 0 0 0 1px var(--encre-fort)}
[data-theme="nuit"] .field input:focus,[data-theme="nuit"] .field select:focus,
[data-theme="nuit"] .field textarea:focus{border-color:var(--accent);
  box-shadow:0 0 12px -4px var(--accent)}
.progress{color:var(--encre-faible);letter-spacing:.1em;padding:10px 0}
.demo-flag{border:1px solid var(--trait-fort);border-radius:var(--r);padding:9px 13px;
  color:var(--encre-faible);display:inline-block}

/* ── LE VOL VERS LE PANIER (FLIP) ───────────────────────────────────────── */
.flyer{position:fixed;z-index:200;border-radius:var(--r);pointer-events:none;
  transition:transform 720ms var(--tres-lourd),opacity 720ms var(--lourd)}

/* ── TOAST — une bande de relevé en bas, pas une bulle arrondie ─────────── */
.toast{position:fixed;left:50%;bottom:26px;transform:translate(-50%,18px);z-index:210;
  background:var(--encre-fort);color:var(--or);padding:11px 20px;border-radius:var(--r);
  font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  opacity:0;pointer-events:none;
  transition:opacity var(--court) var(--lourd),transform var(--moyen) var(--tres-lourd)}
.toast.on{opacity:1;transform:translate(-50%,0)}

/* ── PIED ────────────────────────────────────────────────────────────────── */
footer.bot{border-top:1px solid var(--trait);background:var(--fond2)}
footer.bot .wrap{display:grid;grid-template-columns:repeat(3,1fr);gap:0;
  margin:0 auto;padding:0 var(--gouttiere)}
footer.bot .wrap>div{padding:34px 26px 34px 0;font-size:13.5px;color:var(--encre-faible);
  border-right:1px solid var(--trait)}
footer.bot .wrap>div:last-child{border-right:0}
footer.bot .wrap>div:not(:first-child){padding-left:26px}
footer.bot strong{display:block;color:var(--encre-faible);font-weight:400;margin-bottom:12px}
footer.bot a{color:var(--encre);transition:color var(--court) var(--lourd)}
footer.bot a:hover{color:var(--encre-fort)}

/* ── ENTRÉE DIRECTIONNELLE ───────────────────────────────────────────────
   La page entre par la droite si on avance, par la gauche si on revient.
   Conservé de la version précédente : c'est la seule chose qui portait
   vraiment une information. Les durées passent au barème d'ORBITE.        */
main[data-dir="fwd"]{animation:venirDroite var(--long) var(--tres-lourd) both}
main[data-dir="back"]{animation:venirGauche var(--long) var(--tres-lourd) both}
@keyframes venirDroite{from{opacity:0;transform:translateX(34px)}to{opacity:1;transform:none}}
@keyframes venirGauche{from{opacity:0;transform:translateX(-34px)}to{opacity:1;transform:none}}

/* ── PETITS ÉCRANS ───────────────────────────────────────────────────────── */
@media (max-width:860px){
  .hero .wrap,.sec-head{grid-template-columns:1fr}
  .hero .marge{border-right:0;border-bottom:1px solid var(--trait);padding:26px 0 18px}
  .hero .corps{padding:28px 0 40px}
  .sec-head::before{display:none}
  .sec-head>div:first-of-type,.sec-head .filters{padding-left:0;grid-column:1}
  .proof .wrap{grid-template-columns:1fr 1fr}
  .proof b{grid-column:1/-1;border-right:0;border-bottom:1px solid var(--trait)}
  .fiche,.cols{grid-template-columns:1fr}
  .fiche>*:first-child,.cols>*:first-child{border-right:0;border-bottom:1px solid var(--trait)}
  footer.bot .wrap{grid-template-columns:1fr}
  footer.bot .wrap>div{border-right:0;border-bottom:1px solid var(--trait);padding-left:0!important}
  nav.main{gap:16px}
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;transition-duration:.01ms!important}
  .ticker span{animation:none}
}

/* ════════════════════════════════════════════════════════════════════════════
   §COULEUR — LA GAMME REPEINT LA PAGE                        (08.09.2026)
   Phil : « need the website more colorful like it product ».

   LE CONSTAT. La page tenait sur trois valeurs (papier crème, encre bleue, or)
   et la teinte du bidon n'apparaissait QUE dans deux endroits de 16 px : le
   tiret devant la ligne et un voile à 16 % au survol. Sur une capture, la
   grille des dix parfums était beige sur beige — alors que les bidons du 3 L
   sont cyan, vert, rose et orange francs. Ce n'est pas un réglage de
   saturation qui manquait, c'est une SURFACE : une couleur qui n'occupe pas
   d'aire ne se voit pas.

   LA RÈGLE POSÉE. La couleur du produit devient la PLAQUE sur laquelle sa
   photo est prise. C'est gratuit et c'est exact : les packshots sont détourés
   sur blanc pur et déjà composés en `multiply` (cf. §PLAQUE) — or multiplier
   par du blanc ne change rien. Teinter la plaque colore donc tout le fond du
   packshot sans toucher au bidon, sans détourage, sans PNG à refaire. La
   grille devient une étagère de dix tuiles colorées ; chaque tuile est la
   couleur RELEVÉE sur le bidon (server/db.js, §`color`).

   LES DEUX PHYSIQUES, ICI. Une teinte brute ne peut pas servir des deux côtés :
   · de JOUR on PLAFONNE la clarté (L ≤ .78) — sinon le crème du Savon de
     Marseille disparaît dans le papier crème ;
   · de NUIT on PLANCHE la clarté (L ≥ .62) — sinon les cinq bruns de la
     Collection Privée tombent au niveau des surfaces et s'éteignent.
   Un seul `oklch(from …)` chacun : la TEINTE ne bouge jamais, seul le niveau
   s'adapte au support. C'est la règle d'ORBITE, appliquée à dix couleurs au
   lieu d'un accent.

   L'ENCRE SUR LA COULEUR. `--sur-c` bascule entre noir et blanc selon la
   clarté de `--c`, sans table de correspondance ni JavaScript : le `clamp`
   fait passer L de 1 à 0 en franchissant L=.62. Un aplat cyan prend une encre
   noire, un aplat brun une encre blanche, automatiquement — y compris si
   Soufyane change une couleur depuis la console.
   ════════════════════════════════════════════════════════════════════════════ */

.card,.visual,.chip,.fiche,.spectre button{
  /* la teinte adaptée au support, et l'encre qui se pose dessus */
  --c-jour:oklch(from var(--c) min(l,.78) c h);
  --c-nuit:oklch(from var(--c) max(l,.62) c h);
  --c-vue:var(--c-jour);
  --sur-c:oklch(from var(--c-vue) clamp(0,(l - .62) * -100,1) 0 h);
}
[data-theme="nuit"] .card,[data-theme="nuit"] .visual,
[data-theme="nuit"] .chip,[data-theme="nuit"] .fiche,
[data-theme="nuit"] .spectre button{--c-vue:var(--c-nuit)}

/* ── LA PLAQUE PREND LA COULEUR ──────────────────────────────────────────
   34 % : réglé à l'œil sur capture. En dessous, les cinq bruns du 4 L ne se
   détachent pas du fond ; au-delà, la tuile crie plus fort que le bidon qu'elle
   présente. Le plafond de 24 % qui valait du temps du `multiply` (au-delà,
   le packshot noircissait) est levé : la photo est détourée, elle ne subit
   plus la plaque. Mélange en OKLAB et pas en sRGB — un cyan mélangé en sRGB
   vire au gris sale à mi-course.                                          */
.visual{--plaque:color-mix(in oklab,var(--c) 34%,var(--fond-plaque))}
[data-theme="jour"]{--fond-plaque:#fdfaf4}
[data-theme="nuit"]{--fond-plaque:#f4efe6}

/* ── LE BANDEAU DE COULEUR — l'étiquette de rayon ────────────────────────
   Un filet de 5 px sous chaque photo. C'est ce qui fait lire la grille comme
   une gamme : on voit les deux familles (les bruns du 4 L, les couleurs
   franches du 3 L) avant même d'avoir lu un nom.                          */
.visual{border-bottom:0}
.visual::after{content:"";position:absolute;left:0;right:0;bottom:0;height:5px;
  background:var(--c-vue);z-index:4;
  transition:height var(--moyen) var(--tres-lourd)}
.card:hover .visual::after,.visual:hover::after{height:11px}
[data-theme="nuit"] .visual::after{filter:drop-shadow(0 0 7px var(--c-vue))}

/* le survol : la carte prend un souffle de sa propre teinte, plus le creux
   neutre d'avant qui donnait la même réponse aux quatorze cartes */
.card:hover{background:color-mix(in oklab,var(--c-vue) 9%,transparent)}
.visual .halo{background:linear-gradient(180deg,transparent 38%,
  color-mix(in oklab,var(--c-vue) 30%,transparent))}
/* le tiret de ligne n'a plus à porter seul la couleur : le bandeau le fait.
   Il reprend donc la même valeur adaptée, sans le calcul de secours. */
.ligne-tag::before{background:var(--c-vue)}
[data-theme="nuit"] .ligne-tag::before{background:var(--c-vue);height:2px;
  filter:drop-shadow(0 0 5px var(--c-vue))}

/* ── LE BANDEAU HAUT PASSE EN BLEU DE MARQUE ─────────────────────────────
   Il était en encre faible sur crème : invisible. C'est le bleu du cerne du
   lettrage, souligné par l'or. Première chose vue de la page, et la seule
   surface qui ne dépend d'aucun produit — donc elle porte la MARQUE.      */
.ticker{background:var(--bleu);color:#e9dcbe;border-bottom:2px solid var(--or)}
[data-theme="nuit"] .ticker{background:#151c2c;color:#e9dcbe}

/* ── LE PRIMAIRE DEVIENT L'OR, DE JOUR AUSSI ─────────────────────────────
   Il était en aplat d'encre bleue avec texte or. Correct, sobre — et une
   quinzaine de rectangles bleu marine dans la page. Sur le bidon c'est
   l'inverse : PANDA s'écrit en lettres OR cernées de bleu, l'or est l'aplat.
   On prend le bidon au mot. Mesuré : #1a2338 sur #f2c318 = 9,3:1 (AAA).
   La différence jour/nuit reste entière — de jour l'or est plat et cerné,
   de nuit il ÉMET (la lueur d'ORBITE).                                    */
.btn.primary{background:var(--or);color:var(--bleu);border-color:var(--bleu)}
.btn.primary:hover{background:#ffd63a;box-shadow:inset 0 0 0 2px var(--bleu)}
[data-theme="nuit"] .btn.primary{border-color:var(--or)}
[data-theme="nuit"] .btn.primary:hover{background:#ffd63a}

/* ── LES FILTRES PORTENT LEUR COULEUR ────────────────────────────────────
   Un onglet actif était or sur encre : la même réponse pour les cinq. Chacun
   prend maintenant la couleur de ce qu'il montre (index.html, table CATS) —
   l'onglet dit CE QU'IL FILTRE, pas seulement qu'il est enfoncé.          */
.chip[aria-pressed="true"]{background:var(--c-vue);color:var(--sur-c);
  border-color:var(--c-vue)}
[data-theme="nuit"] .chip[aria-pressed="true"]{background:var(--c-vue);
  color:var(--sur-c);border-color:var(--c-vue);
  box-shadow:0 0 16px -5px var(--c-vue)}
.chip::before{content:"";display:inline-block;width:8px;height:8px;
  background:var(--c-vue);margin-right:9px;vertical-align:baseline;
  transition:opacity var(--court) var(--lourd)}
.chip[aria-pressed="true"]::before{opacity:0}

/* ── §SPECTRE — LA GAMME EN UNE LIGNE ────────────────────────────────────
   Onze cellules, une par référence, à la couleur relevée du bidon. Ce n'est
   pas une frise décorative : c'est un SÉLECTEUR. On clique, la page descend
   sur la fiche et la carte s'allume. Et le geste porte l'information — la
   cellule survolée s'ÉLARGIT (flex-grow) et sort son nom, les autres se
   serrent. On lit la gamme entière en passant la souris, sans scroller.
   C'est aussi le seul endroit de la page où les dix teintes sont côte à
   côte : d'un coup d'œil on voit qu'il y a deux familles.                 */
.spectre{display:flex;height:70px;border-bottom:1px solid var(--trait);
  margin:0 calc(var(--gouttiere)*-1);overflow:hidden}
.spectre button{flex:1 1 0;min-width:0;position:relative;cursor:pointer;border:0;
  background:var(--c-vue);padding:0;display:block;
  transition:flex-grow var(--moyen) var(--tres-lourd),filter var(--court) var(--lourd)}
.spectre button+button{box-shadow:inset 1px 0 0 rgba(255,255,255,.28)}
.spectre button:hover,.spectre button:focus-visible{flex-grow:3.2;outline:0}
.spectre button span{position:absolute;inset:auto 0 0 0;padding:0 12px 11px;
  font-family:var(--mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;
  color:var(--sur-c);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  opacity:0;transform:translateY(6px);
  transition:opacity var(--court) var(--lourd),transform var(--moyen) var(--tres-lourd)}
.spectre button:hover span,.spectre button:focus-visible span{opacity:1;transform:none}
/* la légende, dans la marge de 170 px comme partout ailleurs */
.spectre-rang{display:grid;grid-template-columns:170px 1fr;
  margin:0 calc(var(--gouttiere)*-1);padding:0 var(--gouttiere);
  border-bottom:1px solid var(--trait);align-items:center}
.spectre-rang>.cote{padding:0 22px 0 0;border-right:1px solid var(--trait);
  align-self:stretch;display:flex;align-items:center;color:var(--encre-faible)}
.spectre-rang>.spectre{margin:0 0 0 34px;border-bottom:0;height:64px}

/* la carte visée par le spectre se signale — un cerne de sa teinte, deux
   respirations, puis plus rien. On ne laisse pas un état allumé derrière soi. */
@keyframes viser{0%,100%{box-shadow:inset 0 0 0 0 transparent}
  22%,60%{box-shadow:inset 0 0 0 3px var(--c-vue)}}
.card.vise{animation:viser 1.9s var(--lourd)}

/* ── LA MARQUE DANS L'ENTÊTE ─────────────────────────────────────────────
   Le rond du panda était un contour d'encre. Il prend l'or du lettrage et le
   bleu du cerne : c'est le logo du bidon, réduit à 15 px.                 */
.logo .mark{background:var(--or);border-color:var(--bleu)}
.logo .mark::before,.logo .mark::after{background:var(--bleu)}
[data-theme="nuit"] .logo .mark{border-color:var(--or);
  filter:drop-shadow(0 0 6px rgba(242,195,24,.6))}

/* ── LA FICHE PRODUIT BAIGNE DANS SA TEINTE ──────────────────────────────
   Le grand visuel de gauche est déjà porté par `.visual` (donc plaque et
   bandeau colorés). On étend au reste de la colonne : le prix pose sur un
   filet de la teinte, et les vignettes actives s'y accordent.             */
.fiche .big-price{border-bottom:var(--ep-plein) solid var(--c-vue,var(--trait-fort));
  padding-bottom:16px}
.galerie button[aria-pressed="true"]{border-color:var(--c-vue);
  box-shadow:inset 0 0 0 2px var(--c-vue)}

@media (max-width:860px){
  .spectre-rang{grid-template-columns:1fr}
  .spectre-rang>.cote{display:none}
  .spectre-rang>.spectre{margin-left:0}
}
@media (prefers-reduced-motion:reduce){
  .spectre button:hover{flex-grow:1}
  .card.vise{animation:none;box-shadow:inset 0 0 0 3px var(--c-vue)}
}

/* ── LA VIGNETTE DU PANIER PORTE SA COULEUR EN ANNEAU ────────────────────
   J'ai d'abord teinté le FOND de `.thumb`, comme la plaque de la grille.
   Ça ne tient pas : dès que ce fond n'est plus `#fff`, l'image absolue posée
   dessus ne se peint plus au premier rendu — carré de couleur vide, aucune
   erreur, `naturalWidth` correct, et n'importe quelle écriture de style
   ultérieure la fait apparaître. Essayé et écarté : `color-mix(in oklab)`,
   `color-mix(in srgb)`, `rgb(from …)`, `isolation:isolate`, une repeinture
   forcée après `img.decode()`. Le fond blanc reste donc, et la couleur passe
   en ANNEAU intérieur — elle identifie la référence aussi bien, sans le
   défaut. Le bidon blanc du Savon de Marseille se lit par son cerne.       */
.thumb{background:#fff;box-shadow:inset 0 0 0 3px var(--c,var(--trait-fort))}

/* ════════════════════════════════════════════════════════════════════════════
   §FUN — LA BOUTIQUE PREND LE TON DU BIDON                   (08.09.2026)
   Phil : « meme fond ecran aussi et les theme des bouton color forme effect
   animation … i think it need to be more colorful and fun and attractive by
   the kids etc. or woman ».

   CE QUE ÇA TRANCHE. Tout ce qui précède dans cette feuille est écrit dans la
   grammaire d'ORBITE : filets d'1 px, rayon 2 px maximum, zéro ombre, mono
   capitale partout, papier crème, fond en isohypses. C'est une grammaire
   d'INSTRUMENT, et c'est la bonne — sur les pages de Phil. Cette boutique
   n'est pas une page de Phil : c'est l'étal de Soufyane, et son client est la
   mère de famille qui prend 5 L de lessive parfumée chez Stokomani. Le bidon
   lui parle en dessin animé : panda joufflu, lettrage en BULLES jaune cerné
   de bleu, bulles de savon sur toute l'étiquette, aplats de couleur franche.
   On prend ce ton-là. On ne réécrit pas la feuille pour autant : cette section
   ne fait qu'OUTREPASSER ce qui doit l'être, en le disant à chaque fois — on
   peut revenir en arrière en supprimant ce bloc, rien d'autre.

   CE QUI EST GARDÉ INTACT, ET POURQUOI. La couleur relevée sur les bidons
   (§COULEUR), l'échelle de contrastes, les durées lourdes, la règle des deux
   physiques jour/nuit, le mouvement qui porte une information. « Fun » ne veut
   pas dire « au hasard » : ça veut dire que la forme devient ronde, que la
   couleur devient franche, et que le geste devient joueur — pas que les
   valeurs cessent d'être mesurées.
   ════════════════════════════════════════════════════════════════════════════ */

:root{
  /* le rayon passe de 2 px à la BULLE. C'est le seul changement de forme, et
     il suffit à changer le registre de toute la page. */
  --r:20px;
  --r-pastille:999px;
  --r-petit:12px;

  /* la typo ronde : c'est le lettrage du bidon. `ui-rounded` existe sur macOS
     et iOS (SF Pro Rounded) ; ailleurs on tombe sur Nunito/Quicksand si la
     police est installée, sinon sur le sans habituel — la page reste juste,
     elle perd seulement la rondeur. */
  --rond:ui-rounded,"SF Pro Rounded","Nunito","Quicksand","Varela Round",
         -apple-system,"Segoe UI Variable",sans-serif;

  /* le rebond : la seule courbe de cette feuille qui dépasse 1. Réservée aux
     gestes joueurs (survol d'une carte, clic d'un bouton), jamais aux
     transitions de page — un rebond partout donne le mal de mer. */
  --rebond:cubic-bezier(.34,1.56,.64,1);

  /* les teintes du fond à bulles, lues par bulles.js. Ce sont les couleurs
     RELEVÉES sur les bidons (server/db.js), plus l'or du lettrage. */
  --bulles-teintes:#13aeeb,#f9a7ee,#00c38d,#f0a129,#f2c318,#8ab2cc;
}

/* ── LE PAPIER DEVIENT UN CIEL ────────────────────────────────────────────
   Le crème de l'étiquette 4 L convenait à la Collection Privée ; il tire toute
   la page vers le beige, et le beige n'est ni gai ni enfantin. On garde une
   base très claire mais on la fait respirer en couleur : trois lavis énormes
   et très pâles, pris dans la gamme, posés en fond de page. Aucune valeur ne
   descend sous N9,2 — le texte garde exactement les contrastes mesurés plus
   haut.                                                                    */
[data-theme="jour"]{
  --fond:#fbfdff; --fond2:#ffffff;
  --trait:#e4edf4; --trait-fort:#c3d5e2;
  --creux:rgba(19,174,235,.07);
  --fond-plaque:#ffffff;
}
[data-theme="jour"] body{
  background:
    radial-gradient(58vw 46vw at 8% -6%,  rgba(19,174,235,.16), transparent 62%),
    radial-gradient(52vw 44vw at 96% 12%, rgba(249,167,238,.18), transparent 60%),
    radial-gradient(64vw 50vw at 44% 104%,rgba(0,195,141,.14),  transparent 62%),
    var(--fond);
  background-attachment:fixed;
}
[data-theme="nuit"] body{
  background:
    radial-gradient(58vw 46vw at 8% -6%,  rgba(19,174,235,.16), transparent 62%),
    radial-gradient(52vw 44vw at 96% 12%, rgba(249,167,238,.13), transparent 60%),
    radial-gradient(64vw 50vw at 44% 104%,rgba(242,195,24,.12), transparent 62%),
    var(--fond);
  background-attachment:fixed;
}
html{background:var(--fond)}
#bulles{position:fixed;inset:0;z-index:0;pointer-events:none}
#bulles canvas{position:absolute;inset:0}

/* ── LA TYPO PERD SON UNIFORME ───────────────────────────────────────────
   Tout le chrome était en MONO CAPITALE interlettrée : c'est une étiquette de
   relevé, ça donne à une boutique l'air d'un inventaire de laboratoire. On
   garde le mono là où il sert VRAIMENT — les chiffres qui doivent s'aligner
   (prix, doses, SKU, codes-barres) — et on rend le reste à la ronde, en bas
   de casse, à taille lisible.                                              */
.chip,.btn,nav.main a,.ligne-tag,.kicker,.proof b,footer.bot strong,
.sec-head .filters,.field label,.demo-flag{
  font-family:var(--rond);text-transform:none;letter-spacing:.005em;
  font-size:14px;font-weight:600}
.btn{font-size:15px;font-weight:700}
h1,h2,h3,.hero h1{font-family:var(--rond);letter-spacing:-.018em}
.hero h1{font-weight:800;letter-spacing:-.028em}
.hero h1 em{font-style:normal;font-weight:800;color:var(--bleu)}
[data-theme="nuit"] .hero h1 em{color:var(--or)}
.card h3{font-weight:700;font-size:20px}
/* les cotes techniques restent en mono : là, l'alignement des chiffres est
   une vraie information (comparer 0,082 € et 0,099 € d'un coup d'œil). */
.cote,.cote-produit,.fmt,.dose,.badge,.specs th,.tech,.qty,.progress,.price .p{
  font-family:var(--mono)}

/* ── LES FORMES S'ARRONDISSENT ───────────────────────────────────────────
   La grille était un tableau à filets partagés. Elle redevient un ensemble de
   CARTES : chacune est un objet qu'on peut prendre. C'est le geste qu'on
   attend d'une boutique, et c'est plus facile à viser au doigt.            */
.grid{gap:20px;border-top:0;margin:22px calc(var(--gouttiere)*-1) 8px;
  padding:0 var(--gouttiere)}
.grid>*{border:0;margin-top:0}
.card{border-radius:var(--r);background:var(--fond2);overflow:hidden;
  box-shadow:0 2px 0 rgba(19,42,68,.05),0 10px 26px -18px rgba(19,42,68,.5);
  transition:transform var(--court) var(--rebond),
             box-shadow var(--court) var(--lourd)}
:not(.grid)>.card{border:0;border-radius:var(--r);background:var(--fond2)}
[data-theme="nuit"] .card{background:var(--fond2);
  box-shadow:0 10px 30px -20px #000,inset 0 0 0 1px var(--trait)}
/* le survol SOULÈVE — oui, c'est l'effet le plus banal du web, et c'est
   exactement celui qu'attend quelqu'un qui n'a jamais pensé à une interface.
   Ce qui n'est pas banal reste là : la carte prend la couleur de son bidon,
   le bandeau grossit, la photo se retourne ou le lot s'écarte. */
.card:hover{transform:translateY(-6px);
  background:color-mix(in oklab,var(--c-vue) 9%,var(--fond2));
  box-shadow:0 4px 0 color-mix(in oklab,var(--c-vue) 55%,transparent),
             0 22px 34px -22px color-mix(in oklab,var(--c-vue) 80%,transparent)}
.card:active{transform:translateY(-2px)}
.visual{border-radius:var(--r) var(--r) 0 0}
.visual::after{height:7px}
.card:hover .visual::after,.visual:hover::after{height:14px}

/* ── LES BOUTONS DEVIENNENT DES PASTILLES ────────────────────────────────
   Rectangle à filet partagé → pastille pleine. Elle s'enfonce au clic
   (`scale(.96)`), ce qui donne à un enfant comme à un adulte la seule
   confirmation qui compte : « ça a marché ». Les contrastes ne bougent pas :
   bleu sur or = 9,3:1.                                                     */
.btn{border-radius:var(--r-pastille);padding:14px 28px;margin-left:0;
  border-width:2px;
  transition:transform 140ms var(--rebond),background var(--court) var(--lourd),
             color var(--court) var(--lourd),box-shadow var(--court) var(--lourd),
             border-color var(--court) var(--lourd)}
.btn::before{display:none}          /* le remplissage par la gauche n'a plus lieu d'être */
.cta-row{gap:12px}
.btn.primary{box-shadow:0 4px 0 #c99b0a}
.btn.primary:hover{transform:translateY(-2px);box-shadow:0 6px 0 #c99b0a}
.btn.primary:active{transform:translateY(2px);box-shadow:0 1px 0 #c99b0a}
[data-theme="nuit"] .btn.primary{box-shadow:0 4px 0 #a37c08,0 0 22px -6px var(--or)}
[data-theme="nuit"] .btn.primary:active{box-shadow:0 1px 0 #a37c08}
.btn.ghost{border-color:var(--trait-fort);background:var(--fond2)}
.btn.ghost:hover{transform:translateY(-2px);border-color:var(--bleu);color:var(--encre-fort);
  box-shadow:none}
.btn.ghost:active{transform:translateY(1px)}
.btn:disabled{box-shadow:none!important;transform:none!important}
/* dans la carte, le bouton prend la couleur DU BIDON, pas l'or de la marque :
   quatorze pastilles or à la file, ça ne dit plus rien. Là, chaque bouton dit
   ce qu'il ajoute. L'encre bascule toute seule (`--sur-c`). */
.card .btn.primary{background:var(--c-vue);color:var(--sur-c);
  border-color:transparent;
  box-shadow:0 4px 0 color-mix(in oklab,var(--c-vue) 70%,#000)}
.card .btn.primary:hover{background:color-mix(in oklab,var(--c-vue) 88%,#fff)}
.card .btn.primary:active{box-shadow:0 1px 0 color-mix(in oklab,var(--c-vue) 70%,#000)}

/* ── FILTRES, CHAMPS, VIGNETTES : même rondeur ───────────────────────────── */
.chip{border-radius:var(--r-pastille);padding:10px 18px;margin-left:0;
  border-width:2px;background:var(--fond2);
  transition:transform 140ms var(--rebond),background var(--court) var(--lourd),
             color var(--court) var(--lourd),border-color var(--court) var(--lourd)}
.chip:hover{transform:translateY(-2px)}
.chip::before{border-radius:var(--r-pastille);width:10px;height:10px}
.sec-head .filters{gap:10px}
.field input,.field select,.field textarea{border-radius:var(--r-petit);border-width:2px}
.thumb{border-radius:var(--r-petit)}
.icon-btn{border-radius:var(--r-pastille);border-width:2px;margin-left:8px}
.cart-btn .n{border-radius:var(--r-pastille)}
.badge{border-radius:var(--r-pastille);padding:5px 11px;font-family:var(--rond);
  font-weight:700;text-transform:none;letter-spacing:0;font-size:12.5px}
.galerie,.toast,.demo-flag,.progress{border-radius:var(--r-petit)}
.toast{border-radius:var(--r-pastille);font-family:var(--rond);text-transform:none;
  letter-spacing:.01em;font-size:14px;font-weight:600;padding:13px 24px}
.spectre,.spectre button:first-child{border-radius:var(--r-petit) 0 0 var(--r-petit)}
.spectre button:last-child{border-radius:0 var(--r-petit) var(--r-petit) 0}
.spectre{overflow:hidden}

/* ── LE PANDA ENTRE DANS L'ENTÊTE ────────────────────────────────────────
   Le logo était un cercle à deux points : une abstraction. Sur le bidon c'est
   un panda dessiné, joufflu, qui regarde le client. `shop.js` pose maintenant
   ce panda en SVG ; ici on lui donne son geste — il PENCHE LA TÊTE quand on
   passe dessus, et il cligne des yeux tout seul, rarement.                 */
.logo{font-family:var(--rond);font-size:22px;font-weight:800;letter-spacing:.02em;
  text-transform:none;color:var(--bleu);gap:12px;align-items:center}
[data-theme="nuit"] .logo{color:var(--or)}
.logo .panda{width:38px;height:38px;flex:0 0 auto;display:block;
  transition:transform var(--moyen) var(--rebond)}
.logo:hover .panda{transform:rotate(-9deg) scale(1.08)}
.logo .panda .oeil{transform-origin:center;animation:cligne 7.5s var(--lourd) infinite}
.logo .panda .oeil.d{animation-delay:.06s}
@keyframes cligne{0%,95.5%,100%{transform:scaleY(1)}97.4%{transform:scaleY(.08)}}
/* le mot PANDA, comme sur l'étiquette : plein or, cerné de bleu */
.logo .mot{color:var(--or);-webkit-text-stroke:2.5px var(--bleu);
  paint-order:stroke fill;text-shadow:0 2px 0 rgba(26,35,56,.22)}
[data-theme="nuit"] .logo .mot{-webkit-text-stroke-color:#0d1422}

/* ── L'ENTÊTE ET LE BANDEAU ──────────────────────────────────────────────── */
header.top{background:color-mix(in srgb,var(--fond) 88%,transparent);
  backdrop-filter:blur(10px);border-bottom:2px solid var(--trait)}
.top .wrap{height:68px}
nav.main a{padding:22px 0}
nav.main a::after{border-radius:var(--r-pastille);bottom:16px}
.ticker{font-family:var(--rond);text-transform:none;letter-spacing:.04em;
  font-size:12.5px;font-weight:600;padding:9px 0}

/* ── LE SPECTRE DEVIENT UN NUANCIER QU'ON A ENVIE DE TOUCHER ────────────── */
.spectre{height:82px}
.spectre button{transition:flex-grow var(--moyen) var(--rebond),
                           filter var(--court) var(--lourd)}
.spectre button:hover,.spectre button:focus-visible{flex-grow:3.6;filter:saturate(1.15)}
.spectre button span{font-family:var(--rond);text-transform:none;font-size:13px;
  font-weight:700;letter-spacing:.01em;padding:0 14px 13px}
.spectre-rang>.cote{border-right:0}

/* ── LES SECTIONS RESPIRENT ─────────────────────────────────────────────── */
section{border-bottom:0}
.sec-head{border-bottom:0}
.sec-head::before{border-right:0;color:var(--encre-faible);font-family:var(--rond);
  text-transform:none;font-size:13px;font-weight:700;letter-spacing:.02em}
.hero .marge{border-right:0}
.hero,.proof,.spectre-rang{border-bottom:0}
.proof{background:transparent}
.proof b,.proof .shop{border-right:0}
.proof .shop{border-radius:var(--r-pastille);background:var(--fond2);
  margin:10px 8px;padding:12px 20px;justify-content:center;
  box-shadow:0 2px 0 rgba(19,42,68,.06);font-family:var(--rond);
  text-transform:none;font-weight:700;font-size:14px;letter-spacing:.01em;
  transition:transform var(--court) var(--rebond)}
.proof .shop:hover{transform:translateY(-3px);background:var(--fond2)}
footer.bot{border-top:2px solid var(--trait);background:transparent}
footer.bot .wrap>div{border-right:0}

/* ── LA BULLE QUI VOLE AU PANIER ─────────────────────────────────────────
   Le carré coloré du FLIP devient une bulle de savon : rond, un liseré clair,
   un point de lumière. Même trajet, même durée — c'est la FORME qui change de
   registre, pas le mécanisme.                                              */
.flyer{border-radius:var(--r-pastille);
  box-shadow:inset -3px -4px 8px -2px rgba(0,0,0,.22),
             inset 4px 4px 6px -2px rgba(255,255,255,.85)}

/* ── LE MOUVEMENT D'ENTRÉE DES CARTES ────────────────────────────────────
   Elles montaient de 14 px en fondu. Elles ARRIVENT maintenant en gonflant,
   comme une bulle qui se forme. Même durée, même cascade.                  */
@keyframes entree{from{opacity:0;transform:translateY(18px) scale(.94)}
  to{opacity:1;transform:none}}

@media (max-width:860px){
  .grid{gap:14px}
  .proof .wrap{grid-template-columns:1fr 1fr}
  .spectre{height:64px}
}
@media (prefers-reduced-motion:reduce){
  .logo .panda .oeil{animation:none}
  .card:hover{transform:none}
}

/* ── LA NUIT PEUT ENFIN AVOIR DES TUILES SOMBRES ─────────────────────────
   Tant que la photo était en `multiply`, la plaque devait rester CLAIRE de
   nuit aussi — multiplier sur du sombre écrase le bidon. C'était le seul
   endroit de la page où le thème nuit gardait un grand rectangle blanc, et
   ça se voyait. La photo étant détourée, la contrainte tombe : la tuile passe
   au niveau des surfaces de nuit, et la teinte du bidon l'éclaire.        */
[data-theme="nuit"]{--fond-plaque:#232c3f}
[data-theme="nuit"] .visual{--plaque:color-mix(in oklab,var(--c) 30%,var(--fond-plaque))}

/* la bande de vignettes du produit n'est pas une plaque photo : elle en porte
   le nom (`.galerie`) mais c'est une rangée de boutons. Elle héritait donc du
   fond crème de la plaque — un rectangle clair sous la fiche, très visible de
   nuit. Elle redevient transparente ; ce sont les vignettes qui se voient. */
.fiche .galerie:has(button){background:transparent;border:0;padding:14px 0 0;
  display:flex;gap:10px;flex-wrap:wrap}
.galerie button{border:2px solid var(--trait);border-radius:var(--r-petit);
  background:#fff;padding:4px;cursor:pointer;width:74px;height:74px;overflow:hidden;
  transition:transform var(--court) var(--rebond),border-color var(--court) var(--lourd)}
.galerie button:hover{transform:translateY(-3px)}
.galerie button img{width:100%;height:100%;object-fit:contain}
