/* =========================================================
   MOBILE — SITE PUBLIC

   Feuille à part, chargée EN DERNIER et entièrement enfermée dans des requêtes
   media. Deux conséquences voulues :

     · rien ici ne peut modifier l'affichage sur un écran large — les règles
       n'existent tout simplement pas au-delà des seuils ;
     · tout ce qui concerne le tactile est au même endroit, et se retire d'une
       seule ligne dans _head.ejs si ça ne convient pas.

   Elle n'est PAS chargée par le panel d'administration, qui n'utilise que
   admin.css : le panel reste à traiter séparément.

   ─────────────────────────────────────────────────────────────────────────
   POURQUOI LA LARGEUR ET NON LA DÉTECTION D'APPAREIL

   On ne cherche pas à reconnaître « un téléphone ». Lire le user-agent se
   trompe : une tablette, un téléphone en paysage, une fenêtre de bureau
   réduite, un écran partagé — tous mal classés, et ça se dégrade à chaque
   nouvel appareil. La largeur de la fenêtre décrit la seule chose qui compte
   ici : la place disponible et la façon dont on vise.

   ─────────────────────────────────────────────────────────────────────────
   LES DEUX SEUILS, ET POURQUOI CEUX-LÀ

     1100 px  la planche de la barre de navigation s'arrête là (skin.css) et
              laisse place à une barre dessinée en CSS. C'est exactement à
              partir de ce point qu'on peut agrandir ses boutons sans risquer
              de les décaler du bandeau peint.

      860 px  seuil déjà retenu par ui.css pour replier la barre et le pied de
              page. On s'aligne plutôt que d'en inventer un de plus.

   Les cotes tactiles visent 44 px : c'est la recommandation d'Apple, Google
   dit 48. Mesuré avant correction sur un écran de 390 px, la barre offrait des
   cibles de 21 px de haut portant un texte de 9,9 px.
========================================================= */

/* ---------------------------------------------------------
   1 & 2. SOUS 1100 px — BARRE COMPACTE ET MENU DÉROULANT

   UN SEUL RÉGIME, ET NON DEUX.

   Il y en avait deux : entre 861 et 1100 px la barre restait dépliée avec ses
   six libellés, et le menu déroulant ne prenait le relais qu'en dessous. Ce
   régime intermédiaire ne tenait pas — six libellés ne rentrent pas dans la
   largeur, ils passaient à la ligne et débordaient au-dessus et en dessous du
   bandeau doré, qui lui garde une hauteur fixe.

   Le seuil du menu déroulant est donc remonté à 1100 px, exactement là où la
   planche dessinée s'arrête. Une seule bascule au lieu de deux : au-dessus,
   l'image et ses quatre zones relevées au pixel ; en dessous, cette barre-ci.
   Plus de bande intermédiaire à maintenir, et plus de largeur à laquelle la
   barre soit cassée.

   TROIS COLONNES, LE LOGO AU MILIEU.

   `1fr auto 1fr` : les deux colonnes latérales font la même largeur quoi
   qu'elles contiennent, donc la colonne centrale tombe au centre GÉOMÉTRIQUE
   de la barre. Le logo y est centré pour de bon — en disposition flexible il
   dérivait dès que la gauche et la droite n'avaient pas le même contenu, ce
   qui se voyait franchement sur téléphone.

   La colonne de droite est vide aujourd'hui. Elle est conservée plutôt que
   supprimée : c'est elle qui tient le logo au centre, et c'est là que viendra
   se poser une action de droite le jour où il en faudra une.

   Tout est en CSS : aucun script n'intervient, l'ouverture repose sur la case
   à cocher posée dans site/_head.ejs.
--------------------------------------------------------- */

