/* club151 — shared storefront styles (linked by every page) */

@keyframes lcFade { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@keyframes lcPulse { 0%,100% { opacity: 1; } 50% { opacity: 0.55; } }
::-webkit-scrollbar { height: 8px; width: 8px; }
::-webkit-scrollbar-thumb { background: var(--line-strong); border-radius: 100px; }

/* ---- Pokéball theme-switch transition ---- */
#lc-theme-fx { position: fixed; inset: 0; z-index: 9999; pointer-events: none; display: flex; align-items: center; justify-content: center; }
#lc-theme-fx .wipe { position: absolute; inset: 0; animation: lcIris 820ms cubic-bezier(0.65,0,0.35,1) forwards; }
@keyframes lcIris {
  0%   { clip-path: circle(0% at 50% 50%); }
  26%  { clip-path: circle(150% at 50% 50%); }
  54%  { clip-path: circle(150% at 50% 50%); }
  100% { clip-path: circle(0% at 50% 50%); }
}
#lc-theme-fx .ball { position: relative; width: 104px; height: 104px; transform-style: preserve-3d; animation: lcBall 820ms cubic-bezier(0.5,1.5,0.45,1) forwards; }
@keyframes lcBall {
  0%   { transform: perspective(600px) scale(0) rotateY(-360deg); opacity: 0; }
  22%  { transform: perspective(600px) scale(1.18) rotateY(-120deg); opacity: 1; }
  40%  { transform: perspective(600px) scale(1) rotateY(0deg); opacity: 1; }
  58%  { transform: perspective(600px) scale(1.06) rotateY(40deg); opacity: 1; }
  74%  { transform: perspective(600px) scale(1) rotateY(0deg); opacity: 1; }
  100% { transform: perspective(600px) scale(0) rotateY(360deg); opacity: 0; }
}
/* 3D page tilt — desktop only (added via JS) */
#root.lc-3d { transform-origin: 50% 50%; animation: lcPageTilt 820ms cubic-bezier(0.65,0,0.35,1); }
@keyframes lcPageTilt {
  0%   { transform: perspective(1400px) rotateX(0deg) scale(1); }
  28%  { transform: perspective(1400px) rotateX(8deg) scale(0.94); }
  54%  { transform: perspective(1400px) rotateX(8deg) scale(0.94); }
  100% { transform: perspective(1400px) rotateX(0deg) scale(1); }
}
#lc-theme-fx .flash { position: absolute; width: 104px; height: 104px; border-radius: 50%; background: radial-gradient(circle, #fff 0%, rgba(255,255,255,0.6) 40%, transparent 70%); animation: lcFlash 820ms ease-out forwards; }
@keyframes lcFlash {
  0%, 40% { transform: scale(0.3); opacity: 0; }
  50% { transform: scale(1.6); opacity: 1; }
  66% { transform: scale(3.4); opacity: 0.5; }
  80%, 100% { transform: scale(5); opacity: 0; }
}
#lc-theme-fx .ray { position: absolute; width: 220%; height: 220%; background: conic-gradient(from 0deg, transparent 0 10deg, rgba(255,255,255,0.10) 10deg 20deg, transparent 20deg 30deg, rgba(255,255,255,0.10) 30deg 40deg); animation: lcRay 820ms linear forwards; opacity: 0; }
@keyframes lcRay {
  0%, 38% { opacity: 0; transform: rotate(0deg) scale(0.4); }
  52% { opacity: 0.8; }
  100% { opacity: 0; transform: rotate(120deg) scale(1.2); }
}
/* Reduced-motion : la transition de thème devient un simple fondu court —
   pas de flash plein écran, pas de rayons, pas de spin ni de tilt 3D
   (photosensibilité / troubles vestibulaires). Sans risque côté JS :
   Chrome.jsx pilote toute la séquence au setTimeout, aucun animationend. */
@keyframes lcThemeFade { 0% { opacity: 0; } 26% { opacity: 1; } 54% { opacity: 1; } 100% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  #lc-theme-fx .wipe { animation: lcThemeFade 820ms ease forwards !important; clip-path: none !important; }
  #lc-theme-fx .ball { animation: lcThemeFade 820ms ease forwards !important; }
  #lc-theme-fx .flash { animation: none !important; opacity: 0 !important; }
  #lc-theme-fx .ray { animation: none !important; opacity: 0 !important; }
  #root.lc-3d { animation: none !important; transform: none !important; }
}

/* ---- Add-to-cart bump ---- */
@keyframes lcBump { 0% { transform: scale(1); } 30% { transform: scale(1.45); } 60% { transform: scale(0.88); } 100% { transform: scale(1); } }
@media (prefers-reduced-motion: no-preference) {
  .lc-bump { animation: lcBump 0.42s ease; }
}

/* utility-bar link hover */
.lc-util { transition: color 0.15s ease; }
.lc-util:hover { color: var(--yellow) !important; }

/* ---- Accessibility & polish ---- */
/* Anneau de focus à DEUX composantes pour rester visible sur TOUS les fonds :
   le bleu accent tient sur les surfaces claires (#3363A9 sur blanc = 4.5:1) mais
   s'efface sur le header/footer navy (~1.6:1, sous les 3:1 requis) ; le halo clair
   prend alors le relais (~5:1 sur navy, et sur le contenu foncé du thème sombre).
   Sur une surface claire le halo est invisible mais inoffensif. */
:focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; box-shadow: 0 0 0 5px rgba(255,255,255,0.55); }
:focus:not(:focus-visible) { outline: none; }
a, button { -webkit-tap-highlight-color: transparent; }
img { -webkit-user-drag: none; user-select: none; }
::selection { background: var(--accent); color: #fff; }
.lc-skip {
  position: fixed; left: 16px; top: -80px; z-index: 10000;
  background: var(--ink); color: var(--on-ink);
  padding: 12px 18px; border-radius: 10px;
  font-family: var(--font-body); font-weight: 700; font-size: 14px;
  box-shadow: var(--shadow-lg); text-decoration: none;
  border: 2px solid var(--yellow); transition: top 0.2s ease;
}
.lc-skip:focus { top: 16px; }

/* ---- Entrée de section au chargement (CSS pur — ne peut jamais rester caché :
   lcRise n'anime que transform, l'opacité reste à 1 ; si l'animation ne joue
   pas, l'élément garde simplement son état visible par défaut). Les .lc-reveal
   de l'accueil sont exclus : ils ont leur propre réveil au scroll ci-dessous,
   et le fill « both » de lcRise écraserait leur transform de transition. */
@keyframes lcRise { from { transform: translateY(22px); } to { transform: none; } }
@media (prefers-reduced-motion: no-preference) {
  main section:not(.lc-reveal) { animation: lcRise 0.55s cubic-bezier(0.2,0.8,0.2,1) both; }
}

/* ---- Réveils au scroll de l'accueil (.lc-reveal — classes posées par Home.jsx) ----
   Sécurité anti-« contenu bloqué invisible » : l'état caché n'existe que via
   .lc-reveal-init, ajoutée par le JS juste AVANT l'observation. Sans JS
   (noscript, robots), sans IntersectionObserver ou en reduced-motion, aucune
   règle ne cache quoi que ce soit. */
@media (prefers-reduced-motion: no-preference) {
  .lc-reveal.lc-reveal-init { opacity: 0; transform: translateY(14px); transition: opacity 0.45s ease, transform 0.45s cubic-bezier(0.2,0.8,0.2,1); }
  .lc-reveal.lc-reveal-init.in { opacity: 1; transform: none; }
}
/* Garde-fou hors media query : une fois révélé, toujours visible. */
.lc-reveal.in { opacity: 1; transform: none; }
/* ---- Hero ken-burns drift ---- */
@keyframes lcKenburns { 0% { transform: scale(1) translate3d(0,0,0); } 100% { transform: scale(1.09) translate3d(-1.4%,-1%,0); } }
/* ---- Pokéball hover spin ---- */
.lc-pb > svg { transition: transform 0.7s cubic-bezier(0.2,0.8,0.2,1); }
.lc-pb:hover > svg { transform: rotate(360deg); }
/* ---- Reassurance hover highlight ---- */
.lc-reassure { padding: 10px 16px; border-radius: 12px; transition: background 0.2s ease, transform 0.2s ease; cursor: default; }
.lc-reassure:hover { background: rgba(51,99,169,0.10); transform: translateY(-1px); }
.lc-reassure-ic { transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease; }
.lc-reassure:hover .lc-reassure-ic { background: var(--accent); color: #fff !important; border-color: var(--accent) !important; }
/* ---- Nav bar hover highlight ---- */
.lc-nav-link { transition: background 0.18s ease, color 0.18s ease, border-color 0.18s ease; border-radius: 6px 6px 0 0; }
.lc-nav-link:hover { background: rgba(255,255,255,0.09); color: #fff !important; border-color: rgba(255,203,5,0.55) !important; }
/* ---- Footer link + social hover ---- */
.lc-foot-link { transition: color 0.16s ease, border-color 0.16s ease, background 0.16s ease; }
.lc-foot-link:hover { color: #fff !important; border-color: rgba(255,255,255,0.5) !important; }
.lc-social { width: 36px; height: 36px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; color: rgba(255,255,255,0.7); border: 1px solid rgba(255,255,255,0.18); transition: all 0.18s ease; }
.lc-social:hover { color: #fff; background: var(--accent); border-color: var(--accent); transform: translateY(-2px); }

/* ============================================
   RESPONSIVE — desktop étroit, tablette & téléphone
   Surcharge les grilles inline (d'où !important).
   Paliers : 1060 (la nav ne tient plus) · 980 (2 colonnes → 1)
             · 680 (téléphone) · 460 (petit téléphone)
============================================ */

/* ---- 1060px : la barre de navigation (8 onglets en whiteSpace:nowrap, ~985px
   + 48px de gouttières) ne rentre plus dans .container-wide. Les onglets ne
   peuvent pas rétrécir sous leur min-content : sans conteneur de défilement la
   barre poussait le document et provoquait un débordement horizontal de
   ~185px sur TOUTES les pages entre 681 et 1060px (iPad portrait compris).
   Le méga-panneau est en position:absolute rattaché au <nav> (parent relatif) :
   il échappe à ce conteneur de défilement et reste pleine largeur. */
@media (max-width: 1060px) {
  .lc-nav-scroll {
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .lc-nav-scroll::-webkit-scrollbar { display: none; }
  /* Méga-menu « Autres jeux » : 5 tuiles côte à côte deviennent illisibles. */
  .lc-mega-games { grid-template-columns: repeat(3, 1fr) !important; }
}

@media (max-width: 980px) {
  .lc-foot-grid { grid-template-columns: 1fr 1fr !important; gap: 34px !important; }
  .lc-prod-grid, .lc-cart-grid, .lc-checkout-grid, .lc-shop-grid { grid-template-columns: 1fr !important; gap: 28px !important; }
  .lc-prod-gallery { position: static !important; }
  /* Tuiles d'accueil (5 et 4 colonnes) et grilles « dans le même rayon » /
     « vus récemment » (4 colonnes) : sous 980px chaque tuile tombe à ~150px et
     la ligne de titre ne tient plus. Trois colonnes est le palier lisible. */
  .lc-cat-tiles { grid-template-columns: repeat(3, 1fr) !important; }
  .lc-grid-auto { grid-template-columns: repeat(3, 1fr) !important; }
}
/* Recherche mobile : masquée sur grand écran, affichée sous l'en-tête sur mobile */
.lc-search-mobile { display: none; }
/* Barre d'achat sticky mobile (fiche produit — markup posé par Product.jsx) :
   masquée par défaut, activée uniquement dans la media query mobile ci-dessous. */
.lc-sticky-cta { display: none; }

@media (max-width: 680px) {
  .container, .container-wide { padding-left: 16px !important; padding-right: 16px !important; }
  .lc-search { display: none !important; }
  .lc-search-mobile { display: block !important; }
  .lc-ann-side { display: none !important; }
  .lc-ann { justify-content: center !important; }
  /* .lc-nav-scroll : le défilement horizontal est désormais posé dès 1060px
     (voir plus haut) — inutile de le redéclarer ici. */
  .lc-foot-grid { grid-template-columns: 1fr !important; gap: 26px !important; }
  /* Gages du footer : en colonne, alignés à gauche sur le bord des colonnes du footer */
  .lc-foot-reassure { flex-direction: column; justify-content: flex-start !important; align-items: flex-start; gap: 14px !important; }
  .lc-foot-reassure .lc-reassure { padding-left: 0; padding-right: 0; }
  .lc-cat-tiles { grid-template-columns: 1fr 1fr !important; }
  .lc-set-tiles { grid-template-columns: repeat(3, 1fr) !important; }
  .lc-grid-auto { grid-template-columns: 1fr 1fr !important; gap: 12px !important; }
  .lc-addr-grid { grid-template-columns: 1fr !important; }
  .lc-foot-legal { justify-content: flex-start !important; }
  .block { padding-top: 48px !important; padding-bottom: 48px !important; }
  /* Toolbar catalogue : le header mobile est plus haut (recherche ajoutée) que
     le top:124 inline calé sur le desktop → non-sticky, solution la plus fiable. */
  .lc-cat-toolbar { position: static !important; }
  /* Méga-menu : colonnes empilées, liens qui replient, rail masqué, panneau scrollable. */
  .lc-mega-panel { max-height: 70vh; overflow-y: auto; }
  .lc-mega-cols { flex-direction: column !important; gap: 18px !important; padding: 18px 16px !important; }
  .lc-mega-cols a { white-space: normal !important; }
  .lc-mega-rail { display: none !important; }
  .lc-mega-games { grid-template-columns: 1fr 1fr !important; gap: 10px !important; padding: 16px !important; }
  /* ---- Cibles tactiles (WCAG 2.5.8 : 24px minimum ; on vise 40px au doigt) ----
     Les tailles viennent d'inline styles calés sur la souris, d'où !important. */
  .lc-cat-toolbar button, .lc-cat-toolbar select { min-height: 40px; }
  .lc-foot-link { padding: 6px 0; }              /* 22px de haut → 34px cliquables */
  .lc-card-fav { width: 40px !important; height: 40px !important; }
  .lc-line-remove { width: 40px !important; height: 40px !important; }
  /* Flèches du carrousel de rayon : au doigt on fait défiler, elles ne servent
     qu'à voler de la place (et poussaient l'en-tête hors écran sous 340px). */
  .lc-row-nav { display: none !important; }
  /* iOS Safari zoome automatiquement à la mise au point sur tout champ dont le
     texte fait moins de 16px — le tunnel de commande sautait à chaque champ. */
  input:not([type="checkbox"]):not([type="radio"]), select, textarea { font-size: 16px !important; }
  /* Barre d'achat sticky (fiche produit) : z-index 80 → au-dessus du contenu et
     du header (50), SOUS le tiroir panier (100), les modales (120) et le zoom
     photo (200). Le padding du contenu (10px 14px) est déjà porté en inline par
     Product.jsx → ici uniquement le conteneur + la zone sûre iOS (encoche). */
  .lc-sticky-cta {
    display: flex;
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 80;
    /* visibility retardée par la transition : la barre masquée sort AUSSI de
       l'ordre de tabulation et de l'arbre d'accessibilité (pas de CTA fantôme). */
    visibility: hidden;
    background: var(--card);
    border-top: 1.5px solid var(--line);
    padding: 0 0 env(safe-area-inset-bottom);
    box-shadow: var(--shadow-lg);
    transform: translateY(110%);
    transition: transform 0.28s cubic-bezier(0.2,0.8,0.2,1), visibility 0.28s;
  }
  .lc-sticky-cta > * { flex: 1 1 auto; min-width: 0; }
  .lc-sticky-cta.on { transform: translateY(0); visibility: visible; }
}
@media (max-width: 680px) and (prefers-reduced-motion: reduce) {
  /* Reduced-motion : la barre apparaît/disparaît sans glissement. */
  .lc-sticky-cta { transition: none; }
}
/* Paires de champs du tunnel de commande (Nom/E-mail, CP/Ville, Exp./CVC) :
   dans la modale (largeur utile ~228px à 320px d'écran) deux colonnes laissent
   ~108px par champ — on repasse en pleine largeur. */
@media (max-width: 480px) {
  .lc-field-pair { grid-template-columns: 1fr !important; }
}
@media (max-width: 460px) {
  .lc-cat-tiles { grid-template-columns: 1fr !important; }
  .lc-grid-auto { grid-template-columns: 1fr 1fr !important; gap: 10px !important; }
}

/* ============================================
   MOTION — entrées & micro-interactions
   (gros bloc gardé sous prefers-reduced-motion: no-preference,
    sauf l'ombre d'en-tête qui n'est pas un mouvement)
============================================ */
header { transition: box-shadow 0.28s ease; }
body.lc-scrolled header { box-shadow: 0 8px 30px rgba(0,0,0,0.14); }

@media (prefers-reduced-motion: no-preference) {
  /* Dérive ken-burns du hero (keyframes lcKenburns plus haut) — appliquée ici
     uniquement, pour que l'image reste posée sous reduced-motion. */
  .lc-hero-kenburns { animation: lcKenburns 22s ease-in-out infinite alternate; }

  /* Apparition fade-up échelonnée des cartes produit.
     fill-mode "backwards" → aucun transform résiduel, le survol reste intact. */
  @keyframes lcCardIn { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: none; } }
  .lc-card { animation: lcCardIn 0.5s cubic-bezier(0.2,0.8,0.2,1) backwards; }
  .lc-card:nth-child(1){animation-delay:.03s}
  .lc-card:nth-child(2){animation-delay:.07s}
  .lc-card:nth-child(3){animation-delay:.11s}
  .lc-card:nth-child(4){animation-delay:.15s}
  .lc-card:nth-child(5){animation-delay:.19s}
  .lc-card:nth-child(6){animation-delay:.23s}
  .lc-card:nth-child(7){animation-delay:.27s}
  .lc-card:nth-child(8){animation-delay:.31s}
  .lc-card:nth-child(n+9){animation-delay:.35s}

  /* Entrée séquencée du contenu du hero */
  .lc-hero-in > * { animation: lcCardIn 0.6s cubic-bezier(0.2,0.8,0.2,1) backwards; }
  .lc-hero-in > *:nth-child(1){animation-delay:.05s}
  .lc-hero-in > *:nth-child(2){animation-delay:.14s}
  .lc-hero-in > *:nth-child(3){animation-delay:.23s}
  .lc-hero-in > *:nth-child(4){animation-delay:.32s}

  /* Célébration à la confirmation de commande (pop + onde) */
  @keyframes lcPop { 0% { transform: scale(0); opacity: 0; } 60% { transform: scale(1.15); } 100% { transform: scale(1); opacity: 1; } }
  @keyframes lcRing { 0% { transform: scale(0.6); opacity: 0.55; } 100% { transform: scale(2.3); opacity: 0; } }
  .lc-confirm-ic { animation: lcPop 0.5s cubic-bezier(0.34,1.56,0.64,1) both; position: relative; }
  .lc-confirm-ic::after { content: ''; position: absolute; inset: 0; border-radius: 50%; border: 2px solid var(--green); animation: lcRing 0.9s ease-out 0.2s both; pointer-events: none; }

  /* Petit zoom doux des cartes au survol (image déjà gérée en inline) */
  .lc-card { will-change: transform; }
}

/* ============================================
   VIEW TRANSITIONS entre pages (cross-document)
   Pur CSS, zéro JS. Chrome 126+ / Safari 18.2+ :
   fondu doux entre les pages du site (même origine).
   Navigateurs non compatibles : règle ignorée,
   navigation classique (fallback naturel).
============================================ */
/* @view-transition au niveau racine : son imbrication sous @media est encore
   inégale selon les versions de navigateurs. Le reduced-motion est donc géré
   juste en dessous en neutralisant les animations des pseudo-éléments
   ::view-transition-* → la transition se termine instantanément (aucun fondu). */
@view-transition { navigation: auto; }
@media (prefers-reduced-motion: no-preference) {
  ::view-transition-old(root), ::view-transition-new(root) { animation-duration: 0.22s; }
}
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*), ::view-transition-image-pair(*),
  ::view-transition-old(*), ::view-transition-new(*) { animation: none !important; }
}

/* ============================================================================
   SOCLE PREMIUM — micro-interactions & traitements « maison de collectionneurs »
   Contrat partagé (utilisé par les agents produit / panier / catalogue).
   Les NOMS de classes et de tokens sont figés : ne pas les renommer.

   Principe de sécurité motion :
   - L'état de REPOS de chaque classe est toujours visible et complet.
   - Les seules ANIMATIONS (keyframes qui jouent d'elles-mêmes) sont déclarées
     sous @media (prefers-reduced-motion: no-preference).
   - Les transitions au survol/clic sont conservées mais neutralisées au besoin
     pour l'enfoncement (.lc-press) via une garde reduce dédiée.
   Tokens motion : --dur-fast/normal/slow, --ease-out/spring/smooth (tokens/spacing.css).
============================================================================ */

/* ---- 1. Enfoncement au clic — CTA primaires (ajout panier, payer, steppers) ----
   transition permanente (retour élastique), l'enfoncement lui-même est retiré
   sous reduced-motion pour éviter tout micro-mouvement. */
.lc-press { transition: transform var(--dur-fast) var(--ease-spring); }
.lc-press:active { transform: scale(0.96); }
@media (prefers-reduced-motion: reduce) {
  .lc-press { transition: none; }
  .lc-press:active { transform: none; }
}

/* ---- 2. Micro-pop du favori — rejoué via key/état à chaque « ajout » ----
   Ne joue que sous no-preference ; sinon le cœur reste simplement posé. */
@keyframes lcFavPop {
  0%   { transform: scale(1); }
  35%  { transform: scale(1.35); }
  70%  { transform: scale(0.9); }
  100% { transform: scale(1); }
}
@media (prefers-reduced-motion: no-preference) {
  .lc-fav-pop { animation: lcFavPop 0.4s var(--ease-spring); }
}

/* ---- 3. Survol des tuiles cliquables — lift + ombre + bordure accent ----
   transform/box-shadow/border-color uniquement (compositor-friendly). */
.lc-tile {
  transition:
    transform var(--dur-normal) var(--ease-out),
    box-shadow var(--dur-normal) var(--ease-out),
    border-color var(--dur-normal) var(--ease-out);
}
.lc-tile:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-lg);
  border-color: var(--accent);
}
@media (prefers-reduced-motion: reduce) {
  .lc-tile { transition: box-shadow var(--dur-normal) var(--ease-out), border-color var(--dur-normal) var(--ease-out); }
  .lc-tile:hover { transform: none; }
}
/* Dark : highlight de bord haut → la tuile « décolle » du fond navy même à plat. */
[data-theme="dark"] .lc-tile {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05), var(--shadow-sm);
}
[data-theme="dark"] .lc-tile:hover {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), var(--shadow-lg);
}

