/*
 * Chaussmart — feuille de style propre au thème enfant (parent : Hummingbird).
 *
 * POURQUOI CE NOM DE FICHIER : le cœur enregistre /assets/css/custom.css du
 * thème actif sur chaque page front, en dernier (FrontController::setMedia,
 * priorité 1000 contre 50 pour theme.css). Le thème actif étant l'enfant
 * `chaussmart`, ce fichier-ci est chargé par son seul nom : rien ne le déclare,
 * aucun theme.yml, aucune balise <link>. Le renommer le déchargerait en silence.
 * Hummingbird ne livre pas de custom.css, il n'y a donc rien à préserver du
 * parent.
 *
 * Chargé en dernier, il l'emporte sur Hummingbird à spécificité égale.
 * !important est réservé aux cas où il n'existe pas d'autre levier : utilitaire
 * Bootstrap qui pose déjà !important (.mb-3) ou style inline écrit par un script
 * (core.js, PayPal, blockreassurance). Chaque usage est justifié sur place.
 */

/* ------------------------------------------------------------------------- *
 * 1. Socle : polices, tokens et composants globaux
 *
 * Tokens posés sur :root pour rester résolvables dans les éléments propres à
 * Hummingbird, hors de tout conteneur Chaussmart.
 *
 * Piège Bootstrap 5.3 : Hummingbird compile la plupart des variantes de
 * composants en valeurs en dur (.btn-primary, .btn-outline-primary…), pas en
 * var(--bs-primary). Redéfinir --bs-primary ne les recolore pas : on re-pointe
 * les variables propres au composant (--bs-btn-*…).
 * ------------------------------------------------------------------------- */
/* --- Police des textes : Lato, auto-hébergée -------------------------------
 * Remplace Inter, la police de Hummingbird. Fichiers woff2 statiques, romain et
 * italique en 100, 300, 400, 700 et 900, dans assets/fonts/lato/, licence SIL
 * OFL 1.1 (OFL.txt à côté). Lato n'a ni 500 ni 600 : le navigateur rend un 500
 * demandé par le thème en 400, un 600 en 700. Sous-ensembles latin et latin-ext
 * seulement ; seuls les fichiers réellement utilisés sont téléchargés. */
@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 100;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-100.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-300.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-400.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-700.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-900.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 100;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-100-italic.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 300;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-300-italic.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-400-italic.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 700;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-700-italic.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 900;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-900-italic.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 100;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-100.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-300.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-400.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-700.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-900.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 100;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-100-italic.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 300;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-300-italic.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-400-italic.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 700;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-700-italic.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 900;
  font-display: swap;
  src: url("../fonts/lato/lato-latin-ext-900-italic.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

:root {
  /* --- Couleurs de marque ---------------------------------------------------
   * Deux niveaux par couleur :
   * - --cs-main / --cs-secondary : teinte exacte de la charte, réservée au décor
   *   (ombres, halos, puces, indicateurs de carrousel) ;
   * - --cs-*-strong : teinte lisible pour le texte, les fonds sous texte blanc,
   *   les contours de focus et les indicateurs d'état. Pour Chaussmart elle est
   *   identique à la teinte exacte.
   * Les boutiques dont la charte diffère redéfinissent --cs-main, --cs-secondary
   * et les formes -rgb via le module chaussmartpalette ; les variantes -strong
   * les suivent par var(), sans correction de contraste pour l'instant. Ne rien
   * coder en dur ailleurs : lire ces tokens. Transparences et teintes se
   * dérivent par color-mix ; seules les formes -rgb, exigées par Bootstrap,
   * sont des COPIES à changer avec les teintes. */
  --cs-main: #6b3689;
  --cs-secondary: #ef4b8f;
  --cs-main-strong: var(--cs-main);
  --cs-secondary-strong: var(--cs-secondary);
  /* Séparateur virgule : format attendu par les variables -rgb de Bootstrap. */
  --cs-main-strong-rgb: 107, 54, 137;
  --cs-secondary-strong-rgb: 239, 75, 143;
  /* Fonds teintés de la couleur principale (sélection, survol, encarts). Dérivés
   * par color-mix : ils suivent la palette de chaque boutique. */
  --cs-main-tint: color-mix(in srgb, var(--cs-main) 12%, var(--cs-pure-white));
  --cs-main-tint-light: color-mix(in srgb, var(--cs-main) 7%, var(--cs-pure-white));
  --cs-main-tint-faint: color-mix(in srgb, var(--cs-main) 3%, var(--cs-pure-white));
  --cs-text-dark: #404040;
  --cs-text-accent: #101010;
  --cs-text-info: #616066;
  --cs-border: #DDDDDD;
  --cs-background: #F6F6F6;
  --cs-pure-white: #FFFFFF;
  --cs-danger: #c62828;
  --cs-danger-hover: #a61f1f;
  /* États de formulaire et d'étapes (tunnel, compte, adresses). */
  --cs-success: #1e7d45;
  --cs-error: #b3175a;
  --cs-error-soft: #e7a3c0;
  --cs-error-bg: #fdeef4;
  --cs-control: #8a8a8a;
  --cs-control-idle: #cfcfcf;
  /* Ombres partagées : panneaux déroulants (recherche, mega menu) et barres
   * fixes en bas d'écran (tunnel mobile). */
  --cs-shadow-panel: 0 14px 28px color-mix(in srgb, var(--cs-main) 16%, transparent);
  --cs-shadow-bar: 0 -6px 20px rgb(16 16 16 / 8%);
  --cs-font-body: "Lato", system-ui, -apple-system, "Segoe UI", sans-serif;

  /* Bootstrap lit ces deux variables pour body et les composants : les
   * redéfinir remplace Inter partout où Hummingbird ne l'écrit pas en dur. */
  --bs-font-sans-serif: var(--cs-font-body);
  --bs-body-font-family: var(--cs-font-body);

  /* --- Couleur de marque sur les liens ------------------------------------
   * Hummingbird est Bootstrap 5.3 : le sélecteur a{} lit --bs-link-color-rgb à
   * l'exécution (color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity))).
   * Redéfinir ces variables ici recolore donc TOUS les liens du site — contenu,
   * mais aussi navigation, fil d'ariane, pied de page. La forme -rgb est
   * obligatoire, la forme hex seule ne serait pas lue par ce sélecteur.
   * Base --cs-secondary-strong, survol --cs-main-strong. */
  --bs-link-color: var(--cs-secondary-strong);
  --bs-link-color-rgb: var(--cs-secondary-strong-rgb);
  --bs-link-hover-color: var(--cs-main-strong);
  --bs-link-hover-color-rgb: var(--cs-main-strong-rgb);
}

/* Hummingbird compile font-family: Inter en dur sur ces deux composants. */
.popover,
.tooltip {
  font-family: var(--cs-font-body);
}

/* --- Couleur de marque sur les boutons primaires ---------------------------
 * Le bouton « Ajouter au panier » (.product__add-to-cart-button) et le bouton
 * « Commander » du tunnel sont tous deux des .btn-primary. Bootstrap a compilé
 * la variante primaire en valeurs EN DUR sur .btn-primary (--bs-btn-bg:#0b69f6…),
 * pas en var(--bs-primary) : redéfinir --bs-primary ne les toucherait pas. On
 * re-pointe donc les variables propres au composant bouton, ce qui couvre d'un
 * seul bloc le fond, la bordure et les états survol / actif / désactivé.
 * Texte blanc du thème ; fond en couleur secondaire, survol et actif en
 * couleur principale.
 */
.btn-primary {
  --bs-btn-bg: var(--cs-secondary-strong);
  --bs-btn-border-color: var(--cs-secondary-strong);
  --bs-btn-hover-bg: var(--cs-main-strong);
  --bs-btn-hover-border-color: var(--cs-main-strong);
  --bs-btn-active-bg: var(--cs-main-strong);
  --bs-btn-active-border-color: var(--cs-main-strong);
  --bs-btn-disabled-bg: var(--cs-secondary-strong);
  --bs-btn-disabled-border-color: var(--cs-secondary-strong);
}

/* --- Sur-titre (style partagé) ---------------------------------------------
 * Petit libellé en capitales espacées au-dessus d'un titre, identique sur tout
 * le site : .cs-overline (sections de la home) et .cs-cms__split-index (pages
 * CMS) partagent cette règle ; chaque composant ne règle que ses marges.
 * Couleur principale, en variante texte (--cs-main-strong). Sur fond sombre
 * (bloc newsletter), le sur-titre garde sa propre couleur, lisible.
 * Taille de la home (#141), pages CMS comprises. */
.cs-overline,
.cs-cms__split-index {
  font-size: clamp(1rem, 1.6vw, 1.25rem);
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--cs-main-strong);
}

/* --- Titre et texte de bloc (styles partagés) -------------------------------
 * Typographie commune des titres de la home, du bloc newsletter et des pages
 * CMS : chaque bloc
 * ne règle que sa marge, et, hors sections de la home (« Home — rythme
 * vertical »), sa taille et sa couleur. Les règles des modules (téléphone,
 * Introduction) étant chargées avant ce fichier, elles n'y redéfinissent rien.
 * Texte courant des blocs à aplat (zones promo, newsletter, téléphone) : même
 * taille et interligne.
 *
 * Tokens partagés entre la home et les pages CMS (#147) :
 * - --cs-panel-padding : retrait intérieur des aplats (panneau newsletter,
 *   bande teintée et cartouche CMS) ;
 * - --cs-block-text-size / --cs-block-text-line-height : texte courant de
 *   l'Introduction (chaussmarthome) et des pages CMS ;
 * - --cs-panel-title-size : titre de la section téléphone (chaussmarthomephone)
 *   et du cartouche CMS.
 * Les modules, chargés avant ce fichier, les lisent avec leur valeur mobile en
 * repli. */
:root {
  --cs-panel-padding: 2rem 1.375rem;
  --cs-block-text-size: 1rem;
  --cs-block-text-line-height: 1.6;
  --cs-panel-title-size: 1.625rem;
}

@media (min-width: 992px) {
  :root {
    --cs-panel-padding: 3rem;
    --cs-block-text-size: 1.125rem;
    --cs-block-text-line-height: 1.65;
    --cs-panel-title-size: 2.125rem;
  }
}

.cs-home-width__title,
.cs-home-shortcuts__title,
.cs-home-featured__title,
.cs-home-promo__title,
.cs-home-intro__title,
.cs-home-phone__title,
.cs-newsletter__title,
.cs-cms__title,
.cs-cms__split-title,
.cs-cms__card-title,
.cs-cms__note-title {
  font-weight: 400;
  line-height: 1.08;
  letter-spacing: -0.02em;
}

.cs-home-promo__text,
.cs-home-phone__text,
.cs-newsletter__text {
  margin: 0;
  font-size: 0.9375rem;
  line-height: 1.55;
}

@media (min-width: 992px) {
  .cs-home-promo__text,
  .cs-home-phone__text,
  .cs-newsletter__text {
    font-size: 1.0625rem;
    line-height: 1.6;
  }
}

/* --- Nom de produit dans les miniatures ------------------------------------
 * La règle globale sur les liens colorerait aussi le nom du produit dans les
 * listes : il reste en --cs-text-accent, avec le survol commun des liens. Un
 * sélecteur de classe suffit à battre le a{} du thème.
 */
.product-miniature__title {
  color: var(--cs-text-accent);
}

.product-miniature__title:hover {
  color: var(--cs-main-strong);
}

/* --- Miniature produit Chaussmart -----------------------------------------
 * Carte de 300 px de large et de hauteur naturelle. Le lien du titre étend sa
 * zone cliquable à toute la carte ; les coloris restent informatifs. */
.product-miniature {
  width: 100%;
  max-width: 300px;
  margin-inline: auto;
}

.product-miniature__inner {
  position: relative;
  display: flex;
  flex-direction: column;
  width: 100%;
  height: auto;
  padding: 15px 20px;
  overflow: hidden;
  background: var(--cs-pure-white);
  border: 0;
  border-bottom: 1px solid var(--cs-border);
  border-radius: 0;
  box-shadow: none;
}

.product-miniature__top {
  position: relative;
  display: flex;
  flex: 0 0 auto;
  flex-direction: column;
  gap: 15px;
  min-height: 0;
  border-radius: 0;
}

.product-miniature__flags {
  display: flex;
  flex: 0 0 auto;
  min-height: 1.375rem;
}

.product-miniature__flags > .product-flags {
  position: static;
  z-index: auto;
  display: flex;
  flex: 0 0 auto;
  flex-flow: row wrap;
  gap: 0.35rem;
  margin: 0;
  padding: 0;
}

.product-miniature__image-container {
  display: flex;
  flex: 0 0 auto;
  align-items: center;
  align-self: center;
  justify-content: center;
  width: 260px;
  max-width: 100%;
  aspect-ratio: 1;
  overflow: hidden;
}

.product-miniature__image-container picture {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
}

.product-miniature__image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.product-miniature__bottom {
  display: flex;
  flex: 0 0 auto;
  flex-direction: column;
  gap: 15px;
  padding: 15px 0 0;
}

.product-miniature__variants {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  min-height: 20px;
  overflow: hidden;
}

.product-miniature__color,
.product-miniature__color-more {
  display: inline-flex;
  flex: 0 0 20px;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  background-position: center;
  background-size: cover;
  border: 1px solid var(--cs-border);
  border-radius: 50%;
}

.product-miniature__color-more {
  color: var(--cs-pure-white);
  font-size: 1rem;
  font-weight: 700;
  line-height: 1;
  background: var(--cs-border);
}

.product-miniature__color-more--compact,
.product-miniature__color-more--narrow {
  display: none;
}

@container product-miniature (width < 291px) {
  .product-miniature__color:nth-child(n + 6),
  .product-miniature__color-more--desktop {
    display: none;
  }

  .product-miniature__color-more--compact {
    display: inline-flex;
  }
}

@container product-miniature (width < 204px) {
  .product-miniature__color:nth-child(n + 4),
  .product-miniature__color-more--compact {
    display: none;
  }

  .product-miniature__color-more--narrow {
    display: inline-flex;
  }
}

.product-miniature__meta {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 0.75rem;
  min-width: 0;
}

.product-miniature__identity {
  min-width: 0;
}

.product-miniature__brand,
.product-miniature__title {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.product-miniature__brand {
  margin-bottom: 0.3rem;
  color: var(--cs-text-info);
  font-size: 0.75rem;
  text-transform: uppercase;
}

.product-miniature__title {
  font-size: 1.125rem;
  line-height: 1.15;
  text-transform: uppercase;
}

.product-miniature__title::after {
  position: absolute;
  z-index: 2;
  inset: 0;
  content: "";
}

.product-miniature__title:focus-visible {
  outline: none;
}

.product-miniature__title:focus-visible::after {
  border-radius: 2px;
  outline: 3px solid var(--cs-main-strong);
  outline-offset: -3px;
}

.product-miniature__prices {
  display: flex;
  flex: 0 0 auto;
  flex-direction: column;
  align-items: flex-end;
  line-height: 1.15;
  white-space: nowrap;
}

.product-miniature__regular-price {
  color: var(--cs-text-info);
  font-size: 0.8rem;
  text-decoration: line-through;
}

.product-miniature__price {
  color: var(--cs-text-accent);
  font-size: 1.125rem;
  font-weight: 700;
}

.product-miniature__reviews,
.product-miniature__reviews-empty {
  min-height: 16px;
}

.product-miniature__reviews-empty {
  display: flex;
  align-items: center;
}

.product-miniature__reviews:has([data-ps-ref="number-value"]:not(:empty))
  .product-miniature__reviews-empty {
  display: none;
}

/* --- Badges (flags) sur les photos produit ---------------------------------
 * « Nouveau », « Promo », « -20 % »… rendus par product-flags.tpl, partagé par
 * la miniature et la fiche produit (via product-cover-thumbnails.tpl). Une seule
 * règle couvre donc les deux.
 *
 * Hummingbird colore ces badges à partir de --bs-primary / --bs-primary-rgb, lus
 * à l'exécution (fond et bordure des badges pleins, texte du badge remise). On
 * redéfinit ces variables SCOPÉES sur .product-flags, et non sur :root : sinon
 * tout ce qui utilise --bs-primary ailleurs (.text-primary, anneaux de focus…)
 * changerait de couleur.
 *
 * Le badge remise garde le style inversé du thème (texte en couleur principale
 * sur fond blanc) ; les badges pleins sont en aplat de couleur principale. */
.product-flags {
  --bs-primary: var(--cs-main-strong);
  --bs-primary-rgb: var(--cs-main-strong-rgb);
}

.product-flags .badge {
  font-size: 0.75rem;
  border-radius: 999px;
}

/* --- Galerie photo de la fiche produit (#229) ------------------------------
 * Piste à défilement natif (catalog/_partials/product-cover-thumbnails.tpl) :
 * une image par largeur, arrêt obligatoire sur l'image la plus centrée. Le
 * navigateur gère seul le suivi du doigt, l'inertie et l'arrêt ; custom.js
 * pilote flèches et miniatures. Pas de scroll-snap-stop: always, pour garder
 * l'inertie native d'un lancer rapide. La barre de défilement est masquée :
 * flèches et miniatures en tiennent lieu. */
.product__gallery {
  position: relative;
}

.product__track {
  display: flex;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
}

.product__track::-webkit-scrollbar {
  display: none;
}

.product__slide {
  flex: 0 0 100%;
  scroll-snap-align: center;
}

/* Flèches regroupées en bas à droite, toujours visibles ; aux extrémités, la
 * flèche reste en place, estompée et sans ombre. */
.product__gallery-nav {
  position: absolute;
  right: 1rem;
  bottom: 1rem;
  z-index: 2;
  display: flex;
  gap: 0.5rem;
}

.product__gallery-arrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background-color: var(--cs-pure-white);
  color: var(--cs-text-accent);
  box-shadow: 0 2px 6px rgb(16 16 16 / 16%);
  transition: color 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;
}

.product__gallery-arrow:hover:not([aria-disabled="true"]) {
  color: var(--cs-main-strong);
  box-shadow: 0 3px 10px rgb(16 16 16 / 22%);
}

.product__gallery-arrow:focus-visible {
  outline: 3px solid var(--cs-main-strong);
  outline-offset: 2px;
}

/* aria-disabled (custom.js) et non disabled : la flèche garde le focus clavier. */
.product__gallery-arrow[aria-disabled="true"] {
  opacity: 0.45;
  box-shadow: none;
  cursor: default;
}

.product__gallery-arrow .material-icons {
  font-size: 1.5rem;
}

/* L'image ouvre la lightbox (#231) : bouton sans habillage, curseur loupe, sur
 * toute la hauteur de la diapo (étirée par la piste), pour que la zone cliquable
 * ne dépende pas du chargement de l'image. Image calée en haut, comme sans
 * bouton (un bouton centre son contenu). */
.product__slide-zoom {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  width: 100%;
  height: 100%;
  padding: 0;
  border: 0;
  background: none;
  cursor: zoom-in;
}

.product__slide-zoom img {
  display: block;
}

/* Focus dessiné à l'intérieur : la galerie masque ce qui déborde. */
.product__slide-zoom:focus-visible {
  outline: 3px solid var(--cs-main-strong);
  outline-offset: -3px;
}

/* Points de pagination (#232), en bas au centre sur une pastille
 * semi-transparente : 5 points au plus (fenêtre gérée par custom.js), l'actif
 * en pilule, ceux de bord de fenêtre réduits. Indicateurs seulement : on
 * navigue par glisser. */
