/* ══════════════════════════════════════════════════════════════════════
   cryptohardware.io — feuille de style unique.

   Identite : CLAIRE. Fond papier tres pale, encre presque noire, un violet
   electrique comme seule couleur d'action, et l'ambre du bitcoin reserve aux
   moments ou l'on parle d'argent crypto. La couleur porte donc un SENS :
   violet = ce sur quoi on clique, ambre = ce qui se paie en chaine. Un site
   ou tout est colore ne dit plus rien.

   [!] ZERO attribut `style` dans tout le site, et ce n'est pas une coquetterie.
   La CSP est `style-src 'self'` sans `'unsafe-inline'` : le navigateur ignore
   alors TOUT attribut `style` du document — et il l'ignore SANS RIEN CASSER
   d'apparent. Une premiere version passait le remplissage des etoiles et la
   couleur des pastilles crypto par `style="--fill:80%"` / `style="--coin:…"` :
   la page se rendait parfaitement, les cinq etoiles sortaient vides et les huit
   pastilles sortaient de la meme couleur. Rien, dans « la page repond 200 »,
   ne voit ca. Tout ce qui varie passe donc par une CLASSE, listee ici.
   Corollaire pour le JavaScript : `el.style.width = …` reste autorise (la CSP
   ne couvre pas le CSSOM), mais `el.setAttribute('style', …)` est bloque —
   voir app.js.
   ══════════════════════════════════════════════════════════════════════ */

/* ── Polices ─────────────────────────────────────────────────────────── */
@font-face{
  font-family:'Geist';
  src:url('/assets/fonts/geist-var.woff2') format('woff2-variations');
  font-weight:100 900;font-style:normal;font-display:swap;
}
@font-face{
  font-family:'Geist Mono';
  src:url('/assets/fonts/geist-mono-var.woff2') format('woff2-variations');
  font-weight:100 900;font-style:normal;font-display:swap;
}

/* ── Jetons ──────────────────────────────────────────────────────────── */
:root{
  /* teintes */
  --paper:#FFFFFF;
  --canvas:#F6F7FB;
  --tint:#F3F1FE;
  --ink:#0D1018;
  --ink-2:#3B4356;
  --ink-3:#6C7488;
  --ink-4:#98A0B3;
  --line:#E6E8F1;
  --line-2:#F0F2F8;

  --v-50:#F5F2FF;
  --v-100:#EBE5FF;
  --v-200:#D8CDFF;
  --v-500:#6D4AFF;
  --v-600:#5A31F4;
  --v-700:#4B1FD6;
  --v-800:#3B14AC;

  --amber:#F7931A;
  --amber-50:#FFF5E7;
  --green:#0E9F6E;
  --green-50:#E7F7F1;
  --red:#E02424;
  --red-50:#FDECEC;
  --star-on:#F5A524;
  --star-off:#E1E5EF;

  /* typographie */
  --font:'Geist',system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
  --mono:'Geist Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;

  /* geometrie */
  /* 1400 et non 1240 : quatre cartes produit passent de 280 a 320 px de large,
     donc un titre de deux lignes au lieu de trois et des caracteristiques qui
     tiennent sur une rangee de puces. */
  --wrap:1600px;
  /* Gouttiere des barres PLEINE LARGEUR (en-tete, navigation, mega-menu).
     Plus serree que celle du contenu : une barre qui va d'un bord a l'autre
     n'a pas besoin de respirer autant qu'une colonne de texte. */
  --gut-wide:clamp(16px,2.2vw,40px);
  /* [!] La gouttiere de `.wrap`, en VARIABLE. Le panneau du mega-menu est
     positionne en absolu dans un `.wrap` et doit se caler exactement dessus :
     ecrite deux fois, la valeur aurait fini par differer, et le panneau se
     serait decale de quelques pixels sans que personne ne sache pourquoi. */
  --wrap-pad:clamp(16px,4vw,32px);
  /* Rayons volontairement RESSERRES (14/20/28 → 10/14/18). Le grand arrondi
     partout est le tic visuel des pages de logiciel ; un catalogue de
     distribution se lit avec des angles nets. Restent ronds : les pastilles de
     monnaie (ce sont des pieces) et le compteur du panier. */
  /* Rayons RESSERRES une seconde fois (10/14/18 -> 4/6/8). Le grand arrondi
     generalise est LA signature des interfaces faites au kit ; un catalogue
     de materiel se lit avec des angles nets. Ne restent parfaitement ronds
     que deux objets, parce que leur forme porte du SENS : la pastille d'une
     monnaie (c'est une piece) et la bulle de comptage du panier. */
  --r-xs:2px; --r-sm:3px; --r:4px; --r-lg:6px; --r-xl:8px; --r-pill:999px;

  /* ombres — toujours teintees de bleu-violet, jamais du gris pur : une
     ombre grise sur un fond violet tres pale se voit « sale ». Resserrees en
     meme temps que les rayons : une ombre large et diffuse fait flotter, et
     rien ne doit flotter sur une page de stock. */
  /* Des FILETS, pas des halos. Une ombre large et floue sous chaque carte fait
     flotter toute la page ; a la place, une bordure d'un pixel delimite, et
     l'ombre n'est gardee que pour ce qui doit VRAIMENT passer par-dessus le
     reste (menus, volets, tiroirs). */
  --sh-1:0 1px 0 rgba(20,22,40,.04);
  --sh-2:0 1px 2px rgba(20,22,40,.06);
  --sh-3:0 10px 28px -14px rgba(24,20,60,.30), 0 1px 2px rgba(20,22,40,.08);
  --sh-v:none;

  --dur:.18s;
  --ease:cubic-bezier(.32,.72,.32,1);
}

/* ── Base ────────────────────────────────────────────────────────────── */
*,*::before,*::after{box-sizing:border-box}

/* [!] LE garde-fou du parc : une classe qui pose display:flex|grid|block bat
   la feuille du navigateur pour [hidden] (specificite egale, la feuille
   auteur gagne). Sans cette ligne, un panneau « cache » s'affiche quand meme,
   vide, et personne ne comprend pourquoi. */
[hidden]{display:none!important}

html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:var(--font);font-size:16px;line-height:1.6;font-weight:400;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  font-variant-numeric:tabular-nums;
}
img,svg{max-width:100%;height:auto;display:block}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
input,select,textarea{font:inherit;color:inherit}
h1,h2,h3,h4{margin:0;font-weight:660;letter-spacing:-.022em;line-height:1.14}
p{margin:0}
ul,ol{margin:0;padding:0;list-style:none}
b,strong{font-weight:620}
s{color:var(--ink-4)}
:focus-visible{outline:2.5px solid var(--v-600);outline-offset:2px;border-radius:4px}

.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
    clip:rect(0 0 0 0);white-space:nowrap;border:0}
.skip{position:absolute;left:12px;top:-60px;z-index:200;background:var(--ink);color:#fff;
      padding:.7rem 1.1rem;border-radius:var(--r-sm);transition:top var(--dur)}
.skip:focus{top:12px}
.muted{color:var(--ink-3)}

/* [!] `padding-inline` et jamais le raccourci `padding` sur .wrap : un
   `padding:` pose ailleurs sur le meme element ecraserait la marge laterale
   et collerait le contenu aux bords — invisible en grand ecran, ou la marge
   du max-width le masque, et bien visible sous 1200 px. Panne deja vue. */
/* [!] `.wrap` PUBLIE sa gouttiere dans `--wrap-x`. Elle ne vaut PAS toujours
   `--wrap-pad` : sous 560 px un reglage plus bas la ramene a 14 px. Tout ce
   qui doit sortir de la colonne pour toucher le bord de l'ecran — les
   rangees de produits — lit donc `--wrap-x`, et non le jeton. Ecrit avec le
   jeton, le decalage valait 16 a 22 px la ou le rembourrage n'en faisait
   que 14 : la rangee depassait de 2 a 8 px, la page se mettait a defiler
   lateralement sur telephone, et rien ne le disait a l'oeil. */
.wrap{--wrap-x:var(--wrap-pad);
      width:100%;max-width:var(--wrap);margin-inline:auto;padding-inline:var(--wrap-x)}

