/*
Theme Name: Nuances au Mur
Description: Thème sur mesure pour nuances-au-mur.com. Charte « Plâtre » : fond plâtre froid, un seul accent vert sapin réservé à l'achat ; la couleur vient des produits, pas de l'habillage.
Version: 0.1.0
Requires PHP: 8.1
Text Domain: nuances-au-mur
*/

/* ==========================================================================
   0. POLICES, HÉBERGÉES ICI
   Plus de fonts.googleapis.com : chaque page envoyait l'IP du visiteur à
   Google avant tout choix de cookies (CNIL ; LG München, 20/01/2022).
   Sous-ensemble « latin » de Google Fonts (français complet : accents, œ,
   guillemets, €, espace fine) ; 108 Ko pour les quatre fichiers.
   Fraunces et Figtree sont VARIABLES : un fichier couvre toute la plage de
   graisses (et l'axe opsz de Fraunces, appliqué seul par le navigateur).
   Licence SIL Open Font License 1.1 pour les trois familles.
   ========================================================================== */
@font-face{font-family:"Fraunces";font-style:normal;font-weight:300 400;font-display:swap;
  src:url(assets/polices/fraunces-latin.woff2) format("woff2");
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:"Figtree";font-style:normal;font-weight:400 600;font-display:swap;
  src:url(assets/polices/figtree-latin.woff2) format("woff2");
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;
  src:url(assets/polices/ibm-plex-mono-400-latin.woff2) format("woff2");
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;
  src:url(assets/polices/ibm-plex-mono-500-latin.woff2) format("woff2");
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}

/* ==========================================================================
   1. JETONS
   Relevé de quinze concurrents (marketing/veille-2026-09-24/) : les leaders ont
   un fond clair, une encre sombre et UN accent réservé à l'achat. Fond froid,
   pour ne pas ressembler au lin chaud de Linge Évasion. (portage-ok : comparaison voulue)
   Contrastes WCAG 2.1 sur #F3F3F0 : encre 14,32 (AAA), secondaire 5,64 (AA),
   sapin 8,58 (AAA) — et 9,54 en texte blanc sur bouton sapin.
   Les filets (1,27) sont décoratifs : jamais de texte dessus.
   ========================================================================== */
:root{
  --fond:#F3F3F0;
  --fond-alt:#E7E9E5;
  --fond-carte:#FAFAF8;
  --encre:#1E2322;
  --encre-2:#5A625F;
  --sapin:#1F4D43;
  --sapin-fonce:#163A32;
  --filet:#D7DAD5;
  --filet-clair:#E4E6E2;
  --blanc:#FFFFFF;

  /* Alerte (retrait, message d'erreur du panier) et confirmation. Terre
     brûlée sombre plutôt qu'orange : 7,3 sur son fond clair (AA+). */
  --alerte:#8C3B1E;
  --alerte-f:#F6ECE8;
  --ok-f:#E3ECE8;

  --corps:"Figtree",system-ui,-apple-system,"Segoe UI",sans-serif;

  /* Les cinq lés du symbole, du plus clair au plus foncé. */
  --le-1:#C9D6D1;
  --le-2:#93AFA5;
  --le-3:#5F877A;
  --le-4:#2F5F52;
  --le-5:#1F4D43;

  --large:1280px;
  --prose:74ch;
  --gouttiere:clamp(16px,3.6vw,40px);

  /* Boutons à 2 px : presque droits, comme Photowall et Desenio. */
  --r-s:2px;
  --r-m:4px;
  --r-l:10px;

  --ombre-s:0 1px 2px rgba(30,35,34,.06);
  --ombre-m:0 2px 10px rgba(30,35,34,.07);
  --ombre-l:0 12px 40px rgba(30,35,34,.12);

  --t-court:.18s cubic-bezier(.4,0,.2,1);
  --t-moyen:.34s cubic-bezier(.22,1,.36,1);
  --t-long:.6s cubic-bezier(.22,1,.36,1);
}

/* ==========================================================================
   2. SOCLE
   ========================================================================== */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

body{
  margin:0;
  background:var(--fond);
  color:var(--encre);
  font-family:"Figtree",system-ui,-apple-system,"Segoe UI",sans-serif;
  /* 16 px et pas 14 : la cible a plus de 35 ans. Interlettrage positif —
     c'est le marqueur de haut de gamme le plus fiable relevé dans l'étude. */
  font-size:16px;
  line-height:1.7;
  letter-spacing:.01em;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}

h1,h2,h3,h4{
  font-family:"Fraunces",Georgia,"Times New Roman",serif;
  font-weight:300;
  line-height:1.14;
  letter-spacing:-.015em;
  text-wrap:balance;
  margin:0;
}
h1{font-size:clamp(2rem,5vw,3.1rem)}
h2{font-size:clamp(1.5rem,3.4vw,2.15rem)}
h3{font-size:clamp(1.15rem,2.2vw,1.4rem)}
p{margin:0}
img,video,svg{max-width:100%;height:auto;display:block}
a{color:inherit;text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit}
:focus-visible{outline:2px solid var(--sapin);outline-offset:3px;border-radius:2px}

/* Chaque nombre passe en chasse fixe : les valeurs s'alignent verticalement
   dans les colonnes, et un tableau se parcourt en trois secondes au lieu de dix. */
.nm-num,.woocommerce-Price-amount,.price,.nm-mono{
  font-family:"IBM Plex Mono",ui-monospace,SFMono-Regular,monospace;
  font-variant-numeric:tabular-nums;
  letter-spacing:-.02em;
}

.enrob{max-width:var(--large);margin-inline:auto;padding-inline:var(--gouttiere)}

/* 🚨 WordPress ne fournit PAS cette classe au thème : sans elle, les étiquettes
   « pour lecteur d'écran » s'affichaient en clair (formulaire de la lettre au
   pied de page, recherche). Visible au focus, pour le lien d'évitement. */
.screen-reader-text{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}
.screen-reader-text:focus{position:fixed!important;left:12px!important;top:12px;z-index:100000;width:auto;height:auto;margin:0;
  padding:10px 16px;clip:auto;clip-path:none;background:var(--fond);color:var(--encre);box-shadow:var(--ombre-l)}

/* ==========================================================================
   2 bis. PAGES ÉDITORIALES
   🚨 `p{margin:0}` est posé globalement, et c'est voulu : dans les gabarits,
   chaque bloc gère son propre espacement. Mais dans un texte long, plus rien
   ne sépare un titre du paragraphe qui suit — le guide des tailles s'affichait
   en un pavé continu, titres compris. Le rythme se remet donc ICI, et
   seulement ici.
   ========================================================================== */
.nm-prose > *{max-width:var(--prose)}
.nm-prose > * + *{margin-top:1.15em}

/* Un titre appartient à ce qui le suit, pas à ce qui le précède : beaucoup
   d'air au-dessus, très peu en dessous. */
.nm-prose > h2{font-size:clamp(1.28rem,2.1vw,1.62rem);margin-top:2.7em}
.nm-prose > h2 + *{margin-top:.7em}
.nm-prose > h3{font-size:clamp(1.04rem,1.6vw,1.18rem);margin-top:2em}
.nm-prose > h3 + *{margin-top:.55em}

/* Le premier paragraphe donne le ton : un cran plus grand, en encre plus claire. */
.nm-prose > p:first-child{font-size:1.14rem;line-height:1.62;color:var(--encre-2)}

.nm-prose a{text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;text-decoration-color:var(--filet)}
.nm-prose a:hover{color:var(--sapin);text-decoration-color:currentColor}
.nm-prose ul,.nm-prose ol{padding-left:1.2em}
.nm-prose li + li{margin-top:.4em}
.nm-prose li::marker{color:var(--sapin)}
.nm-prose blockquote{border-left:2px solid var(--sapin);padding-left:18px;color:var(--encre-2);font-style:italic}
.nm-prose hr{border:0;border-top:1px solid var(--filet);margin-block:2.4em}

/* Sur ces pages, le tableau EST le contenu : c'est lui qu'on vient lire.
   ⚠️ Le défilement se pose sur un conteneur, jamais sur le <table> lui-même —
   un `overflow-x` sur une table casse sa mise en page. */
.nm-prose .nm-table{overflow-x:auto;margin-top:1.7em}
.nm-prose table{
  width:100%;border-collapse:collapse;min-width:32rem;
  font-size:15px;font-variant-numeric:tabular-nums;
}
.nm-prose thead th{
  font-family:"Figtree",sans-serif;font-size:11px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;color:var(--encre-2);
  text-align:left;padding:0 20px 10px 0;border-bottom:1px solid var(--encre);
  white-space:nowrap;
}
.nm-prose tbody td{padding:11px 20px 11px 0;border-bottom:1px solid var(--filet-clair);vertical-align:top}
.nm-prose tbody tr:last-child td{border-bottom:1px solid var(--filet)}
.nm-prose tbody td:first-child{font-weight:500;color:var(--encre)}
.nm-prose tbody tr:hover td{background:var(--fond-alt)}
.nm-prose table caption{caption-side:bottom;padding-top:10px;font-size:13px;color:var(--encre-2);text-align:left}

.nm-oeil{
  font-family:"Figtree",sans-serif;font-size:11px;font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;color:var(--encre-2);
}

/* ==========================================================================
   3. EN-TÊTE
   ========================================================================== */
.nm-bandeau{
  background:var(--encre);color:var(--fond);
  font-size:12.5px;letter-spacing:.04em;text-align:center;
  padding:9px var(--gouttiere);
}
.nm-bandeau a{text-decoration:underline;text-underline-offset:3px}

.nm-entete{
  position:sticky;top:0;z-index:60;
  background:color-mix(in srgb,var(--fond) 88%,transparent);
  backdrop-filter:saturate(140%) blur(12px);
  border-bottom:1px solid transparent;
  transition:border-color var(--t-court),box-shadow var(--t-court);
}
.nm-entete.est-colle{border-bottom-color:var(--filet);box-shadow:var(--ombre-s)}
.nm-entete-int{
  display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:20px;
  min-height:72px;
}
.nm-logo{
  font-family:"Fraunces",serif;font-size:19px;font-weight:400;
  letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;
  display:inline-flex;align-items:center;gap:.52em;
}
/* La marque : cinq lés côte à côte, posés par `nm_logo_marque()`.
   Dimensionnée en `em` — elle suit la taille du nom, et le pied de page qui
   passe le sien à 17px n'a rien à régler. */
.nm-logo-marque{
  width:1.34em;height:auto;flex:none;
  /* Le nom porte son trait dessous : centré sur le bloc entier, le symbole
     tomberait sous la ligne de texte. On le remonte de la moitié du trait. */
  transform:translateY(-.24em);
}
/* Sur l'encre du pied de page, les deux lés les plus foncés disparaîtraient :
   le symbole y reprend son fond plâtre, comme dans le favicon. */
.nm-pied .nm-logo-marque{background:var(--fond);padding:.14em;border-radius:var(--r-s);box-sizing:content-box}
/* Le trait sous le nom, en vert sapin.
   🚨 Il est porté par `.nm-logo-nom`, pas par `.nm-logo` : depuis que le lien
   contient aussi le symbole, un `::after` sur le parent barrerait les deux. */
.nm-logo-nom::after{
  content:"";display:block;height:4px;margin-top:5px;
  background:linear-gradient(90deg,var(--sapin) 0%,var(--sapin) 100%);
  clip-path:polygon(0 42%,100% 0,100% 100%,0 58%);
  transform-origin:left;transform:scaleX(.82);
  transition:transform var(--t-moyen);
}
.nm-logo:hover .nm-logo-nom::after{transform:scaleX(1)}

/* 🚨 Aucun overflow sur un ancêtre du méga-menu : un conteneur à défilement
   découpe ses descendants positionnés. Sur l'autre site du groupe, le panneau
   avait opacity:1 et 521 px de haut, et restait invisible. */
/* 🚨 Pas de `position:relative` ici. C'est ce qui enfermait le panneau du
   méga-menu dans la largeur de la barre de liens — 830 px au lieu de toute
   la page —, et le décalait de 21 px par rapport au reste du site puisque
   la barre n'est pas exactement centrée dans l'en-tête.
   Sans elle, le panneau se cale sur `.nm-entete`, qui est en `sticky` et fait
   donc bloc de référence : pleine largeur, aligné, sans bricolage en `vw`. */
.nm-nav{display:flex;justify-content:center;gap:clamp(14px,2.4vw,32px)}
.nm-nav > li{list-style:none;position:static}
.nm-nav > li > a{white-space:nowrap}
/* 🚨 `>` obligatoire : sans lui, ces règles touchent AUSSI les liens du
   méga-menu, qui sont dans `.nm-nav`. Le trait de survol traversait alors
   chaque rayon sur toute la largeur de sa colonne, comme une rature. */
.nm-nav > li > a{
  display:block;padding:24px 2px;font-size:14px;letter-spacing:.03em;
  position:relative;
}
.nm-nav > li > a::after{
  content:"";position:absolute;left:0;right:0;bottom:18px;height:1px;
  background:var(--encre);transform:scaleX(0);transform-origin:right;
  transition:transform var(--t-moyen);
}
.nm-nav > li > a:hover::after,.nm-nav > li > a:focus-visible::after{transform:scaleX(1);transform-origin:left}

.nm-actions{display:flex;align-items:center;gap:6px}
.nm-icone{
  width:40px;height:40px;display:grid;place-items:center;border-radius:50%;
  background:transparent;border:0;cursor:pointer;
  transition:background var(--t-court);
}
.nm-icone:hover{background:var(--fond-alt)}
.nm-icone svg{width:19px;height:19px;stroke:var(--encre);fill:none;stroke-width:1.4}
.nm-pastille{
  position:absolute;transform:translate(11px,-11px);
  min-width:17px;height:17px;padding:0 4px;border-radius:9px;
  background:var(--sapin);color:#fff;font-size:10.5px;line-height:17px;
  text-align:center;font-family:"IBM Plex Mono",monospace;
}

/* ==========================================================================
   4. MÉGA-MENU — toute l'arborescence du catalogue
   Tout en CSS : indexable, et fonctionne sans script.
   ========================================================================== */
.nm-mega{
  position:absolute;left:0;right:0;top:100%;
  background:var(--fond-carte);border-top:1px solid var(--filet);
  box-shadow:var(--ombre-l);
  opacity:0;visibility:hidden;transform:translateY(-6px);
  transition:opacity var(--t-moyen),transform var(--t-moyen),visibility var(--t-moyen);
  padding:30px 0 34px;
}
.nm-nav li:hover > .nm-mega,.nm-nav li:focus-within > .nm-mega{opacity:1;visibility:visible;transform:none}
/* Le nombre de colonnes de liens varie avec le catalogue : sans --cols, une
   colonne vide restait ouverte à droite des liens. */
.nm-mega-grille{
  display:grid;grid-template-columns:repeat(var(--cols,3),minmax(0,1fr)) 300px;gap:clamp(28px,3vw,52px);
  max-width:var(--large);margin-inline:auto;padding-inline:var(--gouttiere);
}
.nm-mega h4{font-size:11px;font-family:"Figtree",sans-serif;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--encre-2);margin-bottom:12px}
.nm-mega h4 a{color:inherit}
.nm-mega h4 a:hover{color:var(--sapin)}
/* Un univers qui enjambe deux colonnes reprend son nom, en retrait. */
.nm-mega h4.nm-suite{color:var(--encre-3,var(--encre-2));opacity:.62}
/* 🔥 Le premier univers (le papier peint, voir nm_ordonne_univers()) ouvre la
   boutique : son titre est un cran plus grand, en vert sapin. */
.nm-mega h4.nm-vedette{font-size:12.5px;letter-spacing:.14em;color:var(--sapin);opacity:1}
.nm-mega h4.nm-vedette a{color:var(--sapin)}
/* ⚠️ Pas de fond ni d'encadré : l'univers vedette occupe DEUX colonnes, et un
   fond posé par colonne dessine deux panneaux séparés pour une seule rubrique.
   L'accent tient à la couleur du titre, au filet qui le surmonte et à une
   graisse de lien un cran au-dessus. */
.nm-mega-cats > .nm-col-vedette > h4:first-child{
  padding-top:8px;border-top:2px solid var(--sapin);
}
.nm-mega-cats > .nm-col-vedette > ul > li > a{font-size:15.5px}
.nm-mega h4 span{letter-spacing:.06em;text-transform:none;font-weight:400}
/* Plusieurs univers peuvent se suivre dans une même colonne : il leur faut de
   l'air entre eux, sinon le second titre se colle à la dernière ligne du premier. */
.nm-mega-cats > div > h4 + ul{margin-bottom:22px}
.nm-mega-cats > div > h4 + ul:last-child{margin-bottom:0}
.nm-mega ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:2px}
.nm-mega ul a{padding:5px 0;font-size:14.5px;display:flex;justify-content:space-between;gap:14px;align-items:baseline}
/* 🔥 Le grammage DANS l'intitulé de navigation : la donnée devient le filtre
   et le vocabulaire. Volé à By Mölle, qui le fait mieux que tout le monde. */
.nm-mega ul a .g{font-family:"IBM Plex Mono",monospace;font-size:11.5px;color:var(--encre-2);white-space:nowrap}
.nm-mega ul a:hover{color:var(--sapin)}
/* Pas de carte dans le méga « Catégories » : aucune piste à réserver à droite. */
.nm-mega-cats{grid-template-columns:repeat(var(--cols,4),minmax(0,1fr))}
/* Sous-rayons : décalés par un filet, jamais par une puce. */
.nm-mega ul .nm-mega-sous{margin:2px 0 6px;padding-left:11px;border-left:1px solid var(--filet);gap:0}
.nm-mega ul .nm-mega-sous a{font-size:13.5px;color:var(--encre-2);padding:3px 0}
.nm-mega ul .nm-mega-sous a:hover{color:var(--sapin)}
/* Pied du méga : les trois raccourcis qui ne sont ni un univers ni un rayon. */
.nm-mega-pied{
  max-width:var(--large);margin:26px auto 0;padding:16px var(--gouttiere) 0;
  border-top:1px solid var(--filet);
  display:flex;flex-wrap:wrap;gap:26px;font-size:13.5px;color:var(--encre-2);
}
.nm-mega-pied a:hover{color:var(--sapin)}

/* Méga d'une famille (papier peint, tableaux, affiches) : ses rayons, puis une
   carte photo dans la piste de 300 px que la grille réserve à droite. */
.nm-mega-univers .nm-mega-tout a{color:var(--sapin);font-size:13.5px}
.nm-mega-carte{display:flex;flex-direction:column;gap:12px;align-self:start;color:var(--encre)}
.nm-mega-carte img{width:100%;height:auto;aspect-ratio:4/3;object-fit:cover;border-radius:var(--r-m);transition:transform var(--t-moyen)}
.nm-mega-carte:hover img{transform:scale(1.02)}
.nm-mega-carte-txt{display:flex;flex-direction:column;gap:4px}
.nm-mega-carte-titre{font-family:"Fraunces",serif;font-weight:300;font-size:21px;line-height:1.2}
.nm-mega-carte:hover .nm-mega-carte-titre{color:var(--sapin)}

/* ==========================================================================
   5. BOUTONS
   ========================================================================== */