.product__gallery-dots {
  position: absolute;
  bottom: 0.75rem;
  left: 50%;
  z-index: 2;
  padding: 0.375rem 0.5rem;
  border-radius: 999px;
  background-color: color-mix(in srgb, var(--cs-pure-white) 75%, transparent);
  transform: translateX(-50%);
  pointer-events: none;
}

.product__gallery-dots-track {
  display: flex;
  align-items: center;
  gap: 0.25rem;
}

.product__gallery-dot {
  display: none;
  width: 0.375rem;
  height: 0.375rem;
  border-radius: 999px;
  /* 60 % : contraste supérieur à 3:1 sur la pastille (indicateur d'état). */
  background-color: color-mix(in srgb, var(--cs-text-accent) 60%, transparent);
  transition: width 0.2s ease, height 0.2s ease, background-color 0.2s ease;
}

.product__gallery-dot.is-visible {
  display: block;
}

.product__gallery-dot.is-edge {
  width: 0.25rem;
  height: 0.25rem;
}

.product__gallery-dot.is-active {
  width: 1rem;
  background-color: var(--cs-text-accent);
}

@media (prefers-reduced-motion: reduce) {
  .product__gallery-dot {
    transition: none;
  }
}

/* Pas de pastille vide avant l'initialisation par custom.js (fenêtre de points). */
.product__gallery:not([data-cs-gallery-ready]) .product__gallery-dots {
  display: none;
}

/* Bascule par type de pointeur principal, pas par largeur : souris ou trackpad,
 * flèches et miniatures ; doigt (téléphone, tablette même en paysage), points.
 * En tactile, les flèches restent dans l'arbre d'accessibilité (VoiceOver,
 * contrôle de sélection) et réapparaissent quand le clavier les atteint
 * (tablette avec clavier) : masquées visuellement, pas retirées. */
@media (hover: hover) and (pointer: fine) {
  .product__gallery-dots {
    display: none;
  }
}

@media not all and (hover: hover) and (pointer: fine) {
  .product__images .product__thumbnails {
    display: none;
  }

  .product__gallery-nav:not(:focus-within) {
    clip-path: inset(50%);
    width: 1px;
    height: 1px;
    overflow: hidden;
    white-space: nowrap;
  }
}

/* --- En-têtes de l'accordéon de la fiche produit ---------------------------
 * Description, Détail Produit, Fiche technique… (.accordion-button). Fermé, le
 * thème les met en --bs-body-color ; OUVERT, en --bs-accordion-active-color, qui
 * pointe sur --bs-link-hover-color, notre couleur de survol des liens. Les deux
 * états sont forcés en --cs-text-accent, scopés à .product__accordion pour ne
 * pas toucher les autres accordéons (tunnel, CMS). Même spécificité que
 * .accordion : notre feuille, chargée après, l'emporte. */
.product__accordion {
  --bs-accordion-btn-color: var(--cs-text-accent);
  --bs-accordion-active-color: var(--cs-text-accent);
}

/* Informations produit dans la colonne de droite, sous le bouton panier (#418) :
 * détails ouverts, puis l'accordéon Caractéristiques (ouverte) / En savoir plus
 * (repliée) (product-details.tpl). */
/* Espace sous le bouton panier : 2,5rem (40px), pour le laisser respirer. */
.product__right .product__add-to-cart-container {
  margin-block-end: 2.5rem;
}

/* Puces des détails remplacées par une icône check_circle_outline. */
#product_details .cs-detail-more ul {
  padding-inline-start: 1.625rem;
  list-style: none;
}

#product_details .cs-detail-more li {
  position: relative;
  line-height: 1.75rem;
}

/* check_circle_outline (E92D) de Material Icons ; texte alternatif vide : décoratif.
   Boîte de la hauteur d'une ligne (1,75rem, cf. li) et icône centrée dedans : alignée sur la
   première ligne du texte, même si l'élément passe sur plusieurs lignes. */
#product_details .cs-detail-more li::before {
  content: "\e92d" / "";
  position: absolute;
  inset-inline-start: -1.625rem;
  inset-block-start: 0;
  display: flex;
  align-items: center;
  height: 1.75rem;
  font-family: "Material Icons";
  font-size: 1.125rem;
  line-height: 1;
  color: var(--cs-main);
}

.product__right .product__accordion {
  margin-block-start: 1.5rem;
}

/* --- Galerie fixe au défilement (#418) -------------------------------------
 * À deux colonnes (lg, 992px, grille du thème), la galerie reste visible pendant
 * que la colonne de droite défile, puis remonte avec la page quand la grille se
 * termine, avant « Commentaires » : comportement natif de sticky.
 * align-self: start, sinon la cellule s'étire sur toute la grille et ne colle pas.
 * Sticky « par le bas » : si la galerie tient sous le header, elle s'y colle
 * (--scroll-padding-top : hauteur du header sticky + 16px, Hummingbird) ; plus
 * haute, elle se colle une fois son bas (miniatures) visible, à 1rem du bas de la
 * fenêtre, son haut passant sous le header ou hors écran. svh et non vh : hauteur
 * avec les barres du navigateur déployées, sinon les miniatures passent dessous
 * sur tablette. --cs-gallery-height vient de custom.js : sans elle, le calc est
 * invalide, top retombe à auto et la galerie défile.
 * .product__container > : la quickview porte aussi .page-product et .product__left. */
@media (min-width: 992px) {
  .page-product .product__container > .product__left {
    position: sticky;
    top: min(var(--scroll-padding-top, 1rem), calc(100svh - var(--cs-gallery-height) - 1rem));
    align-self: start;
  }
}

/* --- Header : logo dans le bandeau haut, icônes compte / panier -------------
 * Va avec la surcharge templates/_partials/header.tpl, qui déplace le logo dans
 * le bandeau haut (à la place du téléphone). Ici on complète côté style.
 */

/* Piège : le logo de la barre principale est masqué sur desktop dans le template
   (classe d-md-none), pas ici : une règle du thème à forte spécificité bat un
   display:none de cette feuille. Voir templates/_partials/header.tpl. */

/* Hauteur du logo bornée pour qu'il n'étire pas le bandeau haut ; ratio conservé. */
.cs-header-top-logo .logo {
  max-height: 44px;
  width: auto;
}

/* Icônes compte et panier du bandeau haut en --cs-text-accent. Deux classes plus
   un élément : la règle bat celle du thème sans !important. */
.header-top__right .header-block__icon {
  color: var(--cs-text-accent);
}

/* Bandeau haut plus aéré (0.25rem dans Hummingbird). */
.header-top {
  padding-block: 0.5rem;
}

/* Trois zones : logo, recherche, compte / panier. displayNav2 rend la
   recherche et les liens compte / panier dans un même conteneur
   (.header-top__right). La recherche y passe en tête quelle que soit sa
   position de greffe (order) et fait 360px au plus ; la marge auto repousse le
   reste à droite. Sous 992px, logo puis recherche, qui prend la place libre
   sans être centrée : le centrage strict l'écraserait. */
.cs-header-top-grid {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 1rem;
}

.cs-header-top-grid .header-top__right {
  flex-wrap: nowrap;
  gap: 0.5rem;
}

.cs-header-top-grid .header-top__right > * {
  flex-shrink: 0;
}

.cs-header-top-grid .cs-header-search {
  order: -1;
  flex: 0 1 360px;
  min-width: 0;
  margin-inline-end: auto;
}

/* À partir de 992px : les colonnes latérales partagent l'espace restant à
   parts égales, ce qui centre vraiment la colonne du milieu. Le conteneur
   displayNav2 couvre celles du milieu et de droite ; la recherche, en tête et
   à 360px, occupe donc exactement la colonne du milieu. Si le nom du client
   (22 caractères au plus) déborde de la colonne de droite, la recherche
   rétrécit et se décale légèrement plutôt que de chevaucher les liens. */
@media (min-width: 992px) {
  .cs-header-top-grid {
    grid-template-columns: minmax(max-content, 1fr) minmax(0, 360px) 1fr;
  }

  .cs-header-top-grid .header-top__right {
    grid-column: 2 / 4;
  }
}

/* Hummingbird impose min-width: 19rem et une marge verticale à la recherche,
   pensés pour la barre principale. */
.cs-header-top-grid .ps-searchbar {
  width: 100%;
  min-width: 0;
  margin-block: 0;
}

/* Le panneau de résultats (480px) est calé à droite du champ par le thème
   (left: -120px), pour une recherche en bout de barre. Centré sous le champ. */
.cs-header-top-grid .ps-searchbar__dropdown {
  left: 50%;
  transform: translateX(-50%);
}

/* ps_searchbar encore greffé sur displayTop (environnement neuf, ou greffe
   pas encore faite après un déploiement) : la recherche retrouve sa place
   native, en bout de barre principale. Voir docs/development/theme.md. La
   largeur annule le width: 100% que .row impose à ses enfants (col-auto du
   template d'origine). */
.header-bottom .cs-header-search {
  order: 2;
  flex: 0 0 auto;
  width: auto;
  margin-inline-start: auto;
}

/* Emplacement de la loupe mobile dans la barre principale (header.tpl) : il
   s'efface pour que la loupe déplacée soit directement une colonne de la
   rangée, comme les autres icônes. */
.cs-searchbar-toggle-slot {
  display: contents;
}

/* Menu desktop centré dans la barre principale (la recherche est dans le
   bandeau haut). Le menu desktop n'apparaît qu'à partir de xl. */
@media (min-width: 1200px) {
  .ps-mainmenu--desktop {
    justify-content: center;
  }
}

/* Barre principale de 60px : le thème donne 1.25rem de padding vertical aux
   liens et au chevron du menu (64px de haut). 13.5px les ramènent à 51px, plus
   2 × 4px de padding de .header-bottom et 1px de bordure. Même sélecteur que le
   thème, notre feuille est chargée après. */
.ps-mainmenu:is(.ps-mainmenu--desktop) .ps-mainmenu__tree > li .ps-mainmenu__tree-link,
.ps-mainmenu:is(.ps-mainmenu--desktop) .ps-mainmenu__tree > li .ps-mainmenu__tree-dropdown-toggle {
  padding-block: 13.5px;
}

/* Items de premier niveau du menu principal, sur tous les écrans : barre du
   menu desktop (xl) et premier niveau du panneau mobile / tablette. Le mega
   menu et les sous-niveaux du panneau ne sont pas concernés. Texte en
   --cs-text-accent, 1px plus grand, graisse 700 (Lato n'a pas de 600) ; le
   chevron desktop suit la couleur.

   Priorité : Hummingbird déclare ses règles du menu dans @layer ps-components,
   custom.css n'est dans aucune couche. Nos règles gagnent donc quelle que soit
   la spécificité, y compris sur les états du thème : il faut les redéclarer
   ici (item de la page courante, appui, survol, focus clavier).

   Interligne fixé à 1.5rem : avec 17px et l'interligne 1.5 du thème, le lien
   passerait de 24px à 25.5px et la barre principale dépasserait les 60px
   calculés plus haut. */
.ps-mainmenu__tree > li > .ps-mainmenu__tree-item-wrapper > .ps-mainmenu__tree-link,
.ps-mainmenu__tree > li > .ps-mainmenu__tree-item-wrapper > .ps-mainmenu__tree-dropdown-toggle,
#menu-mobile > .menu__list > li > .menu__link {
  color: var(--cs-text-accent);
}

.ps-mainmenu__tree > li > .ps-mainmenu__tree-item-wrapper > .ps-mainmenu__tree-link,
#menu-mobile > .menu__list > li > .menu__link {
  font-size: calc(1rem + 1px);
  font-weight: 700;
  line-height: 1.5rem;
}

/* Item de la page courante et appui mobile : couleur des liens. */
.ps-mainmenu__tree > li.current > .ps-mainmenu__tree-item-wrapper > .ps-mainmenu__tree-link,
#menu-mobile > .menu__list > li > .menu__link:active {
  color: var(--bs-link-color);
}

/* Survol, appui desktop et focus clavier : couleur de survol des liens.
   :focus-visible plutôt que :focus, pour qu'un item cliqué ou touché ne garde
   pas cette couleur. */
.ps-mainmenu__tree > li > .ps-mainmenu__tree-item-wrapper > .ps-mainmenu__tree-link:is(:hover, :active, :focus-visible),
.ps-mainmenu__tree > li > .ps-mainmenu__tree-item-wrapper > .ps-mainmenu__tree-dropdown-toggle:is(:hover, :active, :focus-visible),
#menu-mobile > .menu__list > li > .menu__link:is(:hover, :focus-visible) {
  color: var(--bs-link-hover-color);
}

/* --- Autocomplétion de recherche (ps_searchbar) : résultats enrichis -------
 * custom.js remplace entièrement le rendu du cœur (voir son bloc « Autocomplétion de
 * recherche ») : vignette, marque, sous-catégorie, prix et promo, bloc Catégories, lien
 * « voir tous les résultats ». Panneau élargi (640px) et centré sous le champ plutôt que
 * calé à droite (comportement par défaut du thème, pensé pour un champ plus étroit).
 * Sur desktop, la hauteur reste automatique et l'ombre portée est celle de
 * .cs-megamenu (--cs-shadow-panel). Sur mobile, l'offcanvas et le panneau occupent tout le
 * viewport ; les résultats défilent verticalement sous la ligne de recherche.
 * Bouton « voir tous les résultats » en .btn-outline-primary (classes Bootstrap posées dans
 * le tpl) plutôt qu'un style maison : même bouton que partout ailleurs sur le site.
 */

/* Visibilité pilotée en CSS pur plutôt qu'en JS : reste juste même quand le champ est
   relocalisé desktop <-> mobile (mécanisme générique du thème) sans repasser par l'event
   « input », qui ne se redéclenche pas à cette occasion. */
.cs-search-input:placeholder-shown ~ .cs-search-clear {
  display: none;
}

.ps-searchbar__dropdown {
  width: 640px;
  max-width: calc(100vw - 2rem);
  padding: 1.375rem 1.75rem 1.25rem;
  box-shadow: var(--cs-shadow-panel);
}

/* Sur desktop, Hummingbird impose une hauteur maximale (336px) et un scroll interne à
   .ps-searchbar__results. Le panneau reste en hauteur automatique avec la limite configurée ;
   le media query mobile plus bas reporte le scroll sur le panneau complet. */
.ps-searchbar__results {
  max-height: none;
  overflow-y: visible;
}

.ps-searchbar__section-label {
  font-size: 0.8125rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--cs-main-strong);
  margin: 0 0 0.625rem;
}

.ps-searchbar__section-label:not(:first-child) {
  margin-top: 0.875rem;
}

.ps-searchbar__result-link,
.ps-searchbar__category-link {
  display: flex;
  align-items: center;
  gap: 0.875rem;
  padding: 0.625rem;
  border-radius: 0.625rem;
  color: inherit;
  text-decoration: none;
}

.ps-searchbar__result-link:is(:hover, :focus-visible),
.ps-searchbar__category-link:is(:hover, :focus-visible) {
  background: var(--cs-main-tint-light);
  outline: none;
}

.ps-searchbar__result-image {
  width: 56px;
  height: 56px;
  flex-shrink: 0;
  object-fit: cover;
  border: 1px solid var(--cs-border);
  background: var(--cs-background);
}

.ps-searchbar__result-info {
  flex-grow: 1;
  min-width: 0;
}

/* Même traitement que .product-miniature__brand : kicker discret au-dessus du titre. */
.ps-searchbar__result-brand {
  display: block;
  font-size: 0.8125rem;
  color: var(--cs-text-info);
  text-transform: uppercase;
  margin-bottom: 0.125rem;
}