@media (max-width: 1100px) {
  .site-nav {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    align-items: center;
    gap: 10px;
    width: auto;
    margin: 14px 10px 0;
    padding: 6px 12px;
    height: auto;
    min-height: 0;
  }

  /*
    HAUTEUR FERMÉE FIXÉE À 56 px.

    Laissée en `auto`, la barre retombait à 80 px alors que son plus grand
    enfant visible en fait 44 : plusieurs feuilles lui imposent une hauteur à
    des seuils différents (84, 62, 52 px selon la largeur) et je n'ai pas
    réussi à isoler laquelle l'emportait ici. Plutôt que d'empiler une
    surcharge de plus en espérant tomber juste, on donne à l'état fermé une
    valeur explicite : 44 px de bouton plus 6 px de rembourrage de part et
    d'autre.

    `:has()` distingue les deux états : fermée elle est figée, ouverte elle
    reprend sa hauteur naturelle pour laisser le menu se déplier dessous. Sans
    ça, un menu ouvert serait coupé.
  */
  .site-nav:not(:has(.nav-bascule:checked)) {
    height: 56px;
  }

  /*
    LE BOUTON D'OUVERTURE, dessiné en CSS.

    Trois traits : la barre du milieu est le fond de l'élément interne, les
    deux autres ses pseudo-éléments. Aucune image, aucune police d'icônes —
    donc rien à télécharger et une netteté parfaite à toute densité d'écran.

    `margin: 0` N'EST PAS DÉCORATIF. Le burger est un <label>, et style.css
    donne à TOUT label un `margin: 16px 0 6px` — pensé pour les étiquettes de
    formulaire. Ces 22 px de marge verticale portaient la rangée de la grille
    à 66 px dans une barre haute de 56 : le bouton était poussé vers le bas et
    débordait sous le rail doré. C'est ce que montrait la capture à 400 %.

    Ni cadre ni fond : les trois traits se suffisent. Le contour doré faisait
    une grosse boîte vide à côté du logo, d'autant plus visible en zoom élevé.
    La zone touchable reste de 44 px, elle n'a pas besoin d'être dessinée pour
    exister.
  */
  .nav-burger {
    grid-row: 1;
    grid-column: 1;
    justify-self: start;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    margin: 0;
    flex: none;
    border: 0;
    background: none;
    cursor: pointer;
  }
  .nav-burger span,
  .nav-burger span::before,
  .nav-burger span::after {
    display: block;
    width: 20px;
    height: 2px;
    border-radius: 2px;
    background: var(--ui-or-clair);
    transition: transform 180ms ease, opacity 120ms ease;
  }
  .nav-burger span { position: relative; }
  .nav-burger span::before,
  .nav-burger span::after {
    content: '';
    position: absolute;
    left: 0;
  }
  .nav-burger span::before { top: -6px; }
  .nav-burger span::after { top: 6px; }

  /* Ouvert, les trois traits deviennent une croix : le bouton dit alors ce
     qu'il fait, au lieu de garder l'apparence d'un bouton « ouvrir ». */
  .nav-bascule:checked ~ .nav-burger span { background: transparent; }
  .nav-bascule:checked ~ .nav-burger span::before { transform: translateY(6px) rotate(45deg); }
  .nav-bascule:checked ~ .nav-burger span::after { transform: translateY(-6px) rotate(-45deg); }

  /*
    Le logo occupe la colonne centrale, donc le centre exact de la barre.

    Sa taille suit la largeur disponible au lieu d'être fixe : à 1100 px la
    barre a la place d'un logo confortable, à 360 px il doit céder le pas au
    bouton d'ouverture. Le plafond de 52 px l'empêche de repousser la hauteur
    fermée de la barre.
  */
  .nav-logo {
    grid-row: 1;
    grid-column: 2;
    display: flex;
    justify-content: center;
    margin: 0;
  }
  /*
    Plafond à 42 px, et non 52.

    La barre fermée fait 56 px, dont 12 de rembourrage : il ne reste que 44 px
    utiles. Un logo plus haut agrandit la rangée de la grille sans agrandir la
    barre — il débordait alors sous le rail doré, et poussait le bouton avec
    lui. Les 42 px laissent un pixel de jeu de part et d'autre.
  */
  .nav-logo img {
    height: clamp(32px, 4.6vw, 42px);
    width: auto;
    margin: 0;
  }

  /*
    LE PANNEAU DÉROULANT.

    Replié par défaut, il prend toute la largeur sous la barre quand la case
    est cochée. Les deux groupes s'y empilent l'un après l'autre — l'ordre de
    lecture reste celui de la barre du bureau.
  */
  .nav-groupe.gauche,
  .nav-groupe.droite {
    /* Toute la largeur, sous la ligne du logo : les deux groupes se placent
       d'eux-mêmes en rangées 2 et 3. */
    grid-column: 1 / -1;
    display: none;
    flex-direction: column;
    gap: 2px;
    padding: 0;
    margin: 0;
  }
  .nav-bascule:checked ~ .nav-groupe.gauche,
  .nav-bascule:checked ~ .nav-groupe.droite { display: flex; }

  /* Un filet sépare le panneau de la barre, pour qu'il ne paraisse pas flotter. */
  .nav-bascule:checked ~ .nav-groupe.gauche {
    margin-top: 6px;
    padding-top: 8px;
    border-top: 1px solid rgba(240, 205, 122, 0.3);
  }

  .nav-zone {
    flex-direction: column;
    align-items: stretch;
    gap: 2px;
    width: 100%;
  }

  /*
    Chaque onglet devient une ligne pleine largeur : on vise la ligne, pas le
    mot. C'est ce qui rend un menu utilisable au pouce.

    Les 44 px viennent d'un `min-height` et non d'un rembourrage : le libellé
    reste centré quelle que soit sa hauteur de ligne, et deux onglets de
    longueurs différentes gardent la même zone touchable. C'est le minimum
    recommandé pour une cible tactile.
  */
  .site-nav .nav-bouton {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    width: 100%;
    min-height: 44px;
    padding: 0 14px;
    border-radius: 8px;
  }
  .site-nav .nav-bouton:hover,
  .site-nav .nav-bouton.actif { background: rgba(240, 205, 122, 0.14); }
  .site-nav .nav-libelle { font-size: 0.9rem; }

  /* La déconnexion est un formulaire, pas un lien : il lui faut la même
     largeur que les onglets pour ne pas rester coincé à droite. */
  .nav-deco { width: 100%; }
  .nav-deco .nav-bouton { width: 100%; }
}

