/* ==========================================================================
   Œuvra — Contact · feuille du gabarit templates/page-contact.php (chargée après main.css).
   1. Base = handoff/design/css/pages/contact.css, sans ses !important (3 règles, 4 déclarations) : ils ne battaient
      que les styles inline du prototype (.ct-form padding/gap, bouton margin-top, .ct-links gap), devenus les classes
      du §2 — la règle Mobile, plus loin dans la feuille à spécificité égale, l'emporte sans !important.
   2. Styles inline du prototype (prototype/contact.html) convertis en classes. Colonnes des deux splits (flex,
      largeur, écart, alignement) limitées à ≥ 1024 : sous 1024, l'empilement de .l-split de main.css (sans
      !important depuis le nettoyage partagé ; .l-split > * : flex none, width auto) s'applique comme dans le
      prototype, où site.css l'imposait par !important.
      « ≥ 1024 » s'écrit `@media not all and (max-width: 1023px)` : complément exact de l'empilement de .l-split
      (main.css, max-width: 1023px), convention du pied (main.css). Une largeur fractionnaire entre 1023 et 1024 px
      (zoom du navigateur ou mise à l'échelle Windows à 110 % : fenêtre de 1037 px → 1023,64 px) ne satisfait ni
      (max-width: 1023px) ni (min-width: 1024px) : avec cette dernière, les splits y passaient en ligne sans écart
      (texte 333 | formulaire 562,5 ; Support 265,6 | 560, titre collé au paragraphe). Au prototype, les colonnes sont
      des styles inline, sans requête : même rendu qu'à 1024 (418 | 418, écart 6,667 %).
   3. Formulaire de production (composants.md §7) : composants du DS (.oe-field, .oe-input, .oe-textarea,
      .oe-check__box, .oe-notice — ds-oeuvra-bundle.css, non modifié) ramenés aux dimensions du prototype ;
      états du DS (survol, focus, erreur, coché, désactivé) conservés tels quels.
   Composants partagés utilisés (main.css) : .c-hero, .l-split (empilé < 1024, sans !important dans main.css),
   .l-section--surface, .c-arrow, .oe-kicker, .t-*, .u-block, retour de clic [data-ripple] (M07).
   Aucune animation propre à la page (motion-spec.md : M07, M08, M09 seulement, déjà dans main.css et le DS).
   ========================================================================== */

/* ---------- 1. contact.css du handoff (sans !important) ---------- */

/* flex: 1 1 auto du handoff limité à ≥ 1024 (bloc Hero du §2) : sous 1024, flex: none de .l-split > * (main.css). */
.ct-form { min-width: 0; }
.ct-form__row2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }

/* ---------- 2. Styles inline du prototype convertis ---------- */

/* Hero : .l-split style="display: flex; align-items: flex-start; gap: 6.667%" (sous 1024 : .l-split de main.css).
   Colonne texte : style="flex: 0 0 auto; width: 46.667%; display: flex; flex-direction: column; gap: 20px; padding-top: 24px" */
@media not all and (max-width: 1023px) {
.ct-hero__split { align-items: flex-start; gap: 6.667%; }
.ct-hero__text { flex: 0 0 auto; width: 46.667%; }
.ct-form { flex: 1 1 auto; }
}
.ct-hero__text { display: flex; flex-direction: column; gap: 20px; padding-top: 24px; }
/* Chapô : style="margin: 8px 0 0; max-width: 520px" (0,1,0 après .t-lead-hero de main.css). */
.ct-hero__lead { margin: 8px 0 0; max-width: 520px; }
/* Liens-flèches : style="display: flex; flex-wrap: wrap; gap: 12px 32px; margin-top: 8px" */
.ct-links { display: flex; flex-wrap: wrap; gap: 12px 32px; margin-top: 8px; }
/* Formulaire : style="box-sizing: border-box; display: flex; flex-direction: column; gap: 20px; padding: 40px;
   border-radius: var(--radius-xl); border: 1px solid var(--border-100); background: var(--bg-surface)" */
.ct-form { box-sizing: border-box; display: flex; flex-direction: column; gap: 20px; padding: 40px; border-radius: var(--radius-xl); border: 1px solid var(--border-100); background: var(--bg-surface); }
/* Bouton : <div style="margin-top: 4px"> */
.ct-form__actions { margin-top: 4px; }
/* <a class="oe-btn"> du prototype → <button type="submit"> (composants.md §7) : le navigateur centre le texte d'un
   bouton (text-align: center) ; hérité comme sur le lien, sans effet visible (contenu en flex). */
.ct-form__actions .oe-btn { text-align: inherit; }

/* Support : .l-split style="display: flex; align-items: center; gap: 6.667%" ; section style="background-color:
   var(--bg-surface)" = .l-section--surface (main.css).
   Colonne texte : style="flex: 0 0 auto; width: 46.667%; display: flex; flex-direction: column; gap: 18px" */
