/* ================================================================
   PAGE CATÉGORIE PROMOTIONS — styles dédiés
   Scope principal  : .category-promotions-page
   Scope sidebar    : .page-cat-promotions .layered_block (classe
                      ajoutée sur <html> par category-promotions.js)
   ================================================================ */

/* ----------------------------------------------------------------
   VARIABLES LOCALES (couleurs design Promotions)
   ---------------------------------------------------------------- */
.category-promotions-page {
  --promo-navy:       #211F60;
  --promo-navy-dark:  #0E1838;
  --promo-gold:       #D1C974;
  --promo-gold-bg:    #FBF1D8;
  --promo-red:        #DE2F27;
  --promo-green:      #1F8A5B;
  --promo-bg:         #FBFAF6;
  --promo-border:     rgba(33, 31, 96, 0.09);
  --promo-text-muted: rgba(33, 31, 96, 0.55);
  --promo-radius:     16px;
  --promo-radius-sm:  10px;
}

/* ================================================================
   OVERRIDE LAYOUT PS1.6
   Le template injecte hide_left_column=true pour obtenir la classe
   body.hide-left-column ; on masque l'aside PS et on force le
   center_column à pleine largeur — la sidebar est réinjectée
   manuellement dans .promo-content-grid
   ================================================================ */
.hide-left-column #left_column,
.page-cat-promotions #left_column {
  display: none !important;
}

.hide-left-column #center_column,
.page-cat-promotions #center_column {
  grid-column: 1 / -1 !important;
  width: 100% !important;
  max-width: 100% !important;
}

/* Full-width SERVER-IMMÉDIAT : le <body> reçoit la classe `category` (page_name)
   dès le rendu, alors que `hide-left-column` (body) et `.page-cat-promotions`
   (<html>, ajoutée par JS) n'arrivent que plus tard. Sans ça, au 1er rendu ET
   au retour via BFCache, #center_column n'est pas pleine largeur → bande blanche
   à droite jusqu'à ce que le JS s'exécute. Cette feuille n'est chargée que sur
   les pages catégorie, donc le scope body.category est sûr. */
body.category #left_column { display: none !important; }
body.category #center_column {
  grid-column: 1 / -1 !important;
  width: 100% !important;
  max-width: 100% !important;
}

/* ================================================================
   GRILLE CONTENU : SIDEBAR (filtres) + PRODUITS
   ================================================================ */
.promo-content-grid {
  display: grid;
  grid-template-columns: 264px 1fr;
  gap: 48px;
  align-items: start;
}

.promo-sidebar {
  position: sticky;
  top: 5.5rem;
  max-height: calc(100vh - 5.5rem);
  overflow-y: auto;
  overscroll-behavior: contain;
  min-width: 0;
  width: 100%;
  box-sizing: border-box;
  scrollbar-width: thin;
  scrollbar-color: rgba(33, 31, 96, 0.22) transparent;
}
.promo-sidebar::-webkit-scrollbar {
  width: 4px;
}
.promo-sidebar::-webkit-scrollbar-track {
  background: transparent;
}
.promo-sidebar::-webkit-scrollbar-thumb {
  background: rgba(33, 31, 96, 0.22);
  border-radius: 4px;
  transition: background 0.2s ease;
}
.promo-sidebar::-webkit-scrollbar-thumb:hover {
  background: rgba(33, 31, 96, 0.48);
}

.page-cat-promotions .layered_block {
  max-width: 100%;
  box-sizing: border-box;
}

.page-cat-promotions .layered_block img {
  max-width: 100%;
  height: auto;
}

.promo-content-main {
  min-width: 0; /* évite le débordement dans le grid */
}

/* Panneau filtre fullscreen mobile — éléments cachés sur desktop */
.promo-filter-panel-header,
.promo-filter-panel-footer {
  display: none;
}

@media (max-width: 860px) {
  .promo-content-grid {
    grid-template-columns: 1fr;
    gap: 0;
  }
  .promo-sidebar {
    position: static;
  }
  .promo-sidebar:not([data-promo-open="true"]) {
    display: none;
  }

  /* Panneau filtre fullscreen */
  .promo-sidebar[data-promo-open="true"] {
    display: flex !important;
    flex-direction: column;
    position: fixed;
    inset: 0;
    z-index: 99999; /* au-dessus du header site et de toute nav fixée */
    background: #fff;
    overflow: hidden;
    border-radius: 0;
    padding: 0;
    box-shadow: none;
    margin: 0;
    max-height: none;
  }

  /* Titre natif blocklayered (.title_block) + btn dismiss offcanvas = masqués */
  .promo-sidebar[data-promo-open="true"] .title_block,
  .promo-sidebar[data-promo-open="true"] #offcanvasDismiss {
    display: none !important;
  }

  /* Corps scrollable — #offcanvasFilter est l'enfant direct du flex container */
  .promo-sidebar[data-promo-open="true"] #offcanvasFilter {
    flex: 1;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    min-height: 0; /* indispensable pour que flex:1 fonctionne sur un enfant avec overflow */
  }

  .promo-sidebar[data-promo-open="true"] .layered_block {
    padding: 8px 20px 16px;
  }

  /* Poignée de glissement (injectée par JS) — signale le swipe-to-close */
  .promo-filter-panel-grabber {
    display: block;
    width: 40px;
    height: 4px;
    margin: 8px auto 0;
    border-radius: 4px;
    background: rgba(33, 31, 96, 0.18);
    flex-shrink: 0;
    touch-action: none;
  }

  /* Header du panneau (injecté par JS) */
  .promo-filter-panel-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 12px 16px 14px 20px;
    border-bottom: 1px solid rgba(33, 31, 96, 0.09);
    flex-shrink: 0;
    touch-action: none;
  }

  .promo-filter-panel-title {
    font-size: 1rem;
    font-weight: 700;
    letter-spacing: -0.01em;
    color: #211F60;
  }

  .promo-filter-panel-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    flex-shrink: 0;
    background: rgba(33, 31, 96, 0.06);
    border: none;
    border-radius: 50%;
    font-size: 1.5rem;
    line-height: 1;
    color: #211F60;
    cursor: pointer;
    -webkit-appearance: none;
    appearance: none;
    transition: background 0.15s;
  }
  .promo-filter-panel-close:active { background: rgba(33, 31, 96, 0.14); }

  /* Footer du panneau (injecté par JS) */
  .promo-filter-panel-footer {
    display: flex;
    gap: 12px;
    padding: 14px 20px calc(14px + env(safe-area-inset-bottom, 0px));
    border-top: 1px solid rgba(33, 31, 96, 0.09);
    flex-shrink: 0;
    background: #fff;
  }

  .promo-filter-panel-reset {
    flex: 1;
    padding: 13px 8px;
    background: #fff;
    border: 1.5px solid rgba(33, 31, 96, 0.18);
    border-radius: 10px;
    font-size: 0.875rem;
    font-weight: 600;
    color: #211F60;
    cursor: pointer;
    -webkit-appearance: none;
    appearance: none;
  }

  .promo-filter-panel-apply {
    flex: 2;
    padding: 13px 8px;
    background: #211F60;
    color: #fff;
    border: none;
    border-radius: 10px;
    font-size: 0.875rem;
    font-weight: 700;
    cursor: pointer;
    -webkit-appearance: none;
    appearance: none;
  }
}

