/* ============================================================
   CATÉGORIE + FILTRES refonte V2.5 — fashioncurvyshop.com
   (02/08/2026, refonte-code, étape 4)
   Déployé dans : wp-content/themes/enfold-child/refonte-categorie.css
   Source de vérité : maintenance-fcs/ux/refonte-categorie.css
   Enfilé par functions.php UNIQUEMENT sur is_product_taxonomy()/is_shop()
   (voir fcs_refonte_categorie_assets()) — aucun poids sur les autres pages.

   Portée : archives WooCommerce (catégories produit + /boutique/), PAS des
   pages ALB comme le header/footer/accueil des étapes précédentes. Tout le
   balisage restylé ici est du balisage WooCommerce/Enfold NATIF (widgets
   woocommerce_price_filter / woocommerce_layered_nav dans le widget-area
   Enfold "av_shop_overview", tri natif Enfold .avia-product-sorting,
   pagination native .pagination, boucle produit ul.products) — 0 surcharge
   de template WooCommerce (budget registre inchangé, toujours 0/4).

   Mécanisme de filtres RÉUTILISÉ (pas de nouveau plugin, rien installé) :
   3 widgets déjà actifs dans le widget-area Enfold "Shop Overview Page"
   (id réel : av_shop_overview) : woocommerce_price_filter (slider prix,
   jQuery UI déjà enqueue par WooCommerce core), 2x woocommerce_layered_nav
   en <select> (Couleur -> pa_couleur, Taille -> pa_size), + le widget
   "Iks Menu" (iksm-widget, plugin actif iks-menu) qui affiche l'arbre des
   sous-catégories. Ce fichier les RESTYLE (CSS only) — ne modifie ni les
   valeurs de tailles/couleurs (données produit réelles) ni la logique JS
   de chacun.
   ============================================================ */

/* ============================================================
   1. Mise en page du gabarit archive (header / main / aside / SEO)
   ============================================================ */
/* Enfold positionne nativement main+aside en float (sidebar_left). On passe
   en flex sur CE SEUL gabarit (scope .template-shop) pour pouvoir insérer
   une 4e "ligne" pleine largeur (section SEO) après le bloc filtres+grille,
   quel que soit lequel des deux (grille ou filtres) est le plus haut —
   un simple clear:both ne suffit pas de façon fiable dans un layout à
   floats inégaux. Ne touche à aucune autre page (le sélecteur ne matche
   que .container_wrap.template-shop). */
.template-shop .container {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 0 44px;
}
.template-shop .container > .woocommerce-products-header { order: 1; flex: 1 1 100%; }
.template-shop .container > main.template-shop { order: 2; flex: 1 1 600px; min-width: 0; }
.template-shop .container > aside.sidebar { order: 3; flex: 0 0 262px; }
.template-shop .container > .fcs-cat-seo { order: 4; flex: 1 1 100%; }

/* Repli desktop des filtres (bouton "Masquer les filtres", JS ajoute cette
   classe sur <html>) : la colonne aside disparaît, le contenu prend toute
   la largeur. Rien ne casse si JS est indisponible : les filtres restent
   simplement toujours visibles (dégradation raisonnable).
   Préfixe `#top #main` OBLIGATOIRE (et non un !important) : la règle native
   Enfold `#top #main .sidebar{display:block}` (2 ID + 1 classe) bat toute
   règle sans ID, y compris celle-ci sans le préfixe — bug de spécificité
   confirmé par refonte-perf ET refonte-compat le 02/08/2026, même cause que
   le tiroir mobile ci-dessous. Méthode imposée par refonte-compat : matcher
   la spécificité d'Enfold par préfixe (2 ID + plus de classes que lui),
   jamais de !important — cohérent avec la convention déjà en place. */
html.fcs-cat-nofilters #top #main .template-shop .container > aside.sidebar { display: none; }

/* ---- Trait noir vertical entre contenu et sidebar (05/08/2026) ----------
   Signalé par la gérante sur mobile (page catégorie « vêtements »), prouvé
   par mesure : `main.template-shop.content` porte un `border-left:1px solid
   rgb(0,0,0)` sur toute la hauteur de page (3081px), visible UNIQUEMENT à
   375px (contrôlé aussi à 1280 sur cette page : transparent, rien à faire
   là). Cause exacte, remontée par `document.styleSheets` + spécificité
   réelle (le CSS écrit ne suffit pas à conclure, cf. skill) :
     1) Enfold pose `.sidebar_left .content { border-left-width:1px;
        border-left-style:solid }` SANS jamais fixer `border-left-color`
        (2 classes, (0,2,0)).
     2) La seule règle qui fixe une couleur de bordure pour la zone
        "Main Color Zone" est `.main_color, .main_color main, … {
        border-color: var(--enfold-main-color-border) }` — 1 classe + 1
        élément, (0,1,1) : PERD par spécificité face à (1). Vérifié en
        forçant la variable à `red` en JS : aucun effet sur le rendu.
     3) `border-left-color` non fixé retombe donc sur sa valeur INITIALE
        CSS, `currentcolor` — qui résout vers la couleur de TEXTE réelle de
        la zone, elle-même un réglage Enfold (`--enfold-main-color-color:
        #000000`, "Main Color Zone → Texte", visiblement mis au noir pur
        dans un lot antérieur). Ce n'est PAS un lot refonte qui a peint une
        bordure en noir : c'est la combinaison réglage-texte-noir +
        réglage-bordure-transparent-jamais-appliqué qui la fait apparaître.
   Pas de rustine sur la couleur du thème (hors mandat, réglage Enfold
   General Styling) : on complète juste la déclaration manquante, à une
   spécificité qui bat `.sidebar_left .content` (2 ID + 2 classes > 0 ID +
   2 classes), zéro !important. Portée : ce fichier n'est enfilé que sur
   is_shop()/is_product_taxonomy(), exactement où le défaut a été mesuré
   (accueil, fiche produit, CGV : sondés, aucune bordure noire parasite). */