@media not all and (max-width: 1023px) {
.ct-support__split { align-items: center; gap: 6.667%; }
.ct-support__text { flex: 0 0 auto; width: 46.667%; }
.ct-support__body { flex: 1 1 auto; }
}
.ct-support__text { display: flex; flex-direction: column; gap: 18px; }
/* Titre et chapô : style="max-width: 560px" */
.ct-support__title, .ct-support__lead { max-width: 560px; }
/* Colonne droite : style="flex: 1 1 auto; display: flex; flex-direction: column; gap: 20px" (flex : ≥ 1024, ci-dessus). */
.ct-support__body { display: flex; flex-direction: column; gap: 20px; }

/* ---------- 3. Formulaire de production : composants du DS aux dimensions du prototype ---------- */

/* Champ : <label style="display: flex; flex-direction: column; gap: 8px"> → .oe-field (gap 6 du DS → 8).
   Libellé : .oe-field__label (500 14/20 ink-900) et .oe-field__opt (400 ink-500) = styles inline du prototype. */
.ct-form .oe-field { gap: 8px; }
/* Champs : style="height: 44px; padding: 0 14px; … font: 400 15px/22px" → .oe-input (40 px, 0 12, 15/24 du DS). */
.ct-form .oe-input { height: 44px; padding: 0 14px; line-height: 22px; }
/* Zone de texte : style="min-height: 140px; padding: 12px 14px; … resize: vertical" → .oe-textarea (96, 10 12). */
.ct-form .oe-textarea { min-height: 140px; padding: 12px 14px; line-height: 22px; }

/* Consentement : <label style="display: flex; align-items: flex-start; gap: 12px; cursor: pointer">, case dessinée
   <i style="flex: 0 0 auto; margin-top: 3px; width: 18px; height: 18px; border-radius: 4px; border: 1.5px solid
   var(--border-strong); background: var(--bg-surface)"> → vraie case .oe-check__box (16 px, filet 1 du DS → 18, 1,5 ;
   rayon 4 = --radius-xs ; coché, survol et focus du DS) ; texte style="font: 400 14px/22px; color: var(--ink-700)".
   Le lien « Politique de confidentialité » reste hors du <label> (le nom de la case = la phrase seule). */
.ct-check { display: flex; align-items: flex-start; gap: 12px; }
.ct-check .oe-check__box { margin-top: 3px; width: 18px; height: 18px; border-width: 1.5px; }
.ct-check__text { margin: 0; font-family: var(--font-sans); font-weight: 400; font-size: 14px; line-height: 22px; color: var(--ink-700); }
.ct-check__text label { cursor: pointer; }

/* Erreurs (DS) : message .oe-field__error sous le champ (masqué tant qu'il est vide : [hidden] l'emporte sur le
   display: flex du DS), filet --action (.oe-field.is-error du DS, étendu à la case à cocher). */
.ct-form .oe-field__error { margin: 0; }
.ct-form .oe-field__error[hidden] { display: none; }
.ct-form .oe-field.is-error .oe-check__box { border-color: var(--action); }

/* Message d'état (notice.php) : .oe-notice du DS, en tête du formulaire ; lien interne en 500 (comme la FAQ). */
.ct-notice a { font-weight: 500; }
/* Envoi refusé (page-contact.js, reveal) : résumé et champ signalé défilés avec une marge au bord de l'écran, jamais
   collés au bord (libellé visible). Sans effet sur le rendu. */
.ct-form .ct-notice, .ct-form .oe-field { scroll-margin: 24px 0; }

/* Envoi en cours (fetch) : état .oe-btn[aria-disabled="true"] du DS tel quel (opacité 0,5, pointer-events: none — un
   curseur posé sur le bouton serait sans effet), form[aria-busy="true"] ; aucune règle propre à la page. */

/* Pot de miel : hors de l'écran et du flux (aria-hidden, tabindex -1 dans le balisage), jamais affiché. */
.ct-form__hp { 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; }

/* ---------- Responsive (contact.css du handoff) ---------- */

@media (max-width: 767px) {
.ct-form { padding: 24px; gap: 18px; }
.ct-form__row2 { grid-template-columns: minmax(0, 1fr); gap: 18px; }
.ct-form .oe-btn { width: 100%; }
.ct-form__actions { margin-top: 0; }
.ct-links { gap: 12px 24px; }
}

/* ---------- Contraste forcé (Windows) : sans effet sur le rendu normal ---------- */

/* La case (appearance: none) perdrait son état coché, dessiné par un fond : couleurs système explicites.
   Champ en erreur : filet 2 px (la couleur --action est remplacée par la couleur de texte du système). */
@media (forced-colors: active) {
.ct-check .oe-check__box { forced-color-adjust: none; background: Canvas; border-color: CanvasText; }
.ct-check .oe-check__box:checked { background: Highlight; border-color: Highlight; }
.ct-form .oe-field.is-error .oe-input, .ct-form .oe-field.is-error .oe-textarea, .ct-form .oe-field.is-error .oe-check__box { border-width: 2px; }
/* Anneau de focus du DS (box-shadow, supprimée en contraste forcé) → contour système. */
.ct-form :is(.oe-input, .oe-textarea, .oe-check__box, .oe-btn):focus-visible, .ct-form a:focus-visible { outline: 2px solid CanvasText; outline-offset: 2px; }
}