/* Quand le panneau filtres est ouvert :
   - masque la bottom bar
   - repousse le header du site et la nav derrière le panneau
   - déduplique les boutons reset (seul le footer compte) */
body.mobile-filters-open .promo-bottombar {
  display: none !important;
}

body.mobile-filters-open #header,
body.mobile-filters-open .pa-sticky-row,
body.mobile-filters-open #columns #top_menu,
body.mobile-filters-open nav.category-nav {
  z-index: 0 !important;
}

body.mobile-filters-open .promo-sidebar #cancel-filters,
body.mobile-filters-open .promo-sidebar .promo-filter-reset-btn {
  display: none !important;
}

/* ================================================================
   EN-TÊTE PAGE PROMOTIONS (flex : titre gauche, tri droite)
   ================================================================ */
.promo-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 24px;
  flex-wrap: wrap;
  margin-bottom: 24px;
}

.promo-header-left {
  max-width: 640px;
}

.promo-header-label {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 12px;
}

.promo-header-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--promo-red);
  display: inline-block;
  flex-shrink: 0;
}

.promo-header-eyebrow {
  font-size: 0.78rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--promo-red);
}

.promo-header-title {
  /* min 2.75rem (44px) — sur mobile 5vw < 44px donc le min gouverne toujours */
  font-size: clamp(2.75rem, 5vw, 3.875rem);
  font-weight: 500;
  line-height: 1.02;
  letter-spacing: -0.015em;
  color: #211F60;
  margin: 0 0 1rem;
}

.promo-header-divider {
  width: 64px;
  height: 3px;
  background: var(--promo-gold);
  border-radius: 2px;
  margin: 16px 0;
}

.promo-header-desc {
  font-size: 0.8125rem;
  line-height: 1.55;
  color: rgba(33, 31, 96, 0.62);
  max-width: 540px;
  margin: 0;
}

.promo-header-right {
  display: flex;
  align-items: center;
  gap: 18px;
  padding-bottom: 6px;
  flex-shrink: 0;
}

/* ================================================================
   BARRE DE TRI (désormais dans promo-header-right)
   ================================================================ */
.promo-sort-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  padding: 14px 0;
  border-top: 1px solid var(--promo-border);
  border-bottom: 1px solid var(--promo-border);
  margin-bottom: 20px;
}

.promo-sort-count {
  font-size: 14px;
  font-weight: 600;
  color: var(--promo-navy);
  white-space: nowrap;
}

.promo-sort-select-wrapper {
  display: flex;
  align-items: center;
  gap: 12px;
}

/* Restyle du partial sort-pagination — le select existant *
 * uniquement dans le contexte promotions                   */
.category-promotions-page .promo-sort-select-wrapper .selectProductSort,
.category-promotions-page .promo-sort-select-wrapper select {
  appearance: none;
  -webkit-appearance: none;
  border: 1.5px solid rgba(33, 31, 96, 0.16);
  background: #fff;
  border-radius: 12px;
  padding: 13px 44px 13px 16px;
  font-size: 14px;
  font-weight: 600;
  color: var(--promo-navy);
  cursor: pointer;
  min-width: 210px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='11' height='7' viewBox='0 0 11 7'%3E%3Cpath d='M1 1l4.5 4.5L10 1' stroke='%23211F60' stroke-width='1.8' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  transition: border-color 0.2s;
}

.category-promotions-page .promo-sort-select-wrapper .selectProductSort:hover,
.category-promotions-page .promo-sort-select-wrapper select:hover {
  border-color: var(--promo-navy);
}

/* Masquer les éléments de pagination de la barre haute dans la promo-sort-bar */
.promo-sort-select-wrapper .pagination,
.promo-sort-select-wrapper .showing {
  display: none;
}

/* Le <select> de tri est transformé en dropdown Choices.js qui s'ouvre vers
   le bas, par-dessus la bande de réassurance qui suit dans le DOM. Le z-index
   par défaut de Choices (1) ne suffit pas : on remonte le conteneur ouvert
   dans son propre contexte d'empilement pour qu'il passe au-dessus. */
.category-promotions-page .promo-sort-select-wrapper .choices { position: relative; }
.category-promotions-page .promo-sort-select-wrapper .choices.is-open { z-index: 60; }
.category-promotions-page .promo-sort-select-wrapper .choices__list--dropdown,
.category-promotions-page .promo-sort-select-wrapper .choices__list[aria-expanded] { z-index: 60; }

/* .promo-header, .promo-reassurance et .promo-content-grid reçoivent tous
   l'animation promo-fade-in (transform + fill-mode both) → chacun crée son
   propre contexte d'empilement. Le z-index 60 du dropdown est alors confiné
   dans .promo-header et reste sous .promo-reassurance (frère suivant, z auto).
   On élève .promo-header au-dessus de ses frères pour que le dropdown ouvert
   passe par-dessus toute la suite du contenu. */
.category-promotions-page .promo-header { position: relative; z-index: 50; }
.category-promotions-page .promo-reassurance,
.category-promotions-page .promo-content-grid { position: relative; z-index: 1; }