#top #wrap_all .sidebar_left .content { border-left-color: transparent; }

/* ============================================================
   2. En-tête catégorie (fil d'Ariane + H1 + amorce)
   ============================================================ */
/* Le fil d'Ariane Yoast/Enfold vit dans un container_wrap séparé, juste
   au-dessus du bloc H1 — on leur applique le MÊME dégradé et on annule
   l'espace entre les deux pour qu'ils se lisent comme un seul bandeau,
   comme dans la maquette. Le fil d'Ariane lui-même (liens, dernier niveau
   non cliquable) N'EST PAS TOUCHÉ, seulement son habillage visuel. */
.title_container.stretch_full {
  background: linear-gradient(135deg, var(--fcs-bg-soft) 0%, #fdfbfa 75%);
}
.title_container.stretch_full { padding-bottom: 0 !important; margin-bottom: 0 !important; }
.template-shop .woocommerce-products-header {
  position: relative; /* contexte d'empilement pour le ::before ci-dessous */
  z-index: 0;          /* voir note : force un NOUVEAU contexte d'empilement */
  padding: 28px 0 30px;
  margin: 0;
  border: 0;
}
/* ---- Bande bord à bord desktop/tablette (05/08/2026, retour gérante,
   CORRIGÉ dans la nuit après remontée golive/prod — v2) --------------------
   Cause du décalage d'origine : `.woocommerce-products-header` (template
   WooCommerce natif `loop/header.php`, aucune surcharge) est un enfant DIRECT
   de `.container`, le MÊME `.container` que la grille produits/sidebar,
   plafonné sitewide par `.responsive .container{max-width:1500px}` + `padding:
   0 50px` (option Enfold "Content Width", *{box-sizing:border-box}). Le
   dégradé posé sur l'en-tête s'arrêtait donc au bord de cette boîte plafonnée
   au lieu du viewport.

   ⛔ v1 (marge négative calc(50%-50vw) directement sur l'ÉLÉMENT), qui avait
   pourtant été vérifiée à la main pour 2 régimes de largeur, est PARTIE EN
   PROD et a été mesurée CASSÉE côté golive : `.woocommerce-products-header`
   est un ITEM FLEX (`flex:1 1 100%`, règle du §1 ci-dessus, préexistante) —
   l'algorithme de mise en page flexbox redistribue l'espace différemment
   selon `flex-grow`/`flex-shrink` en présence de marges négatives ; ce n'est
   PAS un simple bloc de niveau bloc où marge négative = débordement exact.
   Résultat mesuré en prod : left=44px (au lieu de 0, à 1440 ET 2000 — un
   décalage CONSTANT en pixels, pas proportionnel au viewport, signature d'un
   comportement d'algorithme et non d'une erreur de calcul de constante),
   right=1693 au lieu de 2000 à 2000px, H1 lui-même décalé d'~44px — PIRE
   qu'avant (asymétrique, visible), alors qu'un banc de reproduction isolé
   (flex minimal hors staging, sans tout le contenu réel de la page) n'avait
   PAS révélé le problème : la règle du skill « mesurer sur la page réelle,
   pas sur un raisonnement » s'applique aussi à un correctif qu'on croit avoir
   vérifié — la vérification portait sur l'ARITHMÉTIQUE de la formule, pas sur
   son EXÉCUTION RÉELLE par l'algorithme flexbox du navigateur avec tous les
   éléments et leur `gap` en jeu.

   ✅ v2 (ci-dessous) : L'ÉLÉMENT FLEX RESTE STRICTEMENT INCHANGÉ (aucune
   marge, aucun padding modifié dessus, aucune interaction avec l'algorithme
   flex) — le fond est porté par un `::before` en `position:absolute`, qui
   n'est PAS un item flex (les pseudo-éléments absolument positionnés d'un
   item flex sont retirés du flux et ne participent PAS au calcul
   flex-basis/grow/shrink, par spécification — immunité catégorique, pas
   empirique, à cette classe de bug précise). `left/right: calc(50% - 50vw)`
   sur le `::before` (position:absolute, contexte de positionnement =
   `.woocommerce-products-header` grâce à `position:relative` ci-dessus)
   utilise EXACTEMENT la même formule que v1, mais résolue contre la boîte de
   l'en-tête (immuable, jamais modifiée) plutôt que contre le viewport via une
   marge sur l'item flex lui-même — vérifiée à la main pour les 2 régimes
   ET confirmée en navigateur réel (Chromium, page de test isolée reproduisant
   fidèlement `.container{max-width:1500px;padding:0 50px;box-sizing:border-
   box}` + le contexte flex `flex:1 1 100%`/`gap:0 44px`, servie en HTTP local
   donc JS/layout réellement exécutés — pas une capture figée) : à 1280, 1440
   et 2000 (+ 980, plafond bas de ce poste pour `resize_window`, cf. note),
   le `::before` calculé atteint exactement left=0/right=viewport aux 3
   largeurs, et la boîte RÉELLE de l'en-tête (`getBoundingClientRect`) est
   restée identique à une version SANS aucun correctif à chaque largeur —
   delta H1 = 0px mesuré (pas juste déduit), `scrollWidth === innerWidth`
   (0 scroll horizontal) aux 3 largeurs.
   `z-index:0` (pas seulement `position:relative`) sur l'en-tête est
   nécessaire : sans valeur de z-index explicite, `position:relative` seul ne
   crée PAS de nouveau contexte d'empilement, et le `z-index:-1` du `::before`
   irait alors se comparer à un ancêtre plus lointain (risque de passer sous
   le fond d'un `container_wrap` parent) — avec `z-index:0` ici, le contexte
   est local et garanti par la spec, pas par un test au cas par cas.
   `background` retiré de la boîte elle-même (déplacé sur le `::before`
   uniquement) : évite un double fond identique superposé, sans effet visuel
   à corriger mais du CSS inutile sinon.
   Filet de sécurité déjà en place sitewide (vérifié dans le CSS généré, pas
   supposé) : `body{overflow-x:hidden}`, `#top{overflow-x:hidden}`,
   `#main{overflow:hidden}` — `#main` ne rogne rien ici car il n'a ni marge ni
   largeur réduite sur ce site (pas de classe `html_header_left/right` sur le
   `<body>`, vérifié), donc `#main` fait exactement la largeur du viewport, la
   même cible que notre breakout — aucun rognage.
   Mobile INCHANGÉ : le `::before` a un défaut `left:0;right:0` (couvre
   exactement la boîte, visuellement identique à l'ancien `background` posé
   directement) hérité à TOUTES les largeurs ; seul `left/right:calc(...)`
   est ajouté sous `min-width:768px`, donc sous 768px rien ne change par
   rapport à l'état body-background d'origine. Bloc `@media(max-width:767px)`
   existant revérifié octet pour octet identique (voir livraison). */
.template-shop .woocommerce-products-header::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: linear-gradient(135deg, var(--fcs-bg-soft) 0%, #fdfbfa 75%);
  z-index: -1;
  pointer-events: none;
}
@media only screen and (min-width: 768px) {
  .template-shop .woocommerce-products-header::before {
    left: calc(50% - 50vw);
    right: calc(50% - 50vw);
  }
}
.breadcrumb.breadcrumbs { font-family: var(--fcs-font-text); font-size: 13px; }
.breadcrumb.breadcrumbs a { color: var(--fcs-text-subtle); text-decoration: none; transition: color var(--fcs-duration-fast) var(--fcs-ease-out); }
.breadcrumb.breadcrumbs a:hover { color: var(--fcs-framboise, #b04d6b); }
#top #main.all_colors .breadcrumb.breadcrumbs .trail-end { color: var(--fcs-framboise, #b04d6b); background: transparent; } /* étude 3 (06/08) : Enfold pose un fond #f1919c derrière le dernier fil d'Ariane (mesuré Lighthouse réel, jamais déclaré dans nos fichiers) — framboise/#f1919c = 2,25:1. Fond neutralisé, cohérent avec les autres miettes qui n'ont pas de fond. */

.woocommerce-products-header__title.page-title {
  font-family: var(--fcs-font-script);
  font-size: 64px;
  /* --fcs-hn-lh : la règle sitewide de refonte-socle.css (3 ID) bat toute
     redéclaration de `line-height` d'un fichier de gabarit (2 ID max). La
     valeur doit donc passer par la variable, posée SUR LE TITRE lui-même. */
  --fcs-hn-lh: 1;
  line-height: 1;
  font-weight: 400;
  color: var(--fcs-prune);
  margin: 0 0 10px;
}
/* Amorce courte sous le H1 — dérivée mécaniquement de la description
   existante (wp_trim_words + strip_tags côté PHP, AUCUN texte inventé),
   affichée seulement si une description existe (voir fcs_refonte_cat_teaser). */
.fcs-cat-teaser {
  font-family: var(--fcs-font-text);
  font-size: 16px;
  line-height: 1.6;
  color: var(--fcs-text-muted);
  margin: 0;
  max-width: 640px;
}

/* ============================================================
   3. Barre d'outils (compteur + filtres desktop/mobile)
   ============================================================ */
.fcs-cat-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  padding: 18px 0;
  border-bottom: 1px solid var(--fcs-border);
  margin-bottom: 24px;
}
.fcs-cat-toolbar-left { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; }
.fcs-cat-count { font-family: var(--fcs-font-text); font-size: 14px; color: var(--fcs-text-subtle); }
#top #main.all_colors .fcs-cat-count strong { color: var(--fcs-prune, #2a1620); font-weight: 600; } /* étude 3 (06/08) : valeur déjà correcte, perdait la cascade contre `.main_color strong` d'Enfold (1 classe+1 élément, mesuré fg=#f1919c en Lighthouse réel) */

.fcs-cat-filters-toggle-desktop {
  font-family: var(--fcs-font-text);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--fcs-framboise);
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  transition: color var(--fcs-duration-fast) var(--fcs-ease-out);
}
.fcs-cat-filters-toggle-desktop:hover { color: var(--fcs-framboise); }

.fcs-cat-filters-toggle-mobile { display: none; } /* affiché en mobile plus bas */

/* ============================================================
   4. Tri natif Enfold (.avia-product-sorting) restylé en pilule
   ============================================================ */
.product-sorting.avia-product-sorting {
  font-family: var(--fcs-font-text);
  margin-bottom: 24px;
}
.product-sorting .sort-param { list-style: none; margin: 0; padding: 0; display: inline-block; }
.product-sorting .sort-param > li { position: relative; }
.product-sorting .currently-selected {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  border: 1px solid var(--fcs-border);
  border-radius: var(--fcs-radius-pill);
  padding: 9px 18px;
  font-size: 14px;
  color: var(--fcs-prune);
  font-weight: 500;
  cursor: pointer;
  min-height: 44px;
  transition: border-color var(--fcs-duration-fast) var(--fcs-ease-out);
}
.product-sorting .currently-selected:hover,
.product-sorting > .sort-param:hover .currently-selected { border-color: var(--fcs-rose); }
.product-sorting .sort-param > li > ul {
  list-style: none;
  margin: 6px 0 0;
  padding: 8px;
  position: absolute;
  left: 0;
  top: 100%;
  min-width: 200px;
  background: var(--fcs-white);
  border: 1px solid var(--fcs-border);
  border-radius: var(--fcs-radius-md);
  box-shadow: var(--fcs-shadow-xl);
  z-index: 20;
  display: none;
}
.product-sorting .sort-param > li:hover > ul,
.product-sorting .sort-param > li:focus-within > ul { display: block; }
.product-sorting .avia-product-sorting-link {
  display: block;
  padding: 9px 14px;
  border-radius: var(--fcs-radius-sm);
  font-size: 13.5px;
  color: var(--fcs-text-secondary);
  text-decoration: none;
  white-space: nowrap;
  min-height: 38px;
  display: flex;
  align-items: center;
}
.product-sorting .avia-product-sorting-link:hover { background: var(--fcs-bg-soft); color: var(--fcs-framboise); }
.product-sorting .avia-bullet { display: none; }
.product-sorting .sort-param-count { margin-left: 14px; }

/* ============================================================
   5. Filtres actifs (chips) + "Tout effacer"
   ============================================================ */
.fcs-cat-active-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  padding: 0 0 18px;
}
.fcs-cat-active-filters:empty { display: none; }
.fcs-chip {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: var(--fcs-bg-soft);
  border: 1px solid var(--fcs-border-light);
  color: var(--fcs-framboise);
  font-family: var(--fcs-font-text);
  font-size: 12.5px;
  font-weight: 500;
  padding: 6px 12px;
  border-radius: var(--fcs-radius-pill);
  text-decoration: none;
  min-height: 32px;
}
.fcs-chip:hover { border-color: var(--fcs-rose); }
.fcs-chip-x { font-size: 14px; line-height: 1; }
.fcs-cat-clear-all {
  font-size: 12.5px;
  font-weight: 600;
  color: var(--fcs-framboise);
  text-decoration: none;
}
.fcs-cat-clear-all:hover { text-decoration: underline; }

