:root{--neon:#5ee7ff;--neon2:#1e90ff;--bg:#070b16;--card:#0d1526;--txt:#dfe9f5}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
/* la barre de menu est fixe : les ancres (#carte-...) doivent atterrir
   en dessous, sinon le haut de la carte reste masque par le menu. */
[id]{scroll-margin-top:130px}
body{font-family:'Segoe UI',system-ui,'Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji','Twemoji Mozilla','Apple Color Emoji',sans-serif;background:var(--bg);color:var(--txt);
 padding-top:0}   /* la barre fixe (enteteApp) est sticky dans le flux : plus de compensation */
/* la barre de defilement verticale reste TOUJOURS visible (macOS :
   overlay par defaut, la page saute quand elle apparait) */
html{overflow-y:scroll;scrollbar-gutter:stable}
.topbar{position:fixed;top:0;left:0;right:0;z-index:100;display:flex;align-items:center;justify-content:space-between;
 flex-wrap:wrap;gap:8px;padding:14px 28px;background:rgba(7,11,22,.92);backdrop-filter:blur(8px);
 border-bottom:1px solid rgba(94,231,255,.25);box-shadow:0 0 24px rgba(94,231,255,.15)}
h1.neon{font-size:1.5rem;letter-spacing:2px;color:#fff;text-transform:uppercase;
 text-shadow:0 0 6px var(--neon),0 0 18px var(--neon),0 0 40px var(--neon2),0 0 70px var(--neon2);
 animation:pulse 2.5s infinite alternate}
@keyframes pulse{from{text-shadow:0 0 6px var(--neon),0 0 18px var(--neon),0 0 40px var(--neon2)}to{text-shadow:0 0 10px var(--neon),0 0 30px var(--neon),0 0 60px var(--neon2),0 0 90px var(--neon2)}}
.menu{display:flex;flex-wrap:wrap;gap:4px}
.menu a{color:var(--txt);text-decoration:none;padding:8px 14px;border-radius:8px;font-size:.95rem;transition:.25s}
.menu a:hover{color:var(--neon);background:rgba(94,231,255,.08);box-shadow:0 0 12px rgba(94,231,255,.35)}
.menu .admin-link{border:1px solid rgba(94,231,255,.3)}
.logout-form{display:inline;margin:0}
.logout-btn{background:transparent;border:1px solid #ff5e7a;color:#ff5e7a;padding:8px 14px;border-radius:8px;
 font-size:.95rem;cursor:pointer;font-family:inherit;white-space:normal;text-align:left}
.logout-btn:hover{background:rgba(255,94,122,.12);box-shadow:0 0 12px rgba(255,94,122,.35)}
.menu .login-admin{display:none}            /* lien de connexion Admin masque sur tous les ecrans */
/* ---------- BARRE FIXE DYNAMIQUE (enteteApp) ----------
   Rendue par chaque page dans le fragment (donc rafraichie par la
   navigation SPA) : remplace le menu statique de renderPage ET les
   cadres fixes (liste-sticky / sticky-head). Sticky en haut de la zone
   de contenu, marges negatives pour recouvrir le padding de main. */
.topbar-app{position:sticky;top:0;z-index:100;width:100vw;max-width:none;
 flex-wrap:wrap;align-items:flex-start;
 margin:-14px 0 16px;margin-left:calc(50% - 50vw);
 padding:12px 28px 10px;border-radius:0}
.topbar-app .topbar-gauche{display:flex;flex-direction:column;align-items:flex-start;gap:4px;
 flex:1;min-width:260px}
.topbar-app .topbar-titres{display:flex;align-items:center;gap:10px;flex-wrap:wrap;width:100%}
.topbar-app h1.neon{flex:1;min-width:0;font-size:1.15rem;letter-spacing:1px;margin:0;text-align:left}
.topbar-app .topbar-legende{font-size:.88rem;color:#8b93a7;
 display:flex;gap:10px;flex-wrap:wrap;align-items:center;justify-content:flex-start;text-align:left}
.topbar-app .topbar-legende .dates{margin:0}
.topbar-app .topbar-legende h2{margin:0;font-size:1rem;color:#fff}
.topbar-app .topbar-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:4px}
.topbar-app .menu{margin-top:0;gap:8px;flex-direction:column;flex-wrap:nowrap;
 align-items:flex-end;justify-content:center;flex:1;min-width:280px}
.topbar-app .ligne-btns{display:flex;gap:10px;flex-wrap:wrap;align-items:center;justify-content:flex-end}
.topbar-app .ligne-btns:empty{display:none}
.topbar-app .menu .logout-btn{padding:6px 12px;font-size:.85rem}
main{max-width:1500px;margin:0 auto;padding:14px 20px 30px}
/* liste des eleves : page elargie pour accueillir toutes les colonnes */
main.wide{max-width:1500px}
h2{color:var(--neon);margin:10px 0 18px;text-shadow:0 0 10px rgba(94,231,255,.5)}
h3{margin:14px 0 8px;color:#fff}
h4{margin:12px 0 8px;color:var(--neon)}
a{color:var(--neon)}
.hero{display:flex;gap:28px;flex-wrap:wrap;align-items:center;margin-bottom:36px}
.video-accueil{flex:1;min-width:280px;border-radius:14px;box-shadow:0 0 25px rgba(94,231,255,.25);border:1px solid rgba(94,231,255,.3)}
.hero-text{flex:1;min-width:280px}
/* hero accueil : chapeau + puces-encadres a cote de la video */
.hero-lead{font-size:1.05rem;color:#dfe7f5;line-height:1.55;margin:12px 0 16px}
.hero-lead strong{color:var(--neon);font-weight:600}
.hero-chips{display:grid;gap:9px;margin:0 0 16px;padding:0;list-style:none}
.hero-chips li{display:flex;gap:11px;align-items:center;background:rgba(94,231,255,.07);border:1px solid rgba(94,231,255,.3);border-radius:10px;padding:9px 13px;font-size:.95rem;line-height:1.4}
.hero-chips li strong{color:#fff}
.hero-chips .ico{font-size:1.3rem;line-height:1;flex-shrink:0}
.btn{display:inline-block;background:transparent;border:1px solid var(--neon);color:var(--neon);padding:10px 20px;
 border-radius:10px;cursor:pointer;text-decoration:none;font-size:.95rem;margin-top:10px;transition:.25s}
.btn:hover{background:var(--neon);color:#03121e;box-shadow:0 0 18px var(--neon)}
.btn-main{font-weight:600}
/* bouton bascule « vue active » : sembla eteint (gris) quand sa vue est affichee */
.btn.vue-active{border-color:#4a5468;color:#7d879b;font-weight:400;background:transparent;box-shadow:none;cursor:default}
.btn.vue-active:hover{background:transparent;color:#7d879b;box-shadow:none}
.btn.small{padding:5px 12px;font-size:.85rem}
/* boutons dans les tables : jamais de retour a la ligne ni de rognage */
table .btn,table form .btn{white-space:nowrap;max-width:none;margin-top:0}
.ok-btn{border-color:#37e08a;color:#37e08a}.ko-btn{border-color:#ff5e7a;color:#ff5e7a}.warn-btn{border-color:#ffb43a;color:#ffb43a}
.widget-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:22px;margin-top:16px}
.sejour-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,430px));justify-content:center;gap:22px;margin-top:16px}
.widget,.sejour-cadre{background:var(--card);border:1px solid rgba(94,231,255,.25);border-radius:14px;padding:16px;
 box-shadow:0 0 14px rgba(94,231,255,.1)}
/* cartes consecutives d'un dossier (prive ou admin) : espacees entre elles */
.sejour-cadre + .sejour-cadre,.enfant-admin + .enfant-admin{margin-top:26px}
.sejour-cadre.cliquable{cursor:pointer;transition:.25s}
.sejour-cadre.cliquable:hover{transform:translateY(-4px);box-shadow:0 0 26px rgba(94,231,255,.4);border-color:var(--neon)}
.widget img,.sejour-cadre img{width:100%;height:150px;object-fit:cover;border-radius:10px}
/* page Spectacles : vue Réservations — cadre Nouvelles réservations
   (1/3) a gauche, cadre Réservations (2/3) a droite ; empilés sous 1000 px */
.resas-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,2fr);gap:14px;align-items:start;margin:14px 0 0}
.resas-cols .sejour-cadre{margin-top:0}
@media (max-width:1000px){.resas-cols{grid-template-columns:minmax(0,1fr)}}
/* vue « Mon séjour » : carte Mon trajet — sous-cadres Le départ (2/5),
   En chemin (2/5), Nos transporteurs (1/5) ; 2 colonnes sous 1000 px,
   colonne unique sous 820 px (smartphone). minmax(0,…) pour que le
   tableau « En chemin » puisse rétrécir sans étirer la colonne */
.trajet-cols{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,2fr) minmax(0,1fr);gap:10px;align-items:stretch;margin-top:10px}
@media (max-width:1000px){.trajet-cols{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}
@media (max-width:820px){.trajet-cols{grid-template-columns:minmax(0,1fr)}}
/* page Spectacles : cadre Spectacle — sous-cadres côte à côte :
   sélection du spectacle (1/5), Île de Wight (2/5), En France (2/5) ;
   empilés sous 1000 px */
/* largeurs contraintes (minmax(0,…) partout) : sans cela, une colonne
   ne peut pas rétrécir sous la taille de son contenu (tableau des
   réservations, long texte) et pousse la page hors écran sur
   smartphone — la grille restait figée au lieu de s'empiler */
/* vue Spectacle : 2 lignes — 1re ligne Spectacle joué (2/6) +
   Spectacles possibles (4/6), 2e ligne Île de Wight et En France
   égaux (3/6 chacun) ; empilés sous 1000 px */
.spectacle-cols{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:14px;align-items:stretch;margin-top:10px}
.spectacle-cols > .sp-2{grid-column:span 2}
.spectacle-cols > .sp-4{grid-column:span 4}
.spectacle-cols > .sp-3{grid-column:span 3}
/* les sous-cadres remplissent toute la hauteur de leur ligne */
.spectacle-cols > div{display:flex;flex-direction:column;min-width:0}
/* surimpression « Joué par » : clic sur un badge rouge « déjà joué »
   du sous-cadre Spectacles possibles → calque fixe + cadre centré
   listant les enfants inscrits qui ont joué ce spectacle */
.sp-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:300;display:flex;align-items:center;justify-content:center;padding:20px;background:rgba(7,11,22,.72)}
/* smartphone web app : pas de délai de 300 ms ni de zoom au double
   tap sur les boutons/badges (touch-action:manipulation) */
.btn,.logout-btn,.sp-joues-btn,.sp-overlay{touch-action:manipulation;-webkit-user-select:none;user-select:none}
.sp-overlay .sp-cadre{position:relative;background:#0b1222;border:1px solid rgba(94,231,255,.45);border-radius:14px;padding:20px 24px;max-width:min(92vw,520px);max-height:75vh;overflow:auto;box-shadow:0 18px 60px rgba(0,0,0,.6)}
.sp-overlay .sp-cadre h4{margin:0 0 12px;padding-right:34px}
.sp-overlay .sp-cadre ul{margin:0;padding-left:22px;display:grid;gap:6px}
.spectacle-cols > div > *:last-child{margin-bottom:0}
@media (max-width:1000px){
  .spectacle-cols{grid-template-columns:minmax(0,1fr)}
  .spectacle-cols > div,.spectacle-cols > .sp-2,.spectacle-cols > .sp-4,.spectacle-cols > .sp-3{grid-column:auto}
}
/* page Spectacles : sous le cadre Spectacle — ⚙️ Quotas (1/3),
    Ouverture des scans (1/3) et 📋 Récapitulatif des réservations
   (1/3), trois cadres égaux ; empilés sous 1000 px
   (.seul = récap seul, pleine largeur (adjoint/consultant)) */
.quota-cols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;align-items:stretch;margin-top:10px}
.quota-cols.seul{grid-template-columns:minmax(0,1fr)}
.quota-cols > div{display:flex;flex-direction:column;min-width:0}
.quota-cols > div > *:last-child{margin-bottom:0}
@media (max-width:1000px){.quota-cols,.quota-cols.seul{grid-template-columns:minmax(0,1fr)}}
/* ---------- PAGE INFORMATIONS DU SÉJOUR (admin_sejour_infos) ----------
   Sous-grilles des cadres côte à côte (Rendez-vous+Trajet, Équipe
   artistique+Encadrants, Hébergement+Lieux) : pistes minmax(0,…) pour
   que chaque cadre puisse rétrécir sous la taille de son contenu,
   puis empilement en colonne unique sous 1000 px (smartphone/tablette). */
.infos-cols{display:grid;gap:14px;align-items:stretch;margin-top:0}
.infos-cols.c2-1{grid-template-columns:minmax(0,2fr) minmax(0,1fr)}
.infos-cols.c1-1{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
.infos-cols.c1-2{grid-template-columns:minmax(0,1fr) minmax(0,2fr)}
@media (max-width:1000px){
 .infos-cols,.infos-cols.c2-1,.infos-cols.c1-1,.infos-cols.c1-2{grid-template-columns:minmax(0,1fr)}
}
/* champs de la page Informations : les inputs natifs (time, date) et les
   select (options longues : acteurs, comptes, lieux) ne rétrécissent pas
   sous leur largeur intrinsèque et débordaient du cadre sur smartphone */
.infos-cols input,.infos-cols select,.infos-cols textarea{max-width:100%}
.infos-cols input[type=time],.infos-cols input[type=date]{width:100%;min-width:0;max-width:100%}
.infos-cols select{width:100%;min-width:0}
.infos-cols label{min-width:0}
.infos-cols .decision-form{min-width:0}
/* le formulaire trajet_infos_save EST la grille .infos-cols.c2-1 : le
   display:inline-flex générique de .decision-form l'écrasait et cassait
   les largeurs 2/3 + 1/3 — deux classes battent une seule.
   align-items:stretch indispensable : le .decision-form générique
   déclare align-items:center (même spécificité que .infos-cols, plus
   tard dans la feuille) — sans ce override, le cadre Trajet ne
   s'étirait PAS à la hauteur du cadre Rendez-vous */
.infos-cols.decision-form{display:grid;align-items:stretch}
/* Rendez-vous : heure (1/4) + lieu (3/4) côte à côte sur grand écran,
   empilés sous 1000 px */
.rdv-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,3fr);gap:12px}
@media (max-width:1000px){.rdv-cols{grid-template-columns:minmax(0,1fr)}}
/* horaires Eurotunnel / Ferry : 2 pistes contraintes (l'ancien
   minmax(140px,1fr) imposait 2 pistes de 140 px minimum → débordement
   du sous-cadre sur petit smartphone) */
