/* ================================================================
   FRENCHY IA — Base de mise en page partagée
   À charger après tokens.css, avant le style propre à la page.

   Cette feuille traite les causes récurrentes de débordement
   horizontal sur téléphone. Aucun « overflow-x: hidden » global :
   il masquerait le symptôme en rendant le contenu débordant
   inatteignable, au lieu de corriger ce qui déborde.
   ================================================================ */

:root {
  /* Hauteur de la barre d'onglets basse, marge de sécurité comprise. */
  --tabbar-h: 58px;

  /* Encoches et barre de gestes des téléphones récents. Vaut zéro
     partout ailleurs, donc sans effet sur les autres appareils.
     Indispensable une fois le site installé en PWA : en plein écran,
     la barre basse se retrouverait sinon sous la barre de gestes. */
  --safe-haut:   env(safe-area-inset-top, 0px);
  --safe-bas:    env(safe-area-inset-bottom, 0px);
  --safe-gauche: env(safe-area-inset-left, 0px);
  --safe-droite: env(safe-area-inset-right, 0px);

  --page-gouttiere: 16px;
  --page-max: 1200px;
}

@media (min-width: 769px) {
  :root { --page-gouttiere: 24px; }
}

/* ── FONDATIONS ────────────────────────────────────────────────── */

*, *::before, *::after { box-sizing: border-box; }

html {
  /* Empêche l'agrandissement automatique du texte quand un téléphone
     passe en paysage, qui casse les mises en page calibrées. */
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

body {
  /* Le contenu ne peut pas être plus large que l'écran. Sans cette
     borne, un enfant trop large étire le corps entier et fait
     défiler toute la page latéralement. */
  max-width: 100%;

  /* La marge de 8 px que tout navigateur pose par défaut sur le corps.
     AUCUNE feuille du site ne la retirait — ni layout.css, ni les
     feuilles de page. Sur les pages sombres elle passait inaperçue,
     le fond du corps se propageant au canevas ; mais la barre du haut,
     elle, s'arrêtait à 8 px de chaque bord, et son filet avec — un
     décrochement visible aux deux extrémités, sur toutes les pages.

     Ici plutôt que dans chaque feuille : c'est le genre de règle qu'on
     oublie exactement une fois de trop. */
  margin: 0;
}

/* ── MÉDIAS ────────────────────────────────────────────────────── */

img, video, canvas, svg, iframe {
  max-width: 100%;
  height: auto;
}

/* Rétabli pour les icônes en ligne, dont la hauteur est fixée
   volontairement et que « height: auto » écraserait. */
svg[width][height] { height: revert; }

/* ── TEXTE ─────────────────────────────────────────────────────── */

/* Une URL ou une référence sans espace ne se coupe pas et pousse son
   conteneur au-delà de l'écran. Cas courant sur les pages légales. */
p, li, td, th, dd, h1, h2, h3, h4 {
  overflow-wrap: break-word;
}

/* ── TABLEAUX ──────────────────────────────────────────────────── */

/* Un tableau ne se comprime pas en dessous de la largeur de son
   contenu : celui des CGU mesure 506 px sur un écran de 375. Plutôt
   que d'écraser les colonnes jusqu'à l'illisible, on le fait défiler
   à l'intérieur de son propre cadre. */
.table-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  max-width: 100%;
}
.table-scroll > table { min-width: 480px; }

/* Filet de sécurité pour les tableaux non encapsulés : ils défilent
   au lieu d'emporter la page avec eux. */
@media (max-width: 768px) {
  main table, article table, section table, .section table {
    display: block;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    max-width: 100%;
  }
}

/* ── CONTENEUR ─────────────────────────────────────────────────── */

.conteneur {
  width: 100%;
  max-width: var(--page-max);
  margin-inline: auto;
  padding-inline: calc(var(--page-gouttiere) + var(--safe-gauche))
                  calc(var(--page-gouttiere) + var(--safe-droite));
}

/* ── ESPACE POUR LA BARRE D'ONGLETS ────────────────────────────── */

