/*
Theme Name: Boizar
Theme URI: https://example.com/boizar
Author: Boizar
Description: Thème WooCommerce sur mesure, esthétique éditoriale et minimaliste (fond clair, typographie fine, boutons carrés) inspirée du mobilier design haut de gamme.
Version: 1.25.6
Requires at least: 6.0
Requires PHP: 7.4
Text Domain: boizar
*/

/* ==========================================================================
   Design tokens
   ========================================================================== */
:root {
    --color-bg: #ffffff;
    --color-bg-alt: #efece6;
    --color-text: #2e2e2e;
    --color-text-strong: #191919;
    --color-border: #e2ded4;
    --color-accent: #1a1a1a;
    --color-on-accent: #ffffff;
    --color-muted: #767676;
    --color-sale: #b23b3b;

    --font-base: 'Jost', 'Helvetica Neue', Arial, sans-serif;

    --radius: 0px;
    --tracking-wide: 0.08em;
    --tracking-wider: 0.14em;

    /* Pleine largeur d'écran : seule une marge latérale sépare le contenu
       du bord, proportionnelle à la taille de l'écran. */
    --container-max: 100%;
    --gutter: clamp(12px, 1vw, 20px);

    --transition: 200ms ease;
}

/* ==========================================================================
   Reset / base
   ========================================================================== */
*, *::before, *::after { box-sizing: border-box; }

html { scroll-behavior: smooth; }

/* La page ne doit jamais dépasser la largeur de l'écran : sans cela, un
   panneau hors-champ suffit à élargir le document, et le mobile laisse
   dézoomer sur une bande vide.
   « clip » et non « hidden » : hidden ferait de la racine un conteneur de
   défilement, ce qui casserait le position:sticky de la colonne d'achat. */
html,
body {
    max-width: 100%;
    overflow-x: clip;
}

body {
    margin: 0;
    background: var(--color-bg);
    color: var(--color-text);
    font-family: var(--font-base);
    font-weight: 300;
    font-size: 16px;
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
}

img { max-width: 100%; height: auto; display: block; }

a {
    color: inherit;
    text-decoration: none;
    transition: color var(--transition), opacity var(--transition);
}

ul { list-style: none; margin: 0; padding: 0; }

h1, h2, h3, h4, h5, h6 {
    font-family: var(--font-base);
    font-weight: 400;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
    margin: 0 0 16px;
}

h1 { font-size: 28px; }
h2 { font-size: 22px; }
h3 { font-size: 17px; }

p { margin: 0 0 16px; }

.container {
    max-width: var(--container-max);
    margin-inline: auto;
    padding-inline: var(--gutter);
}

/* ==========================================================================
   Buttons
   ========================================================================== */
.btn,
a.button,
button.button,
input[type="submit"],
.woocommerce #respond input#submit,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    background: var(--color-accent);
    color: var(--color-on-accent) !important;
    border: 1px solid var(--color-accent);
    border-radius: var(--radius);
    padding: 14px 28px;
    font-family: var(--font-base);
    font-size: 12px;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wider);
    cursor: pointer;
    transition: background var(--transition), color var(--transition);
}

.btn:hover,
a.button:hover,
button.button:hover,
input[type="submit"]:hover,
.woocommerce #respond input#submit:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover {
    background: var(--color-bg);
    color: var(--color-accent) !important;
}

/* <body> porte la classe "woocommerce" (ajoutée par WC) : .woocommerce
   button.button ci-dessus a donc une spécificité plus élevée (2 classes +
   tag) que button.button seul. On la ré-égale explicitement ici pour que
   l'ordre du fichier (celle-ci vient après) suffise à gagner. */
.btn--outline,
button.btn--outline,
a.btn--outline,
input.btn--outline,
.woocommerce button.btn--outline,
.woocommerce a.btn--outline,
.woocommerce input.btn--outline {
    background: transparent !important;
    color: var(--color-accent) !important;
}
.btn--outline:hover,
button.btn--outline:hover,
a.btn--outline:hover,
input.btn--outline:hover,
.woocommerce button.btn--outline:hover,
.woocommerce a.btn--outline:hover,
.woocommerce input.btn--outline:hover {
    background: var(--color-accent) !important;
    color: var(--color-on-accent) !important;
}

/* ==========================================================================
   Top announcement bar
   ========================================================================== */
.announcement-bar {
    background: var(--color-accent);
    color: var(--color-on-accent);
    text-align: center;
    font-size: 12px;
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    padding: 10px var(--gutter);
}

/* Widget Trustpilot (voir boizar_trustpilot_widget, inc/trustpilot.php) : la
   largeur 100% du widget se cale sur .trustpilot-widget, qu'on centre et
   limite ici plutôt que de laisser un iframe s'étirer sur toute la largeur
   de l'écran. Moins de padding vertical : le widget a déjà sa propre hauteur. */
.announcement-bar--trustpilot {
    display: flex;
    justify-content: center;
    padding-block: 6px;
}
.announcement-bar--trustpilot .trustpilot-widget {
    max-width: 320px;
    width: 100%;
}

/* ==========================================================================
   Site header
   ========================================================================== */
/* Header non fixe : il reste en haut de la page et défile avec le contenu. */
.site-header {
    border-bottom: 1px solid var(--color-border);
    background: var(--color-bg);
    position: relative;
    z-index: 50;
}

/* Hauteur calée sur 44 px, comme les sites de référence : 32 px de contenu
   (le plus haut étant les boutons d'action) plus 6 px de marge de chaque côté. */
.site-header__inner {
    display: flex;
    align-items: center;
    padding-block: 6px;
    gap: 16px;
}

/* Le logo se place juste à droite du bouton menu ; la marge automatique
   repousse les actions (recherche, compte, panier) vers la droite. */
.site-branding { margin-right: auto; }

.site-branding a {
    font-size: 18px;
    font-weight: 500;
    letter-spacing: var(--tracking-wider);
    text-transform: uppercase;
    color: var(--color-text-strong);
}

.header-actions {
    display: flex;
    align-items: center;
    gap: 4px;
}

/* Actions en icônes : le libellé texte faisait déborder l'en-tête sur mobile.
   Le nom accessible est porté par aria-label + .screen-reader-text. */
/* padding réduit de 8 à 6 px : c'est ce qui déterminait la hauteur de la barre,
   les boutons étant les éléments les plus hauts. */
.header-actions a,
.header-actions button {
    position: relative;
    background: none;
    border: none;
    padding: 6px;
    color: var(--color-text-strong);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.header-actions a:hover,
.header-actions button:hover { color: var(--color-muted); }

.header-actions .icon { display: block; }

/* Pastille de comptage, en haut à droite de l'icône panier / favoris. */
.cart-contents .cart-count,
.wishlist-contents .wishlist-count {
    position: absolute;
    top: 2px;
    right: 0;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    border-radius: 999px;
    background: var(--color-accent);
    color: var(--color-on-accent);
    font-size: 10px;
    line-height: 16px;
    text-align: center;
    font-weight: 500;
}

.cart-contents .cart-count.is-empty,
.wishlist-contents .wishlist-count.is-empty { display: none; }

/* Bouton hamburger — déclenche le drawer de catégories, visible sur bureau et mobile. */
.menu-toggle {
    display: inline-flex;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    background: none;
    border: none;
    cursor: pointer;
    padding: 4px;
}
.menu-toggle span {
    width: 22px;
    height: 1px;
    background: var(--color-text-strong);
}

/* ==========================================================================
   Hero / editorial banner
   ========================================================================== */
.hero {
    position: relative;
    background: var(--color-bg-alt);
    display: grid;
    grid-template-columns: 1fr 1fr;
    min-height: 480px;
    align-items: stretch;
}

.hero__media { overflow: hidden; }
.hero__media img { width: 100%; height: 100%; object-fit: cover; }

.hero__content {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    padding: 72px clamp(32px, 5vw, 80px);
    gap: 18px;
}

.hero__eyebrow {
    font-size: 12px;
    letter-spacing: var(--tracking-wider);
    text-transform: uppercase;
    color: var(--color-muted);
}

.hero__title {
    font-size: clamp(26px, 2.4vw, 36px);
    line-height: 1.25;
    max-width: 22ch;
    margin: 0;
}

.hero__text {
    font-weight: 300;
    color: var(--color-text);
    max-width: 46ch;
    margin: 0;
}

/* Le bouton ne doit pas s'étirer sur toute la colonne (align-items: flex-start). */
.hero__content .btn { margin-top: 8px; }

@media (max-width: 900px) {
    .hero { grid-template-columns: 1fr; min-height: auto; }
    .hero__content { padding: 40px var(--gutter); }
}

/* ==========================================================================
   Category tiles
   ========================================================================== */
.category-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 2px;
    background: var(--color-border);
}

.category-tile {
    position: relative;
    background: var(--color-bg);
    aspect-ratio: 2 / 3;
    overflow: hidden;
}

.category-tile img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 400ms ease;
}

.category-tile:hover img { transform: scale(1.05); }

.category-tile__label {
    position: absolute;
    left: 16px;
    bottom: 16px;
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
    background: rgba(255, 255, 255, 0.85);
    padding: 8px 14px;
}

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

/* ==========================================================================
   Section heading
   ========================================================================== */
.section {
    padding-block: 64px;
}

.section__head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    margin-bottom: 32px;
}

.section__head h2 { margin: 0; }

.section__head a {
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    border-bottom: 1px solid var(--color-text-strong);
    padding-bottom: 2px;
}

/* ==========================================================================
   WooCommerce — product grid / cards
   ========================================================================== */
ul.products {
    display: grid !important;
    grid-template-columns: repeat(4, 1fr);
    /* Écart resserré : l'horizontal peut être très faible, le vertical doit
       garder de quoi séparer le prix d'une carte de l'image de la suivante. */
    gap: 12px 6px;
    margin: 0 !important;
    padding: 0 !important;
}

ul.products li.product {
    width: auto !important;
    margin: 0 !important;
    float: none !important;
    list-style: none;
    /* Colonne flex : le bouton reste aligné en bas quel que soit le nombre
       de lignes du titre. */
    display: flex;
    flex-direction: column;
}

ul.products li.product > a:first-of-type { flex: 1; }

/* Galerie de carte produit — image principale + jusqu'à 2 images secondaires.
   Desktop : la 2e image apparaît au survol. Mobile : carrousel swipable
   (jusqu'à 3 images), même mécanique que la galerie de fiche produit. */