.nm-bouton,
body.nm-theme .button,
body.nm-theme button.button,
body.nm-theme a.button,
body.nm-theme .woocommerce-Button{
  display:inline-flex;align-items:center;justify-content:center;gap:9px;
  padding:14px 26px;border:1px solid var(--encre);border-radius:var(--r-s);
  background:var(--encre);color:var(--fond);
  font-size:14px;font-weight:500;letter-spacing:.05em;text-transform:uppercase;
  cursor:pointer;position:relative;overflow:hidden;
  transition:background var(--t-court),color var(--t-court),transform var(--t-court);
}
.nm-bouton:hover,body.nm-theme .button:hover{background:var(--sapin);border-color:var(--sapin);color:#fff}
.nm-bouton:active{transform:translateY(1px)}
.nm-bouton--creux{background:transparent;color:var(--encre)}
.nm-bouton--creux:hover{background:var(--encre);color:var(--fond);border-color:var(--encre)}
.nm-bouton--bloc{width:100%}

/* ==========================================================================
   6. CARTE PRODUIT
   🚨 Écrire `ul.products li.product` SANS ancêtre `.woocommerce` : la classe
   n'est posée sur <body> que sur les pages WooCommerce, donc un sélecteur
   ancré dessus ne s'applique pas sur l'accueil.
   ========================================================================== */
ul.products{
  display:grid;gap:clamp(18px,2.4vw,30px);margin:0;padding:0;list-style:none;
  /* Trois par ligne : avec le rail de filtres à 254 px, la colonne produits fait
     ~900 px — à quatre, chaque visuel tombait sous 210 px, trop petit pour juger
     un tissu. À trois, on gagne un tiers de surface par photo. */
  grid-template-columns:repeat(3,1fr);
}
/* 🚨 WooCommerce pose un clearfix `content:" "; display:table` sur ::before ET
   ::after de `ul.products`. Dans une grille, un pseudo-élément est un ENFANT de
   grille comme un autre : les deux occupaient une case pleine de 204 × 401 px.
   Résultat, la première case de la rangée était vide et toute la grille
   décalée d'un cran — visible à l'œil, invisible dans le HTML. */
ul.products::before,ul.products::after{content:none!important;display:none!important}
/* Variante à quatre colonnes, pour les emplacements sans rail de filtres. */
@media(min-width:1000px){
  ul.products.nm-produits--4{grid-template-columns:repeat(4,minmax(0,1fr))}
}
ul.products li.product{
  list-style:none;margin:0;padding:0;width:auto;float:none;
  display:flex;flex-direction:column;gap:11px;position:relative;
}
/* 🚨 Le CSS de WooCommerce réimpose width:22.05% et float:left avec une
   spécificité de 0,3,2 sur ses propres pages. On préfixe body.nm-theme
   (0,3,3) et on force. Sans ça, les cartes tombent à quelques dizaines de px. */
body.nm-theme ul.products li.product{width:auto!important;float:none!important;margin:0!important;clear:none!important}
/* 🚨 Même piège sur l'IMAGE, et je l'avais raté : WooCommerce impose
   `height:auto` à ses vignettes, ce qui gagne sur `height:100%`. Résultat
   mesuré : une image de 200 px dans un cadre de 251 px, donc une bande de fond
   beige sous chaque photo, sur toute la boutique. */
body.nm-theme ul.products li.product .nm-visuel img{
  width:100%!important;height:100%!important;object-fit:cover;
}

/* ⚠️ Fond presque blanc, et non sable : la moitié des visuels du fournisseur
   sont des détourés sur blanc. Sur du sable, chacun dessinait un rectangle
   blanc flottant — c'est ce qu'on voyait derrière les pastilles. */
.nm-visuel{
  position:relative;aspect-ratio:4/5;overflow:hidden;border-radius:var(--r-m);
  background:var(--fond-carte);
}
.nm-visuel img{
  width:100%;height:100%;object-fit:cover;
  transition:transform var(--t-long),opacity var(--t-moyen);
}
li.product:hover .nm-visuel img{transform:scale(1.035)}
/* Seconde image au survol : la deuxième vue de la fiche (motif seul, ou
   posé dans une pièce). */
.nm-visuel .nm-macro{position:absolute;inset:0;opacity:0}
li.product:hover .nm-visuel .nm-macro{opacity:1}

.woocommerce-loop-product__title,li.product h2{
  font-family:"Figtree",sans-serif!important;font-size:15px!important;font-weight:500!important;
  line-height:1.45;letter-spacing:0;margin:0!important;padding:0!important;
}

li.product .price{font-size:15px!important;color:var(--encre)!important;margin:0!important}
li.product .price del{color:var(--encre-2);opacity:.6;margin-right:7px}

/* Nuancier de coloris sous la carte */
.nm-nuancier{display:flex;gap:5px;flex-wrap:wrap;align-items:center}
.nm-pastille-coul{
  width:15px;height:15px;border-radius:50%;border:1px solid var(--filet);
  transition:transform var(--t-court);
}
.nm-pastille-coul:hover{transform:scale(1.25)}
.nm-nuancier .reste{font-size:11.5px;color:var(--encre-2);font-family:"IBM Plex Mono",monospace}

/* Le bouton d'ajout se déplie au survol de la carte */
.nm-ajout{
  position:absolute;left:10px;right:10px;bottom:10px;z-index:3;
  opacity:0;transform:translateY(8px);
  transition:opacity var(--t-moyen),transform var(--t-moyen);
}
li.product:hover .nm-ajout,li.product:focus-within .nm-ajout{opacity:1;transform:none}
@media(hover:none){.nm-ajout{position:static;opacity:1;transform:none}}

/* ==========================================================================
   7. ACCUEIL
   ========================================================================== */
/* L'accueil suit la maquette validée le 24/09/2026 (docs/maquette-accueil-retenue.html).
   Classes préfixées `nm-acc-` : un nom court comme `.point` ou `.grille`
   finit toujours par croiser une classe de WooCommerce ou d'un module.
   La page est plus large que le reste du site (1440 contre 1280 px) : les
   photos y vont presque bord à bord. */
.nm-acc{max-width:1440px;margin-inline:auto}
.nm-acc-btn{display:inline-flex;align-items:center;gap:8px;padding:13px 20px;border:1px solid transparent;border-radius:var(--r-s);
  font-size:15px;line-height:1.3;cursor:pointer;transition:background var(--t-court),color var(--t-court)}
/* Le vert sapin reste réservé à l'action principale. */
.nm-acc-btn--achat{background:var(--sapin);color:#fff}
.nm-acc-btn--achat:hover{background:var(--sapin-fonce)}
.nm-acc-btn--lien{border-color:var(--encre);background:transparent;color:var(--encre)}
.nm-acc-btn--lien:hover{background:var(--encre);color:var(--fond)}

/* --- 1. Le mur du haut ---------------------------------------------------- */
.nm-acc-haut{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);min-height:640px}
.nm-acc-texte{padding:clamp(28px,5vw,72px) clamp(20px,4vw,56px);display:flex;flex-direction:column;justify-content:flex-end;gap:26px}
.nm-acc-texte h1{font-size:clamp(2.4rem,5vw,4.4rem);line-height:1.02}
.nm-acc-texte p{max-width:40ch;color:var(--encre-2);font-size:17px}
.nm-acc-actions{display:flex;gap:12px;flex-wrap:wrap}
.nm-acc-photo{position:relative;overflow:hidden;background:var(--fond-alt)}
.nm-acc-photo > img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 38%}
/* Catalogue vide : les cinq lés du symbole, pas une photo d'emprunt. */
.nm-acc-photo--symbole{display:flex;gap:6px;padding:clamp(28px,5vw,64px);background:transparent}
.nm-acc-photo--symbole i{flex:1}
.nm-acc-photo--symbole i:nth-child(1){background:var(--le-1)}
.nm-acc-photo--symbole i:nth-child(2){background:var(--le-2)}
.nm-acc-photo--symbole i:nth-child(3){background:var(--le-3)}
.nm-acc-photo--symbole i:nth-child(4){background:var(--le-4)}
.nm-acc-photo--symbole i:nth-child(5){background:var(--le-5)}

/* Le repère : 30 px dessinés, 44 px de cible tactile. */
.nm-acc-point{position:absolute;left:var(--x);top:var(--y);width:44px;height:44px;margin:-22px 0 0 -22px;padding:0;border:0;
  background:none;border-radius:50%;cursor:pointer;display:grid;place-items:center;z-index:1}
