/*
Theme Name:  Salient Child, Finnso Bois
Theme URI:   https://themeforest.net/item/salient-responsive-multipurpose-theme/4363266
Description: Thème enfant Salient du projet Finnso Bois. Seul ce dossier est versionné :
             le thème parent « salient » est tiré du repo vendor au démarrage.
Author:      Numeria Communication
Author URI:  https://numeria-communication.fr
Template:    salient
Version:     1.0.0
*/

/* =============================================================================
 * OÙ ÉCRIRE LE CSS : convention Numeria (2 couches, ne pas les mélanger)
 *
 *   1. CE FICHIER (style.css)          → composants CODÉS dans le thème enfant :
 *                                        templates surchargés, WooCommerce, header,
 *                                        footer, écrans de compte…
 *   2. assets/css/custom.css           → couche MARKETING / page builder (WPBakery).
 *                                        C'est le miroir versionné du champ « Custom
 *                                        CSS Code » de Salient (Theme Options).
 *                                        ⚠️ Ce champ DOIT rester vide tant qu'on
 *                                        travaille en fichier, sinon l'inline écrase.
 *
 * Le style.css enfant est déjà mis en file d'attente par Salient (handle
 * « salient-child-style », prio 90) : ne pas le ré-enqueuer. functions.php se
 * contente de repointer sa version sur filemtime() (cache-busting).
 * ========================================================================== */

/* =============================================================================
 * Variables de charte : relevées des VARIABLES FIGMA du fichier DEV-FINN
 * (get_variable_defs sur les nœuds 3-61, 1-2, 251-520), le 2026-09-17. À utiliser
 * PARTOUT plutôt que des valeurs en dur.
 *
 * Les huit couleurs ci-dessous sont la charte, au nom que lui donne la maquette.
 * Les filets suivent : ce ne sont pas des variables Figma, mais les mêmes quatre
 * opacités reviennent sur les trois pages. Les alias qui terminent le bloc
 * existent parce que le SOCLE COMMUN (assets/css/custom.css § 2) et les
 * composants hérités du kit les nomment ainsi : ils ne sont pas une seconde
 * charte, ils pointent la première.
 * ========================================================================== */

:root {
	/* ── La charte, telle que la maquette la nomme ─────────────────────────── */
	--brand-blue:        #205AA6;   /* « Bleu charte » : texte, boutons, filets */
	--brand-blue-deep:   #144075;   /* « Bleu plus foncé » : cadres Partenaires, Nous choisir */
	--brand-blue-light:  #2B73BA;   /* « Bleu plus clair » : contour du bouton sur cadre foncé */
	--brand-copper:      #C77A36;   /* « cuivre » : numéros, texte survolé des méga-menus */
	--brand-cream:       #FDFBF8;   /* « Fond blanc cassé » : fond de page, cartes partenaires */
	--brand-beige:       #F0EBE9;   /* « Beige clair » : cartes services, contour des tags */
	--brand-border:      #EDE9E8;   /* « Contour blocs blancs » : méga-menus, blocs logo */
	--brand-white:       #FFFFFF;

	/* ── Filets : le bleu charte à quatre opacités, le blanc à deux ─────────── *
	 * .35 rubriques, secteurs, items de menu · .3 liens « découvrir » · .2 pied
	 * de page · .5 tag survolé. Sur bleu foncé : blanc .2 (rubrique), .15 (blocs
	 * argument), .5 (bouton verre), .6 (item de menu survolé). */
	--brand-rule:        rgba(32, 90, 166, .35);
	--brand-rule-soft:   rgba(32, 90, 166, .3);
	--brand-rule-faint:  rgba(32, 90, 166, .2);
	--brand-rule-strong: rgba(32, 90, 166, .5);
	--brand-rule-on-blue:       rgba(255, 255, 255, .2);
	--brand-rule-on-blue-faint: rgba(255, 255, 255, .15);

	/* ── Alias attendus par le socle commun et les composants du kit ──────── *
	 * ⚠️ PROVISOIRES tant que le composant correspondant n'est pas monté : ces
	 * rôles (bleu profond, accent, cuivré clair, gris bleu, parme, beurre, olive)
	 * viennent de la charte de Tera, dont ce thème enfant est issu. Chacun se
	 * retranche sur la couleur de la charte la plus proche par le RÔLE, et se
	 * re-décide à la mesure au moment de monter le composant, pas ici. */
	--brand-navy:         var(--brand-blue);         /* texte, fonds forts */
	--brand-navy-deep:    var(--brand-blue-deep);    /* bandes et cartes */
	--brand-accent:       var(--brand-copper);       /* l'accent : focus, numéros */
	--brand-copper-light: var(--brand-copper);       /* contours et survols */
	--brand-blue-grey:    var(--brand-rule);         /* filets */
	--brand-olive:        var(--brand-copper);       /* aucun équivalent, jamais dessiné */
	--brand-parme:        var(--brand-border);       /* filets et fonds froids */
	--brand-parme-light:  var(--brand-cream);        /* fond très clair */
	--brand-blue-sky:     var(--brand-blue-light);   /* ombre de survol */
	--brand-butter:       var(--brand-copper);       /* fin de dégradé chaud */
	--brand-yellow:       var(--brand-beige);        /* fond chaud */

	/* ── Typographie ───────────────────────────────────────────────────────── *
	 * UNE famille pour tout ce qui se lit et se titre : Syne (400 corps, 500
	 * H1 et menu, 600 sur-titres, H4 et liens). La seconde, Bricolage Grotesque
	 * Light 300, n'a qu'UN emploi : les numéros « 01 » des blocs service
	 * (nœud 109:1503). Les deux sont sur Google Fonts ; Salient auto-héberge
	 * Syne (Theme Options), le thème enfant sert Bricolage 300 (includes/polices.php). */
	--font-title:   "Syne", sans-serif;                  /* h1-h6, sur-titres */
	--font-text:    "Syne", sans-serif;                  /* corps */
	--font-over:    "Syne", sans-serif;                  /* sur-titres capitales */
	--font-numeral: "Bricolage Grotesque", sans-serif;   /* numéros des blocs service, 300 */
}

/* Le fond de page : « Fond blanc cassé ». Il n'a pas de champ Salient hors mise
   en page « boxed » (cf. scripts/set-colors.php), il vit donc ici. */
body {
	background-color: var(--brand-cream);
}


/* =============================================================================
 * Titres : ce que les Theme Options ne portent pas
 *
 * Familles, tailles, graisses et capitales viennent de Salient → Theme Options
 * (cf. scripts/set-typography.php). Restent ici :
 *
 *   · les INTERLIGNES, posés en ratio SANS UNITÉ. Salient n'applique ses % de
 *     responsive qu'au font-size : un line-height en px resterait figé et casserait
 *     à petit écran, alors qu'un ratio suit automatiquement chaque palier.
 *   · les COULEURS, que le champ typographique de Salient ne gère pas.
 * ========================================================================== */

/* ⚠️ Sélecteurs préfixés `body` : le CSS compilé de Salient déclare ses titres en
   `h1, body h1, …`. Un simple `h1 { line-height }` se fait écraser (mesuré sur
   Tera : H1 à 1.1 au lieu de 1.25). On aligne la spécificité.

   ⚠️ Et pour H3 et H4, `body` ne suffit PAS : Salient les déclare AUSSI en
   `.row .col h3` (0-2-1), avec un interligne EN PIXELS. Dès qu'un titre vit dans
   une rangée du page builder, c'est-à-dire partout sur ce site, c'est cette
   valeur-là qui s'applique. On aligne donc la spécificité une seconde fois, sans
   toucher aux TAILLES, qui restent celles des Theme Options et suivent leurs
   paliers responsive.

   ⚠️ H2 aussi : dans ses deux dernières media queries (max 999 et max 690),
   Salient écrit `.col h2, body h2, …` (0-1-1), qui passe devant un `body h2`
   (0-0-2). Mesuré sur Tera : deux paliers sur quatre étaient faux sans que rien
   ne le signale. */
/* Les ratios de la maquette, MESURÉS sur les nœuds et non lus dans les variables
   (qui annoncent « lineHeight: 100 » pour H2 et H3 alors que le rendu est
   `normal`) : H1 à 1 (`leading-none`, nœud 4:2), H2 et H3 à 1,2 (trois lignes
   de 46 = 165 px, nœud 95:1470 ; deux lignes de 34 = 82 px, 109:1501), H4 à H6
   et le corps à 1,5 (variables H4, Sur-titre, Corps). */
body h1 {
	line-height: 1;
}

body h2,
body .row .col h2,
body h3,
body .row .col h3 {
	line-height: 1.2;
}