.boizar-loop-gallery {
    position: relative;
    aspect-ratio: 2 / 3;
    overflow: hidden;
    border-radius: var(--radius);
    margin-bottom: 12px;
    background: var(--color-bg-alt);
}

.boizar-loop-gallery__img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

@media (min-width: 701px) {
    .boizar-loop-gallery__img {
        position: absolute;
        inset: 0;
        opacity: 0;
        transition: opacity 0.25s ease;
    }

    .boizar-loop-gallery__img:first-child { opacity: 1; }

    /* Au-delà de 2 images, les suivantes n'alimentent que le carrousel mobile. */
    .boizar-loop-gallery__img:nth-child(n + 3) { display: none; }

    li.product:hover .boizar-loop-gallery__img:first-child { opacity: 0; }
    li.product:hover .boizar-loop-gallery__img:nth-child(2) { opacity: 1; }
}

@media (max-width: 700px) {
    .boizar-loop-gallery {
        display: flex;
        overflow-x: auto;
        scroll-snap-type: x mandatory;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
    }

    .boizar-loop-gallery::-webkit-scrollbar { display: none; }

    .boizar-loop-gallery__img {
        flex: 0 0 100%;
        scroll-snap-align: start;
    }
}

ul.products li.product .woocommerce-loop-product__title {
    font-size: 13px;
    font-weight: 400;
    letter-spacing: normal;
    color: var(--color-text);
    margin: 0 0 4px;
    line-height: 1.35;
}

ul.products li.product .price {
    display: flex;
    flex-direction: column;
    font-size: 13px;
    font-weight: 400;
    color: var(--color-text-strong);
}

ul.products li.product .price del {
    display: block;
    order: 1;
    color: var(--color-muted);
    text-decoration: line-through;
    opacity: 1;
    margin-right: 0;
    font-size: 12px;
}

ul.products li.product .price ins {
    display: block;
    order: 2;
    text-decoration: none;
    font-weight: 600;
    color: var(--color-text-strong);
}

/* Badge "Special Price" (voir woocommerce_sale_flash, functions.php) — même
   couleur et forme carrée que sur la fiche produit (.boizar-special-price
   plus bas), mais flottant en haut à gauche de l'image comme l'était l'ancien
   badge "Promo". */
ul.products li.product .onsale {
    position: absolute;
    top: 12px;
    left: 12px;
    background: #d18a6b;
    color: var(--color-text-strong);
    font-size: 10px;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    border-radius: 0;
    min-height: auto;
    min-width: auto;
    line-height: 1.4;
    padding: 4px 8px;
}

ul.products li.product {
    position: relative;
}

span.onsale { top: 12px; left: 12px; }

/* Fiche produit : badge "Special Price" au-dessus du titre, repris de Sklum
   (même couleur terracotta, même carré sans arrondi — voir
   woocommerce_show_product_sale_flash, functions.php). En position normale
   dans le fil du résumé, pas flottant : pas besoin de position/top/left. */
.boizar-special-price {
    display: inline-block;
    /* .summary est en display:flex sur mobile (voir plus bas, pour faire
       remonter les variations au-dessus du titre) : un enfant flex direct
       s'étire par défaut sur l'axe transversal, donc en largeur ici — sans
       quoi ce badge, pensé pour ne tenir que la taille de son texte,
       remplirait toute la largeur. Ciblé sur ce seul badge plutôt que sur
       tout .summary, pour ne pas affecter les autres enfants (bouton
       d'achat, champs...) qui doivent au contraire garder leur pleine
       largeur. */
    align-self: flex-start;
    margin: 0 0 10px;
    padding: 4px 8px;
    background: #d18a6b;
    color: var(--color-text-strong);
    font-size: 11px;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    border-radius: 0;
    min-height: auto;
    min-width: auto;
    line-height: 1.4;
}

/* ==========================================================================
   Favoris — bouton signet (carte produit, fiche produit)
   ========================================================================== */
.wishlist-toggle {
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    color: var(--color-text-strong);
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

.wishlist-toggle .icon { display: block; }

/* Vide par défaut (voir boizar_icon), remplie une fois le produit enregistré. */
.wishlist-toggle svg { fill: none; transition: fill 150ms ease; }
.wishlist-toggle.is-active svg { fill: currentColor; }

/* Carte produit : signet flottant en haut à droite de l'image, symétrique du
   badge promo (span.onsale, en haut à gauche). ul.products li.product est
   déjà en position: relative (ligne ~523). */
.wishlist-toggle--card {
    position: absolute;
    top: 12px;
    right: 12px;
    z-index: 2;
    width: 32px;
    height: 32px;
    border-radius: 50%;
    justify-content: center;
    background: transparent;
}

.wishlist-toggle--card:hover { background: rgba(255, 255, 255, 0.15); }

/* Fiche produit : icône seule, flottante à droite du titre — jamais de
   texte, sur ordinateur comme sur mobile. Ancrée sur .boizar-title-row (voir
   woocommerce/single-product/title.php), pas sur .summary : ça la fait
   suivre le titre partout où il se trouve, y compris quand .summary devient
   flex sur mobile et réordonne ses enfants (les variations passent devant le
   titre — voir @media max-width:900px plus bas). */
.boizar-title-row { position: relative; }

.wishlist-toggle--single {
    position: absolute;
    top: 0;
    right: 0;
    width: 36px;
    height: 36px;
    justify-content: center;
    color: var(--color-muted);
}

.wishlist-toggle--single:hover { color: var(--color-text-strong); }
.wishlist-toggle--single.is-active { color: var(--color-text-strong); }
.wishlist-toggle--single svg { width: 24px; height: 24px; }

/* Espace réservé à droite pour que le titre ne passe jamais sous l'icône. */
.woocommerce div.product .product_title { padding-right: 44px; }

/* ==========================================================================
   Page /favoris/
   ========================================================================== */
.wishlist-page__title {
    text-transform: none;
    font-weight: 500;
    letter-spacing: normal;
    font-size: 28px;
    margin: 0 0 32px;
}

.wishlist-empty { color: var(--color-muted); }

/* ==========================================================================
   Catégorie — pastilles de sous-catégories + barre outils (tri / compteur)
   ========================================================================== */
.woocommerce-products-header__title.page-title {
    text-transform: none;
    font-weight: 500;
    letter-spacing: normal;
    font-size: 28px;
    margin: 0;
}

/* Titre de page + bouton de tri sur une même ligne (functions.php). */
.shop-header-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
}

.subcat-pills {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin: 24px 0 40px;
}

.subcat-pill {
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    padding: 8px 16px;
    border: 1px solid var(--color-border);
    color: var(--color-text);
    white-space: nowrap;
}

.subcat-pill:hover,
.subcat-pill--active {
    background: var(--color-accent);
    border-color: var(--color-accent);
    color: var(--color-on-accent);
}


/* La grille étant en pleine largeur, on augmente le nombre de colonnes sur les
   grands écrans plutôt que d'étirer quatre cartes démesurées. */
@media (min-width: 1600px) {
    ul.products { grid-template-columns: repeat(5, 1fr); }
}
@media (min-width: 2000px) {
    ul.products { grid-template-columns: repeat(6, 1fr); }
}
@media (max-width: 1100px) {
    ul.products { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 700px) {
    ul.products { grid-template-columns: repeat(2, 1fr); gap: 10px 8px; }
}

/* Boutique / catégorie : marges latérales plus resserrées que le reste du
   site pour rapprocher la grille produits des bords. */
.post-type-archive-product .container,
.tax-product_cat .container,
.tax-product_tag .container {
    --gutter: clamp(8px, 1.5vw, 14px);
}

/* Sur mobile, le titre de la page catégorie/boutique doit rester proche du
   menu : on réduit uniquement le padding du haut (le bas reste à 64px). */
@media (max-width: 700px) {
    .post-type-archive-product .container.section,
    .tax-product_cat .container.section,
    .tax-product_tag .container.section {
        padding-top: 20px;
    }
}

/* ==========================================================================
   Single product — galerie / infos deux colonnes, swatches, onglets
   ========================================================================== */
/* En version web, la fiche produit garde le padding générique de .section
   (64px) hérité de woocommerce.php : trop d'écart avec le header, qui n'a
   rien à faire là puisque la galerie n'a pas besoin de cette respiration.
   Le mobile a déjà son propre 0 (ligne ~1213, header en surimpression). */
@media (min-width: 901px) {
    body.single-product .container.section {
        padding-top: 24px;
    }

    /* Fil d'Ariane au-dessus de la galerie, comme sur Sklum. */
    body.single-product .woocommerce-breadcrumb {
        margin-bottom: 16px;
    }
}

/* Absent en mobile (comme sur Sklum, u-hidden@sm--down) : la fiche produit y
   est en immersion, header transparent posé sur l'image (voir .has-overlay-header
   plus bas) — un fil d'Ariane texte n'a pas sa place dans cette mise en page. */
@media (max-width: 900px) {
    body.single-product .woocommerce-breadcrumb {
        display: none;
    }
}

/* Bloc haut de fiche : galerie + colonne d'achat. Les onglets et les produits
   liés restent en dehors, en pleine largeur. Répartition reprise de Sklum
   (bureau Serpi) : les deux colonnes sont en flex:1 1 auto, mais chacune
   plafonnée à sa propre largeur maximale — la galerie ne dépasse jamais 60%
   du bloc, la colonne d'achat jamais 600px (au-delà, une colonne de texte
   devient illisible) — c'est ce double plafond, pas un simple partage 50/50,
   qui donne la proportion ~60/40 vue chez eux. */
.woocommerce div.product .product-main {
    display: flex;
    /* Même distance qu'à droite de la colonne d'achat (marge de page,
       --gutter) — pas un espacement propre à ce bloc. */
    gap: var(--gutter);
    align-items: start;
}

.woocommerce div.product .product-main > .boizar-gallery {
    flex: 1 1 auto;
    max-width: 60%;
}

.woocommerce div.product .product-main > .summary {
    flex: 1 1 auto;
    max-width: 600px;
}

/* Galerie produit — grille 2 colonnes sur desktop, carrousel sur mobile.
   Toutes les images sont en portrait 2:3. */
.boizar-gallery {
    opacity: 1 !important;
    position: relative; /* Ancre le badge "Promo" (span.onsale, plus bas). */
}

/* Grille à 2 colonnes régulières : chaque image occupe toujours la moitié de
   la largeur. Remplace le motif alterné 2-3 précédent, dont les groupes de 5
   images ne se complétaient jamais pour une galerie de variation (2, 3, 4...
   photos selon ce que l'administrateur a renseigné) — la dernière rangée
   incomplète laissait alors un vide sur la largeur restante. */
.boizar-gallery__track {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 3px;
}

.boizar-gallery .woocommerce-product-gallery__image,
.boizar-gallery .woocommerce-product-gallery__image--placeholder {
    margin: 0;
    overflow: hidden;
    background: var(--color-bg-alt);
}

.boizar-gallery .woocommerce-product-gallery__image a { display: block; }

.boizar-gallery .woocommerce-product-gallery__image img,
.boizar-gallery .woocommerce-product-gallery__image--placeholder img {
    width: 100%;
    aspect-ratio: 2 / 3;
    object-fit: cover;
    border-radius: var(--radius);
}

/* Une image seule occupe toute la largeur. */
.boizar-gallery .woocommerce-product-gallery__image:only-child { grid-column: 1 / -1; }

/* Bouton « Voir plus de photos » — masqué par défaut, activé en desktop ci-dessous. */
.boizar-gallery__more { display: none; }

@media (min-width: 901px) {
    /* Seules les 5 premières images (un cycle complet du motif 2+3) sont
       visibles au chargement ; le bouton révèle le reste. */
    .boizar-gallery:not(.is-expanded) .woocommerce-product-gallery__image:nth-child(n + 6) {
        display: none;
    }

    .boizar-gallery__more {
        display: block;
        width: 100%;
        margin-top: 3px;
        padding: 14px;
        border: 1px solid var(--color-border);
        background: none;
        font-family: var(--font-base);
        font-size: 12px;
        text-transform: uppercase;
        letter-spacing: var(--tracking-wide);
        color: var(--color-text-strong);
        cursor: pointer;
    }

    .boizar-gallery__more:hover { background: var(--color-bg-alt); }

    .boizar-gallery.is-expanded .boizar-gallery__more { display: none; }
}

/* La galerie défile normalement ; c'est la colonne d'achat qui reste visible. */
.woocommerce div.product div.summary {
    position: sticky;
    top: 24px;
}

.woocommerce div.product .woocommerce-tabs { margin-top: 64px; }

.woocommerce div.product .related,
.woocommerce div.product .upsells {
    margin-top: 64px;
    padding-top: 48px;
    border-top: 1px solid var(--color-border);
}

.woocommerce div.product .related > h2,
.woocommerce div.product .upsells > h2 {
    font-size: 18px;
    margin-bottom: 28px;
}

.woocommerce div.product .product-collection {
    display: block;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wider);
    color: var(--color-muted);
    margin-bottom: 6px;
}

