/**
 * Vauban Onboarding — Couche de refonte UI (charte sobre, neutre, moderne).
 *
 * @version 1.0.0  (2026-05-29)
 *
 * Objectif : donner au formulaire d'onboarding v1 un rendu professionnel,
 * neutre et moderne, en pleine largeur (~1240px). Cette feuille est chargee
 * APRES le bundle `style.css` et le brand, et fournit l'integralite du chassis
 * du formulaire (tokens slate/ink coherents avec la charte Vauban : pas de
 * bleu/orange vif, pas de fond anime, pas de verre depoli).
 *
 * Portee : scopee sous `.vauban-onboarding-wrapper` / `#vauban-onboarding-container`
 * (et `#vauban-standalone-wrap` pour l'ecran disclaimer). Aucune regle globale.
 *
 * NOTE : le bloc glassmorphism inline historique de `bootstrap.php` a ete RETIRE
 * le 2026-05-30. Les neutralisations ci-dessous (fond uni, masquage des orbes)
 * sont conservees comme filet de securite : un cache de page (LiteSpeed) peut
 * servir transitoirement l'ancien HTML/JS injectant `#vauban-page-orbs` apres la
 * mise a jour, jusqu'a purge.
 */

/* =============================================================================
 * 1. Tokens (palette neutre slate/ink, scopes au formulaire + au disclaimer)
 * ========================================================================== */
.vauban-onboarding-wrapper,
#vauban-standalone-wrap {
	/* Tokens aliasés sur la couche canonique --vt-* (00-semantic-tokens.css).
	   Repli = valeur claire historique → mode CLAIR strictement inchangé ; mode
	   SOMBRE activé automatiquement sous [data-theme="dark"] / auto-OS. */
	--vo-bg: var(--vt-bg-page, #F4F5F7);
	--vo-surface: var(--vt-surface-1, #FFFFFF);
	--vo-surface-muted: var(--vt-inset, #F9FAFB);
	/* Surface de SECTION (un cran au-dessus de la carte d'étape) : donne du relief
	   aux sous-blocs en mode sombre (ils se détachent de la carte parente). En
	   clair, --vt-surface-2 n'existe pas → repli blanc = comportement inchangé. */
	--vo-section: var(--vt-surface-2, #FFFFFF);
	--vo-border: var(--vt-border, #E4E7EC);
	--vo-border-strong: var(--vt-border-strong, #D0D5DD);
	--vo-ink: var(--vt-text, #101828);
	--vo-text: var(--vt-text-soft, #344054);
	--vo-muted: var(--vt-muted, #667085);
	--vo-faint: var(--vt-muted, #98A2B3);
	/* Placeholder (texte-exemple des champs) : volontairement PLUS atténué que
	   --vo-faint pour ne jamais être confondu avec une valeur saisie. En sombre,
	   --vt-muted-strong (#64748B) reste nettement en retrait du texte réel
	   (--vo-ink ≈ blanc). En clair, repli #98A2B3 = rendu historique inchangé. */
	--vo-placeholder: var(--vt-muted-strong, #98A2B3);
	--vo-accent: var(--vt-primary, #4F46E5);          /* accent unique — indigo de marque (charte vitrine) */
	--vo-accent-hover: var(--vt-primary-strong, #4338CA);
	--vo-accent-soft: var(--vt-primary-bg, #EEF0FE);  /* tertiaire indigo très clair (fonds d'état actif) */
	--vo-accent-border: var(--vt-primary, #C7CBF8);
	--vo-success: var(--vt-success, #2F8F5C);
	--vo-success-soft: var(--vt-success-bg, #E9F5EE);
	--vo-danger: var(--vt-danger, #C8443D);
	--vo-danger-soft: var(--vt-danger-bg, #FBECEA);
	--vo-amber: var(--vt-warning, #B7791F);
	--vo-radius: 10px;
	--vo-radius-lg: 14px;
	--vo-ring: var(--vt-focus-ring, 0 0 0 4px rgba(47, 95, 208, 0.15));
	--vo-shadow-sm: var(--vt-shadow-sm, 0 1px 2px rgba(16, 24, 40, 0.05));
	--vo-shadow-card: var(--vt-shadow, 0 1px 2px rgba(16, 24, 40, 0.04), 0 4px 16px rgba(16, 24, 40, 0.05));
	/* Pancartes : surface PLEINE et sobre en clair (plus de dégradé lavande, qui
	   « bombait » la carte). En sombre, --vt-onb-card-grad reprend le dégradé navy
	   nécessaire au relief (défini dans les blocs sombres plus bas). */
	--vo-card-grad: var(--vt-onb-card-grad, var(--vt-surface-1, #FFFFFF));
	/* Ombre de contour DISCRÈTE en clair (léger décollement, sans effet 3D marqué —
	   l'ancienne 0 8px 22px faisait trop ressortir la carte). En sombre,
	   --vt-onb-card-shadow restitue l'ombre + liseré clair (décollement du fond
	   sombre). Le token PARTAGÉ --vt-card-shadow reste inchangé (4 espaces). */
	--vo-card-shadow: var(--vt-onb-card-shadow, 0 1px 2px rgba(16, 24, 40, 0.04), 0 2px 6px -3px rgba(16, 24, 40, 0.06));
	/* Champs — ombre fine + léger halo bicolore « dégradé IA » (indigo gauche / violet droite). */
	--vo-field-shadow: var(--vt-field-halo,
		0 1px 2px rgba(16, 24, 40, 0.06),
		-3px 4px 10px -6px rgba(79, 70, 229, 0.20),
		3px 4px 10px -6px rgba(124, 58, 237, 0.20));
	--vo-field-shadow-hover:
		0 1px 2px rgba(16, 24, 40, 0.07),
		-4px 6px 13px -6px rgba(79, 70, 229, 0.28),
		4px 6px 13px -6px rgba(124, 58, 237, 0.28);
	--vo-field-shadow-focus: var(--vt-onb-focus-glow,
		0 1px 2px rgba(16, 24, 40, 0.08),
		-5px 7px 17px -6px rgba(79, 70, 229, 0.38),
		5px 7px 17px -6px rgba(124, 58, 237, 0.38));
	--vo-font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}

/* =============================================================================
 * 1ter. Bloc d'info réutilisable « .vbn-infocard » — langage visuel du tunnel.
 * --------------------------------------------------------------------------
 * Convention partagée (toutes les étapes) : un bloc où l'on INFORME le
 * propriétaire (réassurance, « ce que la conciergerie prend en charge », bon à
 * savoir) se distingue d'un bloc de SAISIE (neutre / blanc) par un code couleur
 * LÉGER — fond doux (--vo-surface-muted), liseré gauche indigo (--vo-accent-border)
 * et AUCUNE ombre (aplati). Tokens --vo-* uniquement → mode sombre automatique.
 * Le contraste neutre (je saisis) ↔ liseré (on m'informe) porte tout le langage.
 * ========================================================================== */
#vauban-onboarding-container .vbn-infocard {
	position: relative;
	margin: 0 0 16px;
	padding: 18px 20px;
	background: var(--vo-surface-muted);
	border: 1px solid var(--vo-border);
	border-left: 3px solid var(--vo-accent-border);
	border-radius: var(--vo-radius);
	box-shadow: none;
}
#vauban-onboarding-container .vbn-infocard > :last-child {
	margin-bottom: 0;
}

/* =============================================================================
 * 1bis. Palette SOMBRE propre à l'onboarding (scopée sur la page via :has).
 * --------------------------------------------------------------------------
 * Surcharge la couche canonique --vt-* UNIQUEMENT sur la page du tunnel : palette
 * plus claire, étagée et teintée indigo → meilleure élévation des cartes/blocs
 * (ils se détachent du fond) + touche « IA ». N'affecte NI le mode clair NI les
 * autres espaces. Posée sur <body> pour couvrir aussi les éléments relocalisés
 * hors du wrapper (barre d'action, modales, portails infobulle/sélecteur).
 * Bloc « dark explicite » + copie « auto (OS) » à garder STRICTEMENT identiques.
 * ========================================================================== */
[data-theme="dark"] body:has(#vauban-onboarding-container) {
	/* --- Échelle d'élévation ÉLARGIE (relief « marqué mais sobre ») -----------
	   Le fond plonge plus bas et les surfaces remontent franchement : chaque
	   niveau se détache nettement du précédent (page < creux < carte < section <
	   surélevé). Écarts ~10-12 points de clarté entre marches → plus de « tout
	   au même fond ». */
	--vt-bg-page: #0E1428;          /* fond : indigo-nuit profond (référence basse) */
	--vt-inset: #18213C;            /* zones en creux (inputs, hovers) */
	--vt-surface-1: #232F52;        /* carte d'étape : nettement plus claire que le fond */
	--vt-surface-2: #2C3A63;        /* sections / pancartes internes : encore au-dessus */
	--vt-elevated: #38477059;       /* surélevé (modales, menus) */
	--vt-border: #41507C;           /* bordures franches, lisibles sur fond sombre */
	--vt-border-strong: #56689B;    /* contour accentué (cartes en relief) */
	--vt-text: #F1F4FB;             /* blanc cassé */
	--vt-text-soft: #D8DFF0;
	--vt-muted: #B8C2DA;            /* secondaire : relevé pour lisibilité (≈ 6.2–7.4:1 sur les surfaces) */
	--vt-primary: #8E97FF;          /* indigo un peu plus clair/punchy en sombre */
	--vt-primary-strong: #6D78F0;
	--vt-primary-bg: rgba(124, 108, 248, 0.20);
	--vt-primary-action: #5058D9;  /* fond bouton CTA : plus sombre que --vt-primary → WCAG AA blanc (5.5:1) */

	/* --- Surfaces & ombres de l'onboarding (relief réel) ---------------------
	   Les ombres NOIRES sont invisibles sur fond sombre : on combine une ombre
	   portée sombre (profondeur) AVEC un liseré clair interne en haut (inset) qui
	   simule la lumière rasante → la carte « décolle » visiblement du fond. Un
	   halo indigo très discret ajoute la touche « IA » sobre. */
	--vt-onb-card-grad: linear-gradient(180deg, #2C3A63 0%, #263354 100%);
	--vt-onb-elev: #38477059;
	--vt-card-shadow:
		0 1px 0 rgba(255, 255, 255, 0.05) inset,
		0 10px 26px -12px rgba(0, 0, 0, 0.66),
		0 0 0 1px rgba(120, 132, 220, 0.05);
	/* Ombre onboarding des cartes en sombre : reprend le relief partagé (les cartes
	   doivent décoller du fond sombre — contrairement au clair, volontairement plat). */
	--vt-onb-card-shadow: var(--vt-card-shadow);
	--vt-shadow-sm:
		0 1px 0 rgba(255, 255, 255, 0.04) inset,
		0 4px 12px -6px rgba(0, 0, 0, 0.55);
	--vt-shadow:
		0 1px 0 rgba(255, 255, 255, 0.05) inset,
		0 18px 40px -16px rgba(0, 0, 0, 0.72);
	--vt-shadow-pop: 0 22px 48px -14px rgba(0, 0, 0, 0.78);
	/* Champs : léger renfoncement (creux) + halo indigo discret au focus. */
	--vt-field-halo:
		0 1px 0 rgba(255, 255, 255, 0.03) inset,
		0 2px 6px -3px rgba(0, 0, 0, 0.45);
	--vt-onb-focus-glow:
		0 1px 2px rgba(0, 0, 0, 0.35),
		0 0 0 3px rgba(142, 151, 255, 0.40);
	--vt-focus-ring: 0 0 0 3px rgba(142, 151, 255, 0.40);
	/* Remappage de --color-white pour les éléments à background hardcodé blanc
	   (vauban-card, vauban-details, vauban-nested-box, deepclean-maint-card…). */
	--color-white: var(--vt-surface-1);
}
@media (prefers-color-scheme: dark) {
	[data-theme="auto"] body:has(#vauban-onboarding-container) {
		--vt-bg-page: #0E1428;
		--vt-inset: #18213C;
		--vt-surface-1: #232F52;
		--vt-surface-2: #2C3A63;
		--vt-elevated: #38477059;
		--vt-border: #41507C;
		--vt-border-strong: #56689B;
		--vt-text: #F1F4FB;
		--vt-text-soft: #D8DFF0;
		--vt-muted: #B8C2DA;            /* secondaire : relevé pour lisibilité (≈ 6.2–7.4:1 sur les surfaces) */
		--vt-primary: #8E97FF;
		--vt-primary-strong: #6D78F0;
		--vt-primary-bg: rgba(124, 108, 248, 0.20);
		--vt-primary-action: #5058D9;  /* fond bouton CTA : plus sombre que --vt-primary → WCAG AA blanc (5.5:1) */

		--vt-onb-card-grad: linear-gradient(180deg, #2C3A63 0%, #263354 100%);
		--vt-onb-elev: #38477059;
		--vt-card-shadow:
			0 1px 0 rgba(255, 255, 255, 0.05) inset,
			0 10px 26px -12px rgba(0, 0, 0, 0.66),
			0 0 0 1px rgba(120, 132, 220, 0.05);
		/* Ombre onboarding des cartes en sombre : reprend le relief partagé. */
		--vt-onb-card-shadow: var(--vt-card-shadow);
		--vt-shadow-sm:
			0 1px 0 rgba(255, 255, 255, 0.04) inset,
			0 4px 12px -6px rgba(0, 0, 0, 0.55);
		--vt-shadow:
			0 1px 0 rgba(255, 255, 255, 0.05) inset,
			0 18px 40px -16px rgba(0, 0, 0, 0.72);
		--vt-shadow-pop: 0 22px 48px -14px rgba(0, 0, 0, 0.78);
		--vt-field-halo:
			0 1px 0 rgba(255, 255, 255, 0.03) inset,
			0 2px 6px -3px rgba(0, 0, 0, 0.45);
		--vt-onb-focus-glow:
			0 1px 2px rgba(0, 0, 0, 0.35),
			0 0 0 3px rgba(142, 151, 255, 0.40);
		--vt-focus-ring: 0 0 0 3px rgba(142, 151, 255, 0.40);
		--color-white: var(--vt-surface-1);
	}
}

/* =============================================================================
 * 1ter. Disclaimer TOUJOURS en thème clair (même sous [data-theme="dark"]/auto).
 * --------------------------------------------------------------------------
 * On NEUTRALISE les surcharges --vt-* sur le seul scope de l'écran d'intro :
 * `initial` rend le token « invalide » → chaque var(--vt-X, <clair>) consommé
 * par vauban-animations.css / disclaimer-rgpd.css retombe sur son fallback clair.
 * Le fond de page + éléments Elementor sont neutralisés par le bloc 1quater.
 * Inerte en clair (les --vt-* n'y sont pas définis).
 * Résultat : carte d'intro et page parente identiques en clair comme en sombre.
 * ========================================================================== */
.vauban-disclaimer-screen,
.vauban-consent-nudge {
	--vt-onb-page-grad: initial;
	--vt-bg-page: initial;
	--vt-inset: initial;
	--vt-surface-1: initial;
	--vt-surface-2: initial;
	--vt-elevated: initial;
	--vt-border: initial;
	--vt-border-strong: initial;
	--vt-text: initial;
	--vt-text-soft: initial;
	--vt-muted: initial;
	--vt-primary: initial;
	--vt-primary-strong: initial;
	--vt-primary-bg: initial;
	--vt-primary-action: initial;
	--vt-onb-card-grad: initial;
	--vt-onb-elev: initial;
	--vt-card-shadow: initial;
	--vt-onb-card-shadow: initial;
	--vt-shadow-sm: initial;
	--vt-shadow: initial;
	--vt-shadow-pop: initial;
	--vt-field-halo: initial;
	--vt-onb-focus-glow: initial;
	--vt-focus-ring: initial;
	--color-white: #FFFFFF;
}

/* =============================================================================
 * 1quater. Page disclaimer — fond clair forcé en mode sombre.
 * --------------------------------------------------------------------------
 * Le bloc 1bis a été réduit à #vauban-onboarding-container uniquement : il ne
 * touche plus .vauban-disclaimer-screen. Mais les tokens --vt-* globaux
 * (00-semantic-tokens.css, posés sur [data-theme="dark"]) restent hérités.
 * On neutralise le fond de toute la page et des éléments Elementor parent
 * pour que le visiteur voie une page claire (couleur du site, non sombre).
 * Couvre dark explicite + auto OS.
 * ========================================================================== */
[data-theme="dark"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])),
[data-theme="dark"] body:has(#vauban-disclaimer-screen:not([style*="display: none"])) {
	background-color: var(--ast-global-color-5, #F2F0FE) !important;
	color-scheme: light;
}
[data-theme="dark"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .elementor-section,
[data-theme="dark"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .elementor-container,
[data-theme="dark"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .e-con,
[data-theme="dark"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .e-con-boxed,
[data-theme="dark"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .elementor-element {
	background-color: transparent !important;
}

@media (prefers-color-scheme: dark) {
	[data-theme="auto"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])),
	[data-theme="auto"] body:has(#vauban-disclaimer-screen:not([style*="display: none"])) {
		background-color: var(--ast-global-color-5, #F2F0FE) !important;
		color-scheme: light;
	}
	[data-theme="auto"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .elementor-section,
	[data-theme="auto"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .elementor-container,
	[data-theme="auto"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .e-con,
	[data-theme="auto"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .e-con-boxed,
	[data-theme="auto"] body:has(.vauban-disclaimer-screen:not([style*="display: none"])) .elementor-element {
		background-color: transparent !important;
	}
}

/* =============================================================================
 * 2. Fond neutre + filet de securite anti-cache (orbes/glassmorphism legacy)
 * --------------------------------------------------------------------------
 * `body` n'herite pas des tokens ci-dessus : on utilise des valeurs litterales.
 * Le bloc inline qui dessinait le fond anime a ete retire de bootstrap.php ; ces
 * regles restent pour absorber un eventuel cache de page servant l'ancien JS.
 * ========================================================================== */
body:has(#vauban-onboarding-container),
body:has(.vauban-disclaimer-screen) {
	/* Fond uni ET aligné sur le site : Astra applique --ast-global-color-5 au
	   conteneur de contenu (.ast-separate-container). On reprend exactement cette
	   variable (repli #F2F0FE) pour que la page formulaire ait le MÊME fond que le
	   reste du site, au lieu d'un gris (#F4F5F7) qui tranchait. */
	background: var(--vt-onb-page-grad, var(--ast-global-color-5, #F2F0FE)) !important;
}

/* Page formulaire integree dans une page WordPress : on masque le pied de page
   du theme. Le tunnel d'onboarding se suffit a lui-meme ; le footer du site
   rallongeait la page et rompait le fond uni. L'en-tete du site reste, lui,
   conserve (bande de protection --vauban-header-offset). Couvre Astra
   (.site-footer / #colophon) et un footer construit avec Elementor. */
body:has(#vauban-onboarding-container) .site-footer,
body:has(#vauban-onboarding-container) #colophon,
body:has(#vauban-onboarding-container) [data-elementor-type="footer"],
body:has(.vauban-disclaimer-screen) .site-footer,
body:has(.vauban-disclaimer-screen) #colophon,
body:has(.vauban-disclaimer-screen) [data-elementor-type="footer"] {
	display: none !important;
}

#vauban-page-orbs { display: none !important; }

/* Le conteneur ne doit plus etre centre verticalement ni decale (pas de header). */
#vauban-onboarding-container {
	margin-top: 0 !important;
	min-height: 0 !important;
	display: block !important;
}

/* Pendant l'écran d'intro (disclaimer encore visible), le conteneur du formulaire
   ne doit PAS occuper l'espace. Sans cela : le serveur pose style="display:none"
   sur le conteneur, mais la règle ci-dessus (display:block !important) l'écrase, et
   vauban-disclaimer.js se contente de le rendre invisible (opacity/visibility) →
   ~1300px de VIDE apparaissent sous la carte d'intro. On le sort donc du flux tant
   que le disclaimer n'est pas masqué. Au clic « Commencer », vauban-disclaimer.js
   pose style="display: none" sur #vauban-disclaimer-screen : la règle cesse alors
   de matcher et le formulaire reprend son display:block normal. */
body:has(#vauban-disclaimer-screen:not([style*="display: none"])) #vauban-onboarding-container {
	display: none !important;
}

.vauban-onboarding-wrapper { background: transparent; }

/* =============================================================================
 * 3. Layout 2 colonnes (desktop) — sidebar elargie, contenu pleine largeur
 * ========================================================================== */
@media (min-width: 769px) {
	#vauban-onboarding-container .vauban-onboarding-layout {
		align-items: flex-start !important;
		gap: 28px !important;
	}

	#vauban-onboarding-container .vauban-sidebar-nav {
		/* Menu plus étroit que le formulaire (~33% / ~67%) : le menu n'a pas besoin
		   de la moitié, et le formulaire gagne en largeur lisible. */
		flex: 0.5 1 0 !important;
		width: auto !important;
		min-width: 0 !important;
		position: sticky !important;
		top: 24px !important;
		align-self: flex-start !important;
		/* Scroll interne quand le contenu (étapes + widget + boutons dev/reset)
		   dépasse la hauteur de l'écran : sinon le bas reste inatteignable. */
		max-height: calc(100vh - 48px) !important;
		overflow-y: auto !important;
		overflow-x: hidden !important;
		/* Scrollbar sobre */
		scrollbar-width: thin;
		scrollbar-color: var(--vo-border-strong) transparent;
	}

	#vauban-onboarding-container .vauban-sidebar-nav::-webkit-scrollbar {
		width: 8px;
	}

	#vauban-onboarding-container .vauban-sidebar-nav::-webkit-scrollbar-thumb {
		background: var(--vo-border-strong);
		border-radius: 999px;
	}

	#vauban-onboarding-container .vauban-sidebar-nav::-webkit-scrollbar-track {
		background: transparent;
	}
}

/* =============================================================================
 * 3-bis. Intégration page WordPress : en-tête sticky + pleine largeur + fond
 *
 * La refonte v2 avait été pensée pour une page d'onboarding SANS en-tête de
 * thème (conteneur collé en haut, `margin-top: 0`). Sur une page WordPress
 * normale qui porte l'en-tête — désormais sticky — le haut du formulaire et la
 * sidebar sticky passaient SOUS l'en-tête. On réserve une bande de protection
 * (variable `--vauban-header-offset`, ajustable). Sans effet en mode embed.
 *
 * Note : la « pleine largeur » N'est PAS forcée en CSS (un full-bleed
 * `margin-inline: calc(50% - 50vw)` décalait la mise en page). Pour élargir,
 * passer la page en « Pleine largeur / Stretched » dans les réglages Astra.
 * ========================================================================== */
.vauban-onboarding-wrapper.vauban-embed-mode {
	--vauban-header-offset: 0px;
	--vauban-sticky-header-offset: 0px;
}
.vauban-onboarding-wrapper:not(.vauban-embed-mode) {
	--vauban-header-offset: 140px;
	--vauban-sticky-header-offset: 140px;
}

@media (max-width: 921px) {
	.vauban-onboarding-wrapper:not(.vauban-embed-mode) {
		/* 769-921 px (tablette) : l'en-tête Astra est neutralisé en flux
		   (position:relative, cf. section 99, portée >=769px) — il occupe déjà sa
		   place dans le flux, aucun contenu à compenser (0). Le cas TÉLÉPHONE
		   (<=768px), où l'en-tête redevient `position:fixed` et recouvre le haut,
		   est traité par le bloc @media max-width:768px ci-dessous. */
		--vauban-header-offset: 0px;
		--vauban-sticky-header-offset: calc(
			var(--vbm-header-height, 72px) + var(--wp-admin--admin-bar--height, 0px)
		);
	}
}

/* Téléphone (<=768px) : la neutralisation `position:relative` du header Astra
   (section 99) est scopée >=769px — SOUS 769px l'en-tête Astra reste donc
   `position:fixed` (~70 px, z-index 9999) et RECOUVRE le haut du tunnel. Mesuré
   le 2026-08-03 (iPhone 390x844) : le hero d'étape passait sous lui. On réserve sa
   hauteur réelle pour le conteneur de formulaire (repli 72 px ; --vbm-header-height
   n'est pas chargé sur /formulaire/). L'écran d'intro a sa propre règle plus bas. */
@media (max-width: 768px) {
	.vauban-onboarding-wrapper:not(.vauban-embed-mode) {
		--vauban-header-offset: calc(
			var(--vbm-header-height, 72px) + var(--wp-admin--admin-bar--height, 0px)
		);
	}
}

/* Bande de protection sous l'en-tête : conteneur d'étapes + écran d'intro.
   + gouttières latérales modérées : la page du formulaire est forcée en layout
   Astra « pleine largeur » (filtre vauban_onboarding_force_fullwidth_layout) ;
   sans cette petite réserve, le contenu collerait aux bords de l'écran. */
#vauban-onboarding-container:not(.vauban-embed-mode) {
	padding-top: var(--vauban-header-offset, 96px) !important;
	padding-left: clamp(12px, 2.5vw, 32px) !important;
	padding-right: clamp(12px, 2.5vw, 32px) !important;
}

.vauban-disclaimer-screen {
	/* >=769px : header Astra neutralisé en flux (position:relative, section 99) →
	   une simple respiration suffit. Le cas téléphone (<=768px) est traité par le
	   bloc responsive dédié (réservation de la hauteur du header fixe). */
	padding-top: clamp(28px, 4vw, 56px);
	background: var(--vt-onb-page-grad, var(--ast-global-color-5, #F2F0FE));
}

/* Filet anti-cache : une ancienne version du JS peut avoir relocalisé la barre
   dans <body> avant que le disclaimer soit fermé. Elle reste alors invisible. */
body:has(#vauban-disclaimer-screen:not([style*="display: none"])) > .vauban-form-actions,
.vauban-form-actions.vauban-form-actions--disclaimer-hidden {
	display: none !important;
}

/* Navigation interne entre étapes : l'étape ciblée ne se place plus sous l'en-tête. */
#vauban-onboarding-container .vauban-step-content {
	scroll-margin-top: calc(var(--vauban-sticky-header-offset, var(--vauban-header-offset, 96px)) + 8px);
}

@media (min-width: 769px) {
	/* La sidebar sticky s'arrête elle aussi sous l'en-tête. */
	#vauban-onboarding-container .vauban-sidebar-nav {
		top: calc(var(--vauban-sticky-header-offset, var(--vauban-header-offset, 96px)) + 12px) !important;
		max-height: calc(100vh - var(--vauban-sticky-header-offset, var(--vauban-header-offset, 96px)) - 24px) !important;
	}
}

/* =============================================================================
 * 4. Carte de contenu d'etape
 * ========================================================================== */
#vauban-onboarding-container .vauban-step-content,
#vauban-onboarding-container .vauban-onboarding-form-area {
	background: var(--vo-surface) !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: var(--vo-radius-lg) !important;
	box-shadow: var(--vo-shadow-card) !important;
	margin: 0 !important;
	padding: 32px 36px !important;
}

/* Sections internes : transparentes pour eviter les cartes imbriquees. */
#vauban-onboarding-container .vauban-step-content .vauban-form-section {
	background: transparent !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	border: 0 !important;
	box-shadow: none !important;
	border-radius: 0 !important;
	padding: 0 !important;
	margin: 0 0 24px !important;
}

@media (max-width: 768px) {
	#vauban-onboarding-container .vauban-onboarding-layout {
		gap: 20px !important;
	}

	#vauban-onboarding-container .vauban-sidebar-nav {
		margin-bottom: 0 !important;
	}

	#vauban-onboarding-container .vauban-step-content,
	#vauban-onboarding-container .vauban-onboarding-form-area {
		padding: 22px 18px !important;
		border-radius: 12px !important;
	}
}

/* =============================================================================
 * 5. En-tete d'etape
 * ========================================================================== */
#vauban-onboarding-container .vauban-step-header {
	margin: 0 0 24px !important;
	padding: 0 0 18px !important;
	border-bottom: 1px solid var(--vo-border) !important;
	text-align: left !important;
}

#vauban-onboarding-container .vauban-step-header h2 {
	font-family: var(--vo-font);
	font-size: 26px !important;
	font-weight: 650 !important;
	line-height: 1.2 !important;
	letter-spacing: -0.01em !important;
	color: var(--vo-ink) !important;
	text-transform: none !important;
	text-align: left !important;
	margin: 0 !important;
}

#vauban-onboarding-container .vauban-step-description,
#vauban-onboarding-container .vauban-step-header p {
	color: var(--vo-muted) !important;
	font-size: 15px !important;
	margin: 8px 0 0 !important;
	line-height: 1.55 !important;
}

/* =============================================================================
 * 6. Sections sequentielles [data-vbn-section] + titres de section
 * --------------------------------------------------------------------------
 * Revelation progressive (chantier 2026-05-30) : a l'interieur d'un conteneur
 * opt-in `[data-vbn-progressive]`, les sections en attente (`pending`) sont
 * masquees ; elles se revelent au fur et a mesure que les precedentes sont
 * completees. Le masquage est conditionne a `.vo-js` (pose par le moteur JS)
 * pour garantir un repli sur "tout visible" si le JS est absent.
 * ========================================================================== */
#vauban-onboarding-container [data-vbn-section] {
	margin: 0 0 30px !important;
	padding: 0 !important;
	background: transparent !important;
	border: 0 !important;
	box-shadow: none !important;
	filter: none !important;
	pointer-events: auto !important;
}

#vauban-onboarding-container [data-vbn-section]:last-child {
	margin-bottom: 0 !important;
}

/* Bloc « Historique commercial » remonté en tête de l'étape 1 — hors cascade de
 * révélation progressive (toujours visible), mais aligné sur le rythme vertical
 * des sections. */
#vauban-onboarding-container .vauban-history-block {
	margin: 0 0 30px;
}

/* Sections en attente : masquees uniquement en mode progressif (JS actif). */
#vauban-onboarding-container.vo-js [data-vbn-progressive] [data-vbn-section][data-vbn-state="pending"] {
	display: none !important;
}

/* Animation douce a la revelation. Generique : s'applique aux sections du moteur
   progressif ET a tout bloc revele par le "reveal-animator" (autres etapes). */
#vauban-onboarding-container .vo-reveal {
	animation: vo-section-in 0.42s cubic-bezier(0.22, 0.61, 0.36, 1) both;
}

@keyframes vo-section-in {
	from { opacity: 0; transform: translateY(10px); }
	to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
	#vauban-onboarding-container .vo-reveal {
		animation: none;
	}
}

/* Etape 2 - revelation progressive sur-mesure (B6, 2026-05-31).
   Les sections "consommables" et "logistique" restent masquees tant que
   l'utilisateur n'a pas engage la section precedente (step2-progressive.js fait
   passer data-vbn-step2 de "pending" a "revealed"). Masquage actif UNIQUEMENT
   quand le JS a pose .vo-step2-js sur la racine -> sans JS, tout reste visible. */
#vauban-onboarding-container .vo-step2-js [data-vbn-step2="pending"] {
	display: none;
}

#vauban-onboarding-container .vbn-section-title {
	font-family: var(--vo-font);
	font-size: 16px;
	font-weight: 600;
	color: var(--vo-ink);
	margin: 0 0 16px;
	padding: 0 0 10px;
	border-bottom: 1px solid var(--vo-border);
	letter-spacing: -0.005em;
	line-height: 1.35;
}

/* =============================================================================
 * 7. Groupes de champs, labels, aides
 * ========================================================================== */
#vauban-onboarding-container .vauban-form-group {
	margin-bottom: 20px;
}

#vauban-onboarding-container .vauban-form-group > label {
	display: block;
	font-family: var(--vo-font);
	font-size: 13.5px;
	font-weight: 600;
	color: var(--vo-text);
	margin-bottom: 7px;
	line-height: 1.4;
}

#vauban-onboarding-container .required {
	color: var(--vo-danger);
	font-weight: 600;
}

#vauban-onboarding-container .vauban-address-hint,
#vauban-onboarding-container .field-help,
#vauban-onboarding-container .vauban-form-group small {
	display: block;
	color: var(--vo-muted);
	font-size: 12.5px;
	margin-top: 6px;
	line-height: 1.5;
}

#vauban-onboarding-container .vauban-help-tip {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 15px;
	height: 15px;
	border-radius: 50%;
	background: var(--vo-accent-soft);
	color: var(--vo-muted);
	border: 1px solid var(--vo-border-strong);
	font-size: 10px;
	font-weight: 700;
	line-height: 1;
	cursor: pointer;
	vertical-align: middle;
	margin-left: 2px;
	transition: color 0.12s ease, border-color 0.12s ease;
}

#vauban-onboarding-container .vauban-help-tip:hover,
#vauban-onboarding-container .vauban-help-tip:focus {
	color: var(--vo-ink);
	border-color: var(--vo-faint);
	outline: none;
}

/* Bulle d'aide : rendue dans un élément unique attaché au wrapper de page
 * (#vauban-standalone-wrap / .vauban-onboarding-wrapper) par onboarding-help-tip.js
 * et positionnée en `position: fixed`. Volontairement hors de #vauban-onboarding-container
 * pour échapper aux contextes d'empilement (z-index des cartes/simulateur) et aux
 * `overflow: hidden`, tout en restant dans le scope des tokens --vo-*. */
.vauban-onboarding-wrapper .vauban-help-tip-bubble,
#vauban-standalone-wrap .vauban-help-tip-bubble {
	position: fixed;
	z-index: 2147483647;
	max-width: 260px;
	padding: 9px 12px;
	background: var(--vo-ink);
	color: var(--vo-surface);
	border-radius: var(--vo-radius);
	font-family: inherit;
	font-size: 12px;
	font-weight: 500;
	line-height: 1.45;
	text-align: left;
	white-space: normal;
	box-shadow: 0 6px 24px rgba(16, 24, 40, 0.28);
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transform: translateY(-4px);
	transition: opacity 0.14s ease, transform 0.14s ease;
}

.vauban-onboarding-wrapper .vauban-help-tip-bubble.is-visible,
#vauban-standalone-wrap .vauban-help-tip-bubble.is-visible {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
}

/* =============================================================================
 * 8. Champs (input / select / textarea)
 * --------------------------------------------------------------------------
 * `background-color` (et non `background`) pour ne pas effacer la fleche SVG
 * du select definie dans le bundle de base.
 * ========================================================================== */
#vauban-onboarding-container .vauban-form-group input[type="text"],
#vauban-onboarding-container .vauban-form-group input[type="email"],
#vauban-onboarding-container .vauban-form-group input[type="tel"],
#vauban-onboarding-container .vauban-form-group input[type="number"],
#vauban-onboarding-container .vauban-form-group input[type="url"],
#vauban-onboarding-container .vauban-form-group input[type="date"],
#vauban-onboarding-container .vauban-form-group input[type="time"],
#vauban-onboarding-container .vauban-form-group input[type="password"],
#vauban-onboarding-container .vauban-form-group select,
#vauban-onboarding-container .vauban-form-group textarea {
	width: 100%;
	padding: 11px 14px !important;
	background-color: var(--vo-surface);
	border: 1px solid var(--vo-border-strong) !important;
	border-radius: var(--vo-radius) !important;
	font-family: var(--vo-font);
	font-size: 14.5px !important;
	line-height: 1.5;
	color: var(--vo-ink);
	box-shadow: var(--vo-field-shadow);
	transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
	box-sizing: border-box;
}

#vauban-onboarding-container .vauban-form-group select {
	height: 46px !important;
	-webkit-appearance: none;
	appearance: none;
	cursor: pointer;
}

#vauban-onboarding-container .vauban-form-group textarea {
	min-height: 110px;
	resize: vertical;
}

#vauban-onboarding-container .vauban-form-group input::placeholder,
#vauban-onboarding-container .vauban-form-group textarea::placeholder {
	color: var(--vo-placeholder);
	opacity: 1;
}