.heures-cols{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;align-items:start}
/* carte Trajet : infos de la traversée choisie (villes, type, société)
   affichées sous le select — masquées si aucune traversée choisie */
.trav-info{background:rgba(94,231,255,.06);border:1px dashed rgba(94,231,255,.35);border-radius:8px;padding:8px 10px;font-size:.9rem;margin:0}
.trav-info:empty{display:none}
/* très petit écran : les deux champs horaires s'empilent (pleine
   largeur chacun) — aucun risque de débordement du sous-cadre */
@media (max-width:640px){.heures-cols{grid-template-columns:minmax(0,1fr)}}
/* smartphone : la feuille mobile passe les .decision-form en
   flex-direction:column — or les enfants portent un flex-basis inline
   (select des lieux « flex:1 1 140px », labels d'ajout « flex:1 1
   160px ») qui devient alors une HAUTEUR de 140/160 px : les select
   des lieux étaient immenses. Réinitialisation du flex sur les
   enfants directs des formulaires de la page → hauteurs naturelles
   (même hauteur que les listes d'encadrants/acteurs) */
@media (max-width:820px){
 .infos-cols .decision-form > select,
 .infos-cols .decision-form > span,
 .infos-cols .decision-form > label,
 .infos-cols .decision-form > div,
 .infos-cols .decision-form > button{flex:0 0 auto}
}
/* cadres Rendez-vous + Trajet : le contenu (encadré) remplit toute la
   hauteur du cadre le plus haut → les deux cadres paraissent alignés.
   Les règles portent sur .carte-visible : sans cela leur spécificité
   écraserait .enfant-admin{display:none} et les cadres ne se masquaient
   plus quand on ouvre Lieux ou Adultes.
   margin:0 sur les cadres directs : les marges génériques
   (.enfant-admin{margin:18px 0} et .sejour-cadre + .sejour-carde{margin-
   top:26px}) réduisaient la hauteur étirée du cadre Trajet et le
   décalaient vers le bas → hauteurs visibles différentes */