.woocommerce div.product .product_title {
    text-transform: none;
    letter-spacing: normal;
    font-weight: 400;
    font-size: 26px;
    line-height: 1.25;
    margin-bottom: 12px;
}

.woocommerce div.product .product-ref {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
    margin: -12px 0 18px;
}

.woocommerce div.product .product-subtitle {
    font-size: 15px;
    font-weight: 300;
    color: var(--color-muted);
    margin: -8px 0 12px;
    line-height: 1.5;
}

.woocommerce div.product .product-delivery {
    font-size: 13px;
    color: var(--color-text);
    padding: 12px 14px;
    background: var(--color-bg-alt);
    margin-bottom: 20px;
}

/* Aucun délai renseigné : on n'affiche pas d'encart vide. */
.woocommerce div.product .product-delivery.is-empty { display: none; }

/* ==========================================================================
   Onglets produit — liste de lignes + panneau latéral
   ========================================================================== */
.product-tabs {
    margin-top: 24px;
    border-top: 1px solid var(--color-border);
}

.product-tab { border-bottom: 1px solid var(--color-border); }

.product-tab__trigger {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    width: 100%;
    padding: 16px 0;
    background: none;
    border: none;
    cursor: pointer;
    font-family: var(--font-base);
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
    text-align: left;
}

.product-tab__trigger:hover { color: var(--color-muted); }

/* Casse normale (Description, Dimensions...) plutôt que MAJUSCULES,
   contrairement au reste du texte des déclencheurs de tiroir. */
.product-tab__label { text-transform: none; }

.product-tab__chevron {
    font-size: 20px;
    line-height: 1;
    color: var(--color-muted);
}

/* Surcouche partagée par tous les panneaux. */
.tab-drawer-overlay {
    position: fixed;
    inset: 0;
    background: rgba(25, 25, 25, 0.4);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--transition);
    z-index: 110;
}

.tab-drawer-overlay.is-open {
    opacity: 1;
    visibility: visible;
}

.tab-drawer {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    max-width: 560px;
    display: flex;
    flex-direction: column;
    background: var(--color-bg);
    transform: translateX(100%);
    visibility: hidden;
    transition: transform 300ms ease, visibility 0s linear 300ms;
    z-index: 120;
    box-shadow: -2px 0 24px rgba(0, 0, 0, 0.08);
}

.tab-drawer.is-open {
    transform: translateX(0);
    visibility: visible;
    transition: transform 300ms ease, visibility 0s;
}

.tab-drawer__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 20px 24px;
    border-bottom: 1px solid var(--color-border);
    flex: 0 0 auto;
}

.tab-drawer__title {
    margin: 0;
    font-size: 15px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
}

.tab-drawer__close {
    background: none;
    border: none;
    padding: 4px;
    font-size: 26px;
    line-height: 1;
    color: var(--color-text-strong);
    cursor: pointer;
}

.tab-drawer__close:hover { color: var(--color-muted); }

.tab-drawer__body {
    padding: 24px;
    overflow-y: auto;
    flex: 1 1 auto;
    font-size: 15px;
    font-weight: 300;
    line-height: 1.7;
}

.tab-drawer__body img {
    margin: 16px 0;
    border-radius: var(--radius);
}

.tab-drawer__body :is(h2, h3, h4) {
    font-size: 14px;
    margin-top: 24px;
}

.tab-drawer__body ul { list-style: disc; padding-left: 20px; }
.tab-drawer__body ul li { margin-bottom: 6px; }

.tab-drawer__body table {
    width: 100%;
    border-collapse: collapse;
}

.tab-drawer__body th,
.tab-drawer__body td {
    padding: 10px 0;
    border-bottom: 1px solid var(--color-border);
    text-align: left;
    font-weight: 400;
}

/* Mobile : le panneau monte depuis le bas. */
@media (max-width: 900px) {
    .tab-drawer {
        top: auto;
        left: 0;
        right: 0;
        max-width: 100%;
        height: 85vh;
        transform: translateY(100%);
        box-shadow: 0 -2px 24px rgba(0, 0, 0, 0.12);
    }

    .tab-drawer.is-open { transform: translateY(0); }
}

/* Panneau « Avis » : modal centrée sur ordinateur (au lieu du tiroir latéral
   des autres panneaux) — voir boizar_render_reviews_drawer,
   inc/product-tabs.php, et woocommerce/single-product/rating.php pour son
   déclencheur. Réservé au-delà de 900px : en dessous, .tab-drawer--modal
   garde le comportement « tiroir depuis le bas » générique ci-dessus, sans
   quoi cette règle (même spécificité, mais plus tardive dans la feuille de
   style) l'emporterait aussi sur mobile. */
@media (min-width: 901px) {
    .tab-drawer--modal {
        top: 50%;
        left: 50%;
        right: auto;
        bottom: auto;
        width: 90%;
        max-width: 640px;
        max-height: 85vh;
        border-radius: var(--radius);
        transform: translate(-50%, -50%) scale(0.96);
        transition: transform 300ms ease, visibility 0s linear 300ms, opacity 300ms ease;
        opacity: 0;
    }

    .tab-drawer--modal.is-open {
        transform: translate(-50%, -50%) scale(1);
        opacity: 1;
        transition: transform 300ms ease, visibility 0s, opacity 300ms ease;
    }
}

/* Étoiles de notation (avis) : déjà stylées en Unicode dans
   assets/css/woocommerce.css (.star-rating), pas besoin d'y retoucher ici. */

/* Prix et bulle de note sur la même ligne — voir
   boizar_render_price_and_rating(), functions.php. */
.boizar-price-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 12px 16px;
    margin-bottom: 12px;
}

.woocommerce div.product .boizar-price-row p.price,
.woocommerce div.product .boizar-price-row span.price {
    margin: 0;
}

/* Bulle de note, tout à droite du prix — voir boizar_render_rating_trigger,
   inc/product-tabs.php, qui remplace le widget natif WooCommerce. */
.boizar-rating-trigger {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    width: auto;
    background: none;
    border: none;
    padding: 0;
    margin: 0;
    cursor: pointer;
    font-family: var(--font-base);
    font-size: 13px;
    text-transform: none;
    letter-spacing: normal;
    color: var(--color-muted);
}

.boizar-rating-trigger:hover { color: var(--color-text-strong); }

.boizar-rating-trigger .star-rating { margin: 0; }

.boizar-rating-trigger__average {
    font-weight: 600;
    color: var(--color-text-strong);
}

.boizar-rating-trigger__count { text-decoration: underline; }

/* ==========================================================================
   Panneau « Avis » — liste des avis + formulaire (générés par WooCommerce).
   ========================================================================== */

/* Récapitulatif : note globale sur la même ligne que la croix de fermeture
   (.tab-drawer__head est déjà en flex/space-between), mention de modération
   juste en dessous, en première ligne du panneau — voir
   boizar_render_reviews_drawer, inc/product-tabs.php. */
.boizar-reviews-summary__disclaimer {
    font-size: 12px;
    color: var(--color-muted);
    margin: 0 0 20px;
}

.boizar-reviews-summary__score {
    display: flex;
    align-items: center;
    gap: 8px;
}

.boizar-reviews-summary__average {
    font-size: 20px;
    font-weight: 600;
    color: var(--color-text-strong);
}

.boizar-reviews-summary__count {
    font-size: 13px;
    color: var(--color-muted);
}

.tab-drawer__body--reviews .woocommerce-Reviews-title,
.tab-drawer__body--reviews #reply-title {
    font-size: 14px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
    margin: 0 0 20px;
}

.tab-drawer__body--reviews #reply-title small a { color: var(--color-muted); }

.tab-drawer__body--reviews .commentlist { list-style: none; margin: 0 0 32px; padding: 0; }

.tab-drawer__body--reviews .commentlist > li + li { margin-top: 24px; padding-top: 24px; border-top: 1px solid var(--color-border); }

.tab-drawer__body--reviews .comment_container { display: flex; gap: 14px; }

/* Pas de photo de profil — voir woocommerce/single-product/review-meta.php
   pour le reste des métadonnées (achat vérifié, ville/pays). */