body h4,
body .row .col h4,
body h5,
body .row .col h5,
body h6,
body .row .col h6 {
	line-height: 1.5;
}

body {
	line-height: 1.5;
}

/* ⚠️ AUCUNE couleur de H1 n'est posée ici, et c'est une DÉCISION, pas un oubli.
 *
 * Le réflexe repris des autres sites est `h1 { color: var(--brand-white) }`,
 * parce que le titre y vit sur un en-tête sombre. Elle est INERTE : le CSS
 * compilé de Salient déclare `body, body h1, body h2…` (0-0-2), qui bat un `h1`
 * seul (0-0-1). Mesuré ici même — la règle était bien dans la feuille, et le H1
 * sortait quand même au bleu profond de `overall-font-color`.
 *
 * Et c'est heureux : sur Tera, le blanc ne vaut PAS pour tous les H1. Les quatre
 * maquettes posent le titre sur une photo sombre, mais les pages légales et
 * toute page sans hero l'auront sur fond clair, où un H1 blanc serait invisible.
 *
 * Le blanc se posera donc AVEC le hero, sur la rangée qui le porte, au montage —
 * et avec le préfixe `body` s'il doit battre Salient. */


/* =============================================================================
 * Composants du thème enfant
 * ========================================================================== */

/* ─────────────────────────────── Pied de page ────────────────────────────── *
 *
 * Rendu par la Global Section « Footer » (scripts/create-footer.php), accrochée à
 * `nectar_hook_global_section_footer` et affichée partout. Son contenu vit dans
 * content/footer/global-section.html : logo à gauche, bloc de contact à droite.
 *
 * ⚠️ La ligne de mentions légales SOUS ce bloc n'est pas ici : c'est la barre de
 * copyright de Salient, réglée par scripts/set-footer-options.php et habillée au
 * § suivant.
 *
 * ── Ce que la maquette dessine (nœud 631:2140, bande de 1790 × 223) ──────────
 * Les deux blocs sont CENTRÉS ENSEMBLE, pas poussés aux bords : le logo (266 de
 * large) finit à x=857, le contact commence à x=932, et le milieu de la paire
 * tombe pile au milieu de la bande. Deux colonnes de 1/2 le donnent exactement,
 * à condition de rentrer chacune de la moitié des 75 px d'écart.
 *
 * Cotes MESURÉES sur le rendu de la maquette (1790 px de large, donc 1 px = 1 px
 * de dessin), et non lues dans des champs : le nom fait 17 px d'encre → 22 px de
 * police, le téléphone 13 → 17, les activités 9 → 12, sur un interligne de 1,5
 * (4 lignes dans 71 px). Les écarts entre les trois blocs valent 25 px.
 * ────────────────────────────────────────────────────────────────────────── */

body .nc-footer {
	background: var(--brand-white);
}

/* Les 75 px d'écart de la maquette, partagés entre les deux colonnes. Sous 1000,
   les colonnes s'empilent et se centrent : le retrait n'a plus d'objet. */
@media (min-width: 1000px) {
	body .nc-footer .nc-footer__marque > .vc_column-inner {
		padding-right: 37px;
	}

	body .nc-footer .nc-footer__contact > .vc_column-inner {
		padding-left: 37px;
	}

	/* ⚠️ Le dessin aligne les deux colonnes sur l'ENCRE : le haut du logo et le
	   haut de capitale du nom sont tous deux à y=25 dans le composant. En CSS le
	   logo commence à son bord d'image, mais le nom commence au haut de sa BOÎTE
	   DE LIGNE, qui porte un demi-interligne au-dessus de la capitale. Mesuré :
	   10 px de décalage, le nom paraissant démarrer plus bas que le logo.

	   On remonte donc la colonne de contact de ces 10 px. La valeur tient sur
	   toute la bande ≥ 1000, où le nom reste à 24 px — et elle n'a pas cours en
	   dessous, où les colonnes s'empilent et où l'écart logo → contact est réglé
	   ailleurs, à son propre compte. */
	body .nc-footer .nc-footer__contact > .vc_column-inner {
		margin-top: -10px;
	}
}

/* ── Sous 1000 : la pile ──────────────────────────────────────────────────── *
 * Salient empile alors les deux colonnes de 1/2 et le pied de page devient une
 * pile centrée, logo puis contact. Deux choses ne suivent PAS toutes seules.
 *
 * ⚠️ 1. Le LOGO restait collé à DROITE. La colonne passe pourtant bien en
 * `force-tablet-text-align-center` : ça n'y change rien, parce que l'alignement
 * de l'image est porté par sa propre enveloppe, `.right.img-with-aniamtion-wrap
 * { text-align: right }` (salient/css/src/style.css:4498), qu'une classe posée
 * sur la COLONNE n'atteint pas. Mesuré avant correction, le logo sortait décentré
 * de +307 px à 999, +205 à 768, +32 à 375 — d'autant moins visible que l'écran
 * est étroit, donc d'autant plus facile à ne pas voir.
 *
 * ⚠️ Et on recentre par `text-align`, pas par `margin: 0 auto` : la règle voisine
 * `.right.img-with-aniamtion-wrap img` (0-0-2-1) rend l'image `inline-block` et
 * bat le `display: block` écrit plus bas (0-0-1-0). Sur une image restée EN LIGNE,
 * une marge auto ne fait rien — elle aurait l'air posée et n'aurait servi à rien.
 *
 * ⚠️ 2. L'ÉCART entre le logo et le bloc de contact valait 24 px, c'est-à-dire
 * exactement le rythme INTERNE du bloc de contact (25 px entre nom, téléphone et
 * activités) : les quatre blocs se lisaient alors comme une seule liste, sans
 * hiérarchie. On le double, pour que la marque et le contact restent deux choses.
 * ────────────────────────────────────────────────────────────────────────── */
@media (max-width: 999px) {
	body .nc-footer .img-with-aniamtion-wrap,
	body .nc-footer .img-with-aniamtion-wrap a {
		text-align: center;
	}

	/* Écrase la marge de colonne empilée de WPBakery (25 px), pas un ajout.

	   ⚠️ 36 pour 45 px d'ENCRE, et pas 45 : comme les marges du bloc de contact,
	   celle-ci sépare des boîtes, et la boîte de ligne du nom porte 9 px au-dessus
	   de sa capitale. Mesuré, 45 de marge rendaient 53,8 px d'encre. C'est l'écart
	   VU qui doit valoir ~45 — nettement plus que les 25 du rythme interne, sans
	   quoi la marque et le contact se lisent comme une seule liste. */
	body .nc-footer .nc-footer__marque {
		margin-bottom: 36px;
	}
}

@media (max-width: 690px) {
	/* 27 pour 35 px d'encre, même raison qu'au-dessus (8,5 px de boîte). */
	body .nc-footer .nc-footer__marque {
		margin-bottom: 27px;
	}
}

/* ⚠️ `line-height: 0` sur l'enveloppe : Salient pose 15 px de marge basse sous
   TOUTE image, et la boîte d'interligne du lien ajoute encore quelques pixels
   sous le logo. Les deux se voient comme un pied de page décentré vers le haut. */
body .nc-footer .img-with-aniamtion-wrap {
	line-height: 0;
}

/* ⚠️ La TAILLE du logo ne se règle PAS ici : elle est un champ de l'élément
 * `image_with_animation` (`max_width_custom`, dans content/footer/global-section.html),
 * que Salient compile en `.img-with-aniamtion-wrap.custom-width-266px .inner` —
 * c'est-à-dire sur l'ENVELOPPE, pas sur l'image. Une règle posée sur l'`img` est
 * inerte : `.row .col img` (0-0-2-1) la bat sur `max-width`, `height` et
 * `margin-bottom`, et `.right.img-with-aniamtion-wrap img` sur `display`. Mesuré :
 * un `max-width: 266px` écrit ici calculait 100 %, et le logo faisait bien ses
 * 266 px — par le champ, pas par la règle. Le genre de ligne qui a l'air de
 * travailler et qu'on modifierait sans effet.
 *
 * Le palier MOBILE passe donc par le même chemin, `max_width_custom_phone="210px"` :
 * Salient a ses propres champs par appareil, calés sur 999 et 690 px, qui sont
 * exactement les paliers du projet. Le client garde un champ pour chaque taille,
 * et rien n'est caché dans la feuille de style.
 *
 * Pourquoi 210 en mobile : le logo gardait ses 266 px jusqu'à 375, soit 81 % de la
 * largeur de ligne — la marque écrasait le contact, qui est pourtant ce qu'on vient
 * chercher dans un pied de page. À 210 il en occupe les deux tiers. En tablette il
 * reste à 266 (30 à 44 % de la ligne, comme au bureau) : rien à corriger. */

