/* Oscillante — feuille de style unique, mobile-first (base 360 px), min-width uniquement.
   Version 3 (2026-09-20) : le kit « Trotteuse » livré par le propriétaire (DESIGN-KIT.md) devient le
   système du site entier : Archivo, accent #ec3013, fond nuit #0e1727, angles à 0, aucune ombre,
   filets 1 px (cadres) et 2 px (sections), cadre trotteuse sur le primaire, le secondaire cadré et
   le champ actif. Les tokens historiques (--fond, --rubis, --surface…) gardent leur nom et prennent
   les valeurs du kit ; les tokens du kit (--osc-*, --color-*) vivent à côté. Deux faces posées par
   [data-face] sur <html> ; aucun composant ne connaît sa face, seuls les tokens changent. */

/* ---------- Polices locales (woff2 auto-hébergées, licence OFL dans static/fonts/) ---------- */
@font-face { font-family: "Archivo"; font-style: normal; font-weight: 100 900; font-display: swap; src: url("../fonts/archivo-latin.woff2?v=2") format("woff2"); }
@font-face { font-family: "Geist Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("../fonts/geist-mono-latin.woff2?v=2") format("woff2"); }
@font-face { font-family: "Geist Mono"; font-style: normal; font-weight: 500; font-display: swap; src: url("../fonts/geist-mono-latin.woff2?v=2") format("woff2"); }

/* ---------- Tokens partagés ---------- */
:root {
  --titre: "Archivo", ui-sans-serif, system-ui, sans-serif;
  --corps: "Archivo", ui-sans-serif, system-ui, sans-serif;
  --mono: "Geist Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;

  --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-5: 24px;
  --sp-6: 32px; --sp-7: 48px; --sp-8: 72px; --sp-9: 104px;

  --fs-meta: 0.8125rem;        /* 13px */
  --fs-tableau-sm: 0.9375rem;  /* 15px */
  --fs-corps: 0.9375rem;       /* 15px (kit : corps 400 14-15 px) ; 16px recto */
  --fs-intertitre: 1.25rem;    /* 20px */
  --fs-titre-3: 1.625rem;      /* 26px */
  --fs-titre-2: 2.125rem;      /* 34px */
  --fs-titre-1: 2.75rem;       /* 44px */
  --fs-montant: 3.5rem;        /* 56px */
  --fs-affiche: clamp(2.5rem, 2rem + 3.6vw, 4.75rem); /* 40 → 76px : titres de hero */

  /* Kit Trotteuse : angles à 0, aucun chanfrein, aucune ombre (DESIGN-KIT § 3) */
  --chanfrein-taille: 0px;
  --coupe: none;
  --ombre-portee: none;

  /* Tokens du kit (design-handoff/tokens.css) */
  --color-accent: #ec3013;
  --color-accent-400: #ff9783;
  --color-accent-600: #dd2b0f;
  --color-accent-700: #ae1800;
  /* Rouges PORTEURS DE TEXTE (B4 de l'audit a11y du 2026-09-20). #ec3013 avec #f3f2f2 ne donne que
     3,76:1, sous le seuil de 1.4.3. Les fonds qui portent un libellé passent donc à #c4230e (5,23:1),
     survol #ae1800 (6,41:1), enfoncé #8e1200 (8,40:1). #ec3013 reste l'accent NON textuel (index de
     6 px, filets, barres, chevrons, cadre trotteuse), où le seuil est de 3:1 et où il tient 4,27:1. */
  --osc-accent-texte: #c4230e;
  --osc-accent-texte-hover: #ae1800;
  --osc-accent-texte-active: #8e1200;
  --color-neutral-300: #d7d3d3;
  --color-neutral-500: #9b9797;
  --color-neutral-600: #7d7979;
  --color-neutral-700: #605d5d;
  --osc-night: #0e1727;
  --osc-night-2: #18233a;
  --osc-night-3: #131c2e;
  --osc-night-4: #1f2c47;
  --osc-ink-on-night: #f3f2f2;
  --osc-rule: rgba(243,242,242,.45);   /* #757a82, 4,15:1 sur la nuit (M3) */
  --osc-rule-hover: rgba(243,242,242,.6);
  /* Le cadre trotteuse reste au réglage du kit : il entoure un bouton déjà plein (le rouge à texte
     tient 3,07:1 sur la nuit), sa limite n'est pas le seul indicateur du composant. L'éclaircir
     aurait changé le dessin du kit sans gain d'accessibilité. */
  --osc-rule-frame: rgba(243,242,242,.22);
  --osc-rule-disabled: rgba(243,242,242,.15);
  --osc-rule-section: rgba(243,242,242,.18);
  --color-bg: #f3f2f2;
  --color-surface: #eae9e9;
  --color-text: #201e1d;
  --color-divider: color-mix(in srgb, #201e1d 40%, transparent);
  --osc-sweep-duration: 4s;

  --duree-apparition: 520ms;
  --easing: cubic-bezier(.2,.8,.2,1);

  --mx: 50%;
  --my: 50%;
}

/* ---------- Face verso (défaut) : bleu-noir de platine, le mouvement ---------- */
:root,
[data-face="verso"] {
  --fond: #0e1727;           /* nuit du kit */
  --surface: #131c2e;        /* night-3 */
  --surface-2: #18233a;      /* night-2 : survol, surface de champ */
  --chanfrein: rgba(243,242,242,.18);   /* filet de section du kit */
  --texte: #f3f2f2;          /* 16,3:1 sur --fond */
  --texte-secondaire: #d7d3d3; /* chapeaux, notes */
  --texte-doux: #9b9797;     /* muet : 6,4:1 sur --fond */
  --texte-inactif: #7d7979;
  --rubis: #ec3013;          /* accent : index, primaire, focus, erreur ; jamais en couleur de texte sur nuit */
  --rubis-texte: #ff9783;    /* 8,2:1 sur --fond : flèche, écart, erreur */
  --lien: #ff9783;
  --luminova: #D9C9A0;       /* 11,2:1 sur --fond : badge « revendiqué » seulement */
  --conforme: #3FA386;       /* 5,8:1 sur --fond : statut « publié » */
  --defavorable: #ff9783;
  --focus: #ff9783;
  --cadran-texture: rgba(255,255,255,.035);
  --voile: rgba(14,23,39,.55);
  --voile-fort: rgba(14,23,39,.92);
  --sur-photo: #f3f2f2;
  color-scheme: dark;
}

/* ---------- Face recto : cadran clair, la lecture ---------- */
[data-face="recto"] {
  /* Sur le fond clair, #9b9797 tombe à 2,59:1 : la face recto redéfinit le muet du kit (5,83:1). */
  --color-neutral-500: #605d5d;
  --color-neutral-600: #605d5d;
  --fond: #f3f2f2;
  --surface: #eae9e9;
  --surface-2: #e2e0e0;
  --chanfrein: color-mix(in srgb, #201e1d 40%, transparent);
  --texte: #201e1d;          /* 15,4:1 sur --fond */
  --texte-secondaire: #605d5d;
  --texte-doux: #605d5d;     /* 6,1:1 sur --fond */
  --texte-inactif: #7d7979;
  --rubis: #ec3013;
  --rubis-texte: #ae1800;
  --lien: #ae1800;           /* 7,3:1 sur --fond */
  --luminova: #8A6D2F;
  --conforme: #1F6B54;
  --defavorable: #ae1800;
  --focus: #ec3013;
  --cadran-texture: rgba(32,30,29,.04);
  --voile: rgba(32,30,29,.5);
  --voile-fort: rgba(32,30,29,.86);
  --sur-photo: #f3f2f2;
  --ombre-portee: none;
  color-scheme: light;
}

* { box-sizing: border-box; }
[hidden] { display: none !important; }
/* 2.4.11 Focus non masqué : l'en-tête est collant (72 px, 58 px compact). Sans marge de défilement,
   un lien atteint en Maj+Tab se retrouve dessous. La marge vaut pour les ancres ET pour tout ce qui
   peut recevoir le focus (M7 de l'audit a11y). */
[id], a, button, input, select, textarea, summary, [tabindex] { scroll-margin-top: 88px; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: 88px; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  margin: 0;
  background: var(--fond);
  color: var(--texte);
  font-family: var(--corps);
  font-size: var(--fs-corps);
  line-height: 1.65;
  font-variant-numeric: tabular-nums;
  min-width: 320px;
  overflow-x: hidden;
}
[data-face="recto"] body { font-size: 1rem; line-height: 1.65; }

img, svg { max-width: 100%; display: block; }
a { color: var(--lien); overflow-wrap: anywhere; }
a:not(.bouton) { text-underline-offset: 0.18em; text-decoration-thickness: 1px; }

h1, h2, h3 { font-family: var(--titre); font-weight: 800; line-height: 1.12; margin: 0 0 var(--sp-3); letter-spacing: -0.02em; }
h1 { font-size: var(--fs-titre-2); }
h2 { font-size: var(--fs-titre-3); }
h3 { font-size: var(--fs-intertitre); }
@media (min-width: 720px) { h1 { font-size: var(--fs-titre-1); } h2 { font-size: var(--fs-titre-2); } }
p { margin: 0 0 var(--sp-4); max-width: 68ch; }
.mono, .chiffre { font-family: var(--mono); font-variant-numeric: tabular-nums; }
.etiquette {
  font-family: var(--mono); font-weight: 400; font-size: 12px;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--texte-doux);
}
.etiquette .rubis { vertical-align: middle; margin-right: var(--sp-2); }

:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
a, button, input, select, textarea { font-family: inherit; }

/* ---------- Layout ---------- */
.conteneur { width: 100%; max-width: 1240px; margin-inline: auto; padding-inline: var(--sp-4); }
@media (min-width: 600px) { .conteneur { padding-inline: var(--sp-6); } }
@media (min-width: 1100px) { .conteneur { padding-inline: var(--sp-7); } }
.pile { display: flex; flex-direction: column; gap: var(--sp-5); }
.pile-serre { display: flex; flex-direction: column; gap: var(--sp-2); }
.grille { display: grid; gap: var(--sp-5); grid-template-columns: 1fr; }
@media (min-width: 720px) { .grille[data-cols="2"], .grille[data-cols="2-large"] { grid-template-columns: 1fr 1fr; } }
@media (min-width: 960px) {
  .grille[data-cols="3"] { grid-template-columns: repeat(3, 1fr); }
  .grille[data-cols="2-large"] { grid-template-columns: 1.25fr 1fr; }
}
.section { padding-block: var(--sp-8); }

main > .section:first-child { padding-top: var(--sp-7); }
.bande-indice + .section { padding-top: var(--sp-7); }
@media (min-width: 960px) { .bande-indice + .section { padding-top: var(--sp-8); } }
.section + .section { padding-top: 0; }
.page-revision main > .section + .section { border-top: 1px solid var(--chanfrein); padding-top: var(--sp-7); }
@media (min-width: 960px) { .page-revision main > .section + .section { padding-top: var(--sp-8); } }
main > .section:last-child { padding-bottom: var(--sp-7); }
main > .bande-photo:last-child { margin-bottom: var(--sp-7); }
@media (min-width: 960px) { main > .section:last-child { padding-bottom: var(--sp-8); } }

/* Modules de service et de navigation sortis du <main> (défauts N12 et N13 de
   l'audit SEO du 2026-09-21). Ils gardent exactement le rythme vertical et les
   séparateurs des sections du corps de la page : le lecteur ne doit voir aucune
   différence, c'est l'index qui doit en voir une. */
.apres-contenu:empty { display: none; }
.page-revision .apres-contenu > .section { border-top: 1px solid var(--chanfrein); padding-top: var(--sp-7); }
@media (min-width: 960px) { .page-revision .apres-contenu > .section { padding-top: var(--sp-8); } }
.apres-contenu > .section:last-child { padding-bottom: var(--sp-7); }
.apres-contenu > .bande-photo:last-child { margin-bottom: var(--sp-7); }
@media (min-width: 960px) { .apres-contenu > .section:last-child { padding-bottom: var(--sp-8); } }
/* Listes de renvois : des liens, pas des phrases. */
.liste-liens-serree { display: flex; flex-direction: column; gap: var(--sp-2); }
/* Index alphabétique des pages tarif, en bas de l'accueil (résidu du défaut B2). */
.index-marques { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-2) var(--sp-5);
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
/* La cible occupe toute la case de la grille : « Lip » ne fait que 20 px de large
   en texte, et une cible de 20 x 35 px reste sous le minimum tactile. */
.index-marques a { display: block; padding-block: 5px; }
/* Les libellés de ligne d'un tableau de tarifs sont parfois des liens (page pivot
   des types de mouvement) : ils mesuraient 14 px de haut. */
.grille-officielle th[scope="row"] a { display: inline-block; padding-block: 5px; }
.marge-haute { margin-top: var(--sp-7); }
.texte-doux { color: var(--texte-doux); }
.centre-texte { text-align: center; }
.sans-marge { margin: 0; }
.vh { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }

/* En-tête de section : indice mono + titre + chapeau, alignés sur une même ligne de base en large */
.section-entete { display: grid; gap: var(--sp-2); margin-bottom: var(--sp-6); align-items: end; }
.section-entete h2, .section-entete h1 { margin: 0; font-size: 26px; line-height: 1.1; letter-spacing: -.02em; }
@media (min-width: 720px) { .section-entete h2 { font-size: 30px; } .section-entete h1 { font-size: var(--fs-titre-1); } }
.section-entete p { margin: 0; font-size: 14px; line-height: 1.55; color: var(--texte-secondaire); }
.section-entete .indice { font-family: var(--mono); font-size: 12px; color: var(--texte-doux); letter-spacing: .14em; text-transform: uppercase; justify-self: start; text-align: left; }
.section-entete .indice::before { content: ""; display: inline-block; width: 24px; height: 2px; background: var(--rubis); vertical-align: middle; margin-right: var(--sp-3); }
@media (min-width: 960px) {
  .section-entete { grid-template-columns: 1fr 1fr; column-gap: var(--sp-7); }
  .section-entete .indice { grid-column: 1 / -1; }
  .section-entete p { max-width: 40ch; justify-self: end; text-align: left; }
}

/* ---------- Skip link ---------- */
.saut-lien { position: absolute; left: var(--sp-3); top: -100px; background: var(--osc-accent-texte); color: #fff; padding: var(--sp-2) var(--sp-4); z-index: 300; }
.saut-lien:focus { top: var(--sp-3); }

/* ---------- Côtes de Genève ---------- */
.cotes-de-geneve {
  position: relative;
  background-image: repeating-radial-gradient(circle at 50% 120%, transparent 0 22px, var(--cadran-texture) 22px 24px);
  background-color: var(--surface-2);
}

/* ---------- En-tête / navigation ---------- */
.entete {
  position: sticky; top: 0; z-index: 100;
  background: color-mix(in srgb, var(--fond) 94%, transparent);
  border-bottom: 2px solid rgba(243,242,242,.14);
  transition: background-color 240ms ease, border-color 240ms ease;
  backdrop-filter: blur(8px);
  view-transition-name: entete;
}
.entete-barre { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); padding-block: var(--sp-3); min-height: 72px; transition: min-height 240ms ease, padding 240ms ease; }
.entete[data-compact="true"] { background: var(--fond); border-bottom-color: rgba(243,242,242,.14); backdrop-filter: none; }
.entete[data-compact="true"] .entete-barre { min-height: 58px; padding-block: var(--sp-2); }
.entete-sentinelle { position: absolute; top: 0; left: 0; height: 1px; width: 1px; pointer-events: none; }
/* Sur le hero plein cadre, l'en-tête flotte transparent puis se fonce au défilement */
.entete[data-sur-photo="true"]:not([data-compact="true"]) { background: transparent; border-bottom-color: transparent; backdrop-filter: none; }
@media (prefers-reduced-motion: reduce) { .entete, .entete-barre { transition: none; } }

.logo { display: flex; align-items: center; gap: 10px; font-family: var(--titre); font-weight: 800; font-size: 19px; letter-spacing: -0.01em; color: var(--texte); text-decoration: none; min-height: 44px; white-space: nowrap; }
.entete[data-sur-photo="true"]:not([data-compact="true"]) .logo, .entete[data-sur-photo="true"]:not([data-compact="true"]) .nav-principale a, .entete[data-sur-photo="true"]:not([data-compact="true"]) .burger { color: var(--sur-photo); }
.logo svg { width: 24px; height: 24px; flex: none; transition: transform 500ms var(--easing); }
.logo:hover svg, .logo:focus-visible svg { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .logo svg { transition: none; } }

.nav-principale { display: none; }
@media (min-width: 960px) {
  .nav-principale { display: flex; gap: 28px; list-style: none; margin: 0; padding: 0; }
  .nav-principale a { color: var(--texte-secondaire); text-decoration: none; font-family: var(--titre); font-weight: 600; font-size: 14px; letter-spacing: 0; display: inline-flex; align-items: center; min-height: 44px; position: relative; }
  .nav-principale a::after { content: ""; position: absolute; left: 0; right: 100%; bottom: 8px; height: 1px; background: var(--rubis); transition: right 240ms var(--easing); }
  .nav-principale a:hover::after, .nav-principale a[aria-current="page"]::after { right: 0; }
  .nav-principale a:hover, .nav-principale a[aria-current="page"] { color: var(--texte); }
  .entete[data-sur-photo="true"]:not([data-compact="true"]) .nav-principale a { color: color-mix(in srgb, var(--sur-photo) 82%, transparent); }
  .entete[data-sur-photo="true"]:not([data-compact="true"]) .nav-principale a:hover, .entete[data-sur-photo="true"]:not([data-compact="true"]) .nav-principale a[aria-current="page"] { color: var(--sur-photo); }
}
.entete-actions { display: flex; align-items: center; gap: var(--sp-3); flex: none; }
/* « Demander des devis » : primaire M en cadre trotteuse dès 960 px ; en dessous il vit dans le menu ouvert, pleine largeur */
.entete-actions .entete-devis { display: none; }
@media (min-width: 960px) { .entete-actions .entete-devis { display: inline-flex; } .entete-devis .osc-btn--nav { padding: 12px 16px; gap: 18px; white-space: nowrap; } }
.nav-mobile-action { margin-top: var(--sp-5); }

/* Bordure à 4,15:1 et non 1,68:1 : le bouton de menu est un composant d'interface (1.4.11, M3). */
.burger { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; background: transparent; border: 1px solid rgba(243,242,242,.45); color: var(--texte); cursor: pointer; text-decoration: none; }
@media (min-width: 960px) { .burger { display: none; } }
.burger svg { width: 20px; height: 20px; }

.nav-mobile { display: none; position: fixed; inset: 0; background: var(--fond); z-index: 150; padding: var(--sp-5) var(--sp-4); overflow-y: auto; }
.nav-mobile[data-ouvert="true"] { display: block; }
.nav-mobile-entete { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--sp-6); }
.nav-mobile ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.nav-mobile ul a { display: flex; align-items: center; min-height: 56px; color: var(--texte); text-decoration: none; font-family: var(--titre); font-weight: 800; font-size: var(--fs-titre-3); letter-spacing: -.02em; border-bottom: 1px solid var(--chanfrein); }
.nav-mobile a .mono { font-size: var(--fs-meta); color: var(--texte-doux); width: 40px; }
@media (min-width: 960px) { .nav-mobile { display: none !important; } }

/* B2, repli sans JavaScript : le burger est doublé d'un lien vers #nav-mobile, qui ouvre le menu par
   :target. Les deux commandes occupent la même case (44 px, même dessin) : aucun saut visuel au moment
   où le script s'annonce (data-js). Avec script, seul le <button> existe ; sans script, seul le lien. */
.burger--sansjs { display: none; }
html:not([data-js]) .burger--sansjs { display: inline-flex; }
html:not([data-js]) .burger[data-menu-ouvrir] { display: none; }
@media (min-width: 960px) { .burger--sansjs { display: none !important; } }
html:not([data-js]) .nav-mobile:target { display: block; }
@media (min-width: 960px) { html:not([data-js]) .nav-mobile:target { display: none; } }

/* ---------- Boutons : le kit Trotteuse (.osc-btn, fin de feuille) remplace .bouton. Compatibilité pour un
   gabarit qui garderait l'ancienne classe : contour 1 px, angles à 0, aucune ombre. ---------- */
.bouton { display: inline-flex; align-items: center; gap: var(--sp-2); min-height: 44px; padding: 12px 17px; font-family: var(--corps); font-weight: 800; font-size: 14px; line-height: 1.2; text-decoration: none; cursor: pointer; border: 1px solid rgba(243,242,242,.45); background: transparent; color: var(--texte); border-radius: 0; box-shadow: none; }
.bouton:hover, .bouton:focus-visible { border-color: var(--texte); }
.bouton[data-style="primaire"] { background: var(--osc-accent-texte); border-color: var(--osc-accent-texte); color: #f3f2f2; }
.bouton:disabled { color: var(--texte-inactif); cursor: not-allowed; }

/* ---------- Le pont : encart à filet 1 px (kit : angles à 0, aucune ombre, aucun chanfrein) ---------- */
.pont {
  position: relative;
  background: var(--fond);
  border: 1px solid rgba(243,242,242,.2);
  padding: var(--sp-5);
  color: inherit; text-decoration: none;
}
[data-face="recto"] .pont { border-color: var(--chanfrein); }
a.pont { display: block; transition: background .15s; }
a.pont:hover { background: var(--surface-2); }
a.pont:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
a.pont h3, a.pont h2 { color: var(--texte); }

/* Apparition : visible par défaut (sans JS, sans GSAP). Le script pose data-anim et masque
   seulement quand il sait qu'il va révéler ; reduced-motion coupe tout. */
.reveal { opacity: 1; transform: none; }
html[data-anim="on"] .reveal:not(.est-visible) { opacity: 0; transform: translateY(14px); }
.reveal.est-visible { opacity: 1; transform: none; transition: opacity var(--duree-apparition) var(--easing), transform var(--duree-apparition) var(--easing); }
@media (prefers-reduced-motion: reduce) { html[data-anim="on"] .reveal:not(.est-visible) { opacity: 1; transform: none; } .reveal.est-visible { transition: none; } }

/* ---------- Le rubis ---------- */
.rubis { display: inline-block; width: 6px; height: 6px; border-radius: 0; background: var(--rubis); box-shadow: none; flex: none; vertical-align: middle; }
.rubis[data-recent="true"] { animation: battement 600ms var(--easing) 1; }
@keyframes battement { 0% { transform: scale(1); } 45% { transform: scale(1.35); } 100% { transform: scale(1); } }
@media (prefers-reduced-motion: reduce) { .rubis[data-recent="true"] { animation: none; } }

.releve { display: flex; align-items: flex-start; flex-wrap: wrap; gap: var(--sp-2); margin: 0; font-size: var(--fs-meta); line-height: 1.5; color: var(--texte-doux); max-width: none; }
.releve > .rubis { flex: 0 0 auto; width: 6px; height: 6px; margin-top: 7px; }
.releve > span:not(.rubis) { flex: 1 1 200px; min-width: 0; }
.releve a { color: inherit; }

/* ---------- Honnêteté ---------- */
.honnete { border-left: 2px solid var(--chanfrein); padding: var(--sp-3) var(--sp-4); color: var(--texte-secondaire); font-size: var(--fs-tableau-sm); background: color-mix(in srgb, var(--surface) 60%, transparent); max-width: 72ch; }
.honnete[data-registre] { border-left-color: var(--texte-doux); }
.honnete[data-revendique] { border-left-color: var(--luminova); }
.etat-vide { text-align: center; padding: var(--sp-7) var(--sp-4); color: var(--texte-doux); }
.etat-vide p { margin-inline: auto; }

/* Info-bulle « au registre » : un bouton de 44 px (cercle visible de 24 px) et son texte, frère du bouton.
   Le texte s'ouvre DANS le flux, sur une ligne à lui sous « Au registre » : une bulle superposée serait
   coupée par le chanfrein du pont (au-dessus comme en dessous, les cartes courtes n'ont pas la hauteur)
   ou déborderait de l'écran à 360 px. Survol au pointeur fin, clic ou toucher qui ouvre et ferme
   (aria-expanded, site.js), focus clavier sans JavaScript. */
.infobulle { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; margin: -10px -10px -10px -6px; padding: 0; border: 0; background: transparent; color: var(--texte); cursor: help; vertical-align: middle; border-radius: 50%; }
.infobulle > svg { width: 24px; height: 24px; display: block; padding: 2px; box-sizing: border-box; border: 1px solid rgba(243,242,242,.45); border-radius: 50%; background: transparent; }
.infobulle:hover > svg, .infobulle[aria-expanded="true"] > svg { border-color: var(--texte-doux); }
.infobulle:focus-visible { outline: 2px solid var(--focus); outline-offset: -8px; }
.infobulle-texte { display: none; flex: 1 1 100%; max-width: 480px; margin-top: var(--sp-2); background: var(--surface-2); color: var(--texte); border: 1px solid rgba(243,242,242,.2); box-shadow: none; padding: var(--sp-3) var(--sp-4); font-family: var(--corps); font-size: var(--fs-meta); line-height: 1.5; letter-spacing: 0; text-transform: none; text-align: left; }
.infobulle[aria-expanded="true"] + .infobulle-texte { display: block; }
/* 1.4.13 Contenu au survol : plus de règle :hover en CSS. La bulle s'ouvre et se ferme depuis site.js
   avec un délai de grâce, elle reste affichée quand le pointeur passe DESSUS, et Échap la ferme
   toujours (M4). Sans script il reste l'ouverture au focus clavier, sans piège de survol. */
html:not([data-js]) .infobulle:focus-visible + .infobulle-texte { display: block; }
/* Contre-audit accessibilité : sans script, il ne restait que `:focus-visible`, que Chrome ne
   déclenche pas sur un clic de souris. Le survol rouvre l'infobulle, mais SEULEMENT sans script :
   la version scriptée garde son bouton et son `aria-expanded` (défaut M4 du premier audit). */
@media (hover: hover) {
  html:not([data-js]) .infobulle:hover + .infobulle-texte { display: block; }
}

/* ---------- Écart (barre) ---------- */
.ecart { display: inline-flex; align-items: center; gap: var(--sp-2); }
.ecart-barre { position: relative; width: 96px; height: 6px; background: var(--chanfrein); flex: none; }
.ecart-segment { position: absolute; top: 0; height: 100%; background: var(--defavorable); width: 0%; transition: width 520ms var(--easing); }
.ecart-segment.est-visible { width: var(--part, 30%); }
.ecart[data-sens="favorable"] .ecart-segment { background: var(--conforme); right: 50%; }
.ecart[data-sens="defavorable"] .ecart-segment { background: var(--defavorable); left: 50%; }
.ecart-barre::after { content: ""; position: absolute; left: 50%; top: -3px; width: 1px; height: 12px; background: var(--texte-doux); }
@media (prefers-reduced-motion: reduce) { .ecart-segment { transition: none; width: var(--part, 30%); } }
.ecart-valeur { font-family: var(--mono); font-weight: 700; font-size: 1.1875rem; white-space: nowrap; }
.ecart-valeur[data-sens="favorable"] { color: var(--conforme); }
.ecart-valeur[data-sens="defavorable"] { color: var(--defavorable); }
.chevron { width: 0.7em; height: 0.7em; display: inline-block; }

/* ---------- Pont de tarif (référence à l'horizontale, en tête) ---------- */
.pont-tarif { display: grid; gap: var(--sp-4); grid-template-columns: 1fr; }
.pont-tarif-ref { font-family: var(--mono); font-size: var(--fs-meta); color: var(--texte-doux); letter-spacing: .08em; text-transform: uppercase; display: flex; align-items: center; gap: var(--sp-3); }
.pont-tarif-ref::after { content: ""; flex: 1; height: 1px; background: var(--chanfrein); }
.pont-tarif-corps { display: flex; flex-direction: column; gap: var(--sp-2); }
.pont-tarif-libelle { font-family: var(--titre); font-weight: 500; color: var(--texte); font-size: var(--fs-intertitre); margin: 0; }
.pont-tarif-montant { font-family: var(--mono); font-weight: 500; font-size: var(--fs-titre-2); line-height: 1; margin: 0; letter-spacing: -0.02em; }
.pont-tarif-montant small { display: block; font-size: var(--fs-tableau-sm); color: var(--texte-doux); font-weight: 400; letter-spacing: 0; margin-top: var(--sp-2); }
@media (min-width: 480px) { .pont-tarif-montant { font-size: 2.75rem; } }
@media (min-width: 960px) { .pont-tarif-montant { font-size: var(--fs-montant); } .grille[data-cols="2"] .pont-tarif-montant { font-size: 2.75rem; } .grille[data-cols="3"] .pont-tarif-montant { font-size: 2.125rem; } }
.grille[data-cols="3"] .pont-tarif-montant { font-size: 1.75rem; white-space: nowrap; }
.pont-tarif-reserve { font-size: var(--fs-meta); color: var(--texte-doux); margin: 0; }
.pont-tarif-ecart { align-self: end; }
.pont-tarif-montant { white-space: nowrap; }
.pont-tarif-montant small { white-space: normal; }
.pont-tarif-ecart { justify-self: start; }
@media (min-width: 960px) {
  .pont-tarif { grid-template-columns: 1fr auto; grid-template-areas: "ref ecart" "corps corps"; align-items: center; }
  .pont-tarif-ref { grid-area: ref; }
  .pont-tarif-corps { grid-area: corps; }
  .pont-tarif-ecart { grid-area: ecart; align-self: center; justify-self: end; }
}

/* ---------- Tableau de tarifs : voir .osc-table (kit) en fin de feuille ---------- */
.tableau-scroll { overflow-x: auto; }
.tableau-pied { display: flex; flex-wrap: wrap; gap: var(--sp-4); align-items: center; justify-content: space-between; margin-top: var(--sp-5); }
.tableau-pied .osc-more { margin-top: 0; }
.osc-copie { display: inline-flex; align-items: center; gap: 10px; }

/* ---------- Grille officielle complète (page de tarif) : catégories × prestations, dans la variante nuit du tableau
   dense du kit (filet 2 px en tête, en-têtes mono 10 px, cellules 9 px 8 px, chiffres mono 13 px, 1 px entre lignes) ---------- */
.grille-officielle { width: 100%; border-collapse: collapse; border-top: 2px solid rgba(243,242,242,.6); }
.grille-officielle caption { text-align: left; font: 400 12px/1.4 var(--mono); letter-spacing: .06em; color: var(--texte-doux); margin-bottom: 12px; }
.grille-officielle thead th { text-align: right; font: 600 12px/1 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--texte-secondaire); padding: 9px 8px; border-bottom: 2px solid rgba(243,242,242,.6); background: transparent; vertical-align: bottom; }
.grille-officielle thead th:first-child { text-align: left; padding-left: 0; }
.grille-officielle thead th:last-child { padding-right: 0; }
@media (min-width: 720px) { .grille-officielle thead th:not(:first-child) { width: 200px; } }
.grille-officielle .non-publie { color: var(--texte-doux); font-family: var(--corps); font-size: 12px; white-space: normal; }
.grille-officielle .non-publie::before { content: ""; display: inline-block; width: 6px; height: 6px; border: 1px solid rgba(243,242,242,.3); margin-right: 6px; vertical-align: middle; }
.grille-officielle tbody th { text-align: left; font-family: var(--corps); font-weight: 800; font-size: 13px; padding: 9px 8px 9px 0; border-bottom: 1px solid var(--osc-rule-section); vertical-align: middle; }
.grille-officielle tbody th .famille { display: block; font: 400 12px/1.3 var(--mono); color: var(--texte-doux); text-transform: uppercase; letter-spacing: .1em; margin-bottom: 2px; }
.grille-officielle tbody td { text-align: right; font: 500 13px/1.3 var(--mono); font-variant-numeric: tabular-nums; padding: 9px 8px; border-bottom: 1px solid var(--osc-rule-section); white-space: nowrap; vertical-align: middle; }
.grille-officielle tbody td:last-child { padding-right: 0; }
.grille-officielle tbody td .origine { display: block; font: 400 12px/1.3 var(--corps); color: var(--texte-doux); }
.grille-officielle tbody td .devis { color: var(--texte-doux); font-family: var(--corps); font-size: 12px; white-space: normal; }
.grille-officielle tbody tr:hover td, .grille-officielle tbody tr:hover th { background: var(--surface-2); }
.grille-officielle tbody tr.famille-debut th, .grille-officielle tbody tr.famille-debut td { border-top: 2px solid rgba(243,242,242,.3); }
@media (max-width: 719px) {
  .grille-officielle thead { display: none; }
  .grille-officielle tbody tr { display: block; border-bottom: 1px solid var(--osc-rule-section); padding: 12px 0; }
  .grille-officielle tbody th { display: block; border: 0; padding: 0 0 6px; }
  .grille-officielle tbody td { display: flex; justify-content: space-between; gap: 12px; border: 0; padding: 4px 0; white-space: normal; }
  .grille-officielle tbody td::before { content: attr(data-libelle); font: 400 12px/1.4 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--texte-doux); }
  .grille-officielle tbody td[data-libelle-court]::before { content: attr(data-libelle-court); }
  .grille-officielle tbody tr.famille-debut th, .grille-officielle tbody tr.famille-debut td { border-top: 0; }
}