/* Filet de sécurité — TOUT placeholder du tunnel (y compris les champs hors
   .vauban-form-group des étapes 2/4/7) reste franchement atténué, pour ne
   jamais passer pour une valeur déjà saisie en mode sombre. */
#vauban-onboarding-container input::placeholder,
#vauban-onboarding-container textarea::placeholder {
	color: var(--vo-placeholder);
	opacity: 1;
}

#vauban-onboarding-container .vauban-form-group input:hover,
#vauban-onboarding-container .vauban-form-group select:hover,
#vauban-onboarding-container .vauban-form-group textarea:hover {
	box-shadow: var(--vo-field-shadow-hover);
}

#vauban-onboarding-container .vauban-form-group input:focus,
#vauban-onboarding-container .vauban-form-group select:focus,
#vauban-onboarding-container .vauban-form-group textarea:focus {
	outline: none;
	border-color: var(--vo-accent) !important;
	transform: translateY(-1px);
	box-shadow: var(--vo-field-shadow-focus) !important;
}

/* Accessibilité : pas de soulèvement si l'utilisateur réduit les animations. */
@media (prefers-reduced-motion: reduce) {
	#vauban-onboarding-container .vauban-form-group input:focus,
	#vauban-onboarding-container .vauban-form-group select:focus,
	#vauban-onboarding-container .vauban-form-group textarea:focus {
		transform: none;
	}
}

#vauban-onboarding-container .vauban-form-group input.error,
#vauban-onboarding-container .vauban-form-group select.error,
#vauban-onboarding-container .vauban-form-group input[aria-invalid="true"] {
	border-color: var(--vo-danger) !important;
}

/* Radios / cases (alignement sobre). */
#vauban-onboarding-container .vauban-radio-inline {
	background: var(--vo-surface);
	border: 1px solid var(--vo-border-strong);
	border-radius: var(--vo-radius);
}

#vauban-onboarding-container .vauban-radio-inline:hover {
	background: var(--vo-surface-muted);
	border-color: var(--vo-faint);
}

#vauban-onboarding-container input[type="radio"],
#vauban-onboarding-container input[type="checkbox"] {
	accent-color: var(--vo-accent);
}

/* =============================================================================
 * 9. Boutons
 * ========================================================================== */
#vauban-onboarding-container .vauban-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	padding: 12px 22px;
	border: 1px solid transparent;
	border-radius: var(--vo-radius) !important;
	font-family: var(--vo-font);
	font-size: 14.5px;
	font-weight: 600;
	line-height: 1.2;
	cursor: pointer;
	text-decoration: none;
	transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, transform 0.12s ease;
}

#vauban-onboarding-container .vauban-btn-primary {
	background: var(--vo-accent) !important;
	color: #FFFFFF !important;
	box-shadow: var(--vo-shadow-sm);
}

#vauban-onboarding-container .vauban-btn-primary:hover {
	background: var(--vo-accent-hover) !important;
	color: #FFFFFF !important;
	transform: translateY(-1px);
	box-shadow: 0 4px 14px rgba(16, 24, 40, 0.16) !important;
}

#vauban-onboarding-container .vauban-btn-secondary {
	background: var(--vo-surface) !important;
	color: var(--vo-text) !important;
	border: 1px solid var(--vo-border-strong) !important;
}

#vauban-onboarding-container .vauban-btn-secondary:hover {
	background: var(--vo-surface-muted) !important;
	color: var(--vo-ink) !important;
	border-color: var(--vo-faint) !important;
}

#vauban-onboarding-container .vauban-btn-minimal:hover {
	background: var(--vo-surface-muted) !important;
	color: var(--vo-ink) !important;
	transform: none;
}

#vauban-onboarding-container .vauban-btn-primary:disabled,
#vauban-onboarding-container .vauban-btn-primary.vbn-next-locked {
	opacity: 0.42;
	cursor: not-allowed;
	transform: none !important;
	box-shadow: none !important;
}

#vauban-onboarding-container .vauban-btn-primary:focus-visible,
#vauban-onboarding-container .vauban-btn-secondary:focus-visible {
	outline: none;
	box-shadow: var(--vo-ring) !important;
}

/* =============================================================================
 * 10. Barre d'actions (navigation entre etapes)
 * ========================================================================== */
#vauban-onboarding-container .vauban-form-actions {
	display: flex;
	justify-content: flex-end;
	align-items: center;
	gap: 12px;
	margin-top: 32px;
	padding-top: 22px;
	border-top: 1px solid var(--vo-border);
}

#vauban-onboarding-container .vauban-form-actions--two,
#vauban-onboarding-container .vauban-form-actions.has-back {
	justify-content: space-between;
}

/* Bandeau de navigation eventuel (override du glassmorphism inline). */
#vauban-onboarding-container .vauban-navigation-buttons {
	background: transparent !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	border: 0 !important;
	box-shadow: none !important;
	padding: 0 !important;
}

/* =============================================================================
 * 11. Sidebar de navigation — refonte style IA (2026-06-01)
 * ========================================================================== */

/* Carte — fond légèrement teinté indigo, ombre plus marquée */
@media (min-width: 769px) {
	#vauban-onboarding-container .vauban-sidebar-card {
		display: flex !important;
		flex-direction: column !important;
		gap: 4px;
		padding: 16px 14px !important;
		background: var(--vt-sidebar-bg, linear-gradient(160deg, #fafbff 0%, #f5f7ff 100%)) !important;
		backdrop-filter: none !important;
		-webkit-backdrop-filter: none !important;
		border: 1px solid rgba(79, 70, 229, 0.12) !important;
		border-radius: var(--vo-radius-lg) !important;
		box-shadow: 0 2px 8px rgba(79, 70, 229, 0.07), 0 1px 3px rgba(16, 24, 40, 0.06) !important;
		overflow: visible !important;
	}

	#vauban-onboarding-container .vauban-sidebar-steps,
	#vauban-onboarding-container #vauban-steps-list {
		display: flex !important;
		flex-direction: column !important;
		gap: 2px !important;
		overflow: visible !important;
		max-height: none !important;
		padding: 4px 0 !important;
	}
}

/* Header */
#vauban-onboarding-container .vauban-sidebar-header {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
	padding: 0 2px 14px !important;
	margin-bottom: 8px;
	background: transparent !important;
	background-image: none !important;
	border: 0 !important;
	border-bottom: 1px solid rgba(79, 70, 229, 0.1) !important;
	border-radius: 0 !important;
	position: relative;
}