.ps-searchbar__result-title {
  display: block;
  font-size: 0.9375rem;
  font-weight: 700;
  color: var(--cs-text-accent);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ps-searchbar__result-prices {
  flex-shrink: 0;
  text-align: right;
}

.ps-searchbar__result-price {
  display: block;
  font-size: 0.9375rem;
  font-weight: 700;
  color: var(--cs-text-accent);
}

.ps-searchbar__result-discount-row:not([hidden]) {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.375rem;
  margin-top: 0.125rem;
}

/* Même pilule « remise » que .product-flags .badge : style inversé du thème (texte
   marque sur fond blanc), pas l'aplat des badges pleins. */
.ps-searchbar__result-discount {
  background: var(--cs-pure-white);
  color: var(--cs-main-strong);
  border: 1px solid var(--cs-main-strong);
  font-size: 0.75rem;
  font-weight: 700;
  padding: 0.125em 0.55em;
  border-radius: 999px;
  white-space: nowrap;
}

.ps-searchbar__result-price-old {
  font-size: 0.8125rem;
  color: var(--cs-text-info);
  text-decoration: line-through;
  white-space: nowrap;
}

.ps-searchbar__category-text {
  flex-grow: 1;
  min-width: 0;
  display: flex;
  align-items: baseline;
  gap: 0.375rem;
  font-size: 0.875rem;
}

.ps-searchbar__category-breadcrumb {
  color: var(--cs-text-info);
}

.ps-searchbar__category-name {
  font-weight: 700;
  color: var(--cs-text-accent);
}

.ps-searchbar__category-count {
  flex-shrink: 0;
  font-size: 0.8125rem;
  color: var(--cs-text-info);
}

.ps-searchbar__empty {
  font-size: 0.9375rem;
  color: var(--cs-text-info);
  text-align: center;
  padding: 1rem 0;
  margin: 0;
}

/* .btn-outline-primary (posé dans le tpl) suffit pour la bordure et le fond au survol,
   mais pas pour le texte : une règle du thème, plus prioritaire que --bs-btn-color sur cet
   élément, le repasse en gris par défaut. Couleur et survol fixés ici explicitement. */
.ps-searchbar__footer {
  margin-top: 0.875rem;
  font-size: 0.9375rem;
  color: var(--cs-secondary-strong);
}

.ps-searchbar__footer:hover,
.ps-searchbar__footer:focus-visible {
  color: var(--cs-pure-white);
}

/* L'offcanvas de recherche mobile devient un écran complet. La hauteur de sa ligne
   d'en-tête est mesurée par custom.js : le panneau peut ainsi remplir exactement
   l'espace restant, y compris avec une traduction ou un zoom de texte plus long. */
@media (max-width: 767.98px) {
  .ps-searchbar__offcanvas {
    height: 100vh;
    height: 100dvh;
    max-height: 100vh;
    max-height: 100dvh;
  }

  .ps-searchbar__offcanvas .offcanvas-header,
  .ps-searchbar__offcanvas .ps-searchbar__container,
  .ps-searchbar__offcanvas .cs-header-search,
  .ps-searchbar__offcanvas .ps-searchbar {
    position: static;
  }

  .ps-searchbar__offcanvas .ps-searchbar__container {
    min-width: 0;
  }

  .ps-searchbar__offcanvas .cs-header-search,
  .ps-searchbar__offcanvas .ps-searchbar {
    width: 100%;
    min-width: 0;
  }

  .ps-searchbar__offcanvas .ps-searchbar__dropdown {
    position: absolute;
    inset: var(--cs-search-header-height, 0) 0 0;
    width: 100%;
    max-width: none;
    height: auto;
    max-height: none;
    padding: 1.25rem 1rem;
    overflow-x: hidden;
    overflow-y: auto;
    overscroll-behavior: contain;
    transform: none;
    -webkit-overflow-scrolling: touch;
  }

  .ps-searchbar__offcanvas .ps-searchbar__results,
  .ps-searchbar__offcanvas .ps-searchbar__result-link {
    padding-inline: 0;
  }

  .ps-searchbar__offcanvas .ps-searchbar__result-link,
  .ps-searchbar__offcanvas .ps-searchbar__category-link {
    width: 100%;
    min-width: 0;
    max-width: 100%;
  }
}

/* --- Barre de liens tout en bas de la page ---------------------------------
 * Va avec les surcharges templates/_partials/footer.tpl (qui la sort de
 * .footer__main) et copyright.tpl (liens servis par les modules sur
 * displayFooterLegalLinks). Pleine largeur sur fond --cs-main, padding réduit,
 * liste horizontale centrée qui passe à la ligne sur mobile.
 * Liens blancs, couleur secondaire au survol, jamais soulignés. */
.cs-footer-legal {
  background-color: var(--cs-main-strong);
  color: var(--cs-pure-white);
  font-size: 0.875rem;
  padding-block: 0.5rem;
}

.cs-footer-legal__list {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.25rem 1.5rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.cs-footer-legal .cs-footer-legal__link {
  color: inherit;
  text-decoration: none;
}

.cs-footer-legal .cs-footer-legal__link:hover,
.cs-footer-legal .cs-footer-legal__link:focus-visible {
  color: var(--cs-secondary-strong);
}

/* --- Boutons « contour » (outline) -----------------------------------------
 * « Continuez mes achats », retours du tunnel, boutons Modifier, « Voir le
 * produit »… tous des .btn-outline-primary (variante compilée en dur, voir
 * section 1). Contour et texte en couleur secondaire, remplissage de la même
 * couleur au survol (texte blanc du thème). */
.btn-outline-primary {
  --bs-btn-color: var(--cs-secondary-strong);
  --bs-btn-border-color: var(--cs-secondary-strong);
  --bs-btn-hover-bg: var(--cs-secondary-strong);
  --bs-btn-hover-border-color: var(--cs-secondary-strong);
  --bs-btn-active-bg: var(--cs-secondary-strong);
  --bs-btn-active-border-color: var(--cs-secondary-strong);
}

/* « Donnez votre avis » et les boutons du module productcomments : rendus en
   aplat gris (.btn-comment, hors système Bootstrap, dans productcomments.css),
   alignés sur le même style contour. Notre feuille charge après celle du module
   (priorité 1000) : ces règles l'emportent sans !important. */
.btn-comment {
  background-color: transparent;
  border: 1px solid var(--cs-secondary-strong);
  color: var(--cs-secondary-strong);
}

.btn-comment:hover {
  background-color: var(--cs-secondary-strong);
  color: var(--cs-pure-white);
}

/* --- Marque sur la fiche produit -------------------------------------------
 * Remontée avant le nom du produit par la surcharge templates/catalog/product.tpl.
 * En capitales, lien en --cs-text-dark, survol en couleur principale. Le sélecteur (deux
 * classes + élément) bat la règle globale a{} du thème sans !important. Petit
 * espace sous la marque pour la détacher du nom. */
.product__manufacturer a {
  text-transform: uppercase;
  color: var(--cs-text-dark);
}

.product__manufacturer a:hover {
  color: var(--cs-main-strong);
}

/* La marque vit dans .cs-product-topline : l'espace sous la marque est porté par la
 * ligne, une marge sur l'élément centré décalerait les icônes de partage. */
.product__right .product__manufacturer {
  margin-bottom: 0;
}

/* Ligne de tête de la fiche : marque à gauche, partage à droite (#419), même sans
 * marque (margin-inline-start: auto). Icônes seules : le libellé « Partager » est
 * masqué, chaque lien garde son aria-label. */
.cs-product-topline {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin-bottom: 0.25rem;
}

.cs-product-topline .ps-sharebuttons {
  margin-inline-start: auto;
}

.cs-product-topline .ps-sharebuttons__label {
  display: none;
}

/* Icônes en couleur secondaire (rose chez Chaussmart), principale au survol (violet),
 * comme les boutons de la fiche. Le SVG suit currentColor. */
.cs-product-topline .ps-sharebuttons__link {
  color: var(--cs-secondary-strong);
}

.cs-product-topline .ps-sharebuttons__link:hover,
.cs-product-topline .ps-sharebuttons__link:focus-visible {
  color: var(--cs-main-strong);
}

/* Mention « TTC » masquée sur la fiche produit et sa quickview (#419). Elle vient du
 * réglage pays « Afficher le libellé des taxes », qui vaut pour tout le site
 * (panier, tunnel) : on ne la retire qu'ici. Le texte est un nœud nu du span, qui
 * porte aussi les hooks displayProductPriceBlock « price » et « after_price » : on
 * met le span à font-size 0 et on rend leur taille aux éléments des modules. */
.product__right .product__tax-label {
  font-size: 0;
}

.product__right .product__tax-label > * {
  font-size: 0.875rem;
}

/* Prix de la fiche produit plus appuyé que le 600 de Hummingbird. */
.product__price {
  font-weight: 800;
}

/* --- Footer principal (clair) ----------------------------------------------
 * Hummingbird rend .footer__main sombre (fond --bs-dark, texte gris clair, liens
 * gris puis blancs au survol). On le passe sur --bs-tertiary-bg, le fond du
 * bandeau de réassurance qui le précède, séparé par un filet --cs-border.
 * Texte --cs-text-dark, liens --cs-text-accent,
 * couleur secondaire au survol.
 *
 * Sélecteurs de même spécificité que ceux du thème (.footer-block a…) : notre
 * feuille charge après, elle l'emporte sans !important. Les titres de colonne
 * (.footer-block__title a, liens de dépliage mobile) sont remontés d'un cran
 * pour garder leur couleur malgré la règle des liens : couleur principale, en
 * capitales. Bloc adresse de ps_contactinfo en --cs-text-info. */
.footer__main {
  background: var(--bs-tertiary-bg);
  border-top: 1px solid var(--cs-border);
  color: var(--cs-text-dark);
}

.footer-block a {
  color: var(--cs-text-accent);
}

.footer-block a:hover {
  color: var(--cs-secondary-strong);
}

.footer-block__title,
.footer-block .footer-block__title a {
  color: var(--cs-main-strong);
  text-transform: uppercase;
}

.footer-block .ps-contactinfo__infos {
  color: var(--cs-text-info);
}

/* --- Bloc d'inscription à la newsletter (ps_emailsubscription) -------------
 * Surcharge modules/ps_emailsubscription/views/templates/hook/ps_emailsubscription.tpl,
 * rendue sur displayFooterBefore de toutes les pages : pavé d'appel qui ouvre la
 * modale d'inscription (#445, maquette du 31/10/2026).
 * Panneau sur une image de fond par boutique (--cs-newsletter-bg, posée par le
 * template quand chaussmartnewsletter en fournit une) sous un voile sombre tiré
 * de la couleur principale : sans image, le voile seul fait un aplat. Texte
 * blanc, sur-titre en --cs-secondary-strong ; bouton .btn-primary (même token),
 * survol assombri plutôt que la couleur principale, peu visible sur le voile.
 * Tout le panneau est cliquable (.stretched-link du bouton, panneau positionné).
 * Empilé sous 992px, bouton pleine largeur ; au-delà, texte à gauche et bouton
 * à droite.
 *
 * Bloc sombre partagé avec les zones promotionnelles de la home : voile, coins
 * carrés, texte blanc, survol du bouton et focus blanc. Chaque bloc fournit son
 * image dans --cs-dark-panel-bg (reprise de la variable posée par son template). */
.cs-newsletter,
.cs-home-promo {
  --cs-dark-panel-shade: color-mix(in srgb, var(--cs-main) 35%, #000);
  --cs-dark-panel-overlay: color-mix(in srgb, var(--cs-dark-panel-shade) 76%, transparent);
}

.cs-newsletter__panel,
.cs-home-promo__zone {
  color: var(--cs-pure-white);
  background:
    linear-gradient(var(--cs-dark-panel-overlay), var(--cs-dark-panel-overlay)),
    var(--cs-dark-panel-bg, none) center / cover no-repeat,
    var(--cs-dark-panel-shade);
}

.cs-newsletter .btn.cs-newsletter__open,
.cs-home-promo .btn.cs-home-promo__button {
  --bs-btn-hover-bg: color-mix(in srgb, var(--cs-secondary-strong) 85%, #000);
  --bs-btn-hover-border-color: var(--bs-btn-hover-bg);
  --bs-btn-active-bg: var(--bs-btn-hover-bg);
  --bs-btn-active-border-color: var(--bs-btn-hover-bg);
  border-radius: 4px;
}

.cs-newsletter .btn.cs-newsletter__open:focus-visible,
.cs-home-promo .btn.cs-home-promo__button:focus-visible {
  outline: 2px solid var(--cs-pure-white);
  outline-offset: 2px;
}

.cs-newsletter {
  padding-block: 1.25rem 2.5rem;
}

.cs-newsletter__panel {
  --cs-dark-panel-bg: var(--cs-newsletter-bg);
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
  padding: var(--cs-panel-padding);
}

.cs-newsletter__intro {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

/* Taille et écart avec le titre alignés sur les sur-titres de la home (#141) :
 * même clamp que .cs-overline, écart --cs-home-overline-gap malgré le gap de
 * la colonne (0.75rem). */
.cs-newsletter__overline {
  margin: 0 0 calc(var(--cs-home-overline-gap) - 0.75rem);
  font-size: clamp(1rem, 1.6vw, 1.25rem);
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--cs-secondary-strong);
}

.cs-newsletter__title {
  margin: 0;
  font-size: 1.875rem;
  color: inherit;
}

/* Couleurs et états de .btn-primary ; seul le survol (et l'état actif) passe au
 * secondaire assombri (bloc sombre partagé, plus haut). */
.cs-newsletter .btn.cs-newsletter__open {
  width: 100%;
  height: 3.375rem;
  padding: 0 2.5rem;
  white-space: nowrap;
  font-size: 1.1875rem;
  font-weight: 700;
}

@media (min-width: 992px) {
  .cs-newsletter__panel {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 3.5rem;
    align-items: center;
    padding: 2.5rem 3.5rem;
  }

  .cs-newsletter__title {
    font-size: 2.25rem;
  }

  .cs-newsletter .btn.cs-newsletter__open {
    width: auto;
    height: 3.5rem;
  }
}

/* --- Modale d'inscription à la newsletter (#445) ---------------------------
 * Habillage de la modale d'inscription de l'étape 1 (.cs-signup : en-tête,
 * coins, plein écran sous 576px) ; ici le formulaire, l'alerte d'erreur et la
 * confirmation. Le widget Turnstile s'insère avant le bouton d'envoi. */
.cs-newsletter__form {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.cs-newsletter__alert {
  padding: 0.75rem 0.875rem;
  border-radius: 0.5rem;
  font-weight: 700;
  color: var(--cs-error);
  background: var(--cs-error-bg);
}

.cs-newsletter__field {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.cs-newsletter__label {
  font-size: 0.9375rem;
  font-weight: 700;
  color: var(--cs-text-accent);
}

.cs-newsletter__input {
  height: 3.375rem;
  padding: 0 1rem;
  border: 1px solid var(--cs-border);
  border-radius: 4px;
  font-size: 1rem;
  color: var(--cs-text-accent);
}

.cs-newsletter__input[aria-invalid="true"] {
  border-color: var(--cs-error);
}

.cs-newsletter__help,
.cs-newsletter__conditions {
  margin: 0;
  font-size: 0.8125rem;
  line-height: 1.5;
  color: var(--cs-text-info);
}

/* Consentement RGPD en carte, comme les cases de la modale de l'étape 1. */
.cs-newsletter__consent {
  padding: 0.875rem 1rem;
  border: 1px solid var(--cs-border);
  border-radius: 0.5rem;
  font-size: 0.875rem;
  line-height: 1.5;
}

.cs-newsletter__consent .form-check {
  margin: 0;
}

/* Désactivé par le module RGPD tant que le consentement n'est pas coché : rendu
 * atténué natif de .btn:disabled. */
.cs-newsletter-modal .btn.cs-newsletter__submit {
  height: 3.375rem;
  border-radius: 4px;
  font-size: 1.125rem;
  font-weight: 700;
}

.cs-newsletter-modal .chaussmart-turnstile {
  margin-block: 0;
}

.cs-newsletter__done {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.75rem;
  padding: 1rem 1rem 1.5rem;
  text-align: center;
}

.cs-newsletter__done[hidden] {
  display: none;
}

.cs-newsletter__done-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 4.5rem;
  height: 4.5rem;
  border-radius: 50%;
  color: var(--cs-success);
  /* --cs-step-success-bg est propre au stepper (.checkout-steps) : même teinte recalculée. */
  background: color-mix(in srgb, var(--cs-success) 12%, var(--cs-pure-white));
}

.cs-newsletter__done-title {
  margin: 0.5rem 0 0;
  font-size: 1.5rem;
  font-weight: 700;
  color: var(--cs-text-accent);
}

.cs-newsletter__done-title:focus {
  outline: none;
}

.cs-newsletter__counter {
  margin: 0;
  font-size: 0.8125rem;
  color: var(--cs-text-info);
}

/* --- Bandeau de réassurance du footer (blockreassurance) -------------------
 * Rendu sur displayFooterBefore par displayBlockWhite.tpl de Hummingbird, en
 * .blockreassurance--dark (fond --bs-dark, titre blanc). On l'aligne sur le
 * footer clair : même fond que .footer__main, filets --cs-border en haut et en
 * bas, texte et icônes en couleur principale.
 *
 * Icônes : le JS du module remplace l'<img class="svg"> par un <svg> inline
 * (.replaced-svg) et colore ses paths avec psr_icon_color (réglage BO), en
 * attribut fill ou en style inline : !important pour battre le style inline et
 * ne pas dépendre du réglage BO. Une icône perso non SVG ne se recolore pas. */
.blockreassurance--dark {
  background: var(--bs-tertiary-bg);
  border-block: 1px solid var(--cs-border);
}

.blockreassurance--dark .reassurance,
.blockreassurance--dark .reassurance__title,
.blockreassurance--dark .reassurance__desc {
  color: var(--cs-main-strong);
}

/* Centrage en desktop (≥992px, blocs sur une ligne) : les blocs se partagent
 * la largeur (flex-grow du thème), mais le thème étire aussi le texte
 * (.reassurance__content flex-grow:1), ce qui colle icône et texte à gauche de
 * chaque bloc. Le groupe icône + texte est centré dans son bloc. En dessous,
 * blocs empilés : alignement à gauche du thème. */
@media (min-width: 992px) {
  .blockreassurance--dark .reassurance {
    justify-content: center;
  }

  .blockreassurance--dark .reassurance__content {
    flex-grow: 0;
  }
}

.blockreassurance--dark .replaced-svg path {
  fill: var(--cs-main-strong) !important;
}

/* Bandeau en dernier dans .footer__before : son filet bas touche le
 * border-top de .footer__main, on retire ce dernier pour garder un seul
 * filet de 1px. */
.footer__before:has(> .blockreassurance:last-child) + .footer__main {
  border-top: 0;
}

/* --- Lien « Nous contacter » du footer -------------------------------------
 * Ajouté sous le bloc coordonnées par la surcharge
 * modules/ps_contactinfo/ps_contactinfo.tpl. Lien avec la petite enveloppe ; ses
 * couleurs sont celles des liens du footer (bloc ci-dessus). */
.footer-block .cs-contact-link {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  margin-top: 0.5rem;
}

.cs-contact-link .material-icons {
  font-size: 1.1em;
}

/* Réseaux sociaux sous « Nous contacter » : modules/ps_socialfollow/ps_socialfollow.tpl,
 * rendu en widget dans le bloc contact. Même couleur que les liens du footer,
 * couleur secondaire au survol. */
.cs-socialfollow {
  margin-block-start: 0.75rem;
}

.cs-socialfollow__list {
  gap: 0.75rem;
}

.footer-block .cs-socialfollow__link {
  display: inline-flex;
  color: var(--cs-text-accent);
}

.footer-block .cs-socialfollow__link:hover,
.footer-block .cs-socialfollow__link:focus-visible {
  color: var(--cs-secondary-strong);
}

/* --- Logos des modes de paiement du footer ---------------------------------
 * Colonne rendue par templates/_partials/footer-payment-methods.tpl. Logos sur
 * une ligne qui passe à la ligne d'elle-même quand la colonne est trop étroite :
 * un logo de plus s'ajoute sans CSS. Hauteur fixe,
 * largeur au ratio du SVG (les attributs width/height ne servent qu'à réserver
 * la place avant chargement). */
.cs-payment-methods__list {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.75rem 1rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.cs-payment-methods__logo {
  display: block;
  width: auto;
  height: 24px;
}

/* Moyen sans logo (chèque) : icône + libellé, en --cs-text-info, à la même
   hauteur que les logos pour rester aligné sur leur ligne. L'icône est un SVG
   monochrome posé en masque (mask-image en style inline, depuis le partial) sur
   un fond currentColor : elle prend la couleur du texte. */
.cs-payment-methods__text {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  height: 24px;
  color: var(--cs-text-info);
  font-size: 0.9em;
  font-weight: 600;
  text-transform: uppercase;
}

.cs-payment-methods__icon {
  display: block;
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  background-color: currentColor;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}

/* --- Bouton d'ajout au panier des miniatures -------------------------------
 * .product-miniature__add (btn-primary btn-square-icon). Fond --cs-text-dark,
 * survol en couleur principale, forme ronde pour la version compacte icône seule.
 *
 * Le cercle n'est posé que par défaut (desktop / pointeur fin, où le bouton est
 * un carré-icône) ; sous @media (hover:none) and (pointer:coarse) le thème passe
 * le bouton en pleine largeur avec le libellé, on lui rend donc son rayon normal
 * pour éviter une pilule. */
.product-miniature__add {
  --bs-btn-bg: var(--cs-text-dark);
  --bs-btn-border-color: var(--cs-text-dark);
  --bs-btn-hover-bg: var(--cs-main-strong);
  --bs-btn-hover-border-color: var(--cs-main-strong);
  --bs-btn-active-bg: var(--cs-main-strong);
  --bs-btn-active-border-color: var(--cs-main-strong);
  border-radius: 50%;
}

@media (hover: none) and (pointer: coarse) {
  .product-miniature__add {
    border-radius: var(--bs-btn-border-radius);
  }
}

/* --- Indicateur de slide actif du carousel de la home ----------------------
 * Le thème colore l'indicateur actif du carousel (ps_imageslider) avec
 * --bs-primary (bleu Hummingbird #0b69f6) via `.carousel-indicators .active`.
 * Couleur secondaire exacte (décor), préfixée par .ps-imageslider pour battre
 * la règle du thème sans !important. */
.ps-imageslider .carousel-indicators .active {
  background-color: var(--cs-secondary);
}

/* ------------------------------------------------------------------------- *
 * 2. Fiche produit — champs métier (chaussmartproductfields)
 *
 * Deux champs de ps_product_lang exposés par le module via actionPresentProduct :
 *  - size_text : conseil de pointure, icône info devant, entre coloris et pointures
 *    (templates/catalog/_partials/product-size-text.tpl, #420) ;
 *  - description_more : en tête des informations produit, sous le bouton panier
 *    (surcharge templates/catalog/_partials/product-details.tpl, #418).
 * Espacement seulement, la typographie reste celle du thème.
 * ------------------------------------------------------------------------- */
/* Filet gris de 1px sous la description, avant les coloris (#420, product.tpl) :
 * 1,25rem de part et d'autre au lieu des 2rem du thème sous la description. */
.product__right .product__description-short {
  margin-block-end: 1.25rem;
}

.cs-product-description-separator {
  margin-block: 0 1.25rem;
  border: 0;
  border-top: 1px solid var(--cs-border);
  opacity: 1;
}

.cs-product-size {
  display: flex;
  align-items: flex-start; /* icône sur la première ligne si le texte passe à la ligne */
  gap: 0.375rem;
  margin-bottom: 1rem;
  color: var(--cs-text-dark);
}

/* Dans la colonne flex .product__variants (gap 1rem, thème), le conseil précède le
   groupe Pointure : on l'en rapproche, 0,5rem au lieu de 2rem. Hors de cette colonne
   ou en dernier enfant (produit sans groupe Pointure), marge normale. */
.product__variants > .cs-product-size:not(:last-child) {
  margin-bottom: -0.5rem;
}

.cs-product-size .material-icons {
  flex-shrink: 0;
  font-size: 1.25rem;
  /* Centre l'icône (20px de haut, forcée par le thème) sur la première ligne de texte (24px). */
  margin-block-start: 0.125rem;
  color: var(--cs-main);
}

.cs-product-size__label {
  font-weight: 700;
}

/* --- Déclinaisons : choix de pointure et disponibilité --------------------
 * custom.js améliore progressivement les listes déroulantes des produits qui
 * possèdent un coloris. Le select reste le contrôle soumis à PrestaShop ; il
 * n'est masqué qu'après création réussie de la grille de boutons.
 */
.cs-variant-selector--enhanced {
  display: block;
}

.cs-variant-selector--enhanced > .form-select {
  display: none;
}

.cs-variant-selector--enhanced .product-variant__label {
  align-items: baseline;
  display: flex;
  margin-bottom: 0.5rem;
}

.cs-variant-selector--enhanced .product-variant__legend {
  float: none;
  margin: 0;
  width: auto;
}

.product-variant__colors .product-variant__color {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
}

.product-variant__colors .input-color__label,
.product-variant__colors .input-color__label .color {
  width: 1.875rem;
  height: 1.875rem;
  border-radius: 50%;
}

.product-variant__colors .input-color__label .color.active {
  outline: 0;
  box-shadow:
    0 0 0 3px var(--cs-pure-white),
    0 0 0 7px color-mix(in srgb, var(--cs-main) 40%, transparent);
}

/* Grille des pointures sur toute la largeur de la colonne (#420) : autant de
   colonnes que la place en laisse (3,5rem au moins, « 38.5 » tient), étirées à
   parts égales, retour à la ligne automatique. Marge interne horizontale réduite. */
.cs-variant-choice-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(3.5rem, 1fr));
  gap: 0.5rem;
}

.cs-variant-choice {
  width: 100%;
  min-height: 3rem;
  padding: 0.5rem 0.25rem;
  border: 1px solid var(--cs-border);
  border-radius: var(--bs-border-radius);
  background: var(--cs-pure-white);
  color: var(--cs-text-accent);
  font: inherit;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.cs-variant-choice:hover:not(:disabled),
.cs-variant-choice:focus-visible {
  border-color: var(--cs-main-strong);
}

.cs-variant-choice:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 0.2rem color-mix(in srgb, var(--cs-main) 25%, transparent);
}

.cs-variant-choice.cs-variant-choice--selected {
  border: 4px solid color-mix(in srgb, var(--cs-main) 40%, transparent);
}

.cs-variant-choice:disabled,
.cs-variant-choice--unavailable {
  background: var(--cs-background);
  color: var(--cs-text-info);
  text-decoration: line-through;
}

.cs-variant-choice:disabled {
  border-color: var(--cs-border);
  cursor: not-allowed;
}

/* Bouton « Ajouter au panier » seul, sans sélecteur de quantité (#420) : sur
   toute la largeur de la colonne (étiré par le thème, texte centré), un peu
   plus haut. */
.page-product .product__add-to-cart-button {
  --bs-btn-padding-y: 0.625rem;
  /* Taille et graisse du bouton « Commander » du tunnel (.cs-checkout-confirm__button). */
  font-size: 1.1875rem;
  font-weight: 700;
}

/* Déclinaison épuisée : pas d'ajout au panier (#353,
   catalog/_partials/product-add-to-cart.tpl). */
.cs-add-to-cart--out-of-stock {
  display: none !important;
}

/* La ligne quantité vide ne doit pas doubler l'espace sous la disponibilité :
   on garde les 32px du conteneur, comme entre les autres blocs de la fiche. */
.product__add-to-cart-container:has(.cs-add-to-cart--out-of-stock) .product__availability {
  margin-bottom: 0;
}


/* Complément de description dans l'accordéon : un peu d'air avant la liste
   Marque / Référence. Le HTML saisi porte ses propres paragraphes : la marge
   basse du dernier est retirée. */
.cs-detail-more {
  margin-bottom: 1rem;
}

.cs-detail-more > *:last-child {
  margin-bottom: 0;
}

/* ------------------------------------------------------------------------- *
 * 3. Grille de catégorie — en-tête de liste et pagination
 *
 * Va avec les surcharges catalog/_partials/products-top.tpl (résumé remonté +
 * total retiré) et _partials/pagination.tpl (résumé retiré du bas). Ici, la
 * mise en page seulement.
 * ------------------------------------------------------------------------- */

/* Résumé « Articles : x-y sur z » à gauche, tri à droite. Le thème inverse
 * l'ordre (.products__sort{order:-1}) pour empiler le tri au-dessus sur mobile,
 * ce qui le placerait à gauche en 2 colonnes (≥992px) : l'ordre du DOM est
 * rétabli et le tri aligné à droite. Sur mobile, empilement du thème. */
@media (min-width: 992px) {
  .products__sort {
    order: 0;
    justify-content: flex-end;
  }
}

/* Combobox « Trier par » ajustée à son contenu au lieu de remplir la colonne
 * (le thème l'étire via flex-grow:1 + width:100% sur le bouton). */
.products__sort-dropdown {
  flex-grow: 0;
}

.products__sort-dropdown-button {
  width: auto;
}

/* Le résumé est retiré du bas : la navigation, seule dans le conteneur, est
 * centrée (space-between dans le thème à partir de 992px). */
.pagination__container {
  justify-content: center;
}

/* Fil d'Ariane : marge basse uniforme sur tout le site (le parent met 40px). */
.breadcrumb__wrapper {
  margin-bottom: 1.5rem;
}

/* Page catégorie : en-tête en carte, sous-catégories en texte, colonne de
 * filtres réduite (issues #96 et #99). Va avec catalog/listing/category.tpl,
 * catalog/_partials/category-header.tpl et catalog/_partials/subcategories.tpl. */

/* Carte 65 / 35 dès 768px : le texte occupe les 65 % de gauche (zone
 * de silence), le visuel est calé à droite (52 % de large, dont le tiers
 * gauche est déjà fondu : il apparaît sur ~35 %) et se dissout vers la gauche
 * par un dégradé de masque. Le visuel est en niveaux de gris et en multiply
 * SUR l'aplat de la carte : le contexte d'empilement isolé de la carte porte
 * le fond, et ni le <picture> ni l'image n'ont de z-index négatif (qui les
 * ferait se mélanger à un fond transparent). Le texte passe au-dessus par son
 * propre z-index. Le visuel est masqué sur mobile ; sans visuel, la carte est
 * un aplat gris et le texte occupe toute sa largeur. */
.cs-category-hero {
  /* Fondu du visuel vers l'aplat : part de zéro à gauche et monte par paliers
   * sur la largeur du visuel, sans arête visible. */
  --cs-hero-fade: linear-gradient(to right, transparent 0%, rgb(0 0 0 / 4%) 12%, rgb(0 0 0 / 15%) 28%, rgb(0 0 0 / 38%) 45%, rgb(0 0 0 / 68%) 62%, rgb(0 0 0 / 90%) 80%, #000 95%);

  position: relative;
  isolation: isolate;
  overflow: hidden;
  margin: 0 0 24px;
  padding: 20px;
  background: var(--bs-tertiary-bg);
}

.cs-category-hero picture {
  display: none;
}

.cs-category-hero__image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 65% 30%;
  filter: grayscale(1) contrast(0.95) brightness(1.08);
  mix-blend-mode: multiply;
  -webkit-mask-image: var(--cs-hero-fade);
  mask-image: var(--cs-hero-fade);
}

.cs-category-hero__text {
  position: relative;
  z-index: 1;
}

.cs-category-hero .page-title-section {
  margin: 0 0 16px;
  font-weight: 400;
  font-size: 2rem;
  line-height: 1.1;
  color: var(--cs-main-strong);
}

.cs-category-hero__description {
  color: var(--cs-text-dark);
  line-height: 1.65;
}

/* Le rose de marque, seul, n'atteint pas 4,5:1 sur le fond gris : on
 * l'assombrit pour les liens de la description, et on rend au survol et au
 * focus la couleur de survol commune des liens du site. */
.cs-category-hero__description a {
  color: color-mix(in srgb, var(--cs-secondary-strong) 60%, var(--cs-text-accent));
}

.cs-category-hero__description a:hover,
.cs-category-hero__description a:focus-visible {
  color: var(--bs-link-hover-color);
}

.cs-category-hero__description > *:last-child {
  margin-bottom: 0;
}

/* Listing d'une marque (catalog/listing/manufacturer.tpl) : même carte, logo
 * en couleur sur une pastille blanche, à droite du texte, masqué sur mobile
 * comme le visuel de catégorie (.cs-category-hero picture). */
.cs-category-hero__logo img {
  display: block;
  width: 160px;
  max-width: 100%;
  height: auto;
}

@media (min-width: 768px) {
  .cs-category-hero {
    padding: 20px 32px;
  }

  /* Hauteur minimale : une description courte ne doit pas réduire le visuel à
   * un bandeau plat. Le texte reste centré verticalement. */
  .cs-category-hero--with-image {
    display: flex;
    align-items: center;
    min-height: 180px;
  }

  .cs-category-hero--with-image .cs-category-hero__text {
    max-width: 65%;
  }

  .cs-category-hero--with-image picture {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    display: block;
    width: 52%;
  }

  .cs-category-hero .page-title-section {
    font-size: 2.5rem;
  }

  .cs-category-hero--with-logo {
    display: flex;
    align-items: center;
    gap: 32px;
  }

  .cs-category-hero--with-logo .cs-category-hero__text {
    flex: 1 1 auto;
    min-width: 0;
  }

  /* Spécificité de .cs-category-hero picture, masqué en dessous de 768px. */
  .cs-category-hero .cs-category-hero__logo {
    display: block;
    flex: 0 0 auto;
    padding: 16px;
    border-radius: var(--bs-border-radius);
    background: var(--bs-body-bg);
  }

  /* Gouttière élargie entre les filtres et la grille (la ligne compense le
   * padding des colonnes par une marge négative : l'alignement ne bouge pas).
   * Même colonne sur le listing d'une marque. */
  body#category .columns-container > .row,
  body#manufacturer .columns-container > .row {
    --bs-gutter-x: 3rem;
  }

  /* Colonne de filtres : 220px en tablette au lieu d'un tiers du conteneur. */
  body#category #left-column,
  body#manufacturer #left-column {
    flex: 0 0 auto;
    width: 220px;
  }

  body#category #center-column,
  body#manufacturer #center-column {
    flex: 1 1 0;
    width: auto;
    min-width: 0;
  }
}

@media (min-width: 992px) {
  body#category .columns-container > .row,
  body#manufacturer .columns-container > .row {
    --bs-gutter-x: 4rem;
  }

  body#category #left-column,
  body#manufacturer #left-column {
    width: 260px;
  }
}