/* ================================================================
   BANDE DE RÉASSURANCE
   ================================================================ */
.promo-reassurance {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px 30px;
  padding: 16px 2px;
  border-top: 1px solid rgba(33, 31, 96, 0.08);
  border-bottom: 1px solid rgba(33, 31, 96, 0.08);
  margin-bottom: 28px;
}

.promo-reassurance-item {
  display: flex;
  align-items: center;
  gap: 9px;
  font-size: 13.5px;
  font-weight: 500;
  color: var(--promo-navy);
}

.promo-reassurance-check {
  color: var(--promo-green);
  display: flex;
  flex-shrink: 0;
}

/* ================================================================
   SIDEBAR FILTRES — ACCORDÉON
   ================================================================ */

/* Titre de groupe : cliquable, flex avec chevron à droite */
.page-cat-promotions .layered_block .layered_subtitle_heading {
  cursor: pointer;
  user-select: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* padding-right pour laisser respirer la flèche ::after dont le coin
     pivoté (rotate 45deg) déborde légèrement la bounding box du carré */
  padding: 11px 4px 11px 0;
  margin-bottom: 0;
}

/* Chevron (carré tourné) */
.page-cat-promotions .layered_block .layered_subtitle_heading::after {
  content: '';
  display: inline-block;
  width: 7px;
  height: 7px;
  border-right: 1.5px solid var(--promo-navy);
  border-bottom: 1.5px solid var(--promo-navy);
  transform: rotate(45deg);
  transition: transform 0.2s ease;
  flex-shrink: 0;
  margin-left: 8px;
  opacity: 0.45;
}

.page-cat-promotions .layered_block .layered_subtitle_heading.promo-accord-closed::after {
  transform: rotate(-45deg);
}

/* Contenu animé (max-height trick) */
.page-cat-promotions .layered_block .layered_filter_group {
  overflow: hidden;
  max-height: 900px;
  padding-top: 14px;
  padding-bottom: 18px;
  transition: max-height 0.28s ease, opacity 0.22s ease, padding 0.22s ease;
  opacity: 1;
}

.page-cat-promotions .layered_block .layered_filter_group.promo-accord-closed {
  max-height: 0 !important;
  opacity: 0;
  padding-top: 0;
  padding-bottom: 0;
}

/* Pas de séparateur entre groupes */
.page-cat-promotions .layered_block .layered_filter {
  border: none;
}

/* Moins d'espace entre titre et premier élément */
.page-cat-promotions .layered_block .layered_filter_group {
  padding-top: 8px;
  padding-bottom: 14px;
}

/* Liste sans puce ni bordure */
.page-cat-promotions .layered_block .layered_filter_ul {
  list-style: none !important;
  padding: 0 !important;
  margin: 0 !important;
  display: flex;
  flex-direction: column;
  gap: 7px;
}

.page-cat-promotions .layered_block .layered_filter_ul li {
  border: none !important;
  padding: 0 !important;
  margin: 0 !important;
}



/* ================================================================
   FILTRES ACTIFS (chips en ligne entre réassurance et content-grid)
   ================================================================ */
#promo-active-filters {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 24px;
}

#promo-active-filters:empty {
  display: none;
}

/* #enabled_filters : neutraliser la boîte blocklayered */
#promo-active-filters #enabled_filters {
  display: contents; /* les enfants participent directement au flex parent */
  margin: 0 !important;
  padding: 0 !important;
  border: none !important;
}

/* Label "Filtres actifs" */
#promo-active-filters .layered_subtitle {
  display: inline !important;
  float: none !important;
  font-size: 13px;
  font-weight: 600;
  color: var(--promo-text-muted);
  white-space: nowrap;
}

/* Liste → flex wrap */
#promo-active-filters #enabled_filters ul {
  display: inline-flex !important;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  list-style: none !important;
  margin: 0 !important;
  padding: 0 !important;
}

/* Chaque filtre actif → pill */
#promo-active-filters #enabled_filters ul li {
  display: inline-flex !important;
  align-items: center;
  gap: 8px;
  background: #fff;
  border: 1.5px solid rgba(33, 31, 96, 0.16);
  border-radius: 999px;
  padding: 7px 12px 7px 14px;
  font-size: 13px;
  font-weight: 600;
  color: var(--promo-navy);
  transition: border-color 0.15s;
  justify-content: flex-start !important;
}

#promo-active-filters #enabled_filters ul li:hover {
  border-color: var(--promo-navy);
}

/* Bouton annuler filtre (×) dans la pill */
#promo-active-filters .cancel-filter {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  background: none !important;
  border: none !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  padding: 0 !important;
  margin: 0 !important;
  font-size: 12px;
  line-height: 1;
  color: rgba(33, 31, 96, 0.5) !important;
  order: 1; /* après le texte du filtre */
}

#promo-active-filters .cancel-filter iconify-icon {
  display: none; /* remplacé par le × textuel en JS */
}

/* Bouton "Tout effacer" */
#promo-active-filters #cancel-filters {
  background: none !important;
  border: none !important;
  box-shadow: none !important;
  padding: 0 !important;
  margin: 0 !important;
  display: inline !important;
  font-size: 13px;
  font-weight: 600;
  color: var(--promo-red) !important;
  text-decoration: underline;
  text-underline-offset: 3px;
  cursor: pointer;
}

#promo-active-filters #cancel-filters iconify-icon {
  display: none;
}

/* ================================================================
   GRILLE PRODUITS
   ================================================================ */
.promo-products-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  margin-bottom: 32px;
}

@media (max-width: 1200px) {
  .promo-products-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 576px) {
  .promo-products-grid {
    grid-template-columns: 1fr;
  }
}

/* Après AJAX, blocklayered retourne <ul class="grid"> avec <li class="g-col-6 g-col-md-4">.
   g-col-6 = span 6 colonnes Bootstrap → dans notre grille à 3 cols ça déborde (1/ligne).
   On neutralise le span Bootstrap et on laisse notre grid-template-columns faire le travail. */
.promo-products-grid .ajax_block_product {
  grid-column: span 1 !important;
}


/* ================================================================
   CARTE PRODUIT — styles également dans global.css (site-wide).
   Ces règles s'appliquent en dernier sur la page promo (même effet).
   ================================================================ */