#vauban-onboarding-container .vauban-sidebar-header__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	border-radius: 10px;
	background: var(--vt-primary-bg, linear-gradient(135deg, #EEF0FE 0%, #E5E7FF 100%)) !important;
	color: var(--vo-accent) !important;
	flex-shrink: 0;
	box-shadow: 0 1px 3px rgba(79, 70, 229, 0.12);
}

#vauban-onboarding-container .vauban-sidebar-header__icon svg {
	width: 16px;
	height: 16px;
}

#vauban-onboarding-container .vauban-sidebar-header__text {
	display: flex;
	flex-direction: column;
	min-width: 0;
}

#vauban-onboarding-container .vauban-sidebar-header__step {
	font-size: 10px;
	font-weight: 700;
	color: var(--vo-accent);
	text-transform: uppercase;
	letter-spacing: 0.07em;
	opacity: 0.75;
}

#vauban-onboarding-container .vauban-sidebar-header__title {
	font-size: 13px;
	font-weight: 700;
	color: var(--vo-ink);
	line-height: 1.3;
}

/* Barre de progression — gradient indigo */
#vauban-onboarding-container .vauban-sidebar-header__bar {
	position: static !important;
	flex: 1 1 100%;
	height: 4px;
	border-radius: 999px;
	background: var(--vt-primary-bg, rgba(79, 70, 229, 0.1)) !important;
	overflow: hidden;
	margin-top: 8px;
}

#vauban-onboarding-container .vauban-sidebar-header__fill {
	height: 100%;
	background: linear-gradient(90deg, #4F46E5 0%, #7C3AED 100%) !important;
	border-radius: 999px;
	transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
	box-shadow: 0 0 6px rgba(79, 70, 229, 0.4);
}

/* Description courte de l'étape courante */
#vauban-onboarding-container .vauban-sidebar-header__desc {
	flex: 1 1 100%;
	margin: 5px 0 0;
	font-size: 10px;
	line-height: 1.4;
	color: var(--vo-muted);
	font-style: italic;
}

/* Étape — base */
#vauban-onboarding-container .vauban-sb-step {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 10px !important;
	border-radius: 8px;
	text-decoration: none;
	color: var(--vo-muted);
	border: 0;
	border-left: 3px solid transparent;
	transition: background-color 0.18s ease, color 0.18s ease, border-color 0.18s ease;
	position: relative;
}

/* Dot — base (toutes les étapes) */
#vauban-onboarding-container .vauban-sb-step__dot {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 24px;
	height: 24px;
	flex-shrink: 0;
	border-radius: 50%;
	border: 1.5px solid var(--vo-border-strong);
	background: var(--vo-surface);
	color: var(--vo-faint);
	font-size: 11px;
	font-weight: 600;
}

#vauban-onboarding-container .vauban-sb-step__n {
	font-size: 11px;
	font-weight: 600;
}

#vauban-onboarding-container .vauban-sb-step__txt {
	font-size: 12.5px;
	font-weight: 500;
	line-height: 1.25;
	white-space: normal;
}

/* ---- État actif (is-current) ---- */
#vauban-onboarding-container .vauban-sb-step.is-current {
	background: var(--vt-primary-bg, rgba(79, 70, 229, 0.06)) !important;
	border-left-color: var(--vo-accent) !important;
	color: var(--vo-ink);
}

#vauban-onboarding-container .vauban-sb-step.is-current .vauban-sb-step__txt {
	font-weight: 700 !important;
	color: var(--vo-accent) !important;
}

/* Dot actif : style radio-button — anneau indigo, fond blanc, pastille centrale */
#vauban-onboarding-container .vauban-sb-step.is-current .vauban-sb-step__dot {
	background: var(--vt-surface-1, #fff) !important;
	border: 2px solid var(--vo-accent) !important;
	color: var(--vo-accent) !important;
	box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.12) !important;
}

/* Pulse : pastille intérieure indigo animée (8px centrée dans l'anneau) */
#vauban-onboarding-container .vauban-sb-step.is-current .vauban-sb-step__pulse {
	display: block !important;
	width: 8px !important;
	height: 8px !important;
	border-radius: 50% !important;
	background: var(--vo-accent) !important;
	flex-shrink: 0;
	animation: vbn-dot-pulse 2s ease-in-out infinite;
}

@keyframes vbn-dot-pulse {
	0%, 100% { transform: scale(1);    opacity: 1; }
	50%       { transform: scale(0.65); opacity: 0.6; }
}

/* ---- État complété (is-done) ---- */
#vauban-onboarding-container .vauban-sb-step.is-done {
	color: var(--vo-text);
}

#vauban-onboarding-container .vauban-sb-step.is-done .vauban-sb-step__dot {
	background: linear-gradient(135deg, #4F46E5 0%, #7C3AED 100%) !important;
	border-color: transparent !important;
	color: #fff !important;
	box-shadow: 0 1px 4px rgba(79, 70, 229, 0.2) !important;
}

#vauban-onboarding-container .vauban-sb-step.is-done .vauban-sb-step__txt {
	color: var(--vo-text) !important;
}

#vauban-onboarding-container .vauban-sb-step.is-done .vauban-sb-step__dot svg {
	width: 11px;
	height: 11px;
}

/* ---- État accessible non commencé (is-open) ---- */
#vauban-onboarding-container .vauban-sb-step.is-open .vauban-sb-step__dot {
	background: var(--vo-surface) !important;
	border-color: var(--vo-border-strong) !important;
	color: var(--vo-muted) !important;
}

#vauban-onboarding-container .vauban-sb-step.is-open .vauban-sb-step__txt {
	color: var(--vo-text) !important;
}

/* ---- Connecteurs verticaux (entre pastilles) ---- */
#vauban-onboarding-container .vauban-sb-step.is-done:not(:last-child)::after {
	background: rgba(79, 70, 229, 0.25) !important;
}

/* ---- Chargement ---- */
#vauban-onboarding-container .vauban-sb-step.is-loading .vauban-sb-step__dot {
	background: linear-gradient(135deg, #4F46E5 0%, #7C3AED 100%) !important;
	border-color: transparent !important;
	box-shadow: 0 0 0 4px rgba(79, 70, 229, 0.18) !important;
}

/* ---- Cliquable / hover ---- */
#vauban-onboarding-container .vauban-sb-step.vauban-step-nav-clickable {
	cursor: pointer;
}

#vauban-onboarding-container .vauban-sb-step.vauban-step-nav-clickable:hover:not(.is-current) {
	background: var(--vt-primary-bg, rgba(79, 70, 229, 0.04));
	color: var(--vo-ink);
}

/* ---- Verrouillé ---- */
#vauban-onboarding-container .vauban-sb-step.is-locked {
	opacity: 0.45;
	cursor: default;
}

/* ---- Pied de carte ---- */
#vauban-onboarding-container .vauban-sidebar-foot {
	display: flex;
	align-items: center;
	gap: 7px;
	margin-top: 10px;
	padding: 10px 8px 2px;
	border-top: 1px solid rgba(79, 70, 229, 0.08);
	color: var(--vo-muted);
	font-size: 11.5px;
	line-height: 1.4;
}

#vauban-onboarding-container .vauban-sidebar-foot svg {
	flex-shrink: 0;
	color: var(--vo-faint);
}

/* ---- Boutons dev / reset / home ---- */
#vauban-onboarding-container .vauban-sidebar-dev,
#vauban-onboarding-container .vauban-sidebar-reset,
#vauban-onboarding-container .vauban-sidebar-home {
	margin-top: 10px;
}

#vauban-onboarding-container .vauban-sidebar-home-btn {
	width: 100%;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	padding: 8px 10px;
	background: var(--vo-surface);
	border: 1px solid var(--vo-border);
	border-radius: 8px;
	color: var(--vo-muted);
	font-size: 12px;
	font-weight: 600;
	text-decoration: none;
	transition: background-color 0.15s ease, color 0.15s ease;
	box-sizing: border-box;
}

#vauban-onboarding-container .vauban-sidebar-home-btn:hover {
	background: var(--vo-surface-muted);
	color: var(--vo-ink);
	text-decoration: none;
}

#vauban-onboarding-container .vauban-sidebar-dev-label {
	display: flex;
	align-items: center;
	gap: 5px;
	font-size: 10px;
	font-weight: 700;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	color: var(--vo-faint);
	margin-bottom: 6px;
}

#vauban-onboarding-container .vauban-sidebar-dev-btn,
#vauban-onboarding-container .vauban-sidebar-reset-btn {
	width: 100%;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	padding: 8px 10px;
	background: var(--vo-surface);
	border: 1px solid var(--vo-border-strong);
	border-radius: 8px;
	color: var(--vo-muted);
	font-size: 12px;
	font-weight: 600;
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease;
}

#vauban-onboarding-container .vauban-sidebar-dev-btn:hover,
#vauban-onboarding-container .vauban-sidebar-reset-btn:hover {
	background: var(--vo-surface-muted);
	color: var(--vo-ink);
}

/* =============================================================================
 * 12. Carte pedagogique d'etape (neutralisation du gradient orange inline)
 * ========================================================================== */
#vauban-onboarding-container .vauban-step-info-card {
	background: var(--vo-surface) !important;
	background-image: none !important;
	border: 1px solid var(--vo-border) !important;
	border-left: 3px solid var(--vo-accent) !important;
	border-radius: var(--vo-radius-lg) !important;
	box-shadow: var(--vo-shadow-sm) !important;
	color: var(--vo-text) !important;
}

/* =============================================================================
 * 13. Ecran disclaimer (carte solide, recouvre le glassmorphism inline)
 * ========================================================================== */
#vauban-standalone-wrap .vauban-disclaimer-content {
	background: var(--vo-surface) !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	border: 1px solid var(--vo-border) !important;
	box-shadow: var(--vo-shadow-card) !important;
}

#vauban-standalone-wrap .vauban-disclaimer-footer {
	background: var(--vo-surface) !important;
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
}

/* =============================================================================
 * 14. Harmonisation des couleurs legacy -> accent unique + neutres
 * --------------------------------------------------------------------------
 * Le formulaire historique mélange plusieurs hues (bleu de marque #1E40AF,
 * orange #F97316, verts #10B981/#34D399, multiples gris). On harmonise vers
 * UN accent (#2F5FD0) + une échelle slate, en 3 couches :
 *   (a) re-mapping des variables de design du socle (`--color-*`) — couvre tout
 *       ce qui passe par var() ;
 *   (b) override des classes du bundle qui codent les couleurs en dur ;
 *   (c) mappings d'inline styles fréquents [style*=...] (sans !important).
 * Les inline styles AVEC !important (ex. visual-progress.php) ne sont PAS
 * surchargeables ici et relèvent d'une édition PHP (consignée au backlog).
 * ========================================================================== */

/* (a) Re-mapping des tokens de design du socle (01-base-forms.css :root). */
#vauban-onboarding-container,
#vauban-standalone-wrap {
	--color-primary: var(--vo-accent);
	--color-primary-hover: var(--vo-accent-hover);
	--color-secondary: var(--vo-accent);     /* l'orange secondaire devient l'accent */
	--color-info: var(--vo-accent);
	--color-info-bg: var(--vo-accent-soft);
	--color-info-dark: var(--vo-accent-hover);
	--color-success: var(--vo-success);
	--color-success-bg: var(--vo-success-soft);
	--color-success-dark: var(--vo-success);
	--color-warning: var(--vo-amber);
	--color-warning-bg: var(--vt-warning-bg, #FBF7EC);
	--color-warning-dark: var(--vo-amber);
	--color-error: var(--vo-danger);
	--color-error-bg: var(--vo-danger-soft);
	--color-text-main: var(--vo-ink);
	--color-text-light: var(--vo-muted);
	--color-border: var(--vo-border);
	--color-bg-light: var(--vo-surface-muted);
}

/* (b) Classes du bundle codées en dur. */
#vauban-onboarding-container .vauban-contact-option {
	border-color: var(--vo-accent) !important;
	color: var(--vo-accent) !important;
}
#vauban-onboarding-container .vauban-contact-option:hover {
	background: var(--vo-accent-soft) !important;
	box-shadow: 0 8px 20px rgba(47, 95, 208, 0.12) !important;
}
#vauban-onboarding-container .vauban-contact-option__desc { color: var(--vo-muted) !important; }
#vauban-onboarding-container .vauban-contact-modal__title { color: var(--vo-ink) !important; }
#vauban-onboarding-container .vauban-contact-modal__close:hover { color: var(--vo-accent) !important; }

#vauban-onboarding-container .tooltip-icon { background: var(--vo-accent) !important; }
#vauban-onboarding-container .tooltip-icon:hover { background: var(--vo-accent-hover) !important; }

#vauban-onboarding-container .vauban-radio-inline input[type="radio"] { accent-color: var(--vo-accent) !important; }
#vauban-onboarding-container .vauban-radio-inline input[type="radio"]:checked + .radio-label { color: var(--vo-accent) !important; }

#vauban-onboarding-container .vauban-select-menu__title {
	background: var(--vo-accent) !important;
	background-image: none !important;
}
#vauban-onboarding-container .vauban-select-menu__item:hover,
#vauban-onboarding-container .vauban-select-menu__item:focus { background: var(--vo-accent-soft) !important; }
#vauban-onboarding-container .vauban-select-menu__item--selected {
	background: var(--vo-accent-soft) !important;
	color: var(--vo-accent) !important;
}

#vauban-onboarding-container .vauban-progress-fill {
	background: var(--vo-accent) !important;
	background-image: none !important;
}
#vauban-onboarding-container .vauban-step-indicator.active .step-number {
	background: var(--vo-accent) !important;
	color: #FFFFFF !important;
}

#vauban-onboarding-container .vauban-message.success {
	background: var(--vo-success-soft) !important;
	color: var(--vo-success) !important;
	border-color: var(--vo-success) !important;
}
#vauban-onboarding-container .vauban-message.error {
	background: var(--vo-danger-soft) !important;
	color: var(--vo-danger) !important;
	border-color: var(--vo-danger) !important;
}

/* (c) Inline styles fréquents (sans !important) -> accent / neutres. */

/* Bleus de marque pleins (fonds) */
#vauban-onboarding-container [style*="background: #1E40AF"],
#vauban-onboarding-container [style*="background:#1E40AF"],
#vauban-onboarding-container [style*="background-color: #1E40AF"],
#vauban-onboarding-container [style*="background: #1E3A8A"],
#vauban-onboarding-container [style*="background:#1E3A8A"],
#vauban-onboarding-container [style*="background: #2563EB"],
#vauban-onboarding-container [style*="background: #1D4ED8"] {
	background-color: var(--vo-accent) !important;
	background-image: none !important;
}

/* Gradients bleus -> accent plein */
#vauban-onboarding-container [style*="linear-gradient(135deg, #1E40AF"],
#vauban-onboarding-container [style*="linear-gradient(135deg,#1E40AF"],
#vauban-onboarding-container [style*="linear-gradient(135deg, #2563EB"],
#vauban-onboarding-container [style*="linear-gradient(135deg, #1E3A8A"],
#vauban-onboarding-container [style*="linear-gradient(90deg, #1E40AF"] {
	background-image: linear-gradient(135deg, var(--vo-accent), var(--vo-accent-hover)) !important;
}

/* Bleus très clairs (fonds info) -> accent-soft */
#vauban-onboarding-container [style*="background: #EFF6FF"],
#vauban-onboarding-container [style*="background:#EFF6FF"],
#vauban-onboarding-container [style*="background: #DBEAFE"],
#vauban-onboarding-container [style*="background: #F0F9FF"],
#vauban-onboarding-container [style*="background: #E0F2FE"],
#vauban-onboarding-container [style*="background: #BFDBFE"] {
	background-color: var(--vo-accent-soft) !important;
}

/* Bordures bleues -> accent-border */
#vauban-onboarding-container [style*="border-color: #3B82F6"],
#vauban-onboarding-container [style*="border-color: #BAE6FD"],
#vauban-onboarding-container [style*="border-color: #93C5FD"],
#vauban-onboarding-container [style*="border-color: #BFDBFE"],
#vauban-onboarding-container [style*="border-left: 4px solid #1E40AF"],
#vauban-onboarding-container [style*="border: 2px solid #3B82F6"],
#vauban-onboarding-container [style*="border: 1.5px solid #3B82F6"] {
	border-color: var(--vo-accent) !important;
}

/* Texte bleu foncé -> ink / accent */
#vauban-onboarding-container [style*="color: #1E40AF"],
#vauban-onboarding-container [style*="color:#1E40AF"],
#vauban-onboarding-container [style*="color: #1E3A8A"],
#vauban-onboarding-container [style*="color: #1D4ED8"] {
	color: var(--vo-accent) !important;
}

/* Orange / ambre décoratif -> accent (fonds) et neutre (textes) */
#vauban-onboarding-container [style*="background: #F97316"],
#vauban-onboarding-container [style*="background: #FFF7ED"],
#vauban-onboarding-container [style*="background: #FFEDD5"],
#vauban-onboarding-container [style*="linear-gradient(135deg, #FFF7ED"],
#vauban-onboarding-container [style*="linear-gradient(135deg, #F97316"] {
	background-color: var(--vo-accent-soft) !important;
	background-image: none !important;
}
#vauban-onboarding-container [style*="border-left: 4px solid #F97316"],
#vauban-onboarding-container [style*="border-color: #F97316"] {
	border-color: var(--vo-accent) !important;
}
#vauban-onboarding-container [style*="color: #F97316"],
#vauban-onboarding-container [style*="color: #9A3412"],
#vauban-onboarding-container [style*="color: #92400E"],
#vauban-onboarding-container [style*="color: #78350F"],
#vauban-onboarding-container [style*="color: #B45309"],
#vauban-onboarding-container [style*="color: #D97706"] {
	color: var(--vo-text) !important;
}

/* Verts -> success sobre */
#vauban-onboarding-container [style*="background: #10B981"],
#vauban-onboarding-container [style*="background: #059669"],
#vauban-onboarding-container [style*="linear-gradient(135deg, #10B981"] {
	background-color: var(--vo-success) !important;
	background-image: none !important;
}
#vauban-onboarding-container [style*="background: #ECFDF5"],
#vauban-onboarding-container [style*="background: #F0FDF4"],
#vauban-onboarding-container [style*="background: #D1FAE5"] {
	background-color: var(--vo-success-soft) !important;
}
#vauban-onboarding-container [style*="color: #059669"],
#vauban-onboarding-container [style*="color: #15803D"],
#vauban-onboarding-container [style*="color: #166534"],
#vauban-onboarding-container [style*="color: #065F46"] {
	color: var(--vo-success) !important;
}

/* Rouges -> error sobre */
#vauban-onboarding-container [style*="background: #DC2626"],
#vauban-onboarding-container [style*="background: #EF4444"],
#vauban-onboarding-container [style*="background: #F87171"] {
	background-color: var(--vo-danger) !important;
}
#vauban-onboarding-container [style*="background: #FEE2E2"],
#vauban-onboarding-container [style*="background: #FEF2F2"],
#vauban-onboarding-container [style*="background: #FEF3F2"],
#vauban-onboarding-container [style*="background: #FBECEA"] {
	background-color: var(--vo-danger-soft) !important;
}
#vauban-onboarding-container [style*="color: #DC2626"],
#vauban-onboarding-container [style*="color: #EF4444"],
#vauban-onboarding-container [style*="color: #991B1B"] {
	color: var(--vo-danger) !important;
}

/* =============================================================================
 * 15. Mini-carte d'adresse (Leaflet) — protections rendu + marqueur visible
 * --------------------------------------------------------------------------
 * Le socle applique `.vauban-step-content * { max-width: 100% }` + box-sizing
 * global, ce qui peut contraindre les tuiles et le marqueur Leaflet. On lève
 * ces contraintes dans la carte et on rend le pin « votre bien est ici » bien
 * visible (taille + ombre portée). Le marqueur est un divIcon SVG (pas de PNG).
 * ========================================================================== */
#vauban-onboarding-container .vban-map img,
#vauban-onboarding-container .vban-map .leaflet-tile,
#vauban-onboarding-container .vban-map .leaflet-marker-icon,
#vauban-onboarding-container .vban-map .vban-map__pin,
#vauban-onboarding-container .vban-map .vban-map__pin svg {
	max-width: none !important;
	box-sizing: content-box !important;
}

#vauban-onboarding-container .vban-map .leaflet-pane,
#vauban-onboarding-container .vban-map .leaflet-marker-pane {
	overflow: visible !important;
}

/* Pin "votre bien est ici" : ombre portée pour qu'il ressorte sur les tuiles.
   Taille native 26x36 conservée (cohérente avec iconSize/iconAnchor du JS). */
#vauban-onboarding-container .vban-map__pin {
	filter: drop-shadow(0 3px 4px rgba(16, 24, 40, 0.35));
}

#vauban-onboarding-container .vban-map__pin svg {
	display: block;
}

/* =============================================================================
 * 16. Panneau « Détails complémentaires » (ex-Mode expert + Qualification)
 * --------------------------------------------------------------------------
 * Un seul panneau dépliable sobre `.vo-details` regroupant les sous-groupes
 * `.vo-group` (Logement & couchages / Voisinage / État / Historique).
 * ========================================================================== */
#vauban-onboarding-container .vo-details {
	background: var(--vo-surface);
	border: 1px solid var(--vo-border);
	border-radius: var(--vo-radius-lg);
	box-shadow: var(--vo-shadow-sm);
	overflow: hidden;
	margin: 4px 0 0;
}