.infos-cols > .sejour-cadre{margin:0}
.infos-cols.c2-1 > .sejour-cadre.carte-visible{display:flex;flex-direction:column}
.infos-cols.c2-1 > .sejour-cadre.carte-visible > div{flex:1;display:flex;flex-direction:column}
.infos-cols.c2-1 > .sejour-cadre.carte-visible > div > *:first-child{margin-top:0}
.infos-cols .sejour-cadre{min-width:0;overflow-wrap:anywhere}
/* bouton QR CODE du cadre Scan : très visible, pleine largeur
   (max 520 px) et centré ; reste confortable sur smartphone */
.btn-scan-qr{font-size:1.9rem;font-weight:700;padding:26px 40px;border-radius:18px;
 letter-spacing:2px;width:100%;max-width:520px}
@media (max-width:1000px){.btn-scan-qr{font-size:1.6rem;padding:22px 24px}}
/* page de validation d'une place (resa_valide) : gros boutons
   « Annulation » et « Retour », pleine largeur (max 420 px) */
.btn-valide{font-size:1.25rem;font-weight:700;padding:16px 28px;border-radius:14px;
 width:100%;max-width:420px;display:inline-flex;align-items:center;justify-content:center;
 text-align:center}
/* ---------- PAGE SEJOURS PUBLIQUE : cartes modernes ---------- */
.sej-card{position:relative;display:flex;flex-direction:column;overflow:hidden;
 background:var(--card);border:1px solid rgba(94,231,255,.25);border-radius:16px;padding:0;
 box-shadow:0 0 14px rgba(94,231,255,.1)}
.sej-card.cliquable{cursor:pointer;transition:.25s}
.sej-card.cliquable:hover{transform:translateY(-4px);box-shadow:0 0 26px rgba(94,231,255,.4);border-color:var(--neon)}
.sej-card .sej-hero{position:relative;height:170px;overflow:hidden}
.sej-card .sej-hero img{width:100%;height:100%;object-fit:cover;display:block;border-radius:0;
 transition:transform .3s}
.sej-card.cliquable:hover .sej-hero img{transform:scale(1.05)}
.sej-card .sej-hero::after{content:'';position:absolute;inset:0;
 background:linear-gradient(180deg,rgba(7,11,22,0) 30%,rgba(7,11,22,.85) 100%)}
.sej-card .sej-titre{position:absolute;left:16px;right:16px;bottom:10px;margin:0;color:#fff;
 font-size:1.15rem;text-shadow:0 1px 6px rgba(0,0,0,.6)}
.sej-card .sej-body{display:flex;flex-direction:column;gap:10px;padding:14px 16px 16px;flex:1}
.sej-chips{display:flex;flex-wrap:wrap;gap:6px}
.sej-chip{display:inline-flex;align-items:center;gap:4px;font-size:.78rem;color:#c9d4e3;
 padding:3px 10px;border:1px solid rgba(94,231,255,.3);border-radius:20px;background:rgba(94,231,255,.06)}