/* La barre basse est fixe : sans cette réserve, elle recouvrirait la
   fin du contenu, et notamment le dernier bouton d'un formulaire. */
/* Ce seuil suit celui de `.tabbar` dans nav.css. Les deux doivent bouger
   ensemble : la barre visible sans cette réserve recouvre la fin du
   contenu. */
@media (max-width: 1100px) {
  body.avec-tabbar {
    padding-bottom: calc(var(--tabbar-h) + var(--safe-bas));
  }
}

/* ── CIBLES TACTILES ───────────────────────────────────────────── */

/* 44 px est le minimum recommandé pour être atteint au doigt sans
   viser. En dessous, les erreurs de clic deviennent fréquentes. */
@media (pointer: coarse) {
  button, .btn, [role="button"], nav a {
    min-height: 44px;
  }
}
/* ATTENTION : ce plancher donne une HAUTEUR, pas un CENTRAGE. Un lien nu
   qui le recoit voit son texte se coller en haut de la cible — c'est ce qui
   decalait « Annuler » de 12 px dans la barre de publication. Les elements
   concernes posent donc `display: inline-flex; align-items: center` avec
   leur propre regle (voir `.nav .logo`, `.fy-fil a` et `.nav-right a`
   dans barre.css). On ne le fait pas ici : `.nav-links a` du tiroir mobile
   est un bloc pleine largeur, et `inline-flex` le retrecirait au texte. */

/* ── BOUTONS ET LIENS PARTAGES ─────────────────────────────────── */
/* Venus d'accueil.css, que SEUL index.html charge. « Annuler » sur la page
   de publication et « Voir tout » sur le feed portaient ces classes et
   restaient des liens nus soulignes : la classe etait ecrite, elle avait
   l'air juste, elle ne peignait rien. Deplacees, pas recopiees — une
   seconde definition finit toujours par diverger. */