/* ── Le bloc de contact ───────────────────────────────────────────────────── *
 * Trois blocs de texte, trois rôles, un seul rythme : 25 px entre chacun.
 *
 * ⚠️ Salient donne à tout `p` un `padding-bottom` de 1,5 em
 * (`--nectar-paragraph-bottom-spacing`), qui s'ajoute aux marges et rendait ici
 * 24 px de plus entre chaque ligne. C'est lui qu'on éteint, pas la marge : la
 * marge, elle, porte le rythme voulu et se lit. */
/* ⚠️ Les 25 px du dessin sont des écarts d'ENCRE, entre boîtes TRIMÉES
 * (`text-box-trim` dans Figma). Une marge CSS, elle, sépare des BOÎTES DE LIGNE,
 * qui portent en plus le demi-interligne et la descente. Posée à 25 partout, elle
 * rendait 34 px d'encre sous le nom et 29,6 sous la capsule — trop, et INÉGAL,
 * ce qui se voit avant même de mesurer.
 *
 * Chaque marge est donc calée sur son propre écart : 25 moins ce que la boîte
 * ajoute au-dessous du dernier trait d'encre. Les valeurs sont mesurées au rendu,
 * pas calculées — `text-box-trim` n'est pas servi par les navigateurs de
 * production, on ne peut pas simplement recopier le dessin.
 *
 * ⚠️ Ce que la boîte ajoute dépend de la TAILLE : en tablette et en mobile, où le
 * nom recule de 24 à 21 puis 20, l'écart rendu bouge de ±1,5 px. On ne le
 * rattrape pas palier par palier — 1,5 px sur un écart de 25 ne se voit pas, et
 * trois jeux de marges pour ça coûteraient plus en lisibilité qu'ils ne
 * rapportent. */
body .nc-footer__contact .wpb_text_column {
	margin-bottom: 25px;
}

body .nc-footer__contact .nc-footer__nom {
	margin-bottom: 16px;
}

body .nc-footer__contact .nc-footer__tel-ligne {
	margin-bottom: 20px;
}

body .nc-footer__contact .wpb_text_column:last-child {
	margin-bottom: 0;
}

body .nc-footer__contact p {
	padding-bottom: 0;
	margin: 0;
}

/* ⚠️ Le nom est en GEOM, pas en Bricolage, et c'est le seul texte du pied de page
 * qui change de famille. Relevé dans le composant (nœud 631:2178) : Geom Medium
 * 24 / 1,5. Il portait Bricolage 600 à 22 px, deux erreurs d'un coup — une mesure
 * d'ENCRE donne la hauteur des capitales (17 px ici), pas celle de la police, et
 * elle ne dit rien de la famille. 17 / 24 = 0,71, le rapport capitale/em de Geom :
 * c'est exactement le piège noté au § 3 du CLAUDE.md pour le H1. */
body .nc-footer__nom p {
	font-family: var(--nc-font-titres);
	font-size: 24px;
	font-weight: 500;
	line-height: 1.5;
	color: var(--brand-navy);
}

/* La PILULE du téléphone. Filet bleu clair, rayon plein, et les 21 px de
   rembourrage latéral que donne la maquette (capsule de 177 pour un texte de 135).
 *
 * ⚠️ Le trait est un `box-shadow: inset` et non un `border` : Figma dessine ses
 * contours À L'INTÉRIEUR de la boîte, une bordure CSS s'AJOUTE. C'est le même
 * piège que sur les boutons de l'en-tête, où il coûtait 1,5 px de hauteur.
 *
 * ⚠️ Cible tactile : 35 px de haut, au-dessus du plancher de 24 px du projet,
 * mais sous les 44 confortables. C'est la hauteur DESSINÉE, et un numéro de
 * téléphone est un lien qu'on vise sans se presser. */
.nc-footer__tel {
	display: inline-block;
	/* 21 px de rembourrage latéral : le composant donne une capsule de 177 pour un
	   texte de 135, soit (177 - 135) / 2. Le rembourrage VERTICAL, lui, est déduit
	   et non relevé — voir juste en dessous. */
	padding: 6.5px 21px;
	border-radius: 100px;
	box-shadow: inset 0 0 0 1px var(--brand-blue-light);

	font-family: var(--nc-font-textes);
	font-size: 20px;
	font-weight: 500;
	line-height: 1.1;
	letter-spacing: -0.4px;
	color: var(--brand-navy) !important;
	text-decoration: none;

	transition: box-shadow .25s ease;
}

/* ── Le survol ────────────────────────────────────────────────────────────── *
 * Le filet ne change PAS de couleur et le fond reste vide : la pilule prend une
 * LUEUR de sa propre couleur de filet. Ce n'est pas un choix local, c'est la
 * règle du design system — les quatre composants de bouton à contour (« Bouton
 * contour bleu clair » 492:101, « petit contour cuivré » 409:200, « transparent »
 * 399:83, « plein » 573:1305) ont tous la même variante 2 : contour identique,
 * plus une ombre `1px 1px 8px` de la couleur du filet. Le thème enfant le fait
 * déjà pour le bouton de l'en-tête (custom.css, § boutons de l'en-tête).
 *
 * La valeur du composant au filet bleu clair est `1px 1px 8px rgba(166,196,255,.25)`.
 * Elle est ÉLARGIE ici — `0 2px 12px` à 55 % — et c'est une décision, mesurée :
 *
 *   écart maximal entre repos et survol, sur 255 (perception ≈ 8-10) :
 *     · valeur du composant, telle quelle ........ 13   ← à la limite du visible
 *     · même force que le bouton d'en-tête (.33) .. 14
 *     · retenu : 0 2px 12px à 55 % ................ 30
 *
 * Pourquoi le dessin peut se permettre 13 et pas nous : sa variante 2 fait DEUX
 * choses, la lueur et le dédoublement du « rond lumière ». C'est le rond qui
 * porte le visible ; la lueur ne fait que l'accompagner. Cette pilule n'ayant pas
 * de rond (cf. plus bas), la lueur reste seule — et seule, à la valeur du
 * composant, elle ne se voit pas. On garde donc la FORME de l'effet, qui est ce
 * que la charte dit, et on lui donne l'intensité que le dessin obtenait par son
 * autre moitié.
 *
 * ⚠️ Un HALO EN ANNEAU (`0 0 0 4px`) se voyait tout aussi bien et a été écarté :
 * le `:focus-visible` dessine déjà un anneau terracotta juste en dessous. Deux
 * anneaux pour deux états différents, et on ne sait plus lequel dit quoi.
 *
 * ⚠️ Ce qu'il y avait avant — filet TERRACOTTA et fond BEIGE — était inventé, et
 * à contre-charte sur les deux points : aucun composant ne change la couleur de
 * son filet au survol, et le beige n'est un fond de survol nulle part. Ça se
 * voyait d'autant moins que c'était joli : un survol plausible n'est pas un
 * survol juste.
 *
 * ⚠️ Les deux ombres tiennent dans UNE déclaration, le filet compris : `box-shadow`
 * n'est pas cumulatif, une seconde déclaration remplacerait la première et la
 * pilule perdrait son trait au survol.
 *
 * ⚠️ L'autre moitié de la variante 2 ne s'applique pas ici : les boutons du
 * dessin voient leur « rond lumière » se dédoubler au survol. Cette pilule n'en
 * a pas — le composant du pied de page (631:2179) est une capsule nue. On ne lui
 * en ajoute pas un : la maquette ne le demande pas. */
.nc-footer__tel:hover,
.nc-footer__tel:focus-visible {
	box-shadow: inset 0 0 0 1px var(--brand-blue-light),
	            0 2px 12px rgba(166, 196, 255, .55);
	box-shadow: inset 0 0 0 1px var(--brand-blue-light),
	            0 2px 12px color-mix(in srgb, var(--brand-blue-light) 55%, transparent);
}

/* ⚠️ Le focus clavier du navigateur est un contour de 1 px noir sur fond blanc :
   il se voit à peine et il dessine des angles droits dans une pilule. On pose
   l'anneau de l'accent, au rayon de la pilule. */
.nc-footer__tel:focus-visible {
	outline: 2px solid var(--brand-accent);
	outline-offset: 3px;
}

/* Les activités. Les deux dernières lignes sont en gras dans la maquette : le
   `<strong>` est dans le contenu, donc modifiable par le client, et il prend la
   graisse de `bold_font_family` (Bricolage 600). */
/* Bricolage Light 14 / 1,45 (nœud 631:2181). Là encore la mesure d'encre mentait :
 * 12 px posés pour une police de 14, parce que la boîte du composant est TRIMÉE
 * (`text-box-trim`) et ne montre que l'encre — quatre lignes dans 71 px, soit
 * 3 × 14 × 1,45 + une hauteur de capitale, et non 4 × interligne. */