.tab-drawer__body--reviews .comment_container img.avatar { display: none; }

.tab-drawer__body--reviews .comment-text { flex: 1 1 auto; min-width: 0; }

.tab-drawer__body--reviews .comment-text .star-rating { margin-bottom: 8px; }

.tab-drawer__body--reviews .comment-text .meta {
    font-size: 12px;
    color: var(--color-muted);
    margin: 0 0 8px;
}

.tab-drawer__body--reviews .woocommerce-review__author { color: var(--color-text-strong); font-weight: 500; }

.boizar-review-verified {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: #1dd15e;
    font-style: normal;
    font-size: 12px;
    font-weight: 500;
}

.boizar-review-verified__badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: #1dd15e;
    color: #fff;
    font-size: 9px;
    line-height: 1;
    flex: 0 0 auto;
}

.boizar-review-location { color: var(--color-muted); }

.tab-drawer__body--reviews .description p { margin: 0; }

.tab-drawer__body--reviews .woocommerce-noreviews { font-size: 14px; color: var(--color-muted); }

/* Formulaire d'avis */
.tab-drawer__body--reviews #respond .comment-notes,
.tab-drawer__body--reviews #respond .comment-form-rating label,
.tab-drawer__body--reviews #respond p.comment-form-comment label,
.tab-drawer__body--reviews #respond p.comment-form-author label,
.tab-drawer__body--reviews #respond p.comment-form-email label {
    display: block;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
    margin-bottom: 6px;
}

.tab-drawer__body--reviews #respond .comment-notes { text-transform: none; letter-spacing: normal; margin-bottom: 16px; }

.tab-drawer__body--reviews #respond p { margin: 0 0 16px; }

.tab-drawer__body--reviews #respond select,
.tab-drawer__body--reviews #respond input[type="text"],
.tab-drawer__body--reviews #respond input[type="email"],
.tab-drawer__body--reviews #respond textarea {
    width: 100%;
    padding: 12px 14px;
    border: 1px solid var(--color-border);
    background: var(--color-bg);
    font-family: var(--font-base);
    font-size: 14px;
}

.tab-drawer__body--reviews #respond textarea { min-height: 120px; }

/* Widget d'étoiles cliquables du formulaire (le <select> reste accessible, masqué visuellement). */
.tab-drawer__body--reviews #respond p.stars {
    margin: 0 0 16px;
}

.tab-drawer__body--reviews #respond p.stars a {
    display: inline-block;
    width: 20px;
    font-size: 0;
}

.tab-drawer__body--reviews #respond p.stars a::before {
    content: "\2606";
    font-size: 18px;
    line-height: 1;
    color: var(--color-muted);
}

.tab-drawer__body--reviews #respond p.stars a.active::before {
    content: "\2605";
    color: var(--color-text-strong);
}

.tab-drawer__body--reviews #respond .form-submit { margin-top: 4px; }

.woocommerce div.product p.price,
.woocommerce div.product span.price {
    margin-bottom: 20px;
}

/* Prix de la fiche produit, repris du design de Sklum : prix actuel, puis —
   seulement en cas de promotion — l'ancien prix barré et le pourcentage
   économisé. Construit par boizar_restyle_single_price() (functions.php) à
   partir du HTML déjà calculé par WooCommerce (montants, devise, arrondis) :
   on ne fait que le remettre en forme. */
.boizar-price {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 8px;
}

.boizar-price__current {
    font-size: 23px;
    font-weight: 500;
    color: var(--color-text-strong);
}

.boizar-price__discount {
    display: flex;
    align-items: center;
    gap: 6px;
}

.boizar-price__old {
    font-size: 14px;
    font-weight: 300;
    color: var(--color-muted);
    text-decoration: line-through;
}

.boizar-price__save {
    font-size: 12px;
    font-weight: 500;
    color: var(--color-text-strong);
    background: var(--color-bg-alt);
    padding: 2px 6px;
}

.woocommerce div.product .woocommerce-product-details__short-description {
    font-size: 14px;
    color: var(--color-muted);
    margin-bottom: 24px;
}