/* ============================================================
   6. Sidebar filtres (desktop : colonne statique ; mobile : tiroir)
   ============================================================ */
.template-shop aside.sidebar { font-family: var(--fcs-font-text); }
.template-shop .inner_sidebar { display: flex; flex-direction: column; }

/* Barre "Filtrer" + fermeture — n'existe que via dynamic_sidebar_before,
   masquée par défaut (utile seulement en tiroir mobile, section 8). */
.fcs-filters-head { display: none; }
.fcs-filters-foot { display: none; }

.template-shop .widget.woocommerce { border: 0; padding: 20px 0; margin: 0; border-bottom: 1px solid var(--fcs-border); }
.template-shop .widget.woocommerce:first-child { padding-top: 0; }
.template-shop .widgettitle {
  font-family: var(--fcs-font-text);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--fcs-prune);
  margin: 0 0 16px;
}
.template-shop .seperator { display: none; } /* Enfold ajoute déjà border-bottom au widget parent */

/* --- Filtre prix (slider jQuery UI natif WooCommerce) --- */
.template-shop .price_slider_wrapper .ui-slider {
  background: var(--fcs-border);
  border: 0;
  height: 4px;
  border-radius: var(--fcs-radius-pill);
  margin: 18px 4px 16px;
}
.template-shop .price_slider_wrapper .ui-slider-range { background: var(--fcs-rose); border-radius: var(--fcs-radius-pill); }
.template-shop .price_slider_wrapper .ui-slider-handle {
  width: 18px;
  height: 18px;
  top: -7px;
  background: var(--fcs-white);
  border: 2px solid var(--fcs-rose);
  border-radius: 999px;
  box-shadow: var(--fcs-shadow-sm);
  cursor: pointer;
  outline: none;
}
.template-shop .price_slider_amount { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
.template-shop .price_slider_amount input[type="text"] { display: none; } /* champs texte redondants avec le slider — masqués, valeurs toujours soumises via le form */
.template-shop .price_label { font-size: 13px; color: var(--fcs-text-muted); }
.template-shop .price_slider_amount .button {
  background: var(--fcs-framboise);
  color: var(--fcs-white);
  border: 0;
  border-radius: var(--fcs-radius-pill);
  padding: 8px 18px;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  min-height: 40px;
}
.template-shop .price_slider_amount .button:hover { background: var(--fcs-framboise-clair-hover, #b6536f); }

/* --- Filtres à facettes (Couleur / Taille) : <select> natif, custom skin --- */
.template-shop .widget_layered_nav select {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  min-height: 46px;
  border: 1.5px solid var(--fcs-border);
  border-radius: var(--fcs-radius-pill);
  padding: 0 40px 0 18px;
  font-family: var(--fcs-font-text);
  font-size: 14px;
  color: var(--fcs-prune);
  background: var(--fcs-white) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='12' height='12' fill='none' stroke='%23c05a78' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") no-repeat right 16px center;
  cursor: pointer;
  transition: border-color var(--fcs-duration-fast) var(--fcs-ease-out);
}
.template-shop .widget_layered_nav select:hover,
.template-shop .widget_layered_nav select:focus-visible { border-color: var(--fcs-rose); outline: none; }

/* --- Arbre de catégories (Iks Menu, widget iksm-widget) --- */
.template-shop .iksm-widget { padding-top: 4px; }
.template-shop .iksm-term__link {
  font-size: 14px;
  color: var(--fcs-text-secondary);
  padding: 8px 0;
  min-height: 40px;
  display: flex;
  align-items: center;
}
.template-shop .iksm-term--current > .iksm-term__inner .iksm-term__link { color: var(--fcs-framboise); font-weight: 600; }

/* ============================================================
   7. Grille produits (boucle native WooCommerce/Enfold)
   ============================================================ */
.template-shop main.template-shop ul.products {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 26px 24px;
  list-style: none;
  margin: 0 0 8px;
  padding: 0;
}
.template-shop main.template-shop ul.products > li.product { float: none; width: auto; margin: 0; }
.template-shop .inner_product { background: none; border: none; box-shadow: none; }
.template-shop .thumbnail_container {
  position: relative;
  border-radius: var(--fcs-radius-lg);
  overflow: hidden;
  aspect-ratio: 3/4;
  background: var(--fcs-bg-soft);
  box-shadow: var(--fcs-shadow-md);
  transition: box-shadow var(--fcs-duration-fast) var(--fcs-ease-out);
  display: block;
}
.template-shop .product:hover .thumbnail_container { box-shadow: var(--fcs-shadow-lg); }
.template-shop .thumbnail_container img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .6s var(--fcs-ease-out);
}
.template-shop .product:hover .thumbnail_container img { transform: scale(1.06); }
.template-shop .inner_product_header_table { padding-top: 12px; }
.template-shop .woocommerce-loop-product__title {
  font-family: var(--fcs-font-text);
  font-size: 15px;
  font-weight: 400;
  color: var(--fcs-text-secondary);
  margin: 0 0 4px;
  /* interligne : voir --fcs-hn-lh dans refonte-socle.css (1.35) */
}
.template-shop .price {
  font-family: var(--fcs-font-title);
  font-size: 17px;
  color: var(--fcs-prune);
}
.template-shop .price ins { text-decoration: none; color: var(--fcs-framboise); }
.template-shop .price del { opacity: .6; font-size: 13px; }
.template-shop span.onsale {
  position: absolute;
  top: 14px;
  left: 14px;
  background: var(--fcs-prune);
  color: var(--fcs-white);
  font-size: 11px;
  letter-spacing: .1em;
  text-transform: uppercase;
  padding: 6px 12px;
  border-radius: var(--fcs-radius-pill);
  font-weight: 600;
  z-index: 2;
}
/* Bouton liste de souhaits (YITH) : déplacé dans refonte-socle.css le
   05/08/2026 (demande gérante : « le coeur en dehors de l'image, à côté
   du prix ») — SITEWIDE désormais (comme le modèle de carte), pas
   seulement sur ce gabarit : la recherche et la page liste de souhaits
   n'ont aucun CSS de gabarit dédié, même raison que le titre ci-dessus. */

/* ============================================================
   8. Pagination native (.pagination)
   ============================================================ */
.template-shop nav.pagination { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 24px 0 12px; font-family: var(--fcs-font-text); }
.template-shop nav.pagination .pagination-meta { font-size: 13px; color: var(--fcs-text-subtle); margin-right: 8px; }
.template-shop nav.pagination a,
.template-shop nav.pagination span.current {
  min-width: 40px;
  min-height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--fcs-radius-pill);
  font-size: 13.5px;
  text-decoration: none;
  color: var(--fcs-prune);
  border: 1px solid var(--fcs-border);
}
.template-shop nav.pagination span.current { background: var(--fcs-framboise); border-color: var(--fcs-framboise); color: var(--fcs-white); font-weight: 600; }
.template-shop nav.pagination a:hover { border-color: var(--fcs-rose); color: var(--fcs-framboise); }

/* ============================================================
   9. Section SEO : description de catégorie (repositionnée sous la grille)
   ============================================================ */
.fcs-cat-seo {
  background: #fdf9fa;
  border-top: 1px solid var(--fcs-border);
  padding: 56px 0;
  margin-top: 16px;
}
.fcs-cat-seo-inner {
  max-width: 760px;
  margin: 0 auto;
  font-family: var(--fcs-font-text);
  color: var(--fcs-text-muted);
  line-height: 1.8;
}
/* Le texte lui-même (term_description()) N'EST PAS modifié : on n'habille
   ici que les balises génériques qu'il contient (h1/h2/h3/p/a) — la balise
   <h1> éventuellement présente DANS le texte existant (contenu legacy,
   hors mandat refonte-code) est délibérément laissée telle quelle, voir
   le rapport de livraison pour le point à vérifier avec refonte-seo. */
.fcs-cat-seo-inner h1,
.fcs-cat-seo-inner h2 {
  font-family: var(--fcs-font-title);
  font-size: 30px;
  font-weight: 400;
  color: var(--fcs-prune);
  /* --fcs-hn-lh : la règle sitewide de refonte-socle.css (3 ID) bat toute
     redéclaration de `line-height` d'un fichier de gabarit (2 ID max). La
     valeur doit donc passer par la variable, posée SUR LE TITRE lui-même. */
  --fcs-hn-lh: 1.3;
  line-height: 1.3;
  margin: 0 0 16px;
}
.fcs-cat-seo-inner h3 {
  font-family: var(--fcs-font-text);
  font-size: 18px;
  font-weight: 600;
  color: var(--fcs-prune);
  margin: 28px 0 8px;
}
.fcs-cat-seo-inner p { margin: 0 0 16px; font-size: 16px; }
/* Revue compat 06/08/2026 : plus de text-decoration:none ni de border-bottom
   ici — la règle sitewide de soulignement du socle (.term-description a)
   gagne en spécificité et l'on obtenait DEUX traits superposés. Le
   soulignement du socle fait le travail seul. */
#top #main.all_colors .fcs-cat-seo-inner a { color: var(--fcs-framboise, #b04d6b); }
#top #main.all_colors .fcs-cat-seo-inner a:hover { color: var(--fcs-prune, #2a1620); }
#top #main.all_colors .fcs-cat-seo-inner strong { color: var(--fcs-prune, #2a1620); } /* étude 3 (06/08) : aucune règle n'existait pour <strong> dans cette description de catégorie (contenu texte réel) — mesuré fg=#f1919c (2,27:1) en Lighthouse réel sur /categorie-produit/lingerie/ */

.fcs-cat-seo-toggle { display: none; } /* bouton "Lire la suite" : mobile uniquement, section 10 */

/* ============================================================
   10. Version mobile (≤767px) — seuil cohérent avec mobile-ux.css /
   refonte-header.css
   ============================================================ */
@media only screen and (max-width: 767px) {
  .template-shop .container { gap: 0; }
  .template-shop .container > main.template-shop { flex-basis: 100%; }

  .template-shop .woocommerce-products-header { padding: 20px 16px 14px; }
  .woocommerce-products-header__title.page-title { font-size: 40px; }
  .fcs-cat-teaser { font-size: 13.5px; }
  .breadcrumb.breadcrumbs .breadcrumb-trail { padding: 0 16px; }

  .fcs-cat-toolbar { padding: 14px 16px; margin-bottom: 14px; }
  .fcs-cat-toolbar-left { gap: 12px; }
  .fcs-cat-filters-toggle-desktop { display: none; } /* le repli desktop n'a pas de sens en tiroir mobile */

  .fcs-cat-filters-toggle-mobile {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    min-height: 46px;
    padding: 0 18px;
    border: 1.5px solid var(--fcs-rose);
    border-radius: var(--fcs-radius-pill);
    font-family: var(--fcs-font-text);
    font-size: 14px;
    font-weight: 600;
    color: var(--fcs-framboise);
    background: none;
    cursor: pointer;
  }
  .fcs-cat-filters-badge {
    background: var(--fcs-framboise);
    color: var(--fcs-white);
    font-size: 11px;
    font-weight: 700;
    min-width: 18px;
    height: 18px;
    border-radius: 999px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 4px;
  }
  .fcs-cat-active-filters { padding: 0 16px 14px; }

  .product-sorting.avia-product-sorting { padding: 0 16px; margin-bottom: 14px; }
  .product-sorting .currently-selected { width: 100%; justify-content: space-between; }
  .product-sorting .sort-param { display: block; width: 100%; }

  .template-shop main.template-shop ul.products { grid-template-columns: repeat(2, 1fr); gap: 16px 12px; padding: 0 16px; }
  .template-shop nav.pagination { padding: 20px 16px 8px; justify-content: center; }

  .fcs-cat-seo { padding: 28px 0 34px; }
  .fcs-cat-seo-inner { padding: 0 16px; }
  .fcs-cat-seo-inner h1, .fcs-cat-seo-inner h2 { font-size: 22px; }
  .fcs-cat-seo-inner p { font-size: 15px; }

  /* --- Clamp CSS "Lire la suite" : ne modifie pas le texte, en cache une
     partie visuellement. Le texte complet reste dans le HTML dès le
     chargement (bon pour le SEO), le clic ne fait que retirer le clamp —
     décalage exempt de CLS (hadRecentInput, dans les 500ms d'un clic réel). */
  .fcs-cat-seo-inner {
    max-height: 165px; /* ~3-4 lignes de titre+intro selon la police */
    overflow: hidden;
    position: relative;
    mask-image: linear-gradient(to bottom, #000 60%, transparent 100%);
    -webkit-mask-image: linear-gradient(to bottom, #000 60%, transparent 100%);
  }
  .fcs-cat-seo.fcs-cat-seo--expanded .fcs-cat-seo-inner {
    max-height: none;
    mask-image: none;
    -webkit-mask-image: none;
  }
  .fcs-cat-seo-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: calc(100% - 32px);
    margin: 14px 16px 0;
    min-height: 46px;
    border: 1.5px solid var(--fcs-rose);
    border-radius: var(--fcs-radius-pill);
    background: none;
    font-family: var(--fcs-font-text);
    font-size: 14.5px;
    font-weight: 600;
    color: var(--fcs-framboise);
    cursor: pointer;
  }
  .fcs-cat-seo-toggle .fcs-chev { font-size: 12px; transition: transform var(--fcs-duration-fast) var(--fcs-ease-out); }
  .fcs-cat-seo--expanded .fcs-cat-seo-toggle .fcs-chev { transform: rotate(180deg); }

  /* --- Tiroir de filtres (même mécanique d'ouverture que le tiroir de nav
     de l'étape 2 : classe sur <html>, transform + backdrop, JS identique
     en plus léger). L'aside natif devient l'off-canvas — un seul DOM, pas
     de doublon de widgets/ID, juste repositionné en CSS. ---
     Préfixe `#top #main` OBLIGATOIRE sur ce sélecteur (et non un !important,
     correctif affiné par refonte-compat le 02/08/2026 suite au premier
     retour de refonte-perf) : la règle native Enfold
     `.responsive #top #main .sidebar{display:none}` (2 ID + 2 classes, même
     media max-width:767px) bat toute règle sans ID — sans le préfixe, l'aside
     reste display:none en permanence sur mobile et le tiroir ne s'affiche
     jamais, quel que soit le transform/z-index (bug confirmé pur combat de
     spécificité, aucun rapport avec fixed/transform). Méthode : matcher la
     spécificité d'Enfold (2 ID) avec plus de classes que lui (3 ici contre 2
     chez Enfold), cohérent avec la convention "pas de !important" déjà
     appliquée au repli desktop juste au-dessus dans ce fichier. */
  #top #main .template-shop .container > aside.sidebar {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    top: 52px;
    background: #fdfbfa;
    border-radius: 22px 22px 0 0;
    box-shadow: 0 -18px 50px rgba(42, 22, 32, .3);
    z-index: 999;
    flex-basis: auto;
    transform: translateY(100%);
    transition: transform .3s var(--fcs-ease-out);
    display: flex;
    flex-direction: column;
    overflow: hidden;
  }
  /* Même préfixe `#top #main` que la règle de base ci-dessus, sinon cette
     règle d'état (0 ID) perd maintenant face à elle (2 ID) et le tiroir
     resterait toujours translateY(100%) — piège trouvé en test réel juste
     après avoir corrigé la règle de base, avant livraison. */
  html.fcs-filters-open #top #main .template-shop .container > aside.sidebar { transform: translateY(0); }
  html.fcs-filters-open { overflow: hidden; }

  .fcs-filters-backdrop {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(42, 22, 32, .45);
    z-index: 998;
  }
  html.fcs-filters-open .fcs-filters-backdrop { display: block; }

  .template-shop .inner_sidebar { flex: 1; overflow-y: auto; padding: 0 16px 90px; }

  .fcs-filters-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 12px 4px;
    border-bottom: 1px solid var(--fcs-border);
    margin-bottom: 4px;
    position: sticky;
    top: 0;
    background: #fdfbfa;
    z-index: 1;
  }
  .fcs-filters-title { font-family: var(--fcs-font-title); font-size: 20px; color: var(--fcs-prune); }
  .fcs-filters-close {
    width: 44px;
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 20px;
    color: var(--fcs-text-subtle);
    background: none;
    border: 0;
    cursor: pointer;
  }
  .fcs-filters-foot {
    display: flex;
    gap: 12px;
    padding: 14px 16px;
    background: var(--fcs-white);
    border-top: 1px solid var(--fcs-border);
    box-shadow: 0 -6px 20px rgba(42, 22, 32, .06);
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2;
    transform: translateY(100%);
    transition: transform .3s var(--fcs-ease-out);
  }
  html.fcs-filters-open .fcs-filters-foot { transform: translateY(0); }
  .fcs-filters-cancel,
  .fcs-filters-apply {
    flex: 1;
    min-height: 50px;
    border-radius: var(--fcs-radius-pill);
    font-family: var(--fcs-font-text);
    font-size: 14.5px;
    font-weight: 600;
    cursor: pointer;
  }
  .fcs-filters-cancel { background: none; border: 1.5px solid var(--fcs-border); color: var(--fcs-text-secondary); }
  .fcs-filters-apply { flex: 1.6; background: var(--fcs-framboise); border: 0; color: var(--fcs-white); }
}

