/* La page /contact/ (#145) — page de CONVERSION sobre. Bucket ③, identité d'île.
 *
 * Chargée par /contact/ SEULE, après css/style.css. Tous les sélecteurs commencent par
 * `.contact-page` : le formulaire de l'accueil partage `.form-field`, `.service-pill`,
 * `.form-submit`, et une règle nue ici le toucherait le jour où la feuille serait chargée ailleurs
 * (leçon `.hero-tag` : une neutralisation ne protège que son fichier). Gardé par contact.test.cjs.
 *
 * AUCUNE animation d'entrée (L1, arbitrage Luca 04/10) : tout est peint au premier rendu, sans
 * script. Les seuls gestes répondent à la main — survol (bouton, pastilles, réseaux) et trait de
 * focus des champs — et ils sont coupés sous `prefers-reduced-motion`.
 *
 * Encres MESURÉES (contrast-core, 04/10) : --color-muted-text 5,89:1 sur le papier du carton,
 * 5,65:1 sur --color-bg ; --color-accent 5,66:1 sur le papier, 5,43:1 sur --color-bg (libellés des
 * coordonnées, R2-1) ; --color-bg sur --color-accent 5,43:1 (pastille active, survol du bouton).
 * --color-muted (3,04:1) ne porte AUCUN texte ici.
 */

/* ── Composition : tranche | tête + coordonnées | carton ─────────────────────────────────────────
   L'ordre du DOM est l'ordre de lecture à toutes les largeurs (titre → carton → coordonnées) :
   la grille place les coordonnées au BAS de la colonne de gauche par ses aires, jamais par `order`. */
.contact-page {
  --ct-papier: #FBF9F6;
  display: grid;
  grid-template-columns: auto minmax(0, 1.05fr) minmax(0, 1fr);
  grid-template-rows: auto 1fr;
  grid-template-areas:
    "tr tete carton"
    "tr infos carton";
  column-gap: clamp(2rem, 6vw, 6rem);
  align-items: start;
  max-width: calc(var(--max-w) + var(--gutter) * 2);
  margin: 0 auto;
  padding-inline: var(--gutter);
  padding-block: clamp(3.5rem, 8vw, 7rem) clamp(4.5rem, 10vw, 8.5rem);
}

/* La tranche est une TOUCHE, pas un mot à lire (calque de `.pu-tranche`) : `aria-hidden` côté HTML,
   opacité basse ici. La rotation est une ORIENTATION fixe du mot vertical, pas un état de départ. */
.contact-page .ct-tranche {
  grid-area: tr;
  writing-mode: vertical-rl;
  transform: rotate(180deg);
  font-family: var(--font-title);
  font-weight: 300;
  font-size: clamp(3rem, 7vw, 5.5rem);
  line-height: 1;
  color: var(--color-text);
  opacity: 0.12;
  user-select: none;
  margin-top: 0.4rem;
}

.contact-page .ct-tete { grid-area: tete; }
.contact-page .ct-carton { grid-area: carton; }
.contact-page .ct-infos {
  grid-area: infos;
  align-self: end;
  display: grid;
  gap: 2.2rem;
  padding-top: clamp(3rem, 6vw, 4.5rem);
}
.contact-page .ct-infos:empty { display: none; }

/* ── H1 en lignes — calque de `.pu-h1` (contrat SEO v1.7 : l'ordre du HTML est l'ordre de lecture,
   aucun `order`). Plancher C123 : `min(2.4rem, 10.24vw)` = 2,4rem dès 375 px, proportionnel dessous.
   AUCUNE animation ni `transform` de départ sur `.word-inner` (L1). */