/* ---------- Plaque de marque (logo ou monogramme de repli) : le « logo » du kit, sur #f3f2f2, logo en niveaux de
   gris, index 5 px rouge en bas à droite, angles à 0, aucune ombre ---------- */
.plaque-marque { display: inline-flex; align-items: center; justify-content: center; width: 64px; height: 64px; flex: none; background: #f3f2f2; color: #201e1d; font-family: var(--titre); font-weight: 800; font-size: 1.25rem; letter-spacing: 0; position: relative; overflow: hidden; clip-path: none; box-shadow: none; }
.plaque-marque img { width: 100%; height: 100%; object-fit: contain; padding: 8px; filter: grayscale(1) contrast(1.08); }
.plaque-marque[data-taille="grande"] { width: 96px; height: 96px; font-size: 2rem; }
.plaque-marque[data-taille="grande"] img { padding: 12px; }
.plaque-marque[data-taille="moyenne"] { width: 56px; height: 56px; font-size: 1.125rem; }
.plaque-marque[data-taille="moyenne"] img { padding: 6px; }
.plaque-marque[data-taille="petite"] { width: 44px; height: 44px; font-size: .9rem; }
.plaque-marque[data-taille="petite"] img { padding: 5px; }
.plaque-marque::after { content: ""; position: absolute; right: 5px; bottom: 5px; width: 5px; height: 5px; background: #ec3013; }
.plaque-marque.plaque-photo img { padding: 0; object-fit: cover; filter: none; }
[data-face="recto"] .plaque-marque { background: #f3f2f2; box-shadow: none; }

/* ---------- Photos : cadres, bandeaux, hero ---------- */
.cadre-photo { position: relative; clip-path: none; background: var(--surface); }
figure.cadre-photo { margin: 0; }
.cadre-photo img { width: 100%; height: 100%; object-fit: cover; aspect-ratio: 3 / 2; }
.cadre-photo[data-ratio="carre"] img { aspect-ratio: 1; }
.cadre-photo[data-ratio="portrait"] img { aspect-ratio: 4 / 5; }
.cadre-photo::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: linear-gradient(180deg, rgba(14,23,39,0) 55%, rgba(14,23,39,.55) 100%); box-shadow: inset 0 0 0 1px rgba(232,237,242,.08); }
.cadre-photo figcaption, .cadre-photo .cadre-legende { position: absolute; left: var(--sp-4); right: var(--sp-4); bottom: var(--sp-4); z-index: 1; color: var(--sur-photo); font-family: var(--mono); font-size: var(--fs-meta); letter-spacing: .06em; text-transform: uppercase; }

/* Bandeau photo de page (recto et verso) : la photo, un voile directionnel, le titre dessus en large ;
   en mobile le titre passe SOUS la photo, sur aplat (leçon IWC et H. Moser) */
.bandeau-photo { position: relative; background: var(--fond); }
.bandeau-photo .bandeau-media { position: relative; height: 240px; overflow: hidden; }
.bandeau-photo .bandeau-media img { width: 100%; height: 100%; object-fit: cover; }
.bandeau-photo .bandeau-media::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(14,23,39,.25), rgba(14,23,39,.15)); }
.bandeau-photo .bandeau-texte { padding-block: var(--sp-6); }
.bandeau-photo h1 { margin-bottom: var(--sp-2); }
.bandeau-photo .chapeau { color: var(--texte-secondaire); max-width: 56ch; margin: 0; }
@media (min-width: 960px) {
  .bandeau-photo { min-height: 440px; display: grid; }
  .bandeau-photo .bandeau-media { position: absolute; inset: 0; height: auto; }
  .bandeau-photo .bandeau-media::after { background: linear-gradient(90deg, rgba(14,23,39,.92) 0%, rgba(14,23,39,.72) 45%, rgba(14,23,39,.18) 100%); }
  .bandeau-photo .bandeau-texte { position: relative; z-index: 1; align-self: end; padding-block: var(--sp-8) var(--sp-7); color: var(--sur-photo); }
  .bandeau-photo h1 { color: var(--sur-photo); font-size: var(--fs-affiche); font-weight: 800; letter-spacing: -0.02em; line-height: 1.02; max-width: 14ch; }
  .bandeau-photo .chapeau { color: color-mix(in srgb, var(--sur-photo) 78%, transparent); font-size: 1.125rem; }
  .bandeau-photo .etiquette { color: color-mix(in srgb, var(--sur-photo) 70%, transparent); }
}

/* Cibles tactiles des liens inline (défaut M12) : un lien de source ou de renvoi mesure 14 à 16 px
   de haut, loin des 24 px attendus sur un écran tactile. Le padding vertical d'un élément inline
   agrandit sa zone cliquable sans déplacer une ligne de texte ni changer le rendu. La version
   `padding-inline` sert aux libellés très courts (« Lot », « Var »), larges de 21 px. */
main p a:not([class]), main li a:not([class]),
.apres-contenu p a:not([class]), .apres-contenu li a:not([class]), .pied-grille p a:not([class]),
.releve a, .texte-meta a, .texte-petit a, .photo-credit a { padding-block: 5px; }
nav[aria-label="Ateliers par département"] .lien-fil { padding: 5px 3px; }

/* Bande photo pleine largeur entre deux sections, image fixe et un message (défaut M11 : la dérive
   au défilement, seule raison de charger GSAP sur 10 pages, a été retirée) */