/*
  DEUX COLONNES QUAND IL Y A LA PLACE.

  Une seule colonne de six lignes convient à un téléphone ; sur une tablette de
  900 px elle laisse les deux tiers de la largeur vides et repousse le contenu
  loin sous la barre. À partir de 620 px, les onglets se rangent donc sur deux
  colonnes : chaque groupe tient alors sur une seule ligne, et le panneau est
  trois fois moins haut pour la même lisibilité. Trois et non deux : avec trois
  onglets par groupe, deux colonnes en laisseraient un seul sur une seconde
  ligne, à moitié vide.

  `display: contents` sur les zones : ce sont des regroupements utiles au
  placement sur la planche du bureau, mais ici ils empêcheraient les onglets de
  se répartir. En les rendant transparentes, les boutons deviennent enfants
  directs de la grille et se répartissent d'eux-mêmes — sans toucher au
  balisage, qui doit rester celui du bureau.
*/
@media (min-width: 620px) and (max-width: 1100px) {
  .nav-bascule:checked ~ .nav-groupe.gauche,
  .nav-bascule:checked ~ .nav-groupe.droite {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 4px 14px;
  }
  .nav-zone { display: contents; }
}

/* Au-dessus de 1100 px, la planche dessinée reprend la main : les six onglets
   sont posés sur ses zones nues, visibles en permanence, et la case à cocher
   ne commande plus rien. */
@media (min-width: 1101px) {
  .nav-burger { display: none; }
}

/* ---------------------------------------------------------
   2. TÉLÉPHONE ET PETITE TABLETTE — sous 860 px
--------------------------------------------------------- */