/* Sous-catégories : liens texte, jamais de vignette. Boutons du site
 * (.btn .btn-outline-primary posés dans le tpl : taille, bordure et survol
 * communs), texte en graisse normale. */
.cs-subcat {
  margin-bottom: 24px;
}

.cs-subcat__list {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.cs-subcat__link {
  font-weight: 400;
}

/* ------------------------------------------------------------------------- *
 * 3 bis. Tunnel de commande — étapes en pastilles et chevrons
 *
 * Va avec checkout/checkout-navigation.tpl et
 * checkout/_partials/checkout-navigation-step.tpl. Le JS du parent pose
 * --success sur chaque étape validée. L'étape affichée est suivie par .active
 * sur le bouton (onglet Bootstrap) et non par --current, que le parent ne
 * déplace pas lors d'un retour sur une étape précédente ; elle l'emporte
 * visuellement sur --success. Chaque étape se termine par un chevron (SVG du
 * partial, ombre en filtre interne) qui projette son ombre sur l'étape suivante.
 * ------------------------------------------------------------------------- */
.checkout-steps {
  --cs-step-success-bg: #e3f1e7;
  --cs-step-success-hover: #d2e8d9;
  --cs-step-todo: var(--cs-text-dark);
  --cs-step-todo-bg: #e2e2e2;
  --cs-step-band: #f7f7f8;
  --cs-step-band-height: 5rem;
  --cs-step-height: 3rem;
  --cs-step-dot: 1.875rem;
  --cs-step-chevron: 1.875rem;

  margin-block-end: 1.5rem;
  padding-block: 0;
  background: var(--cs-step-band);
  border: 0;
  border-bottom: 1px solid var(--cs-border);
}

.checkout-steps__list {
  display: flex;
  align-items: stretch;
  margin: 0;
  padding: 0;
  list-style: none;
}

.checkout-steps__step {
  display: flex;
  flex: 1 1 0;
  align-items: center;
  min-width: 0;
  height: var(--cs-step-band-height);
  text-align: start;
}

.checkout-steps__step::before,
.checkout-steps__step::after {
  content: none;
}

/* Le SVG fait 44/30 de la pointe : la marge droite négative laisse l'ombre
 * déborder sur l'étape suivante sans décaler la mise en page. */
.checkout-steps__chevron {
  flex: none;
  width: calc(var(--cs-step-chevron) * 44 / 30);
  height: 100%;
  margin-inline-end: calc(var(--cs-step-chevron) * -14 / 30);
  overflow: hidden;
}

.checkout-steps__chevron polygon {
  fill: var(--cs-step-band);
}

.checkout-steps__chevron polyline {
  fill: none;
  stroke: #d6d6d6;
  stroke-width: 1px;
}

.checkout-steps__step:last-of-type .checkout-steps__chevron {
  display: none;
}

/* Pastille : à venir par défaut */
.checkout-steps__btn {
  display: inline-flex;
  flex: none;
  align-items: center;
  gap: 0.5625rem;
  height: var(--cs-step-height);
  margin-inline: auto;
  padding: 0 1.25rem 0 calc((var(--cs-step-height) - var(--cs-step-dot)) / 2);
  font-size: 1rem;
  font-weight: 400;
  line-height: 1;
  white-space: nowrap;
  color: var(--cs-step-todo);
  background: var(--cs-step-todo-bg);
  border: 0;
  border-radius: 999px;
  transition: background-color 0.15s ease;
}

.checkout-steps__btn:focus {
  outline: 0;
}

.checkout-steps__btn:focus-visible {
  outline: 2px solid var(--cs-main-strong);
  outline-offset: 3px;
}

.checkout-steps__btn:disabled {
  cursor: default;
}

.checkout-steps__number {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: var(--cs-step-dot);
  height: var(--cs-step-dot);
  margin: 0;
  font-size: 0.8125rem;
  font-weight: 600;
  line-height: 1;
  color: var(--cs-pure-white);
  background: var(--cs-step-todo);
  border-radius: 50%;
}

.checkout-steps__check {
  display: none;
  font-size: 1.125rem;
}

/* Validée : coche verte */
.checkout-steps__step--success .checkout-steps__btn {
  color: var(--cs-success);
  background: var(--cs-step-success-bg);
}

/* Cliquable seulement hors étape affichée et hors bouton désactivé (étape
 * Livraison d'un panier virtuel). */
.checkout-steps__step--success .checkout-steps__btn:not(:disabled, .active) {
  cursor: pointer;
}

.checkout-steps__step--success .checkout-steps__btn:not(:disabled, .active):hover {
  background: var(--cs-step-success-hover);
}

.checkout-steps__step--success .checkout-steps__number {
  background: var(--cs-success);
}

.checkout-steps__step--success .checkout-steps__digit {
  display: none;
}

.checkout-steps__step--success .checkout-steps__check {
  display: block;
}

/* Affichée : couleur principale, numéro même si l'étape était déjà validée */
.checkout-steps__btn.active {
  color: var(--cs-main-strong);
  background: var(--cs-main-tint);
  cursor: default;
}

.checkout-steps__btn.active .checkout-steps__number {
  background: var(--cs-main-strong);
}

.checkout-steps__btn.active .checkout-steps__digit {
  display: block;
}

.checkout-steps__btn.active .checkout-steps__check {
  display: none;
}

@media (max-width: 991.98px) {
  .checkout-steps {
    --cs-step-band-height: 4.5rem;
    --cs-step-height: 2.75rem;
    --cs-step-dot: 1.75rem;
    --cs-step-chevron: 1.5rem;
  }

  .checkout-steps__btn {
    padding-inline-end: 1.125rem;
    font-size: 0.9375rem;
  }
}

/* Mobile : seule l'étape affichée garde son libellé et prend plus de place,
 * les autres deviennent des pastilles rondes (libellé masqué visuellement, lu
 * par les lecteurs d'écran). */
@media (max-width: 767.98px) {
  .checkout-steps {
    --cs-step-band-height: 3.75rem;
    --cs-step-height: 2.5rem;
    --cs-step-dot: 1.625rem;
    --cs-step-chevron: 1rem;

    margin-block-end: 1rem;
  }

  .checkout-steps__step:has(.checkout-steps__btn.active) {
    flex-grow: 3;
  }

  .checkout-steps__btn {
    padding-inline-end: 1rem;
    font-size: 0.875rem;
  }

  .checkout-steps__btn:not(.active) {
    justify-content: center;
    width: var(--cs-step-height);
    padding: 0;
  }

  .checkout-steps__btn:not(.active) .checkout-steps__label {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
  }
}

/* ------------------------------------------------------------------------- *
 * 4. Tunnel de commande — bouton « Confirmer et payer »
 *
 * Va avec les surcharges checkout/checkout.tpl (bouton rendu sous le
 * récapitulatif) et checkout/_partials/steps/payment.tpl (bouton retiré du bas
 * du formulaire). Le bouton est présent à toutes les étapes : on ne l'affiche
 * qu'à l'étape Paiement, suivie par core.js via .js-current-step (y compris
 * en navigation JS entre étapes). core.js le masque en style inline pour les
 * paiements « binary », ce qui l'emporte sur ces règles.
 * ------------------------------------------------------------------------- */
.cs-checkout-confirm {
  display: none;
  margin-block-start: 1rem;
}

/* Hors étape Paiement, masquage forcé : core.js appelle .show() sur
 * .js-payment-confirmation (style inline display:block) dès le chargement de
 * n'importe quelle étape, ce qui battrait la règle ci-dessus. !important n'est
 * posé que hors étape Paiement, pour laisser core.js masquer le bouton en
 * inline à l'étape Paiement (paiements « binary »). */
body:not(:has(#checkout-payment-step.js-current-step)) .cs-checkout-confirm {
  display: none !important;
}

body:has(#checkout-payment-step.js-current-step) .cs-checkout-confirm {
  display: block;
}

/* Mobile : la colonne de droite passe sous le formulaire, le bouton serait en
 * bas de page. On le sort du flux en barre fixe en bas d'écran (total + bouton),
 * et on réserve sa hauteur en bas du contenu pour ne rien masquer. */
@media (max-width: 991.98px) {
  .cs-checkout-confirm {
    position: fixed;
    inset-inline: 0;
    bottom: 0;
    z-index: 1030;
    margin: 0;
    padding: 0.625rem 1rem calc(0.875rem + env(safe-area-inset-bottom, 0px));
    background: var(--bs-body-bg);
    border-top: 1px solid var(--cs-border);
    box-shadow: var(--cs-shadow-bar);
  }

  body:has(#checkout-payment-step.js-current-step) #wrapper {
    padding-block-end: 7rem;
  }
}

/* Colonne du récapitulatif plus compacte que le col-lg-4 du parent (33 %) :
 * environ -20 % entre 992 et 1199px, -25 % au-delà, au profit des étapes.
 * Gouttière élargie (44px au lieu de 24px) pour aérer étapes et récapitulatif ;
 * les marges négatives de .row gardent les bords extérieurs alignés. */
@media (min-width: 992px) {
  .checkout-grid.row {
    --bs-gutter-x: 2.75rem;
  }

  .checkout-grid__content.col-lg-8 {
    width: 73.5%;
  }

  .checkout-grid__aside.col-lg-4 {
    width: 26.5%;
  }
}

@media (min-width: 1200px) {
  .checkout-grid__content.col-lg-8 {
    width: 75%;
  }

  .checkout-grid__aside.col-lg-4 {
    width: 25%;
  }
}

/* ------------------------------------------------------------------------- *
 * 4 bis. Tunnel de commande — étapes du paiement
 *
 * Va avec checkout/_partials/steps/payment.tpl (.cs-pay-steps) et le bloc
 * #payment-confirmation de checkout/checkout.tpl. Les états is-current,
 * is-done et is-error sont posés par assets/js/custom.js. Sans JS, les étapes
 * restent lisibles (numéros) et le formulaire garde le comportement du cœur.
 * ------------------------------------------------------------------------- */
.cs-pay-steps {
  margin: 0;
  padding: 0;
  list-style: none;
}

.cs-pay-step {
  --cs-pay-marker: 2.5rem;

  position: relative;
  display: flex;
  gap: 1.25rem;
  scroll-margin-block-start: 7rem;
}

/* Trait vertical vers l'étape suivante */
.cs-pay-step:not(:last-child)::before {
  content: "";
  position: absolute;
  inset-block: calc(var(--cs-pay-marker) + 0.375rem) 0.375rem;
  inset-inline-start: calc(var(--cs-pay-marker) / 2 - 1px);
  width: 2px;
  background: var(--cs-border);
}

.cs-pay-step.is-done:not(:last-child)::before {
  background: var(--cs-success);
}

.cs-pay-step--free {
  display: none;
}

/* Pastille numérotée */
.cs-pay-step__marker {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  width: var(--cs-pay-marker);
  height: var(--cs-pay-marker);
  border: 2px solid #bdbdbd;
  border-radius: 50%;
  background: var(--cs-pure-white);
  color: var(--cs-text-info);
  font-size: 1.0625rem;
  font-weight: 700;
}

.cs-pay-step__icon {
  display: none;
}

.cs-pay-step__icon.material-icons {
  font-size: 1.25rem;
  font-weight: 700;
}

.cs-pay-step.is-current .cs-pay-step__marker {
  border-color: var(--cs-main-strong);
  background: var(--cs-main-strong);
  color: var(--cs-pure-white);
  box-shadow: 0 0 0 5px color-mix(in srgb, var(--cs-main) 16%, transparent);
}

.cs-pay-step.is-done .cs-pay-step__marker {
  border-color: var(--cs-success);
  background: var(--cs-success);
  color: var(--cs-pure-white);
  box-shadow: none;
}

.cs-pay-step.is-error .cs-pay-step__marker {
  border-color: var(--cs-error);
  background: var(--cs-error);
  color: var(--cs-pure-white);
  box-shadow: 0 0 0 5px color-mix(in srgb, var(--cs-error) 15%, transparent);
}

.cs-pay-step.is-done .cs-pay-step__number,
.cs-pay-step.is-error .cs-pay-step__number {
  display: none;
}

.cs-pay-step.is-done .cs-pay-step__icon--done,
.cs-pay-step.is-error .cs-pay-step__icon--error {
  display: block;
}

.cs-pay-step__body {
  display: flex;
  flex: 1;
  flex-direction: column;
  gap: 1rem;
  min-width: 0;
  padding-block-end: 2.5rem;
}

.cs-pay-step__title {
  margin: 0.375rem 0 0;
  color: var(--cs-text-accent);
  font-size: 1.375rem;
  font-weight: 600;
}

.cs-pay-step.is-error .cs-pay-step__title {
  color: var(--cs-error);
}

.cs-pay-step__error {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  margin: 0;
  padding: 0.75rem 1rem;
  border-radius: 0.625rem;
  background: var(--cs-error-bg);
  color: var(--cs-error);
  font-size: 0.9375rem;
  font-weight: 600;
}

.cs-pay-step__error[hidden] {
  display: none;
}

/* Cartes des moyens de paiement : tout l'en-tête (libellé) est cliquable */
.cs-pay-options {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.cs-pay-option {
  position: relative;
  margin: 0;
  border: 2px solid var(--cs-control-idle);
  border-radius: 0.75rem;
  background: var(--cs-pure-white);
}

.cs-pay-step.is-error .cs-pay-option {
  border-color: var(--cs-error-soft);
}

.cs-pay-option:has(.cs-pay-option__input:checked) {
  border-color: var(--cs-main-strong);
  background: var(--cs-main-tint-light);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--cs-main) 12%, transparent);
}

.cs-pay-option__header {
  position: relative;
  margin: 0;
  padding: 0;
}

/* Radio agrandi, point en couleur principale sur fond blanc une fois coché */
.cs-pay-option__input.form-check-input,
.cs-pay-conditions__input.form-check-input {
  position: absolute;
  inset-block-start: 50%;
  inset-inline-start: 1.25rem;
  width: 1.625rem;
  height: 1.625rem;
  margin: -0.8125rem 0 0;
  border: 2px solid var(--cs-control);
  background-color: var(--cs-pure-white);
  cursor: pointer;
}

.cs-pay-option__input.form-check-input:checked {
  border-color: var(--cs-main-strong);
  background-color: var(--cs-pure-white);
  background-image: radial-gradient(circle, var(--cs-main-strong) 0 0.375rem, transparent 0.4rem);
}

/* Contour de focus uniquement au clavier, porté par la carte entière */
.cs-pay-option__input.form-check-input:focus,
.cs-pay-conditions__input.form-check-input:focus {
  box-shadow: none;
}

.cs-pay-option:has(.cs-pay-option__input:focus-visible),
.cs-pay-conditions__item:has(.cs-pay-conditions__input:focus-visible) {
  outline: 3px solid var(--cs-main-strong);
  outline-offset: 3px;
}

.cs-pay-option__label {
  display: flex;
  align-items: center;
  gap: 1rem;
  width: 100%;
  min-height: 4.5rem;
  margin: 0;
  padding: 0.875rem 1.25rem 0.875rem 4rem;
  cursor: pointer;
}

.cs-pay-option__text {
  display: flex;
  flex-direction: column;
  gap: 0.1875rem;
  min-width: 0;
}

.cs-pay-option__name {
  color: var(--cs-text-accent);
  font-size: 1.0625rem;
  font-weight: 500;
}

.cs-pay-option__hint {
  color: var(--cs-text-info);
  font-size: 0.875rem;
  line-height: 1.4;
}

.cs-pay-option__logo {
  flex-shrink: 0;
  max-width: 9rem;
  max-height: 1.75rem;
  margin-inline-start: auto;
  object-fit: contain;
}

.cs-pay-option__extra,
.cs-pay-option__form {
  padding: 0 1.25rem 1rem 4rem;
}

.cs-pay-option__extra:empty,
.cs-pay-option__form:has(> #payment-form:only-child) {
  padding: 0;
}

/* PayPal ajoute son logo (span > .paypal-marks) à la fin de la carte, hors du
 * libellé : il est calé à droite de l'en-tête, comme les logos des autres modules. */
.cs-pay-option > span:has(.paypal-marks) {
  position: absolute;
  inset-block-start: 2.25rem;
  inset-inline-end: 1.25rem;
  display: block !important;
  transform: translateY(-50%);
  pointer-events: none;
}

.cs-pay-option:has(> span .paypal-marks) .cs-pay-option__label {
  padding-inline-end: 7rem;
}

/* Bloc des CGV : toute la surface coche la case */
.cs-pay-conditions {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  margin: 0;
}

.cs-pay-conditions__item {
  position: relative;
  border: 2px solid var(--cs-control-idle);
  border-radius: 0.75rem;
  background: var(--cs-pure-white);
}

.cs-pay-step.is-error .cs-pay-conditions__item:not(:has(:checked)) {
  border-color: var(--cs-error-soft);
}

.cs-pay-conditions__item:has(.cs-pay-conditions__input:checked) {
  border-color: var(--cs-main-strong);
  background: var(--cs-main-tint-light);
}

.cs-pay-conditions__input.form-check-input {
  width: 1.75rem;
  height: 1.75rem;
  margin-block-start: -0.875rem;
  border-radius: 0.375rem;
}

.cs-pay-conditions__input.form-check-input:checked {
  border-color: var(--cs-main-strong);
  background-color: var(--cs-main-strong);
}

.cs-pay-conditions__label {
  display: block;
  min-height: 4.5rem;
  margin: 0;
  padding: 1rem 1.25rem 1rem 4rem;
  color: var(--cs-text-accent);
  font-size: 1.0625rem;
  line-height: 1.45;
  cursor: pointer;
  align-content: center;
}

.cs-pay-conditions__label a {
  font-weight: 600;
}

/* Bouton « Confirmer et payer » et état des étapes au-dessus */
.cs-checkout-confirm__status {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  margin: 0 0 1rem;
  padding: 0;
  list-style: none;
}

.cs-checkout-confirm__status-item {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  color: var(--cs-text-info);
  font-size: 0.875rem;
  font-weight: 500;
}

.cs-checkout-confirm__status-item[hidden] {
  display: none;
}

.cs-checkout-confirm__dot {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  width: 1.25rem;
  height: 1.25rem;
  border-radius: 50%;
  background: var(--cs-border);
}

.cs-checkout-confirm__dot .material-icons {
  display: none;
  color: var(--cs-pure-white);
  font-size: 0.875rem;
  font-weight: 700;
}

.cs-checkout-confirm__status-item.is-done {
  color: var(--cs-text-dark);
}

.cs-checkout-confirm__status-item.is-done .cs-checkout-confirm__dot {
  background: var(--cs-success);
}

.cs-checkout-confirm__status-item.is-done .material-icons {
  display: block;
}

.cs-checkout-confirm__status-item.is-error {
  color: var(--cs-error);
}

.cs-checkout-confirm__status-item.is-error .cs-checkout-confirm__dot {
  background: var(--cs-error);
}

.cs-checkout-confirm__row {
  display: flex;
  align-items: center;
  gap: 0.875rem;
}

.cs-checkout-confirm__action {
  flex: 1;
}

.cs-checkout-confirm__total {
  display: none;
}

/* PayPal sélectionné : son JS masque #payment-confirmation en visibility et
 * insère juste après son bouton (#paypal-buttons, largeur fixe en ligne). On
 * libère la place du bloc masqué et on donne au bouton PayPal la largeur de la
 * colonne. */
.cs-checkout-confirm[style*="visibility: hidden"] {
  display: none !important;
}

#paypal-buttons {
  width: 100% !important;
  margin-block-start: 1rem;
}