#vauban-onboarding-container .vo-details__summary {
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 16px 20px;
	cursor: pointer;
	list-style: none;
	user-select: none;
	transition: background-color 0.15s ease;
}

#vauban-onboarding-container .vo-details__summary::-webkit-details-marker {
	display: none;
}

#vauban-onboarding-container .vo-details__summary:hover {
	background: var(--vo-surface-muted);
}

#vauban-onboarding-container .vo-details__text {
	display: flex;
	flex-direction: column;
	gap: 2px;
	flex: 1;
	min-width: 0;
}

#vauban-onboarding-container .vo-details__title {
	font-size: 15px;
	font-weight: 600;
	color: var(--vo-ink);
}

#vauban-onboarding-container .vo-details__hint {
	font-size: 12.5px;
	color: var(--vo-muted);
	line-height: 1.45;
}

#vauban-onboarding-container .vo-details__badge {
	flex-shrink: 0;
	font-size: 11px;
	font-weight: 600;
	color: var(--vo-accent);
	background: var(--vo-accent-soft);
	border: 1px solid var(--vo-accent-border);
	border-radius: 999px;
	padding: 3px 10px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
}

/* Variante statique : le bloc « Détails du logement & qualification » est
 * désormais obligatoire, donc toujours déplié (plus de <details> repliable).
 * On neutralise l'affordance de clic de l'en-tête et on distingue le badge. */
#vauban-onboarding-container .vo-details__summary--static {
	cursor: default;
}

#vauban-onboarding-container .vo-details__summary--static:hover {
	background: transparent;
}

#vauban-onboarding-container .vo-details__badge--required {
	color: var(--vo-ink);
}

#vauban-onboarding-container .vo-details__chevron {
	flex-shrink: 0;
	display: inline-flex;
	color: var(--vo-muted);
	transition: transform 0.25s ease;
}

#vauban-onboarding-container .vo-details[open] .vo-details__chevron {
	transform: rotate(180deg);
}

#vauban-onboarding-container .vo-details__body {
	padding: 4px 20px 20px;
	border-top: 1px solid var(--vo-border);
}

#vauban-onboarding-container .vo-details__intro {
	margin: 16px 0 20px;
	padding: 12px 14px;
	background: var(--vo-accent-soft);
	border-left: 3px solid var(--vo-accent);
	border-radius: 8px;
	font-size: 13px;
	line-height: 1.55;
	color: var(--vo-text);
}

#vauban-onboarding-container .vo-details__intro strong {
	color: var(--vo-ink);
	font-weight: 600;
}

/* Sous-groupes */
#vauban-onboarding-container .vo-group {
	border: 0;
	margin: 0 0 22px;
	padding: 18px 0 0;
	border-top: 1px solid var(--vo-border);
	min-width: 0;
}

#vauban-onboarding-container .vo-group:first-of-type {
	border-top: 0;
	padding-top: 0;
}

#vauban-onboarding-container .vo-group__legend {
	padding: 0;
	margin: 0 0 14px;
	font-size: 12px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--vo-accent);
}

#vauban-onboarding-container .vo-group__subhint {
	margin: 0 0 16px;
	font-size: 12.5px;
	line-height: 1.55;
	color: var(--vo-muted);
}

#vauban-onboarding-container .vo-group__subhint--lead {
	padding: 12px 14px;
	background: var(--vo-surface-muted);
	border-radius: 8px;
	color: var(--vo-text);
}

/* Grille interne 12 colonnes, cohérente avec la carte propriété. */
#vauban-onboarding-container .vo-group .vauban-form-row {
	display: grid;
	grid-template-columns: repeat(12, 1fr);
	gap: 14px 16px;
	margin-bottom: 0;
	/* Étirement des cellules : chaque colonne occupe toute la hauteur de la
	 * rangée pour que les champs voisins (ex. « Canapés-lits » et « Toutes les
	 * chambres ont-elles une fenêtre ? ») restent alignés même quand un label
	 * comporte une description sur une seconde ligne. */
	align-items: stretch;
}

#vauban-onboarding-container .vo-group .vauban-form-row + .vauban-form-row {
	margin-top: 16px;
}

#vauban-onboarding-container .vo-group .vauban-col-3 { grid-column: span 3; }
#vauban-onboarding-container .vo-group .vauban-col-6 { grid-column: span 6; }
#vauban-onboarding-container .vo-group .vauban-col-12 { grid-column: span 12; }
/* Colonne en flex pour que le champ (input/select) se cale en bas de la
 * cellule : les libellés de hauteurs différentes n'entraînent plus de
 * désalignement vertical des champs sur une même rangée. */
#vauban-onboarding-container .vo-group .vauban-form-group {
	margin-bottom: 0;
	display: flex;
	flex-direction: column;
}
#vauban-onboarding-container .vo-group .vauban-form-group > label {
	flex: 1 0 auto;
}

#vauban-onboarding-container .vo-group label small {
	display: block;
	font-weight: 400;
	font-size: 11.5px;
	color: var(--vo-muted);
	margin-top: 2px;
}

@media (max-width: 720px) {
	#vauban-onboarding-container .vo-group .vauban-col-3,
	#vauban-onboarding-container .vo-group .vauban-col-6,
	#vauban-onboarding-container .vo-group .vauban-col-12 {
		grid-column: 1 / -1;
	}
}

/* Notes d'avertissement sobres (remplace l'aplat ambre criard). */
#vauban-onboarding-container .vauban-field-warn {
	display: block;
	margin-top: 8px;
	padding: 8px 10px;
	background: var(--vo-surface-muted);
	border-left: 3px solid var(--vo-amber);
	border-radius: 6px;
	font-size: 12px;
	line-height: 1.5;
	color: var(--vo-text);
}

#vauban-onboarding-container .vauban-field-warn[hidden] {
	display: none;
}

/* =============================================================================
 * 17. Étape « Accès autonome » (step-4) — re-skin sobre, CSS ONLY
 * --------------------------------------------------------------------------
 * Nettoyage visuel uniquement : cartes cohérentes, accent unique, couleurs
 * apaisées, espacement. AUCUNE modif du markup, des id/name ni du JS de la
 * cascade de choix — le flux du parcours d'accès autonome reste intact.
 * (Les couleurs inline de cette étape sont sans !important → surchargeables.)
 * ========================================================================== */

/* --- Sections de la cascade : cartes sobres et homogènes ------------------ */
#vauban-onboarding-container .vauban-form-section {
	/* Surface de section : un cran au-dessus de la carte d'étape → relief net en
	   sombre (en clair, repli blanc = inchangé). Ombre de carte (visible en sombre
	   grâce au liseré inset). */
	background: var(--vo-section);
	border: 1px solid var(--vo-border);
	border-radius: var(--vo-radius-lg);
	box-shadow: var(--vo-card-shadow);
	padding: 22px 24px;
	margin: 0 0 16px;
}

#vauban-onboarding-container .vauban-form-section-sub {
	background: var(--vo-surface-muted);
	border: 1px solid var(--vo-border);
	border-radius: var(--vo-radius);
	padding: 16px 18px;
	margin-top: 14px;
}

#vauban-onboarding-container .vauban-form-section > h3,
#vauban-onboarding-container .vauban-form-section > h4 {
	font-size: 16px;
	font-weight: 600;
	color: var(--vo-ink);
	margin: 0 0 14px;
	letter-spacing: -0.005em;
}

/* Intitulé de question */
#vauban-onboarding-container .vauban-label-question {
	display: block;
	font-size: 14px;
	font-weight: 600;
	color: var(--vo-ink);
	margin: 0 0 10px;
	line-height: 1.45;
}

/* --- Cartes de choix (section 0 : kit / déjà équipé / manuel / différé) ---- */
#vauban-onboarding-container .vauban-access-card input[type="radio"],
#vauban-onboarding-container .vauban-access-card--featured input[type="radio"] {
	accent-color: var(--vo-accent) !important;
}

#vauban-onboarding-container .vauban-access-card:has(input[type="radio"]:checked),
#vauban-onboarding-container .vauban-access-card--featured:has(input[type="radio"]:checked) {
	border-color: var(--vo-accent) !important;
	background: var(--vo-accent-soft) !important;
}

#vauban-onboarding-container .vauban-access-card--featured {
	border-color: var(--vo-accent-border) !important;
}

#vauban-onboarding-container .vauban-access-card-badge {
	background: var(--vo-accent) !important;
}

#vauban-onboarding-container .vauban-access-card-title {
	color: var(--vo-ink) !important;
}

#vauban-onboarding-container .vauban-access-card-sub,
#vauban-onboarding-container .vauban-access-intro {
	color: var(--vo-muted) !important;
}

/* Blocs détail révélés (Kit / manuel / différé / déjà équipé) */
#vauban-onboarding-container .vauban-access-detail {
	background: var(--vo-surface-muted) !important;
	border: 1px solid var(--vo-border) !important;
	border-left: 3px solid var(--vo-accent) !important;
}

/* --- Cartes radio (sections 2 & 3 : accès extérieur, diagnostic porte) ----- */
#vauban-onboarding-container .radio-card input[type="radio"] {
	accent-color: var(--vo-accent) !important;
}

#vauban-onboarding-container .radio-card:has(input[type="radio"]:checked) {
	border-color: var(--vo-accent) !important;
	background: var(--vo-accent-soft) !important;
}

/* --- Encadrés d'information : sobres, accent unique ------------------------ */
#vauban-onboarding-container .vauban-info-box {
	background: var(--vo-accent-soft) !important;
	border: 1px solid var(--vo-accent-border) !important;
	border-left: 3px solid var(--vo-accent) !important;
	border-radius: var(--vo-radius) !important;
}

#vauban-onboarding-container .vauban-info-box p {
	color: var(--vo-text) !important;
}

/* L'intro pédagogique réutilise .vauban-info-box comme grand conteneur :
   on le neutralise en carte blanche (pas de teinte accent sur tout le bloc). */
#vauban-onboarding-container #pedagogie-nuki-content > .vauban-info-box {
	background: var(--vo-surface) !important;
	border: 1px solid var(--vo-border) !important;
	border-left: 1px solid var(--vo-border) !important;
	border-radius: var(--vo-radius-lg) !important;
}

/* --- Intro pédagogique : boîtes internes colorées -> sobres --------------- */
#vauban-onboarding-container #pedagogie-nuki-content [style*="linear-gradient(135deg, #EFF6FF"] {
	background: var(--vo-accent-soft) !important;
	background-image: none !important;
	border-color: var(--vo-accent-border) !important;
}

#vauban-onboarding-container #pedagogie-nuki-content [style*="border-left: 4px solid #1E40AF"],
#vauban-onboarding-container #pedagogie-nuki-content [style*="border-left: 4px solid #10B981"],
#vauban-onboarding-container #pedagogie-nuki-content [style*="border-left: 4px solid #F59E0B"] {
	border-left-color: var(--vo-accent) !important;
}

#vauban-onboarding-container #pedagogie-nuki-content [style*="background: #EFF6FF"] {
	background-color: var(--vo-accent-soft) !important;
}

/* --- Bloc cadeau dynamique : apaisé (fini l'ambre + sticker rouge) -------- */
#vauban-onboarding-container #dynamic-gift-block [style*="linear-gradient(135deg, #FFFBEB"] {
	background: var(--vo-accent-soft) !important;
	background-image: none !important;
	border-color: var(--vo-accent-border) !important;
	box-shadow: var(--vo-shadow-sm) !important;
}

#vauban-onboarding-container #dynamic-gift-block [style*="background: #EF4444"] {
	background-color: var(--vo-accent) !important;
	box-shadow: none !important;
}

#vauban-onboarding-container #dynamic-gift-block [style*="border: 2px solid #F59E0B"] {
	border-color: var(--vo-accent-border) !important;
}

/* --- Bloc d'erreur / blocage technique : danger sobre --------------------- */
#vauban-onboarding-container .vauban-error-box {
	background: var(--vo-danger-soft) !important;
	border: 1px solid color-mix(in srgb, var(--vo-danger) 30%, transparent) !important;
	border-left: 3px solid var(--vo-danger) !important;
	border-radius: var(--vo-radius) !important;
}

/* --- Bloc installation / pastilles ---------------------------------------- */
#vauban-onboarding-container .vauban-installation-block {
	background: var(--vo-surface-muted) !important;
	border: 1px solid var(--vo-border) !important;
	border-left: 3px solid var(--vo-accent) !important;
	border-radius: var(--vo-radius) !important;
}

#vauban-onboarding-container .vauban-installation-pill,
#vauban-onboarding-container .promo-row [style*="background: #10B981"],
#vauban-onboarding-container .promo-row [style*="background:#10B981"] {
	background-color: var(--vo-accent-soft) !important;
	color: var(--vo-accent) !important;
}

#vauban-onboarding-container .vauban-installation-option {
	border-radius: var(--vo-radius) !important;
}

/* --- Champs note + inputs spécifiques step-4 ------------------------------ */
#vauban-onboarding-container .vauban-note-field {
	margin-top: 10px;
}

#vauban-onboarding-container .vauban-input {
	width: 100%;
	padding: 11px 14px !important;
	background-color: var(--vo-surface) !important;
	border: 1px solid var(--vo-border-strong) !important;
	border-radius: var(--vo-radius) !important;
	font-family: var(--vo-font);
	font-size: 14.5px !important;
	color: var(--vo-ink) !important;
	box-sizing: border-box;
}

#vauban-onboarding-container .vauban-input:focus {
	outline: none;
	border-color: var(--vo-accent) !important;
	box-shadow: var(--vo-ring) !important;
}

/* =============================================================================
 * 18. Étapes Deep Clean (5), Documents (7), Récap (9) — re-skin sobre, CSS ONLY
 * --------------------------------------------------------------------------
 * Cartes homogènes, accordéons/onglets/badges/zones d'upload sobres, espacement.
 * Les couleurs legacy sont déjà harmonisées par la §14 ; ici = structure/calme.
 * Aucune modif de markup/JS/flux.
 * ========================================================================== */

/* --- Cartes génériques (Deep Clean & autres) ----------------------------- */
#vauban-onboarding-container .vauban-card {
	background: var(--vo-surface) !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: var(--vo-radius-lg) !important;
	box-shadow: var(--vo-shadow-sm) !important;
	padding: 22px 24px !important;
	margin: 0 0 18px !important;
}

/* Deep Clean : prix mis en avant, sobre */
#vauban-onboarding-container .vauban-price-big {
	color: var(--vo-ink) !important;
}

/* Onglets Deep Clean */
#vauban-onboarding-container .vauban-tab-btn {
	background: transparent !important;
	background-image: none !important;
	border: 1px solid var(--vo-border) !important;
	color: var(--vo-muted) !important;
	border-radius: var(--vo-radius) !important;
	font-weight: 600 !important;
}

#vauban-onboarding-container .vauban-tab-btn.active,
#vauban-onboarding-container .vauban-tab-btn[aria-selected="true"] {
	background: var(--vo-accent-soft) !important;
	border-color: var(--vo-accent) !important;
	color: var(--vo-accent) !important;
}

/* Accordéons sobres (Deep Clean + cadre légal step-7) */
#vauban-onboarding-container .vauban-details,
#vauban-onboarding-container .vauban-legal-accordion {
	background: var(--vo-surface) !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: var(--vo-radius) !important;
	margin: 0 0 12px !important;
	overflow: hidden;
}

#vauban-onboarding-container .vauban-summary,
#vauban-onboarding-container .vauban-legal-summary {
	cursor: pointer;
	list-style: none;
	color: var(--vo-ink) !important;
	font-weight: 600;
}

#vauban-onboarding-container .vauban-summary::-webkit-details-marker,
#vauban-onboarding-container .vauban-legal-summary::-webkit-details-marker {
	display: none;
}

#vauban-onboarding-container .vauban-tariff-sources {
	color: var(--vo-muted) !important;
}

/* --- Documents (step-7) --------------------------------------------------- */
#vauban-onboarding-container .vauban-info-section,
#vauban-onboarding-container .vauban-docs-section,
#vauban-onboarding-container .vauban-doc-card {
	background: var(--vo-surface) !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: var(--vo-radius-lg) !important;
	box-shadow: var(--vo-shadow-sm) !important;
}

/* La section « Documents administratifs » n'avait AUCUN padding : titre, compteur
   et checklist venaient buter contre la bordure de la carte (« bordure collée »).
   Même respiration intérieure que les cartes de document ci-dessous. */
#vauban-onboarding-container .vauban-docs-section {
	padding: 16px 18px !important;
}

#vauban-onboarding-container .vauban-doc-card {
	padding: 16px 18px !important;
	margin: 0 0 12px !important;
	border-left: 3px solid var(--vo-border-strong) !important;
}

/* Badges de documents : sobres, sémantique par teinte douce. */
#vauban-onboarding-container .vauban-doc-badge {
	border-radius: 999px !important;
	font-size: 11px !important;
	font-weight: 600 !important;
	padding: 2px 10px !important;
	background: var(--vo-surface-muted) !important;
	color: var(--vo-muted) !important;
	border: 1px solid var(--vo-border) !important;
	text-transform: none !important;
	letter-spacing: 0 !important;
}

#vauban-onboarding-container .vauban-doc-card-required {
	border-left-color: var(--vo-accent) !important;
}

#vauban-onboarding-container .vauban-doc-card-required .vauban-doc-badge {
	background: var(--vo-accent-soft) !important;
	color: var(--vo-accent) !important;
	border-color: var(--vo-accent-border) !important;
}

/* Zone d'upload : pointillé neutre, hover accent. */
#vauban-onboarding-container .upload-zone,
#vauban-onboarding-container .vauban-upload-zone {
	background: var(--vo-surface-muted) !important;
	border: 1.5px dashed var(--vo-border-strong) !important;
	border-radius: var(--vo-radius) !important;
	transition: border-color 0.15s ease, background-color 0.15s ease;
}

#vauban-onboarding-container .upload-zone:hover,
#vauban-onboarding-container .vauban-upload-zone:hover {
	border-color: var(--vo-accent) !important;
	background: var(--vo-accent-soft) !important;
}

#vauban-onboarding-container .vauban-upload-icon {
	color: var(--vo-accent) !important;
}

/* Note de sécurité documents : sobre (fini le bloc coloré répété). */
#vauban-onboarding-container .vauban-doc-security-note {
	background: var(--vo-surface-muted) !important;
	border: 1px solid var(--vo-border) !important;
	border-left: 3px solid var(--vo-accent) !important;
	border-radius: var(--vo-radius) !important;
}

/* Bloc coordonnées bancaires */
#vauban-onboarding-container .vauban-bank-card-fields {
	background: var(--vo-surface) !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: var(--vo-radius) !important;
}

/* --- Engagements (étape finale step-8) ----------------------------------- */
/* Le socle (step-2-extensions.css) stylait ce bloc en blanc sur fond bleu
   foncé. Ici on repasse le châssis en surface claire : il FAUT donc forcer
   tous les textes du corps en sombre, sinon ils restent blancs (invisibles). */
#vauban-onboarding-container .vauban-engagements {
	background: var(--vo-surface) !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: var(--vo-radius-lg) !important;
	box-shadow: var(--vo-shadow-sm) !important;
	padding: 22px 24px !important;
}

#vauban-onboarding-container .vauban-engagements-title {
	color: var(--vo-ink) !important;
}

#vauban-onboarding-container .vauban-engagements-intro {
	color: var(--vo-muted) !important;
}

#vauban-onboarding-container .vauban-engagement {
	background: var(--vo-accent-soft) !important;
	border: 1px solid var(--vo-border) !important;
}

#vauban-onboarding-container .vauban-engagement-num {
	background: var(--vo-accent) !important;
	color: #fff !important;
	border: 1px solid var(--vo-accent) !important;
}

#vauban-onboarding-container .vauban-engagement-body h4 {
	color: var(--vo-ink) !important;
}

#vauban-onboarding-container .vauban-engagement-body p {
	color: var(--vo-text) !important;
}

#vauban-onboarding-container .vauban-engagements-checks {
	border-top: 1px solid var(--vo-border) !important;
}

#vauban-onboarding-container .vauban-engagement-check {
	color: var(--vo-text) !important;
	border-radius: var(--vo-radius) !important;
}

/* =============================================================================
 * ALLEGEMENTS DE DENSITE PAR ETAPE (2026-05-30) — sections 19 a 24
 * -----------------------------------------------------------------------------
 * Bloc 100% additif et REVERSIBLE (supprimer les sections ci-dessous restaure
 * l'etat anterieur). Issu d'un audit multi-agents + revue adversariale.
 * Regles purement presentationnelles : aucun texte, name=/id=, classe ciblee
 * par le JS, data-*, nonce ou logique n'est touche. AUCUNE regle ne vise
 * l'etape Acces (step-4), volontairement hors perimetre.
 * ========================================================================== */

/* ----- 19. Etape 1 (Votre Bien) — densite verticale -------------------------- */
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section] {
	margin-bottom: 22px !important;
}

#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-form-group {
	margin-bottom: 16px;
}

/* Accordeon « Affiner mon estimation » : air interne resserre (4 fieldsets). */
#vauban-onboarding-container .vo-details__body .vo-group {
	margin-bottom: 16px;
	padding-top: 14px;
}