/* Correctif refonte-compat (02/08/2026, non bloquant, sur le même modèle que
   le correctif WhatsApp de l'étape 2 dans refonte-header.css) : le badge
   flottant Société des Avis Garantis (`.agJsWidget`, injecté côté client par
   le script tiers wcsag-widget-js — position fixed bas-droite, z-index 9990,
   PAS dans le HTML servi par le serveur, jamais touché ici) recouvre le coin
   droit du bouton "Voir les N articles" du pied du tiroir de filtres mobile
   (`.fcs-filters-foot`, z-index 2) quand le tiroir est ouvert — zone morte
   au clic. Masqué simplement tant que le tiroir est ouvert ; réapparaît à la
   fermeture (classe `fcs-filters-open` déjà posée/retirée par
   refonte-categorie.js sur <html>, aucun changement JS nécessaire, aucun
   réglage du widget tiers touché).
   `!important` nécessaire ICI (cause différente du cas aside.sidebar plus
   haut, qui l'évite par préfixe `#top #main`) : le widget injecte SON PROPRE
   `<style>` inline avec `.agJsWidget{display:block !important;...}` (trouvé
   en inspectant `document.styleSheets` en conditions réelles) — un
   `!important` tiers ne peut être battu que par un `!important`, la
   spécificité seule (même avec ID) n'y change rien. */