/* Toujours d'aspect actif : le disabled de core.js est neutralisé par custom.js,
 * seul l'état « commande en cours d'envoi » (classe disabled seule) subsiste. */
.cs-checkout-confirm__button {
  min-height: 4rem;
  font-size: 1.1875rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.cs-checkout-confirm__missing {
  display: none;
}

@media (max-width: 991.98px) {
  .cs-checkout-confirm__status {
    display: none;
  }

  .cs-checkout-confirm__total {
    display: flex;
    flex-direction: column;
    flex-shrink: 0;
  }

  .cs-checkout-confirm__total-label {
    color: var(--cs-text-info);
    font-size: 0.8125rem;
  }

  .cs-checkout-confirm__total-value {
    color: var(--cs-text-accent);
    font-size: 1.25rem;
    font-weight: 700;
  }

  .cs-checkout-confirm__button {
    min-height: 3.25rem;
    font-size: 1.0625rem;
  }

  /* Le bouton PayPal prend la place de la barre fixe quand il est affiché */
  #paypal-buttons:has(> [paypal-button-container]:not([style*="display: none"])) {
    position: fixed;
    inset-inline: 0;
    bottom: 0;
    z-index: 1031;
    margin: 0;
    padding: 0.75rem 1rem calc(0.75rem + env(safe-area-inset-bottom, 0px));
    background: var(--bs-body-bg);
    border-top: 1px solid var(--cs-border);
    box-shadow: var(--cs-shadow-bar);
  }

  .cs-checkout-confirm__missing:not([hidden]) {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0 0 0.5rem;
    color: var(--cs-error);
    font-size: 0.875rem;
    font-weight: 600;
    text-align: start;
    text-decoration: underline;
  }

  .cs-checkout-confirm__missing .material-icons {
    font-size: 1.125rem;
    text-decoration: none;
  }

  .cs-pay-step {
    --cs-pay-marker: 2rem;

    gap: 0.875rem;
  }

  .cs-pay-step__marker {
    font-size: 1rem;
  }

  .cs-pay-step__title {
    margin-block-start: 0.125rem;
    font-size: 1.1875rem;
  }

  .cs-pay-step__body {
    gap: 0.875rem;
    padding-block-end: 2rem;
  }

  .cs-pay-option__input.form-check-input,
  .cs-pay-conditions__input.form-check-input {
    inset-inline-start: 1rem;
  }

  .cs-pay-option__label {
    min-height: 4rem;
    padding: 0.75rem 1rem 0.75rem 3.5rem;
  }

  .cs-pay-option__name,
  .cs-pay-conditions__label {
    font-size: 1rem;
  }

  .cs-pay-option__hint {
    font-size: 0.8125rem;
  }

  .cs-pay-conditions__label {
    min-height: 4rem;
    padding: 0.875rem 1rem 0.875rem 3.5rem;
  }

  .cs-pay-option__extra,
  .cs-pay-option__form {
    padding: 0 1rem 1rem 3.5rem;
  }
}

/* Mobile étroit : logos sous le libellé, faute de place à droite */
@media (max-width: 575.98px) {
  .cs-pay-option__label {
    flex-wrap: wrap;
    gap: 0.375rem 1rem;
  }

  .cs-pay-option__logo {
    margin-inline-start: 0;
  }
}

/* ------------------------------------------------------------------------- *
 * 4 ter. Tunnel de commande — récapitulatif sous l'étape Paiement
 *
 * Va avec checkout/_partials/order-final-summary.tpl : trois lignes compactes
 * (adresse, livraison, articles), chacune avec son lien « Modifier ».
 * ------------------------------------------------------------------------- */
.cs-recap {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  margin-block-start: 1rem;
}

.cs-recap__title {
  margin: 0;
  color: var(--cs-text-dark);
  font-size: 1.375rem;
  font-weight: 400;
}

.cs-recap__list,
.cs-recap__products {
  margin: 0;
  padding: 0;
  list-style: none;
}

.cs-recap__list {
  border: 1px solid var(--cs-border);
  border-radius: 0.75rem;
}

.cs-recap__row {
  display: flex;
  align-items: flex-start;
  gap: 1rem;
  padding: 1.125rem 1.25rem;
}

.cs-recap__row + .cs-recap__row {
  border-top: 1px solid var(--cs-border);
}

.cs-recap__icon.material-icons {
  flex-shrink: 0;
  margin-block-start: 0.125rem;
  color: var(--cs-text-info);
  font-size: 1.375rem;
}

.cs-recap__body {
  flex: 1;
  min-width: 0;
}

.cs-recap__label {
  margin: 0;
  color: var(--cs-text-accent);
  font-size: 0.9375rem;
  font-weight: 600;
}

.cs-recap__label--next {
  margin-block-start: 0.75rem;
}

.cs-recap__detail {
  margin: 0.25rem 0 0;
  color: var(--cs-text-dark);
  font-size: 0.9375rem;
  font-style: normal;
  line-height: 1.5;
}

.cs-recap__edit {
  flex-shrink: 0;
  padding: 0;
  border: 0;
  background: none;
  color: var(--cs-secondary-strong);
  font-size: 0.9375rem;
  font-weight: 600;
  text-decoration: underline;
}

.cs-recap__edit:hover {
  color: var(--cs-main-strong);
}

@media (max-width: 991.98px) {
  .cs-recap {
    gap: 0.75rem;
  }

  .cs-recap__title {
    font-size: 1.1875rem;
  }

  .cs-recap__row {
    gap: 0.75rem;
    padding: 0.875rem 1rem;
  }

  .cs-recap__icon.material-icons {
    font-size: 1.25rem;
  }

  .cs-recap__detail {
    font-size: 0.875rem;
  }

  .cs-recap__edit {
    font-size: 0.875rem;
  }
}

/* ------------------------------------------------------------------------- *
 * 4 quater. Tunnel de commande — bandeau « Afficher le panier » (mobile, tablette)
 *
 * Va avec checkout/checkout.tpl (.cs-summary) et custom.js. Sous 992px, le
 * récapitulatif remonte au-dessus des étapes, replié derrière un bandeau qui
 * rappelle le total. En desktop, Hummingbird masque l'en-tête de l'accordéon
 * et garde le récapitulatif ouvert : rien ne change.
 * ------------------------------------------------------------------------- */
.cs-summary__label--hide,
.cs-summary__total {
  display: none;
}

@media (max-width: 991.98px) {
  .checkout-grid__aside {
    order: -1;
    margin-block-end: 1.5rem;
  }

  .cs-summary .checkout__summary-accordion-item {
    border: 1px solid var(--cs-border);
    border-radius: 0.75rem;
    background: var(--cs-background);
    overflow: hidden;
  }

  .cs-summary__toggle.accordion-button {
    gap: 0.625rem;
    min-height: 3.25rem;
    padding: 0 1rem;
    background: transparent;
    color: var(--cs-text-accent);
    font-size: 0.9375rem;
    font-weight: 600;
    box-shadow: none;
  }

  .cs-summary__toggle.accordion-button:focus:not(:focus-visible) {
    box-shadow: none;
  }

  .cs-summary__icon.material-icons {
    color: var(--cs-text-info);
    font-size: 1.25rem;
  }

  .cs-summary__label {
    flex: 1;
  }

  .cs-summary__total {
    display: inline;
    font-size: 1.0625rem;
    font-weight: 700;
  }

  .cs-summary:not(.is-collapsed) .cs-summary__label--show,
  .cs-summary.is-collapsed .cs-summary__label--hide {
    display: none;
  }

  .cs-summary:not(.is-collapsed) .cs-summary__label--hide {
    display: inline;
  }

  .cs-summary.is-collapsed #js-checkout-summary {
    display: none;
  }

  .cs-summary #js-checkout-summary {
    padding: 0.25rem 1rem 1rem;
    background: var(--cs-pure-white);
  }
}

/* ------------------------------------------------------------------------- *
 * 4 quinquies. Tunnel de commande — étape « Informations personnelles »
 *
 * Va avec checkout/_partials/steps/personal-information.tpl, login-form.tpl
 * et customer-form.tpl. Les pastilles et titres réutilisent .cs-pay-step*
 * (section 4 bis) ; ici : connexion, carte « Nouveau client ? », carte du
 * client connecté et modale d'inscription (.cs-signup), plein écran en mobile.
 * ------------------------------------------------------------------------- */
.cs-auth__lead {
  margin: 0.375rem 0 0;
  color: var(--cs-text-info);
  font-size: 0.9375rem;
  line-height: 1.5;
}

/* Déconnecté : connexion à gauche ; à droite, création de compte dans une
 * carte sur fond gris de la charte. Ni pastille ni trait vertical. */