body .nc-footer__activites p {
	font-family: var(--nc-font-textes);
	font-size: 14px;
	font-weight: 300;
	line-height: 1.45;
	color: var(--brand-navy);
}

/* Les deux « • » de la ligne en gras sont en BLEU CLAIR dans le composant
   (631:2181 : `text-[#a6c4ff]` sur ces deux caractères, et sur eux seuls — la
   puce de « Electricité • Mise en lumière » reste bleu profond). Les `<span>`
   sont dans le CONTENU (content/footer/global-section.html), pas générés :
   c'est du texte que le client édite, il doit voir ce qu'il y a. */
.nc-footer__puce {
	color: var(--brand-blue-light);
}


/* ── Barre de copyright : la ligne de mentions légales ────────────────────── *
 * Salient sort ici trois colonnes flottantes (span_5 + span_7) dont une ne sert
 * qu'aux icônes de réseaux. Elles vivent chez nous dans la Global Section, aux
 * couleurs de la charte : la liste de Salient reste donc VIDE. On la masque quand
 * elle l'est, et seulement quand elle l'est, pour ne pas escamoter en silence
 * des icônes que quelqu'un activerait un jour dans Theme Options → Social Media.
 *
 * ⚠️ L'option « Enable Social Icons in Copyright Area » ne sert à rien ici : elle
 *    n'est lue QUE si `social_networks_mode = dynamic` (copyright-bar.php). En
 *    mode `legacy`, qui est le nôtre, Salient boucle sur `use-<réseau>-icon` et
 *    sort le `<ul class="social">` dans tous les cas, vide s'il n'y a rien. */
/* ⚠️ Spécificité : le CSS compilé de Salient déclare la barre en
   `#footer-outer #copyright[data-layout="centered"]` (0-2-1-0). Un
   `#footer-outer #copyright` (0-2-0-0) est donc écrasé : mesuré, 45 px de padding
   au lieu des 20/75 écrits ici. On aligne avec `body …[data-layout]`, qui passe
   devant sans dépendre de la VALEUR de l'attribut (elle change avec l'option
   « Footer Copyright Layout »). */
/* 20 en haut / 55 en bas : l'asymétrie est VOULUE, et elle est mesurée. Ce qui
   compte n'est pas le rembourrage de la barre mais l'ENCRE de part et d'autre de
   la ligne de mentions — au-dessus, la Global Section apporte déjà son propre
   bas de page (les 25 px internes du dessin).

   ⚠️ La barre n'existe pas dans le dessin, qui laisse 100 px de blanc sous la
   bande du pied de page (25 internes + 100 jusqu'au bord, sur les quatre
   maquettes). La barre TIENT DANS ces 100 px au lieu de s'y ajouter : mesuré le
   2026-09-14, dernière encre du contact → bas de page = 126 px pour 125, la
   ligne à 51 au-dessus / 55 en dessous. Avant, 166 px — la barre s'empilait
   sous le blanc du dessin au lieu de l'occuper. */
body #footer-outer #copyright[data-layout] {
	padding: 20px 0 55px;
	border: none;
}

#footer-outer #copyright .container {
	display: flex;
	flex-direction: column;
	align-items: center;
}

#footer-outer #copyright .col {
	float: none;
	width: 100%;
	margin: 0;
	padding: 0;
	text-align: center;
}

/* ⚠️ En layout « centered », Salient plafonne la colonne du texte à
   `max-width: 70%` du conteneur, et seulement au-dessus de 1000 px. Sur notre
   ligne unique de mentions, ça produit un comportement NON MONOTONE, mesuré :
   1 ligne à 1300 px, 2 lignes à 1100 px (602 px utiles au lieu de 860), puis de
   nouveau 1 ligne à 999 px où le plafond ne s'applique plus. Le plafond a du sens
   pour un pavé de copyright multiligne, pas pour une ligne de liens que la
   maquette veut centrée sur toute la largeur. On le lève : la ligne tient alors
   d'un seul tenant jusqu'à ~700 px, puis se casse une fois, puis deux. */
body #footer-outer #copyright[data-layout] .col.span_5 {
	max-width: 100%;
}

#footer-outer #copyright ul.social {
	margin: 0;
}

#footer-outer #copyright ul.social:empty {
	display: none;
}

/* Syne 12 px, interligne 1.7, comme la maquette. Pas de COULEUR ici : celle du
   texte et celle des liens (marine, survol orange) sont compilées par Salient à
   partir des options `footer-copyright-font-color` et
   `footer-copyright-icon-hover-color`, et sortent en `!important` sur les liens.
   Les écrire aussi ici donnerait deux sources de vérité dont une sans effet ;
   elles se règlent dans scripts/set-footer-options.php. */
#footer-outer #copyright p {
	margin: 0;
	font-family: var(--font-title);
	/* ⚠️ La graisse est INDISPENSABLE ici, et ce n'est pas du zèle : rien ne la
	   déclare dans cette barre, elle est donc HÉRITÉE du corps, qui est en
	   Bricolage Light 300. Mais la famille, elle, change pour Geom — et Geom
	   n'est auto-hébergée qu'en 400 et 500 (mesuré par font-check.mjs). Le
	   navigateur retombait donc en silence sur la graisse la plus proche : rendu
	   correct par chance, et faux dès que Salient servirait une 300. */
	font-weight: 400;
	font-size: 12px;
	line-height: 1.7;
}

/* Le crédit d'agence est un BLOC, pour que « Site réalisé par » et le nom de
   l'agence ne se séparent pas au passage à la ligne.

   ⚠️ `inline-block` et NON `white-space: nowrap` : le groupe bascule d'un bloc à
   la ligne suivante, mais reste libre de se casser À L'INTÉRIEUR de sa boîte s'il
   devenait plus large que la ligne. Avec `nowrap`, un nom d'agence plus long
   déborderait — et un débordement de pied de page ne se voit pas. */
.nc-copyright__item {
	display: inline-block;
	max-width: 100%;
}


/* -----------------------------------------------------------------------------
 * Étoiles de la note Google: .nc-etoiles
 *
 * Rendu par [nc_etoiles_google] (includes/avis-google.php), qui répète le SVG de
 * assets/img/etoile.svg autant de fois que la note arrondie vers le haut.
 *
 * Les trois valeurs viennent du composant « Note google » de la maquette
 * (nœud 594:1180, section témoignages) : étoile de 24, écart de 2, terracotta.
 * Le fichier porte sa taille et un remplissage `currentColor` : la couleur se
 * règle donc ICI, avec la variable de charte, et non dans le fichier.
 *
 * ⚠️ L'écart n'est PAS proportionnel à l'étoile, contrairement aux autres sites
 * du socle (où il valait le quart de sa largeur) : la maquette donne 2 px pour
 * 24, soit un douzième, et la rangée de cinq fait 128 px. Les deux rangées du
 * dessin — la note Google et la carte d'avis — sont le MÊME composant : elles
 * partagent donc leurs valeurs, et `.note_etoile` (custom.css) les reprend.
 *
 * `line-height: 0` empêche la boîte d'interligne du texte environnant d'ajouter
 * quelques pixels sous les étoiles (le même piège que les pilules, cf. CLAUDE.md).
 * -------------------------------------------------------------------------- */
.nc-etoiles {
	--nc-etoile-largeur: 24px;

	display: inline-flex;
	align-items: center;
	gap: 2px;
	line-height: 0;
	color: var(--brand-accent);
	vertical-align: middle;
}

.nc-etoiles svg {
	width: var(--nc-etoile-largeur);
	height: auto;
}