.contact-page .ct-h1 {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  margin: 0;
  font-size: clamp(min(2.4rem, 10.24vw), 4.4vw, 3.6rem);
  line-height: 1.05;
}
/* #145 bis — ordinateur (grille, ≥ 900 px) : la colonne `.ct-tete` vaut ≈ 0,363 × la largeur puis
   plafonne à 471 px ; en `4.4vw` / `3.6rem`, « Réserver votre séance » y passait sur deux lignes
   (H1 sur 3 lignes à 900-1313 et dès 1446). Corps réglé pour que chaque segment tienne sur SA ligne
   avec ≥ 8 % de marge jusqu'à 2560 (mesuré, gardé par titres-plancher.test.cjs). APRÈS la règle de
   base : même sélecteur, l'ordre source décide. Sous 900 px, la taille ci-dessus est inchangée. */
@media (min-width: 900px) {
  .contact-page .ct-h1 { font-size: clamp(2.2rem, 4vw, 3.25rem); }
}
.contact-page .ct-h1 .word-mask { display: block; overflow: visible; }
.contact-page .ct-h1 .word-inner { font-family: var(--font-title); font-weight: 400; }
.contact-page .ct-h1 .italic-mask .word-inner { font-style: italic; color: var(--color-accent); }
/* Sous-titre de zone : DERNIER segment du <h1>. Son texte s'aligne sur le retrait de la ligne en
   italique (2,5rem) : filet (1,6rem) + gouttière (0,9rem). Le filet est un pseudo-élément sans texte. */
.contact-page .ct-h1 .h1-location {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  margin: 1.1rem 0 0;
  font-family: var(--font-body);
  font-size: 0.72rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.26em;
  line-height: 1.4;
  color: var(--color-muted-text);
}
.contact-page .ct-h1 .h1-location::before {
  content: '';
  flex: 0 0 1.6rem;
  height: 1px;
  background: currentColor;
  opacity: 0.45;
}

.contact-page .contact-tagline {
  margin: clamp(2.2rem, 4vw, 3rem) 0 1rem;
  font-size: 0.74rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--color-accent);
}
.contact-page .contact-intro { margin: 0; color: var(--color-muted-text); line-height: 1.8; max-width: 40ch; }
.contact-page .ct-lien,
.contact-page .form-note a {
  color: inherit;
  background: linear-gradient(currentColor, currentColor) 0 100% / 100% 1px no-repeat;
  padding-bottom: 1px;
}

/* ── Le carton : papier crème en relief, la SEULE signature de la page ─────────────────────────── */
.contact-page .ct-carton {
  container: ct-carton / inline-size;
  position: relative;
  background: var(--ct-papier);
  border: 1px solid rgba(28, 25, 21, 0.05);
  box-shadow:
    0 1px 1px rgba(28, 25, 21, 0.03),
    0 8px 16px -10px rgba(28, 25, 21, 0.08),
    0 34px 60px -34px rgba(28, 25, 21, 0.22);
  padding: clamp(1.75rem, 4.2vw, 3.4rem);
}

.contact-page .contact-form { display: grid; gap: 2rem; }
.contact-page .form-field { display: grid; gap: 0.6rem; }
.contact-page .form-field label,
.contact-page #service-label {
  font-size: 0.68rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--color-muted-text);
}

/* Prénom et Email l'un sous l'autre (L10) : une adresse ne doit jamais être coupée à l'œil. Côte à
   côte SEULEMENT si le carton fait 40rem, ce qui n'arrive pas aux largeurs courantes. */