.nm-acc-point::before,.nm-acc-point::after{content:"";grid-area:1/1;border-radius:50%}
.nm-acc-point::before{width:30px;height:30px;background:rgba(243,243,240,.92);box-shadow:0 4px 18px rgba(0,0,0,.18)}
.nm-acc-point::after{width:9px;height:9px;background:var(--sapin)}
.nm-acc-point:hover::before,.nm-acc-point[aria-expanded="true"]::before{outline:2px solid #fff;outline-offset:3px}
/* Sur une photo, un seul anneau se perd : blanc ET encre. */
.nm-acc-point:focus-visible{outline:2px solid #fff;outline-offset:0;box-shadow:0 0 0 4px var(--encre)}
.nm-acc-etiquette{position:absolute;z-index:2;left:calc(var(--x) + 26px);top:calc(var(--y) - 44px);
  width:max-content;min-width:230px;max-width:min(300px,calc(100% - 24px));
  background:var(--fond-carte);padding:14px 16px;box-shadow:var(--ombre-l);font-size:13.5px;line-height:1.5}
.nm-acc-etiquette.a-gauche{left:auto;right:calc(100% - var(--x) + 26px)}
/* Repère bas dans la photo : l'étiquette s'ouvre vers le haut, sinon le cadre la rogne. */
.nm-acc-etiquette.vers-haut{top:auto;bottom:calc(100% - var(--y) - 44px)}
.nm-acc-etiquette[hidden]{display:none}
.nm-acc-etiquette b{display:block;font-family:"Fraunces",Georgia,serif;font-weight:400;font-size:17px;line-height:1.25;margin-bottom:4px}
.nm-acc-etiquette .ligne{display:flex;justify-content:space-between;gap:12px;color:var(--encre-2)}
.nm-acc-etiquette .ligne .nm-num{color:var(--encre)}
.nm-acc-etiquette a{display:inline-block;margin-top:8px;color:var(--sapin);font-weight:600}
.nm-acc-etiquette a:hover{text-decoration:underline;text-underline-offset:4px}
.nm-acc-les{display:flex;gap:3px;height:14px;margin:6px 0}
.nm-acc-les i{flex:1}

/* --- 2. Le nuancier ------------------------------------------------------- */
.nm-acc-nuancier{padding:22px clamp(16px,3vw,40px) 26px;border-block:1px solid var(--filet)}
.nm-acc-nuancier ul{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:4px;align-items:start}
.nm-acc-nuancier a,.nm-acc-le-inerte{display:block}
/* Filet intérieur : le blanc du nuancier se confond sinon avec le fond plâtre. */
.nm-acc-nuancier .bande{display:block;height:104px;box-shadow:inset 0 0 0 1px rgba(30,35,34,.08);transform:scaleY(.712);transform-origin:bottom}
/* Le lé survolé monte de 74 à 104 px, par une transformation : animer
   `height` recalcule la mise en page à chaque image. Les 104 px sont
   réservés pour TOUS les lés, liens ou non : les libellés restent alignés. */
.nm-acc-nuancier a .bande{transition:transform var(--t-moyen)}
.nm-acc-nuancier a:hover .bande,.nm-acc-nuancier a:focus-visible .bande{transform:none}
.nm-acc-nuancier .nom{display:block;font-size:12.5px;margin-top:8px;color:var(--encre-2)}
.nm-acc-nuancier .compte{display:block;font-size:11px;line-height:1.4;color:var(--encre-2)}
.nm-acc-nuancier a:hover .nom{color:var(--encre)}

/* --- 3. Le carnet de murs ------------------------------------------------- */
.nm-acc-carnet{padding:clamp(40px,6vw,88px) clamp(16px,3vw,40px);display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:28px 24px}
.nm-acc-carnet h2{grid-column:1/-1;font-size:clamp(1.8rem,3vw,2.6rem);line-height:1.08;max-width:22ch}
.nm-acc-mur{margin:0}
.nm-acc-mur img{width:100%;aspect-ratio:4/3;object-fit:cover}
.nm-acc-mur figcaption{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin-top:10px;padding-top:10px;border-top:1px solid var(--filet);font-size:14px}
.nm-acc-mur figcaption a:hover{text-decoration:underline;text-underline-offset:4px}
.nm-acc-mur .sous{color:var(--encre-2)}
.nm-acc-mur em{font-style:normal;color:var(--encre-2);margin-left:auto}
.nm-acc-carnet .m1{grid-column:1/8}
.nm-acc-carnet .m1 img{aspect-ratio:16/10}
.nm-acc-carnet .m2{grid-column:8/13;align-self:end}
.nm-acc-carnet .m3{grid-column:1/5}
.nm-acc-carnet .m4{grid-column:5/13}
.nm-acc-carnet .m4 img{aspect-ratio:21/9}
.nm-acc-carnet .m4--plein{grid-column:1/-1}

/* --- 4. Les tableaux (et 5. les affiches, même gabarit) -------------------- */
.nm-acc-tab{background:var(--fond-alt);padding:clamp(40px,6vw,88px) clamp(16px,3vw,40px);display:grid;grid-template-columns:minmax(0,4fr) minmax(0,8fr);gap:40px;align-items:start}
.nm-acc-tab--affiches{background:var(--fond);border-top:1px solid var(--filet)}
/* Affiches : la colonne de gauche porte formats et cadres, et suit la lecture */
.nm-acc-tab--affiches>div:first-child{position:sticky;top:110px}
.nm-acc-af-rep{margin-top:30px;display:grid;gap:12px}
.nm-acc-af-rep .nm-oeil{margin:6px 0 0}
.nm-acc-af-formats{list-style:none;margin:0;padding:18px 20px;background:var(--fond-alt);display:flex;align-items:flex-end;gap:22px}
.nm-acc-af-formats li{display:grid;justify-items:start;gap:4px;font-size:13px}
.nm-acc-af-formats i{display:block;background:#fff;border:1px solid var(--filet);box-shadow:0 1px 2px rgba(30,35,34,.08)}
.nm-acc-af-formats b{font-weight:500;margin-top:6px}
.nm-acc-af-formats span{color:var(--encre-2);font-size:12.5px}
.nm-acc-af-cadres{list-style:none;margin:0;padding:0;display:grid;gap:8px}
.nm-acc-af-cadres li{display:grid;grid-template-columns:28px 1fr auto;align-items:center;gap:10px;font-size:14px}
.nm-acc-af-cadres i{width:26px;height:26px;background:#fff;border:4px solid;box-sizing:border-box}
.nm-acc-af-cadres i.sans{border:1px dashed var(--encre-2)}
.nm-acc-af-cadres .nm-num{color:var(--encre-2);font-size:13px}
.nm-acc-af-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}
@media(max-width:860px){.nm-acc-tab--affiches>div:first-child{position:static}}
.nm-acc-tab h2,.nm-acc-af h2{font-size:clamp(1.9rem,3.2vw,2.8rem);line-height:1.05;max-width:14ch}
.nm-acc-tab p{color:var(--encre-2);max-width:42ch;margin-top:14px}
.nm-acc-meuble{margin-top:28px;background:var(--fond);padding:18px 20px;display:grid;gap:10px}
.nm-acc-meuble label{font-size:13px;color:var(--encre-2);display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.nm-acc-meuble input{width:84px;padding:2px 0;border:0;border-bottom:1px solid var(--encre);border-radius:0;background:transparent;color:var(--encre);
  font:500 20px "IBM Plex Mono",ui-monospace,monospace}
.nm-acc-meuble output{font-size:15px;line-height:1.5}
.nm-acc-meuble output b{font-weight:500;white-space:nowrap}
.nm-acc-video{display:block;width:100%;height:auto;aspect-ratio:1/1;object-fit:cover;margin-top:18px;background:var(--fond)}
.nm-acc-echelle{position:relative;height:70px;margin-top:6px}
/* Pas de transition : le croquis suit la saisie chiffre par chiffre, et une
   largeur animée recalculerait la mise en page à chaque image. */
.nm-acc-echelle .toile,.nm-acc-echelle .buffet{position:absolute;left:50%;transform:translateX(-50%);display:block}
.nm-acc-echelle .toile{bottom:34px;width:40%;height:26px;background:var(--sapin)}
.nm-acc-echelle .buffet{bottom:0;width:60%;height:22px;background:#B9B4AA}
.nm-acc-rangee{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px 18px}
.nm-acc-rangee figure{margin:0;background:var(--blanc)}
.nm-acc-rangee img{width:100%;aspect-ratio:1/1;object-fit:contain;padding:6%}
.nm-acc-rangee figcaption{padding:12px 14px 14px;font-size:14px;display:grid;gap:2px;border-top:1px solid var(--filet)}
.nm-acc-rangee figcaption a:hover{text-decoration:underline;text-underline-offset:4px}
.nm-acc-rangee figcaption span{color:var(--encre-2);font-size:13px}
.nm-acc-rangee .large{grid-column:span 2}
.nm-acc-rangee .large img{aspect-ratio:2/1;object-fit:cover;padding:0}
/* Affiches : des mises en scène carrées. En bandeau 2:1 on perdait la moitié
   de la photo, affiche comprise : toutes en carré, sans rognage ni marge. */
.nm-acc-tab--affiches .nm-acc-rangee .large{grid-column:auto}
.nm-acc-tab--affiches .nm-acc-rangee img,.nm-acc-tab--affiches .nm-acc-rangee .large img{aspect-ratio:1/1;object-fit:cover;padding:0}
.nm-acc-liens{grid-column:1/-1;display:flex;gap:10px;flex-wrap:wrap;margin:6px 0 0;padding:0;list-style:none}
.nm-acc-liens a{display:inline-block;padding:8px 14px;border:1px solid var(--encre-2);border-radius:var(--r-s);font-size:14px}
.nm-acc-liens a:hover{background:var(--encre);color:var(--fond);border-color:var(--encre)}

/* --- 5. Les affiches arrivent --------------------------------------------- */
.nm-acc-af{padding:clamp(40px,6vw,80px) clamp(16px,3vw,40px);display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:40px;align-items:center;border-top:1px solid var(--filet)}
.nm-acc-af p{color:var(--encre-2);max-width:44ch;margin-top:14px}
.nm-acc-af .nm-nl{margin-top:18px;max-width:520px}
/* Le formulaire du module, habillé comme le bouton creux de la maquette. */
.nm-acc-af .nm-nl-b{background:transparent;border-color:var(--encre);color:var(--encre)}
.nm-acc-af .nm-nl-b:hover{background:var(--encre);border-color:var(--encre);color:var(--fond)}
.nm-acc-af .nm-nl-b.est-occupe::after{border-color:rgba(30,35,34,.3);border-top-color:var(--encre)}
.nm-acc-af .nm-nl input[type="email"]{background:var(--fond-carte);border-color:var(--encre-2)}
/* Le module pâlit sa mention et colore ses refus pour un fond sombre : ici le fond est clair. */
.nm-acc-af .nm-nl-mention{opacity:1;color:var(--encre-2);font-size:12.5px}
.nm-acc-af .nm-nl-retour{color:var(--encre)}
.nm-acc-af .nm-nl-retour.est-refus{color:var(--alerte)}
.nm-acc-cadres{display:flex;gap:20px;align-items:flex-end;justify-content:center;min-height:300px}
.nm-acc-cadres i{display:block;background:var(--fond-carte);border:10px solid #fff;box-shadow:0 10px 30px rgba(30,35,34,.12)}
.nm-acc-cadres .c1{width:24%;max-width:150px;aspect-ratio:5/7}
.nm-acc-cadres .c2{width:34%;max-width:210px;aspect-ratio:21/29}
.nm-acc-cadres .c3{width:21%;max-width:130px;aspect-ratio:13/18}

/* --- 6. Votre pièce a déjà une couleur ------------------------------------ */
.nm-acc-couleur{border-top:1px solid var(--filet)}
.nm-acc-couleur-tete{padding:clamp(36px,5vw,76px) clamp(16px,3vw,40px) 28px;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:40px;align-items:end}
.nm-acc-couleur-tete h2{font-size:clamp(2.2rem,4.4vw,3.8rem);line-height:1.02;max-width:12ch}
.nm-acc-couleur-tete p{color:var(--encre-2);max-width:44ch;font-size:17px;margin-bottom:6px}
/* 14 px de marge haute : le lé choisi monte de 14 px sans être rogné. */
.nm-acc-roue{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:4px;padding:14px clamp(16px,3vw,40px) 0}
.nm-acc-roue button{position:relative;height:200px;padding:0;border:0;border-radius:0;color:#fff;cursor:pointer;transition:transform var(--t-moyen)}
/* Encre choisie sur la luminance (nm_acc_clair) : la maquette passait par
   mix-blend-mode, illisible sur le blanc et le beige. */
.nm-acc-roue button.est-clair{color:var(--encre);box-shadow:inset 0 0 0 1px rgba(30,35,34,.08)}
.nm-acc-roue button[aria-pressed="true"]{transform:translateY(-14px)}
/* Le choix se voit aussi sans le mouvement : un trait sous le lé. */
.nm-acc-roue button[aria-pressed="true"]::after{content:"";position:absolute;left:0;right:0;bottom:-10px;height:3px;background:var(--encre)}
.nm-acc-roue button:disabled{cursor:default;opacity:.4}
.nm-acc-roue span{position:absolute;left:8px;bottom:8px;font-size:12px;writing-mode:vertical-rl;transform:rotate(180deg)}
.nm-acc-couleur-bas{display:grid;grid-template-columns:minmax(0,3fr) minmax(0,9fr);gap:28px;padding:30px clamp(16px,3vw,40px) clamp(40px,6vw,80px)}
.nm-acc-couleur-bas.sans-depot{grid-template-columns:minmax(0,1fr)}
.nm-acc-depot{border:1px dashed var(--encre-2);padding:22px;display:flex;flex-direction:column;gap:12px;align-self:start;background:var(--fond-carte)}
.nm-acc-depot b{font-family:"Fraunces",Georgia,serif;font-weight:400;font-size:20px;line-height:1.2}
.nm-acc-depot p{font-size:14px;color:var(--encre-2)}
.nm-acc-depot .nm-acc-btn{align-self:flex-start}
.nm-acc-resultats h3{font-size:1.6rem;margin-bottom:16px}
.nm-acc-resultats[aria-busy="true"] .nm-acc-grille{opacity:.5;transition:opacity var(--t-court)}
.nm-acc-grille{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
.nm-acc-carte{margin:0}
.nm-acc-carte img{width:100%;aspect-ratio:3/2;object-fit:cover}
.nm-acc-pastilles{display:flex;gap:3px;margin-top:6px}
.nm-acc-pastilles i{width:14px;height:6px}
.nm-acc-carte figcaption{display:flex;justify-content:space-between;gap:8px;margin-top:8px;font-size:13.5px}
.nm-acc-carte figcaption a:hover{text-decoration:underline;text-underline-offset:4px}
.nm-acc-carte figcaption span{white-space:nowrap;color:var(--encre-2)}
.nm-acc-tout{margin-top:18px;font-size:14px}
.nm-acc-tout[hidden]{display:none}
.nm-acc-tout a{text-decoration:underline;text-underline-offset:4px}

/* --- 7. Les quatre engagements -------------------------------------------- */
.nm-acc-engage{background:var(--encre);color:#DDE1DE;padding:44px clamp(16px,3vw,40px);display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px;font-size:14px}
.nm-acc-engage b{display:block;color:#fff;font-weight:500;margin-bottom:4px}
.nm-acc-engage span{color:#A9B1AD}
/* Le pied du site suit la bande sombre sans marge : deux aplats encre séparés
   par une bande plâtre ressemblaient à une page finie trop tôt. */
body.home .nm-pied{margin-top:0;border-top:1px solid rgba(255,255,255,.08)}

@media(max-width:860px){
  .nm-acc-haut,.nm-acc-couleur-tete,.nm-acc-couleur-bas,.nm-acc-tab,.nm-acc-af{grid-template-columns:minmax(0,1fr)}
  .nm-acc-haut{min-height:0}
  .nm-acc-photo{min-height:420px}
  .nm-acc-photo--symbole{min-height:160px}
  .nm-acc-carnet > *{grid-column:1/-1!important}
  .nm-acc-nuancier ul,.nm-acc-roue{grid-template-columns:repeat(6,minmax(0,1fr))}
  .nm-acc-roue{row-gap:18px}
  .nm-acc-roue button{height:110px}
  .nm-acc-grille,.nm-acc-rangee{grid-template-columns:repeat(2,minmax(0,1fr))}
  .nm-acc-engage{grid-template-columns:1fr 1fr}
  .nm-acc-cadres{min-height:220px}
}
/* Sur téléphone, l'étiquette ne flotte plus à côté du repère : elle se pose
   en bas de la photo, sur toute la largeur. */
@media(max-width:600px){
  .nm-acc-etiquette,.nm-acc-etiquette.a-gauche,.nm-acc-etiquette.vers-haut{left:12px;right:12px;top:auto;bottom:12px;width:auto;min-width:0;max-width:none}
}
@media(prefers-reduced-motion:reduce){
  .nm-acc *,.nm-acc-roue button{transition:none}
}

.nm-section{padding-block:clamp(52px,7vw,86px)}
.nm-section--alt{background:var(--fond-alt)}
.nm-tete{display:flex;flex-direction:column;gap:9px;margin-bottom:clamp(24px,3vw,38px)}
@media(min-width:860px){
  .nm-tete{flex-direction:row;align-items:flex-end;justify-content:space-between;gap:30px}
  .nm-tete p.nm-intro{max-width:46ch}
}

/* ==========================================================================
   9. FICHE PRODUIT
   ========================================================================== */
.nm-fi{display:grid;gap:clamp(26px,4vw,52px);padding-block:clamp(22px,3vw,38px);align-items:start}
@media(min-width:960px){.nm-fi{grid-template-columns:minmax(0,1.08fr) minmax(360px,.92fr)}}

/* ⚠️ L'ancienne galerie empilait les vues en colonne. La grille de la section 14
   la remplace ; cette règle la contredisait et annulait les deux colonnes. */
.nm-galerie-princ{border-radius:var(--r-m);overflow:hidden;background:var(--fond-alt);aspect-ratio:4/5}
.nm-galerie-princ img{width:100%;height:100%;object-fit:cover}
.nm-vignettes{display:grid;grid-template-columns:repeat(5,1fr);gap:8px}
.nm-vignettes button{
  padding:0;border:1px solid transparent;border-radius:var(--r-s);overflow:hidden;
  background:var(--fond-alt);aspect-ratio:1;cursor:pointer;
  transition:border-color var(--t-court),opacity var(--t-court);opacity:.72;
}
.nm-vignettes button[aria-current="true"]{border-color:var(--encre);opacity:1}
.nm-vignettes button:hover{opacity:1}
.nm-vignettes img{width:100%;height:100%;object-fit:cover}

/* La colonne d'achat reste visible : décision prise dans les deux tiers du panel */
.nm-achat{align-self:start}
@media(min-width:960px){.nm-achat{position:sticky;top:96px}}
.nm-fi-titre{font-size:clamp(1.5rem,3vw,2rem);margin-bottom:6px}

/* ----- Produits liés et assistant du mur (lot 3), sur une ligne -----------
   Sur le site d'origine, deux encarts de même hauteur empilés faisaient 926 px
   — un écran entier de défilement pour ce qui tient côte à côte.

   ⚠️ `auto-fit` et non `1fr 1fr` : quand l'un des deux manque, l'autre doit
   reprendre toute la largeur, pas laisser une colonne vide en face de lui. */
.nm-fi-duo{display:grid;gap:20px;align-items:start;margin-block:28px 0;
  grid-template-columns:repeat(auto-fit,minmax(420px,1fr))}
/* Les deux blocs portaient chacun le rythme vertical d'une section de page.
   Dans une grille, c'est la grille qui l'impose, sinon on additionne les deux. */
.nm-fi-duo > .nm-cpl{margin:0;height:100%}
.nm-fi-duo > .nm-section{padding-block:0}
.nm-fi-duo .enrob{max-width:none;padding-inline:0}

/* En colonne étroite, le titre et son introduction ne tiennent plus l'un à côté
   de l'autre : on les remet l'un sous l'autre à toute largeur d'écran. */
.nm-fi-duo .nm-tete{flex-direction:column;align-items:flex-start;gap:8px;
  margin-bottom:18px}
.nm-fi-duo .nm-tete p.nm-intro{max-width:none}

/* Le rythme de 86 px est celui d'une page d'accueil, où chaque section est une
   respiration. Sur une fiche, où l'on descend pour décider, il fait défiler
   dans le vide — 172 px mesurés entre deux encarts voisins. */
body.single-product .nm-section{padding-block:clamp(30px,3.6vw,50px)}

/* ----- Page d'accueil : le même calcul, en moins sévère ---------------------
   Les sections ne laissent aucun vide entre elles — mesuré, elles se touchent.
   Le blanc vient de l'ADDITION : 86 px de marge basse plus 86 px de marge haute
   font 172 px entre deux blocs de contenu. Ramené à 64, soit 128 px : assez
   pour que l'alternance des fonds respire, pas assez pour donner l'impression
   que la page est finie. */
body.home .nm-section{padding-block:clamp(40px,4.6vw,64px)}

.nm-fi-prix{font-size:26px;margin-block:4px 2px}
.nm-fi-prix del{font-size:18px;color:var(--encre-2);opacity:.65;margin-right:9px}
/* 🔥 Le franco rappelé SOUS le prix, pas seulement dans le bandeau. Un seul
   concurrent mondial le fait correctement, et c'est une recommandation Baymard. */
.nm-franco{font-size:13px;color:var(--sapin);margin-bottom:20px}

/* Sélecteurs : BOUTONS, jamais de menu déroulant. 71 % des sites de référence
   utilisent des boutons ; un menu masque la disponibilité jusqu'au clic. */
.nm-choix{display:flex;flex-direction:column;gap:9px;margin-bottom:20px}
.nm-choix-tete{display:flex;justify-content:space-between;align-items:baseline;gap:14px}
.nm-choix-tete .lab{font-size:12.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--encre-2)}
.nm-choix-tete .lab b{color:var(--encre);font-weight:500;text-transform:none;letter-spacing:.01em}
.nm-choix-tete a{font-size:13px;text-decoration:underline;text-underline-offset:3px;color:var(--encre-2)}
.nm-choix-tete a:hover{color:var(--sapin)}
.nm-opts{display:flex;flex-wrap:wrap;gap:8px}
.nm-opt{
  display:inline-flex;flex-direction:column;align-items:flex-start;gap:1px;
  padding:9px 13px;border:1px solid var(--filet);border-radius:var(--r-s);
  background:var(--fond-carte);cursor:pointer;
  transition:border-color var(--t-court),background var(--t-court),transform var(--t-court);
}
.nm-opt:hover{border-color:var(--encre-2)}
.nm-opt[aria-pressed="true"]{border-color:var(--encre);background:var(--encre);color:var(--fond)}
.nm-opt .dim{font-size:14px;font-family:"IBM Plex Mono",monospace;letter-spacing:-.02em}
/* 🔥 Le prix sur CHAQUE bouton de taille : supprime le clic de découverte, et
   un prix qui monte devient une information de dimension, pas une surprise. */
.nm-opt .px{font-size:11.5px;font-family:"IBM Plex Mono",monospace;opacity:.72}
.nm-opt[disabled]{opacity:.42;cursor:not-allowed;text-decoration:line-through}
.nm-opt--coul{padding:0;width:34px;height:34px;border-radius:50%;overflow:hidden}
.nm-opt--coul[aria-pressed="true"]{outline:2px solid var(--encre);outline-offset:2px;border-color:transparent}

.nm-rien-choisi{font-size:13px;color:var(--sapin);min-height:20px}

/* Le bandeau d'attributs sous l'ajout au panier : six arguments techniques
   scannables en deux secondes, pile au moment de la décision. */
.nm-attrs{
  display:grid;grid-template-columns:repeat(2,1fr);gap:1px;margin-top:20px;
  background:var(--filet-clair);border:1px solid var(--filet);border-radius:var(--r-m);overflow:hidden;
}
.nm-attr{background:var(--fond-carte);padding:11px 13px;display:flex;gap:9px;align-items:flex-start}
.nm-attr svg{width:17px;height:17px;flex:none;margin-top:2px;stroke:var(--sapin);fill:none;stroke-width:1.5}
.nm-attr span{font-size:13px;line-height:1.42}
.nm-attr b{display:block;font-family:"IBM Plex Mono",monospace;font-size:13px;font-weight:500}

/* Accordéons techniques, en sous-rubriques nommées */
.nm-acc{border-top:1px solid var(--filet);margin-top:26px}
.nm-acc details{border-bottom:1px solid var(--filet)}
.nm-acc summary{
  padding:15px 0;cursor:pointer;list-style:none;display:flex;justify-content:space-between;
  align-items:center;gap:14px;font-size:14.5px;font-weight:500;letter-spacing:.01em;
}
.nm-acc summary::-webkit-details-marker{display:none}
.nm-acc summary::after{content:"";width:9px;height:9px;border-right:1.4px solid var(--encre-2);border-bottom:1.4px solid var(--encre-2);transform:rotate(45deg) translateY(-2px);transition:transform var(--t-court)}
.nm-acc details[open] summary::after{transform:rotate(-135deg) translateY(-2px)}
.nm-acc .corps{padding-bottom:18px;font-size:15px;line-height:1.66;color:var(--encre)}
.nm-acc .corps p+p{margin-top:11px}
.nm-acc .corps ul{margin:11px 0 0;padding-left:18px}
.nm-acc .corps li{margin-bottom:5px}
/* ⚠️ Ni cadre, ni fond de cellule : un encadré complet donne un air de tableau
   de caractéristiques techniques, et ces lignes se lisent mieux comme une
   liste. Seuls les filets horizontaux restent — ce sont eux qui alignent l'œil
   d'une valeur à l'autre. */
.nm-specs{display:grid;margin-top:12px}
.nm-spec{
  padding:10px 2px;display:grid;grid-template-columns:150px 1fr;gap:12px;
  font-size:13.5px;border-bottom:1px solid var(--filet-clair);
}
.nm-spec:last-child{border-bottom:0}
.nm-spec dt{color:var(--encre-2)}
.nm-spec dd{margin:0;font-family:"IBM Plex Mono",monospace;font-size:13px}

/* ==========================================================================
   10. RAIL DE FILTRES
   Facettes déduites des données, en paramètres d'URL : partageables et
   indexables, sans script. Le jour où un attribut est alimenté, il apparaît.
   ========================================================================== */
.nm-boutique{display:grid;gap:clamp(20px,3vw,40px)}
@media(min-width:1000px){.nm-boutique{grid-template-columns:254px minmax(0,1fr)}}
.nm-rail{display:flex;flex-direction:column;gap:22px;align-self:start}
/* ⚠️ Ni `sticky`, ni `max-height`, ni `overflow-y` sur le rail.
   Le collage à l'écran oblige à plafonner la hauteur, le plafond fait
   apparaître une barre de défilement interne, et cette barre cache la fin des
   filtres à qui ne pense pas à faire défiler DANS la colonne. Deux
   défilements sur la même page, c'est un de trop. Le rail suit simplement la
   page, comme chez Woodmart. */
.nm-facette h4{font-size:11px;font-family:"Figtree",sans-serif;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--encre-2);margin-bottom:10px}
.nm-facette ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:3px}
.nm-facette label{display:flex;align-items:center;gap:9px;font-size:14px;cursor:pointer;padding:3px 0}
.nm-facette input{accent-color:var(--sapin);width:15px;height:15px}
.nm-facette .nb{margin-left:auto;font-family:"IBM Plex Mono",monospace;font-size:11.5px;color:var(--encre-2)}
/* Nuance : une pastille de la teinte du nuancier, à la place de rien. */
.nm-facette .nm-teinte{width:16px;height:16px;border-radius:50%;flex:none;box-shadow:inset 0 0 0 1px rgba(30,35,34,.14)}
/* Thème : des liens (chaque thème a sa page), pas des cases à cocher. */
.nm-facette-themes a{display:flex;align-items:center;gap:9px;font-size:14px;padding:4px 0;color:var(--encre);text-decoration:none}
.nm-facette-themes a:hover span:first-child{text-decoration:underline;text-underline-offset:3px}
.nm-facette-themes a.est-actif{font-weight:600;color:var(--sapin)}
.nm-jetons{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:18px}
.nm-jeton{
  display:inline-flex;align-items:center;gap:7px;padding:5px 11px;
  border:1px solid var(--filet);border-radius:99px;background:var(--fond-carte);font-size:13px;
}
.nm-jeton button{border:0;background:0;cursor:pointer;line-height:1;font-size:15px;color:var(--encre-2)}
.nm-jeton button:hover{color:var(--sapin)}

/* Le rail : replié derrière un bouton sur petit écran, toujours ouvert au-delà */
.nm-rail-boite > summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:9px;
  padding:12px 16px;border:1px solid var(--filet);border-radius:var(--r-s);
  background:var(--fond-carte);font-size:14px;font-weight:500;letter-spacing:.02em;
  margin-bottom:16px;
}
.nm-rail-boite > summary::-webkit-details-marker{display:none}
.nm-rail-boite > summary::before{
  content:"";width:15px;height:15px;flex:none;
  background:linear-gradient(var(--encre),var(--encre)) 0 3px/15px 1.4px no-repeat,
             linear-gradient(var(--encre),var(--encre)) 0 7.5px/11px 1.4px no-repeat,
             linear-gradient(var(--encre),var(--encre)) 0 12px/7px 1.4px no-repeat;
}
.nm-rail-nb{
  margin-left:auto;background:var(--sapin);color:#fff;font-size:11px;
  min-width:19px;height:19px;line-height:19px;text-align:center;border-radius:10px;
}
@media(min-width:1000px){
  .nm-rail-boite > summary{display:none}
  .nm-rail-boite{display:block}
}

/* ==========================================================================
   11. PIED
   ========================================================================== */
.nm-pied{background:var(--encre);color:var(--fond);padding-block:clamp(44px,6vw,70px) 26px;margin-top:clamp(50px,7vw,90px)}
.nm-pied-grille{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:34px}
.nm-pied h4{font-size:11px;font-family:"Figtree",sans-serif;font-weight:600;letter-spacing:.14em;text-transform:uppercase;opacity:.62;margin-bottom:13px}
.nm-pied ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:7px}
.nm-pied a{font-size:14px;opacity:.9}
.nm-pied a:hover{opacity:1;text-decoration:underline;text-underline-offset:3px}
/* --- Moyens de paiement -------------------------------------------------
   🚨 `.nm-pied ul` (0,1,1) bat `.nm-paiements-liste` (0,1,0) : sans le
   préfixe, la bande héritait du `flex-direction:column` des colonnes du pied
   et les cinq marques s'empilaient les unes sous les autres. Aucune erreur,
   juste une colonne de logos.

   Chaque marque a sa propre proportion — Visa est un long mot, Mastercard
   empile ses disques sur son nom — donc une pastille de taille commune, et la
   hauteur réglée marque par marque pour que les cinq pèsent le même poids à
   l'œil. Apple Pay arrive avec son propre fond, elle se pose nue.
   ------------------------------------------------------------------------ */
.nm-paiements{
  margin-top:38px;padding-top:22px;border-top:1px solid rgba(243,243,240,.16);
  display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;
}
.nm-paiements-titre{
  font-family:"Figtree",sans-serif;font-size:11px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;opacity:.62;
}
.nm-pied .nm-paiements-liste,
.nm-paiements-liste{
  display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;
  gap:8px;margin:0;padding:0;list-style:none;
}
.nm-paiements-liste li{
  background:var(--blanc);border-radius:var(--r-s);
  width:54px;height:34px;display:flex;align-items:center;justify-content:center;
}
.nm-paiements-liste img{max-width:40px;max-height:24px;width:auto;height:auto;display:block}
.nm-paiements-liste li[data-marque="mastercard"] img{max-height:28px;max-width:34px}
.nm-paiements-liste li[data-marque="paypal"] img{max-height:15px}
.nm-paiements-liste li[data-marque="visa"] img{max-height:15px}
/* Apple Pay : pas de pastille, la marque en porte déjà une — Apple interdit
   de la retoucher, et deux contours l'un dans l'autre se voient. */
.nm-paiements-liste li.nm-paiement--nu{background:none;width:auto;height:34px}
.nm-paiements-liste li.nm-paiement--nu img{max-width:none;max-height:34px}
.nm-paiements-liste li[data-marque="cb"] img{max-height:22px}
/* Transporteurs : même pastille, élargie à la mesure du mot. */
.nm-transporteurs .nm-paiements-liste li{width:auto;min-width:54px;padding:0 10px}
.nm-transporteurs .nm-paiements-liste img{height:16px;width:auto;max-width:none;max-height:none}
.nm-transporteurs .nm-paiements-liste li[data-transporteur="gls"] img{height:15px}
.nm-transporteurs .nm-paiements-liste li[data-transporteur="dpd"] img{height:20px}
/* Pied de page : paiement et livraison côte à côte, empilés sur mobile. */
.nm-pied-bandes{display:flex;flex-wrap:wrap;gap:0 48px;margin-top:38px;padding-top:22px;border-top:1px solid rgba(243,243,240,.16)}
.nm-pied-bandes .nm-paiements{margin-top:0;padding-top:0;border-top:0}
/* Fiche produit : la bande sous la date de livraison, sur fond clair. */
.nm-fp .nm-transporteurs{margin-top:14px;padding-top:0;border-top:0}
.nm-fp .nm-transporteurs .nm-paiements-liste li{border:1px solid var(--filet)}

/* Panier et commande : le fond est clair, la pastille blanche s'y perdrait. */
.woocommerce .nm-paiements{border-top-color:var(--filet-clair);justify-content:center;margin-top:26px}
.woocommerce .nm-paiements-titre{opacity:.72}
.woocommerce .nm-paiements-liste li{border:1px solid var(--filet-clair)}
.woocommerce .nm-paiements-liste li.nm-paiement--nu{border:0}

.nm-pied-bas{margin-top:38px;padding-top:20px;border-top:1px solid rgba(243,243,240,.16);display:flex;flex-wrap:wrap;gap:12px 26px;justify-content:space-between;font-size:12.5px;opacity:.72}
/* La bande des paiements porte déjà le filet : deux traits l’un sur l’autre. */
.nm-paiements + .nm-pied-bas{margin-top:18px;padding-top:0;border-top:0}
.nm-lettre{display:flex;gap:8px;margin-top:14px;max-width:340px}
.nm-lettre input{flex:1;min-width:0;padding:11px 13px;border:1px solid rgba(243,243,240,.28);background:transparent;color:var(--fond);border-radius:var(--r-s);font-size:14px}
.nm-lettre input::placeholder{color:rgba(243,243,240,.5)}
.nm-lettre button{padding:11px 18px;border:0;border-radius:var(--r-s);background:var(--fond);color:var(--encre);font-size:13px;font-weight:500;cursor:pointer;letter-spacing:.04em;text-transform:uppercase}
.nm-lettre button:hover{background:var(--sapin);color:#fff}

/* ==========================================================================
   12. ANIMATIONS — depuis un état VISIBLE au repos
   Un bloc parqué à opacity:0 en attente d'un observateur ne s'affiche pas dans
   la première image ni pour qui a coupé les animations.
   ========================================================================== */
@media(prefers-reduced-motion:no-preference){
  .nm-monte{opacity:0;transform:translateY(16px);transition:opacity .62s cubic-bezier(.22,1,.36,1),transform .62s cubic-bezier(.22,1,.36,1)}
  .nm-monte.est-vu{opacity:1;transform:none}
  .nm-monte:nth-child(2){transition-delay:.06s}
  .nm-monte:nth-child(3){transition-delay:.12s}
  .nm-monte:nth-child(4){transition-delay:.18s}
  /* Filet de sécurité : si le script ne tourne pas, tout redevient visible. */
  html.sans-js .nm-monte{opacity:1;transform:none}
}

/* ==========================================================================
   13. ADAPTATION AUX ÉCRANS
   ========================================================================== */
@media(max-width:1100px){
  /* Six onglets entre 860 et 1100 px : on resserre plutôt que de laisser un
     intitulé se casser sur trois lignes. */
  .nm-nav{gap:clamp(10px,1.6vw,20px)}
  .nm-nav > li > a{font-size:13px;letter-spacing:.02em}
  ul.products{grid-template-columns:repeat(2,1fr)}
  .nm-mega-grille{grid-template-columns:repeat(var(--cols,2),minmax(0,1fr)) 260px}
  /* 🚨 Après `.nm-mega-grille` : les deux sélecteurs ont la même spécificité,
     donc c'est l'ordre qui tranche. Le méga « Catégories » passe à trois
     colonnes et ne réserve pas de piste pour une carte qu'il n'a pas. */
  .nm-mega-cats{grid-template-columns:repeat(3,minmax(0,1fr))}
  .nm-pied-grille{grid-template-columns:1fr 1fr}
}
@media(max-width:860px){
  .nm-entete-int{grid-template-columns:auto 1fr;min-height:62px}
  /* 🚨 Le défilement horizontal de la nav n'est appliqué QUE sous ce palier :
     au-dessus, il rognerait le méga-menu. */
  .nm-nav{display:none}
  /* 🚨 Masquer la liste ne suffit pas : le <nav> vide restait un élément de
     la grille, et les icônes passaient sur une seconde ligne sous le logo. */
  .nm-entete-int > nav{display:none}
  .nm-attrs{grid-template-columns:1fr}
}
/* Logo et quatre icônes de 44 px (cible tactile) sur une ligne : on resserre
   le nom et la gouttière, sans rien retirer ni rapetisser les cibles. */
@media(max-width:480px){
  .nm-entete-int{gap:8px}
  .nm-entete-int .nm-logo{font-size:13.5px}
  .nm-actions{gap:0}
  .nm-actions .nm-icone{width:44px;height:44px}
}
@media(max-width:400px){
  .nm-entete .enrob{padding-inline:12px}
  .nm-entete-int .nm-logo{font-size:12.5px}
}
@media(max-width:620px){
  body{font-size:15.5px}
  ul.products{grid-template-columns:repeat(2,1fr);gap:14px}
  .nm-vignettes{grid-template-columns:repeat(4,1fr)}
  .nm-spec{grid-template-columns:1fr;gap:2px}
  .nm-pied-grille{grid-template-columns:1fr}
  .nm-fi-prix{font-size:23px}
}

/* Menu mobile en tiroir */
.nm-tiroir{
  position:fixed;inset:0 auto 0 0;width:min(86vw,360px);z-index:90;
  background:var(--fond-carte);box-shadow:var(--ombre-l);
  transform:translateX(-102%);transition:transform var(--t-moyen);
  display:flex;flex-direction:column;overflow-y:auto;padding:22px var(--gouttiere) 40px;
}
.nm-tiroir.est-ouvert{transform:none}
.nm-voile{position:fixed;inset:0;z-index:80;background:rgba(30,35,34,.42);opacity:0;visibility:hidden;transition:opacity var(--t-moyen),visibility var(--t-moyen)}
.nm-voile.est-ouvert{opacity:1;visibility:visible}
.nm-tiroir details{border-bottom:1px solid var(--filet-clair)}
.nm-tiroir summary{padding:14px 0;cursor:pointer;list-style:none;font-size:16px;display:flex;justify-content:space-between;align-items:center}
.nm-tiroir summary::-webkit-details-marker{display:none}
.nm-tiroir summary::after{content:"+";font-family:"IBM Plex Mono",monospace;color:var(--encre-2)}
.nm-tiroir details[open] summary::after{content:"–"}
.nm-tiroir details ul{margin:0 0 14px;padding:0;list-style:none;display:flex;flex-direction:column;gap:9px}
.nm-tiroir details a{font-size:14.5px;color:var(--encre-2)}
/* « Par thème » s'ouvre sur les familles : un cran de retrait, pas de second filet. */
.nm-tiroir details details{margin-left:12px}
.nm-tiroir details details:last-child{border-bottom:0}

/* Impression : la page sort sans l'habillage du site */
@media print{
  .nm-entete,.nm-pied,.nm-bandeau,.nm-ajout,.nm-rail{display:none!important}
  body{background:#fff;font-size:12pt}
}

/* Tiroir mobile : les sous-rayons d'un univers. */
.nm-tiroir .nm-tiroir-sous{margin:2px 0 6px;padding-left:12px;border-left:1px solid var(--filet);list-style:none}
.nm-tiroir .nm-tiroir-sous a{font-size:14px;color:var(--encre-2)}

/* ==========================================================================
   14. FICHE PRODUIT — structure reprise de Woodmart (démo furniture2)
   La galerie défile le long d'une colonne d'achat collante, puis viennent les
   deux colonnes Détails / Description.
   Le ton, lui, ne change pas : pas d'orange, pas de typographie arrondie.
   ========================================================================== */
.nm-fi-tete{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:14px;padding-block:18px;
}

/* --- Navigation dans le rayon ------------------------------------------- */
.nm-nav-produit{display:flex;align-items:center;gap:8px;font-size:13px}
.nm-nav-produit-lien{position:relative;display:grid;place-items:center;width:30px;height:30px;border:1px solid var(--filet);border-radius:50%}
.nm-nav-produit-lien:hover{border-color:var(--sapin);color:var(--sapin)}
.nm-nav-produit .nm-fleche{font-size:17px;line-height:1}
/* La vignette n'apparaît qu'au survol : elle informe sans encombrer. */
.nm-nav-produit-carte{
  position:absolute;top:calc(100% + 8px);z-index:30;
  display:flex;gap:10px;align-items:center;width:232px;padding:10px;
  background:var(--fond-carte);border:1px solid var(--filet);border-radius:var(--r-m);
  box-shadow:var(--ombre-l);opacity:0;visibility:hidden;transform:translateY(-4px);
  transition:opacity var(--t-court),transform var(--t-court),visibility var(--t-court);
}
.nm-nav-produit--prev .nm-nav-produit-carte{left:0}
.nm-nav-produit--next .nm-nav-produit-carte{right:0}
.nm-nav-produit-lien:hover .nm-nav-produit-carte,
.nm-nav-produit-lien:focus-visible .nm-nav-produit-carte{opacity:1;visibility:visible;transform:none}
.nm-nav-produit-carte img{width:54px;height:54px;object-fit:cover;border-radius:4px;flex:none}
.nm-nav-produit-titre{display:block;font-size:13px;line-height:1.35;color:var(--encre)}
.nm-nav-produit-prix{font-size:12px;color:var(--encre-2)}
.nm-nav-produit-retour{margin-left:6px;font-size:12.5px;color:var(--encre-2)}
.nm-nav-produit-retour:hover{color:var(--sapin)}

/* --- Galerie en grille --------------------------------------------------- */
/* 🚨 Première version : chaque tuile portait un `aspect-ratio` et un fond sable.
   Les visuels du fournisseur ont des proportions très inégales — des détourés
   carrés sur blanc à côté de photos d'ambiance verticales — et le fond
   apparaissait sous chacun, en bande. Pire, `.nm-tuile{aspect-ratio:4/5}` était
   écrit APRÈS `.nm-tuile--large{aspect-ratio:16/11}` : même spécificité, donc
   la grande tuile n'a jamais eu son format.

   La galerie de furniture2 ne force AUCUN format : chaque image garde sa
   hauteur naturelle, et aucun fond ne peut dépasser puisqu'il n'y a plus de
   vide à remplir. On fait pareil. */
.nm-galerie{display:grid;grid-template-columns:1fr;gap:10px;align-items:start}
.nm-tuile{margin:0;overflow:hidden;border-radius:var(--r-m);position:relative;background:var(--fond-carte)}
.nm-tuile img,.nm-tuile video{width:100%;height:auto;display:block}
.nm-tuile img{cursor:zoom-in}
.nm-video-son{
  position:absolute;right:12px;bottom:12px;padding:6px 12px;font-size:11px;
  letter-spacing:.12em;text-transform:uppercase;border:1px solid rgba(255,255,255,.7);
  border-radius:100px;background:rgba(30,35,34,.35);color:#fff;cursor:pointer;
  backdrop-filter:blur(4px);
}
.nm-video-son:hover{background:rgba(30,35,34,.6)}
@media(min-width:900px){
  .nm-galerie{grid-template-columns:1fr 1fr}
}
/* La galerie se colle pendant qu'on parcourt la colonne d'achat. La plupart de nos
   fiches n'ont qu'une à trois vues : sans cela, les photos disparaissent au
   premier défilement et on choisit un format sans plus voir le produit.
   ⚠️ Le collage n'est posé qu'au-dessus de 960 px — c'est le palier où les deux
   colonnes existent — et seulement si la galerie tient dans l'écran, sans quoi
   son bas deviendrait inatteignable. */
@media(min-width:960px){
  .nm-galerie{position:sticky;top:96px;align-self:start}
}
@media(prefers-reduced-motion:no-preference){
  .nm-tuile{will-change:transform}
}

/* --- Deux colonnes Détails / Description --------------------------------- */
.nm-deux-colonnes{display:grid;gap:40px;align-items:start}
@media(min-width:900px){.nm-deux-colonnes{grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr);gap:64px}}
.nm-tete-col{
  font-size:1.05rem;padding-bottom:12px;margin-bottom:18px;
  border-bottom:1px solid var(--encre);
}
.nm-deux-colonnes .nm-prose > *{max-width:none}

.nm-encart-contact{background:var(--fond-carte);border:1px solid var(--filet);border-radius:var(--r-m);padding:24px}
.nm-encart-contact h3{font-size:1.05rem;margin-bottom:10px}
.nm-encart-contact p{font-size:14.5px;color:var(--encre-2);margin-bottom:12px;line-height:1.6}
.nm-lien-fort{color:var(--sapin);text-decoration:underline;text-underline-offset:3px}
.nm-video-son.est-actif{background:var(--sapin);border-color:var(--sapin)}
.nm-loupe{
  position:fixed;inset:0;z-index:200;display:grid;place-items:center;
  background:rgba(30,35,34,.88);padding:4vmin;cursor:zoom-out;
  animation:nm-apparait .18s ease-out;
}
.nm-loupe img{max-width:100%;max-height:92vh;object-fit:contain;border-radius:var(--r-m)}
@keyframes nm-apparait{from{opacity:0}to{opacity:1}}

/* --- Conteneurs en carte, comme furniture2 -------------------------------
   Chez Woodmart, chaque grand bloc de la fiche est posé sur une carte blanche
   détachée du fond. C'est ce qui donne la sensation de finition. On reprend le
   principe avec notre fond et notre filet, sans ombre portée : notre palette
   est mate, une ombre y ferait tache. */
.nm-carte-bloc{
  background:var(--fond-carte);border:1px solid var(--filet);
  border-radius:var(--r-m);padding:clamp(24px,3.4vw,48px);
  max-width:var(--large);margin-inline:auto;
}

/* --- Pastilles produit --------------------------------------------------- */
/* Les pastilles vont en haut à droite : le coin gauche reste libre pour une
   étiquette sur la photo, si un module en pose une. */
.nm-pastilles{position:absolute;top:10px;right:10px;z-index:3;display:flex;flex-direction:column;gap:6px;align-items:flex-end}
.nm-pastille-prod{
  font-family:"Figtree",sans-serif;font-size:10.5px;font-weight:600;
  letter-spacing:.12em;text-transform:uppercase;padding:5px 10px;border-radius:100px;
  background:var(--encre);color:var(--fond);
}
.nm-pastille-prod--remise{background:var(--sapin)}
.nm-pastille-prod--neuf{background:var(--sapin)}

/* Lisibles sur un détouré blanc comme sur une photo sombre, sans cadre autour. */
.nm-pastille-prod{box-shadow:0 1px 6px rgba(30,35,34,.16)}
.nm-achat-boutons{display:grid;gap:8px}
@media(min-width:420px){.nm-achat-boutons{grid-template-columns:1.25fr 1fr}}

/* --- Pastilles de coloris ------------------------------------------------
   Chaque pastille est un LIEN vers un autre produit (fiches distinctes de la
   même famille, lot 2). Un bouton de sélection laisserait croire le contraire. */
.nm-coloris{margin-top:20px}
.nm-coloris ul{list-style:none;margin:10px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:8px}
.nm-pastille-coul{
  display:block;width:44px;height:44px;border-radius:var(--r-m);overflow:hidden;
  border:1px solid var(--filet);background:var(--fond-alt);
  transition:border-color var(--t-court),transform var(--t-court);
}
.nm-pastille-coul img{width:100%;height:100%;object-fit:cover}
.nm-pastille-coul:hover{border-color:var(--encre-2);transform:translateY(-1px)}
.nm-pastille-coul.est-actif{border-color:var(--sapin);box-shadow:0 0 0 1px var(--sapin)}
.nm-pastille-coul.est-epuise{opacity:.45}
.nm-pastille-coul.est-epuise:hover{opacity:.75}
.nm-pastille-coul-texte{
  display:grid;place-items:center;width:100%;height:100%;
  font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--encre-2);
}

/* ==========================================================================
   15. PAGE DE RAYON — mise en page reprise de Woodmart (démo furniture2)
   Colonne de filtres à demeure, cartes blanches, barre d'outils, et un bloc de
   maillage en bas. Le fond de page reste notre sable : ce sont les cartes qui
   se détachent, pas l'inverse.
   ========================================================================== */

/* --- La colonne de filtres reste ouverte sur grand écran -----------------
   🚨 Sur téléphone elle se replie derrière un bouton, sinon le visiteur ne voit
   que des cases à cocher sur trois écrans. Au-dessus de 1000 px elle est à
   demeure : `display:contents` efface le <details> de la mise en page pour que
   ses enfants participent directement à la grille. */
@media(min-width:1000px){
  .nm-rail-boite{display:contents}
  .nm-rail-boite > summary{display:none}
  .nm-rail-boite > .nm-rail{display:flex!important}
}
.nm-rail{display:flex;flex-direction:column;gap:14px}
.nm-facette{
  background:var(--fond-carte);border:1px solid var(--filet);
  border-radius:var(--r-m);padding:16px 18px;
}
.nm-facette h4{
  font-family:"Figtree",sans-serif;font-size:11px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;color:var(--encre-2);
  margin-bottom:10px;
}

/* --- Barre d'outils ------------------------------------------------------ */
.nm-barre{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:14px;padding-bottom:16px;margin-bottom:22px;border-bottom:1px solid var(--filet);
}
.nm-barre-compte{font-size:13px;color:var(--encre-2)}
.nm-barre-outils{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.nm-barre-lib{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--encre-2)}
.nm-par-page{display:flex;align-items:center;gap:2px;font-family:"IBM Plex Mono",monospace;font-size:12.5px}
.nm-par-page a{padding:3px 7px;border-radius:var(--r-s);color:var(--encre-2)}
.nm-par-page a:hover{color:var(--encre)}
.nm-par-page a.est-actif{background:var(--encre);color:var(--fond)}
.nm-barre .woocommerce-ordering select{
  font-size:13.5px;padding:7px 12px;border:1px solid var(--filet);
  border-radius:var(--r-m);background:var(--fond-carte);
}

/* --- Cartes produit : l'encart blanc de Woodmart ------------------------- */
body.nm-theme ul.products li.product{
  background:var(--fond-carte);border:1px solid var(--filet);
  border-radius:var(--r-m);padding:10px 10px 16px;
  transition:border-color var(--t-court),transform var(--t-court);
}
body.nm-theme ul.products li.product:hover{border-color:var(--filet-fonce,var(--encre-2));transform:translateY(-2px)}
body.nm-theme ul.products li.product .nm-visuel{border-radius:var(--r-s)}
body.nm-theme ul.products li.product .woocommerce-loop-product__title,body.nm-theme ul.products li.product .price{padding-inline:4px}

/* --- Bloc de maillage ---------------------------------------------------- */
.nm-maillage{
  margin-top:56px;padding-top:40px;border-top:1px solid var(--filet);
}
/* Le texte de bas de rayon : de la prose, pas une liste de liens.
   Deux colonnes sur grand écran pour que les lignes gardent une longueur
   lisible sans laisser un bloc de texte solitaire au milieu de la page. */
.nm-maillage-texte{max-width:none}
.nm-maillage-texte > *{max-width:none}
@media(min-width:1000px){
  /* Sur toute la largeur, deux colonnes laisseraient des lignes de 550 px —
     bien au-delà du confort de lecture. Trois colonnes ramènent chaque ligne
     autour de 65 signes, ce qui est la bonne mesure. */
  /* 🚨 Pas de `column-span:all` sur les intertitres : chaque section devenait
     un bloc à part dont l'unique paragraphe (insécable) tenait dans la
     première colonne, les deux autres restant vides — un texte étroit et très
     haut (28/09). Les intertitres suivent le flux : les sections se rangent
     côte à côte. */
  .nm-maillage-texte{columns:3;column-gap:52px}
}
@media(min-width:1000px) and (max-width:1320px){
  .nm-maillage-texte{columns:2;column-gap:48px}
}
.nm-maillage-texte h2{font-size:1.25rem;margin-bottom:14px}
.nm-maillage-texte p + h2{margin-top:1.6em}
/* Le premier titre n'a pas de marge haute : en haut des colonnes 2 et 3 le
   navigateur supprime celle des titres suivants, et la première colonne
   partait plus bas que les autres. */
.nm-maillage-texte > :first-child{margin-top:0}
.nm-maillage-texte h3{font-size:1rem;margin-top:1.6em}
/* Un titre ne se sépare jamais du paragraphe qu'il annonce : en colonnes, il
   se retrouverait seul en bas de la première et son texte en haut de la seconde. */
.nm-maillage-texte h2,.nm-maillage-texte h3{break-after:avoid;break-inside:avoid}
.nm-maillage-texte p{break-inside:avoid;font-size:14.5px;color:var(--encre-2);line-height:1.7}
.nm-maillage-texte p + p{margin-top:1em}
.nm-maillage-texte a{
  color:var(--encre);text-decoration:underline;text-underline-offset:3px;
  text-decoration-thickness:1px;text-decoration-color:var(--filet);
}
.nm-maillage-texte a:hover{color:var(--sapin);text-decoration-color:currentColor}
/* Belt and braces : les navigateurs qui exposent ::details-content. */
@media(min-width:1000px){
  .nm-rail-boite::details-content{content-visibility:visible!important}
}

/* --- Cartouches de coloris et de dimensions sur les cartes ---------------
   Ce sont des LIENS vers d'autres fiches de la même famille (lot 2). */
.nm-nuancier{display:flex;flex-wrap:wrap;align-items:center;gap:5px;margin-top:2px}
.nm-nuancier .nm-pastille-coul{
  width:15px;height:15px;border-radius:50%;display:block;flex:none;
  border:1px solid rgba(30,35,34,.18);box-shadow:inset 0 0 0 1.5px var(--fond-carte);
  transition:transform var(--t-court),box-shadow var(--t-court);
}
.nm-nuancier a.nm-pastille-coul:hover{transform:scale(1.18)}
.nm-nuancier .nm-pastille-coul.est-actif{box-shadow:inset 0 0 0 1.5px var(--fond-carte),0 0 0 1.5px var(--sapin)}
.nm-nuancier .nm-pastille-coul.est-epuise{opacity:.4}
.nm-nuancier .reste{font-size:11.5px;color:var(--encre-2);margin-left:2px}
.nm-nuancier .sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}

.nm-dims{display:flex;flex-wrap:wrap;gap:5px;margin-top:6px}
.nm-dim{
  font-family:"IBM Plex Mono",monospace;font-size:11px;letter-spacing:-.01em;
  padding:4px 8px;border:1px solid var(--filet);border-radius:var(--r-s);
  color:var(--encre-2);white-space:nowrap;
}
.nm-dim:hover{border-color:var(--encre-2);color:var(--encre)}
.nm-dim.est-actif{border-color:var(--encre);color:var(--encre);background:var(--fond-alt)}
.nm-dim.est-epuise{opacity:.45;text-decoration:line-through}
.nm-dims .reste{font-size:11.5px;color:var(--encre-2);align-self:center}
.nm-sous-col{font-size:.92rem;margin-top:1.8em;margin-bottom:.6em;color:var(--encre)}
.nm-liste-fait{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}
.nm-liste-fait li{
  font-size:13.5px;color:var(--encre-2);line-height:1.55;
  padding-left:14px;position:relative;
}
.nm-liste-fait li::before{content:"";position:absolute;left:0;top:.62em;width:5px;height:1px;background:var(--sapin)}

/* --- Coloris sans teinte connue -------------------------------------------
   Le fournisseur range ses noms de MODÈLE dans le champ Couleur — « Opulence »,
   « Liberty », « Xila », « Z'amimaux ». Aucune teinte ne les représente. Plutôt
   qu'une pastille inventée, on écrit le nom : il dit quelque chose, une fausse
   couleur non. */
.nm-coul-nom{
  display:inline-flex;align-items:center;height:15px;padding:0 7px;
  border:1px solid var(--filet);border-radius:8px;
  font-size:10.5px;line-height:1;color:var(--encre-2);
  background:var(--fond-carte);white-space:nowrap;
  transition:border-color var(--t-court)
}
a.nm-coul-nom:hover{border-color:var(--encre-2)}
.nm-coul-nom.est-actif{border-color:var(--sapin);color:var(--encre)}
.nm-coul-nom.est-epuise{opacity:.45}
/* Sur la fiche produit, le bouton de coloris sans teinte porte son nom. */
.nm-opt--sans-teinte{width:auto;min-width:0;padding:0 10px;font-size:12px;
  background:var(--fond-carte);color:var(--encre-2)}
.nm-opt--sans-teinte .nom{display:block;line-height:1}

/* --- Carrousel de produits -------------------------------------------------
   Quatre visibles, douze dans le rail. Le défilement est natif : `scroll-snap`
   fait le calage, `scrollBy` fait le mouvement. Aucune position calculée à la
   main, donc rien à recalculer au redimensionnement — et le rail reste
   utilisable à la souris, au doigt et au clavier même sans JavaScript. */
.nm-carrousel{position:relative}
ul.products.nm-carrousel-rail{
  grid-template-columns:none;
  grid-auto-flow:column;
  grid-auto-columns:calc((100% - 3 * clamp(18px,2.4vw,30px)) / 4);
  overflow-x:auto;
  scroll-snap-type:x mandatory;
  scroll-behavior:smooth;
  /* La carte a une ombre au survol : sans ces marges, elle est rognée par le
     conteneur qui défile. */
  padding:4px;margin:-4px;
  /* 🚨 La barre de défilement horizontale est inutile ici — les flèches disent
     déjà qu'il y a une suite — et elle sautait sous la première rangée. */
  scrollbar-width:none;-ms-overflow-style:none;
}
ul.products.nm-carrousel-rail::-webkit-scrollbar{display:none}
ul.products.nm-carrousel-rail > li.product{scroll-snap-align:start}

.nm-carrousel-fleche{
  position:absolute;top:calc(50% - 60px);z-index:4;
  width:42px;height:42px;border-radius:50%;
  display:grid;place-items:center;
  font-size:22px;line-height:1;padding-bottom:3px;
  background:var(--fond-carte);color:var(--encre);
  border:1px solid var(--filet);box-shadow:0 2px 10px rgba(30,35,34,.12);
  cursor:pointer;transition:border-color var(--t-court),opacity var(--t-court)
}
.nm-carrousel-fleche:hover{border-color:var(--sapin)}
.nm-carrousel-fleche--prec{left:-21px}
.nm-carrousel-fleche--suiv{right:-21px}
/* Bout de course : le bouton s'efface mais reste en place, pour que la rangée
   ne se déplace pas sous le curseur. */
.nm-carrousel-fleche[disabled]{opacity:.28;cursor:default;box-shadow:none}
@media(max-width:1000px){
  ul.products.nm-carrousel-rail{grid-auto-columns:calc((100% - clamp(14px,2.4vw,30px)) / 2)}
  .nm-carrousel-fleche--prec{left:-8px}
  .nm-carrousel-fleche--suiv{right:-8px}
}
@media(max-width:600px){
  ul.products.nm-carrousel-rail{grid-auto-columns:78%}
}

/* --- Fenêtres --------------------------------------------------------------
   `<dialog>` est masqué par défaut par le navigateur ; on n'habille que son
   état ouvert. Le fond vient de ::backdrop, que seul un vrai <dialog> ouvert
   par showModal() peut avoir — une fenêtre faite à la main doit le dessiner. */

/* --- Le journal sur l'accueil ---------------------------------------------- */
.nm-journal{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(18px,2.4vw,30px)}
/* Article : fil de la rubrique et mesure de lecture */
.nm-article-fil a{color:var(--encre-2);text-decoration:none}
.nm-article-fil a:hover{color:var(--sapin);text-decoration:underline;text-underline-offset:3px}
.nm-article-meta{color:var(--encre-2);font-size:13px;margin:0 0 24px}
.nm-article-suite{border-top:1px solid var(--filet)}
/* Article : texte à gauche, visuels cités à droite, collés pendant la lecture */
.nm-article-grille{display:grid;grid-template-columns:minmax(0,1fr) 260px;gap:clamp(28px,4vw,64px);align-items:start}
.nm-article-grille--seule{grid-template-columns:minmax(0,1fr)}
.nm-article-cote{position:sticky;top:112px;padding:16px;border:1px solid var(--filet);border-radius:var(--r-m);background:var(--fond-carte)}
.nm-article-cote ul{list-style:none;margin:10px 0 0;padding:0;display:flex;flex-direction:column;gap:10px}
.nm-article-cote a{display:grid;grid-template-columns:72px minmax(0,1fr);grid-template-rows:auto auto;column-gap:12px;align-items:center;color:var(--encre);text-decoration:none}
.nm-article-cote img{grid-row:1 / span 2;width:72px;height:72px;object-fit:contain;background:#fff;border-radius:var(--r-s)}
.nm-article-cote-t{font-size:13.5px;line-height:1.35;align-self:end}
.nm-article-cote-p{font-size:12.5px;color:var(--encre-2);align-self:start;margin-top:3px}
.nm-article-cote a:hover .nm-article-cote-t{color:var(--sapin);text-decoration:underline;text-underline-offset:3px}
@media(max-width:1000px){
  .nm-article-grille{grid-template-columns:minmax(0,1fr)}
  .nm-article-cote{position:static}
  .nm-article-cote ul{flex-direction:row;overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:6px}
  .nm-article-cote li{flex:0 0 210px;scroll-snap-align:start}
}
.nm-art{background:var(--fond-carte);border:1px solid var(--filet);border-radius:var(--r-m);overflow:hidden}
.nm-art-lien{display:flex;flex-direction:column;height:100%;color:inherit}
.nm-art-visuel{display:block;aspect-ratio:16/10;overflow:hidden;background:var(--filet-clair)}
.nm-art-visuel img{width:100%;height:100%;object-fit:cover;transition:transform var(--t-long)}
.nm-art:hover .nm-art-visuel img{transform:scale(1.04)}
.nm-art-txt{display:flex;flex-direction:column;gap:7px;padding:18px 18px 20px;flex:1}
.nm-art-cat{color:var(--sapin)}
.nm-art-titre{font-family:"Fraunces",serif;font-size:1.12rem;line-height:1.3;font-weight:400}
.nm-art:hover .nm-art-titre{color:var(--sapin)}
.nm-art-chapo{font-size:14px;line-height:1.6;color:var(--encre-2)}
/* La date est poussée en bas : sans ça, elle flotte à des hauteurs différentes
   d'une carte à l'autre selon la longueur du chapô. */
.nm-art-date{margin-top:auto;padding-top:10px;font-size:12px;color:var(--encre-2)}
@media(max-width:900px){.nm-journal{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:600px){.nm-journal{grid-template-columns:1fr}}
/* La teinte remplit la pastille quand la photo de la variante manque. */
.nm-pastille-coul-fond{display:block;width:100%;height:100%;border-radius:inherit}
/* Et quand même la teinte est inconnue, on écrit le nom : une pastille large,
   pas deux lettres. Voir le commentaire du gabarit. */
.nm-pastille-coul:has(.nm-pastille-coul-texte){width:auto;min-width:44px;padding:0 10px}
.nm-pastille-coul-texte{font-size:11px;letter-spacing:.02em;text-transform:none;white-space:nowrap}

/* --- Le nom du coloris au survol de la pastille ----------------------------
   Une pastille seule ne dit pas « safran minéral ». L'infobulle native du
   navigateur le dirait, mais avec une seconde de retard et sans aucun style :
   sur une fiche à neuf coloris, on abandonne avant.

   ⚠️ Les gabarits ne posent donc PLUS de `title` — sinon le navigateur
   dessinerait sa propre infobulle par-dessus la nôtre, une seconde plus tard.
   Le nom reste dit aux lecteurs d'écran par `aria-label`. */
.nm-pastille-coul[data-nom]{position:relative}
.nm-pastille-coul[data-nom]::after{
  content:attr(data-nom);
  position:absolute;bottom:calc(100% + 9px);left:50%;transform:translateX(-50%) translateY(3px);
  z-index:5;pointer-events:none;white-space:nowrap;
  padding:5px 9px;border-radius:6px;
  background:var(--encre,#1E2322);color:#fff;
  font-family:"Figtree",sans-serif;font-size:11.5px;line-height:1;letter-spacing:.01em;
  opacity:0;transition:opacity var(--t-court),transform var(--t-court)
}
/* La pointe, dessinée par une bordure : un carré pivoté déborderait du coin
   arrondi de la bulle sur certains navigateurs. */
.nm-pastille-coul[data-nom]::before{
  content:"";position:absolute;bottom:calc(100% + 4px);left:50%;
  transform:translateX(-50%) translateY(3px);
  z-index:5;pointer-events:none;
  border:5px solid transparent;border-top-color:var(--encre,#1E2322);
  opacity:0;transition:opacity var(--t-court),transform var(--t-court)
}
.nm-pastille-coul[data-nom]:hover::after,.nm-pastille-coul[data-nom]:hover::before,
.nm-pastille-coul[data-nom]:focus-visible::after,.nm-pastille-coul[data-nom]:focus-visible::before{
  opacity:1;transform:translateX(-50%) translateY(0)
}
/* 🚨 Dans le carrousel, le rail défile — il rogne donc tout ce qui dépasse, et
   l'infobulle serait coupée net. On la passe SOUS la pastille, là où la carte a
   de la place. */
.nm-carrousel-rail .nm-pastille-coul[data-nom]::after{bottom:auto;top:calc(100% + 9px)}
.nm-carrousel-rail .nm-pastille-coul[data-nom]::before{
  bottom:auto;top:calc(100% + 4px);border-top-color:transparent;border-bottom-color:var(--encre,#1E2322)
}
@media(hover:none){
  /* Sur un écran tactile il n'y a pas de survol : l'infobulle resterait
     affichée après le toucher, par-dessus la carte suivante. */
  .nm-pastille-coul[data-nom]::after,.nm-pastille-coul[data-nom]::before{display:none}
}
/* 🚨 `overflow:hidden` sur la pastille ROGNAIT l'infobulle.
   Il était là pour arrondir la photo de variante ; le même effet s'obtient en
   arrondissant le contenu lui-même, ce qui laisse le pseudo-élément déborder.
   Sans cette ligne, l'infobulle existe dans le DOM, occupe la bonne place, et
   reste invisible — le genre de défaut qu'on cherche du mauvais côté. */
.nm-pastille-coul[data-nom]{overflow:visible}
.nm-pastille-coul[data-nom] img,
.nm-pastille-coul[data-nom] .nm-pastille-coul-fond,
.nm-pastille-coul[data-nom] .nm-pastille-coul-texte{border-radius:inherit;overflow:hidden}

/* =========================================================================
   AJOUT AU PANIER — fenêtre de confirmation
   Portée de calindesir.fr le 18/09/2026, habillée aux jetons de ce thème.
   Les chiffres passent en Plex Mono et en `tabular-nums` : dans une fenêtre
   qui empile prix, quantité et sous-total, des chiffres de largeurs
   différentes se lisent comme une colonne mal alignée.
   ========================================================================= */

/* ─── pastille du panier ─── */
.nm-bat{animation:nm-bat .5s cubic-bezier(.34,1.56,.64,1)}
@keyframes nm-bat{0%{transform:scale(1)}38%{transform:scale(1.45)}70%{transform:scale(.92)}100%{transform:scale(1)}}

/* ─── la vignette en vol ─── */
.nm-vol{box-shadow:var(--ombre-l)}

/* ─── la fenêtre ─── */
html.nm-fige{overflow:hidden}
.nm-mp{position:fixed;inset:0;z-index:100100;display:flex;align-items:center;justify-content:center;
  padding:clamp(12px,4vw,40px)}
.nm-mp-fond{position:absolute;inset:0;background:rgba(30,35,34,.44);
  -webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);
  opacity:0;transition:opacity .3s ease}
.nm-mp.est-ouvert .nm-mp-fond{opacity:1}

.nm-mp-vol{position:relative;width:min(560px,100%);max-height:min(88vh,860px);overflow:auto;
  background:var(--fond-carte);border:1px solid var(--filet-clair);border-radius:var(--r-l);
  box-shadow:var(--ombre-l);padding:clamp(20px,3.6vw,32px);
  opacity:0;transform:translateY(18px) scale(.965);
  transition:opacity .34s ease,transform .44s cubic-bezier(.16,1,.3,1)}
.nm-mp.est-ouvert .nm-mp-vol{opacity:1;transform:none}
.nm-mp-vol:focus{outline:none}

.nm-mp-x{position:absolute;top:12px;right:12px;width:34px;height:34px;display:grid;place-items:center;
  border:0;border-radius:50%;background:transparent;color:var(--encre);opacity:.55;cursor:pointer}
.nm-mp-x:hover{background:var(--fond-alt);opacity:1}

/* ─── en-tête, avec la coche qui se trace ─── */
.nm-mp-tete{display:flex;align-items:center;gap:.8rem;margin-bottom:1.35rem;padding-right:34px}
.nm-mp-tete h2{margin:0;font-family:"Fraunces",Georgia,serif;font-size:clamp(1.15rem,2.4vw,1.5rem);font-weight:400}
.nm-mp-coche{flex:0 0 auto;width:38px;height:38px;display:block}
.nm-mp-coche svg{width:100%;height:100%;display:block}
.nm-mp-coche-c{stroke:var(--sapin);stroke-width:2.4;stroke-dasharray:145;stroke-dashoffset:145;
  animation:nm-trace .52s cubic-bezier(.65,0,.45,1) .1s forwards}
.nm-mp-coche-t{stroke:var(--sapin);stroke-width:3.6;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:36;stroke-dashoffset:36;
  animation:nm-trace .3s cubic-bezier(.65,0,.45,1) .5s forwards}
@keyframes nm-trace{to{stroke-dashoffset:0}}
.nm-mp-bang{flex:0 0 auto;width:34px;height:34px;display:grid;place-items:center;border-radius:50%;
  background:var(--sapin);color:#fff;font-weight:600}
.nm-mp-msg{color:var(--encre);opacity:.78;margin-bottom:1.4rem}

/* ─── l'article ajouté ─── */
.nm-mp-ligne{display:grid;grid-template-columns:88px 1fr;gap:1rem;align-items:center}
.nm-mp-vis{overflow:hidden;border-radius:var(--r-m);background:var(--fond-alt)}
.nm-mp-vis img{width:100%;aspect-ratio:1/1;object-fit:cover;display:block}
.nm-mp-txt{min-width:0}

.nm-mp-nom{margin:0 0 .3rem;font-family:"Fraunces",Georgia,serif;font-size:1.02rem;line-height:1.28}
.nm-mp-meta{margin:0;display:flex;align-items:baseline;justify-content:space-between;gap:.8rem}
.nm-mp-qte{font-size:.82rem;opacity:.62}
.nm-mp-prix{font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums;font-weight:500}
.nm-mp-prix del{opacity:.5;font-weight:400;margin-right:.35em}

/* ─── le franco de port ─── */
.nm-mp-franco{margin-top:1.1rem}
.nm-mp-franco p{margin:0 0 .45rem;font-size:.85rem;opacity:.78}
.nm-mp-franco.est-atteint p{color:var(--sapin);font-weight:500;opacity:1}
.nm-mp-jauge{height:6px;border-radius:99px;background:var(--fond-alt);overflow:hidden}
.nm-mp-jauge i{display:block;height:100%;width:0;border-radius:inherit;
  background:linear-gradient(90deg,#93AFA5,var(--sapin));
  animation:nm-jauge .8s cubic-bezier(.16,1,.3,1) .28s both}
.nm-mp-franco.est-atteint .nm-mp-jauge i{background:linear-gradient(90deg,#5F877A,var(--sapin))}
@keyframes nm-jauge{from{width:0}}

/* ─── totaux ─── */
.nm-mp-tot{margin:1.2rem 0 1.3rem;padding-top:1rem;border-top:1px solid var(--filet-clair);
  display:flex;flex-direction:column;gap:.45rem}
.nm-mp-tot div{display:flex;align-items:baseline;justify-content:space-between;gap:1rem}
.nm-mp-tot dt{opacity:.62;font-size:.86rem;margin:0}
.nm-mp-tot dd{margin:0;font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums}
.nm-mp-tot .nm-mp-st{font-size:1.1rem;font-weight:500}

/* ─── actions ─── */
.nm-mp-actes{display:grid;grid-template-columns:1fr 1fr;gap:.6rem}
.nm-mp-actes .nm-bouton{justify-content:center;text-align:center;width:100%;cursor:pointer}
.nm-mp-lien{margin:.8rem 0 0;text-align:center;font-size:.84rem}
.nm-mp-lien a{opacity:.7;text-decoration:underline;text-underline-offset:3px}
.nm-mp-lien a:hover{opacity:1}

/* ─── suggestions ─── */
.nm-mp-sug{margin-top:1.6rem;padding-top:1.2rem;border-top:1px solid var(--filet-clair)}
.nm-mp-sug h3{font-family:"Figtree",sans-serif;font-size:10px;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;opacity:.6;margin:0 0 .8rem}
.nm-mp-sug ul{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,1fr);gap:.7rem}
.nm-mp-sug a{display:block;color:inherit}
.nm-mp-sug-vis{display:block;overflow:hidden;border-radius:var(--r-m);background:var(--fond-alt);margin-bottom:.4rem}
.nm-mp-sug-vis img{width:100%;aspect-ratio:1/1;object-fit:cover;display:block;
  transition:transform .5s cubic-bezier(.16,1,.3,1)}
.nm-mp-sug a:hover .nm-mp-sug-vis img{transform:scale(1.06)}
.nm-mp-sug-nom{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  font-size:.76rem;line-height:1.32}
.nm-mp-sug-note{display:block;font-size:10px;letter-spacing:.08em;text-transform:uppercase;opacity:.5;margin:.1rem 0}
.nm-mp-sug-prix{display:block;font-family:"IBM Plex Mono",monospace;font-size:.76rem;color:var(--sapin)}
.nm-mp-sug-prix del{display:none}

/* ─── sur téléphone, la fenêtre monte du bas ─── */
@media (max-width:640px){
  .nm-mp{align-items:flex-end;padding:0}
  .nm-mp-vol{width:100%;max-height:92vh;border-radius:var(--r-l) var(--r-l) 0 0;border-bottom:0;
    transform:translateY(100%)}
  .nm-mp.est-ouvert .nm-mp-vol{transform:none}
  /* Empilés, l'action principale vient en premier sous le pouce. */
  .nm-mp-actes{grid-template-columns:1fr}
  .nm-mp-actes .nm-bouton{order:2}
  .nm-mp-actes .nm-bouton:not(.nm-bouton--creux){order:1}
}

@media (prefers-reduced-motion:reduce){
  .nm-mp-fond,.nm-mp-vol{transition:none}
  .nm-mp-coche-c,.nm-mp-coche-t{animation:none;stroke-dashoffset:0}
  .nm-mp-jauge i{animation:none}
  .nm-bat{animation:none}
}

/* =========================================================================
   RÉASSURANCE — quatre points, trois emplacements
   Portée de calindesir.fr le 18/09/2026. Une grille auto-fit plutôt qu'un
   nombre de colonnes figé : le bloc sert en pleine largeur sur l'accueil et
   dans une colonne de 380 px sur le panier, sans second jeu de règles.
   ========================================================================= */
.nm-rass{display:grid;gap:1px;background:var(--filet-clair);
  border:1px solid var(--filet);border-radius:var(--r-m);overflow:hidden;
  grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}
.nm-rass-i{display:flex;gap:.85rem;align-items:flex-start;
  background:var(--fond-carte);padding:18px 20px}
.nm-rass-i > i{flex:none;width:36px;height:36px;border-radius:50%;background:var(--fond-alt);
  display:grid;place-items:center;color:var(--sapin);
  transition:transform .3s cubic-bezier(.2,.8,.2,1),background .3s}
.nm-rass-i:hover > i{transform:scale(1.08) rotate(-6deg);background:var(--filet-clair)}
.nm-rass-i b{display:block;font-size:.92rem;font-weight:600;line-height:1.3;margin-bottom:3px}
.nm-rass-i > span > span{display:block;font-size:13.5px;line-height:1.5;opacity:.72}

/* Dans une colonne étroite — panier, fiche — on repasse sur une seule file. */
@media (max-width:520px){
  .nm-rass{grid-template-columns:1fr}
}

@media (prefers-reduced-motion:reduce){
  .nm-rass-i > i{transition:none}
  .nm-rass-i:hover > i{transform:none}
}

/* =========================================================================
   LE CHOIX DU CADEAU, SUR LA PAGE PANIER
   Porté de calindesir.fr le 18/09/2026 avec les jetons de ce thème. La
   feuille d'origine préfixait tout par `body.cd-theme` ; ici le thème est
   seul, le préfixe ne servirait qu'à alourdir la spécificité.
   ========================================================================= */
/* ─── le choix du cadeau, sur la page panier ─── */
/* Un cadeau se remarque : bandeau bordeaux, cadre plein, et chaque carte dit
   ce qu'elle vaut. L'encart tombe après la liste du panier, loin du regard —
   c'est la couleur qui doit le rattraper, pas une animation. */
.nm-cadeaux{margin:1.8rem 0 0;background:var(--fond-carte);
  border:1px solid var(--filet);border-radius:var(--r-l);overflow:hidden;
  box-shadow:0 16px 38px -22px rgba(30,35,34,.35)}

.nm-cadeaux-tete{display:flex;align-items:center;gap:.85rem;
  padding:.9rem 1.15rem;background:var(--sapin);color:#F3F3F0}
.nm-cadeaux-icone{flex:0 0 auto;width:26px;height:26px;
  stroke:currentColor;fill:none}
.nm-cadeaux-mots{flex:1 1 auto;min-width:0}
.nm-cadeaux-titre{margin:0;font-family:"Fraunces",Georgia,serif;font-size:1.2rem;
  font-weight:400;color:inherit;line-height:1.2}
.nm-cadeaux-aide{margin:.15rem 0 0;font-size:.84rem;
  color:rgba(243,243,240,.82)}
.nm-cadeaux-jauge{flex:0 0 auto;font-family:"IBM Plex Mono",monospace;font-size:.62rem;
  letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;
  padding:.34rem .62rem;border:1px solid rgba(243,243,240,.45);border-radius:99px}

.nm-cadeaux-liste{list-style:none;margin:0;padding:1rem;display:grid;
  grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:.8rem;
  background:var(--fond-alt)}
.nm-cadeau a{display:flex;flex-direction:column;gap:.45rem;height:100%;
  padding:.7rem;background:var(--fond-carte);border:1px solid var(--filet-clair);border-radius:var(--r-m);
  text-decoration:none;color:var(--encre);transition:border-color .2s,box-shadow .2s,transform .2s}
.nm-cadeau a:hover{border-color:#93AFA5;transform:translateY(-2px);
  box-shadow:var(--ombre-m)}
.nm-cadeau.choisi a{border-color:var(--sapin);box-shadow:0 0 0 2px var(--sapin)}
.nm-cadeau.choisi a:hover{transform:none}

.nm-cadeau-vis{position:relative;display:block}
.nm-cadeau-vis img{width:100%;aspect-ratio:1/1;object-fit:contain;
  background:#fff;border-radius:6px;display:block;margin:0}
.nm-cadeau-coche{position:absolute;top:.3rem;right:.3rem;
  width:23px;height:23px;display:grid;place-items:center;border-radius:50%;
  background:var(--sapin);color:#fff;box-shadow:0 2px 6px rgba(30,35,34,.3)}
.nm-cadeau-coche svg{width:13px;height:13px;stroke:currentColor;fill:none}

.nm-cadeau-nom{font-size:.8rem;line-height:1.35;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.nm-cadeau-prix{font-size:.78rem;font-weight:600;color:var(--sapin)}
.nm-cadeau-prix s{margin-right:.3rem;font-weight:400;color:var(--encre)}
.nm-cadeau-prix .woocommerce-Price-amount{font-size:inherit;color:inherit}

.nm-cadeau-etat{margin-top:auto;text-align:center;
  font-family:"IBM Plex Mono",monospace;font-size:.62rem;letter-spacing:.08em;text-transform:uppercase;
  padding:.44rem .5rem;border:1px solid var(--filet-clair);border-radius:99px;color:var(--encre);
  transition:background .2s,color .2s,border-color .2s}
.nm-cadeau a:hover .nm-cadeau-etat{border-color:var(--sapin);color:var(--sapin)}
.nm-cadeau.choisi .nm-cadeau-etat{background:var(--sapin);border-color:var(--sapin);
  color:#F3F3F0;font-weight:600}

@media (max-width:520px){
  .nm-cadeaux-tete{flex-wrap:wrap;gap:.6rem}
  .nm-cadeaux-liste{padding:.8rem;gap:.6rem;
    grid-template-columns:repeat(auto-fill,minmax(138px,1fr))}
}
@media (prefers-reduced-motion:reduce){
  .nm-cadeau a:hover{transform:none}
}

/* =========================================================================
   OFFRES EN COURS — encart de fiche, liste et paliers
   Portées de calindesir.fr le 18/09/2026, aux jetons de ce thème.
   ⛔ Les règles de grille et de collant de l'original ne sont PAS reprises :
   elles existaient pour une galerie collante et une grille à trois enfants
   qui ne sont pas celles d'ici. L'encart est simplement posé sous la galerie
   par le gabarit.
   ⚠️ Rien n'est accroché aux LISTES : c'est là que l'extension remplacée
   coûtait cher, en réévaluant ses règles pour chaque vignette.
   ========================================================================= */

.nm-offres{list-style:none;margin:1.2rem 0;padding:0;display:flex;flex-direction:column;gap:.55rem}
.nm-offres li{position:relative;margin:0;padding:.72rem .95rem .72rem 2.6rem;
  background:var(--fond-alt);border:1px solid var(--filet);border-radius:var(--r-m);
  font-size:.94rem;line-height:1.45}
.nm-offres li::before{content:"✦";position:absolute;left:.95rem;top:.66rem;
  color:var(--sapin);font-size:.95rem;line-height:1.45}
.nm-offres li strong{color:var(--sapin-fonce);font-weight:600}

.nm-paliers{width:100%;margin:.55rem 0 0;border-collapse:collapse;
  font-family:"IBM Plex Mono",monospace;font-size:.88rem;font-variant-numeric:tabular-nums}
.nm-paliers th,.nm-paliers td{padding:.34rem .7rem;text-align:left;border-bottom:1px solid var(--filet-clair)}
.nm-paliers tr:last-child th,.nm-paliers tr:last-child td{border-bottom:0}
.nm-paliers th{font-weight:400;opacity:.75}
.nm-paliers td{text-align:right;font-weight:600;color:var(--sapin-fonce)}

/* ═══ Encart d'offre sous la galerie ═══
   Bordure pointillée et pastille détachée : l'encart doit se voir sans crier,
   à côté d'une fiche produit volontairement sobre. */
.nm-offre-encart{display:flex;align-items:center;gap:1rem;
  margin:1.1rem 0 0;padding:1rem 1.15rem;
  background:var(--fond-alt);border:1px dashed var(--filet);border-radius:var(--r-l)}
.nm-offre-icone{flex:none;width:44px;height:44px;border-radius:50%;
  display:grid;place-items:center;background:var(--fond-carte);color:var(--sapin);
  border:1px solid var(--filet)}
.nm-offre-corps{flex:1;min-width:0;display:flex;flex-direction:column;gap:.2rem}
.nm-offre-titre{font-family:"Fraunces",Georgia,serif;font-size:1.05rem;font-weight:400;line-height:1.2}
.nm-offre-texte{margin:0;font-size:.84rem;line-height:1.45;opacity:.78}
.nm-offre-texte strong{color:var(--sapin-fonce);font-weight:600;opacity:1}
.nm-offre-badge{flex:none;max-width:11rem;text-align:center;
  padding:.55rem .8rem;border:1px dashed #93AFA5;border-radius:var(--r-m);
  color:var(--sapin);font-size:.78rem;font-weight:600;line-height:1.3;background:var(--fond-carte)}

@media (max-width:700px){
  .nm-offre-encart{flex-wrap:wrap;gap:.75rem}
  .nm-offre-badge{max-width:none;width:100%}
}

/* =========================================================================
   VISIONNEUSE — grande vue + vignettes, pour les fiches SANS vidéo
   Dès qu'un produit reçoit une vidéo, il repasse sur `.nm-galerie` en grille
   (voir content-single-product.php) : la vidéo a besoin d'une place au milieu
   des vues fixes, pas d'une case dans un rail.

   🚨 Le format de la scène est FORCÉ en 1/1 avec `object-fit:contain`, à
   rebours de la grille voisine qui, elle, ne force rien. Raison : dans un rail
   horizontal, des vues de hauteurs différentes feraient sauter la page à
   chaque changement. Le fond est BLANC, pas sable : les détourés du
   fournisseur sont sur blanc, et une bande sable se verrait au-dessus et en
   dessous d'une photo d'ambiance.
   ========================================================================= */
.nm-visio{display:block}

.nm-visio-scene{position:relative;border-radius:var(--r-m);overflow:hidden;background:var(--blanc)}
.nm-visio-rail{
  list-style:none;margin:0;padding:0;
  display:grid;grid-auto-flow:column;grid-auto-columns:100%;
  overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;
  scrollbar-width:none;-ms-overflow-style:none;overscroll-behavior-x:contain;
}
.nm-visio-rail::-webkit-scrollbar{display:none}
.nm-visio-vue{scroll-snap-align:start;margin:0}
.nm-visio-vue img{width:100%;aspect-ratio:1/1;object-fit:contain;display:block;cursor:zoom-in}

.nm-visio-fleche{
  position:absolute;top:50%;translate:0 -50%;z-index:2;
  width:42px;height:42px;border-radius:50%;border:1px solid var(--filet);
  background:var(--fond-carte);color:var(--encre);cursor:pointer;
  display:grid;place-items:center;font-size:19px;line-height:1;
  box-shadow:var(--ombre-m);transition:border-color .2s,opacity .2s;
}
.nm-visio-fleche:hover{border-color:var(--sapin)}
.nm-visio-fleche[disabled]{opacity:.28;cursor:default;box-shadow:none}
.nm-visio-fleche--prec{left:12px}
.nm-visio-fleche--suiv{right:12px}

/* Les vignettes : une file qui défile si les vues sont nombreuses. */
.nm-visio-vignettes{
  list-style:none;margin:10px 0 0;padding:0;
  display:flex;gap:8px;overflow-x:auto;scrollbar-width:none;
}
.nm-visio-vignettes::-webkit-scrollbar{display:none}
.nm-visio-vignettes li{flex:0 0 auto}
.nm-visio-vignettes button{
  display:block;padding:0;width:74px;height:74px;cursor:pointer;
  border:1px solid var(--filet-clair);border-radius:var(--r-s);
  background:var(--blanc);overflow:hidden;transition:border-color .2s;
}
.nm-visio-vignettes button:hover{border-color:var(--filet)}
/* ⚠️ `aria-current` porte l'état, pas une classe : l'information est la même
   pour l'œil et pour un lecteur d'écran, elle n'a pas à être écrite deux fois. */
.nm-visio-vignettes button[aria-current="true"]{border-color:var(--encre)}
.nm-visio-vignettes img{width:100%;height:100%;object-fit:contain;display:block}

@media(max-width:600px){
  .nm-visio-fleche{width:36px;height:36px}
  .nm-visio-vignettes button{width:60px;height:60px}
}
@media(prefers-reduced-motion:reduce){
  .nm-visio-rail{scroll-behavior:auto}
}

/* =========================================================================
   LE TIROIR DE RECHERCHE
   Replié sous l'en-tête, il prend toute la largeur : les suggestions du
   module ont besoin de place pour montrer une vignette, un nom sur deux
   lignes et un prix sans que rien ne se chevauche.
   ⚠️ `hidden` est un attribut : toute règle `display:` écrite plus bas
   l'écraserait. D'où le `!important`, qui n'est ici ni un aveu ni un
   raccourci — c'est la seule façon de garantir qu'un élément caché le reste.
   ========================================================================= */
.nm-chercher{border-top:1px solid var(--filet-clair);background:var(--fond-carte);
  padding-block:16px;animation:nm-deplie .22s ease}
.nm-chercher[hidden]{display:none!important}
@keyframes nm-deplie{from{opacity:0;transform:translateY(-6px)}}

.nm-recherche{display:flex;align-items:center;gap:10px;position:relative}
.nm-chercher-icone{flex:none;width:19px;height:19px;fill:none;stroke:currentColor;
  stroke-width:1.7;opacity:.5}
.nm-chercher input[type=search]{
  flex:1;min-width:0;border:0;background:none;font-size:1.05rem;font-family:inherit;
  color:var(--encre);padding:10px 0}
.nm-chercher input[type=search]:focus{outline:none}
.nm-chercher input[type=search]::placeholder{opacity:.45}
.nm-chercher-x{flex:none;width:34px;height:34px;display:grid;place-items:center;border:0;
  background:none;cursor:pointer;color:var(--encre);opacity:.5;border-radius:50%}
.nm-chercher-x:hover{opacity:1;background:var(--fond-alt)}
.nm-chercher-x svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7}

/* La boîte de suggestions est posée par le module : on l'aligne sur le champ,
   pas sur le formulaire entier, pour qu'elle ne parte pas sous le bouton. */
.nm-chercher .nm-re-boite{top:calc(100% + 10px)}

@media(max-width:700px){
  .nm-recherche .nm-bouton{display:none}
  .nm-chercher input[type=search]{font-size:1rem}
}

/* ─── l'icône du compte quand quelqu'un est connecté ─── */
/* ⚠️ Même technique que `.nm-pastille` du panier : `position:absolute` SANS
   décalage, puis une translation. `.nm-icone` n'est pas positionnée, et lui
   ajouter `position:relative` changerait le bloc de référence de la pastille
   du panier — qui, elle, fonctionne aujourd'hui. On ne touche pas à ce qui
   marche pour un point de 7 px. */
.nm-icone.est-connecte::after{content:"";position:absolute;
  transform:translate(11px,10px);
  width:7px;height:7px;border-radius:50%;background:var(--sapin);
  border:1.5px solid var(--fond)}

/* =========================================================================
   PAGE PANIER
   Portée de calindesir.fr le 18/09/2026, aux jetons de ce thème, en
   remplacement du bloc WooCommerce.
   ⚠️ Le préfixe `body.cd-theme` de l'original est retiré : il n'existe pas
   ici, et l'y laisser aurait rendu toute la feuille inerte — c'est exactement
   ce qui était arrivé aux encarts publicitaires le matin même.
   ========================================================================= */

body.nm-theme.woocommerce-cart .nm-pan{display:grid;gap:clamp(18px,2.4vw,30px);align-items:start;
  grid-template-columns:1fr;margin-bottom:2.6rem}
@media (min-width:960px){
  body.nm-theme.woocommerce-cart .nm-pan{grid-template-columns:minmax(0,1fr) 350px}
  body.nm-theme.woocommerce-cart .nm-pan-cote{position:sticky;top:1.2rem}
}
.nm-pan-corps{min-width:0;display:flex;flex-direction:column;gap:clamp(16px,2vw,24px)}
.nm-pan-cote{display:flex;flex-direction:column;gap:.9rem}
.nm-pan.est-occupe{opacity:.62;pointer-events:none;transition:opacity .18s ease}

/* ─── jauge de franco ─── */
body.nm-theme .nm-franco-jauge{background:var(--fond-carte);border:1px solid var(--filet-clair);border-radius:var(--r-l);
  padding:1rem 1.15rem;margin:0}
body.nm-theme .nm-franco-jauge p{margin:0 0 .55rem;font-size:.9rem;color:var(--encre)}
body.nm-theme .nm-franco-jauge.est-acquis p{color:var(--sapin);font-weight:500}
body.nm-theme .nm-franco-jauge .piste{height:7px;border-radius:99px;background:var(--fond-alt);overflow:hidden}
body.nm-theme .nm-franco-jauge .piste i{display:block;height:100%;border-radius:inherit;
  background:linear-gradient(90deg,#93AFA5,var(--sapin));transition:width .5s cubic-bezier(.16,1,.3,1)}
body.nm-theme .nm-franco-jauge.est-acquis .piste i{background:linear-gradient(90deg,#5F877A,var(--sapin))}

/* ─── avis ─── */
.nm-pan-avis{background:var(--alerte-f);border:1px solid rgba(140,59,30,.28);border-radius:var(--r-m);
  padding:.75rem 1rem;color:var(--alerte);font-size:.87rem}
.nm-pan-avis p{margin:0}
.nm-pan-avis p+p{margin-top:.35rem}

/* ─── liste des articles ─── */
body.nm-theme .nm-pan-liste{list-style:none;margin:0;padding:0;background:var(--fond-carte);
  border:1px solid var(--filet-clair);border-radius:var(--r-l);overflow:hidden}
.nm-pan-art{display:grid;gap:.9rem 1.1rem;padding:1.1rem;align-items:center;
  grid-template-columns:84px minmax(0,1fr) auto auto;
  transition:opacity .24s ease,transform .24s ease}
.nm-pan-art+.nm-pan-art{border-top:1px solid var(--filet-clair)}
.nm-pan-art.est-partant{opacity:0;transform:translateX(-14px)}
.nm-pan-vis{grid-row:span 1}
body.nm-theme .nm-pan-vis img{width:84px;height:84px;object-fit:cover;border-radius:var(--r-m);background:var(--fond-alt)}
.nm-pan-info{min-width:0}
.nm-pan-marque{display:block;font-family:"IBM Plex Mono",monospace;font-size:.62rem;letter-spacing:.16em;
  text-transform:uppercase;color:var(--sapin);margin-bottom:.2rem}
body.nm-theme a.nm-pan-nom,body.nm-theme span.nm-pan-nom{display:block;font-family:"Fraunces",Georgia,serif;
  font-size:1.02rem;line-height:1.3;color:var(--encre);margin-bottom:.22rem}
body.nm-theme a.nm-pan-nom:hover{color:var(--sapin)}
.nm-pan-unite{margin:0 0 .5rem;font-size:.8rem;color:var(--encre);
  font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums}
.nm-pan-unite span{font-family:var(--corps)}
.nm-pan-unite del{opacity:.55;margin-right:.3em}
.nm-pan-outils{display:flex;align-items:center;gap:.35rem}
body.nm-theme .nm-pan-outils .nm-coeur-achat,
.nm-pan-retire{position:static;width:32px;height:32px;display:grid;place-items:center;
  background:var(--fond);border:1px solid var(--filet-clair);border-radius:99px;color:var(--encre);
  cursor:pointer;opacity:1;transform:none;transition:background .18s ease,color .18s ease,border-color .18s ease}
body.nm-theme .nm-pan-outils .nm-coeur-achat:hover{background:var(--fond-alt);color:var(--sapin);border-color:var(--filet)}
.nm-pan-retire:hover{background:var(--alerte-f);color:var(--alerte);border-color:rgba(140,59,30,.3)}
.nm-pan-retire-lien{font-size:.8rem}

.nm-pan-qte{display:inline-flex;align-items:center;border:1px solid var(--filet-clair);
  border-radius:99px;background:var(--fond);overflow:hidden}
.nm-pan-pas{width:34px;height:34px;border:0;background:transparent;color:var(--encre);
  font-size:1.02rem;line-height:1;cursor:pointer;transition:background .16s ease,color .16s ease}
.nm-pan-pas:hover{background:var(--fond-alt);color:var(--sapin)}
body.nm-theme .nm-pan-champ{width:44px;height:34px;border:0;background:transparent;text-align:center;
  font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums;font-size:.9rem;color:var(--encre);padding:0;
  -moz-appearance:textfield}
body.nm-theme .nm-pan-champ::-webkit-outer-spin-button,
body.nm-theme .nm-pan-champ::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.nm-pan-un{padding:0 .9rem;font-family:"IBM Plex Mono",monospace}

.nm-pan-tot{font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums;font-size:1rem;
  font-weight:500;color:var(--encre);text-align:right;min-width:82px}
.nm-pan-tot del{display:block;font-size:.78rem;font-weight:400;opacity:.5}

@media (max-width:720px){
  .nm-pan-art{grid-template-columns:72px minmax(0,1fr);row-gap:.7rem}
  body.nm-theme .nm-pan-vis img{width:72px;height:72px}
  .nm-pan-qte{grid-column:2;justify-self:start}
  .nm-pan-tot{grid-column:2;text-align:left;min-width:0}
}

/* ─── pied du formulaire ─── */
.nm-pan-pied{display:flex;align-items:center;justify-content:flex-end;gap:.8rem;
  padding:.9rem .2rem 0;flex-wrap:wrap}
.nm-pan-vider{display:inline-flex;align-items:center;gap:.4rem;background:none;border:0;
  color:var(--encre);font-size:.83rem;cursor:pointer;padding:.3rem;transition:color .18s ease}
.nm-pan-vider:hover{color:var(--alerte)}
/* Le bouton natif ne sert qu'en l'absence de script : les pas sont instantanés. */
html.js .nm-pan-maj{display:none}
.nm-pan-maj{background:var(--encre);color:#fff;border:0;border-radius:var(--r-s);
  padding:.6rem 1.2rem;font-size:.85rem;cursor:pointer}

/* ─── récapitulatif ─── */
.nm-pan-carte{background:var(--fond-carte);border:1px solid var(--filet-clair);border-radius:var(--r-l);padding:1.15rem}
.nm-pan-st{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}
.nm-pan-st h2{margin:0;font-size:1.12rem}
.nm-pan-st p{margin:.1rem 0 0;font-size:.76rem;color:var(--encre)}
.nm-pan-st-val{font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums;font-size:1.22rem;color:var(--encre)}

body.nm-theme .nm-pan-tete .checkout-button,
body.nm-theme .nm-pan-tete .wc-proceed-to-checkout .button{width:100%;justify-content:center;
  background:var(--sapin);border-color:var(--sapin);color:#fff;font-size:.98rem;padding:.85rem 1.2rem}
body.nm-theme .nm-pan-tete .checkout-button:hover{background:var(--sapin-fonce);border-color:var(--sapin-fonce)}
body.nm-theme .nm-pan-tete .wc-proceed-to-checkout{padding:0;margin:0}

.nm-pan-moyens{list-style:none;display:flex;flex-wrap:wrap;gap:.35rem;margin:.9rem 0 0;padding:0}
.nm-pan-moyens li{font-family:"IBM Plex Mono",monospace;font-size:.63rem;letter-spacing:.09em;text-transform:uppercase;
  color:var(--encre);background:var(--fond);border:1px solid var(--filet-clair);border-radius:var(--r-m);padding:.3rem .55rem}
.nm-pan-releve{display:flex;align-items:center;gap:.45rem;margin:.85rem 0 0;
  font-size:.78rem;color:var(--encre);line-height:1.35}
.nm-pan-releve svg{flex:0 0 auto;color:var(--sapin)}

/* ─── code promo ─── */
.nm-pan-promo{padding:0}
.nm-pan-promo-b{width:100%;display:flex;align-items:center;justify-content:space-between;gap:.8rem;
  background:none;border:0;padding:1rem 1.15rem;cursor:pointer;font-size:.92rem;color:var(--encre);
  font-family:var(--corps);text-align:left}
.nm-pan-promo-b i{flex:0 0 auto;width:16px;height:16px;position:relative}
.nm-pan-promo-b i::before,.nm-pan-promo-b i::after{content:"";position:absolute;background:var(--sapin);
  border-radius:2px;transition:transform .24s ease}
.nm-pan-promo-b i::before{left:0;right:0;top:7px;height:2px}
.nm-pan-promo-b i::after{top:0;bottom:0;left:7px;width:2px}
.nm-pan-promo-b[aria-expanded="true"] i::after{transform:rotate(90deg)}
.nm-pan-promo-f{display:flex;gap:.5rem;padding:0 1.15rem 1.15rem}
/* display:flex l'emporte sur l'attribut hidden : sans cela le formulaire
   s'affiche déplié dès le chargement. */
.nm-pan-promo-f[hidden]{display:none}
body.nm-theme .nm-pan-promo-f .input-text{flex:1;min-width:0;padding:.6rem .8rem;font-size:.88rem;
  border:1px solid var(--filet-clair);border-radius:var(--r-m);background:var(--fond);color:var(--encre)}
body.nm-theme .nm-pan-promo-f .nm-btn{padding:.6rem 1rem;font-size:.85rem}

/* ─── détail ─── */
.nm-pan-detail h2{font-size:1.05rem;margin:0 0 .85rem}
.nm-pan-lignes{margin:0;display:flex;flex-direction:column;gap:.5rem}
.nm-pan-lignes div{display:flex;align-items:baseline;justify-content:space-between;gap:1rem}
.nm-pan-lignes dt{margin:0;color:var(--encre);font-size:.86rem}
.nm-pan-lignes dd{margin:0;font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums;
  font-size:.88rem;color:var(--encre)}
.nm-pan-lignes .est-remise dd{color:var(--sapin)}
.nm-pan-lignes .est-offert{color:var(--sapin);font-weight:500}
.nm-pan-lignes .est-plus-tard{font-family:var(--corps);color:var(--encre);font-size:.82rem}
.nm-pan-total{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;
  margin-top:.9rem;padding-top:.9rem;border-top:1px solid var(--filet-clair)}
.nm-pan-total span{font-size:.95rem;color:var(--encre)}
.nm-pan-total strong{font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums;
  font-size:1.24rem;font-weight:500;color:var(--encre)}
.nm-pan-total .woocommerce-Price-amount{font-weight:500}
.nm-pan-note{margin:.75rem 0 0;font-size:.76rem;color:var(--encre);line-height:1.45}

/* ─── confiance ─── */
.nm-pan-conf{display:grid;gap:.7rem;grid-template-columns:repeat(auto-fit,minmax(215px,1fr))}
body.nm-theme a.nm-pan-conf-i{display:flex;gap:.7rem;align-items:flex-start;background:var(--fond-carte);
  border:1px solid var(--filet-clair);border-radius:var(--r-l);padding:.95rem;color:var(--encre);
  transition:border-color .2s ease,transform .2s ease}
body.nm-theme a.nm-pan-conf-i:hover{border-color:var(--filet);transform:translateY(-2px);color:var(--encre)}
.nm-pan-conf-i svg{flex:0 0 auto;color:var(--sapin);margin-top:1px}
.nm-pan-conf-i b{display:block;color:var(--encre);font-weight:500;font-size:.88rem;margin-bottom:.15rem}
.nm-pan-conf-i span{font-size:.78rem;line-height:1.45;display:block}

/* ─── livraison ─── */
.nm-pan-liv{background:var(--fond-carte);border:1px solid var(--filet-clair);border-radius:var(--r-l);padding:1.2rem}
.nm-pan-liv h2{font-size:1.08rem;margin:0 0 .5rem}
.nm-pan-liv-intro{margin:0 0 1rem;font-size:.86rem;color:var(--encre);max-width:70ch}
.nm-pan-liv-l{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.6rem}
.nm-pan-liv-l li{display:flex;flex-wrap:wrap;align-items:baseline;gap:.3rem .7rem;
  padding-bottom:.6rem;border-bottom:1px dashed var(--filet-clair);font-size:.84rem}
.nm-pan-liv-l li:last-child{border-bottom:0;padding-bottom:0}
.nm-pan-liv-l b{font-weight:500;color:var(--encre);min-width:150px}
.nm-pan-liv-l span{color:var(--encre)}
.nm-pan-liv-l i{font-family:"IBM Plex Mono",monospace;font-style:normal;font-variant-numeric:tabular-nums;color:var(--encre)}
.nm-pan-liv-l em{font-style:normal;font-size:.78rem;color:var(--sapin);
  background:var(--ok-f);border-radius:99px;padding:.12rem .5rem}
.nm-pan-liv-pied{margin:1rem 0 0;font-size:.83rem}

/* ─── recommandations ─── */
.nm-pan-reco{margin:2.4rem 0 1rem}
.nm-pan-reco h2{font-size:clamp(1.2rem,2.4vw,1.6rem);margin-bottom:1rem}
/* 🚨 La règle portée de Calindesir posait SIX colonnes — son catalogue en
   affiche six ici. Le gabarit, lui, ne retient que QUATRE suggestions : les
   cartes occupaient donc quatre sixièmes de la largeur et laissaient un tiers
   de vide à droite. Et ce n'était pas visible dans le HTML : la classe
   `nm-produits--4` était bien posée sur la liste, mais `body.nm-theme
   .nm-pan-reco ul.products` (0,3,1) l'écrasait (0,2,1).

   On aligne la grille sur ce que le gabarit produit réellement. Le jour où le
   nombre de suggestions change, c'est ICI qu'il faut revenir. */
body.nm-theme .nm-pan-reco ul.products{grid-template-columns:repeat(4,minmax(0,1fr))}
@media (max-width:1100px){body.nm-theme .nm-pan-reco ul.products{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:760px){body.nm-theme .nm-pan-reco ul.products{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* Le conteneur des écrans qui posent leur propre mise en page — panier,
   commande, compte. Il n'impose rien : c'est tout l'intérêt. Voir page.php. */
.nm-large{width:100%}
/* ⚠️ Le nom de l'article doit pouvoir rétrécir : sans `min-width:0`, une
   colonne de grille refuse de passer sous la largeur de son plus long mot. */
.nm-pan-info{min-width:0}

/* ─── le bouton de commande, repris à WooCommerce ───
   🚨 Il sortait VIOLET (#7f54b3). La règle du panier existait pourtant, mais
   `.woocommerce a.button.alt` de WooCommerce a la même spécificité (0,3,1) et
   sa feuille est chargée APRÈS la nôtre : à égalité, c'est l'ordre qui tranche,
   et l'ordre ne nous appartient pas. On monte donc d'un cran en nommant les
   classes que le bouton porte réellement — `checkout-button button alt`. */
body.nm-theme .nm-pan-tete a.checkout-button.button.alt,
body.nm-theme .nm-pan-tete .wc-proceed-to-checkout a.button.alt{
  width:100%;justify-content:center;display:flex;align-items:center;
  background:var(--sapin);border-color:var(--sapin);color:#fff;
  font-family:"Figtree",sans-serif;font-size:12px;font-weight:500;letter-spacing:.08em;
  text-transform:uppercase;padding:.95rem 1.2rem;border-radius:var(--r-s);
  transition:background .2s,border-color .2s}
body.nm-theme .nm-pan-tete a.checkout-button.button.alt:hover,
body.nm-theme .nm-pan-tete .wc-proceed-to-checkout a.button.alt:hover{
  background:var(--sapin-fonce);border-color:var(--sapin-fonce);color:#fff}

/* Dans la colonne du panier, la réassurance tient sur deux rangées de deux :
   quatre cases sur une seule ligne y seraient illisibles, trois plus un
   laisseraient un orphelin. */
.nm-pan-corps .nm-rass{grid-template-columns:repeat(2,minmax(0,1fr))}
@media(max-width:700px){.nm-pan-corps .nm-rass{grid-template-columns:1fr}}

/* =========================================================================
   ESPACE CLIENT — connexion, création de compte, tableau de bord
   Une seule page du site où le client peut se tromper de formulaire et
   conclure que son compte n'existe pas : les deux colonnes disent donc à qui
   elles parlent avant de demander quoi que ce soit.
   ========================================================================= */
.nm-cnx{display:grid;gap:clamp(18px,2.4vw,30px);align-items:start;
  grid-template-columns:1fr;max-width:940px;margin:0 auto}
@media(min-width:820px){
  .nm-cnx{grid-template-columns:1fr 1fr}
  .nm-cnx--seule{grid-template-columns:minmax(0,460px);justify-content:center}
}
.nm-cnx-carte{background:var(--fond-carte);border:1px solid var(--filet-clair);
  border-radius:var(--r-l);padding:clamp(20px,3vw,30px)}
.nm-cnx-carte--neuve{background:var(--fond-alt);border-color:var(--filet)}
.nm-cnx-carte h2{font-size:clamp(1.12rem,2vw,1.4rem);margin:0 0 4px}
.nm-cnx-aide{margin:0 0 18px;font-size:14px;opacity:.72;line-height:1.5}
.nm-cnx-note{margin:12px 0 0;font-size:12.5px;opacity:.66;line-height:1.5}

/* Les champs : mêmes règles pour la connexion, la commande et les adresses.
   ⚠️ On vise les classes de WooCommerce, pas les nôtres : ce sont elles qu'il
   pose sur les écrans qu'on ne réécrit pas. */
.woocommerce-account .woocommerce-form-row,
.woocommerce form .form-row{display:flex;flex-direction:column;gap:6px;margin:0 0 14px;padding:0}
.woocommerce-account label,
.woocommerce form .form-row label{font-family:"Figtree",sans-serif;font-size:12px;font-weight:500;
  letter-spacing:.04em;opacity:.78}
.woocommerce-account .required,
.woocommerce form .required{color:var(--sapin);text-decoration:none;border:0}
.woocommerce-account .input-text,
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select{
  width:100%;padding:12px 14px;font-family:inherit;font-size:15px;color:var(--encre);
  background:var(--blanc);border:1px solid var(--filet);border-radius:var(--r-m);
  transition:border-color .18s,box-shadow .18s}
.woocommerce-account .input-text:focus,
.woocommerce form .form-row input.input-text:focus,
.woocommerce form .form-row textarea:focus,
.woocommerce form .form-row select:focus{
  outline:none;border-color:var(--encre);box-shadow:0 0 0 3px rgba(30,35,34,.07)}

.nm-cnx-ligne{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:10px;margin:2px 0 18px}
.nm-cnx-souvenir{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;cursor:pointer}
.nm-cnx-souvenir input{width:16px;height:16px;accent-color:var(--encre)}
.nm-cnx-oubli{font-size:13px;opacity:.7;text-decoration:underline;text-underline-offset:3px}
.nm-cnx-oubli:hover{opacity:1}
.nm-bouton--bloc{width:100%;justify-content:center;text-align:center}

/* ─── le tableau de bord, une fois connecté ─── */
.woocommerce-account .woocommerce-MyAccount-navigation{margin:0 0 26px}
.woocommerce-account .woocommerce-MyAccount-navigation ul{list-style:none;margin:0;padding:0;
  display:flex;flex-wrap:wrap;gap:8px}
.woocommerce-account .woocommerce-MyAccount-navigation a{display:inline-flex;align-items:center;
  padding:.5rem .95rem;border:1px solid var(--filet-clair);border-radius:100px;
  font-family:"Figtree",sans-serif;font-size:13px;background:var(--fond-carte);
  transition:border-color .2s,background .2s}
.woocommerce-account .woocommerce-MyAccount-navigation a:hover{border-color:var(--filet)}
.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{
  background:var(--encre);border-color:var(--encre);color:var(--fond)}
@media(min-width:900px){
  .woocommerce-account .woocommerce-MyAccount-content,
  .woocommerce-account .woocommerce-MyAccount-navigation{width:auto;float:none}
}

/* Les messages de WooCommerce, aux couleurs de la maison plutôt qu'aux siennes. */
.woocommerce-error,.woocommerce-info,.woocommerce-message{
  border:1px solid var(--filet);border-top:3px solid var(--encre);
  background:var(--fond-carte);border-radius:var(--r-m);
  padding:14px 18px;margin:0 0 20px;list-style:none;font-size:14.5px}
.woocommerce-error{border-top-color:var(--sapin)}
.woocommerce-message{border-top-color:var(--sapin)}
.woocommerce-error::before,.woocommerce-info::before,.woocommerce-message::before{display:none}

/* ─── le tableau de bord du compte ─── */
.nm-tb-tete{display:flex;flex-wrap:wrap;gap:20px 34px;align-items:flex-end;justify-content:space-between;
  padding-bottom:22px;border-bottom:1px solid var(--filet-clair);margin-bottom:24px}
.nm-tb-tete h2{font-size:clamp(1.4rem,2.6vw,1.9rem);margin:2px 0 6px}
.nm-tb-intro{margin:0;max-width:46ch;font-size:14.5px;line-height:1.6;opacity:.75}
.nm-tb-chiffres{display:flex;gap:26px}
.nm-tb-chiffres b{display:block;font-family:"IBM Plex Mono",monospace;font-size:1.22rem;
  font-variant-numeric:tabular-nums;line-height:1.2}
.nm-tb-chiffres span{font-family:"Figtree",sans-serif;font-size:11px;letter-spacing:.09em;
  text-transform:uppercase;opacity:.6}

.nm-tb-commande{display:flex;flex-wrap:wrap;gap:14px;align-items:center;justify-content:space-between;
  background:var(--fond-carte);border:1px solid var(--filet-clair);border-radius:var(--r-m);
  padding:18px 20px;margin-bottom:24px}
.nm-tb-commande h3{font-size:1.1rem;margin:2px 0 4px}
.nm-tb-commande-meta{margin:0;font-size:13.5px;opacity:.72;font-variant-numeric:tabular-nums}
.nm-tb-statut{font-family:"Figtree",sans-serif;font-size:11px;font-weight:600;letter-spacing:.09em;
  text-transform:uppercase;padding:.35rem .8rem;border-radius:100px;
  border:1px solid var(--filet);background:var(--fond-alt)}
.nm-tb-statut--completed{border-color:var(--sapin);color:var(--sapin)}
.nm-tb-statut--processing{border-color:var(--sapin);color:var(--sapin)}

.nm-tb-tuiles{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(210px,1fr))}
.nm-tb-tuile{display:flex;flex-direction:column;gap:3px;padding:18px 20px;color:inherit;
  background:var(--fond-carte);border:1px solid var(--filet-clair);border-radius:var(--r-m);
  transition:border-color .2s,transform .2s}
.nm-tb-tuile:hover{border-color:var(--filet);transform:translateY(-2px)}
.nm-tb-tuile b{font-family:"Fraunces",Georgia,serif;font-size:1.05rem;font-weight:400}
.nm-tb-tuile span{font-size:13px;opacity:.68}
.nm-tb-vide{margin:24px 0 0}
.nm-tb-sortie{margin:26px 0 0;font-size:13.5px}
.nm-tb-sortie a{opacity:.65;text-decoration:underline;text-underline-offset:3px}
.nm-tb-sortie a:hover{opacity:1}

/* =========================================================================
   PAGE COMMANDE
   Deux colonnes posées par le gabarit (`woocommerce/checkout/form-checkout.php`),
   pas par des flottants qu'il faudrait ensuite défaire. La colonne de droite
   est collante : sur un formulaire de dix champs, un récapitulatif qui
   disparaît au premier défilement laisse payer sans revoir ce qu'on paye.
   ========================================================================= */
.nm-cmd{display:grid;gap:clamp(18px,2.6vw,34px);align-items:start;grid-template-columns:1fr}
@media(min-width:980px){
  .nm-cmd{grid-template-columns:minmax(0,1fr) 380px}
  .nm-cmd-cote{position:sticky;top:96px}
}
.nm-cmd-corps{min-width:0}

/* ⚠️ WooCommerce fait flotter `col-1` et `col-2` à 47 %. On annule : la grille
   au-dessus s'en charge, et deux flottants dans une colonne de 600 px donnent
   deux colonnes de 280 px où « Adresse de facturation » tient sur trois lignes. */
.nm-cmd .col2-set .col-1,
.nm-cmd .col2-set .col-2{width:100%;float:none;margin:0}
.nm-cmd-champs{display:flex;flex-direction:column;gap:22px}
.nm-cmd-champs h3{font-family:"Fraunces",Georgia,serif;font-size:1.18rem;font-weight:400;
  margin:0 0 14px;padding-bottom:10px;border-bottom:1px solid var(--filet-clair)}
.nm-cmd-champs > div{background:var(--fond-carte);border:1px solid var(--filet-clair);
  border-radius:var(--r-l);padding:clamp(18px,2.4vw,26px)}
/* Une colonne d'expédition vide ne doit pas dessiner une carte fantôme. */
.nm-cmd-champs > div:empty{display:none}

/* Les champs suivent les règles de l'espace client : un seul jeu pour tous les
   formulaires du site. Il reste les cas propres à la commande. */
/* 🚨 Sixième récidive du même piège. WooCommerce impose
   `.woocommerce form .form-row-first{width:47%}` : une spécificité de (0,2,1)
   qui bat `.nm-cmd .form-row-first` (0,2,0). Prénom et Nom occupaient 169 px
   dans une colonne de 359, et le bord droit de « Nom » ne tombait pas sur
   celui des autres champs.
   Le préfixe `body.nm-theme` porte la règle à (0,3,1) et reprend la main.
   Voir docs/connaissances/feedback_woocommerce_gagne_par_ordre_de_chargement.md */
body.nm-theme .nm-cmd .form-row-first,
body.nm-theme .nm-cmd .form-row-last{width:100%;float:none}
@media(min-width:560px){
  .nm-cmd .col-1 > .woocommerce-billing-fields__field-wrapper,
  .nm-cmd .col-2 > .woocommerce-shipping-fields__field-wrapper{
    display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
  .nm-cmd .form-row-wide{grid-column:1/-1}
}
.nm-cmd abbr.required{border:0;text-decoration:none;color:var(--sapin)}
.nm-cmd .woocommerce-input-wrapper{width:100%}
.nm-cmd .select2-container .select2-selection--single{
  height:auto;padding:10px 14px;border:1px solid var(--filet);border-radius:var(--r-m);
  background:var(--blanc)}
.nm-cmd .select2-container--default .select2-selection--single .select2-selection__rendered{
  line-height:1.4;padding:0;color:var(--encre)}
.nm-cmd .select2-container--default .select2-selection--single .select2-selection__arrow{top:8px;right:8px}

/* ─── le récapitulatif ─── */
.nm-cmd-cote h2{font-family:"Fraunces",Georgia,serif;font-size:1.3rem;font-weight:400;margin:0 0 14px}
.nm-cmd-cote #order_review{background:var(--fond-carte);border:1px solid var(--filet-clair);
  border-radius:var(--r-l);overflow:hidden}
.nm-cmd-cote table.shop_table{width:100%;border:0;border-collapse:collapse;margin:0;
  font-size:14.5px;border-radius:0}
.nm-cmd-cote table.shop_table th,
.nm-cmd-cote table.shop_table td{padding:11px 18px;border:0;
  border-bottom:1px solid var(--filet-clair);text-align:left;font-weight:400}
.nm-cmd-cote table.shop_table thead th{font-family:"Figtree",sans-serif;font-size:11px;
  letter-spacing:.1em;text-transform:uppercase;opacity:.6;padding-block:14px}
.nm-cmd-cote table.shop_table td:last-child,
.nm-cmd-cote table.shop_table th:last-child{text-align:right;
  font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums}
.nm-cmd-cote .product-name{line-height:1.35}
.nm-cmd-cote .product-quantity{opacity:.6}
.nm-cmd-cote tfoot .order-total th,
.nm-cmd-cote tfoot .order-total td{border-bottom:0;padding-block:16px;font-size:1.05rem}
.nm-cmd-cote tfoot .order-total td{font-weight:600}
.nm-cmd-cote .includes_tax{display:block;font-size:11.5px;opacity:.6;font-weight:400}

/* ─── le paiement ─── */
.nm-cmd #payment{background:var(--fond-alt);border-top:1px solid var(--filet-clair);
  border-radius:0;padding:0}
.nm-cmd #payment ul.payment_methods{list-style:none;margin:0;padding:16px 18px;border:0;
  display:flex;flex-direction:column;gap:10px}
.nm-cmd #payment ul.payment_methods li{list-style:none;margin:0}
.nm-cmd #payment ul.payment_methods label{display:inline-flex;align-items:center;gap:8px;
  font-size:14.5px;font-weight:500;letter-spacing:0;opacity:1;cursor:pointer}
.nm-cmd #payment .payment_box{background:var(--fond-carte);border:1px solid var(--filet-clair);
  border-radius:var(--r-m);margin:8px 0 0;padding:12px 14px;font-size:13.5px;line-height:1.5}
.nm-cmd #payment .payment_box::before{display:none}
.nm-cmd #payment div.form-row.place-order{padding:16px 18px;margin:0;border-top:1px solid var(--filet-clair)}

/* 🚨 Même remarque que pour le bouton du panier : la règle de WooCommerce a la
   même spécificité que la nôtre et sa feuille arrive après. On nomme donc les
   classes que le bouton porte réellement. */
.nm-cmd #place_order,
body.nm-theme .nm-cmd button#place_order.button.alt{
  width:100%;background:var(--encre);border-color:var(--encre);color:var(--fond);
  font-family:"Figtree",sans-serif;font-size:12px;font-weight:500;letter-spacing:.08em;
  text-transform:uppercase;padding:1rem 1.2rem;border-radius:100px;
  transition:background .2s,border-color .2s}
body.nm-theme .nm-cmd button#place_order.button.alt:hover{
  background:var(--sapin);border-color:var(--sapin);color:#fff}
.nm-cmd .woocommerce-terms-and-conditions-wrapper{padding:0 18px 4px;font-size:13px}

/* La réassurance et les moyens de paiement, posés sous le bouton par
   functions.php, respirent un peu. */
.nm-cmd-cote .nm-rass,.nm-cmd-cote .nm-paiements{margin-top:18px}

/* ─── le bandeau « vous avez un code promo » ─── */
.nm-cmd .woocommerce-form-coupon-toggle,
.woocommerce-checkout .woocommerce-form-login-toggle{margin-bottom:18px}
.nm-cmd form.checkout_coupon,
.woocommerce-checkout form.woocommerce-form-login{background:var(--fond-carte);
  border:1px solid var(--filet-clair);border-radius:var(--r-l);padding:20px;margin:0 0 18px}

/* ─── les messages de WooCommerce, en dernier mot ───
   🚨 Ils gardaient le bleu de WooCommerce (#1E85BE) : `.woocommerce-info` seul
   (0,1,0) perd contre `.woocommerce .woocommerce-info` de sa feuille, chargée
   après la nôtre. On repasse devant en nommant le contexte, comme pour les
   boutons du panier et de la commande. C'est le troisième endroit aujourd'hui
   où WooCommerce gagne par l'ordre de chargement : quand une règle du thème
   « ne prend pas », c'est la première chose à regarder. */
body.nm-theme .woocommerce-error,
body.nm-theme .woocommerce-info,
body.nm-theme .woocommerce-message,
body.nm-theme .woocommerce-notice,
.woocommerce-page .woocommerce-info,
.woocommerce-page .woocommerce-message,
.woocommerce-page .woocommerce-error{
  border:1px solid var(--filet-clair);border-top:3px solid var(--encre);
  background:var(--fond-carte);border-radius:var(--r-m);color:var(--encre);
  padding:14px 18px;margin:0 0 20px;list-style:none;font-size:14.5px;line-height:1.55}
body.nm-theme .woocommerce-error,
.woocommerce-page .woocommerce-error{border-top-color:var(--sapin)}
body.nm-theme .woocommerce-message,
.woocommerce-page .woocommerce-message{border-top-color:var(--sapin)}
body.nm-theme .woocommerce-info::before,
body.nm-theme .woocommerce-message::before,
body.nm-theme .woocommerce-error::before,
.woocommerce-page .woocommerce-info::before,
.woocommerce-page .woocommerce-message::before,
.woocommerce-page .woocommerce-error::before{display:none}
body.nm-theme .woocommerce-info a,
.woocommerce-page .woocommerce-info a{text-decoration:underline;text-underline-offset:3px}

/* ─── la commande : reprendre la main sur les flottants de WooCommerce ───
   🚨 QUATRIÈME fois aujourd'hui. `.woocommerce form .col2-set .col-1{width:47.05%}`
   a exactement la même spécificité que notre règle (0,3,0) et sa feuille est
   chargée après : la carte de facturation faisait 377 px dans une colonne de
   786. Mesuré, pas supposé — 377/786 = 48 %, la signature du 47,05 %.

   Règle à retenir pour ce thème : quand une règle « ne prend pas » sur un
   écran WooCommerce, ce n'est presque jamais une faute de sélecteur, c'est
   l'ordre de chargement. On monte d'un cran avec `body.nm-theme`. */
body.nm-theme .nm-cmd .col2-set .col-1,
body.nm-theme .nm-cmd .col2-set .col-2{width:100%;float:none;margin:0}

/* Le conteneur des champs n'est pas un enfant direct de `.col-1` : il est
   enveloppé dans `.woocommerce-billing-fields`. Le sélecteur d'origine ne
   visait donc rien, et les champs restaient en pile. */
@media(min-width:620px){
  body.nm-theme .nm-cmd .woocommerce-billing-fields__field-wrapper,
  body.nm-theme .nm-cmd .woocommerce-shipping-fields__field-wrapper,
  body.nm-theme .nm-cmd .woocommerce-additional-fields__field-wrapper{
    display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
  body.nm-theme .nm-cmd .form-row-wide,
  body.nm-theme .nm-cmd .woocommerce-additional-fields__field-wrapper > p{grid-column:1/-1}
}

/* ─── la mention de TVA sous le total ───
   WooCommerce l'écrit en `<small>` À LA SUITE du montant : « 107,70 € (inclut
   17,95 € TVA estimé pour France) » se cassait en deux au milieu de la
   parenthèse dans une colonne de 380 px. On la passe sous le chiffre, où elle
   a la place de tenir sur une ligne. */
.nm-pan-total{flex-wrap:wrap}
.nm-pan-total .includes_tax,
.nm-cmd-cote .includes_tax{display:block;width:100%;text-align:right;
  margin-top:3px;font-size:11.5px;line-height:1.4;opacity:.6;font-weight:400}

/* ─── Rail des réseaux, collé au bord droit ────────────────────────────────
   Porté de calindesir.fr. Une réglette étroite plutôt qu'une capsule : sur un
   bloc haut, un arrondi en gélule donne un gros galet posé sur la page. Ici la
   plaque fait la largeur d'un bouton, l'arrondi est court, et ce sont
   l'étiquette verticale et les deux fils qui signent le bloc.

   `pointer-events:none` sur le conteneur et `auto` sur ses enfants : sans ça,
   la colonne invisible entre les fils intercepterait les clics sur toute la
   hauteur de l'écran, au bord droit. */
.nm-rs{position:fixed;right:0;top:50%;transform:translateY(-50%);z-index:34;
  display:flex;flex-direction:column;align-items:center;gap:.7rem;pointer-events:none}
.nm-rs>*{pointer-events:auto}
.nm-rs-titre{writing-mode:vertical-rl;text-orientation:mixed;
  font-family:"IBM Plex Mono",monospace;font-size:.56rem;letter-spacing:.24em;
  text-transform:uppercase;color:var(--encre-2);opacity:.6;margin-right:.1rem;user-select:none}
.nm-rs-fil{width:1px;height:clamp(20px,3.5vh,34px);
  background:linear-gradient(to bottom,transparent,var(--filet))}
.nm-rs-fil.bas{background:linear-gradient(to bottom,var(--filet),transparent)}
.nm-rs ul{list-style:none;margin:0;padding:.3rem .28rem;
  display:flex;flex-direction:column;gap:.12rem;
  /* ⚠️ Fond opaque et non `backdrop-filter` : un élément fixe qui refloute son
     fond coûte une passe de flou à chaque image de défilement. */
  background:rgba(250,250,248,.94);
  border:1px solid rgba(30,35,34,.10);border-right:0;
  border-radius:16px 0 0 16px;
  box-shadow:-12px 0 34px -16px rgba(30,35,34,.26)}
.nm-rs li{position:relative;display:flex}
.nm-rs a{position:relative;width:34px;height:34px;display:grid;place-items:center;
  isolation:isolate;border-radius:50%;color:var(--encre-2);
  transition:color .25s,transform .25s}
.nm-rs svg{width:17px;height:17px;position:relative;z-index:1}
.nm-rs a::before{content:"";position:absolute;inset:0;border-radius:50%;z-index:0;
  background:linear-gradient(145deg,var(--sapin-fonce),var(--sapin));opacity:0;transform:scale(.6);
  transition:opacity .28s,transform .28s cubic-bezier(.2,.8,.2,1)}
.nm-rs a:hover,.nm-rs a:focus-visible{color:var(--fond-carte)}
.nm-rs a:hover::before,.nm-rs a:focus-visible::before{opacity:1;transform:scale(1)}
/* Le nom se déplie à gauche : l'icône seule ne suffit pas à tout le monde. */
.nm-rs em{position:absolute;right:calc(100% + .55rem);top:50%;transform:translate(6px,-50%);
  font-style:normal;font-family:"IBM Plex Mono",monospace;font-size:.58rem;
  letter-spacing:.1em;text-transform:uppercase;white-space:nowrap;
  padding:.32rem .62rem;border-radius:999px;
  background:var(--encre);color:var(--fond-carte);opacity:0;visibility:hidden;
  box-shadow:0 6px 18px -8px rgba(30,35,34,.5);
  transition:opacity .22s,transform .22s,visibility .22s}
.nm-rs a:hover em,.nm-rs a:focus-visible em{opacity:1;visibility:visible;transform:translate(0,-50%)}
/* En dessous de 1100 px, le rail mordrait sur le contenu : on le retire, les
   liens restent dans le pied de page. */
@media (max-width:1099px){ .nm-rs{display:none} }
@media (prefers-reduced-motion:reduce){
  .nm-rs a,.nm-rs a::before,.nm-rs em{transition:none}
}

/* =========================================================================
   16. FICHE PRODUIT — maquette retenue le 24/09/2026
   (docs/maquette-fiche-retenue.html). Gabarit : woocommerce/content-single-
   product.php ; script : assets/fiche.js. Préfixe `nm-fp-`.
   Le vert sapin ne sert qu'à l'achat : bouton, tuile choisie, lien « Le
   choisir ». La couleur de la page vient de la palette du visuel.
   ========================================================================= */
.nm-fp [hidden]{display:none!important}
.nm-fp{padding-bottom:clamp(40px,6vw,96px)}
.nm-fp-tete{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px;min-height:52px}
.nm-fp-fil ol{list-style:none;margin:0;padding:16px 0;display:flex;flex-wrap:wrap;font-size:13px;color:var(--encre-2)}
.nm-fp-fil li+li::before{content:"›";margin:0 8px;color:var(--encre-2)}
.nm-fp-fil a{text-decoration:underline;text-decoration-color:transparent;text-underline-offset:3px;transition:text-decoration-color var(--t-court)}
.nm-fp-fil a:hover{text-decoration-color:currentColor}

.nm-fp-grille{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:clamp(24px,4vw,56px);align-items:start}

/* — galerie — */
.nm-fp-galerie{position:sticky;top:96px}
.nm-fp-vue{position:relative;background:#DADCD7;aspect-ratio:4/3;overflow:hidden}
/* 🚨 `.nm-fp-vue .nm-fp-img`, pas `.nm-fp-vue img` : `.woocommerce img{height:auto}`
   (woocommerce-layout.css) a la même priorité, se charge après et gagnait —
   l'image restait carrée dans le cadre 4:3 et se faisait couper en bas. */
.nm-fp-vue .nm-fp-img{display:block;width:100%;height:100%;object-fit:cover;user-select:none;-webkit-user-drag:none}
.nm-fp-vue .nm-fp-img[hidden]{display:none}
/* Affiches : leurs photos sont des mises en scène CARRÉES (1000 × 1000) ; dans
   le cadre 4:3 le `cover` coupait le haut de l'affiche (28/09). Cadre carré. */
.nm-fp[data-famille="affiches"] .nm-fp-vue{aspect-ratio:1/1}
.nm-fp[data-famille="affiches"] .nm-fp-vignettes button{aspect-ratio:1/1;width:72px}
/* Le motif seul se montre ENTIER : le calque des lés se pose sur l'image exacte. */
.nm-fp-vue .nm-fp-img--entier{object-fit:contain}
/* Le tableau de biais : entier, sur le blanc de sa propre photo. Pas de marge
   intérieure : un tableau que le fournisseur a photographié au ras du bord
   finit ainsi sur le bord du cadre, au lieu d'une coupure au milieu du blanc. */
.nm-fp-vue .nm-fp-img--objet{background:#fff}
.nm-fp-bascule{position:absolute;left:14px;top:14px;z-index:3;display:flex;gap:3px;padding:3px;border-radius:var(--r-s);background:rgba(250,250,248,.94)}
.nm-fp-bascule button{border:0;background:transparent;padding:6px 14px;font-size:13px;line-height:1.4;border-radius:var(--r-s);cursor:pointer;min-height:44px}
.nm-fp-bascule button[aria-pressed="true"]{background:var(--encre);color:var(--blanc)}
.nm-fp-vignettes{display:flex;gap:8px;margin-top:10px}
.nm-fp-vignettes button{position:relative;padding:0;width:84px;aspect-ratio:4/3;overflow:hidden;cursor:pointer;background:#DADCD7;border:1px solid transparent;border-radius:0}
.nm-fp-vignettes button.est-entier img{object-fit:contain;background:#fff}
.nm-fp-vignettes button[aria-pressed="true"]{border-color:var(--encre)}
.nm-fp-vignettes button img{display:block;width:100%;height:100%;object-fit:cover}

/* — calque : lés, hors mur, cadre, silhouette — */
.nm-fp-calque{position:absolute;inset:0;z-index:2;pointer-events:none}
.nm-fp-hors{position:absolute;background:rgba(243,243,240,.74)}
.nm-fp-bande{position:absolute;border-left:1px dashed rgba(255,255,255,.9);box-shadow:-1px 0 0 rgba(30,35,34,.18)}
.nm-fp-bande:first-child{border-left-color:transparent;box-shadow:none}
.nm-fp-bande b{position:absolute;bottom:6px;left:4px;padding:1px 5px;border-radius:var(--r-s);background:rgba(30,35,34,.74);
  font:500 11px/1.4 "IBM Plex Mono",ui-monospace,monospace;color:var(--blanc)}
.nm-fp-cadre{position:absolute;border:2px solid var(--blanc);box-shadow:0 0 0 1px rgba(30,35,34,.35);cursor:grab;pointer-events:auto;touch-action:none}
.nm-fp-cadre.est-saisi{cursor:grabbing}
.nm-fp-cadre:focus-visible{outline:3px solid var(--encre);outline-offset:2px}
/* Une silhouette, pas un rectangle : l'œil juge l'échelle d'un corps, pas d'une barre. */
.nm-fp-silhouette{position:absolute;background:no-repeat center bottom/contain url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 165'%3E%3Cg fill='%231E2322' fill-opacity='.78'%3E%3Ccircle cx='20' cy='11' r='10'/%3E%3Cpath d='M9 25h22c4 0 7 3 7 7v45c0 2-2 4-4 4h-2v80c0 2-2 4-4 4h-4c-2 0-3-2-3-4V110h-2v51c0 2-1 4-3 4h-4c-2 0-4-2-4-4V81H6c-2 0-4-2-4-4V32c0-4 3-7 7-7z'/%3E%3C/g%3E%3C/svg%3E")}
.nm-fp-consigne{margin-top:8px;font-size:13.5px;line-height:1.45;color:var(--encre-2)}

/* — colonne d'achat — */
.nm-fp-titre{font-size:clamp(1.9rem,3vw,2.6rem);line-height:1.08}
.nm-fp-nuance{display:flex;align-items:center;gap:12px;margin:14px 0 6px;font-size:14px;color:var(--encre-2)}
.nm-fp-les{display:flex;gap:2px;height:18px;width:90px;flex:none}
.nm-fp-les i{flex:1}
.nm-fp-nuance a{color:var(--encre);text-decoration:underline;text-underline-offset:3px}
.nm-fp-prix{font:500 28px/1.3 "IBM Plex Mono",ui-monospace,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.02em;margin:18px 0 4px}
.nm-fp-prix small{font:400 14px/1.4 var(--corps);letter-spacing:.01em;color:var(--encre-2)}
.nm-fp-bloc{border-top:1px solid var(--filet);padding:18px 0}
.nm-fp-bloc h2{font-family:var(--corps);font-weight:600;font-size:15px;letter-spacing:.01em;margin-bottom:10px}

.nm-fp-formats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.nm-fp-tuile{position:relative;display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:2px 8px;padding:10px 12px;
  background:var(--fond-carte);border:1px solid var(--filet);border-radius:var(--r-s);cursor:pointer;transition:border-color var(--t-court),background-color var(--t-court)}
.nm-fp-tuile:hover{border-color:var(--encre-2)}
/* `:has(:checked)` : la tuile cochée se voit aussi sans script. */
.nm-fp-tuile.est-choisi,.nm-fp-tuile:has(.nm-fp-radio:checked){border-color:var(--sapin);box-shadow:inset 0 0 0 1px var(--sapin);background:var(--blanc)}
.nm-fp-tuile:has(.nm-fp-radio:focus-visible){outline:2px solid var(--sapin);outline-offset:3px}
/* Le radio est masqué à l'œil, pas au lecteur d'écran : c'est lui qu'on annonce. */
.nm-fp-radio{position:absolute;opacity:0;width:1px;height:1px;margin:0;pointer-events:none}
.nm-fp-dim{font:500 16px/1.3 "IBM Plex Mono",ui-monospace,monospace;letter-spacing:-.02em}
.nm-fp-pr{font:500 14px/1.3 "IBM Plex Mono",ui-monospace,monospace;letter-spacing:-.02em}
.nm-fp-det{grid-column:1/-1;font-size:13px;line-height:1.45;color:var(--encre-2)}
.nm-fp-haut{color:var(--sapin);font-weight:600}

.nm-fp-assist{background:var(--fond-alt);padding:16px;border-radius:var(--r-s);display:grid;gap:12px}
.nm-fp-champs{display:flex;gap:14px;flex-wrap:wrap;align-items:flex-end}
.nm-fp-assist label{display:grid;gap:3px;font-size:13px;color:var(--encre-2)}
.nm-fp-assist input[type=number]{width:112px;font:500 20px/1.3 "IBM Plex Mono",ui-monospace,monospace;border:0;border-bottom:1px solid var(--encre);
  background:transparent;padding:3px 0;color:var(--encre);border-radius:0}
.nm-fp-assist input[type=number]:focus-visible{outline:2px solid var(--sapin);outline-offset:3px}
.nm-fp-assist label.nm-fp-case{display:flex;gap:8px;align-items:center}
.nm-fp-case input{width:18px;height:18px;accent-color:var(--encre)}
.nm-fp-sortie{display:block;font-size:15px;line-height:1.55}
.nm-fp-sortie b{font-family:"IBM Plex Mono",ui-monospace,monospace;font-weight:500;letter-spacing:-.02em}
.nm-fp-alerte{color:var(--alerte)}
.nm-fp-lien--neutre{color:var(--encre);font-weight:500}
.nm-fp-memo{display:block;margin-bottom:4px;font-size:13.5px;color:var(--encre-2)}
.nm-fp-lien{border:0;background:none;padding:0;color:var(--sapin);font-weight:600;cursor:pointer;text-decoration:underline;text-underline-offset:3px}
.nm-fp-echelle{width:100%;height:150px;display:block}
.nm-fp-echelle .sol{stroke:var(--filet);stroke-width:2;vector-effect:non-scaling-stroke}
.nm-fp-echelle .meuble{fill:#B9B4AA}
.nm-fp-echelle .toile{fill:var(--sapin)}
.nm-fp-echelle .personne{fill:rgba(30,35,34,.7)}

.nm-fp-achat{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:48px;padding:14px 20px;
  border:1px solid transparent;border-radius:var(--r-s);background:var(--sapin);color:var(--blanc);font-size:15.5px;line-height:1.3;cursor:pointer;
  transition:background-color var(--t-court)}
.nm-fp-achat:hover{background:var(--sapin-fonce)}
.nm-fp-achat.est-en-cours{opacity:.75;cursor:progress}
.nm-fp-form{margin-top:4px}
.nm-fp-plan{font-size:14px;color:var(--encre-2);margin-top:10px}
.nm-fp-jumelle{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:10px;min-height:48px;padding:12px 20px;border:1px solid var(--sapin);border-radius:var(--r-s);color:var(--sapin);text-decoration:none;font-weight:500}
.nm-fp-jumelle:hover{background:var(--sapin);color:var(--blanc)}
.nm-fp-jumelle-d{font-size:14px;font-weight:400;opacity:.85}
.nm-fp-plan b{color:var(--encre);font-weight:600}
.nm-fp-indispo{padding:14px 0;color:var(--encre-2)}
.nm-fp-rea{list-style:none;margin:16px 0 0;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:12px 16px}
.nm-fp-rea li{display:flex;gap:10px;align-items:flex-start;font-size:13px;line-height:1.4;color:var(--encre-2)}
.nm-fp-rea b{display:block;color:var(--encre);font-weight:600;font-size:13.5px}
.nm-fp-picto{flex:none;width:26px;height:26px;stroke:var(--sapin);fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
.nm-fp-date{margin-top:12px;font-size:13.5px;color:var(--encre-2)}
.nm-fp-infos > .nm-fp-acc:first-of-type{margin-top:20px}
.nm-fp-ref{margin-top:10px;font-size:13px}

/* — accordéons — */
.nm-fp-acc{border-top:1px solid var(--filet)}
.nm-fp-acc:last-child{border-bottom:1px solid var(--filet)}
.nm-fp-acc summary{cursor:pointer;padding:14px 0;font-weight:600;font-size:15px;list-style:none;display:flex;justify-content:space-between;align-items:center;gap:12px}
.nm-fp-acc summary::-webkit-details-marker{display:none}
.nm-fp-acc summary::after{content:"+";font-weight:400;font-size:18px;color:var(--encre-2)}
.nm-fp-acc[open] summary::after{content:"–"}
.nm-fp-acc-corps{padding-bottom:16px;color:var(--encre-2);font-size:15px}
.nm-fp-acc-corps.nm-prose > h3{font-family:var(--corps);font-weight:600;font-size:15px;color:var(--encre);margin-top:1.4em}
.nm-fp-acc-corps ul{padding-left:18px;margin:0}
.nm-fp-acc-corps li+li{margin-top:4px}
.nm-fp-table{overflow-x:auto;margin-bottom:14px}
.nm-fp-table table{width:100%;border-collapse:collapse;font-size:14px}
.nm-fp-table th,.nm-fp-table td{text-align:left;padding:7px 6px;border-bottom:1px solid var(--filet);white-space:nowrap}
.nm-fp-table th{font-weight:500;font-size:13px}
.nm-fp-table td{font-family:"IBM Plex Mono",ui-monospace,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.02em;color:var(--encre)}

/* — dans la même nuance — */
.nm-fp-meme h2{font-size:clamp(1.6rem,2.6vw,2.2rem);margin-bottom:6px}
.nm-fp-meme-sous{font-family:var(--corps);font-weight:600;font-size:15px;letter-spacing:.01em;margin:18px 0 12px}

/* — sections pleine largeur (maquette v2) — */
.nm-fp-sections{margin-top:clamp(48px,7vw,80px);display:grid;gap:clamp(44px,6vw,72px)}
.nm-fp-titre-s{display:flex;justify-content:space-between;align-items:end;gap:8px 24px;flex-wrap:wrap;margin-bottom:18px}
.nm-fp-titre-s h2{font-size:clamp(1.6rem,2.6vw,2.2rem)}
.nm-fp-titre-s p{color:var(--encre-2);max-width:56ch;font-size:15px}
.nm-fp-trio{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;background:var(--filet);border:1px solid var(--filet)}
.nm-fp-trio > div{background:var(--fond-carte);padding:24px 22px;display:grid;gap:10px;align-content:start}
.nm-fp-trio .nm-fp-picto{width:34px;height:34px;stroke-width:1.3}
.nm-fp-trio h3{font-size:1.35rem}
.nm-fp-trio p,.nm-fp-trio ul{font-size:15px;color:var(--encre-2)}
.nm-fp-trio p b{color:var(--encre);font-weight:600}
.nm-fp-trio ul{margin:0;padding-left:18px}
.nm-fp-trio li+li{margin-top:4px}
.nm-fp-plan-les{background:var(--fond-carte);border:1px solid var(--filet);padding:22px;display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:28px;align-items:center}
.nm-fp-plan-les svg{width:100%;height:auto;display:block}
.nm-fp-plan-les svg rect.a{fill:var(--fond);stroke:var(--encre-2);stroke-width:1}
.nm-fp-plan-les svg rect.b{fill:var(--fond-alt);stroke:var(--encre-2);stroke-width:1}
.nm-fp-plan-les svg rect.mur{fill:none;stroke:var(--sapin);stroke-width:2.5}
.nm-fp-plan-les svg text{font:500 13px "IBM Plex Mono",ui-monospace,monospace;fill:var(--encre)}
.nm-fp-plan-les dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:6px 14px;font-size:15px}
.nm-fp-plan-les dt{color:var(--encre-2)}
.nm-fp-plan-les dd{margin:0;font-family:"IBM Plex Mono",ui-monospace,monospace;letter-spacing:-.02em}
.nm-fp-plan-les dd.nm-fp-texte{font-family:var(--corps);letter-spacing:.01em}
.nm-fp-etapes{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
.nm-fp-etapes li{background:var(--fond-carte);border:1px solid var(--filet);padding:18px;display:grid;gap:8px;align-content:start}
.nm-fp-etape-n{font-size:13px;font-weight:500;color:var(--sapin)}
.nm-fp-etapes b{font-family:"Fraunces",Georgia,serif;font-weight:400;font-size:1.15rem}
.nm-fp-etapes span:last-child{font-size:15px;color:var(--encre-2)}
.nm-fp-etapes svg{width:100%;height:70px;stroke:var(--encre-2);fill:none;stroke-width:1.2;color:var(--encre)}
.nm-fp-etapes svg .nm-fp-encolle{fill:rgba(31,77,67,.12)}
.nm-fp-faq summary{font-weight:500}
.nm-fp-avis{background:var(--fond-alt);padding:22px}
.nm-fp-avis-titre{font-family:var(--corps);font-weight:600;font-size:15px;letter-spacing:.01em;margin-bottom:6px}
.nm-fp-avis p{color:var(--encre-2)}
.nm-fp-note{font-size:15px}
.nm-fp-avis-liste{list-style:none;margin:14px 0 0;padding:0;display:grid;gap:14px}
.nm-fp-rangee{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:14px}
.nm-fp-rangee a{display:grid;grid-template-columns:1fr auto;gap:6px;font-size:13px;color:var(--encre-2)}
.nm-fp-rangee img{grid-column:1/-1;width:100%;aspect-ratio:4/3;object-fit:cover;background:#DADCD7;transition:opacity var(--t-court)}
.nm-fp-rangee a.est-objet img{object-fit:contain;background:var(--blanc);padding:6%}
.nm-fp-rangee a:hover img{opacity:.88}
.nm-fp-carte-t{color:var(--encre);min-width:0}
.nm-fp-rangee a:hover .nm-fp-carte-t{text-decoration:underline;text-underline-offset:3px}
.nm-fp-carte-p{white-space:nowrap}

/* — barre d'achat collante — */
.nm-fp-barre{position:fixed;left:0;right:0;bottom:0;z-index:50;display:flex;gap:14px;align-items:center;
  padding:10px var(--gouttiere) calc(10px + env(safe-area-inset-bottom,0px));
  background:rgba(250,250,248,.97);border-top:1px solid var(--filet);
  transform:translateY(110%);visibility:hidden;transition:transform var(--t-moyen),visibility 0s linear .34s}
.nm-fp-barre.est-visible{transform:none;visibility:visible;transition:transform var(--t-moyen)}
.nm-fp-barre img{width:54px;height:40px;object-fit:cover;flex:none}
.nm-fp-barre-t{flex:1;min-width:0;font-size:14px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nm-fp-barre-t span{display:block;color:var(--encre-2);font-size:13px}
.nm-fp-barre .nm-fp-achat{width:auto;flex:none;min-height:44px;padding:10px 18px}
html.nm-fp-barre-ouverte body{padding-bottom:calc(66px + env(safe-area-inset-bottom,0px))}

@media (max-width:900px){
  .nm-fp-grille{grid-template-columns:1fr}
  .nm-fp-galerie{position:static}
  .nm-fp-formats{grid-template-columns:1fr}
  .nm-fp-trio,.nm-fp-etapes,.nm-fp-plan-les{grid-template-columns:1fr}
  .nm-fp-rangee{grid-template-columns:repeat(2,minmax(0,1fr))}
  .nm-fp-rangee li:nth-child(5){display:none}
  .nm-fp-rangee a{grid-template-columns:1fr}
}
@media (max-width:480px){
  .nm-fp-rea{grid-template-columns:1fr}
  .nm-fp-barre img{display:none}
}
@media (prefers-reduced-motion:reduce){
  .nm-fp-barre,.nm-fp-barre.est-visible,.nm-fp-tuile,.nm-fp-achat,.nm-fp-rangee img{transition:none}
}

/* ==========================================================================
   ENSEMBLES DE TABLEAUX (mu-plugin 38-nm-ensembles)
   Page /ensembles/, bloc de la fiche, section de l'accueil. Le vert sapin
   reste réservé au bouton d'achat ; le reste est encre et filets.
   ========================================================================== */
.nm-ens-page{padding-block:clamp(26px,4vw,52px) clamp(52px,7vw,86px)}
.nm-ens-avis{margin-bottom:22px}
.nm-ens-tete{max-width:62ch;margin-bottom:clamp(26px,4vw,44px)}
.nm-ens-tete h1{margin:8px 0 14px}
.nm-ens-tete p:last-child{color:var(--encre-2)}
.nm-ens-grille{display:grid;gap:clamp(34px,5vw,64px)}

.nm-ens{display:grid;gap:clamp(20px,3vw,40px);align-items:start}
.nm-ens--complet{grid-template-columns:minmax(0,6fr) minmax(0,5fr);padding-bottom:clamp(34px,5vw,64px);border-bottom:1px solid var(--filet);scroll-margin-top:110px}
.nm-ens-amb{position:relative;aspect-ratio:4/3;overflow:hidden;background:var(--fond-alt)} /* relative : le cadrage de nm_fi_style_cadre() est en absolu */
.nm-ens-amb img{width:100%;height:100%;object-fit:cover}
.nm-ens-titre{font-size:clamp(1.5rem,2.6vw,2.1rem);margin:6px 0 12px}
.nm-ens-titre a:hover{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}
.nm-ens-texte{color:var(--encre-2);max-width:52ch;margin-bottom:20px}

.nm-ens-liste{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(var(--n,3),minmax(0,1fr));gap:12px}
.nm-ens-liste a{display:flex;flex-direction:column;gap:2px;font-size:13.5px;line-height:1.35;color:var(--encre-2)}
.nm-ens-vis{display:block;aspect-ratio:1;background:var(--blanc);margin-bottom:8px;border:1px solid var(--filet-clair)}
.nm-ens-vis img{width:100%;height:100%;object-fit:contain;padding:8%;transition:opacity var(--t-court)}
.nm-ens-liste a:hover img{opacity:.86}
.nm-ens-t{color:var(--encre);font-weight:500}
.nm-ens-liste a:hover .nm-ens-t{text-decoration:underline;text-underline-offset:3px}
.nm-ens-f,.nm-ens-p{font-size:12.5px}

.nm-ens-total{display:flex;align-items:baseline;flex-wrap:wrap;gap:6px 12px;margin:20px 0 12px;padding-top:14px;border-top:1px solid var(--filet)}
.nm-ens-total span{color:var(--encre-2);font-size:14px;margin-right:auto}
.nm-ens-total b{font-weight:500;font-size:1.3rem;color:var(--encre)}
.nm-ens-total del{color:var(--encre-2);font-size:1rem}

.nm-ens-achat{display:flex;align-items:center;justify-content:center;width:100%;min-height:48px;padding:13px 20px;
  border:1px solid transparent;border-radius:var(--r-s);background:var(--sapin);color:var(--blanc);font-size:15.5px;line-height:1.3;cursor:pointer;
  transition:background-color var(--t-court)}
.nm-ens-achat:hover{background:var(--sapin-fonce)}
.nm-ens-achat.est-en-cours{opacity:.75;cursor:progress}
.nm-ens-retour{font-size:14px;margin-top:8px;min-height:0}
.nm-ens-retour:empty{display:none}
.nm-ens-retour.est-ok{padding:10px 12px;background:var(--ok-f);color:var(--encre)}
.nm-ens-retour.est-refus{padding:10px 12px;background:var(--alerte-f);color:var(--alerte)}
.nm-ens-retour a{text-decoration:underline;text-underline-offset:3px;font-weight:500}
.nm-ens-panier{margin:0 0 18px;padding:12px 16px;background:var(--ok-f);color:var(--encre);font-size:15px}

.nm-ens-conseil{margin-top:clamp(34px,5vw,56px);max-width:62ch}
.nm-ens-conseil h2{font-size:clamp(1.3rem,2.2vw,1.6rem);margin-bottom:10px}
.nm-ens-conseil ul{margin:0;padding-left:18px;color:var(--encre-2)}
.nm-ens-conseil li+li{margin-top:6px}

/* — compact : fiche d'un tableau, accueil — */
.nm-ens--compact{padding:clamp(16px,2.4vw,24px);background:var(--fond-carte);border:1px solid var(--filet)}
.nm-ens--compact .nm-ens-titre{font-size:clamp(1.2rem,2vw,1.45rem);margin:4px 0 14px}
.nm-ens--compact .nm-ens-total{margin-top:14px}
.nm-ens-fiche{margin-top:clamp(40px,5vw,64px)}
.nm-ens-fiche h2{font-size:clamp(1.6rem,2.6vw,2.2rem);margin-bottom:16px}
.nm-ens-fiche .nm-ens--compact{max-width:720px}
.nm-ens-fiche .nm-ens--compact + .nm-ens--compact{margin-top:16px}

.nm-ens-acc{background:var(--fond-alt);padding:0 clamp(16px,3vw,40px) clamp(40px,6vw,88px)}
.nm-ens-acc-tete{display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding-top:clamp(28px,4vw,44px);border-top:1px solid var(--filet);margin-bottom:22px}
.nm-ens-acc-tete h2{font-size:clamp(1.4rem,2.4vw,1.9rem)}
.nm-ens-acc-tete a{font-size:14px;text-decoration:underline;text-underline-offset:3px}
.nm-ens-acc-grille{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,320px),1fr));gap:18px}
/* Trios d'affiches : sur le fond de la section Affiches, pas sur celui des tableaux. */
.nm-ens-acc--affiches{background:var(--fond)}
.nm-ens-unites{flex-basis:100%;text-align:right;color:var(--encre-2);font-size:12.5px;margin-top:-4px}
.nm-ens-variante{margin-top:8px;font-size:13px;color:var(--encre-2);text-align:center}
.nm-ens-variante a{color:var(--encre);text-decoration:underline;text-underline-offset:3px}

@media (max-width:900px){
  .nm-ens--complet{grid-template-columns:1fr}
}
@media (max-width:480px){
  .nm-ens-liste{gap:8px}
  .nm-ens-liste a{font-size:12.5px}
}
@media (prefers-reduced-motion:reduce){
  .nm-ens-achat,.nm-ens-vis img{transition:none}
}

/* Panier : le format de chaque tableau, sous son nom */
.nm-pan-format{margin:2px 0 0;font-size:13px;color:var(--encre-2)}