/* =============================================================================
 * Page 404
 *
 * Le contenu est rendu par includes/page-404.php, branché sur le hook
 * `nectar_hook_404_content` (Salient n'a pas de champ « texte de la 404 »).
 *
 * ⚠️ Salient dimensionne ce titre pour afficher « 404 », deux caractères :
 *     body #ajax-content-wrap #error-404 h1 { font-size: 250px }
 * Deux ID, donc la règle la plus spécifique du thème, elle écrase le H1 de la
 * charte sans qu'on la voie. Avec une phrase à la place du nombre, le titre
 * débordait sur toute la largeur. On la reprend au même sélecteur, à la taille du
 * H1 de la charte.
 *
 * Cette taille étant écrite en dur, elle échappe aux % responsive de Salient :
 * ses trois paliers sont posés en fin de bloc, avec ceux des boutons, et pas en
 * fin de fichier comme les autres.
 *
 * ⚠️ CES QUATRE VALEURS DOUBLENT CELLES DE `scripts/set-typography.php`, et rien
 * ne les tient ensemble : un CSS ne sait pas lire un champ des Theme Options. Si
 * le H1 de la charte bouge, elles bougent — c'est la seule règle du site dans ce
 * cas, et c'est le prix du `font-size: 250px` de Salient.
 *
 * ⚠️ 64 px, et non 60 : le H1 de la charte a été corrigé le 2026-09-11 au montage
 * de la page contact (les 60 étaient DÉDUITS d'une hauteur d'encre, les héros de
 * la maquette portent bien `font-size: 64`). Les paliers suivent les mêmes % que
 * partout — 85 / 70 / 60 %, soit 54 / 45 / 38.
 * ⚠️ Et l'interligne reste à 1,25 alors que la charte met H1 et H2 à 1,1 : c'est
 * assumé, ce titre-là est une PHRASE (« Page introuvable ») et non une accroche
 * de hero, et il passe à deux lignes dès la tablette.
 * ========================================================================== */

body #ajax-content-wrap #error-404 h1 {
	font-size: 64px;
	line-height: 1.25;
}

/* ⚠️ Salient réserve un ÉCRAN ENTIER au contenu de la 404, sans compter notre
 * pied de page : il posait 231 px de vide entre les boutons et le pied.
 *
 * La réserve est un `min-height` en STYLE INLINE, calculé en JS (`js/build/init.js`) :
 *     .container-wrap { min-height: winH - adminBar - <en-tête> - footerOuterHeight + 55 }
 * `footerOuterHeight` ne mesure que `#footer-outer`, c'est-à-dire la seule barre de
 * copyright (115 px). Or le pied de page du site est une GLOBAL SECTION, rendue
 * AVANT `#footer-outer` et hors de lui (313 px, mesuré) : elle n'entre donc dans
 * aucun terme du calcul, et la réserve dépasse d'exactement sa hauteur.
 *
 * On ne recalcule PAS la bonne valeur : Salient a DÉJÀ le bon mécanisme, en CSS et
 * sans arithmétique, `body { display:flex; flex-direction:column; min-height:100vh }`
 * plus `.container-wrap { flex-grow:1 }`. Lui, il compte tous les frères, pied de
 * page compris. Il suffit de retirer la réserve JS pour qu'il reprenne la main : la
 * bande grandit quand l'écran est plus haut que la page (le pied reste collé en bas)
 * et ne grandit pas quand la page est déjà plus haute. `!important` parce qu'on
 * répond à un style inline, et le JS a beau la reposer au redimensionnement, elle
 * perd toujours.
 *
 * Mesuré à 1440x900 : blanc boutons -> logo du pied 446 px avant, 215 après, soit
 * exactement la réserve de la page contact (100 + 40 + 75, cf. § 6 du CLAUDE.md).
 *
 * Le CENTRAGE, lui, ne sert que sur un écran PLUS HAUT que la page (1440p, 4K) : là,
 * `flex-grow` rouvre l'écart, et il DOIT le faire, sinon le pied de page remonterait
 * au milieu de l'écran. Ce rab-là se partage alors de part et d'autre du bloc au lieu
 * de tomber entièrement sous les boutons. Sans aucun effet là où il n'y a pas de rab,
 * c'est-à-dire à toutes les hauteurs de fenêtre courantes : mesuré identique au pixel
 * de 700 à 1080, et le bloc reste large de 720 et centré, de 375 à 2560.
 *
 * ⚠️ Scopé à la 404 : la même ligne de JS s'applique à TOUTE page plus courte qu'un
 * écran, les pages encore vides comprises. Le jour où l'une d'elles doit rester
 * courte, on AJOUTE son sélecteur ici plutôt que d'élargir la règle à l'aveugle. */
body.error404 .container-wrap {
	min-height: 0 !important;
	display: flex;
	flex-direction: column;
	justify-content: center;
}

#error-404.nc-404 {
	max-width: 720px;
	margin: 0 auto;
	padding: 60px 0 100px;
	text-align: center;
}

#error-404.nc-404 p {
	margin-bottom: 30px;
}

/* Les deux boutons côte à côte, et l'un sous l'autre quand la place manque. */
#error-404.nc-404 .nc-404-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 15px;
	justify-content: center;
	margin-bottom: 0;
}

/* =============================================================================
 * Bouton de contenu : .nc-btn
 *
 * La pilule de la charte, pour les boutons qui ne sont NI des entrées de menu
 * (celles-là ont `btn-menu-contour` / `btn-menu-plein`, scopées à l'en-tête et à
 * l'off-canvas), NI des boutons posés au page builder (Salient les habille).
 * Aujourd'hui : la page 404, et elle seule.
 *
 * ⚠️ Le BOUTON D'ENVOI de Contact Form 7 n'est PLUS servi ici, depuis le
 * 2026-09-14. Il l'a été : un bloc de règles `body .wpcf7 input.wpcf7-submit
 * .nc-btn…` vivait plus bas, bleu profond avec la lueur seule en survol, au motif
 * qu'un `<input>` ne peut pas porter la pastille. Deux choses l'ont rendu caduc :
 * la demande de reprendre le composant « Bouton plein » 573:1305 tel quel
 * (fond `#4A70BC`, pastille), et la technique qui le permet — la pastille se pose
 * sur une ENVELOPPE `<span class="nc-submit">`, pas sur l'`<input>`. Le composant
 * est `.nc-submit`, dans `custom.css` (§ « Le bouton d'envoi : composant
 * « Bouton plein » »), et l'écran de connexion reprend la même technique dans
 * `login.css`. Les règles d'ici ont été RETIRÉES plutôt que laissées « au cas
 * où » : un sélecteur que rien ne matche plus est une seconde vérité qui attend.
 *
 * ── ⚠️ CE COMPOSANT EST LE JUMEAU DE `.nc-bouton` (custom.css) ──────────────
 * `custom.css` porte les cinq boutons du design system sous le nom `.nc-bouton`,
 * scopés à `.nectar-button`, donc au PAGE BUILDER. Celui-ci sert là où il n'y a
 * pas de page builder : la 404 (des `<a>` écrits en PHP). Le bouton d'envoi de
 * Contact Form 7 et celui de la connexion sont des `<input>` et ont leur propre
 * composant, `.nc-submit` (voir ci-dessus).
 *
 * Les DEUX doivent donc dire la même chose, et les valeurs sont reprises de là
 * sans être recalculées : Bricolage Grotesque Regular 14, capitales, interlettre
 * 0,28, interligne 1, pilule à 50 px, filet en `box-shadow: inset`, pastille de
 * 11 px en cuivré clair avec sa lueur `0 4px 4px` à 35 %. **Qui touche à l'un
 * relit l'autre.**
 *
 * ── Les deux variantes servies ici ──────────────────────────────────────────
 *   · `--plein`   → pilule pleine BLEU PROFOND, libellé blanc. Au repos la
 *                   pastille est une GRAINE de 2 px transparente ; au survol elle
 *                   grandit à 11 px pendant que le rembourrage droit se resserre
 *                   de 5. Même mécanique que `.nc-bouton--plein`.
 *   · `--contour` → « Bouton contour cuivré » (403:131) : filet ET pastille en
 *                   cuivré clair `#FAB192`, libellé bleu profond, fond
 *                   transparent. ⚠️ Sa pastille est là DÈS LE REPOS ; au survol
 *                   elle se DÉDOUBLE (un second disque translucide 5 px à sa
 *                   DROITE, 2 px plus haut, la pilule grandit de 5) et la
 *                   pilule prend la lueur de son filet.
 *
 * ⚠️ LE PLEIN EST LE `#4A70BC` DU COMPOSANT, depuis le 2026-09-14. Il a été bleu
 * profond pendant trois jours, au motif que « le bleu moyen vit sur fond sombre,
 * sur une carte blanche le plein de la charte est le bleu profond ». Cet
 * arbitrage a été RENVERSÉ pour les deux boutons d'envoi du site (page contact,
 * connexion — cf. `.nc-submit` dans custom.css et `tera-page-contact`) : ils sont
 * au `#4A70BC` du dessin, sur carte blanche. La 404 était alors le SEUL plein bleu
 * profond du site, et un site n'a pas deux boutons pleins. Elle suit.
 * ⚠️ Blanc sur `#4A70BC` : 4,85:1, au-dessus du seuil AA d'un texte normal.
 *
 * ── CE QUI ÉTAIT LÀ VENAIT DE K-PILATES, sur trois points ───────────────────
 *   · la POLICE : `var(--font-title)` en 600, c'est-à-dire Geom Semibold. Or
 *     Salient N'AUTO-HÉBERGE QUE les graisses déclarées dans ses champs
 *     typographiques, et Geom n'y est qu'en 400 et 500 (vérifié dans le
 *     `fonts.css` généré) : le navigateur FABRIQUAIT donc ce 600 en épaississant
 *     le 400, sans un mot. Les boutons du dessin sont de toute façon en
 *     Bricolage Grotesque Regular, comme celui de l'en-tête ;
 *   · le FILET du contour, en TERRACOTTA : aucun bouton du dessin n'a de filet
 *     terracotta. Les deux couleurs de contour du système sont le cuivré clair
 *     et le bleu clair ;
 *   · le SURVOL, qui ne faisait RIEN. Les trois règles `:hover` redisaient la
 *     couleur du repos et renvoyaient à « une ombre portée dure posée dans
 *     custom.css » : elle existe chez K-Pilates, elle n'a JAMAIS existé ici
 *     (vérifié, aucun `2px 3px 0` dans la feuille). Les deux boutons de la 404
 *     étaient donc sans aucune affordance de survol, et ça ne se voyait qu'en
 *     survolant.
 *
 * ⚠️ Les deux composants ne font PAS la même hauteur dans le dessin (38 px pour
 * le plein, 43 pour le contour) : ils n'y sont jamais côte à côte. Sur la 404 ils
 * le sont, et deux pilules voisines de hauteurs différentes se lisent comme une
 * erreur. Les deux prennent donc les 42 px du bouton d'en-tête — la seule hauteur
 * de bouton déjà mesurée sur ce site, et la médiane des deux valeurs dessinées.
 *
 * ⚠️ Pourquoi ne PAS passer par `.nectar-button` de la bibliothèque : ses
 * variantes `regular` et `see-through` sont dessinées pour un fond sombre (elles
 * forcent `color: #FFF`) et pour un rayon de 5 px, alors que la charte est à la
 * pilule. Et le bouton d'envoi de Contact Form 7 sort sans la classe `regular`,
 * donc AUCUNE des six règles de la bibliothèque ne l'atteignait : il retombait
 * sur le style natif du navigateur, en Arial 14 px, mesuré.
 *
 * ⚠️ Un <input> et un <button> n'héritent PAS de la police du document : sans
 * `font-family` explicite, le navigateur impose la sienne. D'où la déclaration
 * répétée sur les sélecteurs de formulaire.
 *
 * ⚠️ Et un <input> n'a NI `::before` NI `::after` : n'ayant pas d'enfants, la
 * norme lui refuse les pseudo-éléments. La pastille est donc réservée aux `<a>`
 * et aux `<button>` ; le bouton d'envoi de Contact Form 7 reçoit à la place la
 * LUEUR seule, ÉLARGIE. C'est l'arbitrage déjà rendu pour la capsule du pied de
 * page, qui n'a pas de pastille non plus (§ 4 bis du CLAUDE.md) : seule, à la
 * valeur du composant, une lueur ne se voit pas.
 * ========================================================================== */