.sej-prix{display:flex;align-items:baseline;gap:6px;margin:0}
.sej-prix strong{font-size:1.45rem;color:var(--neon)}
.sej-prix span{font-size:.8rem;color:#8b93a7}
.sej-places{display:flex;flex-direction:column;gap:4px}
.sej-places .sej-places-txt{display:flex;justify-content:space-between;font-size:.78rem;color:#8b93a7;margin:0}
.sej-barre{height:7px;border-radius:6px;background:rgba(94,231,255,.12);overflow:hidden}
.sej-barre>div{height:100%;border-radius:6px;background:var(--neon);transition:width .3s}
.sej-barre.pleine>div{background:#ff5e7a}
.sej-card .sej-cta{margin-top:auto;display:flex;justify-content:flex-end}
.sej-card .sej-cta .btn{margin:0}
.sej-ligne-meta{display:flex;justify-content:space-between;gap:10px;font-size:.8rem;
 padding:6px 0;border-bottom:1px dashed rgba(94,231,255,.18);margin:0}
.sej-ligne-meta:last-of-type{border-bottom:0}
.sej-ligne-meta span:first-child{color:#8b93a7}
.prix{color:var(--neon);font-size:1.2rem;font-weight:700}
.badge{display:inline-block;padding:3px 12px;border-radius:20px;font-size:.8rem;border:1px solid var(--neon);color:var(--neon);margin:6px 0}
.badge.ok{border-color:#37e08a;color:#37e08a}.badge.ko{border-color:#ff5e7a;color:#ff5e7a}
.badge.absent{border-color:#8b93a7;color:#8b93a7}
.badge.attente{border-color:#ffb43a;color:#ffb43a;background:rgba(255,180,58,.08)}
/* nombre de participations (enfants des anciens sejours) : une couleur par valeur 1 a 9 */
.badge.n1{border-color:#8b93a7;color:#8b93a7}
.badge.n2{border-color:#5ee7ff;color:#5ee7ff}
.badge.n3{border-color:#37e08a;color:#37e08a}
.badge.n4{border-color:#ffb43a;color:#ffb43a}
.badge.n5{border-color:#ff5e7a;color:#ff5e7a}
.badge.n6{border-color:#9d7bff;color:#9d7bff}
.badge.n7{border-color:#4d9fff;color:#4d9fff}
.badge.n8{border-color:#ff6ec7;color:#ff6ec7}
.badge.n9{border-color:#c2f542;color:#c2f542}
table.sejour-infos{width:100%;border-collapse:collapse;margin:8px 0}
/* listes admin : largeurs de colonnes adaptees au contenu,
   sans depasser la largeur de la page */
.eleves-liste,.sejours-liste td{overflow-wrap:break-word}
/* liste des eleves : la ligne survolee s'illumine */
.eleves-liste tr{transition:background .15s}
.eleves-liste tbody tr:hover,.eleves-liste tr:hover{background:rgba(94,231,255,.07)}
.eleves-liste tr:hover th{color:#fff}
.sejour-infos th,.sejour-infos td{padding:6px 8px;text-align:left;border-bottom:1px solid rgba(94,231,255,.12);font-size:.92rem}
.sejour-infos th{color:var(--neon);white-space:nowrap}
/* libelles des documents : passage a la ligne autorise (mots longs,
    ecrans etroits) — le nowrap general des th ne doit pas s'y appliquer */
.docs-table th{white-space:normal;overflow-wrap:break-word}
fieldset{border:1px solid rgba(94,231,255,.3);border-radius:14px;padding:18px;margin:22px 0;background:var(--card)}
legend{color:var(--neon);font-weight:700;padding:0 8px;text-transform:uppercase;letter-spacing:1px}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}
label{display:flex;flex-direction:column;font-size:.88rem;color:#a9c3dd}
label.full{margin-top:8px}
input,select,textarea{background:#08101f;border:1px solid rgba(94,231,255,.3);color:var(--txt);
 padding:9px;border-radius:8px;margin-top:4px;font-size:.95rem}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--neon);box-shadow:0 0 10px rgba(94,231,255,.4)}
.progress-label{margin-bottom:6px}.progress-label span{color:var(--neon);font-weight:700}
.progress-bar{height:10px;background:#0a1220;border:1px solid rgba(94,231,255,.25);border-radius:8px;overflow:hidden;margin-bottom:20px}
/* page inscription : date limite + places restantes + progression
   toujours visibles, memes quand on fait defiler le formulaire */
.info-bar{position:sticky;top:calc(var(--topbar-h,66px) + 8px);z-index:40;display:flex;gap:18px;flex-wrap:wrap;align-items:center;
 background:rgba(3,18,30,.92);border:1px solid rgba(94,231,255,.25);border-radius:10px;
 padding:10px 14px;margin:0 0 12px;backdrop-filter:blur(4px)}
#pct-bar{height:100%;width:0;background:linear-gradient(90deg,var(--neon2),var(--neon));box-shadow:0 0 12px var(--neon);transition:width .4s}
/* liste des eleves : mini barre d'avancement du dossier */
.mini-bar{height:8px;width:110px;background:#0a1220;border:1px solid rgba(94,231,255,.25);border-radius:6px;overflow:hidden;display:inline-block;vertical-align:middle}
.mini-bar>div{height:100%;background:linear-gradient(90deg,var(--neon2),var(--neon));transition:width .4s}
.mini-bar.complet{border-color:#37e08a}
.mini-bar.complet>div{background:#37e08a}
.mini-score{font-size:.8rem;color:#8b93a7;margin-left:6px;white-space:nowrap}
/* formulaire repas : select obligatoire non renseigne = bordure rouge
   apres tentative d'envoi */
.repas-form.envoye select:required:invalid{border-color:#ff5e7a;background:rgba(255,94,122,.08)}
/* statistiques repas : 3 cartes cote a cote (plats plus large) ;
   la carte sandwichs, placee en dessous, a la largeur des entrees */
.stats-repas-grid{display:grid;grid-template-columns:1fr 1.6fr 1fr;gap:14px;align-items:start}
.stats-repas-grid .sejour-cadre{margin:0}
.stats-repas-grid .carte-sandwich-sandwich{grid-column:1}
/* chaque option sur une seule ligne quand c'est possible :
   libelle a droite de la barre, sans retour a la ligne */
.stats-repas-grid .sejour-infos tr{display:flex;align-items:center;gap:8px}
.stats-repas-grid .sejour-infos th{flex:1;white-space:nowrap;border-bottom:none;overflow:hidden;text-overflow:ellipsis}
.stats-repas-grid .sejour-infos td{border-bottom:none;width:auto;white-space:nowrap}
/* page sandwichs : cartes des types de sandwich cote a cote sur grand ecran */
.sandwichs-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;align-items:start}
.sandwichs-grid .sejour-cadre{margin:0}
.flash{padding:12px 16px;border-radius:10px;margin:12px 0}
/* messages flash des pages a barre fixe app (entetePerso) : bandeau
   flottant FIXE sous la barre — ne la décale pas — et éphémère
   (auto-effacé par le script commun) */
.flash-flottant{position:fixed;top:calc(var(--topbar-h,66px) + 8px);left:50%;
 transform:translateX(-50%);z-index:90;max-width:min(92vw,560px);margin:0;
 box-shadow:0 8px 24px rgba(0,0,0,.5);transition:opacity .6s}
/* flottant = il SURVOLE le contenu : fond OPAQUE obligatoire (les fonds
   translucides .07 des flash le rendaient illisible sur la page) */
.flash-flottant.flash-ok{background:#0a1e16}
.flash-flottant.flash-err{background:#200a12}
/* flash flottant ambre (« déjà validée ») : fond opaque, bordure et
   texte ambre — .flash-flottant + .flash-attention (2 classes) bat le
   style générique .flash-ok déclaré plus bas */
.flash-flottant.flash-attention{border-color:#ffb43a;color:#ffb43a;background:#1e1505}
.flash-ok{border:1px solid #37e08a;color:#37e08a;background:rgba(55,224,138,.07)}
.flash-err{border:1px solid #ff5e7a;color:#ff5e7a;background:rgba(255,94,122,.07)}
.code-form{display:flex;gap:10px;flex-wrap:wrap;align-items:end}
.code-form label{gap:4px}
.code-form input{margin-top:0}
.code-form input[name=code],.code-form input[name=q]{text-transform:uppercase;letter-spacing:2px;width:180px}
.upload-form{display:inline-flex;gap:8px;align-items:center;margin:6px 0;flex-wrap:wrap}
.upload-form input[type=file]{min-width:0;flex:1 1 200px;padding:4px 6px;font-size:.88rem}
/* table des coordonnees bancaires : s'adapte a la largeur (IBAN, reference
   peuvent etre longs) — passage a la ligne plutot que defilement lateral */
.banque-table{white-space:normal}
.banque-table th{white-space:normal}
.banque-table td{overflow-wrap:break-word;min-width:0}
/* cellules bancaires copiables au clic */
.copiable{cursor:pointer;transition:.2s;border-radius:6px}
.copiable:hover{color:var(--neon);text-shadow:0 0 8px rgba(94,231,255,.5)}
.copiable.copie-ok{background:rgba(55,224,138,.12);color:#37e08a}
.motif{color:#ff5e7a;font-size:.85rem;margin-top:4px}
.admin-head{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}
/* liste des eleves : titre + boutons + statistiques figes sous le menu */
.liste-sticky{position:sticky;top:var(--topbar-h,66px);z-index:45;background:rgba(7,11,22,.94);
 border:1px solid rgba(94,231,255,.25);border-radius:12px;padding:10px 16px;margin:0 0 16px;backdrop-filter:blur(6px)}
.liste-sticky .admin-head{padding:0}
.liste-sticky .dates{font-size:.85rem;margin:4px 0 0}
/* bandeau fixe commun (eleves / encadrants / repas...) : titre + stats a gauche,
   deux lignes de boutons alignees a droite */
.admin-head .head-gauche{min-width:0}
.admin-head .head-droite{display:flex;flex-direction:column;align-items:flex-end;gap:6px}
.admin-head .head-droite .ligne-btns{display:flex;gap:10px;flex-wrap:wrap;align-items:center;justify-content:flex-end}
.admin-head .head-droite .ligne-btns:empty{display:none}
/* page dossier eleve : titre + boutons fixes, cartes masquees par defaut */
.admin-head.sticky-head{position:sticky;top:var(--topbar-h,66px);z-index:45;background:rgba(7,11,22,.94);
 border:1px solid rgba(94,231,255,.25);border-radius:12px;padding:10px 16px;backdrop-filter:blur(6px)}
.admin-head.sticky-head h2{margin:0 0 8px}
.enfant-admin{display:none}
.enfant-admin.carte-visible{display:block}
.enfant-admin{margin:18px 0}
/* vue Mon séjour : « Ma semaine » (2/3) et « On donne des nouvelles »
   (1/3) côte à côte, à toutes les largeurs d'écran */
.enfant-admin.duo-semaine.carte-visible{display:grid;grid-template-columns:2fr 1fr;gap:14px;align-items:start}
.duo-semaine > .sejour-cadre{margin-top:0}
/* boutons GPS sous l'adresse d'un lieu (Mes représentations) :
   grand écran — Google Maps, Plans, OpenStreetMap ; smartphone —
   Google Maps, Plans, Waze (OSM jamais affiché sur mobile) */
.gps-desktop{display:inline-flex}
.gps-mobile{display:none!important}
@media (max-width:820px){.btn.gps-desktop{display:none!important}.gps-mobile{display:inline-flex!important}}
/* page alert_notif (admin/adjoint/consultant) : cadres jaunes
   « Notifications » à gauche (1/3), alertes à droite (2/3) */
.alert-notif-cols{display:grid;grid-template-columns:1fr 2fr;gap:14px;align-items:start}
/* smartphone : colonnes empilées — le cadre jaune garde une largeur
   lisible au lieu d'un tiers de la page */
.alert-notif-cols > div{min-width:0}
@media (max-width:820px){.alert-notif-cols{grid-template-columns:minmax(0,1fr)}}
/* profil admin : cadre Diagnostique (50 %) à gauche des textes des
   notifications push (50 %) */
.profil-diag-cols{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:start}
.profil-diag-cols table{max-width:100%}
/* page publique « L'hébergement » : fiche de l'hôtel (50 %) à gauche,
   texte de présentation justifié (50 %) à droite — empilés ≤ 820 px */
.hebergement-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;align-items:start}
/* page publique « L'atelier » : deux paires de cadres côte à côte
   (répétition + équipe artistique, spectacle + lieux) — empilées ≤ 1000 px */
.acteurs-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;align-items:stretch;max-width:1200px;margin:20px auto}
/* paires empilées dès 1000 px (tablette/grand smartphone) — la règle
   ≤ 820 px du bloc mobile reste en sécurité ; enfants contraints
   (min-width:0) pour qu'aucun contenu ne pousse la grille hors écran */
@media (max-width:1000px){.acteurs-cols{grid-template-columns:minmax(0,1fr)}}
.acteurs-cols > div{min-width:0}
/* bouton icône seule du site ondonnedesnouvelles.com */
.odn-bouton{display:flex;align-items:center;justify-content:center;padding:16px;margin:12px 0 4px}
.odn-bouton img{display:block;width:58px;height:58px;flex:0 0 auto}
.odn-legende{margin:6px 0 0;color:#8b93a7;font-size:.83rem}
.profil-bloc .odn-bouton{padding:8px;margin:0}
.profil-bloc .odn-bouton img{width:34px;height:34px}
/* page « Tous mes QR codes » : un QR par écran, défilement place par place */
.qr-slide{min-height:calc(100svh - 60px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;text-align:center;scroll-margin:10px}
.qr-slide .qr-place svg{width:min(72vw,340px)!important;height:auto!important;padding:8px!important}
.decision-form{display:inline-flex;gap:6px;flex-wrap:wrap;align-items:center}
.aucun-sejour{display:flex;flex-direction:column;align-items:center;gap:14px;padding:46px 20px;
 background:var(--card);border:1px dashed rgba(94,231,255,.35);border-radius:16px;text-align:center;margin:18px 0;
 box-shadow:0 0 18px rgba(94,231,255,.08)}
.aucun-sejour img{width:170px;height:170px;object-fit:contain;filter:drop-shadow(0 0 14px rgba(94,231,255,.5))}
.aucun-sejour .msg-rien{font-size:1.15rem;color:var(--neon);letter-spacing:.5px;
 text-shadow:0 0 12px rgba(94,231,255,.6)}
.aucun-sejour .dates{color:#7d9cc0}
/* ---------- CARTES SEJOURS (liste de la page Gestion des séjours) ---------- */
.sejs-grille{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;margin-top:10px}
.sej-carte{position:relative;display:flex;flex-direction:column;gap:10px;
 background:rgba(7,11,22,.55);border:1px solid rgba(94,231,255,.3);border-radius:14px;
 padding:14px 16px;overflow:hidden;transition:border-color .2s,transform .2s,box-shadow .2s}
.sej-carte:hover{border-color:rgba(94,231,255,.65);transform:translateY(-2px);
 box-shadow:0 6px 22px rgba(94,231,255,.12)}
.sej-carte .sej-img{height:86px;border-radius:10px;overflow:hidden;flex-shrink:0}
.sej-carte .sej-img img{width:100%;height:100%;object-fit:cover;display:block}
.sej-carte h4{margin:0;font-size:1.05rem;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.sej-dates{margin:0;color:#7d9cc0;font-size:.9rem;display:flex;align-items:center;gap:6px}
.sej-badges{display:flex;gap:6px;flex-wrap:wrap}
.sej-badges .badge{font-size:.75rem}
/* anciens séjours (archives) : cartes plus petites, cadre gris */
.sejs-grille.anciens{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));margin-top:8px}
.sej-carte.ancien{padding:10px 12px;gap:6px;border-color:rgba(139,147,167,.35);
 background:rgba(16,20,32,.55)}
.sej-carte.ancien:hover{border-color:rgba(139,147,167,.65);box-shadow:0 4px 14px rgba(139,147,167,.12)}
.sej-carte.ancien h4{font-size:.95rem}
.sej-carte.ancien .sej-img{height:56px}
.sej-carte.ancien .sej-dates{font-size:.8rem}
/* titres de colonnes cliquables (tri de la liste des enfants) */
.th-tri{color:inherit;text-decoration:none;font-weight:600}
.th-tri.actif{color:#5ee7ff;text-decoration:underline}
.sej-remplissage{margin:0}
.sej-remplissage .sej-barre-txt{display:flex;justify-content:space-between;font-size:.8rem;color:#8b93a7;margin-bottom:4px}
.sej-remplissage .sej-barre{height:8px;border-radius:6px;background:rgba(94,231,255,.12);overflow:hidden}
.sej-remplissage .sej-barre > span{display:block;height:100%;border-radius:6px;
 background:linear-gradient(90deg,#37e08a,#5eead4)}
.sej-remplissage.complet .sej-barre > span{background:linear-gradient(90deg,#ffb43a,#ff8a5e)}
.sej-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:auto;padding-top:6px;
 border-top:1px solid rgba(94,231,255,.18)}
/* ---------- CARTE INSCRIPTIONS (accueil admin) ---------- */
.insc-grille{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;margin-top:12px}
.insc-bloc{background:rgba(7,11,22,.55);border:1px solid rgba(94,231,255,.3);border-radius:12px;padding:12px 14px;
 display:flex;flex-direction:column;gap:8px}
.insc-bloc h4{margin:0;font-size:.95rem;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.insc-bloc .insc-legende{margin:0;color:#8b93a7;font-size:.83rem}
.insc-bloc .insc-chiffres{display:flex;gap:14px;flex-wrap:wrap;font-size:.85rem;color:#7d9cc0}
.insc-bloc .insc-chiffres strong{color:var(--neon)}
.insc-bloc .decision-form{margin:0}
.insc-bloc.complet{border-color:rgba(255,180,58,.55)}
/* carte Inscriptions : boutons d'enregistrement (💾) icone seule, hauteur
   identique aux champs du formulaire (etire sur la hauteur de la ligne) */
.btn-ic-sauve{align-self:stretch;display:inline-flex;align-items:center;justify-content:center;padding:0 12px}
.insc-bloc.complet h4::after{content:'complet';font-size:.7rem;padding:2px 8px;border-radius:6px;
 background:rgba(255,180,58,.15);color:#ffb43a;text-transform:uppercase;letter-spacing:.5px}
/* ---------- PAGE SITE (statistiques) : mur de cadres type masonry ---------- */
.stats-cols{columns:2 400px;column-gap:14px;margin-top:14px}
.stats-cols .sejour-cadre{margin:0 0 14px !important;break-inside:avoid;page-break-inside:avoid;
 display:inline-block;width:100%;vertical-align:top}
.stats-cols .sejour-cadre:last-child{margin-bottom:0 !important}
/* ---------- CARTE PROFIL (page admin_profil) ---------- */
.profil-tete{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-bottom:14px;
 padding-bottom:12px;border-bottom:1px solid rgba(94,231,255,.2)}
.profil-avatar{width:54px;height:54px;border-radius:50%;flex-shrink:0;
 display:flex;align-items:center;justify-content:center;font-size:1.4rem;font-weight:700;color:#0a1220;
 background:linear-gradient(135deg,#5eead4,#37e08a);box-shadow:0 0 16px rgba(94,231,255,.35)}
.profil-tete .profil-id{min-width:0}
.profil-tete .profil-id p{margin:0}
.profil-bloc{background:rgba(94,231,255,.07);border:1px solid rgba(94,231,255,.35);border-radius:12px;
 padding:12px 14px;margin-bottom:10px}
.profil-bloc h4{margin:0 0 8px;font-size:.9rem;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.profil-bloc .profil-legende{margin:6px 0 0;color:#8b93a7;font-size:.83rem}
.profil-bloc .decision-form{margin:0}
.profil-bloc input[type=text],.profil-bloc input[type=password],.profil-bloc textarea{flex:1;min-width:150px}
.profil-bloc details{margin-top:10px}
/* page admin_profil : grille notifications + profil */
.profil-grille{display:grid;grid-template-columns:minmax(300px,2fr) minmax(340px,3fr);gap:14px;align-items:start;margin-top:14px}
@media (max-width: 900px){
 .profil-grille{grid-template-columns:1fr;gap:12px;margin-top:12px}
 /* en colonne unique, le profil passe au-dessus des notifications */
 .profil-grille > div:first-child{order:2}
 .profil-grille > .sejour-cadre{order:1}
 .profil-tete{gap:10px}
 .profil-avatar{width:44px;height:44px;font-size:1.15rem}
 .profil-tete .badge.attente{margin-left:0;flex-basis:100%}
 .profil-bloc .decision-form{flex-direction:column;align-items:stretch}
 .profil-bloc .decision-form input[type=text],
 .profil-bloc .decision-form input[type=password],
 .profil-bloc textarea{width:100%;max-width:none}
}
/* ---------- PAGE FACTURES (devis + versements) ---------- */
.devis-liste{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:10px;margin-top:10px}
.devis-carte{position:relative;background:rgba(94,231,255,.07);border:1px solid rgba(94,231,255,.35);border-radius:10px;
 padding:8px 12px;display:flex;flex-direction:column;gap:4px}
.devis-carte h4{margin:0;font-size:.9rem;min-width:0;overflow:hidden;text-overflow:ellipsis;
 white-space:nowrap;flex:1 1 auto;padding-right:8px}
/* badge « defini / a definir » : petite pastille, jamais etiree */
.devis-carte .devis-ligne > .badge{flex:0 0 auto;width:auto;max-width:fit-content;align-self:center;
 padding:1px 8px;margin:0;font-size:.68rem;white-space:nowrap;display:inline-block}
.devis-carte .devis-ligne{display:flex;justify-content:flex-start;align-items:center;gap:6px;
 flex-wrap:nowrap;margin:0;padding-right:96px}
/* boutons Modifier / Supprimer : coin haut droit de la carte */
.devis-carte .devis-actions{position:absolute;top:8px;right:12px;display:flex;gap:6px;align-items:center}
.devis-carte .devis-montant{margin:2px 0 0;font-size:1.35rem;line-height:1.2}
.devis-carte .devis-montant strong{color:var(--neon)}
.devis-carte .devis-montant .pers{font-size:.85rem;font-weight:400;color:#8b93a7}
.devis-carte .devis-eur{margin:0;font-size:.9rem;color:#8b93a7}
.devis-carte .devis-meta{margin:0;font-size:.75rem;color:#8b93a7}
.devis-carte .devis-meta .badge{font-size:.68rem}
.devis-carte .devis-vide{margin:0;font-size:.85rem;display:flex;flex-direction:column;gap:6px}
.devis-carte form.devis-edit-pop{position:absolute;right:12px;background:var(--card);border:1px solid rgba(94,231,255,.4);
 border-radius:10px;padding:12px 14px;margin-top:4px;z-index:50;display:flex;flex-direction:column;gap:8px;
 min-width:240px;box-shadow:0 0 18px rgba(94,231,255,.25)}
.devis-total{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;
 margin-top:12px;padding:10px 14px;border-radius:10px;
 background:rgba(55,224,138,.08);border:1px solid rgba(55,224,138,.4)}
.devis-total .devis-total-bloc p{margin:0}
.devis-total .devis-total-bloc .legende{color:#8b93a7;font-size:.8rem;text-transform:uppercase;letter-spacing:.05em}
.devis-total .devis-total-bloc .valeur{font-size:1.25rem}
.devis-total .devis-total-bloc .valeur strong{color:#37e08a}
@media (max-width: 820px){
 .devis-liste{grid-template-columns:1fr}
}
/* liste des versements : lignes cartes */
.vers-liste{display:flex;flex-direction:column;gap:8px}
.vers-ligne{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
 background:rgba(7,11,22,.55);border:1px solid rgba(94,231,255,.3);border-radius:10px;padding:8px 12px}
.vers-ligne .vers-date{font-size:.8rem;color:#8b93a7;white-space:nowrap;flex-shrink:0;
 padding:2px 8px;border:1px solid rgba(94,231,255,.3);border-radius:8px}
.vers-ligne .vers-cat{font-weight:600;flex:1;min-width:0;overflow-wrap:break-word}
.vers-ligne .vers-montant{font-size:1.05rem;white-space:nowrap}
.vers-ligne .vers-montant strong{color:var(--neon)}
.vers-ligne .vers-meta{font-size:.78rem;color:#8b93a7;white-space:nowrap}
.vers-total-ligne{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;
 margin-top:10px;padding:8px 12px;border-radius:10px;
 background:rgba(55,224,138,.08);border:1px solid rgba(55,224,138,.4)}
.vers-total-ligne p{margin:0}
.vers-vide{margin:0;color:#8b93a7;font-size:.9rem;padding:10px;text-align:center;
 border:1px dashed rgba(94,231,255,.3);border-radius:10px}
/* ---------- CARTE PAIEMENTS (dossier eleve admin + parent) ---------- */
.paie-solde{display:flex;gap:14px;flex-wrap:wrap;align-items:center;
 margin-top:10px;padding:12px 14px;border-radius:10px;
 background:rgba(255,180,58,.08);border:1px solid rgba(255,180,58,.4)}
.paie-solde.solde-ok{background:rgba(55,224,138,.08);border-color:rgba(55,224,138,.4)}
/* état du solde : rouge = aucun paiement, orange = partiel, vert = soldé */
.paie-solde.solde-ko{background:rgba(255,90,90,.09);border-color:rgba(255,90,90,.45)}
.paie-solde.solde-partiel{background:rgba(255,180,58,.08);border-color:rgba(255,180,58,.4)}
/* ligne solde (2/3) + attestation de paiement (1/3) */
.paie-tiers{display:flex;gap:14px;align-items:stretch;flex-wrap:wrap;margin-top:10px}
.paie-tiers > .paie-solde{flex:1;min-width:0;margin-top:0}
.paie-tiers > .paie-attestation{flex:1;min-width:240px;display:flex;flex-direction:column;
 justify-content:center;gap:8px;background:rgba(94,231,255,.07);
 border:1px solid rgba(94,231,255,.35);border-radius:10px;padding:12px 14px}
.paie-attestation .paie-att-choix{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.paie-attestation select{max-width:90px}
/* select des noms de responsables : assez large pour rester lisible */
.paie-attestation .att-select-resp{flex:1;min-width:230px;max-width:none}
.paie-attestation .paie-att-note{margin:0;font-size:.8rem;color:#8b93a7}
.paie-solde .paie-solde-bloc{flex:1;min-width:110px}
.paie-solde .paie-legende{margin:0;font-size:.75rem;color:#8b93a7;text-transform:uppercase;letter-spacing:.05em}
.paie-solde .paie-valeur{margin:2px 0 0;font-size:1.25rem}
.paie-solde .paie-valeur-solde{color:#ffb43a}
.paie-solde.solde-ok .paie-valeur-solde{color:#37e08a}
.paie-solde.solde-ko .paie-valeur-solde{color:#ff6a6a}
.paie-solde.solde-partiel .paie-valeur-solde{color:#ffb43a}
.paie-deux-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;align-items:start;margin-top:12px}
.paie-encadre{background:rgba(94,231,255,.07);border:1px solid rgba(94,231,255,.35);border-radius:10px;padding:12px 14px}
.paie-liste{display:flex;flex-direction:column;gap:8px}
.paie-ligne{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
 background:rgba(7,11,22,.55);border:1px solid rgba(94,231,255,.3);border-radius:10px;padding:8px 12px}
.paie-ligne .paie-date{font-size:.8rem;color:#8b93a7;white-space:nowrap;flex-shrink:0;
 padding:2px 8px;border:1px solid rgba(94,231,255,.3);border-radius:8px}
.paie-ligne .paie-montant{font-size:1.05rem;white-space:nowrap}
.paie-ligne .paie-montant strong{color:var(--neon)}
.paie-ligne .paie-meta{font-size:.78rem;color:#8b93a7}
.paie-vide{margin:0;color:#8b93a7;font-size:.9rem;padding:10px;text-align:center;
 border:1px dashed rgba(94,231,255,.3);border-radius:10px}
/* ---------- MENU BURGER (mobile) ---------- */
#burger{display:none;background:transparent;border:1px solid rgba(94,231,255,.4);color:var(--neon);
 border-radius:8px;font-size:1.3rem;line-height:1;padding:8px 12px;cursor:pointer}
/* ---------- RESPONSIVE SMARTPHONE ---------- */
.notif-wrap{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;margin-top:14px}
.notif-bloc{margin:0}
.notif-bloc .flash{margin:0}
@media (max-width: 820px){
 /* notifications admin : mobile — details des documents masques (juste
    nom, nb de docs et sejour) et bouton de copie des inscriptions masque */
 .notif-details{display:none}
 .notif-copie{display:none}
 /* statistiques repas : cartes empilees en colonne unique */
 .stats-repas-grid{grid-template-columns:1fr !important}
 .stats-repas-grid .sejour-cadre{grid-column:auto !important;grid-row:auto !important}
 body{padding-top:0}                       /* la barre sticky gere son espace elle-meme */
 .topbar{padding:10px 12px;flex-direction:row;align-items:center;gap:10px;position:sticky}
 /* cadre fixe (titre + boutons) : colle SOUS le menu, lui-meme sticky en
    haut d ecran — meme ancrage que sur ordinateur : hauteur reelle du
    menu mesuree en JS (variable --topbar-h) */
 .liste-sticky{top:var(--topbar-h,56px)}
 .admin-head.sticky-head{top:var(--topbar-h,56px)}
 /* les cibles d ancres (titres, cadres) ne passent pas sous le cadre fixe */
 .topbar-app{margin:-18px 0 14px;margin-left:calc(50% - 50vw);padding:10px 12px}
 /* smartphone : le menu deploye (position absolute, top:100%) doit etre
    COLLE sous la barre fixe — aucun ecart (l ancien margin-top:8px
    creait un jour entre la barre et le depli du hamburger) */
 .topbar-app .menu{margin-top:0}
 .topbar-app .menu .btn{font-size:.95rem}
 .sejour-cadre{scroll-margin-top:calc(var(--topbar-h,66px) + 110px)}
 h1.neon{font-size:1.02rem;letter-spacing:1px;flex:1;min-width:0;line-height:1.25;
  white-space:normal;overflow:visible;text-overflow:clip}
 h1.neon br{display:inline}
 #burger{display:block}
 .menu{display:none;position:absolute;top:100%;left:0;right:0;flex-direction:column;flex-wrap:nowrap;
  background:rgba(7,11,22,.97);border-bottom:1px solid rgba(94,231,255,.35);
  box-shadow:0 10px 24px rgba(0,0,0,.6);padding:10px 12px;gap:2px}
 .menu.open{display:flex}
 .menu .login-admin{display:none}         /* (deja masque globalement) */
 .menu a{padding:12px 14px;font-size:.95rem;white-space:normal;border-radius:8px}
 main{padding:18px 12px}
 h2{font-size:1.25rem}
 .hero{gap:16px;margin-bottom:22px}
 .video-accueil{min-width:0}
 .video-accueil,.hero-text{flex:1 1 100%}
 .widget-grid,.sejour-grid{grid-template-columns:1fr;gap:14px}
 .grid{grid-template-columns:1fr}
 fieldset{padding:14px}
 legend{font-size:.85rem}
 input,select,textarea{font-size:16px}        /* évite le zoom auto iOS */
 .code-form input[name=code],.code-form input[name=q]{width:100%}
 .hebergement-cols{grid-template-columns:1fr}
 .acteurs-cols{grid-template-columns:1fr}
 /* dossier : cadre Paiements — solde et attestation empilés pleine
    largeur (sur écran étroit le flex-basis 0 laissait le cadre solde
    rétréci à côté de l'attestation min-width:240px) */
 .paie-tiers{flex-direction:column}
 .code-form,.decision-form,.upload-form{width:100%;flex-direction:column;align-items:stretch}
 .code-form input,.code-form button,.decision-form input,.decision-form button,
 .upload-form input[type=file],.upload-form button{width:100%}
 .upload-form input[type=file]{margin:0}
 table.sejour-infos{display:block;overflow-x:auto;white-space:nowrap}
 /* table des documents : pas de defilement horizontal — chaque ligne
    passe en bloc, le libelle puis le formulaire l'un sous l'autre */
 table.docs-table{white-space:normal;overflow-x:visible}
 table.docs-table tr{display:block;margin-bottom:12px}
 table.docs-table th{display:block;text-align:left;border:none;white-space:normal;overflow-wrap:break-word}
 table.docs-table td{display:block;width:100%;overflow-wrap:break-word}
 table.docs-table .upload-form{display:flex;flex-direction:column;align-items:stretch}
 table.docs-table .upload-form input[type=file],
 table.docs-table .upload-form button{width:100%;margin:0}
 /* coordonnees bancaires : libelle au-dessus de la valeur, pas de defilement */
 table.banque-table{white-space:normal;overflow-x:visible}
 table.banque-table tr{display:block;margin-bottom:8px}
 table.banque-table th{display:block;border:none;white-space:normal}
 table.banque-table td{display:block;width:100%;overflow-wrap:break-word}
 .aucun-sejour{padding:26px 14px}
 .aucun-sejour img{width:120px;height:120px}
 /* bandeau admin sticky : boutons pleine largeur alignes a gauche */
 .admin-head .head-droite{align-items:stretch;width:100%}
 .admin-head .head-droite .ligne-btns{justify-content:flex-start}
 /* smartphone : TOUTES les lignes de boutons n'affichent que l'icône,
    le texte (span.btn-txt, ajouté par le script commun) est masqué ;
    il reste en info-bulle (title) */
 /* smartphone : TOUS les boutons de la barre fixe n'affichent que
    l'icône (span.btn-txt ajouté par preparerBoutonsIcones), texte en
    info-bulle (title) */
 .topbar-app .btn-txt{display:none}
 /* boutons icone seule : largeur rognee (padding horizontal reduit) */
 .topbar-app .btn,.topbar-app .logout-btn{font-size:1.15rem;padding:6px 8px}
}
@media (max-width: 400px){
 h1.neon{font-size:.88rem}
 .menu a{font-size:.9rem}
}
#app.spa-loading{opacity:.45;transition:opacity .15s}
footer{text-align:center;color:#5f7d9b;font-size:.85rem;padding:30px 0}
/* bouton « Me rendre au point de rendez-vous » (encadré Le départ) :
   affiché uniquement sur smartphone / tablette tactile, masqué sur
   ordinateur (souris + pointeur fin = bureau) */
.btn-nav-rdv{display:inline-block}
@media (hover:hover) and (pointer:fine){.btn-nav-rdv{display:none}}
/* mini-carte du point de rendez-vous (encadré Le départ) : affichée
   sur ordinateur et tablette, masquée sur smartphone (l'iframe est
   lourde et peu lisible sur petit écran ; les boutons d'itinéraire
   suffisent) */
.rdv-map-frame{display:block}
@media (max-width:820px){.rdv-map-frame{display:none}}