.woocommerce div.product .stock {
    display: inline-block;
    font-size: 13px;
    color: var(--color-text);
    margin-bottom: 20px;
}
.woocommerce div.product .stock.in-stock::before { content: "● "; color: #4a7c59; }
.woocommerce div.product .stock.out-of-stock::before { content: "● "; color: var(--color-sale); }

/* Sélecteurs de variation — même tiroir que les onglets produit (voir
   .product-tab__trigger / .tab-drawer plus haut, et initTabDrawers /
   initVariationDrawers, assets/js/main.js).
   Marges reprises du rythme de Sklum : 12px entre les éléments d'un même
   groupe (titre, note, prix), 28px avant une rupture de section (avant les
   variations, avant quantité/achat) — margin-top plutôt que margin-bottom
   sur l'élément précédent, pour un espacement fiable quel que soit ce qui
   précède réellement (description courte, référence, délai de livraison —
   certains absents selon le produit). */
.boizar-variations { margin-top: 28px; margin-bottom: 24px; }

.boizar-variation-row + .boizar-variation-row { margin-top: 10px; }

.boizar-variation-trigger {
    background: #fff;
    color: #000;
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    padding: 14px 18px;
}

.boizar-variation-trigger:hover { color: var(--color-muted); }

.boizar-variation-trigger.is-chosen { background: #fff; }

/* Attributs sans image (ex. Dimension de couchage) : badges de sélection
   classiques en ligne, pas de tiroir — voir variable.php ($has_any_thumb). */
.boizar-variation-row__label {
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
    margin: 0 0 10px;
}

.boizar-swatches {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

.boizar-swatch {
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    color: var(--color-text);
    padding: 10px 18px;
    font-family: var(--font-base);
    font-size: 13px;
    cursor: pointer;
    transition: border-color var(--transition), background var(--transition), color var(--transition);
}

.boizar-swatch:hover { border-color: var(--color-text-strong); }

.boizar-swatch.is-selected {
    background: var(--color-accent);
    border-color: var(--color-accent);
    color: var(--color-on-accent);
}

.boizar-variation-trigger__text {
    display: flex;
    align-items: baseline;
    gap: 10px;
    min-width: 0;
    /* Pousse le compte "+N disponibles" et le chevron tout à droite du
       bouton, au lieu que justify-content:space-between (hérité de
       .product-tab__trigger) les espace tous les trois à intervalles
       égaux. */
    flex: 1 1 auto;
}

.boizar-variation-trigger__more {
    flex: 0 0 auto;
    font-size: 12px;
    font-weight: 400;
    text-transform: none;
    letter-spacing: normal;
    color: var(--color-muted);
    white-space: nowrap;
}

.boizar-variation-trigger__label {
    font-size: 11px;
    text-transform: none;
}

.boizar-variation-trigger__value {
    font-size: 13px;
    font-weight: 500;
    text-transform: none;
    letter-spacing: normal;
    color: var(--color-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Une fois une valeur réellement choisie (voir la classe is-chosen,
   initVariationDrawers dans assets/js/main.js), le texte passe du gris clair
   (simple aperçu des valeurs disponibles) au foncé (choix confirmé). */
.boizar-variation-trigger.is-chosen .boizar-variation-trigger__value {
    color: var(--color-text-strong);
}

.boizar-variation-row__select { display: none; }

/* Spécificité (0,2,0) : bat .tab-drawer__body ul (0,1,1) plus haut, sans
   quoi ce tiroir affiche des puces disc + un retrait de 20px comme n'importe
   quelle autre liste générique de panneau (description produit, etc.). */
.tab-drawer__body .boizar-variation-options {
    list-style: none;
    margin: 0;
    padding: 0;
}

.tab-drawer__body .boizar-variation-options li { margin-bottom: 0; }

.boizar-variation-options li + li { border-top: 1px solid var(--color-border); }

.boizar-variation-option {
    display: flex;
    align-items: center;
    gap: 14px;
    width: 100%;
    padding: 12px 24px 12px 0;
    background: none;
    border: none;
    cursor: pointer;
    font-family: var(--font-base);
    font-size: 14px;
    font-weight: 300;
    color: var(--color-text);
    text-align: left;
    position: relative;
}

.boizar-variation-option:hover { color: var(--color-text-strong); }

.boizar-variation-option.is-selected {
    color: var(--color-text-strong);
    font-weight: 500;
}

.boizar-variation-option.is-selected::after {
    content: "✓";
    position: absolute;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    color: var(--color-accent);
    font-size: 14px;
}

.boizar-variation-option__thumb {
    flex: 0 0 auto;
    width: 56px;
    height: 56px;
    overflow: hidden;
    border-radius: var(--radius);
    background: var(--color-bg-alt);
}

.boizar-variation-option__thumb img {
    width: 100%;
    height: 100%;
    margin: 0;
    object-fit: cover;
    display: block;
}

/* Grille de photos (2 par ligne, format 2:3) : dès qu'au moins une valeur de
   l'attribut a sa propre image (couleur, matière...) — voir variable.php,
   qui décide du mode liste/grille par attribut. */
.boizar-variation-options--grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 12px 10px;
}

/* Panneau plus étroit sur les côtés que les autres tiroirs (Description...) :
   une grille de photos n'a pas besoin de la même respiration qu'un bloc de
   texte. Le haut/bas garde le padding standard (.tab-drawer__body). */
.boizar-variation-drawer .tab-drawer__body {
    padding-left: 14px;
    padding-right: 14px;
}

.boizar-variation-options--grid li + li { border-top: none; }

.boizar-variation-options--grid .boizar-variation-option {
    flex-direction: column;
    align-items: stretch;
    padding: 0;
    gap: 8px;
}

.boizar-variation-options--grid .boizar-variation-option__thumb,
.boizar-variation-options--grid .boizar-variation-option__thumb--empty {
    width: 100%;
    height: auto;
    aspect-ratio: 2 / 3;
    outline: 1px solid transparent;
    outline-offset: 2px;
    transition: outline-color var(--transition);
}

.boizar-variation-options--grid .boizar-variation-option.is-selected .boizar-variation-option__thumb,
.boizar-variation-options--grid .boizar-variation-option.is-selected .boizar-variation-option__thumb--empty {
    outline-color: var(--color-accent);
}

/* Nom à gauche, prix à droite sur la même ligne ; date de livraison en
   dessous, pleine largeur. */
.boizar-variation-option__row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 8px;
}

.boizar-variation-options--grid .boizar-variation-option__label {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    text-align: left;
}

.boizar-variation-option__price {
    flex: 0 0 auto;
    font-size: 13px;
    font-weight: 500;
    color: var(--color-text-strong);
    text-align: right;
    white-space: nowrap;
}

.boizar-variation-option__delivery {
    display: block;
    font-size: 11px;
    color: var(--color-muted);
    text-align: left;
}

.boizar-variation-options--grid .boizar-variation-option.is-selected::after { content: none; }

.boizar-reset-variations {
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
    text-decoration: underline;
}

.woocommerce div.product .single_variation_wrap { margin-top: 28px; margin-bottom: 20px; }

/* Quantité et bouton d'achat côte à côte, icône panier dans le bouton —
   repris de Sklum. Voir boizar_add_to_cart_button_content(), functions.php,
   et les deux gabarits woocommerce/single-product/add-to-cart/*.php qui
   posent .boizar-add-to-cart-row autour des deux (produit simple et
   variable — même traitement dans les deux cas). */
.woocommerce div.product .boizar-add-to-cart-row {
    display: flex;
    align-items: stretch;
    gap: 8px;
}

.woocommerce div.product .boizar-add-to-cart-row .quantity {
    flex: 0 0 auto;
    margin-bottom: 0;
}

.woocommerce div.product .cart .button,
.woocommerce div.product .single_add_to_cart_button {
    flex: 1 1 auto;
    width: auto;
}

.single_add_to_cart_button .icon--cart { width: 20px; height: 20px; flex: 0 0 auto; }

/* Bouton WhatsApp (voir boizar_render_whatsapp_button, inc/whatsapp.php) —
   couleur de marque, pour rester reconnaissable plutôt que de se fondre dans
   le reste des boutons du site. */
.boizar-whatsapp-button {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    width: 100%;
    margin-top: 12px;
    padding: 14px 28px;
    border-radius: var(--radius);
    background: #10ac84;
    color: #fff;
    font-size: 12px;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wider);
    transition: background var(--transition);
}

.boizar-whatsapp-button:hover { background: #0e9270; color: #fff; }

/* Le prix de la variation est répercuté sur le prix principal en haut de fiche
   (main.js) : on masque celui que WooCommerce insère sous les options, sinon
   le prix apparaît deux fois. */
.woocommerce div.product .woocommerce-variation-price { display: none; }

@media (max-width: 900px) {
    .woocommerce div.product .product-main {
        flex-direction: column;
        gap: 12px;
    }

    .woocommerce div.product .product-main > .boizar-gallery,
    .woocommerce div.product .product-main > .summary {
        max-width: none;
    }
    /* "relative", pas "static" : plus de collage au scroll sur mobile (c'est
       le but), mais .summary doit rester un contexte de positionnement pour
       l'icône favoris flottante (.wishlist-toggle--single, plus haut). */
    .woocommerce div.product div.summary {
        position: relative;
        display: flex;
        flex-direction: column;
    }

    /* Sélecteurs de variation au-dessus du titre, mobile uniquement. Les
       cases à cocher/select restent dans le <form> (nécessaire à
       variations.js, WooCommerce core, qui cible ".variations select" à
       l'intérieur du formulaire) : "display: contents" fait disparaître la
       boîte du <form> pour la mise en page sans le retirer du DOM, si bien
       que ses enfants directs (.boizar-variations, .single_variation_wrap...)
       participent eux-mêmes à l'ordre flex de .summary. Seul
       .boizar-variations reçoit un ordre négatif : la quantité et le bouton
       "Ajouter au panier" gardent leur position normale, après le prix. */
    .woocommerce div.product div.summary form.variations_form.cart {
        display: contents;
    }

    .woocommerce div.product div.summary .boizar-variations {
        order: -1;
        /* Les 28px de marge au-dessus des variations (voir plus haut) sont
           pensés pour la séparer du bloc prix qui la précède sur ordinateur.
           Ici elle passe en premier, juste sous la galerie : ce n'est plus
           la marge du bon voisin — un item flex ne fusionne jamais ses
           marges avec rien (contrairement au flux normal), donc sans ce
           reset elle s'ajoutait telle quelle à l'espace déjà laissé par
           .product-main (gap plus haut), doublant l'écart. */
        margin-top: 0;
    }

    /* Quantité au-dessus, alignée à gauche (pas toute la largeur), bouton
       d'achat en dessous sur toute la largeur — au lieu de côte à côte comme
       sur ordinateur. */
    .woocommerce div.product .boizar-add-to-cart-row {
        flex-direction: column;
        align-items: flex-start;
    }

    .woocommerce div.product .cart .button,
    .woocommerce div.product .single_add_to_cart_button {
        width: 100%;
    }

    /* Galerie en carrousel : défilement horizontal avec accroche par image. */
    .boizar-gallery__track {
        display: flex;
        gap: 3px;
        overflow-x: auto;
        scroll-snap-type: x mandatory;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
        /* Chaque image occupe 100% de la largeur de l'écran, sans marge. */
        margin-inline: calc(var(--gutter) * -1);
        padding-inline: 0;
    }

    .boizar-gallery__track::-webkit-scrollbar { display: none; }

    .boizar-gallery .woocommerce-product-gallery__image,
    .boizar-gallery .woocommerce-product-gallery__image--placeholder {
        flex: 0 0 100%;
        scroll-snap-align: start;
    }

    .boizar-gallery .woocommerce-product-gallery__image:only-child { flex-basis: 100%; }

    /* Immersion fiche produit : le header devient un bandeau transparent
       superposé à la première image plutôt que de pousser le contenu — on
       voit l'image à travers. La barre d'annonce est masquée pour que la
       galerie parte du tout haut de l'écran. */
    body.single-product .announcement-bar {
        display: none;
    }

    body.single-product .site-header {
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        border-bottom: none;
        background: transparent;
    }

    body.single-product .container.section {
        padding-top: 0;
    }
}

/* Cart / checkout tables */
.woocommerce table.shop_table {
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
}
.woocommerce table.shop_table th {
    text-transform: uppercase;
    font-size: 12px;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
}

/* ==========================================================================
   Footer
   ========================================================================== */
.site-footer {
    background: var(--color-bg-alt);
    margin-top: 80px;
    padding-block: 64px 32px;
}

/* Le nombre de colonnes suit celui réellement affiché : une seule colonne
   renseignée ne doit pas s'étirer sur toute la largeur, ni laisser trois
   cases vides à côté d'elle. */
.footer-columns {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 40px 32px;
    margin-bottom: 48px;
}

.footer-columns[data-columns="1"] { grid-template-columns: minmax(0, 320px); }
.footer-columns[data-columns="2"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.footer-columns[data-columns="3"] { grid-template-columns: repeat(3, minmax(0, 1fr)); }

.footer-columns h4 {
    font-size: 12px;
    letter-spacing: var(--tracking-wide);
    margin-bottom: 16px;
}

.footer-columns ul li {
    margin-bottom: 10px;
}

.footer-columns a {
    font-size: 13px;
    color: var(--color-text);
    font-weight: 300;
}

.footer-columns a:hover { color: var(--color-muted); }

.site-footer__bottom {
    border-top: 1px solid var(--color-border);
    padding-top: 24px;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: center;
    gap: 12px 24px;
    font-size: 12px;
    color: var(--color-muted);
}

/* Le menu légal se place au centre et absorbe l'espace restant. */
.site-footer__legal { flex: 1 1 auto; }

.site-footer__legal ul {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 8px 20px;
}

.site-footer__legal a { color: var(--color-muted); }
.site-footer__legal a:hover { color: var(--color-text-strong); }

.site-footer__secure { white-space: nowrap; }

/* Colonne « Suivez-nous » : liens en ligne plutôt qu'empilés, plus compacts. */
.footer-menu--social {
    display: flex;
    flex-wrap: wrap;
    gap: 8px 18px;
}

.footer-menu--social li { margin-bottom: 0; }

/* Newsletter : le texte et le formulaire restent lisibles en pleine largeur. */
.newsletter-band__inner {
    max-width: 560px;
    margin-inline: auto;
}

@media (max-width: 900px) {
    .footer-columns,
    .footer-columns[data-columns="3"],
    .footer-columns[data-columns="4"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }

    .site-footer__bottom { justify-content: center; text-align: center; }
    .site-footer__legal ul { justify-content: center; }
}

@media (max-width: 480px) {
    .footer-columns,
    .footer-columns[data-columns="2"],
    .footer-columns[data-columns="3"],
    .footer-columns[data-columns="4"] { grid-template-columns: minmax(0, 1fr); }
}

/* ==========================================================================
   Newsletter band
   ========================================================================== */
.newsletter-band {
    background: var(--color-accent);
    color: var(--color-on-accent);
    text-align: center;
    padding: 48px var(--gutter);
}

.newsletter-band h3 { color: var(--color-on-accent); }

.newsletter-band form {
    display: flex;
    justify-content: center;
    gap: 0;
    max-width: 420px;
    margin: 24px auto 0;
}

.newsletter-band input[type="email"] {
    flex: 1;
    padding: 14px 16px;
    border: 1px solid var(--color-on-accent);
    background: transparent;
    color: var(--color-on-accent);
    font-family: var(--font-base);
}

.newsletter-band input[type="email"]::placeholder { color: rgba(255,255,255,0.7); }

.newsletter-band button {
    background: var(--color-on-accent);
    color: var(--color-accent);
    border: 1px solid var(--color-on-accent);
    padding: 14px 24px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    font-size: 12px;
    cursor: pointer;
}

/* ==========================================================================
   Category drawer — multi-level off-canvas menu (desktop + mobile)
   ========================================================================== */
.drawer-overlay {
    position: fixed;
    inset: 0;
    background: rgba(25, 25, 25, 0.4);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--transition);
    z-index: 90;
}

.drawer-overlay.is-open {
    opacity: 1;
    visibility: visible;
}

.drawer {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    /* min() plutôt que width+max-width : le panneau ne peut jamais dépasser
       l'écran, quelle que soit la largeur de l'appareil. */
    width: min(420px, 100vw);
    display: flex;
    flex-direction: column;
    background: var(--color-bg);
    transform: translateX(-100%);
    /* Masqué tant qu'il est fermé : un panneau hors-champ mais « visible »
       continue de peser dans la mise en page. Le délai laisse l'animation
       de fermeture se dérouler avant de le retirer. */
    visibility: hidden;
    transition: transform 300ms ease, visibility 0s linear 300ms;
    z-index: 100;
    box-shadow: 2px 0 24px rgba(0, 0, 0, 0.08);
    overflow-x: hidden;
}

.drawer.is-open {
    transform: translateX(0);
    visibility: visible;
    transition: transform 300ms ease, visibility 0s;
}

/* Barre supérieure permanente : le bouton de fermeture reste visible quel que
   soit le niveau de navigation affiché. */
.drawer__bar {
    flex: 0 0 auto;
    display: flex;
    justify-content: flex-end;
    padding: 10px 12px;
    border-bottom: 1px solid var(--color-border);
}

.drawer__close {
    background: none;
    border: none;
    padding: 4px 8px;
    font-size: 28px;
    line-height: 1;
    color: var(--color-text-strong);
    cursor: pointer;
}

.drawer__close:hover { color: var(--color-muted); }

.drawer__panels {
    position: relative;
    flex: 1 1 auto;
    overflow: hidden;
}

.drawer-panel {
    position: absolute;
    inset: 0;
    background: var(--color-bg);
    padding: 24px;
    overflow-y: auto;
    transform: translateX(100%);
    transition: transform 280ms ease;
}

.drawer-panel[data-level="0"] {
    transform: translateX(0);
    z-index: 1;
}

.drawer-panel.is-open {
    transform: translateX(0);
    z-index: 2;
}

.drawer-panel__back {
    display: flex;
    align-items: center;
    gap: 8px;
    background: none;
    border: none;
    padding: 0;
    margin-bottom: 20px;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
    cursor: pointer;
}

.drawer-panel__back:hover { color: var(--color-text-strong); }

/* Le titre garde la casse saisie — « Boizar Collection », et le nom exact de
   la catégorie sur les sous-niveaux — plutôt que d'être passé en capitales. */
.drawer-panel__title {
    /* Nettement plus grand que les catégories (14px) : le titre doit se lire
       comme l'en-tête du panneau, pas comme une entrée de plus. */
    font-size: 22px;
    font-weight: 600;
    line-height: 1.25;
    text-transform: none;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
    margin-bottom: 24px;
}

.drawer-panel__list { display: flex; flex-direction: column; }

.drawer-item { border-bottom: 1px solid var(--color-border); }

/* La ligne entière est cliquable — y compris pour ouvrir un sous-niveau. */
.drawer-item__link {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    width: 100%;
    padding: 16px 0;
    background: none;
    border: none;
    text-align: left;
    font-family: var(--font-base);
    font-size: 14px;
    /* Les noms de catégories s'affichent tels qu'ils sont saisis dans
       l'administration (« Canapés », « Mobilier de jardin »). On évite
       text-transform: capitalize, qui donnerait « Mobilier De Jardin ». */
    text-transform: none;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text);
    cursor: pointer;
}

.drawer-item__link:hover { color: var(--color-muted); }

/* Un nom de catégorie très long ne doit pas élargir le panneau. */
.drawer-item__name { overflow-wrap: anywhere; }

.drawer-item__chevron {
    flex: 0 0 auto;
    font-size: 20px;
    line-height: 1;
    color: var(--color-muted);
}

.drawer-item__link--seeall {
    font-weight: 500;
    color: var(--color-text-strong);
}

@media (max-width: 480px) {
    .drawer { max-width: 100%; }
}

/* ==========================================================================
   Drawer panier — même mécanique que le drawer catégories, mais glisse
   depuis la droite (voir initCartDrawer, main.js).
   ========================================================================== */
.cart-drawer-overlay {
    position: fixed;
    inset: 0;
    background: rgba(25, 25, 25, 0.4);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--transition);
    z-index: 90;
}

.cart-drawer-overlay.is-open {
    opacity: 1;
    visibility: visible;
}

.cart-drawer {
    position: fixed;
    top: 0;
    bottom: 0;
    right: 0;
    width: min(420px, 100vw);
    display: flex;
    flex-direction: column;
    background: var(--color-bg);
    transform: translateX(100%);
    visibility: hidden;
    transition: transform 300ms ease, visibility 0s linear 300ms;
    z-index: 100;
    box-shadow: -2px 0 24px rgba(0, 0, 0, 0.08);
}

.cart-drawer.is-open {
    transform: translateX(0);
    visibility: visible;
    transition: transform 300ms ease, visibility 0s;
}

.cart-drawer__head {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 20px 24px;
    border-bottom: 1px solid var(--color-border);
}

.cart-drawer__title {
    margin: 0;
    font-size: 16px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
}

.cart-drawer__close {
    background: none;
    border: none;
    padding: 4px 8px;
    font-size: 28px;
    line-height: 1;
    color: var(--color-text-strong);
    cursor: pointer;
}

.cart-drawer__close:hover { color: var(--color-muted); }

/* Bandeau de confirmation — affiché uniquement quand le drawer s'ouvre suite
   à un ajout au panier (initAjaxAddToCart, main.js), pas quand il est ouvert
   via l'icône panier de l'en-tête. */
.cart-drawer__confirm {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 0;
    padding: 14px 24px;
    background: var(--color-bg-alt);
    color: var(--color-text-strong);
    font-size: 13px;
    border-bottom: 1px solid var(--color-border);
}

.cart-drawer__confirm[hidden] { display: none; }

.cart-drawer__confirm .icon {
    flex: 0 0 auto;
    color: var(--color-accent);
}

.cart-drawer__body {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: 24px;
}

@media (max-width: 480px) {
    .cart-drawer { width: 100vw; }
}

/* ==========================================================================
   Connexion / inscription — drawer (voir boizar_render_account_forms,
   inc/account.php) et page Mon compte pour les visiteurs déconnectés.
   Réutilise le balisage .cart-drawer (même mécanique d'ouverture) : cette
   section ne couvre que le contenu propre au formulaire.
   ========================================================================== */

/* Une seule vue visible à la fois. La vue par défaut porte déjà .is-active
   au rendu serveur (voir boizar_render_account_forms, inc/account.php) : le
   formulaire de connexion reste utilisable sans JavaScript. */
.account-forms__view { display: none; }
.account-forms__view.is-active { display: block; }

.account-forms__title {
    font-size: 20px;
    font-weight: 500;
    margin: 0 0 20px;
}

.account-forms__notices:empty { display: none; }
.account-forms__notices .woocommerce-error,
.account-forms__notices .woocommerce-message { margin-bottom: 20px; }

.account-forms .woocommerce-form-row { margin-bottom: 16px; }

.account-forms__hint {
    display: block;
    margin-top: 6px;
    font-size: 12px;
    color: var(--color-muted);
}

.account-forms__lost {
    margin: -4px 0 20px;
    font-size: 12px;
}
.account-forms__lost a { color: var(--color-muted); }
.account-forms__lost a:hover { color: var(--color-text-strong); }

.account-forms__submit { width: 100%; margin-top: 4px; }

.account-forms__divider {
    display: flex;
    align-items: center;
    gap: 12px;
    margin: 20px 0;
    color: var(--color-muted);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
}
.account-forms__divider::before,
.account-forms__divider::after {
    content: "";
    flex: 1 1 auto;
    height: 1px;
    background: var(--color-border);
}

.account-forms__google {
    width: 100%;
    gap: 10px;
}

.account-forms__switch {
    margin: 24px 0 0;
    padding-top: 20px;
    border-top: 1px solid var(--color-border);
    font-size: 13px;
    color: var(--color-muted);
}

.account-forms__switch-btn {
    display: inline;
    background: none;
    border: none;
    padding: 0;
    margin-left: 4px;
    font: inherit;
    font-weight: 500;
    color: var(--color-text-strong);
    text-decoration: underline;
    text-underline-offset: 2px;
    cursor: pointer;
}
.account-forms__switch-btn:hover { color: var(--color-muted); }

/* Page Mon compte (visiteur déconnecté — .account-forms n'est rendu que là,
   voir woocommerce/myaccount/form-login.php) : le formulaire n'a pas besoin
   de toute la largeur de .site-main, Kavehome et Sklum le limitent aussi. */
body.woocommerce-account .account-forms {
    max-width: 420px;
}

/* ==========================================================================
   Page panier — cartes produit (au lieu du tableau WooCommerce, illisible
   sur mobile) + récapitulatif en colonne latérale. Voir woocommerce/cart/cart.php.
   ========================================================================== */
.cart-page {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(300px, 380px);
    gap: 48px;
    align-items: start;
}

.cart-page__list {
    list-style: none;
    margin: 0;
    padding: 0;
}

.cart-page__item {
    display: grid;
    grid-template-columns: 96px 1fr;
    gap: 16px;
    padding: 24px 0;
    border-bottom: 1px solid var(--color-border);
    position: relative;
}

.cart-page__item:first-child { padding-top: 0; }

.cart-page__item-image img {
    width: 96px;
    height: 144px;
    object-fit: cover;
    border-radius: var(--radius);
    display: block;
}

.cart-page__item-body {
    display: flex;
    flex-direction: column;
    padding-right: 32px;
    min-width: 0;
}

.cart-page__item-title {
    font-size: 14px;
    color: var(--color-text-strong);
    margin: 0 0 2px;
}

.cart-page__item-body dl.variation {
    margin: 0 0 4px;
    font-size: 12px;
    color: var(--color-muted);
}
.cart-page__item-body dl.variation dt,
.cart-page__item-body dl.variation dd,
.cart-page__item-body dl.variation dd p {
    display: inline;
    margin: 0;
    padding: 0;
}
.cart-page__item-body dl.variation dt::after { content: " "; }
.cart-page__item-body dl.variation dd::after { content: ""; display: block; }

.cart-page__item-price {
    font-size: 13px;
    color: var(--color-muted);
    margin: 2px 0;
}

.cart-page__item-qty { margin-top: 10px; }

.cart-page__item-subtotal {
    /* La grille de .cart-page__item n'a que 2 colonnes définies : sans ça,
       cet élément (3e enfant) atterrit en colonne 1, sous l'image. */
    grid-column: 2;
    margin: 12px 0 0;
    font-size: 15px;
    font-weight: 500;
    color: var(--color-text-strong);
}

.cart-page__item-remove {
    position: absolute;
    top: 24px;
    right: 0;
    width: 28px;
    height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 20px;
    line-height: 1;
    color: var(--color-muted) !important;
    text-decoration: none !important;
}
.cart-page__item-remove:hover { color: var(--color-text-strong) !important; }

.cart-page__actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    margin-top: 32px;
}