.nc-btn,
input.nc-btn,
button.nc-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	position: relative;

	/* 14 / 25 / 14 / 28 et un interligne de 1 : le rembourrage de `.nc-bouton`,
	   à l'identique. Figma rogne ses boîtes de texte sur la HAUTEUR DE CAPITALE,
	   et recopier ses rembourrages verticaux sort une pilule trop haute — 15/25
	   donnerait 48 pour 43 dessinés. Le 28 à GAUCHE compense la pastille, qui
	   n'existe qu'à droite. Rendu : 43 px de haut.

	   ⚠️ Et le PLEIN garde cette hauteur, alors que son composant en dessine 38
	   (`.nc-bouton--plein` les respecte, lui). C'est un écart ASSUMÉ et borné à ce
	   composant-ci : sur la 404, les deux boutons sont CÔTE À CÔTE, ce qui n'arrive
	   dans aucune maquette, et deux pilules voisines de hauteurs différentes se
	   lisent comme une erreur de montage. L'adjacence est notre composition, pas
	   celle du dessin : c'est donc à nous de la rendre lisible. */
	padding: 14px 25px 14px 28px;
	border: 0;
	border-radius: 50px;
	background: transparent;

	font-family: var(--font-text);
	font-size: 14px;
	font-weight: 400;
	line-height: 1;
	letter-spacing: .28px;
	text-transform: uppercase;
	text-decoration: none;
	white-space: nowrap;
	cursor: pointer;

	transition: padding .25s ease, box-shadow .25s ease;
}

/* ── La pastille « rond lumière » ──────────────────────────────────────────
 * Le site n'a qu'UN signal de survol, celui du menu et du bouton d'en-tête : un
 * disque de 11 px en cuivré clair, avec la lueur du composant (`feOffset dy=4`
 * + `feGaussianBlur stdDeviation=2`, soit `0 4px 4px` à 35 %).
 *
 * Au repos elle existe en GRAINE de 2 px, transparente, avec une marge gauche
 * négative qui annule sa largeur : elle ne coûte donc rien à la pilule, et elle
 * GRANDIT au lieu d'apparaître — le libellé ne bouge pas d'un pixel.
 * ⚠️ Ces 2 px ne se peignent pas : le SVG de la variante « Par défaut » porte
 * `opacity="0"` sur son cercle. Peinte, la graine laisse un point cuivré gros
 * comme une poussière collé à la fin du libellé, en permanence — le piège est
 * documenté au § 4 bis du CLAUDE.md, il avait déjà mordu sur l'en-tête.
 * ------------------------------------------------------------------------- */
a.nc-btn::after,
button.nc-btn::after {
	content: "";
	flex: 0 0 auto;
	width: 2px;
	height: 2px;
	margin-left: -2px;
	border-radius: 50%;

	background-color: var(--brand-copper-light);
	box-shadow: 0 0 0 0 rgba(250, 177, 146, 0);
	opacity: 0;

	transition: width .25s ease, height .25s ease, margin .25s ease,
	            opacity .25s ease, box-shadow .25s ease;
	pointer-events: none;
}

/* `!important` sur la couleur : la bibliothèque pose
   `body a { color: inherit !important }`, qui gagnerait sinon.
   ⚠️ Blanc sur `#4A70BC` vaut 4,85:1. La mesure est écrite parce qu'elle ne va
   pas de soi sur cette charte : blanc sur terracotta tombe à 2,43:1. */
.nc-btn--plein,
input.nc-btn--plein,
button.nc-btn--plein {
	background: var(--brand-blue);
	color: var(--brand-white) !important;
	/* Le plein est le seul sans filet : la graine de pastille suffit. */
	padding-left: 25px;
}

/* Le fond ne CHANGE PAS au survol : la variante 2 du composant garde exactement
   le même fond, et c'est la pastille qui signale. */
a.nc-btn--plein:hover,
a.nc-btn--plein:focus-visible,
button.nc-btn--plein:hover,
button.nc-btn--plein:focus-visible {
	/* 20 à droite au lieu de 25 : la pastille passant de 2 à 11 px, l'écart
	   qu'elle gagne est repris sur le rembourrage, à largeur presque constante.
	   C'est ce que fait la variante 2 du bouton d'en-tête. */
	padding-right: 20px;
}

a.nc-btn--plein:hover::after,
a.nc-btn--plein:focus-visible::after,
button.nc-btn--plein:hover::after,
button.nc-btn--plein:focus-visible::after {
	width: 11px;
	height: 11px;
	/* ⚠️ 7 et non 10, corrigé le 2026-09-11 : les deux composants à graine n'ont
	   pas le même écart, et c'est relevé — « Bouton plein » (573:1305, variante 2)
	   donne `gap 7`, « Bouton transparent » de l'en-tête (399:83, variante 2)
	   donne `gap 10`. Le 10 venait de l'en-tête. `.nc-bouton--plein` portait déjà
	   le bon 7 dans custom.css : les deux jumeaux disent enfin la même chose. */
	margin-left: 7px;
	opacity: 1;
	box-shadow: 0 4px 4px rgba(250, 177, 146, .35);
	box-shadow: 0 4px 4px color-mix(in srgb, var(--brand-copper-light) 35%, transparent);
}

/* ── La variante à CONTOUR ─────────────────────────────────────────────────
 * ⚠️ Le trait est un `box-shadow: inset` et non un `border` : Figma dessine ses
 * contours À L'INTÉRIEUR de la boîte, une bordure CSS s'AJOUTE et grossit la
 * pilule. Même règle que le bouton d'en-tête.
 *
 * ⚠️ Le filet cuivré clair sur blanc ne vaut que 1,9:1, sous le seuil de 3:1 des
 * éléments non textuels. C'est le dessin, et ce n'est pas le filet qui porte la
 * lisibilité : le libellé est en bleu profond, à 10,8:1. Le même écart est déjà
 * assumé sur le filet de la carte d'avis.
 * ------------------------------------------------------------------------- */