.fy-btn {
  display: inline-block; background: var(--fy-violet); color: var(--fy-nuit);
  font-size: 1.03rem; font-weight: 600; padding: 16px 28px; border-radius: 12px;
  text-decoration: none; transition: background .18s ease;
}
.fy-btn:hover { background: var(--fy-violet-vif); color: var(--fy-nuit); }
.fy-btn-grand { font-size: 1.06rem; padding: 18px 34px; border-radius: 13px; }
.fy-lien { color: var(--fy-violet); text-decoration: none; font-size: .91rem; }
.fy-lien:hover { color: #bfb4ff; }
.fy-lien-fort { color: var(--fy-violet); text-decoration: none; font-size: .97rem; font-weight: 600; }
.fy-lien-fort:hover { color: #bfb4ff; }
.fy-lien-sobre { color: var(--fy-gris); text-decoration: none; font-size: .94rem; }
.fy-lien-sobre:hover { color: var(--fy-encre); }
.fy-dim { color: var(--fy-sourd, #6e6c88); }
.fy-mono { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: .69rem; font-weight: 500; letter-spacing: .1em; }

/* ── UTILITAIRES ───────────────────────────────────────────────── */

.masque-mobile { }
.masque-bureau { display: none; }

@media (max-width: 768px) {
  .masque-mobile { display: none !important; }
  .masque-bureau { display: revert; }
}

/* Respecte le réglage système de réduction des animations. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ─────────────────────────────────────────────────────────────────────────
   CONTRÔLES DE FORMULAIRE
   ───────────────────────────────────────────────────────────────────────── */

/* Un <button>, un <input> ou un <select> n'hérite PAS de font-family : sans
   cette règle, le navigateur leur applique sa police par défaut. Sur Windows
   c'est Arial, et six éléments de la page d'accueil sortaient effectivement
   hors charte — invisible à l'œil non averti, mais la typographie du site
   n'était plus tout à fait la sienne. */
button,
input,
select,
textarea {
  font-family: inherit;
}

/* Sous 16 px, les navigateurs iOS agrandissent automatiquement la page dès
   qu'un champ reçoit le focus — et ne reviennent pas seuls. Les neuf champs
   de l'inscription étaient à 14,4 px : la page sautait à chaque champ, sur le
   formulaire le plus long du site.

   La hauteur de 44 px est la cible tactile minimale des recommandations
   Apple ; les champs texte plafonnaient à 42. */
input:not([type="checkbox"]):not([type="radio"]):not([type="file"]),
select,
textarea {
  font-size: var(--fs-md, 1rem);
  min-height: var(--cible-tactile, 44px);
}

/* Une zone de texte doit pouvoir rester basse si la page le veut : c'est la
   hauteur d'une ligne qui compte, pas celle du bloc entier. */
textarea {
  min-height: calc(var(--cible-tactile, 44px) * 2);
}

/* Un tableau ne se contracte pas : celui des CGU mesure 525 px et débordait
   d'un écran de 320. Il défile désormais dans sa propre boîte, ce qui laisse
   la page entière immobile — c'est le contenu large qui bouge, pas le site.
   Réservé aux petits écrans : sur grand écran le tableau tient sans aide. */
@media (max-width: 768px) {
  table {
    display: block;
    max-width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
}

/* Une adresse email, un numéro SIRET ou une URL n'offrent aucune césure
   naturelle : sur 320 px, ce seul mot dépassait et poussait la page entière
   de 4 px. « anywhere » ne coupe que lorsque le mot ne tient pas — la prose
   normale n'est pas affectée. */
.layout,
.content,
.contact-card {
  overflow-wrap: anywhere;
}

/* ─────────────────────────────────────────────────────────────────────────
   CHAMPS MÉDIA — sélecteur de fichier greffé sur un champ d'adresse
   ───────────────────────────────────────────────────────────────────────── */

.media-champ { display: flex; flex-direction: column; gap: 10px; margin-top: 8px; }

/* Le champ d'adresse reste dans le document parce que le code d'envoi le
   lit, mais il n'a plus vocation à être saisi : on le montre discrètement,
   en lecture seule, comme une confirmation de ce qui a été choisi. */
.media-adresse {
  font-size: var(--fs-xs) !important;
  opacity: .55;
  min-height: 0 !important;
}

/* L'étiquette EST le bouton : un <input type="file"> ne se style pas, mais
   son label déclenche le même sélecteur natif. */
.media-fichier {
  position: absolute;
  width: 1px; height: 1px;
  opacity: 0;
  overflow: hidden;
}
.media-bouton {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  align-self: flex-start;
  min-height: var(--cible-tactile, 44px);
  padding: 0 18px;
  border-radius: var(--radius-sm, 10px);
  background: var(--surface2, rgba(255,255,255,.07));
  border: 1px solid var(--border, rgba(255,255,255,.09));
  color: var(--text, #eeeeff);
  font: 700 var(--fs-sm, .875rem)/1 var(--font-body, sans-serif);
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
.media-bouton:hover { border-color: #8b7bff; }
/* Le focus du champ caché doit se voir sur l'étiquette, sinon la navigation
   au clavier ne montre plus où elle se trouve. */
.media-fichier:focus-visible + .media-bouton,
.media-bouton:focus-visible { outline: 3px solid #7da2ff; outline-offset: 2px; }
.media-bouton[aria-disabled="true"] { opacity: .55; pointer-events: none; }

.media-apercu:empty { display: none; }
.media-apercu img {
  max-width: 100%;
  max-height: 220px;
  border-radius: var(--radius-sm, 10px);
  display: block;
}

.media-etat { font-size: var(--fs-xs, .75rem); color: var(--text-muted, rgba(238,238,255,.42)); min-height: 1em; }
.media-etat.ok { color: var(--green, #10d98a); }
.media-etat.erreur { color: var(--red, #ff5e5e); }

.media-bascule {
  align-self: flex-start;
  background: none;
  border: 0;
  padding: 6px 0;
  color: var(--text-muted, rgba(238,238,255,.42));
  font: 600 var(--fs-xs, .75rem)/1 var(--font-body, sans-serif);
  text-decoration: underline;
  cursor: pointer;
}
.media-bascule:hover { color: #8b7bff; }

/* ─────────────────────────────────────────────────────────────────────────
   STUDIO PHOTO — filtres, autocollants et texte avant publication
   ───────────────────────────────────────────────────────────────────────── */

.sp-ecran {
  position: fixed;
  inset: 0;
  z-index: 9998;
  background: #05050f;
  display: flex;
  flex-direction: column;
  /* L'encoche et la barre de gestes mangent les bords une fois le site
     installé : sans ces retraits, « Annuler » passe sous l'heure. */
  padding-top: var(--safe-haut, 0px);
  padding-bottom: var(--safe-bas, 0px);
  font-family: var(--font-body, sans-serif);
  color: var(--text, #eeeeff);
}

.sp-barre {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 8px 12px;
  border-bottom: 1px solid var(--border, rgba(255,255,255,.09));
  flex: 0 0 auto;
}
.sp-titre { font-weight: 700; font-size: var(--fs-sm, .875rem); }
.sp-barre button {
  background: none; border: 0; font: inherit; cursor: pointer;
  min-height: var(--cible-tactile, 44px); padding: 0 14px;
  border-radius: var(--radius-sm, 10px);
}
.sp-annuler { color: var(--text-muted, rgba(238,238,255,.42)); }
.sp-valider { color: #fff; font-weight: 700; background: #8b7bff !important; }

/* La scène occupe la place restante ; l'image s'y inscrit sans être rognée —
   ce que l'auteur cadre est ce qui sera publié. */
.sp-scene {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 10px;
  overflow: hidden;
}
.sp-toile {
  max-width: 100%;
  max-height: 100%;
  border-radius: var(--radius-sm, 10px);
  touch-action: none;   /* sans quoi le glissement fait défiler la page */
  cursor: grab;
}

.sp-outils { flex: 0 0 auto; padding: 8px 0 10px; display: flex; flex-direction: column; gap: 8px; }
.sp-rangee {
  display: flex; gap: 8px; overflow-x: auto; padding: 0 12px;
  scrollbar-width: none; overscroll-behavior-x: contain;
}
.sp-rangee::-webkit-scrollbar { display: none; }

.sp-filtre {
  flex: 0 0 auto; background: var(--surface2, rgba(255,255,255,.07));
  border: 1px solid var(--border, rgba(255,255,255,.09));
  color: inherit; font: 600 var(--fs-xs, .75rem)/1 inherit;
  min-height: var(--cible-tactile, 44px); padding: 0 14px;
  border-radius: 99px; cursor: pointer; white-space: nowrap;
}
.sp-filtre.actif { background: #8b7bff; border-color: #8b7bff; color: #fff; }

.sp-autocollant {
  flex: 0 0 auto; background: none; border: 0; cursor: pointer;
  font-size: 1.6rem; line-height: 1;
  min-width: var(--cible-tactile, 44px); min-height: var(--cible-tactile, 44px);
}

.sp-actions { align-items: center; }
.sp-btn {
  flex: 0 0 auto; background: var(--surface2, rgba(255,255,255,.07));
  border: 1px solid var(--border, rgba(255,255,255,.09));
  color: inherit; font: 700 var(--fs-xs, .75rem)/1 inherit;
  min-height: var(--cible-tactile, 44px); padding: 0 14px;
  border-radius: var(--radius-sm, 10px); cursor: pointer; white-space: nowrap;
}
.sp-couleurs { display: flex; gap: 6px; flex: 0 0 auto; }
.sp-couleur {
  width: 28px; height: 28px; border-radius: 50%; cursor: pointer;
  border: 2px solid rgba(255,255,255,.35); padding: 0;
}

.sp-aide {
  margin: 0; padding: 0 12px;
  font-size: var(--fs-xs, .75rem); color: var(--text-muted, rgba(238,238,255,.42));
}