.cart-page__coupon {
    display: flex;
    gap: 8px;
    flex: 1 1 260px;
}
.cart-page__coupon input {
    flex: 1 1 auto;
    padding: 12px 14px;
    border: 1px solid var(--color-border);
    font-family: var(--font-base);
}

.cart-page__update { flex: 0 0 auto; }

/* Ventes croisées WooCommerce (woocommerce_cross_sell_display) — même
   markup ul.products que la boutique, mais la colonne latérale est trop
   étroite pour 4 colonnes. */
.cart-page__collaterals .cross-sells {
    margin-bottom: 32px;
}
.cart-page__collaterals .cross-sells h2 {
    font-size: 16px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    margin: 0 0 16px;
}
.cart-page__collaterals .cross-sells ul.products {
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 16px 12px;
}

/* Récapitulatif (cart_totals, core WooCommerce). */
.cart_totals {
    background: var(--color-bg-alt);
    border-radius: var(--radius);
    padding: 24px;
}
.cart_totals h2 {
    font-size: 16px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    margin: 0 0 16px;
}
.cart_totals table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 20px;
}
.cart_totals tr { border-bottom: 1px solid var(--color-border); }
.cart_totals tr.order-total { border-bottom: none; }
.cart_totals th,
.cart_totals td {
    text-align: left;
    padding: 10px 0;
    font-size: 13px;
    font-weight: 400;
    color: var(--color-text);
}
.cart_totals td { text-align: right; }
.cart_totals tr.order-total th,
.cart_totals tr.order-total td {
    font-size: 16px;
    font-weight: 500;
    color: var(--color-text-strong);
    padding-top: 14px;
}
.wc-proceed-to-checkout .checkout-button.button {
    width: 100%;
}