.nc-btn--contour {
	background: transparent;
	color: var(--brand-navy) !important;
	box-shadow: inset 0 0 0 1px var(--brand-copper-light);
}

/* La LUEUR du filet vit sur un calque à elle et se fond en OPACITÉ.
   ⚠️ Elle ne peut PAS s'ajouter au `box-shadow` du bouton, qui porte déjà le
   filet : animer une liste d'ombres fait clignoter le trait, et le défaut est
   pire encore quand une couleur vient d'un `color-mix()` (le trait disparaît
   pendant TOUTE la transition sous Chromium — mesuré sur le bouton d'en-tête,
   § 2 du CLAUDE.md). Même mécanisme que `.nc-bouton::before`.
   Valeur de la variante 2 du composant : `1px 1px 8px` à 35 %.
   ⚠️ 35 et non 25, corrigé le 2026-09-11 : le 25 est la valeur du composant à
   filet BLEU CLAIR (492:101), pas du cuivré (403:131). Les deux se ressemblent
   assez pour qu'on recopie l'un sur l'autre, et l'écart ne se voit qu'en
   relisant le nœud. Même correction sur `.nc-bouton--cuivre` dans custom.css :
   qui touche à l'un relit l'autre. */
.nc-btn--contour::before {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: inherit;
	box-shadow: 1px 1px 8px rgba(250, 177, 146, .35);
	box-shadow: 1px 1px 8px color-mix(in srgb, var(--brand-copper-light) 35%, transparent);
	opacity: 0;
	transition: opacity .25s ease;
	pointer-events: none;
}

.nc-btn--contour:hover::before,
.nc-btn--contour:focus-visible::before {
	opacity: 1;
}

/* Sa pastille est ALLUMÉE au repos, avec sa lueur : c'est ce qui distingue ce
   composant du bouton d'en-tête, où elle naît du survol. */
a.nc-btn--contour::after,
button.nc-btn--contour::after {
	width: 11px;
	height: 11px;
	margin-left: 10px;
	opacity: 1;
	box-shadow: 0 4px 4px rgba(250, 177, 146, .35);
	box-shadow: 0 4px 4px color-mix(in srgb, var(--brand-copper-light) 35%, transparent);
}

/* Le DÉDOUBLEMENT du survol, pour un bouton qui porte DÉJÀ sa pastille : un
   second disque de même taille, translucide, rendu en une seule ombre plutôt
   qu'en un second pseudo-élément — il n'en reste plus de libre. Identique à
   `.nc-bouton--cuivre`, et corrigé avec lui le 2026-09-14 : le disque est à
   DROITE (+5 px) et 2 px plus haut, à 50 %, et la pilule grandit de 5 px — c'est
   ce que disent les deux SVG de la variante 2 (403:137), pas « 6 px à gauche ».
   Le pourquoi complet est à côté de la règle de `.nc-bouton` dans custom.css :
   qui touche à l'un relit l'autre. */
a.nc-btn--contour:hover::after,
a.nc-btn--contour:focus-visible::after,
button.nc-btn--contour:hover::after,
button.nc-btn--contour:focus-visible::after {
	margin-right: 5px;
	box-shadow: 0 4px 4px color-mix(in srgb, var(--brand-copper-light) 35%, transparent),
	            5px -2px 0 0 color-mix(in srgb, var(--brand-copper-light) 50%, transparent);
}

/* ⚠️ Le focus clavier du navigateur dessine des angles droits dans une pilule :
   l'anneau de l'accent, au rayon du bouton. */
.nc-btn:focus-visible,
input.nc-btn:focus-visible,
button.nc-btn:focus-visible {
	outline: 2px solid var(--brand-accent);
	outline-offset: 3px;
}

/* Comme dans l'en-tête : on coupe la TRANSITION, pas l'ÉTAT. Sous mouvement
   réduit, la pastille et la lueur paraissent quand même, instantanément.
   ⚠️ Le pseudo-élément doit être cité à part : couper une transition sur deux
   est pire que n'en couper aucune, la pilule s'immobilisant pendant que la
   pastille continue de grandir. */
@media (prefers-reduced-motion: reduce) {

	.nc-btn,
	input.nc-btn,
	button.nc-btn,
	a.nc-btn::after,
	button.nc-btn::after {
		transition: none;
	}
}

/* Les trois paliers du H1 de la charte, appliqués au titre de la 404 : 64 px au
   bureau, puis 85 / 70 / 60 %, soit 54 / 45 / 38 — exactement la suite écrite
   dans `scripts/set-typography.php`.
   ⚠️ Ils valaient 51 / 44 / 35 : ni la taille ni la courbe de ce site. C'était
   celle de K-Pilates, dont le H1 part de 60, et les TROIS paliers étaient donc
   faux. Une 404 est exactement le genre de page qu'on ne regarde jamais au
   téléphone, et où un écart de 10 px peut vivre des années. */
@media only screen and (max-width: 1300px) {
	body #ajax-content-wrap #error-404 h1 { font-size: 54px; }
}

@media only screen and (max-width: 999px) {
	body #ajax-content-wrap #error-404 h1 { font-size: 45px; }
	#error-404.nc-404 { padding: 40px 0 70px; }
}

@media only screen and (max-width: 690px) {
	body #ajax-content-wrap #error-404 h1 { font-size: 38px; }
	#error-404.nc-404 { padding: 30px 0 50px; }
}


/* =============================================================================
 * RESPONSIVE : paliers Salient (à garder EN FIN DE FICHIER)
 *
 * Méthode : réduction par palier, calée sur la taille desktop. Les h1-h6 et le
 * body sont pilotés par Salient → Theme Options → Typography → Responsive.
 * Ici, uniquement les tailles en px codées en dur (composants, utilitaires).
 *
 * Courbe de référence (desktop → small desktop / tablette / mobile) :
 *   22 → 22 / 19 / 18   ·   20 → 19 / 18 / 17   ·   18 → 18 / 17 / 16
 *   17 → 17 / 16 / 15   ·   15 → 15 / 14 / 14   ·   14 → 14 / 13 / 13
 *
 * Réutiliser le MÊME sélecteur que la règle de base : l'ordre source suffit à
 * surcharger, pas besoin de gonfler la spécificité.
 *
 * ⚠️ Tout ce qui est ici concerne le PIED DE PAGE : c'est le seul composant du
 * fichier qui soit déjà monté. Les paliers des autres viendront s'y ajouter au
 * fur et à mesure, JAMAIS au-dessus de leur règle de base.
 * ========================================================================== */

/* ── Le pied de page, d'après la courbe de référence du CLAUDE.md global ─────
 * Les trois tailles du dessin sont 24 (nom, Geom) / 20 (téléphone) / 14
 * (activités). Deux d'entre elles sont DANS la table de référence et y sont
 * reprises telles quelles :
 *
 *   20 → 19 / 18 / 17      14 → 14 / 13 / 13
 *
 * Le 24 n'y est pas — la table s'arrête à 22 → 22 / 19 / 18. On lui applique les
 * MÊMES rapports (100 % / 86 % / 82 %), ce qui donne 24 / 21 / 20 : la règle de
 * la table est « plus c'est grand, plus ça se tasse », et 24 se tasse donc un peu
 * plus que 22 en absolu, pas moins.
 *
 *   24 → 24 / 21 / 20
 *
 * ⚠️ Les activités ne descendent PAS sous 13 : 14 est déjà la plus petite taille
 * du dessin, et 13 le plancher de lisibilité du site. Elles valaient 12 avant ce
 * passage, c'est-à-dire sous le plancher, par erreur de relevé.
 * ────────────────────────────────────────────────────────────────────────── */

/* Small desktop. Seul le téléphone bouge : 20 est la seule des trois tailles que
   la table fasse déjà reculer à ce palier. */
@media (min-width: 1000px) and (max-width: 1300px) {
	.nc-footer__tel { font-size: 19px; }
}

/* Tablette */
@media (min-width: 691px) and (max-width: 999px) {

	body .nc-footer__nom p    { font-size: 21px; }
	.nc-footer__tel           { font-size: 18px; }
	body .nc-footer__activites p { font-size: 13px; }

	/* Remesuré le 2026-09-14, la bande ayant repris les 25 px internes du dessin
	   (§ pied de page) : 45 px d'encre au-dessus de la ligne, 50 en dessous. */
	body #footer-outer #copyright[data-layout] { padding: 20px 0 50px; }
}