.promo-product-card {
  display: flex;
  flex-direction: column;
  background: #fff;
  border: 1px solid var(--promo-border);
  border-radius: var(--promo-radius);
  overflow: hidden;
  transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
  position: relative;
}

.promo-product-card:hover {
  transform: translateY(-5px);
  box-shadow: 0 22px 44px -24px rgba(33, 31, 96, 0.42);
  border-color: rgba(33, 31, 96, 0.18);
}

/* -- Carte entièrement cliquable (stretched link) --
   Le lien titre (produit) ou le CTA (article/lien) couvre toute la carte.
   Les éléments interactifs restants (bouton action, pastilles coloris) sont
   remontés au-dessus de l'overlay pour rester cliquables indépendamment. */
.promo-card-title-link::after,
.promo-card-cta-full::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
}
.promo-card-action {
  position: relative;
  z-index: 2;
}

/* -- Image -- */
.promo-card-image-wrap {
  position: relative;
  aspect-ratio: 4 / 3.2;
  background: linear-gradient(140deg, #F4EEE1 0%, #E7DBC4 100%);
  overflow: hidden;
}

.promo-card-image-link {
  display: block;
  width: 100%;
  height: 100%;
}

.promo-card-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.4s ease;
}

.promo-product-card:hover .promo-card-img {
  transform: scale(1.03);
}