.cs-auth--split {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.cs-auth--split > .cs-pay-step::before {
  display: none;
}

.cs-auth--split > .cs-pay-step:first-child {
  padding-inline-end: 2rem;
}

/* Carte grise, partagée avec « Déjà client ? » de la page Création de compte */
.cs-auth--split > .cs-pay-step + .cs-pay-step,
.cs-account-register__aside {
  align-self: start;
  padding: 1.5rem;
  border-radius: 0.75rem;
  background: var(--cs-background);
}

.cs-auth--split .cs-pay-step__body {
  padding-block-end: 0;
}

.cs-auth--split .cs-pay-step__title,
.cs-account-register__aside .cs-pay-step__title {
  font-size: 1.1875rem;
}

@media (max-width: 767.98px) {
  .cs-auth--split {
    grid-template-columns: minmax(0, 1fr);
  }

  .cs-auth--split > .cs-pay-step:first-child {
    padding-inline-end: 0;
    padding-block-end: 2rem;
  }

  .cs-auth--split > .cs-pay-step + .cs-pay-step,
  .cs-account-register__aside {
    padding: 1.25rem 1rem;
  }
}

/* Boutons d'action de l'étape : capitales, flèche (comme « Confirmer et payer ») */
.cs-auth__submit.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  min-height: 3.75rem;
  font-size: 1.125rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.cs-auth__submit .material-icons {
  font-size: 1.25rem;
}

/* « Se connecter » : hauteur Bootstrap par défaut, largeur des champs */
.cs-auth__submit.cs-auth__submit--compact.btn {
  gap: 0.5rem;
  min-height: 0;
  font-size: 1rem;
}

.cs-auth__submit--compact .material-icons {
  font-size: 1.125rem;
}

/* Connexion : champs natifs sans carte, lien « Mot de passe oublié ? » sous les champs */
.cs-auth__login .form-label,
.cs-signup .form-label {
  color: var(--cs-text-accent);
  font-size: 0.9375rem;
  font-weight: 600;
}

.cs-auth__forgot {
  margin: -0.25rem 0 1.25rem;
  font-size: 0.875rem;
  font-weight: 600;
}

/* Contenu de la carte « Nouveau client ? » : avantages et bouton */
.cs-auth__signup-card {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.cs-auth__benefits {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  margin: 0;
  padding: 0;
  color: var(--cs-text-dark);
  font-size: 0.9375rem;
  list-style: none;
}

.cs-auth__benefits li {
  display: flex;
  align-items: center;
  gap: 0.625rem;
}

.cs-auth__benefits .material-icons {
  color: var(--cs-success);
  font-size: 1.125rem;
  font-weight: 700;
}

/* Bouton d'une carte grise (« Créer un compte », « Se connecter ») : même gabarit
 * que « Se connecter » (.cs-auth__submit--compact), en contour sur fond blanc,
 * sur toute la largeur de la carte. Le survol natif reste inchangé. */
.cs-auth__card-action.btn {
  --bs-btn-bg: var(--cs-pure-white);

  width: 100%;
}

/* Client connecté */
.cs-auth__customer {
  display: flex;
  align-items: center;
  gap: 1rem;
  min-height: 5.5rem;
  padding: 1.125rem 1.25rem;
  border-radius: 0.75rem;
  background: var(--cs-main-tint-light);
}

.cs-auth__initials {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  width: 3.25rem;
  height: 3.25rem;
  border-radius: 50%;
  background: var(--cs-main-strong);
  color: var(--cs-pure-white);
  font-size: 1.125rem;
  font-weight: 700;
}

.cs-auth__identity {
  flex: 1;
  min-width: 0;
}

.cs-auth__name,
.cs-auth__email {
  margin: 0;
  overflow-wrap: anywhere;
}

.cs-auth__name {
  color: var(--cs-text-accent);
  font-size: 1.0625rem;
  font-weight: 600;
}

.cs-auth__email {
  margin-block-start: 0.1875rem;
  color: var(--cs-text-dark);
  font-size: 0.9375rem;
}

.cs-auth__logout {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  margin: 0;
  color: var(--cs-text-info);
  font-size: 0.875rem;
  text-align: end;
}

.cs-auth__logout-link {
  font-size: 0.9375rem;
  font-weight: 600;
  text-decoration: underline;
}

.cs-auth__note {
  margin: 0;
  color: var(--cs-text-info);
  font-size: 0.8125rem;
}

/* Modale d'inscription */
.cs-signup .modal-content {
  border: 0;
  border-radius: 1rem;
}

.cs-signup__header.modal-header {
  align-items: flex-start;
  gap: 1rem;
  padding: 1.75rem 2rem 1.25rem;
}

.cs-signup__title {
  margin: 0;
  color: var(--cs-text-accent);
  font-size: 1.5rem;
  font-weight: 700;
}

.cs-signup__lead {
  margin: 0.375rem 0 0;
  color: var(--cs-text-info);
  font-size: 0.9375rem;
}

.cs-signup__header .btn-close {
  flex-shrink: 0;
  width: 2.75rem;
  height: 2.75rem;
  margin: 0 0 0 auto;
  padding: 0;
  border-radius: 50%;
  background-color: var(--cs-background);
  background-size: 0.875rem;
}

.cs-signup__body.modal-body {
  padding: 1.5rem 2rem 1.75rem;
}

/* Grille des champs : pleine largeur, sauf prénom et nom côte à côte */
.cs-signup #customer-form > section {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 1rem;
}

.cs-signup #customer-form > section > * {
  grid-column: 1 / -1;
}

.cs-signup #customer-form > section > .cs-signup__field--firstname,
.cs-signup #customer-form > section > .cs-signup__field--lastname {
  grid-column: auto;
}

.cs-signup__field > .mb-3 {
  margin-block-end: 1.125rem !important;
}

/* Civilité : radios simples sans contour, point en couleur principale */
.cs-signup__field--type-radio-buttons .form-check-inline {
  display: inline-flex;
  align-items: center;
  gap: 0.625rem;
  min-height: 2.75rem;
  margin-inline-end: 2rem;
  padding-inline-start: 0;
}

.cs-signup__field--type-radio-buttons .form-check-input {
  float: none;
  width: 1.375rem;
  height: 1.375rem;
  margin: 0;
  border: 2px solid var(--cs-control);
  cursor: pointer;
}

.cs-signup__field--type-radio-buttons .form-check-input:checked {
  border-color: var(--cs-main-strong);
  background-color: var(--cs-pure-white);
  background-image: radial-gradient(circle, var(--cs-main-strong) 0 0.3125rem, transparent 0.35rem);
}

.cs-signup__field--type-radio-buttons .form-check-label {
  color: var(--cs-text-accent);
  font-size: 1rem;
  font-weight: 500;
  cursor: pointer;
}

/* Date de naissance : champ réduit, explication dessous */
.cs-signup__field--birthday .form-control {
  max-width: 12.5rem;
}

.cs-signup__field--birthday > .mb-3 {
  margin-block-end: 0.5rem !important;
}

.cs-signup__birthday-hint {
  margin-block-end: 1.5rem;
  font-size: 0.8125rem;
  line-height: 1.45;
}

.cs-signup__birthday-question {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0;
  color: var(--cs-main-strong);
  font-weight: 600;
}

.cs-signup__birthday-question .material-icons {
  font-size: 1rem;
}

.cs-signup__birthday-answer {
  margin: 0.125rem 0 0;
  color: var(--cs-text-info);
}

/* Cases à cocher (CGU, données, newsletter…) : une carte par case, comme les CGV */
.cs-signup__field--type-checkbox .form-check {
  position: relative;
  min-height: 3.5rem;
  margin: 0;
  padding: 0.875rem 1rem 0.875rem 3.5rem;
  border: 2px solid var(--cs-border);
  border-radius: 0.75rem;
  background: var(--cs-pure-white);
}

.cs-signup__field--type-checkbox .form-check:has(.form-check-input:checked) {
  border-color: var(--cs-main-strong);
  background: var(--cs-main-tint-light);
}

.cs-signup__field--type-checkbox .has-error .form-check:not(:has(:checked)) {
  border-color: var(--cs-error-soft);
  background: var(--cs-error-bg);
}

.cs-signup__field--type-checkbox .form-check-input {
  position: absolute;
  inset-block-start: 0.875rem;
  inset-inline-start: 1rem;
  width: 1.625rem;
  height: 1.625rem;
  margin: 0;
  border: 2px solid var(--cs-control);
  border-radius: 0.375rem;
  cursor: pointer;
}

.cs-signup__field--type-checkbox .form-check-input:checked {
  border-color: var(--cs-main-strong);
  background-color: var(--cs-main-strong);
}

.cs-signup__field--type-checkbox .form-check-input:focus {
  box-shadow: none;
}

.cs-signup__field--type-checkbox .form-check:has(.form-check-input:focus-visible) {
  outline: 3px solid var(--cs-main-strong);
  outline-offset: 3px;
}

.cs-signup__field--type-checkbox .form-check-label {
  display: block;
  color: var(--cs-text-accent);
  font-size: 0.9375rem;
  font-weight: 500;
  line-height: 1.4;
  cursor: pointer;
}

.cs-signup__field--type-checkbox .form-check-label em,
.cs-signup__field--type-checkbox .form-check-label small,
.cs-signup__field--type-checkbox .form-check-label p {
  display: block;
  margin: 0.1875rem 0 0;
  color: var(--cs-text-info);
  font-size: 0.8125rem;
  font-style: normal;
  font-weight: 400;
}

.cs-signup__field--type-checkbox > .mb-3 {
  margin-block-end: 0.625rem !important;
}

.cs-signup #customer-form footer {
  display: block;
  margin-block-start: 1rem;
}

.cs-signup__switch {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.375rem;
  margin: 1rem 0 0;
  color: var(--cs-text-dark);
  font-size: 0.9375rem;
}

.cs-signup__switch-link {
  min-height: 2.75rem;
  padding: 0;
  border: 0;
  background: none;
  color: var(--cs-secondary-strong);
  font-weight: 600;
  text-decoration: underline;
}

.cs-signup__switch-link:hover {
  color: var(--cs-main-strong);
}

@media (max-width: 991.98px) {
  .cs-auth__submit.btn {
    min-height: 3.5rem;
    font-size: 1rem;
  }

  .cs-auth__customer {
    flex-wrap: wrap;
  }

  .cs-auth__logout {
    flex-direction: row;
    align-items: center;
    gap: 0.375rem;
    width: 100%;
    text-align: start;
  }
}

@media (max-width: 575.98px) {
  .cs-signup .modal-content {
    border-radius: 0;
  }

  .cs-signup__header.modal-header {
    padding: 0.75rem 0.5rem 0.75rem 1rem;
  }

  .cs-signup__title {
    font-size: 1.25rem;
  }

  .cs-signup__body.modal-body {
    padding: 1.25rem 1rem;
  }

  .cs-signup__field--birthday .form-control {
    max-width: 9.5rem;
  }
}

/* ------------------------------------------------------------------------- *
 * 4 quinquies bis. Pages Connexion et Création de compte (hors tunnel)
 *
 * Va avec customer/authentication.tpl et customer/registration.tpl, qui
 * reprennent le balisage de l'étape « Informations personnelles » et de la
 * modale d'inscription : leurs styles (section 4 quinquies) s'appliquent. Ici :
 * titre de page souligné comme dans le tunnel, et mise en page de la création
 * de compte (formulaire + carte « Déjà client ? »).
 * ------------------------------------------------------------------------- */
.cs-account-page .page-header {
  margin-block-end: 1.75rem;
  padding-block-end: 1rem;
  border-bottom: 1px solid var(--cs-border);
}

.cs-account-page .page-title-section {
  margin: 0;
}

.cs-account-register {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 2rem;
}