.bande-photo { position: relative; overflow: hidden; min-height: 320px; display: grid; align-items: center; color: var(--sur-photo); }
.bande-photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.bande-photo::after { content: ""; position: absolute; inset: 0; background: linear-gradient(90deg, rgba(14,23,39,.86) 0%, rgba(14,23,39,.55) 50%, rgba(14,23,39,.35) 100%); }
.bande-photo .conteneur { position: relative; z-index: 1; padding-block: var(--sp-8); }
.bande-photo h2 { color: var(--sur-photo); font-weight: 800; font-size: var(--fs-titre-2); letter-spacing: -0.015em; max-width: 20ch; }
.bande-photo p { color: color-mix(in srgb, var(--sur-photo) 78%, transparent); }
.bande-photo .etiquette { color: rgba(232,237,242,.7); }
@media (min-width: 960px) { .bande-photo { min-height: 440px; } .bande-photo h2 { font-size: var(--fs-titre-1); } .bande-photo[data-courte] { min-height: 300px; } }
.bande-photo[data-courte] { min-height: 220px; }
.bande-photo[data-courte] .conteneur { padding-block: var(--sp-6); }
.bande-photo[data-courte] h2 { font-size: var(--fs-titre-3); margin: 0; max-width: 40ch; }
.bande-photo[data-courte] p { margin: var(--sp-2) 0 0; font-family: var(--mono); font-size: var(--fs-meta); letter-spacing: .06em; text-transform: uppercase; }

/* ---------- Hero plein cadre (accueil) ---------- */
.hero-plein { position: relative; overflow: hidden; margin-top: -73px; padding-top: 73px; min-height: 100svh; display: grid; align-items: end; color: var(--sur-photo); isolation: isolate; }
.hero-plein .hero-media { position: absolute; inset: 0; z-index: -2; }
.hero-plein .hero-media img { width: 100%; height: 100%; object-fit: cover; object-position: 72% 50%; transform-origin: 60% 50%; will-change: transform; }
.hero-plein .hero-voile { position: absolute; inset: 0; z-index: -1; background:
  linear-gradient(180deg, rgba(14,23,39,.6) 0%, rgba(14,23,39,.15) 22%, rgba(14,23,39,.35) 34%, rgba(14,23,39,.88) 46%, var(--fond) 100%); }
@media (min-width: 960px) {
  .hero-plein .hero-voile { background:
    linear-gradient(180deg, rgba(14,23,39,.55) 0%, rgba(14,23,39,0) 30%),
    linear-gradient(90deg, rgba(14,23,39,.92) 0%, rgba(14,23,39,.76) 36%, rgba(14,23,39,.3) 68%, rgba(14,23,39,.18) 100%),
    linear-gradient(0deg, var(--fond) 0%, rgba(14,23,39,0) 34%); }
}
.hero-rotor { position: absolute; right: -28vw; top: 50%; width: min(120vw, 980px); aspect-ratio: 1; transform: translateY(-50%); z-index: -1; color: rgba(232,237,242,.16); pointer-events: none; }
.hero-rotor svg { width: 100%; height: 100%; }
.hero-rotor-defile { width: 100%; height: 100%; will-change: transform; }
@media (min-width: 960px) { .hero-rotor { right: -8vw; width: min(60vw, 900px); color: rgba(232,237,242,.2); } }
.hero-plein .conteneur { position: relative; padding-block: var(--sp-7) var(--sp-6); }
.hero-surtitre { color: color-mix(in srgb, var(--sur-photo) 70%, transparent); margin-bottom: var(--sp-4); }
.hero-titre { font-family: var(--titre); font-weight: 800; font-size: var(--fs-affiche); line-height: 1.02; letter-spacing: -0.025em; margin: 0 0 var(--sp-5); max-width: 22ch; color: var(--sur-photo); }
.hero-titre .ligne { display: block; }
.hero-titre em { font-style: normal; color: var(--sur-photo); position: relative; }
.hero-titre em::after { content: ""; position: absolute; left: 0; right: 0; bottom: .06em; height: 2px; background: var(--rubis); }
.hero-chapeau { font-size: 1.0625rem; color: color-mix(in srgb, var(--sur-photo) 92%, transparent); max-width: 44ch; margin-bottom: var(--sp-6); }
@media (min-width: 960px) { .hero-chapeau { color: color-mix(in srgb, var(--sur-photo) 80%, transparent); } }
@media (min-width: 720px) { .hero-chapeau { font-size: 1.1875rem; } }
.hero-guichet { max-width: 560px; }
.hero-guichet .osc-frame { min-width: 0; }
@media (min-width: 560px) { .hero-guichet .osc-frame { min-width: 300px; } }
.hero-preuves { display: grid; gap: var(--sp-4); grid-template-columns: repeat(3, auto); justify-content: start; margin-top: var(--sp-7); padding-top: var(--sp-5); border-top: 1px solid rgba(232,237,242,.14); }
.hero-preuve { display: flex; flex-direction: column; gap: 2px; }
.hero-preuve strong { font-family: var(--mono); font-weight: 500; font-size: 1.75rem; line-height: 1; letter-spacing: -0.02em; color: var(--sur-photo); }
.hero-preuve span { font-size: var(--fs-meta); color: color-mix(in srgb, var(--sur-photo) 66%, transparent); font-family: var(--mono); letter-spacing: .04em; }
@media (min-width: 720px) { .hero-preuves { gap: var(--sp-7); } .hero-preuve strong { font-size: 2.25rem; } }