.promo-card-img-placeholder {
  width: 100%;
  height: 100%;
  background: linear-gradient(140deg, #F4EEE1 0%, #E7DBC4 100%);
}

/* -- Badges image -- */
.promo-card-badges {
  position: absolute;
  top: 12px;
  left: 12px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  align-items: flex-start;
}

.promo-card-badge {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 5px 9px;
  border-radius: 7px;
}

.promo-card-badge--new {
  background: var(--promo-gold);
  color: var(--promo-navy);
}

.promo-card-badge--sale {
  background: var(--promo-red);
  color: #fff;
}

/* -- Badge % remise (coin haut gauche au-dessus des autres badges) -- */
.promo-card-discount-badge {
  background: var(--promo-red);
  color: #fff;
  font-size: 13px;
  font-weight: 700;
  padding: 6px 10px;
  border-radius: 8px;
  box-shadow: 0 6px 14px -6px rgba(222, 47, 39, 0.65);
  line-height: 1;
}

/* -- Badge rupture stock -- */
.promo-card-out-of-stock {
  position: absolute;
  bottom: 12px;
  right: 12px;
  background: rgba(33, 31, 96, 0.82);
  color: #fff;
  font-size: 11px;
  font-weight: 600;
  padding: 6px 10px;
  border-radius: 7px;
}

/* ================================================================
   CORPS DE LA CARTE
   ================================================================ */
.promo-card-body {
  padding: 18px 18px 6px;
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.promo-card-title-link {
  text-decoration: none;
  color: inherit;
}

.promo-card-title {
  font-size: 19px;
  font-weight: 700;
  line-height: 1.22;
  color: var(--promo-navy);
  margin: 0 0 4px;
  transition: color 0.2s;
}

.promo-card-title-link:hover .promo-card-title {
  color: var(--promo-red);
}

.promo-card-subtitle {
  font-size: 13px;
  color: var(--promo-text-muted);
  margin: 0;
  line-height: 1.45;
}

/* -- Badge "Mémoire de forme" -- */
.promo-card-memory-badge {
  position: absolute;
  bottom: 10px;
  right: 10px;
  background: var(--promo-gold, #C9A227);
  color: #211F60;
  font-size: 11px;
  font-weight: 700;
  padding: 5px 10px;
  border-radius: 7px;
  letter-spacing: .03em;
  text-transform: uppercase;
  z-index: 1;
}

.promo-card-delivery-badge {
  position: absolute;
  top: 10px;
  right: 10px;
  background: #1B6B2F;
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  padding: 5px 10px;
  border-radius: 7px;
  letter-spacing: .03em;
  text-transform: uppercase;
  z-index: 1;
}

/* -- Étiquette déclinaison sur l'image (ex: 160×200) -- */
.promo-card-combination {
  position: absolute;
  bottom: 10px;
  left: 10px;
  background: rgba(33, 31, 96, 0.88);
  color: #fff;
  font-size: 12px;
  font-weight: 700;
  padding: 5px 10px;
  border-radius: 7px;
  letter-spacing: .02em;
  backdrop-filter: blur(4px);
  z-index: 1;
}

/* ================================================================
   PIED DE CARTE : PRIX + BOUTON
   ================================================================ */
.promo-card-footer {
  padding: 14px 18px 18px;
  border-top: 1px solid var(--promo-border);
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 12px;
  margin-top: auto;
}

.promo-card-pricing {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.promo-card-old-row {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.promo-card-old-price {
  font-size: 13.5px;
  color: rgba(33, 31, 96, 0.4);
  text-decoration: line-through;
  font-weight: 600;
}

.promo-card-save-badge {
  background: rgba(222, 47, 39, 0.1);
  color: var(--promo-red);
  font-size: 11.5px;
  font-weight: 700;
  padding: 2px 7px;
  border-radius: 6px;
  white-space: nowrap;
}

.promo-card-price-row {
  display: flex;
  align-items: baseline;
  gap: 5px;
}

.promo-card-from {
  font-size: 12px;
  font-weight: 600;
  color: var(--promo-text-muted);
}

.promo-card-price {
  font-size: 28px;
  font-weight: 800;
  line-height: 1;
  color: var(--promo-navy);
  letter-spacing: -0.01em;
}

.promo-card-price--sale {
  color: var(--promo-red);
}

.promo-card-monthly {
  font-size: 12px;
  color: var(--promo-text-muted);
  font-weight: 500;
  margin-top: 3px;
}

.promo-card-monthly strong {
  font-weight: 700;
  color: var(--promo-navy);
}

/* -- Bouton action -- */
.promo-card-action {
  flex-shrink: 0;
}

.promo-card-btn {
  width: 46px;
  height: 46px;
  border-radius: 50%;
  border: 1.5px solid var(--promo-navy);
  background: #fff;
  color: var(--promo-navy);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  text-decoration: none;
  transition: background 0.2s, color 0.2s, transform 0.15s;
  padding: 0;
  line-height: 1;
}

.promo-card-btn:hover {
  background: var(--promo-navy);
  color: #fff;
  transform: scale(1.08);
}

.promo-card-btn--cart.loading {
  background: var(--promo-green);
  border-color: var(--promo-green);
  color: #fff;
  pointer-events: none;
}

/* ================================================================
   ENCART 3× SANS FRAIS (dans la grille)
   ================================================================ */
.promo-encart-3x {
  border-radius: var(--promo-radius);
  background: linear-gradient(165deg, #1F2E63, #101A3C);
  color: #fff;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  position: relative;
}

.promo-encart-3x-inner {
  flex: 1;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.promo-encart-3x-content {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 40%;
  padding: 28px 24px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.promo-encart-3x-visual {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 40%;
  overflow: hidden;
}

.promo-encart-3x-visual img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
  object-position: center top;
}

.promo-encart-3x-intro {
  font-size: 17px;
  font-weight: 500;
  color: rgba(255, 255, 255, 0.82);
  margin: 0 0 4px;
}

.promo-encart-3x-headline {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin-bottom: 22px;
}

.promo-encart-3x-number {
  font-weight: 800;
  font-size: 68px;
  line-height: 0.9;
  letter-spacing: -0.02em;
}

.promo-encart-3x-subtitle {
  font-style: italic;
  font-size: 24px;
  color: var(--promo-gold);
  font-weight: 600;
}

.promo-encart-3x-checks {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.promo-encart-3x-checks li {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 14px;
  color: rgba(255, 255, 255, 0.9);
}

.promo-encart-3x-checks svg {
  color: var(--promo-gold);
  flex-shrink: 0;
}

/* Encart mobile : image plein fond, texte par-dessus en gradient */
@media (max-width: 860px) {
  .promo-encart-3x {
    min-height: 340px;
  }

  .promo-encart-3x-visual {
    top: 0;
    height: 100%;
  }

  .promo-encart-3x-visual::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(to bottom,
      rgba(16, 26, 60, 0.88) 0%,
      rgba(16, 26, 60, 0.55) 55%,
      rgba(16, 26, 60, 0.15) 100%);
  }

  .promo-encart-3x-content {
    bottom: 0;
    z-index: 1;
    justify-content: flex-start;
    padding-top: 28px;
  }
}

/* ================================================================
   SKELETON LOADING — chargement initial + rechargements AJAX
   ================================================================ */
@keyframes promo-shimmer {
  to { background-position: 200% center; }
}
@keyframes promo-fade-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ---- Blocs réels : cachés pendant le chargement initial ---- */
.page-cat-loading .promo-header,
.page-cat-loading .promo-reassurance,
.page-cat-loading #promo-active-filters,
.page-cat-loading .promo-content-grid { display: none !important; }

/* ---- Squelettes SSR : visibles uniquement pendant le chargement ----
   NB : les wrappers portent à la fois .page-cat-skel ET une classe de
   layout (.page-cat-skel-header / -reassurance / -grid) qui pose
   display:flex|grid avec la même spécificité mais plus bas dans le
   fichier. Sans !important, ces règles de layout l'emportent et le
   squelette reste visible une fois .page-cat-loading retiré. */
.page-cat-skel { display: none !important; }
.page-cat-loading .page-cat-skel { display: block !important; }
.page-cat-loading .page-cat-skel-header { display: flex !important; }
.page-cat-loading .page-cat-skel-reassurance { display: flex !important; }
.page-cat-loading .page-cat-skel-grid { display: grid !important; }

/* ---- Fade-in des blocs réels après retrait du skeleton ---- */
.page-cat-ready .promo-header       { animation: promo-fade-in 0.22s ease both; }
.page-cat-ready .promo-reassurance  { animation: promo-fade-in 0.22s ease 0.04s both; }
.page-cat-ready .promo-content-grid { animation: promo-fade-in 0.22s ease 0.08s both; }

/* ---- Squelette : header ---- */
.page-cat-skel-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 24px;
  margin-bottom: 24px;
}
.page-cat-skel-header-left { display: flex; flex-direction: column; gap: 14px; flex: 1; max-width: 480px; }
.page-cat-skel-header-title {
  height: 52px; width: 72%;
  border-radius: 8px;
}
.page-cat-skel-header-sub {
  height: 16px; width: 55%;
  border-radius: 6px;
}
.page-cat-skel-header-sort {
  height: 40px; width: 180px; flex-shrink: 0;
  border-radius: 8px;
}

/* ---- Squelette : réassurance ---- */
.page-cat-skel-reassurance {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 20px;
}
.page-cat-skel-pill {
  height: 34px;
  border-radius: 20px;
}
.page-cat-skel-pill:nth-child(1) { width: 180px; }
.page-cat-skel-pill:nth-child(2) { width: 158px; }
.page-cat-skel-pill:nth-child(3) { width: 124px; }
.page-cat-skel-pill:nth-child(4) { width: 200px; }
.page-cat-skel-pill:nth-child(5) { width: 210px; }

/* ---- Squelette : grille (sidebar + produits) ---- */
.page-cat-skel-grid {
  display: grid;
  grid-template-columns: 264px 1fr;
  gap: 48px;
  align-items: start;
}

/* Sidebar */
.page-cat-skel-sidebar {
  display: flex;
  flex-direction: column;
  gap: 28px;
}
.page-cat-skel-filter-group { display: flex; flex-direction: column; gap: 10px; }
.page-cat-skel-filter-title { height: 18px; width: 60%; border-radius: 6px; }
.page-cat-skel-filter-line  { height: 14px; border-radius: 5px; }
.page-cat-skel-filter-line:nth-child(2) { width: 90%; }
.page-cat-skel-filter-line:nth-child(3) { width: 75%; }
.page-cat-skel-filter-line:nth-child(4) { width: 82%; }
.page-cat-skel-filter-line:nth-child(5) { width: 65%; }

/* Produits */
.page-cat-skel-products {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}

@media (max-width: 860px) {
  .page-cat-skel-grid {
    grid-template-columns: 1fr;
  }
  .page-cat-skel-sidebar { display: none; }
  .page-cat-skel-products { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 480px) {
  .page-cat-skel-products { grid-template-columns: 1fr; }
}

.promo-skel-card {
  background: #fff;
  border-radius: var(--promo-radius);
  overflow: hidden;
  border: 1.5px solid var(--promo-border);
  display: flex;
  flex-direction: column;
}

.promo-skel-base {
  background: linear-gradient(90deg, #EBEBEB 25%, #F4F4F4 50%, #EBEBEB 75%);
  background-size: 200% 100%;
  animation: promo-shimmer 1.4s ease-in-out infinite;
  border-radius: 6px;
}

.promo-skel-img {
  height: 220px;
  border-radius: 0;
  flex-shrink: 0;
}

.promo-skel-body {
  padding: 18px 18px 22px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1;
}

.promo-skel-tag {
  height: 18px;
  width: 38%;
  border-radius: 20px;
}

.promo-skel-title-l {
  height: 15px;
  width: 88%;
}

.promo-skel-title-s {
  height: 15px;
  width: 62%;
}

.promo-skel-price {
  height: 26px;
  width: 52%;
  margin-top: 4px;
}

.promo-skel-btn {
  height: 42px;
  width: 100%;
  border-radius: var(--promo-radius-sm);
  margin-top: 8px;
}

/* ================================================================
   BANNIÈRE OFFRE GROUPÉE (pleine largeur)
   ================================================================ */
.promo-banner-offre {
  grid-column: 1 / -1;
  background: linear-gradient(110deg, #FBF1D8, #F6E6BC);
  border-radius: var(--promo-radius);
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 28px 32px;
  flex-wrap: wrap;
}

.promo-banner-offre-content {
  max-width: 520px;
}

.promo-banner-offre-label {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #B07A12;
  margin: 0 0 8px;
}

.promo-banner-offre-title {
  font-size: clamp(22px, 2.5vw, 32px);
  font-weight: 700;
  line-height: 1.08;
  color: var(--promo-navy);
  margin: 0 0 10px;
}

.promo-banner-offre-title em {
  font-style: italic;
}

.promo-banner-offre-desc {
  font-size: 14.5px;
  color: rgba(33, 31, 96, 0.65);
  margin: 0;
  line-height: 1.5;
}

.promo-banner-offre-cta {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: var(--promo-navy);
  color: #fff;
  border: none;
  border-radius: var(--promo-radius-sm);
  padding: 14px 22px;
  font-size: 14.5px;
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
  transition: background 0.2s;
  flex-shrink: 0;
}

.promo-banner-offre-cta:hover {
  background: var(--promo-navy-dark);
  color: #fff;
  text-decoration: none;
}

/* ================================================================
   ÉTAT SANS RÉSULTATS
   ================================================================ */
.promo-no-results {
  grid-column: 1 / -1;
  text-align: center;
  padding: 72px 20px;
  border: 1.5px dashed rgba(33, 31, 96, 0.16);
  border-radius: var(--promo-radius);
}

.promo-no-results-title {
  font-size: 22px;
  font-weight: 700;
  color: var(--promo-navy);
  margin: 0 0 8px;
}

.promo-no-results-desc {
  font-size: 15px;
  color: var(--promo-text-muted);
  margin: 0;
}

/* ================================================================
   PAGINATION
   ================================================================ */
.promo-pagination {
  margin-top: 24px;
  margin-bottom: 40px;
}

.promo-pagination .sortPagiBar {
  margin: 0;
}

.promo-pagination .pagination_container {
  display: flex;
  justify-content: center;
}

.promo-pagination .pagination {
  display: flex;
  align-items: center;
  gap: 4px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.promo-pagination .page-item .page-link,
.promo-pagination .page-item span.page-link {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 40px;
  height: 40px;
  padding: 0 10px;
  border-radius: 10px;
  font-size: 14px;
  font-weight: 500;
  line-height: 1;
  color: var(--promo-navy);
  background: transparent;
  border: 1.5px solid transparent;
  text-decoration: none;
  transition: background 0.15s, color 0.15s, border-color 0.15s;
  cursor: pointer;
}

.promo-pagination .page-item .page-link:hover {
  background: rgba(33, 31, 96, 0.07);
  border-color: rgba(33, 31, 96, 0.15);
  color: var(--promo-navy);
}

.promo-pagination .page-item.active .page-link,
.promo-pagination .page-item.active span.page-link {
  background: var(--promo-navy);
  color: #fff;
  border-color: var(--promo-navy);
  font-weight: 700;
  cursor: default;
}

.promo-pagination .page-item.disabled .page-link,
.promo-pagination .page-item.disabled span.page-link {
  color: var(--promo-text-muted);
  cursor: default;
  pointer-events: none;
}

.promo-pagination .page-item.truncate .page-link,
.promo-pagination .page-item.truncate span.page-link {
  border: none;
  background: none;
  color: var(--promo-text-muted);
  cursor: default;
  pointer-events: none;
  min-width: 24px;
  padding: 0;
}

.promo-pagination .page-item .page-link iconify-icon {
  font-size: 18px;
}

/* ================================================================
   DESCRIPTION CATÉGORIE
   ================================================================ */
.promo-description {
  margin-top: 32px;
  padding-top: 28px;
  border-top: 1px solid var(--promo-border);
}

/* ================================================================
   RESTYLISATION SIDEBAR (blocklayered)
   Classe .page-cat-promotions ajoutée sur <html> par le JS
   ================================================================ */

.page-cat-promotions .layered_block .title_block {
  font-size: 22px;
  font-weight: 700;
  color: #211F60;
  padding-bottom: 6px;
  margin-bottom: 6px;
  border: none;
  position: relative;
}

.page-cat-promotions .layered_block .title_block::after {
  content: '';
  display: block;
  width: 40px;
  height: 3px;
  background: var(--promo-gold);
  border-radius: 2px;
  margin-top: 8px;
}

.page-cat-promotions .layered_block .layered_subtitle {
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: #211F60;
}

.page-cat-promotions .layered_block .layered_filter {
  margin-bottom: 22px;
}

.page-cat-promotions .layered_block .layered_filter_ul {
  list-style: none;
  padding: 0;
  margin: 10px 0 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.page-cat-promotions .layered_block .layered_filter_ul li.nomargin {
  margin: 0;
}

/* Checkbox restyle */
.page-cat-promotions .layered_block .form-check {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0;
}

.page-cat-promotions .layered_block .form-check-input[type="checkbox"] {
  width: 18px;
  height: 18px;
  border-radius: 5px;
  border: 1.5px solid rgba(33, 31, 96, 0.25);
  background: #fff;
  flex-shrink: 0;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  transition: border-color 0.2s, background 0.2s;
  margin: 0;
}

.page-cat-promotions .layered_block .form-check-input[type="checkbox"]:checked {
  background: #211F60;
  border-color: #211F60;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4 4 9.5-10'%3E%3C/path%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
}

.page-cat-promotions .layered_block .form-check-input[type="checkbox"]:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}

.page-cat-promotions .layered_block .form-check-label {
  font-size: 13px;
  color: rgba(33, 31, 96, 0.82);
  cursor: pointer;
  flex: 1;
  display: flex;
  justify-content: space-between;
  gap: 8px;
}

.page-cat-promotions .layered_block .form-check-label span {
  font-size: 12px;
  color: rgba(33, 31, 96, 0.4);
  font-variant-numeric: tabular-nums;
}

/* Bouton reset sidebar */
.page-cat-promotions .layered_block #cancel-filters {
  width: 100%;
  background: #fff;
  border: 1.5px solid rgba(33, 31, 96, 0.16);
  border-radius: 10px;
  padding: 11px;
  font-size: 13.5px;
  font-weight: 600;
  color: #211F60;
  cursor: pointer;
  text-align: center;
  text-decoration: none;
  display: block;
  transition: border-color 0.2s, background 0.2s;
  margin-top: 8px;
}

.page-cat-promotions .layered_block #cancel-filters:hover {
  border-color: #211F60;
  background: rgba(33, 31, 96, 0.02);
}

/* Bouton réinitialiser les filtres — persistant en bas du layered_block */
.promo-filter-reset-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  width: 100%;
  margin-top: 20px;
  padding: 11px 16px;
  background: #fff;
  border: 1.5px solid rgba(33, 31, 96, 0.16);
  border-radius: 10px;
  font-size: 13px;
  font-weight: 600;
  color: #211F60;
  text-decoration: none;
  cursor: pointer;
  transition: border-color 0.2s, background 0.2s, color 0.2s;
  box-sizing: border-box;
}

.promo-filter-reset-btn:hover {
  border-color: #211F60;
  background: rgba(32, 31, 95, 0.04);
  color: #211F60;
  text-decoration: none;
}

.promo-filter-reset-btn svg {
  flex-shrink: 0;
  opacity: 0.55;
}

/* Filtres actifs (chips) */
.page-cat-promotions .layered_block #enabled_filters li {
  background: #fff;
  border: 1.5px solid rgba(33, 31, 96, 0.14);
  border-radius: 999px;
  padding: 6px 12px 6px 14px;
  font-size: 13px;
  font-weight: 600;
  color: #211F60;
  justify-content: space-between;
}

.page-cat-promotions .layered_block #enabled_filters .cancel-filter {
  color: rgba(33, 31, 96, 0.5);
  background: none;
  border: none;
  padding: 0;
  width: auto;
  height: auto;
  border-radius: 0;
  font-size: 13px;
}

/* Titre de section filtre */
.page-cat-promotions .layered_block .layered_subtitle_heading {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-bottom: 8px;
  border-bottom: 1px solid rgba(33, 31, 96, 0.07);
  margin-bottom: 8px;
}

/* Slider de prix */
.page-cat-promotions .layered_block .layered_slider_container {
  margin-top: 10px;
}

/* ================================================================
   FIX DÉBORDEMENT HORIZONTAL SIDEBAR (vraie cause)
   Le slider jQuery UI place ses poignées (.ui-slider-handle) en
   position:absolute à left:0% / left:100% ; à 100% la moitié de la
   poignée déborde le bord droit du conteneur → scroll horizontal.
   On marge le conteneur du slider pour que les poignées restent à
   l'intérieur, et on borne tous les enfants à 100% de large.
   AUCUN overflow:hidden sur les ancêtres du chevron (sinon flèche
   coupée) ; on utilise overflow-x:clip sur le conteneur slider seul,
   qui ne contient aucun élément transformé visible à préserver.
   ================================================================ */
.page-cat-promotions .promo-sidebar *,
.page-cat-promotions .layered_block * {
  max-width: 100%;
  box-sizing: border-box;
}

/* Réserve l'espace des poignées du slider de chaque côté (~10px) */
.page-cat-promotions .layered_block .layered_slider_container {
  padding: 0 10px;
  overflow-x: clip;
}

/* La piste du slider reste dans le conteneur paddé */
.page-cat-promotions .layered_block .layered_slider {
  width: auto !important;
  max-width: 100%;
}

/* Texte de la plage de prix : pas de débordement */
.page-cat-promotions .layered_block #layered_price_range {
  display: block;
  word-break: break-word;
}

/* ================================================================
   NEUTRALISE LE TOGGLE NATIF BLOCKLAYERED (on a notre propre barre)
   Et le bouton "Show products" natif dans le panneau.
   ================================================================ */
.page-cat-promotions #toggle-filter-sidebar,
.page-cat-promotions #toggle-filter-sidebar-floating,
.page-cat-promotions .layered_button-wrapper {
  display: none !important;
}

/* Force l'affichage de #offcanvasFilter dans notre sidebar —
   Bootstrap offcanvas le cache par défaut (transform/visibility) */
.page-cat-promotions .promo-sidebar #offcanvasFilter {
  position: static !important;
  transform: none !important;
  visibility: visible !important;
  opacity: 1 !important;
  width: auto !important;
  height: auto !important;
  max-height: none !important;
}



/* ================================================================
   RESPONSIVE — MOBILE
   ================================================================ */
@media (max-width: 768px) {
  .promo-topbar {
    font-size: 12px;
    gap: 8px;
    padding: 9px 12px;
  }

  .promo-sort-bar {
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
  }

  .promo-sort-select-wrapper {
    width: 100%;
  }

  .promo-sort-select-wrapper .selectProductSort,
  .promo-sort-select-wrapper select {
    width: 100%;
    min-width: 0;
  }

  .promo-reassurance {
    gap: 8px 16px;
  }

  .promo-reassurance-item {
    flex-basis: 100%;
  }

  .promo-banner-offre {
    padding: 20px;
    flex-direction: column;
    align-items: flex-start;
  }

  .promo-banner-offre-cta {
    width: 100%;
    justify-content: center;
  }
}

@media (max-width: 480px) {
  .promo-card-price {
    font-size: 1.5rem;
  }
}

/* ================================================================
   SUPPRIME BORDER-LEFT BOOTSTRAP OFFCANVAS-END
   ================================================================ */
.page-cat-promotions .offcanvas-lg.offcanvas-end,
.page-cat-promotions .promo-sidebar .offcanvas-end {
  border-left: none !important;
}

/* ================================================================
   BOTTOM ACTION BAR MOBILE (≤860px)
   Remplace la barre inline "Filtrer & affiner" par une barre sticky
   en bas de l'écran. Deux actions : Trier (secondaire) + Filtrer (primaire).
   La barre est injectée dans <body> par JS → hexadécimaux directs
   (pas de CSS vars héritées de .category-promotions-page).
   ================================================================ */

@media (max-width: 860px) {
  /* Espace sous le listing pour ne pas masquer le dernier produit */
  .category-promotions-page {
    padding-bottom: 80px;
  }
}

/* Barre sticky (cachée sur desktop) */
.promo-bottombar,
.promo-sort-backdrop,
.promo-sort-sheet,
.promo-filter-backdrop {
  display: none;
}

body.promo-no-scroll {
  overflow: hidden !important;
}

@media (max-width: 860px) {
  .promo-bottombar {
    display: flex;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 200;
    background: #fff;
    box-shadow: 0 -2px 20px rgba(33, 31, 96, 0.13);
    padding: 10px 16px calc(10px + env(safe-area-inset-bottom, 0px));
    gap: 10px;
    align-items: stretch;
  }

  /* Bouton secondaire : Trier */
  .promo-bottombar-sort {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    background: #fff;
    border: 1.5px solid rgba(33, 31, 96, 0.16);
    border-radius: 10px;
    padding: 13px 12px;
    font-size: 0.875rem;
    font-weight: 600;
    color: #211F60;
    cursor: pointer;
    transition: border-color 0.2s;
    white-space: nowrap;
    appearance: none;
    -webkit-appearance: none;
  }

  .promo-bottombar-sort:hover {
    border-color: #211F60;
  }

  /* Bouton primaire : Filtrer & affiner */
  .promo-bottombar-filter {
    flex: 2;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    background: #211F60;
    border: none;
    border-radius: 10px;
    padding: 13px 16px;
    font-size: 0.875rem;
    font-weight: 700;
    color: #fff;
    cursor: pointer;
    transition: background 0.2s;
    white-space: nowrap;
    appearance: none;
    -webkit-appearance: none;
  }

  .promo-bottombar-filter:hover {
    background: #211F60;
  }

  /* Badge filtres actifs */
  .promo-bottombar-filter-count {
    background: #DE2F27;
    color: #fff;
    font-size: 11px;
    font-weight: 700;
    min-width: 18px;
    height: 18px;
    border-radius: 999px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0 5px;
    white-space: nowrap;
    flex-shrink: 0;
  }

  /* ---- Bottom sheet : Trier ---- */
  .promo-sort-backdrop {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 299;
    background: rgba(33, 31, 96, 0.45);
  }

  .promo-sort-backdrop--open {
    display: block;
  }

  .promo-sort-sheet {
    display: none;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 300;
    background: #fff;
    border-radius: 16px 16px 0 0;
    box-shadow: 0 -8px 32px rgba(33, 31, 96, 0.18);
    padding-bottom: env(safe-area-inset-bottom, 0px);
    max-height: 80vh;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }

  .promo-sort-sheet--open {
    display: block;
  }

  .promo-sort-sheet-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 18px 20px 14px;
    border-bottom: 1px solid rgba(33, 31, 96, 0.08);
    font-size: 0.9375rem;
    font-weight: 700;
    color: #211F60;
    position: sticky;
    top: 0;
    background: #fff;
  }

  .promo-sort-sheet-close {
    background: none;
    border: none;
    font-size: 1.375rem;
    line-height: 1;
    color: rgba(33, 31, 96, 0.45);
    cursor: pointer;
    padding: 2px 6px;
    appearance: none;
    -webkit-appearance: none;
  }

  .promo-sort-options {
    list-style: none;
    margin: 0;
    padding: 8px 0 16px;
  }

  .promo-sort-option {
    display: flex;
    align-items: center;
    padding: 15px 20px;
    font-size: 0.9375rem;
    font-weight: 500;
    color: #211F60;
    cursor: pointer;
    transition: background 0.15s;
  }

  .promo-sort-option:hover {
    background: rgba(33, 31, 96, 0.04);
  }

  .promo-sort-option--active {
    font-weight: 700;
  }

  .promo-sort-option--active::after {
    content: '';
    display: inline-block;
    width: 6px;
    height: 11px;
    border-right: 2px solid #211F60;
    border-bottom: 2px solid #211F60;
    transform: rotate(45deg) translate(-1px, -2px);
    margin-left: auto;
    flex-shrink: 0;
  }
}

/* Backdrop pour le tiroir de filtres (injecté dans <body> par JS) */
.promo-filter-backdrop {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 199;
  background: rgba(33, 31, 96, 0.45);
}

.promo-filter-backdrop--open {
  display: block;
}

/* ================================================================
   PROMO HEADER — stack vertical sur mobile
   Sans ça, promo-header-right (min-width:210px select) écrase
   promo-header-left à ~140px de large → titre illisible.
   ================================================================ */
@media (max-width: 860px) {
  .promo-header {
    flex-direction: column;
    align-items: flex-start;
    gap: 16px;
  }

  .promo-header-left {
    max-width: 100%;
  }

  .promo-header-right {
    display: none !important;
  }

  .promo-sort-select-wrapper {
    width: 100%;
  }

  .category-promotions-page .promo-sort-select-wrapper .selectProductSort,
  .category-promotions-page .promo-sort-select-wrapper select {
    width: 100%;
    min-width: 0;
  }
}