@media (max-width: 860px) {
  /* =======================================================
     LES DÉCORS PASSENT EN CSS

     Relevé à 390 px, trois éléments chargeaient encore une image :

       .cadre       sk-cadre-creme.png  en bordure 9 tranches
       .cta-button  sk-bouton-bleu.png  en bordure 9 tranches
       .gemme       gemme-m.png         en fond

     Ces planches sont dessinées pour du grand : la bordure du cadre fait 24 px
     de chaque côté, soit près de 50 px pris sur une largeur de 390 — et ses
     ornements d'angle s'y écrasent. Le bouton, lui, télécharge une image pour
     un dégradé que le CSS fait nativement.

     Les couleurs ci-dessous sont celles des jetons du site (ui.css), pas des
     valeurs choisies à l'œil : l'habillage reste le même, seule la technique
     change.
  ======================================================= */

  /*
    LE CADRE CRÈME.

    `border-image: none` ne suffit pas : la largeur de bordure reste à 24 px et
    laisserait un liseré épais. On ramène la bordure à 2 px et on rend au
    contenu, en rembourrage, la place que la planche occupait.
  */
  .cadre,
  .cadre-creme,
  section.cadre-creme,
  .apercu {
    border-image: none;
    border: 2px solid var(--ui-or);
    border-radius: 14px;
    border-width: 2px;
    padding: 18px 16px;
    background: linear-gradient(180deg, var(--ui-creme) 0%, var(--ui-creme-fonce) 100%);
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
                0 6px 18px rgba(3, 26, 60, 0.18);
  }

  /*
    LES BOUTONS D'APPEL.

    Même dégradé bleu et même liseré doré que la planche, obtenus en deux
    déclarations. Le rembourrage reprend celui que portait `--sk-bouton-pad`,
    pour que le libellé garde exactement sa place dans le bouton.
  */
  /*
    `.hero-texte .actions` est repris de skin.css, et c'est nécessaire : c'est
    sous ce sélecteur à trois classes qu'elle pose la planche du bouton. Un
    simple `.cta-button` perdait, quel que soit l'ordre des feuilles.
  */
  .cta-button,
  .hero-texte .actions .cta-button {
    border-image: none;
    border: 1px solid var(--ui-or);
    border-radius: 10px;
    padding: 13px 20px;
    background: linear-gradient(180deg, var(--ui-bleu-clair) 0%, var(--ui-bleu) 52%, var(--ui-bleu-fonce) 100%);
    color: #f4faff;
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.28) inset,
                0 3px 10px rgba(3, 26, 60, 0.32);
  }
  /* La variante claire garde son rôle de bouton secondaire. */
  .cta-button.ghost,
  .hero-texte .actions .cta-button.ghost {
    background: linear-gradient(180deg, rgba(246, 237, 223, 0.94), rgba(232, 220, 198, 0.94));
    color: var(--ui-nuit);
    border-color: var(--ui-or-fonce);
  }

  /*
    LA GEMME DES TITRES.

    Un losange : un carré tourné de 45°, avec le dégradé bleu du site et un
    liseré doré. À 12 px, l'image n'apportait de toute façon aucun détail que
    le CSS ne sache rendre — elle coûtait une requête pour un point coloré.
  */
  .gemme {
    background: linear-gradient(135deg, var(--ui-bleu-clair) 0%, var(--ui-nuit) 100%);
    border: 1px solid var(--ui-or-clair);
    border-radius: 2px;
    width: 12px;
    height: 12px;
    transform: rotate(45deg);
    vertical-align: 0;
    flex: none;
  }
  .gemme.xl { width: 18px; height: 18px; }
  .gemme.s { width: 9px; height: 9px; }

  /*
    CHAMPS DE SAISIE : 16 px, ET C'EST UNE CORRECTION DE BUG, PAS UN GOÛT.

    Safari sur iPhone ZOOME automatiquement la page quand on touche un champ
    dont le texte fait moins de 16 px. L'utilisateur se retrouve avec une page
    agrandie qu'il doit repincer pour revenir — sur le formulaire d'inscription
    à la bêta comme sur la recherche du wiki. Poser 16 px supprime le zoom.

    `min-height` en plus : le champ de recherche du wiki mesurait 21 px de
    haut, soit moins de la moitié d'une cible confortable.
  */
  input[type="text"],
  input[type="email"],
  input[type="search"],
  input[type="password"],
  input[type="number"],
  select,
  textarea {
    font-size: 16px;
    min-height: 44px;
  }
  textarea { min-height: 96px; }

  /* Les boutons d'appel suivent la même cote. */
  .cta-button,
  .bouton,
  button[type="submit"] {
    min-height: 44px;
  }

  /*
    LE PIED DE PAGE.

    Ses liens mesuraient 15 à 22 px de haut — les plus petites cibles du site,
    et c'est là que se trouvent les mentions légales, qu'on doit pouvoir
    atteindre. Le rembourrage vertical les écarte aussi les uns des autres :
    serrés, ils se touchent et on clique à côté.
  */
  .footer-legal a,
  .footer-ligne a,
  .footer-marque {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0 4px;
  }
  .footer-legal { gap: 6px 12px; flex-wrap: wrap; }
  .footer-social a { width: 44px; height: 44px; }
  .footer-social svg { width: 20px; height: 20px; }

  /* La croix de fermeture des modales : 29 px, au coin de l'écran, là où le
     pouce est le moins précis. */
  .modal-close {
    width: 44px;
    height: 44px;
    display: grid;
    place-items: center;
  }

  /*
    PLANCHER DE LISIBILITÉ.

    Ces éléments descendaient entre 11,2 et 12,5 px. Sur un écran tenu à bout
    de bras, sous un reflet, c'est la limite du confort. On remonte à 0.8rem
    (12,8 px) sans toucher à la hiérarchie : ils restent plus petits que le
    texte courant, simplement lisibles.
  */
  .badge-rendrya,
  .actu-date,
  .footer-ligne,
  .footer-social-titre,
  .wiki-compte,
  .wiki-recent-cat,
  .wiki-recent-date,
  .eyebrow {
    font-size: 0.8rem;
  }

  .lien-suite {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    font-size: 0.85rem;
  }

  /*
    L'ARBORESCENCE DU WIKI.

    Ses liens font 29 px de haut et sont collés les uns aux autres. Sur les
    autres liens du site, une hauteur modeste n'est pas un problème : ce sont
    des titres ou des phrases, larges de toute la colonne, donc faciles à
    viser. Ici c'est une liste dense de rubriques empilées — deux entrées
    voisines se touchent, et on ouvre la mauvaise.

    Les liens de contenu, eux, ne sont pas touchés : leur agrandir la hauteur
    creuserait des trous dans les paragraphes sans rien gagner.
  */
  .wiki-arbre a,
  .wiki-cote-accueil,
  .wiki-ariane a {
    display: flex;
    align-items: center;
    min-height: 44px;
  }
  .wiki-ariane { flex-wrap: wrap; }

  /*
    DÉBORDEMENT HORIZONTAL.

    Une adresse e-mail ou une URL sans espace ne se coupe nulle part : elle
    pousse son conteneur et fait défiler toute la page de côté, ce qui est le
    défaut le plus désagréable sur téléphone. `anywhere` autorise la coupure
    là où il le faut, et seulement pour ces cas — un mot normal reste entier.
  */
  .vue p,
  .vue li,
  .vue td,
  .actu p,
  .wiki-corps {
    overflow-wrap: anywhere;
  }
}

/* ---------------------------------------------------------
   3. TÉLÉPHONE ÉTROIT — sous 480 px

   Sur cette largeur, chaque pixel de marge est pris sur le texte.
--------------------------------------------------------- */

@media (max-width: 480px) {
  /*
    Deux boutons d'appel côte à côte font 150 px chacun, libellé coupé. Empilés
    et pleine largeur, ils redeviennent lisibles et faciles à viser.
  */
  .hero-texte .actions,
  .suite-liens,
  .page-entete .actions {
    flex-direction: column;
    align-items: stretch;
  }
  .hero-texte .actions .cta-button,
  .suite-liens .cta-button,
  .page-entete .actions .cta-button {
    width: 100%;
    justify-content: center;
  }

  /* La vignette d'actualité prenait un tiers de la largeur pour une image qui
     n'est qu'illustrative ; le titre et le résumé passaient en colonne étroite. */
  .actu { gap: 10px; }
  .actu-vignette { width: 72px; height: 54px; }

  /* Le pied de page se centre : aligné à gauche sur 390 px, il laisse une
     colonne de vide à droite. */
  .footer-dedans { text-align: center; }
  .footer-legal { justify-content: center; }
}