/* ---------- Bande d'indice (ticker des grilles relevées) ---------- */
.bande-indice { border-top: 1px solid var(--chanfrein); border-bottom: 1px solid var(--chanfrein); background: var(--surface); overflow: hidden; position: relative; }
.bande-indice-conteneur { display: flex; flex-direction: column; }
@media (min-width: 720px) { .bande-indice-conteneur { flex-direction: row; align-items: stretch; } }
.bande-indice-titre { flex: none; padding: 4px var(--sp-4) 2px; display: flex; flex-direction: row; align-items: center; gap: var(--sp-2); font-family: var(--mono); font-size: 12px; line-height: 16px; letter-spacing: .08em; text-transform: uppercase; color: var(--texte-doux); background: var(--surface); z-index: 1; }
.bande-indice-titre span::after { content: " ·"; }
@media (min-width: 720px) { .bande-indice-titre { flex-direction: column; justify-content: center; gap: 2px; padding: var(--sp-3) var(--sp-4); border-right: 1px solid var(--chanfrein); font-size: var(--fs-meta); line-height: 1.4; } .bande-indice-titre span::after { content: none; } }
.bande-indice-titre strong { color: var(--texte); font-weight: 500; }
.bande-indice-defile { flex: 1; overflow: hidden; display: flex; align-items: center; -webkit-mask-image: linear-gradient(90deg, transparent, #000 2%, #000 97%, transparent); mask-image: linear-gradient(90deg, transparent, #000 2%, #000 97%, transparent); }
.bande-indice-piste { display: flex; gap: 0; white-space: nowrap; animation: defilement 70s linear infinite; padding-block: 6px 2px; }
@media (min-width: 720px) { .bande-indice-piste { padding-block: var(--sp-3); } }
/* Le survol et le focus mettent en pause, SAUF quand c'est la commande de pause qui a le focus :
   sinon « Reprendre » ne produisait rien de visible pour un utilisateur clavier. */
.bande-indice:hover:not(:has(.bande-indice-pause:focus)) .bande-indice-piste,
.bande-indice:focus-within:not(:has(.bande-indice-pause:focus)) .bande-indice-piste { animation-play-state: paused; }
/* 2.2.2 Mettre en pause : commande explicite, pas seulement le survol (B1). */
.bande-indice.est-en-pause .bande-indice-piste { animation-play-state: paused; }
.bande-indice-pause { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 28px; height: 28px; margin: -2px 0 -2px auto; padding: 0; background: transparent; border: 1px solid rgba(243,242,242,.45); color: var(--texte); cursor: pointer; }
.bande-indice-pause:hover { border-color: var(--texte); background: var(--surface-2); }
.bande-indice-pause:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.bande-indice-pause svg { width: 14px; height: 14px; }
.bande-indice-pause .icone-lecture { display: none; }
.bande-indice-pause[aria-pressed="true"] .icone-pause { display: none; }
.bande-indice-pause[aria-pressed="true"] .icone-lecture { display: block; }
@media (min-width: 720px) { .bande-indice-pause { margin: 0; align-self: flex-start; } }
/* Sans script le bouton n'existerait pas : le bandeau est alors servi fixe et défilable à la main,
   jamais en boucle infinie sans commande (2.2.2). */
html:not([data-js]) .bande-indice-pause { display: none; }
html:not([data-js]) .bande-indice-piste { animation: none; }
html:not([data-js]) .bande-indice-defile { overflow-x: auto; -webkit-mask-image: none; mask-image: none; }
html:not([data-js]) .bande-indice-liste[aria-hidden="true"] { display: none; }
.bande-indice-liste { display: flex; list-style: none; margin: 0; padding: 0; gap: 0; }
.bande-indice-liste li { display: inline-flex; align-items: center; flex: none; white-space: nowrap; gap: var(--sp-2); padding-inline: var(--sp-4); border-right: 1px solid var(--chanfrein); font-family: var(--mono); font-size: var(--fs-meta); line-height: 18px; }
@media (min-width: 720px) { .bande-indice-liste li { padding-inline: var(--sp-5); font-size: var(--fs-tableau-sm); } }
.bande-indice-liste a { color: var(--texte); text-decoration: none; text-transform: uppercase; letter-spacing: .06em; font-weight: 500; }
.bande-indice-liste a:hover { color: var(--lien); }
.bande-indice-liste .montant { color: var(--texte); }
.bande-indice-liste .date { color: var(--texte-doux); font-size: var(--fs-meta); }
.bande-indice-liste .devis { color: var(--texte-doux); }
@keyframes defilement { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) {
  .bande-indice-piste { animation: none; }
  .bande-indice-defile { overflow-x: auto; -webkit-mask-image: none; mask-image: none; }
  .bande-indice-liste[aria-hidden="true"] { display: none; }
}

/* ---------- Étapes numérotées (comment ça marche) ---------- */
.etapes-liste { list-style: none; margin: 0; padding: 0; display: grid; gap: 0; counter-reset: etape; }
.etapes-liste li { display: grid; grid-template-columns: 64px 1fr; gap: var(--sp-4); padding-block: var(--sp-5); border-top: 1px solid var(--chanfrein); }
.etapes-liste li:last-child { border-bottom: 1px solid var(--chanfrein); }
.etapes-liste .numero { font-family: var(--mono); font-size: var(--fs-titre-2); font-weight: 500; color: var(--texte-doux); line-height: 1; letter-spacing: -0.02em; }
.etapes-liste h3 { margin-bottom: var(--sp-1); }
.etapes-liste p { margin: 0; color: var(--texte-secondaire); }

/* ---------- Actualité : voir .osc-news (kit). La une garde sa photo à côté de la manchette ---------- */
.manchette-vedette { display: grid; gap: var(--sp-5); }
.manchette-vedette .cadre-photo img { aspect-ratio: 16 / 9; }
.osc-news--une { border-top: 0; }
.osc-news--une .osc-news-item { border-bottom: 0; }
@media (min-width: 960px) { .manchette-vedette { grid-template-columns: 1.1fr 1fr; align-items: center; } }

/* ---------- Liste des marques (index) : rangées numérotées ---------- */
.liste-marques { list-style: none; margin: 0; padding: 0; counter-reset: marque; }
.liste-marques li { border-top: 1px solid var(--chanfrein); }
.liste-marques li:last-child { border-bottom: 1px solid var(--chanfrein); }
.rangee-marque { display: grid; grid-template-columns: auto 1fr; gap: var(--sp-3) var(--sp-4); padding-block: var(--sp-4); color: inherit; text-decoration: none; align-items: center; position: relative; }
.rangee-marque .rangee-texte { grid-column: 1 / -1; }
.rangee-marque .plaque-marque { justify-self: start; }
.rangee-marque p { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.rangee-marque .numero { grid-column: 1; font-family: var(--mono); font-size: var(--fs-titre-3); font-weight: 500; color: var(--texte-doux); letter-spacing: -0.02em; line-height: 1; }
.rangee-marque .rangee-texte { min-width: 0; }
.rangee-marque h2 { font-size: var(--fs-titre-3); margin-bottom: var(--sp-1); font-weight: 700; color: var(--texte); }
.rangee-marque p { margin: 0 0 var(--sp-2); color: var(--texte-doux); }
.rangee-marque .meta { font-family: var(--mono); font-size: var(--fs-meta); color: var(--texte-doux); letter-spacing: .04em; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rangee-marque .meta span + span::before { content: "·"; margin-inline: var(--sp-3); color: var(--chanfrein); }
.entete-marque-identite .meta span + span::before { content: "·"; margin-right: var(--sp-4); color: var(--chanfrein); }
.entete-marque-identite .meta { gap: var(--sp-2) 0; }
.rangee-marque .rangee-action { grid-column: 1 / -1; margin-top: 0; }
.rangee-marque:hover .rangee-action { color: var(--rubis-texte); }
.rangee-marque::before { content: ""; position: absolute; inset: 0 calc(-1 * var(--sp-4)); background: var(--surface-2); opacity: 0; transition: opacity 200ms ease; z-index: -1; }
.rangee-marque:hover::before { opacity: 1; }
.liste-marques li[data-vedette] .rangee-marque { padding-block: var(--sp-7); }
.liste-marques li[data-vedette] h2 { font-size: var(--fs-titre-1); }
@media (min-width: 960px) {
  .rangee-marque { grid-template-columns: 72px 96px 1fr auto; gap: var(--sp-6); align-items: center; padding-block: var(--sp-6); }
  .rangee-marque .numero { grid-column: auto; font-size: var(--fs-titre-2); }
  .rangee-marque .rangee-texte { grid-column: auto; padding-left: var(--sp-2); }
  .rangee-marque .rangee-texte-large { grid-column: 2 / span 2; padding-left: 0; }
  .rangee-marque .meta { display: flex; flex-wrap: wrap; gap: var(--sp-2) 0; white-space: normal; overflow: visible; }
  .rangee-marque p { display: block; overflow: visible; }
  .rangee-marque h2 { font-size: var(--fs-titre-2); }
  .rangee-marque p { max-width: 60ch; }
  .rangee-marque .rangee-action { grid-column: auto; }
}

/* Les autres maisons et la grille de l'accueil : voir .osc-brands (kit) */

/* ---------- En-tête de page marque (verso) ---------- */
.entete-marque { display: grid; gap: var(--sp-6); align-items: start; }
.entete-marque-identite { display: flex; flex-direction: column; gap: var(--sp-3); }
.entete-marque-identite .ligne-logo { display: flex; align-items: center; gap: var(--sp-4); }
.entete-marque-identite h1 { font-size: var(--fs-affiche); font-weight: 800; letter-spacing: -0.025em; line-height: 1; margin: 0; }
.entete-marque-identite .meta { font-family: var(--mono); font-size: var(--fs-meta); color: var(--texte-doux); letter-spacing: .06em; text-transform: uppercase; display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-4); }
.entete-marque-identite .chapeau { color: var(--texte-secondaire); font-size: 1.0625rem; max-width: 52ch; margin: var(--sp-2) 0 0; }
.chiffres-cles { display: grid; gap: var(--sp-3); grid-template-columns: 1fr; }
@media (min-width: 480px) { .chiffres-cles { grid-template-columns: 1fr 1fr; } }
.chiffre-cle { display: flex; flex-direction: column; gap: var(--sp-1); padding: var(--sp-4) var(--sp-5); }
.chiffre-cle .pont-tarif-ref { margin-bottom: var(--sp-2); }
.chiffre-cle .montant { font-family: var(--mono); font-weight: 500; font-size: 2.5rem; line-height: 1; letter-spacing: -0.03em; }
.chiffre-cle .montant sup { font-size: .42em; vertical-align: baseline; position: relative; top: -.1em; color: var(--texte-doux); font-weight: 400; margin-right: .3em; font-family: var(--corps); }
.chiffre-cle .origine { font-family: var(--mono); font-size: var(--fs-meta); color: var(--texte-doux); }
.chiffre-cle .libelle { color: var(--texte-doux); font-size: var(--fs-tableau-sm); margin: 0; }
@media (min-width: 960px) {
  .entete-marque { grid-template-columns: 1.05fr 1fr; gap: var(--sp-8); }
  .chiffre-cle .montant { font-size: 3.5rem; }
  .entete-marque-visuel .cadre-photo { margin-bottom: var(--sp-4); }
}
.entete-marque-visuel .cadre-photo img { aspect-ratio: 16 / 10; }

/* ---------- Fiche de service (page tarif) : trois colonnes courtes, détail replié ---------- */
.fiche-service { display: grid; grid-template-columns: 1fr; border-top: 1px solid var(--chanfrein); border-bottom: 1px solid var(--chanfrein); margin-top: var(--sp-6); }
.fiche-service > div { padding: var(--sp-3) 0; border-bottom: 1px solid var(--chanfrein); }
.fiche-service > div:last-child { border-bottom: 0; }
.fiche-service dt { font-family: var(--mono); font-size: var(--fs-meta); letter-spacing: .08em; text-transform: uppercase; color: var(--texte-doux); margin-bottom: 2px; }
.fiche-service dd { margin: 0; font-family: var(--titre); font-weight: 500; font-size: 1.0625rem; line-height: 1.3; }
@media (min-width: 720px) { .fiche-service { grid-template-columns: repeat(3, 1fr); gap: var(--sp-5); } .fiche-service > div { border-bottom: 0; padding: var(--sp-4) 0; } .fiche-service > div + div { border-left: 1px solid var(--chanfrein); padding-left: var(--sp-5); } }
.fiche-service-details { margin-top: var(--sp-3); }
.fiche-service-details summary { cursor: pointer; color: var(--lien); font-size: var(--fs-tableau-sm); min-height: 44px; display: flex; align-items: center; }
.fiche-service-details blockquote { margin: var(--sp-2) 0; padding-left: var(--sp-4); border-left: 2px solid var(--chanfrein); color: var(--texte-doux); font-size: var(--fs-tableau-sm); }

/* ---------- Photo de modèle (licence libre) et crédit ---------- */
.photo-credit { font-size: 12px; color: var(--texte-doux); font-family: var(--mono); margin: var(--sp-2) 0 0; }
.photo-credit a { color: inherit; }

/* ---------- Fiche atelier ---------- */
.pont-atelier { display: flex; flex-direction: column; gap: var(--sp-3); }
.pont-atelier-etats { display: flex; gap: var(--sp-3); flex-wrap: wrap; }
.pont-atelier-etat { display: inline-flex; align-items: center; gap: var(--sp-2); font-size: var(--fs-meta); color: var(--texte-doux); font-family: var(--mono); letter-spacing: .02em; }
.pont-atelier h3 { margin: 0; }
.pont-atelier h3 a { display: inline-flex; align-items: center; min-height: 44px; color: var(--texte); text-decoration: none; }
.pont-atelier h3 a:hover { color: var(--lien); }
.pont-atelier .etiquette { display: inline-block; margin-right: var(--sp-2); }
.badge-luminova { display: inline-flex; align-items: center; gap: var(--sp-1); border: 1px solid var(--luminova); color: var(--luminova); font-family: var(--mono); font-size: var(--fs-meta); padding: 2px var(--sp-2); letter-spacing: .04em; }
.fiche-registre { display: grid; gap: var(--sp-2) var(--sp-5); grid-template-columns: 1fr; margin: 0; }
.fiche-registre div { display: grid; grid-template-columns: 1fr; gap: 2px; padding-block: var(--sp-3); border-bottom: 1px solid var(--chanfrein); }
.fiche-registre dt { font-family: var(--mono); font-size: var(--fs-meta); color: var(--texte-doux); letter-spacing: .06em; text-transform: uppercase; }
.fiche-registre dd { margin: 0; }
@media (min-width: 720px) { .fiche-registre { grid-template-columns: 1fr 1fr; } }
.entete-atelier { display: grid; gap: var(--sp-5); align-items: end; }
@media (min-width: 960px) { .entete-atelier { grid-template-columns: 1.2fr 1fr; gap: var(--sp-8); } }

/* ---------- Formulaires ---------- */
label { display: block; font-weight: 400; font-size: 12px; color: var(--texte-secondaire); margin-bottom: 6px; }
.champ { margin-bottom: var(--sp-4); }
.champ-etroit { max-width: 320px; }
.champ-pleine-largeur { grid-column: 1 / -1; }
.liste-pagination { display: flex; gap: var(--sp-2); list-style: none; padding: 0; flex-wrap: wrap; }
.liste-pagination a { display: inline-flex; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; border: 1px solid var(--chanfrein); text-decoration: none; font-family: var(--mono); }
.liste-pagination a[aria-current="page"] { border-color: var(--rubis); color: var(--texte); }
input, select, textarea { width: 100%; min-height: 44px; font-size: 16px; padding: 8px 12px; background: var(--fond); color: var(--texte); border: 1px solid var(--osc-rule); border-radius: 0; caret-color: var(--rubis); }
@media (min-width: 768px) { input, select, textarea { font-size: 14px; min-height: 40px; } }
input:hover, select:hover, textarea:hover { border-color: var(--osc-rule-hover); }
select { appearance: none; background-image: linear-gradient(45deg, transparent 50%, var(--texte-doux) 50%), linear-gradient(135deg, var(--texte-doux) 50%, transparent 50%); background-position: calc(100% - 20px) 50%, calc(100% - 14px) 50%; background-size: 6px 6px; background-repeat: no-repeat; padding-right: var(--sp-7); }
textarea { min-height: 120px; resize: vertical; }
input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.champ-aide { font-size: 12px; line-height: 1.4; color: var(--texte-doux); margin: 6px 0 0; }
.champ-erreur { font-size: 12px; line-height: 1.4; color: var(--rubis-texte); margin: 6px 0 0; display: flex; align-items: center; gap: 6px; }
.champ-erreur::before { content: ""; width: 6px; height: 6px; background: var(--rubis); flex: none; }
.osc-field > .champ-erreur { margin: 0; }
.champ-compteur { font-size: 12px; color: var(--texte-doux); text-align: right; margin: 0; }
fieldset { border: 1px solid rgba(243,242,242,.2); padding: var(--sp-5); margin: 0 0 var(--sp-5); }
legend { font-family: var(--titre); font-weight: 800; padding-inline: var(--sp-2); }
.cases { display: flex; flex-wrap: wrap; gap: var(--sp-3); }
.case { display: flex; align-items: center; gap: var(--sp-2); min-height: 44px; }
.case label { display: inline-flex; align-items: center; min-height: 44px; margin: 0; }
.case input { width: 16px; height: 16px; flex: none; min-height: 0; accent-color: var(--rubis); }
.honeypot { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.formulaire-cadre { display: grid; gap: var(--sp-6); }
@media (min-width: 960px) { .formulaire-cadre { grid-template-columns: 1.4fr 1fr; align-items: start; } }

/* ---------- Bandeau simple (pages sans photo) ---------- */
.bandeau-page { padding-block: var(--sp-6); margin-bottom: 0; }
.bandeau-page + .section, .bandeau-photo + .section { padding-top: var(--sp-7); }
.page-ateliers .bandeau-photo + .section { padding-top: var(--sp-5); }
.page-marque .section { padding-bottom: var(--sp-7); }
.page-marque article.section { padding-top: 0; }

/* ---------- Pied de page ---------- */
.pied { border-top: 2px solid var(--osc-rule-section); margin-top: 0; padding-block: var(--sp-7) var(--sp-6); color: var(--texte-doux); font-size: var(--fs-tableau-sm); background: var(--surface); }
.pied-grille { display: grid; gap: var(--sp-6); grid-template-columns: 1fr; }
@media (min-width: 720px) { .pied-grille { grid-template-columns: 1.4fr 1fr 1fr; } }
.pied a { color: var(--texte-doux); }
.pied a:hover { color: var(--texte); }
.pied-liens { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--sp-1); }
.pied-liens a { display: inline-flex; align-items: center; min-height: 40px; text-decoration: none; }
.pied-methode { border-left: 2px solid var(--rubis); padding-left: var(--sp-3); }
.pied-logo { margin-bottom: var(--sp-3); }
.pied-copyright { margin-top: var(--sp-6); font-family: var(--mono); font-size: var(--fs-meta); display: flex; flex-wrap: wrap; gap: var(--sp-4); justify-content: space-between; }

/* ---------- Admin ---------- */
.admin-tableau { width: 100%; border-collapse: collapse; }
.admin-tableau th, .admin-tableau td { border-bottom: 1px solid var(--chanfrein); padding: var(--sp-2); text-align: left; font-size: var(--fs-tableau-sm); }
.admin-cartes { display: grid; gap: var(--sp-4); grid-template-columns: 1fr; }
@media (min-width: 720px) { .admin-cartes { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1100px) { .admin-cartes { grid-template-columns: repeat(4, 1fr); } }

/* ---------- Pièces horlogères (traits animés) ---------- */
.piece-trait path, .piece-trait circle, .piece-trait rect { stroke-dasharray: 400; stroke-dashoffset: 400; transition: stroke-dashoffset 600ms var(--easing); }
.piece-trait.est-visible path, .piece-trait.est-visible circle, .piece-trait.est-visible rect { stroke-dashoffset: 0; }
@media (prefers-reduced-motion: reduce) { .piece-trait path, .piece-trait circle, .piece-trait rect { stroke-dashoffset: 0; transition: none; } }

/* ---------- Article (recto, lecture longue) ---------- */
.article { max-width: 72ch; }
.article h2 { margin-top: var(--sp-7); }
.article p, .article li { font-size: 1.0625rem; max-width: none; }
@media (min-width: 960px) { .article p, .article li { font-size: 1.125rem; } }
/* Fiche de marque : le corps prend la largeur du conteneur, mesure tenue entre 75 et 90 caractères par la taille de fonte */
.article[data-large] { max-width: none; }
@media (min-width: 960px) { .article[data-large] p, .article[data-large] li { font-size: 1.25rem; line-height: 1.65; max-width: 88ch; } .article[data-large] h2 { font-size: var(--fs-titre-2); } }
.article figure { margin: var(--sp-6) 0; }
.sources { font-size: var(--fs-meta); color: var(--texte-doux); }
.sources ul { padding-left: 1.2em; margin: 0; }
.sources a { color: inherit; }
.rss-bouton { display: inline-flex; align-items: center; gap: var(--sp-2); min-height: 44px; }

/* ---------- Transitions de page (CSS seul) ---------- */
@view-transition { navigation: auto; }
::view-transition-old(root), ::view-transition-new(root) { animation-duration: 260ms; }
@media (prefers-reduced-motion: reduce) { ::view-transition-old(root), ::view-transition-new(root) { animation: none; } }

.filtre-type { display: flex; flex-wrap: wrap; align-items: end; gap: var(--sp-3); margin-bottom: var(--sp-5); }
.filtre-type .osc-sweep { align-self: end; }

/* ---------- Comptes et avis (SPEC_AVIS, 2026-09-20) ----------
   Un formulaire de compte tient sur une colonne étroite ; la note se lit en chiffre (Geist Mono)
   et en mot, les cinq segments ne font que l'accompagner. Pas de nouveau style de bouton. */
.marge-haute-legere { margin-top: var(--sp-5); }
.honnete + .honnete { margin-top: var(--sp-3); }
.liste-nue { list-style: none; margin: 0; padding: 0; }
.lien-discret { color: inherit; text-decoration: none; }
.lien-discret:hover, .lien-discret:focus-visible { text-decoration: underline; }
.actions-ligne { display: flex; flex-wrap: wrap; gap: var(--sp-3); }

/* Lien de compte dans l'en-tête : icône seule sous 600 px, texte au-delà ; entrée 09 du menu mobile */
.lien-compte { display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2); min-width: 44px; min-height: 44px; color: var(--texte-secondaire); text-decoration: none; font-family: var(--titre); font-weight: 600; font-size: 14px; white-space: nowrap; }
.lien-compte svg { width: 22px; height: 22px; flex: none; }
.lien-compte:hover, .lien-compte:focus-visible, .lien-compte[aria-current="page"] { color: var(--texte); }
/* 4.1.2 / 2.4.4 : sous 600 px le libellé est masqué VISUELLEMENT, jamais retiré de l'arbre
   d'accessibilité — « display: none » laissait un lien sans nom sur les 17 pages mobiles (B3). */
.lien-compte-texte { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }
@media (min-width: 600px) { .lien-compte { padding-inline: var(--sp-2); } .lien-compte-texte { position: static; width: auto; height: auto; overflow: visible; clip: auto; } }

/* Formulaire étroit (création, connexion) et large (avis, réponse) */
.formulaire-etroit { max-width: 480px; }
.formulaire-etroit[data-large] { max-width: 720px; }
.formulaire-etroit h1 { margin-bottom: var(--sp-3); }
.lien-croise { margin-top: var(--sp-6); padding-top: var(--sp-5); border-top: 1px solid var(--chanfrein); }

/* Mot de passe : la bascule Afficher / Masquer est un bouton icône (œil) posé DANS le champ, à droite,
   à l'intérieur de la bordure ; l'anneau de focus du champ entoure donc l'ensemble. 48 px de haut comme
   l'input, 48 px de large (zone tactile), anneau de focus propre au bouton, aria-pressed conservé. */
.mdp-groupe { position: relative; }
.mdp-groupe input, .mdp-groupe .osc-input { padding-right: 56px; }
.osc-frame > .mdp-groupe { flex: 1; min-width: 0; }
.mdp-bascule { position: absolute; top: 0; right: 0; bottom: 0; width: 48px; display: inline-flex; align-items: center; justify-content: center; padding: 0; margin: 0; background: transparent; border: 0; border-radius: 0; color: var(--texte-doux); cursor: pointer; }
.mdp-bascule:hover, .mdp-bascule[aria-pressed="true"] { color: var(--texte); }
.mdp-bascule:focus-visible { outline: 2px solid var(--focus); outline-offset: -6px; }
.mdp-bascule svg { width: 22px; height: 22px; }
.mdp-bascule .mdp-oeil-barre { display: none; }
.mdp-bascule[aria-pressed="true"] .mdp-oeil { display: none; }
.mdp-bascule[aria-pressed="true"] .mdp-oeil-barre { display: block; }
/* Champ en erreur : liseré rubis, en plus du message sous le champ */
input[aria-invalid="true"], select[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--rubis); }

/* En-tête de l'espace compte, état de l'adresse */
.compte-entete { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: var(--sp-4); }
.compte-entete h1 { margin-bottom: var(--sp-2); }
.compte-etat form { margin-top: var(--sp-3); }
.compte-etat .rubis { vertical-align: middle; margin-right: var(--sp-1); }

/* Dépliant (suppression du compte). Nommé « repli » auparavant : la classe est celle des cellules
   secondaires du tableau de tarifs, qui héritaient de cette bordure (filets verticaux isolés, vague 4). */
.depliant { border: 1px solid rgba(243,242,242,.2); border-radius: 0; }
.depliant summary { cursor: pointer; padding: var(--sp-3) var(--sp-4); min-height: 48px; display: flex; align-items: center; font-family: var(--titre); font-weight: 600; font-size: 14px; color: var(--texte-doux); list-style: none; }
.depliant summary::-webkit-details-marker { display: none; }
.depliant summary::before { content: ""; display: inline-block; width: 8px; height: 8px; border-right: 1px solid currentColor; border-bottom: 1px solid currentColor; transform: rotate(-45deg); margin-right: var(--sp-3); transition: transform 160ms ease; }
.depliant[open] summary::before { transform: rotate(45deg); }
.depliant[open] summary { color: var(--texte); border-bottom: 1px solid var(--chanfrein); }
.depliant-corps { padding: var(--sp-4); }
.depliant-corps .depliant-champ { max-width: 420px; margin-bottom: var(--sp-4); }

/* La note : chiffre mono, cinq segments, mot */
.note { display: inline-flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2) var(--sp-3); }
.note-chiffre { font-family: var(--mono); font-weight: 500; font-size: 1.375rem; line-height: 1; letter-spacing: -0.02em; }
.note-sur { font-size: .7em; color: var(--texte-doux); font-weight: 400; letter-spacing: 0; }
.note-segments { display: inline-flex; gap: 3px; }
.note-segment { width: 14px; height: 6px; background: var(--chanfrein); }
.note-segment.est-plein { background: var(--texte); }
.note-mot { font-family: var(--titre); font-weight: 500; font-size: var(--fs-tableau-sm); color: var(--texte-doux); }
.note[data-taille="grande"] .note-chiffre { font-size: var(--fs-titre-2); }

/* Sélecteur de note : cinq radios stylées, le chiffre reste lisible, le clavier fonctionne */
.note-choix { border: 1px solid rgba(243,242,242,.2); padding: var(--sp-4); margin: 0 0 var(--sp-5); }
.note-choix[aria-invalid="true"] { border-color: var(--defavorable); }
.note-choix-options { display: grid; grid-template-columns: repeat(5, 1fr); gap: var(--sp-2); }
.note-choix-options input { position: absolute; width: 1px; height: 1px; opacity: 0; margin: 0; min-height: 0; }
.note-choix-options label { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; min-height: 64px; padding: var(--sp-2) var(--sp-1); border: 1px solid var(--chanfrein); background: var(--surface); color: var(--texte-doux); cursor: pointer; text-align: center; margin: 0; transition: background-color 160ms ease, color 160ms ease; }
.note-choix-options label:hover { background: var(--surface-2); color: var(--texte); }
.note-choix-chiffre { font-family: var(--mono); font-weight: 500; font-size: 1.5rem; line-height: 1; }
.note-choix-mot { font-size: .6875rem; line-height: 1.2; font-family: var(--titre); font-weight: 500; letter-spacing: .02em; }
.note-choix-options input:checked + label { background: var(--texte); color: var(--fond); border-color: var(--texte); }
.note-choix-options input:focus-visible + label { outline: 2px solid var(--focus); outline-offset: 2px; }
@media (min-width: 480px) { .note-choix-mot { font-size: var(--fs-meta); } .note-choix-options label { min-height: 72px; } }

/* Statistiques d'avis sur la fiche : moyenne, répartition, action */
.avis-stats { display: grid; gap: var(--sp-5); grid-template-columns: 1fr; margin-bottom: var(--sp-5); }
.avis-stats-chiffre { font-family: var(--mono); font-weight: 500; font-size: var(--fs-montant); line-height: 1; letter-spacing: -0.02em; margin: 0 0 var(--sp-2); }
.avis-stats-chiffre .note-sur { font-size: .4em; }
.avis-stats-action { align-self: end; }
@media (min-width: 720px) { .avis-stats { grid-template-columns: auto 1fr auto; align-items: end; gap: var(--sp-7); } }
.repartition { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-2); max-width: 420px; }
.repartition li { display: grid; grid-template-columns: 20px 1fr 32px; align-items: center; gap: var(--sp-3); font-size: var(--fs-meta); }
.repartition-note { color: var(--texte-doux); text-align: right; }
.repartition-barre { display: block; width: 100%; height: 6px; }
.repartition-fond { fill: var(--chanfrein); }
.repartition-plein { fill: var(--texte); }
.repartition-nb { color: var(--texte-doux); text-align: right; }

/* Cartes d'avis (fiche atelier, espace compte, citation) */
.avis-liste { display: grid; gap: var(--sp-4); }
.avis-carte { display: flex; flex-direction: column; gap: var(--sp-3); }
.avis-entete { display: flex; flex-direction: column; gap: var(--sp-2); }
.avis-titre { font-family: var(--titre); font-weight: 500; font-size: var(--fs-intertitre); margin: 0; line-height: 1.25; }
.avis-texte { margin: 0; white-space: pre-line; max-width: 72ch; }
.avis-atelier { margin: 0; font-family: var(--titre); font-weight: 500; }
.avis-meta { display: flex; flex-wrap: wrap; gap: var(--sp-1) var(--sp-4); margin: 0; font-size: var(--fs-meta); color: var(--texte-doux); }
.avis-meta span + span::before { content: "·"; margin-right: var(--sp-3); color: var(--chanfrein); }
.avis-statut { margin: 0; font-size: var(--fs-tableau-sm); }
.avis-actions { margin-top: var(--sp-2); }
.avis-reponse { border-left: 3px solid var(--luminova); padding: var(--sp-3) var(--sp-4); margin-left: 0; background: color-mix(in srgb, var(--surface-2) 70%, transparent); max-width: 72ch; }
@media (min-width: 720px) { .avis-reponse { margin-left: var(--sp-6); } }
.avis-reponse-libelle { font-family: var(--titre); font-weight: 500; font-size: var(--fs-tableau-sm); margin: 0 0 var(--sp-2); color: var(--luminova); }
.avis-reponse-libelle .mono { color: var(--texte-doux); font-size: var(--fs-meta); margin-left: var(--sp-2); }
.avis-citation { margin: var(--sp-5) 0 var(--sp-5); display: flex; flex-direction: column; gap: var(--sp-3); }
.avis-citation .avis-titre { font-size: var(--fs-intertitre); }

/* Statut d'un avis : toujours un mot, la couleur n'est qu'un renfort */
.statut-avis { display: inline-flex; align-items: center; gap: var(--sp-2); font-family: var(--mono); font-size: var(--fs-meta); letter-spacing: .04em; text-transform: uppercase; color: var(--texte-doux); }
.statut-avis::before { content: ""; width: 8px; height: 8px; border: 1px solid currentColor; border-radius: 50%; flex: none; }
.statut-avis[data-statut="publie"] { color: var(--conforme); }
.statut-avis[data-statut="publie"]::before { background: currentColor; }
.statut-avis[data-statut="refuse"] { color: var(--defavorable); }
.statut-avis[data-statut="refuse"]::before { background: currentColor; }

/* Admin : file de relecture, dense et lisible */
.admin-file { display: grid; gap: var(--sp-4); }
.admin-avis-carte { display: flex; flex-direction: column; gap: var(--sp-3); }
.admin-avis-tete { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-4); }
.admin-avis-titre { font-family: var(--titre); font-weight: 500; font-size: var(--fs-intertitre); margin: 0; }
.admin-avis-texte { margin: 0; white-space: pre-line; max-width: 80ch; }
.admin-avis-infos { display: grid; gap: var(--sp-2) var(--sp-5); grid-template-columns: 1fr; margin: 0; font-size: var(--fs-tableau-sm); }
.admin-avis-infos div { display: grid; grid-template-columns: 72px 1fr; gap: var(--sp-2); }
.admin-avis-infos dt { font-family: var(--mono); font-size: var(--fs-meta); color: var(--texte-doux); letter-spacing: .06em; text-transform: uppercase; }
.admin-avis-infos dd { margin: 0; overflow-wrap: anywhere; }
@media (min-width: 720px) { .admin-avis-infos { grid-template-columns: 1fr 1fr; } }
.admin-avis-origine { margin: 0; border-left: 3px solid var(--chanfrein); padding: var(--sp-3) var(--sp-4); background: color-mix(in srgb, var(--surface-2) 70%, transparent); display: flex; flex-direction: column; gap: var(--sp-2); }
.admin-avis-actions { display: flex; flex-wrap: wrap; gap: var(--sp-3); align-items: flex-start; padding-top: var(--sp-3); border-top: 1px solid var(--chanfrein); }
.admin-refus { display: flex; flex-wrap: wrap; gap: var(--sp-2); flex: 1 1 100%; min-width: 0; }
@media (min-width: 720px) { .admin-refus { flex-basis: 0; } }
.admin-refus .osc-frame { flex: 1; min-width: 200px; }
.admin-avis h2 .mono { font-size: var(--fs-intertitre); font-weight: 400; margin-left: var(--sp-2); }