/* Panier vide */
.woocommerce-cart .return-to-shop { margin-top: 16px; }

@media (max-width: 900px) {
    .cart-page {
        grid-template-columns: 1fr;
        gap: 32px;
    }
}

@media (max-width: 480px) {
    .cart-page__item { grid-template-columns: 72px 1fr; gap: 12px; }
    .cart-page__item-image img { width: 72px; height: 108px; }
    .cart-page__actions { flex-direction: column; align-items: stretch; }
    .cart-page__coupon { flex-direction: column; }
    .cart-page__collaterals .cross-sells ul.products { grid-template-columns: 1fr !important; }
}

/* ==========================================================================
   Recherche produit — panneau plein écran (voir inc/search.php)
   ========================================================================== */
.search-panel-overlay {
    position: fixed;
    inset: 0;
    background: rgba(25, 25, 25, 0.4);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--transition);
    z-index: 130;
}

.search-panel-overlay.is-open {
    opacity: 1;
    visibility: visible;
}

.search-panel {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 140;
    background: var(--color-bg);
    border-bottom: 1px solid var(--color-border);
    transform: translateY(-100%);
    visibility: hidden;
    transition: transform 300ms ease, visibility 0s linear 300ms;
    max-height: 100vh;
    overflow-y: auto;
}

.search-panel.is-open {
    transform: translateY(0);
    visibility: visible;
    transition: transform 300ms ease, visibility 0s;
}

.search-panel__inner {
    max-width: 760px;
    margin-inline: auto;
    padding: 28px var(--gutter) 32px;
}

/* Barre de saisie : la loupe et la croix encadrent le champ, sans bordure
   interne, pour garder la ligne épurée du reste du thème. */
.search-panel__form {
    display: flex;
    align-items: center;
    gap: 12px;
    border-bottom: 1px solid var(--color-text-strong);
    padding-bottom: 12px;
}

.search-panel__form .icon { flex: 0 0 auto; color: var(--color-muted); }

.search-panel__input {
    flex: 1 1 auto;
    border: none;
    background: none;
    padding: 6px 0;
    font-family: var(--font-base);
    font-size: 20px;
    font-weight: 300;
    color: var(--color-text-strong);
}

.search-panel__input:focus { outline: none; }
.search-panel__input::placeholder { color: var(--color-muted); }

/* Retire la croix native de Chrome, redondante avec notre bouton. */
.search-panel__input::-webkit-search-cancel-button { -webkit-appearance: none; }

.search-panel__close {
    flex: 0 0 auto;
    background: none;
    border: none;
    padding: 0 4px;
    font-size: 28px;
    line-height: 1;
    color: var(--color-text-strong);
    cursor: pointer;
}

.search-panel__close:hover { color: var(--color-muted); }

.search-panel__results { margin-top: 24px; }

.search-panel__empty {
    margin: 0;
    padding: 16px 0;
    font-size: 14px;
    font-weight: 300;
    color: var(--color-muted);
}

.search-results { display: flex; flex-direction: column; }

.search-result { border-bottom: 1px solid var(--color-border); }

.search-result__link {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 14px 0;
}

.search-result__link:hover .search-result__title { color: var(--color-muted); }

.search-result__img {
    flex: 0 0 auto;
    width: 56px;
    height: 84px;
    object-fit: cover;
    background: var(--color-bg-alt);
}

.search-result__body {
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}

.search-result__title {
    font-size: 14px;
    color: var(--color-text-strong);
    transition: color var(--transition);
}

.search-result__sku {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
}

.search-result__price {
    font-size: 13px;
    font-weight: 500;
    color: var(--color-text-strong);
}

.search-panel__more {
    display: inline-block;
    margin-top: 20px;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    border-bottom: 1px solid var(--color-text-strong);
    padding-bottom: 2px;
}

@media (max-width: 600px) {
    .search-panel__inner { padding: 20px var(--gutter) 24px; }
    .search-panel__input { font-size: 17px; }
    .search-result__img { width: 48px; height: 72px; }
}

/* ==========================================================================
   Bannière d'accueil plein écran (voir inc/hero.php)
   ========================================================================== */
.hero-banner {
    position: relative;
    display: flex;
    align-items: center;
    overflow: hidden;
    background: var(--color-bg-alt);
    /* Débord jusqu'aux bords : le conteneur du thème garde une marge latérale
       que la bannière doit ignorer pour être réellement pleine largeur. */
    margin-inline: calc(var(--gutter) * -1);
}

/* 100svh plutôt que 100vh : sur mobile, 100vh inclut la barre d'adresse et
   la bannière se retrouve tronquée au premier défilement. */
.hero-banner--full { min-height: 100svh; }
.hero-banner--large { min-height: 80svh; }
.hero-banner--medium { min-height: 60svh; }

.hero-banner__media {
    position: absolute;
    inset: 0;
    z-index: 0;
}

.hero-banner__picture,
.hero-banner__picture img,
.hero-banner__video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* La vidéo n'apparaît qu'une fois lancée : jusque-là, l'image d'attente
   reste visible, ce qui évite un rectangle noir au chargement. */
.hero-banner__video {
    opacity: 0;
    transition: opacity 600ms ease;
}

.hero-banner__video.is-playing { opacity: 1; }

/* Voile sombre, dosé depuis la personnalisation. */
.hero-banner__media::after {
    content: "";
    position: absolute;
    inset: 0;
    background: rgba(15, 15, 15, var(--hero-overlay, 0.25));
}

.hero-banner__content {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    gap: 18px;
    width: 100%;
    max-width: var(--container-max);
    margin-inline: auto;
    padding: 64px clamp(20px, 4vw, 72px);
    color: #fff;
}

.hero-banner--center .hero-banner__content {
    align-items: center;
    text-align: center;
}

.hero-banner--left .hero-banner__content {
    align-items: flex-start;
    text-align: left;
}

.hero-banner__eyebrow {
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wider);
    color: rgba(255, 255, 255, 0.85);
}

.hero-banner__title {
    margin: 0;
    color: #fff;
    font-size: clamp(30px, 5vw, 62px);
    font-weight: 400;
    line-height: 1.1;
    letter-spacing: var(--tracking-wide);
    max-width: 20ch;
}

.hero-banner__text {
    margin: 0;
    max-width: 46ch;
    font-size: clamp(14px, 1.2vw, 17px);
    font-weight: 300;
    color: rgba(255, 255, 255, 0.92);
}

/* Bouton clair sur fond photo : le noir du thème disparaîtrait sur une image
   sombre, et le voile ne garantit pas un contraste suffisant. */
.hero-banner__btn,
.woocommerce a.btn.hero-banner__btn {
    margin-top: 10px;
    background: #fff !important;
    border-color: #fff;
    color: var(--color-text-strong) !important;
}

.hero-banner__btn:hover,
.woocommerce a.btn.hero-banner__btn:hover {
    background: transparent !important;
    color: #fff !important;
    border-color: #fff;
}

@media (max-width: 600px) {
    .hero-banner__content { padding: 48px var(--gutter); }
    .hero-banner__title { max-width: 16ch; }
}

/* ==========================================================================
   Pages construites avec Elementor
   ==========================================================================
   Le thème n'impose plus ni largeur ni marge : c'est Elementor qui gère la
   mise en page, y compris ses sections pleine largeur. Sans cela, une section
   « full width » s'arrêtait à la marge du conteneur du thème. */
.site-main--full {
    width: 100%;
    max-width: 100%;
    padding: 0;
}

.site-main--full > article,
.site-main--full .entry-content {
    width: 100%;
    max-width: 100%;
    margin: 0;
    padding: 0;
}

/* Le pied de page conserve son détachement, que la page soit construite avec
   Elementor ou non. */
.site-main--full + .newsletter-band,
.site-main--full + .site-footer { margin-top: 0; }

/* ==========================================================================
   Header incrusté sur la bannière — page d'accueil uniquement
   ==========================================================================
   « position: absolute » sans décalage « top » : l'en-tête garde sa position
   naturelle (juste sous le bandeau d'annonce) mais quitte le flux, ce qui
   laisse la bannière remonter dessous. Aucun calcul de hauteur nécessaire. */
.has-overlay-header .site-header {
    position: absolute;
    left: 0;
    right: 0;
    z-index: 60;
    background: transparent;
    border-bottom-color: transparent;
    transition: background var(--transition), border-color var(--transition);
}

/* Contenu en blanc tant que l'en-tête flotte sur l'image. */
.has-overlay-header .site-header .site-branding a,
.has-overlay-header .site-header .header-actions a,
.has-overlay-header .site-header .header-actions button {
    color: #fff;
}

.has-overlay-header .site-header .menu-toggle span {
    background: #fff;
}

.has-overlay-header .site-header .cart-contents .cart-count,
.has-overlay-header .site-header .wishlist-contents .wishlist-count {
    background: #fff;
    color: var(--color-text-strong);
}

/* Sur une image claire, le blanc pur peut manquer de contraste : une ombre
   portée discrète garantit la lisibilité sans assombrir la photo. */
.has-overlay-header .site-header .site-branding a,
.has-overlay-header .site-header .header-actions a,
.has-overlay-header .site-header .header-actions button {
    text-shadow: 0 1px 12px rgba(0, 0, 0, 0.35);
}