/* Le 1er groupe garde son padding-haut nul (coherence avec :first-of-type). */
#vauban-onboarding-container .vo-details__body .vo-group:first-of-type {
	padding-top: 0;
}

#vauban-onboarding-container .vo-details__intro {
	margin: 12px 0 16px;
}

/* Carte « Caracteristiques du bien » : bandeau navy -> surface claire sobre. */
#vauban-onboarding-container .vauban-property-card {
	box-shadow: var(--vo-shadow-sm) !important;
	border-color: var(--vo-border) !important;
}

#vauban-onboarding-container .vauban-property-card__header {
	background: var(--vo-surface-muted) !important;
	background-image: none !important;
	border-bottom: 1px solid var(--vo-border) !important;
}

#vauban-onboarding-container .vauban-property-card__title {
	color: var(--vo-ink) !important;
}

#vauban-onboarding-container .vauban-property-card__subtitle {
	color: var(--vo-muted) !important;
}

/* Simulateur de revenus : reduire le vide au-dessus du bloc. */
#vauban-onboarding-container #vauban-revenue-simulator {
	margin-top: 16px !important;
}

/* ----- 20. Etape 2 (Prerequis & Equipements) — densite ----------------------- */
#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-step-header {
	margin-bottom: 14px !important;
}

/* Carte d'intro statistiques : padding + marge basse resserres. */
#vauban-onboarding-container .vauban-step-content[data-step="2"] [style*="margin-bottom: 35px"] {
	padding: 16px 18px !important;
	margin-bottom: 20px !important;
}

#vauban-onboarding-container .vauban-step-content[data-step="2"] .vbn-section-title {
	margin-bottom: 10px !important;
	padding-bottom: 8px !important;
}

#vauban-onboarding-container .vauban-step-content[data-step="2"] [data-vbn-section] {
	margin-bottom: 20px !important;
}

/* Grille des groupes (inventaire / consommables) : colonnes auto-ajustees. */
#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
	gap: 16px !important;
}

/* Chaque groupe = panneau sobre, fond legerement teinte pour separer du formulaire. */
#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category {
	background: var(--vo-surface-muted) !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: 12px !important;
	padding: 16px !important;
	box-shadow: none !important;
}

#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category:hover {
	box-shadow: none !important;
	border-color: var(--vo-border) !important;
}

/* Cases d'un groupe : tuiles selectionnables disposees en grille fluide. */
#vauban-onboarding-container .vauban-step-content[data-step="2"] .category-items {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
	gap: 8px;
}

/* Tuile : surface blanche, bord neutre, retour visuel au survol et a la selection. */
#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category .checkbox-item {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0 !important;
	padding: 11px 13px !important;
	background: var(--vo-surface) !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: 10px !important;
	transition: border-color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
}

#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category .checkbox-item:hover {
	border-color: var(--vo-accent-border) !important;
	background: var(--vo-surface) !important;
	box-shadow: var(--vo-shadow-sm) !important;
}

/* Etat coche : bord accent + fond bleu tres clair, sans surcharge bruyante. */
#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category .checkbox-item:has(input[type="checkbox"]:checked) {
	border-color: var(--vo-accent) !important;
	background: var(--vo-accent-soft) !important;
}

#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category .checkbox-item input[type="checkbox"] {
	width: 18px;
	height: 18px;
	flex-shrink: 0;
	accent-color: var(--vo-accent);
	cursor: pointer;
}

#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category .checkbox-item span {
	font-size: 13.5px;
	line-height: 1.4;
	color: var(--vo-ink);
}

#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category .checkbox-item:has(input[type="checkbox"]:checked) span {
	color: var(--vo-accent);
	font-weight: 600;
}

#vauban-onboarding-container .vauban-step-content[data-step="2"] .vauban-category .checkbox-item span em {
	display: block;
	margin-top: 2px;
	font-size: 11px;
	font-style: normal;
	color: var(--vo-muted);
}

/* Bloc logistique : rapproche le bloc borde de son titre, padding allege. */
#vauban-onboarding-container .vauban-step-content[data-step="2"] [data-vbn-key="logistique"] .vauban-logistique-block {
	margin-top: 8px !important;
	padding: 14px 16px !important;
}

/* ----- 21. Etape 4 (Deep Clean & Maintenance, step-5) — densite -------------- */
#vauban-onboarding-container .vauban-deepclean-step .vauban-details-content ul li,
#vauban-onboarding-container .vauban-deepclean-step .vauban-tab-content ul li,
#vauban-onboarding-container .vauban-deepclean-step .vauban-tariff-sources ul li {
	line-height: 1.5 !important;
}

#vauban-onboarding-container .vauban-deepclean-step .vauban-card {
	padding: 18px 20px !important;
	margin-bottom: 14px !important;
}

#vauban-onboarding-container .vauban-deepclean-step .vauban-pricing-body {
	padding: 20px !important;
}

/* Prix geant 56px -> 44px (valeur dynamique #deep-clean-price inchangee). */
#vauban-onboarding-container .vauban-deepclean-step .vauban-price-big {
	font-size: 44px !important;
}

/* Volet Maintenance : 4 cartes resserrees. */
#vauban-onboarding-container .vauban-deepclean-step .vauban-tab-content[data-tab="maintenance"] > div > div {
	padding: 12px 14px !important;
}

/* ----- 22. Etape 5 (Infos & Documents, step-7) — densite --------------------- */
#vauban-onboarding-container .vauban-doc-card {
	padding: 13px 16px !important;
	margin: 0 0 10px !important;
}

#vauban-onboarding-container .vauban-doc-card-header {
	margin-bottom: 10px;
}

#vauban-onboarding-container .vauban-doc-nav {
	margin-top: 12px;
}

/* Accordeons « Pourquoi ce document ? » (deja fermes) : rendus discrets. */
#vauban-onboarding-container .vauban-doc-info-summary {
	font-size: 12.5px;
	color: var(--vo-muted);
	cursor: pointer;
}

#vauban-onboarding-container .vauban-doc-info-body {
	padding-top: 8px;
	font-size: 13px;
	line-height: 1.5;
	color: var(--vo-text);
}

#vauban-onboarding-container .vauban-doc-info-body p {
	margin: 0 0 8px;
}

#vauban-onboarding-container .vauban-doc-info-body p:last-child {
	margin-bottom: 0;
}

/* Note de securite « Aucun engagement avant signature » : compactee. */
#vauban-onboarding-container .vauban-doc-security-note {
	padding: 12px 14px !important;
}

#vauban-onboarding-container .vauban-doc-security-lead {
	font-size: 13px;
	font-weight: 600;
	color: var(--vo-ink);
	margin: 0 0 4px;
}

#vauban-onboarding-container .vauban-doc-security-text {
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--vo-muted);
	margin: 0;
}

/* Section 1 « Informations personnelles » : bloc + en-tete resserres. */
#vauban-onboarding-container .vauban-info-section {
	padding: 18px 20px !important;
	margin-bottom: 16px !important;
}

#vauban-onboarding-container .vauban-info-section-header {
	margin-bottom: 16px;
}

#vauban-onboarding-container .vauban-info-section-sub {
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--vo-muted);
}

/* Accordeon RGPD bancaire (deja ferme) : rendu secondaire. */
#vauban-onboarding-container .vauban-bank-card-rgpd > summary {
	font-size: 12.5px;
	color: var(--vo-muted);
	cursor: pointer;
}

#vauban-onboarding-container .vauban-bank-card-rgpd ul {
	margin: 8px 0 0;
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--vo-text);
}

#vauban-onboarding-container .vauban-bank-card-rgpd li {
	margin-bottom: 5px;
}

/* Zones d'upload (9 occurrences) : padding et icone resserres. */
#vauban-onboarding-container .vauban-upload-zone {
	padding: 16px 14px !important;
}

#vauban-onboarding-container .vauban-upload-icon {
	width: 26px;
	height: 26px;
}

#vauban-onboarding-container .vauban-upload-label {
	font-size: 13.5px;
	margin: 6px 0 2px;
}

#vauban-onboarding-container .vauban-upload-hint {
	font-size: 12px;
	color: var(--vo-muted);
}

/* ----- 23. Disclaimer (ecran d'accueil) — densite --------------------------- */
#vauban-standalone-wrap .vauban-disclaimer-body {
	gap: 12px 18px !important;
}

#vauban-standalone-wrap .vauban-disclaimer-section {
	margin-bottom: 12px !important;
}

#vauban-standalone-wrap .vauban-disclaimer-section p {
	line-height: 1.45 !important;
}

#vauban-standalone-wrap .vauban-disclaimer-meta {
	margin: 10px 0 !important;
	font-size: 12.5px !important;
	line-height: 1.45 !important;
}

#vauban-standalone-wrap .vauban-disclaimer-divider {
	margin: 14px 0 !important;
}

#vauban-standalone-wrap .vauban-disclaimer-consents {
	margin: 12px 0 !important;
}

/* Grille RGPD (visible une fois depliee) : items et interligne resserres. */
#vauban-standalone-wrap .vauban-disclaimer-rgpd-grid {
	gap: 10px 16px !important;
}

#vauban-standalone-wrap .vauban-disclaimer-rgpd-item span {
	line-height: 1.45 !important;
}

#vauban-standalone-wrap .vauban-disclaimer-rgpd-links {
	margin-top: 12px !important;
}

/* ----- 24. Etape 6 (Recapitulatif & Contrat, step-8) — densite -------------- */
/* Apercu contrat floute : marge basse resserree (rapproche des engagements). */
#vauban-onboarding-container .vauban-step-content[data-step="6"] > div[style*="margin-bottom: 24px"] {
	margin-bottom: 14px !important;
}

/* Engagements : padding/marges/interlignes resserres (complete le re-skin §18). */
#vauban-onboarding-container .vauban-engagements {
	padding: 18px 20px !important;
}

#vauban-onboarding-container .vauban-engagements-intro {
	margin: 6px 0 16px !important;
	line-height: 1.5 !important;
}

#vauban-onboarding-container .vauban-engagement {
	margin-bottom: 10px !important;
}

#vauban-onboarding-container .vauban-engagement-body p {
	line-height: 1.45 !important;
	margin: 4px 0 0 !important;
}

/* =============================================================================
 * 25. ACCEPTATION CGU/CGV (etape finale) — depliant <details> + case obligatoire
 * -----------------------------------------------------------------------------
 * Composant additif scope #vauban-onboarding-container. Couleurs 100% par
 * tokens --vo-* : mode sombre automatique, aucune couleur en dur, aucun patch
 * dark dedie. Le contenu du document (.vauban-cgv-content) herite des tokens,
 * donc reste lisible en clair comme en sombre sans CSS specifique.
 * ========================================================================== */

#vauban-onboarding-container .vauban-cgv {
	margin-top: 18px;
}

#vauban-onboarding-container .vauban-cgv-accordion {
	border: 1px solid var(--vo-border);
	border-radius: var(--vo-radius);
	background: var(--vo-surface);
	overflow: hidden;
}

#vauban-onboarding-container .vauban-cgv-summary {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 14px 16px;
	cursor: pointer;
	font-weight: 600;
	color: var(--vo-ink);
	list-style: none;
	user-select: none;
}

#vauban-onboarding-container .vauban-cgv-summary::-webkit-details-marker {
	display: none;
}

#vauban-onboarding-container .vauban-cgv-summary:hover {
	background: var(--vo-surface-muted);
}

#vauban-onboarding-container .vauban-cgv-summary:focus-visible {
	outline: 2px solid var(--vo-ring);
	outline-offset: -2px;
}

#vauban-onboarding-container .vauban-cgv-summary-icon {
	display: inline-flex;
	flex: 0 0 auto;
	color: var(--vo-muted);
}

#vauban-onboarding-container .vauban-cgv-summary-icon svg {
	width: 18px;
	height: 18px;
}

#vauban-onboarding-container .vauban-cgv-summary-label {
	flex: 1 1 auto;
}

#vauban-onboarding-container .vauban-cgv-summary-chevron {
	flex: 0 0 auto;
	color: var(--vo-muted);
	transition: transform 0.2s ease;
}

#vauban-onboarding-container .vauban-cgv-accordion[open] .vauban-cgv-summary-chevron {
	transform: rotate(180deg);
}

#vauban-onboarding-container .vauban-cgv-body {
	padding: 4px 16px 16px;
	border-top: 1px solid var(--vo-border);
}

#vauban-onboarding-container .vauban-cgv-content {
	max-height: 280px;
	overflow-y: auto;
	padding: 12px 14px;
	border: 1px solid var(--vo-border);
	border-radius: var(--vo-radius);
	background: var(--vo-surface-muted);
	color: var(--vo-text);
	font-size: 13px;
	line-height: 1.6;
}

#vauban-onboarding-container .vauban-cgv-content h3 {
	margin: 0 0 4px;
	font-size: 15px;
	color: var(--vo-ink);
}

#vauban-onboarding-container .vauban-cgv-content h4 {
	margin: 14px 0 4px;
	font-size: 13px;
	color: var(--vo-ink);
}

#vauban-onboarding-container .vauban-cgv-content p {
	margin: 0 0 10px;
}

#vauban-onboarding-container .vauban-cgv-content em {
	font-style: normal;
	font-size: 11px;
	color: var(--vo-muted);
}

#vauban-onboarding-container .vauban-cgv-content strong {
	color: var(--vo-ink);
}

#vauban-onboarding-container .vauban-cgv-iframe {
	width: 100%;
	height: 320px;
	border: 1px solid var(--vo-border);
	border-radius: var(--vo-radius);
	background: var(--vo-surface);
}

#vauban-onboarding-container .vauban-cgv-openlink {
	margin: 8px 0 0;
	font-size: 12px;
}

#vauban-onboarding-container .vauban-cgv-openlink a {
	color: var(--vo-accent);
}

#vauban-onboarding-container .vauban-cgv-check {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	margin-top: 14px;
	padding: 12px 14px;
	border: 1px solid var(--vo-border);
	border-radius: var(--vo-radius);
	background: var(--vo-surface);
	color: var(--vo-text);
	cursor: pointer;
	line-height: 1.45;
}

#vauban-onboarding-container .vauban-cgv-check:hover {
	border-color: var(--vo-border-strong);
}

#vauban-onboarding-container .vauban-cgv-check input[type="checkbox"] {
	flex: 0 0 auto;
	margin-top: 2px;
	accent-color: var(--vo-accent);
}

/* =============================================================================
 * 26. Finitions charte graphique — effets, jeux d'ombre et de lumiere
 * --------------------------------------------------------------------------
 * Enrichit la sidebar et les boutons avec les effets visuels de la charte
 * vitrine : degrade indigo->violet, ombres colorees, halos actifs, reflets
 * de lumiere, transitions premium.
 * Regles additives — viennent apres tout le reste et ont la priorite.
 * ========================================================================== */

/* --- Sidebar : ombre coloree + bord teinté indigo ------------------------- */
@media (min-width: 769px) {
	#vauban-onboarding-container .vauban-sidebar-card {
		box-shadow:
			0 1px 2px rgba(16, 24, 40, 0.04),
			0 6px 28px rgba(79, 70, 229, 0.10) !important;
		border-color: rgba(199, 203, 248, 0.75) !important;
	}
}

/* Icone d'etape : degrade marque indigo->violet + ombre coloree */
#vauban-onboarding-container .vauban-sidebar-header__icon {
	background: linear-gradient(135deg, #4F46E5 0%, #7C3AED 100%) !important;
	color: #FFFFFF !important;
	box-shadow: 0 2px 8px rgba(79, 70, 229, 0.32) !important;
}

/* Barre de progression : degrade marque */
#vauban-onboarding-container .vauban-sidebar-header__fill {
	background: linear-gradient(90deg, #4F46E5 0%, #7C3AED 100%) !important;
}

/* Hover etapes navigables : teinte accent discrete */
#vauban-onboarding-container .vauban-sb-step.vauban-step-nav-clickable:hover {
	background: var(--vt-primary-bg, rgba(79, 70, 229, 0.05)) !important;
}

/* --- Bouton primaire : degrade marque + reflet de lumiere + ombre coloree - */
#vauban-onboarding-container .vauban-btn-primary {
	background: linear-gradient(135deg, #4F46E5 0%, #7C3AED 100%) !important;
	border: 0 !important;
	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.14),
		0 1px 3px rgba(79, 70, 229, 0.24),
		0 4px 14px rgba(79, 70, 229, 0.18) !important;
	position: relative;
	overflow: hidden;
}

#vauban-onboarding-container .vauban-btn-primary:hover {
	background: linear-gradient(135deg, #4338CA 0%, #6D28D9 100%) !important;
	transform: translateY(-2px) !important;
	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.14),
		0 6px 22px rgba(79, 70, 229, 0.38),
		0 2px 8px rgba(79, 70, 229, 0.22) !important;
	color: #FFFFFF !important;
}

#vauban-onboarding-container .vauban-btn-primary:active {
	transform: translateY(0) !important;
	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.10),
		0 1px 4px rgba(79, 70, 229, 0.28) !important;
}

#vauban-onboarding-container .vauban-btn-primary {
	transition: background 0.2s ease, box-shadow 0.25s ease, transform 0.15s ease, opacity 0.25s ease, filter 0.25s ease;
}

/* Bouton « Suivant » verrouillé : nettement grisé (désaturé) pour se distinguer
   de l'état actif coloré — l'utilisateur voit d'un coup d'œil qu'il reste des
   champs à compléter. */
#vauban-onboarding-container .vauban-btn-primary:disabled,
#vauban-onboarding-container .vauban-btn-primary.vbn-next-locked {
	opacity: 0.55 !important;
	cursor: not-allowed;
	transform: none !important;
	box-shadow: none !important;
	background: linear-gradient(135deg, #9CA3AF 0%, #6B7280 100%) !important;
	filter: grayscale(1) !important;
}

/* Passage verrouillé -> prêt : brève pulsation d'attention (jouée une fois via
   la classe .vbn-next-ready posée par step1-progress.js). */
@keyframes vbn-next-ready-pulse {
	0%   { transform: scale(1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.14), 0 1px 3px rgba(79, 70, 229, 0.24), 0 4px 14px rgba(79, 70, 229, 0.18); }
	40%  { transform: scale(1.04); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.18), 0 8px 26px rgba(79, 70, 229, 0.45), 0 3px 10px rgba(79, 70, 229, 0.28); }
	100% { transform: scale(1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.14), 0 1px 3px rgba(79, 70, 229, 0.24), 0 4px 14px rgba(79, 70, 229, 0.18); }
}

#vauban-onboarding-container .vauban-btn-primary.vbn-next-ready {
	animation: vbn-next-ready-pulse 0.6s ease-out 1;
}

@media (prefers-reduced-motion: reduce) {
	#vauban-onboarding-container .vauban-btn-primary.vbn-next-ready {
		animation: none;
	}
}

#vauban-onboarding-container .vauban-btn-primary:focus-visible {
	outline: none !important;
	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.14),
		0 0 0 3px rgba(79, 70, 229, 0.38) !important;
}

/* --- Bouton secondaire : hover teinté accent ------------------------------- */
#vauban-onboarding-container .vauban-btn-secondary {
	box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05) !important;
	transition: background-color 0.15s ease, border-color 0.15s ease,
		box-shadow 0.15s ease, transform 0.12s ease, color 0.15s ease !important;
}

#vauban-onboarding-container .vauban-btn-secondary:hover {
	background: var(--vo-accent-soft) !important;
	border-color: var(--vo-accent-border) !important;
	color: var(--vo-accent) !important;
	transform: translateY(-1px) !important;
	box-shadow: 0 2px 10px rgba(16, 24, 40, 0.08) !important;
}

#vauban-onboarding-container .vauban-btn-secondary:active {
	transform: translateY(0) !important;
	box-shadow: none !important;
}

/* Accessibilite : supprime le lift pour prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
	#vauban-onboarding-container .vauban-btn-primary,
	#vauban-onboarding-container .vauban-btn-secondary {
		transition: background-color 0.15s ease, border-color 0.15s ease !important;
	}
	#vauban-onboarding-container .vauban-btn-primary:hover,
	#vauban-onboarding-container .vauban-btn-secondary:hover,
	#vauban-onboarding-container .vauban-btn-primary:active,
	#vauban-onboarding-container .vauban-btn-secondary:active {
		transform: none !important;
	}
}

/* =============================================================================
 * 27. Sélecteur « riche » ouvert — jonction parfaite avec la barre-question
 * --------------------------------------------------------------------------
 * Le socle `01-base-forms.css` impose le `border-radius` des <select> via une
 * règle à spécificité ID (`#vauban-onboarding-container select`), que le
 * composant générique (`.vauban-select-open`) ne peut pas surcharger. On
 * rétablit donc ici, à spécificité ID, l'état « ouvert » : coins supprimés pour
 * épouser la barre-question au-dessus et la liste en dessous, et bordure
 * IDENTIQUE à celle du menu (`.vauban-select-menu--anchored` → `--vt-primary`).
 * Desktop uniquement (sur mobile, chaque bloc reste arrondi et autonome).
 * ========================================================================== */