/* ---- 4. Carte gradée — traitement « slab » doré (bordure + ombre dorées) ----
   L'or code la rareté. Ombre chaude douce + fine bordure or foncé. */
.lc-graded {
  border: 1.5px solid var(--yellow-deep);
  box-shadow:
    0 0 0 1px rgba(224, 174, 0, 0.18),
    0 10px 30px rgba(224, 174, 0, 0.20);
}
[data-theme="dark"] .lc-graded {
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.06),
    0 0 0 1px rgba(255, 203, 5, 0.22),
    0 12px 34px rgba(255, 203, 5, 0.16);
}

/* ---- 5. Stage lux — halo doré radial derrière l'image d'une carte gradée ----
   background-image seul → n'écrase jamais un background (couleur) posé en inline.
   position:relative attendu sur le stage côté consommateur. */
.lc-stage-lux {
  background-image:
    radial-gradient(120% 90% at 50% 12%, rgba(255, 203, 5, 0.22) 0%, rgba(255, 203, 5, 0.08) 34%, transparent 66%);
}
[data-theme="dark"] .lc-stage-lux {
  background-image:
    radial-gradient(120% 90% at 50% 12%, rgba(255, 214, 51, 0.20) 0%, rgba(255, 214, 51, 0.06) 36%, transparent 68%);
}