/* ── Boutons ─────────────────────────────────────────────────────────── */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:.5rem;
  padding:.66rem 1.05rem;border-radius:var(--r-sm);font-weight:560;font-size:.95rem;
  letter-spacing:-.008em;white-space:nowrap;
  transition:transform var(--dur) var(--ease),box-shadow var(--dur),background var(--dur),border-color var(--dur),color var(--dur);
}
.btn svg{flex:none}
.btn-lg{padding:.86rem 1.4rem;font-size:1rem;border-radius:var(--r)}
.btn-sm{padding:.5rem .8rem;font-size:.87rem;gap:.4rem}
.btn-block{width:100%}
.btn-primary{
  /* Aplat, pas de degrade vertical ni de halo colore : c'est ce couple-la qui
     fait << bouton de page de lancement >>. */
  background:var(--v-600);color:#fff;
}
.btn-primary:hover{background:var(--v-700)}
.btn-primary:active{background:var(--v-800)}
.btn-ghost{background:var(--paper);color:var(--ink);box-shadow:inset 0 0 0 1.5px var(--line),var(--sh-1)}
.btn-ghost:hover{box-shadow:inset 0 0 0 1.5px var(--v-200),var(--sh-2);color:var(--v-700)}
.btn-quiet{background:var(--v-50);color:var(--v-700)}
.btn-quiet:hover{background:var(--v-100)}
.btn-dark{background:var(--ink);color:#fff}
.btn-dark:hover{background:#1B2030}

.iconbtn{display:inline-grid;place-items:center;width:40px;height:40px;border-radius:var(--r-sm);
         color:var(--ink-2);transition:background var(--dur),color var(--dur)}
.iconbtn:hover{background:var(--v-50);color:var(--v-700)}

/* ── Surtitres et en-tetes de section ────────────────────────────────── */
.eyebrow{
  display:inline-flex;align-items:center;gap:.4rem;margin:0 0 .7rem;
  font-family:var(--mono);font-size:.735rem;font-weight:560;letter-spacing:.09em;
  text-transform:uppercase;color:var(--v-700);
}
.eyebrow svg{color:var(--v-600)}
.eyebrow--pill{background:var(--v-50);padding:.4rem .8rem;border-radius:var(--r-xs);
               box-shadow:inset 0 0 0 1px var(--v-100)}

.shead{display:flex;align-items:flex-end;justify-content:space-between;gap:2rem;margin-bottom:2.2rem}
.shead-txt{max-width:62ch}
.shead-title{font-size:clamp(1.65rem,1.15rem + 1.7vw,2.45rem);letter-spacing:-.03em}
.shead-lede{margin-top:.7rem;color:var(--ink-3);font-size:1.02rem}
.shead-lede a{color:var(--v-700);text-decoration:underline;text-underline-offset:3px}
.shead-link{flex:none}
.shead--center{justify-content:center;text-align:center}
.shead--center .shead-txt{margin-inline:auto}
.shead--center .eyebrow{justify-content:center}

.sec{padding-block:clamp(3.4rem,2rem + 4vw,5.6rem)}
.sec--tint{background:var(--canvas)}
.sec--ink{background:linear-gradient(180deg,#FBFAFF,#F4F1FE)}

/* == Structure de la page ================================================
   Deux largeurs, comme sur les grandes boutiques (Newegg, Amazon) :

     - les BARRES du haut - annonces, en-tete, navigation, mega-menu - vont
       d'un bord a l'autre de l'ecran, avec une simple gouttiere ;
     - le CONTENU reste dans une colonne de --wrap (1400 px), centree.

   L'effet recherche : sur un grand ecran, la recherche et le panier restent
   aux extremites, la ou la main les cherche, pendant que le texte garde une
   longueur de ligne lisible. Une colonne de 1400 px pour l'en-tete AUSSI
   laisserait deux grandes marges vides en haut de page - ce qui fait
   << site vitrine >> et pas << boutique >>.

   [!] Fait ICI, en CSS, et pas en changeant les classes du gabarit : les
   memes `.wrap` servent aux deux registres, seul le contexte decide. Un
   `.wrap-wide` dans le HTML aurait demande de retoucher header.php a chaque
   nouvelle barre, et un oubli ne se serait vu que sur un tres grand ecran.
   Selecteurs a deux classes (0,2,0) a dessein : ils gagnent sur `.wrap` quel
   que soit l'ordre des regles dans le fichier. */
/* [!] L'en-tete faisait la largeur de l'ecran (structure Newegg) ; il est
   desormais BORNE comme le contenu, sur demande du proprietaire. Les barres
   gardent leur fond pleine largeur — c'est leur contenu qui s'aligne sur la
   colonne, pas le trait de separation. */

/* Le panneau du mega-menu est BORNE puis cale a GAUCHE : etale sur 2560 px,
   ses quatre colonnes atteindraient 550 px chacune et la liste deviendrait
   illisible ; centre, il ne serait plus aligne sous le bouton qui l'ouvre. */
.hdr .mega-in{max-width:1720px;margin-inline:0}

/* ══ Bandeau d'annonces ══════════════════════════════════════════════ */
.announce{background:var(--ink);color:#EEF0F6;font-size:.82rem}
.announce-in{display:flex;align-items:center;justify-content:space-between;gap:1.5rem;min-height:38px}
.announce-msgs{position:relative;flex:1;min-width:0;height:38px}
.announce-msg{
  position:absolute;inset:0;display:flex;align-items:center;gap:.5rem;
  opacity:0;transform:translateY(6px);pointer-events:none;
  transition:opacity .3s var(--ease),transform .3s var(--ease);
}
/* Les messages sont empiles au meme endroit : en fondu simultane, on lisait
   les deux l'un SUR l'autre au milieu de la transition. Le message entrant
   attend donc que le sortant ait fini de disparaitre. */
.announce-msg.is-on{opacity:1;transform:none;transition-delay:.28s}
.announce-msg svg{color:var(--v-500);flex:none}
.announce-msg span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.announce-links{display:flex;gap:1.3rem;flex:none}
.announce-links a{display:inline-flex;align-items:center;gap:.4rem;color:#B9C0D2;transition:color var(--dur)}
.announce-links a:hover{color:#fff}

/* ══ En-tete ═════════════════════════════════════════════════════════ */
/* Fond OPAQUE et filet net, plutot qu'un flou d'arriere-plan translucide :
   le verre depoli est l'autre signature des interfaces faites au kit, et il
   rend le texte de l'en-tete moins net sur les ecrans sans sur-echantillonnage. */
.hdr{position:sticky;top:0;z-index:60;background:var(--paper);
     border-bottom:1px solid var(--line)}
.hdr.is-stuck{box-shadow:var(--sh-2);border-bottom-color:transparent}

.hdr-main{display:flex;align-items:center;gap:1.1rem;min-height:74px}
.hdr-burger{display:none;width:42px;height:42px;place-items:center;border-radius:var(--r-sm);color:var(--ink)}

.brand{display:inline-flex;align-items:center;gap:.62rem;flex:none}
.brand-logo{display:block;height:29px;width:auto}
.brand-logo--sm{height:24px}
@media (max-width:640px){
  .brand-logo{height:25px}
}

/* ── Recherche ───────────────────────────────────────────────────────── */
/* La recherche prend la place laissee libre par l'en-tete pleine largeur,
   avec une borne : au-dela, un champ de 1200 px ne se lit plus comme un
   champ, il se lit comme une barre grise. */
.search{position:relative;flex:1;max-width:880px;margin-inline:auto}
.search-ico{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:var(--ink-4);pointer-events:none}
.search input{
  width:100%;height:46px;padding:0 52px 0 44px;border-radius:var(--r-sm);
  background:var(--canvas);border:1.5px solid transparent;
  transition:border-color var(--dur),background var(--dur),box-shadow var(--dur);
}
.search input::placeholder{color:var(--ink-4)}
.search input:focus{outline:0;background:var(--paper);border-color:var(--v-200);box-shadow:0 0 0 4px var(--v-50)}
.search input::-webkit-search-cancel-button{-webkit-appearance:none}
.search-go{
  position:absolute;right:4px;top:50%;transform:translateY(-50%);
  display:grid;place-items:center;width:38px;height:38px;border-radius:var(--r-xs);
  background:var(--v-600);color:#fff;transition:background var(--dur)
}
.search-go:hover{background:var(--v-700)}
/* Bouton de langue : le meme gabarit que celui des monnaies, en plus court.
   Deux commandes de meme nature cote a cote doivent se ressembler, sinon on
   croit qu'elles font deux choses de nature differente. */
.langbtn{display:inline-flex;align-items:center;gap:.4rem;height:40px;padding:0 .6rem;
         border-radius:var(--r-sm);color:var(--ink-2);font-weight:600;font-size:.86rem;
         transition:background var(--dur),color var(--dur)}
.langbtn:hover{background:var(--canvas);color:var(--v-700)}
.langbtn-t{font-family:var(--mono);letter-spacing:.04em}
/* [!] Le drapeau est ROGNE par son cadre : les diagonales de l'Union Jack
   partent des coins, et leur epaisseur de trait deborde du rectangle. Sans
   `overflow:hidden`, quatre petits ergots rouges et blancs depassent. */
.langbtn-f{display:block;width:22px;height:16px;flex:none;border-radius:2px;overflow:hidden;
           box-shadow:inset 0 0 0 1px rgba(15,17,26,.12)}
.langflag{display:block;width:100%;height:100%}
.langflag--none{display:grid;place-items:center;width:100%;height:100%;
                font-family:var(--mono);font-size:.6rem;background:var(--canvas);color:var(--ink-3)}
.fxmod--lang{max-width:460px}
.fxmod--lang .fxmod-h{display:flex;align-items:center;gap:.45rem}
.fxmod--lang .langrow{grid-template-columns:1fr}

/* « Annuler » de la recherche ancree en bas. Hors de cet usage, il n'existe
   pas : dans l'en-tete de bureau, le champ n'a rien a fermer. */
.search-cancel{display:none;place-items:center;flex:none;height:44px;padding:0 .2rem 0 .7rem;
               color:var(--ink-3);font-size:.9rem;font-weight:550;white-space:nowrap;
               background:none;border:0;cursor:pointer}
.search-cancel:hover{color:var(--v-700)}

.search-panel{
  position:absolute;left:0;right:0;top:calc(100% + 10px);z-index:70;
  background:var(--paper);border-radius:var(--r);box-shadow:var(--sh-3);
  border:1px solid var(--line-2);padding:.45rem;max-height:min(62vh,520px);overflow:auto
}
.sres{display:flex;align-items:center;gap:.8rem;padding:.55rem .6rem;border-radius:var(--r-xs);transition:background var(--dur)}
.sres:hover,.sres:focus-visible{background:var(--v-50)}
.sres img{width:42px;height:42px;object-fit:contain;border-radius:var(--r-xs);background:var(--canvas);flex:none}
.sres-t{min-width:0;flex:1}
.sres-t b{display:block;font-weight:540;font-size:.93rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sres-t small{color:var(--ink-3);font-size:.79rem}
.sres-p{font-weight:600;font-size:.92rem;flex:none;font-variant-numeric:tabular-nums}
.sres-none{padding:1.1rem;color:var(--ink-3);text-align:center;font-size:.92rem}

/* ── Actions d'en-tete ───────────────────────────────────────────────── */
.hdr-acts{display:flex;align-items:center;gap:.35rem;flex:none;margin-left:auto}

/* Pastille de monnaie : le LOGO OFFICIEL de la piece, servi en <img> depuis
   /assets/coins/<ticker>.svg (jeu `cryptocurrency-icons`, deja utilise sur le
   parc). Le disque colore et le glyphe blanc sont DANS le fichier : il n'y a
   donc plus ni couleur ni lettre a tenir ici. Seule la taille reste une
   classe. Le rayon 50% est un garde-fou : si un logo arrivait un jour en
   carre, il serait quand meme rogne en piece. */
.coin-badge{display:block;flex:none;width:var(--sz,20px);height:var(--sz,20px);border-radius:50%}
.cb-16{--sz:16px} .cb-18{--sz:18px} .cb-20{--sz:20px}
.cb-22{--sz:22px} .cb-26{--sz:26px} .cb-30{--sz:30px}

.coinsel{position:relative}
.coinsel-btn{display:inline-flex;align-items:center;gap:.4rem;height:40px;padding:0 .6rem 0 .5rem;
             border-radius:var(--r-sm);font-family:var(--mono);font-size:.85rem;font-weight:560;
             transition:background var(--dur)}
.coinsel-btn:hover{background:var(--v-50)}
.coinsel-btn svg{color:var(--ink-4)}
.coinsel-menu{
  position:absolute;right:0;top:calc(100% + 8px);z-index:70;width:262px;
  background:var(--paper);border-radius:var(--r);box-shadow:var(--sh-3);
  border:1px solid var(--line-2);padding:.4rem
}
.coinsel-head{padding:.5rem .6rem .35rem;font-size:.75rem;color:var(--ink-3);
              text-transform:uppercase;letter-spacing:.07em;font-family:var(--mono)}
.coinsel-item{display:flex;align-items:center;gap:.65rem;width:100%;padding:.5rem .6rem;
              border-radius:var(--r-xs);text-align:left;transition:background var(--dur)}
.coinsel-item:hover{background:var(--v-50)}
.coinsel-tick{color:var(--v-600);opacity:0}
.coinsel-item.is-on .coinsel-tick{opacity:1}
.coinsel-foot{display:flex;align-items:center;gap:.4rem;padding:.6rem;margin-top:.25rem;
              border-top:1px solid var(--line-2);color:var(--ink-3);font-size:.78rem}

.cartbtn{display:inline-flex;align-items:center;gap:.6rem;height:44px;padding:0 .95rem 0 .75rem;
         border-radius:var(--r-sm);background:var(--ink);color:#fff;transition:background var(--dur)}
.cartbtn:hover{background:#1B2030}
.cartbtn-ico{position:relative;display:grid;place-items:center}
.cartbtn-n{position:absolute;top:-7px;right:-9px;min-width:18px;height:18px;padding:0 4px;
           display:grid;place-items:center;border-radius:var(--r-pill);
           background:var(--v-500);color:#fff;font-family:var(--mono);font-size:.68rem;font-weight:700}
.cartbtn-txt{display:flex;flex-direction:column;line-height:1.15;text-align:left}
.cartbtn-txt small{font-size:.68rem;color:#A9B1C6;letter-spacing:.04em;text-transform:uppercase}
.cartbtn-txt b{font-size:.9rem;font-weight:620;font-variant-numeric:tabular-nums}

/* ── Barre de rubriques ──────────────────────────────────────────────── */
/* [!] Ni `overflow:hidden` ni `overflow:auto` sur .hdr-nav : le mega-menu est
   en position absolue a l'interieur, et un ancetre defilant le rognerait —
   panne deja rencontree ailleurs sur ce parc, et qui ne se voit qu'ouvert. */
.hdr-nav{position:relative;border-top:1px solid var(--line-2);background:var(--paper)}
.hdr-nav-in{display:flex;align-items:center;gap:.4rem;min-height:50px}
.allcats{display:inline-flex;align-items:center;gap:.5rem;height:36px;padding:0 .85rem;
         border-radius:var(--r-sm);background:var(--v-600);color:#fff;font-weight:540;font-size:.9rem;
         transition:background var(--dur)}
.allcats:hover,.allcats[aria-expanded=true]{background:var(--v-700)}
.allcats svg:last-child{transition:transform var(--dur)}
.allcats[aria-expanded=true] svg:last-child{transform:rotate(180deg)}
.navlist{display:flex;align-items:center;gap:.15rem;margin-left:.5rem;min-width:0;overflow-x:auto;
         scrollbar-width:none}
.navlist::-webkit-scrollbar{display:none}
.navlist a{display:inline-flex;align-items:center;gap:.35rem;padding:.45rem .7rem;border-radius:var(--r-xs);
           font-size:.92rem;color:var(--ink-2);white-space:nowrap;transition:background var(--dur),color var(--dur)}
.navlist a:hover{background:var(--v-50);color:var(--v-700)}
.navlist a.is-accent{color:var(--amber);font-weight:560}
.navlist a.is-accent:hover{background:var(--amber-50);color:#C97612}
.navpay{margin-left:auto;display:inline-flex;align-items:center;gap:.4rem;font-size:.86rem;
        color:var(--ink-3);white-space:nowrap;transition:color var(--dur)}
.navpay:hover{color:var(--v-700)}
.navpay svg{color:var(--v-600)}

/* == Mega-menu A DEUX VOLETS =============================================
   Seize rayons et 390 categories : la grille d'antan (une colonne par rayon,
   sous-rubriques deroulees) faisait un panneau de plus de 2 000 px de haut.
   Ici, la liste des rayons a gauche, et le panneau du rayon survole s'affiche
   a droite PAR-DESSUS l'encart par defaut. La hauteur ne depend donc plus du
   nombre de rayons, mais du plus gros d'entre eux.

   [!] Le panneau est positionne par rapport a `.mega-in`, qui porte la
   gouttiere pleine largeur : ses decalages valent donc `var(--gut-wide)` plus
   la largeur de la liste, et non zero. Un `left:0` le collerait au bord de
   l'ecran, sous la liste. */
.mega{position:absolute;left:0;right:0;top:100%;z-index:65;
      background:var(--paper);border-top:1px solid var(--line);box-shadow:var(--sh-3);
      animation:mega-in .18s var(--ease)}
@keyframes mega-in{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
/* [!] La hauteur suit la LISTE, elle ne la borne pas a 560 px : les seize
   rayons en font 562, et le panneau coupait donc les deux derniers en plein
   milieu, avec le rail de l'accueil qui reapparaissait dessous. Un menu
   deroulant ou il faut faire defiler pour voir le dernier rayon est un menu
   rate. Le plafond ne sert qu'au cas ou l'arbre grossirait beaucoup. */
.mega-in{position:relative;display:grid;grid-template-columns:266px minmax(0,1fr);
         min-height:min(62vh,500px)}
.mega-list{border-right:1px solid var(--line);padding:.55rem .6rem .55rem 0;
           max-height:min(86vh,720px);overflow-y:auto}
.mega-cat-link{display:flex;align-items:center;gap:.55rem;padding:.4rem .6rem;
               border-radius:var(--r-xs);font-size:.885rem;color:var(--ink-2);
               transition:background var(--dur),color var(--dur)}
.mega-cat-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mega-cat-link>svg:last-child{color:var(--ink-4);flex:none}
.mega-cat:hover .mega-cat-link,
.mega-cat:focus-within .mega-cat-link{background:var(--v-50);color:var(--v-700)}
.mega-ico{display:grid;place-items:center;width:26px;height:26px;flex:none;border-radius:var(--r-xs);
          background:var(--v-50);color:var(--v-600);transition:background var(--dur),color var(--dur)}
.mega-cat:hover .mega-ico,
.mega-cat:focus-within .mega-ico{background:var(--v-600);color:#fff}

.mega-pane{position:absolute;top:0;bottom:0;z-index:2;
           left:calc(var(--wrap-pad) + 266px);right:var(--wrap-pad);
           background:var(--paper);padding:1.3rem 0 1.4rem 1.7rem;overflow-y:auto;
           opacity:0;visibility:hidden;
           transition:opacity .12s var(--ease),visibility .12s}
.mega-cat:hover .mega-pane,
.mega-cat:focus-within .mega-pane{opacity:1;visibility:visible}

.mega-side{align-self:center;justify-self:center;max-width:440px;padding:1.8rem}
.mega-side h3,.mega-side-h{font-size:1.12rem;font-weight:640;line-height:1.25;
                           margin:0 0 .5rem;letter-spacing:-.025em;color:var(--ink)}
.mega-side p{color:var(--ink-3);font-size:.9rem;margin-bottom:1rem}
.mega-side-pts{margin-top:1rem;display:grid;gap:.4rem}
.mega-side-pts li{display:flex;align-items:center;gap:.45rem;font-size:.84rem;color:var(--ink-2)}
.mega-side-pts svg{color:var(--green)}

/* == Panneau d'un rayon (partage : mega-menu ET rail de l'accueil) ========
   `column-width` et non `columns:4` : le nombre de colonnes se deduit de la
   largeur disponible, donc le meme panneau tient dans le mega-menu (large) et
   dans le volet du rail (plus etroit) sans une seule regle de plus. */
.cpanel-head{display:flex;align-items:baseline;gap:1rem 1.4rem;flex-wrap:wrap;
             margin-bottom:1.05rem;padding-bottom:.8rem;border-bottom:1px solid var(--line-2);
             padding-right:1.6rem}
.cpanel-title{display:inline-flex;align-items:center;gap:.4rem;font-size:1.02rem;font-weight:620;
              letter-spacing:-.02em}
.cpanel-title:hover{color:var(--v-700)}
.cpanel-blurb{flex:1;min-width:240px;color:var(--ink-3);font-size:.85rem}
.cpanel-cols{column-width:245px;column-gap:1.8rem;padding-right:1.6rem}
.cgroup{break-inside:avoid;margin-bottom:1.05rem}
.cgroup-h{display:block;font-weight:600;font-size:.87rem;margin-bottom:.3rem;letter-spacing:-.012em}
.cgroup-h:hover{color:var(--v-700)}
.cgroup ul{display:grid;gap:.1rem}
.cgroup li a{display:block;font-size:.835rem;line-height:1.45;color:var(--ink-3);
             transition:color var(--dur)}
.cgroup li a:hover{color:var(--v-700)}

/* == Rail de rayons (accueil) ============================================
   SEIZE rayons, donc des lignes de TEXTE sans pastille : seize icones les unes
   sous les autres sont du bruit, et elles doublaient la hauteur de la colonne.

   [!] Le volet se positionne par rapport au RAIL (`top:0;bottom:0`), pas par
   rapport a la ligne survolee : il fait ainsi exactement la hauteur du rail,
   quel que soit le rayon, au lieu de deborder vers le bas sur les derniers.
   [!] Ni `.hero`, ni `.hero-in`, ni `.crail` ne doivent recevoir
   `overflow:hidden` — le volet sort par la droite. */
.crail{position:relative;z-index:5;display:flex;flex-direction:column;
       background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);
       box-shadow:var(--sh-2);padding:.4rem}
.crail-h{display:flex;align-items:center;gap:.45rem;padding:.5rem .6rem .55rem;
         font-family:var(--mono);font-size:.67rem;letter-spacing:.13em;text-transform:uppercase;
         color:var(--ink-4);border-bottom:1px solid var(--line-2);margin-bottom:.25rem}
.crail-h svg{color:var(--v-600)}
.crail-link{display:flex;align-items:center;gap:.5rem;padding:.32rem .6rem;
            border-radius:var(--r-xs);font-size:.865rem;color:var(--ink-2);
            transition:background var(--dur),color var(--dur)}
.crail-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.crail-go{color:var(--ink-4);display:flex;flex:none;transition:transform var(--dur)}
.crail-item:hover .crail-link,
.crail-item:focus-within .crail-link{background:var(--v-50);color:var(--v-700)}
.crail-item:hover .crail-go,
.crail-item:focus-within .crail-go{transform:translateX(2px);color:var(--v-600)}
.crail-foot{display:flex;align-items:center;gap:.5rem;margin-top:auto;padding:.65rem .6rem .45rem;
            border-top:1px solid var(--line-2);font-size:.84rem;font-weight:520;color:var(--amber)}
.crail-foot span{flex:1}
.crail-foot:hover{color:#B26A08}

.crail-fly{position:absolute;left:100%;top:0;bottom:0;z-index:20;margin-left:.5rem;
           width:min(940px,calc(100vw - 26rem));
           background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);
           box-shadow:var(--sh-3);padding:1.2rem 0 1.2rem 1.3rem;overflow-y:auto;
           opacity:0;visibility:hidden;transform:translateX(-6px);
           transition:opacity .14s var(--ease),transform .14s var(--ease),visibility .14s}
.crail-item:hover .crail-fly,
.crail-item:focus-within .crail-fly{opacity:1;visibility:visible;transform:none}



/* ══ Voile + tiroirs ═════════════════════════════════════════════════ */
.scrim{position:fixed;inset:0;z-index:75;background:rgba(13,16,24,.42);
       opacity:0;transition:opacity .24s var(--ease)}
.scrim.is-open{opacity:1}

.drawer{position:fixed;top:0;bottom:0;z-index:80;width:min(420px,92vw);
        display:flex;flex-direction:column;background:var(--paper);box-shadow:var(--sh-3);
        transition:transform .28s var(--ease)}
.drawer--right{right:0;transform:translateX(100%)}
.drawer--left{left:0;transform:translateX(-100%)}
.drawer.is-open{transform:none}
.drawer-top{display:flex;align-items:center;justify-content:space-between;gap:1rem;
            padding:1rem 1.1rem;border-bottom:1px solid var(--line-2);flex:none}
.drawer-top b{display:inline-flex;align-items:center;gap:.5rem;font-size:1.02rem}
.drawer-body{flex:1;overflow-y:auto;padding:1rem 1.1rem}
.drawer-foot{flex:none;border-top:1px solid var(--line-2);padding:1.1rem;background:var(--canvas)}

.mobnav>li{border-bottom:1px solid var(--line-2)}
.mobnav summary{display:flex;align-items:center;gap:.65rem;padding:.85rem 0;font-weight:540;
                cursor:pointer;list-style:none}
.mobnav summary::-webkit-details-marker{display:none}
.mobnav summary svg:last-child{margin-left:auto;color:var(--ink-4);transition:transform var(--dur)}
.mobnav details[open] summary svg:last-child{transform:rotate(180deg)}
.mobnav details ul{padding:0 0 .8rem 2.4rem;display:grid;gap:.15rem}
.mobnav details ul a{display:block;padding:.35rem 0;color:var(--ink-3);font-size:.92rem}
.mobnav--flat{margin-top:1.2rem}
.mobnav--flat li{border:0}
.mobnav--flat a{display:flex;align-items:center;gap:.65rem;padding:.7rem 0;font-weight:520}
.mobnav--flat svg{color:var(--v-600)}

/* ── Panier ──────────────────────────────────────────────────────────── */
.cart-list{display:grid;gap:.9rem}
/* Deux colonnes et DEUX RANGEES, pas trois colonnes : en une seule rangee, le
   selecteur de quantite et « Remove » ecrasaient la colonne du milieu et le
   prix se coupait au milieu du ticker (« 0.00725 / BTC » sur deux lignes, par
   dessus la ligne suivante). La vignette enjambe les deux rangees. */
.citem{display:grid;grid-template-columns:64px minmax(0,1fr);gap:.55rem .85rem;align-items:start;
       padding-bottom:.9rem;border-bottom:1px solid var(--line-2)}
.citem img{width:64px;height:64px;object-fit:contain;background:var(--canvas);border-radius:var(--r-xs);
           grid-row:1/3}
.citem>div:last-child{display:flex;align-items:center;justify-content:space-between;gap:.6rem}
.citem-t b{display:block;font-size:.92rem;font-weight:540;line-height:1.35}
.citem-t .citem-p{display:block;font-family:var(--mono);font-size:.8rem;color:var(--ink-3);margin-top:.15rem}
.citem-q{display:inline-flex;align-items:center;gap:.1rem;border:1px solid var(--line);
         border-radius:var(--r-sm);padding:.1rem}
.citem-q button{display:grid;place-items:center;width:26px;height:26px;border-radius:var(--r-xs);color:var(--ink-3)}
.citem-q button:hover{background:var(--v-50);color:var(--v-700)}
.citem-q span{min-width:22px;text-align:center;font-family:var(--mono);font-size:.85rem;font-weight:600}
.citem-x{color:var(--ink-4);font-size:.82rem;text-decoration:underline;text-underline-offset:3px}
.citem-x:hover{color:var(--red)}
/* Meme regle jusque dans l'etat vide : la grosse pastille centree mangeait
   90 px de haut pour dire ce que la phrase juste en dessous disait deja. */
.cart-empty{display:grid;grid-template-columns:auto 1fr;column-gap:.85rem;align-items:center;
            padding:1.2rem;border:1px dashed var(--line);border-radius:var(--r);
            background:var(--canvas)}
.cart-empty-ico{grid-area:1/1;display:grid;place-items:center;width:42px;height:42px;
                border-radius:var(--r-sm);background:var(--v-50);color:var(--v-600)}
.cart-empty-ico svg{width:22px;height:22px}
.cart-empty p:first-of-type{grid-area:1/2}
.cart-empty p.muted{grid-area:2/1/3/3;margin-top:.5rem;font-size:.88rem}
.cart-empty .btn{grid-area:3/1/4/3;margin-top:.9rem;justify-self:start}
.cart-sum{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:.4rem}
.cart-sum b{font-size:1.2rem;font-weight:660;font-variant-numeric:tabular-nums}
.cart-sum--coin{color:var(--ink-3);font-size:.9rem}
.cart-sum--coin b{font-size:.98rem;color:var(--ink)}
.cart-note{display:flex;align-items:center;gap:.4rem;margin:.7rem 0 .9rem;
           font-size:.79rem;color:var(--ink-3)}
.cart-note svg{color:var(--v-600);flex:none}
.cart-trust{display:flex;align-items:center;justify-content:center;gap:.4rem;margin-top:.7rem;
            font-size:.76rem;color:var(--ink-4)}

/* == Heros ==============================================================
   BORNE, comme tout le reste du contenu. La photo ne file plus d'un bord a
   l'autre : elle vit dans une banniere arrondie qui occupe la colonne de
   droite, et le rail de rubriques occupe celle de gauche. C'est le montage
   des grandes boutiques - un menu permanent et une banniere, tous deux dans
   la meme colonne de contenu.

   [!] `overflow:hidden` est sur la BANNIERE, jamais sur `.hero` ni sur
   `.hero-in` : le volet du rail sort par la droite, et un ancetre qui rogne
   le ferait disparaitre. Panne deja vue ailleurs sur ce parc, invisible tant
   qu'on n'ouvre pas le menu. */
.hero{position:relative;background:var(--canvas);border-bottom:1px solid var(--line);
      padding-block:clamp(.9rem,.6rem + 1vw,1.5rem) clamp(1.3rem,1rem + 1.4vw,2rem)}
.hero-in{display:grid;grid-template-columns:284px minmax(0,1fr);
         gap:clamp(.9rem,1.2vw,1.5rem);align-items:stretch}

/* [!] EMPILEMENT EN POSITIF (0 / 1 / 2), pas en negatif.
   La version precedente posait la photo en `z-index:-2` et le voile en `-1`
   sous un parent `isolation:isolate` : tant que ce parent n'avait pas
   `overflow:hidden`, tout allait bien ; des qu'on l'a ajoute pour arrondir les
   angles de la banniere, **la photo a cesse d'etre peinte**. Elle etait
   pourtant chargee, dimensionnee au pixel pres et au bon endroit — seule une
   mesure de pixels le montrait, aucune erreur nulle part. Un empilement en
   positif n'a pas ce genre de coin sombre : la photo est le fond, le voile
   par-dessus, le texte par-dessus encore. */
.herobanner{position:relative;overflow:hidden;
            border-radius:var(--r-xl);border:1px solid var(--line);
            display:flex;align-items:center;
            padding:clamp(1.5rem,1rem + 2.2vw,3rem);
            min-height:clamp(340px,24vw,430px)}
.hero-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
         object-position:64% 50%;z-index:0}
.hero-scrim{position:absolute;inset:0;z-index:1;background:
  linear-gradient(97deg,#fff 0%,rgba(255,255,255,.97) 24%,rgba(255,255,255,.86) 41%,
                  rgba(255,255,255,.45) 62%,rgba(255,255,255,.15) 84%,rgba(255,255,255,.06) 100%),
  linear-gradient(180deg,rgba(109,74,255,.08) 0%,rgba(109,74,255,0) 60%)}
.hero-txt{position:relative;z-index:2;max-width:660px}

/* Surtitre : un FILET et des capitales espacees, pas une gelule sur fond
   pastel. La gelule arrondie est le tic visuel des pages de logiciel ; le
   filet et la petite capitale sont le vocabulaire des catalogues. */
.tagline{display:inline-flex;align-items:center;gap:.7rem;margin-bottom:1.1rem;
         font-family:var(--mono);font-size:.72rem;font-weight:560;letter-spacing:.15em;
         text-transform:uppercase;color:var(--v-700)}
.tagline::before{content:"";width:30px;height:2px;background:var(--v-600);flex:none}

.hero h1{font-size:clamp(2.1rem,1.2rem + 2.9vw,3.2rem);letter-spacing:-.04em;
         line-height:1.05;font-weight:690}
/* Violet plein et non degrade dans le texte : un titre en degrade est
   exactement ce qui fait << page de lancement >>. */
.hero h1 .hl{color:var(--v-700);white-space:nowrap}
.hero-lede{margin-top:1.1rem;font-size:clamp(1rem,.95rem + .3vw,1.1rem);color:var(--ink-2);max-width:56ch}
.hero-cta{display:flex;flex-wrap:wrap;align-items:center;gap:.7rem;margin-top:1.7rem}
/* [!] Le rembourrage vertical n'est pas decoratif : sans lui, ce lien fait
   24 px de haut, soit la limite basse de WCAG 2.5.8 et la moitie de ce
   qu'Apple demande. C'est la TROISIEME action du heros, posee entre deux
   boutons de 48 px ; a cette taille elle se rate au doigt. */
.hero-link{display:inline-flex;align-items:center;gap:.35rem;margin-left:.35rem;font-size:.93rem;
           padding-block:.6rem;
           color:var(--ink-2);text-decoration:underline;text-underline-offset:4px;
           text-decoration-color:var(--v-200);transition:color var(--dur)}
.hero-link:hover{color:var(--v-700);text-decoration-color:var(--v-600)}

.hero-coins{display:flex;align-items:center;flex-wrap:wrap;gap:.7rem .9rem;margin-top:1.8rem}
.hero-coins-lbl{font-family:var(--mono);font-size:.68rem;letter-spacing:.15em;
                text-transform:uppercase;color:var(--ink-4)}

.coinrow{display:flex;flex-wrap:wrap;gap:.4rem}
.coinpill{display:inline-flex;align-items:center;gap:.42rem;padding:.3rem .6rem .3rem .32rem;
          border-radius:var(--r-xs);background:var(--paper);
          box-shadow:inset 0 0 0 1px var(--line);
          font-family:var(--mono);font-size:.76rem;font-weight:560;color:var(--ink-2)}
.coinrow--hero .coinpill{background:rgba(255,255,255,.92)}

/* == Bandeau de chiffres ================================================
   Des NOMBRES separes par des filets, en carte bornee sous la banniere.
   Registre de catalogue professionnel : on ne promet pas, on declare. (La
   boutique vend au DETAIL - c'est le TON qui est serieux, pas la clientele.)
   Le premier chiffre est CALCULE depuis le catalogue : un nombre de
   references recopie a la main se met a mentir des la premiere rubrique
   ajoutee. */
.herostats{display:grid;grid-template-columns:repeat(4,1fr);
           margin-top:clamp(.9rem,1.2vw,1.5rem);
           background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg)}
.hstat{padding:1.05rem 1.2rem 1.15rem;border-left:1px solid var(--line)}
.hstat:first-child{border-left:0}
.hstat b{display:block;font-family:var(--mono);font-size:clamp(1.35rem,1.1rem + .7vw,1.75rem);
         font-weight:660;letter-spacing:-.035em;line-height:1;color:var(--ink)}
.hstat b i{font-style:normal;font-size:.6em;color:var(--ink-3);margin-left:.12em}
.hstat small{display:block;margin-top:.45rem;font-family:var(--mono);font-size:.67rem;
             letter-spacing:.12em;text-transform:uppercase;color:var(--ink-4)}

/* ══ Bande de reassurance ════════════════════════════════════════════ */
.usps{border-block:1px solid var(--line-2);background:var(--paper)}
/* TROIS colonnes depuis le retrait de l'argument « No account required » :
   laisser `repeat(4,1fr)` pour trois elements aurait ouvert un quatrieme
   emplacement vide au milieu de la bande de reassurance. */
.usps-in{display:grid;grid-template-columns:repeat(3,1fr);gap:1.6rem;padding-block:1.9rem}
.usp{display:flex;gap:.8rem}
.usp-ico{display:grid;place-items:center;width:40px;height:40px;flex:none;border-radius:var(--r-sm);
         background:var(--v-50);color:var(--v-600)}
.usp b{display:block;font-size:.95rem;font-weight:590;margin-bottom:.15rem}
.usp p{font-size:.86rem;color:var(--ink-3);line-height:1.5}

/* ══ Tuiles de rubrique ══════════════════════════════════════════════ */
.ctiles{display:grid;grid-template-columns:repeat(4,1fr);gap:1.1rem}
.ctile{position:relative;display:flex;flex-direction:column;overflow:hidden;
       border-radius:var(--r-lg);background:var(--paper);border:1px solid var(--line);
       transition:transform var(--dur) var(--ease),box-shadow var(--dur),border-color var(--dur)}
/* Le survol change la BORDURE, il ne souleve plus la carte : un decalage de
   trois pixels sous le curseur est un tic d'interface, et il fait sautiller
   toute une grille quand on la balaie. */
.ctile:hover{border-color:var(--v-600);box-shadow:var(--sh-2)}
.ctile-media{display:block;background:linear-gradient(170deg,#F7F5FF,#FFF);padding:.6rem}
/* 5/4 et non 1/1 : a 1600 px de colonne, quatre tuiles carrees feraient 370 px
   de haut chacune et les deux rangees mangeraient un ecran entier. Le format
   plus large garde le meme cadrage en coupant la hauteur d'un quart. */
.ctile-media img{width:100%;aspect-ratio:5/4;object-fit:contain;transition:transform .35s var(--ease)}
.ctile:hover .ctile-media img{transform:scale(1.045)}
.ctile-body{display:flex;flex-direction:column;padding:.9rem 1rem 1.05rem;border-top:1px solid var(--line-2)}
.ctile-name{font-weight:580;letter-spacing:-.02em}
.ctile-count{font-family:var(--mono);font-size:.76rem;color:var(--ink-4);margin-top:.12rem}
.ctile-go{position:absolute;right:.9rem;bottom:1rem;display:grid;place-items:center;
          width:32px;height:32px;border-radius:var(--r-xs);background:var(--v-50);color:var(--v-600);
          transition:background var(--dur),color var(--dur),transform var(--dur)}
.ctile:hover .ctile-go{background:var(--v-600);color:#fff;transform:translateX(2px)}

/* ══ Cartes produit ══════════════════════════════════════════════════ */
/* [!] `auto-fill` et non un nombre de colonnes par palier de largeur. La
   grille sert dans TROIS contextes de largeurs differentes — pleine page sur
   l'accueil, colonne de resultats a cote des filtres, bloc de repli d'une
   rubrique vide — et un `repeat(4,1fr)` pilote par media query donnait quatre
   colonnes dans chacun : des cartes de 320 px ici, de 190 px la, pour la meme
   fenetre. La carte declare la largeur ou elle reste lisible, la grille en
   met autant que la place le permet. */
.pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:1rem}

/* ── Carte produit ────────────────────────────────────────────────────
   Objectif : la densite. La carte precedente faisait ~620 px de haut pour
   quatre par rangee ; celle-ci en fait ~390 pour six. Trois economies, dans
   l'ordre de ce qu'elles rapportent :

   1. la vignette passe du CARRE au 4/3. Sur 166 fichiers le rapport median
      est de 1,17 et le troisieme quartile de 1,35 : le carre reservait une
      bande vide en haut et en bas de la moitie du catalogue ;
   2. la marque et la note PARTAGENT une ligne au lieu d'en occuper deux ;
   3. la mention de stock rejoint le montant en crypto sur la meme ligne, et
      le filet pointille qui les separait du prix disparait. */
.pcard{position:relative;display:flex;flex-direction:column;overflow:hidden;
       border-radius:var(--r-lg);background:var(--paper);border:1px solid var(--line);
       transition:border-color var(--dur),box-shadow var(--dur)}
.pcard:hover{border-color:var(--v-600);box-shadow:var(--sh-2)}
.pcard.is-out{opacity:.82}

/* La HAUTEUR de la boite ne bouge pas d'une carte a l'autre : dans une grille,
   l'oeil descend une colonne de prix, et des vignettes inegales la font
   onduler. C'est le RETRAIT qui s'adapte a la photo. */
/* [!] Fond BLANC, pas un degrade gris. Les photos du catalogue sont detourees
   sur blanc : sur un fond legerement gris, chacune apparaissait comme un
   rectangle blanc flottant au milieu de la boite, avec une bande grise sous
   elle. Le filet du corps de carte suffit a delimiter la zone d'image. */
/* [!] `min-height:0` EST INDISPENSABLE, et son absence est muette. La boite
   media est un enfant de conteneur flex : par defaut elle vaut
   `min-height:auto`, c'est-a-dire « jamais plus courte que mon contenu ». Le
   contenu est une image remplacee, dont le rapport intrinseque se transmet en
   hauteur minimale — et cette minimale l'emporte sur `aspect-ratio`. Mesure
   sur une rangee de six cartes de 241 px de large : une seule respectait les
   181 px attendus (sa photo faisait justement du 4/3), les photos carrees
   donnaient 236 px et une photo en hauteur 362 px. La feuille de style dit
   pourtant `aspect-ratio: 4 / 3` sur les six, et le style calcule le confirme.
   Meme famille que le `min-width:auto` qui faisait defiler la page en 360 px. */
.pcard-media{position:relative;aspect-ratio:4/3;min-height:0;
             padding:.5rem .65rem;background:var(--paper)}
.pcard-media a{display:block;width:100%;height:100%}
.pcard-media img{width:100%;height:100%;object-fit:contain;
                 transition:transform .3s var(--ease)}
.pcard:hover .pcard-media img{transform:scale(1.045)}
/* Une photo panoramique (un ecran ultra-large, rapport 2,00) se retrouve a
   l'etroit avec le retrait lateral commun ; une photo en hauteur (une tour,
   rapport 0,62) avec le retrait vertical. Chacune recupere le sien. */
.pcard--wide .pcard-media{padding:.5rem .3rem}
.pcard--tall .pcard-media{padding:.2rem .65rem}

.pcard-wish{position:absolute;top:.45rem;right:.45rem;display:grid;place-items:center;
            width:28px;height:28px;border-radius:var(--r-xs);
            background:rgba(255,255,255,.94);color:var(--ink-4);box-shadow:var(--sh-1);
            opacity:0;transform:translateY(-4px);
            transition:opacity var(--dur),transform var(--dur),color var(--dur)}
.pcard:hover .pcard-wish,.pcard-wish:focus-visible{opacity:1;transform:none}
.pcard-wish:hover,.pcard-wish.is-on{color:var(--red)}

.pcard-body{display:flex;flex-direction:column;flex:1;
            padding:.6rem .7rem .7rem;border-top:1px solid var(--line-2)}
.pcard-top{display:flex;align-items:center;justify-content:space-between;gap:.5rem;
           min-height:14px}
.pcard-brand{font-family:var(--mono);font-size:.66rem;letter-spacing:.09em;
             text-transform:uppercase;color:var(--ink-4);
             overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pcard-rate{display:inline-flex;align-items:center;gap:.28rem;flex:none}
.pcard-rate-n{font-size:.7rem;color:var(--ink-4);font-variant-numeric:tabular-nums}
/* Deux lignes au plus, toujours. Un titre de source fait couramment cent
   vingt caracteres : sans limite, une carte sur quatre en prenait quatre et
   la rangee entiere s'alignait sur elle. */
.pcard-name{font-size:.88rem;font-weight:540;line-height:1.35;margin-top:.25rem;
            letter-spacing:-.012em;
            display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;
            -webkit-box-orient:vertical;overflow:hidden}
.pcard-name a:hover{color:var(--v-700)}
/* ⚠️ LA CARTE ENTIERE EST LA CIBLE, et c'est une exigence mobile avant d'etre
   un confort. Le titre d'un article qui tient sur une ligne fait 18 px de
   haut : au doigt, on le rate une fois sur trois, et l'on tape le vide entre
   deux cartes. On etire donc le lien du titre sur toute la carte.

   [!] Les commandes REMONTENT au-dessus de lui (`z-index:2`), sinon
   « Add to cart » et le cœur cessent de repondre — ils seraient recouverts
   par un lien invisible, et le bouton paraıtrait simplement mort. */
.pcard-name a::after{content:"";position:absolute;inset:0;z-index:1}
.pcard-media a{position:relative;z-index:2}
.pcard .btn,.pcard-wishf,.pcard-wish{position:relative;z-index:2}
/* UNE ligne, jamais deux : ce qui depasse est coupe net. Ces puces servent a
   trancher entre deux articles voisins, pas a decrire. */
.pcard-specs{display:flex;flex-wrap:nowrap;gap:.25rem;margin-top:.4rem;overflow:hidden}
.pcard-specs li{flex:0 1 auto;min-width:0;max-width:52%;
                padding:.12rem .38rem;border-radius:var(--r-xs);background:var(--canvas);
                font-size:.68rem;color:var(--ink-3);white-space:nowrap;
                overflow:hidden;text-overflow:ellipsis}

/* `margin-top:auto` ICI et pas sur le bouton : c'est ce qui pose le prix a la
   meme hauteur d'une carte a l'autre, quel que soit le nombre de lignes du
   titre. Sans lui, la grille alignait les CARTES, jamais leur contenu. */
.pcard-money{margin-top:auto;padding-top:.6rem;display:flex;flex-wrap:wrap;
             align-items:center;justify-content:space-between;gap:.25rem .5rem}
/* Le prix garde SA ligne — c'est le seul element qu'on lit en diagonale. Le
   montant en crypto et la disponibilite se partagent la suivante. */
.pcard-money .pprice{flex:0 0 100%}
.pprice{display:flex;align-items:baseline;gap:.35rem;flex-wrap:wrap}
/* [!] Le prix en dollars est en SANS, pas en monospace, et c'est le rendu qui
   a tranche : dans une police a chasse fixe, la virgule des milliers occupe la
   largeur d'un chiffre — « $1,199 » se lisait litteralement « $1 , 199 ».
   Le monospace est garde la ou il a du sens : le montant en crypto, les
   tickers, les compteurs. `tabular-nums` conserve l'alignement des colonnes. */
.pprice-fiat{font-size:1.18rem;font-weight:660;letter-spacing:-.025em;
             font-variant-numeric:tabular-nums}
.pprice-was{font-size:.8rem;font-variant-numeric:tabular-nums}
.pprice-off{padding:.08rem .3rem;border-radius:var(--r-xs);background:var(--red-50);color:var(--red);
            font-family:var(--mono);font-size:.68rem;font-weight:640}
.pprice-coin{display:inline-flex;align-items:center;gap:.28rem;
             font-family:var(--mono);font-size:.73rem;font-weight:560;color:var(--ink-3)}
.pprice-coin-s{color:var(--ink-4)}
.pcard .stock{font-size:.72rem}
.pcard .btn{margin-top:.6rem}


.stock{display:inline-flex;align-items:center;gap:.35rem;font-size:.78rem;font-weight:520}
.stock svg{flex:none}
.stock--in{color:var(--green)}
.stock--low{color:#B26A08}
.stock--out{color:var(--ink-4)}

.stars{display:inline-flex;gap:1px}
.star{position:relative;display:inline-block;line-height:0;color:var(--star-off)}
.star .star-fg{position:absolute;left:0;top:0;color:var(--star-on);
               clip-path:inset(0 calc(100% - var(--fill,0%)) 0 0)}
/* Onze paliers plutot qu'une valeur libre : une note se lit au dixieme, et une
   classe survit a la CSP la ou un `style="--fill:…"` serait ignore. */
.star.f0{--fill:0%}   .star.f10{--fill:10%} .star.f20{--fill:20%}
.star.f30{--fill:30%} .star.f40{--fill:40%} .star.f50{--fill:50%}
.star.f60{--fill:60%} .star.f70{--fill:70%} .star.f80{--fill:80%}
.star.f90{--fill:90%} .star.f100{--fill:100%}

/* ══ Compte a rebours ════════════════════════════════════════════════ */
.shead--deals{align-items:center}
.countdown{display:flex;align-items:center;gap:.35rem;flex:none}

/* ══ Onglets de filtre ═══════════════════════════════════════════════ */
.tabs{display:flex;flex-wrap:wrap;gap:.4rem;margin-bottom:1.5rem}
.tab{padding:.45rem .9rem;border-radius:var(--r-xs);font-size:.88rem;font-weight:520;
     color:var(--ink-2);background:var(--canvas);transition:background var(--dur),color var(--dur)}
.tab:hover{background:var(--v-50);color:var(--v-700)}
.tab.is-on{background:var(--ink);color:#fff}

/* ══ Etapes de paiement ══════════════════════════════════════════════ */
.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:1.1rem;counter-reset:s}

/* [!] L'icone est SUR LA MEME LIGNE que le titre, pas au-dessus.
   Empilee, elle s'offrait une ligne entiere pour elle seule : ~60 px de haut
   par carte qui ne portaient aucune information, multiplies par trois cartes
   ici et quatre plus bas. Le lecteur, lui, doit balayer une pastille vide
   avant d'atteindre le mot qui l'interesse. En grille a deux colonnes, l'icone
   et le titre partagent la premiere rangee et le paragraphe passe SOUS les
   deux (`grid-area` sur toute la largeur) : le texte garde sa pleine mesure,
   au lieu d'etre renfonce dans une colonne etroite. */
.step{position:relative;padding:1.5rem;border-radius:var(--r-lg);
      background:var(--paper);border:1px solid var(--line);box-shadow:var(--sh-1);
      display:grid;grid-template-columns:auto 1fr;column-gap:.9rem;align-items:center}
.step-n{position:absolute;top:1.32rem;right:1.5rem;font-family:var(--mono);font-size:1.6rem;
        font-weight:700;color:var(--v-200);letter-spacing:-.04em;line-height:1}
.step-ico{grid-area:1/1;display:grid;place-items:center;width:44px;height:44px;border-radius:var(--r);
          background:var(--v-600);color:#fff}
/* Le renfoncement a droite degage le gros numero pose en absolu dans l'angle :
   sans lui, un titre un peu long passerait dessous. */
.step h3{grid-area:1/2;font-size:1.06rem;letter-spacing:-.022em;padding-right:2.4rem}
.step p{grid-area:2/1/3/3;margin-top:.8rem;color:var(--ink-3);font-size:.93rem}

.lockcard{margin-top:1.6rem;display:grid;grid-template-columns:1.25fr .95fr;gap:0;
          border-radius:var(--r-xl);overflow:hidden;background:var(--paper);
          border:1px solid var(--v-100);box-shadow:var(--sh-2)}
.lockcard-l{padding:clamp(1.6rem,1rem + 2vw,2.6rem)}
.lockcard-l h3{font-size:clamp(1.25rem,1rem + 1vw,1.7rem);margin-bottom:.8rem;letter-spacing:-.03em}
.lockcard-l p{color:var(--ink-2);margin-bottom:.8rem}
.lockcard-fine{font-size:.9rem;color:var(--ink-3)}
.lockcard-r{background:linear-gradient(150deg,var(--ink),#1C1740);
            display:grid;place-items:center;padding:clamp(1.4rem,1rem + 2vw,2.4rem)}
.lockdemo{width:100%;max-width:300px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);
          border-radius:var(--r-lg);padding:1.3rem;color:#fff}
.lockdemo-h{display:flex;align-items:center;gap:.4rem;font-family:var(--mono);font-size:.72rem;
            text-transform:uppercase;letter-spacing:.09em;color:#A99CFF}
.lockdemo-amt{font-family:var(--mono);font-size:1.7rem;font-weight:660;margin-top:.7rem;letter-spacing:-.03em}
.lockdemo-amt b{color:#B7A8FF;font-weight:660}
.lockdemo-sub{font-size:.78rem;color:#9AA1B8;margin-top:.2rem}
.lockdemo-bar{height:5px;border-radius:var(--r-xs);background:rgba(255,255,255,.14);margin-top:1.1rem;overflow:hidden}
.lockdemo-bar span{display:block;height:100%;width:100%;border-radius:inherit;
                   background:linear-gradient(90deg,var(--v-500),#A78BFA)}
.lockdemo-t{font-family:var(--mono);font-size:.82rem;color:#CBD1E2;margin-top:.6rem}
.lockdemo-t span{color:#fff;font-weight:640}

/* ══ Pourquoi la crypto ══════════════════════════════════════════════ */
.whys{display:grid;grid-template-columns:repeat(4,1fr);gap:1.1rem}
/* Meme composition que `.step` et pour la meme raison : l'icone accompagne le
   titre, elle ne le precede pas d'une ligne. */
.why{padding:1.4rem;border-radius:var(--r-lg);background:var(--paper);border:1px solid var(--line);
     display:grid;grid-template-columns:auto 1fr;column-gap:.8rem;align-items:center;
     transition:border-color var(--dur),box-shadow var(--dur),transform var(--dur) var(--ease)}
.why:hover{border-color:var(--v-200)}
.why-ico{grid-area:1/1;display:grid;place-items:center;width:40px;height:40px;border-radius:var(--r-sm);
         background:var(--v-50);color:var(--v-600)}
.why h3{grid-area:1/2;font-size:1rem;letter-spacing:-.02em;line-height:1.3}
.why p{grid-area:2/1/3/3;margin-top:.75rem;color:var(--ink-3);font-size:.91rem}

/* ══ Marques ═════════════════════════════════════════════════════════ */
.brands{padding-block:2.4rem;border-block:1px solid var(--line-2);background:var(--canvas)}
.brands-lbl{text-align:center;font-family:var(--mono);font-size:.72rem;letter-spacing:.11em;
            text-transform:uppercase;color:var(--ink-4);margin-bottom:1.1rem}
.brands-row{display:flex;flex-wrap:wrap;justify-content:center;gap:.7rem 1.7rem}
.brands-row li{font-size:.97rem;font-weight:560;color:var(--ink-4);letter-spacing:-.02em;
               transition:color var(--dur)}
.brands-row li:hover{color:var(--ink-2)}

/* ══ Avis ════════════════════════════════════════════════════════════ */
.revs{display:grid;grid-template-columns:repeat(3,1fr);gap:1.1rem}
.rev{margin:0;padding:1.6rem 1.5rem;border-radius:var(--r-lg);background:var(--paper);
     border:1px solid var(--line)}
.rev blockquote{margin:.8rem 0 1.1rem;font-size:1rem;color:var(--ink-2);line-height:1.6}
.rev figcaption{display:flex;flex-direction:column;font-size:.85rem}
.rev figcaption b{font-weight:580}
.rev figcaption span{color:var(--ink-4);font-size:.79rem}

/* ══ Questions ═══════════════════════════════════════════════════════ */
.faq{display:grid;grid-template-columns:repeat(2,1fr);gap:.7rem 1.6rem}
.faq-item{border:1px solid var(--line);border-radius:var(--r);background:var(--paper);
          transition:border-color var(--dur),box-shadow var(--dur)}
.faq-item[open]{border-color:var(--v-200);box-shadow:var(--sh-1)}
.faq-item summary{display:flex;align-items:center;justify-content:space-between;gap:1rem;
                  padding:1rem 1.1rem;font-weight:540;cursor:pointer;list-style:none;letter-spacing:-.012em}
.faq-item summary::-webkit-details-marker{display:none}
.faq-mark{display:grid;place-items:center;width:26px;height:26px;flex:none;border-radius:var(--r-xs);
          background:var(--v-50);color:var(--v-600);transition:transform var(--dur),background var(--dur)}
.faq-item[open] .faq-mark{transform:rotate(45deg);background:var(--v-600);color:#fff}
.faq-a{padding:0 1.1rem 1.1rem}
.faq-a p{color:var(--ink-3);font-size:.94rem}

/* ══ Pied de page ════════════════════════════════════════════════════ */
.ftr{background:var(--paper);border-top:1px solid var(--line);padding-block:clamp(2.6rem,2rem + 2vw,4rem) 2rem}
.ftr-cols{display:grid;grid-template-columns:1.65fr 1fr 1fr 1fr 1fr;gap:2rem 1.8rem}
.ftr-brand{max-width:38ch}
.ftr-pitch{margin-top:1rem;color:var(--ink-3);font-size:.9rem}
.ftr-label{margin-top:1.3rem;font-family:var(--mono);font-size:.7rem;letter-spacing:.1em;
           text-transform:uppercase;color:var(--ink-4)}
.ftr-trust{margin-top:1.3rem;display:grid;gap:.5rem}
.ftr-trust li{display:flex;align-items:center;gap:.55rem;font-size:.85rem;color:var(--ink-2)}
.ftr-trust svg{color:var(--v-600);flex:none}
.ftr-h{font-size:.82rem;font-weight:620;letter-spacing:.06em;text-transform:uppercase;
       color:var(--ink);margin-bottom:.9rem}
.ftr-col ul{display:grid;gap:.42rem}
.ftr-col a{font-size:.9rem;color:var(--ink-3);transition:color var(--dur)}
.ftr-col a:hover{color:var(--v-700)}
.ftr-col a.is-accent{color:var(--amber);font-weight:540}
.ftr-nocard{display:flex;gap:.8rem;align-items:flex-start;margin-top:2.6rem;padding:1.1rem 1.3rem;
            border-radius:var(--r);background:var(--v-50);color:var(--ink-2);font-size:.9rem}
.ftr-nocard svg{color:var(--v-600);flex:none;margin-top:.15rem}
.ftr-bottom{display:flex;align-items:center;justify-content:space-between;gap:1.5rem;flex-wrap:wrap;
            margin-top:1.8rem;padding-top:1.4rem;border-top:1px solid var(--line-2);
            font-size:.83rem;color:var(--ink-4)}
.ftr-mini{display:flex;gap:1.2rem}
.ftr-mini a:hover{color:var(--v-700)}

/* ══ Page 404 ════════════════════════════════════════════════════════ */
.e404{max-width:840px;margin-inline:auto;text-align:center}
.e404 h1{font-size:clamp(2rem,1.4rem + 2.4vw,3.1rem);letter-spacing:-.035em;margin-top:.5rem}
.e404-lede{margin:1rem auto 0;max-width:56ch;color:var(--ink-3);font-size:1.03rem}
.e404-cta{display:flex;flex-wrap:wrap;gap:.7rem;justify-content:center;margin-top:1.9rem}
.e404-h{margin:3.4rem 0 1.2rem;font-family:var(--mono);font-size:.72rem;letter-spacing:.1em;
        text-transform:uppercase;color:var(--ink-4)}
.e404-tiles{text-align:left}

/* ══ Adaptatif ═══════════════════════════════════════════════════════ */
@media (max-width:1180px){
  /* [!] La liste des rayons RESTE : passer le mega-menu a une seule colonne
     ferait disparaitre la colonne sur laquelle le panneau se cale, et le
     panneau se poserait par-dessus les rayons. On retrecit la liste, et le
     decalage du panneau suit — les deux valeurs vont toujours par paire. */
  .mega-in{grid-template-columns:230px minmax(0,1fr)}
  .mega-pane{left:calc(var(--wrap-pad) + 230px)}
  .mega-side{display:none}
  .ftr-cols{grid-template-columns:1.4fr 1fr 1fr;row-gap:2.4rem}
  .ftr-brand{grid-column:1/-1;max-width:60ch}
}
@media (max-width:1024px){
  /* [!] Le rail disparait ET la grille repasse a UNE colonne. Sans la seconde
     ligne, le texte du heros tomberait dans la colonne de 284 px laissee
     vacante par le rail masque : illisible, et invisible sur un grand ecran. */
  .crail{display:none}
  .hero-in{grid-template-columns:1fr}
  .hero-txt{max-width:none}
  /* La banniere n'a plus a tenir la hauteur du rail : elle se cale sur son
     propre contenu. */
  .herobanner{min-height:0;padding:clamp(1.4rem,1rem + 2vw,2.2rem)}
  .usps-in{grid-template-columns:repeat(2,1fr)}
  .ctiles,.whys{grid-template-columns:repeat(3,1fr)}
  .steps{grid-template-columns:1fr;gap:.9rem}
  .lockcard{grid-template-columns:1fr}
  .lockcard-r{order:-1}
  .revs{grid-template-columns:1fr}
  .revs .rev:nth-child(n+3){display:none}
}
@media (max-width:860px){
  /* Le voile devient VERTICAL : en dessous de cette largeur, le texte occupe
     toute la colonne, donc un degrade horizontal le laisserait a moitie pose
     sur la photo. Blanc presque plein en haut, la photo ne reste visible que
     sous le bloc de texte. */
  .hero-scrim{background:
    linear-gradient(180deg,#fff 0%,rgba(255,255,255,.97) 46%,rgba(255,255,255,.88) 72%,rgba(255,255,255,.72) 100%),
    linear-gradient(180deg,rgba(109,74,255,.07) 0%,rgba(109,74,255,0) 55%)}
  .hero-bg{object-position:74% 50%}
  .herostats{grid-template-columns:repeat(2,1fr)}
  .hstat{padding:.95rem 1rem 1rem}
  .hstat:nth-child(odd){border-left:0}
  .hstat:nth-child(n+3){border-top:1px solid var(--line)}

  .announce-links li:nth-child(n+2){display:none}
  .hdr-burger{display:grid}
  .hdr-nav{display:none}
  .search{order:3;flex-basis:100%;max-width:none;margin-bottom:.9rem}
  /* Tout tient sur UNE ligne : hamburger, marque, monnaie, panier. Aux
     espacements du bureau il manquait une quarantaine de pixels et le bloc
     d'actions basculait seul sur une deuxieme ligne, moitie gauche vide. */
  .hdr-main{flex-wrap:wrap;padding-top:.9rem;min-height:0;gap:.55rem}
  .hdr-burger{width:38px;height:38px}
  .brand-mark svg{width:30px;height:30px}
  .coinsel-btn{padding:0 .4rem;gap:.28rem}
  .hdr-wish{display:none}
  .cartbtn-txt{display:none}
  .cartbtn{padding-inline:.7rem;height:40px}
  .ctiles,.whys{grid-template-columns:repeat(2,1fr)}
  .faq{grid-template-columns:1fr}
  .ftr-cols{grid-template-columns:1fr 1fr}
  .shead{flex-direction:column;align-items:flex-start;gap:1.2rem}
  .shead--deals .countdown{align-self:flex-start}
}
@media (max-width:560px){
  .announce-links{display:none}
  .usps-in{grid-template-columns:1fr;gap:1.1rem}
  .ctiles{grid-template-columns:repeat(2,1fr);gap:.7rem}

  /* Carte produit EN LIGNE sous 560 px : vignette a gauche, tout le reste a
     droite. En pleine largeur, l'image carree faisait a elle seule la hauteur
     de l'ecran et il fallait quatre gestes de defilement par article — on ne
     compare plus rien. Ici quatre articles tiennent dans un ecran. */
  .pgrid{grid-template-columns:1fr;gap:.6rem}
  .pcard{flex-direction:row;align-items:stretch}
  /* La vignette redevient CARREE ici : en ligne, c'est sa largeur qui est
     contrainte, plus sa hauteur — le 4/3 ne ferait que la retrecir. */
  .pcard-media{width:118px;flex:none;aspect-ratio:1;padding:.45rem;
               border-right:1px solid var(--line-2)}
  .pcard--wide .pcard-media,.pcard--tall .pcard-media{padding:.45rem}
  .pcard-wish{display:none}
  .pcard-body{border-top:0;padding:.6rem .7rem .65rem}
  .pcard-specs li:nth-child(n+2){display:none}

  /* [!] DANS UNE RANGEE, LA CARTE RESTE VERTICALE. La carte « en ligne »
     ci-dessus est faite pour la GRILLE, ou l'on compare quatre articles
     empiles sur un ecran. Dans une rangee horizontale elle donne une vignette
     de 118 px collee a deux lignes de texte comprimees — et surtout elle fait
     perdre le seul repere qui dit qu'il y a une suite : la carte suivante qui
     depasse du bord. Rien ne se casse, tout s'affiche : c'est simplement la
     mauvaise carte au mauvais endroit. */
  /* Les deux micro-libelles de la carte remontent au-dessus du plancher de
     lisibilite : la marque tombait a 10,6 px et les puces a 10,9 px. Un demi
     pixel de plus ne change rien a la mise en page — les chaınes sont deja
     bornees a vingt caracteres cote PHP — et beaucoup a ce qu'on arrive a
     lire d'un telephone tenu a bout de bras. */
  .pcard-brand{font-size:.7rem}
  .pcard-specs li{font-size:.7rem}
  /* La pastille de remise avec eux : c'est le seul chiffre de la carte qui
     dise « c'est moins cher qu'avant », et il etait le plus petit. */
  .pprice-off{font-size:.7rem}

  .rail-track > .pcard{flex-direction:column}
  .rail-track > .pcard .pcard-media{width:auto;aspect-ratio:4/3;border-right:0;padding:.5rem}
  .rail-track > .pcard .pcard-body{border-top:1px solid var(--line-2);padding:.7rem .8rem .8rem}
  .pprice-fiat{font-size:1.1rem}
  .whys{grid-template-columns:1fr}
  .ftr-cols{grid-template-columns:1fr}
  .ftr-bottom{flex-direction:column;align-items:flex-start}

  /* 🔴 QUATRE COLONNES SUR UN TELEPHONE. Le bandeau de chiffres gardait sa
     grille de bureau : sur un ecran de 320 px, chaque case recevait 80 px, et
     la seule facon d'y faire tenir « dispatch on stock lines » sur une ligne
     etait de descendre le libelle a 10 px. Personne ne lit un libelle
     capitale-espacee de 10 px sur un telephone tenu a bout de bras — et la
     page ne signalait rien, puisque tout tenait.
     Deux colonnes : chaque case double de largeur, le libelle remonte a une
     taille lisible, et il tient toujours sur une ligne. */
  .herostats{grid-template-columns:repeat(2,1fr)}
  .hstat{padding:.9rem 1rem 1rem}
  .hstat:nth-child(odd){border-left:0}
  .hstat:nth-child(-n+2){border-bottom:1px solid var(--line)}
  .hstat small{letter-spacing:.07em;font-size:.72rem}

  /* Le surtitre : il se coupait au milieu de « on-chain » a taille de bureau.
     Il est raccourci en ESPACEMENT, plus en taille — sous 11 px un texte tout
     en capitales espacees demande un effort qu'un surtitre ne merite pas. Et
     il a le droit de passer a la ligne : c'est un chapeau, pas un bouton. */
  .tagline{font-size:.72rem;letter-spacing:.08em;gap:.5rem;flex-wrap:wrap}
  .hero-coins-lbl{font-size:.72rem;letter-spacing:.1em}
  .tagline::before{width:22px}

  /* [!] Les HUIT pieces restent affichees. Une regle masquait les deux
     dernieres sous 560 px — mais le bandeau de chiffres declare juste en
     dessous « 8 assets settled on-chain ». Le visiteur en comptait six : la
     page se contredisait elle-meme, et seule une lecture sur telephone
     pouvait le montrer. */
}

/* ══ Confort et impression ═══════════════════════════════════════════ */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;
                       transition-duration:.001ms!important;scroll-behavior:auto!important}
}
@media print{
  .announce,.hdr,.drawer,.scrim,.hero-bg,.hero-scrim{display:none!important}
  body{background:#fff}
}

/* Pastille de remplacement dans la recherche, pour les entrees sans vignette
   (rayons et allees). Meme boite que l'image, pour que les lignes s'alignent. */
.sres-glyph{display:grid;place-items:center;width:42px;height:42px;flex:none;
            border-radius:var(--r-xs);background:var(--v-50);color:var(--v-600);
            font-weight:660;font-size:1rem}

/* Le compteur porte par chaque onglet de filtre. */
.tab{display:inline-flex;align-items:center;gap:.4rem}
.tab-n{font-family:var(--mono);font-size:.72rem;color:var(--ink-4)}
.tab.is-on .tab-n{color:rgba(255,255,255,.62)}

/* ══ Fiche produit ════════════════════════════════════════════════════
   Trois colonnes : la galerie, l'identite, le bloc d'achat. L'acheteur a
   trois questions dans cet ordre — est-ce le bon article, combien et quand,
   et si ca se passe mal — et chaque colonne en tient une. Le bloc d'achat est
   COLLANT : sur une fiche longue, le prix et le bouton ne doivent jamais
   sortir de l'ecran. */
.crumb{border-bottom:1px solid var(--line-2);background:var(--paper)}
.crumb-in{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap;
          padding-block:.7rem;font-size:.82rem;color:var(--ink-3)}
.crumb-in a{color:var(--ink-3);transition:color var(--dur)}
.crumb-in a:hover{color:var(--v-700)}
.crumb-in svg{color:var(--ink-4);flex:none}
.crumb-in span[aria-current]{color:var(--ink);font-weight:520;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:44ch}

.pdp{padding-block:clamp(1.4rem,1rem + 1.4vw,2.2rem) clamp(2rem,1.4rem + 2vw,3rem)}
.pdp-in{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) 348px;
        gap:clamp(1.4rem,2vw,2.4rem);align-items:start}

/* ── Galerie ───────────────────────────────────────────────────────── */
.pgal-main{position:relative;background:var(--paper);border:1px solid var(--line);
           border-radius:var(--r-lg);padding:1.2rem;display:grid;place-items:center;
           min-height:320px}
.pgal-main img{width:100%;max-height:min(58vh,520px);object-fit:contain}
.pgal-none{display:grid;justify-items:center;gap:.6rem;color:var(--ink-4);font-size:.85rem}
.pgal-thumbs{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.7rem}
.pgal-thumb{display:block;width:72px;height:72px;padding:.3rem;background:var(--paper);
            border:1px solid var(--line);border-radius:var(--r-xs);
            transition:border-color var(--dur)}
.pgal-thumb img{width:100%;height:100%;object-fit:contain}
.pgal-thumb:hover{border-color:var(--v-200)}
.pgal-thumb.is-on{border-color:var(--v-600);box-shadow:inset 0 0 0 1px var(--v-600)}

/* ── Identite ──────────────────────────────────────────────────────── */
.pdp-brand{font-family:var(--mono);font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;
           color:var(--ink-4)}
.pdp-title{font-size:clamp(1.35rem,1.1rem + .9vw,1.85rem);letter-spacing:-.028em;
           line-height:1.22;margin-top:.3rem}
.pdp-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem 1.1rem;margin-top:.7rem;
          font-size:.82rem;color:var(--ink-3)}
.pdp-rate{display:inline-flex;align-items:center;gap:.4rem}
.pdp-rate b{color:var(--ink)}
.pdp-rate a{color:var(--v-700);text-decoration:underline;text-underline-offset:3px}
.pdp-sku{font-family:var(--mono);font-size:.76rem;color:var(--ink-4)}
.pdp-sku b{color:var(--ink-2);font-weight:560}
.pdp-lede{margin-top:.9rem;color:var(--ink-2);font-size:1rem;max-width:60ch}

.pdp-chips{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:.4rem;
           margin-top:1.1rem}
.pdp-chips li{display:flex;flex-direction:column;gap:.1rem;padding:.5rem .65rem;
              background:var(--canvas);border-radius:var(--r-xs)}
.pdp-chips b{font-family:var(--mono);font-size:.66rem;letter-spacing:.08em;text-transform:uppercase;
             color:var(--ink-4);font-weight:560}
.pdp-chips span{font-size:.86rem;color:var(--ink-2);
                overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ── Declinaisons ──────────────────────────────────────────────────── */
.pdp-variant{margin-top:1.2rem}
.pdp-variant-h{font-size:.82rem;color:var(--ink-3);margin-bottom:.45rem}
.pdp-variant-h span{color:var(--ink);font-weight:560}
.vopts{display:flex;flex-wrap:wrap;gap:.4rem}
.vopt{display:inline-flex;align-items:center;padding:.4rem .7rem;border-radius:var(--r-xs);
      font-size:.85rem;background:var(--paper);box-shadow:inset 0 0 0 1px var(--line);
      color:var(--ink-2);transition:box-shadow var(--dur),color var(--dur)}
a.vopt:hover{box-shadow:inset 0 0 0 1.5px var(--v-600);color:var(--v-700)}
.vopt.is-on{box-shadow:inset 0 0 0 1.5px var(--v-600);color:var(--v-700);font-weight:560;
            background:var(--v-50)}
/* Une option que nous ne vendons pas est MONTREE mais barree, jamais cliquable :
   la source liste les declinaisons de son propre catalogue, en faire des liens
   fabriquerait des impasses par dizaines. */
.vopt.is-off{color:var(--ink-4);text-decoration:line-through;
             text-decoration-color:var(--line);cursor:not-allowed}

.pdp-bullets{display:grid;gap:.4rem;margin-top:1.2rem}
.pdp-bullets li{display:flex;gap:.5rem;font-size:.9rem;color:var(--ink-2);line-height:1.5}
.pdp-bullets svg{color:var(--green);flex:none;margin-top:.2rem}
.pdp-bullets--wide{margin-top:.8rem}

/* ── Bloc d'achat ──────────────────────────────────────────────────── */
.buybox{position:sticky;top:9.5rem;background:var(--paper);border:1px solid var(--line);
        border-radius:var(--r-lg);padding:1.2rem 1.2rem 1.3rem;box-shadow:var(--sh-2)}
.buybox-price{display:flex;align-items:baseline;flex-wrap:wrap;gap:.5rem}
.bb-now{font-size:1.9rem;font-weight:680;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.bb-was{font-size:.95rem;font-variant-numeric:tabular-nums}
.bb-off{padding:.14rem .4rem;border-radius:var(--r-xs);background:var(--red-50);color:var(--red);
        font-family:var(--mono);font-size:.75rem;font-weight:640}
.bb-coin{display:flex;align-items:center;gap:.4rem;margin-top:.6rem;padding:.5rem .6rem;
         border-radius:var(--r-xs);background:var(--canvas);font-family:var(--mono);font-size:.88rem}
.bb-coin b{font-weight:640}
.bb-coin small{margin-left:auto;font-family:var(--font);font-size:.72rem;color:var(--ink-4)}
.bb-stock{margin-top:.8rem}
.bb-buy{display:grid;grid-template-columns:auto 1fr;gap:.5rem;margin-top:.9rem}
.qty{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:var(--r-sm)}
.qty button{width:34px;height:44px;display:grid;place-items:center;color:var(--ink-3);
            font-size:1.05rem;transition:background var(--dur),color var(--dur)}
.qty button:hover{background:var(--v-50);color:var(--v-700)}
.qty input{width:40px;height:44px;border:0;text-align:center;background:none;
           font-family:var(--mono);font-weight:600;-moz-appearance:textfield}
.qty input::-webkit-outer-spin-button,
.qty input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.qty input:focus{outline:0}
.bb-lock{display:flex;align-items:center;gap:.4rem;margin-top:.6rem;font-size:.78rem;color:var(--ink-3)}
.bb-lock svg{color:var(--v-600);flex:none}
.bb-trust{display:grid;gap:.55rem;margin-top:1.1rem;padding-top:1rem;border-top:1px solid var(--line-2)}
.bb-trust li{display:flex;gap:.55rem;font-size:.82rem;color:var(--ink-3);line-height:1.45}
.bb-trust b{color:var(--ink-2);font-weight:560}
.bb-trust svg{color:var(--v-600);flex:none;margin-top:.1rem}

/* ── Description + caracteristiques ────────────────────────────────── */
.pdp-cols{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);
          gap:clamp(1.6rem,3vw,3.2rem);align-items:start}
.pdp-h2{font-size:1.15rem;letter-spacing:-.022em;margin-bottom:.9rem}
.pdp-h3{font-size:.98rem;margin:1.6rem 0 .2rem}
.pdp-prose p{color:var(--ink-2);margin-bottom:.8rem;max-width:68ch}
.spectable{width:100%;border-collapse:collapse;font-size:.87rem;
           background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);
           overflow:hidden}
.spectable tr:not(:last-child){border-bottom:1px solid var(--line-2)}
.spectable th{width:38%;text-align:left;font-weight:540;color:var(--ink-3);
              padding:.55rem .8rem;vertical-align:top}
.spectable td{padding:.55rem .8rem;color:var(--ink);vertical-align:top}
.spectable tr:nth-child(even){background:var(--canvas)}

@media (max-width:1180px){
  .pdp-in{grid-template-columns:minmax(0,1fr) 330px}
  .pdp-gallery{grid-column:1}
  .pdp-main{grid-column:1}
  .buybox{grid-column:2;grid-row:1/3}
}
@media (max-width:860px){
  .pdp-in{grid-template-columns:minmax(0,1fr)}
  .buybox{position:static;grid-column:1;grid-row:auto}
  .pdp-cols{grid-template-columns:1fr}
  .pgal-thumb{width:60px;height:60px}
}
.vopts-note{margin-top:.4rem;font-size:.76rem;color:var(--ink-4)}

/* Description : une mise en forme IDENTIQUE que le texte ait ete reecrit ou
   non. Le premier paragraphe repond a << qu'est-ce que c'est >>, les renvois
   de bas de page passent en petits caracteres au lieu de hacher le discours. */
.pdp-prose{max-width:68ch}
.pdp-prose p{margin-bottom:.85rem;color:var(--ink-2);line-height:1.65}
.pdp-prose .pdp-lead{font-size:1.04rem;color:var(--ink);line-height:1.6}
.pdp-prose .pdp-fine{margin-top:1.1rem;padding-top:.8rem;border-top:1px solid var(--line-2);
                     font-size:.78rem;color:var(--ink-4);line-height:1.5}

/* ── Pages de rubrique ─────────────────────────────────────────────────── */
.chead{border-bottom:1px solid var(--line);background:var(--paper)}
/* [!] `padding-block`, JAMAIS le raccourci `padding: 1.4rem 0 1.15rem`. Ces
   blocs portent aussi la classe `.wrap`, qui pose le retrait lateral de la
   page ; le raccourci le remet a zero et tout le contenu vient coller aux
   bords de l'ecran — le compteur << 4 products from $1,049 >> etait meme
   coupe net a droite. Rien ne casse, aucune erreur : la page est juste mal
   posee, et seule une capture regardee pour de vrai le montre. */
.chead-in{display:flex;align-items:flex-end;justify-content:space-between;gap:1.5rem;
          padding-block:1.4rem 1.15rem;flex-wrap:wrap}
.chead-h{font-size:clamp(1.5rem,1.1rem + 1.2vw,2.1rem);line-height:1.15;letter-spacing:-.02em;margin:0}
.chead-sub{margin:.42rem 0 0;color:var(--ink-3);max-width:62ch;font-size:.95rem;line-height:1.5}
.chead-count{margin:0;color:var(--ink-3);font-size:.9rem;white-space:nowrap}
.chead-count b{color:var(--ink);font-variant-numeric:tabular-nums}
.chead-span{color:var(--ink-4);margin-left:.45rem}

/* Sous-rubriques : des liens texte, pas des vignettes. A ce niveau de l'arbre
   il peut y en avoir quarante ; quarante images repousseraient les articles
   hors de l'ecran, ce qui est exactement l'inverse du service rendu. */
.csubs{padding-block:1.15rem .2rem}
.csubs-h{font-size:.83rem;text-transform:uppercase;letter-spacing:.09em;color:var(--ink-3);
         margin:0 0 .7rem;font-weight:600}
.csubs-list{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:.45rem}
.csubs-list a{display:inline-flex;align-items:center;gap:.45rem;padding:.42rem .72rem;
              border:1px solid var(--line);border-radius:var(--r);background:var(--paper);
              font-size:.88rem;color:var(--ink-2);text-decoration:none;
              transition:border-color var(--dur),color var(--dur),background var(--dur)}
.csubs-list a:hover{border-color:var(--v-200);color:var(--v-700);background:var(--v-50)}
/* Une rubrique encore vide reste cliquable mais s'annonce comme telle : la
   masquer mentirait sur l'etendue du catalogue, la presenter comme les autres
   ferait perdre un clic a chaque fois. */
.csubs-list a.is-bare{color:var(--ink-4);border-style:dashed}
.csubs-list a.is-bare:hover{color:var(--ink-2)}
.csubs-c{font-size:.74rem;color:var(--ink-4);font-variant-numeric:tabular-nums;
         background:var(--canvas);border-radius:var(--r-xs);padding:.05rem .3rem}
.csubs-list--alt{margin-top:.6rem}

.clist{display:grid;grid-template-columns:250px minmax(0,1fr);gap:2rem;
       padding-block:1.35rem 3rem;align-items:start}

.cfil-wrap{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--paper)}
.cfil-sum{display:flex;align-items:center;gap:.5rem;padding:.75rem .9rem;cursor:pointer;
          font-weight:600;font-size:.92rem;list-style:none}
.cfil-sum::-webkit-details-marker{display:none}
.cfil-sum svg{color:var(--ink-3)}
.cfil-on{width:7px;height:7px;border-radius:var(--r-pill);background:var(--v-600);margin-left:auto}
.cfil-body{padding:0 .9rem .95rem}
.cfil-clear{display:inline-flex;align-items:center;gap:.35rem;font-size:.82rem;color:var(--v-700);
            text-decoration:none;margin-bottom:.85rem}
.cfil-clear:hover{text-decoration:underline}
.cfil-grp + .cfil-grp{margin-top:1.05rem;padding-top:1.05rem;border-top:1px solid var(--line-2)}
.cfil-h{font-size:.75rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);
        margin:0 0 .5rem;font-weight:600}
.cfil-opt{display:flex;align-items:center;gap:.55rem;padding:.3rem 0;font-size:.89rem;
          color:var(--ink-2);text-decoration:none;line-height:1.3}
.cfil-opt:hover{color:var(--v-700)}
.cfil-box{flex:0 0 16px;width:16px;height:16px;border:1.5px solid var(--line);border-radius:var(--r-xs);
          display:grid;place-items:center;background:var(--paper);transition:all var(--dur)}
.cfil-box svg{opacity:0;color:#fff;stroke-width:3}
.cfil-opt.is-on .cfil-box{background:var(--v-600);border-color:var(--v-600)}
.cfil-opt.is-on .cfil-box svg{opacity:1}
.cfil-opt.is-on{color:var(--ink);font-weight:500}
.cfil-n{margin-left:auto;font-size:.76rem;color:var(--ink-4);font-variant-numeric:tabular-nums}
/* Le champ de recherche EN PLEINE LARGEUR de la page de resultats. Il
   reutilise `.cfil-price` (la barre de prix des filtres) plutot que d'inventer
   un gabarit : deux barres de formulaire cote a cote sur le meme site doivent
   se ressembler, et une classe de plus est une classe de plus a tenir. */
.cfil-price--wide{margin-block:1.35rem 0}
.cfil-in--wide{flex:1;min-width:0;text-align:left;padding-inline:.75rem}

.cfil-price{display:flex;align-items:center;gap:.4rem}
.cfil-in{min-width:0;width:100%;border:1px solid var(--line);border-radius:var(--r);
         padding:.42rem .5rem;font:inherit;font-size:.86rem;font-variant-numeric:tabular-nums;
         background:var(--paper);color:var(--ink)}
.cfil-in:focus{border-color:var(--v-500);outline:none}
.cfil-dash{color:var(--ink-4);font-size:.8rem}
.cfil-go{border:1px solid var(--line);background:var(--canvas);border-radius:var(--r);
         padding:.42rem .6rem;font:inherit;font-size:.82rem;font-weight:600;color:var(--ink-2);cursor:pointer}
.cfil-go:hover{background:var(--v-50);border-color:var(--v-200);color:var(--v-700)}

.ctool{display:flex;align-items:center;justify-content:space-between;gap:1rem;
       padding-bottom:.9rem;margin-bottom:1.05rem;border-bottom:1px solid var(--line)}
.ctool-n{margin:0;font-size:.88rem;color:var(--ink-3)}
.ctool-n b{color:var(--ink);font-variant-numeric:tabular-nums}
.ctool-pg{color:var(--ink-4)}
.csort{position:relative}
.csort-sum{display:flex;align-items:center;gap:.4rem;cursor:pointer;font-size:.88rem;
           color:var(--ink-2);padding:.4rem .65rem;border:1px solid var(--line);
           border-radius:var(--r);background:var(--paper);list-style:none;white-space:nowrap}
.csort-sum::-webkit-details-marker{display:none}
.csort-sum b{color:var(--ink);font-weight:600}
.csort[open] .csort-sum{border-color:var(--v-200);background:var(--v-50)}
.csort-menu{position:absolute;right:0;top:calc(100% + 5px);z-index:20;min-width:186px;
            list-style:none;margin:0;padding:.3rem;background:var(--paper);
            border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-3)}
.csort-menu a{display:block;padding:.44rem .6rem;border-radius:var(--r);font-size:.88rem;
              color:var(--ink-2);text-decoration:none}
.csort-menu a:hover{background:var(--canvas);color:var(--ink)}
.csort-menu a.is-on{background:var(--v-50);color:var(--v-700);font-weight:600}

.cpage{display:flex;align-items:center;justify-content:center;gap:.35rem;margin-top:2rem;flex-wrap:wrap}
.cpage-a{min-width:36px;height:36px;padding:0 .6rem;display:inline-flex;align-items:center;
         justify-content:center;border:1px solid var(--line);border-radius:var(--r);
         font-size:.88rem;color:var(--ink-2);text-decoration:none;background:var(--paper);
         font-variant-numeric:tabular-nums}
.cpage-a:hover{border-color:var(--v-200);color:var(--v-700);background:var(--v-50)}
.cpage-a.is-on{background:var(--v-600);border-color:var(--v-600);color:#fff;font-weight:600}
.cpage-gap{color:var(--ink-4);padding:0 .15rem}

.cempty,.csoon-card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--paper)}
.cempty{padding:2.6rem 1.5rem;text-align:center}
.cempty-h{margin:0;font-size:1.05rem;font-weight:600}
.cempty-p{margin:.4rem 0 1.1rem;color:var(--ink-3);font-size:.92rem}

.csoon{padding-block:1.35rem 3rem}
.csoon-card{display:flex;align-items:flex-start;gap:.95rem;padding:1.15rem 1.3rem}
.csoon-ico{flex:0 0 42px;width:42px;height:42px;border-radius:var(--r);display:grid;
           place-items:center;background:var(--v-50);color:var(--v-600)}
.csoon-h{margin:0;font-size:1.02rem;font-weight:600}
.csoon-p{margin:.3rem 0 0;color:var(--ink-3);font-size:.92rem;line-height:1.55}
.csoon-sub{font-size:.83rem;text-transform:uppercase;letter-spacing:.09em;color:var(--ink-3);
           margin:1.9rem 0 .75rem;font-weight:600}

@media (max-width:1024px){
  .clist{grid-template-columns:1fr;gap:1.1rem}
  .cfil-body{padding-bottom:.8rem}
}
@media (max-width:560px){
  .chead-in{align-items:flex-start;padding-block:1.1rem .95rem}
  .ctool{flex-wrap:wrap;gap:.6rem}
  .csoon-card{flex-direction:column;gap:.7rem}
}

/* ══ Espace client ═══════════════════════════════════════════════════════
   Deux mises en page. Les pages OUVERTES (connexion, inscription) posent une
   carte centree : a ce moment-la le visiteur a une seule chose a faire.
   Les pages INTERNES ont une colonne de navigation permanente — repliee
   derriere un bouton, elle cacherait la moitie de l'espace derriere un clic. */

.authpage{padding-block:clamp(1.6rem,1rem + 2.4vw,3.4rem) clamp(2.4rem,2rem + 3vw,4.6rem)}
.authwrap{display:grid;grid-template-columns:minmax(0,440px) minmax(0,1fr);
          gap:clamp(1.6rem,4vw,4rem);align-items:start;justify-content:center}
/* Une carte seule est CENTREE, pas collee a gauche : sans cette variante, la
   page de connexion laissait un vide de 600 px a droite. */
.authwrap--solo{grid-template-columns:minmax(0,440px);justify-content:center}

.authcard{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-xl);
          padding:clamp(1.4rem,1rem + 1.6vw,2.2rem);box-shadow:var(--sh-2)}
.authcard-eyebrow{display:inline-flex;align-items:center;gap:.4rem;font-family:var(--mono);
                  font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--v-600);
                  margin-bottom:.6rem}
.authcard-h{font-size:clamp(1.4rem,1.15rem + 1vw,1.85rem);letter-spacing:-.03em;line-height:1.18;margin:0}
.authcard-sub{margin:.55rem 0 1.4rem;color:var(--ink-3);font-size:.94rem;line-height:1.55}
.authcard-alt{margin-top:1.25rem;padding-top:1.1rem;border-top:1px solid var(--line-2);
              font-size:.9rem;color:var(--ink-3);text-align:center}
.authcard-alt a{color:var(--v-700);font-weight:560}
.authcard-alt a:hover{text-decoration:underline}

.authform{display:grid;gap:1rem}
.authform-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.authform-link{font-size:.86rem;color:var(--v-700)}
.authform-link:hover{text-decoration:underline}
/* [!] `display:flex` sur un paragraphe fait de CHAQUE nœud un element flex :
   les deux liens et les morceaux de phrase entre eux devenaient six blocs
   alignes cote a cote, et la mention se lisait « … agree to the | terms of
   sale | and | privacy policy | . ». Le texte est donc enveloppe dans un
   <span>, et le conteneur n'a plus que deux enfants. */
.authform-fine{display:flex;gap:.45rem;align-items:flex-start;font-size:.79rem;color:var(--ink-4);
               line-height:1.5;margin-top:.2rem}
.authform-fine > span{flex:1;min-width:0}
.authform-fine svg{flex:none;margin-top:.15rem;color:var(--ink-4)}
.authform-fine a{color:var(--ink-3);text-decoration:underline;text-underline-offset:2px}

.authnote{display:flex;gap:.5rem;align-items:flex-start;margin-top:1.2rem;padding:.85rem 1rem;
          border-radius:var(--r);background:var(--v-50);color:var(--ink-2);font-size:.86rem;
          line-height:1.5}
.authnote svg{flex:none;margin-top:.1rem;color:var(--v-600)}
.authnote--flat{background:var(--canvas);margin-bottom:1.2rem}

/* La colonne de droite de l'inscription : elle repond a la seule question que
   pose la page — pourquoi ouvrir un compte sur un site qui n'en exige pas. */
.authside{padding-top:.6rem}
.authside-h{font-size:.83rem;text-transform:uppercase;letter-spacing:.09em;color:var(--ink-3);
            font-weight:600;margin:0 0 1rem}
.authside-list{display:grid;gap:1.05rem;list-style:none;margin:0;padding:0}
.authside-list li{display:flex;gap:.8rem;align-items:flex-start}
.authside-list svg{flex:none;color:var(--v-600);margin-top:.15rem}
.authside-list b{display:block;font-size:.95rem;font-weight:580;letter-spacing:-.012em}
.authside-list span{display:block;margin-top:.2rem;color:var(--ink-3);font-size:.88rem;line-height:1.5}
.authside-fine{display:flex;gap:.45rem;align-items:flex-start;margin-top:1.4rem;padding-top:1.1rem;
               border-top:1px solid var(--line-2);font-size:.84rem;color:var(--ink-3)}
.authside-fine svg{flex:none;margin-top:.1rem;color:var(--amber)}

/* ── Champs ─────────────────────────────────────────────────────────────── */
.fld{display:grid;gap:.35rem}
.fld-l{display:flex;align-items:baseline;justify-content:space-between;gap:.6rem;
       font-size:.86rem;font-weight:560;color:var(--ink)}
.fld-opt{font-size:.74rem;font-weight:400;color:var(--ink-4)}
.fld-in{width:100%;min-width:0;font:inherit;font-size:.95rem;color:var(--ink);
        background:var(--paper);border:1px solid var(--line);border-radius:var(--r);
        padding:.68rem .8rem;transition:border-color var(--dur),box-shadow var(--dur)}
.fld-in::placeholder{color:var(--ink-4)}
.fld-in:hover{border-color:var(--ink-4)}
.fld-in:focus{outline:0;border-color:var(--v-500);box-shadow:0 0 0 3px rgba(109,74,255,.14)}
.fld-in.is-bad{border-color:var(--red)}
.fld-in.is-bad:focus{box-shadow:0 0 0 3px rgba(224,36,36,.13)}
select.fld-in{appearance:none;-webkit-appearance:none;padding-right:2.2rem;
              /* La fleche est une image de fond : un pseudo-element sur un
                 <select> n'est pas rendu, et un <div> par-dessus intercepterait
                 le clic qui doit ouvrir la liste. */
              background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236C7488' stroke-width='2' stroke-linecap='round'%3E%3Cpolyline points='6 9.5 12 15.5 18 9.5'/%3E%3C/svg%3E");
              background-repeat:no-repeat;background-position:right .8rem center}
textarea.fld-in{resize:vertical;min-height:76px;line-height:1.5}
.fld-err{display:flex;gap:.35rem;align-items:flex-start;font-size:.8rem;color:var(--red);line-height:1.45}
.fld-err svg{flex:none;margin-top:.18rem}
.fld-help{font-size:.79rem;color:var(--ink-4);line-height:1.5}

.chk{display:inline-flex;align-items:center;gap:.5rem;font-size:.87rem;color:var(--ink-2);cursor:pointer}
/* La vraie case reste dans la page — masquee par `display:none`, elle sortirait
   de l'ordre de tabulation et deviendrait inatteignable au clavier. */
.chk input{position:absolute;opacity:0;width:1px;height:1px}
.chk-box{width:18px;height:18px;flex:none;display:grid;place-items:center;background:var(--paper);
         border:1.5px solid var(--line);border-radius:var(--r-xs);transition:all var(--dur)}
.chk-box svg{opacity:0;color:#fff;stroke-width:3}
.chk input:checked + .chk-box{background:var(--v-600);border-color:var(--v-600)}
.chk input:checked + .chk-box svg{opacity:1}
.chk input:focus-visible + .chk-box{box-shadow:0 0 0 3px rgba(109,74,255,.2)}

.note{display:flex;gap:.5rem;align-items:flex-start;padding:.75rem .9rem;border-radius:var(--r);
      font-size:.88rem;line-height:1.5;margin-bottom:.2rem}
.note svg{flex:none;margin-top:.12rem}
.note--bad{background:var(--red-50);color:#9F1A1A}
.note--ok{background:var(--green-50);color:#0A6B4A}
.note--warn{background:var(--amber-50);color:#8A5106}

.tstile{min-height:66px}

/* ── Pages internes ─────────────────────────────────────────────────────── */
/* Pleine largeur du site, comme la boutique. La colonne de navigation reste a
   236 px, tout le reste est pour le contenu. */
.acct{display:grid;grid-template-columns:236px minmax(0,1fr);gap:clamp(1.4rem,2.6vw,2.6rem);
      padding-block:clamp(1.4rem,1rem + 1.6vw,2.4rem) clamp(2.4rem,2rem + 3vw,4rem);
      align-items:start}

.anav{position:sticky;top:9.5rem}
.anav-list{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.anav-a{display:flex;align-items:center;gap:.6rem;width:100%;padding:.58rem .7rem;
        border-radius:var(--r);font-size:.92rem;color:var(--ink-2);text-decoration:none;
        background:none;border:0;font-family:inherit;cursor:pointer;text-align:left;
        transition:background var(--dur),color var(--dur)}
.anav-a svg{flex:none;color:var(--ink-4);transition:color var(--dur)}
.anav-a:hover{background:var(--canvas);color:var(--ink)}
.anav-a:hover svg{color:var(--ink-3)}
.anav-a.is-on{background:var(--v-50);color:var(--v-700);font-weight:580}
.anav-a.is-on svg{color:var(--v-600)}
.anav-n{margin-left:auto;font-size:.72rem;font-variant-numeric:tabular-nums;color:var(--ink-4);
        background:var(--canvas);border-radius:var(--r-pill);padding:.05rem .4rem;min-width:20px;
        text-align:center}
.anav-a.is-on .anav-n{background:var(--v-100);color:var(--v-700)}
.anav-out{margin-top:.5rem;padding-top:.5rem;border-top:1px solid var(--line-2)}
.anav-a--out{color:var(--ink-3)}
.anav-a--out:hover{background:var(--red-50);color:var(--red)}
.anav-a--out:hover svg{color:var(--red)}

.ahead{display:flex;align-items:flex-end;justify-content:space-between;gap:1.2rem;flex-wrap:wrap;
       margin-bottom:1.3rem;padding-bottom:1.1rem;border-bottom:1px solid var(--line)}
.ahead-h{font-size:clamp(1.3rem,1.1rem + .8vw,1.6rem);letter-spacing:-.028em;line-height:1.2;margin:0}
.ahead-sub{margin:.35rem 0 0;color:var(--ink-3);font-size:.9rem}
.ahead-act{display:flex;gap:.5rem;flex-wrap:wrap}

.acard{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);
       padding:1.15rem 1.25rem}
.acard + .acard{margin-top:1rem}
.acard-h{font-size:.98rem;font-weight:600;letter-spacing:-.015em;margin:0 0 .2rem}
.acard-sub{margin:0 0 1rem;color:var(--ink-3);font-size:.87rem;line-height:1.5}
.agrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(258px,1fr));gap:1rem}

.aempty{text-align:center;padding:2.6rem 1.4rem;border:1px dashed var(--line);
        border-radius:var(--r-lg);background:var(--paper)}
.aempty-ico{display:grid;place-items:center;width:46px;height:46px;margin:0 auto .8rem;
            border-radius:var(--r);background:var(--v-50);color:var(--v-600)}
.aempty-h{margin:0;font-size:1rem;font-weight:600}
.aempty-p{margin:.35rem 0 1.15rem;color:var(--ink-3);font-size:.9rem;max-width:44ch;
          margin-inline:auto;line-height:1.55}

.ostat{display:inline-flex;align-items:center;padding:.16rem .5rem;border-radius:var(--r-xs);
       font-size:.74rem;font-weight:600;letter-spacing:.01em;white-space:nowrap}
.ostat--wait{background:var(--amber-50);color:#8A5106}
.ostat--warn{background:var(--red-50);color:var(--red)}
.ostat--ok{background:var(--v-100);color:var(--v-800)}
.ostat--done{background:var(--green-50);color:#0A6B4A}
.ostat--off{background:var(--canvas);color:var(--ink-4)}

@media (max-width:900px){
  /* La navigation passe EN HAUT, en rangee defilante — pas dans un tiroir.
     Un menu replie sur telephone ajoute un clic a chaque changement de page,
     alors que ces six entrees tiennent sur une bande de 44 px. */
  .acct{grid-template-columns:1fr;gap:1.1rem}
  .anav{position:static}
  .anav-list{grid-auto-flow:column;grid-auto-columns:max-content;gap:.35rem;
             overflow-x:auto;padding-bottom:.4rem;scrollbar-width:none}
  .anav-list::-webkit-scrollbar{display:none}
  .anav-a{white-space:nowrap;border:1px solid var(--line);padding-inline:.8rem}
  .anav-a.is-on{border-color:var(--v-200)}
  .anav-out{margin:0;padding:0;border:0}
  .anav-a--out{border:1px solid var(--line)}
}
@media (max-width:860px){
  .authwrap{grid-template-columns:minmax(0,1fr);max-width:480px;margin-inline:auto}
  /* La colonne d'arguments passe SOUS le formulaire : au-dessus, elle
     repousserait le premier champ hors de l'ecran sur un telephone. */
  .authside{order:2;padding-top:0}
}

/* ── Espace client : contenu ─────────────────────────────────────────────── */
.acontent{min-width:0}

.acard-top{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin-bottom:.9rem}
.acard-top .acard-h{margin:0}
.acard-more{display:inline-flex;align-items:center;gap:.2rem;font-size:.84rem;color:var(--v-700);
            white-space:nowrap}
.acard-more:hover{text-decoration:underline}
.acard--danger{border-color:#F5D3D3}
.atwo{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:1rem;margin-top:1rem}
.atwo .acard{margin-top:0}

/* Trois compteurs qui se CLIQUENT : un chiffre qui ne mene nulle part sur une
   page de compte est de la decoration. */
.astats{display:grid;grid-template-columns:repeat(3,1fr);gap:.7rem;list-style:none;margin:0 0 1.3rem;padding:0}
.astats a{display:flex;flex-direction:column;gap:.15rem;padding:.9rem 1rem;background:var(--paper);
          border:1px solid var(--line);border-radius:var(--r-lg);text-decoration:none;
          transition:border-color var(--dur),background var(--dur)}
.astats a:hover{border-color:var(--v-200);background:var(--v-50)}
.astats-n{font-size:1.5rem;font-weight:680;letter-spacing:-.03em;color:var(--ink);
          font-variant-numeric:tabular-nums;line-height:1}
.astats-l{font-size:.8rem;color:var(--ink-3)}

.aaddr{font-style:normal;font-size:.9rem;line-height:1.6;color:var(--ink-2)}
.aaddr b{display:block;color:var(--ink);font-weight:580}
.aaddr-tel{color:var(--ink-4);font-size:.85rem}

.afacts{display:grid;grid-template-columns:auto 1fr;gap:.4rem 1rem;margin:0;font-size:.89rem}
.afacts dt{color:var(--ink-3)}
.afacts dd{margin:0;color:var(--ink);overflow-wrap:anywhere}

/* ── Commandes ───────────────────────────────────────────────────────────── */
.olist{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.olist-a{display:grid;grid-template-columns:auto 1fr auto auto auto;align-items:center;gap:.8rem;
         padding:.7rem .6rem;border-radius:var(--r);text-decoration:none;color:var(--ink-2);
         transition:background var(--dur)}
.olist-a:hover{background:var(--canvas)}
.olist-ref{font-family:var(--mono);font-size:.86rem;font-weight:600;color:var(--ink)}
.olist-meta{font-size:.8rem;color:var(--ink-4)}
.olist-sum{font-weight:640;font-variant-numeric:tabular-nums}
.olist-a svg{color:var(--ink-4)}

.ocards{list-style:none;margin:0;padding:0;display:grid;gap:.85rem}
.ocard{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden}
.ocard-top{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;
           padding:.9rem 1.1rem;border-bottom:1px solid var(--line-2);background:var(--canvas)}
.ocard-ref{font-family:var(--mono);font-size:.92rem;font-weight:640;color:var(--ink);text-decoration:none}
.ocard-ref:hover{color:var(--v-700)}
.ocard-date{margin:.15rem 0 0;font-size:.8rem;color:var(--ink-4)}
.ocard-body{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.9rem 1.1rem}
.ocard-thumbs{display:flex;gap:.35rem}
.ocard-th{width:46px;height:46px;flex:none;display:grid;place-items:center;background:var(--paper);
          border:1px solid var(--line);border-radius:var(--r-xs);color:var(--ink-4);overflow:hidden}
.ocard-th img{width:100%;height:100%;object-fit:contain;padding:2px}
.ocard-th--more{font-size:.78rem;font-weight:600;color:var(--ink-3);background:var(--canvas)}
.ocard-sum{display:flex;flex-direction:column;align-items:flex-end;gap:.1rem;text-align:right}
.ocard-items{font-size:.8rem;color:var(--ink-4)}
.ocard-total{font-size:1.05rem;font-weight:660;font-variant-numeric:tabular-nums}
.ocard-coin{font-family:var(--mono);font-size:.75rem;color:var(--ink-3)}
.ocard-foot{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;
            padding:.75rem 1.1rem;border-top:1px solid var(--line-2)}
.ocard-track{display:inline-flex;align-items:center;gap:.4rem;font-size:.83rem;color:var(--ink-3)}
.ocard-track svg{color:var(--green)}
.ocard-track b{font-family:var(--mono);color:var(--ink)}

.atabs{display:flex;gap:.35rem;flex-wrap:wrap;margin-bottom:1.1rem}
.atab{padding:.4rem .8rem;border-radius:var(--r);font-size:.86rem;color:var(--ink-2);
       border:1px solid var(--line);background:var(--paper);text-decoration:none}
.atab:hover{border-color:var(--v-200);color:var(--v-700)}
.atab.is-on{background:var(--ink);border-color:var(--ink);color:#fff;font-weight:560}

/* ── Liste de suivi ──────────────────────────────────────────────────────── */
.wlist{list-style:none;margin:0;padding:0;display:grid;gap:.7rem}
.wrow{display:grid;grid-template-columns:78px minmax(0,1fr) auto auto;align-items:center;gap:1rem;
      background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);padding:.8rem}
.wrow-img{width:78px;height:60px;display:block;background:var(--paper)}
.wrow-img img{width:100%;height:100%;object-fit:contain}
.wrow-brand{font-family:var(--mono);font-size:.66rem;letter-spacing:.09em;text-transform:uppercase;
            color:var(--ink-4);margin:0}
.wrow-t{font-size:.93rem;font-weight:560;line-height:1.35;margin:.15rem 0 0;letter-spacing:-.012em;
        display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.wrow-since{margin:.25rem 0 0;font-size:.76rem;color:var(--ink-4)}
.wrow-price{display:flex;flex-direction:column;align-items:flex-end;gap:.2rem;text-align:right}
.wrow-now{font-size:1.08rem;font-weight:660;font-variant-numeric:tabular-nums}
.wrow-move{display:inline-flex;align-items:center;gap:.2rem;font-size:.75rem;color:var(--ink-4)}
.wrow-move--down{color:var(--green);font-weight:600}
.wrow-move--up{color:var(--ink-4)}
.wrow-act{display:flex;align-items:center;gap:.4rem}
.wrow-x{width:32px;height:32px;display:grid;place-items:center;border-radius:var(--r);
        color:var(--ink-4);background:none;border:0;cursor:pointer;transition:all var(--dur)}
.wrow-x:hover{background:var(--red-50);color:var(--red)}

.wdrop{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.wdrop a{display:grid;grid-template-columns:52px minmax(0,1fr) auto auto;align-items:center;gap:.8rem;
         padding:.5rem .6rem;border-radius:var(--r);text-decoration:none;color:var(--ink-2)}
.wdrop a:hover{background:var(--canvas)}
.wdrop img{width:52px;height:40px;object-fit:contain}
.wdrop-t{font-size:.88rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wdrop-p{font-weight:640;font-variant-numeric:tabular-nums;white-space:nowrap}
.wdrop-p s{font-weight:400;color:var(--ink-4);font-size:.82rem;margin-left:.3rem}
.wdrop-off{font-size:.75rem;font-weight:600;color:var(--green);background:var(--green-50);
           border-radius:var(--r-xs);padding:.1rem .35rem;white-space:nowrap}

/* ── Adresses ────────────────────────────────────────────────────────────── */
.abox{position:relative;background:var(--paper);border:1px solid var(--line);
      border-radius:var(--r-lg);padding:1.05rem 1.1rem;display:flex;flex-direction:column}
.abox.is-default{border-color:var(--v-200);background:var(--v-50)}
.abox-flag{position:absolute;top:.8rem;right:.9rem;display:inline-flex;align-items:center;gap:.25rem;
           font-size:.7rem;font-weight:600;color:var(--v-700);text-transform:uppercase;letter-spacing:.06em}
.abox-label{margin:0 0 .4rem;font-size:.72rem;font-weight:600;letter-spacing:.08em;
            text-transform:uppercase;color:var(--ink-4)}
.abox-act{display:flex;gap:.8rem;align-items:center;margin-top:.9rem;padding-top:.75rem;
          border-top:1px solid var(--line-2);flex-wrap:wrap}
.abox-a{font-size:.82rem;color:var(--v-700);background:none;border:0;padding:0;cursor:pointer;
        font-family:inherit;text-decoration:none}
.abox-a:hover{text-decoration:underline}
.abox-a--del{color:var(--ink-4)}
.abox-a--del:hover{color:var(--red)}

.aform{display:grid;gap:1rem}
.aform--inline{grid-template-columns:minmax(0,1fr) auto;align-items:end}
.aform-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem}
.aform-act{display:flex;gap:.6rem;align-items:center;flex-wrap:wrap;margin-top:.2rem}

.adanger{margin-top:.4rem}
.adanger-s{cursor:pointer;font-size:.88rem;color:var(--red);list-style:none;
           display:inline-flex;align-items:center;gap:.35rem}
.adanger-s::-webkit-details-marker{display:none}
.adanger-s:hover{text-decoration:underline}
.adanger[open] .adanger-s{margin-bottom:1rem;font-weight:560}

/* ── Appareils ───────────────────────────────────────────────────────────── */
.devlist{list-style:none;margin:0 0 1.4rem;padding:0;display:grid;gap:.6rem}
.dev{display:flex;align-items:center;gap:.9rem;padding:.9rem 1rem;background:var(--paper);
     border:1px solid var(--line);border-radius:var(--r-lg)}
.dev.is-here{border-color:var(--v-200);background:var(--v-50)}
.dev-ico{width:38px;height:38px;flex:none;display:grid;place-items:center;border-radius:var(--r);
         background:var(--canvas);color:var(--ink-3)}
.dev.is-here .dev-ico{background:var(--v-100);color:var(--v-700)}
.dev-main{flex:1;min-width:0}
.dev-t{margin:0;font-size:.93rem;font-weight:560;display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}
.dev-now{font-size:.68rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;
         color:var(--v-700);background:var(--v-100);border-radius:var(--r-xs);padding:.1rem .35rem}
.dev-m{margin:.2rem 0 0;font-size:.78rem;color:var(--ink-4);line-height:1.5}
.dev-x{font-size:.82rem;color:var(--ink-3);background:none;border:1px solid var(--line);
       border-radius:var(--r);padding:.35rem .7rem;cursor:pointer;font-family:inherit;white-space:nowrap}
.dev-x:hover{border-color:var(--red);color:var(--red);background:var(--red-50)}

.seclist{list-style:none;margin:0;padding:0;display:grid;gap:.9rem}
.seclist li{display:flex;gap:.7rem;align-items:flex-start}
.seclist svg{flex:none;margin-top:.15rem;color:var(--v-600)}
.seclist b{display:block;font-size:.9rem;font-weight:580}
.seclist span{display:block;margin-top:.15rem;font-size:.85rem;color:var(--ink-3);line-height:1.55}

/* `.btn-quiet` est deja defini plus haut : le redefinir ici l'aurait change
   sur TOUT le site, puisque la derniere regle gagne. */
.btn-danger{background:var(--red);color:#fff}
.btn-danger:hover{background:#C21C1C}

@media (max-width:640px){
  .astats{grid-template-columns:1fr;gap:.5rem}
  .astats a{flex-direction:row;align-items:baseline;justify-content:space-between}
  .olist-a{grid-template-columns:1fr auto;row-gap:.25rem}
  .olist-meta{grid-column:1;font-size:.76rem}
  .olist-a > svg{display:none}
  .ocard-body{flex-direction:column;align-items:flex-start;gap:.7rem}
  .ocard-sum{align-items:flex-start;text-align:left}
  /* La ligne de suivi devient un BLOC : a quatre colonnes sur 360 px, le titre
     tombait a une trentaine de pixels de large. */
  .wrow{grid-template-columns:64px minmax(0,1fr);row-gap:.6rem}
  .wrow-img{width:64px;height:52px}
  .wrow-price{grid-column:1/-1;flex-direction:row;align-items:baseline;justify-content:space-between;
              text-align:left;width:100%;flex-wrap:wrap;gap:.5rem}
  .wrow-act{grid-column:1/-1;justify-content:space-between}
  .aform--inline{grid-template-columns:1fr}
}

/* ── Compte dans l'en-tete ───────────────────────────────────────────────── */
.hdr-acct{gap:.4rem;padding-inline:.6rem;width:auto}
.hdr-acct-t{font-size:.86rem;font-weight:540;color:var(--ink-2)}
.acctsel{position:relative}
.acctsel-btn{display:inline-flex;align-items:center;gap:.4rem;height:40px;padding:0 .6rem;
             border-radius:var(--r-sm);font-size:.86rem;font-weight:540;color:var(--ink-2);
             transition:background var(--dur)}
.acctsel-btn:hover{background:var(--v-50)}
.acctsel-btn > svg:first-child{color:var(--ink-3)}
.acctsel-btn > svg:last-child{color:var(--ink-4)}
.acctsel-t{max-width:11ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acctsel-menu{position:absolute;right:0;top:calc(100% + 8px);z-index:70;width:236px;
              background:var(--paper);border-radius:var(--r);box-shadow:var(--sh-3);
              border:1px solid var(--line-2);padding:.4rem}
.acctsel-head{padding:.5rem .6rem .45rem;margin-bottom:.25rem;border-bottom:1px solid var(--line-2);
              font-size:.78rem;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acctsel-item{display:flex;align-items:center;gap:.6rem;width:100%;padding:.48rem .6rem;
              border-radius:var(--r-xs);text-align:left;font-size:.88rem;color:var(--ink-2);
              text-decoration:none;background:none;border:0;font-family:inherit;cursor:pointer;
              transition:background var(--dur),color var(--dur)}
.acctsel-item svg{color:var(--ink-4);flex:none}
.acctsel-item:hover{background:var(--v-50);color:var(--v-700)}
.acctsel-item:hover svg{color:var(--v-600)}
.acctsel-out{margin-top:.25rem;padding-top:.25rem;border-top:1px solid var(--line-2)}
.acctsel-out .acctsel-item:hover{background:var(--red-50);color:var(--red)}
.acctsel-out .acctsel-item:hover svg{color:var(--red)}

/* Le bouton d'inscription tant que le controle humain n'a pas repondu. */
.btn[data-waiting]{opacity:.55;cursor:not-allowed}

@media (max-width:860px){
  /* Le libelle disparait, l'icone reste : sur telephone la barre d'actions
     doit tenir sur une ligne avec le panier. */
  .hdr-acct-t,.acctsel-t{display:none}
  .acctsel-btn{padding-inline:.45rem}
}

/* ── Fiche de commande ───────────────────────────────────────────────────── */
.aback{margin:0 0 .9rem}
.aback a{display:inline-flex;align-items:center;gap:.4rem;font-size:.85rem;color:var(--ink-3);
         text-decoration:none}
.aback a:hover{color:var(--v-700)}
/* La fleche pointe vers la GAUCHE : c'est un retour. L'icone du jeu est
   orientee vers la droite, on la retourne plutot que d'en dessiner une seconde. */
.aback svg{transform:scaleX(-1)}

/* Chronologie HORIZONTALE sur grand ecran : les cinq etapes se lisent d'un
   regard, et le trait qui les relie dit ce qui est franchi. */
.otrack{list-style:none;display:grid;grid-auto-flow:column;grid-auto-columns:1fr;
        margin:0 0 1.2rem;padding:0;counter-reset:t}
.otrack-s{position:relative;display:flex;flex-direction:column;align-items:center;gap:.4rem;
          padding-top:1.5rem;text-align:center}
/* Le trait de liaison part du centre de la pastille et s'arrete au suivant :
   trace sur toute la largeur, il depasserait aux deux extremites de la rangee. */
.otrack-s::before{content:"";position:absolute;top:9px;left:50%;width:100%;height:2px;
                  background:var(--line)}
.otrack-s:last-child::before{display:none}
.otrack-s.is-done::before{background:var(--v-200)}
.otrack-d{position:absolute;top:0;left:50%;transform:translateX(-50%);width:20px;height:20px;
          border-radius:var(--r-pill);background:var(--paper);border:2px solid var(--line);
          display:grid;place-items:center;color:#fff;z-index:1}
.otrack-s.is-done .otrack-d{background:var(--v-600);border-color:var(--v-600)}
.otrack-l{font-size:.82rem;font-weight:560;color:var(--ink-4)}
.otrack-s.is-done .otrack-l{color:var(--ink)}
.otrack-w{font-size:.74rem;color:var(--ink-4);font-variant-numeric:tabular-nums}

.acard--pay{border-color:var(--v-200);background:var(--v-50)}
.acard--pay .acard-h{display:flex;align-items:center;gap:.45rem}
.acard--pay .acard-h svg{color:var(--v-600)}
.paybox{display:grid;gap:.2rem;margin:0}
.paybox dt{font-size:.75rem;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-3);
           margin-top:.7rem}
.paybox dd{margin:0}
.paybox-amt{font-family:var(--mono);font-size:1.5rem;font-weight:680;letter-spacing:-.02em}
.paybox-amt span{font-size:.9rem;color:var(--ink-3);font-weight:560}
/* L'adresse de reglement se COPIE a la main : elle doit pouvoir se couper sur
   plusieurs lignes sans qu'un seul caractere sorte du cadre. */
.paybox-addr{font-family:var(--mono);font-size:.86rem;word-break:break-all;line-height:1.5;
             background:var(--paper);border:1px solid var(--v-100);border-radius:var(--r);
             padding:.55rem .7rem}

.oitems{list-style:none;margin:0;padding:0;display:grid;gap:.2rem}
.oitem{display:grid;grid-template-columns:54px minmax(0,1fr) auto;align-items:center;gap:.9rem;
       padding:.6rem 0}
.oitem + .oitem{border-top:1px solid var(--line-2)}
.oitem-img{width:54px;height:54px;display:grid;place-items:center;background:var(--paper);
           border:1px solid var(--line);border-radius:var(--r-xs);color:var(--ink-4);overflow:hidden}
.oitem-img img{width:100%;height:100%;object-fit:contain;padding:3px}
.oitem-t{font-size:.92rem;font-weight:550;color:var(--ink);text-decoration:none;line-height:1.4;
         display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
a.oitem-t:hover{color:var(--v-700)}
.oitem-m{margin:.2rem 0 0;font-size:.77rem;color:var(--ink-4);font-family:var(--mono)}
.oitem-p{font-weight:640;font-variant-numeric:tabular-nums;white-space:nowrap}

.afacts--money dd{text-align:right;font-variant-numeric:tabular-nums}
.afacts--money .is-total{padding-top:.45rem;margin-top:.25rem;border-top:1px solid var(--line-2);
                         font-weight:660;font-size:1rem}
.afacts--money .is-coin{font-family:var(--mono);font-size:.85rem}
.afacts--money .is-tx{font-family:var(--mono);font-size:.75rem;word-break:break-all;text-align:right}
.afacts--money .is-free{color:var(--green);font-weight:560}

.otrackno{display:flex;align-items:center;gap:.4rem;margin:.9rem 0 0;padding-top:.8rem;
          border-top:1px solid var(--line-2);font-size:.85rem;color:var(--ink-3)}
.otrackno svg{color:var(--green);flex:none}
.otrackno b{font-family:var(--mono);color:var(--ink)}
.acard-fine{display:flex;align-items:flex-start;gap:.45rem;margin:.8rem 0 0;font-size:.79rem;
            color:var(--ink-4);line-height:1.5}
.acard-fine svg{flex:none;margin-top:.15rem}

@media (max-width:640px){
  /* La chronologie passe a la VERTICALE : cinq etapes sur 360 px de large
     donneraient 72 px par libelle, soit « Awaiting » coupe en deux. */
  .otrack{grid-auto-flow:row;gap:0}
  .otrack-s{flex-direction:row;align-items:center;gap:.7rem;padding:.5rem 0 .5rem 2rem;
            text-align:left}
  .otrack-s::before{top:50%;left:9px;width:2px;height:100%}
  .otrack-d{top:50%;left:0;transform:translateY(-50%)}
  .otrack-w{margin-left:auto}
  .oitem{grid-template-columns:46px minmax(0,1fr);row-gap:.35rem}
  .oitem-p{grid-column:2;text-align:left}
}

/* Le coeur est desormais un formulaire : il doit occuper la meme boite
   absolue qu'avant, sinon la carte se decale d'une hauteur de bouton. */
.pcard-wishf{position:absolute;top:.45rem;right:.45rem;margin:0;line-height:0}
.pcard-wish{position:static}
.pcard-wish.is-on{opacity:1;transform:none;color:var(--red)}
.pcard-wish[disabled]{opacity:.5}

/* ── Modal de compte ─────────────────────────────────────────────────────
   DEUX volets : un panneau sombre qui persuade, un volet blanc qui recueille.
   La premiere version empilait tout dans une colonne blanche — c'etait un
   formulaire administratif, pas une porte d'entree de boutique.

   Le cadre reutilise le REGISTRE de tiroirs (voile, `.is-open`, blocage du
   defilement) : seule l'apparence change. */
.modal{position:fixed;inset:0;z-index:80;display:grid;place-items:center;padding:1.2rem;
       opacity:0;pointer-events:none;transition:opacity var(--dur)}
.modal.is-open{opacity:1;pointer-events:auto}

.amod{position:relative;display:grid;grid-template-columns:288px minmax(0,1fr);
      width:min(788px,100%);max-height:calc(100dvh - 2.4rem);overflow:hidden;
      background:var(--paper);border-radius:var(--r-xl);
      box-shadow:0 30px 70px -22px rgba(24,20,60,.42);
      transform:translateY(12px) scale(.985);transition:transform var(--dur) var(--ease)}
.modal.is-open .amod{transform:none}

/* ── Volet de marque ─────────────────────────────────────────────────── */
/* Contenu CENTRE verticalement : la ligne de bas de panneau ayant ete
   retiree, un alignement en haut laissait un tiers du panneau vide sous le
   dernier argument — et un grand aplat sombre inoccupe se lit comme un defaut
   de chargement, pas comme du blanc voulu. */
.amod-side{display:flex;flex-direction:column;justify-content:center;
           padding:2rem 1.7rem;color:#fff;
           background:linear-gradient(155deg,var(--ink) 0%,#221A52 56%,#33227A 100%)}
.amod-mark{font-size:1.02rem;font-weight:700;letter-spacing:-.03em;margin:0}
.amod-mark b{color:#B7A8FF;font-weight:700}
.amod-mark i{font-style:normal;color:#8E96AE;font-weight:500}
.amod-claim{margin:1.5rem 0 0;font-size:1.28rem;font-weight:600;line-height:1.28;
            letter-spacing:-.03em}
.amod-pts{list-style:none;display:grid;gap:.8rem;margin:1.5rem 0 0;padding:0}
.amod-pts li{display:flex;gap:.6rem;align-items:flex-start;font-size:.855rem;line-height:1.45;
             color:#C9CEDD}
.amod-pts svg{flex:none;margin-top:.1rem;color:#B7A8FF}
.amod-foot{display:flex;gap:.45rem;align-items:flex-start;margin:auto 0 0;padding-top:1.4rem;
           font-size:.78rem;line-height:1.5;color:#8E96AE}
.amod-foot svg{flex:none;margin-top:.1rem;color:#8E96AE}

/* ── Volet formulaire ────────────────────────────────────────────────── */
.amod-main{padding:1.9rem 1.9rem 1.6rem;overflow-y:auto}
.amod-x{position:absolute;top:.95rem;right:.95rem;z-index:2;width:34px;height:34px;display:grid;
        place-items:center;border-radius:var(--r);color:var(--ink-4);background:none;border:0;
        cursor:pointer;transition:background var(--dur),color var(--dur)}
.amod-x:hover{background:var(--canvas);color:var(--ink)}

/* Onglets SOULIGNES, pas un bouton segmente : le segmente se lit comme un
   reglage a choisir, l'onglet souligne comme deux pages du meme cadre. */
.amod-tabs{display:flex;gap:1.4rem;margin:0 2.4rem 1.5rem 0;
           border-bottom:1px solid var(--line)}
.amod-tab{position:relative;padding:0 0 .7rem;background:none;border:0;cursor:pointer;
          font-family:inherit;font-size:.93rem;font-weight:540;color:var(--ink-4);
          transition:color var(--dur)}
.amod-tab::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;
                 background:var(--v-600);transform:scaleX(0);transform-origin:left;
                 transition:transform var(--dur) var(--ease)}
.amod-tab:hover{color:var(--ink-2)}
.amod-tab.is-on{color:var(--ink);font-weight:620}
.amod-tab.is-on::after{transform:scaleX(1)}

.amod-h{font-size:1.42rem;letter-spacing:-.035em;line-height:1.18;margin:0 0 1.15rem}
.modal-pane .note{margin-bottom:1.05rem}
.amod-alt{margin:1.15rem 0 0;padding-top:1rem;border-top:1px solid var(--line-2);
          font-size:.88rem;color:var(--ink-3)}
.modal-swap{background:none;border:0;padding:0;font:inherit;font-weight:580;color:var(--v-700);
            cursor:pointer}
.modal-swap:hover{text-decoration:underline}

/* Le widget mesure 65 px : la place est reservee AVANT son arrivee, sinon le
   bouton de validation saute sous le doigt au moment ou il se pose. */
.tstile{min-height:66px;display:flex;align-items:center}
.tstile:empty{min-height:0}

@media (max-width:720px){
  /* Le panneau de marque disparait : il PERSUADE, il n'informe pas, et sur un
     telephone il ne ferait que repousser le premier champ hors de l'ecran. */
  .amod{grid-template-columns:1fr;width:min(440px,100%)}
  .amod-side{display:none}
  .amod-main{padding:1.7rem 1.4rem 1.4rem}
}
@media (max-width:560px){
  /* Feuille collee au bas : un cadre centre laisse le clavier virtuel
     recouvrir la moitie du formulaire, une feuille remonte avec lui. */
  .modal{place-items:end center;padding:0}
  .amod{width:100%;max-height:94dvh;border-radius:var(--r-xl) var(--r-xl) 0 0;
        transform:translateY(18px)}
  .amod-main{padding:1.5rem 1.15rem 1.8rem}
  .amod-h{font-size:1.3rem}
}
@media (prefers-reduced-motion:reduce){
  .modal,.amod,.amod-tab::after{transition:none}
}

/* Le chapeau du volet « mot de passe oublie » et son etat de confirmation. */
.amod-lede{margin:-.5rem 0 1.2rem;color:var(--ink-3);font-size:.9rem;line-height:1.55}
.amod-done{text-align:center;padding:1.6rem .8rem 1.2rem}
.amod-done-ico{display:grid;place-items:center;width:46px;height:46px;margin:0 auto .8rem;
               border-radius:var(--r-pill);background:var(--green-50);color:var(--green)}
.amod-done-h{margin:0;font-size:1.02rem;font-weight:620}
.amod-done-p{margin:.4rem auto 0;max-width:34ch;color:var(--ink-3);font-size:.88rem;line-height:1.55}
/* Le lien « mot de passe oublie » est desormais un <button> : il doit garder
   l'apparence d'un lien, pas celle d'un bouton de formulaire. */
button.authform-link{background:none;border:0;padding:0;font:inherit;cursor:pointer}

/* ── Bouton et modal des monnaies ────────────────────────────────────────── */
.fxbtn{display:inline-flex;align-items:center;gap:.4rem;height:40px;padding:0 .6rem 0 .5rem;
       border-radius:var(--r-sm);background:none;border:0;cursor:pointer;font-family:inherit;
       transition:background var(--dur)}
.fxbtn:hover{background:var(--v-50)}
.fxbtn-t{display:inline-flex;align-items:baseline;font-family:var(--mono);font-size:.83rem;
         font-weight:560;color:var(--ink)}
.fxbtn-t i{font-style:normal;color:var(--ink-4);margin:0 .12rem}
.fxbtn > svg:last-child{color:var(--ink-4)}

.fxmod{position:relative;display:flex;flex-direction:column;width:min(620px,100%);
       max-height:calc(100dvh - 2.4rem);background:var(--paper);border-radius:var(--r-xl);
       box-shadow:0 30px 70px -22px rgba(24,20,60,.42);overflow:hidden;
       transform:translateY(12px) scale(.985);transition:transform var(--dur) var(--ease)}
.modal.is-open .fxmod{transform:none}

.fxmod-top{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;
           padding:1.4rem 1.5rem 1rem;border-bottom:1px solid var(--line)}
.fxmod-h{font-size:1.22rem;letter-spacing:-.03em;margin:0}
.fxmod-sub{margin:.25rem 0 0;color:var(--ink-3);font-size:.87rem}
.fxmod-x{position:static;flex:none}
.fxmod-body{overflow-y:auto;padding:1.2rem 1.5rem 1.4rem;display:grid;gap:1.5rem}

.fxsec-top{display:flex;align-items:baseline;justify-content:space-between;gap:.8rem;
           margin-bottom:.7rem;flex-wrap:wrap}
.fxsec-h{display:flex;align-items:center;gap:.42rem;font-size:.92rem;font-weight:620;margin:0}
.fxsec-h svg{color:var(--v-600)}
/* La distinction « ce qu'on envoie » / « ce qu'on lit » est la chose la plus
   importante du panneau : elle est portee par un texte, pas par une nuance. */
.fxsec-note{margin:0;font-size:.78rem;color:var(--ink-4)}

.fxcoins{display:grid;grid-template-columns:repeat(auto-fill,minmax(158px,1fr));gap:.4rem}
.fxcoin{display:flex;align-items:center;gap:.55rem;padding:.55rem .6rem;border-radius:var(--r);
        border:1px solid var(--line);background:var(--paper);cursor:pointer;font-family:inherit;
        text-align:left;transition:border-color var(--dur),background var(--dur)}
.fxcoin:hover{border-color:var(--v-200);background:var(--v-50)}
.fxcoin.is-on{border-color:var(--v-600);background:var(--v-50)}
.fxcoin-t{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.2}
.fxcoin-t b{font-family:var(--mono);font-size:.85rem;font-weight:640}
.fxcoin-t small{font-size:.74rem;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fxcoin-tick{color:var(--v-600);opacity:0;flex:none}
.fxcoin.is-on .fxcoin-tick{opacity:1}

.fxsearch{display:flex;align-items:center;gap:.5rem;padding:.5rem .7rem;margin-bottom:.55rem;
          border:1px solid var(--line);border-radius:var(--r);background:var(--paper)}
.fxsearch svg{color:var(--ink-4);flex:none}
.fxsearch input{flex:1;min-width:0;border:0;background:none;font:inherit;font-size:.9rem;color:var(--ink)}
.fxsearch input:focus{outline:0}
.fxsearch:focus-within{border-color:var(--v-500);box-shadow:0 0 0 3px rgba(109,74,255,.14)}

/* Hauteur BORNEE et defilement propre : quarante-cinq monnaies deployees
   feraient un panneau plus haut que l'ecran, et le bloc de verification en
   pied — qui est le seul moyen de controler son choix — sortirait du champ. */
.fxfiats{max-height:230px;overflow-y:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(184px,1fr));
         gap:.25rem;padding-right:.2rem}
.fxfiat{display:flex;align-items:center;gap:.5rem;padding:.42rem .55rem;border-radius:var(--r);
        border:1px solid transparent;background:none;cursor:pointer;font-family:inherit;
        text-align:left;transition:background var(--dur),border-color var(--dur)}
.fxfiat:hover{background:var(--canvas)}
.fxfiat.is-on{border-color:var(--v-600);background:var(--v-50)}
.fxfiat b{font-family:var(--mono);font-size:.8rem;font-weight:640;flex:none;width:3.1em}
.fxfiat > span:not(.fxfiat-tick){flex:1;min-width:0;font-size:.82rem;color:var(--ink-3);
        overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fxfiat-tick{color:var(--v-600);opacity:0;flex:none}
.fxfiat.is-on .fxfiat-tick{opacity:1}
.fxfiats-none{grid-column:1/-1;margin:.6rem 0;font-size:.85rem;color:var(--ink-4);text-align:center}

.fxmod-foot{flex:none;border-top:1px solid var(--line);background:var(--canvas);padding:.95rem 1.5rem 1.1rem}
.fxpreview{display:flex;align-items:baseline;gap:1.4rem;flex-wrap:wrap}
.fxrate{font-family:var(--mono);font-size:.92rem;font-weight:600;color:var(--ink);
        font-variant-numeric:tabular-nums}
.fxmod-fine{display:flex;align-items:flex-start;gap:.4rem;margin:.6rem 0 0;font-size:.76rem;
            color:var(--ink-4);line-height:1.5}
.fxmod-fine svg{flex:none;margin-top:.15rem}

@media (max-width:560px){
  .fxmod{width:100%;max-height:94dvh;border-radius:var(--r-xl) var(--r-xl) 0 0;transform:translateY(18px)}
  .fxmod-top{padding:1.2rem 1.1rem .9rem}
  .fxmod-body{padding:1.1rem 1.1rem 1.2rem}
  .fxmod-foot{padding:.9rem 1.1rem 1.2rem}
  .fxcoins{grid-template-columns:1fr 1fr}
  .fxfiats{grid-template-columns:1fr 1fr;max-height:200px}
}

/* ══════════════════════════════════════════════════════════════════════════
   MOBILE — reprise complete
   ══════════════════════════════════════════════════════════════════════════
   Ce bloc vient EN DERNIER et corrige la mise en page etroite dans son
   ensemble, plutot que par retouches dispersees. Trois regles le gouvernent :

   1. AUCUNE CIBLE TACTILE SOUS 40 px. Une icone de 32 px se rate une fois sur
      trois avec un pouce ; ce n'est pas un detail d'esthetique.
   2. AUCUN TEXTE COUPE. Un libelle tronque au milieu d'un mot ne dit pas la
      moitie de son message — il dit qu'on n'a pas regarde la page sur un
      telephone.
   3. `min-width:0` SUR TOUT ENFANT DE GRILLE OU DE FLEX qui contient du texte.
      Par defaut ils valent `min-width:auto`, c'est-a-dire « jamais plus etroit
      que mon contenu » : c'est la cause premiere des debordements horizontaux,
      et elle est invisible tant qu'on ne mesure pas.
   ═════════════════════════════════════════════════════════════════════════ */

.announce-short{display:none}

@media (max-width:860px){
  /* ── Bandeau ─────────────────────────────────────────────────────────── */
  .announce-long{display:none}
  .announce-short{display:inline}
  .announce-in{padding-block:.45rem}
  .announce-msg{font-size:.76rem}

  /* ── Barre principale : UNE rangee compacte, puis la recherche ────────── */
  .hdr-main{flex-wrap:wrap;align-items:center;gap:.4rem;padding-block:.5rem;min-height:0}
  .hdr-burger{display:grid;width:40px;height:40px;flex:none}
  .brand{flex:1;min-width:0}
  .brand-mark svg{width:28px;height:28px}
  .hdr-acts{gap:.15rem;flex:none}

  /* Le bloc monnaie garde son libelle : c'est le seul endroit ou l'on voit
     ce qu'on a choisi sans ouvrir le panneau. Il maigrit, il ne disparait pas. */
  .fxbtn{height:40px;padding:0 .35rem 0 .3rem;gap:.28rem}
  .fxbtn-t{font-size:.72rem}
  .fxbtn > svg:last-child{display:none}

  .hdr-acct,.acctsel-btn{width:40px;height:40px;padding:0;justify-content:center}
  .acctsel-btn > svg:last-child{display:none}

  /* Le panier redevient une icone carree avec sa pastille : le montant en
     toutes lettres coutait 90 px pour une information qui est deja dans le
     tiroir qu'on ouvre en tapant dessus. */
  .cartbtn{width:44px;height:40px;padding:0;justify-content:center;border-radius:var(--r-sm)}
  .cartbtn-txt{display:none}

  /* ── Recherche : sa propre rangee, pleine largeur ─────────────────────── */
  .search{order:3;flex:0 0 100%;max-width:none;margin:.15rem 0 .55rem}
  .search input{height:44px;font-size:16px}   /* 16px : en dessous, iOS zoome */
  .search-go{width:40px}
}

@media (max-width:560px){
  .announce-links{display:none}
  .announce-in{justify-content:center}
  .hdr-main{padding-inline:14px}
  /* La valeur passe par `--wrap-x` : c'est elle que lisent les elements qui
     debordent volontairement de la colonne (cf. `.rail`). Ecrite directement
     sur `padding-inline`, elle laissait ces elements calculer leur decalage
     sur l'ancienne valeur. */
  .wrap{--wrap-x:14px}
}

@media (max-width:390px){
  /* Sur les plus petits ecrans le libelle de monnaie tombe, la pastille reste :
     elle suffit a reconnaitre son choix, et le panneau donne le detail. */
  .fxbtn-t{display:none}
}

/* ══ Panneaux modaux ═══════════════════════════════════════════════════════ */
/* [!] `min-width:0` sur les enfants de `.fxmod-body` : mesure a 390 px, la
   boite de contenu faisait 355 px et ses enfants 387 — 32 px de debordement,
   et le panneau se lisait coupe sur la droite. La cause n'est pas une largeur
   ecrite quelque part, c'est le `min-width:auto` par defaut d'un enfant de
   grille, qui refuse de descendre sous la largeur de son contenu. */
/* [!] LA REGLE QUI EVITE LA MOITIE DES DEBORDEMENTS DE CE SITE.
   Un enfant de grille ou de flex vaut `min-width:auto` par defaut : « jamais
   plus etroit que mon contenu ». Une rangee defilante, une liste de monnaies,
   une colonne de navigation — tout ce qui contient du texte long refuse alors
   de retrecir, et c'est le PARENT qui deborde, pas l'enfant : on cherche donc
   le defaut au mauvais endroit. Rencontre trois fois ici : la bande d'alertes
   a 360 px, le panneau des monnaies a 390, la navigation du compte a 390 —
   d'ou cette regle posee une fois pour toutes sur les conteneurs concernes. */
.fxmod-body > *,
.fxcoins > *,
.fxfiats > *,
.amod-main > *,
.acct > *,
.acontent > *,
.anav,
.anav-list{min-width:0}
.fxcoins,.fxfiats{min-width:0}
/* La rangee de navigation defile SEULE : sans `overflow` explicite ici, c'est
   la page entiere qui defile lateralement. */
.anav-list{overflow-x:auto}

@media (max-width:640px){
  /* Les deux panneaux deviennent des FEUILLES : pleine largeur, collees au bas
     de l'ecran, coins arrondis en haut. Un cadre centre laisse le clavier
     virtuel recouvrir la moitie du formulaire ; une feuille remonte avec lui.
     La poignee grise indique qu'on peut la refermer vers le bas — c'est la
     convention, et elle evite d'aller chercher une croix de 34 px du pouce. */
  .modal{place-items:end center;padding:0}
  .amod,.fxmod{width:100%;max-width:none;border-radius:var(--r-xl) var(--r-xl) 0 0;
               max-height:94dvh;transform:translateY(20px)}
  .amod::before,.fxmod::before{content:"";position:absolute;top:.5rem;left:50%;
    transform:translateX(-50%);width:38px;height:4px;border-radius:var(--r-pill);
    background:var(--line);z-index:3}

  .fxmod-top{padding:1.35rem 1rem .8rem}
  .fxmod-body{padding:1rem 1rem 1.1rem;gap:1.2rem}
  .fxmod-foot{padding:.85rem 1rem calc(.9rem + env(safe-area-inset-bottom))}
  .amod-main{padding:1.6rem 1rem calc(1.2rem + env(safe-area-inset-bottom))}
  .amod-x,.fxmod-x{top:.9rem;right:.75rem}

  /* Cibles tactiles : 44 px de haut pour chaque monnaie, et deux colonnes au
     plus — a trois, un libelle sur 390 px tombe a 90 px et n'affiche plus que
     « Austral… ». */
  .fxcoins{grid-template-columns:1fr 1fr;gap:.4rem}
  .fxcoin{min-height:46px;padding:.5rem .55rem}
  .fxfiats{grid-template-columns:1fr;max-height:min(38dvh,290px);gap:.1rem}
  .fxfiat{min-height:44px;padding:.5rem .6rem}
  .fxfiat b{width:3.4em}
  .fxsearch input{font-size:16px}
  .fxpreview{gap:.2rem .9rem}
  .fxrate{font-size:.85rem}

  .modal-swap,.authform-link{min-height:32px;display:inline-flex;align-items:center}
  .authform .fld-in{font-size:16px}
  .btn-block{min-height:48px}
}

/* ══ Espace client sur telephone ═══════════════════════════════════════════ */
@media (max-width:640px){
  .acct{padding-block:.9rem 2.4rem;gap:.9rem}
  /* La navigation defile horizontalement, collee sous l'en-tete : elle reste
     accessible en descendant la page, alors qu'un menu replie demanderait un
     clic de plus a chaque changement de section. */
  .anav{position:sticky;top:0;z-index:20;background:var(--canvas);
        margin-inline:-14px;padding:.5rem 14px .45rem}
  .anav-list{gap:.3rem}
  .anav-a{min-height:40px;padding-inline:.7rem;font-size:.86rem}
  .anav-out .anav-a--out{min-height:40px}

  .ahead{margin-bottom:1rem;padding-bottom:.85rem}
  .ahead-h{font-size:1.25rem}
  .ahead-act{width:100%}
  .ahead-act .btn,.ahead-act form{width:100%}
  .ahead-act .btn{justify-content:center;min-height:44px}

  .acard{padding:1rem;border-radius:var(--r)}
  .astats{grid-template-columns:1fr;gap:.4rem}
  .astats a{min-height:52px;padding:.7rem .9rem}
  .astats-n{font-size:1.2rem}

  .atwo{grid-template-columns:1fr;gap:.7rem}
  .agrid{grid-template-columns:1fr}
  .aform-row{grid-template-columns:1fr;gap:.85rem}
  .fld-in{font-size:16px;min-height:46px}
  select.fld-in{min-height:46px}
  textarea.fld-in{min-height:84px}
  .aform-act{flex-direction:column;align-items:stretch}
  .aform-act .btn{justify-content:center;min-height:48px}

  .ocard-top,.ocard-body,.ocard-foot{padding-inline:.9rem}
  .ocard-foot{flex-direction:column;align-items:stretch;gap:.6rem}
  .ocard-foot .btn{justify-content:center;min-height:44px}
  .abox-act{gap:1rem;padding-top:.85rem}
  .abox-a{min-height:36px;display:inline-flex;align-items:center}
  .dev{flex-wrap:wrap;gap:.7rem}
  .dev-x{min-height:38px}
  .devlist .dev-main{flex-basis:calc(100% - 50px)}
}

/* ── Formulaire d'adresse ─────────────────────────────────────────────────
   Le formulaire A GAUCHE, l'etiquette en direct A DROITE. La version
   precedente empilait neuf champs pleine largeur, chacun avec son libelle, sa
   mention « optional », son aide en gris : quatre tailles de texte par champ
   sur une colonne d'un metre de long. Ici les champs courts se partagent une
   rangee, l'aide ne subsiste que la ou elle evite une faute, et la colonne de
   droite donne un point fixe a regarder pendant qu'on tape. */
.addrwrap{display:grid;grid-template-columns:minmax(0,1fr) 268px;
          gap:clamp(1.2rem,2.4vw,2.4rem);align-items:start}
.addrform{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);
          padding:clamp(1.1rem,1rem + .8vw,1.6rem)}
.addrform-top{margin-bottom:1.2rem;padding-bottom:.9rem;border-bottom:1px solid var(--line-2)}
.addrform-h{font-size:1.05rem;font-weight:620;letter-spacing:-.02em;margin:0}
.addrform-sub{margin:.3rem 0 0;color:var(--ink-3);font-size:.86rem;line-height:1.5}

/* Deux colonnes pour les champs COURTS, pleine largeur pour ceux qui portent
   une ligne d'adresse : une rue coupee en deux colonnes se saisit mal. */
.addrgrid{display:grid;grid-template-columns:1fr 1fr;gap:.85rem 1rem}
.addrgrid-full{grid-column:1/-1}
/* [!] `align-self:start`. Par defaut un enfant de grille s'ETIRE a la hauteur
   de sa rangee : le champ sans texte d'aide devenait plus haut que son voisin
   qui en a un, et les deux cadres ne s'alignaient plus — a dix-huit pixels
   pres, ce qui suffit a faire desordre sans qu'on sache pourquoi. */
.addrgrid > *,.addrgrid-pair > *{min-width:0;align-self:start}

/* Colonnes EGALES par defaut. Le code postal merite d'etre plus etroit, mais
   il change de cote selon le pays (« 75011 Paris » contre « Austin 78701 ») :
   une largeur fixee par POSITION retrecissait la ville des que l'ordre
   s'inversait. On vise donc le champ lui-meme. */
.addrgrid-pair{grid-column:1/-1;display:grid;grid-template-columns:1fr 1fr;gap:.85rem 1rem}
@supports selector(:has(*)){
  .addrgrid-pair:has(> .fld:first-child [name="postcode"]){grid-template-columns:.6fr 1fr}
  .addrgrid-pair:has(> .fld:last-child  [name="postcode"]){grid-template-columns:1fr .6fr}
}

/* Une separation qui DIT ce qui change, plutot qu'un filet muet : au-dessus ce
   que lit le transporteur, en dessous ce qui n'est que pour le client. */
.addrsep{display:flex;align-items:center;gap:.7rem;margin:1.3rem 0 .9rem;
         font-size:.72rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
         color:var(--ink-4)}
.addrsep::before,.addrsep::after{content:"";flex:1;height:1px;background:var(--line-2)}
.addrform-def{margin-top:1.1rem}
.addrform-act{display:flex;gap:.6rem;flex-wrap:wrap;margin-top:1.2rem;padding-top:1.1rem;
              border-top:1px solid var(--line-2)}

/* ── L'etiquette en direct ────────────────────────────────────────────────
   Volontairement dessinee comme une VIGNETTE de colis : fond blanc, filet
   discret, texte en mono. On ne relit pas une adresse de la meme facon quand
   elle a la forme de ce qui sera colle sur la boite. */
.addrside{position:sticky;top:9.5rem;display:grid;gap:1rem}
.addrprev{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);
          padding:1rem 1.1rem 1.1rem;box-shadow:var(--sh-1)}
.addrprev-h{display:flex;align-items:center;gap:.4rem;margin:0 0 .7rem;padding-bottom:.6rem;
            border-bottom:1px dashed var(--line);font-size:.68rem;font-weight:600;
            letter-spacing:.09em;text-transform:uppercase;color:var(--ink-4)}
.addrprev-h svg{color:var(--ink-4)}
.addrprev-b{font-style:normal;font-family:var(--mono);font-size:.84rem;line-height:1.7;
            color:var(--ink);word-break:break-word}
.addrfacts{list-style:none;display:grid;gap:.65rem;margin:0;padding:0}
.addrfacts li{display:flex;gap:.55rem;align-items:flex-start;font-size:.8rem;line-height:1.5;
              color:var(--ink-3)}
.addrfacts svg{flex:none;margin-top:.1rem;color:var(--v-600)}

.fld[hidden]{display:none}

@media (max-width:960px){
  /* L'etiquette passe SOUS le formulaire : a cote, elle tomberait a 180 px de
     large et une adresse y serait coupee a chaque ligne. */
  .addrwrap{grid-template-columns:1fr}
  .addrside{position:static;order:2}
}
@media (max-width:560px){
  .addrgrid,.addrgrid-pair{grid-template-columns:1fr}
  .addrform{padding:1rem;border-radius:var(--r)}
  .addrform-act{flex-direction:column}
  .addrform-act .btn{justify-content:center;min-height:48px}
}

/* ── Recherche repliable sur telephone ───────────────────────────────────── */
.hdr-searchbtn{display:none}
@media (max-width:860px){
  .hdr-searchbtn{display:grid;width:40px;height:40px}
  /* Le champ est retire du FLUX, pas seulement masque : `visibility` ou une
     opacite nulle lui laisseraient sa rangee, et c'est precisement la rangee
     qu'on cherche a recuperer. */
  .search{display:none}
  .hdr.is-searching .search{display:flex}
  .hdr.is-searching .hdr-searchbtn{background:var(--v-50);color:var(--v-700)}
}
/* Deux reglages de meme nature cote a cote : les separer verticalement
   suggererait qu'ils sont independants alors qu'on les regle ensemble. */
.aform--two{grid-template-columns:1fr 1fr;gap:1rem;align-items:end}
.aform--two .aform-act{grid-column:1/-1;margin-top:0}
@media (max-width:640px){ .aform--two{grid-template-columns:1fr} }

@media (max-width:900px){
  /* [!] C'est `.anav` qui defile, pas `.anav-list`. Le bouton de deconnexion
     vit dans un <form> voisin de la liste : en faisant defiler la seule liste,
     il tombait sur une deuxieme ligne, tout seul, sous une rangee qui glissait
     — deux mecaniques differentes pour une seule barre. */
  .anav{display:flex;align-items:center;gap:.3rem;overflow-x:auto;
        scrollbar-width:none;border-bottom:1px solid var(--line)}
  .anav::-webkit-scrollbar{display:none}
  .anav-list{display:flex;gap:.3rem;overflow:visible;flex:none;padding-bottom:0}
  .anav-out{flex:none;margin:0;padding:0;border:0}
  /* Un peu d'air a la fin de la rangee : sans lui, le dernier bouton colle au
     bord et l'on ne voit pas qu'il reste quelque chose a faire glisser. */
  .anav-out::after{content:"";display:block;width:14px}
}

/* ── Recherche : plus etroite sur grand ecran ─────────────────────────────
   880 px de champ pour une barre de recherche, c'est plus large que la plupart
   des colonnes de contenu du site : le curseur part a un bout, le bouton est a
   l'autre, et la ligne se lit comme un formulaire administratif. */
.search{max-width:520px}

/* ── Panier sur telephone ─────────────────────────────────────────────────
   Le fond sombre du panier en faisait le point le plus lourd de l'ecran alors
   qu'il est vide neuf fois sur dix. Sur telephone il redevient une icone comme
   les autres — la pastille de comptage suffit a le signaler quand il compte. */
@media (max-width:860px){
  .cartbtn{background:none;color:var(--ink-2);width:40px;height:40px;padding:0;
           border-radius:var(--r-sm)}
  .cartbtn:hover{background:var(--v-50);color:var(--v-700)}
  /* Les icones se resserrent : a .35rem elles flottaient, separees sans raison
     puisqu'elles forment un seul groupe d'actions. */
  .hdr-acts{gap:0}
  .hdr-main{gap:.3rem}
}
/* La case de subdivision est VIDE dans les pays qui n'en ont pas : sans cette
   regle elle occupe quand meme une colonne, et le telephone se retrouve seul a
   droite d'un blanc inexplicable. */
[data-addr-div]:empty{display:none}

/* ══ Panier, caisse, commande ══════════════════════════════════════════════ */
.cartpage,.cocheck,.orderpage{padding-block:clamp(1.2rem,1rem + 1.4vw,2rem) clamp(2.4rem,2rem + 3vw,4rem)}
.chead--plain{border-bottom:0;background:none}
.cartpage-back{display:inline-flex;align-items:center;gap:.4rem;font-size:.86rem;color:var(--ink-3)}
.cartpage-back svg{transform:scaleX(-1)}
.cartpage-back:hover{color:var(--v-700)}.cartgrid,
.cogrid{display:grid;grid-template-columns:minmax(0,1fr) 340px;
                             gap:clamp(1.2rem,2.4vw,2.2rem);align-items:start}
.cartempty,.cocheck-empty{text-align:center;padding:3rem 1.4rem;border:1px dashed var(--line);
                          border-radius:var(--r-lg);background:var(--paper)}

/* ── Lignes du panier ─────────────────────────────────────────────────────
   Une GRILLE et non une suite de blocs flottants : les quantites et les
   montants doivent s'aligner d'une ligne a l'autre, sinon on ne peut pas
   comparer deux articles d'un coup d'oeil. */
.clines{list-style:none;margin:0;padding:0;display:grid;gap:.6rem}
.cline{display:grid;grid-template-columns:78px minmax(0,1fr) auto auto 32px;align-items:center;
       gap:1rem;padding:.85rem;background:var(--paper);border:1px solid var(--line);
       border-radius:var(--r-lg)}
.cline > *{min-width:0}
.cline-img{width:78px;height:62px;display:block}
.cline-img img{width:100%;height:100%;object-fit:contain}
.cline-brand{margin:0;font-family:var(--mono);font-size:.66rem;letter-spacing:.09em;
             text-transform:uppercase;color:var(--ink-4)}
.cline-t{display:block;margin:.15rem 0 0;font-size:.93rem;font-weight:550;color:var(--ink);
         line-height:1.35;text-decoration:none;
         display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.cline-t:hover{color:var(--v-700)}
.cline-unit{margin:.25rem 0 0;font-size:.78rem;color:var(--ink-4)}
.cline-qty{flex:none}
.cline-q{display:inline-grid;place-items:center;width:34px;height:40px;font-family:var(--mono);
         font-weight:600;font-variant-numeric:tabular-nums}
.cline-sum{font-weight:660;font-variant-numeric:tabular-nums;white-space:nowrap}
.cline-x{width:32px;height:32px;display:grid;place-items:center;border:0;background:none;
         color:var(--ink-4);font-size:1.3rem;line-height:1;cursor:pointer;border-radius:var(--r)}
.cline-x:hover{background:var(--red-50);color:var(--red)}

/* ── Recapitulatifs ─────────────────────────────────────────────────────── */
.cartsum-card,.cosum-card{position:sticky;top:9.5rem;background:var(--paper);
                          border:1px solid var(--line);border-radius:var(--r-lg);
                          padding:1.2rem 1.25rem 1.3rem}
.cartsum-h,.cosum-h{font-size:1rem;font-weight:620;margin:0 0 1rem}
.cartsum-rows{display:grid;grid-template-columns:1fr auto;gap:.4rem 1rem;margin:0}
.cartsum-rows dt{color:var(--ink-3);font-size:.89rem}
.cartsum-rows dd{margin:0;text-align:right;font-variant-numeric:tabular-nums;font-size:.92rem}
.cartsum-rows--total{margin-top:.7rem;padding-top:.7rem;border-top:1px solid var(--line-2)}
.cartsum-rows--total dt{color:var(--ink);font-weight:620;font-size:1rem}
.cartsum-rows--total dd{font-weight:680;font-size:1.15rem}
.cartsum-coin{display:flex;align-items:center;gap:.4rem;margin:.6rem 0 1.1rem;padding:.55rem .7rem;
              border-radius:var(--r);background:var(--canvas);font-family:var(--mono);font-size:.86rem}
.cartsum-coin small{margin-left:auto;font-family:var(--font);font-size:.72rem;color:var(--ink-4)}
.cartsum-trust{list-style:none;display:grid;gap:.6rem;margin:1.1rem 0 0;padding:1rem 0 0;
               border-top:1px solid var(--line-2)}
.cartsum-trust li{display:flex;gap:.5rem;align-items:flex-start;font-size:.8rem;line-height:1.5;
                  color:var(--ink-3)}
.cartsum-trust svg{flex:none;margin-top:.1rem;color:var(--v-600)}

/* La barre de franchise : elle MONTRE ce qu'il manque, elle ne le dit pas
   seulement — c'est la difference entre une information et une incitation. */
.shipbar{margin:.8rem 0 .2rem}
.shipbar-track{height:6px;border-radius:var(--r-pill);background:var(--line-2);overflow:hidden}
.shipbar-fill{display:block;height:100%;border-radius:inherit;background:var(--v-500);
              transition:width .4s var(--ease)}
.shipbar-t{margin:.4rem 0 0;font-size:.78rem;color:var(--ink-3)}
.shipbar-t span{font-weight:640;color:var(--ink)}
.shipfree{display:flex;align-items:center;gap:.35rem;margin:.7rem 0 0;font-size:.82rem;
          font-weight:560;color:var(--green)}

/* ── Caisse ─────────────────────────────────────────────────────────────── */
.cocheck-top{margin-bottom:1.4rem}
.cocheck-h{font-size:clamp(1.5rem,1.2rem + 1.2vw,2rem);letter-spacing:-.03em;margin:0}
.cocol{display:grid;gap:1rem;min-width:0}
.costep-note{margin:-.5rem 0 1rem;font-size:.85rem;color:var(--ink-3);line-height:1.55}
.costep-save{margin-top:1rem}

.cobook{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:.45rem;
        margin-bottom:1.1rem}
.cobook-a{text-align:left;padding:.6rem .7rem;border:1px solid var(--line);border-radius:var(--r);
          background:var(--paper);cursor:pointer;font-family:inherit;min-width:0}
.cobook-a:hover{border-color:var(--v-200)}
.cobook-a.is-on{border-color:var(--v-600);background:var(--v-50)}
.cobook-a b{display:block;font-size:.86rem}
.cobook-a span{display:block;font-size:.78rem;color:var(--ink-3);overflow:hidden;
               text-overflow:ellipsis;white-space:nowrap}


.cosum-lines{list-style:none;display:grid;gap:.6rem;margin:0 0 1rem;padding:0 0 1rem;
             border-bottom:1px solid var(--line-2);max-height:280px;overflow-y:auto}
.cosum-line{display:grid;grid-template-columns:44px minmax(0,1fr) auto;align-items:center;gap:.6rem}
.cosum-img{position:relative;width:44px;height:34px}
.cosum-img img{width:100%;height:100%;object-fit:contain}
.cosum-q{position:absolute;top:-6px;right:-6px;min-width:18px;height:18px;padding:0 .25rem;
         display:grid;place-items:center;border-radius:var(--r-pill);background:var(--ink);
         color:#fff;font-size:.66rem;font-weight:640}
.cosum-t{font-size:.83rem;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cosum-p{font-size:.85rem;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.cosum-fine{margin:.7rem 0 0;font-size:.76rem;color:var(--ink-4);line-height:1.5}
.cosum-back{display:inline-flex;align-items:center;gap:.35rem;margin-top:.9rem;font-size:.83rem;
            color:var(--ink-3)}
.cosum-back svg{transform:scaleX(-1)}
.mono{font-family:var(--mono)}

@media (max-width:960px){.cartgrid,
.cogrid{grid-template-columns:1fr}.cartsum-card,
.cosum-card{position:static}
  /* [!] `order` n'agit que sur un ELEMENT DE GRILLE. La regle portait sur
     `.cosum-card`, enfant de `.cosum` : elle n'a jamais rien deplace, et le
     recapitulatif restait SOUS le formulaire sur telephone -- alors que son
     bouton « replier » (`.cosum-toggle`) n'existe que pour le haut de page.
     Une regle morte se lit exactement comme une regle vivante. */
  .cosum,.cartsum{order:-1}
}
@media (max-width:640px){
  /* [!] LA LIGNE PASSE EN DEUX RANGEES : la fiche en haut, les commandes en
     bas. Le total de ligne exige une piste `auto` -- il etait enferme dans une
     piste FIXE de 32 px pour « $1,234.56 », soit 79 px de texte, qui debordait
     par-dessus le titre et faisait defiler toute la page lateralement. Et la
     croix, chassee de la rangee 2, tombait seule sur une rangee 3. */
  .cline{grid-template-columns:64px minmax(0,1fr) auto auto;
         grid-template-areas:"img main main main" "qty qty sum sup";
         column-gap:.8rem;row-gap:.85rem;padding:.8rem}
  .cline-img{grid-area:img;width:64px;height:52px}
  .cline-main{grid-area:main}
  .cline-t{min-height:44px}
  .cline-qty{grid-area:qty;justify-self:start}
  .cline-sum{grid-area:sum;text-align:right;font-size:1rem}
  .cline-x{grid-area:sup;justify-self:end;width:44px;height:44px;font-size:1.5rem}
  .cartpage-back{min-height:44px}
  .cobook{grid-template-columns:1fr}
  .keeplink-box{flex-direction:column;align-items:stretch}
  .keeplink-box .btn{justify-content:center}
  .payamt-v{font-size:1.5rem}
  .paycopy{justify-content:center}
}
.cart-view{display:block;margin-top:.6rem;text-align:center;font-size:.85rem;color:var(--ink-3)}
.cart-view:hover{color:var(--v-700);text-decoration:underline}

/* ── Choix de la monnaie, dans le recapitulatif de caisse ────────────────── */
.paysel{position:relative;margin:.9rem 0 1rem}
.paysel-btn{display:flex;align-items:center;gap:.6rem;width:100%;padding:.65rem .75rem;
            border:1px solid var(--line);border-radius:var(--r);background:var(--paper);
            cursor:pointer;font-family:inherit;text-align:left;transition:border-color var(--dur)}
.paysel-btn:hover{border-color:var(--v-200)}
.paysel[data-open] .paysel-btn,.paysel-btn[aria-expanded="true"]{border-color:var(--v-600)}
.paysel-lab{font-size:.78rem;color:var(--ink-4);flex:none}
.paysel-cur{display:flex;align-items:center;gap:.4rem;flex:1;min-width:0}
.paysel-cur b{font-family:var(--mono);font-size:.88rem;font-weight:640}
.paysel-amt{margin-left:auto;font-family:var(--mono);font-size:.82rem;color:var(--ink-2);
            font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.paysel-btn > svg:last-child{color:var(--ink-4);flex:none}

.paysel-menu{position:absolute;left:0;right:0;top:calc(100% + 5px);z-index:30;list-style:none;
             margin:0;padding:.3rem;background:var(--paper);border:1px solid var(--line);
             border-radius:var(--r-lg);box-shadow:var(--sh-3);overflow-y:auto;
             /* [!] Assez haut pour que les SEPT monnaies tiennent sans defiler :
                un menu qui defile cache ses dernieres lignes derriere un geste
                que rien n'annonce. Le plafond en `vh` reste la pour les petits
                ecrans, ou defiler vaut mieux que deborder. */
             max-height:min(384px, 62vh)}
.paysel-item{display:flex;align-items:center;gap:.55rem;padding:.5rem .55rem;border-radius:var(--r);
             cursor:pointer;min-width:0}
.paysel-item:hover,.paysel-item:focus-visible{background:var(--v-50);outline:none}
.paysel-item.is-on{background:var(--v-50)}
.paysel-t{display:flex;flex-direction:column;line-height:1.2;min-width:0}
.paysel-t b{font-family:var(--mono);font-size:.84rem;font-weight:640}
.paysel-t small{font-size:.72rem;color:var(--ink-3)}
.paysel-v{margin-left:auto;font-family:var(--mono);font-size:.78rem;color:var(--ink-3);
          font-variant-numeric:tabular-nums;white-space:nowrap}
.paysel-tick{color:var(--v-600);opacity:0;flex:none}
.paysel-item.is-on .paysel-tick{opacity:1}

/* [!] La pastille de quantite est POSEE A L'INTERIEUR de la vignette. Debordant
   de quelques pixels, elle etait rognee par le conteneur defilant du
   recapitulatif — et une quantite coupee en deux est pire qu'une quantite
   absente : on lit « 2 » la ou il y a « 12 ». */
.cosum-q{top:2px;right:2px;box-shadow:0 0 0 2px var(--paper)}
.cosum-lines{padding-right:.2rem}

/* [!] La puce de reseau. Elle n'apparait QUE pour les jetons qui circulent sur
   plusieurs chaines (les deux Tether) : la coller a Bitcoin ajouterait du
   bruit la ou il n'y a aucune ambiguite. Envoyer de l'USDT ERC-20 sur une
   adresse TRC-20 perd les fonds — cette etiquette est la seule chose qui
   separe les deux entrees a l'ecran, puisque le logo est le meme. */
.cnet{display:inline-block;margin-left:.3rem;padding:.05rem .3rem;border-radius:999px;
      background:var(--v-50);border:1px solid var(--line);color:var(--ink-3);
      font-family:var(--mono);font-size:.62rem;font-weight:600;letter-spacing:.02em;
      vertical-align:middle;white-space:nowrap}
.paysel-cur .cnet{margin-left:.25rem}
.cnet[hidden]{display:none}

/* ══ Caisse en etapes ═══════════════════════════════════════════════════ */

/* Le fil des etapes. [!] Il ne sert PAS a naviguer en avant : le CSS le rend
   cliquable seulement sur les etapes deja franchies, et le JS refuse le reste.
   Un fil qui laisse sauter a « Shipping » sans pays affiche une liste vide. */
.costeps{display:flex;flex-wrap:wrap;gap:.35rem 1.1rem;list-style:none;margin:.7rem 0 0;padding:0}
.costeps-i{display:flex;align-items:center;gap:.4rem;color:var(--ink-4);font-size:.82rem}
.costeps-n{display:grid;place-items:center;width:20px;height:20px;border-radius:50%;
           border:1px solid var(--line);font-size:.7rem;font-weight:640;font-family:var(--mono)}
.costeps-i.is-done{color:var(--ink-2);cursor:pointer}
.costeps-i.is-done .costeps-n{background:var(--v-600);border-color:var(--v-600);color:#fff}
.costeps-i.is-on{color:var(--ink);font-weight:600}
.costeps-i.is-on .costeps-n{border-color:var(--v-600);color:var(--v-600)}

/* Une etape repliee ne garde que son titre et son resume. [!] On masque le
   CORPS, pas la section : ses champs doivent rester dans le formulaire pour
   partir a l'envoi — un `hidden` sur la section entiere n'empeche pas l'envoi,
   mais `display:none` sur un champ requis casse `focus()` et la validation. */
.costep{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--paper);
        padding:1.05rem 1.15rem;margin:0 0 .85rem}
.costep .costep-body,.costep .costep-go{display:none}
.costep.is-on{border-color:var(--v-200);box-shadow:var(--sh-1)}
.costep.is-on .costep-body,.costep.is-on .costep-go{display:block}
.costep.is-on .costep-body{margin-top:.95rem}
/* [!] « Change » n'apparait QUE sur une etape deja franchie. Sur une etape
   jamais atteinte il invite a modifier quelque chose qui n'existe pas encore,
   et il rend les quatre cartes identiques — on ne voit plus ou l'on en est. */
.costep-edit{display:none}
.costep.is-done .costep-edit{display:inline}
.costep .costep-note{margin:0 0 1rem}
.costep-h{display:flex;align-items:center;gap:.55rem;margin:0;font-size:1.02rem;font-weight:640}
.costep-n{display:grid;place-items:center;width:22px;height:22px;border-radius:50%;flex:none;
          background:var(--v-50);color:var(--v-600);font-family:var(--mono);font-size:.74rem;font-weight:640}
.costep.is-done .costep-n{background:var(--v-600);color:#fff}
.costep-edit{margin-left:auto;border:0;background:none;padding:0;cursor:pointer;
             color:var(--v-600);font:inherit;font-size:.82rem;text-decoration:underline}
.costep-done{margin:.5rem 0 0 2.05rem;color:var(--ink-3);font-size:.85rem;line-height:1.45}
.costep-go{margin-top:1rem;display:flex;flex-wrap:wrap;align-items:center;gap:.8rem}
.costep-go .btn{flex:none}
.comk{margin-top:.9rem}
.comk span small{display:block;color:var(--ink-3);font-size:.78rem;line-height:1.4}
.comk-body{margin:.8rem 0 0;padding:.9rem 1rem;border:1px solid var(--line);
           border-radius:var(--r);background:var(--v-50)}
.comk-body[hidden]{display:none}

/* ── Les methodes d'expedition ─────────────────────────────────────────── */
.coship-from{display:flex;gap:.45rem;align-items:flex-start;margin:0 0 .85rem;
             color:var(--ink-3);font-size:.85rem;line-height:1.45}
.coship{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;transition:opacity var(--dur)}
.coship.is-busy{opacity:.55}
.coship.is-bad{border-color:var(--bad,#c0392b)}
.coship-wait,.coship-blocked{margin:0;padding:1rem;color:var(--ink-3);font-size:.88rem}
.coship-blocked{color:var(--bad,#c0392b)}

/* [!] La ligne entiere est cliquable — c'est un <label> qui enveloppe la
   radio. Viser un bouton de 14 px au pouce est le defaut le plus courant des
   listes de livraison sur mobile. */
.coship-o{display:flex;align-items:center;gap:.7rem;padding:.85rem .9rem;cursor:pointer;
          border-top:1px solid var(--line);min-width:0}
.coship-o:first-child{border-top:0}
.coship-o:hover{background:var(--v-50)}
.coship-o.is-on{background:var(--v-50)}
.coship-o input{position:absolute;opacity:0;width:0;height:0}
.coship-dot{flex:none;width:17px;height:17px;border-radius:50%;border:1.5px solid var(--line);
            background:var(--paper);position:relative;transition:border-color var(--dur)}
.coship-o.is-on .coship-dot{border-color:var(--v-600);border-width:5px}
.coship-o input:focus-visible + .coship-dot{outline:2px solid var(--v-600);outline-offset:2px}
.coship-m{display:flex;flex-wrap:wrap;align-items:baseline;gap:.3rem .55rem;flex:1;min-width:0}
.coship-m b{font-size:.9rem;font-weight:620}
.coship-eta{color:var(--ink-3);font-size:.82rem}
.coship-m small{flex-basis:100%;color:var(--ink-4);font-size:.76rem;line-height:1.35}
.coship-p{flex:none;font-family:var(--mono);font-size:.88rem;font-weight:640;
          font-variant-numeric:tabular-nums;text-align:right}
.coship-p.is-free{color:var(--ok,#1f8a4c);text-transform:uppercase;letter-spacing:.03em;font-size:.8rem}
.coship-p s{display:block;color:var(--ink-4);font-weight:400;text-transform:none;letter-spacing:0;font-size:.74rem}
.coship-note{display:flex;gap:.45rem;align-items:flex-start;margin:.75rem 0 0;
             color:var(--ink-3);font-size:.8rem;line-height:1.45}
.coship-note svg{flex:none;margin-top:.1rem;color:#b8860b}
.coship-note[hidden]{display:none}


.cartsum-rows dd.is-soft{color:var(--ink-4);font-family:inherit;font-size:.8rem}
.cartsum-rows dd.is-free{color:var(--ok,#1f8a4c)}

/* [!] Dans le recapitulatif la colonne fait ~320 px : les six elements du
   bouton ne tiennent pas sur une ligne. L'etiquette passe AU-DESSUS, et le
   bouton ne garde que la monnaie et son montant. */
.paysel--sum{margin:.9rem 0 0}
.paysel--sum .paysel-btn{display:grid;grid-template-columns:1fr auto;align-items:center;
                         gap:.15rem .5rem;padding:.55rem .7rem}
.paysel--sum .paysel-lab{grid-column:1/-1;font-size:.74rem;letter-spacing:.02em}
.paysel--sum .paysel-amt{font-size:.86rem;color:var(--ink-1)}
.paysel--sum .paysel-menu{padding:.25rem}
.paysel--sum .paysel-item{padding:.45rem .45rem;gap:.45rem}
.paysel--sum .paysel-v{font-size:.74rem}

@media (max-width:640px){
  .costep{padding:.9rem .95rem}
  .costeps{gap:.3rem .7rem}
  .costeps-l{display:none}
  .costeps-i.is-on .costeps-l{display:inline}
  .costep-go{flex-direction:column;align-items:stretch}
  .costep-go .btn{width:100%}
  .costep-go .cosum-back{text-align:center}
  .coship-o{padding:.8rem .7rem;gap:.55rem}
  .coship-p{font-size:.84rem}
  /* [!] Le delai passe A LA LIGNE pour TOUTES les options, pas seulement
     celles dont le nom est long : sinon le rythme change d'une ligne a
     l'autre selon la longueur du transporteur, et la liste se lit comme mal
     alignee alors que rien n'est casse. */
  .coship-eta{flex-basis:100%}
}

/* Le service d'expedition, sur la page de commande. */
.acard-ship{display:flex;gap:.5rem;align-items:flex-start;margin:.85rem 0 0;padding:.65rem .7rem;
            border:1px solid var(--line);border-radius:var(--r);background:var(--v-50);
            font-size:.85rem;line-height:1.4}
.acard-ship svg{flex:none;margin-top:.1rem;color:var(--v-600)}
.acard-ship small{display:block;color:var(--ink-3);font-size:.78rem;margin-top:.1rem}
.odt-sub{display:block;color:var(--ink-4);font-size:.74rem;font-weight:400;line-height:1.3;margin-top:.05rem}

/* ══ Pages d'information (expedition, retours…) ═════════════════════════
   [!] Prefixe `doc-` : `.pcard` est deja la carte produit et `.page` est trop
   generique pour un fichier de cette taille. Un nom repris ailleurs habille
   silencieusement le mauvais composant. */
.doc-top{margin-bottom:1.6rem}
.doc-h{font-size:clamp(1.6rem,1.25rem + 1.5vw,2.2rem);letter-spacing:-.03em;margin:0}
.doc-lede{margin:.6rem 0 0;color:var(--ink-2);font-size:1.02rem;line-height:1.6}
.doc-body{display:grid;gap:1rem}
.doc-sec{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--paper);
         padding:clamp(1rem,.9rem + .7vw,1.4rem)}
.doc-sec-h{display:flex;align-items:center;gap:.55rem;margin:0 0 .7rem;font-size:1.08rem;font-weight:640}
.doc-sec-h svg{color:var(--v-600);flex:none}
.doc-sec p{margin:0 0 .6rem;color:var(--ink-2);line-height:1.65;font-size:.93rem}
.doc-sec p:last-child{margin-bottom:0}
.doc-muted{color:var(--ink-3)!important}
.doc-note{display:flex;gap:.5rem;align-items:flex-start;margin:.85rem 0 0!important;
          padding:.65rem .75rem;border:1px solid var(--line);border-radius:var(--r);
          background:var(--v-50);font-size:.86rem!important;line-height:1.5!important}
.doc-note svg{flex:none;margin-top:.15rem;color:var(--v-600)}
.doc-list{margin:.5rem 0 0;padding-left:1.1rem;color:var(--ink-2);font-size:.9rem;line-height:1.7}

/* [!] La table defile DANS SA BOITE. Sans ce conteneur, quatre colonnes de
   transporteurs font deborder la PAGE a 390 px — et c'est le document entier
   qui glisse lateralement, pas seulement le tableau. */
.doc-tw{overflow-x:auto;margin:.9rem 0 0;border:1px solid var(--line);border-radius:var(--r)}
.doc-tbl{width:100%;border-collapse:collapse;font-size:.88rem;min-width:520px}
.doc-tbl th{text-align:left;padding:.6rem .75rem;background:var(--v-50);color:var(--ink-3);
            font-size:.76rem;font-weight:640;text-transform:uppercase;letter-spacing:.04em;
            white-space:nowrap;border-bottom:1px solid var(--line)}
.doc-tbl td{padding:.65rem .75rem;border-bottom:1px solid var(--line-2);vertical-align:top}
.doc-tbl tr:last-child td{border-bottom:0}
.doc-tbl td small{display:block;color:var(--ink-4);font-size:.76rem;line-height:1.35;margin-top:.1rem}
.doc-tbl .is-free{color:var(--ok,#1f8a4c)}
.doc-tbl small.is-free{font-family:var(--sans,inherit);font-size:.72rem}

.shipq{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.7rem;margin:0 0 .3rem}
.shipq .fld{flex:1;min-width:min(260px,100%);margin:0}
.shipq-stop{display:flex;gap:.5rem;align-items:flex-start;margin:.9rem 0 0!important;
            padding:.7rem .8rem;border:1px solid var(--red);border-radius:var(--r);
            color:var(--red)!important;font-size:.88rem!important}
.shipq-stop svg{flex:none;margin-top:.1rem}

@media (max-width:640px){
  .shipq .btn{width:100%}
}

/* ── La caisse : une seule action, montree la ou l'oeil est ──────────────────
   [!] Le bouton d'action n'est plus dans l'etape. Sur grand ecran il vit dans
   le recapitulatif, colle en haut du defilement ; sur telephone dans une barre
   posee en bas de l'ecran. Les deux portent `data-cta` et declenchent la meme
   chose : ce n'est pas un doublon, c'est le meme geste place ou il tombe sous
   la main. Un seul des deux est visible a la fois. */
.cosum-hrow{display:flex;align-items:center;gap:.6rem;margin:0 0 1rem}
.cosum-hrow .cosum-h{margin:0}
.cosum-count{margin-left:auto;padding:.14rem .5rem;border-radius:999px;background:var(--v-50);
             color:var(--v-700,var(--v-600));font-size:.74rem;font-weight:600;white-space:nowrap}

.cosum-toggle{display:none;align-items:center;gap:.5rem;width:100%;padding:.15rem 0 .9rem;
              border:0;border-bottom:1px solid var(--line);background:none;cursor:pointer;
              font-family:inherit;font-size:.9rem;color:var(--ink-2);text-align:left}
.cosum-toggle-t{font-weight:600}
.cosum-toggle > svg:first-child{color:var(--v-600);flex:none}
.cosum-toggle > svg:nth-of-type(2){color:var(--ink-4);flex:none;transition:transform var(--dur)}
.cosum-toggle[aria-expanded="true"] > svg:nth-of-type(2){transform:rotate(180deg)}
.cosum-toggle-v{margin-left:auto;font-weight:700;font-variant-numeric:tabular-nums;color:var(--ink-1)}

/* Le franco : une barre qui avance, et qui se tait une fois le seuil passe. */
.cofree{margin:.2rem 0 .9rem}
.cofree-t{display:flex;align-items:center;gap:.4rem;margin:0 0 .4rem;font-size:.78rem;
          color:var(--ink-3)}
.cofree-t svg{color:var(--v-600);flex:none}
.cofree-bar{display:block;height:5px;border-radius:999px;background:var(--line-2,var(--line));
            overflow:hidden}
.cofree-bar i{display:block;width:0;height:100%;border-radius:999px;background:var(--v-600);
              transition:width var(--dur)}

.cosum-rate{display:flex;align-items:flex-start;gap:.4rem;margin:.7rem 0 0;font-size:.76rem;
            line-height:1.45;color:var(--ink-4)}
.cosum-rate svg{flex:none;margin-top:.15rem}

.cosum-cta{margin:1rem 0 0}
.cosum-cta .btn{justify-content:center;gap:.5rem}
.cta-ico{display:inline-flex;align-items:center}
.cta-ico[hidden]{display:none}

.cobar{display:none}

@media (max-width:960px){
  /* [!] `order:-1` etait pose sur la CARTE, seul enfant de l'aside : sans
     effet. C'est l'ASIDE qui est l'element de la grille — le recapitulatif
     tombait donc sous les quatre etapes, la ou personne ne verifie ce
     qu'il achete. */
  .cocheck .cosum{order:-1}
  .cosum-toggle{display:flex}
  .cosum-hrow{display:none}
  .cosum-fold{display:none}
  .cosum-fold.is-open{display:block;padding-top:1rem}
  .cosum-card{padding:1rem 1.1rem 1.1rem}
  .cosum-lines{margin-bottom:.9rem}
  /* L'action est dans la barre basse : la reprendre dans la carte donnerait
     deux boutons a l'ecran en meme temps. */
  .cosum-cta{display:none}
  .cocheck{padding-bottom:calc(5.4rem + env(safe-area-inset-bottom))}

  .cobar{display:flex;align-items:center;gap:.8rem;position:fixed;left:0;right:0;bottom:0;z-index:60;
         padding:.6rem .9rem calc(.6rem + env(safe-area-inset-bottom));background:var(--paper);
         border-top:1px solid var(--line);box-shadow:0 -6px 22px rgba(15,17,26,.09)}
  .cobar-sum{display:flex;flex-direction:column;line-height:1.15;min-width:0}
  .cobar-sum small{font-size:.7rem;color:var(--ink-4)}
  .cobar-sum b{font-size:1rem;font-variant-numeric:tabular-nums;white-space:nowrap}
  .cobar .btn{flex:1;justify-content:center;gap:.45rem;min-width:0}
  .cobar .btn [data-cta-lab]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
}

/* [!] Le menu de monnaie passe au-dessus de la barre basse (z-index 60) :
   sinon la barre lui mange ses dernieres lignes, sans une erreur. */
.paysel-menu{z-index:70}

/* ── Les champs de la caisse : plus serres, et plus jolis ────────────────────
   [!] Portee limitee a `.cocheck` : les memes classes servent au compte, a la
   connexion et au suivi de commande, ou l'air est le bienvenu. Ici chaque
   pixel gagne rapproche l'action du regard.
   Le champ est POSE (fond `--canvas`) et devient blanc au focus : le contour
   seul, sur du blanc, se lit mal et oblige a epaissir la bordure. */
.cocheck .fld{gap:.25rem}
.cocheck .fld-l{font-size:.79rem;font-weight:600;color:var(--ink-2)}
.cocheck .fld-opt{font-size:.7rem}
.cocheck .fld-in{font-size:.9rem;padding:.54rem .7rem;background:var(--canvas);
                 border-color:transparent;box-shadow:inset 0 0 0 1px var(--line)}
.cocheck .fld-in:hover{box-shadow:inset 0 0 0 1px var(--ink-4)}
.cocheck .fld-in:focus{background:var(--paper);border-color:transparent;
                       box-shadow:inset 0 0 0 1px var(--v-500),0 0 0 3px rgba(109,74,255,.14)}
.cocheck .fld-in.is-bad{box-shadow:inset 0 0 0 1px var(--red)}
.cocheck .fld-in.is-bad:focus{box-shadow:inset 0 0 0 1px var(--red),0 0 0 3px rgba(224,36,36,.13)}
.cocheck select.fld-in{background-position:right .65rem center}
.cocheck textarea.fld-in{min-height:58px}
.cocheck .fld-help{font-size:.73rem;line-height:1.4}
.cocheck .addrgrid,.cocheck .addrgrid-pair{gap:.6rem .7rem}
.cocheck .costep{padding:.85rem 1rem;margin:0 0 .6rem}
.cocheck .costep.is-on .costep-body{margin-top:.7rem}
.cocheck .costep-note{margin:0 0 .8rem;font-size:.82rem}
.cocheck .costep-go{margin-top:.85rem}
.cocheck .costep-save{margin-top:.75rem}

@media (max-width:640px){
  /* [!] 16 px minimum : sous ce seuil, iOS ZOOME sur le champ au focus et ne
     dezoome jamais — la page reste de travers jusqu'a la fin de la caisse. */
  .cocheck .fld-in{font-size:16px;padding:.6rem .7rem}
}

/* L'action reprise dans l'etape : elle passe DEVANT le lien de retour, et
   disparait sur telephone ou la barre basse la porte deja. */
.costep-go{display:flex;align-items:center;gap:1rem;flex-wrap:wrap}
/* Retour a GAUCHE, action a DROITE : le sens de lecture place le pas en
   arriere au depart de la ligne et le pas en avant a son terme. */
/* [!] `.costep.is-on .costep-go{display:block}` plus haut est PLUS SPECIFIQUE :
   un `display:flex` a un seul nom de classe ne le bat pas, et toutes les
   proprietes flex deviennent inertes — sans une erreur, sans un avertissement.
   On reprend donc la meme specificite. */
.costep.is-on .costep-go{display:flex;justify-content:space-between;align-items:center;
                         flex-wrap:wrap;gap:.8rem}
@media (max-width:960px){ .costep-cta{display:none} }

/* ── Le pays, ecrit plutot que deroule ───────────────────────────────────────
   [!] Le <select> natif reste dans la page (il est le champ poste, et le seul
   repli sans script) : il est masque SANS `display:none`, pour que le
   navigateur continue de l'envoyer, et retire du parcours au clavier. */
.cbx{position:relative}
.cbx-native{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
            clip-path:inset(50%);white-space:nowrap;border:0}
.cbx-in{cursor:text}
.cbx-menu{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:40;list-style:none;
          margin:0;padding:.25rem;background:var(--paper);border:1px solid var(--line);
          border-radius:var(--r-lg);box-shadow:var(--sh-3);max-height:min(300px,50vh);
          overflow-y:auto;overscroll-behavior:contain}
.cbx-o{padding:.42rem .55rem;border-radius:var(--r);font-size:.88rem;cursor:pointer;
       white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cbx-o:hover,.cbx-o.is-act{background:var(--v-50)}
.cbx-o.is-on{font-weight:640;color:var(--v-600)}
.cbx-none{padding:.5rem .55rem;font-size:.82rem;color:var(--ink-4)}

/* L'etat fautif rendu par le SERVEUR n'avait aucun style : seul le message
   apparaissait, et le champ en cause restait indistinguable des autres. */
.fld--bad .fld-in,.fld--bad .cbx-in{box-shadow:inset 0 0 0 1px var(--red)}

/* La vignette du transporteur, a gauche du service. Elle ne remplace pas le
   nom : elle le devance a l'oeil. */
/* [!] Les trois logos officiels n'ont PAS le meme rapport : le DHL est un
   bandeau (4,5:1), le bouclier UPS est plus haut que large (0,84:1). Une
   largeur et une hauteur imposees les deformeraient — un logo depose etire
   est pire que pas de logo. D'ou une BOITE fixe et `object-fit:contain` :
   chacun garde ses proportions, tous s'alignent. */
.coship-mark{flex:none;width:46px;height:26px;object-fit:contain;object-position:center;
             display:block}
@media (max-width:480px){ .coship-mark{width:38px;height:22px} }

/* La liste des destinations : plusieurs colonnes, sinon soixante lignes en
   file indienne donnent l'impression d'un catalogue interminable. */
.doc-cc{list-style:none;margin:.9rem 0 0;padding:0;columns:4 160px;column-gap:1.4rem;
        font-size:.86rem;color:var(--ink-2)}
.doc-cc li{break-inside:avoid;padding:.16rem 0}

/* ══ /help/shipping ═══════════════════════════════════════════════════════
   [!] Pleine largeur. L'ancienne version etait bloquee a 920 px : sur un
   ecran de 1440 px, deux tableaux de quatre colonnes flottaient au milieu
   d'un desert, et le bareme complet demandait de defiler trois ecrans. Ici
   le devis et le bareme sont des CARTES en grille : elles remplissent la
   largeur disponible et se rangent d'elles-memes en descendant. */
.shipdoc{padding-block:1.6rem 3.5rem;display:grid;gap:1.1rem}

/* ── Bandeau de tete ─────────────────────────────────────────────────── */
.shipdoc-hero{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);
              gap:1.6rem 2.4rem;align-items:center;padding:1.6rem 1.7rem;
              border:1px solid var(--line);border-radius:var(--r-lg);
              background:linear-gradient(180deg,var(--v-50),var(--paper) 70%)}
.shipdoc-kicker{display:flex;align-items:center;gap:.4rem;margin:0 0 .5rem;
                font-size:.75rem;font-weight:650;letter-spacing:.08em;text-transform:uppercase;
                color:var(--v-600)}
.shipdoc-kicker svg{flex:none}
.shipdoc-h{font-size:clamp(1.5rem,1.1rem + 1.6vw,2.3rem);letter-spacing:-.03em;line-height:1.15;
           margin:0;max-width:22ch}
.shipdoc-lede{margin:.7rem 0 0;color:var(--ink-2);font-size:1rem;line-height:1.6;max-width:60ch}

.shipdoc-stats{list-style:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
               gap:.7rem;margin:0;padding:0}
.shipdoc-stats li{display:flex;flex-direction:column;gap:.1rem;padding:.7rem .85rem;
                  background:var(--paper);border:1px solid var(--line);border-radius:var(--r)}
.shipdoc-stats b{font-size:1.35rem;letter-spacing:-.02em;font-variant-numeric:tabular-nums;
                 line-height:1.1}
.shipdoc-stats span{font-size:.75rem;color:var(--ink-4);line-height:1.3}

/* ── Le devis : formulaire a gauche, resultat a droite ───────────────── */
.shipdoc-quote{display:grid;grid-template-columns:minmax(0,340px) minmax(0,1fr);gap:1.4rem;
               align-items:start;padding:1.3rem 1.4rem;border:1px solid var(--line);
               border-radius:var(--r-lg);background:var(--paper)}
.shipdoc-h2{display:flex;align-items:center;gap:.55rem;margin:0 0 .9rem;font-size:1.1rem;
            font-weight:660;letter-spacing:-.01em}
.shipdoc-h2 svg{color:var(--v-600);flex:none}
.shipdoc-h3{display:flex;align-items:center;gap:.5rem;margin:0 0 .6rem;font-size:1rem;
            font-weight:650}
.shipdoc-h3 svg{color:var(--v-600);flex:none}

.shipdoc-geo{display:flex;align-items:center;gap:.35rem;margin:.6rem 0 0;font-size:.78rem;
             color:var(--ink-4)}
.shipdoc-geo svg{color:var(--v-600);flex:none}
.shipdoc-free{display:flex;gap:.5rem;align-items:flex-start;margin:1rem 0 0;padding:.8rem .85rem;
              background:var(--canvas);border-radius:var(--r);font-size:.83rem;line-height:1.55;
              color:var(--ink-2)}
.shipdoc-free svg{flex:none;margin-top:.15rem;color:var(--v-600)}

.shipdoc-to{display:flex;align-items:center;gap:.4rem;margin:0 0 .7rem;font-size:.85rem;
            color:var(--ink-3)}
.shipdoc-to svg{color:var(--v-600);flex:none}
.shipdoc-to b{color:var(--ink)}

.shipdoc-opts{list-style:none;margin:0;padding:0;border:1px solid var(--line);
              border-radius:var(--r-lg);overflow:hidden}
.shipdoc-opt{display:grid;grid-template-columns:46px minmax(0,1fr) auto auto;align-items:center;
             gap:.9rem;padding:.8rem .9rem;border-top:1px solid var(--line-2)}
.shipdoc-opt:first-child{border-top:0;background:var(--v-50)}
.shipdoc-opt-m{display:flex;flex-direction:column;min-width:0}
.shipdoc-opt-m b{font-size:.92rem;font-weight:640}
.shipdoc-opt-m small{font-size:.77rem;color:var(--ink-4);line-height:1.4}
.shipdoc-opt-e{font-size:.82rem;color:var(--ink-3);white-space:nowrap}
.shipdoc-opt-p{text-align:right;font-family:var(--mono);font-size:.92rem;font-weight:620;
               font-variant-numeric:tabular-nums;white-space:nowrap;display:flex;
               flex-direction:column;align-items:flex-end}
.shipdoc-opt-p em{font-family:var(--sans,inherit);font-style:normal;font-size:.71rem;
                  font-weight:600;color:var(--ok,#1f8a4c)}

.shipdoc-note{display:flex;gap:.5rem;align-items:flex-start;margin:.85rem 0 0;padding:.7rem .8rem;
              border-radius:var(--r);font-size:.82rem;line-height:1.5}
.shipdoc-note svg{flex:none;margin-top:.15rem}
.shipdoc-note.is-warn{background:#fdf6e3;color:#6b5300}
.shipdoc-note.is-warn svg{color:#b8860b}
.shipdoc-note.is-ok{background:#eef8f1;color:#1b6b3d}
.shipdoc-note.is-ok svg{color:var(--ok,#1f8a4c)}

.shipdoc-empty{display:flex;gap:.7rem;align-items:center;margin:0;padding:2.4rem 1.4rem;
               border:1px dashed var(--line);border-radius:var(--r-lg);color:var(--ink-4);
               font-size:.9rem;line-height:1.6;background:var(--canvas)}
.shipdoc-empty svg{flex:none;color:var(--line)}

/* ── Le bareme, une carte par zone ───────────────────────────────────── */
.shipdoc-sec{padding:1.3rem 1.4rem;border:1px solid var(--line);border-radius:var(--r-lg);
             background:var(--paper)}
.shipdoc-sec-h p{margin:-.4rem 0 0;color:var(--ink-3);font-size:.88rem;line-height:1.6;
                 max-width:78ch}
.shipdoc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));
              gap:.9rem;margin-top:1.1rem}
.shipdoc-zone{display:flex;flex-direction:column;padding:.95rem 1rem;border:1px solid var(--line);
              border-radius:var(--r-lg);background:var(--canvas)}
.shipdoc-zone-h h3{margin:0;font-size:.98rem;font-weight:650;letter-spacing:-.01em}
.shipdoc-zone-how{margin:.15rem 0 0;font-size:.74rem;color:var(--ink-4);
                  letter-spacing:.02em;text-transform:uppercase;font-weight:600}
.shipdoc-svcs{list-style:none;margin:.8rem 0 0;padding:0;display:grid;gap:.5rem}
.shipdoc-svcs li{display:grid;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;
                 gap:.65rem;padding:.5rem .55rem;background:var(--paper);
                 border:1px solid var(--line);border-radius:var(--r)}
.shipdoc-svc-m{display:flex;flex-direction:column;min-width:0}
.shipdoc-svc-m b{font-size:.84rem;font-weight:620;line-height:1.25}
.shipdoc-svc-m small{font-size:.73rem;color:var(--ink-4)}
.shipdoc-svc-p{text-align:right;font-family:var(--mono);font-size:.83rem;font-weight:620;
               font-variant-numeric:tabular-nums;white-space:nowrap;display:flex;
               flex-direction:column;align-items:flex-end}
.shipdoc-svc-p em{font-family:var(--sans,inherit);font-style:normal;font-size:.66rem;
                  font-weight:600;color:var(--ok,#1f8a4c);letter-spacing:.01em}
.shipdoc-zone-cc{margin:.75rem 0 0;padding-top:.7rem;border-top:1px solid var(--line);
                 font-size:.76rem;line-height:1.6;color:var(--ink-4)}
.shipdoc-zone-cu{display:flex;align-items:center;gap:.3rem;margin:.5rem 0 0;font-size:.72rem;
                 color:#8a6d00}
.shipdoc-zone-cu svg{flex:none;color:#b8860b}

/* ── Trois cartes cote a cote ────────────────────────────────────────── */
.shipdoc-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1.1rem}
.shipdoc-card{padding:1.2rem 1.3rem;border:1px solid var(--line);border-radius:var(--r-lg);
              background:var(--paper)}
.shipdoc-card p{margin:0 0 .6rem;color:var(--ink-2);font-size:.88rem;line-height:1.65}
.shipdoc-card p:last-child{margin-bottom:0}
.shipdoc-list{margin:.6rem 0 0;padding-left:1.05rem;color:var(--ink-3);font-size:.82rem;
              line-height:1.7}
.shipdoc-list b{color:var(--ink-2)}

/* ── Les destinations ────────────────────────────────────────────────── */
.shipdoc-cc{list-style:none;margin:1.1rem 0 0;padding:0;
            display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.15rem .9rem}
.shipdoc-cc li{padding:.22rem .4rem;border-radius:var(--r);font-size:.83rem;color:var(--ink-2)}
/* Le pays qu'on vient de consulter est retrouve d'un coup d'oeil. */
.shipdoc-cc li.is-on{background:var(--v-50);color:var(--v-600);font-weight:640}

@media (max-width:1080px){
  .shipdoc-hero{grid-template-columns:1fr}
  .shipdoc-quote{grid-template-columns:1fr}
}
@media (max-width:640px){
  .shipdoc-hero,.shipdoc-quote,.shipdoc-sec,.shipdoc-card{padding:1rem 1.05rem}
  .shipdoc-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* [!] Quatre colonnes ne tiennent pas en 390 px : le prix passe sous le nom
     plutot que d'ecraser les deux. */
  .shipdoc-opt{grid-template-columns:46px minmax(0,1fr);gap:.5rem .8rem}
  .shipdoc-opt-e,.shipdoc-opt-p{grid-column:2;text-align:left;align-items:flex-start}
  .shipdoc-opt-p{flex-direction:row;align-items:baseline;gap:.5rem}
}

/* ══ /orders/track ════════════════════════════════════════════════════════
   La page est faite pour DEUX visiteurs opposes : celui qui a son lien sous la
   main et veut le coller en trois secondes, et celui qui l'a perdu et a besoin
   qu'on lui dise ou chercher. D'ou deux colonnes cote a cote plutot qu'une
   suite d'ecrans : la reponse a « ou est mon lien ? » est visible pendant que
   l'on remplit le champ, pas deux defilements plus bas. */
.trackpage{padding-block:1.6rem 3.5rem;display:grid;gap:1.1rem}

.trk-hero{padding:1.5rem 1.7rem;border:1px solid var(--line);border-radius:var(--r-lg);
          background:linear-gradient(180deg,var(--v-50),var(--paper) 75%)}
.trk-kicker{display:flex;align-items:center;gap:.4rem;margin:0 0 .5rem;font-size:.75rem;
            font-weight:650;letter-spacing:.08em;text-transform:uppercase;color:var(--v-600)}
.trk-kicker svg{flex:none}
.trk-h{font-size:clamp(1.5rem,1.1rem + 1.6vw,2.2rem);letter-spacing:-.03em;margin:0;line-height:1.15}
.trk-lede{margin:.6rem 0 0;color:var(--ink-2);font-size:1rem;line-height:1.6;max-width:70ch}

.trk-sec,.trk-find{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--paper)}
.trk-sec{padding:1.2rem 1.35rem}
.trk-sec-h{display:flex;align-items:baseline;gap:1rem;flex-wrap:wrap;margin-bottom:.9rem}
.trk-h2{display:flex;align-items:center;gap:.55rem;margin:0;font-size:1.08rem;font-weight:660;
        letter-spacing:-.01em}
.trk-h2 svg,.trk-h3 svg{color:var(--v-600);flex:none}
.trk-h3{display:flex;align-items:center;gap:.5rem;margin:0 0 .8rem;font-size:.98rem;font-weight:650}
.trk-all{margin-left:auto;display:inline-flex;align-items:center;gap:.25rem;font-size:.83rem;
         color:var(--v-600);font-weight:600}

/* ── Les commandes du compte ─────────────────────────────────────────── */
.trk-list{list-style:none;margin:0;padding:0;border:1px solid var(--line);
          border-radius:var(--r-lg);overflow:hidden}
.trk-row{display:grid;grid-template-columns:minmax(0,auto) minmax(0,1fr) auto auto 16px;
         align-items:center;gap:.9rem;padding:.75rem .9rem;border-top:1px solid var(--line-2);
         color:inherit;transition:background var(--dur)}
.trk-list li:first-child .trk-row{border-top:0}
.trk-row:hover{background:var(--v-50)}
.trk-row-r{font-family:var(--mono);font-size:.88rem;font-weight:640;white-space:nowrap}
.trk-row-d{font-size:.82rem;color:var(--ink-4);white-space:nowrap}
.trk-row-t{font-family:var(--mono);font-size:.86rem;font-variant-numeric:tabular-nums;
           white-space:nowrap}
.trk-row-go{color:var(--ink-4);display:flex}

/* ── Le champ et l'aide, cote a cote ─────────────────────────────────── */
.trk-find{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:1.6rem;
          padding:1.3rem 1.4rem}
.trk-form{margin-top:.2rem;display:grid;gap:.9rem;justify-items:start}
/* [!] Le champ recoit une URL longue : en `var(--mono)` et sans coupure, on
   voit d'un coup d'oeil si le `?t=` a survecu au copier-coller. */
.trk-in{font-family:var(--mono);font-size:.86rem}
.trk-form .fld{width:100%}
.trk-form .fld-help code{font-family:var(--mono);font-size:.76rem;background:var(--canvas);
                         padding:.05rem .25rem;border-radius:4px}
.trk-form .btn{gap:.45rem}

.trk-signin{display:flex;gap:.5rem;align-items:flex-start;margin:1.1rem 0 0;padding:.8rem .85rem;
            background:var(--canvas);border-radius:var(--r);font-size:.84rem;line-height:1.55;
            color:var(--ink-2)}
.trk-signin svg{flex:none;margin-top:.15rem;color:var(--v-600)}
.trk-signin a{color:var(--v-600);font-weight:600}

.trk-find-r{padding:1.1rem 1.2rem;background:var(--canvas);border-radius:var(--r-lg);
            align-self:start}
.trk-steps{list-style:none;counter-reset:s;margin:0;padding:0;display:grid;gap:.7rem}
.trk-steps li{counter-increment:s;position:relative;padding-left:1.9rem;font-size:.85rem;
              line-height:1.55;color:var(--ink-2)}
.trk-steps li::before{content:counter(s);position:absolute;left:0;top:.05rem;width:1.3rem;
                      height:1.3rem;display:grid;place-items:center;border-radius:50%;
                      background:var(--v-600);color:#fff;font-size:.72rem;font-weight:700}
.trk-steps code{font-family:var(--mono);font-size:.78rem;background:var(--paper);
                padding:.05rem .28rem;border-radius:4px;border:1px solid var(--line)}
.trk-nomail{display:flex;gap:.5rem;align-items:flex-start;margin:1rem 0 0;padding-top:.9rem;
            border-top:1px solid var(--line);font-size:.8rem;line-height:1.55;color:var(--ink-3)}
.trk-nomail svg{flex:none;margin-top:.15rem;color:var(--v-600)}
.trk-nomail + .trk-nomail{margin-top:.7rem;padding-top:.7rem}

/* ── Le glossaire des etats ──────────────────────────────────────────── */
.trk-stats{list-style:none;margin:0;padding:0;
           display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:.8rem}
.trk-stat{padding:.85rem .95rem;border:1px solid var(--line);border-radius:var(--r-lg);
          background:var(--canvas);border-left:3px solid var(--line)}
.trk-stat p{margin:.5rem 0 0;font-size:.82rem;line-height:1.55;color:var(--ink-3)}
/* La barre de gauche reprend la couleur de la pastille : on relie l'etat lu
   sur sa commande a son explication sans avoir a lire les deux libelles. */
.trk-stat--wait{border-left-color:var(--v-600)}
.trk-stat--warn{border-left-color:#b8860b}
.trk-stat--ok{border-left-color:var(--ok,#1f8a4c)}
.trk-stat--done{border-left-color:var(--ok,#1f8a4c)}
.trk-stat--off{border-left-color:var(--ink-4)}

@media (max-width:900px){
  .trk-find{grid-template-columns:1fr;gap:1.2rem}
}
@media (max-width:640px){
  .trk-hero,.trk-sec,.trk-find{padding:1rem 1.05rem}
  /* Cinq colonnes ne tiennent pas en 390 px : la date et le total passent
     sous la reference plutot que d'ecraser la pastille d'etat. */
  .trk-row{grid-template-columns:minmax(0,1fr) auto;gap:.35rem .7rem;padding:.8rem .8rem}
  .trk-row-d{grid-row:2;grid-column:1}
  .trk-row-t{grid-row:2;grid-column:2;text-align:right}
  .trk-row-go{display:none}
  .trk-form .btn{width:100%;justify-content:center}
}

/* ══ Les cinq pages « Paying in crypto » ══════════════════════════════════
   Un seul gabarit pour les cinq : bandeau + reperes chiffres, sections en
   pleine largeur, cartes a deux colonnes, questions en grille. Ce sont des
   pages qu'on lit en diagonale, souvent inquiet — d'ou les reperes en haut et
   les questions en bas, jamais un mur de paragraphes. */
.paydoc{padding-block:1.2rem 3.5rem;display:grid;gap:1.1rem}

/* La navigation transversale : les cinq pages sont une famille. */
.paynav{display:flex;flex-wrap:wrap;gap:.4rem;padding:.35rem;background:var(--canvas);
        border:1px solid var(--line);border-radius:999px;width:max-content;max-width:100%}
.paynav-i{display:inline-flex;align-items:center;gap:.4rem;padding:.45rem .85rem;border-radius:999px;
          font-size:.84rem;font-weight:560;color:var(--ink-3);white-space:nowrap;
          transition:background var(--dur),color var(--dur)}
.paynav-i svg{flex:none;opacity:.75}
.paynav-i:hover{background:var(--paper);color:var(--ink)}
.paynav-i.is-on{background:var(--v-600);color:#fff;font-weight:640}
.paynav-i.is-on svg{opacity:1}

.paydoc-hero{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);
             gap:1.6rem 2.4rem;align-items:center;padding:1.6rem 1.7rem;
             border:1px solid var(--line);border-radius:var(--r-lg);
             background:linear-gradient(180deg,var(--v-50),var(--paper) 70%)}
.paydoc-kicker{display:flex;align-items:center;gap:.4rem;margin:0 0 .5rem;font-size:.75rem;
               font-weight:650;letter-spacing:.08em;text-transform:uppercase;color:var(--v-600)}
.paydoc-kicker svg{flex:none}
.paydoc-h{font-size:clamp(1.5rem,1.1rem + 1.6vw,2.25rem);letter-spacing:-.03em;line-height:1.15;
          margin:0;max-width:22ch}
.paydoc-lede{margin:.7rem 0 0;color:var(--ink-2);font-size:1rem;line-height:1.6;max-width:62ch}
.paydoc-stats{list-style:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
              gap:.7rem;margin:0;padding:0}
.paydoc-stats li{display:flex;flex-direction:column;gap:.1rem;padding:.7rem .85rem;
                 background:var(--paper);border:1px solid var(--line);border-radius:var(--r)}
.paydoc-stats b{font-size:1.3rem;letter-spacing:-.02em;line-height:1.1;
                font-variant-numeric:tabular-nums}
.paydoc-stats span{font-size:.74rem;color:var(--ink-4);line-height:1.3}

.paydoc-sec{padding:1.3rem 1.4rem;border:1px solid var(--line);border-radius:var(--r-lg);
            background:var(--paper)}
.paydoc-two{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:1.1rem}
.paydoc-card{padding:1.2rem 1.3rem;border:1px solid var(--line);border-radius:var(--r-lg);
             background:var(--paper)}
.paydoc-h2{display:flex;align-items:center;gap:.55rem;margin:0 0 .9rem;font-size:1.1rem;
           font-weight:660;letter-spacing:-.01em}
.paydoc-h3{display:flex;align-items:center;gap:.5rem;margin:0 0 .7rem;font-size:1rem;font-weight:650}
.paydoc-h2 svg,.paydoc-h3 svg{color:var(--v-600);flex:none}
.paydoc-card p,.paydoc-p{margin:0 0 .7rem;color:var(--ink-2);font-size:.9rem;line-height:1.65}
.paydoc-card p:last-child{margin-bottom:0}
.paydoc-fine{display:flex;align-items:center;gap:.35rem;margin:.8rem 0 0!important;
             font-size:.76rem;color:var(--ink-4)}
.paydoc-fine svg{flex:none}
.paydoc code{font-family:var(--mono);font-size:.82em;background:var(--canvas);
             padding:.06rem .3rem;border-radius:4px}
.paydoc a{color:var(--v-600);font-weight:560}
.paydoc-card a,.paydoc-sec a{text-decoration:underline;text-underline-offset:2px}

/* ── Les etapes numerotees ───────────────────────────────────────────── */
.paysteps{list-style:none;counter-reset:p;margin:0;padding:0;
          display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:.9rem}
.paysteps li{counter-increment:p;position:relative;padding:.9rem 1rem .9rem 2.9rem;
             background:var(--canvas);border:1px solid var(--line);border-radius:var(--r-lg)}
.paysteps li::before{content:counter(p);position:absolute;left:.95rem;top:.95rem;
                     display:grid;place-items:center;width:1.5rem;height:1.5rem;
                     border-radius:50%;background:var(--v-600);color:#fff;font-size:.76rem;
                     font-weight:700}
.paysteps h3{margin:0 0 .25rem;font-size:.93rem;font-weight:650;
             /* Le titre s'aligne sur la pastille, pas au-dessus d'elle. */
             min-height:1.5rem;display:flex;align-items:center}
.paysteps p{margin:0;font-size:.85rem;line-height:1.6;color:var(--ink-3)}

/* ── Listes a puces denses ───────────────────────────────────────────── */
.paylist{list-style:none;margin:0 0 .8rem;padding:0;display:grid;gap:.5rem}
.paylist li{position:relative;padding-left:1.1rem;font-size:.87rem;line-height:1.6;
            color:var(--ink-2)}
.paylist li::before{content:"";position:absolute;left:.15rem;top:.62em;width:5px;height:5px;
                    border-radius:50%;background:var(--v-600)}

/* ── Encadres ────────────────────────────────────────────────────────── */
.paynote{display:flex;gap:.55rem;align-items:flex-start;margin:1rem 0 0!important;
         padding:.8rem .9rem;border-radius:var(--r);font-size:.85rem;line-height:1.6}
.paynote svg{flex:none;margin-top:.2rem}
.paynote.is-warn{background:#fdf6e3;color:#6b5300}
.paynote.is-warn svg{color:#b8860b}
.paynote.is-ok{background:#eef8f1;color:#1b6b3d}
.paynote.is-ok svg{color:var(--ok,#1f8a4c)}
.paynote a{color:inherit;font-weight:700}

/* ── Les monnaies ────────────────────────────────────────────────────── */
.paycoins{list-style:none;margin:0;padding:0;
          display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:.7rem}
.paycoin{display:grid;grid-template-columns:30px minmax(0,1fr) auto;align-items:center;
         gap:.7rem .75rem;padding:.7rem .8rem;border:1px solid var(--line);
         border-radius:var(--r-lg);background:var(--canvas)}
.paycoin-t{display:flex;flex-direction:column;min-width:0}
.paycoin-t b{font-family:var(--mono);font-size:.9rem;font-weight:650}
.paycoin-t small{font-size:.74rem;color:var(--ink-4);line-height:1.35}
.paycoin-s{grid-column:2;display:flex;align-items:center;gap:.3rem;font-size:.74rem;
           color:var(--ink-4);white-space:nowrap}
.paycoin-s svg{flex:none}
.paycoin-d{grid-row:1;grid-column:3;font-family:var(--mono);font-size:.72rem;color:var(--ink-4);
           white-space:nowrap}

/* ── Les questions ───────────────────────────────────────────────────── */
.payfaq{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:.9rem;margin:0}
.payfaq > div{padding:.95rem 1rem;background:var(--canvas);border:1px solid var(--line);
              border-radius:var(--r-lg)}
.payfaq dt{margin:0 0 .35rem;font-size:.9rem;font-weight:650}
.payfaq dd{margin:0;font-size:.85rem;line-height:1.65;color:var(--ink-3)}

@media (max-width:1080px){
  .paydoc-hero{grid-template-columns:1fr}
}
@media (max-width:640px){
  .paydoc-hero,.paydoc-sec,.paydoc-card{padding:1rem 1.05rem}
  /* La navigation devient une bande qui defile plutot qu'un pave de cinq
     lignes : elle est un repere, pas le contenu de la page. */
  .paynav{flex-wrap:nowrap;overflow-x:auto;width:100%;border-radius:var(--r-lg);
          scrollbar-width:none}
  .paynav::-webkit-scrollbar{display:none}
}

/* ══ Les pages legales ════════════════════════════════════════════════════
   [!] Un texte juridique se PARCOURT, il ne se lit pas : on y cherche une
   clause precise, souvent apres un probleme. D'ou un sommaire colle en haut du
   defilement, des clauses numerotees et des ancres stables — une clause qu'on
   ne peut pas citer par son lien est une clause qu'on ne peut pas discuter. */
.legal-grid{display:grid;grid-template-columns:minmax(0,240px) minmax(0,1fr);gap:1.6rem 2.2rem;
            align-items:start}
.legal-toc{position:sticky;top:9.5rem;padding:1rem 1.1rem;background:var(--canvas);
           border:1px solid var(--line);border-radius:var(--r-lg)}
.legal-toc-h{margin:0 0 .6rem;font-size:.72rem;font-weight:660;letter-spacing:.08em;
             text-transform:uppercase;color:var(--ink-4)}
.legal-toc ol{list-style:none;margin:0;padding:0;display:grid;gap:.1rem;counter-reset:none}
.legal-toc a{display:block;padding:.32rem .45rem;border-radius:var(--r);font-size:.82rem;
             line-height:1.4;color:var(--ink-3);transition:background var(--dur),color var(--dur)}
.legal-toc a:hover{background:var(--paper);color:var(--v-600)}

.legal-body{display:grid;gap:1.1rem;min-width:0}
.legal-intro{margin:0;padding:.9rem 1rem;background:var(--v-50);border-radius:var(--r-lg);
             font-size:.88rem;line-height:1.65;color:var(--ink-2)}
.legal-sec{padding:1.2rem 1.35rem;border:1px solid var(--line);border-radius:var(--r-lg);
           background:var(--paper);scroll-margin-top:9.5rem}
.legal-sec h2{display:flex;align-items:center;gap:.6rem;margin:0 0 .8rem;font-size:1.05rem;
              font-weight:660;letter-spacing:-.01em}
.legal-n{display:grid;place-items:center;flex:none;width:1.6rem;height:1.6rem;border-radius:50%;
         background:var(--v-600);color:#fff;font-size:.78rem;font-weight:700}
.legal-sec p{margin:0 0 .7rem;color:var(--ink-2);font-size:.89rem;line-height:1.7}
.legal-sec p:last-child{margin-bottom:0}
.legal-sec .paylist{margin-bottom:0}
.legal-sec .doc-tw{margin-top:0}

/* Les paires « champ / valeur » des mentions legales. */
.legal-dl{display:grid;grid-template-columns:minmax(0,180px) minmax(0,1fr);gap:.45rem 1rem;
          margin:0 0 .8rem}
.legal-dl dt{font-size:.82rem;color:var(--ink-4);line-height:1.55}
.legal-dl dd{margin:0;font-size:.89rem;line-height:1.55;color:var(--ink)}
.legal-dl dd small{display:block;font-size:.75rem;color:var(--ink-4);margin-top:.1rem}
.legal-dl code{font-family:var(--mono);font-size:.84em}

@media (max-width:900px){
  /* Le sommaire passe AU-DESSUS et cesse de coller : colle sur un telephone,
     il mangerait un tiers de l'ecran a chaque defilement. */
  .legal-grid{grid-template-columns:1fr}
  .legal-toc{position:static}
  .legal-toc ol{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));display:grid}
}
@media (max-width:640px){
  .legal-sec{padding:1rem 1.05rem}
  .legal-dl{grid-template-columns:1fr;gap:.15rem}
  .legal-dl dt{margin-top:.5rem}
}

/* ══ La page de commande ══════════════════════════════════════════════════
   [!] C'est le seul ecran ou quelqu'un engage de l'argent, et il le fait en
   SORTANT du site. Ce qu'on copie — le montant, l'adresse — et le QR sont donc
   sur la MEME RANGEE : le QR occupait auparavant une bande a lui seul, ce qui
   faisait un couloir vide sur grand ecran et plus de quatre mille pixels de
   haut sur telephone. */
.orderpage{padding-block:1.4rem 3rem;display:grid;gap:1rem}
.orderpage.is-paying{padding-bottom:0}

/* ── En-tete : tout sur une ligne ────────────────────────────────────── */
.orderpage .ohead{display:flex;align-items:baseline;flex-wrap:wrap;gap:.3rem 1rem;
       padding-bottom:.9rem;border-bottom:1px solid var(--line)}
.orderpage .ohead-l{display:flex;align-items:baseline;gap:.65rem;min-width:0}
.orderpage .ohead-k{display:inline-flex;align-items:center;gap:.3rem;margin:0;font-size:.7rem;font-weight:650;
         letter-spacing:.09em;text-transform:uppercase;color:var(--ink-4)}
.orderpage .ohead-k svg{flex:none}
.orderpage .ohead-h{margin:0;font-family:var(--mono);font-size:clamp(1.25rem,1rem + 1vw,1.7rem);
         letter-spacing:-.01em;font-weight:680}
.orderpage .ohead-d{margin:0;font-size:.8rem;color:var(--ink-4)}
.orderpage .ohead-s{margin-left:auto}

.orderpage .onote{display:flex;gap:.5rem;align-items:flex-start;margin:0;padding:.75rem .9rem;
       border-radius:var(--r);font-size:.85rem;line-height:1.55}
.orderpage .onote svg{flex:none;margin-top:.15rem}
.orderpage .onote.is-ok{background:#eef8f1;color:#1b6b3d}
.orderpage .onote.is-ok svg{color:var(--ok,#1f8a4c)}
.orderpage .onote.is-warn{background:#fdf6e3;color:#6b5300;margin-top:.7rem}
.orderpage .onote.is-warn svg{color:#b8860b}
.orderpage .onote a{color:inherit;font-weight:700;text-decoration:underline}

/* ── La carte de paiement ────────────────────────────────────────────── */
.orderpage .paynow{border:1px solid var(--v-200);border-radius:var(--r-lg);background:var(--paper);
        box-shadow:var(--sh-1);overflow:hidden}
.orderpage .paynow-top{display:flex;align-items:center;gap:.8rem;flex-wrap:wrap;
            padding:1rem 1.2rem .85rem}
.orderpage .paynow-h{display:flex;align-items:center;gap:.55rem;margin:0;font-size:1.05rem;font-weight:660}
.orderpage .paynow-h svg{color:var(--v-600);flex:none}
.orderpage .paynow-clock{display:inline-flex;align-items:center;gap:.4rem;margin:0 0 0 auto;padding:.3rem .7rem;
              border-radius:999px;background:var(--v-50);color:var(--v-600);font-size:.82rem}
.orderpage .paynow-clock b{font-family:var(--mono);font-size:.95rem;font-variant-numeric:tabular-nums}
.orderpage .paynow-clock span{color:var(--ink-4)}
.orderpage .paynow-clock svg{flex:none}
/* Sous cinq minutes, l'horloge change de ton : « bientot » doit se voir sans
   qu'on ait a lire le chiffre. */
.orderpage .paynow-clock.is-soon{background:#fdf1e3;color:#a1560c}
.orderpage .paynow-clock.is-soon span{color:#a1560c;opacity:.75}
.orderpage .paynow-clock.is-out{background:#fdeaea;color:var(--red)}

.orderpage .paynow-bar{display:block;height:3px;background:var(--line-2,var(--line))}
.orderpage .paynow-bar i{display:block;width:100%;height:100%;background:var(--v-600);
              transition:width 1s linear}
.orderpage .paynow-bar i.is-soon{background:#d98324}

.orderpage .paynow-grid{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:1.2rem 1.8rem;
             padding:1.1rem 1.2rem}
.orderpage .paynow-l{display:grid;gap:1rem;min-width:0}

.payfield{min-width:0}
.payfield-l{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin:0 0 .4rem;
            font-size:.78rem;font-weight:600;color:var(--ink-4)}
.paynet{display:inline-flex;align-items:center;gap:.25rem;padding:.1rem .45rem;border-radius:999px;
        background:#fdf6e3;color:#8a6d00;font-size:.72rem;font-weight:700;letter-spacing:.01em}
.paynet svg{flex:none;color:#b8860b}

.payfield-v{display:flex;align-items:center;gap:.7rem;padding:.75rem .85rem;
            background:var(--canvas);border:1px solid var(--line);border-radius:var(--r-lg);
            min-width:0}
.payamt{font-family:var(--mono);font-size:clamp(1.3rem,1rem + 1.4vw,1.85rem);font-weight:700;
        letter-spacing:-.02em;line-height:1.1;word-break:break-all;min-width:0}
.payamt-c{display:inline-flex;align-items:center;gap:.35rem;flex:none;color:var(--ink-3)}
.payamt-c b{font-family:var(--mono);font-size:.9rem;font-weight:640}
/* [!] L'adresse se coupe N'IMPORTE OU : une adresse tronquee par un « … » est
   inutilisable, et une adresse qui deborde de son cadre est pire. */
.payfield-v--addr code{flex:1;min-width:0;font-family:var(--mono);font-size:.84rem;
                       line-height:1.5;word-break:break-all;user-select:all}
.payfield-h{display:flex;align-items:flex-start;gap:.35rem;margin:.45rem 0 0;font-size:.76rem;
            line-height:1.5;color:var(--ink-4)}
.payfield-h svg{flex:none;margin-top:.15rem}

.paycopy{display:inline-flex;align-items:center;gap:.35rem;flex:none;padding:.45rem .7rem;
         border:1px solid var(--line);border-radius:var(--r);background:var(--paper);
         cursor:pointer;font-family:inherit;font-size:.8rem;font-weight:600;color:var(--ink-2);
         transition:border-color var(--dur),color var(--dur)}
.paycopy:hover{border-color:var(--v-600);color:var(--v-600)}
.paycopy.is-done{border-color:var(--ok,#1f8a4c);color:var(--ok,#1f8a4c)}
.paycopy svg{flex:none}

.orderpage .paynow-r{display:flex;flex-direction:column;align-items:center;gap:.5rem;flex:none;
          padding:.7rem;background:var(--canvas);border:1px solid var(--line);
          border-radius:var(--r-lg);align-self:start}
.payqr-img{display:block;width:164px;height:164px;background:#fff;border-radius:var(--r);
           padding:.35rem}
.orderpage .paynow-r p{display:flex;align-items:center;gap:.3rem;margin:0;font-size:.74rem;color:var(--ink-4)}
.orderpage .paynow-r svg{flex:none}

.paywatch{display:flex;align-items:center;gap:.45rem;margin:0;padding:.7rem 1.2rem;
          background:var(--canvas);border-top:1px solid var(--line);font-size:.78rem;
          color:var(--ink-4)}
/* Un point qui respire : la page dit qu'elle surveille, elle doit en avoir
   l'air. Immobile, la phrase passe pour une decoration. */
.paywatch-dot{flex:none;width:7px;height:7px;border-radius:50%;background:var(--ok,#1f8a4c);
              animation:opulse 2s ease-in-out infinite}
@keyframes opulse{0%,100%{opacity:1}50%{opacity:.25}}
@media (prefers-reduced-motion:reduce){.paywatch-dot{animation:none}}

.orderpage .paynow--dead, .orderpage .paynow--done{padding:1.2rem 1.3rem;border-color:var(--line)}
.orderpage .paynow--dead .paynow-h, .orderpage .paynow--done .paynow-h{margin-bottom:.6rem}
.orderpage .paynow-p{margin:0 0 .8rem;color:var(--ink-2);font-size:.9rem;line-height:1.65}
.orderpage .paynow-p a{color:var(--v-600);font-weight:600}
.orderpage .paynow-fine{margin:0 0 .9rem;font-size:.8rem;color:var(--ink-4);line-height:1.55}
.orderpage .paynow-fine a{color:var(--v-600)}

/* ── Le lien a conserver ─────────────────────────────────────────────── */
.orderpage .keeplink{display:grid;grid-template-columns:minmax(0,320px) minmax(0,1fr);gap:.7rem 1.4rem;
          align-items:center;padding:1rem 1.2rem;background:var(--canvas);
          border:1px solid var(--line);border-radius:var(--r-lg)}
.orderpage .keeplink-h{display:flex;align-items:center;gap:.4rem;margin:0;font-size:.95rem;font-weight:650}
.orderpage .keeplink-h svg{color:var(--v-600);flex:none}
.orderpage .keeplink-p{margin:.25rem 0 0;font-size:.8rem;color:var(--ink-3);line-height:1.55}
.orderpage .keeplink-box{display:flex;align-items:center;gap:.6rem;padding:.55rem .7rem;background:var(--paper);
              border:1px solid var(--line);border-radius:var(--r);min-width:0}
.orderpage .keeplink-box code{flex:1;min-width:0;font-family:var(--mono);font-size:.76rem;
                   word-break:break-all;user-select:all}
.orderpage .keeplink-alt{grid-column:1/-1;margin:0;font-size:.8rem;color:var(--ink-4)}
.orderpage .keeplink-alt .modal-swap{color:var(--v-600);font-weight:600}

/* ── Articles et recapitulatif ───────────────────────────────────────── */
.orderpage .ogrid{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) minmax(0,1fr);
                  gap:1rem;align-items:start}
/* [!] `display:contents` : les deux cartes du cote droit deviennent des
   enfants DIRECTS de la grille, donc trois colonnes de hauteur egale au
   lieu d'une colonne haute a cote d'une colonne courte. */
.orderpage .oside{display:contents}
.orderpage .ocard{padding:1rem 1.15rem;border:1px solid var(--line);border-radius:var(--r-lg);
       background:var(--paper)}
.orderpage .ocard-h{display:flex;align-items:center;gap:.5rem;margin:0 0 .8rem;font-size:.95rem;font-weight:650}
.orderpage .ocard-h svg{color:var(--v-600);flex:none}

.orderpage .oitems{list-style:none;margin:0;padding:0;display:grid;gap:.5rem}
.orderpage .oitem{display:grid;grid-template-columns:44px minmax(0,1fr) auto;align-items:center;gap:.8rem;
       padding:.55rem;border:1px solid var(--line);border-radius:var(--r);background:var(--canvas)}
.orderpage .oitem-img{display:grid;place-items:center;width:44px;height:44px;background:var(--paper);
           border-radius:var(--r);color:var(--ink-4)}
.orderpage .oitem-img img{width:100%;height:100%;object-fit:contain}
.orderpage .oitem-main{display:flex;flex-direction:column;min-width:0}
.orderpage .oitem-t{font-size:.86rem;font-weight:560;line-height:1.35;overflow:hidden;text-overflow:ellipsis;
         display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
a.oitem-t:hover{color:var(--v-600)}
.orderpage .oitem-m{font-family:var(--mono);font-size:.7rem;color:var(--ink-4);margin-top:.15rem}
.orderpage .oitem-p{font-family:var(--mono);font-size:.86rem;font-weight:620;white-space:nowrap}

.orderpage .orows{display:grid;grid-template-columns:1fr auto;gap:.5rem 1rem;margin:0;font-size:.86rem}
.orderpage .orows dt{color:var(--ink-3)}
.orderpage .orows dt small{display:block;font-size:.72rem;color:var(--ink-4);margin-top:.1rem}
.orderpage .orows dd{margin:0;text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums}
.orderpage .orows .is-total{padding-top:.6rem;border-top:1px solid var(--line);font-weight:700;
                 font-size:1rem;color:var(--ink)}
.orderpage .orows dt.is-total{font-family:inherit}
.orderpage .orows .is-free{color:var(--ok,#1f8a4c);font-family:inherit}
.orderpage .orows .is-coin{color:var(--ink-3);font-size:.82rem}

.orderpage .oaddr{font-style:normal;font-size:.85rem;line-height:1.6;color:var(--ink-2)}
.orderpage .oaddr b{display:block;color:var(--ink);font-weight:620}
.orderpage .oship{display:flex;gap:.5rem;align-items:flex-start;margin:.85rem 0 0;padding:.65rem .7rem;
       background:var(--v-50);border-radius:var(--r);font-size:.82rem;line-height:1.5}
.orderpage .oship svg{flex:none;margin-top:.15rem;color:var(--v-600)}
.orderpage .oship small{display:block;color:var(--ink-4);font-size:.74rem;margin-top:.1rem}
.orderpage .ofine{display:flex;align-items:center;gap:.35rem;margin:.7rem 0 0;font-size:.75rem;
       color:var(--ink-4)}
.orderpage .ofine svg{flex:none}

/* ── La barre collante, sur telephone ────────────────────────────────── */
.orderpage .obar{display:none}

@media (max-width:960px){
  .orderpage .paynow-grid{grid-template-columns:1fr}
  /* Le QR passe SOUS ce qu'on copie, et retrecit : sur un telephone on scanne
     depuis un autre appareil, ou l'on copie — rarement les deux. */
  .orderpage .paynow-r{flex-direction:row;justify-content:center;gap:.9rem;align-items:center}
  .payqr-img{width:128px;height:128px}
  .orderpage .ogrid{grid-template-columns:1fr}
  /* Repli : sous 960 px la grille redevient une colonne, et les deux
     cartes doivent redevenir un bloc pour garder leur espacement. */
  .orderpage .oside{display:grid;gap:1rem;min-width:0}
  .orderpage .keeplink{grid-template-columns:1fr;gap:.6rem}
}
@media (max-width:640px){
  .orderpage .paynow-top, .orderpage .paynow-grid,  .orderpage .paywatch{padding-left:.95rem;padding-right:.95rem}
  .orderpage .ohead-d{width:100%;order:3}
  .orderpage .ohead-s{margin-left:auto}
  .payfield-v{flex-wrap:wrap;gap:.5rem .7rem}
  .payamt{flex:1 0 100%}
  .paycopy{margin-left:auto}
  .orderpage.is-paying{padding-bottom:calc(5rem + env(safe-area-inset-bottom))}

  .orderpage .obar{display:flex;align-items:center;gap:.8rem;position:fixed;left:0;right:0;bottom:0;z-index:60;
        padding:.6rem .9rem calc(.6rem + env(safe-area-inset-bottom));background:var(--paper);
        border-top:1px solid var(--line);box-shadow:0 -6px 22px rgba(15,17,26,.09)}
  .orderpage .obar-l{display:flex;flex-direction:column;line-height:1.15;min-width:0}
  .orderpage .obar-l small{font-family:var(--mono);font-size:.7rem;color:var(--ink-4);
                font-variant-numeric:tabular-nums}
  .orderpage .obar-l b{font-family:var(--mono);font-size:.9rem;white-space:nowrap;overflow:hidden;
            text-overflow:ellipsis}
  .orderpage .obar .btn{flex:none;margin-left:auto}
}

/* ── Fiche produit : la livraison, avant l'achat ──────────────────────────
   [!] C'est une ESTIMATION, et le mot est ecrit sur la carte : le pays vient
   d'une geolocalisation, pas d'une adresse saisie. Une estimation presentee
   comme un engagement se retourne a la caisse. */
.bbship{margin:.9rem 0 0;padding:.75rem .8rem;background:var(--canvas);
        border:1px solid var(--line);border-radius:var(--r-lg)}
.bbship-h{display:flex;align-items:center;gap:.4rem;margin:0 0 .6rem;font-size:.83rem;
          color:var(--ink-2)}
.bbship-h svg{flex:none;color:var(--v-600)}
.bbship-est{margin-left:auto;padding:.08rem .4rem;border-radius:999px;background:var(--paper);
            border:1px solid var(--line);font-size:.66rem;font-weight:650;letter-spacing:.05em;
            text-transform:uppercase;color:var(--ink-4)}
.bbship-l{list-style:none;margin:0;padding:0;display:grid;gap:.4rem}
.bbship-l li{display:grid;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;
             gap:.55rem;padding:.45rem .5rem;background:var(--paper);border:1px solid var(--line);
             border-radius:var(--r)}
.bbship-m{display:flex;flex-direction:column;min-width:0}
.bbship-m b{font-size:.8rem;font-weight:620;line-height:1.25}
.bbship-m small{font-size:.72rem;color:var(--ink-4)}
.bbship-p{font-family:var(--mono);font-size:.82rem;font-weight:640;white-space:nowrap}
.bbship-p.is-free{color:var(--ok,#1f8a4c);font-family:inherit}
.bbship-n{display:flex;align-items:flex-start;gap:.3rem;margin:.55rem 0 0;font-size:.74rem;
          line-height:1.45;color:var(--ink-4)}
.bbship-n svg{flex:none;margin-top:.15rem;color:var(--v-600)}
.bbship-n.is-warn{color:#8a6d00}
.bbship-n.is-warn svg{color:#b8860b}
.bbship-f{display:flex;align-items:center;gap:.4rem;margin-top:.6rem;padding-top:.6rem;
          border-top:1px solid var(--line);flex-wrap:wrap}
.bbship-lab{flex:1 0 100%;font-size:.72rem;color:var(--ink-4)}
.bbship-sel{flex:1;min-width:0;font-size:.78rem;padding:.35rem 1.9rem .35rem .5rem}
.bbship-none{display:flex;gap:.45rem;align-items:flex-start;margin:.9rem 0 0;font-size:.8rem;
             line-height:1.5;color:var(--ink-3)}
.bbship-none svg{flex:none;margin-top:.15rem;color:var(--v-600)}
.bbship-none a{color:var(--v-600);font-weight:600}

/* Les deux engagements qui restent sur la fiche : garantie et retour. En
   pastilles cliquables — un engagement qu'on ne peut pas aller lire est une
   phrase, pas un engagement. */
.bb-cover{list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:.5rem;
          margin:1rem 0 0;padding:0}
.bb-cover a{display:grid;justify-items:center;gap:.1rem;padding:.7rem .5rem;text-align:center;
            border:1px solid var(--line);border-radius:var(--r-lg);background:var(--canvas);
            color:inherit;transition:border-color var(--dur),background var(--dur)}
.bb-cover a:hover{border-color:var(--v-200);background:var(--v-50)}
.bb-cover svg{color:var(--v-600)}
.bb-cover b{font-size:.9rem;font-weight:660;letter-spacing:-.01em}
.bb-cover small{font-size:.71rem;color:var(--ink-4);line-height:1.3}

/* ══ Fiche produit sur telephone ══════════════════════════════════════════
   [!] Mesure avant correction : sur un ecran de 844 px, le prix tombait a
   1730 px et le bouton d'achat a 1880 — deux ecrans de defilement avant de
   savoir combien coute l'article, parce que 371 px de pastilles techniques et
   194 px de points cles s'intercalaient. Deux corrections, pas une : on
   REORDONNE (le prix remonte juste apres le titre et le choix de variante), et
   une barre collante garde le prix sous le pouce partout ailleurs. */
@media (max-width:860px){
  /* `display:contents` : les enfants de `.pdp-main` deviennent des elements de
     la grille, donc ordonnables un a un. Sans cela, la carte d'achat ne peut
     que passer AVANT ou APRES le bloc entier. */
  .pdp-main{display:contents}
  .pdp-brand{order:1} .pdp-title{order:2} .pdp-meta{order:3} .pdp-lede{order:4}
  .pdp-variant{order:5}
  .buybox{order:6}
  .pdp-chips{order:7} .pdp-bullets{order:8}
  .pdp-gallery{order:0}
  /* `display:contents` fait perdre la marge du conteneur : on la rend aux
     enfants qui en avaient besoin. */
  .pdp-variant{margin-top:.4rem}
  .pdp-chips{margin-top:.2rem}

  .pdp-in{padding-bottom:calc(4.6rem + env(safe-area-inset-bottom))}
}

.pdpbar{display:none}
.pdpbar[hidden]{display:none}
@media (max-width:860px){
  .pdpbar:not([hidden]){display:flex;align-items:center;gap:.8rem;position:fixed;left:0;right:0;
                        bottom:0;z-index:60;padding:.55rem .9rem calc(.55rem + env(safe-area-inset-bottom));
                        background:var(--paper);border-top:1px solid var(--line);
                        box-shadow:0 -6px 22px rgba(15,17,26,.09)}
  .pdpbar-l{display:flex;flex-direction:column;line-height:1.15;min-width:0}
  .pdpbar-l b{font-size:1rem;font-weight:700;letter-spacing:-.01em}
  .pdpbar-l small{font-family:var(--mono);font-size:.7rem;color:var(--ink-4);white-space:nowrap;
                  overflow:hidden;text-overflow:ellipsis}
  .pdpbar .btn{flex:none;margin-left:auto;min-height:44px}
}

/* ══ Cibles tactiles ══════════════════════════════════════════════════════
   [!] `pointer:coarse` et non une largeur : ce qui compte n'est pas la taille
   de l'ecran mais le fait qu'on le touche avec un doigt. Une tablette de
   768 px a exactement le meme probleme qu'un telephone, et la regle en
   largeur la laissait de cote.

   44 px est la borne d'Apple (48 celle de Google). Le rembourrage est compense
   par une marge negative : la mise en page ne bouge pas d'un pixel, et la zone
   touchable double. */
@media (pointer:coarse){
  .crumb-in a{display:inline-block;min-width:44px;text-align:center;
              padding-block:.78rem;margin-block:-.78rem}
  .qty button{width:44px}
  .qty input{width:52px}
  .pcard-name a{display:block;padding-block:.4rem;margin-block:-.4rem}
  .pcard-wishf,.pcard-wish{display:none}
  .pcard-body .btn,.pcard .btn{min-height:44px}
  .ftr-col ul{gap:0}
  .ftr-col a{display:block;padding-block:.62rem}
  .ftr-col > summary{padding-block:.9rem}
  .ftr-mini a{display:block;padding-block:.72rem;margin-block:-.36rem}
  .ftr-brand .brand{display:inline-flex;padding-block:.72rem;margin-block:-.72rem}
}

/* ══ Pied de page ═════════════════════════════════════════════════════════
   [!] Sur telephone, les quatre colonnes empilees faisaient un mur de plus de
   2 000 px qu'il fallait traverser au doigt pour atteindre les mentions
   legales. Elles deviennent des blocs depliables — replies par defaut sous
   640 px, deplies partout ailleurs. */
.ftr-nav{min-width:0}
.ftr-col > summary{list-style:none;display:flex;align-items:center;gap:.5rem}
.ftr-col > summary::-webkit-details-marker{display:none}
.ftr-col > summary svg{display:none}
/* Au-dessus de 640 px le titre n'est PAS un bouton : il ne doit ni changer de
   curseur, ni reagir au clic, ni se replier. */
.ftr-col > summary{cursor:default}
.ftr-col > summary span{flex:1;min-width:0}

@media (max-width:640px){
  .ftr-cols{gap:0}
  .ftr-brand{padding-bottom:1.2rem}
  .ftr-col{border-top:1px solid var(--line)}
  .ftr-col > summary{cursor:pointer;padding-block:.95rem;margin-bottom:0;
                     -webkit-tap-highlight-color:transparent}
  .ftr-col > summary svg{display:block;color:var(--ink-4);flex:none;
                         transition:transform var(--dur)}
  .ftr-col[open] > summary svg{transform:rotate(180deg)}
  .ftr-col > ul{padding-bottom:.9rem}
  /* Cibles tactiles : les liens du pied de page faisaient 21 px de haut.
     Le `gap` de la liste passe a zero : sinon il s'AJOUTE au rembourrage et
     deux liens se retrouvent a 96 px l'un de l'autre. */
  .ftr-col ul{gap:0}
  .ftr-col a{display:block;padding-block:.62rem}
  .ftr-nocard{margin-top:1.6rem;padding:.95rem 1rem;font-size:.83rem}
  .ftr-bottom{flex-direction:column;align-items:flex-start;gap:.9rem}
  .ftr-mini{flex-wrap:wrap;gap:.5rem 1.2rem}
  .ftr-mini a{display:block;padding-block:.72rem;margin-block:-.36rem}
  /* Le logo du pied de page est un lien vers l'accueil : il doit se toucher
     comme les autres. */
  .ftr-brand .brand{display:inline-flex;padding-block:.72rem;margin-block:-.72rem}
}

/* ── Questions de fiche produit ──────────────────────────────────────────
   En <details> natifs : repliés sans une ligne de script, ouverts par le
   navigateur si l'utilisateur cherche dans la page (Chrome ouvre un <details>
   pour révéler une correspondance). Un accordéon en JavaScript perd cette
   propriété, et le texte caché ne compte alors plus pour la recherche.

   [!] La flèche est tournée par une règle sur `[open]`, pas par un état
   JavaScript : c'est le navigateur qui tient l'état, jamais nous. */
.pdp-faq{max-width:78ch}
.pfaq{border-bottom:1px solid var(--line-2)}
.pfaq:first-of-type{border-top:1px solid var(--line-2)}
.pfaq>summary{display:flex;align-items:center;gap:.8rem;justify-content:space-between;
  cursor:pointer;list-style:none;padding:1.05rem .2rem;font-weight:560;
  color:var(--ink);line-height:1.45}
.pfaq>summary::-webkit-details-marker{display:none}
.pfaq>summary:hover{color:var(--brand)}
.pfaq>summary svg{flex:none;color:var(--ink-3);transition:transform .18s ease}
.pfaq[open]>summary svg{transform:rotate(180deg)}
.pfaq>p{color:var(--ink-2);line-height:1.65;padding:0 .2rem 1.15rem;max-width:70ch}

/* Le doigt a besoin de 44 px : sur un écran tactile la ligne s'épaissit,
   compensée par une marge négative pour que la mise en page ne bouge pas. */
@media (pointer:coarse){
  .pfaq>summary{padding-block:1.25rem}
}

/* ══════════════════════════════════════════════════════════════════════
   LE PAIEMENT, PAR-DESSUS LA CAISSE
   ══════════════════════════════════════════════════════════════════════

   Meme cadre que les autres panneaux (`.modal` : voile partage, `.is-open`,
   blocage du defilement), habillage different : ici on ne persuade plus, on
   fait executer un virement sans erreur. D'ou une carte SOBRE, ou les deux
   seules choses qui grossissent sont le montant et l'adresse.

   [!] Les briques de champ (`.payfield`, `.paycopy`, `.payamt`, `.paynet`,
   `.payqr-img`, `.paywatch`) sont celles de la page de commande, DE-SCOPEES
   de `.orderpage` pour etre partagees. Les recopier ici aurait fait deux
   apparences du meme montant, et c'est celle qu'on ne regarde pas qui aurait
   fini par mentir sur le nombre de decimales. */

.paymod{position:relative;display:flex;flex-direction:column;
        width:min(724px,100%);max-height:calc(100dvh - 2.4rem);overflow:hidden;
        background:var(--paper);border-radius:var(--r-xl);
        box-shadow:0 30px 70px -22px rgba(24,20,60,.42);
        transform:translateY(12px) scale(.985);transition:transform var(--dur) var(--ease)}
.modal.is-open .paymod{transform:none}

/* ── En-tete ─────────────────────────────────────────────────────────── */
.paymod-top{display:flex;align-items:center;gap:.8rem;flex-wrap:wrap;flex:none;
            padding:1rem 3.1rem 1rem 1.3rem;background:var(--tint);
            border-bottom:1px solid var(--v-100)}
.paymod-h{display:flex;align-items:center;gap:.55rem;margin:0;
          font-size:1.06rem;font-weight:660;letter-spacing:-.02em}
/* [!] AUCUN anneau de focus sur ce titre. Le focus y est pose PAR LE SCRIPT a
   l'ouverture, pour que le lecteur d'ecran annonce le dialogue et que la
   tabulation reparte de son debut ; ce n'est pas une commande, et un cadre
   viole autour de « Send exactly this amount » se lit comme un champ a
   remplir. Le dialogue lui-meme est l'indication visuelle. */
.paymod-h:focus,.paymod-h:focus-visible{outline:none}
.paymod-h svg{color:var(--v-600);flex:none}
.paymod-clock{display:inline-flex;align-items:center;gap:.4rem;margin:0 0 0 auto;
              padding:.3rem .7rem;border-radius:var(--r-pill);background:var(--paper);
              box-shadow:inset 0 0 0 1px var(--v-200);font-size:.78rem;color:var(--ink-3)}
.paymod-clock b{font-family:var(--mono);font-size:.95rem;font-variant-numeric:tabular-nums;
                color:var(--ink)}
.paymod-clock svg{flex:none;color:var(--v-600)}
/* Cinq minutes : l'ambre, puis le rouge. La couleur porte le meme sens que
   partout ailleurs sur le site — ambre = l'argent, rouge = ca ne va plus. */
.paymod-clock.is-soon{background:#fdf1e3;box-shadow:inset 0 0 0 1px #f0c48a;color:#a1560c}
.paymod-clock.is-soon b,.paymod-clock.is-soon svg{color:#a1560c}
.paymod-clock.is-out{background:var(--red-50);box-shadow:inset 0 0 0 1px #f5b5b5;color:var(--red)}
.paymod-clock.is-out b,.paymod-clock.is-out svg{color:var(--red)}
.paymod-x{top:.85rem;right:.85rem}
.paymod-x:hover{background:var(--paper)}

.paymod-bar{display:block;flex:none;height:3px;background:var(--v-100)}
.paymod-bar i{display:block;width:100%;height:100%;background:var(--v-600);
              transition:width 1s linear}
.paymod-bar i.is-soon{background:#d98324}

/* ── Corps ───────────────────────────────────────────────────────────── */
.paymod-body{padding:1.15rem 1.3rem 1.3rem;overflow-y:auto;min-height:0}
.paymod-grid{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:1.05rem 1.5rem;
             align-items:start}
.paymod-l{display:grid;gap:1rem;min-width:0}
.paymod-r{display:flex;flex-direction:column;align-items:center;gap:.5rem;flex:none;
          padding:.7rem;background:var(--canvas);border:1px solid var(--line);
          border-radius:var(--r-lg)}
.paymod-r p{display:flex;align-items:center;gap:.3rem;margin:0;font-size:.74rem;color:var(--ink-4)}
.paymod-r svg{flex:none}
.paymod .payqr-img{width:168px;height:168px}

.paymod-note{display:flex;gap:.5rem;align-items:flex-start;margin:0;padding:.7rem .85rem;
             border-radius:var(--r-lg);font-size:.82rem;line-height:1.55}
.paymod-note svg{flex:none;margin-top:.15rem}
.paymod-note.is-warn{background:#fdf6e3;color:#6b5300}
.paymod-note.is-warn svg{color:#b8860b}
.paymod-note a{color:inherit;font-weight:700;text-decoration:underline}
/* Le bandeau de manque a payer coiffe la grille : il explique ce que les
   champs qui suivent sont devenus, il ne les remplace pas. */
.pm-pay > .paymod-note{margin-bottom:1rem}

.paymod .paywatch{margin:1.05rem -1.3rem -1.3rem;padding:.7rem 1.3rem;
                  border-top:1px solid var(--line);border-bottom:0}
/* Trois etats pour la meme ligne : on attend, on a vu passer quelque chose,
   il manque de l'argent. Un point vert immobile pendant qu'il manque 40 $
   serait un mensonge poli. */
.paywatch.is-seen{background:var(--v-50);color:var(--v-700)}
.paywatch.is-seen .paywatch-dot{background:var(--v-600)}
.paywatch.is-short{background:#fdf6e3;color:#6b5300}
.paywatch.is-short .paywatch-dot{background:#b8860b}

/* ── Volets d'attente et de fin ──────────────────────────────────────── */
.pm-busy,.pm-end{display:flex;flex-direction:column;align-items:center;text-align:center;
                 gap:.7rem;padding:1.6rem .6rem 1.1rem}
.paymod-lede{margin:0;max-width:44ch;font-size:.92rem;line-height:1.62;color:var(--ink-2)}
.paymod-eh{margin:0;font-size:1.2rem;font-weight:660;letter-spacing:-.025em}
.paymod-ico{display:grid;place-items:center;width:48px;height:48px;border-radius:50%}
.paymod-ico.is-ok{background:var(--green-50);color:var(--green)}
.paymod-ico.is-warn{background:#fdf1e3;color:#a1560c}
.paymod-ico.is-bad{background:var(--red-50);color:var(--red)}

.paymod-spin{width:26px;height:26px;border-radius:50%;
             border:2.5px solid var(--v-100);border-top-color:var(--v-600);
             animation:pmspin .7s linear infinite}
@keyframes pmspin{to{transform:rotate(360deg)}}

/* ── Pied ────────────────────────────────────────────────────────────── */
.paymod-foot{flex:none;padding:.95rem 1.3rem 1.1rem;background:var(--canvas);
             border-top:1px solid var(--line)}
.paymod-acts{display:flex;align-items:center;gap:.7rem;flex-wrap:wrap}
/* L'action de sortie a GAUCHE et l'action utile a droite : l'inverse fait
   cliquer « annuler » a ceux qui visent le bouton de droite par habitude. */
.paymod-acts .paymod-open,.paymod-acts .paymod-again,.paymod-acts .paymod-go{margin-left:auto}
.paymod-back{padding-left:.85rem}
.paymod-back svg{transform:rotate(180deg)}
.paymod-fine{display:flex;gap:.4rem;align-items:flex-start;margin:.75rem 0 0;
             font-size:.775rem;line-height:1.55;color:var(--ink-4)}
.paymod-fine svg{flex:none;margin-top:.15rem}
.paymod-fine b{color:var(--ink-3)}
.paymod-fine a{color:var(--v-700);font-weight:600}
.pm-end .paymod-fine{justify-content:center;text-align:center;max-width:46ch}

@media (max-width:720px){
  .paymod{width:min(460px,100%)}
  .paymod-grid{grid-template-columns:1fr}
  /* Le QR passe SOUS ce qu'on copie, et se couche : sur un telephone on scanne
     depuis un autre appareil, ou l'on copie — rarement les deux. */
  .paymod-r{flex-direction:row;justify-content:center;gap:.9rem;align-items:center}
  .paymod .payqr-img{width:124px;height:124px}
}
@media (max-width:560px){
  /* Feuille collee au bas, comme les autres panneaux : le pouce y arrive, et
     le clavier virtuel ne recouvre rien puisqu'il n'y a rien a saisir. */
  .paymod{width:100%;max-height:94dvh;border-radius:var(--r-xl) var(--r-xl) 0 0;
          transform:translateY(18px)}
  .paymod-top{padding:.9rem 2.9rem .9rem 1.05rem}
  .paymod-h{font-size:1rem}
  /* L'horloge passe a la ligne sous le titre : `margin-left:auto` la poussait
     alors contre le bord droit, sous la croix, ou elle se lisait comme une
     etiquette de la croix et non du paiement. */
  .paymod-clock{margin-left:0}
  .paymod-body{padding:1rem 1.05rem 1.1rem}
  /* Le QR retrecit encore : c'est le dernier bloc du corps defilant, et un
     carre de 124 px le faisait deborder du pli sur presque tous les
     telephones — on scanne rarement l'ecran qu'on tient en main. */
  .paymod .payqr-img{width:104px;height:104px}
  .paymod .paywatch{margin:1rem -1.05rem -1.1rem;padding:.7rem 1.05rem}
  .paymod-foot{padding:.85rem 1.05rem calc(1rem + env(safe-area-inset-bottom))}
  /* Les deux boutons a pleine largeur : cote a cote sous 360 px, chacun fait
     deux lignes de texte et la cible tactile devient un ruban.

     [!] `column`, PAS `column-reverse`. En sens inverse, l'action qui ANNULE
     le devis se retrouvait tout en bas, exactement la ou le pouce se pose au
     repos — et l'action utile hors de portee. L'ordre du gabarit (sortie
     d'abord, action ensuite) donne le bon empilement tel quel. */
  .paymod-acts{flex-direction:column;align-items:stretch}
  .paymod-acts .btn{justify-content:center}
  .paymod-acts .paymod-open,.paymod-acts .paymod-again,.paymod-acts .paymod-go{margin-left:0}
}
@media (prefers-reduced-motion:reduce){
  .paymod{transition:none}
  .paymod-spin{animation:none}
  .paymod-bar i{transition:none}
}

/* ── Le retour sur la caisse ─────────────────────────────────────────── */
/* Fermer le paiement ne doit pas rendre un ecran muet : cette ligne dit ce
   qui vient de se passer, ce qui n'a PAS ete preleve, et ce qu'on peut faire
   maintenant. */
.conote{display:flex;gap:.55rem;align-items:flex-start;margin:0 0 1.15rem;
        padding:.8rem .95rem;border-radius:var(--r-lg);background:var(--v-50);
        box-shadow:inset 0 0 0 1px var(--v-100);font-size:.87rem;line-height:1.6;
        color:var(--ink-2)}
.conote-i{display:flex;flex:none;margin-top:.1rem;color:var(--v-600)}
.conote.is-warn{background:#fdf6e3;box-shadow:inset 0 0 0 1px #f0dcae;color:#6b5300}
.conote.is-warn .conote-i{color:#b8860b}
.conote b{font-weight:640;color:var(--ink)}
.conote.is-warn b{color:#5a4600}

/* La ou se change la monnaie, souligne UNE fois au retour : sans ce repere,
   « changez de crypto » envoie chercher un bouton dans une colonne qu'on
   vient de quitter des yeux. */
/* [!] `box-shadow` et non `border` : animer la bordure changerait la LARGEUR
   du bouton a chaque battement, et tout le recapitulatif respirerait avec.
   L'ombre, elle, ne prend pas de place dans la mise en page. */
.paysel.is-flash .paysel-btn{border-color:var(--v-600);animation:coflash 1.4s var(--ease) 2}
@keyframes coflash{0%,100%{box-shadow:none}
                   50%{box-shadow:0 0 0 4px var(--v-50)}}
@media (prefers-reduced-motion:reduce){
  .paysel.is-flash .paysel-btn{animation:none;box-shadow:0 0 0 4px var(--v-50)}
}

/* ══════════════════════════════════════════════════════════════════════
   RANGEES DE PRODUITS (accueil)
   ══════════════════════════════════════════════════════════════════════

   La structure de toutes les grandes boutiques en ligne : une rangee par
   etagere, qui defile horizontalement, plutot qu'une grille unique. Une
   grille de vingt-quatre cartes occupe deux mille cinq cents pixels pour
   montrer UNE etagere ; six rangees de douze en occupent autant et en
   montrent six.

   [!] LE DEFILEMENT EST NATIF. `.rail` est un `overflow-x:auto` : il marche
   au doigt, a la molette et au clavier SANS une ligne de JavaScript. Les
   fleches sont ajoutees par le script et n'existent pas sans lui — rendues en
   dur, elles resteraient a l'ecran, inertes, pour qui ne l'execute pas. */

.sec--rails{padding-block:clamp(2.6rem,1.6rem + 3vw,4.2rem)}
/* Les rangees se suivent DANS une meme section : la separation est une ligne,
   pas un changement de fond. Empiler des sections pleines aurait double le
   rembourrage entre deux rangees qui parlent de la meme chose.

   🔴 `:not([hidden])` N'EST PAS UNE PRECAUTION. La rangee « deja vus » est
   TOUJOURS dans le document — elle est rendue vide et devoilee par le script
   quand le visiteur a un historique — et un element `hidden` reste un frere
   adjacent pour le selecteur `+`. Sans ce filtre, la premiere rangee VISIBLE
   heritait donc du separateur d'une rangee invisible : un filet horizontal
   sorti de nulle part et cent deux pixels de vide juste sous le bandeau de
   reassurance, pour tout visiteur qui n'a encore rien consulte — c'est-a-dire
   pour tout premier passage. */
.railwrap:not([hidden]) + .railwrap{margin-top:clamp(2rem,1.2rem + 2.4vw,3.2rem);
                      padding-top:clamp(2rem,1.2rem + 2.4vw,3.2rem);
                      border-top:1px solid var(--line)}

.rhead{display:flex;align-items:flex-end;justify-content:space-between;gap:1.2rem 2rem;
       flex-wrap:wrap;margin-bottom:1.15rem}
.rhead-t{min-width:0}
/* Plus petit qu'un `.shead-title` : six titres de rangee a 2,4 rem feraient
   six titres de page empiles, et plus aucun ne serait un reper. */
.rhead-h{font-size:clamp(1.2rem,1rem + .8vw,1.6rem);letter-spacing:-.028em;line-height:1.15;margin:0}
.rhead-lede{margin:.4rem 0 0;color:var(--ink-3);font-size:.9rem;line-height:1.55;max-width:62ch}
.rhead-a{display:flex;align-items:center;gap:.6rem;flex:none;margin-left:auto}

.rlink{display:inline-flex;align-items:center;gap:.35rem;flex:none;padding:.45rem .8rem;
       border-radius:var(--r-xs);background:var(--v-50);color:var(--v-700);
       font-size:.87rem;font-weight:580;white-space:nowrap;
       transition:background var(--dur),color var(--dur)}
.rlink:hover{background:var(--v-100);color:var(--v-800)}
.rlink svg{flex:none}

.rnav{display:flex;gap:.35rem;flex:none}
.rbtn{display:grid;place-items:center;width:34px;height:34px;border-radius:50%;
      background:var(--paper);color:var(--ink-2);border:0;cursor:pointer;
      box-shadow:inset 0 0 0 1px var(--line),var(--sh-1);
      transition:box-shadow var(--dur),color var(--dur),opacity var(--dur)}
.rbtn:hover:not(:disabled){box-shadow:inset 0 0 0 1.5px var(--v-200),var(--sh-2);color:var(--v-700)}
.rbtn:disabled{opacity:.32;cursor:default}
.rbtn svg{flex:none}
.rbtn--prev svg{transform:rotate(180deg)}

/* ── La piste ──────────────────────────────────────────────────────────
   [!] `scroll-snap-type` EN PROXIMITE, pas en `mandatory` : en mandatory, un
   petit coup de molette horizontale ramene toujours a la carte de depart et
   la rangee donne l'impression de resister. */
.rail{overflow-x:auto;overflow-y:hidden;scroll-snap-type:x proximity;
      overscroll-behavior-x:contain;scrollbar-width:none;-ms-overflow-style:none;
      /* La rangee deborde de la gouttiere pour que la carte coupee touche le
         bord de l'ecran : coupee AVANT la marge, elle se lit comme une carte
         volontairement etroite, pas comme une rangee qui continue. */
      margin-inline:calc(var(--wrap-x) * -1);padding-inline:var(--wrap-x);
      /* 🔴 `scroll-padding-inline` EST INDISPENSABLE, et son absence ne
         ressemble pas a un defaut de rembourrage. Le port d'accrochage part
         par defaut du bord du conteneur, PADDING COMPRIS : le navigateur
         recalait donc la premiere carte sur ce bord — elle sortait 32 px a
         gauche du titre, toute la page paraissait de travers, et la rangee
         s'ouvrait a `scrollLeft = 32`, ce qui rendait la fleche gauche
         active alors qu'il n'y a rien a gauche. Un seul oubli, deux
         symptomes qui n'ont l'air d'avoir aucun rapport. */
      scroll-padding-inline:var(--wrap-x);
      padding-block:.35rem .6rem}
.rail::-webkit-scrollbar{display:none}
.rail:focus{outline:none}
.rail:focus-visible{outline:2px solid var(--v-600);outline-offset:2px;border-radius:var(--r)}

/* [!] `grid-auto-columns` et non `flex` : en flex, une carte dont le contenu
   est court retrecit, et la rangee perd son pas — les vignettes ne sont plus
   alignees d'une carte a l'autre. */
.rail-track{display:grid;grid-auto-flow:column;grid-auto-columns:236px;gap:1rem;
            align-items:stretch}
.rail-track > .pcard{scroll-snap-align:start;min-width:0}

/* ── La ligne de renvoi sous les dernieres rangees ─────────────────── */
.rails-more{display:flex;align-items:center;justify-content:center;gap:.5rem;
            margin:clamp(2rem,1.2rem + 2.4vw,3.2rem) 0 0;
            padding-top:clamp(2rem,1.2rem + 2.4vw,3.2rem);border-top:1px solid var(--line);
            font-size:.95rem;color:var(--ink-3);text-align:center}
.rails-more svg{flex:none;color:var(--v-600)}
.rails-more b{color:var(--ink);font-weight:640}
.rails-more a{color:var(--v-700);font-weight:600;text-decoration:underline;text-underline-offset:3px}

@media (max-width:1100px){
  .rail-track{grid-auto-columns:222px}
}
@media (max-width:720px){
  /* [!] La carte fait 76 % de l'ecran : la SUIVANTE depasse d'un quart, et
     c'est ce depassement — pas une fleche, pas une barre — qui dit qu'il y a
     autre chose a droite. Une carte pleine largeur se lit comme une rangee
     d'un seul article. */
  .rail-track{grid-auto-columns:min(76vw,260px);gap:.7rem}
  .rhead{align-items:flex-start;margin-bottom:.9rem}
  .rhead-a{margin-left:0}
  .rhead-lede{display:none}
}
/* Sur ecran tactile les fleches ne servent a rien : on fait glisser. Elles
   prendraient la place du lien « voir les N », qui lui sert. */
@media (pointer:coarse){
  .rnav{display:none}
}

/* ══════════════════════════════════════════════════════════════════════
   MAGASINER PAR MARQUE
   ══════════════════════════════════════════════════════════════════════

   Des TUILES, pas une liste. La version precedente etait une enumeration de
   trois cent cinquante-six noms sans lien : trois ecrans de texte gris ou
   l'œil ne s'accroche a rien et ou rien ne se clique.

   [!] PAS DE LOGOS. On en aurait pour une marque sur trois — les autres
   tomberaient sur un rectangle vide ou une initiale, et une rangee ou un tiers
   des cases est habille se lit comme une rangee cassee. Un nom compose et un
   compte disent la meme chose, pour toutes. */

.sec--brands{background:var(--canvas)}

.brgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(178px,1fr));gap:.7rem}
.brtile{display:flex;flex-direction:column;gap:.15rem;height:100%;
        padding:.85rem .95rem;border-radius:var(--r-lg);
        background:var(--paper);box-shadow:inset 0 0 0 1px var(--line);
        transition:box-shadow var(--dur),transform var(--dur) var(--ease)}
.brtile:hover{box-shadow:inset 0 0 0 1.5px var(--v-200),var(--sh-2);transform:translateY(-1px)}
/* Le nom respire sur deux lignes s'il le faut : « Kingston Technology Corp. »
   coupe en « Kingston Technology… » ne se reconnait plus. */
.brtile-n{font-size:.95rem;font-weight:600;letter-spacing:-.014em;line-height:1.25;color:var(--ink)}
.brtile-c{font-family:var(--mono);font-size:.72rem;color:var(--ink-4)}
.brtile:hover .brtile-n{color:var(--v-700)}

/* ── L'index A-Z ─────────────────────────────────────────────────────── */
.brpage{padding-block:clamp(1.6rem,1rem + 2vw,2.6rem) clamp(3rem,2rem + 3vw,4.5rem)}
.brpage-h{display:flex;align-items:center;gap:.5rem;margin:2.4rem 0 1rem;
          font-size:1.15rem;font-weight:650;letter-spacing:-.025em}
.brpage-h:first-child{margin-top:0}
.brpage-h svg{color:var(--v-600);flex:none}

/* Les ancres de lettres : sur trois cents marques, defiler jusqu'au T est un
   travail. Elles collent en haut pour rester atteignables pendant la lecture. */
.brjump{display:flex;flex-wrap:wrap;gap:.3rem;position:sticky;top:0;z-index:5;
        margin-bottom:1.4rem;padding:.5rem 0;background:var(--paper)}
.brjump a{display:grid;place-items:center;min-width:30px;height:30px;padding-inline:.3rem;
          border-radius:var(--r-sm);background:var(--canvas);
          font-family:var(--mono);font-size:.8rem;font-weight:600;color:var(--ink-3);
          transition:background var(--dur),color var(--dur)}
.brjump a:hover{background:var(--v-50);color:var(--v-700)}

.brsec{margin-bottom:1.8rem;scroll-margin-top:3.4rem}
.brsec-h{margin:0 0 .6rem;padding-bottom:.4rem;border-bottom:1px solid var(--line);
         font-family:var(--mono);font-size:.9rem;color:var(--ink-3)}
.brlist{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:.15rem .8rem}
.brlist a{display:flex;align-items:baseline;justify-content:space-between;gap:.6rem;
          padding:.4rem .5rem;border-radius:var(--r-sm);font-size:.9rem;
          transition:background var(--dur),color var(--dur)}
.brlist a:hover{background:var(--v-50);color:var(--v-700)}
.brlist-c{flex:none;font-family:var(--mono);font-size:.72rem;color:var(--ink-4)}

@media (max-width:560px){
  .brgrid{grid-template-columns:repeat(2,1fr);gap:.55rem}
  .brtile{padding:.7rem .75rem}
  .brtile-n{font-size:.88rem}
  .brlist{grid-template-columns:1fr}
  /* La cible tactile d'une entree d'index : une ligne de texte fait 20 px. */
  .brlist a{padding:.6rem .5rem}
}

/* ══════════════════════════════════════════════════════════════════════
   BARRE DE NAVIGATION BASSE (telephone)
   ══════════════════════════════════════════════════════════════════════

   Mesure de l'en-tete mobile AVANT : six commandes sur 56 px de haut, et
   109 px de chrome avant le premier pixel de contenu sur un ecran de 844 —
   treize pour cent de l'ecran, occupes en permanence, TOUS en haut,
   c'est-a-dire a l'endroit qu'un pouce atteint le moins bien.

   Ce qui SERT sans arret descend dans la zone du pouce ; l'en-tete garde ce
   qui RENSEIGNE (le nom de la boutique, la monnaie, le compte).

   [!] 860 px, la meme borne que `.pdpbar` : les deux barres se relaient, elles
   ne doivent jamais se croiser. */

.tabbar{display:none}

@media (max-width:860px){
  /* 🔴 LA HAUTEUR EST UN JETON, lu par la barre ET par le rembourrage du
     corps. Ecrite deux fois, elle a diverge d'UN pixel — celui du filet
     superieur — et le dernier pixel de chaque page passait sous la barre.
     Un pixel ne se voit pas ; un bouton de pied de page qui ne repond pas
     dans un cas sur deux, si. */
  :root{--tabbar-h:57px}

  .tabbar{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;
          position:fixed;left:0;right:0;bottom:0;z-index:60;
          /* Le rembourrage bas absorbe la barre d'accueil de l'iPhone : sans
             lui, le dernier tiers des boutons est sous une zone que le systeme
             se reserve, et le geste de retour les declenche. */
          padding-bottom:env(safe-area-inset-bottom);
          background:var(--paper);border-top:1px solid var(--line);
          box-shadow:0 -6px 22px rgba(15,17,26,.09)}

  .tabbar-i{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.18rem;
            /* 56 px : au-dessus des 44 d'Apple et des 48 de Google, parce
               qu'une cible de barre basse se touche en marchant. */
            min-height:56px;padding:.45rem .2rem .5rem;
            background:none;border:0;cursor:pointer;color:var(--ink-4);
            font-family:inherit;transition:color var(--dur)}
  .tabbar-ico{position:relative;display:grid;place-items:center;height:22px}
  /* [!] Le LIBELLE reste, meme a onze pixels. Une rangee d'icones nues se
     devine ; sur une boutique, « deviner » ou est le panier coute une vente.
     C'est aussi la seule chose qui rende la barre traduisible. */
  /* ⚠ `.7rem` = 11,2 px, pas `.68` = 10,88. Le banc mobile refuse tout texte
     sous 11 px, et les cinq libelles de la barre passaient JUSTE dessous —
     un dixieme de rem, cinq rouges, et rien qui se voie a l'œil. */
  .tabbar-t{font-size:.7rem;font-weight:560;letter-spacing:-.005em;line-height:1}
  .tabbar-i:hover,.tabbar-i:focus-visible{color:var(--v-700)}
  .tabbar-i.is-on{color:var(--v-700)}
  .tabbar-i.is-on .tabbar-ico::after{content:"";position:absolute;top:-9px;left:50%;
                                     width:20px;height:3px;margin-left:-10px;
                                     border-radius:0 0 3px 3px;background:var(--v-600)}

  .tabbar-n{position:absolute;top:-6px;right:-10px;min-width:17px;height:17px;padding:0 4px;
            display:grid;place-items:center;border-radius:999px;
            background:var(--v-600);color:#fff;
            font-family:var(--mono);font-size:.62rem;font-weight:700;line-height:1}

  /* 🔴 LE CONTENU NE DOIT JAMAIS PASSER SOUS LA BARRE. Sans ce rembourrage, le
     dernier element de chaque page — le pied, un bouton, la derniere ligne
     d'un tableau — reste inatteignable, et rien a l'ecran ne dit pourquoi. */
  body:not([data-ownbar]){padding-bottom:calc(var(--tabbar-h) + env(safe-area-inset-bottom))}

  /* Les pages qui portent DEJA leur barre d'action gardent la leur : deux
     barres empilees, ce sont 120 px de chrome au-dessus du pouce, et l'action
     de la page passe au second rang derriere une navigation dont on n'a plus
     besoin a ce stade. */
  body[data-ownbar] .tabbar{display:none}
  /* La fiche produit, elle, bascule EN COURS DE DEFILEMENT (`app.js` pose la
     classe quand la barre d'achat apparait). */
  body.has-pagebar .tabbar{display:none}

  /* ── L'en-tete s'allege d'autant ─────────────────────────────────────
     Ces trois commandes vivent desormais en bas ; les laisser en haut serait
     les proposer deux fois, ce qui est exactement ce qui rendait la barre
     chargee. */
  .hdr-burger,.hdr-searchbtn,.cartbtn,.hdr-wish{display:none}
  /* 🔴 SAUF quand la barre basse s'efface. Sur une fiche produit defilee,
     la barre d'achat prend sa place ; a la caisse, c'est la barre de commande.
     La recherche n'etait alors atteignable NULLE PART : ni en bas (la barre
     n'est plus la), ni en haut (le bouton avait ete retire de l'en-tete). Sur
     une fiche longue, cela represente la quasi-totalite de la page. */
  body[data-ownbar] .hdr-searchbtn,
  body.has-pagebar .hdr-searchbtn{display:grid}
  .hdr-main{gap:.5rem}
  .hdr-acts{gap:.25rem}
  /* 🔴 LA RECHERCHE S'OUVRE EN BAS, DANS LA CONTINUITE DE LA BARRE.
     Le declencheur est au pouce ; faire naitre le champ en HAUT de l'ecran
     oblige l'œil a remonter toute la page pour retrouver ce qu'on vient de
     demander -- et sur une page defilee, il nait purement hors du regard :
     on appuie, il ne se passe « rien ».

     [!] C'est le MEME formulaire, deplace dans le document par `app.js`
     (`document.body.appendChild`), pas une copie. Une seconde recherche aurait
     sa propre liste de suggestions, son propre envoi, et les deux auraient
     diverge au premier changement. Le deplacement est aussi une NECESSITE
     d'empilement : `.hdr` porte `z-index:60`, donc tout ce qu'il contient est
     enferme sous le voile, meme en `position:fixed` avec un z-index de 80. */
  body.is-searchbar > .search{
    display:flex;align-items:center;gap:.4rem;position:fixed;left:0;right:0;z-index:82;
    bottom:calc(var(--tabbar-h) + env(safe-area-inset-bottom));
    max-width:none;margin:0;padding:.55rem .8rem;
    background:var(--paper);border-top:1px solid var(--line);
    box-shadow:0 -10px 26px rgba(15,17,26,.13)
  }
  /* [!] Les trois commandes deviennent de VRAIS elements de flux. Dans
     l'en-tete, la loupe et la fleche sont posees en absolu par-dessus le
     champ ; ici il y a un bouton de plus (« Annuler ») dont la largeur change
     avec la langue -- « Cancel », « Annuler » -- et aucune valeur de `right:`
     ecrite d'avance ne peut la suivre. */
  body.is-searchbar > .search input{flex:1;min-width:0;padding-right:14px}
  body.is-searchbar > .search .search-ico{left:26px}
  body.is-searchbar > .search .search-go{position:static;transform:none;flex:none;
                                         width:44px;height:44px}
  body.is-searchbar .search-cancel{display:grid}
  /* Les suggestions poussent VERS LE HAUT : sous le champ, elles naitraient
     derriere la barre basse, puis sous le clavier. */
  body.is-searchbar > .search .search-panel{
    top:auto;bottom:calc(100% + .35rem);left:.8rem;right:.8rem;
    max-height:min(48vh,380px)
  }
  /* La barre reste VISIBLE au-dessus du voile : c'est elle qui porte le
     declencheur, et la faire disparaitre au moment ou on s'en sert enleve le
     seul repere qui dit d'ou vient ce champ. */
  body.is-searchbar .tabbar{z-index:82}
  /* L'onglet qui a ouvert le champ se marque : sinon la barre ne dit pas
     d'ou vient ce qu'on a sous les yeux, et rappuyer dessus (le geste qui
     referme) ne se devine pas. */
  /* La COULEUR seule, pas le filet de `.is-on` : le filet dit « vous etes sur
     cette page », un panneau ouvert est un autre etat. Vaut aussi pour
     « Rayons » et « Panier », qui portent le meme attribut quand leur tiroir
     est ouvert. */
  .tabbar-i[aria-expanded="true"]{color:var(--v-700)}
}

/* Sous 380 px, le globe cede la place : le CODE suffit a dire quelle langue
   est active, l'icone ne dit que « il y a un reglage ici ». */
@media (max-width:379px){
  .langbtn{padding-inline:.45rem}
  .langbtn svg{display:none}
}

@media (prefers-reduced-motion:reduce){
  .tabbar-i{transition:none}
}

/* ── Choix de la langue ─────────────────────────────────────────────────── */
.langrow{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:.5rem}
.langopt{display:flex;align-items:center;gap:.55rem;padding:.6rem .7rem;border-radius:var(--r);
         background:var(--paper);box-shadow:inset 0 0 0 1px var(--line);
         transition:box-shadow var(--dur),color var(--dur)}
.langopt:hover{box-shadow:inset 0 0 0 1.5px var(--v-200);color:var(--v-700)}
.langopt.is-on{box-shadow:inset 0 0 0 1.5px var(--v-600);color:var(--v-700)}
.langopt-c{display:grid;place-items:center;width:28px;height:20px;flex:none;border-radius:3px;
           overflow:hidden;box-shadow:inset 0 0 0 1px rgba(15,17,26,.14);
           background:var(--canvas);font-family:var(--mono);font-size:.66rem;font-weight:700;
           letter-spacing:.02em;color:var(--ink-3);text-transform:uppercase}
.langopt.is-on .langopt-c{background:var(--v-50);color:var(--v-700)}
.langopt-t{display:flex;flex-direction:column;line-height:1.25;min-width:0}
.langopt-t b{font-size:.9rem;font-weight:600}
.langopt-t small{font-size:.72rem;color:var(--ink-4)}
.langopt-tick{margin-left:auto;flex:none;opacity:0;color:var(--v-600)}
.langopt.is-on .langopt-tick{opacity:1}