/* ---------- Utilitaires (vague 4) ----------
   La CSP du site (style-src 'self', sans 'unsafe-inline') fait ignorer tout attribut style="…" par le
   navigateur : les réglages ponctuels des gabarits vivent ici, en classes. */
.texte-meta { font-size: var(--fs-meta); }
.texte-petit { font-size: var(--fs-tableau-sm); }
.marge-haute-4 { margin-top: var(--sp-4); }
.marge-3-haut { margin: var(--sp-3) 0 0; }
.marge-basse-6 { margin-bottom: var(--sp-6); }
.marge-basse-7 { margin-bottom: var(--sp-7); }
.pile.pile-sans-gap { gap: 0; }
.liste-simple { margin: 0; padding-left: 1.2em; }
.lien-fil { color: inherit; text-decoration: none; }
/* Fil d'Ariane : un <nav> qui contient un <ol> est la forme correcte (l'ordre des niveaux est
   porteur de sens). La règle est écrite ici pour que la conversion du gabarit soit purement
   sémantique, sans style en ligne, que la politique de sécurité interdit de toute façon. */
nav[aria-label="Fil d'Ariane"] ol { list-style: none; display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); margin: 0; padding: 0; }
nav[aria-label="Fil d'Ariane"] li { display: inline-flex; align-items: center; gap: var(--sp-2); min-height: 24px; }
nav[aria-label="Fil d'Ariane"] li + li::before { content: "/"; color: var(--texte-doux); }

/* ---------- 2.5.8 Taille de la cible (minimum) ----------
   Les liens EN LIGNE dans une phrase sont exemptés par la norme. Ceux qui vivent seuls sur leur
   ligne ne le sont pas : ils sont portés à 24 px de haut. Le texte ne bouge pas, seule la zone
   cliquable grandit (l'audit SEO en comptait 47 sous 24 px sur /revision/). */
.bande-indice-liste a,
.osc-detail-inner .title a,
.lien-fil,
.texte-meta a,
.fiche-registre dd a,
.lien-bloc { display: inline-flex; align-items: center; min-height: 24px; }
/* Les sources sont de longues URL qui doivent pouvoir se couper en fin de ligne : une boîte
   inline-flex les empêcherait de se couper et déborderait à 360 px. Le remplissage vertical d'un
   élément en ligne compte dans la cible sans toucher à la hauteur de ligne. */
.sources li { padding-block: 3px; }
.sources li a { padding-block: 5px; }
.section.sans-padding-haut { padding-top: 0; }
.section.padding-haut-8 { padding-top: var(--sp-8); }
.largeur-lecture { max-width: 52rem; }
.titre-affiche { font-size: var(--fs-affiche); font-weight: 800; letter-spacing: -0.025em; line-height: 1; }
h1.titre-actu { font-size: var(--fs-titre-1); font-weight: 700; letter-spacing: -0.015em; line-height: 1.1; }
.titre-intertitre { font-size: var(--fs-intertitre); }
.manchette-jour.sans-filet-haut { border-top: 0; }
.rangee-statique { cursor: default; }

/* ==========================================================================================
   Kit « Trotteuse » (design-handoff du propriétaire, 2026-09-20, décisions dans DESIGN-KIT.md).
   Un filet de 1 px encadre le bouton ; un segment rouge suivi d'un point blanc fait le tour du
   cadre en 4 s, sens horaire, départ à 12 h. Le même filet tourne autour du champ actif.
   Angles à 0, aucune ombre. Fond nuit par défaut ; `[data-face="recto"]` ou `.osc-light` sur un
   parent pour le fond clair. Mobile-first : les min-width du kit s'appliquent dès 560 px.
   ========================================================================================== */

