/*
Theme Name: Hello Elementor Child
Theme URI: https://elementor.com/hello-theme/?utm_source=wp-themes&utm_campaign=theme-uri&utm_medium=wp-dash
Template: hello-elementor
Author: Elementor Team
Author URI: https://elementor.com/?utm_source=wp-themes&utm_campaign=author-uri&utm_medium=wp-dash
Description: Hello Elementor is a lightweight and minimalist WordPress theme that was built specifically to work seamlessly with the Elementor site builder plugin. The theme is free, open-source, and designed for users who want a flexible, easy-to-use, and customizable website. The theme, which is optimized for performance, provides a solid foundation for users to build their own unique designs using the Elementor drag-and-drop site builder. Its simplicity and flexibility make it a great choice for both beginners and experienced Web Creators.
Tags: accessibility-ready,flexible-header,custom-colors,custom-menu,custom-logo,featured-images,rtl-language-support,threaded-comments,translation-ready
Version: 3.4.7.1780304521
Updated: 2026-06-01 11:02:01

*/

/* === VARIABLES & RESET === */

/* === HEADER (Theme Builder ARC) — tout via paramètres widget, aucun CSS custom ici sauf futur ticker marquee === */

/* === BREADCRUMB (Yoast via widget Elementor) === */
/* Page courante (élément sans lien) en gras */
#breadcrumbs .breadcrumb_last,
#breadcrumbs [aria-current="page"] {
	font-weight: 700;
}

/* === HERO === */

/* === WIDGET LOGIN (Elementor) === */
/* Champs de saisie : blancs, arrondis, pleine largeur */
.elementor-widget-login .elementor-field-group {
	margin-bottom: 16px;
}

.elementor-widget-login .elementor-field-textual {
	width: 100%;
	min-height: 48px;
	padding: 12px 18px;
	background-color: #ffffff;
	border: none;
	border-radius: 8px;
	color: #333333;
	font-size: 15px;
	line-height: 1.4;
	box-shadow: none;
}

.elementor-widget-login .elementor-field-textual::placeholder {
	color: #9aa3ad;
	opacity: 1;
}

.elementor-widget-login .elementor-field-textual:focus {
	outline: none;
	box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.6);
}

/* « Se souvenir de moi » : texte et case blancs */
.elementor-widget-login .elementor-remember-me label {
	display: flex;
	align-items: center;
	gap: 8px;
	color: #ffffff;
	font-size: 15px;
	cursor: pointer;
}

.elementor-widget-login .elementor-remember-me input[type="checkbox"] {
	width: 18px;
	height: 18px;
	accent-color: #ffffff;
	margin: 0;
}

/* Bouton « Connexion » : bleu marine foncé, arrondi, aligné à gauche */
.elementor-widget-login .elementor-field-type-submit {
	text-align: left;
}

.elementor-widget-login .elementor-button {
	display: inline-block;
	width: auto;
	min-width: 150px;
	padding: 12px 28px;
	background-color: #1b2b4a;
	border: none;
	border-radius: 6px;
	color: #ffffff;
	font-size: 16px;
	font-weight: 600;
	text-transform: none;
	cursor: pointer;
	transition: background-color 0.2s ease;
}

.elementor-widget-login .elementor-button:hover,
.elementor-widget-login .elementor-button:focus {
	background-color: #142038;
	color: #ffffff;
}

/* Lien « Mot de passe perdu » : blanc */
.elementor-widget-login .elementor-lost-password,
.elementor-widget-login .elementor-lost-password:hover {
	color: #ffffff;
}

/* === FOOTER === */

/* =========================================================================
 * ESPACE MEMBRE — Sidebar du compte (maquette Figma ARC)
 * Le menu « Mon compte » WooCommerce est stylisé en sidebar : carte claire,
 * onglet actif en bleu ARC plein, icônes Dashicons par onglet.
 * ========================================================================= */

/* Layout 2 colonnes : sidebar + contenu */
.woocommerce-account .woocommerce {
	display: flex;
	flex-wrap: wrap;
	gap: 30px;
	align-items: flex-start;
}
.woocommerce-account .woocommerce-MyAccount-navigation {
	flex: 0 0 240px;
	width: 240px;
	max-width: 240px;
	background: #f5f8fb;
	border: 1px solid #e4ebf2;
	border-radius: 12px;
	padding: 10px;
	float: none;
}
.woocommerce-account .woocommerce-MyAccount-content {
	flex: 1 1 480px;
	min-width: 0;
	float: none;
	width: auto;
}

/* Items du menu */
.woocommerce-account .woocommerce-MyAccount-navigation ul {
	list-style: none;
	margin: 0;
	padding: 0;
}
.woocommerce-account .woocommerce-MyAccount-navigation li {
	margin: 2px 0;
	padding: 0;
	border: none;
}
.woocommerce-account .woocommerce-MyAccount-navigation li a {
	display: flex;
	align-items: center;
	padding: 11px 16px;
	border-radius: 8px;
	color: #1b2a4a;
	font-size: 15px;
	font-weight: 500;
	line-height: 1.2;
	text-decoration: none;
	transition: background-color 0.15s ease, color 0.15s ease;
}
.woocommerce-account .woocommerce-MyAccount-navigation li a:hover {
	background: #e6f4fc;
	color: #007fb8;
}
.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a {
	background: #009fe3;
	color: #ffffff;
	font-weight: 600;
	box-shadow: 0 2px 6px rgba(0, 159, 227, 0.35);
}

/* Le shortcode [woocommerce_my_account] est passé à wpautop : le saut de ligne
 * du template WooCommerce entre <a> et le libellé devient un <br>. Ce <br> est
 * un item flex à part entière, il ajoute une ligne vide et décale l'icône par
 * rapport au texte (invisible dans l'éditeur Elementor, qui n'autop pas). */
.woocommerce-account .woocommerce-MyAccount-navigation li a br {
	display: none;
}

/* Icônes Dashicons par onglet */
.woocommerce-account .woocommerce-MyAccount-navigation li a::before {
	font-family: dashicons;
	font-size: 18px;
	line-height: 1;
	width: 22px;
	margin-right: 10px;
	display: inline-block;
	text-align: center;
	-webkit-font-smoothing: antialiased;
}
.woocommerce-MyAccount-navigation-link--tableau-de-bord a::before  { content: "\f226"; }
.woocommerce-MyAccount-navigation-link--mon-profil a::before       { content: "\f110"; }
.woocommerce-MyAccount-navigation-link--ma-copro a::before         { content: "\f512"; }
.woocommerce-MyAccount-navigation-link--mes-consultations a::before{ content: "\f125"; }
.woocommerce-MyAccount-navigation-link--mes-favoris a::before      { content: "\f487"; }
.woocommerce-MyAccount-navigation-link--mon-contrat a::before      { content: "\f497"; }
.woocommerce-MyAccount-navigation-link--orders a::before           { content: "\f174"; }
.woocommerce-MyAccount-navigation-link--edit-account a::before     { content: "\f111"; }
.woocommerce-MyAccount-navigation-link--edit-address a::before     { content: "\f230"; }
.woocommerce-MyAccount-navigation-link--downloads a::before        { content: "\f316"; }
.woocommerce-MyAccount-navigation-link--customer-logout a::before  { content: "\f14c"; }

/* Mobile : sidebar pleine largeur au-dessus du contenu */
@media (max-width: 768px) {
	.woocommerce-account .woocommerce-MyAccount-navigation,
	.woocommerce-account .woocommerce-MyAccount-content {
		flex: 1 1 100%;
		width: 100%;
		max-width: 100%;
	}
}

/* =========================================================================
 * ESPACE MEMBRE — Choix du service avant le calendrier de RDV
 * Le service choisi arrive par l'URL (?service=...) ; le mu-plugin pose alors
 * `ec-has-service` + `ec-svc-{slug}` sur <body>. Tout l'état est géré en CSS
 * (pas de JS : le minificateur de la préprod casse les scripts inline).
 * ========================================================================= */

/* L'invitation disparaît dès qu'un service est choisi */
.ec-svc-hint p {
	color: #8a93a3;
	margin: 0;
}
body.ec-has-service .ec-svc-hint {
	display: none;
}

/* Service actif : bouton en bleu ARC plein.
   Une paire body.ec-svc-{slug} / .ec-service-{slug} par équipe CRM affichée
   (cf. arc_crm_teams()). Les slugs DOIVENT correspondre à ceux des liens
   ?service=... des boutons, sinon l'état actif ne s'applique pas. */
/* `!important` requis : Elementor génère une règle par widget bouton
   (`.elementor-26074 .elementor-element.elementor-element-svcN .elementor-button`,
   4 classes) qui impose le fond « Normal » du bouton. Notre sélecteur d'état
   actif (3 classes) perd sur la spécificité — les id `svcN` variant par bouton
   et par environnement, on force donc l'état actif plutôt que de surenchérir. */
body.ec-svc-juridique .ec-service-juridique .elementor-button,
body.ec-svc-technique .ec-service-technique .elementor-button,
body.ec-svc-controleurs-comptes .ec-service-controleurs-comptes .elementor-button,
body.ec-svc-architecte .ec-service-architecte .elementor-button,
body.ec-svc-energie-eau .ec-service-energie-eau .elementor-button,
body.ec-svc-ascensoriste .ec-service-ascensoriste .elementor-button,
body.ec-svc-ingenieur-financier .ec-service-ingenieur-financier .elementor-button,
body.ec-svc-assurances .ec-service-assurances .elementor-button,
body.ec-svc-geometre .ec-service-geometre .elementor-button,
body.ec-svc-gardien .ec-service-gardien .elementor-button {
	background-color: #009fe3 !important;
	border-color: #009fe3 !important;
	color: #ffffff !important;
	box-shadow: 0 2px 6px rgba(0, 159, 227, 0.35);
}

/* Calendrier JetEngine : accord à la charte ARC.
   Classes réellement rendues par le module (pas de modificateur --today
   ni --has-posts : ils n'existent pas dans les templates). */
.jet-calendar-caption__name {
	color: #1b2a4a;
	font-weight: 700;
}
.jet-calendar-week__day-date {
	color: #1b2a4a;
	font-weight: 600;
}
.jet-calendar-week__day-wrap {
	border-color: #e4ebf2;
}
/* Une carte de créneau réservable dans une case du calendrier */
.jet-calendar-week__day-event {
	background: #e6f4fc;
	border-radius: 6px;
	padding: 4px 6px;
	margin-bottom: 4px;
	font-size: 12px;
	line-height: 1.3;
}
.jet-calendar-nav__link {
	color: #009fe3;
}

/* =========================================================================
 * ESPACE MEMBRE — Onglet « Mon profil »
 * Deux sections Elementor réelles, dont une seule est visible à la fois.
 * La bascule passe par `?modifier=1`, qui pose `arc-profil-edition-active`
 * sur <body> (mu-plugin). Tout en CSS : le minificateur de la préprod casse
 * le JS inline, et deux vrais conteneurs restent éditables dans Elementor.
 * ========================================================================= */

/* `_css_classes` ne s'applique pas aux conteneurs dans cette version
   d'Elementor (il fonctionne sur les widgets) : on cible donc les deux
   sections par leur identifiant d'élément, qui lui est toujours rendu. */
.elementor-element-pedit { display: none !important; }

body.arc-profil-edition-active .elementor-element-pvue { display: none !important; }
body.arc-profil-edition-active .elementor-element-pedit { display: flex !important; }

/* Boutons de bascule */
.elementor-element-pbtn .elementor-button,
.arc-btn-modifier .elementor-button {
	background: #009fe3;
	color: #fff;
	border-radius: 8px;
	padding: 11px 24px;
	font-size: 14px;
	font-weight: 600;
}
.elementor-element-pbtn .elementor-button:hover,
.arc-btn-modifier .elementor-button:hover { background: #007fb8; }

.elementor-element-pcancel .elementor-button,
.arc-btn-annuler .elementor-button {
	background: transparent;
	color: #1077b3;
	border: 1px solid #d6e4ee;
	border-radius: 8px;
	padding: 10px 22px;
	font-size: 14px;
	font-weight: 600;
}
.elementor-element-pcancel .elementor-button:hover,
.arc-btn-annuler .elementor-button:hover { background: #eef4f9; }

/* Le formulaire reprend le langage visuel de la fiche : carte claire,
   champs bordés, mêmes rayons. */
.elementor-element-pedit .jet-form-builder {
	background: #f5f8fb;
	border: 1px solid #e4ebf2;
	border-radius: 12px;
	padding: 22px 24px;
	max-width: 760px;
}
.elementor-element-pedit .jet-form-builder__field-wrap { max-width: 420px; }
.elementor-element-pedit .jet-form-builder__label {
	font-size: 13px;
	font-weight: 600;
	color: #1B2A4A;
	margin-bottom: 5px;
}
.elementor-element-pedit .jet-form-builder__field:not([type="checkbox"]):not([type="radio"]) {
	width: 100%;
	padding: 9px 12px;
	border: 1px solid #d6e4ee;
	border-radius: 8px;
	background: #fff;
	font-size: 14px;
}
.elementor-element-pedit .jet-form-builder__desc {
	font-size: 12px;
	color: #8a93a3;
	margin-top: 4px;
}
/* Les intertitres du formulaire séparent coordonnées / mot de passe / validation */
.elementor-element-pedit .jet-form-builder__heading {
	margin: 22px 0 4px;
	font-size: 15px;
	font-weight: 700;
	color: #1077b3;
}
.elementor-element-pedit .jet-form-builder__row:first-child .jet-form-builder__heading { margin-top: 0; }

.elementor-element-pedit .jet-form-builder__submit {
	background: #009fe3;
	color: #fff;
	border: 0;
	border-radius: 8px;
	padding: 12px 26px;
	font-size: 15px;
	font-weight: 600;
	cursor: pointer;
}
.elementor-element-pedit .jet-form-builder__submit:hover { background: #007fb8; }

@media (max-width: 768px) {
	.elementor-element-pedit .jet-form-builder { padding: 18px 16px; }
	.elementor-element-pedit .jet-form-builder__field-wrap { max-width: 100%; }
}

/* =========================================================================
 * TUNNEL D'ADHÉSION (page « Adhérer ») — déplacé depuis
 * `wp-content/plugins/arc-demandes/assets/tunnel.css`, en application de la
 * règle projet : tout le CSS custom vit dans le thème enfant (CLAUDE.md).
 * Aucune règle n'a été modifiée au passage — seul le fichier d'accueil change.
 *
 * ⚠️ CONSÉQUENCE DU DÉPLACEMENT — cette feuille n'était chargée que sur la
 * page du tunnel ; elle est désormais servie sur TOUT le site, comme le reste
 * de ce fichier. C'est sans débordement possible : tous les sélecteurs sont
 * préfixés `arc-tunnel-`, et les variables sont posées sur les conteneurs du
 * tunnel, jamais sur `:root` (voir « 0. JETONS » ci-dessous).
 *
 * Documentation d'origine du fichier, reprise intégralement :
 *
 * Tunnel d'adhésion — habillage des cinq étapes.
 *
 * =========================================================================
 * CE QUI EST DANS ELEMENTOR, CE QUI EST ICI — À LIRE AVANT D'AJOUTER UNE RÈGLE
 * =========================================================================
 *
 * Le formulaire est posé par le widget NATIF `jet-form-builder-form` (voir
 * `exports/apply-tunnel-page.php`), et non plus par un shortcode. Ce widget
 * expose les réglages de style de JetFormBuilder directement dans Elementor :
 * tout ce qu'il sait faire y a été basculé, pour que le client puisse
 * retoucher sans ouvrir ce fichier.
 *
 * RÉGLÉ DANS ELEMENTOR — ne rien réécrire ici, ce serait un doublon
 * silencieux qui perdrait de toute façon (voir « SPÉCIFICITÉ » ci-dessous) :
 *   · étiquettes ............ marge, taille, graisse, interligne, couleur,
 *                             couleur de l'astérisque « obligatoire » ;
 *   · descriptions .......... marge, taille, interligne, couleur ;
 *   · titres de rubrique .... taille, graisse, casse, interlettrage,
 *                             interligne, couleur, respiration ;
 *   · champs de saisie ...... taille, couleur, fond, rembourrage, contour,
 *                             rayon ;
 *   · espacement entre deux rangées de champs ;
 *   · boutons Précédent / Continuer et bouton d'envoi ... typographie,
 *                             couleurs (normal + survol), contour, rayon,
 *                             rembourrage, respiration de la barre ;
 *   · message d'erreur du formulaire ... couleurs, rembourrage, marge.
 *
 * RESTE ICI, ET C'EST NORMAL — le widget ne connaît aucun de ces composants,
 * qui sont propres au tunnel :
 *   · les cartes de choix de contrat (étape 1) et leurs vignettes ;
 *   · la frise des cinq étapes ;
 *   · le bloc de cotisation et sa bascule saisie ↔ montant (étape 2) ;
 *   · les accordéons (étapes 3 et 4) ;
 *   · les modes de paiement (étape 5) ;
 *   · le bandeau de titre et le bloc « Besoin d'aide ? » ;
 *   · la mise en deux colonnes des étapes et des blocs conditionnels ;
 *   · la GÉOMÉTRIE des boutons : barre collante remontée au-dessus du
 *     contenu, largeur minimale, chevrons dessinés en CSS ;
 *   · les FAMILLES typographiques — les renseigner dans Elementor
 *     déclencherait une requête Google Fonts, que le projet s'interdit ;
 *   · les ÉTATS de champ (mise au point, erreur) et l'état verrouillé des
 *     boutons, qu'aucun réglage du widget ne couvre.
 *
 * ⚠️ SPÉCIFICITÉ — LA RÈGLE QUI EXPLIQUE LES SÉLECTEURS À RALLONGE
 * Elementor préfixe ses règles par `.elementor-215 .elementor-element
 * .elementor-element-arctunw03`, soit TROIS classes avant même de nommer la
 * cible. Une règle d'ici qui vise le même élément part donc avec trois
 * longueurs de retard. Deux conséquences, toutes deux visibles dans le
 * fichier :
 *   1. les rares endroits où le sur-mesure DOIT reprendre la main sur un
 *      réglage du widget allongent leur sélecteur d'un ou deux maillons
 *      structurels (`.jet-form-builder`, `.jet-form-builder-row`) ;
 *   2. les ÉTATS (mise au point, erreur) portent `!important`, parce qu'ils
 *      doivent battre le réglage Elementor QUEL QU'IL SOIT : si le client
 *      donne un fond gris aux champs, un champ en erreur doit rester rouge.
 *      C'est l'expression exacte de l'intention, pas un contournement.
 *
 * DEUX FAMILLES DE CLASSES, DEUX ORIGINES
 *
 *   `arc-tunnel-*` .......... contrat publié par ARC_Demandes_Tunnel::classes(),
 *                             posé soit par le balisage de la page Elementor,
 *                             soit par `class_name` dans le formulaire 214.
 *   `jet-form-builder-*` .... balisage RÉELLEMENT produit par JetFormBuilder.
 *
 * Le piège, et la raison de cette réécriture : `class_name` de JetFormBuilder
 * n'atterrit PAS sur l'enveloppe du champ, mais sur le `<input>` lui-même.
 * `arc-tunnel-carte` est donc posée sur un `<input type="radio">`, jamais sur
 * une carte. Une feuille écrite « comme si » la classe habillait un bloc ne
 * peut rien styler. Toutes les règles ci-dessous visent le balisage observé,
 * et gardent en second recours le balisage du contrat, au cas où le formulaire
 * serait un jour reconstruit autrement.
 *
 * Charte relevée dans la maquette Figma et dans le kit Elementor du site :
 *   bleu ARC #009FE3 · bleu foncé #007095 · bleu clair #60CDFC
 *   gris inactif #B5B5B5 · texte #1D1D1D · carte #F5F8FB · bordure #E4EBF2
 *   titres en Lora (serif), interface en Roboto · rayon des boutons 13px
 *
 * ÉCHELLE — la maquette est dessinée à 1728 px de large.
 * Chaque taille est écrite `clamp(plancher, N vw, valeur maquette)` où
 * `N = valeur / 17.28`. À 1728 px la valeur de la maquette est atteinte au
 * pixel près ; en dessous elle décroît proportionnellement ; au-dessus elle
 * est plafonnée. C'est ce qui rend le tunnel lisible de 320 px à 2560 px sans
 * une seule requête média sur la typographie.
 *
 * PROGRESSIVE ENHANCEMENT — règle structurante, inchangée.
 * Rien n'est masqué tant que `tunnel.js` n'a pas posé le drapeau
 * `arc-tunnel--js` sur la racine. Si le script échoue, n'est pas chargé, ou est
 * cassé par le minificateur de la préprod, l'adhérent voit TOUT le formulaire
 * déplié : moins confortable, mais il peut adhérer. L'inverse (contenus repliés
 * qu'aucun JavaScript ne vient rouvrir) rendrait le tunnel inutilisable.
 * ========================================================================= */

/* === 0. JETONS ============================================================ */

/*
 * Les variables sont posées sur les conteneurs du tunnel plutôt que sur
 * `:root` : le tunnel s'insère dans une page Elementor, et rien de ce fichier
 * ne doit pouvoir déteindre sur le reste du site.
 *
 * Elles sont répétées sur chaque conteneur de premier niveau parce que le
 * balisage peut très bien ne pas être enveloppé dans `.arc-tunnel` — blocs
 * Elementor séparés, formulaire découpé en plusieurs widgets. Sans cette
 * redondance, un composant isolé perdrait toutes ses couleurs.
 */
.arc-tunnel,
.arc-tunnel-bandeau,
.arc-tunnel-frise,
.arc-tunnel-aide,
.arc-tunnel-cartes,
.arc-tunnel-cotisation,
.arc-tunnel-accordeons,
.arc-tunnel-accordeon,
.arc-tunnel-paiements,
.arc-tunnel-interrompu {
	--arc-bleu: #009fe3;
	--arc-bleu-fonce: #007095;
	--arc-bleu-clair: #60cdfc;
	--arc-bleu-sombre: #005870;
	--arc-bleu-pale: #eaf6fd;
	--arc-carte: #f5f8fb;
	--arc-bordure: #e4ebf2;
	--arc-texte: #1d1d1d;
	--arc-texte-doux: #5b6b85;
	--arc-gris: #b5b5b5;
	--arc-gris-pale: #f0f2f5;
	--arc-vert: #2e9e5b;
	--arc-vert-pale: #eaf7f0;
	--arc-vert-bordure: #b7e3c8;
	--arc-rouge: #c0392b;
	--arc-rouge-pale: #fdeceb;

	/* Deux familles typographiques, relevées dans Figma.
	   LORA EST CHARGÉE. Le kit Elementor 14097 la déclare en typographie
	   « Secondary » et sur `h2` : Elementor enfile donc `elementor-gf-lora-css`
	   sur toutes les pages, /adhesion/ comprise, avec les quatre vraies
	   graisses (400, 500, 600, 700, normal et italique). Une version
	   précédente de ce commentaire affirmait l'inverse : c'était vrai avant
	   que Lora ne rejoigne le kit, ça ne l'est plus. Georgia reste en repli si
	   Google Fonts est bloqué. Rien n'est enfilé depuis ce fichier : la requête
	   tierce est celle d'Elementor, pas la nôtre.
	   ⚠️ Corollaire : si quelqu'un change la typographie « Secondary » du kit,
	   Elementor cesse d'enfiler Lora et les titres retombent silencieusement
	   sur Georgia. Rien ici ne le détecterait. */
	--arc-titre: Lora, Georgia, "Times New Roman", serif;
	--arc-ui: Roboto, "Open Sans", system-ui, -apple-system, "Segoe UI", sans-serif;

	/* Échelle typographique — voir la note « ÉCHELLE » en tête de fichier. */
	--arc-t-titre: clamp(1.125rem, 1.5vw, 1.625rem);   /* 26px à 1728 */
	--arc-t-frise: clamp(0.875rem, 1.28vw, 1.375rem);  /* 22px à 1728 */
	--arc-t-carte: clamp(1rem, 1.5vw, 1.625rem);       /* 26px à 1728 */
	--arc-t-bouton: clamp(0.9375rem, 1.16vw, 1.25rem); /* 20px à 1728 */
	--arc-t-corps: clamp(0.9375rem, 1.04vw, 1.125rem); /* 18px à 1728 */
	--arc-t-petit: clamp(0.8125rem, 0.93vw, 1rem);     /* 16px à 1728 */

	/* Gouttières exprimées en pourcentage de la largeur maquette, pour que
	   les rythmes horizontaux tiennent à toutes les tailles. */
	--arc-marge: clamp(16px, 4.34vw, 75px);  /* retrait latéral du contenu */
	--arc-gap-frise: clamp(8px, 2.08vw, 36px);
	--arc-gap-cartes: clamp(12px, 3.4vw, 59px);

	/*
	 * Temps laissé à l'adhérent pour VOIR que son contrat est retenu, avant que
	 * l'étape 1 n'enchaîne toute seule sur l'étape 2.
	 *
	 * ⚠️ CETTE VALEUR EST LUE PAR `arc-tunnel.js` (`--arc-tunnel-delai-bascule`).
	 * Elle est ici, et pas dans le script, parce que c'est elle qui anime aussi
	 * la carte pendant l'attente (`.arc-tunnel-carte--bascule`) : deux durées
	 * séparées finiraient par diverger. Le script n'accepte qu'une valeur entre
	 * 150 ms et 5 s, et retombe sur 900 ms si elle est absente ou aberrante.
	 */
	--arc-tunnel-delai-bascule: 900ms;

	--arc-rayon: 13px;                 /* rayon des boutons, relevé dans Figma */
	--arc-rayon-doux: 8px;
	--arc-ombre: 0 1px 2px rgba(27, 42, 74, 0.06);
	--arc-ombre-active: 0 6px 18px rgba(0, 159, 227, 0.22);
	--arc-transition: 0.22s ease;

	/* Teintes des vignettes de cartes. Dans Figma ce sont des voiles de
	   couleur POSÉS SUR UNE PHOTO. Les photos ne sont pas versionnées dans le
	   dépôt et une URL d'upload local casserait au déploiement : on garde donc
	   la couleur, qui porte à elle seule le rythme de la grille. Voir la
	   variable `--arc-carte-image` plus bas pour les rebrancher. */
	--arc-teinte-1: #f7c9b8; /* pêche  */
	--arc-teinte-2: #a8d8f0; /* bleu   */
	--arc-teinte-3: #f2dda6; /* sable  */
	--arc-teinte-4: #bee5bf; /* vert   */

	color: var(--arc-texte);
	font-family: var(--arc-ui);
}

/* === 1. LA PAGE ET SES BANDEAUX =========================================== */

/*
 * Le thème pose son propre titre de page (`.page-header > h1.entry-title`).
 * La maquette n'en montre qu'un : « ADHÉRER EN LIGNE À L'ARC ». On masque
 * celui du thème pour ne pas en afficher deux.
 *
 * ⚠️ LE SÉLECTEUR EST BORNÉ À LA PAGE DU TUNNEL, ET IL DOIT LE RESTER.
 * Un commentaire affirmait ici que la feuille n'était enfilée que sur le
 * tunnel, ce qui autorisait un `.page-header` nu. C'était vrai quand le CSS
 * vivait dans le plugin ; depuis qu'il a rejoint le thème enfant, la feuille
 * est chargée SUR TOUTES LES PAGES — et cette règle masquait donc le titre du
 * site entier, sans la moindre erreur pour le signaler.
 *
 * La classe `arc-page-tunnel` est posée sur `<body>` par `functions.php`, avec
 * le même critère que l'enfilage des scripts. Voir le pavé qui l'accompagne.
 */
body.arc-page-tunnel .page-header {
	display: none;
}

/* --- 1.1 Bandeau de titre -------------------------------------------------- */

.arc-tunnel-bandeau {
	padding: clamp(24px, 3.5vw, 60px) var(--arc-marge) clamp(16px, 2vw, 34px);
	text-align: center;
}

.arc-tunnel-bandeau__titre {
	margin: 0;
	color: var(--arc-bleu);
	font-family: var(--arc-titre);
	font-size: var(--arc-t-titre);
	font-weight: 700;
	line-height: 1.3;
	text-transform: uppercase;
	letter-spacing: 0.02em;
}

/* --- 1.2 Bloc « Besoin d'aide ? » ------------------------------------------ */

/*
 * Pleine largeur d'écran alors que le bloc vit dans un conteneur limité à
 * 1728 px : `100vw` recentré compense la moitié de l'écart. C'est la seule
 * technique qui ne dépende ni de `stretch_section` (donc du JavaScript
 * d'Elementor) ni d'une hypothèse sur les marges du thème.
 *
 * `overflow-x: clip` sur le parent n'est pas nécessaire : `100vw` inclut la
 * barre de défilement, mais le bloc n'a pas de contenu débordant et la page a
 * déjà sa propre barre.
 */
.arc-tunnel-aide {
	width: 100vw;
	margin-left: calc(50% - 50vw);
	padding: clamp(36px, 5vw, 86px) var(--arc-marge);
	/* Dans la maquette, une photo de conseillère occupe la moitié droite du
	   bandeau. Faute de la photo, le dégradé seul en reprend la lecture :
	   dense à gauche, où se trouve le texte, clair à droite. */
	background: linear-gradient(100deg, #007095 0%, var(--arc-bleu) 45%, var(--arc-bleu-clair) 100%);
	color: #fff;
}

.arc-tunnel-aide__contenu {
	max-width: 1578px;
	margin: 0 auto;
}

.arc-tunnel-aide__titre {
	margin: 0 0 clamp(12px, 1.4vw, 24px);
	color: #fff;
	font-family: var(--arc-titre);
	font-size: var(--arc-t-titre);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.02em;
}

.arc-tunnel-aide__bouton {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* Sépare le combiné du libellé. Sans cet écart, le `::before` ci-dessous
	   — un item flex comme un autre — viendrait coller au texte. */
	gap: clamp(8px, 0.7vw, 12px);
	min-height: clamp(44px, 3.36vw, 58px);
	padding: 0 clamp(18px, 1.7vw, 30px);
	border-radius: var(--arc-rayon);
	background: #fff;
	color: var(--arc-bleu-fonce);
	font-size: var(--arc-t-bouton);
	font-weight: 600;
	text-decoration: none;
	transition: background var(--arc-transition), color var(--arc-transition);
}

/*
 * LE COMBINÉ DU BANDEAU D'AIDE (fix A6).
 *
 * « Service Adhésion - 01.40.30.12.82 » ne se lit pas d'emblée comme un
 * numéro composable. Le picto le dit sans qu'on touche au HTML du widget
 * Elementor — donc sans écriture en base, et sans rien à resynchroniser.
 *
 * LE DESSIN EST CELUI DU RESTE DU SITE : Font Awesome 5 « phone-alt »
 * (\f879), déjà employé en icon-box sur la page Contact et dans l'onglet
 * Tableau de bord. Introduire un autre combiné donnerait trois téléphones
 * différents sur le même site.
 *
 * SERVI EN `mask-image`, PAS EN WEBFONT, bien que Font Awesome soit chargé
 * partout (le widget d'icônes sociales du footer global s'en charge) :
 *  · `content: ""` reste vide, donc aucun lecteur d'écran n'annonce le
 *    caractère de zone d'usage privé Unicode qu'une glyphe FA occupe ;
 *  · `background-color: currentColor` fait suivre l'icône au survol, sans
 *    rien redéclarer ;
 *  · aucune dépendance au chargement de Font Awesome.
 *
 * Les deux déclarations, préfixée et non préfixée, sont nécessaires : Safari
 * n'a `mask-image` sans préfixe que depuis la 15.4. Si le masque échouait
 * malgré tout, le `::before` rendrait un carré plein de 1em.
 */
.arc-tunnel-aide__bouton::before {
	content: "";
	flex: 0 0 auto;
	width: 1em;
	height: 1em;
	background-color: currentColor;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M497.39 361.8l-112-48a24 24 0 0 0-28 6.9l-49.6 60.6A370.66 370.66 0 0 1 130.6 204.11l60.6-49.6a23.94 23.94 0 0 0 6.9-28l-48-112A24.16 24.16 0 0 0 122.6.61l-104 24A24 24 0 0 0 0 48c0 256.5 207.9 464 464 464a24 24 0 0 0 23.4-18.6l24-104a24.29 24.29 0 0 0-14.01-27.6z'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M497.39 361.8l-112-48a24 24 0 0 0-28 6.9l-49.6 60.6A370.66 370.66 0 0 1 130.6 204.11l60.6-49.6a23.94 23.94 0 0 0 6.9-28l-48-112A24.16 24.16 0 0 0 122.6.61l-104 24A24 24 0 0 0 0 48c0 256.5 207.9 464 464 464a24 24 0 0 0 23.4-18.6l24-104a24.29 24.29 0 0 0-14.01-27.6z'/%3E%3C/svg%3E");
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
}

.arc-tunnel-aide__bouton:hover,
.arc-tunnel-aide__bouton:focus-visible {
	background: var(--arc-bleu-pale);
	color: var(--arc-bleu-sombre);
}

/* === 2. LA FRISE DES CINQ ÉTAPES ========================================== */

/*
 * Ce n'est pas un décor : c'est une navigation nommée, une liste ORDONNÉE, et
 * l'étape courante porte `aria-current="step"`. `tunnel.js` déplace la classe
 * `--active` ET l'attribut ARIA au fil des changements d'étape de
 * JetFormBuilder, de sorte que la frise dit la même chose à l'œil et au
 * lecteur d'écran. Sans JavaScript elle reste figée sur l'étape 1 : inexacte,
 * mais jamais bloquante.
 */

.arc-tunnel-frise {
	padding: 0 var(--arc-marge);
}

.arc-tunnel-frise__liste {
	position: relative;
	display: grid;
	grid-template-columns: repeat(5, 1fr);
	gap: var(--arc-gap-frise);
	max-width: 1578px;
	margin: 0 auto;
	padding: 0;
	list-style: none;
	counter-reset: none;
}

/*
 * Le trait de liaison. Dans Figma c'est UNE ligne unique qui passe DERRIÈRE
 * les vignettes et n'est donc visible que dans les gouttières. On la reproduit
 * telle quelle plutôt qu'avec cinq segments : un seul élément, aucun calcul de
 * position à maintenir, et le résultat est identique.
 */
.arc-tunnel-frise__liste::before {
	content: "";
	position: absolute;
	top: 50%;
	left: 10%;
	right: 10%;
	height: 2px;
	background: var(--arc-bleu);
	transform: translateY(-50%);
	z-index: 0;
}

.arc-tunnel-frise__etape {
	position: relative;
	z-index: 1; /* passe devant le trait, qui ne reste visible qu'entre les vignettes */
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	aspect-ratio: 1; /* 287 × 287 dans la maquette */
	padding: clamp(8px, 1.2vw, 20px);
	overflow: hidden;
	/* Étape non atteinte : dans Figma, une photo désaturée sous un voile blanc.
	   Sans la photo, un dégradé très clair joue le même rôle de fond neutre. */
	background: linear-gradient(150deg, #fbfcfe 0%, var(--arc-carte) 55%, #e9eff5 100%);
	color: var(--arc-texte);
	text-align: center;
	transition: background var(--arc-transition), color var(--arc-transition);
}

/* La pastille « ÉTAPE N » est plaquée en haut à gauche, à fleur du bord —
   c'est la position exacte de la maquette, pastille sans retrait latéral. */
.arc-tunnel-frise__rang {
	position: absolute;
	top: clamp(10px, 1.45vw, 25px);
	left: 0;
	padding: clamp(2px, 0.35vw, 6px) clamp(8px, 1.33vw, 23px);
	background: #fff;
	color: var(--arc-texte);
	font-size: var(--arc-t-petit);
	font-weight: 600;
	line-height: 1.2;
	text-transform: uppercase;
	white-space: nowrap;
}

.arc-tunnel-frise__intitule {
	max-width: 12em;
	font-size: var(--arc-t-frise);
	font-weight: 600;
	line-height: 1.25;
}

/*
 * « étape en cours », uniquement pour les lecteurs d'écran. Sans ce texte,
 * l'étape courante ne se distinguerait que par sa couleur — insuffisant.
 * `clip-path` plutôt que `display:none` : le texte reste dans l'arbre
 * d'accessibilité, c'est tout l'intérêt.
 */
.arc-tunnel-frise__etat {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

/* Étape courante : le dégradé bleu de la maquette, texte blanc, pastille
   blanche à texte bleu. */
.arc-tunnel-frise__etape--active {
	background: linear-gradient(180deg, rgba(0, 159, 227, 0.82) 0%, var(--arc-bleu) 100%);
	color: #fff;
}

.arc-tunnel-frise__etape--active .arc-tunnel-frise__rang {
	color: var(--arc-bleu-fonce);
}

/* === 3. LES BOUTONS DE NAVIGATION (rendus par JetFormBuilder) ============= */

/*
 * Dans la maquette, « Précédent » et « Continuer » sont juste sous la frise,
 * au-dessus du contenu de l'étape. JetFormBuilder, lui, les place en fin de
 * page d'étape. On les remonte par `order`, ce qui évite de déplacer quoi que
 * ce soit dans le DOM — donc sans JavaScript, et sans toucher au formulaire.
 *
 * ⚠️ LA BARRE N'EST PLUS COLLÉE (fix A8).
 * Elle l'a été : `position: sticky; top: 0` la maintenait à portée pendant
 * tout le défilement de l'étape 4. Retiré à la demande de l'ARC. Elle garde
 * en revanche sa PLACE — `order: -1`, sous la frise, comme dans la maquette :
 * seul le collage disparaît, pas le positionnement.
 *
 * Conséquence assumée, et c'est exactement ce que le collage évitait : à
 * l'étape 4 — vingt-deux champs, plus de trois mille pixels de haut sur
 * téléphone — l'adhérent doit remonter jusqu'en haut après le dernier champ
 * pour trouver « Continuer ». Si ce trajet se révèle pénible à l'usage, le
 * retour arrière tient en une déclaration.
 */
.arc-tunnel .jet-form-builder__next-page-wrap,
.arc-tunnel .field-type-submit-field,
.arc-tunnel .jet-form-builder__submit-wrap {
	grid-column: 1 / -1;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: flex-end;
	gap: 12px;
	background: #fff;
}

/* Le rembourrage vertical de cette barre est réglé dans Elementor
   (Form Break Row → Gap). La marge est EN BAS parce que `order: -1` place la
   barre au-dessus du contenu : c'est d'elle que le contenu doit s'écarter. */
.arc-tunnel .jet-form-builder__next-page-wrap {
	order: -1;
	margin: 0 0 clamp(18px, 2.2vw, 38px);
}

/*
 * LA MARGE DE DÉFILEMENT, RAMENÉE À LA BARRE D'ADMINISTRATION.
 *
 * Elle valait 84 px : c'était la hauteur de la barre de navigation quand
 * celle-ci était collée en haut. Sans ce réservoir, un saut du navigateur
 * vers le premier champ invalide calait la rangée SOUS la barre — constaté au
 * navigateur à 375 px, l'intitulé de « Ville » se posait à 5 px du haut,
 * masqué. La barre n'est plus collée (fix A8) : ce réservoir-là n'a plus
 * d'objet.
 *
 * Il reste 32 px, pour `#wpadminbar` — la barre d'administration WordPress,
 * elle bien en `position: fixed`. Elle ne concerne QUE les utilisateurs
 * connectés, donc l'équipe, jamais un adhérent : le tunnel se parcourt sans
 * compte. On garde la valeur parce qu'elle ne coûte rien (`scroll-margin-top`
 * n'intervient que pendant ces sauts, il n'ajoute aucun espace à la mise en
 * page) et qu'elle épargne à l'intégrateur un champ tronqué à chaque test.
 */
.arc-tunnel .jet-form-builder-row {
	scroll-margin-top: 32px;
}

/*
 * L'ENVOI FAIT EXCEPTION : il reste EN BAS.
 *
 * Les quatre écrans de la maquette placent « Précédent / Continuer » sous la
 * frise, et c'est ce que fait la règle ci-dessus. Mais la dernière étape n'est
 * pas une navigation : c'est un engagement, précédé de l'acceptation des
 * conditions et du consentement RGPD. Un bouton d'envoi placé AVANT les cases
 * qu'il valide inviterait à signer sans avoir lu. Il reste donc à sa place,
 * après elles — la maquette ne décrit pas cette étape, il n'y a rien à trahir.
 */
.arc-tunnel .field-type-submit-field,
.arc-tunnel .jet-form-builder__submit-wrap {
	margin: clamp(18px, 2.2vw, 38px) 0 0;
	background: none;
}

/* À l'étape 1 il n'y a pas de bouton « Précédent ». Sans cette marge
   automatique, `space-between` collerait « Continuer » à gauche : la marge
   pousse le bouton suivant à droite quel que soit le nombre de boutons. */
.jet-form-builder__prev-page {
	margin-right: auto;
}

/*
 * SEULE LA GÉOMÉTRIE RESTE ICI.
 *
 * Couleurs, typographie, contour, rayon et rembourrage de ces trois boutons
 * sont réglés dans Elementor (Style → Form Break Buttons, Style → Submit).
 * Ce qui suit n'a aucun équivalent dans le widget : la mise en ligne des
 * éléments, la largeur et la hauteur minimales, et la famille typographique
 * — cette dernière restant ici pour ne pas déclencher Google Fonts.
 *
 * ⚠️ SPÉCIFICITÉ — pourquoi le préfixe `.arc-tunnel` sur chaque bouton.
 * JetFormBuilder charge une remise à zéro (`reset.css`) APRÈS cette feuille,
 * qui contient `[type="button"], button { display:inline-block }`. Un
 * sélecteur d'attribut pèse exactement autant qu'une classe :
 * `.jet-form-builder__next-page` seul faisait match nul avec
 * `[type="button"]`, et l'ordre de chargement tranchait en faveur de la
 * remise à zéro. Le préfixe ajoute une classe et clôt le débat.
 */
.arc-tunnel .jet-form-builder__next-page,
.arc-tunnel .jet-form-builder__prev-page,
.arc-tunnel .jet-form-builder__submit {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	min-width: clamp(130px, 11.6vw, 200px);
	min-height: clamp(44px, 3.36vw, 58px);
	font-family: var(--arc-ui);
	cursor: pointer;
}

/*
 * Les chevrons sont dessinés en CSS (deux bords d'un carré tourné) plutôt
 * qu'importés en SVG : aucun fichier à déployer, aucune requête, et ils
 * héritent de `currentColor` donc suivent l'état du bouton sans une règle de
 * plus. `aria-hidden` est implicite pour un pseudo-élément.
 */
.arc-tunnel .jet-form-builder__prev-page::before,
.arc-tunnel .jet-form-builder__next-page::after,
.arc-tunnel .jet-form-builder__submit::after {
	content: "";
	flex: 0 0 auto;
	width: 0.5em;
	height: 0.5em;
	border-top: 2px solid currentColor;
	border-right: 2px solid currentColor;
}

.arc-tunnel .jet-form-builder__prev-page::before {
	transform: rotate(-135deg);
}

.arc-tunnel .jet-form-builder__next-page::after,
.arc-tunnel .jet-form-builder__submit::after {
	transform: rotate(45deg);
}

/*
 * Bouton verrouillé tant que l'étape n'est pas complète (étape 2 dans la
 * maquette : « Continuer » grisé tant que la cotisation n'est pas calculée).
 * Trois écritures pour un seul rendu, parce que l'état peut venir de
 * JetFormBuilder (`disabled`), du JS du tunnel (classe), ou d'ARIA.
 *
 * ⚠️ POURQUOI CES SÉLECTEURS SONT SI LONGS.
 * Le widget expose bien un onglet « Disabled » pour le bouton suivant, mais
 * JetFormBuilder ne l'enregistre QUE si l'option globale « Disable next
 * button » est active — elle ne l'est pas sur ce site, et l'activer changerait
 * le comportement du formulaire, pas seulement son apparence. L'état reste
 * donc ici, et doit passer devant la couleur normale posée par Elementor, qui
 * pèse quatre classes. Les maillons `.jet-form-builder` et `…-wrap` amènent ce
 * sélecteur à cinq : c'est la structure réelle du balisage, pas un artifice,
 * et cela évite un `!important` de plus.
 */
.arc-tunnel .jet-form-builder .jet-form-builder__next-page-wrap .jet-form-builder__next-page[disabled],
.arc-tunnel .jet-form-builder .jet-form-builder__next-page-wrap .jet-form-builder__next-page[aria-disabled="true"],
.arc-tunnel .jet-form-builder .jet-form-builder__submit-wrap .jet-form-builder__submit[disabled],
.arc-tunnel-bouton--verrouille,
.arc-tunnel-bouton[disabled] {
	background-color: var(--arc-gris);
	border-color: var(--arc-gris);
	color: #fff;
	cursor: not-allowed;
}

/* --- 3.1 Boutons propres au tunnel (posés par le PHP ou le JS) ------------- */

/* Même raison de préfixe que pour les boutons de navigation ci-dessus : la
   remise à zéro de JetFormBuilder vise `button` et `[type="button"]`, et ces
   trois-là sont bien des `<button>` posés dans le balisage du formulaire. */
.arc-tunnel .arc-tunnel-bouton,
.arc-tunnel .arc-tunnel-cotisation__calculer,
.arc-tunnel .arc-tunnel-cotisation__modifier,
.arc-tunnel .arc-devis-declencheur {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	min-height: clamp(44px, 3.36vw, 58px);
	padding: 0 clamp(16px, 1.9vw, 33px);
	border: 1px solid var(--arc-bleu);
	border-radius: var(--arc-rayon);
	background: var(--arc-bleu);
	color: #fff;
	font-family: var(--arc-ui);
	font-size: var(--arc-t-bouton);
	font-weight: 600;
	line-height: 1.2;
	text-decoration: none;
	cursor: pointer;
	transition: background var(--arc-transition), border-color var(--arc-transition);
}

.arc-tunnel .arc-tunnel-bouton:hover,
.arc-tunnel .arc-tunnel-bouton:focus-visible,
.arc-tunnel .arc-tunnel-cotisation__calculer:hover,
.arc-tunnel .arc-tunnel-cotisation__calculer:focus-visible {
	background: var(--arc-bleu-fonce);
	border-color: var(--arc-bleu-fonce);
	color: #fff;
}

/* « Obtenir un devis » est un lien dans la maquette, pas un bouton : il ne
   doit pas rivaliser avec l'action principale de l'étape. */
.arc-tunnel .arc-devis-declencheur,
.arc-tunnel .arc-tunnel-bouton--secondaire,
.arc-tunnel .arc-tunnel-cotisation__modifier {
	min-height: 0;
	padding: 0;
	border: 0;
	background: none;
	color: var(--arc-bleu);
	font-size: var(--arc-t-corps);
	font-weight: 600;
	text-decoration: underline;
}

.arc-tunnel .arc-devis-declencheur:hover,
.arc-tunnel .arc-tunnel-bouton--secondaire:hover,
.arc-tunnel .arc-tunnel-cotisation__modifier:hover,
.arc-tunnel .arc-devis-declencheur:focus-visible,
.arc-tunnel .arc-tunnel-bouton--secondaire:focus-visible,
.arc-tunnel .arc-tunnel-cotisation__modifier:focus-visible {
	background: none;
	color: var(--arc-bleu-fonce);
}

/* Anneau de focus commun, jamais supprimé : c'est le repère du clavier. */
.arc-tunnel :focus-visible,
.arc-tunnel-cartes :focus-visible,
.arc-tunnel-cotisation :focus-visible,
.arc-tunnel-accordeon :focus-visible,
.arc-tunnel-paiements :focus-visible,
.arc-tunnel-aide :focus-visible {
	outline: 3px solid var(--arc-bleu-clair);
	outline-offset: 2px;
}

/* === 4. HABILLAGE GÉNÉRAL DU FORMULAIRE =================================== */

.arc-tunnel .jet-form-builder {
	margin: 0;
	padding: 0 var(--arc-marge) clamp(30px, 4vw, 70px);
}

/*
 * Étapes en deux colonnes. C'est la lecture de la maquette aux écrans 3 et 4 :
 * les blocs de services y sont sur deux colonnes, et le formulaire du
 * responsable syndical également.
 *
 * ⚠️ `:not(--hidden)` est indispensable. JetFormBuilder replie les étapes non
 * courantes avec `display: none` sur une classe simple ; un `display: grid`
 * de même spécificité écrit après gagnerait et afficherait les cinq étapes
 * en même temps. Le `:not()` retire toute ambiguïté au lieu de parier sur
 * l'ordre de chargement des feuilles.
 */
.arc-tunnel .jet-form-builder-page:not(.jet-form-builder-page--hidden) {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 0 clamp(16px, 2.4vw, 42px);
	max-width: 1578px;
	margin: 0 auto;
}

/*
 * Ce qui ne se met JAMAIS en colonnes : les titres, les groupes de boutons
 * radio (qui portent leur propre grille), la signature, les blocs
 * conditionnels (qui contiennent eux-mêmes plusieurs champs), et la barre de
 * navigation.
 *
 * Les groupes de CASES À COCHER, eux, restent en colonnes : c'est ainsi que
 * la maquette présente l'écran 3, deux blocs de services par ligne.
 */
.arc-tunnel .field-type-heading-field,
.arc-tunnel .field-type-radio-field,
.arc-tunnel .field-type-signature-field,
.arc-tunnel .jet-form-builder__conditional,
.arc-tunnel .jet-form-builder-row.full-width {
	grid-column: 1 / -1;
}

/*
 * Les blocs de l'écran 3 portent un titre bleu en capitales, comme dans la
 * maquette.
 *
 * Le sélecteur vise l'étape qui ne contient QUE des cases à cocher : c'est ce
 * qui la distingue des deux autres étapes à cases. L'étape 4 se reconnaît à sa
 * signature, l'étape 5 à son choix de mode de paiement ; ni l'une ni l'autre
 * n'attend un titre de rubrique au-dessus d'une simple acceptation.
 * On ne compte PAS sur le rang de l'étape : ajouter une étape au formulaire ne
 * doit pas déplacer silencieusement cette mise en forme.
 */
.arc-tunnel .jet-form-builder-page:not(:has(.field-type-signature-field)):not(:has(.field-type-radio-field))
	.field-type-checkbox-field
	> .jet-form-builder__label
	.jet-form-builder__label-text {
	display: block;
	margin-bottom: 10px;
	padding-left: 12px;
	border-left: 3px solid var(--arc-bleu-clair);
	color: var(--arc-bleu);
	font-size: var(--arc-t-corps);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.02em;
}

/*
 * Un bloc conditionnel est une étape dans l'étape : il reprend la même grille
 * pour que ses champs s'alignent sur ceux du dessus.
 *
 * ⚠️ `!important` ET `:not([style*="none"])` — les deux vont ensemble.
 * JetFormBuilder pilote ses blocs conditionnels en écrivant `display` EN
 * LIGNE (`style="display: block"` / `"display: none"`). Un style en ligne bat
 * n'importe quel sélecteur : sans `!important`, la grille ne s'applique
 * jamais. Mais un `!important` seul rendrait VISIBLES les blocs que
 * JetFormBuilder vient de masquer — l'adhérent verrait les champs « syndic »
 * alors qu'il a répondu ne pas en avoir. Le `:not()` désarme exactement ce
 * cas : on ne force la grille que sur un bloc que JetFormBuilder affiche.
 */
.arc-tunnel .jet-form-builder__conditional:not([style*="none"]) {
	display: grid !important;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 0 clamp(16px, 2.4vw, 42px);
}

/*
 * ⚠️ `display: block` n'est pas cosmétique, c'est une correction.
 * JetFormBuilder rend ses rangées en `display: flex`, ce qui place
 * l'ÉTIQUETTE ET LE CHAMP CÔTE À CÔTE. Sur la grille de cartes de l'étape 1,
 * le titre occupait donc la moitié gauche et les huit cartes débordaient de
 * six cents pixels à droite de l'écran. Vérifié : c'était bien la cause.
 * Le empilement vertical (étiquette au-dessus) est aussi ce que montre la
 * maquette, à chaque étape.
 */
/* L'espacement sous chaque rangée est réglé dans Elementor (Style → Form Row
   → Gap After). Ne reste ici que la correction du `display`. */
.arc-tunnel .jet-form-builder-row {
	display: block;
	margin-top: 0;
}

/* --- 4.1 Étiquettes et titres de rubrique ---------------------------------- */

/*
 * Marge, taille, graisse, interligne et couleur des étiquettes — astérisque
 * « obligatoire » compris — sont réglées dans Elementor (Style → Label).
 * La typographie y est posée sur `.jet-form-builder__label` ; le
 * `.jet-form-builder__label-text` qu'il contient en HÉRITE.
 *
 * C'est ce qui permet aux quelques étiquettes particulières du tunnel — titre
 * des cartes de l'étape 1, rubriques de l'étape 3, encadré des lots — de
 * garder leur propre style plus bas dans ce fichier : une règle qui vise
 * DIRECTEMENT `__label-text` bat toujours une valeur héritée, quelle que soit
 * la spécificité de celle-ci. Aucune surenchère de sélecteur n'est nécessaire.
 */

/*
 * Les titres de section (`heading-field`) reprennent le bleu et le sérif des
 * titres de la maquette. Le bleu, la taille, la casse et la respiration sont
 * dans Elementor (Style → Heading Fields) ; ne restent ici que la FAMILLE
 * sérif — qui ne peut pas passer par Elementor sans appeler Google Fonts — et
 * le centrage, pour lequel le widget n'offre aucun réglage.
 *
 * JetFormBuilder imbrique `__label-text` DANS `__heading` : habiller le
 * conteneur suffit, l'enfant hérite.
 */
.arc-tunnel .jet-form-builder__heading {
	font-family: var(--arc-titre);
	text-align: center;
}

/* --- 4.2 Champs de saisie -------------------------------------------------- */

/*
 * Taille du texte, couleur, fond, rembourrage, contour et rayon sont réglés
 * dans Elementor (Style → Input Fields) — le widget y écarte de lui-même les
 * cases et boutons radio. Ne restent ici que les dimensions, que le widget ne
 * sait pas fixer, et la famille typographique.
 *
 * Le plancher de 16px sur la taille du texte est posé dans Elementor
 * (`max(16px, …)`) : en dessous, iOS zoome sur le champ à la mise au point et
 * l'adhérent perd sa page.
 */
.arc-tunnel input[type="text"],
.arc-tunnel input[type="email"],
.arc-tunnel input[type="tel"],
.arc-tunnel input[type="url"],
.arc-tunnel input[type="number"],
.arc-tunnel input[type="date"],
.arc-tunnel select,
.arc-tunnel textarea {
	width: 100%;
	min-height: clamp(38px, 2.4vw, 42px);
	font-family: var(--arc-ui);
	transition: border-color var(--arc-transition), box-shadow var(--arc-transition);
}

.arc-tunnel textarea {
	min-height: 84px;
	resize: vertical;
}

/*
 * ⚠️ ÉTATS DE CHAMP — LES DEUX SEULS `!important` AJOUTÉS PAR LA BASCULE.
 *
 * Elementor pose le contour et le fond normaux des champs avec un sélecteur de
 * neuf classes (trois pour son enveloppe, une pour le champ, cinq pour la
 * chaîne de `:not()` du widget). Aucune écriture raisonnable ne le dépasse.
 *
 * Ce n'est pas un contournement, c'est l'intention même : la mise au point et
 * l'erreur doivent l'emporter sur le réglage normal QUEL QU'IL SOIT. Si le
 * client donne demain un fond gris aux champs depuis Elementor, un champ en
 * erreur doit rester rouge. `!important` dit exactement cela.
 */
.arc-tunnel input:focus,
.arc-tunnel select:focus,
.arc-tunnel textarea:focus {
	border-color: var(--arc-bleu) !important;
	box-shadow: 0 0 0 3px rgba(0, 159, 227, 0.15);
	outline: none;
}

/* Champ en erreur signalé par JetFormBuilder. */
.arc-tunnel .jet-form-builder__field.error,
.arc-tunnel [aria-invalid="true"] {
	border-color: var(--arc-rouge) !important;
	background: var(--arc-rouge-pale) !important;
}

/* Le message d'erreur SOUS un champ. À ne pas confondre avec le message
   d'erreur DU FORMULAIRE (`jet-form-builder-message--error`), lui réglé dans
   Elementor : celui-ci n'a aucun réglage dans le widget. */
.arc-tunnel .jet-form-builder__field-error,
.arc-tunnel .field-has-error {
	color: var(--arc-rouge);
	font-size: var(--arc-t-petit);
}

/* === 5. ÉTAPE 1 — LA GRILLE DE CARTES ===================================== */

/*
 * RAPPEL DE BALISAGE (c'est ici que la feuille précédente se trompait) :
 *
 *   .jet-form-builder-row.field-type-radio-field
 *     .jet-form-builder__label            ← devient le grand titre bleu
 *     .jet-form-builder__fields-group
 *       .jet-form-builder__field-wrap     ← élément de grille
 *         label.jet-form-builder__field-label.for-radio   ← LA CARTE
 *           input.arc-tunnel-carte        ← la classe du contrat est ICI
 *           span                          ← l'intitulé
 *
 * Toutes les règles ci-dessous visent donc `label:has(> .arc-tunnel-carte)`.
 * La seconde écriture, `.arc-tunnel-carte:not(input)`, couvre le balisage du
 * contrat, où la classe habillerait bien un bloc : les deux formes rendent
 * pareil, et aucune n'est indispensable à l'autre.
 */

/* Le libellé du champ radio de l'étape 1 joue le rôle du grand titre centré
   de la maquette. Réservé à CE champ : les autres radios du formulaire
   (« Êtes-vous géré par un syndic ? », mode de paiement) gardent une
   étiquette normale. */
/* ⚠️ Le maillon `.jet-form-builder` n'est pas décoratif : sans lui, ce
   sélecteur ferait match nul avec la marge d'étiquette posée par Elementor, et
   le titre de l'étape 1 se recollerait aux cartes. */
.arc-tunnel .jet-form-builder .jet-form-builder-row:has(.arc-tunnel-carte) > .jet-form-builder__label {
	margin: 0 0 clamp(18px, 2.3vw, 40px);
	text-align: center;
}

.arc-tunnel .jet-form-builder-row:has(.arc-tunnel-carte) .jet-form-builder__label-text {
	color: var(--arc-bleu);
	font-family: var(--arc-titre);
	font-size: var(--arc-t-titre);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.02em;
}

/*
 * La grille : quatre colonnes dans la maquette, 1228 px de large, centrée.
 *
 * ⚠️ `.jet-form-builder .jet-form-builder-row` en tête n'est pas un ornement.
 * Le widget pose SON PROPRE écart entre options (`gap: 0.7em`) sur
 * `.jet-form-builder__fields-group`, avec quatre classes. Sans ces deux
 * maillons structurels, la gouttière de la maquette (jusqu'à 59 px) était
 * remplacée par 0,7 em et les huit cartes se collaient. Même raison pour la
 * grille des modes de paiement, plus bas.
 */
.arc-tunnel .jet-form-builder .jet-form-builder-row .jet-form-builder__fields-group:has(.arc-tunnel-carte),
.arc-tunnel-cartes {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: var(--arc-gap-cartes);
	max-width: 1228px;
	margin: 0 auto;
	padding: 0;
	list-style: none;
}

/* L'enveloppe de champ n'apporte rien visuellement : elle s'efface pour que
   la carte occupe toute la cellule et que toutes les cartes d'une même ligne
   aient la même hauteur. */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte) {
	display: flex;
	margin: 0;
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte),
.arc-tunnel-carte:not(input) {
	position: relative;
	display: flex;
	flex: 1;
	flex-direction: column;
	/*
	 * `align-items` est écrit explicitement parce que JetFormBuilder pose
	 * `center` sur ses étiquettes de champ. Hérité, il empêchait la vignette
	 * (un pseudo-élément vide) de s'étirer : elle mesurait 0 × 0 et la carte
	 * n'avait ni image ni bandeau. Vérifié : c'était bien la cause.
	 */
	align-items: stretch;
	margin: 0;
	padding: 0;
	overflow: hidden;
	/* Figma indique 0.5px : à l'écran, un demi-pixel disparaît ou double selon
	   la densité. 1px est le seul trait qui rende identiquement partout. */
	border: 1px solid var(--arc-bleu);
	background: #fff;
	color: var(--arc-bleu-fonce);
	font-size: var(--arc-t-carte);
	font-weight: 600;
	text-align: center;
	cursor: pointer;
	transition: border-color var(--arc-transition), box-shadow var(--arc-transition),
		transform var(--arc-transition);
}

/*
 * Le bouton radio, et le faux rond que JetFormBuilder dessine.
 *
 * CE QUE FAIT DÉJÀ JETFORMBUILDER, et qu'il faut connaître avant d'écrire une
 * ligne ici : il déplace le vrai `<input>` hors de vue (`position:absolute ;
 * opacity:0`) et dessine à sa place un rond en `span::before`. Le champ n'est
 * donc jamais retiré du DOM ni de l'arbre d'accessibilité — il reste
 * focalisable, navigable aux flèches entre radios d'un même `name`, et c'est
 * lui qui est soumis.
 *
 * Sur les cartes de l'étape 1, la maquette ne montre AUCUN rond : l'état coché
 * se lit sur la carte entière (bordure épaissie, ombre, bandeau du bas). On
 * masque donc le faux rond de JetFormBuilder, et la mise au point clavier
 * dessine son anneau autour de la carte plutôt qu'autour d'un rond de 19 px.
 */
/*
 * ⚠️ `!important` — seule occurrence du fichier, et elle est subie.
 * JetFormBuilder écrit `.jet-form-builder__field-wrap.checkradio-wrap
 * span::before { content: "" !important }`. Aucune spécificité, si haute
 * soit-elle, ne bat une déclaration importante : il faut lui en opposer une.
 * Vérifié à la console : sans `!important` le faux rond reste dessiné au
 * milieu de la carte, à gauche de l'intitulé.
 */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte) > span::before,
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte) > span::after {
	content: none !important;
}

/* Repli pour le balisage du contrat, où la classe habillerait un bloc : le
   radio y serait un vrai enfant visible, qu'on retire de la même façon. */
.arc-tunnel-carte:not(input) > input[type="radio"] {
	position: absolute;
	width: 1px;
	height: 1px;
	opacity: 0;
	pointer-events: none;
}

/* La vignette colorée du haut — 179 px sur 372 dans la maquette, soit 48 %.
   `--arc-carte-image` est le point d'accroche si les photos de la maquette
   sont un jour versionnées : il suffira de poser
   `--arc-carte-image: url(...)` sur la carte, rien d'autre à changer. */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte)::before,
.arc-tunnel-carte:not(input)::before {
	content: "";
	display: block;
	width: 100%;
	aspect-ratio: 263 / 179;
	background-color: var(--arc-teinte-1);
	background-image: var(--arc-carte-image, linear-gradient(135deg, rgba(255, 255, 255, 0.55), rgba(255, 255, 255, 0)));
	background-size: cover;
	background-position: center;
}

/* Rotation des teintes, reprise de l'ordre de la maquette : deux lignes de
   quatre, décalées d'une teinte l'une par rapport à l'autre. */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte):nth-child(8n + 2) .jet-form-builder__field-label::before { background-color: var(--arc-teinte-2); }
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte):nth-child(8n + 3) .jet-form-builder__field-label::before { background-color: var(--arc-teinte-3); }
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte):nth-child(8n + 4) .jet-form-builder__field-label::before { background-color: var(--arc-teinte-4); }
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte):nth-child(8n + 5) .jet-form-builder__field-label::before { background-color: var(--arc-teinte-3); }
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte):nth-child(8n + 6) .jet-form-builder__field-label::before { background-color: var(--arc-teinte-4); }
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte):nth-child(8n + 7) .jet-form-builder__field-label::before { background-color: var(--arc-teinte-1); }
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte):nth-child(8n + 8) .jet-form-builder__field-label::before { background-color: var(--arc-teinte-2); }

/* L'intitulé occupe toute la place entre la vignette et le bandeau du bas —
   c'est ce qui aligne les huit bandeaux « Démarrer » sur une même ligne quelle
   que soit la longueur des intitulés. */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte) > span,
.arc-tunnel-carte:not(input) .arc-tunnel-carte__titre {
	display: flex;
	flex: 1;
	align-items: center;
	justify-content: center;
	padding: clamp(12px, 1.6vw, 28px) clamp(8px, 1vw, 18px);
	line-height: 1.15;
}

/*
 * Le bandeau « Démarrer ».
 *
 * C'est un pseudo-élément, donc un DÉCOR : il n'est pas dans l'arbre
 * d'accessibilité, et c'est voulu. Le vrai contrôle reste le bouton radio, et
 * le nom accessible de la carte reste son intitulé (« Conseil Syndicaux »).
 * Annoncer « Démarrer » huit fois de suite n'apporterait rien et masquerait
 * l'information utile.
 */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte)::after,
.arc-tunnel-carte:not(input)::after {
	content: "Démarrer";
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: clamp(44px, 3.94vw, 68px);
	background: var(--arc-bleu);
	color: #fff;
	font-size: var(--arc-t-bouton);
	font-weight: 700;
	transition: background var(--arc-transition);
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte):hover,
.arc-tunnel-carte:not(input):hover {
	box-shadow: var(--arc-ombre-active);
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte):hover::after,
.arc-tunnel-carte:not(input):hover::after {
	background: var(--arc-bleu-fonce);
}

/*
 * Carte choisie. Trois signaux, dont deux ne dépendent pas de la couleur :
 * bordure épaissie, ombre portée, et une coche « ✓ » devant « Démarrer ».
 * Un adhérent daltonien doit pouvoir dire laquelle des huit il a cochée.
 *
 * `--active` est conservée bien que `tunnel.js` ne la pose pas dans le
 * balisage actuel (sa recherche du radio échoue quand la classe est SUR le
 * radio) : elle redeviendra utile si le balisage change, et elle ne coûte rien.
 */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte:checked),
.arc-tunnel-carte--active:not(input) {
	border-width: 3px;
	box-shadow: var(--arc-ombre-active);
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte:checked)::after,
.arc-tunnel-carte--active:not(input)::after {
	content: "✓ Adhésion choisie";
	background: var(--arc-bleu-fonce);
}

/* Mise au point clavier : l'anneau entoure la carte entière, puisque le radio
   qui la porte est invisible. */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte:focus-visible),
.arc-tunnel-carte--focus:not(input) {
	outline: 3px solid var(--arc-bleu-clair);
	outline-offset: 3px;
}

/* --- 5.1 L'attente avant l'enchaînement automatique ------------------------ */

/*
 * L'ÉTAPE 1 N'A PLUS DE BOUTON « CONTINUER » (fix A4).
 *
 * Choisir une carte suffit : le script enchaîne tout seul après le délai
 * décrit juste en dessous (§5 bis de `arc-tunnel.js`). Le bouton n'offrait
 * qu'un second chemin vers exactement la même chose.
 *
 * ⚠️ ON LE MASQUE, ON NE LE SUPPRIME PAS DU BALISAGE.
 * C'est LUI que le script actionne (`bouton.click()`), et `programmerBascule()`
 * sort sans rien faire s'il ne le trouve pas. Retiré par l'attribut
 * `add_next_button` du bloc JetFormBuilder, l'étape 1 n'aurait plus AUCUNE
 * navigation. `display: none` n'empêche pas `click()` : mesuré au navigateur
 * sur la préprod, le formulaire passe bien à l'étape 2 le wrap masqué.
 *
 * TROIS GARDES, ET CHACUNE SERT :
 *
 * · `.arc-tunnel--js` — drapeau posé par le script en toute fin d'init. Sans
 *   JavaScript il n'y a pas d'enchaînement : le bouton doit rester visible.
 *
 * · `[data-page="1"]` — numérotation JetFormBuilder à partir de 1
 *   (`templates/common/start-page.php`). Les étapes 2 à 5 gardent leur barre
 *   « Précédent / Continuer ».
 *
 * · `:has(input[type="radio"].arc-tunnel-carte)` — on ne masque le bouton QUE
 *   là où les cartes existent, donc là où l'enchaînement peut prendre le
 *   relais. Sans cette garde : quand le conteneur `.arc-tunnel` est absent,
 *   `racines()` (§6 du script) retombe sur `document.body` et pose
 *   `arc-tunnel--js` DESSUS — la règle masquerait alors le premier bouton de
 *   n'importe quel formulaire multi-pages de la page. `:has()` est déjà
 *   employé par cette feuille : aucune dépendance nouvelle, et si le
 *   navigateur ne le connaît pas le bouton reste visible — la bonne
 *   dégradation.
 *
 * La sortie CLAVIER est dans `arc-tunnel.js` (écouteur `keyup` sur Espace) :
 * sans elle, une flèche coche la carte sans émettre de `click`, et l'adhérent
 * au clavier se retrouverait sans aucune sortie. Les deux vont ensemble.
 */
.arc-tunnel--js
	.jet-form-builder-page[data-page="1"]:has( input[type="radio"].arc-tunnel-carte )
	.jet-form-builder__next-page-wrap {
	display: none;
}


/*
 * Choisir une carte fait passer à l'étape 2 tout seul, après un court délai
 * (`--arc-tunnel-delai-bascule`, lu par le script). Ce délai n'existe QUE pour
 * que l'adhérent voie son choix pris en compte : il faut donc le montrer,
 * sinon la page semble sauter sans raison.
 *
 * Le signal est une jauge qui se remplit sur le bandeau du bas — celui qui
 * affiche déjà « ✓ Adhésion choisie ». Elle occupe le temps de l'attente exacte,
 * puisque les deux durées sont la même variable.
 *
 * La classe est posée par le script sur le `<label>`, jamais par le CSS seul :
 * sans JavaScript il n'y a pas d'enchaînement, donc rien à annoncer.
 */
/*
 * ⚠️ DEUX PIÈGES DE CASCADE, TOUS DEUX MESURÉS À LA CONSOLE.
 *
 * 1. La règle « carte choisie » (juste au-dessus) écrit `background:` EN
 *    RACCOURCI avec quatre classes de poids. Un raccourci remet
 *    `background-image` à zéro : sans `!important`, la jauge était effacée en
 *    silence. C'est le seul moyen de peser plus lourd sans allonger le
 *    sélecteur au point de le rendre illisible.
 *
 * 2. `background-size` n'est PAS déclaré ici, uniquement dans les images-clés.
 *    C'est volontaire : une animation prime sur une déclaration normale, donc
 *    la taille animée bat le raccourci de la règle « carte choisie » sans
 *    qu'on ait besoin d'un second `!important` — qui, lui, aurait au contraire
 *    figé la jauge, les déclarations importantes primant sur les animations.
 *
 * Le sélecteur reste volontairement court, sur la SEULE classe posée par le
 * script : un sélecteur en `:has(:checked)` s'est révélé fragile à
 * l'invalidation quand l'état coché change (comportement observé, intermittent).
 */
.arc-tunnel .arc-tunnel-carte--bascule::after,
.arc-tunnel-carte--bascule:not(input)::after {
	/*
	 * La jauge est un aplat peint par-dessus le bandeau et révélé de gauche à
	 * droite en animant sa TAILLE DE FOND. Aucune propriété exotique : ni
	 * `@property`, ni variable animée, ni dégradé à positions multiples — la
	 * même animation rend partout.
	 */
	background-image: linear-gradient(var(--arc-bleu-clair), var(--arc-bleu-clair)) !important;
	background-repeat: no-repeat !important;
	background-position: left center !important;
	animation: arc-tunnel-jauge var(--arc-tunnel-delai-bascule) linear forwards;
}

/* ⚠️ `0%` et non `0` : mesuré à la console, une interpolation entre une
   LONGUEUR (`0px`) et un POURCENTAGE (`100%`) n'est pas continue — la jauge
   reste bloquée sur son image de départ. Les deux bornes doivent partager
   la même unité. */
@keyframes arc-tunnel-jauge {
	from { background-size: 0% 100%; }
	to   { background-size: 100% 100%; }
}

/* Mouvement réduit demandé par le système : plus d'animation, donc plus de
   contrainte de taille — l'aplat occupe tout le bandeau d'un coup. La carte
   reste signalée, sans rien qui bouge. */
@media (prefers-reduced-motion: reduce) {
	.arc-tunnel .arc-tunnel-carte--bascule::after,
	.arc-tunnel-carte--bascule:not(input)::after {
		animation: none;
	}
}

/*
 * Annonce aux lecteurs d'écran (« Contrat sélectionné. Passage à l'étape
 * suivante. »), créée par le script. Masquée à l'œil, jamais à l'oreille :
 * `display: none` ou `visibility: hidden` la retireraient aussi de l'arbre
 * d'accessibilité, et l'annonce ne serait plus faite du tout.
 */
.arc-tunnel__annonce {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* === 6. ÉTAPE 2 — LES LOTS ET LA COTISATION =============================== */

/*
 * La maquette présente cette étape comme une colonne centrée et étroite :
 * un barème encadré, une seule saisie, un bouton, un lien. Rien n'y est en
 * deux colonnes, d'où la largeur limitée plutôt que la grille de l'étape 4.
 */
.arc-tunnel .arc-tunnel-cotisation {
	max-width: 900px;
	margin: 0 auto;
	text-align: center;
}

/*
 * La zone de saisie est un ENCADRÉ, pas une boîte flexible.
 *
 * `.arc-tunnel-lots` est un bloc conditionnel de JetFormBuilder : il porte un
 * `style="display: block"` en ligne que rien ne peut renverser sans
 * `!important` (voir la note du §4). On ne déclare donc AUCUN `display` ici —
 * le centrage passe par `text-align` et des marges automatiques, qui n'en
 * dépendent pas. Écrire `display: flex` donnerait l'illusion d'une règle
 * appliquée alors qu'elle est ignorée en silence.
 */
/* Le sélecteur reprend `.jet-form-builder__conditional` pour PASSER DEVANT la
   règle générale des blocs conditionnels (§4), qui impose deux colonnes. Un
   seul champ tient ici : à deux colonnes, son étiquette se cassait sur quatre
   lignes dans la moitié gauche. Vérifié. */
.arc-tunnel .jet-form-builder__conditional.arc-tunnel-lots {
	grid-template-columns: minmax(0, 1fr);
	max-width: 560px;
	margin: 0 auto clamp(14px, 1.6vw, 28px);
	padding: clamp(14px, 1.6vw, 26px);
	border: 1px solid var(--arc-bordure);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-carte);
	text-align: center;
}

/* ⚠️ Même surenchère que pour l'étiquette des cartes : l'espacement des
   rangées vient désormais d'Elementor, qui pèse quatre classes. Sans le
   maillon `.jet-form-builder`, l'encadré des lots gagnait une marge basse
   parasite sous son unique champ. */
.arc-tunnel .jet-form-builder .jet-form-builder__conditional.arc-tunnel-lots .jet-form-builder-row {
	margin: 0;
}

.arc-tunnel .arc-tunnel-lots .jet-form-builder__label-text {
	font-size: var(--arc-t-corps);
	font-weight: 700;
}

/*
 * LA SAISIE DU NOMBRE DE LOTS — l'élément principal de l'étape.
 *
 * Elle était dimensionnée comme un champ ordinaire (96 à 140 px de large, texte
 * au corps courant). Le client la trouvait trop petite, et il a raison : c'est
 * le SEUL champ de l'étape, et c'est de lui seul que dépend le montant de la
 * cotisation. Il est donc traité comme un afficheur, pas comme une ligne de
 * formulaire — corps proche de celui du montant affiché juste en dessous, pour
 * que l'œil fasse le lien entre ce qu'on tape et ce qu'on paiera.
 *
 * Les trois dimensions bougent ensemble (corps, hauteur, largeur) : agrandir le
 * seul texte dans une boîte inchangée l'aurait fait déborder.
 */
/*
 * ⚠️ LES `!important` DE CE BLOC SONT SUBIS, PAS CHOISIS — et ils suivent
 * exactement la logique déjà posée au §4.2 pour les états de champ.
 *
 * Elementor habille les champs de saisie du formulaire avec un sélecteur de
 * NEUF classes :
 *   .elementor-215 .elementor-element.elementor-element-… .jet-form-builder__field
 *   :not(.checkradio-field):not(.range-field):not(.jet-form-builder-repeater)
 *   :not(.wysiwyg-field):not([role="switch"])
 * Mesuré à la console : sans `!important`, le corps du texte retombait à 16 px,
 * le contour à 1 px gris et le rembourrage à 8/12 — le champ restait celui de
 * tous les autres, c'est-à-dire l'inverse de ce qui est demandé.
 *
 * Seules les propriétés effectivement écrasées portent la marque : les
 * dimensions (largeur, hauteur), la famille et l'alignement passent sans elle,
 * Elementor ne les réglant pas.
 */
.arc-tunnel .arc-tunnel-lots input[type="number"] {
	/* `min()` plutôt que `clamp()` sur la largeur : sous 360 px de fenêtre,
	   `clamp(220px, …)` imposerait un plancher de 220 px et ferait déborder
	   l'encadré. `min()` laisse le champ se réduire jusqu'à la place réelle. */
	width: min(280px, 100%);
	max-width: 100%;
	height: clamp(64px, 7vw, 104px);
	box-sizing: border-box;
	margin: 0 auto;
	padding: 0 clamp(8px, 1vw, 16px) !important;
	border: 2px solid var(--arc-bleu) !important;
	border-radius: var(--arc-rayon-doux) !important;
	color: var(--arc-bleu-fonce) !important;
	font-family: var(--arc-titre);
	/* Le montant affiché en dessous est à clamp(1.75rem, 2.4vw, 2.6rem) : le
	   nombre saisi est volontairement du même ordre, à peine en deçà. */
	font-size: clamp(1.75rem, 3.2vw, 2.75rem) !important;
	font-weight: 700;
	line-height: 1;
	text-align: center;

	/*
	 * Les flèches natives du champ nombre sont retirées : à ce corps-là elles
	 * se retrouvaient collées au bord, minuscules et disproportionnées. Rien
	 * n'est perdu — le champ reste un `type="number"`, donc le clavier
	 * numérique s'ouvre sur mobile, les flèches HAUT et BAS du clavier
	 * incrémentent toujours, et `min="1"` continue d'être validé.
	 */
	appearance: textfield;
	-moz-appearance: textfield;
}

.arc-tunnel .arc-tunnel-lots input[type="number"]::-webkit-outer-spin-button,
.arc-tunnel .arc-tunnel-lots input[type="number"]::-webkit-inner-spin-button {
	margin: 0;
	appearance: none;
	-webkit-appearance: none;
}

/* La mise au point reprend le vocabulaire du §4.2 (bleu + halo), à l'échelle
   du champ agrandi. `!important` pour la même raison que la règle ci-dessus. */
.arc-tunnel .arc-tunnel-lots input[type="number"]:focus {
	border-color: var(--arc-bleu-fonce) !important;
	box-shadow: var(--arc-ombre-active);
	outline: none;
}

.arc-tunnel .arc-tunnel-lots .jet-form-builder__desc {
	text-align: center;
}

/* --- 6.1 La bascule saisie ↔ montant --------------------------------------- */

/*
 * Bascule de l'étape 2, décrite par le client : cliquer sur « Calculer le
 * montant » masque la zone de saisie, affiche le montant et fait apparaître
 * deux boutons. Un seul état porte tout : `--calcule`, posé par le JS sur le
 * conteneur. Sans JS, saisie ET montant restent visibles — dégradation
 * lisible. Ces règles sont reprises telles quelles : c'est le comportement,
 * il fonctionne, on n'y touche pas.
 */
.arc-tunnel--js .arc-tunnel-cotisation__montant,
.arc-tunnel--js .arc-tunnel-cotisation__detail,
.arc-tunnel--js .arc-tunnel-cotisation__actions {
	display: none;
}

/* `!important` sur la seule zone de saisie : c'est un bloc conditionnel, donc
   porteur d'un `style="display: block"` en ligne posé par JetFormBuilder (voir
   la note du §4). Masquer est toujours sans danger — au pire l'adhérent
   reclique sur « Modifier le nombre de lots », qui retire `--calcule` et rend
   la main à JetFormBuilder. */
.arc-tunnel--js .arc-tunnel-cotisation--calcule .arc-tunnel-lots {
	display: none !important;
}

.arc-tunnel--js .arc-tunnel-cotisation--calcule .arc-tunnel-cotisation__calculer {
	display: none;
}

.arc-tunnel--js .arc-tunnel-cotisation--calcule .arc-tunnel-cotisation__montant {
	display: block;
}

.arc-tunnel--js .arc-tunnel-cotisation--calcule .arc-tunnel-cotisation__detail {
	display: block;
}

.arc-tunnel--js .arc-tunnel-cotisation--calcule .arc-tunnel-cotisation__actions {
	display: flex;
}

.arc-tunnel-cotisation__montant {
	margin: 0;
	color: var(--arc-bleu-fonce);
	font-family: var(--arc-titre);
	font-size: clamp(1.75rem, 2.4vw, 2.6rem);
	font-weight: 700;
	line-height: 1.15;
}

.arc-tunnel-cotisation__detail {
	margin: 8px 0 0;
	color: var(--arc-texte-doux);
	font-size: var(--arc-t-petit);
	line-height: 1.5;
}

/*
 * Le barème, sous le montant. Le TEXTE ne se trouve ni ici ni dans le
 * JavaScript : il est déduit des tranches par `ARC_Demandes_Tunnel::
 * bareme_texte()` et voyage avec la réponse de la route. Le barème attend une
 * revalidation de l'ARC ; l'écrire en dur dans cette feuille garantirait
 * qu'un jour le tunnel annonce un tarif et en facture un autre.
 */
.arc-tunnel-cotisation__bareme {
	display: block;
	margin-top: 6px;
}

.arc-tunnel-cotisation__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: clamp(14px, 1.6vw, 28px);
	margin-top: clamp(14px, 1.6vw, 28px);
}

/*
 * Barème inconnu pour ce type de copropriété : l'ARC doit encore renseigner
 * sept barèmes. La classe est posée côté serveur (`bareme_connu()` faux) ;
 * elle ne dépend d'aucun JavaScript.
 */
.arc-tunnel-cotisation--indefinie {
	padding: clamp(14px, 1.6vw, 26px);
	border-left: 4px solid var(--arc-bleu);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-bleu-pale);
}

.arc-tunnel-cotisation--indefinie .arc-tunnel-cotisation__montant {
	font-size: var(--arc-t-corps);
	font-weight: 700;
}

/* Saisie invalide au moment du clic sur « Calculer » : on reste sur la saisie.
   `!important` pour la même raison que les autres états de champ (§4.2) : cet
   état doit battre l'apparence normale réglée dans Elementor. */
.arc-tunnel-cotisation--erreur .arc-tunnel-lots input {
	border-color: var(--arc-rouge) !important;
	background: var(--arc-rouge-pale) !important;
}

.arc-tunnel-cotisation__erreur {
	display: none;
	margin: 10px 0 0;
	color: var(--arc-rouge);
	font-size: var(--arc-t-petit);
	font-weight: 600;
}

.arc-tunnel-cotisation--erreur .arc-tunnel-cotisation__erreur {
	display: block;
}

/* === 7. ÉTAPES 3 ET 4 — LES BLOCS REPLIABLES ============================== */

/*
 * Un seul composant sert les deux étapes, parce que le client décrit le même
 * geste : un écran, des blocs, un seul ouvert à la fois, aucun rechargement.
 * Ce qui change est le contenu, pas le mécanisme :
 *   - étape 3, chaque bloc porte une case « je valide » qui ferme le bloc et
 *     ouvre le suivant ;
 *   - étape 4, un bloc passe au vert quand tous ses champs obligatoires sont
 *     remplis.
 *
 * Côté maquette, l'écran 3 montre ces mêmes blocs sur DEUX COLONNES, avec un
 * titre bleu en capitales et un filet vertical le long du contenu. C'est ce
 * qui est repris ici ; la grille de l'étape (§4) place déjà les blocs deux
 * par deux.
 */

.arc-tunnel-accordeons {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: clamp(14px, 1.9vw, 32px);
}

.arc-tunnel-accordeon {
	border: 1px solid var(--arc-bordure);
	border-radius: var(--arc-rayon-doux);
	background: #fff;
	box-shadow: var(--arc-ombre);
	overflow: hidden;
	transition: border-color var(--arc-transition), box-shadow var(--arc-transition);
}

.arc-tunnel-accordeon + .arc-tunnel-accordeon {
	margin-top: 0;
}

/* --- 7.1 L'en-tête --------------------------------------------------------- */

/*
 * L'en-tête est un <button> quand le balisage le permet. Quand JetFormBuilder
 * ne produit qu'un <div>, tunnel.js le promeut (role="button", tabindex="0",
 * Entrée et Espace) : le composant reste utilisable au clavier quelle que soit
 * la balise réellement produite.
 */
.arc-tunnel-accordeon__entete {
	display: flex;
	align-items: center;
	gap: 12px;
	width: 100%;
	margin: 0;
	padding: clamp(12px, 1.2vw, 20px) clamp(12px, 1.2vw, 20px);
	border: 0;
	background: var(--arc-carte);
	color: var(--arc-bleu);
	font-family: var(--arc-ui);
	/* Le poids est porté par l'en-tête et non par le seul titre : quand
	   l'en-tête est un <button> (qui n'hérite pas du poids de son parent),
	   c'est la seule écriture qui tienne dans les deux agencements. */
	font-size: var(--arc-t-corps);
	font-weight: 700;
	text-align: left;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	cursor: pointer;
	transition: background var(--arc-transition);
}

.arc-tunnel-accordeon__entete:hover {
	background: var(--arc-bleu-pale);
}

.arc-tunnel-accordeon__titre {
	flex: 1 1 auto;
	margin: 0;
	font-size: inherit;
	font-weight: 700;
	line-height: 1.35;
}

/* Le titre peut être porté par un <h3> englobant le bouton : on neutralise
   alors les marges du heading pour ne pas décoller l'en-tête. */
h2.arc-tunnel-accordeon__titre,
h3.arc-tunnel-accordeon__titre,
h4.arc-tunnel-accordeon__titre {
	margin: 0;
}

/* Pastille d'état, créée par le JS si le balisage ne la fournit pas. */
.arc-tunnel-accordeon__etat {
	flex: 0 0 auto;
	margin-left: auto;
	padding: 3px 10px;
	border: 1px solid var(--arc-bordure);
	border-radius: 999px;
	background: #fff;
	color: var(--arc-texte-doux);
	font-size: var(--arc-t-petit);
	font-weight: 600;
	text-transform: none;
	letter-spacing: 0;
	white-space: nowrap;
}

.arc-tunnel-accordeon__etat:empty {
	display: none;
}

/*
 * Pastille et chevron sont plaqués à droite par une marge automatique plutôt
 * que par la croissance du titre : quand le balisage est
 * `<h3 class="…__titre"><button class="…__entete">Texte`, le titre n'EST PAS
 * un élément flexible de l'en-tête — c'est un simple nœud de texte qui ne
 * s'étire pas, et le chevron viendrait se coller au mot. La marge automatique,
 * elle, fonctionne dans les deux agencements.
 */
.arc-tunnel-accordeon__chevron {
	margin-left: auto;
}

/* Deux marges automatiques d'affilée créeraient un trou entre la pastille et
   le chevron : on n'en garde qu'une quand la pastille est renseignée. */
.arc-tunnel-accordeon__etat:not(:empty) + .arc-tunnel-accordeon__chevron {
	margin-left: 0;
}

/* Chevron : purement décoratif, `aria-hidden` posé par le JS. */
.arc-tunnel-accordeon__chevron {
	flex: 0 0 auto;
	width: 10px;
	height: 10px;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
	transform: rotate(45deg);
	transform-origin: center;
	transition: transform var(--arc-transition);
}

.arc-tunnel-accordeon--ouvert .arc-tunnel-accordeon__chevron {
	transform: rotate(-135deg);
}

/* --- 7.2 Le contenu et son repli ------------------------------------------- */

/*
 * Repli animé par `grid-template-rows: 0fr → 1fr`, la seule technique qui
 * anime une hauteur inconnue sans la mesurer en JavaScript.
 *
 * `visibility: hidden` accompagne le repli : il sort le contenu de l'ordre de
 * tabulation ET de l'arbre d'accessibilité. Sans lui, un champ replié resterait
 * atteignable à la tabulation alors qu'il est invisible — piège classique. Sa
 * transition est différée (`0s linear .22s`) pour ne s'appliquer qu'une fois
 * l'animation terminée, et immédiate à l'ouverture.
 */
.arc-tunnel-accordeon__contenu {
	padding: 0 clamp(12px, 1.2vw, 20px) clamp(12px, 1.2vw, 20px);
}

.arc-tunnel--js .arc-tunnel-accordeon__contenu {
	display: grid;
	grid-template-rows: 0fr;
	padding: 0;
	visibility: hidden;
	transition: grid-template-rows var(--arc-transition), visibility 0s linear 0.22s;
}

.arc-tunnel--js .arc-tunnel-accordeon--ouvert .arc-tunnel-accordeon__contenu {
	grid-template-rows: 1fr;
	visibility: visible;
	transition: grid-template-rows var(--arc-transition), visibility 0s;
}

/* Enveloppe créée par le JS : c'est elle qui rogne pendant l'animation. */
.arc-tunnel-accordeon__corps {
	min-height: 0;
	overflow: hidden;
}

/*
 * ⚠️ AUCUN REMBOURRAGE VERTICAL SUR CETTE ENVELOPPE.
 *
 * Une piste `0fr` n'est pas forcée à zéro : elle vaut au minimum la
 * contribution intrinsèque de son élément. `min-height: 0` annule bien la
 * contribution du CONTENU, mais pas celle du rembourrage ni des bordures. Un
 * `padding-bottom: 18px` ici rouvrirait donc un bandeau blanc de 18 px sous
 * chaque en-tête replié — vérifié, c'était le cas.
 *
 * L'espace du bas est donc du CONTENU (un `::after`), qui disparaît avec le
 * reste quand la piste vaut zéro. Le rembourrage horizontal, lui, n'entre pas
 * dans la hauteur : il peut rester.
 */
.arc-tunnel--js .arc-tunnel-accordeon__corps {
	padding: 0 clamp(12px, 1.2vw, 20px);
	/* Le filet vertical bleu clair qui longe les listes de services dans la
	   maquette (écran 3). Posé sur le corps, il suit exactement la hauteur
	   révélée par l'animation. */
	border-left: 2px solid var(--arc-bleu-clair);
	margin-left: clamp(12px, 1.2vw, 20px);
}

.arc-tunnel--js .arc-tunnel-accordeon__corps > :last-child {
	margin-bottom: 0;
}

.arc-tunnel--js .arc-tunnel-accordeon__corps::after {
	content: "";
	display: block;
	height: clamp(12px, 1.2vw, 20px);
}

.arc-tunnel-accordeon__corps > * + * {
	margin-top: 14px;
}

/* --- 7.3 La case « je valide » (étape 3) ----------------------------------- */

/*
 * Une case à cocher reste une case à cocher : `<input type="checkbox">` natif,
 * jamais remplacé par un bouton déguisé. C'est ce qui garantit qu'elle est
 * annoncée comme telle, cochable à la barre d'espace, et réversible — le
 * client insiste sur le fait que l'adhérent doit pouvoir revenir en arrière.
 */
.arc-tunnel-accordeon__validation,
.arc-tunnel .jet-form-builder__field-label.for-checkbox {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	margin: 0;
	padding: clamp(10px, 1vw, 14px) clamp(10px, 1vw, 14px);
	border: 1px solid var(--arc-bordure);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-carte);
	font-size: var(--arc-t-petit);
	font-weight: 500;
	line-height: 1.45;
	cursor: pointer;
	transition: border-color var(--arc-transition), background var(--arc-transition);
}

.arc-tunnel-accordeon__validation input[type="checkbox"],
.arc-tunnel .jet-form-builder__field-label.for-checkbox input[type="checkbox"] {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	margin: 0;
	accent-color: var(--arc-vert);
	cursor: pointer;
}

.arc-tunnel-accordeon__validation:hover,
.arc-tunnel .jet-form-builder__field-label.for-checkbox:hover {
	border-color: var(--arc-vert);
}

/* Case cochée : fond vert pâle, en écho au vert « ce bloc est réglé » des
   blocs repliables. */
.arc-tunnel .jet-form-builder__field-label.for-checkbox:has(input:checked) {
	border-color: var(--arc-vert-bordure);
	background: var(--arc-vert-pale);
}

/* --- 7.4 États d'un bloc --------------------------------------------------- */

.arc-tunnel-accordeon--ouvert {
	border-color: var(--arc-bleu);
	box-shadow: var(--arc-ombre-active);
}

.arc-tunnel-accordeon--ouvert .arc-tunnel-accordeon__entete {
	background: var(--arc-bleu-pale);
}

/*
 * Vert = « ce bloc est réglé ». Deux chemins mènent au même signal visuel,
 * parce que c'est le même message pour l'adhérent :
 *   `--valide`  : il a coché « je valide » (étape 3) ;
 *   `--complet` : tous les champs obligatoires sont remplis (étape 4).
 */
.arc-tunnel-accordeon--valide,
.arc-tunnel-accordeon--complet {
	border-color: var(--arc-vert-bordure);
}

.arc-tunnel-accordeon--valide .arc-tunnel-accordeon__entete,
.arc-tunnel-accordeon--complet .arc-tunnel-accordeon__entete {
	background: var(--arc-vert-pale);
}

.arc-tunnel-accordeon--valide .arc-tunnel-accordeon__etat,
.arc-tunnel-accordeon--complet .arc-tunnel-accordeon__etat {
	border-color: var(--arc-vert-bordure);
	background: #fff;
	color: var(--arc-vert);
}

/*
 * Coche devant le titre d'un bloc réglé — repère immédiat au balayage, et
 * information qui ne repose pas que sur la couleur.
 *
 * Elle est accrochée à l'EN-TÊTE, pas au titre : quand le balisage est
 * `<h3 class="…__titre"><button class="…__entete">`, une coche posée sur le
 * titre s'insérerait AVANT le bouton, donc sur sa propre ligne, au-dessus du
 * bandeau. Sur l'en-tête, elle est correcte dans les deux agencements.
 */
.arc-tunnel-accordeon--valide .arc-tunnel-accordeon__entete::before,
.arc-tunnel-accordeon--complet .arc-tunnel-accordeon__entete::before {
	content: "✓ ";
	color: var(--arc-vert);
	font-weight: 800;
}

/* Un bloc réglé ET ouvert : le bleu de l'ouverture prime sur le vert, sinon
   l'adhérent ne sait plus lequel des quatre blocs il est en train de lire. */
.arc-tunnel-accordeon--ouvert.arc-tunnel-accordeon--valide,
.arc-tunnel-accordeon--ouvert.arc-tunnel-accordeon--complet {
	border-color: var(--arc-bleu);
}

.arc-tunnel-accordeon--ouvert.arc-tunnel-accordeon--valide .arc-tunnel-accordeon__entete,
.arc-tunnel-accordeon--ouvert.arc-tunnel-accordeon--complet .arc-tunnel-accordeon__entete {
	background: var(--arc-bleu-pale);
}

/* Le groupe entier est réglé : les quatre cases sont cochées. */
.arc-tunnel-accordeons--complet {
	position: relative;
}

/* --- 7.5 Le formulaire de l'étape 4 --------------------------------------- */

/*
 * La maquette pose tout le formulaire du responsable syndical sur un panneau
 * gris-bleu. On le rend sur l'étape qui contient la signature — c'est le seul
 * marqueur stable de cette étape, indépendant de son rang, qui pourrait
 * changer si une étape était ajoutée.
 */
.arc-tunnel .jet-form-builder-page:not(.jet-form-builder-page--hidden):has(.field-type-signature-field) {
	padding: clamp(16px, 2.3vw, 40px);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-carte);
}

/* La barre de navigation est posée en haut du panneau (`order: -1` du §3) et
   porte un fond blanc, hérité de ce même §3. Sur ce panneau gris-bleu, ce
   blanc dessinerait un bandeau étranger : elle reprend donc le fond du
   panneau. La règle survit au retrait du collage (fix A8) — le blanc, lui,
   n'a pas disparu. */
.arc-tunnel .jet-form-builder-page:has(.field-type-signature-field) .jet-form-builder__next-page-wrap {
	background: var(--arc-carte);
}

/* Les champs de ce panneau étaient forcés en blanc pour ressortir sur le fond
   gris-bleu. La règle est supprimée : le fond des champs est désormais réglé
   dans Elementor, et il vaut déjà blanc. La réécrire ici la ferait diverger du
   jour où le client changerait ce réglage. */

.arc-tunnel .field-type-signature-field canvas {
	max-width: 100%;
	border: 1px solid var(--arc-bordure);
	border-radius: var(--arc-rayon-doux);
	background: #fff;
}

/*
 * LE CHAMP CACHÉ DE LA SIGNATURE.
 *
 * CE QUE FAIT CE CHAMP — constaté dans `assets/dist/frontend.js` du greffon
 * `jet-form-builder-signature-field`, puis vérifié au navigateur :
 *   • à chaque fin de tracé, le script écrit dedans l'image encodée de la
 *     signature (`$input.val(dataURL)` puis `setValue(dataURL)`) — une chaîne
 *     `data:image/png;base64,…` de trois à six mille caractères ;
 *   • le bouton « Effacer » y remet une chaîne vide ;
 *   • il porte `required` : c'est LUI qui rend l'étape invalide tant que rien
 *     n'a été signé.
 * Ce champ est donc la valeur de la signature. Il ne doit être ni supprimé,
 * ni mis en `display:none` — Chrome refuse de signaler un champ obligatoire
 * invalide qu'il ne peut pas atteindre, et le message devient incompréhensible.
 *
 * CE QUI N'ALLAIT PAS. Le greffon le pose en absolu sur les 38 px du bas du
 * cadre — 19 % de la zone de dessin — opaque, blanc, bordé, en `width:auto`.
 * Mais l'habillage des champs du site impose `width:100%` aux `input`, et
 * `width:auto` perd : le champ mesurait alors 290 px à partir de `left:5px`,
 * donc DÉBORDAIT de 5 px à droite du cadre. Ce liseré, lui, n'était couvert
 * par rien : il captait le clic, prenait le focus, et exposait la chaîne
 * base64 à la sélection. Une frappe, et la signature était remplacée par du
 * texte — le script recopie la saisie dans la valeur soumise (écouteur
 * `blur`). Sur téléphone, c'est le clavier qui s'ouvre par-dessus le cadre.
 *
 * Le reste du champ ne captait rien EN LOCAL, parce que le greffon publie un
 * `<style>` en ligne qui met le bloc de signature en `z-index:2` devant le
 * champ en `z-index:1`. Cette protection tient à un style en ligne — le genre
 * exact de chose que le minifieur d'o2switch déplace ou supprime en préprod.
 * C'est vraisemblablement là que « signer trop bas » atterrissait sur le
 * champ. La règle ci-dessous ne s'appuie plus dessus : le champ devient inerte
 * par lui-même, quel que soit l'ordre de peinture.
 *
 * CE QUE FAIT LA RÈGLE. Le champ reste dans le flux, à sa place, avec sa
 * valeur, son `required` et sa capacité à recevoir le focus — donc le message
 * natif s'affiche toujours au bon endroit, sous le cadre. Il devient
 * simplement invisible (`opacity`) et traversé par les clics et les gestes
 * (`pointer-events`). `width:auto` le ramène dans le cadre, `right:5px` le
 * borne à droite quoi qu'il arrive.
 *
 * ⚠️ NE PAS remplacer `opacity: 0` par `display:none`, `visibility:hidden`
 * ni par une taille nulle : ce sont les trois formes que Chrome considère
 * comme non atteignables, et la validation du formulaire casserait.
 *
 * ⚠️ Correctif d'habillage UNIQUEMENT. Le greffon tiers n'est pas modifié.
 */
.arc-tunnel .jet-form-builder-signature-with-input input.jet-form-builder-signature__input {
	width: auto;
	right: 5px;
	z-index: 0;
	opacity: 0;
	pointer-events: none;
	border: 0;
	background: transparent;
	box-shadow: none;
}

/* === 7 bis. AUTOCOMPLÉTION D'ADRESSE (composant autonome) ================= */

/*
 * Habillage de la liste de suggestions de `assets/js/arc-adresse-auto.js`.
 *
 * ⚠️ CETTE SECTION N'EST PAS PROPRE AU TUNNEL, et ses sélecteurs ne sont donc
 * PAS préfixés par `.arc-tunnel`. Le composant est réutilisable sur n'importe
 * quel formulaire (adresse de livraison, de facturation…) : son habillage doit
 * le suivre partout, sinon la liste apparaîtrait sans style ailleurs.
 *
 * Corollaire : les variables `--arc-*` sont déclarées sur `.arc-tunnel` & co,
 * pas sur `:root`. Hors du tunnel elles n'existent pas — d'où une VALEUR DE
 * REPLI sur chaque `var()`. Dans le tunnel, les teintes du tunnel s'appliquent
 * et la liste s'accorde au reste ; ailleurs, elle reste sobre et lisible.
 *
 * ✔ CE QUI N'A RIEN DEMANDÉ : le champ lui-même. Il reste un champ texte
 * JetFormBuilder ordinaire (`jet-form-builder__field`), donc habillé par le
 * widget Elementor comme « Ville » ou « Code postal ». Aucune règle n'est
 * écrite pour son apparence : ce serait un doublon, et cela figerait des
 * valeurs que le client règle dans le widget.
 */

/* Référentiel de positionnement : sans lui, la liste se calerait sur la page
   et flotterait n'importe où au défilement. La classe est posée par le script
   sur le parent direct du champ. */
.arc-adresse-auto__hote {
	position: relative;
}

.arc-adresse-auto__liste {
	position: absolute;
	z-index: 20;
	top: 100%;
	left: 0;
	right: 0;
	max-height: 280px;
	overflow-y: auto;
	/* Le défilement de la liste ne doit pas emporter la page derrière elle. */
	overscroll-behavior: contain;
	/* Neutralise les puces et le retrait qu'un thème pose sur les `ul`. */
	margin: 4px 0 0;
	padding: 0;
	list-style: none;
	border: 1px solid var(--arc-bordure, #e4ebf2);
	border-radius: var(--arc-rayon-doux, 8px);
	background: #fff;
	box-shadow: var(--arc-ombre-active, 0 6px 18px rgba(27, 42, 74, 0.18));
	font-family: var(--arc-ui, inherit);
	font-size: var(--arc-t-petit, 0.9375rem);
	text-align: left;
}

.arc-adresse-auto__liste[hidden] {
	/* `hidden` est réputé faible : la moindre règle `display` d'un thème le
	   contredit et la liste resterait ouverte en permanence. */
	display: none;
}

.arc-adresse-auto__option {
	margin: 0;
	padding: 10px 12px;
	color: var(--arc-texte, #1d1d1d);
	line-height: 1.35;
	cursor: pointer;
	/* Une adresse longue doit passer à la ligne plutôt que déborder ou forcer
	   un défilement horizontal — c'est le cas courant en écran étroit. */
	overflow-wrap: break-word;
}

.arc-adresse-auto__option + .arc-adresse-auto__option {
	border-top: 1px solid var(--arc-gris-pale, #f0f2f5);
}

/* Survol souris ET parcours clavier mènent au même état visuel : la position
   dans la liste se voit de la même façon, quel que soit le moyen d'y arriver. */
.arc-adresse-auto__option:hover,
.arc-adresse-auto__option--actif {
	background: var(--arc-bleu-pale, #eaf6fd);
	color: var(--arc-bleu-fonce, #007095);
}

/* Annonce destinée aux lecteurs d'écran : lue, jamais vue. On évite
   `display:none` et `visibility:hidden`, qui la rendraient muette. */
.arc-adresse-auto__annonce {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* Écrans étroits : la liste peut dépasser la hauteur utile et enfermer la
   saisie. On la borne au viewport et on agrandit la cible tactile. */
@media (max-width: 782px) {
	/*
	 * ⚠️ CE PLAFOND ÉTAIT À `50vh`, C'EST-À-DIRE PLUS HAUT QUE SUR ORDINATEUR.
	 *
	 * L'intention écrite au-dessus est de BORNER la liste ; `50vh` faisait
	 * l'inverse. Sur un téléphone de 760 px de haut, 50vh vaut 380 px là où le
	 * réglage de bureau en autorise 280 : la liste grandissait au moment précis
	 * où la place manque.
	 *
	 * Deux corrections :
	 *   · `min()` avec la valeur de bureau — la liste ne peut plus grandir en
	 *     rapetissant l'écran ;
	 *   · `svh` plutôt que `vh` — `vh` se mesure sur le viewport de MISE EN
	 *     PAGE, qui ignore la barre d'URL rétractable ; `svh` prend la plus
	 *     PETITE hauteur que le navigateur peut donner, donc celle qui reste
	 *     réellement visible.
	 *
	 * ⚠️ CE QUE ÇA NE RÈGLE PAS : le clavier virtuel. AUCUNE unité CSS ne le
	 * suit — ni `vh`, ni `dvh`, ni `svh`. Seul `interactive-widget=resizes-content`
	 * dans la balise `viewport` (posée par le thème, hors de cette feuille) le
	 * ferait. Le clavier n'a pas pu être reproduit dans l'environnement de test :
	 * ce point reste NON VÉRIFIÉ.
	 */
	.arc-adresse-auto__liste {
		max-height: min(280px, 45svh);
	}

	.arc-adresse-auto__option {
		padding: 12px;
	}
}

/* Réglages système respectés : ni défilement animé, ni transition imposée. */
@media (prefers-reduced-motion: reduce) {
	.arc-adresse-auto__liste {
		scroll-behavior: auto;
	}
}

/* === 8. ÉTAPE 5 — LES MODES DE PAIEMENT =================================== */

/*
 * L'étape 5 n'existe PAS dans la maquette : elle est composée ici dans la
 * continuité des quatre autres, et volontairement sobre — un choix de mode de
 * paiement n'a pas besoin de vignettes. On reprend le vocabulaire déjà posé :
 * cartes rectangulaires, bordure bleue à la sélection, coche pour dire l'état
 * autrement que par la couleur.
 *
 * Même piège de balisage qu'à l'étape 1 : `arc-tunnel-paiement` est sur le
 * `<input>`, la carte est le `<label>` qui l'enveloppe.
 */
.arc-tunnel .jet-form-builder .jet-form-builder-row .jet-form-builder__fields-group:has(.arc-tunnel-paiement),
.arc-tunnel-paiements {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
	gap: clamp(10px, 1.2vw, 20px);
	margin: 0;
	padding: 0;
	list-style: none;
}

.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-paiement) {
	display: flex;
	margin: 0;
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-paiement),
.arc-tunnel-paiement:not(input) {
	position: relative;
	display: flex;
	flex: 1;
	align-items: center;
	gap: 12px;
	margin: 0;
	padding: clamp(14px, 1.5vw, 22px) clamp(14px, 1.5vw, 22px);
	border: 1px solid var(--arc-bordure);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-carte);
	font-size: var(--arc-t-corps);
	font-weight: 600;
	cursor: pointer;
	transition: border-color var(--arc-transition), background var(--arc-transition),
		box-shadow var(--arc-transition);
}

/*
 * Ici le rond RESTE visible : il n'y a ni vignette ni bandeau pour dire
 * l'état, le contrôle est donc le repère le plus clair. C'est celui de
 * JetFormBuilder (`span::before`) qu'on habille, pas le vrai `<input>` — que
 * JetFormBuilder a déjà sorti de vue et qu'il serait absurde de faire
 * réapparaître à côté de son propre substitut.
 */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-paiement) > span::before,
.arc-tunnel .jet-form-builder__field-label.for-checkbox > span::before {
	border-color: var(--arc-gris);
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-paiement:checked) > span::before,
.arc-tunnel .jet-form-builder__field-label.for-checkbox:has(input:checked) > span::before {
	border-color: var(--arc-bleu);
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-paiement):hover,
.arc-tunnel-paiement:not(input):hover {
	border-color: var(--arc-bleu);
	background: #fff;
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-paiement:checked),
.arc-tunnel-paiement--actif:not(input) {
	border-color: var(--arc-bleu);
	border-width: 2px;
	background: #fff;
	box-shadow: var(--arc-ombre-active);
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-paiement:focus-visible),
.arc-tunnel-paiement--focus:not(input) {
	outline: 3px solid var(--arc-bleu-clair);
	outline-offset: 3px;
}

/* === 8 bis. ÉTAPE 5 — LE BLOC NATIF « PAYMENT GATEWAY » ================== */

/*
 * Le bloc `jet-forms/multi-gateway` de JetFormBuilder, affiché sous condition
 * quand l'adhérent choisit « CB & Virement ». Le client a demandé qu'il ne
 * détonne pas : il doit se lire comme une carte de plus, dans la continuité
 * immédiate du sélecteur de mode qui le précède de trois lignes.
 *
 * ┌──────────────────────────────────────────────────────────────────────┐
 * │ ⚠️ CE BLOC N'A PAS LE MÊME BALISAGE QUE LES AUTRES CHAMPS, ET C'EST   │
 * │ CE QUI COÛTE.                                                         │
 * │                                                                       │
 * │ Partout ailleurs dans ce formulaire, JetFormBuilder cache le vrai      │
 * │ `<input type="radio">` et lui substitue un `<span>` dont on habille le │
 * │ `::before` (voir §8). Le bloc passerelle, lui, rend un `<input>`       │
 * │ RÉEL ET VISIBLE, sans span : son gabarit                              │
 * │ (`modules/multi-gateway/blocks/multi-gateway/block-template.php`)      │
 * │ écrit le radio en clair dans le `<label>`.                            │
 * │                                                                       │
 * │ On ne peut donc pas réutiliser les règles du §8 : il faut redessiner   │
 * │ le rond à la main sur l'input, en `appearance: none`. Les valeurs      │
 * │ ci-dessous ne sont pas choisies, elles sont RELEVÉES sur le rond des   │
 * │ cartes de mode dans le navigateur (21,6 px, bordure 1 px, cercle       │
 * │ plein #398ffc à la sélection). Si l'ARC change la couleur du décorateur│
 * │ radio dans JetStyleManager, ces deux blocs divergeront — c'est la      │
 * │ dette de cette approche, et elle n'a pas d'échappatoire tant que le    │
 * │ bloc natif ne passe pas par le décorateur de JetFormBuilder.           │
 * └──────────────────────────────────────────────────────────────────────┘
 *
 * ⚠️ SÉLECTEURS VOLONTAIREMENT ALLONGÉS. JetStyleManager génère pour ce bloc
 * ses propres règles, accrochées à sa classe unique (`.cb-…`), avec deux
 * classes de spécificité — dont un `display:flex; flex-direction:column` sur
 * la liste. À égalité de spécificité, c'est l'ordre de chargement qui
 * tranche, et il n'est pas garanti. On passe donc devant avec un sélecteur à
 * trois classes. Même raison qu'au §9.1.
 */

/* --- Le bloc occupe toute la largeur, comme la rangée des modes ----------- */

/*
 * Un bloc conditionnel est ici une grille à deux colonnes (§7), parce qu'il
 * contient d'ordinaire plusieurs champs. Celui-ci n'en contient qu'UN : sans
 * cette règle, la carte se range dans la colonne de gauche et laisse à sa
 * droite une moitié de rangée vide, juste sous une rangée de modes qui, elle,
 * va d'un bord à l'autre. C'est exactement la rupture visuelle que le client
 * ne veut pas voir.
 */
.arc-tunnel .jet-form-builder .jet-form-builder__conditional.arc-tunnel-passerelle > * {
	grid-column: 1 / -1;
}

/* --- La liste : la même grille que les cartes de mode --------------------- */

.arc-tunnel .jet-form-builder .jfb-multi-gateway__list {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
	gap: clamp(10px, 1.2vw, 20px);
	margin: 0;
	padding: 0;
	list-style: none;
}

/* --- L'intitulé et la phrase d'explication ------------------------------- */

/*
 * Alignés sur l'étiquette d'un champ ordinaire (« Mode de paiement ») plutôt
 * que sur un titre de section : ce bloc EST un champ, pas un chapitre. Le
 * gabarit sort un `<h3>`, dont la taille par défaut du thème ferait un titre
 * de niveau page au milieu d'un formulaire.
 */
.arc-tunnel .jet-form-builder .jfb-multi-gateway__title {
	margin: 0 0 6px;
	font-family: var(--arc-ui);
	font-size: var(--arc-t-petit);
	font-weight: 600;
	line-height: 1.5;
	color: var(--arc-texte);
}

.arc-tunnel .jet-form-builder .jfb-multi-gateway__desc {
	margin: 0 0 10px;
	font-family: var(--arc-ui);
	font-size: var(--arc-t-petit);
	font-weight: 400;
	line-height: 1.5;
	color: var(--arc-texte-doux);
}

/* --- La carte : reprise trait pour trait du §8 ---------------------------- */

/*
 * ⚠️ ON COMPOSE AVEC LA GRILLE DU BLOC, ON NE LA COMBAT PAS.
 * `multi-gateway.css` pose `display: grid !important` sur la carte et
 * `width: auto !important` sur le radio. Un `display: flex` d'ici perdrait,
 * quelle que soit la spécificité — et le seul moyen de gagner serait un
 * `!important` de plus, c'est-à-dire une surenchère que le prochain qui
 * touchera cette feuille paierait. On garde donc la grille et on se contente
 * de redéfinir ses colonnes, qui elles ne sont pas marquées `!important`.
 */
.arc-tunnel .jet-form-builder .jfb-multi-gateway__item {
	position: relative;
	grid-template-columns: auto minmax(0, 1fr);
	align-items: center;
	column-gap: 12px;
	margin: 0;
	padding: clamp(14px, 1.5vw, 22px);
	border: 1px solid var(--arc-bordure);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-carte);
	font-size: var(--arc-t-corps);
	font-weight: 600;
	cursor: pointer;
	transition: border-color var(--arc-transition), background var(--arc-transition),
		box-shadow var(--arc-transition);
}

.arc-tunnel .jet-form-builder .jfb-multi-gateway__item:hover {
	border-color: var(--arc-bleu);
	background: #fff;
}

/*
 * `:has()` sur le parent plutôt qu'une classe posée en JavaScript : aucun
 * script n'est chargé pour ce bloc, et le projet s'interdit le JS en ligne.
 */
/*
 * La bordure passe de 1 px à 2 px à la sélection, comme les cartes de mode.
 * Le padding est réduit d'autant : sans cette compensation la carte
 * grandirait de 2 px au clic et pousserait le bouton d'envoi vers le bas.
 */
.arc-tunnel .jet-form-builder .jfb-multi-gateway__item:has(> input:checked) {
	padding: calc(clamp(14px, 1.5vw, 22px) - 1px);
	border-color: var(--arc-bleu);
	border-width: 2px;
	background: #fff;
	box-shadow: var(--arc-ombre-active);
}

.arc-tunnel .jet-form-builder .jfb-multi-gateway__item:has(> input:focus-visible) {
	outline: 3px solid var(--arc-bleu-clair);
	outline-offset: 3px;
}

/* --- Le rond, redessiné à la main ---------------------------------------- */

/*
 * ⚠️ `min-width` ET PAS `width`. Le bloc pose `width: auto !important` sur ce
 * radio ; un `width: 21.6px` d'ici est purement et simplement ignoré, et le
 * rond s'écrase à 2 px de large dans la colonne de 18 px prévue par le bloc.
 * Constaté au navigateur avant d'écrire ceci. `min-width` n'entre pas en
 * concurrence avec `width` : elle s'applique par-dessus, sans `!important`.
 */
.arc-tunnel .jet-form-builder .jfb-multi-gateway__item > input[type="radio"] {
	box-sizing: border-box;
	min-width: 21.6px;
	min-height: 21.6px;
	height: 21.6px;
	margin: 0;
	padding: 0;
	appearance: none;
	-webkit-appearance: none;
	border: 1px solid var(--arc-gris);
	border-radius: 50%;
	background: #fff;
	cursor: pointer;
	transition: border-color var(--arc-transition), background var(--arc-transition);
}

/*
 * Disque plein bleu percé d'un POINT BLANC CENTRAL — et pas un anneau, ni un
 * disque uni. C'est le rendu exact du décorateur des cartes de mode, relevé au
 * navigateur : fond `#398ffc` (la valeur que l'ARC a réglée dans
 * JetStyleManager), bordure `--arc-bleu`, et par-dessus un cercle blanc
 * occupant les trois quarts d'une tuile de 50 %.
 *
 * JetFormBuilder obtient ce point avec une image SVG en `data:`. On le
 * reproduit ici par un dégradé radial : même géométrie (`closest-side` sur une
 * tuile de 50 % donne un rayon de 5,4 px, dont 75 % font les 4,05 px du SVG),
 * mais exprimée en proportions — elle suivra donc la taille du rond si celle-ci
 * change un jour, là où une image figée ne suivrait pas.
 */
.arc-tunnel .jet-form-builder .jfb-multi-gateway__item > input[type="radio"]:checked {
	border-color: var(--arc-bleu);
	background-color: #398ffc;
	background-image: radial-gradient(circle closest-side, #fff 75%, transparent 75%);
	background-size: 50% 50%;
	background-position: center;
	background-repeat: no-repeat;
}

/*
 * L'anneau de focus est porté par la carte (règle plus haut) : le laisser
 * AUSSI sur l'input dessinerait deux contours concentriques.
 */
.arc-tunnel .jet-form-builder .jfb-multi-gateway__item > input[type="radio"]:focus-visible {
	outline: none;
}

/* --- Le libellé et sa précision ------------------------------------------ */

.arc-tunnel .jet-form-builder .jfb-multi-gateway__label {
	font-family: var(--arc-ui);
	font-size: var(--arc-t-corps);
	font-weight: 600;
	line-height: 1.35;
	color: var(--arc-texte);
}

.arc-tunnel .jet-form-builder .jfb-multi-gateway__description {
	margin-top: 4px;
	font-family: var(--arc-ui);
	font-size: var(--arc-t-petit);
	font-weight: 400;
	line-height: 1.4;
	color: var(--arc-texte-doux);
}

/*
 * Le cas « aucune passerelle affichable ». Le gabarit sort alors
 * « No gateways selected », en anglais, sans style — ce que verrait un
 * adhérent si `show_on_front` retombait à false (l'éditeur JetFormBuilder
 * réécrit cette clé, voir `exports/apply-tunnel-stripe.php`). On ne peut pas
 * traduire ce texte depuis une feuille de style, mais on peut faire qu'il ne
 * ressemble pas à un bout de gabarit oublié.
 */
.arc-tunnel .jet-form-builder .jfb-multi-gateway__empty {
	padding: clamp(14px, 1.5vw, 22px);
	border: 1px solid var(--arc-rouge);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-rouge-pale);
	font-size: var(--arc-t-petit);
	color: var(--arc-rouge);
}

/* === 9. TABLETTE ET MOBILE =============================================== */

/*
 * La maquette est dessinée à 1728 px. Un adhérent sur téléphone doit pouvoir
 * aller au bout : c'est le seul critère qui décide des ruptures ci-dessous.
 */

/* --- 9.1 Jusqu'à 1024 px : la grille de cartes passe à deux colonnes ------- */

/*
 * ⚠️ UNE REQUÊTE MÉDIA N'AJOUTE AUCUNE SPÉCIFICITÉ.
 * La grille des cartes est déclarée plus haut avec un sélecteur allongé, pour
 * passer devant l'écart entre options posé par le widget. Les ruptures
 * ci-dessous doivent donc reprendre EXACTEMENT le même sélecteur : écrit plus
 * court, il perdrait face à la règle de base et les huit cartes resteraient
 * sur quatre colonnes de 65 px sur un téléphone. Constaté au navigateur.
 */
@media (max-width: 1024px) {
	.arc-tunnel .jet-form-builder .jet-form-builder-row .jet-form-builder__fields-group:has(.arc-tunnel-carte),
	.arc-tunnel-cartes {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}

	/* La frise ne tient plus en cinq carrés : les vignettes s'aplatissent et
	   l'intitulé passe sous la pastille. */
	.arc-tunnel-frise__etape {
		aspect-ratio: 3 / 4;
	}
}

/* --- 9.2 Jusqu'à 782 px : une seule colonne partout ------------------------ */

@media (max-width: 782px) {
	.arc-tunnel .jet-form-builder-page:not(.jet-form-builder-page--hidden),
	.arc-tunnel-accordeons {
		grid-template-columns: minmax(0, 1fr);
	}

	/*
	 * ⚠️ LE BLOC CONDITIONNEL SE REPRIS À PART, AVEC SON SÉLECTEUR EXACT.
	 *
	 * Même piège qu'au §9.1, et il avait été manqué ici. La règle de base
	 * (§4) s'écrit `.arc-tunnel .jet-form-builder__conditional:not([style*="none"])`
	 * — deux classes ET un sélecteur d'attribut, soit trois crans de
	 * spécificité. Écrit plus court ici, l'écrasement perdait, et TOUS les
	 * blocs conditionnels restaient sur deux colonnes sur téléphone.
	 *
	 * Ce que ça donnait, constaté au navigateur à 375 px : à l'étape 3, la
	 * liste des services se retrouvait dans une colonne de 110 px — un mot
	 * par ligne sur deux mille cinq cents pixels de haut, les mots longs
	 * rognés. L'étape 4 subissait la même chose sur ses champs « syndic ».
	 *
	 * On reprend donc le sélecteur AU CARACTÈRE PRÈS. Le `:not()` reste
	 * indispensable pour la même raison qu'au §4 : ne rien forcer sur un bloc
	 * que JetFormBuilder vient de masquer.
	 */
	.arc-tunnel .jet-form-builder__conditional:not([style*="none"]) {
		grid-template-columns: minmax(0, 1fr);
	}

	/*
	 * RIEN À DÉCLARER ICI SUR LA BARRE DE NAVIGATION.
	 *
	 * Cette rupture portait autrefois un `position: static` qui décollait la
	 * barre sur téléphone. Le collage a été retiré du §3 pour tous les écrans
	 * (fix A8) : il n'y a plus rien à écraser.
	 */
}

/* --- 9.3 Jusqu'à 640 px : téléphone --------------------------------------- */

@media (max-width: 640px) {
	/* Même sélecteur allongé que la règle de base — voir la note du §9.1. */
	.arc-tunnel .jet-form-builder .jet-form-builder-row .jet-form-builder__fields-group:has(.arc-tunnel-carte),
	.arc-tunnel-cartes {
		grid-template-columns: minmax(0, 1fr);
	}

	/*
	 * La vignette s'aplatit. En colonne unique elle occuperait toute la largeur
	 * de l'écran et, au ratio de la maquette, ferait 255 px de haut : huit
	 * cartes deviendraient deux mille pixels de défilement avant le premier
	 * bouton. Aplatie, la grille reste balayable d'un pouce.
	 */
	.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte)::before,
	.arc-tunnel-carte:not(input)::before {
		aspect-ratio: 32 / 9;
	}

	/*
	 * La frise devient une bande qui défile horizontalement. Cinq étapes
	 * empilées verticalement, c'est un écran entier avant d'atteindre le
	 * formulaire ; réduites à cinq vignettes minuscules, elles deviennent
	 * illisibles. Le défilement conserve la lisibilité ET la place.
	 *
	 * `scroll-snap` aligne proprement la vignette courante, et `tunnel.js`
	 * amène l'étape active dans le champ de vision à chaque changement.
	 */
	.arc-tunnel-frise__liste {
		grid-auto-flow: column;
		grid-auto-columns: 60%;
		grid-template-columns: none;
		overflow-x: auto;
		scroll-snap-type: x mandatory;
		-webkit-overflow-scrolling: touch;
		padding-bottom: 6px;
	}

	.arc-tunnel-frise__etape {
		aspect-ratio: 16 / 9;
		scroll-snap-align: center;
	}

	/* Le trait de liaison est calculé sur une largeur fixe : dans une bande
	   qui défile il se retrouverait à la mauvaise place. */
	.arc-tunnel-frise__liste::before {
		display: none;
	}

	/*
	 * LES DEUX BOUTONS RESTENT CÔTE À CÔTE, MÊME À 375 px.
	 *
	 * Ils étaient empilés pleine largeur. Deux boutons de 44 px plus l'écart
	 * donnaient une barre de 120 px, soit 18 % d'un écran de 667 px — un prix
	 * qui, du temps où la barre était collée, avait justifié de la décoller
	 * sur téléphone. Le collage a disparu (fix A8) et l'argument avec lui,
	 * mais la mise côte à côte reste bonne pour elle-même : 64-68 px de barre
	 * au lieu de 120.
	 * Mesuré à 375 px sur l'étape 4 (la plus étroite, son panneau retire
	 * 2 × 16 px) : « Précédent » 101 px, « Adhérer et payer en ligne » 182 px.
	 * Aucun des deux ne descend sous 44 px de cible tactile — ils montent au
	 * contraire à 48 px, parce que le libellé long se replie sur deux lignes.
	 *
	 * ⚠️ POURQUOI LE REPLI DU LIBELLÉ EST INDISPENSABLE.
	 * « Adhérer et payer en ligne » demande 216 px sur une seule ligne à
	 * 15 px/600 — mesuré au navigateur. Il n'y a pas 216 px à donner. Les
	 * deux autres sorties étaient de rogner (`text-overflow`) ou de rapetisser
	 * la typographie sous 14 px : l'une ment sur l'engagement pris, l'autre
	 * devient illisible. Le repli sur deux lignes ne coûte que 4 px de hauteur
	 * de bouton et garde le libellé entier.
	 *
	 * `min-width: 0` est ce qui rend le repli possible : sans lui, un élément
	 * flexible refuse de descendre sous la largeur de son contenu, et la
	 * rangée déborderait au lieu de se replier. Il annule aussi le
	 * `min-width: clamp(130px, …)` du §3, qui à deux boutons ne tiendrait pas.
	 */
	.arc-tunnel .jet-form-builder__next-page-wrap,
	.arc-tunnel .field-type-submit-field,
	.arc-tunnel .jet-form-builder__submit-wrap {
		flex-direction: row;
		flex-wrap: nowrap;
		align-items: stretch;
		gap: 8px;
	}

	/*
	 * Le secondaire ne prend que ce qu'il lui faut ; le principal récupère
	 * tout le reste. C'est ce partage qui donne 182 px au libellé long à
	 * 375 px.
	 *
	 * ⚠️ `flex-shrink: 0` (le zéro du milieu) est obligatoire. « Précédent »
	 * est UN SEUL MOT : il ne peut pas se replier. Autorisé à rétrécir, il se
	 * fait rogner au lieu de se replier — constaté au navigateur à 320 px
	 * (iPhone SE), où il tombait à 83 px pour 99 px de contenu et perdait sa
	 * dernière lettre. Empêché de rétrécir, c'est le bouton principal qui
	 * absorbe le manque, et lui SAIT se replier.
	 */
	.arc-tunnel .jet-form-builder__prev-page {
		flex: 0 0 auto;
		width: auto;
		margin-right: 0;
	}

	.arc-tunnel .jet-form-builder__next-page,
	.arc-tunnel .jet-form-builder__submit {
		flex: 1 1 auto;
		width: auto;
	}

	.arc-tunnel .jet-form-builder__next-page,
	.arc-tunnel .jet-form-builder__prev-page,
	.arc-tunnel .jet-form-builder__submit {
		min-width: 0;
		min-height: 48px;
		padding-left: 10px;
		padding-right: 10px;
		white-space: normal;
		text-align: center;
		line-height: 1.15;
	}

	.arc-tunnel-cotisation__actions {
		flex-direction: column;
		align-items: stretch;
	}

	/*
	 * LA SAISIE DU NOMBRE DE LOTS SUR TÉLÉPHONE.
	 *
	 * ⚠️ Règle DÉFENSIVE, écrite sans avoir pu être vue : le redimensionnement
	 * de fenêtre ne fonctionne pas dans le navigateur de cet environnement
	 * (voir la note de livraison). Elle est donc construite pour ne pas pouvoir
	 * déborder plutôt que pour rendre exactement : largeur relative à
	 * l'encadré, hauteur et corps bornés par le bas ET par le haut, et aucune
	 * dimension exprimée en pixels fixes.
	 *
	 * Le corps reste très supérieur à celui des autres champs — c'est la
	 * demande — mais il cesse de suivre `vw` au-delà de 2 rem, sans quoi un
	 * nombre à cinq chiffres déborderait de sa boîte sur un écran de 320 px.
	 */
	.arc-tunnel .arc-tunnel-lots input[type="number"] {
		width: 100%;
		height: clamp(56px, 16vw, 76px);
		/* ⚠️ `!important` obligatoire ici AUSSI : une requête média n'ajoute
		   aucune spécificité, et la règle de base porte déjà la marque (elle
		   doit battre les neuf classes d'Elementor). Sans elle, c'est la valeur
		   de bureau qui continuerait de s'appliquer sur téléphone. */
		font-size: clamp(1.5rem, 7vw, 2rem) !important;
	}

	.arc-tunnel-accordeon__entete {
		padding: 14px;
		gap: 8px;
	}

	/*
	 * L'en-tête reste sur UNE ligne : coche, titre, pastille, chevron. C'est le
	 * titre qui se replie sur plusieurs lignes, pas la rangée — sans `min-width`
	 * un élément flexible refuse de descendre sous sa taille de contenu, et le
	 * bandeau déborderait. Faire passer les éléments à la ligne (`flex-wrap`)
	 * a été essayé : la coche se retrouve seule sur sa ligne, au-dessus du
	 * titre, ce qui est pire que tout.
	 */
	.arc-tunnel-accordeon__titre {
		min-width: 0;
	}

	.arc-tunnel--js .arc-tunnel-accordeon__corps,
	.arc-tunnel-accordeon__contenu {
		padding-left: 14px;
		padding-right: 14px;
	}
}

/* === 10. PRÉFÉRENCES UTILISATEUR ========================================= */

/*
 * Mouvement réduit : on garde le repli — c'est une fonctionnalité, pas une
 * décoration — mais on supprime l'animation qui y mène.
 */
@media (prefers-reduced-motion: reduce) {
	.arc-tunnel *,
	.arc-tunnel *::before,
	.arc-tunnel *::after {
		transition-duration: 0.01ms !important;
		animation-duration: 0.01ms !important;
		scroll-behavior: auto !important;
	}

	.arc-tunnel--js .arc-tunnel-accordeon__contenu {
		transition: none;
	}
}

/*
 * Contraste élevé : les fonds et les dégradés sont remplacés par le système.
 * On ne compte donc jamais sur la seule couleur pour dire l'état — d'où la
 * coche « ✓ » des blocs réglés et le texte « ✓ Adhésion choisie » des cartes,
 * conservés ici, doublés d'une bordure épaisse.
 */
@media (forced-colors: active) {
	.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte:checked),
	.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-paiement:checked),
	.arc-tunnel-carte--active,
	.arc-tunnel-paiement--actif,
	.arc-tunnel-accordeon--ouvert,
	.arc-tunnel-frise__etape--active {
		border: 3px solid;
	}

	.arc-tunnel-frise__liste::before {
		background: CanvasText;
	}
}

/* === 11. IMPRESSION ====================================================== */

/*
 * À l'impression, tout est déplié : un adhérent qui imprime le récapitulatif
 * doit voir les quatre blocs, pas trois en-têtes fermés. La frise, les boutons
 * de navigation et le bandeau d'aide ne servent qu'à l'écran.
 */
@media print {
	.arc-tunnel--js .arc-tunnel-accordeon__contenu {
		display: block;
		visibility: visible;
		grid-template-rows: none;
	}

	.arc-tunnel-accordeon__chevron,
	.arc-tunnel-frise,
	.arc-tunnel-aide,
	.jet-form-builder__next-page-wrap,
	.field-type-submit-field {
		display: none;
	}

	/* Toutes les étapes sur le papier, pas seulement celle affichée. */
	.arc-tunnel .jet-form-builder-page--hidden {
		display: block;
	}
}

/* =========================================================================
 *  CLASSES AJOUTÉES PAR CE FICHIER ET PAR tunnel.js
 *
 *  Le contrat PHP (ARC_Demandes_Tunnel::classes()) est respecté à la lettre.
 *  Les classes ci-dessous le complètent, avec le même préfixe, pour les états
 *  et les blocs que le contrat ne publie pas. Elles sont TOUTES facultatives
 *  dans le balisage : le JavaScript les pose lui-même, ou la page Elementor.
 *
 *  Posées par la page Elementor (exports/apply-tunnel-page.php) :
 *    arc-tunnel-bandeau ............ bandeau de titre (+ __titre).
 *    arc-tunnel-frise .............. frise des cinq étapes.
 *    arc-tunnel-frise__liste ....... la liste ordonnée.
 *    arc-tunnel-frise__etape ....... une vignette (+ --active).
 *    arc-tunnel-frise__rang ........ la pastille « ÉTAPE N ».
 *    arc-tunnel-frise__intitule .... l'intitulé de l'étape.
 *    arc-tunnel-frise__etat ........ « étape en cours », lecteurs d'écran.
 *    arc-tunnel-aide ............... bandeau « Besoin d'aide ? »
 *                                    (+ __contenu, __titre, __bouton).
 *
 *  Posées par tunnel.js :
 *    arc-tunnel--js ................ drapeau posé sur la racine par le JS.
 *    arc-tunnel-accordeons ......... conteneur d'un groupe de blocs (+ --complet).
 *    arc-tunnel-accordeon--valide .. la case « je valide » est cochée.
 *    arc-tunnel-accordeon--complet . tous les champs obligatoires sont remplis.
 *    arc-tunnel-accordeon__corps ... enveloppe d'animation, créée par le JS.
 *    arc-tunnel-accordeon__etat .... pastille « 2/5 » / « Validé », créée par le JS.
 *    arc-tunnel-accordeon__validation . étiquette de la case « je valide ».
 *    arc-tunnel-carte--focus ....... repli de `:has(:focus-visible)`.
 *    arc-tunnel-paiement--focus .... idem pour l'étape 5.
 *    arc-tunnel-cotisation--calcule . le montant a été calculé, saisie masquée.
 *    arc-tunnel-cotisation--erreur .. nombre de lots absent ou invalide.
 *
 *  Attendues dans le balisage du formulaire :
 *    arc-tunnel-bouton ............. bouton du tunnel (+ --secondaire, --verrouille).
 *    arc-tunnel-cotisation__calculer . bouton « Calculer le montant ».
 *    arc-tunnel-cotisation__actions .. les deux boutons révélés après le calcul.
 *    arc-tunnel-cotisation__erreur ... message d'erreur de saisie.
 *
 *  Variables ouvertes à la personnalisation :
 *    --arc-carte-image ............. image de la vignette d'une carte, si les
 *                                    photos de la maquette sont un jour
 *                                    versionnées. Vide par défaut.
 * ====================================================================== */

/* =========================================================================
 * DEVIS D'ADHÉSION — bouton déclencheur et contenu de la popup Elementor
 *
 * L'ordre compte : ce bloc suit celui du tunnel, exactement comme les deux
 * feuilles se suivaient dans la cascade quand elles étaient séparées.
 *
 * ┌────────────────────────────────────────────────────────────────────────┐
 * │ ⚠️ LA POPUP N'EST PLUS HABILLÉE ICI. NE PAS LA RÉINTRODUIRE.            │
 * │                                                                        │
 * │ Ce bloc contenait tout le décor d'une popup maison : `.arc-devis-modale`│
 * │ en `position: fixed`, son voile `__voile`, sa boîte `__boite`, sa croix │
 * │ `__fermer`, le `body.arc-devis-fige` qui bloquait le défilement, et une │
 * │ requête média pour le plein écran sur petit écran.                     │
 * │                                                                        │
 * │ Tout cela a disparu avec la popup maison. Le décor — largeur, voile,    │
 * │ croix, rembourrage, coins arrondis, animation d'entrée, blocage du      │
 * │ défilement, comportement sur petit écran — est désormais réglé dans le  │
 * │ document de popup d'Elementor, donc MODIFIABLE PAR LE CLIENT depuis     │
 * │ Elementor > Popups, sans toucher à une ligne de CSS. Les valeurs de     │
 * │ départ sont posées par `exports/apply-devis-popup.php`.                │
 * │                                                                        │
 * │ Ne subsiste ici que ce qu'Elementor ne saurait pas faire : le bouton    │
 * │ déclencheur, qui vit dans le formulaire du tunnel, et les deux lignes   │
 * │ de texte de l'en-tête de la popup, qui sont du HTML à nous.            │
 * └────────────────────────────────────────────────────────────────────────┘
 *
 * Les noms de classes du bouton viennent de `ARC_Demandes_Devis`
 * (constante `CSS_DECLENCHEUR`). Le préfixe `arc-devis-` isole ces styles de
 * ceux du thème, d'Elementor et du tunnel : aucune règle ne cible un sélecteur
 * d'élément nu.
 * ========================================================================= */

/* === BOUTON « OBTENIR UN DEVIS » === */

/*
 * Volontairement en second rôle, à côté de « Compléter mon adhésion » : le
 * devis capte le contact, il ne doit pas détourner celui qui était prêt à
 * adhérer. D'où le contour plutôt que l'aplat.
 *
 * ⚠️ CES RÈGLES NE S'APPLIQUENT PAS DANS LE TUNNEL, ET CE N'EST PAS UN BOGUE.
 * La section « TUNNEL D'ADHÉSION » plus haut dans cette feuille contient
 * `.arc-tunnel .arc-devis-declencheur`, plus spécifique, qui remet le bouton à
 * plat en simple lien souligné — « Obtenir un devis est un lien dans la
 * maquette, pas un bouton », dit son commentaire. C'est la maquette qui tranche,
 * et elle a raison : deux boutons pleins côte à côte se disputeraient l'œil.
 *
 * Ce qui suit est donc l'apparence PAR DÉFAUT, celle qu'a le bouton hors du
 * tunnel — sur une page où l'intégrateur a posé `[arc_devis_bouton]`, où rien
 * ne porte la classe `.arc-tunnel`. Ne pas les supprimer en les croyant mortes.
 */
.arc-devis-declencheur {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	padding: 12px 24px;
	border: 2px solid #009fe3;
	border-radius: 6px;
	background: transparent;
	color: #009fe3;
	font: inherit;
	font-weight: 600;
	line-height: 1.2;
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease;
}

.arc-devis-declencheur:hover,
.arc-devis-declencheur:focus-visible {
	background: #009fe3;
	color: #fff;
}

.arc-devis-declencheur:focus-visible {
	outline: 2px solid #1b2a4a;
	outline-offset: 2px;
}

/* === EN-TÊTE DE LA POPUP === */

/*
 * Ce bloc est un widget HTML posé dans la popup Elementor. Il porte aussi les
 * attributs `data-*` par lesquels `arc-devis.js` apprend le nom des champs à
 * recopier — d'où le fait qu'il ne soit pas remplaçable par deux widgets
 * « Titre » natifs sans y perdre ce câblage.
 */
.arc-devis-popup__titre {
	margin: 0 0 8px;
	color: #1b2a4a;
	font-size: 22px;
	line-height: 1.25;
}

.arc-devis-popup__chapeau {
	margin: 0 0 20px;
	color: #5b6577;
	font-size: 14px;
	line-height: 1.5;
}

/* === PRÉFÉRENCE D'ANIMATION RÉDUITE === */

@media (prefers-reduced-motion: reduce) {
	.arc-devis-declencheur {
		transition: none;
	}
}

/* === ONGLET MA COPRO — formulaire d'ajout d'un membre replié au-dessus du tableau ===
   Le bouton « + Ajouter un membre » pointe sur #arc-ajouter-membre : c'est l'ancre
   elle-même qui déplie le bloc (:target), aucun JS. Le bouton « Annuler » renvoie sur
   #arc-membre-actions, ce qui le referme. */
#arc-ajouter-membre {
	display: none;
	scroll-margin-top: 120px;
}
#arc-ajouter-membre:target {
	display: flex;
}
/* JetFormBuilder est en mode « rechargement de page » : au retour, l'ancre est perdue.
   Sans cette règle, le message (email déjà utilisé, limite atteinte, succès) resterait
   masqué avec le formulaire. Règle séparée : :has() non supporté ne doit pas invalider
   le sélecteur :target ci-dessus. */
#arc-ajouter-membre:has(.jet-form-builder-message) {
	display: flex;
}

/* --- « Inscrire » et « Annuler » sur une même ligne -------------------------
   Le bouton d'envoi est rendu DANS le widget JetFormBuilder, « Annuler » est un
   widget Elementor voisin : aucun réglage natif ne peut les réunir. La carte est
   passée en ligne + retour à la ligne (réglages du conteneur) ; `display:contents`
   efface ici les boîtes intermédiaires — enveloppe du widget, conteneur de widget
   et <form> —
   pour que les rangées du formulaire deviennent des enfants directs de la carte.
   Toutes prennent la largeur entière SAUF celle du bouton d'envoi, laissée à sa
   largeur naturelle : « Annuler » vient donc s'y ranger. Aucune largeur codée en
   dur, la mise en page suit le libellé des boutons. */
#arc-ajouter-membre > .elementor-widget-jet-form-builder-form,
#arc-ajouter-membre > .elementor-widget-jet-form-builder-form > .elementor-widget-container,
#arc-ajouter-membre .jet-form-builder {
	display: contents;
}
#arc-ajouter-membre > .elementor-widget-heading,
#arc-ajouter-membre .jet-form-builder-row,
#arc-ajouter-membre .jet-form-builder-message {
	flex: 0 0 100%;
}
#arc-ajouter-membre .jet-form-builder-row.field-type-submit-field {
	flex: 0 0 auto;
	margin-bottom: 0;
	padding-top: 0;
	padding-bottom: 0;
}

/* === MA COPRO — Voile d'attente pendant l'ajout d'un membre ===
   L'ajout prend plusieurs secondes (vérification CRM + compte + e-mail).
   JetFormBuilder pose `.is-loading` sur le <form> UNIQUEMENT une fois la
   validation passée et l'envoi parti, et la retire si l'envoi échoue : le
   voile suit donc l'état réel de l'envoi, sans une ligne de JS.
   Le <form> est en `display: contents` (aucune boîte) : le voile est posé
   sur le conteneur, via :has(). ::after = voile + texte, ::before = roue.
   Le ::before de conteneur Elementor (calque de fond) n'est pas utilisé ici. */
#arc-ajouter-membre:has(.jet-form-builder.is-loading) {
	position: relative;
}
/* JetFormBuilder grise le formulaire (opacity .5) : le voile s'en charge. */
#arc-ajouter-membre .jet-form-builder.is-loading {
	opacity: 1;
}
#arc-ajouter-membre:has(.jet-form-builder.is-loading)::after {
	content: "Veuillez patienter et rester sur cette fenêtre\AL'ajout du membre peut prendre quelques instants.";
	white-space: pre-line;
	position: absolute;
	inset: 0;
	z-index: 20;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 72px 24px 0;
	background: rgba(255, 255, 255, 0.88);
	border-radius: inherit;
	color: #1b2a4a;
	font-size: 16px;
	font-weight: 600;
	line-height: 1.6;
	text-align: center;
	cursor: progress;
}
#arc-ajouter-membre:has(.jet-form-builder.is-loading)::before {
	content: "";
	position: absolute;
	top: 50%;
	left: 50%;
	z-index: 21;
	width: 40px;
	height: 40px;
	margin: -52px 0 0 -20px;
	border: 4px solid #d9e2ec;
	border-top-color: #1b2a4a;
	border-radius: 50%;
	background: none;
	opacity: 1;
	animation: arc-membre-attente 0.9s linear infinite;
}
@keyframes arc-membre-attente {
	to {
		transform: rotate(360deg);
	}
}
@media (prefers-reduced-motion: reduce) {
	#arc-ajouter-membre:has(.jet-form-builder.is-loading)::before {
		animation-duration: 2.5s;
	}
}

/* === ESPACE MEMBRE — Accès bloqué ===
   Écran affiché à la place du contenu du compte quand la copropriété est
   impayée ou n'est plus adhérente (mu-plugin : arc_acces_bloque_ecran()).
   La classe `arc-acces-bloque` est aussi posée sur <body>, ce qui permet de
   retoucher la page autour du bloc sans toucher au PHP.
   Aucune ligne de JS : le minificateur de la préprod casse le JS inline. */
.arc-acces-bloque {
	background: #f5f8fb;
	border: 1px solid #e4ebf2;
	border-radius: 12px;
	padding: 28px 32px;
	max-width: 720px;
	color: #1b2a4a;
	font-family: system-ui, -apple-system, Arial, sans-serif;
}
.arc-acces-bloque__titre {
	margin: 0 0 12px;
	font-size: 22px;
	line-height: 1.3;
	font-weight: 700;
	color: #1b2a4a;
}
.arc-acces-bloque__texte {
	margin: 0 0 24px;
	font-size: 15px;
	line-height: 1.6;
	color: #1b2a4a;
}
/* Voie de règlement, affichée UNIQUEMENT sur une copropriété impayée : on
   ferme l'espace à quelqu'un dont on attend un paiement, le chemin vers la
   facture doit donc primer visuellement sur le bloc de contact. */
.arc-acces-bloque__action {
	margin: 0 0 24px;
}
.arc-acces-bloque__bouton {
	display: inline-block;
	padding: 12px 22px;
	background: #009fe3;
	border: 1px solid #009fe3;
	border-radius: 8px;
	color: #fff;
	font-size: 15px;
	font-weight: 700;
	line-height: 1.3;
	text-decoration: none;
}
.arc-acces-bloque__bouton:hover,
.arc-acces-bloque__bouton:focus {
	background: #0b86bd;
	border-color: #0b86bd;
	color: #fff;
	text-decoration: none;
}
/* Le focus visible ne suit pas la couleur du bouton : sur fond bleu, un
   contour bleu ne se voit pas. */
.arc-acces-bloque__bouton:focus-visible {
	outline: 3px solid #1b2a4a;
	outline-offset: 2px;
}

.arc-acces-bloque__contact {
	background: #fff;
	border: 1px solid #e4ebf2;
	border-left: 4px solid #009fe3;
	border-radius: 8px;
	padding: 18px 20px;
}
.arc-acces-bloque__contact-titre {
	margin: 0 0 12px;
	font-size: 13px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .04em;
	color: #8a93a3;
}
.arc-acces-bloque__liste {
	margin: 0;
	padding: 0;
	list-style: none;
}
.arc-acces-bloque__liste li {
	margin: 0 0 8px;
	font-size: 15px;
	line-height: 1.5;
	color: #1b2a4a;
}
.arc-acces-bloque__liste li:last-child {
	margin-bottom: 0;
}
/* Libellé à largeur fixe : les quatre valeurs s'alignent sans tableau. */
.arc-acces-bloque__cle {
	display: inline-block;
	min-width: 92px;
	font-size: 12px;
	font-weight: 600;
	color: #8a93a3;
	vertical-align: baseline;
}
.arc-acces-bloque__liste a {
	color: #1077b3;
	text-decoration: none;
	font-weight: 600;
}
.arc-acces-bloque__liste a:hover {
	text-decoration: underline;
}
.arc-acces-bloque__pied {
	margin: 22px 0 0;
	font-size: 14px;
}
.arc-acces-bloque__pied a {
	color: #1077b3;
	text-decoration: underline;
}

/* Les media queries n'ajoutent aucune spécificité : on répète le sélecteur
   complet, sinon la règle de base l'emporterait par ordre d'apparition. */
@media (max-width: 767px) {
	.arc-acces-bloque {
		padding: 20px 18px;
		border-radius: 8px;
	}
	.arc-acces-bloque__titre {
		font-size: 19px;
	}
	/* Sur mobile la clé passe au-dessus de la valeur : 92px de gouttière
	   laisseraient un numéro de téléphone tout seul sur sa ligne. */
	.arc-acces-bloque__cle {
		display: block;
		min-width: 0;
	}
	/* Le bouton de règlement prend toute la largeur : c'est l'action attendue
	   de la page, elle ne doit pas être une cible de 200 px au pouce. */
	.arc-acces-bloque__bouton {
		display: block;
		text-align: center;
	}
}

/* =========================================================================
 *  13. FIN DE PARCOURS — VARIANTE DE RÈGLEMENT (page de remerciement)
 * =========================================================================
 *
 * Les trois variantes vivent dans le contenu de la page de remerciement de
 * l'adhésion ; c'est la classe posée sur `<body>` par `functions.php`
 * (`arc-merci-mode-{code}`) qui décide de celle qu'on montre.
 *
 * ⚠️ L'ÉTAT PAR DÉFAUT EST « RIEN ». Sans paramètre `mode_paiement` dans
 * l'URL — accès direct, lien partagé, page en cache — aucune classe de mode
 * n'est posée et les trois blocs restent masqués : LA PAGE EST ALORS VIDE.
 * Il n'y a PLUS de tronc commun de repli depuis le lot F
 * (`exports/fix-F-confirmation.php`) : c'est un comportement accepté par
 * l'ARC (Q-F2 / R-8), pas une variante manquante.
 *
 * ⚠️ CES SÉLECTEURS SONT BORNÉS À LA PAGE DE REMERCIEMENT. La feuille est
 * chargée sur TOUT le site (voir le pavé de `body.arc-page-tunnel`) : un
 * `.arc-merci-reglement` nu masquerait le bloc partout où il apparaîtrait.
 */

body.arc-merci-adhesion .arc-merci-reglement {
	display: none;
}

body.arc-merci-adhesion.arc-merci-mode-cb_virement .arc-merci-reglement--cb,
body.arc-merci-adhesion.arc-merci-mode-cheque .arc-merci-reglement--cheque,
body.arc-merci-adhesion.arc-merci-mode-syndic .arc-merci-reglement--syndic {
	display: block;
}

/*
 * Le bloc est autonome en couleurs : la page de remerciement n'est pas le
 * tunnel, les jetons `--arc-*` n'y sont pas posés.
 */
body.arc-merci-adhesion .arc-merci-reglement {
	margin: 0 0 26px;
	padding: 20px 22px;
	border: 1px solid #e4ebf2;
	border-left: 5px solid #b5b5b5;
	border-radius: 8px;
	background: #f5f8fb;
	font-family: Roboto, "Open Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
	font-size: 16px;
	line-height: 1.55;
	color: #1d1d1d;
}

body.arc-merci-adhesion .arc-merci-reglement p {
	margin: 0 0 10px;
}

body.arc-merci-adhesion .arc-merci-reglement p:last-child {
	margin-bottom: 0;
}

body.arc-merci-adhesion .arc-merci-reglement__titre {
	font-weight: 700;
	font-size: 18px;
}

/* Paiement abouti : vert, parce qu'il n'y a plus rien à faire. */
body.arc-merci-adhesion .arc-merci-reglement--cb {
	border-color: #b7e3c8;
	border-left-color: #2e9e5b;
	background: #eaf7f0;
}

body.arc-merci-adhesion .arc-merci-reglement--cb .arc-merci-reglement__titre {
	color: #1e7a45;
}

/*
 * Règlement encore attendu : ambre. Pas de rouge — rien n'a échoué, il reste
 * simplement une étape, et l'alerte ferait croire à un problème.
 */
body.arc-merci-adhesion .arc-merci-reglement--cheque,
body.arc-merci-adhesion .arc-merci-reglement--syndic {
	border-color: #f0dca8;
	border-left-color: #d79b1e;
	background: #fdf7e8;
}

body.arc-merci-adhesion .arc-merci-reglement--cheque .arc-merci-reglement__titre,
body.arc-merci-adhesion .arc-merci-reglement--syndic .arc-merci-reglement__titre {
	color: #8a6100;
}

/* Les media queries n'ajoutent aucune spécificité : on répète le sélecteur
   complet, sinon la règle de base l'emporterait par ordre d'apparition. */
@media (max-width: 767px) {
	body.arc-merci-adhesion .arc-merci-reglement {
		padding: 16px 16px;
		font-size: 15px;
	}
	body.arc-merci-adhesion .arc-merci-reglement__titre {
		font-size: 17px;
	}
}

/* =========================================================================
 *  14. TUNNEL — BANDEAU DE PAIEMENT NON ABOUTI
 * =========================================================================
 *
 * Injecté en tête du contenu par `functions.php` UNIQUEMENT quand le
 * paramètre `paiement_interrompu` est présent : il n'y a donc rien à masquer
 * par défaut, et le CSS ne fait ici que l'habillage.
 *
 * Ambre, comme la variante « règlement attendu » de la page de remerciement :
 * ce n'est pas une erreur de l'adhérent, et le rouge lui ferait croire que sa
 * demande est perdue — précisément ce que le texte dément.
 */

.arc-tunnel-interrompu {
	max-width: 900px;
	margin: clamp(16px, 2vw, 28px) auto 0;
	padding: 20px 22px;
	border: 1px solid #f0dca8;
	border-left: 5px solid #d79b1e;
	border-radius: var(--arc-rayon-doux, 8px);
	background: #fdf7e8;
	font-family: var(--arc-ui);
	font-size: var(--arc-t-corps, 16px);
	line-height: 1.55;
	color: var(--arc-texte, #1d1d1d);
	/* Le bandeau est la cible de l'ancre `#arc-paiement-interrompu` : on lui
	   laisse de quoi ne pas se coller sous l'en-tête fixe à l'arrivée. */
	scroll-margin-top: 120px;
}

.arc-tunnel-interrompu__titre {
	margin: 0 0 10px;
	font-weight: 700;
	font-size: 18px;
	color: #8a6100;
}

.arc-tunnel-interrompu__texte {
	margin: 0 0 10px;
}

.arc-tunnel-interrompu__texte:last-child {
	margin-bottom: 0;
}

@media (max-width: 767px) {
	.arc-tunnel-interrompu {
		margin-left: 16px;
		margin-right: 16px;
		padding: 16px 16px;
	}
	.arc-tunnel-interrompu__titre {
		font-size: 17px;
	}
}

/* === 12. TUNNEL D'ADHÉSION — LES IMAGES DE FOND =========================== */

/*
 * Les photos de la maquette, enfin posées. Trois emplacements :
 *
 *   1. la vignette des huit cartes de contrat (§5)   → la signature au stylo
 *   2. les cinq vignettes de la frise (§2)           → une photo par étape
 *   3. le bandeau « Besoin d'aide ? » (§1)           → la conseillère
 *
 * POURQUOI DES URL RELATIVES, ET PAS LA MÉDIATHÈQUE.
 * `url(assets/img/…)` se résout par rapport à CETTE feuille, donc par rapport
 * au thème enfant. Le même fichier fonctionne en local, en préprod et en
 * production, sans identifiant d'attachement ni ligne de PHP. Une URL de
 * médiathèque, elle, embarque le domaine, l'année et le mois d'upload : elle
 * casserait au premier déploiement.
 *
 * POURQUOI UN DÉGRADÉ « PLAT » PAR-DESSUS, ET PAS `opacity`.
 * `opacity` s'appliquerait à la carte entière (texte compris). On empile donc
 * deux couches de `background-image` : un dégradé d'une seule couleur, qui
 * n'est qu'un aplat translucide, POSÉ SUR la photo. Le texte, lui, n'est
 * jamais dans la même boîte que la photo — ni sur les cartes (l'image est un
 * `::before` séparé de l'intitulé) ni sur la frise (le voile y monte à 90 %).
 *
 * AUCUN JAVASCRIPT ICI, et aucun identifiant en dur : les cartes se visent par
 * la valeur de leur option (`[value="…"]`), les étapes par `data-arc-frise`.
 */

/* --- 12.1 Les huit cartes de contrat -------------------------------------- */

/*
 * ⚠️ LE SÉLECTEUR EST VOLONTAIREMENT LONG.
 * La rotation de teintes du §5 s'écrit
 * `.arc-tunnel .jet-form-builder__field-wrap:has(…):nth-child(…) .jet-form-builder__field-label::before`,
 * soit (0,5,1). Le maillon `.jet-form-builder` ajouté ici porte la règle à
 * (0,6,1) : sans lui, la couleur de repli du §5 repasserait devant la teinte
 * choisie par valeur d'option, et deux cartes sur trois changeraient de
 * couleur. Vérifié au navigateur.
 */
.arc-tunnel .jet-form-builder .jet-form-builder__field-wrap:has(.arc-tunnel-carte) .jet-form-builder__field-label::before {
	/* Couleur de repli si la photo ne charge pas : la teinte pleine, comme
	   avant. La grille garde alors son rythme de couleurs. */
	background-color: rgb(var(--arc-voile-rvb));
	background-image:
		linear-gradient(
			rgba(var(--arc-voile-rvb), var(--arc-voile-alpha)),
			rgba(var(--arc-voile-rvb), var(--arc-voile-alpha))
		),
		url("assets/img/tunnel-signature.jpg");
	background-repeat: no-repeat, no-repeat;
	background-size: cover, cover;
	background-position: center, center;
}

/*
 * L'opacité du voile est une seule variable : elle se règle d'un endroit pour
 * les huit cartes. 0.66 laisse lire la plume et le mot « Signature » tout en
 * gardant la teinte franche — c'est le rapport de la capture de référence.
 */
.arc-tunnel .jet-form-builder .jet-form-builder__field-wrap:has(.arc-tunnel-carte) {
	--arc-voile-alpha: 0.66;
}

/*
 * Les huit teintes, RELEVÉES À LA PIPETTE sur la capture de référence, dans
 * l'ordre exact des options du formulaire.
 *
 * La maquette n'utilise que quatre familles (pêche, bleu, sable, vert),
 * reprises en seconde ligne. Pour que les huit cartes restent distinguables
 * l'une de l'autre — et pas seulement quatre paires de jumelles — la seconde
 * ligne reçoit une variante décalée de la même famille : sable → doré,
 * vert → menthe, pêche → corail, bleu → ciel. L'ordre et la lecture générale
 * de la capture sont conservés ; seules les huit valeurs finales diffèrent.
 *
 * La valeur est écrite en composantes R, G, B (sans `rgb()`) parce qu'elle
 * sert deux fois : opaque pour le repli, translucide pour le voile.
 */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte[value="conseil_syndical"])  { --arc-voile-rvb: 247, 194, 179; } /* #f7c2b3 pêche   */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte[value="asl"])                { --arc-voile-rvb: 123, 202, 234; } /* #7bcaea bleu    */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte[value="syndic_benevole"])    { --arc-voile-rvb: 248, 222, 163; } /* #f8dea3 sable   */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte[value="syndic_cooperatif"])  { --arc-voile-rvb: 181, 248, 187; } /* #b5f8bb vert    */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte[value="individuel"])         { --arc-voile-rvb: 242, 211, 140; } /* #f2d38c doré    */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte[value="bailleur"])           { --arc-voile-rvb: 162, 232, 196; } /* #a2e8c4 menthe  */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte[value="collectivite"])       { --arc-voile-rvb: 244, 174, 158; } /* #f4ae9e corail  */
.arc-tunnel .jet-form-builder__field-wrap:has(.arc-tunnel-carte[value="groupe"])             { --arc-voile-rvb: 159, 217, 244; } /* #9fd9f4 ciel    */

/* --- 12.2 Les cinq vignettes de la frise ---------------------------------- */

/*
 * Une photo par étape, désignée par `data-arc-frise` — l'attribut que pose
 * déjà le balisage de la frise et que lit `arc-tunnel.js`. Aucun index de
 * position : si l'ordre du balisage changeait, les photos suivraient.
 */
.arc-tunnel-frise__etape[data-arc-frise="1"] { --arc-frise-image: url("assets/img/tunnel-signature.jpg"); }
.arc-tunnel-frise__etape[data-arc-frise="2"] { --arc-frise-image: url("assets/img/tunnel-etape-2-calculatrice.jpg"); }
.arc-tunnel-frise__etape[data-arc-frise="3"] { --arc-frise-image: url("assets/img/tunnel-etape-3-cubes-coches.jpg"); }
.arc-tunnel-frise__etape[data-arc-frise="4"] { --arc-frise-image: url("assets/img/tunnel-etape-4-balance.jpg"); }
.arc-tunnel-frise__etape[data-arc-frise="5"] { --arc-frise-image: url("assets/img/tunnel-etape-5-carte-bancaire.jpg"); }

/*
 * Étape non atteinte. Le dégradé clair du §2 est repris À L'IDENTIQUE, mais
 * en couleurs translucides : la photo passe dessous, très atténuée. Le texte
 * est du #1d1d1d sur un voile à 90-93 % de blanc cassé — le contraste reste
 * celui d'avant, aux quelques pour cent près.
 *
 * `--arc-frise-image` a une valeur de repli `none` : hors de la frise du
 * tunnel, ou si un jour une étape n'avait pas de photo, la règle reste valide
 * et on retombe sur le seul dégradé.
 */
.arc-tunnel-frise__etape {
	background-color: var(--arc-carte);
	background-image:
		linear-gradient(
			150deg,
			rgba(251, 252, 254, 0.93) 0%,
			rgba(245, 248, 251, 0.90) 55%,
			rgba(233, 239, 245, 0.93) 100%
		),
		var(--arc-frise-image, none);
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
}

/*
 * Étape courante. ON SE BRANCHE SUR LE MÉCANISME EXISTANT : c'est toujours la
 * classe `--active`, posée par `arc-tunnel.js` en même temps que
 * `aria-current="step"`. Rien de nouveau à tenir à jour.
 *
 * Le bleu monte à 88-94 % au lieu des 82-100 % opaques du §2 : la photo reste
 * devinable, et le blanc du texte gagne même un peu de contraste, le bas du
 * dégradé virant vers `--arc-bleu-fonce` plutôt que de rester sur le cyan vif.
 */
.arc-tunnel-frise__etape--active {
	background-color: var(--arc-bleu);
	background-image:
		linear-gradient(
			180deg,
			rgba(0, 159, 227, 0.88) 0%,
			rgba(0, 128, 180, 0.94) 100%
		),
		var(--arc-frise-image, none);
}

/* --- 12.3 Le bandeau « Besoin d'aide ? » ---------------------------------- */

/*
 * La photo est panoramique (1600 × 471) et la conseillère occupe sa MOITIÉ
 * DROITE — exactement la lecture que le dégradé du §1 imitait faute d'image.
 * On garde donc ce dégradé, en translucide, et on cale la photo à droite : le
 * texte blanc reste sur la partie dense du voile, le visage sur la partie
 * claire.
 */
.arc-tunnel-aide {
	background-color: var(--arc-bleu);
	background-image:
		linear-gradient(
			100deg,
			rgba(0, 112, 149, 0.96) 0%,
			rgba(0, 159, 227, 0.86) 45%,
			rgba(96, 205, 252, 0.72) 100%
		),
		url("assets/img/tunnel-aide-conseillere.jpg");
	background-repeat: no-repeat;
	background-size: cover;
	/*
	 * Cadrage vertical à 22 %, et pas au centre. Le bandeau est bien plus plat
	 * que la photo (≈ 8/1 contre 3,4/1) : `cover` en recadre donc les deux
	 * tiers. Centré, il ne restait que le menton et le micro du casque. À 22 %
	 * le visage entier tient dans la bande.
	 */
	background-position: right 22%;
}

/* --- 12.4 Ruptures ------------------------------------------------------- */

/*
 * ⚠️ LES SÉLECTEURS SONT RÉÉCRITS EN ENTIER.
 * Une media query n'ajoute AUCUNE spécificité. Écrite plus court, la règle
 * ci-dessous perdrait face à celle du §12.3 et le bandeau garderait son
 * cadrage de bureau sur un téléphone. Même piège qu'aux §9.1 et §9.2.
 */
@media (max-width: 782px) {
	/*
	 * Sur un écran étroit, `cover` recadre si fort que le visage occuperait
	 * toute la largeur : le texte se retrouverait posé dessus. On bascule sur
	 * la moitié gauche, floue, et on ferme le voile — la photo n'est plus là
	 * que comme matière.
	 */
	.arc-tunnel-aide {
		background-position: center left;
		background-image:
			linear-gradient(
				160deg,
				rgba(0, 112, 149, 0.96) 0%,
				rgba(0, 159, 227, 0.92) 100%
			),
			url("assets/img/tunnel-aide-conseillere.jpg");
	}

	/*
	 * La frise devient une bande de vignettes 16/9 (§9.2). Les photos, cadrées
	 * pour un carré, y seraient rognées haut et bas sur leur sujet ; on les
	 * remonte légèrement pour garder l'objet central dans le cadre.
	 */
	.arc-tunnel-frise__etape {
		background-position: center 40%;
	}
}


/* === 13. ÉTAPE 1 — TYPO DES TITRES DE CARTES (fix A5 + A11) =============== */

/*
 * 24 px FIXES sur tous les écrans, et la serif de la charte.
 *
 * CE QUI S'APPLIQUAIT AVANT. Le §5 pose sur la carte
 * `font-size: var(--arc-t-carte)`, soit `clamp(1rem, 1.5vw, 1.625rem)` :
 * 16 px sur un téléphone, 21,6 px à 1440 px, 26 px à partir de 1728 px.
 * Jamais 24. Et aucune règle ne posait de `font-family` : la carte héritait
 * de `.arc-tunnel`, donc de `--arc-ui` (Roboto). Mesuré au navigateur sur la
 * préprod : les titres rendaient bien en Roboto 26 px.
 *
 * LORA EST BIEN CHARGÉE. Le kit Elementor 14097 l'utilise en typographie
 * « Secondary » et sur `h2`, donc Elementor enfile `elementor-gf-lora-css`
 * sur /adhesion/, avec les quatre vraies graisses (400, 500, 600, 700) :
 * le `font-weight: 600` du §5 a une vraie fonte, pas un gras synthétique.
 * Nuance : les faces 500 et 600 ne sont téléchargées qu'à leur première
 * utilisation ; avec `display=swap`, les cartes s'affichent une fraction de
 * seconde en Georgia au tout premier chargement, puis basculent.
 *
 * AUCUNE REQUÊTE MEDIA N'EST NÉCESSAIRE, et c'est tout l'objet du fix : la
 * valeur est un `24px` sec, pas un `clamp()`. Aucune des ruptures du §9
 * (1024 / 782 / 640 px) ne touche à la typographie des cartes — elles ne
 * règlent que la grille et le ratio de la vignette. Rien à neutraliser en
 * mobile, la valeur y est donc la même qu'en bureau, comme demandé.
 *
 * PAS DE `!important`. Le sélecteur est repris au caractère près de celui du
 * §5 (même spécificité, 0-3-0) et cette règle vient plus loin dans le
 * fichier : elle gagne par ordre d'apparition. Vérifié au navigateur.
 * Réserve : le contrôle « Checkbox & Radio Fields > Typography » du widget
 * JetForm sort APRÈS le thème enfant. Il est vide aujourd'hui ; s'il était
 * renseigné un jour, il écraserait ce bloc — c'est le seul cas où un
 * `!important` deviendrait justifié.
 *
 * EFFET MESURÉ. Bureau 2048 px : la carte RÉTRÉCIT (393 → 386 px), 24 < 26.
 * La taille ne grandit que dans la plage ~1024-1600 px (21,6 → 24 px).
 * Mobile 375 px : la pile des 8 cartes passe de 1664 à 1771 px (+6,4 %), un
 * seul libellé gagne une ligne, aucun débordement.
 *
 * Le bandeau « Démarrer » n'est pas affecté (son `::after` a son propre
 * `--arc-t-bouton`), ni le grand titre « Choisissez votre contrat »
 * (`--arc-t-titre`, déjà en Lora).
 */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte),
.arc-tunnel-carte:not(input) {
	font-family: var(--arc-titre);
	font-size: 24px;
}


/* === 14. ÉTAPE 2 — MONTANT ENCADRÉ ET DATE DE PRISE D'EFFET (lot B) ======= */

/*
 * Trois choses ici, et elles se tiennent :
 * le montant prend le cadre bleu du champ de saisie (B5), la phrase
 * explicative et les deux champs de date prennent un panneau gris (B4/B5),
 * et le tout n'apparaît qu'une fois le montant calculé.
 */

/* --- 14.1 Le montant, dans le cadre du champ de saisie -------------------- */

/*
 * L'ARC voulait « le même encadré que celui du input du calcul ». C'est bien
 * celui de l'INPUT — bordure 2 px bleue, coins arrondis — et non la boîte gris
 * pâle qui l'entoure : reprendre celle-là aurait donné deux rectangles gris
 * empilés. Les valeurs sont copiées du §7.2 pour que les deux boîtes se
 * répondent exactement, du cadre à la graisse du chiffre.
 */
.arc-tunnel .arc-tunnel-cotisation__montant {
	display: flex;
	align-items: center;
	justify-content: center;
	width: min(280px, 100%);
	max-width: 100%;
	min-height: clamp(64px, 7vw, 104px);
	box-sizing: border-box;
	margin: 0 auto;
	padding: 0 clamp(8px, 1vw, 16px);
	border: 2px solid var(--arc-bleu);
	border-radius: var(--arc-rayon-doux);
}

/*
 * « /an » EST POSÉ EN CSS, PAS DANS LE TEXTE.
 *
 * Le script écrit le montant par `textContent` : toute mention ajoutée dans le
 * balisage serait effacée au premier calcul. Un `::after` survit, lui, à
 * chaque réécriture.
 *
 * Il disparaît en revanche quand le barème ne sait pas répondre : « Tarif sur
 * demande — nous consulter /an » n'aurait aucun sens.
 */
.arc-tunnel .arc-tunnel-cotisation:not(.arc-tunnel-cotisation--indefinie) .arc-tunnel-cotisation__montant::after {
	content: " /an";
	margin-left: 0.25em;
	font-size: 0.45em;
	font-weight: 600;
}

/* --- 14.2 L'icône « reprendre la saisie » --------------------------------- */

/*
 * Le bouton « Modifier le nombre de lots » est devenu une icône (B6). Son
 * libellé n'a pas disparu : il est dans `title` — l'infobulle native du
 * navigateur — et dans `aria-label`, pour les lecteurs d'écran.
 */
.arc-tunnel .arc-tunnel-cotisation__modifier {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* 44 px : la cible tactile minimale. Une icône seule est vite trop petite
	   pour un doigt, et c'est le seul moyen de revenir en arrière. */
	width: 44px;
	height: 44px;
	padding: 0;
	border: 1px solid var(--arc-bordure);
	border-radius: 50%;
	background: #fff;
	color: var(--arc-gris);
	font-size: 16px;
	line-height: 1;
	cursor: pointer;
	transition: color var(--arc-transition), border-color var(--arc-transition);
}

.arc-tunnel .arc-tunnel-cotisation__modifier:hover,
.arc-tunnel .arc-tunnel-cotisation__modifier:focus-visible {
	border-color: var(--arc-bleu);
	color: var(--arc-bleu-fonce);
}

/*
 * La flèche de retour en arrière, en `mask-image` : le dessin ne dépend
 * d'aucune police d'icônes. Font Awesome n'est présent sur cette page que
 * parce qu'un widget d'icônes sociales traîne dans le pied de page global —
 * en local il n'est pas chargé du tout, et le bouton rendait un rond vide.
 * `currentColor` fait suivre la couleur au survol sans rien redéclarer.
 */
.arc-tunnel .arc-icone-reinitialiser {
	display: block;
	width: 18px;
	height: 18px;
	background-color: currentColor;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M212.333 224.333H12c-6.627 0-12-5.373-12-12V12C0 5.373 5.373 0 12 0h48c6.627 0 12 5.373 12 12v78.112C117.773 39.279 184.26 7.47 258.175 8.007c136.906.994 246.448 111.437 246.157 248.351C504.041 393.199 393.199 504 256.333 504c-64.089 0-122.496-24.313-166.51-64.215-5.099-4.622-5.334-12.554-.467-17.42l33.967-33.967c4.474-4.474 11.662-4.717 16.401-.525C170.76 415.336 211.58 432 256.333 432c97.268 0 176-78.716 176-176 0-97.267-78.716-176-176-176-58.496 0-110.28 28.476-142.274 72.333h98.274c6.627 0 12 5.373 12 12v48c0 6.627-5.373 12-12 12z'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M212.333 224.333H12c-6.627 0-12-5.373-12-12V12C0 5.373 5.373 0 12 0h48c6.627 0 12 5.373 12 12v78.112C117.773 39.279 184.26 7.47 258.175 8.007c136.906.994 246.448 111.437 246.157 248.351C504.041 393.199 393.199 504 256.333 504c-64.089 0-122.496-24.313-166.51-64.215-5.099-4.622-5.334-12.554-.467-17.42l33.967-33.967c4.474-4.474 11.662-4.717 16.401-.525C170.76 415.336 211.58 432 256.333 432c97.268 0 176-78.716 176-176 0-97.267-78.716-176-176-176-58.496 0-110.28 28.476-142.274 72.333h98.274c6.627 0 12 5.373 12 12v48c0 6.627-5.373 12-12 12z'/%3E%3C/svg%3E");
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
}

/* --- 14.3 Le panneau gris : mention, champs de date, période -------------- */

/*
 * Le conditionnel `arc-tunnel-effet` sert de panneau. Il hérite de la grille à
 * deux colonnes posée sur tous les blocs conditionnels du tunnel : la mention
 * et la période s'étendent sur toute la largeur (les heading-field sont en
 * `grid-column: 1 / -1`), les deux listes déroulantes se rangent côte à côte.
 */
.arc-tunnel .arc-tunnel-effet {
	margin: clamp(14px, 1.6vw, 26px) auto 0;
	padding: clamp(14px, 1.6vw, 26px);
	border: 1px solid var(--arc-bordure);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-carte);
	text-align: left;
}

/*
 * Le panneau ne se lit qu'APRÈS le calcul, comme le montant : afficher un
 * choix de date avant que l'adhérent sache ce qu'il paie mettrait la charrue
 * devant les bœufs.
 *
 * `!important` sur le masquage seulement : c'est un bloc conditionnel, donc
 * porteur d'un `style="display: block"` en ligne posé par JetFormBuilder. Le
 * réaffichage, lui, n'en a pas besoin — même raisonnement qu'au §6.1 pour la
 * zone de saisie.
 */
.arc-tunnel--js .arc-tunnel-effet {
	display: none !important;
}

.arc-tunnel--js .arc-tunnel-cotisation--calcule .arc-tunnel-effet:not([style*="none"]) {
	display: grid !important;
}

.arc-tunnel .arc-tunnel-effet__mention {
	margin: 0;
	color: var(--arc-texte-doux);
	font-size: var(--arc-t-petit);
	line-height: 1.45;
}

.arc-tunnel .arc-tunnel-effet__periode {
	margin: 0;
	color: var(--arc-bleu-fonce);
	font-weight: 600;
}

/* Vide tant que le script n'a rien calculé : sans cela, le panneau réserverait
   une ligne blanche sous les listes déroulantes. */
.arc-tunnel .arc-tunnel-effet__periode:empty {
	display: none;
}

/* Un mois antérieur au plancher reste lisible mais visiblement hors jeu. */
.arc-tunnel .arc-effet option:disabled {
	color: var(--arc-gris);
}

/* --- 14.4 Le CTA principal de l'étape ------------------------------------- */

/*
 * La barre du haut ne porte plus que « Précédent / Suivant » ; l'action de
 * l'étape est ici, sous le panneau (B7 et B10). Il suit le même sort que le
 * montant : rien à valider tant que rien n'est calculé.
 */
.arc-tunnel .arc-tunnel-cotisation__suite {
	display: flex;
	justify-content: center;
	margin: clamp(14px, 1.6vw, 26px) 0 0;
}

.arc-tunnel--js .arc-tunnel-cotisation__suite {
	display: none;
}

.arc-tunnel--js .arc-tunnel-cotisation--calcule .arc-tunnel-cotisation__suite {
	display: flex;
}

/* --- 14.5 Le verrou que le survol annulait (B9) --------------------------- */

/*
 * DÉFAUT CONSTATÉ EN PRÉPROD, ET IL ÉTAIT LIVE.
 *
 * Le bouton de la barre est bien verrouillé tant que le montant n'est pas
 * calculé : `disabled`, `aria-disabled`, fond gris. Mais il REDEVENAIT BLEU au
 * survol de la souris. La règle du §3 qui pose le gris a une spécificité de
 * (0,5,0) ; le CSS engendré par Elementor pour cette page pose
 * `.elementor-26404 … .jet-form-builder__next-page:hover{background:#005870}`,
 * de spécificité (0,5,0) lui aussi. À égalité, c'est l'ordre de chargement qui
 * tranche — et la feuille d'Elementor est chargée APRÈS celle du thème enfant.
 *
 * D'où le `!important`, qui est ici le seul recours : on ne peut pas gagner en
 * spécificité contre une règle qui a la même et qui passe après. Le sélecteur
 * reste borné au tunnel, et à l'état verrouillé.
 */
.arc-tunnel .jet-form-builder__next-page[disabled]:hover,
.arc-tunnel .jet-form-builder__next-page[aria-disabled="true"]:hover,
.arc-tunnel .arc-tunnel-bouton--verrouille:hover {
	background-color: var(--arc-gris) !important;
	border-color: var(--arc-gris) !important;
	color: #fff !important;
	cursor: not-allowed;
}


/* === 15. ÉTAPE 3 — LES AVANTAGES : LARGEUR ET TYPOGRAPHIE (lot C) ========= */

/* --- 15.1 Le texte reprend toute la largeur (C3 + C4) --------------------- */

/*
 * CE QUI SE PASSAIT, ET C'ÉTAIT INVISIBLE À LA LECTURE DU CODE.
 *
 * L'accordéon occupe bien toute la largeur de l'étape. Mais son contenu est un
 * bloc conditionnel de JetFormBuilder, et le §4 met TOUS les conditionnels du
 * tunnel en grille à deux colonnes — c'est ce qui range les champs par paires
 * dans le formulaire. Le corps de l'accordéon atterrissait donc dans la
 * première colonne : mesuré au navigateur, 695 px de texte dans un accordéon
 * de 1 558 px. La moitié de la place perdue, et rien dans le CSS de
 * l'accordéon ne le laissait deviner.
 *
 * On rend donc sa colonne unique au contenu des accordéons, et à lui seul :
 * la grille à deux colonnes reste en vigueur partout ailleurs, notamment pour
 * les deux listes de la date de prise d'effet, qui se lisent côte à côte.
 *
 * `!important` obligé : la règle du §4 en porte un.
 */
.arc-tunnel .arc-tunnel-accordeon__contenu.jet-form-builder__conditional:not([style*="none"]) {
	grid-template-columns: minmax(0, 1fr) !important;
}

/* Les blocs conditionnels imbriqués dans le corps héritent du même défaut. */
.arc-tunnel .arc-tunnel-accordeon__corps .jet-form-builder__conditional:not([style*="none"]) {
	grid-template-columns: minmax(0, 1fr) !important;
}

/* --- 15.2 La typographie des accordéons (C3) ------------------------------ */

/*
 * Les titres passent à la serif de la charte, au corps des titres de cartes de
 * l'étape 1 — les deux écrans se répondent. Le texte reste en Roboto : il se
 * lit en liste, parfois longue, et la linéale s'y tient mieux.
 *
 * `font-size` était en `inherit` : le titre suivait le corps de l'en-tête. On
 * le fixe, sinon la valeur de la charte dépendrait d'un réglage voisin.
 */
.arc-tunnel .arc-tunnel-accordeon__titre {
	font-family: var(--arc-titre);
	font-size: 24px;
}

.arc-tunnel .arc-tunnel-accordeon__corps,
.arc-tunnel .arc-tunnel-accordeon__corps p,
.arc-tunnel .arc-tunnel-accordeon__corps li {
	font-family: var(--arc-ui);
}

/* --- 15.3 Sur téléphone, tout se resserre à 16 px (C6) -------------------- */

/*
 * Le contenu des accordéons « est trop gros » sur mobile — 20 px de texte pour
 * une liste de dix services, c'est un mur. Titres et texte descendent au même
 * corps : à cette largeur, la hiérarchie se lit par la graisse et par la
 * couleur du bandeau, pas par la taille.
 *
 * La rupture est celle du §9.2, où le tunnel passe déjà en une seule colonne.
 */
@media (max-width: 782px) {
	.arc-tunnel .arc-tunnel-accordeon__titre {
		font-size: 16px;
	}

	.arc-tunnel .arc-tunnel-accordeon__corps,
	.arc-tunnel .arc-tunnel-accordeon__corps p,
	.arc-tunnel .arc-tunnel-accordeon__corps li,
	.arc-tunnel .arc-tunnel-accordeon__corps .jet-form-builder__heading-desc {
		font-size: 16px;
	}
}


/* --- 15.4 Les deux appels à l'action de l'étape 3 (B12 + C2) -------------- */

/*
 * Le bouton de devis a quitté l'étape 2 : la demande de devis suit désormais
 * la lecture des avantages, elle ne la précède plus.
 *
 * Les deux appels ne se valent pas, et la forme le dit : « Demande d'adhésion »
 * est le bouton plein, c'est le chemin attendu ; « Demande de devis » est un
 * texte souligné, disponible sans être proposé. C'est la hiérarchie demandée
 * par l'ARC, et elle reprend le vocabulaire du §3 — bouton plein pour avancer,
 * lien sobre pour la sortie de côté.
 */
.arc-tunnel .arc-tunnel-avantages__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: clamp(16px, 2vw, 32px);
	margin: clamp(18px, 2.2vw, 38px) 0 0;
}

/*
 * Le déclencheur de devis est un vrai `<button>` — c'est lui que la popup
 * Elementor écoute, par son attribut `data-arc-devis`. On le dépouille de
 * toute apparence de bouton pour qu'il se lise comme un lien, sans toucher à
 * sa nature : en faire un `<a>` casserait l'ouverture de la popup.
 */
.arc-tunnel .arc-tunnel-avantages__devis {
	padding: 0;
	border: 0;
	background: none;
	color: var(--arc-bleu-fonce);
	font-family: inherit;
	font-size: var(--arc-t-bouton);
	font-weight: 600;
	text-decoration: underline;
	text-underline-offset: 4px;
	cursor: pointer;
}

.arc-tunnel .arc-tunnel-avantages__devis:hover,
.arc-tunnel .arc-tunnel-avantages__devis:focus-visible {
	color: var(--arc-bleu);
}

/* Sur téléphone, les deux appels s'empilent et l'action principale passe en
   tête : le pouce tombe dessus sans avoir à viser. */
@media (max-width: 640px) {
	.arc-tunnel .arc-tunnel-avantages__actions {
		flex-direction: column-reverse;
		align-items: stretch;
	}

	.arc-tunnel .arc-tunnel-avantages__devis {
		text-align: center;
	}
}


/* === 16. ÉTAPE 4 — LES CHAMPS QUI SE LISENT SUR UNE MÊME LIGNE (D13 → D16) = */

/*
 * CE QUE L'ARC DEMANDE, ET POURQUOI CE N'EST PAS UNE SIMPLE AFFAIRE DE LARGEUR.
 *
 * Quatre regroupements sont demandés à l'étape 4 :
 *   D13  Civilité · Nom · Prénom
 *   D14  Fonction · Téléphone · Adresse email
 *   D15  Nom de la copropriété · N° d'immatriculation
 *   D16  Adresse · Code postal · Ville
 *
 * Trois obstacles, qu'il faut lever ensemble sous peine de tout casser :
 *
 * 1. L'étape est une grille à DEUX colonnes (§4). Trois champs par ligne n'y
 *    tiennent pas. On rebase donc l'étape 4 — et elle seule — sur douze
 *    colonnes, l'unité qui divise aussi bien par deux que par trois. Tout ce
 *    qui n'est pas explicitement placé ci-dessous reprend « six sur douze »,
 *    c'est-à-dire exactement la demi-largeur d'aujourd'hui : la bascule ne
 *    change donc RIEN aux rangées qu'on ne touche pas.
 *
 * 2. L'ordre du formulaire n'est pas l'ordre demandé. Dans le HTML, l'adresse
 *    email précède le téléphone, la fonction arrive APRÈS les deux, et le
 *    n° d'immatriculation APRÈS la ville. `order` remet les rangées dans la
 *    lecture voulue sans toucher au formulaire.
 *    ⚠️ `order` ne déplace QUE le rendu : la tabulation et la lecture d'écran
 *    suivent toujours le HTML. La correction durable est de réordonner les
 *    blocs dans JetFormBuilder — hors de ce fichier.
 *
 * 3. Certains de ces champs n'existent pas pour tous les statuts. La fonction
 *    n'apparaît qu'au conseil syndical et à la collectivité ; le n°
 *    d'immatriculation qu'à trois statuts sur huit. Une ligne de trois qui
 *    n'en reçoit que deux laisserait un vide à droite. Le §16.4 règle ce cas.
 */

/*
 * ⚠️ TOUT LE §16 EST SOUS `min-width: 1025px`, ET C'EST VOULU.
 *
 * En dessous, deux raisons de ne rien appliquer :
 *   — à 1024 px, trois champs côte à côte donnent un code postal d'une
 *     centaine de pixels : la ligne demandée devient illisible, la paire
 *     d'aujourd'hui vaut mieux ;
 *   — à 782 px, le §9.2 replie le tunnel sur une seule colonne. Un
 *     `grid-column: span 4` y créerait trois colonnes IMPLICITES et ferait
 *     déborder la rangée hors de l'écran. Le piège est réel : il ne se voit
 *     pas à la lecture, seulement au navigateur.
 *
 * Borner la requête média évite les deux d'un coup, et surtout évite la
 * surenchère de sélecteurs qu'aurait demandée un écrasement en sens inverse :
 * une requête média n'ajoute AUCUNE spécificité (voir la note du §9.1), et les
 * règles du §16.4 en portent beaucoup.
 *
 * 1025 px reprend la rupture déjà utilisée au §9.1 : le fichier n'a pas besoin
 * d'une rupture de plus.
 */
@media (min-width: 1025px) {

	/* --- 16.1 Douze colonnes, et rien d'autre ne bouge -------------------- */

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) {
		grid-template-columns: repeat(12, minmax(0, 1fr));
	}

	/*
	 * Le défaut : six colonnes sur douze, soit la demi-largeur d'aujourd'hui.
	 * Sans cette règle, chaque rangée non placée tomberait à UNE colonne sur
	 * douze — 93 px de champ à 1578 px de large.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > * {
		grid-column: span 6;
	}

	/*
	 * Ce qui reprend toute la largeur. C'est la liste du §4, redite ici parce
	 * que le défaut ci-dessus la dépasse en spécificité — le §4 vise deux
	 * classes, le sélecteur d'étape en vise quatre. Sans cette reprise, les
	 * titres de rubrique et les blocs conditionnels de l'étape 4 seraient
	 * ramenés à une demi-largeur.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .field-type-heading-field,
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .field-type-radio-field,
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .field-type-signature-field,
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional,
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row.full-width,
	/* Le §3 met aussi ces deux-là en pleine largeur, mais avec deux classes
	   seulement : le défaut `span 6` ci-dessus en compte quatre et passerait
	   devant. Aucun bouton d'envoi n'est à l'étape 4 aujourd'hui — il est à la
	   5 — mais le jour où on en ajoute un, il tomberait à mi-largeur sans que
	   personne comprenne pourquoi. */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .field-type-submit-field,
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__submit-wrap,
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__next-page-wrap {
		grid-column: 1 / -1;
	}

	/* --- 16.2 L'ordre de lecture ------------------------------------------ */

	/*
	 * Un rang de base est donné à TOUTES les rangées, sinon celles qu'on
	 * déplace quitteraient le groupe « ordre 0 » et passeraient devant tout le
	 * reste de l'étape, y compris les champs syndic et la signature.
	 *
	 * ⚠️ La barre de navigation est expressément écartée : le §3 lui pose
	 * `order: -1` pour la placer AU-DESSUS du formulaire. Un rang de base
	 * appliqué ici la ferait retomber en bas de l'étape — le bouton
	 * « Continuer » disparaîtrait sous trois mille pixels de champs.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > *:not(.jet-form-builder__next-page-wrap) {
		order: 50;
	}

	/*
	 * ⚠️ Les quatre blocs conditionnels ci-dessous se visent par un sélecteur
	 * ALLONGÉ — `:not(--hidden)` et `.jet-form-builder__conditional` en plus.
	 * Écrits court, ils comptaient un cran de moins que le rang de base
	 * ci-dessus : le rang 50 l'emportait, et les titres de rubrique se
	 * retrouvaient sous la signature. Les rangées nommées, elles, n'ont pas
	 * besoin de rallonge : leur `:has()` leur en donne déjà assez.
	 */
	/* Bloc identité : le titre du statut, puis la ligne D13, puis la D14. */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-identite {
		order: 10;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="civilite"]) {
		order: 11;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="nom"]) {
		order: 12;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="prenom"]) {
		order: 13;
	}

	/*
	 * Q3 (lot R) — RÈGLE `order` DEVENUE INUTILE, EN PARTIE.
	 *
	 * Avant Q3, le formulaire écrivait email PUIS téléphone PUIS la fonction,
	 * et TROIS valeurs `order` distinctes (14/15/16) remettaient l'affichage
	 * dans l'ordre voulu (Fonction · Téléphone · E-mail). `exports/fix-R-etapes-4-5.php`
	 * a réordonné les BLOCS dans le formulaire — Fonction, puis Téléphone, puis
	 * E-mail se suivent maintenant dans le HTML tel quel — la correction
	 * « durable » que le commentaire du lot D appelait déjà de ses vœux.
	 *
	 * Les trois rangs distincts n'ont donc plus besoin d'exister : les trois
	 * éléments partagent maintenant UN SEUL rang, et c'est l'ordre du DOM —
	 * corrigé — qui décide de leur ordre relatif entre eux. Le rang reste
	 * nécessaire pour une seule raison qui n'a rien à voir avec Q3 : il faut
	 * toujours les faire passer AVANT le bloc « Votre copropriété » (rang 20),
	 * qui les suit dans le HTML.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-fonction,
	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="telephone"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="email"]) {
		order: 14;
	}

	/* Bloc copropriété : le titre garde son rang (toujours avant le contenu
	   du bloc, quel que soit l'ordre DOM du reste). */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-copro-titre {
		order: 20;
	}

	/*
	 * ⚠️ CORRECTIF 25/09 (Chrome, clone) — `order: 21` (copro_nom/
	 * collectivite_nom), `order: 22` (arc-etape4-immat), `order: 23`
	 * (adresse), `order: 24` (code_postal), `order: 25` (ville) SUPPRIMÉS.
	 *
	 * Ces cinq rangs redessinaient l'ordre VISUEL (N° immat à côté du nom de
	 * la copropriété) sans jamais toucher au DOM — exactement le piège que
	 * le commentaire D14 d'origine (plus haut, §16.2) mettait déjà en garde
	 * pour la Fonction, avant que Q3 ne le corrige pour de bon. La
	 * tabulation et les lecteurs d'écran suivent le DOM, jamais `order` :
	 * un clone testé au clavier tombait sur « Nom de la copropriété » juste
	 * après l'email, avant le N° d'immatriculation et l'adresse — alors que
	 * `order` l'affichait visuellement ailleurs. Symptôme identique à celui
	 * que Q3 avait déjà résolu pour Fonction/Téléphone/Email.
	 *
	 * `exports/fix-repasse-G1-etape4-blocs.php` (T2, corrigé le même jour)
	 * déplace maintenant RÉELLEMENT le n° d'immatriculation et la forme
	 * juridique de l'ASL/AFUL AVANT `copro_nom`/`collectivite_nom` dans le
	 * DOM — l'ordre voulu (immatriculation/forme juridique, puis nom, puis
	 * adresse, puis CP·Ville·Pays) est donc désormais l'ordre naturel du
	 * document. Sans ces cinq règles, ces rangées retombent au rang de base
	 * (50, la règle générale de tout à l'heure) : comme elles suivent déjà
	 * le bon ordre dans le DOM, l'ordre relatif entre elles — et vis-à-vis
	 * des blocs syndic/bien/facturation qui les suivent, eux aussi au rang
	 * 50 — reste correct sans qu'aucun rang explicite soit nécessaire.
	 */

	/* --- 16.3 Les quatre lignes ------------------------------------------- */

	/*
	 * Les largeurs ne sont pas des tiers arbitraires : chaque champ reçoit la
	 * place que sa saisie demande. « M. / Mme » tient en deux colonnes, un code
	 * postal en deux également ; une adresse en réclame six. Chaque ligne
	 * totalise exactement douze, sans quoi la rangée suivante viendrait
	 * combler le reste.
	 */

	/* D13 — Civilité · Nom · Prénom (2 + 5 + 5) */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="civilite"]) {
		grid-column: span 2;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="nom"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="prenom"]) {
		grid-column: span 5;
	}

	/*
	 * D14 — Fonction · Téléphone · Adresse email.
	 *
	 * La fonction n'est là qu'au conseil syndical (liste déroulante) et à la
	 * collectivité (champ libre). Les deux portent la même classe : quelle que
	 * soit celle que JetFormBuilder affiche, elle prend le tiers de gauche.
	 *
	 * `:not([style*="none"])` reprend la convention du §4 — JetFormBuilder
	 * masque ses blocs conditionnels avec un `display` EN LIGNE. Un bloc masqué
	 * n'est plus un élément de grille : la ligne se recompose d'elle-même, le
	 * §16.4 s'en charge.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-fonction:not([style*="none"]) {
		grid-column: span 4;
	}

	/*
	 * Le bloc conditionnel porte lui-même une grille à deux colonnes (§4) : son
	 * unique rangée n'en occuperait qu'une, soit la moitié du tiers. Elle doit
	 * remplir son bloc. Même piège qu'au §15.1 pour les accordéons.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"] > .arc-etape4-fonction > .jet-form-builder-row,
	.arc-tunnel .jet-form-builder-page[data-page="4"] > .arc-etape4-immat > .jet-form-builder-row {
		grid-column: 1 / -1;
	}

	/*
	 * D15 — Nom de la copropriété · N° d'immatriculation.
	 * Par défaut le nom prend la ligne entière : pour les cinq statuts sans
	 * immatriculation, une demi-largeur laisserait un vide à droite.
	 *
	 * R-27 : `collectivite_nom` (« Nom de la collectivité ») suit la même
	 * règle — une collectivité n'a pas d'immatriculation non plus, la ligne
	 * lui revient donc entière, sans exception à écrire.
	 *
	 * ⚠️ CORRECTIF 25/09 (Chrome, clone) — CETTE RÈGLE NE VISAIT RIEN.
	 * Depuis R-27 (23/09), `copro_nom`/`collectivite_nom` vivent chacun dans
	 * LEUR PROPRE bloc conditionnel (`arc-etape4-copro-nom`) : l'ENFANT DIRECT
	 * de la page est ce bloc conditionnel, jamais un `.jet-form-builder-row`
	 * — le `.jet-form-builder-row` qui porte le champ est un PETIT-ENFANT
	 * (page > conditional > row > … > [name]). Le sélecteur `> .jet-form-
	 * builder-row:has(…)` ci-dessous ne correspondait donc à AUCUN élément
	 * depuis trois jours ; la valeur `1 / -1` observée en pratique venait
	 * uniquement de la règle générique §16.1 (`> .jet-form-builder__
	 * conditional { grid-column: 1 / -1 }`), qui elle cible correctement le
	 * bloc conditionnel. Conservée ci-dessous pour ne rien supprimer sans
	 * raison (elle ne fait de mal à personne), mais c'est désormais la règle
	 * de CONTENEUR juste en dessous qui porte le comportement réel.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="copro_nom"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="collectivite_nom"]) {
		grid-column: 1 / -1;
	}

	/* La règle qui vise vraiment le conteneur réel (le bloc conditionnel
	   `arc-etape4-copro-nom`, partagé par `copro_nom` ET `collectivite_nom`
	   depuis R-27) — pleine largeur par défaut, redéfinie juste en dessous
	   (§16.4) quand l'immatriculation ou la forme juridique ASL/AFUL existe. */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-copro-nom {
		grid-column: 1 / -1;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-immat:not([style*="none"]) {
		grid-column: span 6;
	}

	/* D16 — Adresse · Code postal · Ville (6 + 2 + 4). Les trois existent pour
	   tous les statuts : cette ligne-là est toujours pleine. */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="adresse"]) {
		grid-column: span 6;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="code_postal"]) {
		grid-column: span 2;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="ville"]) {
		grid-column: span 4;
	}

	/* --- 16.4 Quand un champ de la ligne n'existe pas --------------------- */

	/*
	 * LE VIDE À DROITE, ET COMMENT ON L'ÉVITE.
	 *
	 * Huit statuts, et deux des quatre lignes changent de composition selon
	 * celui qui est choisi. Le réflexe — poser trois tiers et laisser le
	 * navigateur faire — creuse un trou de quatre colonnes dès qu'un champ
	 * manque : la grille ne redistribue pas la place d'un élément absent.
	 *
	 * On prend donc le problème à l'envers : les largeurs posées au §16.3 sont
	 * celles du cas SANS le champ optionnel (deux moitiés, ou une ligne
	 * entière), et c'est la PRÉSENCE du champ qui resserre la ligne. `:has()`
	 * lit cette présence sur l'étape elle-même.
	 *
	 * Ces sélecteurs sont longs, et ils doivent l'être : ils écrasent les
	 * largeurs du §16.3, qui en comptent déjà six.
	 */

	/* Fonction affichée → la ligne D14 passe à trois tiers. */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden):has(> .jet-form-builder__conditional.arc-etape4-fonction:not([style*="none"])) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="telephone"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden):has(> .jet-form-builder__conditional.arc-etape4-fonction:not([style*="none"])) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="email"]) {
		grid-column: span 4;
	}

	/*
	 * N° d'immatriculation affiché → le nom de la copropriété lui cède la
	 * moitié droite.
	 *
	 * ⚠️ CORRECTIF 25/09 (Chrome, clone) — cible maintenant le CONTENEUR réel
	 * (`.jet-form-builder__conditional.arc-etape4-copro-nom`, enfant DIRECT
	 * de la page depuis R-27), pas `> .jet-form-builder-row:has(…)` qui ne
	 * correspond à rien ici (voir le correctif juste au-dessus, D15). Sans ce
	 * changement, `copro_nom` restait à `1 / -1` (règle générique §16.1)
	 * quel que soit l'état de `arc-etape4-immat` : l'immatriculation et le
	 * nom de la copropriété tombaient chacun sur sa propre ligne pleine
	 * largeur au lieu de partager la même — le bug exact remonté au clone.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden):has(> .jet-form-builder__conditional.arc-etape4-immat:not([style*="none"])) > .jet-form-builder__conditional.arc-etape4-copro-nom {
		grid-column: span 6;
	}
}


/* === 17. ÉTAPE 5 — LE PAIEMENT (lot E) ==================================== */

/*
 * Le §8 dessine déjà les CARTES de mode de paiement, et le §8 bis le bloc
 * natif de la passerelle. Ce §17 ne les redessine pas : il s'occupe des quatre
 * points demandés par l'ARC au lot E, et de rien d'autre.
 *
 *   17.1  E3 — « Règlement sous 30j par le syndic » n'est offert qu'à trois
 *              statuts sur huit ;
 *   17.2  E1 — les blocs de l'étape respirent ;
 *   17.3  E5 — leurs titres grossissent, pour qu'on les distingue ;
 *   17.4  E7 — le bouton d'envoi est centré.
 */

/* --- 17.1 E3 — le mode « syndic » n'est pas offert à tout le monde -------- */

/*
 * ┌──────────────────────────────────────────────────────────────────────┐
 * │ POURQUOI CETTE RESTRICTION EST EN CSS, ET PAS EN BLOCS CONDITIONNELS. │
 * │                                                                      │
 * │ La voie qui paraissait juste — deux blocs conditionnels, l'un portant │
 * │ un `mode_paiement` à trois options, l'autre à deux, chacun affiché    │
 * │ selon `type_copro` — A ÉTÉ MONTÉE ET ESSAYÉE DANS LE NAVIGATEUR. Elle │
 * │ ne marche pas, et il faut dire pourquoi pour que personne ne la       │
 * │ retente :                                                            │
 * │                                                                      │
 * │ Deux champs de MÊME NOM cassent la fiche d'entrée de JetFormBuilder.  │
 * │ Relevé en console sur ce formulaire : `dataInputs.mode_paiement`      │
 * │ n'enregistre que 2 des 5 boutons radio, et son objet `reporting`      │
 * │ reste à moitié initialisé. Conséquence : `clearChoiceInputs()` lève   │
 * │ « Cannot read properties of null (reading 'validateOnChange') »,      │
 * │ l'exception interrompt `showBlockDom()` AVANT `node.remove()`, et le  │
 * │ bloc qui devait disparaître reste affiché — les deux listes de modes  │
 * │ cohabitent à l'écran. C'est la règle des noms uniques du projet,      │
 * │ vérifiée plutôt que supposée.                                        │
 * │                                                                      │
 * │ On garde donc UN SEUL champ `mode_paiement`, avec ses trois options   │
 * │ dans le balisage, et c'est l'affichage qui se restreint. Le CSS lit   │
 * │ l'état réel : le bouton radio de `type_copro` coché à l'étape 1 est   │
 * │ dans le même `<form>` et n'en sort jamais (JetFormBuilder replie les  │
 * │ étapes, il ne les retire pas du DOM). `:has()` le voit de là.         │
 * │                                                                      │
 * │ ⚠️ CE N'EST PAS LE VERROU. Un adhérent qui forcerait                  │
 * │ `mode_paiement=syndic` est refusé par le plugin à la soumission       │
 * │ (`ARC_Demandes_Tunnel::mode_paiement_autorise()`, appelé dans         │
 * │ `class-tunnel-submit.php` avant même le calcul de la cotisation), et  │
 * │ la matrice qui l'alimente est écrite par                              │
 * │ `exports/fix-E-etape5.php` dans l'option `arc_tunnel_modes_paiement`. │
 * │ Le CSS ne fait qu'éviter de proposer ce qui serait refusé.            │
 * │                                                                      │
 * │ ⚠️ LIMITE CONNUE, ET ELLE N'A PAS DE RÉPONSE EN CSS. Si l'adhérent    │
 * │ coche « syndic », revient à l'étape 1 et change de statut, son choix  │
 * │ reste COCHÉ derrière l'option masquée. Le serveur le refusera avec    │
 * │ un message explicite, mais l'adhérent ne verra pas ce qu'il doit      │
 * │ corriger. Décocher demanderait trois lignes dans `arc-tunnel.js`,     │
 * │ qui n'appartient pas à ce lot : le correctif est proposé à part dans  │
 * │ `exports/patch-E3-decocher-mode-interdit.js`.                        │
 * └──────────────────────────────────────────────────────────────────────┘
 */

/*
 * Masqué par défaut. `arc-tunnel-paiement` est sur l'`<input>` (même piège de
 * balisage qu'au §8) : c'est l'enveloppe `__field-wrap` qu'on retire, sinon il
 * resterait une case vide dans la grille des cartes.
 */
.arc-tunnel .jet-form-builder .jet-form-builder__field-wrap:has(> label > .arc-tunnel-paiement[value="syndic"]) {
	display: none;
}

/*
 * Rétabli pour les trois statuts qui y ont droit. `aful` figure dans la liste
 * bien qu'aucune carte de l'étape 1 ne le pose : c'est une valeur historique
 * que `types_legacy()` ramène à `asl` côté serveur, et une page laissée
 * ouverte avant la fusion des deux cartes peut encore la porter.
 *
 * `display: flex` et pas `revert` : c'est la valeur que le §8 donne à cette
 * enveloppe, et `revert` retomberait sur le `block` du navigateur, ce qui
 * décalerait la carte dans sa case.
 */
.arc-tunnel .jet-form-builder:has(input[name="type_copro"][value="conseil_syndical"]:checked) .jet-form-builder__field-wrap:has(> label > .arc-tunnel-paiement[value="syndic"]),
.arc-tunnel .jet-form-builder:has(input[name="type_copro"][value="syndic_cooperatif"]:checked) .jet-form-builder__field-wrap:has(> label > .arc-tunnel-paiement[value="syndic"]),
.arc-tunnel .jet-form-builder:has(input[name="type_copro"][value="asl"]:checked) .jet-form-builder__field-wrap:has(> label > .arc-tunnel-paiement[value="syndic"]),
.arc-tunnel .jet-form-builder:has(input[name="type_copro"][value="aful"]:checked) .jet-form-builder__field-wrap:has(> label > .arc-tunnel-paiement[value="syndic"]) {
	display: flex;
}

/* --- 17.2 E1 — les blocs de l'étape respirent ----------------------------- */

/*
 * ⚠️ R-2 / R-5 (lot R) REVIENNENT SUR CE POINT — LES DEUX CASES REDEVIENNENT
 * 50 % / 50 %, CÔTE À CÔTE.
 *
 * Au lot E, ce bloc forçait les deux cases de consentement en pleine largeur
 * (`grid-column: 1 / -1`) : côte à côte, chacune se repliait sur trois lignes
 * dans une demi-colonne, et empilées elles se lisaient mieux. L'ARC est
 * revenue dessus deux fois (Q-E2 « intitulés en 2 colonnes », Q-E6 « cases à
 * 50 % / 50 % alignées ») : NE PLUS forcer la pleine largeur suffit, le §4
 * range déjà l'étape en deux colonnes ÉGALES par défaut — c'est très
 * exactement le 50 % / 50 % demandé, sans qu'il y ait de largeur à poser ici.
 * Les deux cases, en grille, s'alignent naturellement sur la même rangée et
 * la même hauteur de départ.
 */

/*
 * L'écart entre les blocs. Le §4 met la gouttière VERTICALE à zéro (`gap: 0
 * clamp(...)`) et laisse l'espacement des rangées à Elementor (Form Row → Gap
 * After) : à l'étape 5, quatre blocs de nature différente s'enchaînent, et cet
 * écart-là ne suffit pas à les séparer. On le pose ici, pour cette étape
 * seulement — les autres gardent le réglage du widget.
 */
.arc-tunnel .jet-form-builder-page[data-page="5"]:not(.jet-form-builder-page--hidden) {
	row-gap: clamp(14px, 1.6vw, 28px);
}

/*
 * Le rembourrage demandé. Il est INTÉRIEUR au bloc : une marge extérieure
 * s'effondrerait avec celle du voisin et ne donnerait que la moitié de ce
 * qu'on croit poser.
 *
 * Le bloc d'envoi en est exclu : c'est une barre de boutons, pas un bloc de
 * lecture, et le §3 lui donne déjà sa marge haute.
 */
.arc-tunnel .jet-form-builder-page[data-page="5"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:not(.field-type-submit-field),
.arc-tunnel .jet-form-builder-page[data-page="5"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional:not([style*="none"]) {
	padding: clamp(14px, 1.5vw, 24px) clamp(12px, 1.2vw, 20px);
	border-radius: var(--arc-rayon-doux);
	background: #fff;
}

/* --- 17.3 E5 — les titres des blocs -------------------------------------- */

/*
 * Trois blocs, trois intitulés de champ qui leur servent de titre :
 * « Choisissez votre mode de paiement », « Acceptation des conditions »,
 * « Consentement au traitement des données ». Ils sortaient au corps du texte
 * courant, et rien ne disait où un bloc finissait.
 *
 * Le corps et la famille sont ceux des titres d'accordéon de l'étape 3
 * (§15.2) : 24 px en Lora. Ce n'est pas une valeur choisie ici, c'est la
 * valeur déjà en vigueur ailleurs dans le tunnel — les deux écrans se
 * répondent, et la charte n'a qu'une échelle de titres.
 *
 * Viser `__label-text` DIRECTEMENT est ce qui permet de passer devant la
 * typographie réglée dans Elementor : celle-ci est posée sur `__label`, et
 * `__label-text` n'en HÉRITE que. Une règle directe bat toujours une valeur
 * héritée, quelle que soit la spécificité de celle-ci (voir la note du §4.1).
 */
.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder__label-text {
	display: block;
	margin-bottom: clamp(10px, 1vw, 16px);
	font-family: var(--arc-titre);
	font-size: 24px;
	font-weight: 600;
	line-height: 1.25;
	color: var(--arc-bleu);
}

/*
 * L'astérisque « obligatoire » ne suit PAS le titre à 24 px : à cette taille
 * il se lit comme une note de bas de page égarée. Il reprend le corps du
 * texte, en rouge, à sa place au bout de l'intitulé.
 */
.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder__label-text .jet-form-builder__required {
	font-family: var(--arc-ui);
	font-size: var(--arc-t-corps);
	vertical-align: super;
}

/*
 * Le titre du bloc passerelle suit le mouvement. Le §8 bis l'avait aligné sur
 * l'étiquette d'un champ ordinaire, en faisant remarquer que ce bloc EST un
 * champ et pas un chapitre : c'est toujours vrai, et c'est précisément pour
 * cela qu'il monte avec les autres — sans quoi il serait le seul bloc de
 * l'étape sans titre lisible.
 *
 * Sélecteur à quatre classes : le §8 bis en pose trois, et il est écrit avant.
 */
.arc-tunnel .jet-form-builder .jet-form-builder-page[data-page="5"] .jfb-multi-gateway__title {
	font-family: var(--arc-titre);
	font-size: 24px;
	font-weight: 600;
	line-height: 1.25;
	color: var(--arc-bleu);
}

/*
 * Le lien des CGV (E6) doit se voir COMME un lien : il est noyé dans la phrase
 * d'une case à cocher, et un simple changement de couleur ne suffirait pas à
 * un daltonien. Le soulignement porte l'information, la couleur l'appuie.
 */
/*
 * ⚠️ `display: inline` EST UNE CEINTURE, PAS LA BRETELLE.
 *
 * JetFormBuilder pose `display: flex` sur le `<span>` qui porte le texte d'une
 * case à cocher (`main.css` : `.jet-form-builder__field-wrap.checkradio-wrap
 * span`). Dans un conteneur flexible, un `<a>` au milieu d'un texte devient un
 * élément à part et se retrouve BLOQUIFIÉ : la phrase se cassait en trois
 * morceaux. Relevé au navigateur — `display: inline` sur le lien n'y changeait
 * rien, c'est la flexbox du parent qui décide.
 *
 * La vraie réponse est dans le libellé, que `exports/fix-E-etape5.php`
 * enveloppe dans `<span class="arc-tunnel-cgv">` : la phrase entière ne fait
 * plus qu'un seul élément flexible. Cette déclaration-ci reste au cas où un
 * lien serait posé un jour sans enveloppe — elle ne coûte rien.
 */
/*
 * L'enveloppe de la phrase des CGV redevient un bloc de texte ordinaire.
 *
 * ⚠️ Sans cette déclaration, l'enveloppe ne sert à rien : la règle de
 * JetFormBuilder vise `… .checkradio-wrap span`, c'est-à-dire N'IMPORTE QUEL
 * `<span>` sous la case — la nôtre comprise. Elle héritait donc du même
 * `display: flex`, et la phrase se recassait exactement comme avant.
 */
.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder__field-label .arc-tunnel-cgv {
	display: block;
}

.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder__field-label a {
	display: inline;
	color: var(--arc-bleu-fonce);
	text-decoration: underline;
	text-underline-offset: 3px;
}

.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder__field-label a:hover,
.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder__field-label a:focus-visible {
	color: var(--arc-bleu);
}

/* --- 17.4 R-5 — le bouton d'envoi, centré SEUL (corrige E7) --------------- */

/*
 * ⚠️ CE QUE LE LOT E FAISAIT, ET POURQUOI R-5 REVIENT DESSUS.
 *
 * Au lot E, les deux boutons (« Précédent » et l'envoi) étaient centrés
 * ENSEMBLE, comme un groupe — le commentaire d'alors écartait le centrage de
 * l'envoi seul, jugé trop coûteux : « demanderait une cale de la largeur
 * exacte du bouton de gauche ». L'ARC a explicitement redemandé l'envoi CENTRÉ
 * SEUL (Q-E6 / R-5), « Précédent » restant à sa place. Il existe une solution
 * qui n'a pas besoin de connaître cette largeur : une grille à trois colonnes
 * (`1fr auto 1fr`). « Précédent » occupe la première, l'envoi la deuxième —
 * calée au centre par les deux `1fr` qui l'encadrent, quelle que soit sa
 * largeur — la troisième colonne reste vide et sert de contrepoids. Pas de
 * calcul, pas de valeur à retoucher si un jour le libellé change.
 *
 * Les deux réglages qui suivent restent nécessaires pour la même raison
 * qu'au lot E : le §3 pose `justify-content: flex-end` sur la barre d'envoi
 * et `margin-right: auto` sur « Précédent », ce qui pousserait le bouton
 * d'envoi contre le bord droit quoi qu'on demande au conteneur. Quatre
 * classes ici contre deux au §3 : le débat est clos sans `!important`.
 */
.arc-tunnel .jet-form-builder .jet-form-builder-page[data-page="5"] .jet-form-builder__submit-wrap {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	justify-content: normal;
}

/*
 * RETOUR DE DAVID (2026-09-30) : le « Précédent » posé SOUS le formulaire, à
 * côté du bouton de paiement, n'a rien à faire là. Il est masqué à l'étape 5
 * et dans cette barre seulement (`data-page="5"` + `.submit-wrap`) : aucune
 * autre étape n'est touchée. Le bouton d'envoi reste en colonne centrale de
 * la grille `1fr auto 1fr` ; un élément en `display: none` ne prend pas de
 * colonne, il reste donc centré sur toute la largeur.
 */
.arc-tunnel .jet-form-builder .jet-form-builder-page[data-page="5"] .jet-form-builder__submit-wrap .jet-form-builder__prev-page {
	display: none;
}

.arc-tunnel .jet-form-builder .jet-form-builder-page[data-page="5"] .jet-form-builder__submit-wrap .jet-form-builder__submit {
	grid-column: 2;
	justify-self: center;
}

/* --- 17.6 R-5 — le titre du choix de paiement, centré --------------------- */

/*
 * Seul ce titre-là : les deux cases de consentement gardent leur intitulé à
 * gauche (§17.2 les remet côte à côte, pas centrées), et rien ne dit qu'elles
 * doivent suivre. `:has()` cible la rangée par le nom du champ qu'elle
 * contient plutôt que par une classe générée — même idiome qu'au §17.1.
 */
.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder-row:has(input[name="mode_paiement"]) > .jet-form-builder__label {
	text-align: center;
	padding-bottom: clamp(14px, 1.5vw, 24px);
}

/* --- 17.5 Téléphone ------------------------------------------------------- */

/*
 * Même rupture et même raison qu'au §15.3 : 24 px de titre pour trois blocs
 * empilés font un mur sur un écran de 375 px. À cette largeur la hiérarchie se
 * lit par la graisse et la couleur, pas par la taille.
 *
 * Le rembourrage se resserre aussi : la marge latérale de la page (§4) prend
 * déjà 16 px de chaque côté, et un rembourrage de bloc par-dessus réduirait la
 * ligne de texte utile.
 */
@media (max-width: 782px) {
	.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder__label-text,
	.arc-tunnel .jet-form-builder .jet-form-builder-page[data-page="5"] .jfb-multi-gateway__title {
		font-size: 18px;
	}

	.arc-tunnel .jet-form-builder-page[data-page="5"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:not(.field-type-submit-field),
	.arc-tunnel .jet-form-builder-page[data-page="5"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional:not([style*="none"]) {
		padding: 14px 0;
	}
}

/* === LOTS Q+S+T === */

/*
 * S1 — « Mes adresses » : facturation et livraison l'une SOUS l'autre plutôt
 * que côte à côte. WooCommerce pose lui-même le layout deux colonnes via
 * `.col2-set .col-1 { float:left; width:48% }` / `.col-2 { float:right }`
 * (woocommerce-layout.css, sans !important) : on neutralise ces flottants
 * plutôt que de dupliquer le sélecteur générique `.woocommerce-Addresses`,
 * qui existe aussi hors du compte (page panier notamment).
 */
.woocommerce-account .woocommerce-Addresses.col2-set {
	display: block;
}

.woocommerce-account .woocommerce-Addresses .col-1,
.woocommerce-account .woocommerce-Addresses .col-2 {
	float: none;
	width: 100%;
}

.woocommerce-account .woocommerce-Addresses .woocommerce-Address {
	margin-bottom: 24px;
}

.woocommerce-account .woocommerce-Addresses .woocommerce-Address:last-child {
	margin-bottom: 0;
}

/*
 * S2 — Sur la page récapitulative "Mes adresses" uniquement (classe posée
 * par arc-espace-QST.php sur <body>, seulement quand l'adresse copro est
 * verrouillée) : le lien "Modifier"/"Ajouter" de la facturation disparaît.
 * La facturation est toujours le PREMIER bloc rendu par WooCommerce
 * (my-address.php boucle billing puis shipping) : :first-child cible donc
 * sans ambiguïté le bon bloc, sans dépendre de l'ordre des classes u-column.
 */
body.arc-adresse-facturation-verrouillee .woocommerce-Addresses .woocommerce-Address:first-child .woocommerce-Address-title .edit {
	display: none;
}

.arc-adresse-verrouillee-note {
	margin: 10px 0 0;
	padding: 10px 12px;
	border-left: 3px solid var(--arc-bleu, #29abe2);
	background: var(--arc-bleu-pale, #eaf6fd);
	color: var(--arc-texte, #1d1d1d);
	font-size: 0.875rem;
	line-height: 1.4;
}

/* === LOT L — état du compte ===
   Deux ajouts, complémentaires du bloc « ESPACE MEMBRE — Accès bloqué »
   existant plus haut (mu-plugin arc-crm.php, section LOT C) :
     1. le bandeau rouge « retard de paiement » (L2 / copro_status=Late),
        posé au-dessus du contenu du tableau de bord par le mu-plugin
        arc-espace-L.php — navigation et contenu restent accessibles ;
     2. le bouton « J'ai compris » (L3/L4), variante du bouton existant
        `.arc-acces-bloque__bouton`, posée par le même mu-plugin lot C
        réaligné (arc_acces_bloque_ecran()).
   Aucune ligne de JS : convention du projet (minificateur JS préprod). */
.arc-etat-compte-bandeau {
	margin: 0 0 20px;
	padding: 14px 18px;
	background: #c0392b;
	border: 1px solid #a5281a;
	border-radius: 8px;
	color: #fff;
	font-family: system-ui, -apple-system, Arial, sans-serif;
	font-size: 15px;
	font-weight: 600;
	line-height: 1.5;
}

/* Bouton « J'ai compris » : même gabarit que `.arc-acces-bloque__bouton`
   (bleu ARC), mais posé APRÈS le bloc de contact plutôt qu'avant, et seul —
   c'est désormais la SEULE action laissée sur un compte bloqué. On ne
   redéfinit que ce qui diffère : l'espacement au-dessus, puisque ce bouton
   suit maintenant le bloc de contact et non plus le paragraphe de texte. */
.arc-acces-bloque__bouton--compris {
	margin-top: 4px;
}

@media (max-width: 767px) {
	.arc-etat-compte-bandeau {
		padding: 12px 14px;
		font-size: 14px;
	}
}

/* === LOT O-b — ma copro : blocs ===
   Quatre blocs posés SOUS la fiche bleue de la copropriété (mu-plugin
   wp-content/mu-plugins/arc-espace-O-blocs.php, accroché à l'action
   `arc_ma_copro_apres_fiche` posée par le lot O-a) :
     - deux rangées de CTA (bleus = ancre de défilement, gris foncé =
       ouverture de popup) ;
     - le bloc « Pièces à fournir » (upload) ;
     - deux <dialog> natifs (« Nommer un nouveau référent » / « Changer le
       syndic »), ouverts par assets/js/arc-ma-copro-blocs.js.
   Préfixe `.arc-ob-` réservé à ce lot. */

.arc-ob-blocs {
	max-width: 760px;
	font-family: system-ui, -apple-system, Arial, sans-serif;
	margin: 20px 0 0;
}

.arc-ob-bloc {
	margin: 28px 0 0;
}

.arc-ob-titre {
	margin: 0 0 4px;
	font-size: 18px;
	font-weight: 700;
	color: #1077b3;
}

.arc-ob-sous-titre {
	margin: 0 0 14px;
	font-size: 13px;
	color: #5a6472;
}

.arc-ob-aide {
	margin: 6px 0 0;
	font-size: 12px;
	color: #8a93a3;
}

/* Rangée de CTA : les deux familles (bleu-lien / gris foncé) cohabitent sur
   la même grille, jamais dans le même bouton. */
.arc-ob-cta-rangee {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin: 18px 0;
}

.arc-ob-bouton-lien {
	display: inline-block;
	background: #eaf6fd;
	color: #007095;
	border: 1px solid #b7e0f5;
	border-radius: 8px;
	padding: 10px 18px;
	font-size: 14px;
	font-weight: 600;
	text-decoration: none;
	cursor: pointer;
}

.arc-ob-bouton-lien:hover {
	background: #d6eefb;
}

/* CTA « gris foncé » demandés par O5/O6, sous le bloc bleu de la copro —
   distincts du jaune ARC (#F5B32E, réservé aux actions d'enregistrement) et
   du bleu-lien ci-dessus (réservé à la navigation dans la page). */
.arc-ob-bouton-gris {
	display: inline-block;
	background: #495363;
	color: #fff;
	border: 0;
	border-radius: 8px;
	padding: 10px 18px;
	font-size: 14px;
	font-weight: 600;
	cursor: pointer;
}

.arc-ob-bouton-gris:hover {
	background: #3a4252;
}

.arc-ob-bouton-jaune {
	background: #f5b32e;
	color: #1b2a4a;
	border: 0;
	border-radius: 8px;
	padding: 11px 24px;
	font-size: 14px;
	font-weight: 600;
	cursor: pointer;
}

.arc-ob-bouton-texte {
	background: transparent;
	border: 0;
	color: #5a6472;
	font-size: 14px;
	font-weight: 600;
	cursor: pointer;
	padding: 11px 8px;
}

.arc-ob-form {
	margin: 0;
}

.arc-ob-champs-grille {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
	gap: 14px 20px;
}

.arc-ob-champ {
	display: flex;
	flex-direction: column;
	gap: 5px;
	margin: 0 0 14px;
}

.arc-ob-champ label {
	font-size: 13px;
	font-weight: 600;
	color: #1b2a4a;
}

.arc-ob-champ input[type="text"],
.arc-ob-champ input[type="email"],
.arc-ob-champ input[type="tel"],
.arc-ob-champ input[type="file"] {
	padding: 9px 10px;
	border: 1px solid #ccd4de;
	border-radius: 8px;
	font-size: 14px;
	background: #fff;
	color: #1b2a4a;
	width: 100%;
	box-sizing: border-box;
	font-family: inherit;
}

/* Pièces à fournir : état courant par type de document. */
.arc-ob-pieces-etat {
	margin: 0 0 18px;
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.arc-ob-piece-ligne {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
	padding: 10px 14px;
	background: #f5f8fb;
	border: 1px solid #e4ebf2;
	border-radius: 8px;
}

.arc-ob-piece-label {
	font-size: 14px;
	font-weight: 600;
	color: #1b2a4a;
	min-width: 220px;
}

.arc-ob-piece-lien {
	font-size: 13px;
	color: #007095;
}

.arc-ob-piece-manquant {
	font-size: 13px;
	color: #8a93a3;
	font-style: italic;
}

/* Popups natives <dialog> — pas de framework JS, voir arc-ma-copro-blocs.js. */
.arc-ob-dialog {
	max-width: 480px;
	width: calc(100% - 32px);
	border: 0;
	border-radius: 12px;
	padding: 24px;
	box-shadow: 0 12px 40px rgba(27, 42, 74, 0.25);
	font-family: system-ui, -apple-system, Arial, sans-serif;
}

.arc-ob-dialog::backdrop {
	background: rgba(27, 42, 74, 0.55);
}

.arc-ob-dialog-actions {
	display: flex;
	justify-content: flex-end;
	gap: 10px;
	margin-top: 10px;
}

/* Boutons des popups référent / syndic au gabarit des boutons du dashboard
   (retour David du 02/10) : « Envoyer la demande » = bleu plein, comme
   « Modifier mes informations » ; « Annuler » = contour bleu, comme dans le
   formulaire d'ajout de membre. Sélecteurs à 3 classes : le style global des
   boutons du kit Elementor (`.elementor-kit-* button`, et son `:hover`)
   passait devant les règles d'origine et rendait deux pilules bleues. */
.arc-ob-dialog .arc-ob-dialog-actions .arc-ob-bouton-jaune,
.arc-ob-dialog .arc-ob-dialog-actions .arc-ob-bouton-texte {
	display: inline-block;
	border-radius: 8px;
	padding: 12px 26px;
	font-family: Roboto, sans-serif;
	font-size: 15px;
	font-weight: 600;
	line-height: 20px;
	text-transform: none;
	cursor: pointer;
	transition: background-color 0.2s, color 0.2s, border-color 0.2s;
}
.arc-ob-dialog .arc-ob-dialog-actions .arc-ob-bouton-jaune {
	background: #009fe3;
	color: #ffffff;
	border: 1px solid #009fe3;
}
.arc-ob-dialog .arc-ob-dialog-actions .arc-ob-bouton-jaune:hover,
.arc-ob-dialog .arc-ob-dialog-actions .arc-ob-bouton-jaune:focus-visible {
	background: #007fb8;
	border-color: #007fb8;
	color: #ffffff;
}
.arc-ob-dialog .arc-ob-dialog-actions .arc-ob-bouton-texte {
	background: #ffffff;
	color: #009fe3;
	border: 1px solid #009fe3;
}
.arc-ob-dialog .arc-ob-dialog-actions .arc-ob-bouton-texte:hover,
.arc-ob-dialog .arc-ob-dialog-actions .arc-ob-bouton-texte:focus-visible {
	background: #009fe3;
	color: #ffffff;
}

@media (max-width: 767px) {
	.arc-ob-cta-rangee {
		flex-direction: column;
	}

	.arc-ob-bouton-lien,
	.arc-ob-bouton-gris {
		text-align: center;
	}

	.arc-ob-piece-label {
		min-width: 0;
	}
}

/* === LOT R — tunnel étapes 4-5 (2026-09-23) =============================== */

/*
 * Ce que ce bloc couvre, et où trouver le reste :
 *
 *   R-2   la phrase d'explication sous chaque mode de paiement (étape 5) ;
 *   R-18  rien ici — le nouveau select « Pays » hérite du style générique des
 *         selects (§4.2) et de la largeur par défaut de sa grille, aucune
 *         règle dédiée n'est nécessaire ;
 *   R-27  rien de nouveau ici — `collectivite_nom` a rejoint les règles
 *         D15/D14 existantes du §16, par édition chirurgicale, pour ne pas
 *         dupliquer une logique de largeur/ordre déjà écrite ;
 *   R-28  la même règle « Adresse · CP · Ville » que D16 (§16.3), étendue aux
 *         trois autres adresses de l'étape 4 (bien loué, facturation
 *         collectivité, syndic) ;
 *   R-29  sous 1025 px (le même seuil qu'au §16, jamais un autre), l'adresse
 *         prend toute la largeur et CP + Ville passent sur la ligne
 *         suivante, pour les QUATRE adresses de l'étape 4.
 *
 * Q3 (ordre Fonction · Téléphone · E-mail) et R-5 (boutons + titre de
 * l'étape 5 + cases de consentement 50/50) sont des éditions chirurgicales
 * des §16 et §17 ci-dessus : rien de nouveau à ajouter ici pour elles.
 */

/* --- R-2 : la phrase d'explication sous chaque mode de paiement ----------- */

/*
 * Le TEXTE vient du plugin (`ARC_Demandes_Tunnel::modes_paiement_disponibles()`,
 * clé `aide`), lu et posé dans le libellé de l'option par
 * `exports/fix-R-etapes-4-5.php` — ce fichier ne fait que le STYLER.
 *
 * ⚠️ L'ENVELOPPE EST OBLIGATOIRE, MÊME MOTIF QU'AU §17 (E6, LES CGV).
 * JetFormBuilder pose `display: flex` sur le `<span>` qu'il génère lui-même
 * autour du libellé d'une option radio (`.checkradio-wrap span`, posé dans le
 * CSS du plugin). Sans enveloppe, le texte du libellé, le `<br>` et le
 * `<small>` de l'aide deviendraient chacun un élément flexible séparé, rangés
 * en ligne au lieu de se lire l'un sous l'autre. `arc-tunnel-paiement-opt`
 * redevient un bloc ordinaire — un seul élément flexible — et le `<br>` à
 * l'intérieur retrouve son sens.
 */
.arc-tunnel .jet-form-builder-page[data-page="5"] .jet-form-builder__field-label .arc-tunnel-paiement-opt {
	display: block;
}

.arc-tunnel .jet-form-builder-page[data-page="5"] .arc-tunnel-paiement-aide {
	display: block;
	margin-top: 4px;
	font-family: var(--arc-ui);
	font-size: var(--arc-t-petit);
	font-weight: 400;
	color: var(--arc-texte-doux);
}

/* --- R-28 / R-29 : les trois autres adresses de l'étape 4 ----------------- */

/*
 * Même construction qu'au §16 pour l'adresse de la copropriété : à partir de
 * 1025 px, les blocs conditionnels du bien loué, de la facturation
 * « collectivité » et des coordonnées du syndic passent d'une grille à DEUX
 * colonnes (§4, le défaut de tout bloc conditionnel) à une grille à DOUZE,
 * pour recevoir le même partage 6 + 2 + 4 que D16. Tout ce qui n'est pas
 * explicitement placé reprend six sur douze — la moitié d'aujourd'hui — donc
 * cette bascule ne change RIEN aux champs qu'on ne cite pas (téléphone, email
 * du syndic, référence de commande…).
 *
 * Sélecteurs à quatre-cinq classes/attributs : ils battent le §4 générique
 * (`.arc-tunnel .jet-form-builder__conditional:not([style*="none"])`, deux
 * classes) sans `!important`, même raisonnement qu'au §16.1.
 */
@media (min-width: 1025px) {

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) {
		grid-template-columns: repeat(12, minmax(0, 1fr));
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) > *,
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) > *,
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) > * {
		grid-column: span 6;
	}

	/* Le titre de chaque bloc reprend la ligne entière — le §4 générique le
	   fait déjà pour les `heading-field`, mais avec deux classes seulement :
	   le défaut `span 6` ci-dessus, qui en compte plus, passerait devant. */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) > .field-type-heading-field,
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) > .field-type-heading-field {
		grid-column: 1 / -1;
	}

	/* R-28 — Adresse · Code postal · Ville (6 + 2 + 4), comme D16. */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="bien_adresse"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_adresse"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_adresse"]) {
		grid-column: span 6;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="bien_code_postal"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_code_postal"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_code_postal"]) {
		grid-column: span 2;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="bien_ville"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_ville"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_ville"]) {
		grid-column: span 4;
	}
}

/*
 * R-29 — sous 1025 px : « on retourne à la ligne ». MÊME SEUIL que le §16
 * (1025 px), jamais un autre — une rupture différente romprait la continuité
 * avec la grille à deux colonnes du §4, qui s'applique déjà en dessous.
 *
 * On force UNIQUEMENT la rangée de l'adresse en pleine largeur : Code postal
 * et Ville, eux, ne reçoivent AUCUNE règle — sans elle, ils retombent sur le
 * comportement par défaut de la grille à deux colonnes du §4 (ou des douze
 * colonnes ci-dessus, hors de portée sous 1025 px), qui les place déjà côte à
 * côte, à 50 % chacun, sur la rangée suivante. C'est exactly ce que demande
 * R-29 : la ligne entière pour l'adresse, puis CP + Ville groupés en dessous.
 *
 * Les quatre adresses de l'étape 4 (copropriété, bien loué, facturation
 * collectivité, syndic) sont traitées ensemble : c'est le même défaut, sur
 * les mêmes deux colonnes.
 */
@media (max-width: 1024px) {
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="adresse"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="bien_adresse"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_adresse"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_adresse"]) {
		grid-column: 1 / -1;
	}
}

/* === LOT R-3 — reset au changement de statut ==============================
 *
 * R-3 (ex Q-E4, DEBUG-SITE-FIXES.md) : « s'il change de statut il refait
 * tout le parcours ». `arc-tunnel.js` (fonction `afficherNoteReset()`, §5
 * quater) pose ce message juste sous les cartes de statut de l'étape 1
 * quand un statut DÉJÀ choisi est changé pour un autre — jamais au premier
 * choix, qui n'a encore rien à confirmer.
 *
 * Volontairement SANS encadré ni fond coloré, à la différence de
 * `.arc-adresse-verrouillee-note` (si présente ailleurs dans ce fichier),
 * qui signale une INTERDICTION permanente : ici on confirme une action
 * ponctuelle déjà faite, un texte assourdi suffit — même esprit que l'aide
 * posée sous chaque mode de paiement (R-2, `.arc-tunnel-paiement-aide`, §17
 * plus haut), dont cette règle reprend exactement les trois propriétés.
 */
.arc-tunnel-reset-note {
	margin-top: 12px;
	font-family: var(--arc-ui);
	font-size: var(--arc-t-petit);
	font-weight: 400;
	color: var(--arc-texte-doux);
}

/* === LOTS N+P — profil & consultations (réappliqué 2026-09-23, Phase 3) === */

/*
 * P5 — masque ENTIÈREMENT le bloc « Nombre de consultations » (titre inclus)
 * pour les statuts Individuel et Collectivités. Classe posée sur <body> par
 * arc-espace-NP.php (filtre body_class), ciblant la classe qu'Elementor pose
 * lui-même sur le conteneur d'après son ID (`ccolnb`, onglet « Mes
 * consultations » / 26077) : aucune édition du JSON Elementor nécessaire pour
 * ce masquage.
 */
body.arc-hide-consult-count .elementor-element-ccolnb {
	display: none !important;
}

/*
 * N9 — message de succès injecté par arc-profil.js dans le slot du shortcode
 * [arc_profil_notice] (widget `pnotice`, classe posée par
 * exports/apply-lot-NP-contenu.php). Le shortcode PHP pose déjà son propre
 * style inline sur la div qu'il génère : cette règle ne fait qu'assurer un
 * espacement cohérent quand le slot est vide (avant toute soumission).
 */
.arc-profil-notice-slot:empty {
	display: none;
}

/* N3 — signal visuel « champ modifiable » sur la ligne Mot de passe de la
   fiche lecture seule (listing « Profil (fiche) » / 26164, widget statique
   ajouté par exports/apply-lot-NP-contenu.php). */
.arc-profil-fiche-password {
	letter-spacing: 2px;
}

/* =========================================================================
 * LOT M — PRISE DE RENDEZ-VOUS
 * Onglet « Tableau de bord » (post résolu via arc_listing_id_for_tab
 * ('tableau-de-bord'), cf. arc-espace-M-rdv.php) : agenda semaine
 * (M6/M7/M8), quota (M10), lien "Réserver" à la charte. Page
 * « reservation-creneau » (résolue par slug) : validation (M11-M16), dont le
 * choix du mode de RDV et de la présence (règle ARC du 2026-10-01).
 * Charte : bleu #009FE3, marine #1B2A4A, titres Lora, texte Roboto — mêmes
 * jetons que le reste du site (cf. sections précédentes de ce fichier).
 * ========================================================================= */

/* --- Défaut Chrome constaté (vérif préprod) : les liens "Réserver" de
 * chaque créneau (widget Dynamic Link de la Listing "Créneau (carte)")
 * restent en rose #CC3366 (couleur "accent" du kit Elementor). Passage à la
 * charte ARC, hover marine. `!important` nécessaire : Elementor génère une
 * règle par widget (id auto), plus spécifique qu'un sélecteur générique. --- */
.jet-listing-dynamic-link__link {
	color: #009fe3 !important;
	border-color: #009fe3 !important;
	background-color: #009fe3 !important;
}
.jet-listing-dynamic-link__link:hover,
.jet-listing-dynamic-link__link:focus {
	color: #ffffff !important;
	border-color: #1b2a4a !important;
	background-color: #1b2a4a !important;
}
/* Si le widget n'est stylé qu'en texte (pas en bouton plein), la couleur de
 * texte seule doit aussi basculer au survol, sans fond marine plaqué sur du
 * texte nu : */
a.jet-listing-dynamic-link__link:not([class*="elementor-button"]) {
	background-color: transparent !important;
}

/* M4 — affichage progressif : service (toujours visible) -> agenda.
 * L'agenda montre TOUS les créneaux du service, quel que soit leur type (le
 * mode se choisit à la validation). `.elementor-element-{id}` = classe posée
 * par Elementor sur l'élément dont l'ID interne est {id} (template "Onglet -
 * Tableau de bord"). */
.elementor-element-rdvcal {
	display: none;
}
body.ec-has-service .elementor-element-rdvcal {
	display: block;
}

/* --- M10 : quota — masque tout le module (titre + service + agenda)
 * quand le statut d'adhésion n'inclut pas la prise de RDV en ligne (cap=0).
 * `f928e91` = le widget icon-box qui porte le titre "Réservez un
 * rendez-vous" + l'invitation de service, en préprod. Le bandeau
 * [arc_rdv_quota_banner] (widget "rdvquota"), lui, reste visible : c'est lui
 * qui explique pourquoi. */
body.ec-rdv-quota-hidden .elementor-element-f928e91,
body.ec-rdv-quota-hidden .elementor-element-svcrow,
body.ec-rdv-quota-hidden .elementor-element-rdvcal {
	display: none !important;
}
.arc-quota-banner {
	margin: 12px 0 20px;
	padding: 12px 16px;
	border-radius: 10px;
	font-size: 0.9375rem;
	line-height: 1.45;
}
.arc-quota-banner--masque,
.arc-quota-banner--atteint {
	background: #fdeceb;
	border-left: 3px solid #c0392b;
	color: #1d1d1d;
}
.arc-quota-banner--restant {
	background: #eaf7f0;
	border-left: 3px solid #2e9e5b;
	color: #1d1d1d;
}
.arc-quota-banner a {
	color: #007095;
	font-weight: 600;
}

/* --- M7 : en-tête agenda "< Mois Année >" centré, flèches de part et
 * d'autre (structure DOM native JetEngine : nom du mois, puis flèche
 * précédente, puis flèche suivante — réordonnées ici en CSS via `order`,
 * sans toucher au widget ni au JS de pagination Ajax déjà fourni par
 * JetEngine).
 * ⚠️ `!important` obligatoire : JetEngine embarque déjà ses propres règles
 * d'ordre par défaut sur ces mêmes classes (frontend.css) —
 * `.jet-calendar-nav__link.nav-link-prev{order:1}` et
 * `.jet-calendar-nav__link.nav-link-next{order:3}` — non annulées par la
 * seule spécificité (constaté en réel : flèches restées groupées à gauche,
 * mois isolé à droite malgré un sélecteur plus spécifique). Même cause que
 * les autres `!important` de ce fichier contre le CSS généré par
 * Elementor/JetEngine. --- */
.elementor-element-rdvcal .jet-calendar-caption__wrap {
	display: flex !important;
	align-items: center !important;
	justify-content: center !important;
	gap: 20px !important;
}
.elementor-element-rdvcal .jet-calendar-caption__name {
	order: 0 !important;
	text-align: center !important;
}
.elementor-element-rdvcal .jet-calendar-nav__link.nav-link-prev {
	order: -1 !important;
}
.elementor-element-rdvcal .jet-calendar-nav__link.nav-link-next {
	order: 1 !important;
}

/* --- M8 : flèches plus grandes, dans un rond (lecture senior). --- */
.elementor-element-rdvcal .jet-calendar-nav__link {
	width: 44px;
	height: 44px;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: 50%;
	background: #f5f8fb;
	border: 1px solid #e4ebf2;
	cursor: pointer;
}
.elementor-element-rdvcal .jet-calendar-nav__link svg {
	width: 14px;
	height: 14px;
	fill: #1b2a4a;
}
.elementor-element-rdvcal .jet-calendar-nav__link:hover {
	background: #009fe3;
	border-color: #009fe3;
}
.elementor-element-rdvcal .jet-calendar-nav__link:hover svg {
	fill: #ffffff;
}

/* --- M6 : agenda lundi -> vendredi uniquement.
 * `start_of_week` du site = lundi (option WP `start_of_week` = 1), donc les
 * 7 colonnes du calendrier JetEngine sont dans l'ordre Lun,Mar,Mer,Jeu,Ven,
 * Sam,Dim — colonnes 6 et 7 = week-end. Pas de réglage natif "masquer le
 * week-end" côté widget (vérifié dans le code du module Calendar de
 * JetEngine) : la solution la plus simple, cohérente avec le reste du
 * projet ("pas de JS pour ce genre d'état"), est de masquer ces deux
 * colonnes en CSS. ⚠️ Ne retire PAS les créneaux du week-end des données :
 * si le CRM en crée un, il devient simplement invisible ici (cf. rapport). */
.elementor-element-rdvcal .jet-calendar-header__week-day:nth-child(6),
.elementor-element-rdvcal .jet-calendar-header__week-day:nth-child(7),
.elementor-element-rdvcal .jet-calendar-week__day:nth-child(6),
.elementor-element-rdvcal .jet-calendar-week__day:nth-child(7) {
	display: none;
}

/* =========================================================================
 * M11-M16 — Page "reservation-creneau" (étape de validation du RDV).
 * Body class `arc-rdv-validation` posée par arc-espace-M-rdv.php.
 * ========================================================================= */

/* M11 — la sidebar "Mon compte" réutilise TEL QUEL le style de la section
 * "ESPACE MEMBRE — Sidebar du compte" plus haut dans ce fichier (règles
 * `.woocommerce-account .woocommerce-MyAccount-*`) : `arc-espace-M-rdv.php`
 * pose `woocommerce-account` sur <body> pour cette page précisément afin de
 * les activer. Rien à ajouter ici pour la sidebar elle-même. */

/* M12 — bandeau "Vous réservez un rendez-vous" (Listing "Créneau (bandeau
 * réservation)", fond marine #1B2A4A) : titre en Lora, cohérent avec le
 * reste de "Mon compte". Valeur en dur (pas de var(--arc-titre) ici : cette
 * variable est scopée aux seuls conteneurs .arc-tunnel* de l'adhésion,
 * volontairement — cf. commentaire "JETONS" plus haut dans ce fichier).
 * ⚠️ AUDIT 26/09 : `.elementor-element-btitre` (le <div> wrapper) ne suffit
 * pas — le texte n'y est pas, il est dans l'enfant `.elementor-heading-title`
 * (h1, ici, cf. `title_size` du widget), qui a SA PROPRE règle de police
 * posée par le kit Elementor global (post-14097.css, typo "primary") :
 * `h1{font-family:"Roboto",Sans-serif;...}` — un sélecteur d'ÉLÉMENT NU, de
 * spécificité quasi nulle, mais qui bat quand même n'importe quelle valeur
 * seulement HÉRITÉE d'un ancêtre (une règle directe sur l'élément gagne
 * toujours sur l'héritage, indépendamment de la spécificité). Il faut donc
 * cibler `.elementor-heading-title` lui-même, pas seulement son parent. */
body.arc-rdv-validation .elementor-element-btitre .elementor-heading-title {
	font-family: Lora, Georgia, "Times New Roman", serif !important;
}

/* M13 — "Thème de l'entretien" et "Motif / précisions" en gras.
 * Seuls champs de ce formulaire à porter un label visible : cibler toutes
 * les `.jet-form-builder__label-text` de la page suffit, sans sur-qualifier
 * par un nom de champ qui pourrait changer. */
body.arc-rdv-validation .jet-form-builder__label-text {
	font-weight: 700;
}

/* M14 — phrase d'aide ("Décrivez brièvement votre question...") en italique.
 * Seul le champ "Motif / précisions" porte une description sur ce
 * formulaire : `.jet-form-builder__desc` suffit à la cibler. */
body.arc-rdv-validation .jet-form-builder__desc {
	font-style: italic;
	color: #5b6b85;
}

/* M15 — CTA "Confirmez la réservation" à la charte : plus de contour ni de
 * rollover rouge (état par défaut du skin JetFormBuilder/Elementor). */
body.arc-rdv-validation .jet-form-builder__submit {
	background-color: #009fe3 !important;
	border: none !important;
	outline: none !important;
	color: #ffffff !important;
	border-radius: 13px !important;
	font-family: Roboto, "Open Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
	font-weight: 600;
	transition: background-color 0.15s ease;
}
body.arc-rdv-validation .jet-form-builder__submit:hover,
body.arc-rdv-validation .jet-form-builder__submit:focus,
body.arc-rdv-validation .jet-form-builder__submit:active {
	background-color: #007095 !important;
	border-color: transparent !important;
	outline: none !important;
	box-shadow: none !important;
}

/* M16 — message d'erreur de réservation : le numéro doit rester lisible et
 * cliquable (lien tel: posé côté PHP, cf. arc-crm.php). Le conteneur
 * d'erreur JetFormBuilder (`.jet-form-builder-message--error` /
 * `.jet-form-builder__response-message`, selon version) n'échappe pas les
 * liens de son propre message serveur ; on s'assure juste qu'ils restent
 * visibles à la charte plutôt que dans le rouge d'erreur par défaut. */
body.arc-rdv-validation .jet-form-builder-message--error a,
body.arc-rdv-validation .jet-form-builder__response-message a {
	color: inherit;
	font-weight: 700;
	text-decoration: underline;
}

/* === RDV — CHOIX DU MODE À LA VALIDATION ===================================
 *
 * Règle ARC du 2026-10-01 : le type d'un créneau dans le CRM n'a plus de sens,
 * c'est l'adhérent qui choisit Physique / Téléphone / Visio dans le
 * formulaire de réservation. Champ radio NATIF JetFormBuilder `mode`
 * (classe de champ `ec-rdv-mode`, posée par exports/apply-rdv-mode-presence.php),
 * obligatoire, aucune option pré-cochée. Rendu en cartes cliquables en CSS
 * pur — aucun JS.
 *
 * Balisage JFB (même rappel que l'étape 1 du tunnel, plus haut) :
 *   .jet-form-builder-row.field-type-radio-field
 *     .jet-form-builder__fields-group
 *       .jet-form-builder__field-wrap.checkradio-wrap
 *         label.jet-form-builder__field-label.for-radio   ← LA CARTE
 *           input.ec-rdv-mode[value="Meeting|rdvtel|PhoneIn"]
 *           span                                          ← l'intitulé
 * Le vrai <input> reste dans le DOM (masqué visuellement par JFB) : clavier,
 * lecteurs d'écran et validation `required` natifs sont conservés.
 * ========================================================================= */

/* Pictos en SVG (CSS mask, couleur = currentColor) : aucun emoji, aucune
   police d'icônes. Physique = PERSONNAGE (silhouette), demande ARC. */
body.arc-rdv-validation {
	--ec-picto-physique: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='7' r='4.2'/%3E%3Cpath d='M3.5 21.5c0-4.7 3.8-8.3 8.5-8.3s8.5 3.6 8.5 8.3z'/%3E%3C/svg%3E");
	--ec-picto-telephone: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6.6 10.8a15.1 15.1 0 0 0 6.6 6.6l2.2-2.2c.3-.3.7-.4 1-.2 1.1.4 2.3.6 3.6.6.6 0 1 .4 1 1V20c0 .6-.4 1-1 1C10.6 21 3 13.4 3 4c0-.6.4-1 1-1h3.5c.6 0 1 .4 1 1 0 1.3.2 2.5.6 3.6.1.3 0 .7-.2 1z'/%3E%3C/svg%3E");
	--ec-picto-visio: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M3.5 6h11a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-11a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2zm14.5 4.2 4.5-2.7v9l-4.5-2.7z'/%3E%3C/svg%3E");
}

body.arc-rdv-validation .jet-form-builder .jet-form-builder-row .jet-form-builder__fields-group:has(.ec-rdv-mode) {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 12px;
	max-width: 620px;
}

body.arc-rdv-validation .jet-form-builder__field-wrap:has(.ec-rdv-mode) {
	display: flex;
	margin: 0;
}

body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode) {
	position: relative;
	display: flex;
	flex: 1;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 10px;
	margin: 0;
	padding: 18px 12px;
	border: 1px solid #e4ebf2;
	border-radius: 13px;
	background: #f5f8fb;
	color: #1b2a4a;
	font-family: Roboto, "Open Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
	font-weight: 600;
	text-align: center;
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
}

/* Le picto de la carte. */
body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode)::before {
	content: "";
	display: block;
	width: 34px;
	height: 34px;
	background-color: currentColor;
	-webkit-mask: var(--ec-picto-physique) center / contain no-repeat;
	mask: var(--ec-picto-physique) center / contain no-repeat;
}
body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode[value="rdvtel"])::before {
	-webkit-mask-image: var(--ec-picto-telephone);
	mask-image: var(--ec-picto-telephone);
}
body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode[value="PhoneIn"])::before {
	-webkit-mask-image: var(--ec-picto-visio);
	mask-image: var(--ec-picto-visio);
}

/* Le faux rond de JFB n'a pas de sens sur une carte : l'état se lit sur la
   carte entière. `!important` subi, même raison que pour les cartes du
   tunnel (JFB pose `content: "" !important` sur ce pseudo-élément). */
body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode) > span::before,
body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode) > span::after {
	content: none !important;
}

body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode):hover {
	background: #e6f4fc;
	border-color: #60cdfc;
	color: #007fb8;
}
body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode:checked) {
	background: #009fe3;
	border-color: #009fe3;
	color: #ffffff;
	box-shadow: 0 2px 6px rgba(0, 159, 227, 0.35);
}
body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode:focus-visible) {
	outline: 2px solid #1b2a4a;
	outline-offset: 2px;
}

/* Mobile : trois cartes côte à côte deviennent illisibles sous ~480 px ->
   une carte par ligne, picto à gauche de l'intitulé. */
@media (max-width: 480px) {
	body.arc-rdv-validation .jet-form-builder .jet-form-builder-row .jet-form-builder__fields-group:has(.ec-rdv-mode) {
		grid-template-columns: 1fr;
	}
	body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode) {
		flex-direction: row;
		justify-content: flex-start;
		padding: 14px 16px;
	}
	body.arc-rdv-validation .jet-form-builder__field-label:has(> .ec-rdv-mode)::before {
		width: 26px;
		height: 26px;
	}
}

/* === RDV — PRÉSENCE À CE RENDEZ-VOUS =======================================
 *
 * Radio natif JFB `presence` (classe `ec-rdv-presence`) + bloc conditionnel
 * natif JFB (représentant : nom, prénom, fonction, téléphone, email — classe
 * `ec-rdv-rep` sur chaque champ). Le bloc n'est dans le DOM que si
 * « Je serai représenté par » est coché (géré par JFB, aucun JS maison).
 * ========================================================================= */

body.arc-rdv-validation .jet-form-builder .jet-form-builder-row .jet-form-builder__fields-group:has(.ec-rdv-presence) {
	display: flex;
	flex-wrap: wrap;
	gap: 10px 24px;
}

/* Représentant : deux colonnes sur grand écran, une seule sous 640 px. */
body.arc-rdv-validation .jet-form-builder-row:has(.ec-rdv-rep) {
	flex: 0 0 calc(50% - 6px);
	min-width: 0;
	display: block;
}
body.arc-rdv-validation .jet-form-builder-row:has(.ec-rdv-rep) > .jet-form-builder__label,
body.arc-rdv-validation .jet-form-builder-row:has(.ec-rdv-rep) > .jet-form-builder__field-wrap {
	width: 100%;
	max-width: 100%;
}
body.arc-rdv-validation .jet-form-builder-row:has(.ec-rdv-rep) .jet-form-builder__field {
	width: 100%;
	box-sizing: border-box;
}
body.arc-rdv-validation .jet-form-builder__conditional:has(.ec-rdv-rep) {
	display: flex;
	flex-wrap: wrap;
	gap: 0 12px;
	padding: 14px 16px 2px;
	border-left: 3px solid #009fe3;
	border-radius: 6px;
	background: #f5f8fb;
}
@media (max-width: 640px) {
	body.arc-rdv-validation .jet-form-builder-row:has(.ec-rdv-rep) {
		flex: 0 0 100%;
	}
}

/* === LOT O-a — ma copro : fiche & membres === */

/* O7 — pictos crayon (zone modifiable) / cadenas (zone verrouillée), en SVG
   inline (widgets "html" posés dans arc-crm.php côté fiche copro / bouton
   d'ajout). Pas de police d'icônes : gabarit constant quel que soit le thème
   d'icônes installé/désinstallé côté Elementor. */
.arc-icon-verrouille,
.arc-icon-modifiable {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 12px;
	font-weight: 600;
	line-height: 1.3;
}
.arc-icon-verrouille {
	color: #5b6b85;
	margin-bottom: 6px;
}
.arc-icon-verrouille svg {
	flex: 0 0 auto;
	color: #5b6b85;
}
.arc-icon-modifiable {
	color: #1077b3;
}
.arc-icon-modifiable svg {
	flex: 0 0 auto;
	color: #1077b3;
}

/* O12/Q3 — formulaire "Ajouter un membre" en 3 lignes de 2 champs.
   ⚠️ Pas de `order:` : l'ordre visuel EST l'ordre du DOM, posé une fois pour
   toutes dans le contenu du formulaire (arc-crm.php n'y touche pas). Cette
   règle ne fait que réduire la largeur de 6 rangées nommées, en s'appuyant
   sur le même sélecteur `:has()` que le reste du projet (cf. arc-tunnel).
   Le conteneur `#arc-ajouter-membre` est déjà en `flex-wrap: wrap` (réglage
   Elementor du conteneur) : deux rangées à ~50% se placent donc côte à côte
   naturellement, sans changer l'ordre d'affichage. */
#arc-ajouter-membre .jet-form-builder-row:has([name="arc_civilite"]),
#arc-ajouter-membre .jet-form-builder-row:has([name="arc_fonction_copro"]),
#arc-ajouter-membre .jet-form-builder-row:has([name="last_name"]),
#arc-ajouter-membre .jet-form-builder-row:has([name="first_name"]),
#arc-ajouter-membre .jet-form-builder-row:has([name="user_email"]),
#arc-ajouter-membre .jet-form-builder-row:has([name="arc_telephone"]) {
	flex: 0 0 calc(50% - 6px);
}
@media (max-width: 640px) {
	/* Sous 640px, une colonne unique : la moitié de largeur devient illisible
	   pour un champ email ou un numéro de téléphone complet. */
	#arc-ajouter-membre .jet-form-builder-row:has([name="arc_civilite"]),
	#arc-ajouter-membre .jet-form-builder-row:has([name="arc_fonction_copro"]),
	#arc-ajouter-membre .jet-form-builder-row:has([name="last_name"]),
	#arc-ajouter-membre .jet-form-builder-row:has([name="first_name"]),
	#arc-ajouter-membre .jet-form-builder-row:has([name="user_email"]),
	#arc-ajouter-membre .jet-form-builder-row:has([name="arc_telephone"]) {
		flex: 0 0 100%;
	}
}

/* O10 — colonne "Fonction" dans la grille des membres : aucune règle propre
   nécessaire, la cellule réutilise le même style texte que les autres
   colonnes (field_color / typography posés directement sur le widget
   Elementor du listing "Membre (ligne)", cf. mf4/mc4). */


/* O-a — correctif visibilité (2026-09-23) : un membre (non RS) ne doit voir
   ni le bouton d'ajout, ni le panneau replié, ni les liens "Supprimer" de la
   grille. Classe posée sur <body> par arc-espace-O-membres.php (même pattern
   que `arc-profil-edition-active` déjà en place pour l'onglet Mon profil).
   Refus SERVEUR déjà en place indépendamment (arc_user_is_rs() vérifié dans
   le hook d'ajout et dans arc_membre_deletable_target() pour la suppression)
   : ceci n'est que le masquage, pas la seule protection. */
body.arc-viewer-membre .elementor-element-maddbtn,
body.arc-viewer-membre #arc-ajouter-membre,
body.arc-viewer-membre .elementor-element-mf5,
body.arc-viewer-membre .elementor-element-mf5e,
body.arc-viewer-membre #arc-copro-actions {
	display: none !important;
}

/* === REPASSE 25/09 — B · footer === */

/* B — doc client 25/09 : bloc "Besoin d'information" du footer, hauteur
   500px pour mieux voir l'image en background. Le footer ne porte aucun
   widget titré littéralement "Besoin d'information" : le seul bloc qui
   combine une image de fond (footer.svg) et un titre "Besoin d'aide ?" est
   le conteneur Elementor "Bloc Gauche" (template Footer, post 15220,
   élément 5a49ad3) — c'est la cible retenue.
   Réglage posé côté Elementor par exports/fix-repasse-B-footer.php
   (min_height desktop -> 500px, cascade en tablette/mobile faute
   d'arbitrage du doc sur le mobile). Règle CSS ci-dessous = filet de
   sécurité si le cache Elementor (post-15220.css) sert une version
   antérieure à la prochaine régénération. Sélecteur scopé au template
   Footer (.elementor-15220), même convention que la règle "élémentor
   26074 / elementor-element-svcN" déjà en place plus haut dans ce
   fichier. */
.elementor-15220 .elementor-element.elementor-element-5a49ad3 {
	min-height: 500px;
}

/* === REPASSE 25/09 — A · étape 1 ===========================================
 *
 * Document client « Repasse sur le debug parcours adhésion » (25/09),
 * consignes 1, 3 et 4, toutes sur l'étape 1 du tunnel (choix du contrat,
 * champ `type_copro`, §5/§13 plus haut dans ce fichier).
 *
 * La consigne 2 (libellés au singulier) est un changement de CONTENU : posée
 * par `exports/fix-repasse-A-etape1.php` dans le `post_content` du
 * formulaire JFB (26403), pas ici — à l'exception du sous-titre réduit
 * ci-dessous, que ce même script introduit dans le libellé de
 * « Syndic Bénévole » (`<span class="arc-statut-sous-titre">`).
 */

/*
 * Consigne 1 — « toutes les polices en Lora, sans-serif » sur les cartes de
 * statut. Le §13 pose déjà `font-family: var(--arc-titre)` sur le TITRE de
 * chaque carte (lot A5/A11), mais `--arc-titre` retombe sur une chasse
 * SERIF (`Lora, Georgia, "Times New Roman", serif`, §1) si Lora ne charge
 * pas — un repli voulu pour les TITRES du reste du site, pas ce que cette
 * consigne demande ICI. On ne touche donc pas `--arc-titre` (variable
 * globale, tout le site l'utilise) : une déclaration scopée aux cartes de
 * l'étape 1, avec un repli SANS-SERIF, plus loin dans le fichier que le
 * §13 — elle l'emporte par ordre d'apparition, à spécificité égale, sans
 * `!important`.
 *
 * Une seule règle suffit pour « toutes les polices » de la carte : ni le
 * bandeau « Démarrer » (::after, §5.1), ni le sous-titre « (non
 * professionnel) » (.arc-statut-sous-titre, juste en dessous) n'ont de
 * `font-family` à eux — ils HÉRITENT donc de cette déclaration, posée sur
 * l'élément qui les contient tous les deux.
 */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte),
.arc-tunnel-carte:not(input) {
	font-family: "Lora", sans-serif;
}

/*
 * Consigne 2 (partie CSS) — le sous-titre « (non professionnel) » du
 * libellé Syndic Bénévole descend à 20px (le corps de la carte reste à
 * 24px, §13). Sélecteur descendant : plus spécifique que le `font-size:
 * 24px` du §13 (0-2-1 contre 0-1-1 : le `:not()` de `.arc-tunnel-carte`
 * compte pour un sélecteur de type), il gagne quel que soit l'ordre
 * d'apparition dans le fichier. Le `<br>` qui précède ce span dans le
 * libellé (posé par `exports/fix-repasse-A-etape1.php`) suffit au saut de
 * ligne — rien à faire ici pour « à la ligne ».
 */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte) .arc-statut-sous-titre,
.arc-tunnel-carte:not(input) .arc-statut-sous-titre {
	font-size: 20px;
}

/*
 * Consigne 3 — le message de réinitialisation (R-3, `.arc-tunnel-reset-note`,
 * section « LOT R-3 » plus haut) change de PLACE (`arc-tunnel.js`,
 * `afficherNoteReset()`, §5 quater — il est désormais inséré juste après le
 * titre « Choisissez votre contrat », avant la grille de cartes, plutôt
 * qu'après elle) et d'APPARENCE : fond `#F5EAD5`, texte noir, gras. La
 * section « LOT R-3 » le voulait volontairement sobre (« sans encadré ni
 * fond coloré ») parce qu'il vivait sous les cartes, en confirmation
 * discrète d'une action déjà faite ; remonté sous le titre, la consigne du
 * client en fait au contraire une alerte à voir AVANT de recliquer une
 * carte — d'où l'encadré.
 *
 * Redéclaré ici plutôt que réécrit dans la section « LOT R-3 » : cette
 * règle vient PLUS LOIN dans le fichier, à spécificité égale (même
 * sélecteur, une seule classe) — elle l'emporte par ordre d'apparition,
 * sans `!important`.
 *
 * Padding et rayon : non demandés mot pour mot par la consigne, mais un
 * `background` sans respiration collerait au texte et ne se lirait pas
 * comme un « fond » — repris du rayon standard du tunnel (`--arc-rayon`,
 * déjà utilisé sur les boutons et les champs, §1) pour rester cohérent.
 * Centré : il se pose désormais sous un titre centré (§13), un texte calé à
 * gauche jurerait avec lui.
 */
.arc-tunnel-reset-note {
	margin: 0 0 clamp(18px, 2.3vw, 40px);
	padding: 10px 16px;
	border-radius: var(--arc-rayon);
	background: #F5EAD5;
	color: #000;
	font-weight: 700;
	text-align: center;
}

/*
 * Consigne 4 — sous 782px (rupture §9.2, la même que le reste du tunnel à
 * cette largeur), le bandeau « Démarrer » (::after, §5.1) grandit de 10% :
 * le texte comme sa zone tactile.
 *
 * `--arc-t-bouton` (`clamp(0.9375rem, 1.16vw, 1.25rem)`) et le `min-height`
 * du bandeau (`clamp(44px, 3.94vw, 68px)`) retombent tous les deux sur leur
 * PLANCHER sous 782px (1.16vw et 3.94vw y valent moins que le minimum du
 * clamp) : 15px et 44px. +10 % : 16,5px et 48,4px — valeurs figées ici, pas
 * en `clamp()`, puisque c'est tout l'écran mobile qui est visé, pas une
 * plage à faire varier.
 *
 * Aucun padding horizontal n'existait sur ce bandeau avant cette repasse
 * (il se centre en `flex` sur toute la largeur de la carte, §5.1) : la
 * consigne parle de « police et padding ». Faute d'un padding existant à
 * élargir, le choix le plus simple — et le plus proche de l'intention
 * (agrandir la cible tactile) — est d'augmenter de 10% la hauteur du
 * bandeau (son seul espacement réel) en même temps que le texte, plutôt que
 * d'inventer un padding horizontal sans équivalent desktop.
 */
@media (max-width: 782px) {
	.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte)::after,
	.arc-tunnel-carte:not(input)::after {
		min-height: 48.4px;
		font-size: 16.5px;
	}
}

/* === REPASSE 25/09 — C2 · boutons & montant fixe === */

/*
 * C2.1 — MONTANT FIXE (individuel, bailleur, collectivité).
 *
 * Tout l'essentiel (masquer la saisie du nombre de lots, masquer le bouton
 * « Calculer », afficher montant + détail) est DÉJÀ couvert par les règles
 * `.arc-tunnel--js .arc-tunnel-cotisation--calcule …` posées plus haut dans
 * cette feuille (§ « CE QUE MASQUE/RÉVÈLE LE CALCUL ») : `arc-tunnel.js` pose
 * cette même classe `--calcule` pour un statut à tarif fixe, exactement comme
 * pour un calcul par barème (voir `appliquerModeUnique()`, arc-tunnel.js §3).
 *
 * La SEULE différence à coder ici : pour ces statuts, il n'y a rien à
 * « modifier » — le nombre de lots n'entre pas dans le prix — donc le picto
 * réinitialiser (`.arc-tunnel-cotisation__actions`, normalement révélé par
 * `--calcule`) doit rester masqué. `arc-tunnel.js` pose alors une SECONDE
 * classe, `--unique`, en plus de `--calcule` (jamais à sa place) : le
 * sélecteur ci-dessous combine les deux SUR LE MÊME élément pour battre, par
 * spécificité (quatre classes contre trois), la règle qui révèle
 * `__actions` — sans dépendre de l'ordre des règles dans le fichier.
 */
.arc-tunnel--js .arc-tunnel-cotisation--calcule.arc-tunnel-cotisation--unique .arc-tunnel-cotisation__actions {
	display: none;
}

/*
 * C2.2 — BOUTONS PRÉCÉDENT / SUIVANT GRIS TANT QUE L'ÉTAPE N'EST PAS VALIDE.
 *
 * « Suivant » réutilise le verrou déjà en place plus haut dans cette feuille
 * (`[disabled]` / `[aria-disabled="true"]` / `.arc-tunnel-bouton--verrouille`
 * → fond `--arc-gris`) : `arc-tunnel.js` (`initValidationEtapes()`, §5
 * quinquies) pose ce même verrou sur TOUTES les étapes, plus seulement sur
 * l'étape 2. Rien à ajouter ici pour lui.
 *
 * « Précédent », lui, ne doit JAMAIS être verrouillé fonctionnellement —
 * revenir en arrière n'exige rien (choix documenté dans le JS). Il porte donc
 * une classe distincte, purement visuelle : `.arc-tunnel-bouton--attente`.
 * Même spécificité que la règle « Suivant » existante (cinq classes/attributs)
 * pour ne dépendre ni d'un `!important`, ni de l'ordre de la cascade.
 *
 * `cursor: pointer`, volontairement PAS `not-allowed` : contrairement à
 * « Suivant » verrouillé, ce bouton reste réellement cliquable — lui donner
 * un curseur d'interdiction mentirait sur son état.
 */
.arc-tunnel .jet-form-builder .jet-form-builder__next-page-wrap .jet-form-builder__prev-page.arc-tunnel-bouton--attente {
	background-color: var(--arc-gris);
	border-color: var(--arc-gris);
	color: #fff;
	cursor: pointer;
}

/*
 * C2.3 — MOBILE (< 782px).
 *
 *  · Les deux CTA « Compléter mon adhésion » (étape 2, sous le montant) et
 *    « Demande d'adhésion » (étape 3, sous les accordéons) sont le MÊME
 *    composant, marqué `[data-arc-tunnel="completer"]` (voir B7/C2,
 *    `initCtaCompleter()` dans arc-tunnel.js) : un seul sélecteur couvre les
 *    deux demandes du doc client (+20 % chacun). Agrandi en largeur ET en
 *    hauteur, pas seulement le texte — sinon le bouton grossirait sans que
 *    sa zone cliquable suive.
 *
 *  · Précédent/Suivant : AUCUNE règle de taille n'est ajoutée ici, par
 *    construction — `.arc-tunnel-bouton--attente` (C2.2) et le verrou
 *    existant (`[aria-disabled]`) ne posent que des couleurs. Leur taille
 *    mobile reste celle déjà fixée plus haut dans cette feuille
 *    (`min-height: 48px`, § requête média 782px) et ne bouge ni au survol, ni
 *    à l'état actif, ni au passage gris → bleu.
 *
 * `!important` : nécessaire ici, comme ailleurs dans cette feuille pour les
 * mêmes raisons (une requête média n'ajoute aucune spécificité) — cette
 * règle doit battre `.arc-tunnel .arc-tunnel-bouton` (§3) sans dépendre de
 * l'ordre des blocs `@media` dans le fichier.
 *
 * ┌──────────────────────────────────────────────────────────────────────┐
 * │ CORRECTIF DU 26/09 — AUDIT CHROMIUM RÉEL À 390 px                     │
 * └──────────────────────────────────────────────────────────────────────┘
 *
 * Audit Playwright (`exports/audit-2026-09-26/verdicts-local.json`,
 * IDs `E2_mobile_cta` et `E3_mobile_devis_cta`) : mesuré en Chromium réel,
 * pas seulement lu dans ce fichier.
 *
 *  · « Compléter mon adhésion » / « Demande d'adhésion » — la règle
 *    ci-dessus s'appliquait bel et bien (mobile : 18px / 52.8px = quinze
 *    et quarante-quatre pixels — le PLANCHER mobile de `--arc-t-bouton` et
 *    de ce `min-height` — × 1,2 exactement, confirmé par
 *    `getComputedStyle` à 390 px). L'audit l'avait comparée au DESKTOP
 *    fluide (`clamp()` à 1440 px, 16,704px / 48,4px) plutôt qu'au PLANCHER
 *    mobile — d'où un delta mesuré de « +8-9 % » qui ne contredit pas
 *    « base mobile × 1,2 », qui elle est bien respectée. Aucun changement
 *    nécessaire ici.
 *
 *  · « Demande de devis », en revanche, était un BUG RÉEL — confirmé
 *    exactement par l'hypothèse du coordinateur : ce CTA n'a PAS
 *    `[data-arc-tunnel="completer"]` — ce n'est pas le même composant que
 *    « Demande d'adhésion ». C'est un `<button>` texte souligné, distinct,
 *    ancré par `.arc-tunnel-avantages__devis` (§15.4 plus haut dans cette
 *    feuille : « Le bouton de devis a quitté l'étape 2 [...] »), qui pose
 *    `font-size: var(--arc-t-bouton)` SANS AUCUNE règle mobile — vérifié en
 *    Chromium réel à 390 px : 15px (le plancher de `--arc-t-bouton`, SANS
 *    le × 1,2), contre 16,704px à 1440px desktop. Plus petit sur mobile
 *    qu'en desktop, exactement le symptôme remonté.
 *
 *    `.arc-devis-declencheur` (le sélecteur que ciblait un brouillon
 *    antérieur de cette repasse) N'EST PAS la règle gagnante à l'intérieur
 *    du tunnel : `.arc-tunnel .arc-tunnel-avantages__devis` (§15.4) porte
 *    la MÊME spécificité (deux classes) mais vient PLUS LOIN dans le
 *    fichier, donc l'emporte par ordre d'apparition — vérifié par
 *    `getComputedStyle` (la valeur gagnante suit bien `--arc-t-bouton`,
 *    pas `--arc-t-corps` que porterait `.arc-devis-declencheur` seul).
 *    Ce CTA n'a ni `padding`, ni `border`, ni `min-height` (c'est un texte
 *    souligné nu, `padding:0`) : « agrandir de 20 % » n'a donc de sens que
 *    sur le `font-size`, qui entraîne sa hauteur avec lui via
 *    `line-height`.
 *
 * Étape 1 (« Démarrer », `::after` des cartes de statut, § plus haut) :
 * RE-VÉRIFIÉ en Chromium réel à 390px, AUCUN changement nécessaire — la
 * règle déjà posée par l'agent en charge de l'étape 1 donne exactement
 * 16,5px / 48,4px (15px et 44px, les planchers mobiles de `--arc-t-bouton`
 * et de ce bandeau, × 1,1 pile), confirmé par `getComputedStyle`. L'audit
 * l'avait lui aussi comparée au desktop fluide (16,704px) plutôt qu'au
 * plancher mobile — même malentendu de méthode que pour « Compléter mon
 * adhésion ». Repris ici (agent A n'y touche plus, par consigne du
 * coordinateur) uniquement pour mémoire : pas de diff sur cette règle.
 */
@media (max-width: 782px) {
	.arc-tunnel [data-arc-tunnel="completer"] {
		min-height: calc( clamp( 44px, 3.36vw, 58px ) * 1.2 ) !important;
		padding: 0 calc( clamp( 16px, 1.9vw, 33px ) * 1.2 ) !important;
		font-size: calc( var( --arc-t-bouton ) * 1.2 ) !important;
	}

	/*
	 * « Demande de devis » (étape 3) : même facteur ×1,2 que les deux CTA
	 * pleins ci-dessus, appliqué au SEUL `font-size` — pas de `padding` ni
	 * de `min-height` à agrandir sur un texte souligné nu (`padding:0`,
	 * `border:0`, `background:none`, § 15.4). La hauteur suit seule, via
	 * `line-height` (hérité, non touché).
	 *
	 * Les deux sélecteurs : `.arc-tunnel-avantages__devis` est la règle
	 * RÉELLEMENT gagnante à l'intérieur du tunnel (§15.4, vérifié en
	 * Chromium) ; `.arc-devis-declencheur` est repris en plus par
	 * robustesse (c'est le nom de classe stable côté PHP,
	 * `ARC_Demandes_Devis::CSS_DECLENCHEUR` — si `__devis` disparaissait
	 * un jour du balisage, cette règle continuerait de viser le bon
	 * élément par son autre classe).
	 */
	.arc-tunnel .arc-tunnel-avantages__devis,
	.arc-tunnel .arc-devis-declencheur {
		font-size: calc( var( --arc-t-bouton ) * 1.2 ) !important;
	}
}

/* === REPASSE 25/09 — D · étape 3 =========================================
 *
 *  Document client du 25/09 : titre dynamique en tête de l'étape 3, phrase
 *  d'introduction (visible pour 5 statuts sur 8), blocs « Présentation »
 *  retirés côté bénévole/coopératif (remplacés par la phrase commune) — voir
 *  exports/fix-repasse-D-etape3.php et arc-tunnel.js (section
 *  « REPASSE D · ÉTAPE 3 »).
 */

/*
 * D.1 — Titre « Les avantages que vous propose l'ARC pour votre contrat
 * {nom} ». Gras, italique, #007095 (= --arc-bleu-fonce, déjà déclarée au §4.1
 * — la teinte demandée par le client existe déjà comme jeton nommé, pas une
 * valeur ad hoc). Même repère que le §17.3 (E5) pour viser `__label-text`
 * DIRECTEMENT : Elementor pose sa typographie sur `__label`, `__label-text`
 * n'en hérite que — une règle directe l'emporte quelle que soit la
 * spécificité de la règle héritée.
 */
.arc-tunnel .arc-tunnel-etape3-titre .jet-form-builder__label-text {
	display: block;
	margin-bottom: clamp(10px, 1vw, 16px);
	font-family: var(--arc-titre);
	font-weight: 700;
	font-style: italic;
	color: var(--arc-bleu-fonce);
}

/* Le span rempli en JS (arcTunnelMajNomsContrat) hérite du même traitement,
   y compris si un style hérité du thème venait le repeindre entre-temps. */
.arc-tunnel .arc-tunnel-etape3-titre .arc-tunnel-contrat-nom {
	font-weight: 700;
	font-style: italic;
	color: var(--arc-bleu-fonce);
}

/*
 * D.2 — Phrase d'introduction : 20 px, noir. Valeur du document client, hors
 * de l'échelle --arc-t-* de la charte (§4.1) — volontairement, ce n'est pas
 * un oubli.
 */
.arc-tunnel .arc-tunnel-etape3-intro {
	margin: 0 0 clamp(14px, 1.2vw, 20px);
	font-family: var(--arc-ui);
	font-size: 20px;
	color: #000;
}

/* === REPASSE 25/09 — E · popup devis ======================================
 *
 *  Document client du 25/09, popup « Demande de devis » (formulaire
 *  JetFormBuilder #26400 local / #26403 préprod, monté dans la popup
 *  Elementor par `exports/apply-devis-popup.php`, retouchée ici par
 *  `exports/fix-repasse-E-devis.php` et `exports/fix-repasse-E-popup.php`) :
 *
 *   E1. Desktop : Civilité seule, Nom+Prénom sur une ligne, Email+Tel sur une
 *       ligne (50/50). L'ORDRE DES CHAMPS DANS LE DOM N'A PAS CHANGÉ — il
 *       était déjà Civilité, Nom, Prénom, Email, Téléphone (vérifié dans
 *       `fix-repasse-E-devis.php`, section « CE QUI NE CHANGE PAS »). Seule la
 *       MISE EN PAGE change, en CSS grid, même technique que le tunnel
 *       (§16.1, `.arc-tunnel .jet-form-builder-page[data-page="4"]`).
 *   E2. Champ Téléphone : obligatoire, 10 chiffres — HTML dans
 *       `fix-repasse-E-devis.php`, contrôle réel côté serveur dans
 *       `class-devis.php::etablir()`.
 *   E3. « Nombre de lots » : texte d'aide réécrit — `fix-repasse-E-devis.php`.
 *   E4. Mobile : bouton de fermeture de la popup — réglages Elementor dans
 *       `fix-repasse-E-popup.php` (position/taille/couleur responsives), et
 *       ci-dessous un filet de sécurité CSS pour le cas où ces réglages
 *       seraient absents, écrasés, ou le CSS généré par Elementor périmé.
 *   E5. CTA « demande d'adhésion » +20 % mobile : PAS TRAITÉ ICI. Ce CTA vit à
 *       l'étape 3 du tunnel (`[data-arc-tunnel="completer"]`), couvert par
 *       l'agent C2 juste au-dessus dans cette feuille (§ « C2.3 — MOBILE »).
 *       Si le document client visait un CTA DANS la popup de devis, il
 *       n'existe pas : la popup n'a qu'un bouton d'ENVOI de formulaire
 *       (« Recevoir mon devis »), pas de CTA « demande d'adhésion ».
 * ========================================================================= */

/*
 * E1 — DESKTOP (> 782 px), pour rester au-dessus de la rupture mobile déjà
 * en usage partout ailleurs dans cette feuille (voir §16 et la requête média
 * juste au-dessus, C2.3). En dessous, le formulaire reste empilé sur une
 * colonne : à 560 px de large (largeur de la popup, réglée dans
 * `_elementor_page_settings`) moins le rembourrage, une paire de champs sur
 * deux colonnes tomberait sous 240 px chacun — trop étroit sur un écran de
 * poche, et hors du périmètre demandé (le document client dit « desktop »).
 *
 * ⚠️ Cible le FORMULAIRE lui-même (`.jet-form-builder`), pas
 * `.jet-form-builder-page` : ce formulaire n'a qu'une seule page, JetFormBuilder
 * n'émet donc aucun conteneur `.jet-form-builder-page[data-page]` autour de ses
 * rangées (vérifié dans le HTML rendu, `curl` sur /adhesion/) — le formulaire
 * du tunnel en a un parce qu'il est paginé, celui-ci ne l'est pas.
 */
@media (min-width: 783px) {

	.arc-devis-modale-elementor .jet-form-builder {
		display: grid;
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: 0 clamp(14px, 2vw, 24px);
	}

	/*
	 * Par défaut, chaque rangée — et chaque champ caché, sans effet visuel —
	 * occupe toute la largeur. Sans cette règle, l'auto-placement de la grille
	 * apparierait Civilité avec Nom (les deux premières rangées), ce qui n'est
	 * pas ce que demande le document client.
	 *
	 * `min-width: 0` CASSE LE COMPORTEMENT PAR DÉFAUT DES ÉLÉMENTS DE GRILLE
	 * (`min-width: auto`) : sans lui, un élément de grille ne rétrécit jamais
	 * sous la largeur intrinsèque de son contenu, quelle que soit la taille de
	 * la piste qui l'accueille — piège CSS Grid classique. Constaté ici via
	 * Chrome (`scrollWidth` de la popup ≈ 3× son `clientWidth`) après mise en
	 * place de la grille E1.
	 */
	.arc-devis-modale-elementor .jet-form-builder > * {
		grid-column: 1 / -1;
		min-width: 0;
	}

	/*
	 * Les deux paires. Chacune tient sur DEUX rangées consécutives dans le
	 * DOM : la grille les pose donc naturellement côte à côte, sur la même
	 * ligne de grille, dès qu'elles passent à une seule colonne sur deux —
	 * aucun `order` n'est nécessaire ici, contrairement au tunnel (§16.2),
	 * puisque l'ordre du DOM est déjà le bon.
	 */
	.arc-devis-modale-elementor .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="devis_nom"]),
	.arc-devis-modale-elementor .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="devis_prenom"]),
	.arc-devis-modale-elementor .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="devis_email"]),
	.arc-devis-modale-elementor .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="devis_telephone"]) {
		grid-column: span 1;
	}
}

/*
 * ⚠️ CORRECTIF (vérification Chrome post-livraison, HORS media query E1 —
 * VOLONTAIREMENT) — LA VRAIE CAUSE DU DÉBORDEMENT N'ÉTAIT PAS LA GRILLE,
 * C'ÉTAIT CHAQUE RANGÉE PRISE SEULE, ET CE QUELLE QUE SOIT LA LARGEUR D'ÉCRAN.
 *
 * `.jet-form-builder-row` (CSS du plugin, non scopé) est
 * `display:flex; flex-direction:column; flex-wrap:wrap;` SANS hauteur
 * explicite. Un conteneur flex en colonne + wrap + hauteur `auto` est un
 * piège Chrome connu : faute de contrainte de hauteur pour décider où
 * « retourner à la ligne », le navigateur fait passer le DEUXIÈME enfant
 * (`.jet-form-builder__field-wrap`, donc le `<select>`/`<input>`/
 * `<textarea>`) sur une SECONDE COLONNE, à côté du premier
 * (`.jet-form-builder__label`) au lieu de dessous — chaque rangée affichait
 * donc sa légende ET son champ côte à côte, chacun aussi large que la rangée
 * entière, doublant (ou triplant, cas de « Nombre de lots ») sa largeur
 * réelle. Vérifié rangée par rangée dans Chrome : `scrollWidth` de CHAQUE
 * rangée valait 2× à 3× sa largeur affectée — CE DÉFAUT NE VIENT PAS DE LA
 * GRILLE E1 (il existait avant elle, y compris en pleine largeur sur une
 * seule colonne) : c'est pourquoi cette règle est posée SANS media query,
 * pas seulement `> 782px` — sans elle, Civilité/Adresse/Nombre de lots
 * déborderaient aussi sur mobile, où la grille E1 ne s'applique pas.
 *
 * Le tunnel n'a jamais eu ce problème par hasard : il pose déjà
 * `.arc-tunnel .jet-form-builder-row { display: block; }` (plus haut dans
 * cette feuille, § 4) — cette popup n'avait pas l'équivalent. Même remède :
 * sortir la rangée du flex, le `<label>` et le `.field-wrap` redeviennent
 * deux blocs empilés, sans ambiguïté de hauteur possible.
 */
.arc-devis-modale-elementor .jet-form-builder-row {
	display: block;
}

.arc-devis-modale-elementor .jet-form-builder > * {
	min-width: 0;
}

.arc-devis-modale-elementor .jet-form-builder__field,
.arc-devis-modale-elementor .jet-form-builder__field-wrap,
.arc-devis-modale-elementor select.jet-form-builder__field,
.arc-devis-modale-elementor textarea.jet-form-builder__field {
	max-width: 100%;
}

/*
 * E4 — MOBILE (≤ 782 px) : filet de sécurité pour la croix de fermeture.
 *
 * Le réglage PRINCIPAL est posé côté Elementor par `fix-repasse-E-popup.php`
 * (`close_button_vertical`/`_mobile`, `close_button_horizontal`/`_mobile`,
 * `icon_size`/`_mobile`, `close_button_color`, `close_button_background_color`)
 * — modifiable ensuite par le client depuis Elementor > Popups, comme le
 * reste du décor de cette popup (voir la note en tête de la section « DEVIS
 * D'ADHÉSION » plus haut dans cette feuille : « LA POPUP N'EST PLUS HABILLÉE
 * ICI »). CE QUI SUIT EST UNE EXCEPTION ASSUMÉE À CETTE RÈGLE, PAS UN OUBLI :
 * un filet, pas le réglage.
 *
 * Constat qui motive le filet : la valeur PAR DÉFAUT du contrôle Elementor
 * (`close_button_vertical`/`_horizontal`) est une unité `%` SANS taille
 * (`{"unit":"%"}`, sans `size`) tant qu'aucune valeur explicite n'est posée —
 * vérifié dans `modules/popup/document.php` de la version installée. Sans
 * valeur, Elementor n'écrit AUCUNE règle de position pour ce contrôle, et la
 * croix retombe sur le CSS par défaut du Dialog d'Elementor
 * (`assets/css/conditionals/dialog.css` : `color: var(--e-a-color-txt)`,
 * variable définie pour l'ÉDITEUR, pas garantie sur le front). Selon le
 * thème/plugin actifs au moment du rendu, la croix peut donc se retrouver
 * sans couleur fiable ou son empan cliquable réduit à la taille de police par
 * défaut (15px) — sur un pouce, une cible régulièrement manquée.
 * `fix-repasse-E-popup.php` pose désormais des valeurs EXPLICITES ; ce filet
 * survit si elles sont un jour effacées, ou si le CSS généré par Elementor
 * pour cette popup est périmé (`_elementor_css` non régénéré).
 *
 * `z-index` : Elementor n'expose AUCUN contrôle de superposition pour la
 * croix de fermeture (`document.php` de la version installée ne déclare pas
 * de `z-index` parmi les sélecteurs de `close_button_*`) — c'est ici, et
 * SEULEMENT ici, que ce réglage peut exister.
 */
@media (max-width: 782px) {
	.arc-devis-modale-elementor .dialog-close-button {
		position: absolute !important;
		top: 10px !important;
		right: 10px !important;
		z-index: 20 !important;
		display: flex !important;
		align-items: center;
		justify-content: center;
		min-width: 32px;
		min-height: 32px;
		font-size: 22px !important;
		line-height: 1;
		color: #1B2A4A !important;
		background: rgba(255, 255, 255, 0.9) !important;
		border-radius: 50%;
		opacity: 1 !important;
		pointer-events: auto !important;
	}
}

/*
 * E6 — « NOMBRE DE LOTS » VERROUILLÉ, PRÉSENTÉ EN INFORMATION (retour David
 * du 30/09). `arc-devis.js` passe le champ en `readonly` et pose
 * `.arc-devis-lots-verrouille` sur la RANGÉE quand une valeur a été recopiée de
 * l'étape 2 ; sans cette classe (tunnel vide), le champ reste un input normal.
 * Rendu : une carte info — « Nombre de lots : **15** », l'aide dessous, puis
 * la mention « Pour le modifier, revenez à l'étape 2 ». Le champ existe
 * toujours (sa valeur est postée) : il est seulement dépouillé de son
 * apparence d'input — sans bordure, sans focus, curseur par défaut.
 */
.arc-devis-modale-elementor .jet-form-builder-row.arc-devis-lots-verrouille {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr);
	align-items: baseline;
	column-gap: 6px;
	padding: 12px 16px;
	border-left: 3px solid #009fe3;
	border-radius: 6px;
	background: #f2f8fc;
	cursor: default;
}

.arc-devis-modale-elementor .arc-devis-lots-verrouille .jet-form-builder__label {
	width: auto;
	margin: 0;
}

.arc-devis-modale-elementor .arc-devis-lots-verrouille .jet-form-builder__label-text::after {
	content: " :";
}

.arc-devis-modale-elementor .arc-devis-lots-verrouille .jet-form-builder__required {
	display: none;
}

.arc-devis-modale-elementor .arc-devis-lots-verrouille .jet-form-builder__field-wrap {
	min-width: 0;
}

.arc-devis-modale-elementor .arc-devis-lots-verrouille input.jet-form-builder__field {
	width: 100%;
	height: auto;
	min-height: 0;
	/* `!important` : le widget Elementor du formulaire pose bordure, fond et
	   rembourrage des champs avec une spécificité supérieure (constaté :
	   bordure 1px et fond blanc persistants sans lui). */
	padding: 0 !important;
	border: 0 !important;
	border-radius: 0 !important;
	background: transparent !important;
	box-shadow: none !important;
	outline: none !important;
	color: #1b2a4a;
	font-weight: 700;
	cursor: default;
	caret-color: transparent;
	pointer-events: none;
	-moz-appearance: textfield;
	appearance: textfield;
}

.arc-devis-modale-elementor .arc-devis-lots-verrouille input.jet-form-builder__field::-webkit-outer-spin-button,
.arc-devis-modale-elementor .arc-devis-lots-verrouille input.jet-form-builder__field::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

.arc-devis-modale-elementor .arc-devis-lots-verrouille .jet-form-builder__desc,
.arc-devis-modale-elementor .arc-devis-lots-verrouille .arc-devis-lots-retour {
	grid-column: 1 / -1;
}

.arc-devis-modale-elementor .arc-devis-lots-retour {
	margin: 4px 0 0;
	color: #5b6b85;
	font-size: 13px;
	line-height: 1.4;
}

.arc-devis-modale-elementor .arc-devis-lots-retour a {
	color: #007095;
	text-decoration: underline;
}


/* === REPASSE 25/09 — G2 · étape 4 (Individuel, Bailleur, Collectivité) ==== */

/*
 * Document client du 25/09, lot G2. Trois statuts, quatre regroupements :
 *
 *   Individuel   « Votre copropriété » : Nom seul ; Adresse·CP·Ville·Pays
 *                sur une ligne ; « Je certifie » seul ; Signature seule.
 *   Bailleur     « Votre copropriété » : idem Individuel. « Infos sur le
 *                bien mis en location » : Adresse seule ; CP·Ville·Pays sur
 *                une ligne.
 *   Collectivité « Identité de la collectivité » : Nom seul ; Adresse·CP·
 *                Ville·Pays sur une ligne. Bloc représentant : Service
 *                bénéficiaire·Civilité·Nom·Prénom sur une ligne (le champ a
 *                été déplacé côté formulaire par
 *                `exports/fix-repasse-G2-etape4-blocs.php`, qui pose aussi le
 *                conditional-block `arc-etape4-service-benef`). « Informations
 *                comptables » : N° de commande seul ; Adresse·CP·Ville·Pays
 *                sur une ligne ; Téléphone·Email comptable appairés par
 *                défaut (aucune règle dédiée nécessaire, voir plus bas).
 *
 * ⚠️ « Adresse·CP·Ville·Pays sur une ligne » vise l'adresse de la
 * copropriété (`adresse`/`code_postal`/`ville`/`pays`) : ces QUATRE champs
 * sont PARTAGÉS par les neuf statuts (aucun bloc conditionnel ne les
 * enveloppe — voir le §16 plus haut). La règle ci-dessous s'applique donc à
 * tout le monde, pas seulement aux trois statuts cités : c'est la seule
 * façon dont elle PEUT se comporter, ces champs n'étant jamais dupliqués par
 * statut, et c'est cohérent avec la manière dont D16/R-28 traitaient déjà
 * cette même ligne. Même chose pour la case « Je certifie » (`validation_infos`,
 * G2.2 plus bas) : champ unique, partagé, correction valable pour tous.
 *
 * §16 (D13→D16) et R-28/R-29 restent inchangés : cette section les COMPLÈTE
 * par des règles de MÊME sélecteur, posées PLUS TARD dans la cascade — à
 * spécificité égale, la dernière déclaration l'emporte, sans !important et
 * sans toucher au bloc existant.
 *
 * MÊME BORNE que le §16 : min-width 1025px, pour les mêmes deux raisons
 * (largeurs illisibles avant, grille à une colonne du §9.2 après 782px).
 */
@media (min-width: 1025px) {

	/* --- G2.1 — Adresse de la copropriété : Adresse·CP·Ville·Pays -------- */

	/*
	 * CORRECTIF (re-vérification Chrome, même jour que G2-bis plus bas) :
	 * cette règle posait `order: 25` sur Pays quand `adresse`/`code_postal`/
	 * `ville` portaient encore les rangs 23/24/25 du §16 d'origine (le rang
	 * de Ville). G1 (T2, plus bas dans ce fichier) a depuis retiré SES
	 * propres `order:` sur ces trois champs — ils sont revenus au rang de
	 * base (50), commun à tout ce qui n'est pas explicitement placé (§16.2).
	 * Avec `order: 25` resté ici pour Pays seul, il se retrouvait placé
	 * AVANT adresse/code_postal/ville (25 < 50) — « remonte tout en haut »,
	 * constaté au clone, et pas seulement pour les trois statuts de G2-bis :
	 * cette règle est UNCONDITIONNÉE, donc le même défaut touchait aussi
	 * conseil syndical/bénévole/coopératif/ASL/groupe.
	 *
	 * Aucune déclaration `order` : Pays retombe au même rang de base (50)
	 * que ses trois voisins pour les neuf statuts, et le DOM (Pays suit
	 * Ville) départage leur ordre relatif — exactement le renseignement que
	 * G1 applique déjà pour adresse/code_postal/ville entre eux.
	 */

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="adresse"]) {
		grid-column: span 4;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="code_postal"]) {
		grid-column: span 2;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="ville"]) {
		grid-column: span 3;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="pays"]) {
		grid-column: span 3;
	}

	/* --- G2.2 — « Je certifie » et Signature, chacun sur sa ligne --------- */

	/*
	 * `.field-type-signature-field` est déjà pleine largeur (§16.1) ;
	 * `.field-type-checkbox-field` (validation_infos) ne l'était pas — il
	 * retombait sur le défaut span 6 (§16.1), laissait une moitié de ligne
	 * vide à droite et rien ne s'y plaçait (la ligne suivante, la signature,
	 * exige la largeur pleine et ne peut pas combler ce vide). Résultat :
	 * les deux se retrouvent bien chacun sur sa propre ligne pleine largeur.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .field-type-checkbox-field {
		grid-column: 1 / -1;
	}

	/* --- G2.3 — Collectivité : Service bénéficiaire·Civilité·Nom·Prénom --- */

	/*
	 * Même rang que la ligne Civilité (11) : `arc-etape4-service-benef`
	 * précède `civilite` dans le DOM (posé juste avant par
	 * `fix-repasse-G2-etape4-blocs.php`), le rang partagé les départage donc
	 * dans le bon ordre de lecture — même idiome que `pays`/`ville` ci-dessus.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-service-benef {
		order: 11;
	}

	/* Le bloc conditionnel est lui-même une grille à deux colonnes (§4) : sa
	   rangée unique doit remplir tout l'espace qui lui est alloué — même
	   piège qu'au §16.3 pour arc-etape4-fonction/arc-etape4-immat. */
	.arc-tunnel .jet-form-builder-page[data-page="4"] > .arc-etape4-service-benef > .jet-form-builder-row {
		grid-column: 1 / -1;
	}

	/* Largeur du bloc dans la grille de l'étape, uniquement quand affiché
	   (collectivité). Masqué (les huit autres statuts), il ne participe pas
	   au placement — Civilité/Nom/Prénom gardent alors leur largeur D13
	   habituelle (2 + 5 + 5), voir §16.3, inchangée. */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-service-benef:not([style*="none"]) {
		grid-column: span 4;
	}

	/* Quand Service bénéficiaire est affiché, Nom et Prénom cèdent de la
	   place (5+5 → 3+3) pour que les quatre champs tiennent sur douze
	   colonnes (4 + 2 + 3 + 3). Civilité garde sa largeur (2), déjà réduite
	   par rapport à Nom/Prénom au §16.3. */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden):has(> .jet-form-builder__conditional.arc-etape4-service-benef:not([style*="none"])) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="nom"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden):has(> .jet-form-builder__conditional.arc-etape4-service-benef:not([style*="none"])) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="prenom"]) {
		grid-column: span 3;
	}

	/* --- G2.4 — Bailleur : « Informations sur le bien mis en location » --- */

	/*
	 * Adresse seule sur sa ligne (elle poussait avant Code postal et Ville à
	 * sa droite, R-28) ; Code postal·Ville·Pays regroupés sur la ligne
	 * suivante (3 + 5 + 4). Aucun `order` à poser : ce bloc est son PROPRE
	 * mini-grille (`grid-template-columns` posé par R-28, scopé à
	 * `.arc-etape4-bien`) et ses champs s'y placent dans l'ordre du DOM, sans
	 * rang concurrent à départager — à la différence de la grille de la page.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="bien_adresse"]) {
		grid-column: 1 / -1;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="bien_code_postal"]) {
		grid-column: span 3;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="bien_ville"]) {
		grid-column: span 5;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-bien:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="bien_pays"]) {
		grid-column: span 4;
	}

	/* --- G2.5 — Collectivité : « Informations comptables » ---------------- */

	/*
	 * N° de commande seul sur sa ligne (il partageait avant une ligne à
	 * moitié vide, rien ne le suivait d'assez étroit pour la compléter).
	 * Adresse·CP·Ville·Pays sur la ligne suivante (4 + 2 + 3 + 3), même
	 * répartition que G2.1. `service_beneficiaire` a quitté ce bloc (G2.3) :
	 * rien à écraser pour lui ici. Téléphone (`facturation_telephone`,
	 * nouveau) et Email comptable (`facturation_email`) ne reçoivent AUCUNE
	 * règle : ce sont les deux seuls champs restants du bloc, la ligne
	 * Adresse·CP·Ville·Pays totalise déjà douze colonnes, ils retombent donc
	 * naturellement sur la ligne suivante à span 6 chacun (défaut R-28) —
	 * exactement Téléphone·Email côte à côte, sans règle à écrire.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_reference"]) {
		grid-column: 1 / -1;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_adresse"]) {
		grid-column: span 4;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_code_postal"]) {
		grid-column: span 2;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_ville"]) {
		grid-column: span 3;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-facturation:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="facturation_pays"]) {
		grid-column: span 3;
	}
}

/* === REPASSE 25/09 — F · étape 4 général =================================== */

/*
 * Document client du 25/09, consigne 2 : « Réduire la largeur du formulaire :
 * il fait trop grand et prend trop de place pour les inputs ».
 *
 * Le §4 pose `max-width: 1578px` sur TOUTES les étapes (`.jet-form-builder-page
 * :not(--hidden)`, sans distinction de `data-page`). Cette largeur reste
 * nécessaire à l'étape 1 : huit cartes de statut sur une seule rangée (§5,
 * « ÉTAPE 1 — LA GRILLE DE CARTES ») ont besoin de la place. Les étapes 2 à 5, elles,
 * n'alignent jamais plus de trois champs de front (§16.3 : Civilité·Nom·
 * Prénom, ou Adresse·CP·Ville) — 1578 px y laisse des inputs démesurément
 * larges, exactement le défaut signalé.
 *
 * D'où un second `max-width`, PLUS SPÉCIFIQUE (l'attribut `[data-page="N"]`
 * ajouté au sélecteur du §4 pèse plus lourd), qui ne vise QUE les étapes 2 à
 * 5 — jamais l'étape 1, dont le besoin de largeur reste entier. 960 px est la
 * valeur proposée par le client lui-même dans le document du 25/09 : reprise
 * telle quelle, sans arrondi ni ajustement de confort qui aurait dérivé du
 * chiffre demandé.
 *
 * ⚠️ CORRECTIF SUITE AU CONSTAT CHROME SUR LE CLONE (`!important` +
 * `margin-inline` explicite ajoutés après coup).
 *
 * Vérifié à la relecture (`curl` sur `post-26404.css` généré par Elementor
 * pour cette page, et sur ce `style.css` lui-même) : AUCUNE règle du site,
 * theme ou Elementor, ne cible `.jet-form-builder-page` avec une largeur —
 * la seule concurrente possible reste le `max-width: 1578px` du §4, moins
 * spécifique (0,3,0 contre 0,4,0 ici), donc déjà perdante en cascade pure.
 * Le sélecteur GAGNANT en théorie est donc bien celui ci-dessous. Le
 * `form.jet-form-builder` que le constat cite (« max-width:none, aucun
 * ancêtre plafonné ») n'a jamais été la cible de cette règle : c'est le
 * `<form>` qui enveloppe TOUTES les étapes, il reste volontairement large
 * (1728px, conteneur Elementor `.elementor-element-arctuns02 >
 * .elementor-container`) — seule la PAGE D'ÉTAPE À L'INTÉRIEUR (`.jet-form-
 * builder-page[data-page="N"]`), centrée par `margin-inline: auto`, doit
 * rétrécir. `!important` ajouté malgré tout, en pure prévention : c'est la
 * même précaution que documentée ailleurs dans ce fichier (§14.5, §4)
 * partout où JetFormBuilder ou Elementor peuvent écrire un style plus tard
 * dans le chargement — au cas où l'environnement testé (`clone` Chrome)
 * diffère de celui vérifié ici en `curl`, ou charge une CSS générée que ce
 * `curl` local ne voit pas.
 *
 * `margin-inline: auto` posé EXPLICITEMENT (au lieu de compter sur le
 * `margin: 0 auto` hérité, non réécrit, du §4) : demandé tel quel par la
 * consigne de suivi, et lève toute ambiguïté sur une éventuelle règle
 * `margin-left`/`margin-right` plus spécifique qui aurait pu s'intercaler.
 */
.arc-tunnel .jet-form-builder-page[data-page="2"]:not(.jet-form-builder-page--hidden),
.arc-tunnel .jet-form-builder-page[data-page="3"]:not(.jet-form-builder-page--hidden),
.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden),
.arc-tunnel .jet-form-builder-page[data-page="5"]:not(.jet-form-builder-page--hidden) {
	max-width: 960px !important;
	margin-inline: auto !important;
}


/* === REPASSE 25/09 — G1 · étape 4 ========================================= */

/*
 * Document client du 25/09 : réorganisation des blocs de l'étape 4 pour
 * Conseil Syndical (CS), Syndic Bénévole (SB), Syndic Coopératif (SC),
 * Groupe et ASL/AFUL. `exports/fix-repasse-G1-etape4-blocs.php` a déplacé
 * les BLOCS dans le formulaire (T1 → T4, DOM = ordre de tabulation, même
 * principe que Q3/lot R) ; ce bloc-ci pose les LARGEURS et les rangs visuels
 * qui vont avec, par édition chirurgicale des règles §16/R-28 existantes —
 * jamais de suppression, seulement des règles plus tardives dans la
 * cascade (même sélecteur ou plus spécifique) qui l'emportent.
 *
 * Ce qui change, et pourquoi :
 *
 *   T1  Civilité · Fonction · Nom · Prénom sur UNE ligne (au lieu de
 *       Civilité · Nom · Prénom, la Fonction arrivant après l'email) ; puis
 *       Téléphone · Email sur la ligne suivante. Nouveaux rangs 12 → 16.
 *       Quand aucune Fonction n'est affichée (syndic coopératif, individuel,
 *       bailleur), la ligne D13 d'origine (Civilité 2 · Nom 5 · Prénom 5)
 *       n'est PAS touchée — seule une Fonction visible la resserre (même
 *       idiome que D16.4).
 *
 *   T2  La ligne « Nom de la copropriété » accueille désormais SOIT le n°
 *       d'immatriculation (CS/SB/SC), SOIT la forme juridique de
 *       l'ASL/AFUL — jamais les deux à la fois (mutuellement exclusifs par
 *       statut). Le groupe n'a ni l'un ni l'autre : le nom garde la ligne
 *       entière, comportement D15 déjà en place, aucune règle à ajouter.
 *       L'adresse de la copropriété devient une ligne à elle seule ; Code
 *       postal + Ville + Pays forment la ligne suivante (3 + 5 + 4).
 *
 *   T3  Bloc syndic (CS/SB/SC/ASL/AFUL, `arc-etape4-syndic-identite` et
 *       `arc-etape4-syndic-coordonnees`, EXCLUSIVEMENT ces cinq statuts —
 *       aucun chevauchement avec individuel/bailleur/collectivité) :
 *       Raison sociale seule sur sa ligne (CS) ; Nom + Prénom côte à côte
 *       (SB) ; Nom seul (SC, T4 du script) ; « Administré par » (nouveau
 *       champ) + Raison sociale sur la même ligne (ASL/AFUL uniquement) ;
 *       Adresse seule ; Code postal + Ville + Pays (3 + 5 + 4) ; Téléphone +
 *       Email syndic + Email comptable (4 + 4 + 4), remplace le 6 + 2 + 4
 *       de R-28 pour ce bloc précis (bien loué et facturation collectivité,
 *       hors périmètre G1, gardent leurs largeurs R-28 d'origine).
 *
 * ⚠️ TOUT CE QUI SUIT EST SOUS `min-width: 1025px`, MÊME RAISON QU'AU §16 :
 * sous ce seuil, la grille à douze colonnes ne s'applique pas (§9.2 replie
 * le tunnel en une colonne dès 782 px), et les règles ci-dessous n'auraient
 * aucun sens ou déborderaient. R-29 (adresse pleine largeur sous 1025 px)
 * couvre déjà l'unique cas qui reste pertinent en dessous.
 */
@media (min-width: 1025px) {

	/* --- T1 : Civilité · Fonction · Nom · Prénom, puis Téléphone · Email -- */

	/* Nouveau rang pour le bloc Fonction — il précède maintenant le nom et
	   le prénom au lieu de suivre le téléphone et l'email. */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-fonction {
		order: 12;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="nom"]) {
		order: 13;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="prenom"]) {
		order: 14;
	}

	/* Téléphone et Email n'ont plus besoin de partager le rang de la
	   Fonction (ancien §16, rang 14) : ils forment leur propre ligne, juste
	   après Nom/Prénom. La largeur par défaut (span 6 chacun, §16.1) suffit
	   déjà — aucune règle de largeur à ajouter ici. */
	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="telephone"]) {
		order: 15;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="email"]) {
		order: 16;
	}

	/*
	 * Quand une Fonction est affichée (conseil syndical, syndic bénévole,
	 * groupe, ASL/AFUL — et collectivité si son propre bloc `fonction_collectivite`
	 * existe : même classe `arc-etape4-fonction`, même règle, sans rien à
	 * écrire de plus), Nom et Prénom cèdent de la place : 2 (civilité) + 4
	 * (fonction, largeur déjà posée au §16.3/D16.4) + 3 + 3 = 12.
	 *
	 * Sélecteur `:has()` au niveau de la PAGE, même idiome que le §16.4 pour
	 * l'immatriculation : il l'emporte par construction (une clause `:has()`
	 * de plus que la règle D13 d'origine), source order non requis.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden):has(> .jet-form-builder__conditional.arc-etape4-fonction:not([style*="none"])) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="nom"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden):has(> .jet-form-builder__conditional.arc-etape4-fonction:not([style*="none"])) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="prenom"]) {
		grid-column: span 3;
	}

	/* --- T2 : Copropriété — Nom + (immatriculation OU forme juridique) ---- */

	/*
	 * ⚠️ CORRECTIF 25/09 (Chrome, clone) — PAS de rang `order` ici (et plus
	 * aucun sur `copro_nom`/`collectivite_nom`/`arc-etape4-immat`/`adresse`/
	 * `code_postal`/`ville` ci-dessous, voir le correctif du §16.2 plus haut
	 * dans ce fichier). `exports/fix-repasse-G1-etape4-blocs.php` (T2,
	 * corrigé) place désormais ce bloc RÉELLEMENT avant `copro_nom` dans le
	 * DOM : au rang de base (50, comme `arc-etape4-immat`, mutuellement
	 * exclusifs), l'ordre visuel suit l'ordre DOM tel quel — plus besoin
	 * d'un rang explicite, et plus aucun risque de décalage tabulation ↔
	 * affichage. Seule la largeur reste nécessaire.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-tunnel-forme-asl:not([style*="none"]) {
		grid-column: span 6;
	}

	/* Le bloc conditionnel porte sa propre grille à deux colonnes (§4) : sa
	   rangée unique doit remplir tout le bloc, même piège qu'au §16.3 pour
	   la Fonction et l'immatriculation. */
	.arc-tunnel .jet-form-builder-page[data-page="4"] > .arc-tunnel-forme-asl > .jet-form-builder-row {
		grid-column: 1 / -1;
	}

	/*
	 * Forme juridique affichée (ASL/AFUL) → le nom de la copropriété cède
	 * aussi la moitié droite, comme pour l'immatriculation (§16.4).
	 *
	 * ⚠️ CORRECTIF 25/09 (Chrome, clone), même bug et même cause que pour
	 * l'immatriculation juste au-dessus (D15, §16.4) : `copro_nom` vit dans
	 * son propre bloc conditionnel `arc-etape4-copro-nom` depuis R-27, enfant
	 * DIRECT de la page — `> .jet-form-builder-row:has(…)` ne correspondait
	 * à rien, la règle ne s'appliquait donc jamais. Cible maintenant le
	 * conteneur réel, comme la correction posée au §16.4 pour l'immatriculation.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden):has(> .jet-form-builder__conditional.arc-tunnel-forme-asl:not([style*="none"])) > .jet-form-builder__conditional.arc-etape4-copro-nom {
		grid-column: span 6;
	}

	/* --- T2 : Adresse seule, puis Code postal · Ville · Pays (3 + 5 + 4) -- */

	/* Remplace la ligne D16 d'origine (Adresse 6 · CP 2 · Ville 4, une seule
	   rangée) : l'adresse prend maintenant sa propre ligne, Pays rejoint
	   Code postal et Ville sur la suivante. Champs partagés par les neuf
	   statuts (aucun n'est propre au lot G1) : le changement est commun,
	   demandé identiquement à ce lot pour la « Copropriété ». */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="adresse"]) {
		grid-column: 1 / -1;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="code_postal"]) {
		grid-column: span 3;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="ville"]) {
		grid-column: span 5;
	}

	/*
	 * Le champ Pays (R-18) n'avait volontairement aucune règle dédiée
	 * jusqu'ici. Il rejoint maintenant Code postal et Ville sur la même
	 * ligne : largeur nécessaire. PAS de rang `order` (correctif 25/09,
	 * même raison que ci-dessus) — `pays` suit `ville` dans le DOM sans
	 * bloc conditionnel entre les deux (posé juste après `ville` par
	 * `exports/fix-R-etapes-4-5.php`, R-18), le rang de base (50) suffit
	 * pour préserver cet ordre. Individuel/Bailleur/Collectivité restent
	 * régis par leur propre règle, plus spécifique (`order: 25`, section
	 * « G2-bis » plus bas dans ce fichier — non touchée ici).
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="pays"]) {
		grid-column: span 4;
	}

	/* --- T3 : bloc syndic (conseil syndical, bénévole, coopératif, ASL/AFUL) */

	/* Raison sociale (conseil syndical, ASL/AFUL) : ligne entière. Nom du
	   syndic coopératif (`syndic_non_pro_sc`, T4 du script — seul dans son
	   bloc, sans prénom) : ligne entière aussi. */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-identite .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-identite .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_non_pro_sc"]) {
		grid-column: 1 / -1;
	}

	/*
	 * Syndic bénévole : Nom + Prénom côte à côte. `syndic_non_pro` ne vit
	 * plus QUE dans le bloc du syndic bénévole depuis T4 (le syndic
	 * coopératif porte désormais `syndic_non_pro_sc`, nom de champ
	 * distinct) — il n'y a donc plus besoin de distinguer les deux cas par
	 * un sélecteur de fratrie, `[name="syndic_non_pro"]` désigne à lui seul
	 * le syndic bénévole.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-identite .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_non_pro"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-identite .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_non_pro_prenom"]) {
		grid-column: span 6;
	}

	/*
	 * Nouveau champ ASL/AFUL « Administré par » : moitié de ligne, partagée
	 * avec la Raison sociale du syndic (qui cède sa moitié droite ci-dessous).
	 *
	 * ⚠️ CORRECTIF 25/09 (Chrome, clone) — les deux champs restaient sur DEUX
	 * lignes séparées malgré `span 6` sur chacun. Cause : la largeur du
	 * conteneur `.arc-etape4-syndic-identite` (le bloc conditionnel qui
	 * porte « Raison sociale du syndic ») n'était JAMAIS retouchée — seule
	 * la RANGÉE interne (`.jet-form-builder-row:has([name="syndic"])`)
	 * l'était, un sélecteur profond dont l'effet ne change rien à la place
	 * que le CONTENEUR occupe dans la grille à 12 colonnes de la page : le
	 * conteneur restait à `1 / -1` (pleine largeur, règle générique du §4/
	 * §16.1), poussant la rangée interne « pleine largeur DE SON CONTENEUR »
	 * — qui, lui, occupait déjà toute la ligne. Le correctif porte donc la
	 * largeur sur le CONTENEUR, exactement comme pour `arc-tunnel-forme-asl`
	 * juste au-dessus (même mécanique, déjà éprouvée) : la rangée interne
	 * garde sa règle « pleine largeur DE SON CONTENEUR » (§16.3, inchangée,
	 * plus bas dans ce fichier) — elle s'applique maintenant à un conteneur
	 * de 6 colonnes au lieu de 12.
	 */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-asl-administree-par:not([style*="none"]) {
		grid-column: span 6;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] > .arc-etape4-asl-administree-par > .jet-form-builder-row {
		grid-column: 1 / -1;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"]:has(> .jet-form-builder__conditional.arc-etape4-asl-administree-par:not([style*="none"])) .jet-form-builder__conditional.arc-etape4-syndic-identite {
		grid-column: span 6;
	}

	/* Adresse du syndic seule sur sa ligne, puis Code postal · Ville · Pays
	   (3 + 5 + 4) — remplace le 6 + 2 + 4 de R-28 pour CE bloc précis
	   uniquement (`.arc-etape4-syndic-coordonnees`) : le bien loué et la
	   facturation collectivité, hors périmètre G1, gardent leurs largeurs
	   R-28 d'origine, non citées ici. */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_adresse"]) {
		grid-column: 1 / -1;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_code_postal"]) {
		grid-column: span 3;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_ville"]) {
		grid-column: span 5;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_pays"]) {
		grid-column: span 4;
	}

	/* Téléphone + Email syndic + Email comptable, un tiers chacun. */
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_telephone"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_email"]),
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-syndic-coordonnees:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="syndic_comptable_email"]) {
		grid-column: span 4;
	}
}

/* === REPASSE 25/09 — C1 · étape 2 ==========================================
 *
 * Document client du 25/09, consignes 1, 2, 3 et 5 (la 4 — masquer le bloc
 * date jusqu'au calcul, puis le placer juste sous la zone du prix — était
 * DÉJÀ conforme : voir §14.3 ci-dessus, `.arc-tunnel--js .arc-tunnel-effet`,
 * et l'ordre des blocs dans le formulaire, vérifié avant d'écrire quoi que
 * ce soit ici : le panneau `arc-tunnel-effet` suit IMMÉDIATEMENT le bloc du
 * montant dans le HTML servi, rien à déplacer).
 * ========================================================================= */

/* --- C1.1 : remonter le bloc de 50px (consigne 1) -------------------------
 *
 * « trop bas sur la ligne de flottaison ». Le bloc `.arc-tunnel-cotisation`
 * lui-même n'a pas de marge haute propre (§6 : `margin: 0 auto`) — l'écart
 * vient de l'empilement des bandeaux au-dessus (frise, barre de navigation).
 * Plutôt que de rouvrir ces règles partagées avec les 4 autres étapes (et
 * risquer de décaler tout le tunnel), on remonte SEULEMENT le contenu
 * propre à l'étape 2 : une marge négative, bornée à cette étape par la
 * classe `.arc-tunnel-cotisation` (qui n'existe qu'ici).
 */
.arc-tunnel .arc-tunnel-cotisation {
	margin-top: -50px;
}

@media (max-width: 782px) {
	/* Moins de remontée sur mobile : la frise et la barre de navigation y
	   sont déjà tassées (§9.2/§9.3), -50px collerait le titre au bouton
	   « Précédent ». */
	.arc-tunnel .arc-tunnel-cotisation {
		margin-top: -20px;
	}
}

/* --- C1.2 : titre à deux lignes, nom du contrat (consigne 2) --------------
 *
 * Ligne 1 (`label`, inchangée) : « Calculer le montant de votre cotisation
 * annuelle ». Ligne 2 (`desc`, posée par `exports/fix-repasse-C1-etape2.php`)
 * : « pour un contrat {nom} », le nom étant un
 * <span class="arc-tunnel-contrat-nom"> rempli par
 * `window.arcTunnelMajNomsContrat()` (arc-tunnel.js, mécanisme PARTAGÉ avec
 * le titre de l'étape 3 posé par le lot D — même span, même fonction,
 * aucune duplication).
 *
 * `label` et `desc` sont deux `<div>` FRÈRES (gabarit JetFormBuilder,
 * `field-column.php` : label puis template puis desc) : le retour à la
 * ligne demandé existe donc DÉJÀ par construction, sans `<br>`.
 */
.arc-tunnel .arc-tunnel-cotisation__soustitre {
	display: block;
	margin-top: 6px;
	color: var(--arc-texte-doux);
	font-family: var(--arc-ui);
	font-size: var(--arc-t-corps);
}

/*
 * Seul le NOM DU CONTRAT est en gras italique #007095 — pas le « pour un
 * contrat » qui l'introduit (consigne du client, lue au pied de la lettre).
 *
 * ⚠️ CORRECTIF AUDIT PRÉPROD DU 26/09 (verdicts E2-04 / E3-03) : gras et
 * couleur relevés conformes aux étapes 2 et 3, mais `font-style` calculé à
 * `normal`. Recherche exhaustive (curl du `style.css` servi en préprod +
 * toutes les feuilles Elementor chargées sur la page : `frontend.min.css`,
 * `widget-heading.min.css`, `post-26404.css`, `base-desktop.css`) : AUCUNE
 * règle concurrente posant `font-style: normal` sur `.arc-tunnel-contrat-nom`
 * ou un ancêtre n'a été trouvée — la seule déclaration `font-style` présente
 * ailleurs dans `style.css` est celle, identique, du lot D (§ étape 3). Cette
 * règle-ci (sélecteur partagé, `.arc-tunnel .arc-tunnel-contrat-nom`, sans
 * dépendance à l'étape) couvre DÉJÀ les deux emplacements — vérifié en
 * Chromium réel local : `getComputedStyle(...).fontStyle === 'italic'` aux
 * deux étapes avec le CSS actuel, ce qui exclut un bug de cascade dans CE
 * fichier. Le diagnostic Chromium réel sur la préprod elle-même n'a pas pu
 * être mené à son terme : la préprod a répondu massivement `429` pendant la
 * vérification (jQuery/`wp` eux-mêmes non chargés, TOUT le CSS enfant restait
 * alors non appliqué — poids et couleur également retombés à leurs valeurs
 * par défaut dans cet état, pas seulement le style), signe d'un chargement de
 * page interrompu au moment de l'audit plutôt que d'un conflit de cascade
 * ciblé sur `font-style` seul. `!important` posé ici en durcissement
 * défensif : ne change rien à un état déjà correct, protège contre toute
 * règle de spécificité supérieure qui apparaîtrait par la suite (ou un
 * chargement partiel de feuille de style côté préprod).
 */
.arc-tunnel .arc-tunnel-contrat-nom {
	font-weight: 700;
	font-style: italic !important;
	color: #007095;
}

/* Tant que rien n'est coché à l'étape 1 (cas théorique : l'étape 2 n'est
   normalement jamais atteinte sans statut choisi, le champ est obligatoire),
   `arcTunnelLibelleContrat()` renvoie une chaîne vide et le span reste vide
   — la ligne « pour un contrat » disparaît plutôt que d'afficher un residu. */
.arc-tunnel .arc-tunnel-cotisation__soustitre:has(.arc-tunnel-contrat-nom:empty) {
	display: none;
}

/* --- C1.2 bis : le bloc date restait visible avant calcul (bug Chrome réel) -
 *
 * DIAGNOSTIC RÉEL (Playwright/Chromium, `getComputedStyle` +
 * `document.styleSheets`, pas jsdom — jsdom ne charge pas le script frontend
 * de JetFormBuilder qui pose l'attribut `style` inline, donc ne reproduisait
 * pas le bug). Après sélection d'un statut (ex. Conseil syndical) :
 *   · JetFormBuilder pose lui-même `style="display: block"` en ligne sur
 *     `.arc-tunnel-effet` dès que sa condition est remplie (comportement
 *     natif du plugin, hors de notre contrôle et pas à modifier) ;
 *   · la règle générique du §4 (habillage des blocs conditionnels) —
 *     `.arc-tunnel .jet-form-builder__conditional:not([style*="none"])
 *     { display: grid !important; }` — matche ALORS elle aussi, avec une
 *     spécificité de (0,3,0) ET `!important` ;
 *   · notre propre règle, `.arc-tunnel--js .arc-tunnel-effet
 *     { display: none !important; }` (§14.3, lot B), n'a qu'une spécificité
 *     de (0,2,0) : SI LES DEUX ONT `!important`, C'EST LA SPÉCIFICITÉ QUI
 *     TRANCHE ENSUITE — `!important` ne fait gagner que contre une règle
 *     NON `!important`, jamais contre une autre règle `!important` plus
 *     spécifique. La règle générique du §4 l'emportait donc bel et bien.
 *
 * Confirmé par `getMatchedCSSRules`-équivalent (parcours de
 * `document.styleSheets`) dans un vrai Chromium : les deux seules règles qui
 * matchent `.arc-tunnel-effet` et posent `display` sont exactement celles
 * décrites ci-dessus, la générique du §4 gagnant.
 *
 * CORRECTIF : même technique que `.arc-tunnel-lots` au §6 (« PASSER DEVANT
 * la règle générale des blocs conditionnels ») — un sélecteur PLUS SPÉCIFIQUE
 * que (0,3,0), pas un simple ajout de `!important` (déjà présent des deux
 * côtés, ça ne suffit pas). Quatre classes = (0,4,0)/(0,5,0), au-dessus de
 * tout ce qui précède, quel que soit l'ordre de chargement des feuilles.
 */
.arc-tunnel--js .arc-tunnel-cotisation .jet-form-builder__conditional.arc-tunnel-effet {
	display: none !important;
}

.arc-tunnel--js .arc-tunnel-cotisation--calcule .jet-form-builder__conditional.arc-tunnel-effet:not([style*="none"]) {
	display: grid !important;
}

/* --- C1.3 : rien à supprimer sous le bouton « Calculer » (consigne 3) -----
 *
 * Vérifié exhaustivement (arbre de blocs `parse_blocks()` + HTML rendu de
 * `/adhesion/`) : le SEUL <input> visible de l'étape 2 est `nb_lots`, situé
 * AU-DESSUS du bouton « Calculer », pas en dessous. Les trois champs qui
 * suivent le bouton dans le DOM (`cotisation`, `cotisation_detail`,
 * `cotisation_montant`) sont des `<input type="hidden">` — jamais visibles
 * par construction, quel que soit le CSS — et nécessaires à la passerelle
 * (relus à la soumission par `ARC_Demandes_Tunnel_Submit`) : ILS RESTENT,
 * conformément à la consigne (« ne supprime pas un champ caché nécessaire »).
 *
 * Rien n'est donc retiré du balisage. Ce bloc ne fait que DURCIR ce qui
 * dépend déjà du CSS du plugin (`.jet-form-builder__calculated-field--hidden
 * { display: none }`, feuille de JetFormBuilder) avec un filet local : si
 * cette règle venait à manquer un jour (plugin désactivé, ordre de
 * chargement des feuilles), les trois champs calculés de l'étape 2 restent
 * masqués depuis le thème plutôt que de s'afficher en clair.
 */
.arc-tunnel .arc-tunnel-cotisation .jet-form-builder__calculated-field {
	display: none;
}

/* --- C1.4 : la « zone du prix » — montant centré, icône à droite (consigne 5)
 *
 * Le montant (`__montant`), le détail (`__detail`) et les actions
 * (`__actions`, l'icône de réinitialisation) sont trois éléments FRÈRES dans
 * le même `.jet-form-builder__heading-desc` (gabarit JetFormBuilder,
 * `cotisation_markup()` côté PHP — non touché ici). `:has()` cible ce
 * conteneur précis sans dépendre d'une classe que JetFormBuilder ne pose
 * pas lui-même sur ce `<div>`.
 *
 * Grille à 3 colonnes symétriques (44px = largeur de l'icône, cf. §14.2) :
 * une colonne fantôme à gauche équilibre l'icône à droite, pour que le
 * montant reste visuellement centré plutôt que décalé par l'icône seule.
 * Le détail (barème) s'étend sur toute la largeur, sous le montant — jamais
 * compressé à la largeur de l'encadré du montant seul, pour rester lisible.
 */
.arc-tunnel--js .arc-tunnel-cotisation--calcule .jet-form-builder__heading-desc:has(> .arc-tunnel-cotisation__montant) {
	display: grid;
	grid-template-columns: 44px minmax(0, 1fr) 44px;
	align-items: center;
	column-gap: clamp(10px, 1.6vw, 20px);
	row-gap: 8px;
	max-width: 480px;
	margin: 0 auto;
}

.arc-tunnel .jet-form-builder__heading-desc:has(> .arc-tunnel-cotisation__montant) > .arc-tunnel-cotisation__montant {
	grid-column: 2;
	grid-row: 1;
	margin: 0 auto;
}

/*
 * ⚠️ CENTRAGE VERTICAL DU MONTANT — bug remonté depuis Chrome (montant
 * centré horizontalement mais collé en haut de l'encadré 280×104 : 0 px
 * au-dessus, ~52 px en dessous).
 *
 * CAUSE TROUVÉE PAR CALCUL DE CASCADE : `.arc-tunnel-cotisation__montant`
 * est ciblé par DEUX règles qui posent `display` :
 *   · §14.1 (ligne ~3845) : `.arc-tunnel .arc-tunnel-cotisation__montant`
 *     → `display: flex; align-items: center; justify-content: center;`
 *     — spécificité (0,2,0).
 *   · §6.1  (ligne ~1804) : `.arc-tunnel--js .arc-tunnel-cotisation--calcule
 *     .arc-tunnel-cotisation__montant` → `display: block;` SEUL (posé au
 *     lot B, 2026-09-10, avant que §14.1 n'ajoute le centrage flex) —
 *     spécificité (0,3,0), donc PLUS SPÉCIFIQUE.
 * `display: block` l'EMPORTE dans l'état réellement visible (`--calcule`
 * actif) : le flex ne s'établit jamais, le texte retombe en haut de la
 * boîte (`min-height` la garde à 104 px, mais rien ne centre son contenu
 * en `display: block`). Les deux règles ont la MÊME spécificité que la
 * bloquante (0,3,0) et un TROISIÈME sélecteur de même poids, posé APRÈS
 * elle dans le fichier, l'emporte par l'ordre de cascade (aucun
 * `!important` nécessaire) : restaure `display: flex` pour l'état visible.
 */
.arc-tunnel--js .arc-tunnel-cotisation--calcule .arc-tunnel-cotisation__montant {
	display: flex;
	align-items: center;
	justify-content: center;
}

/*
 * CARTE DU PRIX MASQUÉE AVANT CALCUL (retour David, 30/09 : « la carte avec le
 * /an est tout le temps affichée »). Mesuré en Chromium réel : `display: flex`
 * hors état `--calcule`. Cause : §6.1 masque `.arc-tunnel--js
 * .arc-tunnel-cotisation__montant { display: none }` (0,2,0) mais §14.1
 * `.arc-tunnel .arc-tunnel-cotisation__montant { display: flex }` (0,2,0
 * aussi, posée PLUS LOIN dans le fichier) l'emporte par l'ordre — la boîte
 * bordée et son `::after « /an »` restaient donc visibles, vides.
 * Sélecteur à (0,4,0) (`:not()` compte comme une classe) : gagne quel que
 * soit l'ordre, et ne s'applique qu'HORS `--calcule` — donc jamais contre la
 * règle d'affichage ci-dessus (état calculé, y compris statuts à tarif fixe
 * où C2 pose `--calcule` dès l'arrivée : la carte s'y affiche d'emblée).
 */
.arc-tunnel--js .arc-tunnel-cotisation:not(.arc-tunnel-cotisation--calcule) .arc-tunnel-cotisation__montant {
	display: none !important;
}

/*
 * TEXTE D'AIDE DU NOMBRE DE LOTS (« Ne pas inclure les caves et parkings »).
 * Précision du coordinateur (30/09, après une première lecture erronée « aide
 * discrète ») : David veut les MÊMES valeurs que le label « Nombre de lots »
 * — même taille (`--arc-t-corps`, 15 px, cf. règle du label au §6), même
 * graisse (700), même couleur (#1D1D1D, posée par Elementor sur le label) —
 * AVEC l'italique en plus, et rien d'autre de différent.
 * JetFormBuilder enveloppe le texte dans `<small>` (gabarit `field-
 * description.php`), qui le réduirait de 20 % : le `<small>` est neutralisé
 * (taille reprise du label). Sélecteur à 5 classes : la règle Elementor de la page (`.elementor-26404 … .jet-form-builder__desc`, 0,4,0) posait sinon 13 px / gris sur le `<div>`. Graisse et style en `!important` : ce sont les deux
 * propriétés qu'une règle générique de description pourrait ramener à 400 /
 * normal.
 */
.arc-tunnel .jet-form-builder__conditional.arc-tunnel-lots .jet-form-builder-row .jet-form-builder__desc,
.arc-tunnel .jet-form-builder__conditional.arc-tunnel-lots .jet-form-builder-row .jet-form-builder__desc small {
	font-size: var(--arc-t-corps);
	font-weight: 700 !important;
	font-style: italic !important;
	color: #1d1d1d;
	line-height: 1.35;
}

.arc-tunnel .jet-form-builder__heading-desc:has(> .arc-tunnel-cotisation__montant) > .arc-tunnel-cotisation__detail {
	grid-column: 1 / -1;
	grid-row: 2;
	margin-top: 0;
}

.arc-tunnel .jet-form-builder__heading-desc:has(> .arc-tunnel-cotisation__montant) > .arc-tunnel-cotisation__actions {
	grid-column: 3;
	grid-row: 1;
	justify-content: flex-end;
	margin-top: 0;
}

/* === REPASSE 25/09 — A · étape 1 (correctif Chrome, saut de ligne) ========
 *
 * Signalé après vérification Chrome sur le clone : le `<br>` posé dans le
 * libellé de Syndic Bénévole (§ REPASSE 25/09 — A plus haut,
 * `exports/fix-repasse-A-etape1.php`) n'a AUCUN effet — le conteneur direct
 * du texte de la carte, `.jet-form-builder__field-label:has(>
 * .arc-tunnel-carte) > span`, est en `display: flex` depuis le §5 (grille de
 * cartes), avec `flex-direction` et `flex-wrap` jamais redéclarés ailleurs
 * dans ce fichier → valeurs INITIALES `row` / `nowrap`. Dans un contexte
 * flex, un `<br>` devient lui-même un flex item : il ne force plus de saut
 * de ligne, il se contente de s'aligner EN LIGNE à côté des deux autres
 * items (le texte « Syndic Bénévole » et le `<span class="arc-statut-sous-
 * titre">`) — d'où le rendu constaté sur 3 lignes qui se chevauchent
 * (`nowrap` empêchant tout retour, les trois items se tassent et débordent
 * les uns sur les autres).
 *
 * CASCADE CALCULÉE (avant ce correctif) sur le conteneur réel :
 *   sélecteur   .arc-tunnel .jet-form-builder__field-label:has(>
 *               .arc-tunnel-carte) > span, .arc-tunnel-carte:not(input)
 *               .arc-tunnel-carte__titre     (règle du §5, plus haut)
 *   display     flex                          (seule déclaration existante)
 *   flex-direction  row                        (valeur INITIALE, jamais posée)
 *   flex-wrap       nowrap                     (valeur INITIALE, jamais posée)
 *   → un `<br>` entre deux flex items ne peut pas les répartir sur deux
 *     lignes : c'est `flex-wrap` qui en décide, pas un élément de contenu.
 *
 * CORRECTIF — CSS seul, `<br>` déjà écrit en base laissé tel quel (il
 * devient un flex item vide et inoffensif, sans avoir à retoucher le
 * formulaire) :
 *   1. `flex-wrap: wrap` sur ce même conteneur, réservé aux cartes de statut
 *      (sélecteur inchangé) — les 7 autres cartes n'ont qu'un seul flex item
 *      (leur texte), `wrap` ne change donc rien pour elles.
 *   2. `.arc-statut-sous-titre` force sa propre ligne dans ce conteneur
 *      redevenu multi-lignes : `flex: 1 0 100%` (flex-basis 100% = plus
 *      large que ce qui reste sur la ligne du texte « Syndic Bénévole » dès
 *      que celui-ci occupe le moindre espace → bascule sur la ligne
 *      suivante, `flex-shrink: 0` pour ne jamais se laisser comprimer
 *      en dessous).
 *
 * CASCADE CALCULÉE (après ce correctif) :
 *   .arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte) > span,
 *   .arc-tunnel-carte:not(input) .arc-tunnel-carte__titre { flex-wrap: wrap }
 *     — même sélecteur, même spécificité (0-2-0) que la règle du §5 : cette
 *       règle vient PLUS LOIN dans le fichier, elle l'emporte par ordre
 *       d'apparition, sans `!important`.
 *   .arc-statut-sous-titre { flex: 1 0 100%; font-size: 20px }
 *     — la déclaration `font-size: 20px` déjà posée plus haut (§ REPASSE
 *       25/09 — A, `.arc-statut-sous-titre`) n'est pas modifiée ; `flex`
 *       s'ajoute, aucune collision de propriété entre les deux règles.
 *
 * RÉSULTAT ATTENDU : ligne 1 « Syndic Bénévole » (24px, Lora, item de
 * largeur auto sur la ligne du flex wrap) ; ligne 2 « (non professionnel) »
 * (20px, Lora, hérité) sur sa propre ligne, sans chevauchement. Centré sur
 * les deux lignes : `justify-content: center` (posé au §5) s'applique
 * indépendamment à chaque ligne d'un conteneur `flex-wrap: wrap`.
 */
.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte) > span,
.arc-tunnel-carte:not(input) .arc-tunnel-carte__titre {
	flex-wrap: wrap;
}

.arc-tunnel .jet-form-builder__field-label:has(> .arc-tunnel-carte) .arc-statut-sous-titre,
.arc-tunnel-carte:not(input) .arc-statut-sous-titre {
	flex: 1 0 100%;
	/*
	 * Centrage du texte DANS son propre item (correctif 30/09, mesuré dans
	 * Chromium) : l'item occupe bien 100 % de la ligne et est centré, mais sa
	 * `display` calculée est `flex` (héritage d'une règle plus large des
	 * cartes) ; le texte, item flex anonyme, se calait alors au DÉBUT de la
	 * ligne (`justify-content` initial) — centre du texte à -28 px de celui
	 * du titre. `display: block` + `text-align: center` le recentre, comme
	 * le titre.
	 */
	display: block;
	text-align: center;
}


/* === REPASSE 25/09 — G2-bis · correctif : Adresse+CP+Ville+Pays sur une
   seule ligne, UNIQUEMENT pour Individuel / Bailleur / Collectivité ======= */

/*
 * Défaut constaté au clone (Chrome), remonté par le coordinateur : le lot
 * G1 (section « T2 », plus haut dans ce fichier) a remplacé la ligne D16
 * (Adresse·CP·Ville) par un nouveau motif commun aux NEUF statuts —
 * Adresse seule sur sa ligne, puis Code postal·Ville·Pays sur la suivante.
 * Ce motif est CORRECT et reste en l'état pour les six statuts hors
 * périmètre de ce lot (conseil syndical, bénévole, coopératif, ASL/AFUL,
 * groupe) — piloté par G1, non touché ici.
 *
 * Mais le document du 25/09 demande EXPLICITEMENT les QUATRE champs sur une
 * seule ligne pour Individuel et Bailleur (bloc « Votre copropriété ») et
 * pour Collectivité (bloc « Identité de la collectivité ») — même motif que
 * le bloc « Informations comptables » de la collectivité (G2.5 plus haut :
 * 4 + 2 + 3 + 3 sur douze colonnes).
 *
 * `adresse`/`code_postal`/`ville`/`pays` restent des champs PARTAGÉS par les
 * neuf statuts (aucun bloc conditionnel ne les enveloppe, voir §16 et G2.1
 * plus haut) : il est donc impossible de les distinguer par un simple
 * sélecteur de bloc. La seule ancre disponible est le statut COCHÉ à
 * l'étape 1, dans le MÊME formulaire — `input[name="type_copro"]`, confirmé
 * présent dans le HTML rendu (`<input type="radio" name="type_copro"
 * value="individuel" …>`, etc.). `:has()` remonte jusqu'à `.arc-tunnel`
 * (section racine commune à l'étape 1 et à l'étape 4) pour lire cette coche.
 *
 * ⚠️ SPÉCIFICITÉ, PAS ORDRE DE CASCADE : chaque sélecteur ci-dessous ajoute
 * une clause `:has(input[name="type_copro"][value="…"]:checked)` sur
 * `.arc-tunnel`, EN PLUS de la base identique à la règle T2 de G1. Cette
 * clause seule vaut 3 (1 attribut de nom + 1 attribut de valeur + 1
 * pseudo-classe `:checked`) : la règle l'emporte donc PAR CONSTRUCTION sur
 * celle de G1, quel que soit l'ordre des deux blocs dans le fichier au
 * moment de la fusion des lots — sans `!important`, sans modifier ni
 * supprimer la règle de G1, et sans toucher à `copro_nom`/`collectivite_nom`
 * ni aux règles `order:` de G1 sur ces deux champs-là.
 *
 * Les règles G2.1 plus haut dans ce fichier (Adresse 4 · CP 2 · Ville 3 ·
 * Pays 3, sans condition de statut) sont devenues inertes pour les neuf
 * statuts depuis l'ajout de la règle T2 de G1 (même sélecteur, posée plus
 * tard, spécificité égale) : laissées telles quelles (rien à supprimer),
 * c'est cette section G2-bis qui les remplace effectivement pour les trois
 * statuts concernés.
 */
@media (min-width: 1025px) {

	.arc-tunnel:has(input[name="type_copro"][value="individuel"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="adresse"]),
	.arc-tunnel:has(input[name="type_copro"][value="bailleur"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="adresse"]),
	.arc-tunnel:has(input[name="type_copro"][value="collectivite"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="adresse"]) {
		grid-column: span 4;
	}

	.arc-tunnel:has(input[name="type_copro"][value="individuel"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="code_postal"]),
	.arc-tunnel:has(input[name="type_copro"][value="bailleur"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="code_postal"]),
	.arc-tunnel:has(input[name="type_copro"][value="collectivite"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="code_postal"]) {
		grid-column: span 2;
	}

	.arc-tunnel:has(input[name="type_copro"][value="individuel"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="ville"]),
	.arc-tunnel:has(input[name="type_copro"][value="bailleur"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="ville"]),
	.arc-tunnel:has(input[name="type_copro"][value="collectivite"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="ville"]) {
		grid-column: span 3;
	}

	/*
	 * CORRECTIF (re-vérification Chrome, même jour) : G1 a depuis retiré ses
	 * `order:` sur adresse/code_postal/ville (T2 ne les pose plus — rang de
	 * base 50, DOM naturel). La version précédente de cette règle posait
	 * encore `order: 25` sur Pays pour rejoindre l'ancien rang de Ville (§16
	 * d'origine) : avec adresse/code_postal/ville revenues au rang 50, ce 25
	 * plaçait Pays AVANT tout le reste de l'étape — « remonte tout en haut »,
	 * constaté au clone. Aucune déclaration `order` ici : Pays retombe au
	 * même rang de base (50) que ses trois voisins, et c'est le DOM — Pays
	 * suit Ville immédiatement dans le HTML, §16.2/G2.1 plus haut — qui les
	 * départage, exactement comme adresse/code_postal/ville entre eux.
	 */
	.arc-tunnel:has(input[name="type_copro"][value="individuel"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="pays"]),
	.arc-tunnel:has(input[name="type_copro"][value="bailleur"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="pays"]),
	.arc-tunnel:has(input[name="type_copro"][value="collectivite"]:checked) .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="pays"]) {
		grid-column: span 3;
	}
}

/* === REPASSE 26/09 — G2-5 · adresse du représentant (Collectivité) ======= */

/*
 * Audit préprod du 26/09, verdict E4-COL-03 : le bloc REPRÉSENTANT de la
 * collectivité (Service bénéficiaire·Civilité·Nom·Prénom, puis Téléphone·
 * Email) n'avait pas sa propre adresse. `fix-repasse-G2-etape4-blocs.php`
 * (étape G2-5) a posé un conditional-block dédié, collectivité seule,
 * `arc-etape4-representant-adresse`, entre Prénom et Téléphone : quatre
 * champs facultatifs `representant_adresse`/`representant_code_postal`/
 * `representant_ville`/`representant_pays`.
 *
 * Même construction que les blocs « Informations sur le bien mis en
 * location » (bailleur) et « Informations comptables » (collectivité, plus
 * haut, G2.4/G2.5) : ce bloc n'est utilisé QUE par ce statut, il porte donc
 * SA PROPRE grille à douze colonnes (`grid-template-columns`, scopée à sa
 * classe) plutôt que de dépendre du placement `order`/`:has()` au niveau de
 * la page — aucun risque d'interférence avec les huit autres statuts, aucune
 * clause `:has(type_copro=…)` nécessaire ici (à la différence du G2-bis
 * ci-dessus, qui doit partager des champs eux-mêmes partagés).
 *
 * Adresse·CP·Ville·Pays sur une seule ligne (4 + 2 + 3 + 3 = 12), même
 * répartition que G2.1 (adresse de la copropriété) et G2.5 (Informations
 * comptables) — cohérence visuelle des trois blocs à quatre champs d'adresse
 * de ce document. Aucun `order` à poser : quatre champs, aucun autre frère
 * dans ce bloc, l'ordre du DOM suffit.
 */
@media (min-width: 1025px) {

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-representant-adresse:not([style*="none"]) {
		grid-template-columns: repeat(12, minmax(0, 1fr));
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-representant-adresse:not([style*="none"]) > * {
		grid-column: span 6;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-representant-adresse:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="representant_adresse"]) {
		grid-column: span 4;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-representant-adresse:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="representant_code_postal"]) {
		grid-column: span 2;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-representant-adresse:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="representant_ville"]) {
		grid-column: span 3;
	}

	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-representant-adresse:not([style*="none"]) .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="representant_pays"]) {
		grid-column: span 3;
	}
}

/*
 * Sous 1025px : même règle que R-29 pour les quatre autres adresses de
 * l'étape (copropriété, bien loué, facturation collectivité, syndic) —
 * adresse seule sur sa ligne, Code postal/Ville/Pays retombent sur le
 * comportement par défaut de la grille à deux colonnes du bloc conditionnel
 * (§4) juste en dessous. Même seuil (1025px), jamais un autre.
 */
@media (max-width: 1024px) {
	.arc-tunnel .jet-form-builder-page[data-page="4"] .jet-form-builder__conditional.arc-etape4-representant-adresse .jet-form-builder-row:has(> .jet-form-builder__field-wrap > [name="representant_adresse"]) {
		grid-column: 1 / -1;
	}
}

/* === REPASSE F (30/09) — CTA « Valider et passer au paiement » (étape 4) === */

/*
 * Le bloc posé au lot D11 réutilisait `.arc-tunnel-cotisation__suite`, que
 * le §14.4 MASQUE (`display:none` sous `.arc-tunnel--js`, ne réapparaît que
 * sous `--calcule`, règle de l'étape 2) : à l'étape 4 le CTA n'apparaissait
 * donc jamais. `fix-repasse-F-etape4-general.php` (C5) lui donne son propre
 * conteneur. Même composant `.arc-tunnel-bouton` que « Compléter mon
 * adhésion » (étape 2) et « Adhérer et payer en ligne » (étape 5) : le
 * style, l'état grisé (`--verrouille`) et le ×1,2 mobile
 * (`[data-arc-tunnel="completer"]`, max-width 782px) viennent de règles
 * existantes, rien à redéfinir ici que le centrage.
 */
.arc-tunnel .arc-tunnel-etape4-cta {
	display: flex;
	justify-content: center;
	margin: clamp(14px, 1.6vw, 26px) 0 0;
}

/*
 * État grisé du CTA de l'étape 4 : `.arc-tunnel-bouton--verrouille` (§3, une
 * seule classe) perd contre `.arc-tunnel .arc-tunnel-bouton` (§3.1, deux
 * classes) — constaté en Chromium, le CTA verrouillé restait bleu. Même
 * gris que « Suivant » verrouillé.
 */
.arc-tunnel .arc-tunnel-bouton.arc-tunnel-bouton--verrouille,
.arc-tunnel .arc-tunnel-bouton.arc-tunnel-bouton--verrouille:hover {
	background: var(--arc-gris);
	border-color: var(--arc-gris);
	color: #fff;
	cursor: not-allowed;
}

/* === RETOURS ARC 01/10 — étape 3, adresse du référent, erreurs ============ */

/*
 * B1-B3 — Étape 3 : les accordéons « Services de base / Accès gratuit… /
 * Assistance… / Services optionnels » deviennent UN bloc de texte par statut,
 * sans case à cocher (`exports/fix-2026-10-01-tunnel-raphael.php`). Hauteur
 * bornée, ascenseur pour le reste : la page ne s'allonge plus de trois écrans
 * et le bouton « Continuer » reste à portée.
 */
.arc-tunnel .arc-tunnel-services-texte {
	grid-column: 1 / -1;
}

.arc-tunnel .arc-tunnel-services-texte__corps {
	max-height: 420px;
	overflow-y: auto;
	overscroll-behavior: contain;
	padding: clamp(14px, 1.4vw, 24px) clamp(16px, 1.8vw, 30px);
	border: 1px solid var(--arc-bordure);
	border-radius: var(--arc-rayon-doux);
	background: #fff;
	box-shadow: var(--arc-ombre);
	font-family: var(--arc-ui);
	font-size: var(--arc-t-corps);
	line-height: 1.55;
	color: var(--arc-texte);
	text-align: left;
}

.arc-tunnel .arc-tunnel-services-texte__titre {
	margin: 1.4em 0 0.6em;
	font-family: var(--arc-titre);
	font-size: 20px;
	font-weight: 700;
	line-height: 1.3;
	text-transform: uppercase;
	color: var(--arc-bleu);
}

.arc-tunnel .arc-tunnel-services-texte__titre:first-child {
	margin-top: 0;
}

.arc-tunnel .arc-tunnel-services-texte__corps ul {
	margin: 0;
	padding-left: 1.2em;
}

.arc-tunnel .arc-tunnel-services-texte__corps li + li {
	margin-top: 0.4em;
}

@media (max-width: 782px) {
	.arc-tunnel .arc-tunnel-services-texte__corps {
		max-height: 360px;
		font-size: 16px;
	}

	.arc-tunnel .arc-tunnel-services-texte__titre {
		font-size: 16px;
	}
}

/*
 * E — Adresse du référent / représentant : le bloc
 * `arc-etape4-representant-adresse` (sa propre grille, plus haut) sert
 * désormais six statuts et suit l'email dans le DOM. Sans rang explicite il
 * retomberait au rang de base (50) et passerait SOUS le bloc copropriété.
 * Rang 17 : juste après l'email (16, repasse G1) et avant le titre
 * « Votre copropriété » (20).
 */
@media (min-width: 1025px) {
	.arc-tunnel .jet-form-builder-page[data-page="4"]:not(.jet-form-builder-page--hidden) > .jet-form-builder__conditional.arc-etape4-representant-adresse {
		order: 17;
	}
}

/*
 * C2 — Message d'erreur du formulaire : remonté EN HAUT du tunnel par
 * arc-tunnel.js (classe `arc-tunnel-erreur-haut`) quand le serveur refuse
 * l'adhésion. La saisie, elle, reste en place (soumission AJAX).
 */
.arc-tunnel .arc-tunnel-erreur-haut {
	margin: 0 0 clamp(14px, 1.4vw, 22px);
	scroll-margin-top: 120px;
}

.arc-tunnel .arc-tunnel-erreur-haut .jet-form-builder-message {
	margin: 0;
	padding: 14px 18px;
	border: 1px solid var(--arc-rouge);
	border-radius: var(--arc-rayon-doux);
	background: var(--arc-rouge-pale);
	color: var(--arc-rouge);
	font-family: var(--arc-ui);
	font-size: var(--arc-t-corps);
	font-weight: 500;
	text-align: center;
}

/* =========================================================================
 * === DASHBOARD « MON COMPTE » — retours David du 2026-10-01 ===
 * Mise en page posée par exports/apply-dashboard-2026-10-01-elementor.php.
 * Seul ce que les réglages natifs Elementor / JetFormBuilder ne couvrent pas
 * est ici : l'intérieur des formulaires JFB, les onglets natifs, et le bloc
 * « Pièces à fournir » (rendu PHP).
 * ========================================================================= */

/* --- Mon profil : blocs bleus Newsletter / Mot de passe ------------------
   Même rendu que « Autorisation de lecture de vos consultations » : texte
   blanc sur fond bleu ARC, bouton jaune « Enregistrer / Mettre à jour ».
   Le fond, l'arrondi et les marges sont des réglages du conteneur Elementor. */
.arc-form-bleu,
.arc-form-bleu .jet-form-builder__label-text,
.arc-form-bleu .jet-form-builder__field-label,
.arc-form-bleu .jet-form-builder__desc,
.arc-form-bleu .jet-form-builder-message {
	color: #ffffff;
	font-family: Roboto, sans-serif;
}
.arc-form-bleu .jet-form-builder__field-label span {
	color: #ffffff;
}
.arc-form-bleu .jet-form-builder__desc {
	opacity: 0.9;
}
.arc-form-bleu .jet-form-builder-row {
	max-width: 520px;
}
.arc-form-bleu input[type="password"] {
	background: #ffffff;
	border: 0;
	border-radius: 8px;
	color: #1b2a4a;
	padding: 9px 12px;
}
.arc-form-bleu .jet-form-builder__action-button,
.arc-form-bleu button[type="submit"] {
	background: #f5b32e;
	color: #1b2a4a;
	border: 0;
	border-radius: 8px;
	padding: 11px 24px;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.2;
	cursor: pointer;
}
.arc-form-bleu .jet-form-builder__action-button:hover,
.arc-form-bleu button[type="submit"]:hover {
	background: #e9a51c;
	color: #1b2a4a;
}
.arc-form-bleu .jet-form-builder-message--success {
	background: rgba(255, 255, 255, 0.92);
	border: 1px solid #a8dfbb;
	color: #1c7a3e;
	border-radius: 8px;
}
.arc-form-bleu .jet-form-builder-message--error {
	background: #fdecec;
	border: 1px solid #e0a0a0;
	color: #a12;
	border-radius: 8px;
}

/* --- Ma copropriété : onglets natifs (Membres · Caractéristiques · Pièces)
   Réglés par les variables CSS du widget Onglets d'Elementor lui-même
   (`--n-tabs-*`), au gabarit du menu du compte : actif = bleu ARC, titres
   alignés à gauche. Double classe pour passer devant les valeurs par défaut
   du widget (`.elementor-widget-n-tabs`). */
.arc-copro-onglets.elementor-widget-n-tabs {
	--n-tabs-heading-justify-content: flex-start;
	--n-tabs-title-flex-grow: 0;
	--n-tabs-title-gap: 8px;
	--n-tabs-gap: 18px;
	--n-tabs-title-font-size: 15px;
	--n-tabs-title-padding-block-start: 12px;
	--n-tabs-title-padding-block-end: 12px;
	--n-tabs-title-padding-inline-start: 22px;
	--n-tabs-title-padding-inline-end: 22px;
	--n-tabs-title-border-radius: 8px;
	--n-tabs-title-background-color: #f5f8fb;
	--n-tabs-title-background-color-hover: #eaf6fd;
	--n-tabs-title-background-color-active: #009fe3;
	--n-tabs-title-color: #1b2a4a;
	--n-tabs-title-color-hover: #1b2a4a;
	--n-tabs-title-color-active: #ffffff;
	--n-tabs-border-width: 0;
}
.arc-copro-onglets .e-n-tab-title {
	font-family: Roboto, sans-serif;
	font-weight: 600;
	border: 1px solid #e4ebf2;
}
.arc-copro-onglets .e-n-tab-title[aria-selected="true"] {
	border-color: #009fe3;
	box-shadow: 0 2px 6px rgba(0, 159, 227, 0.35);
}

/* ⚠️ Le CSS personnalisé du template « Header HP » (Elementor #14102) bloque
   le défilement de la page avec `html:has(.e-active), body:has(.e-active)
   { overflow: hidden; max-height: 100lvh }`. Il vise le méga-menu ouvert,
   mais `.e-active` est AUSSI la classe de l'onglet ouvert du widget Onglets :
   sur « Ma copropriété », la page ne défilait plus et sa hauteur était
   tronquée. On rétablit le défilement quand un onglet est actif, SAUF si le
   méga-menu est réellement ouvert (son verrou reste alors intact). */
html:has(.e-n-tabs .e-active):not(:has(.e-n-menu-content.e-active)),
body:has(.e-n-tabs .e-active):not(:has(.e-n-menu-content.e-active)) {
	overflow: visible;
	max-height: none;
}

/* --- Pièces à fournir : le bouton d'ajout DANS la ligne ----------------- */
.arc-ob-pieces-etat .arc-ob-piece-ligne {
	display: flex;
	align-items: center;
	gap: 16px;
	flex-wrap: wrap;
	margin: 0 0 8px;
}
.arc-ob-pieces-etat .arc-ob-piece-ligne > .arc-ob-piece-lien,
.arc-ob-pieces-etat .arc-ob-piece-ligne > .arc-ob-piece-manquant {
	flex: 1 1 auto;
}
.arc-ob-piece-fichier {
	position: absolute;
	width: 1px;
	height: 1px;
	opacity: 0;
	overflow: hidden;
}
.arc-ob-piece-ajouter,
.arc-ob-piece-envoyer {
	display: inline-block;
	margin-left: auto;
	background: #009fe3;
	color: #ffffff;
	border: 0;
	border-radius: 8px;
	padding: 8px 20px;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.2;
	cursor: pointer;
}
.arc-ob-piece-ajouter:hover,
.arc-ob-piece-envoyer:hover {
	background: #0088c4;
}
.arc-ob-piece-fichier:focus-visible + .arc-ob-piece-ajouter {
	outline: 2px solid #1b2a4a;
	outline-offset: 2px;
}
.arc-ob-js .arc-ob-piece-envoyer {
	display: none;
}

/* --- Gestion des membres : formulaire « Ajouter un membre » --------------
   « Inscrire » (bouton JFB) au gabarit des boutons du dashboard ; « Annuler »
   (bouton Elementor voisin) en version contour, réglée sur le widget. */
#arc-ajouter-membre .jet-form-builder__action-button {
	background: #009fe3;
	color: #ffffff;
	border: 1px solid #009fe3;
	border-radius: 8px;
	padding: 12px 26px;
	font-size: 15px;
	font-weight: 600;
	line-height: 20px;
	cursor: pointer;
}
#arc-ajouter-membre .jet-form-builder__action-button:hover {
	background: #0088c4;
	border-color: #0088c4;
}

/* --- Gestion des membres : formulaire « Modifier un membre » ------------- */
.arc-membre-edit {
	background: #f5f8fb;
	border: 1px solid #e4ebf2;
	border-radius: 12px;
	padding: 20px 24px;
	margin: 0 0 18px;
	font-family: Roboto, sans-serif;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 12px;
}
/* Même principe que « Ajouter un membre » : les enveloppes du formulaire
   s'effacent (`display: contents`) pour que les rangées deviennent des
   enfants directs du bloc, et que « Annuler » se range à côté
   d'« Enregistrer ». Champs sur deux colonnes. */
.arc-membre-edit > .arc-membre-edit__titre,
.arc-membre-edit > .arc-membre-edit__note {
	flex: 0 0 100%;
}
.arc-membre-edit .jet-fb-form-block,
.arc-membre-edit .jet-form-builder {
	display: contents;
}
.arc-membre-edit .jet-form-builder-row {
	flex: 0 0 calc(50% - 6px);
	margin: 0;
}
.arc-membre-edit .jet-form-builder-row .jet-form-builder__field {
	width: 100%;
}
/* Le téléphone occupe sa demi-ligne et réserve l'autre moitié : les deux
   boutons repartent ensemble sur la ligne suivante. */
.arc-membre-edit .jet-form-builder-row:has([name="arc_me_telephone"]) {
	margin-right: calc(50% - 6px);
}
.arc-membre-edit .jet-form-builder-messages-wrap {
	flex: 0 0 100%;
	/* Dernière du bloc : placée entre « Enregistrer » et « Annuler » dans le
	   DOM, elle séparait les deux boutons. */
	order: 1;
}
@media (max-width: 640px) {
	.arc-membre-edit .jet-form-builder-row {
		flex: 0 0 100%;
	}
	.arc-membre-edit .jet-form-builder-row:has([name="arc_me_telephone"]) {
		margin-right: 0;
	}
}
.arc-membre-edit .jet-form-builder-row.field-type-submit-field {
	flex: 0 0 auto;
	margin: 0;
	padding: 0;
}
.arc-membre-edit__titre {
	margin: 0;
	font-size: 18px;
	font-weight: 800;
	color: #1077b3;
}
.arc-membre-edit__note {
	margin: 0;
	font-size: 14px;
	color: #5a6472;
}
.arc-membre-edit .jet-form-builder__action-button {
	background: #009fe3;
	color: #ffffff;
	border: 1px solid #009fe3;
	border-radius: 8px;
	padding: 12px 26px;
	font-size: 15px;
	font-weight: 600;
	line-height: 20px;
	cursor: pointer;
}
.arc-membre-edit__annuler {
	display: inline-block;
	background: #ffffff;
	color: #009fe3;
	border: 1px solid #009fe3;
	border-radius: 8px;
	padding: 12px 26px;
	font-size: 15px;
	font-weight: 600;
	line-height: 20px;
	text-decoration: none;
}
.arc-membre-edit__annuler:hover {
	background: #009fe3;
	color: #ffffff;
}
.arc-membre-edit-erreur {
	padding: 10px 14px;
	margin-bottom: 14px;
	background: #fdecec;
	border: 1px solid #e0a0a0;
	color: #a12;
	border-radius: 8px;
	font-size: 14px;
}

/* =========================================================================
 * === ESPACE MEMBRE — norme unique des champs de formulaire (02/10) ===
 * Relevé du 02/10 : quatre gabarits différents selon les formulaires (13/14,
 * 16/16, 18 px non gras, police système). Référence retenue : le formulaire
 * « Modifier mes informations » de Mon profil — libellé Roboto 13 px gras,
 * champ 14 px, aide 12 px. S'applique à TOUS les formulaires JetFormBuilder
 * de l'espace compte (profil, newsletter, mot de passe, ajout et
 * modification de membre). Les couleurs restent celles de chaque bloc (texte
 * blanc dans les blocs bleus). Le bloc « Caractéristiques » (rendu PHP)
 * porte déjà ces tailles en ligne.
 * ========================================================================= */
.woocommerce-MyAccount-content .jet-form-builder__label,
.woocommerce-MyAccount-content .jet-form-builder__label-text {
	font-family: Roboto, sans-serif;
	font-size: 13px;
	font-weight: 600;
	line-height: 1.4;
}
.woocommerce-MyAccount-content .jet-form-builder__field:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
.woocommerce-MyAccount-content .jet-form-builder select.jet-form-builder__field {
	font-family: Roboto, sans-serif;
	font-size: 14px;
	font-weight: 400;
	line-height: 1.4;
}
.woocommerce-MyAccount-content .jet-form-builder__field-label,
.woocommerce-MyAccount-content .jet-form-builder__field-label span {
	font-family: Roboto, sans-serif;
	font-size: 14px;
	font-weight: 400;
}
.woocommerce-MyAccount-content .jet-form-builder__desc {
	font-family: Roboto, sans-serif;
	font-size: 12px;
	font-weight: 400;
}
/* Mobile : 16 px minimum dans les champs, sinon iOS zoome la page dès qu'on
   touche un champ (même seuil que le widget « Ajouter un membre »). */
@media (max-width: 767px) {
	.woocommerce-MyAccount-content .jet-form-builder__field:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
	.woocommerce-MyAccount-content .jet-form-builder select.jet-form-builder__field {
		font-size: 16px;
	}
}

/* Valeurs de fiche rendues par shortcode (hors Dynamic Field) : même gabarit
   que les autres valeurs de la fiche, 15 px gras. */
.elementor-element-pv9 .elementor-widget-container,
.elementor-element-pv9 .elementor-shortcode {
	font-family: Roboto, sans-serif;
	font-size: 15px;
	font-weight: 700;
	color: #1b2a4a;
	line-height: 1.4;
}

/* Message « Aucun rendez-vous à venir » du tableau de bord : texte courant de
   l'espace membre, pas la taille de corps par défaut du thème (18 px). */
.woocommerce-MyAccount-content .jet-listing-not-found {
	font-family: Roboto, sans-serif;
	font-size: 15px;
	color: #5a6472;
}

/* === ANNULATION D'UN RENDEZ-VOUS (mu-plugin arc-rdv-annulation.php) ====== */
/* Bloc ajouté sous chaque ligne « Consultation (ligne) » : lien discret,
   puis confirmation en carte, sur le modèle de la suppression d'un membre. */
.ec-rdv-annul {
	flex-basis: 100%;
	width: 100%;
	margin-top: 10px;
	font-family: Roboto, sans-serif;
	font-size: 14px;
	line-height: 1.4;
}
/* 2026-10-15 : agrandi à la demande de David (14px jugé trop petit face à
   la ligne du RDV en ~22px). Seul le lien grossit : la carte de confirmation
   garde ses tailles. */
.ec-rdv-annul a.ec-rdv-annul__lien {
	display: inline-block;
	padding: 4px 0;
	font-size: 18px;
	font-weight: 500;
	color: #c0392b;
	text-decoration: underline;
	text-underline-offset: 2px;
}
.ec-rdv-annul a.ec-rdv-annul__lien:hover,
.ec-rdv-annul a.ec-rdv-annul__lien:focus {
	color: #962d22;
}
.ec-rdv-annul--tard {
	color: #5a6472;
	font-size: 13px;
}
.ec-rdv-annul--confirm {
	background: #fff;
	border: 1px solid #e0a0a0;
	border-radius: 12px;
	padding: 14px 16px;
}
.ec-rdv-annul__question {
	margin: 0 0 12px;
	color: #1b2a4a;
	font-size: 14px;
}
.ec-rdv-annul__form {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	align-items: center;
	margin: 0;
}
.ec-rdv-annul button.ec-rdv-annul__confirmer {
	background: #c0392b;
	color: #fff;
	border: 0;
	border-radius: 8px;
	padding: 10px 18px;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.3;
	text-transform: none;
	cursor: pointer;
}
.ec-rdv-annul button.ec-rdv-annul__confirmer:hover,
.ec-rdv-annul button.ec-rdv-annul__confirmer:focus {
	background: #962d22;
	color: #fff;
}
.ec-rdv-annul a.ec-rdv-annul__garder {
	color: #1077b3;
	text-decoration: none;
	font-size: 14px;
}
.ec-rdv-annul-notice {
	padding: 10px 14px;
	margin-bottom: 14px;
	border-radius: 8px;
	font-family: Roboto, sans-serif;
	font-size: 14px;
}
.ec-rdv-annul-notice--ok {
	background: #eefaf1;
	border: 1px solid #a8dfbb;
	color: #1c7a3e;
}
.ec-rdv-annul-notice--ko {
	background: #fdecec;
	border: 1px solid #e0a0a0;
	color: #a12;
}

/* === MOT DE PASSE PERDU / NOUVEAU MOT DE PASSE (WooCommerce) ============== */
/* 2026-10-15 — même habillage que le formulaire de connexion de /login/
   (widget Login Elementor) : carte bleue #009FE3, champs blancs 48px sans
   bordure arrondis à 8px, bouton bleu foncé #00587D arrondi à 10px, textes
   blancs. Valeurs relevées sur la page /login/ rendue en préprod.

   ⚠️ LA CARTE EST L'ENVELOPPE `.woocommerce`, PAS LE FORMULAIRE.
   Cette page a trois états, tous rendus dans la même enveloppe :
     1. demande du lien (form.lost_reset_password, champ `user_login`) ;
     2. nouveau mot de passe (même classe de form, `password_1`/`password_2`,
        ?show-reset-form=true) ;
     3. « lien envoyé » (?reset-link-sent=true) : une `.woocommerce-message`
        PUIS un <p> frère, sans conteneur commun.
   Styler chaque élément séparément laissait l'état 3 en deux blocs décalés ;
   l'enveloppe donne une seule carte dans les trois cas, erreurs comprises.
   CSS seul : aucun texte, champ ni lien ajouté au gabarit WooCommerce. */
body.woocommerce-lost-password .woocommerce {
	/* Mon compte met cette enveloppe en flex row + gap 30px (menu | contenu) :
	   sans menu ici, cela décalait l'alerte « lien envoyé » de 30px. */
	display: block;
	width: 100%;
	max-width: 720px;
	margin: 48px auto;
	padding: 48px 56px;
	background: #009fe3;
	color: #fff;
	font-family: Roboto, sans-serif;
	font-size: 16px;
	line-height: 1.5;
	box-sizing: border-box;
}
body.woocommerce-lost-password .woocommerce p {
	color: #fff;
}
body.woocommerce-lost-password .woocommerce a {
	color: #fff;
	text-decoration: underline;
}
body.woocommerce-lost-password form.lost_reset_password {
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
}
/* Les <br> viennent de wpautop sur le gabarit WooCommerce : ils ajoutaient
   une ligne vide avant le bouton et sous le dernier paragraphe (nonce). */
body.woocommerce-lost-password form.lost_reset_password br {
	display: none;
}
body.woocommerce-lost-password form.lost_reset_password > p:first-of-type {
	margin: 0 0 24px;
	font-size: 17px;
}
/* WooCommerce met `form-row-first` / `-last` en deux colonnes flottantes :
   un seul champ par ligne, pleine largeur, comme sur /login/. */
body.woocommerce-lost-password form.lost_reset_password .form-row {
	float: none;
	width: 100%;
	margin: 0 0 16px;
	padding: 0;
}
body.woocommerce-lost-password form.lost_reset_password label {
	display: block;
	margin-bottom: 6px;
	color: #fff;
	font-size: 16px;
	font-weight: 500;
}
body.woocommerce-lost-password form.lost_reset_password label .required {
	color: #fff;
}
body.woocommerce-lost-password form.lost_reset_password input.input-text {
	width: 100%;
	height: 48px;
	padding: 0 18px;
	background: #fff;
	color: #000;
	border: 0;
	border-radius: 8px;
	font-family: Roboto, sans-serif;
	font-size: 14px;
	box-shadow: none;
	box-sizing: border-box;
}
body.woocommerce-lost-password form.lost_reset_password input.input-text:focus {
	outline: 2px solid #00587d;
	outline-offset: 2px;
}
/* Œil « afficher le mot de passe » de WooCommerce, dans le champ blanc. */
body.woocommerce-lost-password form.lost_reset_password .password-input {
	display: block;
	position: relative;
}
body.woocommerce-lost-password form.lost_reset_password .show-password-input {
	top: 50%;
	right: 14px;
	transform: translateY(-50%);
	color: #009fe3;
}
body.woocommerce-lost-password form.lost_reset_password button.button {
	margin-top: 8px;
	padding: 10px 24px;
	background: #00587d;
	color: #fff;
	border: 0;
	border-radius: 10px;
	font-family: Roboto, sans-serif;
	font-size: 18px;
	font-weight: 400;
	line-height: 1.4;
	text-transform: none;
	cursor: pointer;
}
body.woocommerce-lost-password form.lost_reset_password button.button:hover,
body.woocommerce-lost-password form.lost_reset_password button.button:focus {
	background: #00465f;
	color: #fff;
}
/* État 3 « lien envoyé » : la confirmation devient le titre de la carte.
   WooCommerce lui donne le focus (tabindex=-1, rôle alert) : le contour
   noir du navigateur n'apporte rien sur un élément non interactif, le
   lecteur d'écran l'annonce de toute façon via role="alert". */
/* Sélecteur renforcé (`div…[role]`) : une règle WooCommerce/Elementor plus
   spécifique imposait encore 70px de retrait à gauche. */
body.woocommerce-lost-password .woocommerce > div.woocommerce-message[role] {
	margin: 0 0 16px;
	padding: 0;
	background: none;
	border: 0;
	color: #fff;
	font-size: 20px;
	font-weight: 500;
}
body.woocommerce-lost-password .woocommerce > .woocommerce-message:focus {
	outline: none;
}
body.woocommerce-lost-password .woocommerce > .woocommerce-message::before {
	display: none;
}
body.woocommerce-lost-password .woocommerce > p:last-child {
	margin-bottom: 0;
}
@media (max-width: 767px) {
	body.woocommerce-lost-password .woocommerce {
		margin: 24px 0;
		padding: 32px 20px;
	}
}

/* === CONNEXION /login/ : MESSAGE D'ÉCHEC =================================== */
/* 2026-10-15 — posé par functions.php (filtre elementor/widget/render_content)
   au-dessus du widget Login quand ?login_erreur= est présent. Carte blanche
   sur le fond bleu #009FE3 du bloc de connexion, texte rouge foncé lisible. */
.ec-login-erreur {
	margin: 0 0 16px;
	padding: 12px 16px;
	background: #fff;
	border-left: 4px solid #c0392b;
	border-radius: 8px;
	color: #a12a1e;
	font-family: Roboto, sans-serif;
	font-size: 15px;
	font-weight: 500;
	line-height: 1.4;
}

/* === CHANGEMENT D'ADRESSE E-MAIL : PAGE DE CONFIRMATION + BANDEAU ========= */
/* 2026-10-15 — mu-plugins/arc-profil-email-confirmation.php.
   1. Carte rendue entre l'en-tête et le pied du thème quand on suit le lien
      d'un e-mail de confirmation (`/?arc_pfu=…&arc_pfe=…`). Blanche, bordure
      et bouton aux couleurs de /login/ et « mot de passe perdu » (#00587D).
      Le bouton est un vrai <form method="post"> : un GET ne confirme jamais
      rien (scanners de liens des messageries). Aucun JS.
   2. Bandeau discret sous l'accroche [arc_bonjour] de « Mon profil » tant
      qu'un changement attend sa confirmation. */
.ec-email-confirmation {
	display: block;
	padding: 48px 16px;
	box-sizing: border-box;
}
.ec-email-confirmation__carte {
	max-width: 640px;
	margin: 0 auto;
	padding: 40px 48px;
	background: #fff;
	border: 1px solid #e4ebf2;
	border-top: 4px solid #009fe3;
	border-radius: 13px;
	box-shadow: 0 1px 2px rgba(27, 42, 74, 0.06);
	color: #1d1d1d;
	font-family: Roboto, sans-serif;
	font-size: 16px;
	line-height: 1.55;
	box-sizing: border-box;
}
.ec-email-confirmation__carte--erreur {
	border-top-color: #c0392b;
}
.ec-email-confirmation__titre {
	margin: 0 0 16px;
	color: #00587d;
	font-family: Lora, Georgia, "Times New Roman", serif;
	font-size: 26px;
	font-weight: 600;
	line-height: 1.3;
}
.ec-email-confirmation__texte {
	margin: 0 0 24px;
	overflow-wrap: anywhere; /* adresses e-mail longues sur mobile */
}
.ec-email-confirmation__form {
	margin: 0 0 24px;
}
.ec-email-confirmation__bouton {
	padding: 10px 24px;
	background: #00587d;
	color: #fff;
	border: 0;
	border-radius: 10px;
	font-family: Roboto, sans-serif;
	font-size: 18px;
	font-weight: 400;
	line-height: 1.4;
	text-transform: none;
	cursor: pointer;
}
.ec-email-confirmation__bouton:hover,
.ec-email-confirmation__bouton:focus {
	background: #00465f;
	color: #fff;
}
.ec-email-confirmation__retour {
	margin: 0;
	font-size: 15px;
}
.ec-email-confirmation__retour a {
	color: #009fe3;
	text-decoration: underline;
}
@media (max-width: 767px) {
	.ec-email-confirmation {
		padding: 24px 16px;
	}
	.ec-email-confirmation__carte {
		padding: 28px 20px;
	}
	.ec-email-confirmation__titre {
		font-size: 22px;
	}
}
.ec-email-attente {
	margin: 12px 0 0;
	padding: 10px 14px;
	background: #eaf6fd;
	border-left: 4px solid #009fe3;
	border-radius: 8px;
	color: #005870;
	font-family: Roboto, sans-serif;
	font-size: 14px;
	line-height: 1.45;
	overflow-wrap: anywhere;
}