.has-overlay-header .site-header .icon {
    filter: drop-shadow(0 1px 8px rgba(0, 0, 0, 0.35));
}

/* ---- Après défilement : fond blanc, contenu noir, en-tête épinglé ---- */
.has-overlay-header .site-header.is-stuck {
    position: fixed;
    top: 0;
    background: var(--color-bg);
    border-bottom-color: var(--color-border);
    animation: boizar-header-drop 260ms ease both;
}

@keyframes boizar-header-drop {
    from { transform: translateY(-100%); }
    to   { transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
    .has-overlay-header .site-header.is-stuck { animation: none; }
}

.has-overlay-header .site-header.is-stuck .site-branding a,
.has-overlay-header .site-header.is-stuck .header-actions a,
.has-overlay-header .site-header.is-stuck .header-actions button {
    color: var(--color-text-strong);
    text-shadow: none;
}

.has-overlay-header .site-header.is-stuck .menu-toggle span {
    background: var(--color-text-strong);
}

.has-overlay-header .site-header.is-stuck .icon { filter: none; }

.has-overlay-header .site-header.is-stuck .cart-contents .cart-count,
.has-overlay-header .site-header.is-stuck .wishlist-contents .wishlist-count {
    background: var(--color-accent);
    color: var(--color-on-accent);
}

.has-overlay-header .site-header.is-stuck .header-actions a:hover,
.has-overlay-header .site-header.is-stuck .header-actions button:hover {
    color: var(--color-muted);
}

/* ==========================================================================
   Pages collections — en-tête, barre d'outils, filtres, densité
   ========================================================================== */

/* Retour vers la catégorie parente, au-dessus du titre. */
.collection-parent {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 10px;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
}

.collection-parent:hover { color: var(--color-text-strong); }
.collection-parent__arrow { font-size: 15px; line-height: 1; }

.shop-header-row { display: block; }

/* Le descriptif de catégorie n'occupe qu'une moitié de la largeur : au-delà,
   les lignes deviennent trop longues pour être lues confortablement. */
.term-description,
.woocommerce-product-details__short-description,
.taxonomy-description {
    max-width: 60ch;
    font-size: 15px;
    font-weight: 300;
    line-height: 1.7;
    color: var(--color-muted);
    margin-bottom: 28px;
}

/* ---- Barre d'outils ---- */
.collection-toolbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 12px 20px;
    padding-bottom: 16px;
    margin-bottom: 28px;
    border-bottom: 1px solid var(--color-border);
}

.collection-count {
    margin: 0;
    font-size: 13px;
    color: var(--color-muted);
}

.collection-count strong { color: var(--color-text-strong); font-weight: 500; }

.collection-toolbar__actions {
    display: flex;
    align-items: center;
    gap: 10px;
}

.collection-btn {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    height: 36px;
    padding: 0 16px;
    border: 1px solid var(--color-border);
    background: var(--color-bg);
    font-family: var(--font-base);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
    cursor: pointer;
}

.collection-btn:hover { border-color: var(--color-text-strong); }

/* Pastille signalant qu'au moins un filtre est actif. */
.collection-btn__dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--color-accent);
}

/* ---- Sélecteur de densité ---- */
.collection-views { display: flex; gap: 4px; }

.collection-view {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 2px;
    width: 36px;
    height: 36px;
    border: 1px solid var(--color-border);
    background: var(--color-bg);
    cursor: pointer;
}

.collection-view span {
    width: 2px;
    height: 13px;
    background: var(--color-muted);
}

.collection-view:hover { border-color: var(--color-text-strong); }

.collection-view.is-active { border-color: var(--color-text-strong); }
.collection-view.is-active span { background: var(--color-text-strong); }

/* Le sélecteur n'a pas de sens sur mobile, où la grille reste à 2 colonnes. */
@media (max-width: 700px) {
    .collection-views { display: none; }
}

/* ---- Densités appliquées à la grille produits ---- */
@media (min-width: 1100px) {
    body.view-large ul.products { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    body.view-default ul.products { grid-template-columns: repeat(4, minmax(0, 1fr)); }
    body.view-compact ul.products { grid-template-columns: repeat(6, minmax(0, 1fr)); }
}

/* En compact, les libellés doivent rester lisibles malgré des cartes étroites. */
body.view-compact ul.products li.product .woocommerce-loop-product__title { font-size: 12px; }
body.view-compact ul.products li.product .price { font-size: 12px; }

/* ---- Panneau de filtres ---- */
.filters-overlay {
    position: fixed;
    inset: 0;
    background: rgba(25, 25, 25, 0.4);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--transition);
    z-index: 150;
}

.filters-overlay.is-open { opacity: 1; visibility: visible; }

.filters-panel {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    width: min(400px, 100vw);
    display: flex;
    flex-direction: column;
    background: var(--color-bg);
    transform: translateX(100%);
    visibility: hidden;
    transition: transform 300ms ease, visibility 0s linear 300ms;
    z-index: 160;
    box-shadow: -2px 0 24px rgba(0, 0, 0, 0.08);
}

.filters-panel.is-open {
    transform: translateX(0);
    visibility: visible;
    transition: transform 300ms ease, visibility 0s;
}

.filters-panel__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 20px 24px;
    border-bottom: 1px solid var(--color-border);
    flex: 0 0 auto;
}

.filters-panel__title {
    margin: 0;
    font-size: 15px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-strong);
}

.filters-panel__close {
    background: none;
    border: none;
    padding: 0 4px;
    font-size: 26px;
    line-height: 1;
    color: var(--color-text-strong);
    cursor: pointer;
}

.filters-panel__body {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: 8px 24px 24px;
}

.filter-group { padding: 20px 0; border-bottom: 1px solid var(--color-border); }
.filter-group:last-child { border-bottom: none; }

.filter-group__label {
    margin: 0 0 12px;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-muted);
}

.filter-group__list { display: flex; flex-direction: column; gap: 10px; }

.filter-option {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: 14px;
    font-weight: 300;
    color: var(--color-text);
}

.filter-option__box {
    flex: 0 0 auto;
    width: 16px;
    height: 16px;
    border: 1px solid var(--color-border);
    background: var(--color-bg);
}

.filter-option:hover .filter-option__box { border-color: var(--color-text-strong); }

.filter-option.is-active { color: var(--color-text-strong); }

.filter-option.is-active .filter-option__box {
    background: var(--color-accent);
    border-color: var(--color-accent);
    /* Coche dessinée en CSS : pas d'image à charger pour un détail de 16px. */
    background-image: linear-gradient(45deg, transparent 42%, #fff 42%, #fff 55%, transparent 55%),
                      linear-gradient(-45deg, transparent 55%, #fff 55%, #fff 68%, transparent 68%);
    background-size: 100% 100%;
}

.filters-panel__foot {
    flex: 0 0 auto;
    padding: 20px 24px;
    border-top: 1px solid var(--color-border);
}

.filters-panel__foot .btn { width: 100%; }

@media (max-width: 480px) {
    .filters-panel { width: 100%; }
}

/* Sur mobile, une barre de 44 px rend les cibles tactiles trop justes :
   on rend quelques pixels pour rester confortable au doigt. */
@media (max-width: 700px) {
    .site-header__inner { padding-block: 10px; }
}

/* ==========================================================================
   Galerie produit — curseur loupe et agrandissement sur fond clair
   ========================================================================== */

/* Curseur en croix simple sur les visuels agrandissables : deux traits, rien
   de plus. Le tracé est doublé — trait blanc épais sous trait sombre fin —
   sans quoi la croix disparaît sur une photo de même valeur. Repli sur
   « crosshair », le curseur système équivalent. */
@media (hover: hover) and (pointer: fine) {
    .boizar-gallery .woocommerce-product-gallery__image a,
    .boizar-gallery .woocommerce-product-gallery__image img {
        cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cpath d='M15 3v24M3 15h24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' opacity='0.85'/%3E%3Cpath d='M15 3v24M3 15h24' fill='none' stroke='%23191919' stroke-width='1.2' stroke-linecap='round'/%3E%3C/svg%3E") 15 15, crosshair;
    }
}

/* ---- Agrandissement (PhotoSwipe) sur fond blanc ---- */
.pswp__bg { background: #ffffff; }

/* Les icônes de l'habillage par défaut sont des images blanches, prévues pour
   un fond noir. On les inverse — une seule fois : un filtre posé sur le bouton
   s'applique déjà à son pseudo-élément, et l'inverser à nouveau les rendait
   blanches, donc invisibles. */
.pswp__button--close,
.pswp__button--zoom,
.pswp__button--fs,
.pswp__button--share {
    filter: invert(1);
    opacity: 0.65;
}

.pswp__button--close:hover,
.pswp__button--zoom:hover,
.pswp__button--fs:hover,
.pswp__button--share:hover { opacity: 1; }

/* Flèches de navigation : on masque l'image-sprite d'origine et on trace un
   chevron, plus net et accordé au reste du thème. */
.pswp__button--arrow--left,
.pswp__button--arrow--right {
    filter: none;
    opacity: 1;
    width: 64px;
}

.pswp__button--arrow--left::before,
.pswp__button--arrow--right::before {
    background: none;
    width: 34px;
    height: 34px;
    top: 50%;
    margin-top: -17px;
    border: 0;
    border-top: 1.5px solid var(--color-text-strong, #191919);
    border-right: 1.5px solid var(--color-text-strong, #191919);
    opacity: 0.55;
    transition: opacity 200ms ease;
}

.pswp__button--arrow--left::before {
    left: 18px;
    transform: rotate(-135deg);
}

.pswp__button--arrow--right::before {
    right: 18px;
    left: auto;
    transform: rotate(45deg);
}

.pswp__button--arrow--left:hover::before,
.pswp__button--arrow--right:hover::before { opacity: 1; }

/* Barres haute et basse : transparentes, pour ne pas poser de bandeau gris
   sur le blanc. */
.pswp__top-bar,
.pswp__caption { background: transparent; }

.pswp__counter,
.pswp__caption__center {
    color: var(--color-text-strong, #191919);
    font-family: var(--font-base, sans-serif);
    font-size: 13px;
    text-shadow: none;
}

.pswp__preloader__icn { filter: invert(1); }

/* Le voile d'ouverture/fermeture part lui aussi du blanc, sinon
   l'agrandissement clignote en noir avant de s'afficher. */
.pswp--animate_opacity,
.pswp__scroll-wrap { background: transparent; }