/* Mobile */
@media (max-width: 690px) {

	body .nc-footer__nom p    { font-size: 20px; }
	.nc-footer__tel           { font-size: 17px; }
	body .nc-footer__activites p { font-size: 13px; }

	/* ⚠️ Sous 1000, les deux colonnes du pied de page s'empilent et se centrent :
	   le retrait de 37 px vers le centre n'a plus d'objet, il est déjà borné à
	   `min-width: 1000px` dans la règle de base. Rien à défaire ici. */

	/* Remesuré le 2026-09-14 : 35 px d'encre au-dessus, 40 en dessous. La ligne
	   tient en DEUX lignes depuis que le « © 2026 TERA Électricité - » est parti
	   (elle en faisait trois), donc elle demande moins de blanc qu'au bureau. */
	body #footer-outer #copyright[data-layout] { padding: 15px 0 40px; }

	/* ⚠️ Les liens des mentions légales sont la SEULE chose du site qui passait
	   sous le plancher de cible tactile du projet (24 px) : mesuré, 15 px de haut,
	   pour des liens obligatoires, en bas de page, au doigt. La TAILLE du texte ne
	   bouge pas — 12 px est la valeur de la charte et le plancher de lisibilité du
	   site — c'est la BOÎTE qui s'agrandit : 5 px de rembourrage haut et bas
	   portent le lien à 25 px, SANS que la ligne grossisse (marges négatives,
	   voir le lien plus bas) : le pas entre deux lignes reste celui du bureau.

	   ⚠️ `inline-block` est ce qui rend le rembourrage EFFECTIF en vertical : sur
	   un lien resté en ligne, un `padding` haut/bas déborde de la boîte de ligne
	   sans rien agrandir de cliquable. */
	/* ⚠️ La ligne passe en FLEX, en DEUX groupes, et les séparateurs disparaissent.

	   1. Les séparateurs. Écrit dans la phrase, un séparateur se retrouve seul au
	   bord d'une ligne dès qu'elle se casse, à pointer un élément parti à la
	   suivante. Mesuré dans les deux sens — « Cookies - » en fin de ligne à 375,
	   puis « | Cookies » en TÊTE de ligne à 320 une fois le premier cas traité :
	   le coller au voisin de gauche ou de droite ne fait que choisir de quel côté
	   il traînera. Retirés, l'écart sépare aussi bien.

	   2. Les deux groupes. Les trois liens légaux et le crédit d'agence sont deux
	   choses de nature différente, et le crédit fait 219 px pour une ligne utile
	   de 282 à 320 px : mis à plat, c'est LUI qui décidait de l'arrangement des
	   autres. Mesuré — à 320 « Cookies » montait partager sa ligne avec le crédit,
	   à 280 « Mentions légales » restait seul en tête pendant que les deux autres
	   se serraient en dessous. Groupés, les liens ne se réarrangent plus qu'entre
	   eux, et le crédit tombe sous eux quand il ne tient plus.
	   Le balisage vient de scripts/set-footer-options.php. */
	#footer-outer #copyright p,
	#footer-outer #copyright .nc-copyright__legal {
		display: flex;
		flex-wrap: wrap;
		justify-content: center;
		align-items: center;
		column-gap: 6px;
		/* Le PAS entre deux lignes de mentions : 15 px de texte + 5 d'écart = 20,
		   soit ×1,67 pour 12 px, le pas du bureau (×1,7). C'est l'écart, pas
		   l'interligne, qui règle ici l'espace entre les lignes : chaque ligne
		   est une rangée de flex, et sa hauteur est celle de son contenu. */
		row-gap: 5px;
	}

	/* ⚠️ Cet interligne a valu 2,1 (25,2 px de ligne pour 12 px de texte), pour
	   qu'une cible tactile de 25 px tienne dans sa ligne sans mordre la suivante.
	   La designeuse l'a vu au smartphone (2026-09-16) : « j'aurais resserré
	   l'interligne des mentions légales ». Elle avait raison, et la cible n'a
	   pas besoin de cette place : voir le lien, ci-dessous. Ramené au plus
	   serré que le lien réclame, 1,25 ; l'écart entre lignes est le `row-gap`. */
	#footer-outer #copyright p {
		line-height: 1.25;
	}

	#footer-outer #copyright p a {
		display: inline-block;
		/* ⚠️ L'interligne se REPREND sur le lien, sinon il compte DEUX fois : la
		   boîte de l'inline-block vaut son propre interligne plus le rembourrage,
		   et la ligne entière grossit d'autant. À 1,25, le lien fait 15 + 10 =
		   25 px de zone tactile. */
		line-height: 1.25;
		padding-top: 5px;
		padding-bottom: 5px;
		/* ⚠️ La zone tactile NE PREND PAS DE PLACE : les marges négatives rendent
		   au flux les 10 px de rembourrage, la boîte de marge du lien fait 15 px,
		   la ligne aussi, et les 25 px restent cliquables (débordement visible).
		   Deux lignes de liens ont donc des zones qui se recouvrent de 5 px, ce que
		   toute ligne de texte à liens fait déjà au bureau, où rien n'est rembourré.
		   Mesuré : rangée de 15, pas de 20, cible de 25. */
		margin-top: -5px;
		margin-bottom: -5px;
	}
}

/* ── Où la ligne se casse, et quel séparateur s'efface ────────────────────── *
 *
 * Un séparateur n'a de sens qu'ENTRE deux choses posées sur la même ligne. Quand
 * la ligne se casse à cet endroit précis, il reste seul au bord — mesuré dans les
 * deux sens : « Cookies - » en fin de ligne à 375, « | Cookies » en tête de ligne
 * à 320 selon le côté auquel on le colle.
 *
 * Les retirer tous sous 690 px, comme on l'avait fait d'abord, règle l'orphelin
 * mais supprime la séparation là où elle est le plus utile — quatre libellés à
 * la suite sur une ligne, sans rien entre eux, ne se distinguent plus.
 *
 * La ligne étant faite de DEUX GROUPES (§ balisage, scripts/set-footer-options.php),
 * on sait exactement OÙ elle se casse, et on n'efface que le séparateur qui tombe
 * sur la coupure. Partout ailleurs ils restent.
 * ────────────────────────────────────────────────────────────────────────── */

/* Le crédit passe à la ligne. Mesuré à l'intrinsèque (largeur `max-content` de
   chaque groupe, pas au jugé) : groupe légal 315,5 + écart 6 + tiret 4 + écart 6
   + crédit 218,7 = **550 px**, pour une ligne utile qui vaut 88 % du viewport.
   Il faut donc 625 px de viewport pour que tout tienne sur une ligne.

   ⚠️ Le seuil est posé à 639 et NON à 625 : à 625 pile la marge est nulle, et une
   marge nulle n'est pas un ajustement — la moindre variation de rendu de police
   fait casser la ligne ailleurs qu'on l'a prévu, donc sortir un tiret orphelin.
   640 laisse 13 px, ce qui tient.

   Sous ce seuil le tiret ne sépare plus rien : il s'efface, et le crédit prend
   toute la largeur pour rester centré sous les liens.

   ⚠️ Le sélecteur est `p > .nc-copyright__sep`, en enfant DIRECT : les « | » des
   liens légaux vivent dans `.nc-copyright__legal` et ne doivent pas bouger ici. */
@media (max-width: 639px) {
	#footer-outer #copyright .nc-copyright__item {
		flex-basis: 100%;
	}

	#footer-outer #copyright p > .nc-copyright__sep {
		display: none;
	}
}

/* Les trois liens légaux passent en pile. Même mesure : le groupe réclame
   315,5 px, soit 359 px de viewport — en dessous ils ne peuvent PAS partager une
   ligne, quel que soit l'écart. Le choix n'est donc pas « tenir ou pas », il est
   entre un 2 + 1 ragué, où « Cookies » reste seul entre deux lignes pleines, et
   une pile franche. On prend la pile, et les « | » s'effacent avec elle : un lien
   par ligne se sépare tout seul.

   ⚠️ Le seuil est à 374 et non à 358, et c'est le même raisonnement que
   ci-dessus : à 360 px — la largeur des Android d'entrée de gamme — la rangée
   tient à 1,25 px près. Ce n'est pas une marge, c'est une coïncidence, et elle
   casserait en 2 + 1 au premier pixel près. Le premier écran où les trois
   libellés tiennent avec de la vraie marge est le 375 des iPhone (14,5 px). En
   dessous, on empile — et le 360 tombe donc du côté de la pile, délibérément. */
@media (max-width: 374px) {
	#footer-outer #copyright .nc-copyright__legal {
		flex-direction: column;
	}

	#footer-outer #copyright .nc-copyright__legal > .nc-copyright__sep {
		display: none;
	}
}