/* ---- 6. Pop de célébration + balayage clair « livraison offerte » ----
   .lc-pop : entrée scale (✓ offert, pastille d'étape).
   .lc-shimmer : un seul balayage gauche→droite sur la barre livraison offerte. */
@keyframes lcCelebPop {
  0%   { transform: scale(0); opacity: 0; }
  60%  { transform: scale(1.15); opacity: 1; }
  100% { transform: scale(1); opacity: 1; }
}
@keyframes lcShimmer {
  0%   { transform: translateX(-120%); }
  100% { transform: translateX(120%); }
}
@media (prefers-reduced-motion: no-preference) {
  .lc-pop { animation: lcCelebPop 0.5s var(--ease-spring) both; }
  /* .lc-shimmer : conteneur relatif + overflow:hidden côté consommateur ;
     le pseudo balaie une bande claire diagonale une seule fois. */
  .lc-shimmer { position: relative; overflow: hidden; }
  .lc-shimmer::after {
    content: '';
    position: absolute; inset: 0;
    background: linear-gradient(105deg, transparent 30%, rgba(255, 255, 255, 0.55) 50%, transparent 70%);
    transform: translateX(-120%);
    animation: lcShimmer 1.1s var(--ease-smooth) 0.15s 1;
    pointer-events: none;
  }
}

/* ---- 7. Entrée fade-up d'une ligne (panier) — animationDelay posé inline par index ----
   Anim déclarée UNIQUEMENT sous no-preference. Sans JS / sans no-preference,
   la ligne garde son état de repos visible (aucun état caché hors media query). */
@keyframes lcLineIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: no-preference) {
  .lc-line-in { animation: lcLineIn 0.45s var(--ease-out) backwards; }
}

/* ---- 8. Profondeur dark mode — highlight de bord aux cartes existantes ----
   L'élévation se lit sans dépendre uniquement de la hairline : fin liseré clair
   en haut, cumulé à l'ombre existante. Exclut les cartes gradées, qui gardent
   leur ombre dorée (sinon cette règle, plus tardive, l'écraserait en dark). */
[data-theme="dark"] .lc-card:not(.lc-graded) {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.045), var(--shadow-sm);
}

/* ---- 9. Filet or utilitaire — eyebrows / kickers premium ---- */
.lc-gold-rule {
  height: 2px;
  width: 34px;
  background: var(--yellow-deep);
  border-radius: 2px;
}