html.fcs-filters-open .agJsWidget {
  display: none !important;
}

/* Focus clavier visible partout dans ce gabarit */
.template-shop a:focus-visible,
.template-shop button:focus-visible,
.template-shop select:focus-visible {
  outline: 2px solid var(--fcs-framboise);
  outline-offset: 2px;
}

/* ============================================================
   CORRECTIF 03/08/2026 — même piège que refonte-home.css (voir ce fichier
   pour l'explication complète) : #top #wrap_all .all_colors h1/h2/h3
   (spécificité 2 ID + 1 classe + 1 élément, posé par Enfold) battait nos
   propres déclarations ci-dessus (1-2 classes seulement), forçant TOUT en
   birthstone-regular-ttf géant (80/70/40px) au lieu des valeurs déjà
   déclarées plus haut. Rejoue les MÊMES valeurs avec le préfixe
   #top #main.all_colors, sans changer aucun choix de police :
   - h1.page-title : Birthstone CONSERVÉ (confirmé conforme à la maquette
     V2.5, frame "categorie" — `<h1 style="font-family:'Birthstone'...
     font-size:76px">Robes grande taille</h1>` — un titre de catégorie est un
     des rares cas où la maquette valide elle-même le script, contrairement
     aux titres de section de l'accueil corrigés en Marcellus/Jost).
   - .fcs-cat-seo-inner h1/h2/h3, .widgettitle : Marcellus/Jost déjà
     déclarés plus haut, juste jamais appliqués à l'écran.
   ============================================================ */