.cs-account-register__aside {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.cs-account-register__aside .cs-auth__lead {
  margin: 0;
}

@media (min-width: 992px) {
  .cs-account-register {
    grid-template-columns: minmax(0, 1fr) 20rem;
    gap: 2.75rem;
    align-items: start;
  }
}

/* ------------------------------------------------------------------------- *
 * 4 sexies. Tunnel de commande — étape « Adresses »
 *
 * Va avec checkout/_partials/steps/addresses.tpl, address-selector-block.tpl
 * et address-form.tpl : adresses en tableau (une ligne par adresse, filet de
 * 1px), actions en icônes, étage déplié pour le formulaire, modale de
 * confirmation de suppression (#cs-address-delete-modal).
 * ------------------------------------------------------------------------- */
.cs-addr-step__intro {
  margin-block-end: 1rem;
  color: var(--cs-text-info);
  font-size: 0.875rem;
  line-height: 1.5;
}

.cs-addr-list {
  display: block;
  margin-block-end: 1rem;
  border: 1px solid var(--cs-border);
  border-radius: 0.75rem;
  background: var(--cs-pure-white);
  overflow: hidden;
}

.cs-addr + .cs-addr {
  border-top: 1px solid var(--cs-border);
}

.cs-addr__row {
  display: flex;
  align-items: flex-start;
}

.cs-addr.selected .cs-addr__row {
  background: var(--cs-main-tint-light);
}

/* Radio, nom et adresse alignés : le radio est centré sur la ligne du nom */
.cs-addr__main {
  display: flex;
  flex: 1;
  align-items: flex-start;
  gap: 0.75rem;
  min-width: 0;
  margin: 0;
  padding: 0.75rem 0.75rem 0.75rem 1rem;
  cursor: pointer;
}

.cs-addr__radio.form-check-input {
  flex-shrink: 0;
  width: 1.25rem;
  height: 1.25rem;
  margin: 0.0625rem 0 0;
  border: 2px solid var(--cs-control);
  cursor: pointer;
}

.cs-addr__radio.form-check-input:checked {
  border-color: var(--cs-main-strong);
  background-color: var(--cs-pure-white);
  background-image: radial-gradient(circle, var(--cs-main-strong) 0 0.3125rem, transparent 0.35rem);
}

.cs-addr__radio.form-check-input:focus {
  box-shadow: none;
}

.cs-addr__main:has(.cs-addr__radio:focus-visible) {
  outline: 3px solid var(--cs-main-strong);
  outline-offset: -3px;
}

.cs-addr__radio.form-check-input:disabled {
  opacity: 0.6;
}

.cs-addr__main:has(.cs-addr__radio:disabled) {
  cursor: default;
}

.cs-addr__text {
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
  min-width: 0;
}

.cs-addr__alias {
  color: var(--cs-text-accent);
  font-size: 0.9375rem;
  font-weight: 600;
  line-height: 1.375rem;
}

.cs-addr__line {
  color: var(--cs-text-dark);
  font-size: 0.875rem;
  line-height: 1.45;
}

/* Icônes à droite, centrées sur la ligne du nom */
.cs-addr__actions {
  display: flex;
  flex-shrink: 0;
  gap: 0.125rem;
  padding: 0.1875rem 0.375rem 0 0;
}

.cs-addr__action {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 0.5rem;
  color: var(--cs-text-dark);
  text-decoration: none;
}

.cs-addr__action .material-icons {
  font-size: 1.125rem;
}

.cs-addr__action--delete {
  color: var(--cs-danger);
}

.cs-addr__action:hover,
.cs-addr__action:focus-visible {
  background: rgba(16, 16, 16, 0.05);
}

.cs-addr__action--delete:hover {
  color: var(--cs-danger);
}

/* Ligne « Ajouter une nouvelle adresse », chevron retourné quand l'étage est ouvert */
.cs-addr-list__add {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  min-height: 3rem;
  padding: 0 1rem;
  border-top: 1px solid var(--cs-border);
  color: var(--cs-secondary-strong);
  font-size: 0.875rem;
  font-weight: 600;
  text-decoration: none;
}

.cs-addr-list > .cs-addr-list__add:first-child {
  border-top: 0;
}

.cs-addr-list__add span {
  flex: 1;
}

.cs-addr-list__add .material-icons {
  font-size: 1.125rem;
}

.cs-addr-list__add:hover {
  background: var(--cs-main-tint-faint);
  color: var(--cs-secondary-strong);
}

.cs-addr-list__add.is-open .cs-addr-list__chevron {
  transform: rotate(180deg);
}

/* Étage déplié : formulaire sur fond gris, aligné sur le texte des adresses */
.cs-addr__editor {
  padding: 1.125rem 1rem 1.25rem 3rem;
  border-top: 1px solid var(--cs-border);
  background: var(--cs-background);
  scroll-margin-block-start: 7rem;
}

.cs-addr__editor .form-fields,
.cs-addr-step__first .form-fields {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 1rem;
}

.cs-addr-form__field {
  grid-column: 1 / -1;
  min-width: 0;
}

/* Case « même adresse de facturation » et société sans champ TVA : pleine largeur */
.cs-addr__editor .form-fields > .form-check,
.cs-addr-step__first .form-fields > .form-check,
.cs-addr-form__field--company:not(:has(+ .cs-addr-form__field--vat_number)) {
  grid-column: 1 / -1;
}

.cs-addr-form__field--firstname,
.cs-addr-form__field--lastname,
.cs-addr-form__field--company,
.cs-addr-form__field--vat_number,
.cs-addr-form__field--postcode,
.cs-addr-form__field--city,
.cs-addr-form__field--id_country,
.cs-addr-form__field--phone {
  grid-column: auto;
}

.cs-addr-form__actions {
  display: flex;
  justify-content: flex-end;
  gap: 0.625rem;
}

.cs-addr-step__invoice-link {
  display: inline-block;
  margin-block-end: 0.5rem;
  font-size: 0.875rem;
  font-weight: 500;
}

/* Modale de confirmation de suppression */
.cs-addr-delete .modal-content {
  border: 0;
  border-radius: 1rem;
}

.cs-addr-delete .modal-body {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  padding: 1.5rem;
}

.cs-addr-delete__title {
  margin: 0;
  color: var(--cs-text-accent);
  font-size: 1.25rem;
  font-weight: 600;
}

.cs-addr-delete__address {
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
  padding: 0.75rem 0.875rem;
  border: 1px solid var(--cs-border);
  border-radius: 0.625rem;
  background: var(--cs-background);
}

.cs-addr-delete__alias {
  color: var(--cs-text-accent);
  font-size: 0.9375rem;
  font-weight: 600;
}

.cs-addr-delete__line {
  color: var(--cs-text-dark);
  font-size: 0.875rem;
  line-height: 1.45;
}

.cs-addr-delete__note {
  margin: 0;
  color: var(--cs-text-info);
  font-size: 0.875rem;
}

.cs-addr-delete__actions {
  display: flex;
  justify-content: flex-end;
  gap: 0.625rem;
}

.cs-addr-delete .btn-danger {
  --bs-btn-bg: var(--cs-danger);
  --bs-btn-border-color: var(--cs-danger);
  --bs-btn-hover-bg: var(--cs-danger-hover);
  --bs-btn-hover-border-color: var(--cs-danger-hover);
}

@media (max-width: 575.98px) {
  .cs-addr__main {
    padding-inline-start: 0.875rem;
  }

  .cs-addr__editor {
    padding: 1rem 0.875rem 1.125rem;
  }

  .cs-addr__editor .form-fields,
  .cs-addr-step__first .form-fields {
    grid-template-columns: minmax(0, 1fr);
  }

  .cs-addr-delete .modal-dialog {
    align-items: flex-end;
    min-height: calc(100% - 1rem);
  }
}

/* ------------------------------------------------------------------------- *
 * 5. Composants éditoriaux des pages CMS
 *
 * Socle commun à toutes les pages CMS à mise en page dédiée. Le contenu reste
 * administré dans Design > Pages ; le bloc racine .cs-cms sert de contrat
 * stable entre le HTML enregistré en base et cette présentation. Aucun
 * sélecteur ne dépend de l'identifiant de la page CMS : le même fragment peut
 * donc être recréé dans une base locale avec un autre ID.
 *
 * Une nouvelle page compose ces blocs sans ajouter de CSS. Si elle a besoin
 * d'une variante, ajouter ici un modificateur générique plutôt qu'un bloc
 * propre à une page. Les noms de classes ne changent pas : les fragments en
 * base en dépendent.
 *
 * Couleurs : tokens de la charte (section 1). Le reboot Bootstrap de
 * Hummingbird fournit déjà box-sizing et l'absence de marge haute des titres,
 * paragraphes et figures ; ils ne sont pas redéclarés ici.
 * ------------------------------------------------------------------------- */

/* Le titre natif reste dans le document pour les lecteurs d'écran ; la
 * composition éditoriale fournit le titre visible de la page. */
body:has(.cs-cms) .page-header {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Largeur : celle du container Bootstrap, comme les sections de la home et le
 * bloc newsletter.
 *
 * Tokens du socle :
 * - --cs-cms-radius : rayon unique des cartes, pastilles de repère et médias
 *   posés sur un fond coloré ; ailleurs, médias et cartouche sont à angles
 *   droits, et les pastilles numérotées restent des cercles ;
 * - --cs-panel-padding (section 1) : retrait intérieur des aplats (bande
 *   teintée, cartouche), celui du panneau newsletter.
 *
 * Texte courant (paragraphes, cartes, étapes, aplats) : celui de la section
 * Introduction de la home (--cs-block-text-*, section 1). Titres, pastilles,
 * tableau et boutons gardent leur taille propre.
 *
 * Le padding bas est le seul écart entre le dernier bloc et le bloc newsletter
 * (voir « Rythme vertical »). */
.cs-cms {
  --cs-cms-radius: 1.3rem;
  width: 100%;
  max-width: none;
  margin-inline: 0;
  padding-block-end: var(--cs-home-gap);
  color: var(--cs-text-dark);
  background: var(--cs-pure-white);
  font-size: var(--cs-block-text-size);
  line-height: var(--cs-block-text-line-height);
}

.cs-cms img {
  display: block;
  max-width: 100%;
}

.cs-cms a:focus-visible {
  border-radius: 0.25rem;
  outline: 3px solid var(--cs-secondary-strong);
  outline-offset: 4px;
}

/* Texte secondaire : une seule déclaration pour tous les blocs concernés. */
.cs-cms__lead,
.cs-cms__card p,
.cs-cms__split-body > p,
.cs-cms__chip-label,
.cs-cms__table-note,
.cs-cms__table td {
  color: var(--cs-text-info);
}

/* Graisse, interligne et approche des titres : style partagé « Titre et texte
 * de bloc » (section 1) ; le sur-titre .cs-cms__split-index suit le style
 * partagé .cs-overline. */

/* Marge du dernier enfant neutralisée : sans quoi elle déborderait de son bloc
 * et s'ajouterait aux écarts du socle. */
.cs-cms > :last-child,
.cs-cms__section > :last-child,
.cs-cms__lead > :last-child,
.cs-cms__split-body > :last-child,
.cs-cms__card > :last-child,
.cs-cms__note p {
  margin-block-end: 0;
}

/* --- Sections et bandes ------------------------------------------------- */

/* Rythme vertical : un seul écart entre blocs de premier niveau (sections,
 * bandes, cartouche), celui des sections de la home (--cs-home-gap), et le même
 * sous le dernier bloc jusqu'au bloc newsletter. Les blocs n'ont donc aucun
 * espacement vertical propre, hormis le retrait intérieur des aplats. */
.cs-cms > :is(.cs-cms__section, .cs-cms__band, .cs-cms__note)
  + :is(.cs-cms__section, .cs-cms__band, .cs-cms__note) {
  margin-block-start: var(--cs-home-gap);
}

/* Le padding bas de .page (Hummingbird) et le padding haut du bloc newsletter
 * s'ajouteraient au padding bas de .cs-cms : seul ce dernier subsiste. */
.page:not(body):has(.cs-cms) {
  padding-bottom: 0;
}

body:has(.cs-cms) .cs-newsletter {
  padding-top: 0;
}

/* Chapeau de page : le titre natif étant masqué, la première section porte le
 * discours d'accroche et reste resserrée sous le fil d'Ariane. */
.cs-cms__section--intro {
  padding-block-start: 0.625rem;
}

/* Bande pleine largeur : .cs-cms__band n'a pas de style propre (fond blanc du
 * socle) ; la variante teintée pose un fond continu derrière la section. */
.cs-cms__band--tint {
  background: var(--bs-tertiary-bg);
}

/* Le fond s'étend sur toute la largeur du container : le contenu s'en écarte. */
.cs-cms__band--tint > .cs-cms__section {
  padding: var(--cs-panel-padding);
}

/* --- En-têtes de section ------------------------------------------------ */

/* Titre et chapeau empilés, seule disposition. Le modificateur --stacked des
 * fragments en base est sans effet ; ne pas lui attacher de style. */
/* Écarts titre → chapeau et en-tête → contenu : ceux des en-têtes de la home. */
.cs-cms__heading {
  display: grid;
  gap: var(--cs-home-header-gap);
  margin-block-end: var(--cs-home-header-gap);
}

/* En-tête suivi d'une note de tableau : chapeau et note se lisent d'un seul
 * tenant, comme deux paragraphes, au-dessus du tableau qu'ils introduisent. */
.cs-cms__heading:has(+ .cs-cms__table-note) {
  margin-block-end: 1rem;
}

/* Titre de section à la taille des titres de la home ; celui du chapeau, qui
 * tient lieu de titre de page, reste plus grand. */
.cs-cms__title,
.cs-cms__split-title {
  font-size: var(--cs-home-title-size);
}

.cs-cms__title {
  margin-block-end: 0;
}

.cs-cms__section--intro .cs-cms__title {
  font-size: clamp(2rem, 3.6vw, 3.6rem);
}

.cs-cms__lead {
  margin: 0;
}

.cs-cms__lead p {
  margin-block-end: 1rem;
}

/* --- Médias : visuel d'accroche et blocs média + texte ------------------- */

.cs-cms__hero,
.cs-cms__split-media {
  margin: 0;
  overflow: hidden;
  aspect-ratio: 3 / 2;
}

/* Seul un média posé sur un fond coloré garde des coins arrondis. */
.cs-cms__band--tint :is(.cs-cms__hero, .cs-cms__split-media),
.cs-cms__note :is(.cs-cms__hero, .cs-cms__split-media) {
  border-radius: var(--cs-cms-radius);
}

.cs-cms__hero img,
.cs-cms__split-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Recadrage pour un visuel dont le sujet occupe le bas de l'image. */
.cs-cms__hero--bottom img {
  object-position: center bottom;
}

/* --- Pastilles numérotées (cartes et étapes) ------------------------------ */

.cs-cms__card-number,
.cs-cms__step-number {
  display: grid;
  place-items: center;
  border-radius: 50%;
  font-weight: 700;
}

/* --- Cartes numérotées -------------------------------------------------- */

.cs-cms__cards {
  display: grid;
  align-items: stretch;
  gap: var(--cs-home-grid-gap);
}

.cs-cms__card {
  padding: 1.875rem;
  background: var(--bs-tertiary-bg);
  border: 1px solid var(--cs-border);
  border-radius: var(--cs-cms-radius);
}

.cs-cms__band--tint .cs-cms__card {
  background: var(--cs-pure-white);
}

.cs-cms__card-number {
  width: 2.75rem;
  height: 2.75rem;
  margin-block-end: 2.25rem;
  color: var(--cs-pure-white);
  background: var(--cs-main-strong);
  font-size: 1.125rem;
}

.cs-cms__card-title {
  margin-block-end: 0.75rem;
  font-size: 1.5rem;
}

.cs-cms__card p {
  margin-block-end: 0.75rem;
}

/* --- Blocs média + texte ------------------------------------------------ */

.cs-cms__split {
  display: grid;
  align-items: center;
  gap: clamp(2.125rem, 7vw, 6rem);
  scroll-margin-top: 6rem;
}

/* Suite de blocs séparés par un filet, média alterné gauche / droite en
 * desktop ; de part et d'autre du filet, l'écart entre blocs du socle. */
.cs-cms__split-list .cs-cms__split {
  padding-block: var(--cs-home-gap);
  border-top: 1px solid var(--cs-border);
}

.cs-cms__split-list .cs-cms__split:first-child {
  padding-block-start: 0;
  border-top: 0;
}

.cs-cms__split-list .cs-cms__split:last-child {
  padding-block-end: 0;
}

/* Sur-titre du bloc : style partagé (.cs-overline) ; écart avec le titre repris
 * des sections de la home. */
.cs-cms__split-index {
  display: inline-block;
  margin-block-end: var(--cs-home-overline-gap);
}

.cs-cms__split-title {
  margin-block-end: var(--cs-home-header-gap);
}

.cs-cms__split-body > p {
  margin-block-end: 1rem;
}

/* Léger zoom du visuel au survol, seulement sans préférence de mouvement réduit. */
@media (prefers-reduced-motion: no-preference) {
  .cs-cms__split-media img {
    transition: transform 0.7s ease;
  }

  .cs-cms__split:hover .cs-cms__split-media img {
    transform: scale(1.025);
  }
}

/* --- Étapes numérotées -------------------------------------------------- */

.cs-cms__steps {
  display: grid;
  gap: 0.75rem;
  margin: 1.5rem 0 0;
  padding: 0;
  list-style: none;
}

/* Un paragraphe qui reprend après une liste d'étapes garde son interligne. */
.cs-cms__steps + p {
  margin-block-start: 1rem;
}

.cs-cms__step {
  display: grid;
  grid-template-columns: 2rem 1fr;
  gap: 0.75rem;
  align-items: start;
}

.cs-cms__step-number {
  width: 2rem;
  height: 2rem;
  color: var(--cs-main-strong);
  background: var(--cs-main-tint-light);
  font-size: 0.9375rem;
}

.cs-cms__step-text {
  padding-block-start: 0.05rem;
}

/* --- Pastilles de repère ------------------------------------------------ */

.cs-cms__chips {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
  gap: var(--cs-home-grid-gap);
  margin: 2.25rem 0 0;
  padding: 0;
  list-style: none;
}

.cs-cms__chip {
  display: grid;
  gap: 0.5rem;
  padding: 1.125rem 0.75rem;
  text-align: center;
  background: var(--cs-main-tint-light);
  border-radius: var(--cs-cms-radius);
  justify-items: center;
}

.cs-cms__chip-key {
  font-size: 1.75rem;
  line-height: 1;
}

/* Petit libellé en capitales espacées. */
.cs-cms__chip-label {
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

/* --- Tableaux ------------------------------------------------------------ */

.cs-cms__table-note {
  margin: 0 0 1rem;
}

/* Le tableau se réduit pour tenir sans défilement horizontal : un conteneur
 * scrollable serait un piège au clavier, et HTMLPurifier retire les attributs
 * ARIA du contenu CMS. L'overflow ne sert donc que de filet de sécurité, avec
 * un overflow-y explicite sans quoi la valeur calculée passerait à auto et
 * ferait apparaître une barre verticale parasite. */
.cs-cms__table-wrapper {
  overflow-x: auto;
  overflow-y: hidden;
  border: 1px solid var(--cs-border);
}

.cs-cms__table {
  width: 100%;
  margin: 0;
  border-collapse: separate;
  border-spacing: 0;
  text-align: center;
}

.cs-cms__table th,
.cs-cms__table td {
  padding: 0.75rem 1rem;
  border-bottom: 1px solid var(--cs-border);
  font-size: 1rem;
  font-variant-numeric: tabular-nums;
}

.cs-cms__table thead th {
  color: var(--cs-pure-white);
  background: var(--cs-main-strong);
  font-weight: 700;
}

.cs-cms__table thead th:first-child,
.cs-cms__table tbody th {
  position: sticky;
  left: 0;
  z-index: 1;
}

.cs-cms__table tbody th {
  background: var(--bs-tertiary-bg);
  font-weight: 700;
}

.cs-cms__table tbody tr:last-child th,
.cs-cms__table tbody tr:last-child td {
  border-bottom: 0;
}

.cs-cms__table tbody tr:hover th,
.cs-cms__table tbody tr:hover td {
  color: var(--cs-text-dark);
  background: var(--cs-main-tint-light);
}

/* --- Appels à l'action --------------------------------------------------- */

.cs-cms__cta {
  margin: 0 0 2rem;
}

.cs-cms__cta-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  text-decoration: none;
}

/* --- Cartouche de clôture ------------------------------------------------ */

/* Aplat lilas : couleurs, titre, écarts et bouton de la section téléphone de
 * la home (chaussmarthomephone). */
.cs-cms__note {
  padding: var(--cs-panel-padding);
  color: var(--cs-main-strong);
  background: var(--cs-main-tint-light);
}

.cs-cms__note-grid {
  display: grid;
  align-items: start;
  gap: 1rem;
}

.cs-cms__note-grid--split .cs-cms__cta {
  margin: 0;
}

.cs-cms__note-title {
  margin-block-end: 0.625rem;
  font-size: var(--cs-panel-title-size);
}

/* Hauteur minimale plutôt que fixe : un libellé long peut passer sur deux
 * lignes. */
.cs-cms__note .cs-cms__cta-link {
  min-height: 3.5rem;
  padding: 0.5rem 1.875rem;
  border-radius: 4px;
  font-size: 1.3125rem;
  font-weight: 900;
  letter-spacing: 0.02em;
  line-height: 1.2;
  text-align: center;
}

/* --- Adaptations aux écrans ---------------------------------------------- */

@media (min-width: 992px) {
  .cs-cms__cards {
    grid-template-columns: repeat(3, 1fr);
  }

  .cs-cms__split {
    grid-template-columns: 1.08fr 0.92fr;
  }

  .cs-cms__split-list .cs-cms__split:nth-child(even) {
    grid-template-columns: 0.92fr 1.08fr;
  }

  .cs-cms__split-list .cs-cms__split:nth-child(even) .cs-cms__split-media {
    order: 2;
  }

  .cs-cms__note-grid {
    gap: 1.5rem;
  }

  /* Message et appel à l'action côte à côte : le bouton, borné, passe au
   * besoin sur deux lignes et laisse au message le reste du cartouche. */
  .cs-cms__note-grid--split {
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
  }

  .cs-cms__note-grid--split .cs-cms__cta {
    justify-self: end;
  }

  .cs-cms__note-grid--split .cs-cms__cta-link {
    max-width: 22rem;
  }

  .cs-cms__note .cs-cms__cta-link {
    min-height: 3.75rem;
    font-size: 1.375rem;
  }
}

@media (max-width: 575.98px) {
  .cs-cms__chips {
    grid-template-columns: repeat(2, 1fr);
  }

  /* Valeurs mesurées : le tableau tient sans défilement jusqu'à 320 px. */
  .cs-cms__table th,
  .cs-cms__table td {
    padding: 0.5rem 0.2rem;
    font-size: 0.8rem;
  }
}

/* ------------------------------------------------------------------------- *
 * 6. Mega menu
 *
 * Panneau du menu principal desktop, rendu par
 * modules/ps_mainmenu/ps_mainmenu.tpl.
 *
 * La mise en page est une GRILLE de quatre colonnes réelles, et non un flux de
 * colonnes CSS : un module doit pouvoir placer un groupe dans une colonne
 * précise, ce que `columns` ne permet pas puisqu'il répartit automatiquement.
 * À défaut de placement, le template distribue les groupes en round-robin.
 *
 * L'affichage et le masquage du panneau restent pilotés par le JS du thème
 * parent, qui écrit `display` en style inline : ne rien déclarer ici sur la
 * propriété `display` de .submenu, ce serait sans effet.
 *
 * ⚠️ La section 1 recolore TOUS les liens du site via --bs-link-color-rgb. Les
 * couleurs de texte du panneau sont donc posées explicitement, sans quoi toute
 * la navigation prendrait la couleur des liens.
 * ------------------------------------------------------------------------- */

.cs-megamenu {
  background: var(--cs-pure-white);
  border: 1px solid var(--cs-border);
  box-shadow: var(--cs-shadow-panel);
}

/* Hauteur minimale, jamais fixe : un contenu plus haut étend le panneau plutôt
 * que d'être coupé. Avec `box-sizing: border-box`, les 50px de marge interne
 * haute et basse laissent exactement les 400px de la zone de mise en avant.
 *
 * Aucun `gap` ici, ni sur la grille : la largeur d'une colonne doit valoir
 * exactement (largeur du panneau - 300px) / 4. Un gap la rognerait. La
 * respiration entre colonnes est donc un padding interne, qui ne change pas
 * leur largeur. */
.cs-megamenu__panel {
  display: flex;
  gap: 0;
  align-items: flex-start;
  min-height: 500px;
  padding-block: 50px;
}

/* `flex: 1 1 auto` occupe la largeur restante, soit le panneau moins les 300px
 * de la mise en avant ; les quatre colonnes en `1fr` la divisent également.
 * Sans mise en avant, elles se partagent naturellement toute la largeur. */
.cs-megamenu__columns {
  display: grid;
  flex: 1 1 auto;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0;
  min-width: 0;
}

.cs-megamenu__column {
  min-width: 0;
  padding-inline-end: 2.5rem;
}

.cs-megamenu__group {
  /* Espace entre deux groupes d'une même colonne. */
  margin-block-end: 2.25rem;
}

.cs-megamenu__group:last-child {
  margin-block-end: 0;
}

/* Titre de groupe : la catégorie de niveau 2. La pastille est un pseudo-élément
 * sorti du flux à gauche, donc absente de l'arbre d'accessibilité et sans effet
 * sur l'alignement : le titre et les liens partagent la même marge gauche. */
.cs-megamenu__group-title {
  position: relative;
  /* `inline-block` et non `block` : la zone cliquable doit s'arrêter au texte,
   * pas s'étendre à toute la largeur de la colonne. */
  display: inline-block;
  margin-block-end: 0.85rem;
  color: var(--cs-text-accent);
  font-weight: 700;
  font-size: 0.95rem;
  text-transform: uppercase;
  text-decoration: none;
  letter-spacing: 0.01em;
}

.cs-megamenu__group-title::before {
  position: absolute;
  inset-inline-start: -0.85rem;
  inset-block-start: 0.5em;
  width: 5px;
  height: 5px;
  background: var(--cs-secondary);
  border-radius: 50%;
  content: "";
}

.cs-megamenu__group-title:hover,
.cs-megamenu__group-title:focus-visible {
  color: var(--cs-main-strong);
}

.cs-megamenu__list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.cs-megamenu__list--nested {
  margin-inline-start: 0.75rem;
  padding-inline-start: 0.5rem;
  border-inline-start: 1px solid var(--cs-border);
}

.cs-megamenu__item {
  margin-block-end: 0.35rem;
}

/* Idem : la cible du lien s'arrête au texte. Le <li> reste un bloc, donc les
 * liens s'empilent normalement. */
.cs-megamenu__link {
  display: inline-block;
  color: var(--cs-text-dark);
  font-size: 0.9rem;
  text-decoration: none;
}

.cs-megamenu__link:hover,
.cs-megamenu__link:focus-visible {
  color: var(--cs-main-strong);
  text-decoration: underline;
}

.cs-megamenu__link[aria-current="page"] {
  color: var(--cs-main-strong);
  font-weight: 600;
}

/* --- Zone de mise en avant -------------------------------------------------
 * Bloc de 300x400 fourni par les données du menu (cf. le contrat dans l'en-tête
 * du template). Avec un contenu lié, toute la zone est un lien unique : les
 * textes et le bouton sont des `span`, ce qui évite d'imbriquer des liens. Sans
 * contenu lié, la zone est un `div`, sans bouton : ces règles valent pour les deux.
 */
.cs-megamenu__feature {
  position: relative;
  display: block;
  flex: 0 0 300px;
  width: 300px;
  height: 400px;
  overflow: hidden;
  text-decoration: none;
}

.cs-megamenu__feature-image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Dégradé du bas vers le haut : il garantit la lisibilité des textes blancs,
 * y compris sur une photo claire. Purement décoratif, donc hors du flux. */
.cs-megamenu__feature::after {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgb(0 0 0 / 50%), rgb(0 0 0 / 0%));
  content: "";
  pointer-events: none;
}

.cs-megamenu__feature-content {
  position: absolute;
  z-index: 1;
  inset-inline: 0;
  inset-block-end: 1.5rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.25rem;
  padding-inline: 1rem;
  text-align: center;
}

.cs-megamenu__feature-title {
  color: var(--cs-pure-white);
  font-weight: 700;
  font-size: 1.5rem;
  line-height: 1.1;
  text-transform: uppercase;
}

.cs-megamenu__feature-subtitle {
  color: var(--cs-pure-white);
  font-size: 1rem;
  text-transform: uppercase;
}

/* Même traitement que .cs-hpc__btn du composeur d'accueil, pour que les appels
 * à l'action de la boutique restent cohérents entre l'accueil et le menu. */
.cs-megamenu__feature-button {
  margin-block-start: 0.75rem;
  padding: 0.6rem 1.4rem;
  background: var(--cs-secondary-strong);
  color: var(--cs-pure-white);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  white-space: nowrap;
  border-radius: 2px;
  opacity: 0.88;
  transition: background-color 0.15s ease;
}

.cs-megamenu__feature:hover .cs-megamenu__feature-button,
.cs-megamenu__feature:focus-visible .cs-megamenu__feature-button {
  background: var(--cs-main-strong);
}

@media (prefers-reduced-motion: reduce) {
  .cs-megamenu__feature-button {
    transition: none;
  }
}
/* ------------------------------------------------------------------------- *
 * 7. Plan du site
 *
 * Les catégories de niveau 0 sont les catégories choisies dans le module
 * chaussmartsitemap. Elles forment des titres compacts (20 px, graisse 600) en
 * capitales, séparés du contenu par un filet gris. Les groupes, listes et liens descendants
 * réutilisent directement les composants `.cs-megamenu__*` définis juste
 * au-dessus, sans carte ni aplat supplémentaire.
 * ------------------------------------------------------------------------- */

.cs-sitemap {
  display: grid;
  gap: clamp(1.5rem, 2.5vw, 2.25rem);
}

.cs-sitemap__section {
  min-width: 0;
}

.cs-sitemap__title {
  margin: 0 0 1.25rem;
  padding-block-end: 0.5rem;
  border-block-end: 1px solid var(--cs-border);
  font-size: 1.25rem;
  font-weight: 600;
  line-height: 1.2;
}

.cs-sitemap__root-link {
  display: block;
  color: var(--cs-text-accent);
  font-weight: inherit;
  text-transform: uppercase;
  text-decoration: none;
}

.cs-sitemap__root-link:hover,
.cs-sitemap__root-link:focus-visible {
  color: var(--cs-main-strong);
  text-decoration: none;
}

.cs-sitemap__root-link:focus-visible,
.cs-sitemap .cs-megamenu__group-title:focus-visible,
.cs-sitemap .cs-megamenu__link:focus-visible {
  outline: 3px solid var(--cs-main-strong);
  outline-offset: 3px;
}

.cs-sitemap__groups {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.5rem 2rem;
  align-items: start;
  padding-block: 0;
}

.cs-sitemap__group {
  min-width: 0;
}

.cs-sitemap__group-heading {
  margin: 0;
  font-size: inherit;
}

/* Dans le mega menu, la pastille sort volontairement du flux. Sur le plan du
 * site, elle reste dans la colonne : son bord gauche marque l'axe, tandis que
 * le titre et ses liens partagent le même retrait. */
.cs-sitemap .cs-megamenu__group-title {
  padding-inline-start: 0.85rem;
}

.cs-sitemap .cs-megamenu__group-title::before {
  inset-inline-start: 0;
}

.cs-sitemap .cs-megamenu__list {
  padding-inline-start: 0.85rem;
}

.cs-sitemap__section--link-only .cs-sitemap__title {
  margin-block-end: 0;
}

@media (min-width: 576px) {
  .cs-sitemap__groups {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (min-width: 768px) {
  .cs-sitemap__groups {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

@media (min-width: 992px) {
  .cs-sitemap__groups {
    grid-template-columns: repeat(6, minmax(0, 1fr));
  }
}

/* ------------------------------------------------------------------------- *
 * Home — rythme vertical
 * ------------------------------------------------------------------------- *
 * Une seule respiration (--cs-home-gap, 40 px, #141), à toutes les largeurs :
 * entre deux sections de la home, et entre la dernière section et le bloc
 * newsletter. Deux exceptions à 20 px (--cs-home-gap-tight) : sous le header et
 * sous le composeur. Elle est portée par la grille du thème
 * (.page-content--home, gap de 2.5rem dans Hummingbird) et par le bas de la
 * colonne centrale ; les sections (modules maison chaussmarthome*, composeur)
 * n'ont ni marge ni padding vertical propre. Le padding haut du bloc
 * newsletter, utile sur les autres pages, est retiré sur la home pour ne pas
 * doubler l'écart.
 *
 * Couples sur-titre .cs-overline + titre : écart sur-titre → titre, taille et
 * couleur du titre, écart entre l'en-tête et le contenu qu'il annonce, communs,
 * à régler ici seulement (typographie du titre : « Titre et texte de bloc »,
 * section 1). Les utilisent les raccourcis, les produits mis en avant, les
 * largeurs, les zones promotionnelles, l'Introduction (chaussmarthome) et, pour
 * l'écart sur-titre → titre, le bloc newsletter. Écart entre les cartes d'une
 * section : --cs-home-grid-gap. */
:root {
  --cs-home-gap: 2.5rem;
  /* Exceptions : sous le header et sous le composeur, écart resserré. */
  --cs-home-gap-tight: 1.25rem;
  --cs-home-overline-gap: 0.375rem;
  --cs-home-title-size: 1.75rem;
  --cs-home-header-gap: 1.25rem;
  --cs-home-grid-gap: 0.75rem;
}

@media (min-width: 992px) {
  :root {
    --cs-home-title-size: 2.5rem;
    --cs-home-grid-gap: 18px;
  }
}

/* En-têtes des sections : marges et titre communs. Les zones promo (colonne
 * flex à gap) et l'Introduction règlent leurs marges à part. */
.cs-home-width__header,
.cs-home-shortcuts__header,
.cs-home-featured__header {
  margin-bottom: var(--cs-home-header-gap);
}

.cs-home-width__overline,
.cs-home-shortcuts__overline,
.cs-home-featured__overline,
.cs-home-intro__overline {
  margin: 0 0 var(--cs-home-overline-gap);
}

.cs-home-width__title,
.cs-home-shortcuts__title,
.cs-home-featured__title {
  margin: 0;
}

.cs-home-width__title,
.cs-home-shortcuts__title,
.cs-home-featured__title,
.cs-home-promo__title,
.cs-home-intro__title {
  font-size: var(--cs-home-title-size);
  color: var(--cs-text-dark);
}

.page-content--home {
  row-gap: var(--cs-home-gap);
  margin-top: var(--cs-home-gap-tight);
}

/* Sous le composeur : la marge négative raccourcit sa rangée de la grille, le
 * row-gap restant commun aux autres sections. */
.page-content--home > .cs-hpc {
  margin-bottom: calc(var(--cs-home-gap-tight) - var(--cs-home-gap));
}

body#index #center-column {
  padding-bottom: var(--cs-home-gap);
}

/* Gabarit horizontal commun, celui du composeur et de l'Introduction : 1300 px
 * au plus, gouttières de 10 px, à toutes les largeurs. Le .container Bootstrap
 * des autres sections plafonnait par paliers (960 px vers 1100 px de large),
 * d'où des marges latérales plus grandes que celles du composeur. Le bloc
 * newsletter suit ce gabarit sur la home seulement : ailleurs, il reste aligné
 * sur le .container Bootstrap du contenu de la page. */
.cs-home-shortcuts > .container,
.cs-home-featured > .container,
.cs-home-promo > .container,
.cs-home-width > .container,
.cs-home-phone > .container,
body#index .cs-newsletter > .container {
  max-width: 1300px;
  padding-inline: 10px;
}

body#index .cs-newsletter {
  padding-top: 0;
}

/* ------------------------------------------------------------------------- *
 * Home — « Ne vous trompez plus de largeur » (chaussmarthomewidth, #128)
 * ------------------------------------------------------------------------- *
 * Cinq cartes G à M, chacune un seul lien vers sa catégorie (une carte sans
 * catégorie est un <div> --static : ni lien ni pulse). Empilées sous 992px,
 * grille de 5 colonnes égales au-delà, cartes étirées à la hauteur de la plus
 * haute (stretch de la grille + colonne flex) : le texte prend la place
 * restante, donc « LARGEUR » et la pastille tombent sur la même ligne d'une
 * carte à l'autre. Le titre réserve 2 lignes.
 *
 * Pulse : au survol, au focus clavier et au toucher (:active), la pastille
 * émet un anneau qui s'élargit en s'estompant (box-shadow animé). Coupé avec
 * prefers-reduced-motion.
 *
 * Carte partagée avec les raccourcis (section suivante) : fond tertiaire,
 * bordure, rayon 20 / 22 px, focus en couleur principale. En-tête : « Home —
 * rythme vertical ». */
.cs-home-width__card,
.cs-home-shortcuts__card {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--cs-border);
  border-radius: 20px;
  text-align: center;
  text-decoration: none;
  background: var(--bs-tertiary-bg);
}

a.cs-home-width__card:focus-visible,
.cs-home-shortcuts__card:focus-visible {
  outline: 2px solid var(--cs-main-strong);
}

.cs-home-width__grid,
.cs-home-shortcuts__list,
.cs-home-promo__grid {
  gap: var(--cs-home-grid-gap);
}

@media (min-width: 992px) {
  .cs-home-width__card,
  .cs-home-shortcuts__card {
    border-radius: 22px;
  }
}

.cs-home-width__grid {
  display: flex;
  flex-direction: column;
}

.cs-home-width__card {
  align-items: center;
  padding: 1.5rem 1.25rem;
  color: var(--cs-text-accent);
}

a.cs-home-width__card:hover,
a.cs-home-width__card:focus-visible {
  color: var(--cs-text-accent);
  text-decoration: none;
}

a.cs-home-width__card:focus-visible {
  outline-offset: 3px;
}

.cs-home-width__card-title {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 0.625rem;
  font-size: 1.25rem;
  line-height: 1.2;
  text-transform: uppercase;
  color: var(--cs-secondary-strong);
  transition: color 0.2s ease;
}

/* Carte cliquable survolée ou au focus : le titre passe en couleur principale. */
a.cs-home-width__card:hover .cs-home-width__card-title,
a.cs-home-width__card:focus-visible .cs-home-width__card-title {
  color: var(--cs-main-strong);
}

.cs-home-width__card-text {
  flex-grow: 1;
  margin-bottom: 1rem;
  font-size: 0.875rem;
  line-height: 1.45;
}

.cs-home-width__card-foot {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.5rem;
}

.cs-home-width__label {
  font-size: 0.875rem;
  font-weight: 700;
  line-height: 1;
  text-transform: uppercase;
  color: var(--cs-text-info);
}

.cs-home-width__letter {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  font-size: 1.75rem;
  line-height: 1;
  color: var(--cs-pure-white);
  background: var(--cs-secondary-strong);
}

/* Anneau de 26px, rapide au départ puis ralenti (ease-out marqué) ; il
 * s'éteint à 75 % du cycle, laissant une courte pause avant le suivant. */
@keyframes cs-home-width-pulse {
  0% {
    box-shadow: 0 0 0 0 color-mix(in srgb, var(--cs-secondary-strong) 60%, transparent);
  }

  75%,
  100% {
    box-shadow: 0 0 0 26px color-mix(in srgb, var(--cs-secondary-strong) 0%, transparent);
  }
}

a.cs-home-width__card:hover .cs-home-width__letter,
a.cs-home-width__card:focus-visible .cs-home-width__letter,
a.cs-home-width__card:active .cs-home-width__letter {
  animation: cs-home-width-pulse 1.8s cubic-bezier(0.16, 1, 0.3, 1) infinite;
}

@media (prefers-reduced-motion: reduce) {
  a.cs-home-width__card:hover .cs-home-width__letter,
  a.cs-home-width__card:focus-visible .cs-home-width__letter,
  a.cs-home-width__card:active .cs-home-width__letter {
    animation: none;
  }
}

@media (min-width: 992px) {
  .cs-home-width__grid {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    align-items: stretch;
  }

  .cs-home-width__card {
    padding: 1.75rem 1.5rem;
  }

  .cs-home-width__card-title {
    min-height: 2.4em;
    margin-bottom: 0.75rem;
  }

  .cs-home-width__card-text {
    margin-bottom: 1.25rem;
    line-height: 1.4;
  }
}

/* ------------------------------------------------------------------------- *
 * Home — Raccourcis vers des catégories (chaussmarthomeshortcuts, #108)
 * ------------------------------------------------------------------------- *
 * Cartes au code des pages CMS (fond tertiaire, bordure, rayon 22px), chacune
 * un seul lien vers sa catégorie ; miniature en option. Grille sans défilement
 * horizontal : 2 colonnes en mobile, 3 dès 576px, 5 dès 992px, les raccourcis
 * suivants passant à la ligne ; cartes d'une rangée à la même hauteur. Carte
 * partagée avec les largeurs (section précédente) ; en-tête : « Home — rythme
 * vertical ». */
.cs-home-shortcuts__list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  margin: 0;
  padding: 0;
  list-style: none;
}