.contact-page .ct-paire { display: grid; grid-template-columns: minmax(0, 1fr); gap: 2rem; }
@container ct-carton (min-width: 40rem) {
  .contact-page .ct-paire { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}

/* ── Champs soulignés. Le trait d'encre se dessine DEPUIS LE CENTRE au focus : `scaleX`, jamais une
   largeur (une largeur animée relance un reflow à chaque image). `font-size` ≥ 16 px : en dessous,
   iOS zoome la page au focus. Hauteur ≥ 48 px. */
.contact-page .ct-ligne { position: relative; }
.contact-page .ct-ligne::after {
  content: '';
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1px;
  background: var(--color-text);
  transform: scaleX(0);
  transform-origin: center;
  transition: transform 0.45s cubic-bezier(0.4, 0, 0.2, 1);
}
.contact-page .ct-ligne:focus-within::after { transform: scaleX(1); }
.contact-page .form-input,
.contact-page .form-textarea {
  display: block;
  width: 100%;
  min-height: 48px;
  margin: 0;
  padding: 0.55rem 0 0.7rem;
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(28, 25, 21, 0.16);
  border-radius: 0;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: 400;
  color: var(--color-text);
  outline: none;
}
.contact-page .form-textarea { min-height: 7.5rem; resize: vertical; line-height: 1.65; }
.contact-page .form-input::placeholder,
.contact-page .form-textarea::placeholder {
  color: var(--color-muted-text);
  font-family: var(--font-title);
  font-weight: 400;
  font-style: italic;
  font-size: 1.12rem;
}

/* ── Pastilles : le jeu de choix du site (grille de 3, inchangée) ; ACTIVE = terre cuite, la couleur
   du survol des boutons. */
.contact-page .service-pill {
  font-size: clamp(0.64rem, 1.75vw, 0.72rem);
  letter-spacing: 0.1em;
  padding: 0 0.5rem;
  background: transparent;
  color: var(--color-muted-text);
  border: 1px solid rgba(28, 25, 21, 0.18);
}
.contact-page .service-pill:hover { border-color: var(--color-text); color: var(--color-text); }
.contact-page .service-pill.is-active,
.contact-page .service-pill[aria-pressed="true"] {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: var(--color-bg);
}

/* ── Bouton : `.btn-outline` tel quel (L9) — encre au repos, disque terre cuite depuis le centre au
   survol, texte crème. `.form-submit` (style.css) est réglé pour le pied de page SOMBRE : on rend ici
   au bouton les couleurs de `.btn-outline` sur crème. */
.contact-page .ct-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem 1.6rem; margin-top: 0.4rem; }
.contact-page .form-submit {
  align-self: auto;
  justify-content: center;
  gap: 0.7rem;
  min-height: 52px;
  margin-top: 0;
  padding: 0 2.4rem;
  color: var(--color-text);
  border-color: var(--color-text);
  cursor: pointer;
}
.contact-page .form-submit::after { background: var(--color-accent); }
.contact-page .form-submit:hover,
.contact-page .form-submit:focus-visible { color: var(--color-bg); border-color: transparent; }
.contact-page .form-submit:focus-visible::after { clip-path: circle(150% at 50% 50%); }

.contact-page .form-note { margin: 0; max-width: 30ch; font-size: 0.76rem; line-height: 1.55; color: var(--color-muted-text); }
.contact-page .form-success {
  margin: 0;
  font-family: var(--font-title);
  font-weight: 400;
  font-style: italic;
  font-size: 1.35rem;
  color: var(--color-accent);
}
/* A12 — explicite, jamais implicite : la règle UA `[hidden] { display: none }` se fait écraser par
   n'importe quel `display` d'auteur (piège de `.coll-drawer[hidden]`, style.css). Le honeypot et le
   message de réussite sont masqués par `hidden` : ils le restent quoi qu'on pose au-dessus. */
.contact-page [hidden] { display: none; }

/* ── Coordonnées : uniquement typographiques, aucun filet au repos. Une grille PARTAGÉE par les faits et les
   réseaux : les deux rangées s'alignent verticalement.
   R2-4 (essai de Luca, 05/10) : deux colonnes FIXES débordaient entre 900 et 1200 px — « @joycemartensphotographie »
   (205 px mesurés) dans une colonne de 147 px, chevauchant Facebook jusqu'à 1040. Les colonnes font désormais
   13,5rem (216 px) AU MOINS, en `auto-fit` : deux colonnes seulement quand chacune contient le nom le plus large
   avec de l'air (≈ 1 280 px et au-dessus, 1 440 compris), une seule en dessous. Faits et réseaux ont la même
   largeur et le même écart : ils basculent ENSEMBLE, l'alignement tient. Mesuré de 900 à 1 440 px par pas de 10. */