@media (min-width: 769px) {
	#vauban-onboarding-container select.vauban-select-open {
		border-radius: 0 !important;
		/* Bordure indigo douce, identique à celle du menu (allégée). */
		border-color: rgba(79, 70, 229, 0.5) !important;
		/* Séparateur bas assuré par la bordure haute du menu (stable au scroll). */
		border-bottom-color: transparent !important;
		/* Champ légèrement grisé tant que le sélecteur est ouvert. */
		background-color: var(--vt-surface-2, #F4F5F7) !important;
		box-shadow: none !important;
	}
}

/* =============================================================================
 * 28. Fond unifié des pancartes blanches (`--vo-card-grad` = surface sobre)
 * --------------------------------------------------------------------------
 * Aligne le fond de ces blocs sur le token de carte `--vo-card-grad` (surface
 * pleine sobre en clair, dégradé navy en sombre) + l'ombre de contour discrète
 * `--vo-card-shadow`. Placé en fin de fichier pour primer sur les règles
 * `background: var(--vo-surface)` définies plus haut (même spécificité).
 * ========================================================================== */
#vauban-onboarding-container .vauban-bailleur-gate,
#vauban-onboarding-container .vo-details {
	background: var(--vo-card-grad) !important;
	box-shadow: var(--vo-card-shadow) !important;
}
/* .vauban-property-card retirée : elle est désormais FONDUE dans sa pancarte
 * parente [data-vbn-section] (cf. section 29) — sinon double-fond. */

/* =============================================================================
 * 29. Étape 1 — Pancartes séquentielles + états (active / completed / pending)
 * --------------------------------------------------------------------------
 * Le moteur progressive-disclosure.js pose déjà data-vbn-state sur chaque
 * section ; jusqu'ici seul "pending" était stylé (masqué). On rend enfin
 * lisibles "active" (mise en avant) et "completed" (apaisée + coche de
 * complétion), et on promeut chaque bloc en pancarte respirante. La pédagogie
 * passe par la HIÉRARCHIE D'ÉTAT (une seule carte attire l'oeil), pas par la
 * couleur vive. 100% tokens --vo-* -> aucune couleur en dur. Scopé [data-step="1"]
 * pour ne pas régresser les autres étapes (qui partagent .vbn-section-title).
 * Aucune ligne de JS modifiée.
 * ========================================================================== */

/* Accroche calme sous le titre d'étape : explique le mécanisme de révélation
 * (sinon les sections "manquantes" masquées inquiètent l'utilisateur). */
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-step-intro {
	margin: -2px 0 24px;
	color: var(--vo-muted);
	font-size: 14px;
	line-height: 1.55;
	max-width: 62ch;
}

/* Promotion en pancarte : sections séquentielles ET blocs de contexte (historique
 * / distribution, hors cascade). Inverse le reset à plat l.207-215 (d'où !important). */
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section],
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-history-block {
	position: relative;
	padding: 26px 28px !important;
	background: var(--vo-card-grad) !important;
	border: 1px solid var(--vo-border) !important;
	border-radius: var(--vo-radius-lg) !important;
	box-shadow: var(--vo-card-shadow) !important;
	transition: padding .35s ease, box-shadow .35s ease,
		background-color .35s ease, border-color .35s ease;
}

/* Rythme vertical homogène entre cartes de contexte et cartes séquentielles. */
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-history-block {
	margin: 0 0 22px;
}

/* État ACTIF : la seule carte mise en avant — fin liseré indigo à gauche. */
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section][data-vbn-state="active"] {
	border-left: 3px solid var(--vo-accent) !important;
}

/* État COMPLÉTÉ : la carte se range et se met en RETRAIT pour reposer l'oeil et
 * laisser l'attention sur la carte active. On garde la même pancarte (dégradé)
 * mais ATTÉNUÉE — opacité réduite + légère désaturation — au lieu d'un fond plat
 * (qui donnait l'impression d'un dégradé « cassé »). Pas de coche verte. Le
 * repère « fait » est porté par la barre de progression à checkpoints. */
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section][data-vbn-state="completed"] {
	padding: 18px 28px !important;
	/* !important nécessaire : les sections révélées portent .vo-reveal dont
	 * l'animation (fill-mode: both) verrouille opacity:1 ; une animation prime sur
	 * une déclaration normale, mais pas sur !important. Sans cela, seules les
	 * sections jamais animées (Identité) s'assombrissaient. */
	opacity: 0.55 !important;
	filter: saturate(0.8) !important;
	box-shadow: var(--vo-shadow-sm) !important;
}
/* Au survol / focus dans la carte complétée : on la « réveille » pour permettre
 * une relecture ou une correction confortable (doit battre le !important ci-dessus). */
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-state="completed"]:hover,
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-state="completed"]:focus-within {
	opacity: 1 !important;
	filter: none !important;
}

/* Blocs de CONTEXTE hors cascade (gate bailleur, historique, distribution) :
 * même grisé « fait » une fois complétés (classe .is-context-done posée par
 * step1-progress.js), pour la cohérence avec les sections terminées. Réveil au
 * survol/focus. La transition est portée par la règle de base de la pancarte. */
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-bailleur-gate.is-context-done,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-history-block.is-context-done {
	opacity: 0.55 !important;
	filter: saturate(0.8) !important;
	transition: opacity 0.35s ease, filter 0.35s ease;
}
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-bailleur-gate.is-context-done:hover,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-bailleur-gate.is-context-done:focus-within,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-history-block.is-context-done:hover,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-history-block.is-context-done:focus-within {
	opacity: 1 !important;
	filter: none !important;
}

/* Caractéristiques : .vauban-property-card devient ENFANT d'une pancarte ->
 * on la fond dans sa parente (plus de carte-dans-la-carte). */
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section] .vauban-property-card {
	margin: 0 !important;
	background: transparent !important;
	border: 0 !important;
	box-shadow: none !important;
	border-radius: 0 !important;
}
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section] .vauban-property-card__header {
	background: transparent !important;
	border-bottom: 0 !important;
	padding: 0 0 4px !important;
}
#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section] .vauban-property-card__body {
	padding: 0 !important;
	background: transparent !important;
}

/* Titres de carte en étape 1 : pas de filet sous le titre (le cadre de la
 * pancarte porte déjà la séparation) + icône N&B alignée devant le libellé. */
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vbn-section-title {
	border-bottom: 0;
	padding-bottom: 0;
	margin-bottom: 16px;
}
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vbn-section-title,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vo-group__legend,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-property-card__title {
	display: flex;
	align-items: center;
	gap: 9px;
}
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vbn-section-title .v-icon,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vo-group__legend .v-icon,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-property-card__title .v-icon {
	flex-shrink: 0;
	color: var(--vo-accent);
}
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vbn-section-title .v-icon svg,
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-property-card__title .v-icon svg {
	width: 18px;
	height: 18px;
}
#vauban-onboarding-container .vauban-step-content[data-step="1"] .vo-group__legend .v-icon svg {
	width: 15px;
	height: 15px;
}
/* Mobile : padding resserré, pancartes toujours bien détachées. */
@media (max-width: 768px) {
	#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section],
	#vauban-onboarding-container .vauban-step-content[data-step="1"] .vauban-history-block {
		padding: 18px 18px !important;
	}
	#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section][data-vbn-state="completed"] {
		padding: 14px 18px !important;
	}
}

/* Accessibilité : pas de transition de pancarte si mouvement réduit. */
@media (prefers-reduced-motion: reduce) {
	#vauban-onboarding-container .vauban-step-content[data-step="1"] [data-vbn-section] {
		transition: none;
	}
}

/* =============================================================================
 * 30. Étape 1 — Barre de progression à checkpoints (#vauban-step1-progress)
 * --------------------------------------------------------------------------
 * Construite et mise à jour par assets/js/onboarding/step1-progress.js à partir
 * des data-vbn-state. Collante en haut, elle matérialise l'avancée des grandes
 * étapes jusqu'au noeud final « Estimation » (= déblocage du simulateur).
 * 100% tokens --vo-* -> cohérent charte. Vide tant que le JS ne l'a pas remplie.
 * ========================================================================== */
#vauban-onboarding-container .vbn-progress {
	position: sticky;
	top: 14px;
	z-index: 20;
	margin: 6px 0 24px;
	padding: 14px 10px 12px;
	background: var(--vo-surface);
	border: 1px solid var(--vo-border);
	border-radius: var(--vo-radius-lg);
	box-shadow: var(--vo-shadow-sm);
}
#vauban-onboarding-container .vbn-progress:empty {
	display: none;
}
#vauban-onboarding-container .vbn-progress__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	justify-content: space-between;
	position: relative;
}
/* Rail de fond + barre de progression (largeur posée en variable par le JS). */
#vauban-onboarding-container .vbn-progress__list::before,
#vauban-onboarding-container .vbn-progress__list::after {
	content: "";
	position: absolute;
	top: 11px;
	left: 7%;
	right: 7%;
	height: 2px;
	border-radius: 2px;
}
#vauban-onboarding-container .vbn-progress__list::before {
	background: var(--vo-border);
}
#vauban-onboarding-container .vbn-progress__list::after {
	background: var(--vo-accent);
	right: auto;
	width: calc((100% - 14%) * var(--vbn-progress, 0));
	transition: width 0.45s cubic-bezier(0.22, 0.61, 0.36, 1);
}
#vauban-onboarding-container .vbn-progress__item {
	flex: 1 1 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 6px;
	position: relative;
	z-index: 1;
	min-width: 0;
}
#vauban-onboarding-container .vbn-progress__node {
	width: 24px;
	height: 24px;
	border-radius: 50%;
	background: var(--vo-surface);
	border: 2px solid var(--vo-border);
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	font-family: var(--vo-font);
	font-size: 11px;
	font-weight: 800;
	line-height: 1;
	color: var(--vo-faint);
	transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease, transform 0.3s ease;
}
#vauban-onboarding-container .vbn-progress__text {
	font-family: var(--vo-font);
	font-size: 11px;
	font-weight: 600;
	line-height: 1.2;
	text-align: center;
	color: var(--vo-faint);
	max-width: 9ch;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	transition: color 0.3s ease;
}
/* État « complété » : noeud accent plein + numéro blanc. */
#vauban-onboarding-container .vbn-progress__item.is-done .vbn-progress__node {
	background: var(--vo-accent);
	border-color: var(--vo-accent);
	color: #FFFFFF;
}
#vauban-onboarding-container .vbn-progress__item.is-done .vbn-progress__text {
	color: var(--vo-text);
}
/* État « courant » : noeud cerclé accent + halo, libellé en évidence. */
#vauban-onboarding-container .vbn-progress__item.is-current .vbn-progress__node {
	border-color: var(--vo-accent);
	color: var(--vo-accent);
	box-shadow: 0 0 0 4px var(--vo-accent-soft);
	transform: scale(1.06);
}
#vauban-onboarding-container .vbn-progress__item.is-current .vbn-progress__text {
	color: var(--vo-ink);
	font-weight: 700;
}
/* Noeud final « Estimation » (objectif) : atteint = pastille pleine + numéro
 * blanc. Le nœud goal porte SIMULTANÉMENT is-done ET is-current (posés ensemble
 * quand allDone) ; sans cette règle, le `color: var(--vo-accent)` de .is-current
 * (déclaré plus haut, spécificité égale) l'emporterait → numéro accent sur fond
 * accent = invisible. On réaffirme donc le blanc ici (règle plus tardive). */
#vauban-onboarding-container .vbn-progress__item--goal.is-done .vbn-progress__node {
	transform: scale(1.1);
	color: #FFFFFF;
}

/* Checkpoint COMPLÉTÉ = cliquable : ramène à la section correspondante. Les
 * étapes non accomplies ne sont pas interactives (curseur par défaut). */
#vauban-onboarding-container .vbn-progress__item.is-done {
	cursor: pointer;
}
#vauban-onboarding-container .vbn-progress__item.is-done:hover .vbn-progress__node {
	box-shadow: 0 0 0 4px var(--vo-accent-soft);
}
#vauban-onboarding-container .vbn-progress__item.is-done:hover .vbn-progress__text {
	color: var(--vo-accent);
}
#vauban-onboarding-container .vbn-progress__item.is-done:focus-visible {
	outline: 2px solid var(--vo-accent);
	outline-offset: 3px;
	border-radius: 8px;
}

/* Bouton « Suivant » verrouillé tant que l'estimation n'est pas générée :
 * grisé + non interactif (l'attribut `disabled` neutralise clic ET clavier). */
#vauban-onboarding-container button[name="vauban_next_step"]:disabled,
#vauban-onboarding-container button[name="vauban_next_step"].vbn-next-locked {
	opacity: 0.5;
	cursor: not-allowed;
	box-shadow: none;
	filter: grayscale(0.25);
}

/* Onboarding obligatoire (2026-07-20) — feedback au clic sur un bouton « Suivant »
 * verrouillé. Les scripts de progression (step1-progress.js, etc.) posent l'attribut
 * natif `disabled` (+ .vbn-next-locked) : un bouton `disabled` n'émet aucun clic, donc
 * aucun retour possible. On pose `pointer-events:none` sur le bouton verrouillé -> le clic
 * « traverse » vers le conteneur .vauban-form-actions, où le JS le capte pour surligner
 * les champs manquants (VaubanOnboarding.initLockedNextFeedback). Le curseur
 * « not-allowed » est reporté sur le conteneur d'actions.
 * 100% tokens sémantiques (--vt-*) : aucune couleur en dur (lint anti-hex). */
#vauban-onboarding-container .vauban-form-actions:has(> button[name="vauban_next_step"]:disabled),
#vauban-onboarding-container .vauban-form-actions:has(> button[name="vauban_next_step"].vbn-next-locked) {
	cursor: not-allowed;
}
#vauban-onboarding-container .vauban-form-actions button[name="vauban_next_step"]:disabled,
#vauban-onboarding-container .vauban-form-actions button[name="vauban_next_step"].vbn-next-locked {
	pointer-events: none;
}

#vauban-onboarding-container .vbn-field-invalid,
#vauban-onboarding-container .vbn-field-invalid input:not([type="radio"]):not([type="checkbox"]),
#vauban-onboarding-container .vbn-field-invalid select,
#vauban-onboarding-container .vbn-field-invalid textarea {
	border-color: var(--vt-danger) !important;
	box-shadow: 0 0 0 3px var(--vt-danger-bg);
}

#vauban-onboarding-container .vbn-required-msg {
	display: inline-flex;
	align-items: center;
	margin-top: 6px;
	padding: 3px 8px;
	font-size: 12px;
	font-weight: 600;
	line-height: 1.4;
	color: var(--vt-danger);
	background: var(--vt-danger-bg);
	border-left: 3px solid var(--vt-danger);
	border-radius: 6px;
}

/* Bandeau de validation refusée, rendu EN TÊTE de l'étape concernée. Remplace la
 * page d'arrêt autonome : l'utilisateur reste dans son étape, sa saisie intacte,
 * et lit ce qu'il lui reste à compléter. 100 % tokens sémantiques (--vt-*). */
#vauban-onboarding-container .vbn-step-error {
	display: flex;
	gap: 12px;
	align-items: flex-start;
	margin: 0 0 20px;
	padding: 14px 16px;
	color: var(--vt-text);
	background: var(--vt-danger-bg);
	border: 1px solid var(--vt-danger);
	border-left-width: 4px;
	border-radius: 10px;
}

#vauban-onboarding-container .vbn-step-error:focus-visible {
	outline: 2px solid var(--vt-danger);
	outline-offset: 3px;
}

#vauban-onboarding-container .vbn-step-error__icon {
	display: inline-flex;
	flex: 0 0 auto;
	margin-top: 1px;
	color: var(--vt-danger);
}

#vauban-onboarding-container .vbn-step-error__body {
	min-width: 0;
}

#vauban-onboarding-container .vbn-step-error__title {
	margin: 0 0 4px;
	font-size: 15px;
	font-weight: 700;
	line-height: 1.35;
	color: var(--vt-danger);
}

#vauban-onboarding-container .vbn-step-error__text {
	margin: 0;
	font-size: 14px;
	line-height: 1.55;
}

@media (max-width: 600px) {
	#vauban-onboarding-container .vbn-progress__text {
		font-size: 0;
	}
	#vauban-onboarding-container .vbn-progress__item.is-current .vbn-progress__text {
		font-size: 10px;
	}
}

@media (prefers-reduced-motion: reduce) {
	#vauban-onboarding-container .vbn-progress__list::after,
	#vauban-onboarding-container .vbn-progress__node {
		transition: none;
	}
}

/* =============================================================================
 * 31. RESPIRATION MOBILE — étapes 2+ (hors étape 1)
 * -----------------------------------------------------------------------------
 * Contexte : en mobile (<= 768px), le socle 01-base-forms.css empile les
 * `.vauban-form-row` avec `gap: 0`. Or les colonnes SONT elles-mêmes des
 * `.vauban-form-group` (markup `class="vauban-form-group vauban-col-*"`) : le
 * seul espace entre deux champs empilés est alors la marge basse du groupe
 * (20px), ce qui paraît tassé sur petit écran. L'étape 1 échappe à ce ressenti
 * (ses rangées sont des grilles `.vo-group` à gap propre + pancartes aérées) ;
 * toutes les autres étapes manquent d'air.
 *
 * On augmente donc le rythme vertical, UNIQUEMENT en mobile et UNIQUEMENT pour
 * les étapes != 1 (scope `:not([data-step="1"])`). La marge du `.vauban-form-group`
 * reste l'UNIQUE source d'espace entre champs : on n'ajoute aucun `gap` de
 * rangée -> pas de double-espacement avec les colonnes (qui sont les groupes).
 * 100% présentation, scopé par ID (prime sur la spécificité du socle), additif
 * et réversible (supprimer cette section restaure l'état antérieur).
 * ========================================================================== */
@media (max-width: 768px) {
	/* Espace entre champs : groupes autonomes ET colonnes empilées d'une rangée. */
	#vauban-onboarding-container .vauban-step-content:not([data-step="1"]) .vauban-form-group {
		margin-bottom: 26px !important;
	}

	/* Séparation entre cartes/sections empilées (resserrées par les §17/18/22). */
	#vauban-onboarding-container .vauban-step-content:not([data-step="1"]) .vauban-form-section,
	#vauban-onboarding-container .vauban-step-content:not([data-step="1"]) .vauban-card,
	#vauban-onboarding-container .vauban-step-content:not([data-step="1"]) .vauban-info-section,
	#vauban-onboarding-container .vauban-step-content:not([data-step="1"]) .vauban-doc-card {
		margin-bottom: 22px !important;
	}

	/* Un filet d'air sous les titres de section et l'en-tête d'étape. */
	#vauban-onboarding-container .vauban-step-content:not([data-step="1"]) .vbn-section-title {
		margin-bottom: 18px !important;
		padding-bottom: 12px !important;
	}

	#vauban-onboarding-container .vauban-step-content:not([data-step="1"]) .vauban-step-header {
		margin-bottom: 26px !important;
	}
}

/* =============================================================================
 * 32. Rail d'étape relocalisé dans le menu latéral (chantier 2026-06-07)
 * -----------------------------------------------------------------------------
 * Chaque étape porte un rail de sous-progression (.vbn2-rail OU .vbn-progress)
 * authoré dans son template. assets/js/onboarding/onboarding-rail-relocate.js le
 * déplace au runtime dans l'emplacement #vauban-sb-substeps-slot du menu (un
 * <li class="vauban-sb-substeps"> inséré juste sous l'item de l'étape courante).
 * Ces règles habillent ce rail relocalisé :
 *   - PC (>= 769px) : « panneau décalé » vertical, légèrement asymétrique ;
 *   - mobile (<= 768px) : bande pleine largeur collée sous le menu-header.
 * Sélecteurs groupés couvrant les DEUX composants, scopés sous .vauban-sb-substeps
 * (ID + 2 classes -> prime sur les bases .vbn-progress / .vbn2-rail).
 * ========================================================================== */

/* Anti-flash : rail masqué tant qu'il vit dans le formulaire (JS actif). */
html.vbn-rails-js #vauban-onboarding-container .vauban-form-container [data-vbn2-rail],
html.vbn-rails-js #vauban-onboarding-container .vauban-form-container .vbn-progress {
	display: none !important;
}

/* Emplacement vide (avant relocalisation, ou rail absent) : n'occupe rien. */
#vauban-onboarding-container .vauban-sb-substeps:empty {
	display: none !important;
}

/* Conteneur relocalisé : neutraliser son chrome propre (porté par le panneau) et
   son positionnement collant d'origine. */
#vauban-onboarding-container .vauban-sb-substeps .vbn2-rail,
#vauban-onboarding-container .vauban-sb-substeps .vbn-progress {
	position: static;
	top: auto;
	margin: 0;
	padding: 0;
	background: transparent;
	border: 0;
	box-shadow: none;
	z-index: auto;
}