#top #main.all_colors h1.page-title.woocommerce-products-header__title {
  font-family: var(--fcs-font-script);
  font-size: 64px;
  font-weight: 400;
}
#top #main.all_colors .fcs-cat-seo-inner h1,
#top #main.all_colors .fcs-cat-seo-inner h2 {
  font-family: var(--fcs-font-title);
  font-size: 30px;
  font-weight: 400;
}
#top #main.all_colors .fcs-cat-seo-inner h3 {
  font-family: var(--fcs-font-text);
  font-size: 18px;
  font-weight: 600;
}
#top #main.all_colors .template-shop h3.widgettitle {
  font-family: var(--fcs-font-text);
  font-size: 13px;
  font-weight: 600;
}

@media only screen and (max-width: 767px) {
  #top #main.all_colors h1.page-title.woocommerce-products-header__title { font-size: 40px; }
  #top #main.all_colors .fcs-cat-seo-inner h1,
  #top #main.all_colors .fcs-cat-seo-inner h2 { font-size: 22px; }
}

/* ============================================================
   CORRECTIF 03/08/2026 (retour gérante) : les FILTRES passent À GAUCHE,
   conformément à la maquette (le réglage Enfold natif est d'ailleurs
   sidebar_left). Simple échange d'ordre flex — le tiroir mobile
   (position:fixed sous 768px) n'est pas concerné par l'ordre.
   ============================================================ */
.template-shop .container > aside.sidebar { order: 2; }
.template-shop .container > main.template-shop { order: 3; }

/* CORRECTIF 03/08/2026 — le titre de catégorie était INVISIBLE : le CSS
   généré Enfold (avia-merged-styles) pose `.template-shop .page-title
   {display:none}` (masquage natif des titres d'archives boutique). Nos
   règles stylaient la police sans jamais déclarer display — on ne gagne
   pas une propriété qu'on ne déclare pas. */
#top #main.all_colors h1.page-title.woocommerce-products-header__title { display: block; }
@media only screen and (max-width: 767px) {
  /* Enfold force h1 35px !important sous 768px (constaté étape 8) */
  #top #main.all_colors h1.page-title.woocommerce-products-header__title { font-size: 40px !important; }
}