.contact-page .ct-faits,
.contact-page .ct-reseaux {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 13.5rem), 1fr));
  margin: 0;
  padding: 0;
  list-style: none;
}
.contact-page .ct-faits { gap: 1.5rem 2rem; }
.contact-page .ct-reseaux { gap: 0.4rem 2rem; }
.contact-page .ct-faits div { display: grid; gap: 0.35rem; align-content: start; }
/* R2-1 (essai de Luca, 05/10) : les libellés des coordonnées passent en terre cuite — en encre atténuée ils
   s'effaçaient. --color-accent sur --color-bg = 5,43:1 (contrast-core). Les étiquettes du FORMULAIRE gardent
   l'encre atténuée : la distinction est voulue (Luca). */
.contact-page .ct-faits dt,
.contact-page .ct-plateforme {
  font-size: 0.68rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--color-accent);
}
.contact-page .ct-faits dd { margin: 0; font-family: var(--font-title); font-weight: 400; font-size: 1.25rem; line-height: 1.3; overflow-wrap: break-word; }
/* Filet pour un nom saisi au Studio plus long que la colonne : il passe à la ligne DANS sa colonne (break-word,
   jamais `anywhere`, C127) — la piste `minmax(0, 1fr)` le permet, une piste `auto` l'aurait laissé déborder. */
.contact-page .ct-reseau { display: grid; grid-template-columns: minmax(0, 1fr); gap: 0.3rem; min-height: 48px; padding-block: 0.5rem; color: var(--color-text); }
.contact-page .ct-nom {
  overflow-wrap: break-word;
  max-width: 100%;
  position: relative;
  justify-self: start;
  font-family: var(--font-title);
  font-weight: 400;
  font-style: italic;
  font-size: 1.3rem;
  line-height: 1.2;
  transition: color 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Le geste de `.nav-link` : un souligné qui se dessine depuis le centre. */
.contact-page .ct-nom::after {
  content: '';
  position: absolute;
  left: 0;
  right: 0;
  bottom: -2px;
  height: 1px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: center;
  transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
.contact-page .ct-reseau:hover .ct-nom { color: var(--color-accent); }
.contact-page .ct-reseau:hover .ct-nom::after { transform: scaleX(1); }

/* ── Focus clavier : visible sur pastilles, bouton et liens. */
.contact-page .service-pill:focus-visible,
.contact-page .form-submit:focus-visible,
.contact-page .ct-reseau:focus-visible,
.contact-page .ct-lien:focus-visible,
.contact-page .form-note a:focus-visible {
  outline: 1px solid var(--color-accent);
  outline-offset: 4px;
}

/* ── Une colonne sous 900 px, dans l'ordre du DOM : titre → carton → coordonnées. ─────────────── */
@media (max-width: 899.98px) {
  .contact-page {
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: none;
    grid-template-areas: "tete" "carton" "infos";
    padding-top: clamp(2.2rem, 6vw, 3.5rem);
  }
  .contact-page .ct-tranche { display: none; }
  .contact-page .ct-tete { margin-bottom: clamp(2.4rem, 6vw, 3.2rem); }
  .contact-page .ct-carton { max-width: 36rem; width: 100%; }
  .contact-page .ct-infos { align-self: start; max-width: 36rem; padding-top: clamp(3rem, 9vw, 4rem); }
}

/* ── Sous 560 px : le carton déborde d'une demi-gouttière de chaque côté pour donner de la largeur
   aux champs ; bouton pleine largeur ; coordonnées sur une colonne. */
@media (max-width: 559.98px) {
  .contact-page .ct-carton {
    margin-inline: calc(var(--gutter) * -0.5);
    width: auto;
    padding: 1.75rem 1.25rem 2rem;
  }
  .contact-page .ct-actions { flex-direction: column; align-items: stretch; }
  .contact-page .form-submit { width: 100%; }
  .contact-page .form-note { max-width: none; }
  .contact-page .ct-faits { grid-template-columns: minmax(0, 1fr); gap: 1.4rem; }
  .contact-page .ct-reseaux { grid-template-columns: minmax(0, 1fr); gap: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .contact-page *,
  .contact-page *::before,
  .contact-page *::after { transition: none !important; }
}