.cs-home-shortcuts__card {
  height: 100%;
  overflow: hidden;
  color: var(--cs-text-dark);
  transition: background-color 0.25s ease, border-color 0.25s ease;
}

/* Survol et focus : toute la carte passe au lilas (teinte de la couleur principale). */
.cs-home-shortcuts__card:hover,
.cs-home-shortcuts__card:focus-visible {
  border-color: var(--cs-main-tint);
  color: var(--cs-text-dark);
  text-decoration: none;
  background: var(--cs-main-tint);
}

.cs-home-shortcuts__card:focus-visible {
  outline-offset: -2px;
}

.cs-home-shortcuts__media {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 132px;
}

/* Fond blanc des miniatures fondu dans celui de la carte. */
.cs-home-shortcuts__img {
  width: 118px;
  height: 118px;
  object-fit: contain;
  mix-blend-mode: multiply;
  transition: transform 0.4s ease;
}

.cs-home-shortcuts__card:hover .cs-home-shortcuts__img {
  transform: scale(1.04);
}

.cs-home-shortcuts__body {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
  justify-content: center;
  padding: 1rem 0.625rem;
}

/* Avec miniature, le texte suit l'image sans marge haute supplémentaire. */
.cs-home-shortcuts__media + .cs-home-shortcuts__body {
  padding-top: 0;
}

.cs-home-shortcuts__name {
  font-size: 1.1875rem;
  line-height: 1.2;
  letter-spacing: -0.02em;
}

.cs-home-shortcuts__subtitle {
  margin-top: 0.25rem;
  font-size: 0.875rem;
  line-height: 1.35;
  color: var(--cs-text-info);
}

@media (prefers-reduced-motion: reduce) {
  .cs-home-shortcuts__card,
  .cs-home-shortcuts__img {
    transition: none;
  }

  .cs-home-shortcuts__card:hover .cs-home-shortcuts__img {
    transform: none;
  }
}

@media (min-width: 576px) {
  .cs-home-shortcuts__list {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

@media (min-width: 992px) {
  .cs-home-shortcuts__list {
    grid-template-columns: repeat(5, minmax(0, 1fr));
  }

  .cs-home-shortcuts__media {
    height: 196px;
  }

  .cs-home-shortcuts__img {
    width: 176px;
    height: 176px;
  }

  .cs-home-shortcuts__body {
    padding: 1.5rem 1.25rem;
  }

  .cs-home-shortcuts__name {
    font-size: 1.5rem;
  }

  .cs-home-shortcuts__subtitle {
    font-size: 0.9375rem;
  }
}

/* ------------------------------------------------------------------------- *
 * Home — Mise en avant de produits (chaussmarthomefeatured, #109)
 * ------------------------------------------------------------------------- *
 * En-tête commun aux sections (« Home — rythme vertical »). Les produits
 * gardent la miniature et la grille du thème (.products) au-delà de 768px ; en
 * dessous, une seule ligne qui défile latéralement (scroll-snap), cartes de
 * 72 % pour laisser deviner la suivante. */
@media (max-width: 767.98px) {
  .cs-home-featured .products {
    display: flex;
    gap: 1rem;
    padding-bottom: 0.5rem;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    overscroll-behavior-x: contain;
  }

  .cs-home-featured .products > .product-miniature {
    flex: 0 0 72%;
    scroll-snap-align: start;
  }
}

/* ------------------------------------------------------------------------- *
 * Home — Deux zones promotionnelles (chaussmarthomepromo, #111)
 * ------------------------------------------------------------------------- *
 * Chaque zone : image de fond par boutique (--cs-home-promo-bg, posée par le
 * template) sous le voile du bloc sombre partagé avec la newsletter (voile,
 * texte blanc, survol du bouton, focus : voir « Bloc d'inscription à la
 * newsletter ») ; sans image, le voile seul fait un aplat. Sur-titre et bouton
 * en --cs-secondary-strong, code promo au style du bandeau top header
 * (pointillés, gras, espacé). Empilées sous 992px, côte à côte au-delà ; une
 * zone seule prend la largeur. Titre et texte : styles partagés (section 1). */
.cs-home-promo__grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
}

.cs-home-promo__zone {
  --cs-dark-panel-bg: var(--cs-home-promo-bg);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: 0.875rem;
  min-height: 20rem;
  padding: 2rem 1.5rem;
}

/* Sur-titre : style partagé .cs-overline (section 1) ; rose plutôt que la couleur
 * principale, peu lisible sur le voile, comme le sur-titre de la newsletter.
 * Les éléments de la zone sont espacés par le gap de la colonne (0.875rem) : les
 * marges ramènent l'écart sur-titre → titre et en-tête → contenu aux valeurs
 * communes de la home (--cs-home-*, « Home — rythme vertical »). */
.cs-home-promo__overline {
  margin: 0 0 calc(var(--cs-home-overline-gap) - 0.875rem);
  color: var(--cs-secondary-strong);
}

.cs-home-promo__title {
  margin: 0 0 calc(var(--cs-home-header-gap) - 0.875rem);
  color: inherit;
}

.cs-home-promo__text {
  max-width: 34rem;
}

.cs-home-promo__code {
  margin: 0;
  font-size: 0.9375rem;
}

.cs-home-promo__code-value {
  margin-left: 0.375rem;
  padding: 0.125rem 0.5rem;
  border: 1px dashed color-mix(in srgb, currentColor 60%, transparent);
  border-radius: 3px;
  font-weight: 700;
  letter-spacing: 0.08em;
}

.cs-home-promo .btn.cs-home-promo__button {
  margin-top: 0.375rem;
  padding: 0.75rem 1.75rem;
}

@media (min-width: 992px) {
  .cs-home-promo__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .cs-home-promo__grid--single {
    grid-template-columns: minmax(0, 1fr);
  }

  .cs-home-promo__zone {
    min-height: 26rem;
    padding: 3rem;
  }
}