/* ----- PC : panneau intégré (continuation visuelle de l'étape active) ------ */
@media (min-width: 769px) {
	/* Aplatir les coins inférieurs de l'étape active quand les sous-étapes sont visibles :
	   le bloc étape + sous-étapes forme un seul ensemble visuel sans rupture. */
	#vauban-onboarding-container .vauban-sb-step.is-current:has(+ .vauban-sb-substeps:not(:empty)) {
		border-bottom-left-radius: 0 !important;
		border-bottom-right-radius: 0 !important;
	}

	#vauban-onboarding-container .vauban-sb-substeps {
		list-style: none;
		position: relative;
		/* margin-top négatif absorbe le gap flex (2px) : le panneau colle directement
		   sous l'étape active, sans saut visible entre les deux. */
		margin: -2px 0 6px;
		margin-left: 0;
		margin-right: 0;
		padding: 8px 10px 10px 14px;
		background: var(--vt-primary-bg, rgba(79, 70, 229, 0.06));
		border: 0;
		/* Seul le filet gauche accent subsiste : continuité avec la bordure de l'étape. */
		border-left: 3px solid var(--vo-accent);
		/* Coins arrondis uniquement en bas ; les coins hauts se fondent dans l'étape. */
		border-radius: 0 0 8px 8px;
		box-shadow: none;
	}

	/* Guide vertical pointillé derrière les pastilles (touche éditoriale).
	   `left` calé sur le centre des pastilles : padding-left du panneau (14px) +
	   padding-left de l'item (5px) + demi-pastille (21/2). */
	#vauban-onboarding-container .vauban-sb-substeps::before {
		content: "";
		position: absolute;
		left: 29px;
		top: 14px;
		bottom: 16px;
		width: 2px;
		background: repeating-linear-gradient(180deg, rgba(79, 70, 229, 0.22) 0 5px, transparent 5px 10px);
		pointer-events: none;
	}

	/* Conteneurs + liste : empilement vertical. */
	#vauban-onboarding-container .vauban-sb-substeps .vbn2-rail,
	#vauban-onboarding-container .vauban-sb-substeps .vbn-progress,
	#vauban-onboarding-container .vauban-sb-substeps .vbn-progress__list {
		display: flex;
		flex-direction: column;
		align-items: stretch;
		gap: 1px;
	}

	/* Masquer les connecteurs HORIZONTAUX (le panneau a son guide vertical). */
	#vauban-onboarding-container .vauban-sb-substeps .vbn2-rail-line,
	#vauban-onboarding-container .vauban-sb-substeps .vbn-progress__list::before,
	#vauban-onboarding-container .vauban-sb-substeps .vbn-progress__list::after {
		display: none;
	}

	/* Items : pastille + libellé en ligne, alignés à gauche. */
	#vauban-onboarding-container .vauban-sb-substeps .vbn2-rail-step,
	#vauban-onboarding-container .vauban-sb-substeps .vbn-progress__item {
		flex: none;
		flex-direction: row;
		align-items: center;
		justify-content: flex-start;
		gap: 9px;
		width: 100%;
		min-width: 0;
		padding: 4px 4px;
		text-align: left;
	}

	/* Pastilles : au-dessus du guide. */
	#vauban-onboarding-container .vauban-sb-substeps .vbn2-rail-n,
	#vauban-onboarding-container .vauban-sb-substeps .vbn-progress__node {
		position: relative;
		z-index: 1;
		flex-shrink: 0;
	}

	/* Libellés : multi-lignes, alignés à gauche (plus de troncature horizontale). */
	#vauban-onboarding-container .vauban-sb-substeps .vbn2-rail-t,
	#vauban-onboarding-container .vauban-sb-substeps .vbn-progress__text {
		max-width: none;
		white-space: normal;
		text-align: left;
		font-size: 12px;
		line-height: 1.25;
		overflow: visible;
	}
}

/* ----- Mobile : bande pleine largeur collée sous le menu-header -------------- */
@media (max-width: 768px) {
	/* La liste d'étapes passe en wrap pour laisser le panneau prendre sa ligne. */
	#vauban-onboarding-container .vauban-sidebar-steps--with-substeps {
		flex-wrap: wrap !important;
	}

	/* Emplacement = bande pleine largeur, juste sous la rangée de pastilles. */
	#vauban-onboarding-container .vauban-sb-substeps {
		flex: 0 0 100% !important;
		order: 50;
		width: 100%;
		list-style: none;
		margin: 8px 0 0 !important;
		padding: 8px 8px;
		background: linear-gradient(180deg, rgba(79, 70, 229, 0.05) 0%, rgba(124, 58, 237, 0.04) 100%);
		border: 1px solid rgba(79, 70, 229, 0.14);
		border-radius: 10px;
	}

	/* Conteneurs internes : à plat ; le rail conserve sa disposition HORIZONTALE
	   de base, simplement déplacée dans le menu. */
	#vauban-onboarding-container .vauban-sb-substeps .vbn2-rail,
	#vauban-onboarding-container .vauban-sb-substeps .vbn-progress {
		position: static !important;
		top: auto !important;
		margin: 0 !important;
		padding: 0 !important;
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
		width: 100%;
	}
}

/* =============================================================================
 * 33. Menu latéral « écran partagé » — panneau gauche COLLANT pleine hauteur,
 *     mis à l'échelle pour TOUT afficher sans scroll (config 2026-06-07).
 * -----------------------------------------------------------------------------
 * Split 50/50 (largeur 50% héritée de §3 flex:1 1 0). Le menu reste COLLANT et
 * occupe toute la hauteur du viewport sous l'en-tête WP. Tout son contenu est
 * enveloppé dans #vauban-sidebar-fit, que assets/js/onboarding/onboarding-sidebar-fit.js
 * met à l'échelle (transform: scale) pour qu'il TIENNE ENTIÈREMENT dans la hauteur
 * du panneau : aucun scroll, rien de rogné, quelle que soit la taille d'écran (le
 * JS fixe aussi la hauteur rendue -> le panneau ne déborde jamais). Repli sans JS :
 * overflow défilable à barre masquée (rien n'est perdu). Le formulaire de droite
 * (flex:1, non touché) défile via le scroll de page. Scopé hors embed, en fin de
 * fichier -> prime sur §3 / §3-bis (sticky, max-height, overflow).
 * ========================================================================== */
@media (min-width: 769px) {
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-nav {
		position: sticky !important;
		top: calc(var(--vauban-sticky-header-offset, 140px) + 12px) !important;
		align-self: flex-start !important;
		height: calc(100vh - var(--vauban-sticky-header-offset, 140px) - 24px) !important;
		max-height: calc(100vh - var(--vauban-sticky-header-offset, 140px) - 24px) !important;
		display: block !important;
		overflow-y: auto !important;
		overflow-x: hidden !important;
		/* Barre de défilement INTERNE fine et sobre : le menu garde sa taille normale
		   (grands éléments) et défile à l'intérieur si le contenu dépasse la hauteur. */
		scrollbar-width: thin !important;
		scrollbar-color: var(--vo-border-strong) transparent !important;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-nav::-webkit-scrollbar {
		width: 9px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-nav::-webkit-scrollbar-thumb {
		background: var(--vo-border-strong);
		border-radius: 999px;
		border: 2px solid transparent;
		background-clip: padding-box;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-nav::-webkit-scrollbar-track {
		background: transparent;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-fit {
		width: 100%;
	}
}

/* =============================================================================
 * 34. Menu latéral plein écran : éléments & textes NETTEMENT AGRANDIS (desktop)
 *     pour la lisibilité dans la colonne large. Le menu garde sa taille normale
 *     et défile à l'intérieur (barre fine, §33) si le contenu dépasse. Scopé hors
 *     embed et en min-width:769px -> n'affecte pas le header mobile.
 * ========================================================================== */
@media (min-width: 769px) {
	/* En-tête de carte */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-header__step {
		font-size: 13px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-header__title {
		font-size: 18px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-header__desc {
		font-size: 13px;
		font-style: normal;
		opacity: 0.75;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-header__icon {
		width: 42px;
		height: 42px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-header__icon svg {
		width: 20px;
		height: 20px;
	}

	/* Étapes principales (liste d'aperçu) : COMPACTES pour voir les 7 d'un coup. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step {
		padding: 7px 12px !important;
		gap: 11px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step__dot {
		width: 24px;
		height: 24px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step__n {
		font-size: 12.5px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step__txt {
		font-size: 13.5px;
	}

	/* Sous-rail (panneau décalé) : pastilles + libellés.
	   Le sous-rail est un NIVEAU SUBORDONNÉ à l'étape parente : ses pastilles et
	   libellés restent donc LÉGÈREMENT plus petits que ceux des étapes principales
	   (dots 24px, libellés 13.5px) pour traduire la hiérarchie et éviter l'effet
	   « zoomé » (un sous-élément ne doit pas paraître plus gros que son parent). */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps {
		padding: 8px 12px 8px 14px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__node,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-n {
		width: 21px;
		height: 21px;
		font-size: 11px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__text,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-t {
		font-size: 12.5px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__item,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-step {
		padding: 4px 5px;
		gap: 9px;
	}

	/* Réassurance + boutons bas de menu */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-foot {
		font-size: 14.5px;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-home-btn,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-reset-btn,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-dev-btn {
		font-size: 14.5px;
		padding: 12px 14px;
	}
}

/* Allègement du menu (v20.4.9) : « Recommencer à zéro » = action RARE → présentation
   discrète (lien texte souligné) au lieu d'un bouton plein, sur tous les écrans (le
   double sélecteur bat la règle mobile qui agrandit les autres boutons du bas). */
#vauban-onboarding-container .vauban-sidebar-reset {
	margin-top: 6px;
}
#vauban-onboarding-container .vauban-sidebar-reset-btn,
#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-reset-btn {
	border-color: transparent;
	background: transparent;
	padding: 6px 8px;
	font-size: 12px;
	font-weight: 500;
	color: var(--vo-faint);
	text-decoration: underline;
	text-underline-offset: 2px;
}
#vauban-onboarding-container .vauban-sidebar-reset-btn:hover,
#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-reset-btn:hover {
	background: transparent;
	color: var(--vo-muted);
	text-decoration: none;
}

/* =============================================================================
 * 35. Header du menu COLLANT à l'intérieur du panneau (desktop) : le bloc
 *     « ÉTAPE X/Y + nom de l'étape » reste visible quand on défile DANS le menu.
 *     Fond opaque (= fond de carte) + coins arrondis haut pour masquer proprement
 *     le contenu qui défile dessous. La carte n'étant pas un conteneur de
 *     défilement (overflow visible), le sticky se cale sur le panneau (#vauban-sidebar).
 * ========================================================================== */
@media (min-width: 769px) {
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-header {
		position: sticky !important;
		top: 0;
		z-index: 5;
		/* Fond BLANC opaque -> masque TOTALEMENT le contenu qui défile dessous. Marges
		   négatives haut ET côtés : le header est ancré tout en haut du panneau (pas de
		   « snap » au scroll) et s'étend sur TOUTE LA LARGEUR du panneau (jusqu'aux bords
		   de la carte), donc le sous-rail (qui déborde un peu) ne dépasse plus sur les
		   côtés. Coins HAUT arrondis (= panneau), bas plat (barre qui couvre le contenu). */
		margin: -16px -14px 12px !important;
		padding: 14px 18px !important;
		background: var(--vt-surface-1, #ffffff) !important;
		border: 0 !important;
		border-bottom: 1px solid rgba(79, 70, 229, 0.14) !important;
		border-radius: var(--vo-radius-lg) var(--vo-radius-lg) 0 0 !important;
		box-shadow: 0 6px 16px -8px rgba(79, 70, 229, 0.22) !important;
	}
}

/* =============================================================================
 * 36. Contenu du formulaire : MASQUER le titre d'étape (.vauban-step-header) —
 *     redondant avec le menu latéral qui affiche déjà le nom de l'étape (et son
 *     header collant). Déjà masqué en mobile par le socle (01-base-forms.css) ;
 *     on l'aligne en desktop pour la même cohérence.
 * ========================================================================== */
#vauban-onboarding-container .vauban-step-content .vauban-step-header {
	display: none !important;
}

/* =============================================================================
 * 37. Menu latéral : masquer le bouton « Retour à l'accueil ».
 * ========================================================================== */
#vauban-onboarding-container .vauban-sidebar-home {
	display: none !important;
}

/* =============================================================================
 * 38. Menu : le PANNEAU FIXE (#vauban-sidebar) porte le fond / bordure / arrondi ;
 *     la carte interne devient TRANSPARENTE. Sinon, en défilant DANS le menu, la
 *     carte (bloc visible) « remontait » sous le header collant. Le panneau ne
 *     défilant pas, plus aucun bloc ne bouge — seul le contenu défile.
 * ========================================================================== */
@media (min-width: 769px) {
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-nav {
		background: var(--vt-sidebar-bg, linear-gradient(160deg, #fafbff 0%, #f5f7ff 100%)) !important;
		border: 1px solid rgba(199, 203, 248, 0.75) !important;
		border-radius: var(--vo-radius-lg) !important;
		box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04), 0 6px 28px rgba(79, 70, 229, 0.10) !important;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-card {
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
		border-radius: 0 !important;
	}
}

/* =============================================================================
 * 39. Pied de page du formulaire : BARRE FIXE par-dessus la page (desktop). Le
 *     footer est RELOCALISÉ dans <body> par le JS (position fixed correcte hors du
 *     conteneur full-bleed) et reçoit la classe `.vauban-form-actions--fixed`. La
 *     position (left / width / bottom) est posée en JS (cale sur la colonne du
 *     formulaire) ; ici l'HABILLAGE en règle GLOBALE (le footer n'est plus sous
 *     #vauban-onboarding-container). Les boutons Contact / Retour / Suivant restent
 *     visibles en bas sur CHAQUE étape, sans dépendre du scroll du contenu.
 *     SANS habillage (demande utilisateur 2026-06-10) : fond transparent, ni
 *     bordure ni ombre ni verre dépoli — seuls les boutons sont visibles.
 *     Centrage horizontal pour un alignement équilibré (moins à droite que
 *     flex-end). Identique en thème sombre (transparent dans les deux).
 * ========================================================================== */
.vauban-form-actions.vauban-form-actions--fixed {
	display: flex !important;
	align-items: center;
	justify-content: center;
	gap: 14px;
	background: transparent !important;
	box-sizing: border-box;
	padding: 14px 28px;
	border-top: 0;
	box-shadow: none;
}

.vauban-form-actions.vauban-form-actions--fixed .vauban-contact-btn {
	display: none !important;
}

.vauban-form-actions.vauban-form-actions--fixed.vauban-form-actions--two {
	justify-content: center;
}

.vauban-form-actions.vauban-form-actions--fixed.vauban-form-actions--two .vauban-contact-btn {
	margin-right: auto;
}

/* =============================================================================
 * 40. MOBILE (<= 768px) — Menu latéral COLLANT en haut (sous l'en-tête du site)
 *     + barre d'actions COLLANTE en bas de l'écran.
 * -----------------------------------------------------------------------------
 * Sur petit écran, le socle 01-base-forms.css empile la mise en page
 * (`.vauban-onboarding-layout` en `flex-direction: column`) et fige la sidebar en
 * `position: static`. On la repositionne ici en bandeau COLLANT, calé juste sous
 * l'en-tête mobile du site (`.vbm-header`, lui-même `sticky` ; sa hauteur est
 * exposée par `--vbm-header-height`, déjà agrégée avec l'admin-bar dans
 * `--vauban-sticky-header-offset`). La progression reste ainsi visible pendant le
 * défilement. En pied d'écran, on épingle les boutons Retour / Suivant / Contact.
 *
 * Spécificité par ID (#vauban-onboarding-container) -> prime sur le
 * `position: static !important` du socle. Cette feuille est versionnée par
 * filemtime (cache-bust automatique) -> pas de piège @import. Le JS desktop
 * (onboarding-sidebar-fit.js) ne pose aucun style en mobile (il purge ses offsets
 * et ne relocalise pas le pied de page) -> ces règles s'appliquent sans conflit.
 * ========================================================================== */
@media (max-width: 768px) {
	.vauban-disclaimer-screen {
		/* Sur /formulaire/ il n'y a PAS de .vbm-header : c'est l'en-tête Astra qui
		   reste `position:fixed` (~70 px) au-dessus de l'intro (la neutralisation
		   position:relative de la section 99 est scopée >=769px). Mesuré le
		   2026-08-03 : avec la simple respiration précédente (~18 px), le titre
		   « Bienvenue… » passait sous l'en-tête. On réserve donc sa hauteur réelle
		   (repli 72 px) + un peu d'air. */
		padding-top: calc(
			var(--vbm-header-height, 72px) + var(--wp-admin--admin-bar--height, 0px) + 16px
		) !important;
	}

	/* Menu latéral -> bandeau collant sous l'en-tête mobile du site. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-nav {
		position: sticky !important;
		top: var(--vauban-sticky-header-offset, 64px) !important;
		z-index: 100 !important; /* sous .vbm-header (100002), au-dessus du contenu */
		/* Fond opaque : le contenu du formulaire défile proprement dessous. */
		background: var(--vo-surface, #ffffff) !important;
		/* Garde-fou : ne dépasse jamais la hauteur dispo (défile en interne si trop long). */
		max-height: calc(100vh - var(--vauban-sticky-header-offset, 64px) - 12px) !important;
		overflow-y: auto !important;
		overflow-x: hidden !important;
		/* Détache visuellement le bandeau du contenu qui défile dessous. */
		box-shadow: 0 8px 18px -12px rgba(16, 24, 40, 0.4) !important;
		border-radius: 0 0 14px 14px !important;
		padding-bottom: 8px !important;
	}

	/* Barre d'actions -> bandeau collé en BAS de l'écran, TOUJOURS visible pendant
	   le défilement (Retour / Suivant / Contact).
	   `position: fixed` EN PLACE est impossible ici : un ancêtre de la mise en page
	   (page Elementor) crée un bloc englobant, si bien que `fixed` se cale sur lui et
	   non sur le viewport (vérifié : la barre restait hors écran). La barre est donc
	   RELOCALISÉE dans <body> par assets/js/onboarding/onboarding-mobile-actionbar.js
	   (qui pose aussi l'attribut `form` sur les boutons submit pour qu'ils continuent
	   de soumettre leur formulaire d'origine) ; elle reçoit la classe
	   `vauban-form-actions--mobile-fixed`. Sélecteur GLOBAL (la barre n'est plus sous
	   #vauban-onboarding-container) ; l'habillage colonne / fond reste fourni par
	   mobile-actions.css (lui aussi en sélecteur global). */
	.vauban-form-actions.vauban-form-actions--mobile-fixed {
		position: fixed !important;
		bottom: 0 !important;
		box-sizing: border-box !important;
		/* ALIGNÉ sur la carte de contenu : valeurs EXACTES posées par
		   onboarding-mobile-actionbar.js (alignFooter -> left/width mesurés sur
		   .vauban-step-content). Ci-dessous = REPLI sans JS : inset par left/right
		   (gouttières du conteneur) -> jamais de débordement à droite. */
		left: clamp(12px, 2.5vw, 32px) !important;
		right: clamp(12px, 2.5vw, 32px) !important;
		width: auto !important;
		max-width: none !important;
		margin: 0 0 calc(10px + env(safe-area-inset-bottom, 0px)) !important;
		border-radius: 16px !important;
		z-index: 100 !important; /* au-dessus du contenu (sous .vbm-header, 100002) */
		/* Barre COMPACTE : Retour + Suivant CÔTE À CÔTE sur une ligne (au lieu de
		   l'empilement de mobile-actions.css), Contact (slim, width:100%) repassant
		   en 2e ligne. Les ordres/flex des boutons viennent de mobile-actions.css. */
		flex-direction: row !important;
		flex-wrap: wrap !important;
		align-items: center !important;
		padding: 10px !important;
		/* Sans habillage (demande utilisateur 2026-06-10) : fond transparent, ni
		   bordure ni ombre — seuls les boutons sont visibles. Surcharge
		   mobile-actions.css (surface-1 + dashed). */
		background: transparent !important;
		border-top: 0 !important;
		box-shadow: none !important;
	}
	/* Retour + Suivant partagent la 1re ligne : largeur auto (mobile-actions.css force
	   .vauban-btn à width:100% -> sinon chaque bouton prend toute la ligne et ils
	   s'empilent) + flex:1 pour se répartir l'espace. */
	.vauban-form-actions.vauban-form-actions--mobile-fixed .vauban-btn-secondary,
	.vauban-form-actions.vauban-form-actions--mobile-fixed .vauban-btn-primary {
		width: auto !important;
		flex: 1 1 0 !important;
		min-width: 0 !important;
	}
	/* Le bouton Contact (lien) reste sur sa propre ligne, slim (width:100% hérité). */
	.vauban-form-actions.vauban-form-actions--mobile-fixed .vauban-contact-btn {
		order: 10 !important;
		flex: 0 0 100% !important;
	}
}

/* =============================================================================
 * 41. MOBILE (<= 768px) — Menu d'étapes en BANDEAU HORIZONTAL DÉFILANT (léger).
 * -----------------------------------------------------------------------------
 * Par défaut la liste d'étapes s'enroule (flex-wrap) sur ~4 lignes -> menu collant
 * trop haut (~40% de l'écran). On la passe en UNE SEULE LIGNE défilable de gauche
 * à droite (chips compactes), on masque le sous-rail intra-étape (allègement ; le
 * gating « Suivant », piloté par l'état des sections, reste actif) et on resserre
 * la carte. Le strip est recentré sur l'étape courante par
 * onboarding-mobile-actionbar.js. Spécificité par ID -> prime sur le socle ;
 * feuille versionnée par filemtime (cache-bust auto).
 * ========================================================================== */
@media (max-width: 768px) {
	/* Carte resserrée : moins de remplissage vertical.
	   overflow:visible annule overflow:hidden de 06-responsive.css (règle globale sans
	   media query) qui rognait les ombres des badges quand la carte est transparente. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-card {
		padding: 6px 0 4px !important;
		gap: 0 !important;
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
		overflow: visible !important;
	}

	/* Liste d'étapes -> ruban horizontal défilant (une seule ligne). */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-steps {
		display: flex !important;
		flex-direction: row !important;
		flex-wrap: nowrap !important;
		overflow-x: auto !important;
		overflow-y: hidden !important;
		gap: 6px !important;
		margin: 0 !important;
		padding: 5px 12px 8px !important;
		scroll-snap-type: x proximity;
		-webkit-overflow-scrolling: touch;
		scrollbar-width: none; /* ruban épuré */
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-steps::-webkit-scrollbar {
		height: 0 !important;
		display: none !important;
	}

	/* Chips compactes qui ne se compriment pas (défilement plutôt qu'enroulement). */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step {
		flex: 0 0 auto !important;
		scroll-snap-align: start;
		gap: 7px !important;
		margin: 0 !important;
		padding: 6px 12px !important;
		border: 1px solid var(--vo-border) !important;
		border-radius: 999px !important;
		background: var(--vo-surface) !important;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step.is-current {
		background: var(--vo-accent-soft) !important;
		border-color: var(--vo-accent) !important;
	}
	/* Pas de connecteur vertical dans un ruban horizontal. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step::after {
		display: none !important;
	}
	/* Libellé sur une seule ligne, tronqué si trop long (chips homogènes). */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step__txt {
		white-space: nowrap !important;
		overflow: hidden !important;
		text-overflow: ellipsis !important;
		max-width: 120px !important;
		font-size: 12.5px !important;
		line-height: 1.2 !important;
	}
	/* L'étape courante affiche son libellé en entier. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-step.is-current .vauban-sb-step__txt {
		max-width: none !important;
		font-weight: 650 !important;
	}

	/* Sous-rail intra-étape : affiché en VERSION COMPACTE sur sa propre ligne, sous le
	   ruban (sorti du ruban par onboarding-mobile-actionbar.js -> moveSubstepsOut).
	   Bandeau plein largeur, discret. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps {
		display: block !important;
		list-style: none !important;
		width: auto !important;
		margin: 6px 12px 2px !important;
		padding: 6px 8px !important;
		background: linear-gradient(180deg, rgba(79, 70, 229, 0.05), rgba(124, 58, 237, 0.04)) !important;
		border: 1px solid rgba(79, 70, 229, 0.14) !important;
		border-radius: 10px !important;
	}
	/* DÉDUP : l'étape 5 relocalise DEUX rails (.vbn2-rail + .vbn-progress) -> doublon.
	   Quand les deux sont présents, on ne garde que .vbn-progress (le rail qui gate le
	   bouton « Suivant ») et on masque le .vbn2-rail. Les étapes à un seul rail ne sont
	   pas affectées (le :has ne matche que si .vbn-progress est là). */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps:has(.vbn-progress) .vbn2-rail {
		display: none !important;
	}

	/* Rail interne (.vbn2-rail / .vbn-progress) : compact, horizontal, à plat.
	   position:relative (pas static) : conserve .vbn2-rail-line (absolute) dans
	   son containing block ; static la ferait s'échapper vers un ancêtre plus haut
	   → dots décalés. Variables synchro avec le padding réel (0px) et le padding
	   des boutons (2px) pour centrer correctement la ligne connectrice. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress {
		position: relative !important;
		top: auto !important;
		margin: 0 !important;
		padding: 0 !important;
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
		width: 100% !important;
		--vbn2-rail-px: 0px;
		--vbn2-rail-pt: 2px;
	}
	/* Pastilles + libellés rapetissés. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__node,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-n {
		width: 20px !important;
		height: 20px !important;
		font-size: 10px !important;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__text,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-t {
		font-size: 10px !important;
		line-height: 1.15 !important;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__item,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-step {
		gap: 4px !important;
		padding: 2px !important;
	}

	/* Étiquette d'étape courante (gros bandeau indigo) : masquée sur mobile —
	   redondante avec la chip courante (surlignée + libellé complet) du ruban. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-step-title {
		display: none !important;
	}
}

/* =============================================================================
 * 42. MOBILE (<= 768px) — PLEINE LARGEUR écran (bord à bord, droite-à-gauche) :
 *     contenu + menu collant + pied de page occupent toute la largeur du
 *     téléphone. On retire les gouttières latérales du conteneur ; le padding
 *     INTERNE des cartes garde la lisibilité. Règles tardives -> priment sur §40.
 * ========================================================================== */
@media (max-width: 768px) {
	/* Conteneur : plus de gouttières latérales -> tout occupe la largeur de l'écran. */
	#vauban-onboarding-container:not(.vauban-embed-mode) {
		padding-left: 0 !important;
		padding-right: 0 !important;
		padding-bottom: 0 !important;
	}
	/* Carte de contenu : bord à bord (padding interne conservé). */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-step-content {
		border-radius: 0 !important;
		border-left: 0 !important;
		border-right: 0 !important;
	}
	/* Menu collant : bord à bord, sans coins arrondis. */
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sidebar-nav {
		border-radius: 0 !important;
	}

	/* Pied de page : BARRE PLEINE LARGEUR, collée au bas de l'écran. Le repli
	   (sans JS) couvre déjà toute la largeur ; alignFooter (JS) le cale ensuite
	   exactement sur la carte (elle aussi pleine largeur). Arrondi/flottement de §40
	   retirés. Sans fond ni ombre (demande utilisateur 2026-06-10). */
	.vauban-form-actions.vauban-form-actions--mobile-fixed {
		left: 0 !important;
		right: 0 !important;
		width: auto !important;
		margin: 0 !important;
		border-radius: 0 !important;
		box-shadow: none !important;
		padding: 10px clamp(12px, 4vw, 18px) calc(10px + env(safe-area-inset-bottom, 0px)) !important;
	}
}

/* =============================================================================
 * 43. MOBILE (<= 768px) — Rail : libellés COURANT + SUIVANT (grisé) uniquement.
 *     Trop d'étapes -> les libellés se chevauchaient. Pastilles/numéros de toutes
 *     les étapes conservés. Règle tardive -> prime sur §41.
 * ========================================================================== */
@media (max-width: 768px) {
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__text,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-t {
		display: none !important;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__item.is-current .vbn-progress__text,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-step.is-current .vbn2-rail-t {
		display: block !important;
		font-size: 11px !important;
		line-height: 1.15 !important;
		max-width: 16ch !important;
		opacity: 1 !important;
		white-space: nowrap !important;
		overflow: hidden !important;
		text-overflow: ellipsis !important;
	}
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn-progress__item.is-current + .vbn-progress__item .vbn-progress__text,
	#vauban-onboarding-container:not(.vauban-embed-mode) .vauban-sb-substeps .vbn2-rail-step.is-current + .vbn2-rail-step .vbn2-rail-t {
		display: block !important;
		font-size: 10px !important;
		line-height: 1.15 !important;
		max-width: 12ch !important;
		opacity: 0.5 !important;
		white-space: nowrap !important;
		overflow: hidden !important;
		text-overflow: ellipsis !important;
	}
}

/* =============================================================================
 * 44. MODE SOMBRE — Correctifs de contraste (fonds blancs & opacités).
 * --------------------------------------------------------------------------
 * Corrige les éléments dont le background est hardcodé en blanc/rgba-blanc
 * (non tokenisé dans 01/02/03-*.css et step-2-extensions.css) : en sombre,
 * le texte tokenisé passe en blanc cassé (#F1F4FB) → blanc sur blanc = invisible.
 * Corrige aussi les opacités réduites qui rendent le texte insuffisamment
 * contrasté sur fond sombre.
 * Bloc « dark explicite » + copie « auto (OS) » à garder STRICTEMENT identiques.
 * ========================================================================== */

/* ── Indicateurs d'étapes (01-base-forms.css L.86 : opacity:0.5) ─────────────
   En sombre, #A0ABC8 à 50% d'opacité sur #232F52 → ratio ~2.7:1, insuffisant.
   On retire l'opacité et on laisse --vt-muted (#A0ABC8 ≈ 6:1) s'exprimer. */
[data-theme="dark"] #vauban-onboarding-container .vauban-step-indicator {
	opacity: 1;
}
[data-theme="dark"] #vauban-onboarding-container .vauban-step-indicator:not(.active) .step-number {
	background: var(--vt-inset) !important;
	color: var(--vt-muted) !important;
}
[data-theme="dark"] #vauban-onboarding-container .vauban-step-indicator:not(.active) .step-label {
	color: var(--vt-muted) !important;
}

/* ── Cartes à fond blanc hardcodé (02-info-boxes-cards.css) ──────────────────
   background:white / var(--color-white) non couvert par --color-white remappé
   ci-dessus (specificity ≤ :root) → override explicite. */
[data-theme="dark"] #vauban-onboarding-container .vauban-card {
	background: var(--vt-surface-1) !important;
	border-color: var(--vt-border) !important;
}
[data-theme="dark"] #vauban-onboarding-container .vauban-nested-box {
	background: var(--vt-surface-2) !important;
}

/* ── Accordéons (02-info-boxes-cards.css L.194) ──────────────────────────────
   border-color du séparateur open → maintenu lisible. */
[data-theme="dark"] #vauban-onboarding-container details.vauban-details[open] > summary.vauban-summary {
	border-bottom-color: var(--vt-border) !important;
}

/* ── Info-box : endpoint du gradient #E0E2FB hardcodé (L.84) ─────────────────
   En sombre, texte tokenisé clair → invisible sur #E0E2FB clair.
   On remplace l'endpoint par un indigo sombre cohérent avec --vt-primary-bg. */
[data-theme="dark"] #vauban-onboarding-container .vauban-info-box {
	background: linear-gradient(135deg, var(--vt-primary-bg) 0%, rgba(100, 90, 220, 0.18) 100%) !important;
	border-left-color: var(--vt-primary) !important;
}
[data-theme="dark"] #vauban-onboarding-container .vauban-info-box p {
	color: var(--vt-text-soft) !important;
}
[data-theme="dark"] #vauban-onboarding-container .vauban-info-box strong {
	color: var(--vt-primary) !important;
}

/* ── Blocs step-2-extensions.css (rgba blanc hardcodés, L.15 / L.124) ────────
   rgba(255,255,255,0.55/0.70) ignorent --color-white → override obligatoire. */
[data-theme="dark"] #vauban-onboarding-container .vauban-contexte-bien {
	background: var(--vt-surface-1) !important;
	border-color: var(--vt-border) !important;
}
[data-theme="dark"] #vauban-onboarding-container .vauban-contexte-bien-collapse {
	background: var(--vt-surface-1) !important;
	border-color: var(--vt-border) !important;
}

/* ── CTA compact : opacités insuffisantes (03-house-progress-cta.css L.232/240)
   .vauban-cta-text small : opacity:0.75 + gris → ratio ~3.4:1 pour 11px, FAIL.
   .vauban-cta-arrow : opacity:0.6 → flèche quasi invisible. */
[data-theme="dark"] #vauban-onboarding-container .vauban-cta-text small {
	opacity: 1;
	color: var(--vt-muted) !important;
}
[data-theme="dark"] #vauban-onboarding-container .vauban-cta-arrow {
	opacity: 0.9;
}

