/** Shopify CDN: Minification failed

Line 2245:28 Unexpected "("

**/
/* Speedfly License — Premium features control */
[data-speedfly-status="inactive"] .speedfly-premium {
  display: none !important;
}

[data-speedfly-status="inactive"] .speedfly-premium-blur {
  filter: blur(5px);
  pointer-events: none;
  user-select: none;
}

/* ==========================================
   TITRES PRODUIT — Système 2 lignes
   Ligne 1 : contexte (medium 500, plus petit)
   Ligne 2 : nom produit (extrabold 800, plus grand)
   Police : Plus Jakarta Sans
   ========================================== */

/* Page produit */
.first-line-title { font-weight: 500; text-transform: capitalize; font-size: 20px; display: block; color: #555; }
.second-line-title { font-weight: 800; text-transform: capitalize; font-size: 28px; letter-spacing: -0.015em; }

/* Grille collection + accueil */
.first-line-title-grid { font-weight: 500; text-transform: capitalize; font-size: 16px; display: block; color: #555; }
.second-line-title-grid { font-weight: 800; text-transform: capitalize; font-size: 20px; letter-spacing: -0.01em; }

/* Section produit featured */
.first-line-title-featured { font-weight: 500; text-transform: capitalize; font-size: 18px; display: block; color: #555; }
.second-line-title-featured { font-weight: 800; text-transform: capitalize; font-size: 20px; letter-spacing: -0.01em; }

/* Produits associés (blogs) */
.first-line-title-associated { font-weight: 500; text-transform: capitalize; font-size: 18px; display: block; color: #555; }
.second-line-title-associated { font-weight: 800; text-transform: capitalize; font-size: 24px; letter-spacing: -0.01em; }

/* Produits recommandés (page produit + blog) */
.first-line-title-related { font-weight: 500; text-transform: capitalize; font-size: 16px; display: block; color: #555; }
.second-line-title-related { font-weight: 800; text-transform: capitalize; font-size: 18px; letter-spacing: -0.01em; }

/* Mobile */
@media screen and (max-width: 767px) {
  .first-line-title { font-size: 18px; }
  .second-line-title { font-size: 26px; }

  .first-line-title-grid { font-size: 15px; }
  .second-line-title-grid { font-size: 19px; }

  .first-line-title-featured { font-size: 16px; }
  .second-line-title-featured { font-size: 18px; }

  .first-line-title-associated { font-size: 16px; }
  .second-line-title-associated { font-size: 22px; }

  .first-line-title-related { font-size: 14px; }
  .second-line-title-related { font-size: 16px; }

  /* Centrer titre + prix sur mobile */
  .block-title.block-block-title { text-align: center; }
  .product-meta li { justify-content: center; }
}

/* ==========================================================================
   HOLOGRABME — DIRECTION LO-FI
   Typo + effets visuels uniquement.
   ⚠️ AUCUNE couleur hardcodée ici — les couleurs sont gérées via :
   Theme Editor → Couleurs → Génériques + Boutons + Footer.
   Seules les opacités du halo (rgba) sont fixées car non exposées en setting.
   ========================================================================== */

/* --- Imports Google Fonts (DEAD CODE — vérifié cross-model 2026-05-16) ----
   Cet @import était ignoré par les browsers (CSS spec : @import doit précéder
   toute autre règle, or il vient après les rules Speedfly lignes 1-67). Fraunces
   est désormais chargée via <link> dans layout/theme.liquid. Inter est chargée
   par le thème Speedfly. Si Zen Maru/JetBrains/Caveat sont nécessaires ailleurs,
   les déclarer via <link> dans theme.liquid (PAS via @import ici).
   --------------------------------------------------------------------------- */

/* --- Tokens Lo-fi (point unique de vérité — palette + typos) ------------
   Tous les snippets custom (top-trust-bar, delivery-badge, wib-claude,
   collection-reassurance, lf-* helpers) référencent ces variables.
   → Pour changer la palette globale, modifier UNIQUEMENT ces lignes.
   Les rgb space-separated (--lf-*-rgb) permettent d'utiliser une teinte
   avec n'importe quelle alpha via rgb(var(--lf-*-rgb) / 0.XX). */
:root {
  /* Couleurs */
  --lf-accent: #b884d6;
  --lf-accent-rgb: 184 132 214;
  --lf-accent-hover: #a570c8;
  --lf-accent-ink: #161226;
  --lf-bg-deep: #161226;
  --lf-bg-surface: #1f1838;
  --lf-text-warm: #f3eedb;
  --lf-text-warm-rgb: 243 238 219;
  --lf-text-muted: #b8b0c8;
  --lf-text-dim: #6e6688;
  --lf-border-subtle: rgb(var(--lf-text-warm-rgb) / 0.08);
  --lf-border-strong: rgb(var(--lf-text-warm-rgb) / 0.16);

  /* Typos — 2026-06-01 (Killian) : General Sans (Fontshare) remplace Inter PARTOUT (corps/UI/nav/boutons). Inter reste fallback. */
  --font-display-lofi: 'Fraunces', Georgia, serif;
  --font-body-lofi: 'General Sans', 'Inter', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
  /* Surcharge des stacks Speedfly (css-variables.liquid charge AVANT surcharge.css L156 → ceci gagne) : body + nav + boutons en General Sans */
  --bodyFontStack: 'General Sans', 'Inter', sans-serif;
  --accentFontStack: 'General Sans', 'Inter', sans-serif;
  /* Tokens mono/jp/script (JetBrains Mono / Zen Maru / Caveat) retirés 2026-06-04 :
     webfonts non chargées + 0 usage (thème + 34 articles + 18 pages). Refonte = 2 polices. */
}

/* --- Titres en Fraunces italic ----------------------------------------- */
.h1.title-primary,
.second-line-title,
.second-line-title-grid,
.second-line-title-featured,
.second-line-title-associated,
.second-line-title-related {
  font-family: var(--font-display-lofi);
  font-style: italic;
  font-weight: 600;
  letter-spacing: -0.01em;
  text-transform: none;
}

/* Ligne 1 (contexte produit) en Inter — 2026-05-31 (Killian) : Zen Maru retirée → DA 2 polices Fraunces+Inter */
.first-line-title,
.first-line-title-grid,
.first-line-title-featured,
.first-line-title-associated,
.first-line-title-related {
  font-family: var(--font-body-lofi);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* Section headings + H2/H3 éditoriaux */
.section-title,
section h2.section-heading,
.product-template-tabs-content h2 {
  font-family: var(--font-display-lofi);
  font-style: italic;
  font-weight: 500;
}

/* --- Prix : chiffres alignés, police de corps (D14 — General Sans, plus de mono) --- */
[id^="ProductPrice"],
[id^="comparePrice"],
.product-meta-info .price,
.sale-tag {
  font-family: var(--font-body-lofi);
  font-feature-settings: "tnum" on, "lnum" on;
  letter-spacing: -0.01em;
}

/* --- B1 (2026-05-29) — Prix PDP lisible sur fond sombre ----------------
   La couleur du prix vient du setting Theme Editor --colorPrice (#333 par
   défaut) → contraste 1,27 sur le deep purple #161226 = quasi invisible.
   On force le cream Lo-fi. Même sélecteur que theme.css (.product-meta .h1),
   surcharge.css chargé après → override propre, sans !important. */
.product-meta .h1 {
  color: var(--lf-text-warm);
  font-family: var(--font-body-lofi); /* D14 (2026-05-31) — prix PDP en Inter (unifié avec cards/ATC/sticky), plus Fraunces */
  font-size: 18px; /* réduit de 21px → 18px (Inter paraissait trop gros), aligné sur le prix du bouton ATC */
}

/* --- B2 (2026-05-31) — Prix lisible sur les cards (collection + cross-sell) -
   Le prix des cards (.product-item--sale-price) était gris peu lisible sur le
   fond sombre (même souci que le prix PDP avant le fix). On le passe en cream.
   Scopé .product-grid-item (cards) ; le prix PDP reste géré par .product-meta .h1. */
.product-grid-item .product-item--sale-price {
  color: var(--lf-text-warm);
}

/* --- B1 2b (2026-05-29) — Avis inline + prix sur une même ligne (PDP) ----
   rating-inline est rendu comme 1er <li> de .product-meta, le prix suit.
   .product-meta passe en flex row centré pour aligner avis + prix sur une
   ligne. Séparateur vertical avant le prix. Avis sans pill ni avatars (cadre 1,
   le pill imitait les pills de variantes = anti-pattern). */
.product-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 4px 8px;
}
.product-meta > li { margin: 0; }
.product-meta > li:empty { display: none; }

.rating-inline {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  line-height: 1;
}
.rating-inline__stars { display: inline-flex; align-items: center; gap: 1px; }
.rating-inline__stars svg { width: 11px; height: 11px; }
.rating-inline__score { font-weight: 700; font-size: 12px; color: var(--lf-text-warm); }
.rating-inline__sep { color: var(--lf-text-dim); }
.rating-inline__count { font-size: 11px; color: var(--lf-text-muted); white-space: nowrap; }

/* séparateur vertical avant le prix quand l'avis le précède */
.product-meta--rating + li {
  padding-left: 12px;
  border-left: 1px solid var(--lf-border-strong);
}

/* --- Badge promo « -13% » (2026-06-09) — pilule DA Lo-fi collée au prix (cf Boku) ----
   Le % (.price-saving-percent, injecté par Speedfly dans .sale-tag) était en style brut
   + écarté du prix par le gap flex. On le passe en pilule plum/deep, resserré au prix.
   Killian 2026-06-09 : choix « -13% » (pas « Économisez 5€ », masqué via show-saved-amount-false). */
.sale-tag.large .price-saving-percent {
  display: inline-block;
  background: var(--lf-accent);
  color: var(--lf-bg-deep);
  font-family: var(--font-body-lofi);
  font-weight: 700;
  font-size: 12px;
  line-height: 1;
  padding: 4px 7px;
  border-radius: 6px;
  letter-spacing: 0;
  vertical-align: middle;
}
.sale-tag.large .price-saving-percent .parentheses { display: none; }
/* masque le <li> « prix unitaire » fantôme : le wrapper .product-price-unit est rendu
   même sans prix au litre/kg → le <li> n'est jamais :empty (whitespace du template) →
   il s'intercalait entre prix et badge en bouffant 2 gaps flex. Les lampes n'ont pas de
   prix unitaire → on masque le li quand .product-price-unit n'est pas --available. */
.product-meta > li:has(.product-price-unit:not(.product-price-unit--available)) { display: none; }
/* rapproche le badge du prix (entre-deux : ni collé ni écarté) — annule une partie du
   gap flex + le whitespace résiduel de la .h1. Killian 2026-06-09 (viser ~17px). */
.product-meta li.show-saved-percent-true { margin-left: -8px; }

/* Mobile : tout sur UNE ligne (note + prix + badge « -13% » à droite, comme sur desktop).
   À 390px l'espace dispo (~338px) est juste trop court (note+prix+badge ≈ 388px) → on
   compacte étoiles / gaps / badge pour faire tenir le -13% à droite sans retour à la ligne.
   Killian VEUT le -13% visible sur mobile. 2026-06-09. */
@media (max-width: 749px) {
  .product-meta { gap: 4px 5px; }
  .product-meta--rating + li { padding-left: 6px; }
  .rating-inline { gap: 4px; }
  .rating-inline__stars { gap: 0; }
  .rating-inline__stars svg { width: 8px; height: 8px; }
  .rating-inline__score { font-size: 11px; }
  .rating-inline__count { font-size: 10px; }
  .sale-tag.large .price-saving-percent { font-size: 10px; padding: 3px 5px; }
  .product-meta li.show-saved-percent-true { margin-left: -5px; }
  .product-meta .h1 { font-size: 16px; } /* -2px pour faire tenir prix + badge même sur 360px */
}

/* --- Prix barré (compare-at) dans le bouton ATC principal + le sticky (2026-06-09) ------
   Affiche « Ajouter au panier · 39,90 (barré) 34,90 € » : le compare-at barré + atténué,
   puis le prix réel. Couleur héritée du bouton (texte deep sur plum), on baisse l'opacité. */
.atc-compare, .lf-cta-compare {
  text-decoration: line-through;
  opacity: 0.5;
  font-weight: 500;
  margin-right: 3px;
}
/* D-20 (2026-06-10, RÉVISÉ — Killian veut GARDER le prix barré dans le bouton, mobile inclus)
   Le wrap sur 2 lignes venait du libellé « Ajouter au panier » qui se coupait entre les mots
   quand le barré l'a rallongé. Fix SANS rien retirer : on empêche la coupure du libellé
   (white-space:nowrap) + on compacte un poil (gap + taille prix) → « Ajouter au panier ·
   39,90€ 34,90€ » tient sur UNE ligne, barré conservé. */
@media (max-width: 767px) {
  .btn-atc--with-price { gap: 5px; }
  .btn-atc--with-price [class*="addToCartText"] { white-space: nowrap; }
  .btn-atc--with-price .atc-price,
  .btn-atc--with-price .atc-compare { font-size: 0.92em; }
}

/* --- Panier (page + à venir mini-cart) : prix barré atténué AVANT le prix réel (style Boku)
   + pastille « Vous économisez X€ » plum cohérente avec le badge -13%. 2026-06-10. */
.cart-item-3 .h5 s,
.cart-item .h5 s {
  opacity: 0.5;
  font-weight: 500;
  margin-right: 6px;
  font-size: 0.82em;
}
.lf-cart-savings {
  display: inline-block;
  margin-top: 5px;
  color: var(--lf-bg-deep);
  background: var(--lf-accent);
  font-weight: 700;
  font-size: 12px;
  padding: 3px 8px;
  border-radius: 6px;
}
/* Mini-cart (drawer = fond CREAM) : prix barré compare-at injecté en JS, avant le prix réel.
   ⚠️ La règle D-19 `s .money` force cream 0.5 !important (pensée pour la PDP SOMBRE) → sur le
   drawer cream les chiffres deviennent invisibles (cream/cream), on ne voyait que le trait.
   On force le compare en DEEP (lisible sur cream), atténué via opacity. */
.mini-cart-compare { opacity: 0.5; font-weight: 500; margin-right: 5px; font-size: 0.85em; color: var(--lf-bg-deep); }
.mini-cart-compare s { text-decoration: line-through; }
.mini-cart-compare s .money { color: var(--lf-bg-deep) !important; }
/* D-20b (2026-06-10) — FIX régression mobile drawer : le barré injecté AVANT le prix
   réel, en flux inline, élargissait .mini-cart__item-prices (colonne étroite, width:20%)
   → le couple « 39,90€ 34,90€ » débordait SOUS la croix de suppression (×). On empile
   le barré AU-DESSUS du prix réel (chacun sur sa ligne, la colonne reste étroite). */
.mini-cart-compare { display: block; margin-right: 0; line-height: 1.15; }
.mini-cart__item-prices { white-space: nowrap; }

/* Police Ryviu retiree 2026-06-22 (bascule Judge.me, plus de .r--* sur le site). */

/* --- B1 2b — pills variantes côte à côte (2 colonnes) sur la PDP ----------
   Défaut thème : chaque .swatch-element fait ~185px (min-width du label) → 2 ne
   tiennent pas dans les 345px → elles s'empilent. Fix robuste = CSS grid 2 col
   (1fr ≈ 168px chacune, "télécommande" rentre). min-width:0 casse le min-width
   du label. Scopé .form-primary (pas les cards collection). */
.form-primary .swatch .swatch-inner {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 8px;
  width: 100%;
}
.form-primary .swatch .swatch-element {
  margin: 0;
  min-width: 0;
  max-width: none;
}
.form-primary .swatch-element label {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  width: 100%;
  min-width: 0;
  box-sizing: border-box;
  white-space: normal;
  overflow: visible;
  line-height: 1.15;
  padding: 7px 10px;
  font-size: 12px;        /* compact : "Sans télécommande" tient sur 1 ligne */
  border-radius: 10px;
}

/* --- Halo lumineux sur la photo produit -------------------------------- */
/* Effet "lampe allumée" via overlay screen-blend.
   Opacités/positions fixées car non exposables en settings.
   La teinte ambre reste minoritaire ; si on veut la changer, c'est ici. */
.product-photo-container.frame {
  position: relative;
  overflow: hidden;
}

.product-photo-container.frame::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: radial-gradient(70% 55% at 50% 60%, rgb(var(--lf-accent-rgb) / 0.22), transparent 65%);
  mix-blend-mode: screen;
  opacity: 0.85;
  transition: opacity 0.3s ease;
}

.product-photo-container.frame:hover::after {
  opacity: 1;
}

/* --- Helpers utilitaires pour snippets custom à venir ------------------ */
/* Trust pills row (ligne d'icônes + texte sous le prix) */
.lf-trust-pills {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 16px 0;
  padding: 12px 16px;
  border: 1px solid currentColor;
  border-radius: 12px;
  font-size: 0.85rem;
  opacity: 0.85;
}

.lf-trust-pills > span {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

.lf-trust-pills > span + span::before {
  content: "·";
  margin-right: 4px;
  opacity: 0.4;
}

/* Utilitaires typo lf-stat / lf-caption / lf-jp / lf-mono RETIRÉS le 2026-06-04 :
   code mort (stats_row supprimé en Phase 1 ; classes inutilisées = 0 usage thème
   + 34 articles + 18 pages vérifiés API ; webfonts JetBrains/Zen Maru/Caveat jamais
   chargées). Refonte = 2 polices uniquement : Fraunces + General Sans. */

/* Card avec halo bas — réutilisable pour objections / variantes / cross-sell */
.lf-halo-card {
  position: relative;
  border: 1px solid var(--lf-border-subtle);
  border-radius: 12px;
  padding: 20px;
  overflow: hidden;
}

.lf-halo-card::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: radial-gradient(60% 50% at 50% 90%, var(--lf-card-halo, rgb(var(--lf-accent-rgb) / 0.12)), transparent 70%);
  mix-blend-mode: screen;
}

/* --- AMBIANCE LO-FI — halos diagonaux + grain SVG ----------------------
   Repris de Claude Design V3 (palette D Lo-fi 4am).
   Halo : violet top-left + orange bottom-right, screen blend, page entière.
   Grain : feTurbulence SVG en overlay blend, dosable via --lofi-grain.
   z-index bas pour ne JAMAIS passer au-dessus du header/modal/popups.
   -------------------------------------------------------------------- */
:root {
  --lofi-halo: 1;
  --lofi-grain: 1;
}

body::before {
  content: '';
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  background:
    radial-gradient(ellipse 55% 45% at 15% 5%, rgb(var(--lf-accent-rgb) / 0.28), transparent 60%),
    radial-gradient(ellipse 65% 50% at 95% 100%, rgba(244, 144, 108, 0.22), transparent 60%);
  mix-blend-mode: screen;
  opacity: var(--lofi-halo, 1);
  transition: opacity 0.3s ease;
}

body::after {
  content: '';
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='180' height='180'><filter id='n'><feTurbulence baseFrequency='1.2' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1  0 0 0 0 1  0 0 0 0 1  0 0 0 .9 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
  opacity: calc(0.14 * var(--lofi-grain, 1));
  mix-blend-mode: overlay;
  transition: opacity 0.3s ease;
}

/* --- D-15 (2026-06-09) — Télécommande INCLUSE 34,90 (batch 390 lampes 3D taggées 'tc-incluse').
   "Avec télécommande" passée à 34,90 + position 1 (défaut soumis) via API → les 2 variantes
   valent 34,90, le sélecteur Sans/Avec est redondant : on le masque. PAS de note buy-box : la
   bulle galerie .lf-tc-bubble "Télécommande 16 couleurs offerte · valeur 5€" le dit déjà
   (sinon doublon avec le bonus en haut, Killian 2026-06-09). Le form soumet le défaut (Avec). */
/* D-15b (2026-06-09) — cacher UNIQUEMENT l'option télécommande (label + swatches), garder
   les autres options (Nombre de personnes / Formes / Feutres sur les lampes perso multi-options).
   :has() cible le bloc swatch contenant .avec-telecommande + son label (container précédent). */
body.tc-incluse .swatch.variant-images:has(.avec-telecommande) { display: none !important; }
body.tc-incluse .cont-selector.swatch-container { display: none !important; }
/* D-15c (2026-06-09) URGENT — le STICKY rendait ses propres pills variantes (.lf-sticky-pills)
   → sur un produit tc-incluse on pouvait re-choisir « Sans télécommande » alors que le sélecteur
   de la fiche est masqué (D-15b). Même logique : on masque les pills du sticky. Le sticky soumet
   la variante par défaut (« Avec », 34,90). Le label reste masqué via .lf-sticky-d--has-pills. */
body.tc-incluse .sticky-atc .lf-sticky-pills { display: none !important; }

/* D-19 (2026-06-09) — prix barré (compare-at) LISIBLE : Speedfly le rend en #333, quasi
   invisible sur le fond sombre #161226. On le passe en cream atténué (PDP + cards). */
.product-meta s, .product-meta del,
.product-item--price s, .product-item--price del,
s .money, del .money { color: rgba(243, 238, 219, 0.5) !important; }

/* Avis = Judge.me depuis 2026-06-22. */

/* --- Top trust bar : cachée quand le header devient sticky (scroll) ------
   Speedfly ajoute .header-scroll-on sur .cont-header au scroll. La
   top-trust-bar (rating + pills) se cache au scroll → header sticky
   compact. Comportement matchant CD V3 (visible au repos, hidden au scroll).

   ⚠️ 2026-05-21 — on NE cache PLUS .topheader au scroll.
   Le bandeau .topheader (message statique "Livraison Offerte") est visible
   en mobile. Le masquer au scroll changeait la hauteur du header en plein
   scroll → désync avec le calage du header sticky → un rectangle sombre
   vide ("gros carré") apparaissait au scroll. Bug mobile-only : en desktop
   ≥768px .topheader est déjà display:none en permanence, donc aucune
   variation de hauteur, aucun bug. On garde donc le bandeau visible en
   continu (message Livraison Offerte permanent en mobile). Killian 2026-05-21.

   La trust-bar (section {% section 'top-trust-bar' %}) garde son hide au
   scroll : c'est un flex div propre, aucun glitch, et ça garde le header
   sticky compact en desktop. :has() cible la section depuis l'état sticky. */
body:has(.cont-header.header-scroll-on) .shopify-section--top-trust-bar {
  display: none;
}

/* --- Header transparent à scroll 0, opaque au scroll ---------------------
   ⚠️ REVERT COMPLET 2026-05-28 → état d'avant ce matin. Killian a dit "REVIENS
   COMME C'ÉTAIT AVANT QUE TU FASSES DE LA MERDE". Scope restauré
   body:not(.template-index) : la home garde son système header transparent
   natif Speedfly, les autres pages utilisent notre toggle .lf-header-solid.
   Éléments à fond #161226 ciblés : .cont-header (conteneur) + .nav-bar
   (le bloc menu — sinon il reste un rectangle noir en mode transparent).
   ────────────────────────────────────────────────────────────────────────── */
body:not(.template-index) .header-section .cont-header,
body:not(.template-index) .header-section .cont-header .nav-bar,
body:not(.template-index) .header-section .cont-header .header-grid__logo img {
  transition: background-color 280ms ease, filter 280ms ease;
}
body:not(.template-index) .header-section .cont-header:not(.lf-header-solid),
body:not(.template-index) .header-section .cont-header:not(.lf-header-solid) .nav-bar {
  background-color: transparent;
}
body:not(.template-index) .header-section .cont-header .header-grid__logo img {
  filter: none; /* logo Holograbme 9c déjà cream/plum — ne PAS inverser en blanc plat */
}
/* Logo 9c — forcer le ratio du PNG (1530x456) : neutralise les width/height attrs
   hérités de l'ancien logo (1200x300) pour éviter toute déformation. */
.header-grid__logo .logo-header,
.header-grid__logo .logo-header-transparent,
.mobile-link-logo img {
  aspect-ratio: 1530 / 456;
  height: auto;
  object-fit: contain;
}
body:not(.template-index) .header-section .cont-header.lf-header-solid,
body:not(.template-index) .header-section .cont-header.lf-header-solid .nav-bar {
  background-color: #161226;
}

/* --- Drawer mobile menu OPAQUE en permanence (2026-05-28 — fix v2)
   v1 spécificité (0,3,0) loose contre revert (0,5,0) qui force transparent →
   drawer restait transparent. v2 match la spécificité 5-classes + source order. */
@media (max-width: 767px) {
  body:not(.template-index) .header-section .cont-header:not(.lf-header-solid) .nav-bar,
  body:not(.template-index) .header-section .cont-header.lf-header-solid .nav-bar,
  body.template-index .header-section .cont-header .nav-bar {
    background-color: #161226;
  }
}

/* --- Top trust bar : forcer le wrapper Speedfly à prendre full width ----
   `.topheader__wrapper` est en `display: flex` sans `flex: 1` quand il n'y
   a pas de liens quick-access. Résultat : il shrinke à la taille intrinsèque
   du contenu et se centre. On force flex:1 pour qu'il occupe la largeur
   complète et que `space-between` (rating gauche / pills droite) fonctionne.
   Conservé en filet de sécurité si free-shipping bar ou quick-access
   sont réactivés depuis Theme Editor. */
.topheader .topheader__wrapper {
  flex: 1;
}

/* --- PDP sticky gallery -------------------------------------------------
   Galerie photo collée pendant le scroll des infos produit (desktop ≥1024px).
   3 préreqs critiques :
     1. `.wrapper1` a `overflow:hidden` dans theme.css → tue position:sticky
        sur tous ses descendants. On override `overflow:visible` UNIQUEMENT
        sur la PDP (clear:both inutile : .grid-content est en flex).
     2. La classe `.pdp-gallery-block` remplace l'inline style hérité
        (`flex:1 0 100%`) qui forçait la galerie en pleine largeur même
        dans un grid_open 50%.
     3. CRITIQUE : on laisse `.grid-content` au défaut flex `align-items: stretch`
        pour que les 2 colonnes (grid_open_1 et grid_open_2) aient la même
        hauteur. Sinon grid_open_1 (parent direct de la galerie) se limite
        à la hauteur intrinsèque de la galerie (~791px) et le sticky n'a
        pas de range. Avec stretch, grid_open_1 prend la hauteur de
        grid_open_2 (~5000px). La galerie reste en haut grâce à
        `align-self: flex-start`.

   Top offset = 90px (couvre la majorité des configs header Speedfly).
   Si le header change de hauteur via Theme Editor, le merchant peut
   override via la variable CSS `--pdp-sticky-top` dans :root.

   TOGGLE Theme Editor (block images → "Galerie sticky pendant le scroll") :
     • Activé (default) : ajoute la classe `.pdp-gallery-block--sticky`
     • Désactivé : la galerie défile normalement avec le reste
   Les overrides wrapper1 + margin-inline restent inconditionnels (pas d'effet
   visible si pas de sticky, juste un overflow:visible inoffensif). */
.section-product-single .wrapper1 {
  overflow: visible;
}
.pdp-gallery-block {
  margin-inline: auto;
}
@media screen and (min-width: 1024px) {
  /* Spécificité doublée (.pdp-gallery-block.pdp-gallery-block--sticky = 0,2,0) pour
     battre `.lf-bubble-anchor { position: relative }` (0,1,0, déclaré plus bas L~1697,
     ajouté en Phase 1 pour ancrer la bulle). Sans ce bump, `position:relative` gagnait
     par ordre source → sticky cassé ET `top:90px` poussait l'image 90px trop bas.
     Un élément sticky ancre tout aussi bien la bulle absolue. */
  .pdp-gallery-block.pdp-gallery-block--sticky {
    position: sticky;
    top: var(--pdp-sticky-top, 90px);
    align-self: flex-start;
  }
  /* Sticky OFF : on ne stretch PAS les colonnes — sinon grid_open_1 stretch
     à la hauteur de grid_open_2 (~5000px) et crée un grand espace vide sous
     la galerie. Avec :has() négatif, on cible le cas où il n'y a pas de
     .pdp-gallery-block--sticky dans .grid-content. */
  .section-product-single .grid-content:not(:has(.pdp-gallery-block--sticky)) {
    align-items: flex-start;
  }
}

/* --- PDP galerie refondue (Phase 2, Plan 02-03) -------------------------
   Port du CSS validé aux mockups (mobile carousel peek + dots, desktop vue
   éclatée). Tokens --lf-* uniquement, no !important, logical properties.
   ⚠️ overflow-x UNIQUEMENT sur .pdp-carousel (scroller interne) ; jamais sur
   .pdp-gallery-block (ancre de la bulle D-10, doit rester overflow visible),
   ni sur .pdp-gallery. Le bloc sticky desktop (variante A) ci-dessus = INTACT. */

/* A. CAROUSEL MOBILE — peek ~48px de l'image suivante (slide = 100% - inset, gap 8px).
   Killian (2026-06-05) : montrer PLUS de la photo d'après, cible entre Boku (peu) et Horace (bcp). */
.pdp-gallery {
  position: relative;
  --pdp-slide-inset: 56px; /* largeur retirée à chaque slide → peek = inset - gap(8) = 48px */
}
.pdp-carousel {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-padding-inline: 0;
  scroll-behavior: smooth;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.pdp-carousel::-webkit-scrollbar { display: none; }
.pdp-carousel__slide {
  flex: 0 0 calc(100% - var(--pdp-slide-inset));
  scroll-snap-align: start;
}
.pdp-carousel__slide img {
  display: block;
  inline-size: 100%;
  block-size: auto;
  aspect-ratio: 1;
  object-fit: cover;
  border-radius: 14px;
  background: var(--lf-bg-surface);
}
.pdp-single img {
  display: block;
  inline-size: 100%;
  block-size: auto;
  border-radius: 14px;
  background: var(--lf-bg-surface);
}

/* B. DOTS (D-02) — overlay EN BAS de l'image (comme Boku/Horace), pas sous l'image.
   Killian (2026-06-05) : les anciens dots #6e6688 sur fond sombre = invisibles.
   Fix : posés sur l'image (gain above-the-fold) + cream translucide + ombre portée
   (lisibles sur image claire OU sombre), dot actif plum. Hit-area ≥44px via ::after transparent.
   Centrés sur l'image active : le conteneur s'arrête à --pdp-slide-inset (largeur d'un slide). */
.pdp-dots {
  position: absolute;
  inset-block-end: 12px;
  inset-inline: 0 var(--pdp-slide-inset);
  z-index: 2;
  display: flex;
  justify-content: center;
  gap: 6px;
  list-style: none;
  margin: 0;
  padding: 0;
  pointer-events: none;          /* le swipe traverse, seuls les dots captent le tap */
}
.pdp-dots li { display: flex; pointer-events: auto; }
.pdp-dot {
  position: relative;
  inline-size: 9px;
  block-size: 9px;
  border-radius: 50%;
  border: none;
  background: rgb(var(--lf-text-warm-rgb) / 0.6);   /* cream translucide */
  box-shadow: 0 1px 3px rgb(0 0 0 / 0.5);           /* tient sur n'importe quelle image */
  padding: 0;
  cursor: pointer;
  transition: background-color 250ms ease, transform 250ms ease;
}
.pdp-dot::after {                /* hit-area transparente ~45px sans agrandir le point visuel */
  content: "";
  position: absolute;
  inset: -18px -10px;
}
.pdp-dot.is-active {
  background: var(--lf-accent);  /* plum #b884d6 */
  transform: scale(1.18);
}
.pdp-dot:focus-visible {
  outline: 2px solid var(--lf-accent);
  outline-offset: 3px;
}

/* C. VUE ÉCLATÉE DESKTOP (≥1024px) : grille de vignettes, dots masqués, hero seul */
@media screen and (max-width: 1023px) {
  .pdp-exploded__grid { display: none; }
}
@media screen and (min-width: 1024px) {
  .pdp-dots { display: none; }
  .pdp-carousel {
    display: block;
    overflow: visible;
  }
  .pdp-carousel__slide:not(.is-hero) { display: none; }
  /* Hero desktop PLEIN CADRE (look Boku). Killian (2026-06-05) : object-fit:contain + cap
     letterboxait l'image carrée → barres latérales façon 4:3. Fix = cover, carré, pleine
     largeur de colonne, AUCUNE barre. La grille 2-col compacte passe juste dessous. */
  .pdp-carousel__slide.is-hero img {
    inline-size: 100%;
    aspect-ratio: 1;
    max-block-size: none;
    object-fit: cover;
    border-radius: 16px;
  }
  /* Grille vignettes : 2 par rangée (look Boku « 2 en dessous puis 2 »), vignettes plus grandes.
     Killian (2026-06-05) : avant repeat(4) = 4 mini-vignettes en une rangée, trop petites. */
  .pdp-exploded__grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 16px;
    list-style: none;
    margin: 16px 0 0;
    padding: 0;
  }
  .pdp-exploded__grid li { display: flex; }
  .pdp-thumb {
    aspect-ratio: 1;
    inline-size: 100%;
    border: 1px solid var(--lf-border-subtle);
    background: var(--lf-bg-surface);
    padding: 0;
    cursor: pointer;
    overflow: hidden;
    border-radius: 10px;
    transition: border-color 250ms ease;
  }
  .pdp-thumb img {
    inline-size: 100%;
    block-size: 100%;
    object-fit: cover;
    display: block;
  }
  .pdp-thumb:hover { border-color: var(--lf-border-strong); }
  .pdp-thumb.is-active { border: 2px solid var(--lf-accent); }
  .pdp-thumb:focus-visible {
    outline: 2px solid var(--lf-accent);
    outline-offset: 3px;
  }
}

/* Mode "pleine largeur description" (drag-and-drop dans Theme Editor) :
   pour revenir au layout classique (galerie + infos en 2 cols, puis
   description + tabs en full-width sous), le merchant déplace les blocs
   Description et Onglets HORS de Grille-Ouverture #2 via Theme Editor.
   Aucun CSS dédié nécessaire — Speedfly gère naturellement le rendu. */

/* --- Prix dans bouton ATC -----------------------------------------------
   Pattern CRO 2026 (Stripe / Shopify Dawn / top stores) : le prix s'affiche
   dans le bouton "Ajouter au panier" après le texte, séparé par un point.
   Toggle Theme Editor : block "Formulaire d'achat" → "Afficher le prix dans
   le bouton Ajouter au panier" (default ON).
   Le prix s'update automatiquement au changement de variant (snippet
   `atc-price-update.liquid` qui écoute le hidden <select> Speedfly). */
.btn-atc--with-price {
  display: inline-flex;
  align-items: baseline;
  justify-content: center;
  gap: 8px;
}
.atc-price-sep {
  opacity: 0.6;
  margin-inline: 2px;
}
.atc-price {
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}

/* D-21 (2026-06-11) — Retire l'icône panier Font Awesome (\f07a, injectée par theme.css sur
   .btn-atc:before) des boutons ATC + sticky. Killian + benchmark : aucun DNVB (Boku/Cabaia/
   Horace/Asphalte…) ne met d'icône dans son CTA → texte clean = perçu premium, pas « thème gratuit ». */
.btn-atc::before { content: none !important; }

/* D-22 (2026-06-11) — Réassurance type Boku : petit cadenas SVG sur le bouton checkout du
   mini-panier (.go-pay), là où ça compte (étape paiement). SVG en `mask` + `currentColor` →
   épouse la couleur du texte du bouton, pas d'emoji, zéro dépendance Font Awesome. On masque
   l'éventuelle icône carte FA native pour ne garder QUE le cadenas. */
.mini-cart-btns .go-pay .fa { display: none; }
.mini-cart-btns .go-pay::before {
  content: "";
  display: inline-block;
  width: 13px;
  height: 13px;
  margin-right: 7px;
  vertical-align: -2px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Cpath%20d='M6%2010V7a6%206%200%201%201%2012%200v3h1a1%201%200%200%201%201%201v9a1%201%200%200%201-1%201H5a1%201%200%200%201-1-1v-9a1%201%200%200%201%201-1h1zm2%200h8V7a4%204%200%201%200-8%200v3z'/%3E%3C/svg%3E") center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Cpath%20d='M6%2010V7a6%206%200%201%201%2012%200v3h1a1%201%200%200%201%201%201v9a1%201%200%200%201-1%201H5a1%201%200%200%201-1-1v-9a1%201%200%200%201%201-1h1zm2%200h8V7a4%204%200%201%200-8%200v3z'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* --- TEST télécommande incluse (Pikachu seul, 2026-06-07) -----------------
   Décision Killian : 1 offre 34,90€ télécommande INCLUSE, pas de sélecteur.
   Côté Shopify (API) : variante « Avec télécommande » passée à 34,90€ + mise en
   position 1 (= variante par défaut soumise). Ici on masque le sélecteur de
   variante UNIQUEMENT sur la fiche Pikachu (scopé via body#id = page_title handlisé).
   Le <select> natif reste dans le DOM (display:none n'empêche pas la soumission)
   → l'ATC ajoute bien « Avec télécommande » 34,90€.
   ⚠️ TEST scopé Pikachu. Pour le batch (toutes les lampes 3D) : généraliser
   proprement (condition Liquid sur l'option télécommande), PAS body#id par produit. */
body#lampe-3d-pokemon-pikachu-shiny-holograbme .swatch.variant-images,
body#lampe-3d-pokemon-pikachu-shiny-holograbme .cont-selector.swatch-container {
  display: none;
}

/* --- Lisibilité du texte hero (home) sur image chargée -------------------
   Le titre + sous-titre + sous-texte du slideshow se lisaient mal par-dessus
   la photo. Ombre portée douce = contraste garanti sans changer le layout. */
.slideshow__title,
.slideshow__subtitle,
.slideshow__text-content {
  text-shadow: 0 2px 10px rgb(0 0 0 / 0.6), 0 1px 3px rgb(0 0 0 / 0.5);
}

/* --- stats_row (4 chiffres) : RETIRÉ Phase 1 (D-09) ---------------------
   Bloc trust signal code mort (absent du block_order de templates/product.json,
   invisible en prod). Réassurance déjà couverte par rating-inline + trust-badges
   (+6 000 clients) + top-trust-bar. Case Liquid + schema + CSS supprimés 2026-06-03. */

/* --- Reduced motion ----------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  .product-photo-container.frame::after,
  .lf-halo-card::after,
  body::before,
  body::after {
    transition: none;
  }
  /* Galerie Phase 2 : saut instantané (swipe/clic restent fonctionnels) */
  .pdp-carousel { scroll-behavior: auto; }
  .pdp-hero-img,
  .pdp-dot,
  .pdp-thumb {
    transition: none;
  }
}

/* ==========================================
   OBJECTION CARDS — Lo-fi 4am
   Réponses aux peurs d'achat — 2 layouts éditables Theme Editor
   A "bento" : grille asymétrique 6 cols
   B "editorial" : liste 1 col split 1fr/2fr séparée par hairlines
   ========================================== */

.lf-objection-section {
  --lf-obj-divider: rgb(var(--lf-text-warm-rgb, 243 238 219) / 0.12);
  position: relative;
  padding-block: var(--lf-obj-pt, 80px) var(--lf-obj-pb, 80px);
  padding-inline: 24px;
  background: var(--lf-bg-deep, #161226);
  color: var(--lf-text-warm, #f3eedb);
  overflow: hidden;
}

.lf-objection-inner {
  max-width: var(--lf-obj-maxw, 1200px);
  margin-inline: auto;
  position: relative;
  z-index: 1;
}

/* Header */
.lf-objection-header {
  margin-block-end: 56px;
}

.lf-objection-title {
  font-family: var(--font-display-lofi, 'Fraunces', Georgia, serif);
  font-style: italic;
  font-weight: 400;
  /* M3 — min 32px pour préserver le caractère optical-display de Fraunces sur mobile */
  font-size: clamp(32px, 5vw, 44px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--lf-text-warm, #f3eedb);
  margin: 0 0 16px 0;
  max-width: 26ch;
  text-wrap: balance;
}

/* M4 — Intro en Fraunces italic light pour cohérence editorial voice */
.lf-objection-intro {
  font-family: var(--font-display-lofi, 'Fraunces', Georgia, serif);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(16px, 1.4vw, 19px);
  line-height: 1.45;
  letter-spacing: -0.005em;
  color: var(--lf-text-muted, #b8b0c8);
  margin: 0;
  max-width: 56ch;
}

/* Card commune aux 2 layouts */
.lf-objection-card {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 800ms cubic-bezier(0.32, 0.72, 0, 1),
              transform 800ms cubic-bezier(0.32, 0.72, 0, 1);
}

.lf-objection-card.is-revealed {
  opacity: 1;
  transform: translateY(0);
}

.lf-objection-card__icon {
  color: var(--lf-accent, #b884d6);
  display: block;
  flex-shrink: 0;
}

.lf-objection-card__icon svg {
  display: block;
  width: 100%;
  height: 100%;
}

.lf-objection-card__body {
  display: flex;
  flex-direction: column;
}

.lf-objection-card__title {
  font-family: var(--font-display-lofi, 'Fraunces', Georgia, serif);
  font-style: italic;
  font-weight: 400;
  color: var(--lf-text-warm, #f3eedb);
  letter-spacing: -0.01em;
  margin: 0 0 8px 0;
  text-wrap: balance;
}

.lf-objection-card__text {
  font-family: var(--font-body-lofi, 'Inter', system-ui, sans-serif);
  color: var(--lf-text-muted, #b8b0c8);
  margin: 0;
}

.lf-objection-card__link {
  align-self: flex-start;
  margin-block-start: 14px;
  padding-block: 6px;
  padding-inline: 0;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  font-family: var(--font-body-lofi, 'Inter', system-ui, sans-serif);
  font-size: 11px;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.15em;
  color: var(--lf-accent, #b884d6);
  text-decoration: none;
  border-block-end: 1px dotted rgb(var(--lf-accent-rgb, 184 132 214) / 0.5);
  transition: color 240ms ease, border-color 240ms ease;
}

.lf-objection-card__link:hover {
  color: var(--lf-text-warm, #f3eedb);
  border-block-end-color: var(--lf-text-warm, #f3eedb);
}

.lf-objection-card__link:focus-visible {
  outline: 2px solid var(--lf-accent, #b884d6);
  outline-offset: 4px;
  border-radius: 2px;
}

/* ==========================================
   LAYOUT A — Bento asymétrique (6 cols)
   Hierarchy P0/P1/P2 par index :
   Block 0 (Livraison)   span 4 large hero
   Block 1 (30 jours)    span 2 compact
   Block 2 (Conçue durer) span 2 compact
   Block 3 (Veilleuse)   span 4 large
   Block 4 (Branchement) span 6 full
   ========================================== */

.lf-objection-section[data-layout="bento"] .lf-objection-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  grid-auto-rows: minmax(180px, 1fr);
  gap: 16px;
}

.lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="0"] { grid-column: span 4; }
.lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="1"] { grid-column: span 2; }
.lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="2"] { grid-column: span 2; }
.lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="3"] { grid-column: span 4; }
.lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="4"] { grid-column: span 6; }

.lf-objection-section[data-layout="bento"] .lf-objection-card {
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding: 28px;
  background: rgb(var(--lf-text-warm-rgb, 243 238 219) / 0.04);
  border: 1px solid var(--lf-border-subtle);
  border-radius: 16px;
  transition: opacity 800ms cubic-bezier(0.32, 0.72, 0, 1),
              transform 800ms cubic-bezier(0.32, 0.72, 0, 1),
              border-color 320ms ease,
              background 320ms ease;
}

/* F4 + F5 — Cards sont statiques (pas de link interne); on retire l'affordance hover
   qui ment (cf. design-review cross-model). Seules les bordures pulsent légèrement
   pour signaler la présence sans suggérer une interaction. */
.lf-objection-section[data-layout="bento"] .lf-objection-card:hover {
  border-color: var(--lf-border-strong);
  background: rgb(var(--lf-text-warm-rgb, 243 238 219) / 0.06);
}

.lf-objection-section[data-layout="bento"] .lf-objection-card__icon {
  width: 32px;
  height: 32px;
}

.lf-objection-section[data-layout="bento"] .lf-objection-card__title {
  font-size: 22px;
  line-height: 1.2;
}

.lf-objection-section[data-layout="bento"] .lf-objection-card__text {
  font-size: 14px;
  line-height: 1.55;
  max-width: 50ch;
  display: -webkit-box;
  -webkit-line-clamp: 6;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* ==========================================
   LAYOUT B — Liste éditoriale narrative
   1 col pleine largeur, rows séparées par hairline
   Anchor visuel : 1ère row icône 72px (vs 56px) — anti-uniformité
   ========================================== */

.lf-objection-section[data-layout="editorial"] .lf-objection-grid {
  display: block;
}

/* P3 — cards éditoriales sont statiques (pas d'interaction) — cursor naturel,
   pas d'affordance hover qui ment. H2 — la 1ère card est l'anchor visuel
   (icon 72px + H3 32px vs 56px/26px standard) — intentionnel pour briser
   l'uniformité de la liste éditoriale (consensus design review cross-model). */
.lf-objection-section[data-layout="editorial"] .lf-objection-card {
  display: grid;
  grid-template-columns: 1fr 2fr;
  gap: 64px;
  padding-block: 48px;
  border-block-start: 1px solid var(--lf-obj-divider);
  align-items: start;
  cursor: default;
}

.lf-objection-section[data-layout="editorial"] .lf-objection-card[data-is-first="true"] {
  border-block-start: 0;
  padding-block-start: 0;
}

.lf-objection-section[data-layout="editorial"] .lf-objection-card__icon {
  width: 56px;
  height: 56px;
  transition: opacity 800ms cubic-bezier(0.32, 0.72, 0, 1),
              transform 400ms cubic-bezier(0.32, 0.72, 0, 1),
              color 400ms ease;
}

.lf-objection-section[data-layout="editorial"] .lf-objection-card[data-is-first="true"] .lf-objection-card__icon {
  width: 72px;
  height: 72px;
}

/* R3 — pas de hover affordance sur icon en editorial : cursor:default sur la card
   signifie déjà 'non-interactif'. Le hover icon scale/color shift créait un
   mismatch sémantique (subagent V3). Hover géré uniquement en bento si appliqué. */

.lf-objection-section[data-layout="editorial"] .lf-objection-card__title {
  font-size: 26px;
  line-height: 1.15;
  color: var(--lf-accent, #b884d6);
  letter-spacing: -0.02em;
  margin: 0 0 12px 0;
}

.lf-objection-section[data-layout="editorial"] .lf-objection-card[data-is-first="true"] .lf-objection-card__title {
  font-size: 32px;
}

.lf-objection-section[data-layout="editorial"] .lf-objection-card__text {
  font-size: 16px;
  line-height: 1.7;
  color: var(--lf-text-warm, #f3eedb);
  max-width: 60ch;
}

/* ==========================================
   LAYOUT C — Éditorial + cards container
   Reco TeamDijon : disposition liste éditoriale (1 col, split icône / texte)
   + style container du bento (fond + bordure + radius).
   ========================================== */

.lf-objection-section[data-layout="editorial-cards"] .lf-objection-grid {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.lf-objection-section[data-layout="editorial-cards"] .lf-objection-card {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 28px;
  align-items: center;
  padding: 28px 32px;
  background: rgb(var(--lf-text-warm-rgb, 243 238 219) / 0.04);
  border: 1px solid var(--lf-border-subtle);
  border-radius: 16px;
  cursor: default;
  transition: opacity 800ms cubic-bezier(0.32, 0.72, 0, 1),
              transform 800ms cubic-bezier(0.32, 0.72, 0, 1),
              border-color 320ms ease,
              background 320ms ease;
}

.lf-objection-section[data-layout="editorial-cards"] .lf-objection-card:hover {
  border-color: var(--lf-border-strong);
  background: rgb(var(--lf-text-warm-rgb, 243 238 219) / 0.06);
}

.lf-objection-section[data-layout="editorial-cards"] .lf-objection-card__icon {
  width: 48px;
  height: 48px;
}

.lf-objection-section[data-layout="editorial-cards"] .lf-objection-card__title {
  font-size: 22px;
  line-height: 1.2;
  color: var(--lf-accent, #b884d6);
  letter-spacing: -0.01em;
  margin: 0 0 6px 0;
}

.lf-objection-section[data-layout="editorial-cards"] .lf-objection-card__text {
  font-size: 15px;
  line-height: 1.6;
  color: var(--lf-text-warm, #f3eedb);
  max-width: 70ch;
}

/* ==========================================
   RESPONSIVE
   Mobile ≤ 768px : 1 col toujours
   Tablet 769-1024 : Layout A en 3-3-2-2-2 (équilibré)
   Desktop ≥ 1025 : grille full
   ========================================== */

@media (max-width: 768px) {
  .lf-objection-section {
    padding-block: var(--lf-obj-pt-mobile, 48px) var(--lf-obj-pb-mobile, 48px);
    padding-inline: 20px;
  }
  .lf-objection-header {
    margin-block-end: 32px;
  }

  .lf-objection-section[data-layout="bento"] .lf-objection-grid {
    grid-template-columns: 1fr;
    grid-auto-rows: auto;
    gap: 12px;
  }
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="0"],
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="1"],
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="2"],
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="3"],
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="4"] {
    grid-column: span 1;
  }
  .lf-objection-section[data-layout="bento"] .lf-objection-card {
    padding: 20px;
  }
  .lf-objection-section[data-layout="bento"] .lf-objection-card__title {
    font-size: 20px;
  }

  .lf-objection-section[data-layout="editorial"] .lf-objection-card {
    grid-template-columns: 1fr;
    gap: 16px;
    padding-block: 32px;
  }
  .lf-objection-section[data-layout="editorial"] .lf-objection-card__icon {
    width: 48px;
    height: 48px;
  }
  .lf-objection-section[data-layout="editorial"] .lf-objection-card[data-is-first="true"] .lf-objection-card__icon {
    width: 56px;
    height: 56px;
  }
  .lf-objection-section[data-layout="editorial"] .lf-objection-card__title {
    font-size: 22px;
  }
  .lf-objection-section[data-layout="editorial"] .lf-objection-card[data-is-first="true"] .lf-objection-card__title {
    font-size: 26px;
  }
  .lf-objection-section[data-layout="editorial"] .lf-objection-card__text {
    font-size: 15px;
  }

  .lf-objection-section[data-layout="editorial-cards"] .lf-objection-card {
    grid-template-columns: 1fr;
    gap: 14px;
    padding: 22px 24px;
  }
  .lf-objection-section[data-layout="editorial-cards"] .lf-objection-card__icon {
    width: 42px;
    height: 42px;
  }
  .lf-objection-section[data-layout="editorial-cards"] .lf-objection-card__title {
    font-size: 20px;
  }
}

@media (min-width: 769px) and (max-width: 1024px) {
  /* F3 — block-4 (Branchement = closer) garde span 6 plein-largeur même au tablet
     pour préserver l'anchor hierarchy. Les 4 premiers blocks se partagent 3/3/3/3. */
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="0"] { grid-column: span 3; }
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="1"] { grid-column: span 3; }
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="2"] { grid-column: span 3; }
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="3"] { grid-column: span 3; }
  .lf-objection-section[data-layout="bento"] .lf-objection-card[data-block-index="4"] { grid-column: span 6; }
}

/* Reduced motion : on garde apparition douce mais zero translate/scale */
/* ==========================================
   TOP TRUST BAR — Hide en mobile (< 768px) pour libérer le fold
   Sur mobile la barre custom (rating + 4 pills) prend 3 lignes = trop.
   Le slider topheader_html flash-info Speedfly natif (1 ligne dynamique)
   prend le relais visuel. Desktop : on garde la top-trust-bar complète.
   Killian 2026-05-17.
   ========================================== */
@media (max-width: 767px) {
  .shopify-section--top-trust-bar,
  .top-trust-bar-section {
    display: none;
  }
}

/* ==========================================
   TOUCH TARGETS — Mega menu dropdown items 38px → 44px (WCAG mobile)
   Cible : <li> > <a> dans .mega-menu-container (dropdown "Lampes 3D",
   "Collections" etc.). Avant : 38px de haut. Après : 44px min via flex
   centré pour garder le visuel propre.
   Killian 2026-05-17 — Option A test avant/après.
   ========================================== */
.site-nav--dropdown li > a,
ul.site-nav--dropdown a {
  min-block-size: 44px;
  display: flex;
  align-items: center;
}

/* ==========================================
   FILTRES COLLECTION — Lisibilité dropdown natif
   Le <select> hérite color cream #f3eedb (Lo-fi) du parent .toggle-filters.
   Les <option> rendues par le navigateur sur fond clair OS → texte cream
   sur fond clair = illisible. Fix : color sombre + bg cream cohérent Lo-fi.
   Killian 2026-05-17 (screen filtre Lampes 3D illisible).
   ========================================== */
select#sortBy option,
select.coll-picker option,
.toggle-filters select option {
  color: #161226;
  background-color: #f3eedb;
}

/* ==========================================
   TOPHEADER SLIDER FLASH-INFOS — Hide en desktop (≥ 768px)
   En desktop la top-trust-bar custom suffit. Le slider flash-info Speedfly natif
   (topheader_html, 4 messages défilants 5000ms) prend le relais UNIQUEMENT en mobile
   (où la top-trust-bar est cachée — cf règle ci-dessus).
   Évite la double-barre desktop (top-trust-bar + slider redondants).
   Killian 2026-05-17.
   ========================================== */
@media (min-width: 768px) {
  .topheader {
    display: none;
  }
}

/* Override police Ryviu (Fraunces) retire 2026-06-22 (bascule Judge.me). */

@media (prefers-reduced-motion: reduce) {
  .lf-objection-card {
    transform: none;
    transition: opacity 200ms ease;
  }
  .lf-objection-section[data-layout="editorial"] .lf-objection-card:hover .lf-objection-card__icon {
    transform: none;
  }
}

/* --- Sticky ATC mobile — Design D · Stacked ---------------------------
   Validé Killian via /office-hours + Claude Design 2026-05-26.
   Composant : snippets/sticky-bar.liquid (HTML refondu, JS Speedfly natif conservé).

   Layout :
     • Bar fixée bas viewport, fond --lf-bg-deep (deep purple)
     • Variant label centré en haut (Fraunces italic, --lf-text-warm)
     • Bouton CTA --lf-accent (plum) pleine largeur, Inter 600 15px,
       texte --lf-text-warm, prix dans le bouton (hiérarchie 600/400/700)
     • Hauteur ~92px contenu + 28px safe area iOS (home indicator)
     • Drop shadow top + hairline cream 6% pour décoller du contenu

   JS Speedfly natif (IntersectionObserver) conservé : cache le sticky
   quand le form primary OU le footer est dans le viewport.

   Le select natif Shopify est gardé dans le DOM (form submit) mais
   caché via classe .elem-hidden Speedfly (visuallyhidden pattern).
   Tokens --lf-* du :root (lignes 83-104). No !important.
   Note : shadow rgba(22,18,38,...) hardcodée car pas de --lf-bg-deep-rgb
   exposé dans les tokens (ajout futur si réutilisé ailleurs).
   -------------------------------------------------------------------- */
.sticky-atc.lf-sticky-d {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  background: var(--lf-bg-deep);
  padding: 4px 14px 28px;
  box-shadow:
    0 -8px 24px rgba(22, 18, 38, 0.18),
    0 -1px 0 rgb(var(--lf-text-warm-rgb) / 0.06);
  z-index: 1001; /* match vendor app-sticky-bar.css stacking : reste au-dessus du mini-cart drawer + modals */
  display: none; /* hidden par défaut. L'IntersectionObserver le bascule à 'flex' quand le form primary est hors viewport (sinon il flash au load). */
  flex-direction: column;
  gap: 8px;
  border: none;
  margin: 0;
}

/* Hide sticky D sur desktop (≥768px) : sur grand écran l'ATC primary est
   above-the-fold sans scroll, le sticky est inutile et bouffe l'écran.
   Pattern standard mobile e-commerce (Bergamotte, Govee). */
@media (min-width: 768px) {
  .sticky-atc.lf-sticky-d {
    display: none;
  }
}

/* Force-hide le select natif Shopify + l'input quantity. Le vendor
   app-sticky-bar.css redéfinit display sur mobile et fait remonter le
   select visiblement (avec sa chevron native), squashant le bouton CTA
   qui se met à wrapper "Ajouter / au / panier". Spécificité 2 classes + 1 id
   pour beat le vendor sans !important. Les valeurs restent dans le form
   donc submit Shopify OK. */
.sticky-atc.lf-sticky-d #productSelect-sticky,
.sticky-atc.lf-sticky-d input[name="quantity"] {
  display: none;
}

/* Variant label centré en haut */
.sticky-atc.lf-sticky-d .lf-sticky-variant {
  font-family: var(--font-display-lofi);
  font-style: italic;
  font-weight: 400;
  font-size: 13px;
  line-height: 1;
  letter-spacing: -0.005em;
  color: var(--lf-text-warm);
  text-align: center;
  padding: 4px 2px 0;
  margin: 0;
}

/* Quand le sticky a des pills (product.variants.size > 1), le label texte
   au-dessus devient redondant (la pill active porte déjà l'info). On le
   cache visuellement mais garde le DOM pour aria-live polite. */
.sticky-atc.lf-sticky-d--has-pills .lf-sticky-variant,
.sticky-atc.lf-sticky-d--has-sheet .lf-sticky-variant {
  display: none;
}

/* ─────────────────────────────────────────────────────────────────────
   Bottom-sheet variant selector — pour produits 5+ variants (18 produits,
   2.5% du catalogue : lampe-personnalisee 16var, lampes-zen/neon-led custom).
   Pills sont remplacées par un trigger button qui ouvre un modal full-viewport.
   Décision Killian 2026-05-28 après mockup visuel comparatif.
   ───────────────────────────────────────────────────────────────────── */

/* Trigger button — visible dans le sticky */
.sticky-atc.lf-sticky-d .lf-sticky-sheet-trigger {
  width: 100%;
  margin: 2px 2px 0;
  padding: 12px 16px;
  background: rgb(var(--lf-text-warm-rgb) / 0.06);
  border: 1px solid rgb(var(--lf-text-warm-rgb) / 0.18);
  border-radius: 12px;
  color: var(--lf-text-warm);
  font-family: var(--font-body-lofi);
  font-size: 13px;
  letter-spacing: -0.005em;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  text-align: left;
  appearance: none;
  -webkit-appearance: none;
  -webkit-tap-highlight-color: transparent;
  transition: background 150ms ease;
}
.sticky-atc.lf-sticky-d .lf-sticky-sheet-trigger:hover {
  background: rgb(var(--lf-text-warm-rgb) / 0.1);
}
.sticky-atc.lf-sticky-d .lf-sticky-sheet-current {
  flex: 1 1 auto;
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.sticky-atc.lf-sticky-d .lf-sticky-sheet-caret {
  flex: 0 0 auto;
  opacity: 0.7;
  font-size: 11px;
}

/* Modal dialog — sorti du #sticky-atc, position:fixed full-viewport */
.lf-sticky-sheet[hidden] {
  display: none;
}
.lf-sticky-sheet {
  position: fixed;
  inset: 0;
  z-index: 1002; /* au-dessus du sticky-atc 1001 */
  display: flex;
  align-items: flex-end;
  justify-content: stretch;
}
.lf-sticky-sheet-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.55);
  animation: lf-sheet-fade 200ms ease;
  cursor: pointer;
}
.lf-sticky-sheet-content {
  position: relative;
  width: 100%;
  background: var(--lf-bg-deep);
  padding: 16px 16px max(env(safe-area-inset-bottom, 16px), 24px);
  border-top-left-radius: 18px;
  border-top-right-radius: 18px;
  max-height: 70vh;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  animation: lf-sheet-slide 280ms cubic-bezier(0.16, 1, 0.3, 1);
  box-shadow: 0 -8px 32px rgba(0, 0, 0, 0.35);
}
.lf-sticky-sheet-title {
  font-family: var(--font-display-lofi);
  font-style: italic;
  font-weight: 400;
  font-size: 14px;
  line-height: 1.2;
  color: var(--lf-text-warm);
  margin: 0 0 12px;
  text-align: center;
  letter-spacing: -0.005em;
}
.lf-sticky-sheet-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.lf-sticky-sheet-option {
  padding: 14px 16px;
  border: 1px solid rgb(var(--lf-text-warm-rgb) / 0.15);
  border-radius: 12px;
  background: transparent;
  color: var(--lf-text-warm);
  font-family: var(--font-body-lofi);
  font-size: 13px;
  letter-spacing: -0.005em;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  cursor: pointer;
  width: 100%;
  text-align: left;
  appearance: none;
  -webkit-appearance: none;
  -webkit-tap-highlight-color: transparent;
  transition: background 150ms ease, border-color 150ms ease;
}
.lf-sticky-sheet-option:hover {
  background: rgb(var(--lf-text-warm-rgb) / 0.04);
}
.lf-sticky-sheet-option.selected {
  background: rgb(var(--lf-text-warm-rgb) / 0.08);
  border-color: var(--lf-text-warm);
  font-weight: 600;
}
.lf-sticky-sheet-option-label {
  flex: 1 1 auto;
  min-width: 0;
}
.lf-sticky-sheet-check {
  width: 18px;
  height: 18px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1.5px solid rgb(var(--lf-text-warm-rgb) / 0.3);
  flex: 0 0 auto;
  transition: background 150ms ease, border-color 150ms ease;
}
.lf-sticky-sheet-option.selected .lf-sticky-sheet-check {
  background: var(--lf-accent);
  border-color: var(--lf-accent);
}
.lf-sticky-sheet-option.selected .lf-sticky-sheet-check::after {
  content: "✓";
  color: var(--lf-bg-deep);
  font-size: 11px;
  font-weight: 700;
  line-height: 1;
}

@keyframes lf-sheet-fade {
  from { opacity: 0; }
  to { opacity: 1; }
}
@keyframes lf-sheet-slide {
  from { transform: translateY(100%); }
  to { transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .lf-sticky-sheet-backdrop,
  .lf-sticky-sheet-content {
    animation: none;
  }
}

/* Pills variant selector — radios visuels stylés Lo-fi.
   Layout : flex-wrap (2 lignes auto si 3+ variants), flex 1 1 calc(50% - 3px)
   donne 2 colonnes en row 1, puis wrap. Pas de !important — spécificité 2 classes. */
.sticky-atc.lf-sticky-d .lf-sticky-pills {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 2px 2px 0;
  margin: 0;
}
.sticky-atc.lf-sticky-d .lf-sticky-pill {
  flex: 1 1 calc(50% - 3px);
  min-width: 0;
  padding: 8px 8px;
  border: 1px solid rgb(var(--lf-text-warm-rgb) / 0.18);
  border-radius: 16px; /* Plus pill-shape stricte cassée à 99px quand text wrap 2 lignes, 16px reste arrondi mais accepte multi-ligne */
  background: transparent;
  color: var(--lf-text-warm);
  font-family: var(--font-body-lofi);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: -0.005em;
  text-align: center;
  /* white-space: normal — pills wrap sur 2 lignes au lieu de "..." tronqué.
     Killian 2026-05-28 : voir "Bleu / Ro..." sur écran étroit avant ce fix. */
  white-space: normal;
  word-break: break-word;
  line-height: 1.25;
  cursor: pointer;
  transition: background 150ms ease, border-color 150ms ease;
  /* Reset native button styling */
  appearance: none;
  -webkit-appearance: none;
  -webkit-tap-highlight-color: transparent;
}
.sticky-atc.lf-sticky-d .lf-sticky-pill.active {
  background: rgb(var(--lf-text-warm-rgb) / 0.12);
  border-color: var(--lf-text-warm);
  font-weight: 600;
}
.sticky-atc.lf-sticky-d .lf-sticky-pill:active {
  transform: scale(0.98);
}
.sticky-atc.lf-sticky-d .lf-sticky-pill:focus-visible {
  outline: 2px solid var(--lf-accent);
  outline-offset: 2px;
}

/* CTA wrap — contient le form Shopify */
.sticky-atc.lf-sticky-d .lf-sticky-cta-wrap {
  padding: 0 2px;
}

/* CTA bouton — plum pleine largeur, Inter 600 15px cream.
   ⚠️ flex-direction:row + flex-wrap:nowrap + white-space:nowrap explicites :
   vendor app-sticky-bar.css fait stacker les spans verticalement
   ("Ajouter / · / au panier / 34,90€" en colonne) sans ces forçages.
   min-width:0 + overflow:hidden = ceinture/bretelles si la largeur shrinke. */
.sticky-atc.lf-sticky-d .lf-sticky-cta {
  width: 100%;
  height: 46px;
  min-width: 0;
  border-radius: 99px;
  border: none;
  background: var(--lf-accent);
  color: var(--lf-bg-deep); /* deep purple sur plum = convention primary ATC site, contraste fort */
  font-family: var(--font-body-lofi);
  font-weight: 600;
  font-size: 15px;
  letter-spacing: -0.005em;
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  white-space: nowrap;
  overflow: hidden;
  align-items: center;
  justify-content: center;
  gap: 10px;
  cursor: pointer;
  transition: filter 200ms ease, transform 100ms ease;
  margin: 0;
  padding: 0 16px;
}
/* Force chaque span enfant en inline-flex no-shrink no-wrap pour bloquer
   tout vendor override qui les ferait passer en display:block. */
.sticky-atc.lf-sticky-d .lf-sticky-cta > span {
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;
  white-space: nowrap;
  line-height: 1;
}
.sticky-atc.lf-sticky-d .lf-sticky-cta:hover {
  filter: brightness(1.05);
}
.sticky-atc.lf-sticky-d .lf-sticky-cta:active {
  transform: scale(0.98);
}
.sticky-atc.lf-sticky-d .lf-sticky-cta .lf-cta-dot {
  opacity: 0.5;
  font-weight: 400;
}
.sticky-atc.lf-sticky-d .lf-sticky-cta .lf-cta-price {
  font-weight: 700;
}

/* Override vendor app-sticky-bar.css qui cache .addToCartText en mobile
   (≤749px) et injecte un ::before icône cart. Notre CTA D doit montrer
   le texte complet "Ajouter au panier · 34,90 €" → restaurer le label
   visible et supprimer le pseudo-element vendor.
   ⚠️ Sans ces overrides, le bouton sticky mobile n'affiche que " · 34,90 €". */
.sticky-atc.lf-sticky-d .lf-sticky-cta .addToCartText {
  display: inline;
}
.sticky-atc.lf-sticky-d .lf-sticky-cta::before {
  display: none;
  content: none;
}

/* ──────────────────────────────────────────────────────────────────
   BULLETPROOF FULL-WIDTH OVERRIDE — spécificité ID-based (1,X,0)
   Bug Shopify Admin Theme Editor mobile preview 2026-05-28 :
   le bouton CTA était shrinké à ~65% et offset à droite, le texte tronqué
   à gauche ("outer au panier" au lieu de "Ajouter au panier").
   Cause probable : Shopify Theme Editor preview injecte des CSS supplémentaires
   en mode édition que notre spécificité 3-classes (.sticky-atc.lf-sticky-d
   .lf-sticky-cta = 0,3,0) ne battait pas.
   Solution : monter en ID-based (#sticky-atc = 1,0,0) qui beat n'importe
   quel CSS class-based sans avoir besoin de `!important`.
   Force aussi display:block sur le form (vendor mobile force display:flex
   qui peut shrinker le button comme flex-item). En column, le button single
   visible child prend 100% width.
   ────────────────────────────────────────────────────────────────── */
#sticky-atc.lf-sticky-d .lf-sticky-cta-wrap {
  width: 100%;
  box-sizing: border-box;
}
#sticky-atc.lf-sticky-d #cont-form2 form {
  display: block;
  width: 100%;
  margin: 0;
}
#sticky-atc.lf-sticky-d .lf-sticky-cta {
  width: 100%;
  max-width: 100%;
  margin: 0;
  flex: 0 0 100%;
  box-sizing: border-box;
}

/* Desktop : on garde le rendu pour les tests Theme Editor desktop view,
   mais en production réelle le sticky mobile sert sur ≤768px essentiellement.
   Si on veut le désactiver totalement en desktop, ajouter :
       @media (min-width: 768px) { .sticky-atc.lf-sticky-d { display: none } }
   Décision Killian à valider. */

/* ─────────────────────────────────────────────────────────────────────
   Cards collection — Layout titre INVERSE + visibilité (A4 v2, 2026-05-28)
   Killian a signalé v1 : "on voit même plus le titre produit, c'est l'inverse
   qu'il faut faire — label tronqué 'Lampe One P...' en haut + nom produit
   VISIBLE en dessous".

   Structure existante (related-product-grid-item.liquid + product-grid-item.liquid) :
     <div class="grid-crop-title">
       <h3 class="h3">
         <span class="first-line-title-{grid,related}">{premier mot}</span>
         <span class="second-line-title-{grid,related}">{dernier mot}</span>
       </h3>
     </div>

   Layout cible :
     - first-line = LABEL discret en haut (tronqué ellipsis si long)
     - second-line = NOM PRODUIT BIEN VISIBLE en bas (cream + gras + plus gros)
   ───────────────────────────────────────────────────────────────────── */
.grid-crop-title {
  min-height: 4em;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  text-align: center;
  overflow: hidden;
  padding: 4px 8px;
}
.grid-crop-title .h3,
.grid-crop-title h3 {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 0;
  line-height: 1.2;
}

/* Label discret en haut — uppercase petit cream-faded, ellipsis si trop long */
.first-line-title-grid,
.first-line-title-related {
  display: block;
  font-family: var(--font-body-lofi);
  font-size: 11px;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--lf-text-warm);
  opacity: 0.6;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 100%;
}

/* Nom produit en bas — VISIBLE : cream plein + Fraunces italic + plus gros.
   v3 (Killian 2026-05-28) : line-clamp 2 → ellipsis 1 ligne (cf "Sasuke Sceau
   Maudit" qui dépassait sur 2 lignes). Font 17 → 20px (+ 22px desktop) car
   Killian a signalé "un peu petit que ce soit mobile ou ordi". */
.second-line-title-grid,
.second-line-title-related {
  display: block;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-family: var(--font-display-lofi, "Fraunces", serif);
  font-style: italic;
  font-weight: 600;
  font-size: 20px;
  color: var(--lf-text-warm);
  opacity: 1;
  line-height: 1.2;
  max-width: 100%;
}
@media (min-width: 768px) {
  .second-line-title-grid,
  .second-line-title-related {
    font-size: 22px;
  }
}

/* Label meta-info (vendor "LAMPE NARUTO") aligné aussi pour cohérence cards */
.product-meta-info {
  display: block;
  min-height: 1em;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}


/* E-fix (2026-05-30) : contrôles natifs en sombre (dropdown variante fiche liée, scrollbars) */
html { color-scheme: dark; }

/* E-fix v2 (2026-05-30) : popup du select variante (fiche liée) en sombre — option bg explicite */
.cont-associated-product select, .cont-associated-product select option { background-color: #161226; color: #f3eedb; }

/* ==========================================================================
   MINI-CART DRAWER reskin Lo-fi (cream) + fix prix page /cart
   2026-06-01 (Killian) — HOLOGRABME-CUSTOMIZATIONS #25
   - Page /cart : prix de ligne .h5[data-price] était #333 (invisible sur fond
     sombre #161226) → cream + General Sans (unifié avec PDP/cards).
   - Drawer (mini-cart) : fond blanc (#fff via --headerCartBg des settings) →
     surface cream de la palette, texte/prix deep purple. Bouton "Valider" en
     deep purple (le plum sur cream tombe sous WCAG AA). Trust strip + stepper
     re-skinnés. Override CSS uniquement (jamais settings_data.json).
   ========================================================================== */

/* --- Page /cart : prix de ligne lisible ---------------------------------
   theme.css fait `.template-cart .main-content span.h5 { color: var(--colorPrice) }`
   (#333, spécificité 0,3,1) → on passe au-dessus (0,4,1) sans !important. */
.template-cart .main-content span.h5[data-price] {
  color: var(--lf-text-warm);
  font-family: var(--font-body-lofi);
}

/* --- Drawer : panneau cream --------------------------------------------- */
.mini-cart__v2 {
  --headerCartBg: var(--lf-text-warm);
  --headerCartColor: var(--lf-bg-deep);
  --headerCartBorder: rgb(22 18 38 / 0.12);
  background: var(--lf-text-warm) !important; /* --headerCartBg injectée par les settings Speedfly → !important justifié */
  color: var(--lf-bg-deep) !important;
  border: 1px solid rgb(22 18 38 / 0.12) !important;
}

/* Header "Panier" (Fraunces hérité) + compteur */
.mini-cart__v2 .mini-cart__header {
  border-bottom: 1px solid rgb(22 18 38 / 0.10);
}
.mini-cart__v2 .mini-cart__header .cart-count {
  background: var(--lf-bg-deep);
  color: var(--lf-text-warm);
  border-radius: 999px;
}
/* Croix de fermeture (fa-times) : héritait cream de theme.css `.mini-cart-modal button *`
   → cream sur cream = invisible. On force deep purple (id selector bat la règle thème). */
.mini-cart__v2 #mini-cart-close-modal,
.mini-cart__v2 #mini-cart-close-modal .fa {
  color: var(--lf-bg-deep);
}

/* Items + séparateurs */
.mini-cart__v2 .mini-cart__item {
  border-bottom: 1px solid rgb(22 18 38 / 0.08);
}
.mini-cart__v2 .mini-cart__item-title {
  color: var(--lf-bg-deep);
  font-family: var(--font-body-lofi);
  font-weight: 600;
}

/* Prix .money — deep purple sur cream, General Sans (raccord PDP, pas mono) */
.mini-cart__v2 .money {
  color: var(--lf-bg-deep);
  font-family: var(--font-body-lofi);
}

/* Stepper quantité : micro-surface blanche dans le cream */
.mini-cart__v2 .custom-selector-qty {
  border: 1px solid rgb(22 18 38 / 0.20);
  background: #fff;
  color: var(--lf-bg-deep);
  border-radius: 6px;
}
.mini-cart__v2 .custom-selector-qty input {
  color: var(--lf-bg-deep);
  background: transparent;
}

/* Croix suppression */
.mini-cart__v2 .mini-cart__remove-item {
  color: rgb(22 18 38 / 0.45);
}
.mini-cart__v2 .mini-cart__remove-item:hover {
  color: var(--lf-bg-deep);
}

/* Footer / sous-total */
.mini-cart__v2 .mini-cart__footer {
  border-top: 1px solid rgb(22 18 38 / 0.12);
}
.mini-cart__v2 .mini-cart__footer span {
  color: var(--lf-bg-deep);
}

/* Trust strip — override du <style> inline du snippet (scopé = +spécifique) */
.mini-cart__v2 .cart-trust-strip {
  background: rgb(22 18 38 / 0.06);
  color: var(--lf-bg-deep);
}
.mini-cart__v2 .cart-trust-strip__icon {
  color: var(--lf-accent);
}

/* Boutons */
.mini-cart__v2 .mini-cart-btns a.btn-secondary {
  background: transparent;
  color: var(--lf-bg-deep);
  border: 1.5px solid rgb(22 18 38 / 0.35);
  font-family: var(--font-body-lofi);
  font-weight: 600;
  transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
.mini-cart__v2 .mini-cart-btns a.btn-secondary:hover {
  background: var(--lf-bg-deep);      /* fill deep purple au survol — feedback net */
  color: var(--lf-text-warm);
  border-color: var(--lf-bg-deep);
}
.mini-cart__v2 .mini-cart-btns a.btn-primary {
  background: var(--lf-accent) !important;   /* couleur du bouton ATC (plum) — la couleur demandée, forme inchangée */
  color: var(--lf-accent-ink) !important;    /* deep purple sur plum (AA 4.6:1) */
  border: none;
  font-family: var(--font-body-lofi);
  font-weight: 500;                          /* = ATC (était 700, jugé trop gras par Killian) */
  transition: background-color .2s ease, color .2s ease;
}
.mini-cart__v2 .mini-cart-btns a.btn-primary:hover {
  background: var(--lf-accent-hover) !important;  /* plum → plum foncé au survol, comme l'ATC */
  color: var(--lf-accent-ink) !important;
}

/* Scrollbar liste */
.mini-cart__v2 .mini-cart__items::-webkit-scrollbar { width: 4px; }
.mini-cart__v2 .mini-cart__items::-webkit-scrollbar-track { background: rgb(22 18 38 / 0.05); }
.mini-cart__v2 .mini-cart__items::-webkit-scrollbar-thumb { background: rgb(22 18 38 / 0.20); border-radius: 2px; }

/* --- Page /cart (fond sombre) : éléments restés en clair après #25 -------
   2026-06-01 (Killian) — complément #25 après QA visuelle. Le drawer est sur
   fond cream ; la PAGE /cart est sur fond sombre → traitement inverse. */

/* Sous-total : police prix = General Sans, jamais Fraunces (serif) */
.template-cart .cart-subtotal--price {
  font-family: var(--font-body-lofi);
}

/* Trust strip blanche (#f8f8f8 via <style> inline) → tint cream sur sombre */
.template-cart .cart-trust-strip {
  background: rgb(var(--lf-text-warm-rgb) / 0.06);
  color: var(--lf-text-warm);
}
.template-cart .cart-trust-strip__icon {
  color: var(--lf-accent);
}

/* Stepper quantité : bordure #dedede + signes #333 invisibles sur sombre → cream */
.template-cart .custom-selector-qty {
  border: 1px solid rgb(var(--lf-text-warm-rgb) / 0.30);
  border-radius: 6px;
}
.template-cart .custom-selector-qty--minus,
.template-cart .custom-selector-qty--add,
.template-cart .custom-selector-qty input {
  color: var(--lf-text-warm);
}
.template-cart .custom-selector-qty input {
  background: transparent;
}

/* Fix listing hub : images cartes "derniers articles" remplissent le conteneur 180px + cover (le thème forçait height:auto) */
.blog-cont-img.effect-img img { width: 100% !important; height: 100% !important; object-fit: cover !important; }
.blog-cont-img.effect-img a { display: block !important; height: 100% !important; }
.blog-cont-img.effect-img { position: relative; }
.blog-cont-img.effect-img .blog__category { position: absolute !important; left: 0; bottom: 0; z-index: 2; margin: 0 !important; }
/* "Ces produits" (cross-sell blog) : titres en système 2 lignes (first/second-line-title-related), identique aux fiches/grilles produit.
   Desktop = hover thème conservé, boîte blanche OPAQUE + texte foncé lisible (la boîte rgba .8 d'origine lavait le texte sur la lampe).
   Mobile = toujours visible sous l'image, cream. */
.cont-associated-product .shopthepost-widget-title { line-height: 1.2 !important; white-space: normal !important; }
.cont-associated-product .shopthepost-widget-title .first-line-title-related { margin: 0 0 1px; color: #555 !important; }
.cont-associated-product .shopthepost-widget-title .second-line-title-related { color: #161226 !important; }
/* Desktop : 2 lignes dans la boîte hover + boîte opaque pour la lisibilité */
.cont-associated-product .shopthepost-item:hover .shopthepost-widget-title { display: block !important; background: rgba(255, 255, 255, 0.97) !important; }
@media (max-width: 749px) {
  /* Mobile : titre toujours visible en cream sur fond sombre, sans boîte ; neutralise le flip inline au survol */
  .cont-associated-product .shopthepost-widget-title .first-line-title-related { color: rgba(243, 238, 219, 0.72) !important; }
  .cont-associated-product .shopthepost-widget-title .second-line-title-related { color: #f3eedb !important; }
  .cont-associated-product .shopthepost-item:hover .shopthepost-widget-title { display: block !important; background: none !important; }
}

/* ==========================================
   BULLE TÉLÉCOMMANDE — Option D (Phase 1, D-05)
   Sticker plum « 🎁 Offerte » flottant sur un coin de l'image produit.
   Ancrée sur .pdp-gallery-block.lf-bubble-anchor (overflow visible) ; bulle en
   position absolute dans .lf-tc-bubble-wrap. Markup + JS : snippets/product-tc-bubble.liquid.
   Tokens --lf-* uniquement (surcharge.css chargé après theme.css : pas besoin de
   forcer la specificity). Contraste ink sur plum ≈ 7,4:1 (AA/AAA), jamais cream sur plum.
   Animation : transform seul (GPU, zéro reflow), gate prefers-reduced-motion: no-preference.
   Holograbme 2026-06-03
   ========================================== */
.lf-bubble-anchor { position: relative; }
.lf-tc-bubble-wrap {
  position: absolute;
  top: -22px;
  right: -22px;
  z-index: 10;
  /* Halo de survol STABLE : le :hover d'un parent se déclenche via l'enfant survolé,
     or le bouton FLOTTE (transform) = cible mouvante -> flicker. Ce padding transparent
     couvre l'amplitude du float (translateY -6px + rotation) : le curseur reste dans la
     zone de hover du wrap même quand le bouton bouge. top/right ajustés de -10 à -22 pour
     compenser le padding 12px et garder la bulle au même endroit visuellement. */
  padding: 12px;
}
.lf-tc-bubble {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: var(--lf-accent);
  color: var(--lf-accent-ink);
  border: none;
  border-radius: 50px;
  padding: 7px 12px 7px 10px;
  font-family: var(--font-body-lofi);
  font-weight: 700;
  font-size: 11px;
  line-height: 1.25;
  box-shadow: 0 4px 16px rgb(var(--lf-accent-rgb) / 0.45), 0 1px 4px rgb(0 0 0 / 0.3);
  cursor: pointer;
  white-space: nowrap;
  user-select: none;
  transition: transform .28s cubic-bezier(.34,1.56,.64,1), box-shadow .22s ease, padding .28s ease;
}
@keyframes lfTcFloat {
  0%   { transform: translateY(0)   rotate(-2deg); }
  35%  { transform: translateY(-6px) rotate(1deg); }
  65%  { transform: translateY(-3px) rotate(-1deg); }
  100% { transform: translateY(0)   rotate(-2deg); }
}
/* D-17 (2026-06-09) — float lfTcFloat : EFFET RECHERCHÉ, on le GARDE (Killian). Le flicker/saccade
   venait de la fermeture au tap sur un dot de galerie → corrigé côté JS (close-on-outside retiré :
   la bulle ne ferme qu'au re-tap dessus). */
@media (prefers-reduced-motion: no-preference) {
  .lf-tc-bubble { animation: lfTcFloat 3s ease-in-out infinite; }
}

/* Bloc Ryviu home (titres + bouton Charger plus) retire 2026-06-22 (bascule Judge.me). */
/* Survol déclenché par le WRAP (cible stable, NON animée). Le float transforme le
   bouton, donc son hit-test suit le transform et bouge ; cibler le wrap fixe évite
   le flicker. AUCUNE modif de géométrie au survol (pas de scale/padding) pour ne pas
   faire osciller le curseur in/out. Seul le float se met en pause + ombre renforcée. */
/* D-16 (2026-06-09) — expand piloté par .is-expanded (JS tap) sur TOUS appareils ; le :hover
   (desktop) isolé en @media (hover:hover) plus bas. Sinon le :hover "collant" du mobile gardait
   la bulle ouverte au re-tap (ne fermait qu'au tap ailleurs). Killian 2026-06-09. */
.lf-tc-bubble.is-expanded {
  animation-play-state: paused;
  box-shadow: 0 8px 28px rgb(var(--lf-accent-rgb) / 0.55), 0 2px 8px rgb(0 0 0 / 0.35);
}
.lf-tc-bubble:focus-visible {
  outline: 2px solid var(--lf-text-warm);
  outline-offset: 3px;
}
.lf-tc-bubble__emoji { font-size: 16px; line-height: 1; }
.lf-tc-bubble__compact { font-weight: 700; }
.lf-tc-bubble__expand {
  max-width: 0;
  opacity: 0;
  overflow: hidden;
  font-weight: 600;
  transition: max-width .3s ease, opacity .24s ease;
}
.lf-tc-bubble.is-expanded .lf-tc-bubble__expand {
  max-width: 340px;
  opacity: 1;
}
.lf-tc-bubble.is-expanded .lf-tc-bubble__compact {
  display: none;
}
@media (hover: hover) and (pointer: fine) {
  .lf-tc-bubble-wrap:hover .lf-tc-bubble {
    animation-play-state: paused;
    box-shadow: 0 8px 28px rgb(var(--lf-accent-rgb) / 0.55), 0 2px 8px rgb(0 0 0 / 0.35);
  }
  .lf-tc-bubble-wrap:hover .lf-tc-bubble__expand { max-width: 340px; opacity: 1; }
  .lf-tc-bubble-wrap:hover .lf-tc-bubble__compact { display: none; }
}
/* touch target mobile ≥ 44×44 (a11y) */
@media (max-width: 768px) {
  .lf-tc-bubble { min-block-size: 44px; padding-block: 10px; }
}

/* ==========================================================================
   PRIX FR — non-cassable (PDP-03). Solution robuste : white-space:nowrap sur
   les éléments de prix au lieu d'une entité &nbsp; dans le format de devise
   (l'entité fuit en texte littéral via strip_html : sticky, panier, emails).
   Le format de devise garde un espace NORMAL ; ce nowrap empêche « 34,90 € »
   de se couper en fin de ligne sur TOUS les points d'affichage.
   Holograbme 2026-06-04
   ========================================================================== */
.money,
.lf-cta-price,
.atc-price,
[data-atc-price],
[data-lf-price] {
  white-space: nowrap;
}

/* ==========================================================================
   2026-06-16 — Badges promo cartes en pilule « -X% » facon PDP
   - Cartes collection + home : .badge-promo--pct (le % est rendu en Liquid dans
     product-grid-item.liquid) -> pilule plum arrondie flottante (coin haut-gauche),
     a l'instar du badge PDP (.sale-tag.large .price-saving-percent, l.211).
   - Cross-sell (.cont-related .badge-sale) : on masque « Economisez X€ »
     (.save-text + .price-sale2), on garde le % (.price-saving-percent) en pilule.
   ========================================================================== */
.product-grid-item .badge-promo--pct {
  top: 8px;
  left: 8px;
  right: auto;
  padding: 4px 7px;
  border-radius: 6px;
  font-family: var(--font-body-lofi);
  font-weight: 700;
  font-size: 12px;
  line-height: 1;
  letter-spacing: 0;
  opacity: 1;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
}

/* Cross-sell « Produits recommandes » : pilule -X% seule (sans « Economisez X€ ») */
.cont-related .badge-sale .save-text,
.cont-related .badge-sale .price-sale2 { display: none; }
.cont-related .badge-sale.sale-tag {
  opacity: 1;
  background: transparent;
  bottom: auto;
  top: 8px;
  left: 8px;
  right: auto;
  padding: 0;
}
.cont-related .badge-sale .price-saving-percent {
  display: inline-block;
  background: var(--lf-accent);
  color: var(--lf-bg-deep);
  font-family: var(--font-body-lofi);
  font-weight: 700;
  font-size: 12px;
  line-height: 1;
  padding: 4px 7px;
  border-radius: 6px;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
}
.cont-related .badge-sale .price-saving-percent .parentheses { display: none; }

@media (max-width: 749px) {
  .product-grid-item .badge-promo--pct { font-size: 11px; padding: 3px 6px; top: 6px; left: 6px; }
  .cont-related .badge-sale.sale-tag { top: 6px; left: 6px; }
  .cont-related .badge-sale .price-saving-percent { font-size: 11px; padding: 3px 6px; }
}


/* JDGM-CAROUSEL-TITLE-WRAP */
#shopify-section-1782043532599e82c7 [class*="carousel-title"],
#shopify-section-1782043532599e82c7 [class*="carousel__title"],
#shopify-section-1782043532599e82c7 .jdgm-carousel-title,
#shopify-section-1782043532599e82c7 h2,
#shopify-section-1782043532599e82c7 h3 {
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
  max-width: none !important;
}


/* JDGM-GRID-BRAND-COLORS */
#shopify-section-1782044768909ed598 .jdgm-rev, #shopify-section-1782044768909ed598 [class*="jdgm"][class*="card"] { background:#f3eedb !important; }
#shopify-section-1782044768909ed598 .jdgm-rev__body, #shopify-section-1782044768909ed598 .jdgm-rev__title, #shopify-section-1782044768909ed598 .jdgm-rev__author, #shopify-section-1782044768909ed598 .jdgm-rev__timestamp, #shopify-section-1782044768909ed598 .jdgm-rev__prod-info { color:#161226 !important; }
#shopify-section-1782044768909ed598 .jdgm-star.jdgm--on { color:#b884d6 !important; }
#shopify-section-1782044768909ed598 .jdgm-star.jdgm--off { color:#b884d655 !important; }
#shopify-section-1782044768909ed598 .jdgm-rev-widg__title, #shopify-section-1782044768909ed598 h2, #shopify-section-1782044768909ed598 h3 { color:#f3eedb !important; }

/* ==========================================
   JUDGE.ME — Widget d'avis PDP (structure jm-*)  [2026-06-22]
   ⚠️ L'app Judge.me garde « Couleur du texte » = #000000 (noir) => illisible sur le fond
   Lo-fi #161226, et Killian ne peut pas le modifier côté app. On force donc côté thème :
   texte crème, étoiles plum (= réglage app #B884D6 + note inline rating-inline), bouton à texte foncé.
   (Le filet CSS est ASSUMÉ ici car l'app ne fait pas le job — décision 2026-06-22.)
   ========================================== */
.jdgm-review-widget,
.jdgm-review-widget * { color: #f3eedb !important; }

.jdgm-review-widget [class*="jm-star"],
.jdgm-review-widget [class*="jm-star"] svg,
.jdgm-review-widget [class*="jm-star"] svg * { color: #b884d6 !important; fill: #b884d6 !important; }

.jdgm-review-widget [class*="jm-action-buttons"],
.jdgm-review-widget [class*="jm-action-buttons"] * { color: #161226 !important; }

.jdgm-review-widget .jm-review-item,
.jdgm-review-widget [class*="jm-review-item"] { border-color: rgba(243,238,219,0.18) !important; }

/* Étoiles d'avis sur les CARTES (collections + accueil) — Judge.me, plum, rendu custom [2026-06-22] */
/* ⚠️ !important sur les couleurs : la home force le texte des cartes en crème et écrasait le plum (sinon étoiles "blanches"). */
.jdgm-card-rating-wrap { min-height: 24px; margin: 4px 0 6px; }
.jdgm-card-rating { display: inline-flex; align-items: center; gap: 6px; text-decoration: none; line-height: 1; }
.jdgm-card-rating__stars { position: relative; display: inline-block; white-space: nowrap; letter-spacing: 2px; font-size: 20px; }
.jdgm-card-rating__stars .jcr-track { color: rgba(184,132,214,0.32) !important; }
.jdgm-card-rating__stars .jcr-fill { position: absolute; top: 0; left: 0; overflow: hidden; white-space: nowrap; color: #b884d6 !important; }
.jdgm-card-rating__count { color: #b8b2c9 !important; font-size: 13px; }

/* ==========================================
   PAGE AVIS — carousel Judge.me "Legacy" (#1782044768909ed598) → matcher le look "Cards Carousel" home
   Le widget legacy rend transparent + liens bleus #186AB9 par défaut. On force : cartes crème,
   texte foncé (lisible sur crème), étoiles plum, zéro bleu. [2026-06-22]
   ⚠️ Cibler via [id*="..."] : l'ID rendu = shopify-section-template--XXXX__1782044768909ed598
   (préfixe template variable) → un sélecteur #shopify-section-1782044... ne matche JAMAIS.
   ========================================== */
[id*="1782044768909ed598"] .jdgm-carousel-item {
  box-sizing: border-box !important;
  background: #f3eedb !important;
  background-clip: padding-box !important;       /* la crème s'arrête à la bordure -> les bordures transparentes = vrai gap entre cartes */
  border-left: 10px solid transparent !important;
  border-right: 10px solid transparent !important;  /* 10+10 = 20px d'écart entre cartes (= gap flex 20px de la home), largeur d'item INCHANGÉE -> slider OK */
  border-radius: 8px !important;
  padding: 16px 18px !important;
}
[id*="1782044768909ed598"] .jdgm-carousel-item,
[id*="1782044768909ed598"] .jdgm-carousel-item * { color: #161226 !important; }
[id*="1782044768909ed598"] .jdgm-carousel-item a { color: #7b7b7b !important; }
[id*="1782044768909ed598"] .jdgm-carousel-item .jdgm-star.jdgm--on { color: #b884d6 !important; }
[id*="1782044768909ed598"] .jdgm-carousel-item .jdgm-star { color: rgba(184,132,214,0.30) !important; }
/* En-tête (hors cartes, sur fond sombre) : titre + "sur N avis" en crème, étoiles plum, plus de bleu */
[id*="1782044768909ed598"] .jdgm-carousel-title,
[id*="1782044768909ed598"] .jdgm-all-reviews-rating,
[id*="1782044768909ed598"] .jdgm-all-reviews-rating *,
[id*="1782044768909ed598"] .jdgm-carousel-number-of-reviews { color: #f3eedb !important; }
[id*="1782044768909ed598"] .jdgm-all-reviews-rating .jdgm-star.jdgm--on { color: #b884d6 !important; }


/* JDGM-CAROUSEL-HOME-V2 */ (carousel home cards_carousel)
.jdgm-carousel-item,.jdgm-carousel-item__inner-wrapper,.jdgm-carousel-item__review-content-wrapper,.jdgm-carousel-item__review-wrapper{background:#f3eedb !important;}
.jdgm-carousel-item__review-body,.jdgm-carousel-item__review-body-only,.jdgm-carousel-item__review-title,.jdgm-carousel-item__reviewer-name,.jdgm-carousel-item__product-title,.jdgm-carousel-item__timestamp{color:#161226 !important;}
.jdgm-carousel-item .jdgm-star.jdgm--on{color:#b884d6 !important;fill:#b884d6 !important;}
.jdgm-carousel-item .jdgm-star.jdgm--off{color:rgba(184,132,214,.35) !important;fill:rgba(184,132,214,.35) !important;}


/* JDGM-SORT-DROPDOWN-V2 — contraste du tri d'avis sur fond sombre Lo-fi (2026-06-23).
   Le <select> .jdgm-sort-dropdown est transparent + flèche border-top noire (invisible sur deep purple)
   + options héritant du cream. Scopé sur les classes universelles .jdgm-*, pas #shopify-section. */
.jdgm-sort-dropdown.jdgm-sort-dropdown {
  color: #f3eedb !important;
  border-color: rgba(243,238,219,0.32) !important;
  background: transparent !important;
}
.jdgm-sort-dropdown.jdgm-sort-dropdown option {
  color: #161226 !important;
  background: #f3eedb !important;
}
.jdgm-sort-dropdown-arrow { border-top-color: #f3eedb !important; }

/* ===================================================================
   FIX MOBILE OVERFLOW (Claude, 2026-06-23)
   Empeche le scroll/drag horizontal de la page sur mobile (le widget
   avis Judge.me + carrousels debordaient le viewport < ~390px).
   overflow-x: clip (PAS hidden) = preserve position:sticky (header + ATC).
   =================================================================== */
@media (max-width: 768px) {
  body { overflow-x: clip; }
  .jdgm-widget, .jdgm-rev-widg { max-width: 100%; overflow-x: clip; }
}

/* FIX widget avis "colle a gauche" sur mobile (Claude, 2026-06-23) :
   le widget Judge.me etait a left:0 alors que le reste du contenu PDP
   est en retrait de 15px. On lui rend la meme gouttiere horizontale.
   Mobile only (desktop = deja aligne dans .page-width). */
@media (max-width: 768px) {
  .jdgm-widget { padding-left: 15px; padding-right: 15px; box-sizing: border-box; }
}

/* Renfort drag horizontal mobile (Claude, 2026-06-23) : le scroll horizontal
   de page est porte par <html> (documentElement), pas seulement <body>.
   clip (pas hidden) = sticky header + ATC preserves. */
@media (max-width: 768px) {
  html { overflow-x: clip; }
}