/* ---------- Cadre trotteuse ---------- */
.osc-sweep {
  position: relative; display: inline-flex; padding: 1px; overflow: hidden; vertical-align: middle;
  background: var(--osc-rule-frame); border-radius: 0; text-decoration: none; isolation: isolate; max-width: 100%;
  color: inherit;
}
.osc-sweep::before {
  content: ""; position: absolute; left: 50%; top: 50%; width: 300%; aspect-ratio: 1;
  transform: translate(-50%, -50%) rotate(0deg); pointer-events: none;
  background: conic-gradient(from 0deg, var(--color-accent) 0 6%, rgba(243,242,242,.9) 6% 7%, transparent 7% 100%);
  animation: osc-spin var(--osc-sweep-duration) linear infinite;
}
.osc-sweep > * { position: relative; }
/* Statique : au-delà de la première trotteuse visible (site.js), ou inactif. Reduced-motion : segment fixe. */
.osc-sweep.is-static::before { display: none; }
.osc-sweep[aria-disabled="true"], .osc-sweep:has(> :disabled), .osc-sweep:has(> [aria-disabled="true"]) { background: var(--osc-rule-disabled); }
.osc-sweep[aria-disabled="true"]::before, .osc-sweep:has(> :disabled)::before, .osc-sweep:has(> [aria-disabled="true"])::before { display: none; }
.osc-sweep:focus-visible, .osc-sweep:has(> :focus-visible) { outline: 2px solid var(--color-accent-400); outline-offset: 2px; }
.osc-sweep:has(> :focus-visible) > * { outline: none; }
.osc-sweep--bloc { display: flex; width: 100%; }
.osc-sweep--bloc > .osc-btn { width: 100%; }
@keyframes osc-spin { to { transform: translate(-50%, -50%) rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .osc-sweep::before { animation: none; } }
/* 2.2.2 : sans script, la commande « Réduire les animations » du pied de page ne peut rien mémoriser.
   Plutôt que de laisser tourner une boucle infinie sans commande, la trotteuse est servie figée : le
   segment reste à 12 h, le dessin du kit est intact. */
html:not([data-js]) .osc-sweep::before { animation: none; }

/* ---------- Boutons : 3 niveaux, 3 tailles, 6 états ---------- */
.osc-btn {
  display: inline-flex; align-items: center; justify-content: space-between; gap: 24px;
  min-width: 0; max-width: 100%; min-height: 42px; padding: 12px 17px; margin: 0; border: 0; border-radius: 0;
  font: 800 14px/1.2 var(--corps); letter-spacing: 0; text-align: left; text-decoration: none; cursor: pointer;
  color: var(--osc-ink-on-night); background: var(--osc-night);
  transition: background .15s;
}
.osc-btn:hover, .osc-btn:focus-visible { transform: none; }
.osc-btn .arrow, .osc-btn .icone { font-weight: 400; flex: none; }
.osc-btn .icone { width: 16px; height: 16px; }
.osc-btn--primary { background: var(--osc-accent-texte); color: #f3f2f2; }
.osc-btn--primary:hover { background: var(--osc-accent-texte-hover); }
.osc-btn--primary:active { background: var(--osc-accent-texte-active); }
.osc-btn--secondary:hover { background: var(--osc-night-2); }
.osc-btn--secondary:active { background: var(--osc-night-4); }
.osc-btn--secondary .arrow, .osc-btn--secondary .icone { color: var(--color-accent-400); }
.osc-btn--lg { min-height: 52px; padding: 16px 20px; font-size: 16px; }
.osc-btn--sm { min-height: 32px; padding: 8px 12px; font-size: 12px; gap: 16px; }
.osc-btn--fit { gap: 14px; padding: 11px 16px; }        /* « Voir le tarif » à côté du champ de recherche */
.osc-btn--wide { padding: 13px 17px; }                  /* primaire du formulaire de devis */
.osc-btn--outline { border: 1px solid rgba(243,242,242,.45); gap: 18px; }  /* « Comparer les 62 marques » */
.osc-btn--outline:hover { border-color: var(--osc-ink-on-night); }
.osc-btn--icon { min-width: 0; width: 40px; height: 40px; min-height: 0; padding: 0; justify-content: center; gap: 0; }
.osc-btn--icon-outline { min-width: 0; width: 42px; height: 42px; min-height: 0; padding: 0; justify-content: center; gap: 0; background: transparent; border: 1px solid rgba(243,242,242,.45); font-weight: 400; color: var(--osc-ink-on-night); }
.osc-btn--icon-outline:hover { border-color: var(--osc-ink-on-night); background: transparent; }
.osc-btn:disabled, .osc-btn[aria-disabled="true"] { color: var(--color-neutral-600); background: var(--osc-night); cursor: not-allowed; opacity: 1; }
.osc-btn.is-loading, .osc-btn.is-loading:hover { background: var(--osc-accent-texte-hover); justify-content: flex-start; gap: 10px; color: #f3f2f2; cursor: progress; }
.osc-btn:focus-visible { outline: 2px solid var(--color-accent-400); outline-offset: 2px; }
@media (min-width: 560px) {
  .osc-btn { min-width: 214px; }
  .osc-btn--lg { min-width: 240px; }
  .osc-btn--sm { min-width: 120px; }
  .osc-btn--nav { min-width: 196px; }
  .osc-btn--wide { min-width: 240px; }
  .osc-btn--fit, .osc-btn--outline, .osc-btn--icon, .osc-btn--icon-outline { min-width: 0; }
  .osc-btn--court { min-width: 120px; }
}

/* Fantôme : texte + index rouge 6 px */
.osc-ghost {
  display: inline-flex; align-items: center; gap: 10px; min-height: 44px; padding: 13px 6px; border: 0; background: none;
  font: 600 14px/1.2 var(--corps); color: var(--osc-ink-on-night); text-decoration: none; cursor: pointer;
}
.osc-ghost::before { content: ""; width: 6px; height: 6px; background: var(--color-accent); flex: none; }
.osc-ghost:hover { color: var(--color-accent-400); }
.osc-ghost .icone { width: 16px; height: 16px; }
.osc-ghost--back { color: var(--color-neutral-300); font-weight: 800; }
.osc-ghost--back::before { display: none; }
.osc-ghost--back:hover { color: var(--osc-ink-on-night); }

/* Spinner « balancier » (état chargement) */
.osc-balancier { position: relative; width: 14px; height: 14px; flex: none; display: block; }
.osc-balancier::before { content: ""; position: absolute; inset: 0; border: 1.5px solid #f3f2f2; border-radius: 50%; opacity: .7; }
.osc-balancier::after { content: ""; position: absolute; left: 6px; top: 1px; width: 2px; height: 6px; background: #f3f2f2; transform-origin: 1px 6px; animation: osc-osc .7s ease-in-out infinite alternate; }
@keyframes osc-osc { from { transform: rotate(-38deg); } to { transform: rotate(38deg); } }
@media (prefers-reduced-motion: reduce) { .osc-balancier::after { animation: none; transform: rotate(38deg); } }

/* ---------- Champs ---------- */
.osc-field { display: flex; flex-direction: column; gap: 6px; margin: 0; font-family: var(--corps); font-weight: 400; color: var(--osc-ink-on-night); }
.osc-field > .label, .osc-label { display: block; margin: 0; font-size: 12px; font-weight: 400; line-height: 1.3; color: var(--color-neutral-300); }
.osc-field > .label .opt, .osc-label .opt { color: var(--color-neutral-500); }
.osc-field > .help, .osc-help { margin: 0; font-size: 12px; line-height: 1.4; color: var(--color-neutral-500); }
.osc-field > .error, .osc-error { margin: 0; font-size: 12px; line-height: 1.4; color: var(--color-accent-400); display: flex; align-items: center; gap: 6px; }
.osc-field > .error::before, .osc-error::before { content: ""; width: 6px; height: 6px; background: var(--color-accent); flex: none; }
.osc-field.is-disabled > .label { color: var(--color-neutral-500); }
.osc-field .champ-compteur { font-size: 12px; color: var(--color-neutral-500); margin: 0; }

.osc-frame {
  position: relative; display: flex; padding: 1px; overflow: hidden; border-radius: 0;
  background: var(--osc-rule); transition: background .15s; isolation: isolate;
}
.osc-frame:hover { background: var(--osc-rule-hover); }
.osc-frame > * { position: relative; flex: 1; min-width: 0; }
.osc-frame::before {
  content: ""; position: absolute; left: 50%; top: 50%; width: 300%; aspect-ratio: 1;
  transform: translate(-50%, -50%); pointer-events: none; opacity: 0;
  background: conic-gradient(from 0deg, var(--color-accent) 0 6%, rgba(243,242,242,.9) 6% 7%, transparent 7% 100%);
}
.osc-frame:focus-within::before { opacity: 1; animation: osc-spin var(--osc-sweep-duration) linear infinite; }
/* 2.4.13 : un filet de 1 px qui change d'alpha ne fait pas un indicateur de focus. L'anneau de 2 px
   à 8,55:1 s'ajoute à la trotteuse du kit sans la remplacer (m4). */
.osc-frame:focus-within { background: var(--osc-rule-hover); outline: 2px solid var(--focus); outline-offset: 2px; }
.osc-frame.is-error, .osc-frame.is-error:hover, .osc-frame:has([aria-invalid="true"]), .osc-frame:has([aria-invalid="true"]):hover { background: var(--color-accent); }
.osc-frame.is-error::before, .osc-frame:has([aria-invalid="true"])::before { display: none; }
/* :has(> :disabled) et non :has(:disabled) : une <option disabled> de remplacement (« Ma montre est
   une… ») suffisait sinon à griser le cadre entier du sélecteur, filet ramené à 1,52:1 (B.2). */
.osc-field.is-disabled .osc-frame, .osc-field.is-disabled .osc-frame:hover, .osc-frame:has(> :disabled), .osc-frame:has(> :disabled):hover { background: var(--osc-rule-disabled); }
@media (prefers-reduced-motion: reduce) { .osc-frame:focus-within::before { animation: none; } }

.osc-input, .osc-select, .osc-frame > input, .osc-frame > select, .osc-frame > textarea {
  display: block; width: 100%; min-height: 44px; padding: 8px 12px; margin: 0; border: 0; border-radius: 0;
  background: var(--osc-night); color: var(--osc-ink-on-night); caret-color: var(--color-accent);
  font: 400 16px/1.4 var(--corps); outline: none; appearance: none; box-shadow: none;
}
.osc-input:focus-visible, .osc-select:focus-visible, .osc-frame > :focus-visible { outline: none; }
.osc-input::placeholder, .osc-frame > input::placeholder, .osc-frame > textarea::placeholder { color: var(--color-neutral-500); opacity: 1; }
.osc-input:disabled, .osc-frame > :disabled { color: var(--color-neutral-600); background: var(--osc-night-3); }
textarea.osc-input, .osc-frame > textarea { min-height: 96px; padding: 10px 12px; resize: vertical; }
.osc-frame > input[aria-invalid="true"], .osc-frame > select[aria-invalid="true"], .osc-frame > textarea[aria-invalid="true"] { border: 0; }
/* Select : chevron 11 px muet à droite, dessiné par le cadre (le select natif reste, sans flèche) */
.osc-frame--select::after { content: ""; position: absolute; right: 12px; top: 50%; width: 8px; height: 8px; margin-top: -6px; border-right: 1.5px solid var(--color-neutral-500); border-bottom: 1.5px solid var(--color-neutral-500); transform: rotate(45deg); pointer-events: none; }
.osc-frame--select > select { padding-right: 36px; cursor: pointer; background-image: none; }
.osc-frame--select > select option { background: var(--osc-night); color: var(--osc-ink-on-night); }
.osc-select { display: flex; align-items: center; justify-content: space-between; cursor: pointer; }
.osc-select .chev { color: var(--color-neutral-500); display: inline-flex; }
.osc-select .chev .icone { width: 14px; height: 14px; }
@media (min-width: 768px) {
  .osc-input, .osc-select, .osc-frame > input, .osc-frame > select, .osc-frame > textarea { font-size: 14px; min-height: 40px; }
}

/* Recherche : champ + bouton secondaire « Voir le tarif → » */
.osc-search { display: flex; gap: 10px; flex-wrap: wrap; align-items: stretch; }
.osc-search .osc-frame { flex: 1 1 240px; min-width: 0; }
.osc-search .osc-sweep { flex: 1 1 auto; }
.osc-search .osc-sweep > .osc-btn { width: 100%; min-height: 44px; }
@media (min-width: 560px) { .osc-search .osc-sweep { flex: 0 0 auto; } .osc-search .osc-frame { min-width: 240px; } }

/* ---------- Choix : radio, case, segmenté, puces ---------- */
.osc-radio, .osc-check {
  display: flex; align-items: center; gap: 10px; min-height: 32px; margin: 0; cursor: pointer;
  font: 400 14px/1.4 var(--corps); color: var(--osc-ink-on-night);
}
.osc-radio input, .osc-check input, .osc-seg input, .osc-chip input { position: absolute; opacity: 0; width: 0; height: 0; min-height: 0; margin: 0; pointer-events: none; }
.osc-radio .box, .osc-check .box { width: 16px; height: 16px; flex: none; border: 1.5px solid rgba(243,242,242,.5); border-radius: 0; display: grid; place-items: center; background: transparent; }
.osc-radio .box { border-radius: 50%; }
.osc-radio:hover .box, .osc-check:hover .box { border-color: var(--color-accent); }
.osc-radio input:checked + .box { border-color: var(--color-accent); background: var(--color-accent); box-shadow: inset 0 0 0 4px var(--osc-night); }
.osc-check input:checked + .box { border-color: var(--osc-accent-texte); background: var(--osc-accent-texte); }
.osc-check input:checked + .box::after { content: "✓"; font: 800 11px/1 var(--corps); color: #f3f2f2; }
.osc-radio input:focus-visible + .box, .osc-check input:focus-visible + .box { outline: 2px solid var(--color-accent-400); outline-offset: 2px; }
.osc-check input[aria-invalid="true"] + .box { border-color: var(--color-accent); }
.osc-check--consent { align-items: flex-start; font-size: 13px; line-height: 1.45; color: var(--color-neutral-300); }
.osc-check--consent .box { margin-top: 2px; }
.osc-check--consent a { color: inherit; }
.osc-choix-liste { display: flex; flex-direction: column; gap: 10px; }

.osc-seg { display: inline-flex; flex-wrap: wrap; gap: 1px; padding: 1px; margin: 0; border: 0; background: var(--osc-rule); align-self: flex-start; justify-self: start; width: fit-content; max-width: 100%; }
.osc-seg .opt { display: inline-flex; flex: 1 1 auto; align-items: center; min-height: 40px; padding: 9px 14px; margin: 0; border: 0; border-radius: 0; font-family: inherit; cursor: pointer; background: var(--osc-night); color: var(--osc-ink-on-night); font: 400 13px/1.2 var(--corps); text-decoration: none; }
.osc-seg .opt:hover { background: var(--osc-night-2); }
.osc-seg .opt:has(input:checked), .osc-seg .opt[aria-current], .osc-seg .opt.is-selected { background: var(--osc-accent-texte); color: #f3f2f2; font-weight: 600; }
.osc-seg .opt:has(input:focus-visible), .osc-seg .opt:focus-visible { outline: 2px solid var(--color-accent-400); outline-offset: -2px; }
.osc-seg[data-invalide="true"] { background: var(--color-accent); }
.osc-seg--bloc { display: flex; width: 100%; }
.osc-seg--bloc .opt { flex: 1 1 auto; justify-content: center; }

.osc-chips { display: flex; gap: 8px; flex-wrap: wrap; }
.osc-chip { display: inline-flex; align-items: center; gap: 8px; min-height: 32px; padding: 6px 12px; margin: 0; border: 1px solid var(--osc-rule); background: transparent; color: var(--color-neutral-300); font: 600 12px/1 var(--corps); cursor: pointer; text-decoration: none; }
.osc-chip:hover { border-color: var(--osc-ink-on-night); color: var(--osc-ink-on-night); }
.osc-chip:has(input:checked), .osc-chip.is-selected { border-color: var(--osc-ink-on-night); color: var(--osc-ink-on-night); padding-left: 10px; }
.osc-chip:has(input:checked)::before, .osc-chip.is-selected::before { content: ""; width: 6px; height: 6px; background: var(--color-accent); }
.osc-chip:has(input:focus-visible) { outline: 2px solid var(--color-accent-400); outline-offset: 2px; }

/* ---------- Formulaire de devis (README § 04) ---------- */
.osc-form-card { border: 1px solid rgba(243,242,242,.2); padding: 20px 16px; margin: 0; display: flex; flex-direction: column; gap: 22px; max-width: 640px; color: var(--osc-ink-on-night); font-family: var(--corps); }
@media (min-width: 560px) { .osc-form-card { padding: 28px; } }
.osc-form-head { display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }
.osc-kicker { display: block; margin: 0; font: 400 12px/1 var(--mono); letter-spacing: .14em; text-transform: uppercase; color: var(--color-neutral-500); }
.osc-form-card h1, .osc-form-card h2, .osc-form-title { margin: 0; font: 800 24px/1.1 var(--corps); letter-spacing: -.015em; color: var(--osc-ink-on-night); }
.osc-steps { display: flex; gap: 4px; margin: 6px 0 0; padding: 0; list-style: none; }
.osc-steps span, .osc-steps li { width: 40px; height: 2px; background: rgba(243,242,242,.45); }
.osc-steps span.is-done, .osc-steps li.is-done { background: var(--color-accent); }
.osc-rule { height: 2px; background: var(--osc-rule-section); border: 0; margin: 0; }
.osc-form-grid { display: grid; grid-template-columns: 1fr; gap: 18px 16px; margin: 0; padding: 0; border: 0; min-width: 0; }
fieldset.osc-field { border: 0; padding: 0; margin: 0; min-width: 0; }
.osc-field > legend, .osc-form-grid legend { padding: 0; margin: 0 0 6px; font: 400 12px/1.3 var(--corps); color: var(--color-neutral-300); float: left; width: 100%; }
fieldset.osc-field[data-invalide="true"] .osc-seg { background: var(--color-accent); }
.osc-form-grid .span-2 { grid-column: 1 / -1; }
@media (min-width: 560px) { .osc-form-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.osc-form-actions { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; }
.osc-form-actions .osc-sweep { flex: 1 1 100%; }
.osc-form-actions .osc-sweep > .osc-btn { width: 100%; }
.osc-form-actions .osc-kicker { margin-left: auto; font-size: 12px; letter-spacing: .06em; }
@media (min-width: 560px) { .osc-form-actions .osc-sweep { flex: 0 0 auto; } .osc-form-actions .osc-sweep > .osc-btn { width: auto; } }
.osc-form-done { display: inline-flex; align-items: center; gap: 10px; padding: 12px 17px; border: 1px solid #f3f2f2; font: 800 14px/1.2 var(--corps); color: var(--osc-ink-on-night); }
.osc-form-done::before { content: ""; width: 8px; height: 8px; background: var(--color-accent); }
/* Résumé d'erreurs (haut de formulaire) : encart à filet, index rouge */
.osc-alert { border: 1px solid rgba(243,242,242,.2); border-left: 2px solid var(--color-accent); padding: 12px 16px; font-size: 13px; color: var(--color-neutral-300); }
.osc-alert p { margin: 0 0 6px; }
.osc-alert ul { margin: 0; padding-left: 1.1em; }
.osc-alert--ok { border-left-color: #f3f2f2; }

/* ---------- En-tête de section (planche 5) ---------- */
.osc-section-head { display: grid; grid-template-columns: 1fr; gap: 16px 40px; align-items: end; margin-bottom: 22px; }
.osc-section-head .osc-kicker { display: flex; align-items: center; gap: 10px; }
.osc-section-head .osc-kicker::before { content: ""; width: 24px; height: 2px; background: var(--color-accent); flex: none; }
.osc-section-head h1, .osc-section-head h2 { margin: 10px 0 0; font: 800 30px/1.1 var(--corps); letter-spacing: -.02em; text-wrap: pretty; }
.osc-section-head .lead { margin: 0; font-size: 14px; line-height: 1.55; color: var(--color-neutral-300); max-width: 48ch; }
.osc-caption { display: block; text-align: left; font: 400 12px/1.4 var(--mono); letter-spacing: .06em; color: var(--color-neutral-500); margin-bottom: 12px; }
@media (min-width: 720px) { .osc-section-head { grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 24px 40px; } }

/* ---------- Tableau (comparatif et dense). Le <table> sémantique du site reste ; la grille est
   posée sur thead/tbody (display: contents) et sur chaque ligne (subgrid). Les rôles ARIA sont
   explicités dans le gabarit : un <table> en display: grid perd sa sémantique sinon. ---------- */
.osc-table { display: block; width: 100%; border-collapse: collapse; border-spacing: 0; border-top: 2px solid rgba(243,242,242,.6); font-family: var(--corps); color: var(--osc-ink-on-night); }
.osc-table caption { display: block; }
/* 1.3.1 : sous 720 px le tableau s'empile et l'en-tête sort de la vue. « display: none » le retirait
   aussi de l'arbre d'accessibilité, et la relation en-tête / cellule ne tenait plus que par le
   contenu généré de .osc-td::before, exposé différemment selon le navigateur. Masquage visuel : le
   <th scope="col"> reste lisible par le lecteur d'écran (m7). */
.osc-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }
.osc-table tbody { display: block; }
.osc-table .osc-tr { position: relative; display: flex; flex-direction: column; gap: 6px; padding: 14px 0; margin: 0; border-bottom: 1px solid var(--osc-rule-section); background: transparent; box-shadow: none; clip-path: none; transition: background .15s; }
.osc-table .osc-tr:hover { background: var(--osc-night-2); }
.osc-table .osc-tr:focus-within { outline: 0; }
.osc-th { display: flex; align-items: center; gap: 6px; padding: 12px; font: 600 12px/1 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--color-neutral-300); background: transparent; border: 0; border-bottom: 2px solid rgba(243,242,242,.6); text-align: left; }
.osc-th:first-child { padding-left: 0; } .osc-th:last-child { padding-right: 0; }
.osc-th.num { justify-content: flex-end; text-align: right; }
/* 4.1.2 : le <th> n'est plus focalisable ; la commande de tri est un <button> à l'intérieur (m2). */
.osc-th-tri { display: inline-flex; align-items: center; gap: 6px; min-height: 24px; margin: -4px -6px; padding: 4px 6px; border: 0; background: transparent; color: inherit; font: inherit; letter-spacing: inherit; text-transform: inherit; text-align: left; cursor: pointer; }
.osc-th-tri:hover { color: var(--osc-ink-on-night); }
.osc-th-tri:focus-visible { outline: 2px solid var(--color-accent-400); outline-offset: 1px; }
.osc-th.num .osc-th-tri { justify-content: flex-end; }
.osc-th .sort { display: inline-flex; color: var(--color-neutral-500); }
.osc-th .sort .icone { width: 14px; height: 14px; }
.osc-th .sort-asc, .osc-th .sort-desc { display: none; }
.osc-th[aria-sort="ascending"] .sort-none, .osc-th[aria-sort="descending"] .sort-none { display: none; }
.osc-th[aria-sort="ascending"] .sort-asc { display: inline-flex; color: var(--color-accent-400); }
.osc-th[aria-sort="descending"] .sort-desc { display: inline-flex; color: var(--color-accent-400); }
.osc-th::after { content: none; }
.osc-td { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 0; min-width: 0; border: 0; background: transparent; }
.osc-td::before { content: attr(data-libelle); font: 400 12px/1.4 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--color-neutral-500); flex: none; }
.osc-td.brand { display: flex; align-items: center; justify-content: flex-start; gap: 10px; font: 800 15px/1.2 var(--corps); margin-bottom: 2px; }
.osc-td.brand::before { content: ""; width: 6px; height: 6px; background: var(--color-accent); flex: none; }
.osc-td.brand a { display: inline-flex; align-items: center; min-height: 24px; color: inherit; text-decoration: none; }
.osc-td.brand a::after { content: ""; position: absolute; inset: 0; } /* le lien couvre toute la ligne ; source et chevron passent au-dessus */
.osc-td .devise-note { display: block; font: 400 12px/1.3 var(--corps); color: var(--color-neutral-500); text-align: right; }
.osc-td.num { font: 500 14px/1.2 var(--mono); font-variant-numeric: tabular-nums; text-align: right; }
.osc-td.num.is-muted, .osc-td .is-muted { color: var(--color-neutral-500); font-family: var(--mono); }
.osc-td.gap { font: 500 14px/1.2 var(--mono); color: var(--color-accent-400); }
.osc-td.gap .gap-val { display: inline-flex; align-items: center; gap: 10px; }
.osc-td.gap .bar { height: 2px; background: var(--color-accent); width: var(--w, 0); flex: none; }
.osc-td.gap.is-muted { color: var(--color-neutral-500); } .osc-td.gap.is-muted .bar { display: none; }
.osc-td.type { font: 400 13px/1.3 var(--corps); color: var(--color-neutral-300); }
.osc-td.meta { align-items: center; justify-content: flex-start; gap: 8px; font: 400 12px/1 var(--mono); color: var(--color-neutral-300); padding-top: 6px; }
.osc-td.meta .rubis { width: 6px; height: 6px; }
.osc-td.meta::before { content: none; }
/* Contre-audit accessibilité : le pseudo-élément qui étend le lien de marque à toute la ligne ne doit
   jamais passer AU-DESSUS du lien « source » ni du chevron. La cellule entière est remontée, et plus
   seulement ses deux éléments connus : une commande ajoutée demain y sera cliquable elle aussi. */
.osc-td.meta { position: relative; z-index: 2; }
.osc-td.meta a, .osc-td.meta .osc-toggle { position: relative; z-index: 1; }
/* 2.5.8 : « source » faisait 42 × 12 px À L'INTÉRIEUR de la ligne, elle-même cliquable ; l'exception
   d'espacement ne s'applique donc pas. 24 px de haut, et le lien passe au-dessus du lien de ligne (m3). */
.osc-td.meta a { display: inline-flex; align-items: center; min-height: 24px; padding-inline: 4px; margin-inline: -4px; color: var(--color-accent-400); text-underline-offset: 3px; text-decoration-thickness: 1px; }
.osc-td.meta .osc-toggle { margin-left: auto; display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; margin-top: -14px; margin-bottom: -14px; margin-right: -12px; padding: 0; border: 0; background: transparent; color: var(--color-neutral-500); cursor: pointer; }
.osc-td.meta .osc-toggle:hover { color: var(--osc-ink-on-night); }
.osc-td.meta .osc-toggle:focus-visible { outline: 2px solid var(--color-accent-400); outline-offset: -6px; }
.osc-td.meta .osc-toggle .chev-up { display: none; }
.osc-tr[data-ouverte="true"] .osc-toggle .chev-down { display: none; }
.osc-tr[data-ouverte="true"] .osc-toggle .chev-up { display: inline-flex; }
.osc-table .osc-tr--sep { display: block; padding: 12px 0 8px; border-bottom: 0; }
.osc-table .osc-tr--sep td { display: block; padding: 0; }
.osc-table .osc-tr--sep td::before { content: none; }
.osc-table .osc-tr--sep .etiquette { margin: 0; }
.osc-table .osc-tr--vide td { display: block; padding: 24px 0; }
.osc-table .osc-tr--vide td::before { content: none; }
@media (min-width: 720px) {
  .osc-table { display: grid; }
  .osc-table--compare { grid-template-columns: minmax(0, 1.2fr) minmax(0, .8fr) minmax(0, 1.3fr) minmax(0, 1fr) minmax(0, 1.2fr); }
  .osc-table--compare.osc-table--type { grid-template-columns: minmax(0, 1.2fr) minmax(0, .8fr) minmax(0, 1.2fr) minmax(0, .9fr) minmax(0, 1fr) minmax(0, 1.2fr); }
  .osc-table--dense { grid-template-columns: minmax(0, 1.4fr) minmax(0, .8fr) minmax(0, 1fr) minmax(0, .9fr); }
  .osc-table--dense.osc-table--type { grid-template-columns: minmax(0, 1.3fr) minmax(0, .8fr) minmax(0, 1fr) minmax(0, .8fr) minmax(0, .9fr) minmax(0, 1fr); }
  .osc-table--dense.osc-table--grille { grid-template-columns: minmax(0, 1.6fr) minmax(0, .9fr) minmax(0, 1.1fr); }
  .osc-table--dense.osc-table--releves { grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr) minmax(0, 1.2fr) minmax(0, .8fr) minmax(0, 1fr) minmax(0, .8fr); }
  .osc-table caption { grid-column: 1 / -1; }
  .osc-table thead, .osc-table tbody { display: contents; position: static; width: auto; height: auto; overflow: visible; clip: auto; white-space: normal; }
  .osc-table .osc-tr, .osc-table thead tr { display: grid; grid-template-columns: subgrid; grid-column: 1 / -1; align-items: center; padding: 0; gap: 0; }
  .osc-table thead tr { border: 0; align-items: stretch; }
  .osc-table .osc-tr--sep, .osc-table .osc-tr--vide, .osc-table .osc-detail-tr { display: grid; }
  .osc-table .osc-tr--sep td, .osc-table .osc-tr--vide td, .osc-table .osc-detail-tr td { grid-column: 1 / -1; }
  .osc-table .osc-tr--sep td { padding: 14px 0 4px; }
  .osc-td { display: block; padding: 14px 12px; }
  .osc-td::before { content: none; }
  .osc-td:first-child { padding-left: 0; } .osc-td:last-child { padding-right: 0; }
  .osc-td.brand { display: flex; margin: 0; }
  .osc-td.gap { display: flex; align-items: center; justify-content: flex-end; }
  .osc-td.meta { display: flex; padding-top: 14px; }
  .osc-td.meta .osc-toggle { margin-right: 0; margin-top: -12px; margin-bottom: -12px; }
  .osc-table .osc-tr:focus-within { outline: 2px solid var(--color-accent-400); outline-offset: -2px; }
}

/* Ligne dépliée : cadre trotteuse, une seule par tableau (site.js) */
.osc-table .osc-detail-tr { display: block; padding: 0; border-bottom: 0; }
.osc-table .osc-detail-tr td { display: block; padding: 0; }
.osc-table .osc-detail-tr td::before { content: none; }
@media (min-width: 720px) { .osc-table .osc-detail-tr { display: grid; grid-template-columns: subgrid; grid-column: 1 / -1; } .osc-table .osc-detail-tr td { grid-column: 1 / -1; } }
.osc-table .osc-detail-tr[hidden] { display: none; }
.osc-detail { display: flex; width: 100%; margin: 12px 0 4px; }
.osc-detail-inner { flex: 1; min-width: 0; background: var(--osc-night); padding: 16px; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px 24px; }
.osc-detail-inner .title { grid-column: 1 / -1; display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; margin: 0; font: 800 18px/1.1 var(--corps); }
.osc-detail-inner .title .osc-kicker { font-size: 12px; }
.osc-detail-inner .osc-stat--action { grid-column: 1 / -1; justify-content: flex-end; align-items: flex-start; }
.osc-stat { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.osc-stat .k { font: 400 12px/1 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--color-neutral-500); }
.osc-stat .v { font: 800 22px/1 var(--corps); overflow-wrap: anywhere; }
.osc-stat .v.accent { color: var(--color-accent-400); }
.osc-stat .s { font-size: 12px; color: var(--color-neutral-500); overflow-wrap: anywhere; }
/* Défaut N16 de l'audit SEO du 2026-09-21 : le lien de marque du cadre de statistiques mesurait
   41 x 14 px sur les pages de mouvement, la seule cible sous 24 px de tout le site. Le padding
   vertical d'un élément en ligne agrandit la zone cliquable sans déplacer une ligne de texte. */
.osc-stat .s a { color: inherit; padding-block: 5px; }
@media (min-width: 720px) {
  .osc-detail-inner { padding: 20px 22px; grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .osc-detail-inner .osc-stat--action { grid-column: auto; }
}

/* Pied de tableau : note + copier + comparer */
.osc-table-foot { display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; margin-top: 22px; }
.osc-table-foot .note { display: flex; flex-wrap: nowrap; align-items: flex-start; gap: 10px; margin: 0; font-size: 13px; line-height: 1.45; color: var(--color-neutral-300); max-width: none; }
.osc-table-foot .note::before { content: ""; width: 6px; height: 6px; margin-top: 6px; background: var(--color-accent); flex: none; }
.osc-table-foot .actions { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; }
.osc-table-foot .osc-copie-ok { font: 400 12px/1 var(--mono); letter-spacing: .06em; text-transform: uppercase; color: var(--color-neutral-500); }

/* Tableau dense (pages tarifs, 62 lignes) */
.osc-table--dense .osc-th { padding: 9px 8px; font-size: 12px; }
.osc-table--dense .osc-td.brand { font-size: 13px; } .osc-table--dense .osc-td.brand::before { display: none; }
.osc-table--dense .osc-td.num { font-size: 13px; }
.osc-table--dense .osc-td.meta { font-size: 12px; gap: 6px; }
.osc-table--dense .osc-td.meta::before { content: ""; width: 5px; height: 5px; background: var(--color-accent); flex: none; }
@media (min-width: 720px) { .osc-table--dense .osc-td { padding: 9px 8px; } .osc-table--dense .osc-td:first-child { padding-left: 0; } .osc-table--dense .osc-td:last-child { padding-right: 0; } }

/* Barre d'outils (filtre + segmenté) et pagination */
.osc-toolbar { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-bottom: 16px; }
.osc-toolbar > .osc-frame { flex: 1 1 200px; min-width: 0; }
.osc-toolbar form { display: contents; }
/* Le pagineur du comparateur débordait à 360 px dès sept pages : sept cibles de 44 px plus les
   flèches font 405 px, et rien ne l'autorisait à passer à la ligne. Il s'enroule maintenant. */
.osc-pager { display: inline-flex; flex-wrap: wrap; justify-content: center; max-width: 100%; padding: 1px; gap: 1px; margin: 0; list-style: none; background: var(--osc-rule); }
.osc-pager > * { display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; padding: 0; margin: 0; border: 0; background: var(--osc-night); color: inherit; text-decoration: none; font: 600 12px/1 var(--corps); cursor: pointer; }
.osc-pager > *:hover { background: var(--osc-night-2); }
.osc-pager > [aria-current="page"] { background: var(--osc-accent-texte); color: #f3f2f2; font-weight: 800; }
.osc-pager > [aria-disabled="true"], .osc-pager > :disabled { color: var(--color-neutral-500); cursor: default; background: var(--osc-night); }
.osc-pager > *:focus-visible { outline: 2px solid var(--color-accent-400); outline-offset: -2px; }
.osc-pager .icone { width: 16px; height: 16px; }
@media (min-width: 720px) { .osc-pager > * { width: 34px; height: 34px; } }
.osc-pager-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 14px; flex-wrap: wrap; }
.osc-pager-row .count { font: 400 12px/1 var(--mono); letter-spacing: .06em; text-transform: uppercase; color: var(--color-neutral-500); }
html:not([data-js]) .osc-pager-row { display: none; }
/* m6 : sans script, la ligne « Détails » ne s'ouvre pas et la bascule du mot de passe ne bascule pas.
   Plutôt que de laisser 40 boutons inertes dans l'ordre de tabulation, on ne les affiche pas ; aucune
   donnée n'est perdue, le détail reprend des valeurs déjà présentes dans la ligne et la fiche de la
   marque reste à un clic (lien de la colonne Marque). */
html:not([data-js]) .osc-td.meta .osc-toggle { display: none; }
/* Contre-audit accessibilité : quatre boutons de tri restaient visibles et inertes sans JavaScript.
   Le bouton disparaît, son libellé reste : `display: contents` laisse le texte de la colonne à sa
   place, sans commande qui promet une action impossible. Le chevron, lui, n'a plus de sens. */
html:not([data-js]) .osc-th-tri { display: contents; pointer-events: none; }
html:not([data-js]) .osc-th-tri .sort, html:not([data-js]) .osc-th-tri .vh { display: none; }
html:not([data-js]) .osc-copie { display: none; }   /* « Copier le tableau » n'existe que par le script */
html:not([data-js]) .mdp-bascule { display: none; }
html:not([data-js]) .mdp-groupe input, html:not([data-js]) .mdp-groupe .osc-input { padding-right: 12px; }

/* ---------- Liste actualité ---------- */
.osc-news { display: grid; grid-template-columns: 56px minmax(0, 1fr); border-top: 2px solid rgba(243,242,242,.6); }
.osc-news-item { display: grid; grid-template-columns: subgrid; grid-column: 1 / -1; align-items: center; gap: 0 16px; padding: 18px 0; margin: 0; text-decoration: none; color: var(--osc-ink-on-night); border-bottom: 1px solid var(--osc-rule-section); transition: background .15s; }
.osc-news-item:hover { background: var(--osc-night-2); }
.osc-news-item:focus-visible { outline: 2px solid var(--color-accent-400); outline-offset: -2px; }
.osc-news-item .date { display: flex; flex-direction: column; gap: 2px; margin: 0; }
.osc-news-item .date .d { font: 800 30px/1 var(--corps); letter-spacing: -.02em; }
.osc-news-item .date .m { font: 400 12px/1 var(--mono); letter-spacing: .12em; text-transform: uppercase; color: var(--color-neutral-500); }
.osc-news-item .body { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.osc-news-item .body h2, .osc-news-item .body h3 { margin: 0; font: 800 17px/1.25 var(--corps); letter-spacing: 0; text-wrap: pretty; color: inherit; }
.osc-news-item .body p { margin: 0; font-size: 13px; line-height: 1.5; color: var(--color-neutral-300); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.osc-news-item .body .src { font: 400 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--color-neutral-500); margin: 0; }
.osc-news-item .osc-logo { display: none; }
.osc-logo { position: relative; width: 56px; height: 56px; flex: none; background: #f3f2f2; display: flex; align-items: center; justify-content: center; overflow: hidden; border: 0; clip-path: none; box-shadow: none; }
.osc-logo img { width: 100%; height: 100%; object-fit: contain; padding: 6px; filter: grayscale(1) contrast(1.08); }
.osc-logo .fallback { font: 800 12px/1.1 var(--corps); color: #201e1d; text-align: center; padding: 4px; letter-spacing: 0; }
.osc-logo::after { content: ""; position: absolute; right: 5px; bottom: 5px; width: 5px; height: 5px; background: var(--color-accent); }
@media (min-width: 560px) {
  .osc-news { grid-template-columns: 72px minmax(0, 1fr) 56px; }
  .osc-news-item { gap: 0 20px; }
  .osc-news-item .osc-logo { display: flex; }
}

/* ---------- Grille de marques : cellules à filets partagés ---------- */
.osc-brands { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr)); gap: 1px; margin: 0; padding: 0 0 1px; list-style: none; background: var(--osc-rule-section); border-top: 2px solid rgba(243,242,242,.6); }
.osc-brand { display: flex; flex-direction: column; gap: 12px; padding: 20px; margin: 0; background: var(--osc-night); text-decoration: none; color: var(--osc-ink-on-night); min-width: 0; clip-path: none; box-shadow: none; transition: background .15s; }
.osc-brand:hover { background: var(--osc-night-2); }
.osc-brand:focus-visible { outline: 2px solid var(--color-accent-400); outline-offset: -2px; }
.osc-brand .head { display: flex; align-items: center; gap: 14px; min-width: 0; }
.osc-brand .head .osc-logo { width: 52px; height: 52px; }
.osc-brand .head h2, .osc-brand .head h3 { margin: 0; font: 800 18px/1.15 var(--corps); letter-spacing: 0; text-wrap: pretty; color: inherit; min-width: 0; }
.osc-brand p { margin: 0; font-size: 13px; line-height: 1.5; color: var(--color-neutral-300); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; max-width: none; }
.osc-brand .meta { font: 400 12px/1.3 var(--mono); letter-spacing: .06em; color: var(--color-neutral-500); margin-top: auto; }
.osc-brand--compact { flex-direction: row; align-items: center; padding: 14px 16px; min-height: 64px; }
.osc-brand--compact .head h3 { font-size: 15px; }
.osc-brand--compact .head .osc-logo { width: 44px; height: 44px; }
.osc-brand--compact .devis { display: block; font: 400 12px/1 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--color-neutral-500); margin-top: 4px; }

/* ---------- Lien de fin de section ---------- */
.osc-more { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; margin-top: 20px; text-decoration: none; color: var(--osc-ink-on-night); font: 600 14px/1.2 var(--corps); }
.osc-more::before { content: ""; width: 6px; height: 6px; background: var(--color-accent); flex: none; }
.osc-more:hover { color: var(--color-accent-400); }
.osc-more .icone { width: 16px; height: 16px; }
p > .osc-more { margin-top: 0; }

/* ---------- Icônes Lucide inline (partials/icones.html) ---------- */
.icone { width: 16px; height: 16px; flex: none; display: inline-block; vertical-align: middle; }

/* ---------- Fond clair (recto et .osc-light) ----------
   Les tokens du kit sont calibrés pour la nuit. Sur #f3f2f2 ils tombent sous les seuils : le muet à
   2,59:1, les filets de cadre à 2,41:1, l'accent clair à 1,88:1. La face claire redéfinit donc ses
   propres valeurs (3.4 de l'audit a11y, « échec latent »). Aucune page publique ne sert cette face
   aujourd'hui, la page /kit la montre côte à côte avec la face nuit. */
.osc-light {
  --color-neutral-500: #605d5d;   /* 5,83:1 sur #f3f2f2 */
  --color-neutral-600: #605d5d;
  --color-divider: color-mix(in srgb, #201e1d 55%, transparent);  /* #7f7d7d, 3,66:1 */
  --color-accent-400: #ae1800;    /* 6,41:1 : l'accent clair du kit ne se lit pas sur du clair */
  --osc-rule: color-mix(in srgb, #201e1d 55%, transparent);
  --osc-rule-frame: color-mix(in srgb, #201e1d 55%, transparent);
  --focus: #ae1800;
}
[data-face="recto"] { --color-divider: color-mix(in srgb, #201e1d 55%, transparent); --color-accent-400: #ae1800; }

[data-face="recto"] .osc-sweep, .osc-light .osc-sweep { background: var(--color-divider); }
[data-face="recto"] .osc-btn, .osc-light .osc-btn { color: var(--color-text); background: var(--color-bg); }
[data-face="recto"] .osc-btn--primary, .osc-light .osc-btn--primary { color: var(--color-bg); background: var(--osc-accent-texte); }
[data-face="recto"] .osc-btn--primary:hover, .osc-light .osc-btn--primary:hover { background: var(--osc-accent-texte-hover); }
[data-face="recto"] .osc-btn--secondary:hover, .osc-light .osc-btn--secondary:hover { background: var(--color-surface); }
[data-face="recto"] .osc-btn--secondary .arrow, [data-face="recto"] .osc-btn--secondary .icone, .osc-light .osc-btn--secondary .arrow, .osc-light .osc-btn--secondary .icone { color: var(--color-accent); }
[data-face="recto"] .osc-btn--icon-outline, .osc-light .osc-btn--icon-outline, [data-face="recto"] .osc-btn--outline, .osc-light .osc-btn--outline { border-color: var(--color-divider); color: var(--color-text); background: transparent; }
[data-face="recto"] .osc-frame, .osc-light .osc-frame { background: var(--color-divider); }
[data-face="recto"] .osc-input, [data-face="recto"] .osc-select, [data-face="recto"] .osc-frame > input, [data-face="recto"] .osc-frame > select, [data-face="recto"] .osc-frame > textarea,
.osc-light .osc-input, .osc-light .osc-select, .osc-light .osc-frame > input, .osc-light .osc-frame > select, .osc-light .osc-frame > textarea { background: var(--color-surface); color: var(--color-text); }
[data-face="recto"] .osc-field, [data-face="recto"] .osc-radio, [data-face="recto"] .osc-check, [data-face="recto"] .osc-seg .opt, .osc-light .osc-field, .osc-light .osc-radio, .osc-light .osc-check, .osc-light .osc-seg .opt { color: var(--color-text); }
[data-face="recto"] .osc-field > .label, [data-face="recto"] .osc-label, .osc-light .osc-field > .label, .osc-light .osc-label { color: var(--color-neutral-700); }
[data-face="recto"] .osc-field > .error, [data-face="recto"] .osc-error, .osc-light .osc-field > .error, .osc-light .osc-error { color: var(--color-accent-700); }
[data-face="recto"] .osc-radio .box, [data-face="recto"] .osc-check .box, .osc-light .osc-radio .box, .osc-light .osc-check .box { border-color: var(--color-divider); }
[data-face="recto"] .osc-radio input:checked + .box, .osc-light .osc-radio input:checked + .box { box-shadow: inset 0 0 0 4px var(--color-bg); }
[data-face="recto"] .osc-seg, .osc-light .osc-seg { background: var(--color-divider); }
[data-face="recto"] .osc-seg .opt, .osc-light .osc-seg .opt { background: var(--color-bg); }
[data-face="recto"] .osc-seg .opt:hover, .osc-light .osc-seg .opt:hover { background: var(--color-surface); }
[data-face="recto"] .osc-seg .opt:has(input:checked), [data-face="recto"] .osc-seg .opt[aria-current], .osc-light .osc-seg .opt:has(input:checked), .osc-light .osc-seg .opt[aria-current] { color: var(--color-bg); background: var(--osc-accent-texte); }
[data-face="recto"] .osc-ghost, .osc-light .osc-ghost { color: var(--color-text); }
[data-face="recto"] .osc-ghost:hover, .osc-light .osc-ghost:hover { color: var(--color-accent-700); }
[data-face="recto"] .osc-table, [data-face="recto"] .osc-news, [data-face="recto"] .osc-brands, .osc-light .osc-table, .osc-light .osc-news, .osc-light .osc-brands { border-top-color: var(--color-divider); color: var(--color-text); }
[data-face="recto"] .osc-th, .osc-light .osc-th { color: var(--color-neutral-700); border-bottom-color: var(--color-divider); }
[data-face="recto"] .osc-th[aria-sort="ascending"] .sort-asc, [data-face="recto"] .osc-th[aria-sort="descending"] .sort-desc, .osc-light .osc-th[aria-sort="ascending"] .sort-asc, .osc-light .osc-th[aria-sort="descending"] .sort-desc { color: var(--color-accent); }
[data-face="recto"] .osc-table .osc-tr, [data-face="recto"] .osc-news-item, .osc-light .osc-table .osc-tr, .osc-light .osc-news-item { border-bottom-color: var(--color-divider); color: var(--color-text); }
[data-face="recto"] .osc-table .osc-tr:hover, [data-face="recto"] .osc-news-item:hover, [data-face="recto"] .osc-brand:hover, [data-face="recto"] .osc-pager > *:hover, .osc-light .osc-table .osc-tr:hover, .osc-light .osc-news-item:hover, .osc-light .osc-brand:hover, .osc-light .osc-pager > *:hover { background: var(--color-surface); }
[data-face="recto"] .osc-td.num.is-muted, [data-face="recto"] .osc-td.gap.is-muted, [data-face="recto"] .osc-td .is-muted, .osc-light .osc-td.num.is-muted, .osc-light .osc-td.gap.is-muted, .osc-light .osc-td .is-muted { color: var(--color-neutral-600); }
[data-face="recto"] .osc-td.gap, .osc-light .osc-td.gap { color: var(--color-accent-700); }
[data-face="recto"] .osc-td.meta, .osc-light .osc-td.meta { color: var(--color-neutral-700); }
[data-face="recto"] .osc-td.meta a, .osc-light .osc-td.meta a { color: var(--color-accent-700); }
[data-face="recto"] .osc-detail-inner, [data-face="recto"] .osc-brand, [data-face="recto"] .osc-pager > *, .osc-light .osc-detail-inner, .osc-light .osc-brand, .osc-light .osc-pager > * { background: var(--color-bg); color: var(--color-text); }
[data-face="recto"] .osc-brands, [data-face="recto"] .osc-pager, .osc-light .osc-brands, .osc-light .osc-pager { background: var(--color-divider); }
[data-face="recto"] .osc-pager > [aria-current="page"], .osc-light .osc-pager > [aria-current="page"] { background: var(--osc-accent-texte); color: var(--color-bg); }
[data-face="recto"] .osc-stat .v.accent, .osc-light .osc-stat .v.accent { color: var(--color-accent-700); }
[data-face="recto"] .osc-more, [data-face="recto"] .osc-brand .head h2, [data-face="recto"] .osc-brand .head h3, .osc-light .osc-more, .osc-light .osc-brand .head h3 { color: var(--color-text); }
[data-face="recto"] .osc-more:hover, .osc-light .osc-more:hover { color: var(--color-accent-700); }
[data-face="recto"] .osc-brand p, [data-face="recto"] .osc-section-head .lead, [data-face="recto"] .osc-table-foot .note, .osc-light .osc-brand p, .osc-light .osc-section-head .lead, .osc-light .osc-table-foot .note { color: var(--color-neutral-700); }
[data-face="recto"] .osc-form-card, .osc-light .osc-form-card { border-color: var(--color-divider); color: var(--color-text); }
[data-face="recto"] .osc-rule, .osc-light .osc-rule { background: var(--color-divider); }
.osc-light { background: var(--color-bg); color: var(--color-text); }

/* ---------- Page interne /kit/ : mise en page de démonstration (jamais utilisée ailleurs) ---------- */
.kit-demo { display: grid; grid-template-columns: 1fr; gap: 16px; padding: 28px 0; border-bottom: 2px solid var(--osc-rule-section); }
@media (min-width: 720px) { .kit-demo { grid-template-columns: 180px minmax(0, 1fr); gap: 24px; } }
.kit-demo-titre { margin: 0 0 6px; font: 400 12px/1 var(--mono); letter-spacing: .14em; text-transform: uppercase; color: var(--color-accent-400); }
.kit-demo-note { margin: 0; font-size: 12px; line-height: 1.5; color: var(--color-neutral-500); }
.kit-row { display: flex; gap: 12px; flex-wrap: wrap; align-items: flex-start; }
.kit-row--bas { align-items: flex-end; }
.kit-col { display: flex; flex-direction: column; gap: 20px; min-width: 0; }
.kit-stack { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
.kit-cap { font: 400 11px/1 var(--mono); letter-spacing: .06em; text-transform: uppercase; color: var(--color-neutral-500); }
.kit-grid3, .kit-grid2 { display: grid; grid-template-columns: 1fr; gap: 20px 16px; }
@media (min-width: 560px) { .kit-grid2 { grid-template-columns: repeat(2, minmax(0, 240px)); } }
@media (min-width: 720px) { .kit-grid3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.kit-span-3 { grid-column: 1 / -1; }
/* La planche du kit montre l'état de survol : elle doit montrer la VRAIE couleur de survol, qui
   est passée à #ae1800 quand le primaire a été foncé pour 1.4.3 (B4). */
.kit-survol { background: var(--osc-accent-texte-hover) !important; }
.kit-presse { background: var(--color-accent-700) !important; }
.kit-focus { outline: 2px solid var(--color-accent-400); outline-offset: 2px; }
.kit-marge-6 { margin-top: 6px; }
.kit-light { padding: 28px 16px; margin-inline: -16px; }
@media (min-width: 600px) { .kit-light { padding: 28px 32px; margin-inline: -32px; } }
.kit-section { padding: 32px 0; border-bottom: 2px solid var(--osc-rule-section); }
.kit-section.kit-light { border-bottom: 0; }
html:not([data-js]) .osc-pager-row.kit-pager-visible, .osc-pager-row.kit-pager-visible { display: flex; }

/* ---------- Formulaires (commit 3) : cibles tactiles 44 px sous 768 px, grille à une colonne, filtres de l'annuaire ---------- */
.osc-form-grid--1, .osc-form-grid.osc-form-grid--1 { grid-template-columns: 1fr; }
.osc-form-card .osc-form-grid { min-width: 0; }
.osc-chip { min-height: 44px; }
.osc-seg .opt { min-height: 44px; }
.osc-radio, .osc-check { min-height: 44px; }
.osc-check--consent { min-height: 0; }
@media (min-width: 768px) {
  .osc-chip { min-height: 0; }
  .osc-seg .opt { min-height: 36px; }
  .osc-radio, .osc-check { min-height: 32px; }
}
/* Contre-audit accessibilité (1.4.10) : à 320 px, le widget anti-robot imposait 300 px + 34 px de
   cadre dans une boîte de 288, et faisait défiler toute la page horizontalement. Il se contracte
   maintenant, et aucun enfant de grille ne peut plus imposer sa largeur minimale à la colonne. */
.osc-form-card .cf-turnstile { min-height: 65px; max-width: 100%; overflow-x: auto; }
.cf-turnstile, .cf-turnstile iframe { max-width: 100%; }
.formulaire-cadre > *, .osc-form-card, .osc-form-grid > * { min-width: 0; }
.osc-toolbar--filtres { align-items: flex-end; }
.osc-toolbar--filtres .osc-field { flex: 1 1 200px; min-width: 0; }
.osc-toolbar--filtres .osc-toolbar-action { flex: 1 1 100%; }
@media (min-width: 720px) { .osc-toolbar--filtres .osc-toolbar-action { flex: 0 0 auto; } }
.formulaire-etroit .osc-form-card { max-width: none; }
.page-contact .osc-form-card, .page-revendiquer .osc-form-card { max-width: 640px; }

/* ---------- Tableaux, listes et grilles (commit 4) ---------- */
.osc-seg-form { display: inline-flex; align-items: center; gap: 10px; flex-wrap: wrap; }
html[data-js] .osc-seg-submit { display: none; }
/* 3.2.2 : quand le serveur n'a envoyé qu'un type de mouvement, le segmenté ne peut plus filtrer côté
   client. Il ne soumet plus au changement (c'était un rechargement par flèche du clavier) : le bouton
   « Filtrer » réapparaît et devient la commande explicite (M1). */
html[data-js] .osc-seg-form[data-filtre-serveur] .osc-seg-submit { display: inline-flex; }
html:not([data-js]) .osc-toolbar > .osc-frame, html:not([data-js]) .osc-toggle { display: none; }
.osc-brands--compact { grid-template-columns: repeat(auto-fill, minmax(min(200px, 100%), 1fr)); }
.osc-brand--compact .head h3 .devis { display: block; font: 400 12px/1 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--color-neutral-500); margin-top: 4px; }
.page-marques .section .osc-brands + .osc-brands { margin-top: 1px; }


/* ---------- Commit 5 : grille officielle en tableau dense, tri en mobile ---------- */
.osc-td .devise-note--gauche { text-align: left; font-family: var(--corps); }
.osc-table--grille .osc-td.brand { font-weight: 800; font-size: 13px; line-height: 1.3; }
.osc-table--grille .osc-td.brand > span { display: block; }
.osc-table--grille .osc-td.num .devise-note { display: block; }
.osc-table--grille .osc-tr--sep td .etiquette { margin: 0; }
.osc-table--grille + .tableau-pied { margin-top: var(--sp-5); }
.osc-tri-mobile { display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }
.osc-tri-mobile .osc-seg { width: 100%; }
.osc-tri-mobile .opt { min-height: 44px; flex: 1 1 auto; justify-content: center; gap: 6px; }
.osc-tri-mobile .opt .sort { display: inline-flex; }
.osc-tri-mobile .opt .sort .icone { width: 14px; height: 14px; }
.osc-tri-mobile .opt .sort-asc, .osc-tri-mobile .opt .sort-desc { display: none; }
.osc-tri-mobile .opt[data-sens="ascending"] .sort-asc { display: inline-flex; }
.osc-tri-mobile .opt[data-sens="descending"] .sort-desc { display: inline-flex; }
.osc-tri-mobile .opt[aria-pressed="true"] { background: var(--osc-accent-texte); color: #f3f2f2; font-weight: 600; }
html:not([data-js]) .osc-tri-mobile { display: none; }
@media (min-width: 720px) { .osc-tri-mobile { display: none; } }

/* ---------- Commit 6 : retours du propriétaire ----------
   1. Centrage vertical : mesuré sur les pixels (échelle 2), l'encre d'un libellé Archivo 800/600 à 14 px sort 1 à
   1,5 px trop haut dans sa boîte ; L (16 px) et S (12 px) sont dans la tolérance. Le libellé de la taille par
   défaut descend de 1 px ; le select remonte son texte (7/9). Cible : écart haut/bas < 1 px. */
.osc-btn:not(.osc-btn--lg):not(.osc-btn--sm) > span:not(.osc-balancier) { position: relative; top: 1px; }
.osc-ghost > span, .osc-more > span { position: relative; top: 1px; }
.osc-frame > input, .osc-frame > select, .osc-input:not(textarea), .osc-select { padding-top: 8.5px; padding-bottom: 7.5px; }

/* 3. Infobulle « Au registre » en superposition : sous le bouton, alignée à sa gauche (--infobulle-x posé par
   site.js), retournée vers la gauche si elle déborde du viewport ; au-dessus des cartes voisines. */
.pont-atelier-etat { position: relative; }
.infobulle-texte { position: absolute; top: calc(100% + 6px); left: var(--infobulle-x, 0); right: auto; z-index: 30; width: min(280px, calc(100vw - 32px)); max-width: none; margin: 0; flex: none; }

/* 4. Espace entre un groupe de contrôles (note, segmenté, puces, cases) et son aide ou son erreur : 10 px au moins */
.note-choix .osc-help, .note-choix .osc-error, .note-choix .champ-erreur, .note-choix .champ-aide { margin-top: 10px; }
.osc-field > .osc-seg ~ .help, .osc-field > .osc-chips ~ .help, .osc-field > .osc-choix-liste ~ .help,
.osc-field > .osc-seg ~ .osc-help, .osc-field > .osc-chips ~ .osc-help, .osc-field > .osc-choix-liste ~ .osc-help,
.osc-field > .osc-seg ~ .osc-error, .osc-field > .osc-chips ~ .osc-error, .osc-field > .osc-choix-liste ~ .osc-error { margin-top: 4px; }

/* 5. Une de /actus/ : bloc texte centré sur la photo, extrait et « Lire la suite » */
.osc-news-item--une { grid-template-columns: 72px minmax(0, 1fr); border-bottom: 0; align-items: start; }
.osc-news-item--une .date { padding-top: 6px; }
.osc-news-item--une .body h2 { font-size: 24px; letter-spacing: -.015em; }
.osc-news-item--une .body h2 a { color: inherit; text-decoration: none; }
.osc-news-item--une .body h2 a:hover { color: var(--color-accent-400); }
.osc-news-item--une .body .extrait { display: block; -webkit-line-clamp: unset; overflow: visible; font-size: 15px; line-height: 1.55; margin-top: 4px; }
.osc-news-item--une .body .osc-more { margin-top: 8px; }
.osc-news-item--une:hover { background: transparent; }
@media (min-width: 960px) { .manchette-vedette { align-items: center; } }

/* ---------- Relevés de prix des membres (SPEC_RELEVES.md, commit 7) : déclaré, relu, jamais vérifié. Index muet
   #9b9797 en carré et kicker « Relevé de membre » : ni le rouge de l'officiel ni celui des indépendants cités. ---------- */
.releve-index { display: inline-block; width: 6px; height: 6px; background: var(--color-neutral-500); flex: none; vertical-align: middle; }
.osc-kicker--membre { color: var(--color-neutral-500); }
.releve-entete { display: flex; align-items: center; gap: var(--sp-4); margin: var(--sp-3) 0 var(--sp-4); }
.releve-entete h1 { font-size: var(--fs-titre-3); line-height: 1.1; }
.releve-entete .osc-kicker { margin-bottom: 6px; }
.releve-honnete { display: flex; align-items: flex-start; gap: 10px; margin: 0; font-size: 13px; line-height: 1.45; color: var(--texte-secondaire); max-width: none; }
.releve-honnete::before { content: ""; width: 6px; height: 6px; margin-top: 6px; background: var(--color-neutral-500); flex: none; }
.releves-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1px; margin-bottom: 20px; padding-bottom: 1px; background: var(--osc-rule-section); border-top: 2px solid rgba(243,242,242,.6); }
@media (min-width: 720px) { .releves-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.releves-stats .osc-stat { background: var(--fond); padding: 16px; }
.releves-stats .osc-stat .v.is-muted { color: var(--color-neutral-500); font-size: 16px; }
.releves-liste { list-style: none; margin: 0; padding: 0; border-top: 2px solid rgba(243,242,242,.6); }
.releve-membre { display: grid; grid-template-columns: 1fr; gap: 6px 20px; padding: 16px 0; border-bottom: 1px solid var(--osc-rule-section); }
@media (min-width: 720px) {
  .releve-membre { grid-template-columns: minmax(0, 1.5fr) minmax(0, .7fr) minmax(0, 1.2fr); align-items: start; }
  .releve-membre .releve-commentaire, .releve-membre .releve-statut, .releve-membre .avis-actions { grid-column: 1 / -1; }
  .releve-membre > div:nth-child(2) { text-align: right; }
}
.releve-prestation { display: flex; align-items: flex-start; gap: 10px; font: 800 15px/1.3 var(--corps); }
.releve-prestation .releve-index { margin-top: 7px; }
.releve-prestation .detail { font-weight: 400; font-size: 13px; color: var(--texte-secondaire); }
.releve-montant { font: 500 15px/1.3 var(--mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
.releve-montant .approx { color: var(--texte-doux); font-size: 12px; margin-left: 6px; }
.releve-meta { font: 400 12px/1.5 var(--mono); letter-spacing: .02em; color: var(--texte-doux); }
.releve-meta a { color: var(--texte-secondaire); }
.releve-commentaire { margin: 0; font-size: 14px; line-height: 1.5; color: var(--texte-secondaire); max-width: 70ch; }
.releve-statut { margin: 0; }
.releve-membre .avis-actions { margin-top: 0; }
.tableau-pied .releve-honnete { flex: 1 1 320px; }
.releves-page { display: grid; gap: var(--sp-6); }
@media (min-width: 960px) { .releves-page { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: var(--sp-7); align-items: start; } }
.releves-marques { list-style: none; margin: 0; padding: 0; border-top: 2px solid rgba(243,242,242,.6); }
.releves-marques a { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 44px; padding: 8px 0; border-bottom: 1px solid var(--osc-rule-section); color: var(--texte); text-decoration: none; font: 600 14px/1.2 var(--corps); }
.releves-marques a .n { font: 500 13px/1 var(--mono); color: var(--texte-doux); }
.releves-marques a:hover { color: var(--rubis-texte); }
.osc-td.brand--logo a { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; }
@media (min-width: 720px) { .osc-td.brand--logo a { min-height: 0; } }
.osc-td.brand--logo .osc-logo { width: 28px; height: 28px; }
.osc-td.brand--logo .osc-logo img { padding: 3px; }
.osc-td.brand--logo .osc-logo::after { display: none; }
.osc-td.brand--logo .osc-logo .fallback { font-size: 7px; }
.osc-table--releves .osc-td.type .devise-note--gauche a { color: var(--texte-secondaire); }
/* Montant et devise dans un même cadre */
.osc-frame--montant { position: relative; }
.osc-frame--montant > select { flex: 0 0 auto; width: auto; min-width: 88px; padding-right: 32px; border-left: 1px solid var(--osc-rule); cursor: pointer; }
.osc-frame--montant::after { content: ""; position: absolute; right: 12px; top: 50%; width: 8px; height: 8px; margin-top: -6px; border-right: 1.5px solid var(--color-neutral-500); border-bottom: 1.5px solid var(--color-neutral-500); transform: rotate(45deg); pointer-events: none; }
.osc-table--releves .osc-td.meta::before { background: var(--color-neutral-500); }
.osc-td.brand--logo .osc-logo .fallback { display: none; }
.osc-td.brand--logo .osc-logo::before { content: ""; width: 10px; height: 10px; background: #201e1d; opacity: .15; }

/* ---------- Commit 8 : admin lisible, note compacte des cartes ---------- */
.admin-depliants { gap: var(--sp-2); }
.admin-depliant summary { gap: var(--sp-3); flex-wrap: wrap; }
.admin-depliant-resume { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-4); font-family: var(--corps); font-weight: 400; font-size: 14px; color: var(--texte); }
.admin-depliant-resume strong { font-weight: 800; }
.admin-depliant-resume .mono { font-size: 12px; }
.admin-depliant .depliant-corps { display: flex; flex-direction: column; gap: var(--sp-4); }
.admin-infos-larges div { grid-template-columns: 110px 1fr; }
.admin-infos-larges .admin-info-pleine { grid-column: 1 / -1; }
.admin-infos-larges .admin-avis-texte { font-size: 14px; }
.admin-avis-actions form { margin: 0; }
.carte-note a { text-decoration: none; }
.note--compacte { gap: var(--sp-2); }
.note--compacte .note-chiffre { font-size: 1rem; }
.note--compacte .note-segment { width: 10px; height: 5px; }
.note--compacte .note-mot { font-size: 12px; font-weight: 400; }

/* ---------- Commit 9 : point d'entrée des relevés en en-tête de marque, ligne dépliée avec deux actions ---------- */
.entete-marque-actions { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin: var(--sp-4) 0 0; }
.entete-marque-note { margin: 8px 0 0; }
.osc-detail-inner .osc-stat--action { flex-direction: row; flex-wrap: wrap; gap: 8px; }
.osc-detail-inner .osc-stat--action > .osc-btn { flex: 1 1 100%; }
@media (min-width: 720px) {
  .osc-detail-inner .osc-stat--action { flex-direction: column; align-items: stretch; justify-content: flex-end; }
  .osc-detail-inner .osc-stat--action > .osc-btn { flex: 0 0 auto; }
}
.osc-detail-inner .title a { color: inherit; text-decoration: none; }
.osc-detail-inner .title a:hover { color: var(--color-accent-400); }
@media (min-width: 960px) and (max-width: 1099px) { .nav-principale { gap: 18px; } .entete-devis .osc-btn--nav { min-width: 0; } }
.releves-entree { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3) var(--sp-4); margin: var(--sp-4) 0 var(--sp-6); }
.releves-entree .osc-help { margin: 0; font-size: 13px; }

/* ---------- Commit 10 : recherche d'atelier (combobox), calendrier, second bouton d'en-tête ---------- */
.recherche-atelier-zone { position: relative; }
.recherche-atelier-resultats { position: absolute; left: 0; right: 0; top: calc(100% + 2px); z-index: 25; margin: 0; padding: 0; list-style: none; max-height: 288px; overflow-y: auto; background: var(--fond); border: 1px solid var(--osc-rule); }
.recherche-atelier-resultats li { display: flex; align-items: center; gap: 10px; min-height: 44px; padding: 10px 12px; font-size: 14px; line-height: 1.3; color: var(--texte); cursor: pointer; border-bottom: 1px solid var(--osc-rule-section); }
.recherche-atelier-resultats li:last-child { border-bottom: 0; }
.recherche-atelier-resultats li .lieu { color: var(--texte-doux); font-size: 12px; font-family: var(--mono); }
.recherche-atelier-resultats li[aria-selected="true"], .recherche-atelier-resultats li:hover { background: var(--surface-2); }
.recherche-atelier-resultats li.vide { color: var(--texte-doux); cursor: default; }
.recherche-atelier-resultats li.vide:hover { background: transparent; }
.recherche-atelier-choix { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin: 0; font-size: 14px; color: var(--texte); }
.recherche-atelier-choix .osc-btn--sm { min-height: 32px; padding: 6px 10px; }
html[data-js] .recherche-atelier-repli { display: none; }
.entete-marque-actions .osc-ghost { padding-inline: 0; }

/* ---------- Commit 11 : répartition en clair, tableau dense des relevés de membres ---------- */
.repartition-lieux { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; font-size: 14px; line-height: 1.3; }
.repartition-lieux strong { font-weight: 800; }
.repartition-lieux .mediane { color: var(--texte-doux); font-family: var(--mono); font-size: 12px; }
.osc-stat--repartition .s { margin-top: 2px; }
.membre-prestation-bloc { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.membre-libelle .detail { font-weight: 400; font-size: 12px; color: var(--texte-secondaire); }
.membre-sous { font: 400 12px/1.4 var(--mono); letter-spacing: .02em; color: var(--texte-doux); }
.membre-commentaire { font: italic 400 12px/1.45 var(--corps); color: var(--texte-secondaire); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; max-width: 60ch; }
.osc-table--membres .osc-td.brand { align-items: flex-start; }
.osc-table--membres .osc-td.meta::before { background: var(--color-neutral-500); }
.osc-table--membres .osc-td.type .devise-note--gauche a { color: var(--texte-secondaire); }
.membre-pseudo { font-family: var(--mono); font-size: 12px; }
@media (min-width: 720px) {
  .osc-table--dense.osc-table--membres { grid-template-columns: minmax(0, 1.8fr) minmax(0, .8fr) minmax(0, 1.2fr) minmax(0, .8fr) minmax(0, .9fr); }
  .osc-table--dense.osc-table--membres-marque { grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr) minmax(0, .8fr) minmax(0, 1.2fr) minmax(0, .8fr); }
  .osc-table--membres .osc-td { align-self: start; }
}

/* ==========================================================================================
   2.2.2 Mettre en pause, arrêter, masquer — commande globale « Réduire les animations »
   ------------------------------------------------------------------------------------------
   Le pied de page de toutes les pages porte un bouton qui pose data-mouvement="off" sur <html>
   et mémorise le choix (localStorage, static/js/mouvement.js, lu AVANT le premier rendu pour
   qu'aucune animation ne démarre). L'attribut coupe exactement ce que coupe
   prefers-reduced-motion : trotteuses, bandeau d'indice, apparitions, parallaxes, compteurs,
   transitions de page, défilement doux. La trotteuse du kit reste dessinée, elle ne tourne plus.
   ========================================================================================== */
html[data-mouvement="off"] { scroll-behavior: auto; }
html[data-mouvement="off"] *,
html[data-mouvement="off"] *::before,
html[data-mouvement="off"] *::after {
  animation-duration: 1ms !important;
  animation-delay: 0ms !important;
  animation-iteration-count: 1 !important;
  transition-duration: 1ms !important;
  transition-delay: 0ms !important;
}
html[data-mouvement="off"] .osc-sweep::before,
html[data-mouvement="off"] .osc-frame:focus-within::before,
html[data-mouvement="off"] .bande-indice-piste,
html[data-mouvement="off"] .osc-balancier::after,
html[data-mouvement="off"] .rubis[data-recent="true"] { animation: none !important; }
html[data-mouvement="off"] .osc-balancier::after { transform: rotate(38deg); }
html[data-mouvement="off"] .bande-indice-defile { overflow-x: auto; -webkit-mask-image: none; mask-image: none; }
html[data-mouvement="off"] .bande-indice-liste[aria-hidden="true"] { display: none; }
html[data-mouvement="off"] .bande-indice-pause { display: none; }
html[data-mouvement="off"] .reveal, html[data-mouvement="off"] .reveal:not(.est-visible) { opacity: 1; transform: none; }
html[data-mouvement="off"] .ecart-segment { width: var(--part, 30%); }
html[data-mouvement="off"] .piece-trait path,
html[data-mouvement="off"] .piece-trait circle,
html[data-mouvement="off"] .piece-trait rect { stroke-dashoffset: 0; }
html[data-mouvement="off"] .bande-photo img { inset: 0; height: 100%; }
html[data-mouvement="off"] ::view-transition-old(root),
html[data-mouvement="off"] ::view-transition-new(root) { animation: none !important; }

/* Le bouton lui-même : texte + témoin carré rempli quand la réduction est active. Le libellé ne
   change pas, c'est aria-pressed qui porte l'état (règle du kit pour Afficher / Masquer). */
.pied-mouvement { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; padding: 10px 0; margin: 0; border: 0; background: none; color: var(--texte-secondaire); font: 600 14px/1.2 var(--corps); text-align: left; cursor: pointer; }
.pied-mouvement::before { content: ""; width: 14px; height: 14px; flex: none; border: 1px solid rgba(243,242,242,.45); background: transparent; }
.pied-mouvement[aria-pressed="true"]::before { background: var(--rubis); border-color: var(--rubis); }
.pied-mouvement:hover { color: var(--texte); }
.pied-mouvement:hover::before { border-color: var(--texte); }
.pied-mouvement:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.pied-mouvement .etat { color: var(--texte-doux); font-weight: 400; }
/* Sans script, le bouton ne pourrait rien mémoriser : il n'est pas affiché, et le site sert déjà
   son bandeau fixe (voir .bande-indice plus haut). La trotteuse reste la seule animation en boucle
   dans ce cas ; elle est purement décorative et ne porte aucune information. */
html:not([data-js]) .pied-mouvement { display: none; }
@media (prefers-reduced-motion: reduce) { .bande-indice-pause { display: none; } }


/* Sous-titre du h1 des pages de tarif : le nom de la marque reste l'affiche du hero, la
   suite porte l'intention de recherche (défaut I3 de l'audit SEO : « h1 sans mot-clé »).
   Bloc distinct, casse normale, taille du corps : le poids visuel du hero ne bouge pas. */
h1 .h1-suite {
  display: block;
  margin-top: var(--sp-2);
  font-family: var(--corps);
  font-size: var(--fs-corps);
  font-weight: 400;
  line-height: 1.4;
  letter-spacing: 0;
  text-transform: none;
  color: var(--texte-secondaire);
  max-width: 44ch;
}