/* ── Description de l'étape et texte d'aide (01-base-forms.css) ──────────────
   Déjà tokenisé via --vt-muted mais forcé ici pour les éléments hors scope
   (si jamais le conteneur principal n'est pas ancêtre). */
[data-theme="dark"] #vauban-onboarding-container .vauban-step-description {
	color: var(--vt-muted) !important;
}
[data-theme="dark"] #vauban-onboarding-container .field-help {
	color: var(--vt-muted) !important;
}

@media (prefers-color-scheme: dark) {
	/* Copie strictement identique pour data-theme="auto" (OS dark). */
	[data-theme="auto"] #vauban-onboarding-container .vauban-step-indicator { opacity: 1; }
	[data-theme="auto"] #vauban-onboarding-container .vauban-step-indicator:not(.active) .step-number {
		background: var(--vt-inset) !important;
		color: var(--vt-muted) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-step-indicator:not(.active) .step-label {
		color: var(--vt-muted) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-card {
		background: var(--vt-surface-1) !important;
		border-color: var(--vt-border) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-nested-box {
		background: var(--vt-surface-2) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container details.vauban-details[open] > summary.vauban-summary {
		border-bottom-color: var(--vt-border) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-info-box {
		background: linear-gradient(135deg, var(--vt-primary-bg) 0%, rgba(100, 90, 220, 0.18) 100%) !important;
		border-left-color: var(--vt-primary) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-info-box p {
		color: var(--vt-text-soft) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-info-box strong {
		color: var(--vt-primary) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-contexte-bien {
		background: var(--vt-surface-1) !important;
		border-color: var(--vt-border) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-contexte-bien-collapse {
		background: var(--vt-surface-1) !important;
		border-color: var(--vt-border) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-cta-text small {
		opacity: 1;
		color: var(--vt-muted) !important;
	}
	[data-theme="auto"] #vauban-onboarding-container .vauban-cta-arrow { opacity: 0.9; }
	[data-theme="auto"] #vauban-onboarding-container .vauban-step-description { color: var(--vt-muted) !important; }
	[data-theme="auto"] #vauban-onboarding-container .field-help { color: var(--vt-muted) !important; }
}

/* =============================================================================
 * 99. Voile assombrissant du header de site (Astra) — page onboarding, SOMBRE
 * -----------------------------------------------------------------------------
 * La page /onboarding/ (page WP id 1099, rendue via Elementor) affiche le header
 * Astra (.site-header / .ast-primary-header-bar / .main-header-bar) en haut, qui
 * conserve son fond clair et « ressort » trop en thème sombre. On pose un calque
 * ::after qui assombrit TOUTE la barre (logo + menu compris), sans toucher le
 * markup Astra ni le mode clair. pointer-events:none → liens/menu restent cliquables.
 * Scope = body.page-id-1099 (le body n'a PAS .vauban-fullpage ici : le template
 * standalone n'est pas appliqué — page Elementor classique). Si l'ID de la page
 * onboarding change, mettre à jour ce sélecteur.
 * Scrim = token --vt-onboarding-header-scrim (transparent en clair, slate en sombre).
 * Desktop + tablette uniquement (>= 769px) ; le header mobile a son propre rendu.
 * EXCLUSION : pas de voile sur l'écran disclaimer (#vauban-disclaimer-screen) — il
 * remplace le formulaire à l'étape 1 ; on retire le voile via :not(:has(...)).
 * ========================================================================== */
@media (min-width: 769px) {
	body.page-id-1099 .site-header,
	body.page-id-1099 .ast-primary-header-bar,
	body.page-id-1099 .main-header-bar {
		position: relative;
	}

	/* Exclusion : pas de voile quand l'écran disclaimer (#vauban-disclaimer-screen)
	   est VISIBLE. Il reste dans le DOM en display:none une fois le formulaire affiché
	   (masquage JS, pas suppression) → on ne l'exclut donc que s'il n'est pas masqué.
	   Le format inline est « display: none » (avec espace) ; on couvre aussi sans espace. */
	body.page-id-1099:not(:has(#vauban-disclaimer-screen:not([style*="display: none"]):not([style*="display:none"]))) .site-header::after,
	body.page-id-1099:not(:has(#vauban-disclaimer-screen:not([style*="display: none"]):not([style*="display:none"]))) .ast-primary-header-bar::after,
	body.page-id-1099:not(:has(#vauban-disclaimer-screen:not([style*="display: none"]):not([style*="display:none"]))) .main-header-bar::after {
		content: "";
		position: absolute;
		inset: 0;
		background: var(--vt-onboarding-header-scrim, transparent);
		pointer-events: none;
		z-index: 1;
		transition: background 0.2s ease;
	}
}

/* Regroupement visuel du fil en 3 phases (layout-only, token-first). */
.vauban-sb-phase { list-style: none; margin: 12px 0 4px; padding: 0; }
.vauban-sb-phase:first-child { margin-top: 0; }
.vauban-sb-phase__label { display: block; font-size: 10px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; opacity: 0.55; }

/* =============================================================================
 * 45. RESPONSIVE MOBILE — ancrage du défilement, lisibilité, cibles tactiles
 *     (chantier 2026-08-01)
 * -----------------------------------------------------------------------------
 * 45.1 ANCRAGE DU DÉFILEMENT. `onboarding-sticky-metrics.js` publie sur <html>
 *      la hauteur RÉELLEMENT occultée par les barres collantes :
 *      `--vauban-occlusion-top` (en-tête de site fixe + bandeau d'étapes mobile +
 *      sous-rail) et `--vauban-occlusion-bottom` (barre Retour / Suivant épinglée).
 *      On en fait le `scroll-padding` de la racine : TOUS les `scrollIntoView()`
 *      du tunnel (étapes 2 et 7, import d'annonce, détection de stationnement,
 *      maquette d'accès, dépôt de pièces…) s'ancrent alors sous les barres au lieu
 *      de glisser derrière. Mesuré avant correctif : 240 px d'occlusion réelle pour
 *      une réserve de 0 à 96 px selon le moteur — la cible finissait cachée et
 *      l'écran semblait avoir sauté plusieurs sections.
 *      Le repli 96px/0px couvre le cas où le script n'a pas encore mesuré.
 * ========================================================================== */
html {
	scroll-padding-top: calc(var(--vauban-occlusion-top, 96px) + 16px);
	scroll-padding-bottom: calc(var(--vauban-occlusion-bottom, 0px) + 16px);
}

/* Même réserve pour la carte d'étape, qui remplace le calcul de la section 3-bis
   (il s'appuyait sur --vauban-sticky-header-offset, qui ignore le bandeau d'étapes). */
#vauban-onboarding-container .vauban-step-content {
	scroll-margin-top: calc(var(--vauban-occlusion-top, 96px) + 16px);
}

@media (max-width: 768px) {
	/* 45.2 LISIBILITÉ. Plancher typographique à 12 px pour les textes d'AIDE de la
	   carte d'étape (relevés à 9 px pour `.vauban-tip`, 11 px pour les indications
	   de dépôt, badges et sous-titres de choix). Le bandeau d'étapes et les rails
	   relocalisés sont volontairement HORS périmètre : leur compacité est ce qui
	   garde le menu collant à une hauteur raisonnable (§41/§43). */
	#vauban-onboarding-container .vauban-step-content .vauban-tip,
	#vauban-onboarding-container .vauban-step-content .vauban-upload-hint,
	#vauban-onboarding-container .vauban-step-content .vauban-doc-badge,
	#vauban-onboarding-container .vauban-step-content .vauban-doc-later-note,
	#vauban-onboarding-container .vauban-step-content .vauban-bank-card-hint,
	#vauban-onboarding-container .vauban-step-content .vauban-radio-card-sub,
	#vauban-onboarding-container .vauban-step-content .vauban-doc-checklist-legend__item,
	#vauban-onboarding-container .vauban-step-content .vbn2-linge-std__h,
	#vauban-onboarding-container .vauban-step-content .vbn2-zonelabel,
	#vauban-onboarding-container .vauban-step-content .vbn2-req,
	#vauban-onboarding-container .vauban-step-content .estim__sub,
	#vauban-onboarding-container .vauban-step-content .panel__hint,
	#vauban-onboarding-container .vauban-step-content .fz-hero__proof-label,
	#vauban-onboarding-container .vauban-step-content .fz-prereq__badge,
	#vauban-onboarding-container .vauban-step-content .tag {
		font-size: 12px !important;
		line-height: 1.35 !important;
	}

	/* 45.3 ZOOM AUTOMATIQUE iOS. Safari agrandit la page dès qu'un champ de saisie
	   passe sous 16 px à la mise au point — la mise en page saute et ne revient pas.
	   On pose donc 16 px sur les champs de TEXTE (les cases et boutons radio ne sont
	   pas concernés : ils n'ouvrent pas de clavier). */
	#vauban-onboarding-container input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]):not([type="range"]):not([type="file"]),
	#vauban-onboarding-container select,
	#vauban-onboarding-container textarea {
		font-size: 16px !important;
	}

	/* 45.4 CIBLES TACTILES. 44 px de haut minimum sur les champs de saisie (relevés
	   à 40 px). Les boutons du rail compact et les champs de fichier masqués (dont
	   la cible réelle est le libellé) restent hors périmètre. */
	#vauban-onboarding-container input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]):not([type="file"]),
	#vauban-onboarding-container select,
	#vauban-onboarding-container .vauban-form-group textarea {
		min-height: 44px !important;
	}

	/* NOTE : aucune réserve de padding n'est ajoutée sous la carte pour la barre
	   d'actions épinglée. Elle est DÉJÀ couverte deux fois — par le placeholder de
	   même hauteur posé à l'emplacement d'origine (onboarding-mobile-actionbar.js)
	   et par le padding bas dynamique du wrapper (onboarding-sidebar-fit.js). Un
	   troisième niveau creusait un vide d'environ 160 px en fin d'étape.
	   `scroll-padding-bottom` (45.1) suffit à garder la cible d'un défilement
	   au-dessus de la barre. */
}
