/* ═══════════════════════════════════════════════════════════════════════════
   Secret Agency — App Shell v2  (ss-app.css)
   Grammaire "smartphone premium / iOS" par-dessus le design system existant.

   — Chargé APRÈS secret-story.css, uniquement sur les pages migrées.
   — Ne redéfinit AUCUNE couleur de marque : réutilise --cyan/--fuchsia/--night…
   — Opt-in : les composants ne s'appliquent qu'aux classes .ss-* / [data-ss-shell].
   Rien ici ne peut casser une page non migrée (aucun sélecteur global agressif).
   ═══════════════════════════════════════════════════════════════════════════ */

:root {
  /* ── Rayons (coins arrondis type iOS) ── */
  --r-card:  22px;
  --r-sheet: 28px;
  --r-row:   14px;
  --r-pill:  999px;
  --r-tile:  18px;

  /* ── Échelle d'espacement (multiples de 4) ── */
  --sp-1: 4px;  --sp-2: 8px;  --sp-3: 12px; --sp-4: 16px;
  --sp-5: 20px; --sp-6: 24px; --sp-8: 32px; --sp-10: 40px;

  /* ── Mouvement ── */
  --dur-press: 120ms;
  --dur-view:  320ms;
  --ease-spring: cubic-bezier(.32, 1.4, .55, 1);
  --ease-out:    cubic-bezier(.22, .61, .36, 1);

  /* ── Zones sûres (encoche / home bar iPhone) ── */
  --safe-t: env(safe-area-inset-top, 0px);
  --safe-b: env(safe-area-inset-bottom, 0px);
  --safe-l: env(safe-area-inset-left, 0px);
  --safe-r: env(safe-area-inset-right, 0px);

  /* ── Chrome de l'app ── */
  --tabbar-h: 66px;             /* hauteur barre d'onglets (hors safe-area) */
  --header-h: 52px;             /* hauteur en-tête compact */
  --app-max:  440px;            /* largeur "téléphone" (mobile / menu) */
  --app-wide: 960px;            /* colonne de contenu en plein écran desktop */

  /* ── Contraste renforcé (le --text-mid legacy .58 est trop faible) ── */
  --text-mid-strong: rgba(196, 216, 248, 0.82);

  /* ── Typo UI : stack système = rendu natif iPhone (SF Pro), zéro téléchargement ── */
  --font-ui: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", Roboto, system-ui, sans-serif;
  --font-display: 'Barlow Condensed', var(--font-ui);

  /* ── Ombres douces (vs bordures HUD dures) ── */
  --shadow-card:  0 8px 24px rgba(0, 0, 0, 0.34);
  --shadow-float: 0 12px 40px rgba(0, 0, 0, 0.48);

  /* ── Thème "constellation" (2026-07-17) ──
     Fond #050743 + étoiles/nébuleuses ; cadres = fond #231930 @30% + bordure violet→bleu. */
  --hairline: rgba(140, 130, 255, 0.34);           /* teinte violet-bleu des cadres */
  --frame-fill: rgba(35, 25, 48, 0.3);              /* #231930 à 30% */
  --frame-grad: linear-gradient(135deg, #7b2fff, #2979ff);  /* violet → bleu */
  --surface-1: rgba(35, 25, 48, 0.3);
  --surface-2: rgba(35, 25, 48, 0.3);

  /* ── Verre des barres (assez transparent pour laisser voir le flou = vrai
     "frosted glass" iOS ; le contenu défile visiblement dessous) ── */
  --glass-chrome:   rgba(7, 10, 32, 0.55);
  --glass-chrome-2: rgba(7, 10, 32, 0.42);
}

/* ═══════════════════════════════════════════════════════════════════════════
   1. Réglages globaux "app native" — s'appliquent quand <body data-ss-shell>
   ═══════════════════════════════════════════════════════════════════════════ */
body[data-ss-shell] {
  font-family: var(--font-ui);
  overscroll-behavior-y: none;                 /* pas de bounce/rubber-band parasite */
  -webkit-tap-highlight-color: transparent;    /* pas de flash bleu au tap */
  -webkit-text-size-adjust: 100%;
  color-scheme: dark;                          /* clavier iOS + contrôles natifs en sombre */
  /* (espace tab bar + défilement gérés par #ss-scroll — modèle "shell fixe") */

  /* Fond nébuleuse occulte : violet-noir profond + nappes violettes diffuses +
     étoiles + vignette sombre sur les bords (fidèle au concept art talismans).
     (spécificité body[attr] > body inline des pages → remplace leur fond) */
  background-color: #0a0318;
  background-image:
    radial-gradient(ellipse 125% 95% at 50% 42%, transparent 52%, rgba(2,0,10,0.72) 100%),
    radial-gradient(ellipse 74% 24% at 16% 5%,  rgba(123, 47, 255, 0.24), transparent 60%),
    radial-gradient(ellipse 62% 22% at 86% 22%, rgba(150, 60, 255, 0.16), transparent 62%),
    radial-gradient(ellipse 78% 26% at 50% 58%, rgba(224, 64, 251, 0.09), transparent 64%),
    radial-gradient(ellipse 66% 24% at 28% 92%, rgba(90, 70, 255, 0.13), transparent 62%),
    url("img/stars.svg");
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat;
  background-size: auto, auto, auto, auto, auto, 480px 860px;
  background-position: center;
  background-attachment: fixed;
}

/* ── Modèle "shell fixe" ────────────────────────────────────────────────────
   La page ne défile jamais ; seul #ss-scroll défile en interne, entre l'en-tête
   (flex-top) et la tab bar (position:fixed). Zéro rebond de page, et pas de
   scroll quand le contenu tient dans l'écran — comportement identique partout.
   Les pages bespoke plein écran (iMessage, clavier) s'excluent via
   [data-ss-noscroll] et gardent leur propre mise en page. */
body[data-ss-shell]:not([data-ss-noscroll]) {
  height: 100dvh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
#ss-scroll {
  flex: 1 1 auto;
  min-height: 0;                               /* requis pour le scroll d'un enfant flex */
  width: 100%;
  overflow-y: auto;
  overflow-x: hidden;
  -webkit-overflow-scrolling: touch;           /* momentum iOS */
  overscroll-behavior-y: contain;              /* pas de chaînage vers le body */
  padding-bottom: calc(var(--tabbar-h) + var(--safe-b) + var(--sp-4));  /* dégage la tab bar */
}

/* Chrome non-sélectionnable (le contenu reste sélectionnable) */
body[data-ss-shell] #ss-tabbar,
body[data-ss-shell] #ss-header { -webkit-user-select: none; user-select: none; }

/* Menu burger legacy retiré : remplacé par l'œil central (menu plein écran).
   On masque son UI en CSS — la fonction initBurgerMenu garde ses effets de bord
   (session reset guard, rappel handicap, watchers auth). */
body[data-ss-shell] #ss-burger-btn,
body[data-ss-shell] #ss-nav-overlay,
body[data-ss-shell] #ss-nav-drawer { display: none !important; }

/* Cibles tactiles : minimum 44px partout dans le shell */
body[data-ss-shell] button,
body[data-ss-shell] .ss-tap { min-height: 44px; }

/* Anti-zoom Safari : tout champ < 16px déclenche un zoom au focus */
body[data-ss-shell] input,
body[data-ss-shell] textarea,
body[data-ss-shell] select { font-size: max(16px, 1rem); }

/* ── Cadre "téléphone" sur grand écran ──────────────────────────────────────────
   Comportement par défaut : app centrée en colonne "téléphone" sur desktop.
   Exception : live.html passe en plein écran (override scopé dans live.html). */
@media (min-width: 700px) {
  html { background: var(--night); overscroll-behavior-y: none; }   /* Chrome/Android : le PTR natif se déclenche sur <html>, pas <body> — sinon il se réarme même en bas de page (le body ne défile jamais, cf. modèle "shell fixe") */
  body[data-ss-shell] {
    max-width: var(--app-max);
    margin: 0 auto;
    min-height: 100dvh;
    box-shadow: var(--shadow-float), 0 0 0 1px rgba(0, 229, 255, 0.08);
    border-radius: 0;                  /* le scroll interdit de clipper proprement */
    position: relative;
  }
  /* nébuleuse ambiante autour du "téléphone" */
  body[data-ss-shell]::after {
    content: '';
    position: fixed; inset: 0; z-index: -2;
    background:
      radial-gradient(ellipse 60% 50% at 15% 10%, rgba(0,229,255,0.05) 0%, transparent 60%),
      radial-gradient(ellipse 50% 60% at 88% 88%, rgba(224,64,251,0.06) 0%, transparent 62%),
      var(--night);
    width: 100vw; left: calc(50% - 50vw);
    pointer-events: none;
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   2. En-tête compact (SSShell.header) — grand titre iOS + retour + condensation
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-header {
  position: relative; z-index: 900; flex: 0 0 auto;   /* flex-top : reste fixe au-dessus de #ss-scroll */
  padding-top: var(--safe-t);
  display: flex; align-items: center; gap: var(--sp-2);
  min-height: calc(var(--header-h) + var(--safe-t));
  padding-left: var(--sp-4); padding-right: var(--sp-4);
  background: linear-gradient(to bottom, var(--glass-chrome), var(--glass-chrome-2));
  -webkit-backdrop-filter: saturate(180%) blur(22px);
  backdrop-filter: saturate(180%) blur(22px);
  border-bottom: 1px solid transparent;
  transition: border-color var(--dur-press) linear, background var(--dur-press) linear;
}
#ss-header.is-scrolled { border-bottom-color: var(--hairline); }

#ss-header .ss-back {
  flex: 0 0 auto; width: 40px; height: 40px; min-height: 40px;
  display: grid; place-items: center;
  border: 0; background: none; cursor: pointer;
  color: var(--cyan); font-size: 1.5rem; line-height: 1;
  border-radius: var(--r-pill);
  transition: transform var(--dur-press) var(--ease-spring), background var(--dur-press);
}
#ss-header .ss-back:active { transform: scale(0.88); background: rgba(0,229,255,0.1); }
/* Titre centré sur la page, convention barre de navigation iOS : les commandes
   vivent sur les bords, le titre reste au milieu quoi qu'il arrive. Centrage en
   absolu (et non via flex) parce que les éléments de bord sont asymétriques et
   de largeur variable : le bouton retour est optionnel, et la poignée du centre
   de contrôle (#ss-cc-handle) est en position:fixed à gauche, donc hors du flux
   de l'en-tête — un simple flex la ferait chevaucher le titre.
   La largeur max réserve ~75px de chaque côté pour ces commandes ; au-delà, le
   titre s'ellipse au lieu de passer dessous. */
#ss-header .ss-title {
  position: absolute;
  left: 50%; transform: translateX(-50%);
  top: var(--safe-t, 0px); height: var(--header-h);
  display: flex; align-items: center; justify-content: center;
  max-width: calc(100% - 150px);
  text-align: center;
  font-family: var(--font-display);
  font-weight: 800; letter-spacing: 0.02em;
  font-size: 1.18rem; color: var(--white);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
#ss-header .ss-header-spacer { flex: 1; }

/* ═══════════════════════════════════════════════════════════════════════════
   3. Barre d'onglets (SSShell tab bar) — verre flouté, œil central surélevé
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-tabbar {
  position: fixed; z-index: 1000;
  left: 50%; transform: translateX(-50%);
  bottom: 0; width: 100%; max-width: var(--app-max);
  height: calc(var(--tabbar-h) + var(--safe-b));
  padding-bottom: var(--safe-b);
  display: flex; align-items: stretch;
  background: linear-gradient(to top, var(--glass-chrome) 55%, var(--glass-chrome-2));
  -webkit-backdrop-filter: saturate(180%) blur(24px);
  backdrop-filter: saturate(180%) blur(24px);
  border-top: 1px solid var(--hairline);
  touch-action: none;   /* le glissé vertical vers le haut = ouverture menu (sinon le navigateur le vole en scroll → pointercancel) */
}
.ss-tab {
  position: relative; flex: 1;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px; text-decoration: none;
  color: var(--text-mid); font-family: var(--font-ui);
  transition: color var(--dur-press) linear;
  -webkit-tap-highlight-color: transparent;
}
.ss-tab-ico  { font-size: 1.46rem; line-height: 1; transition: transform var(--dur-press) var(--ease-spring); }
.ss-tab-lbl  { font-size: 0.64rem; font-weight: 600; letter-spacing: 0.02em; }
.ss-tab:active .ss-tab-ico { transform: scale(0.82); }
.ss-tab.is-active { color: var(--cyan); }
.ss-tab.is-active .ss-tab-ico { filter: drop-shadow(0 0 8px var(--cyan)); }
/* Indicateur d'onglet actif en accent — visible même si l'icône est un emoji
   (les emojis ignorent la propriété color). Piloté par --cyan = couleur d'app. */
.ss-tab.is-active:not(.ss-tab-center)::before {
  content: ''; position: absolute; top: 5px; left: 50%; transform: translateX(-50%);
  width: 20px; height: 3px; border-radius: 2px;
  background: var(--cyan); box-shadow: 0 0 8px var(--cyan);
}

/* pastille de notification (rose) */
.ss-tab-badge {
  position: absolute; top: 6px; left: calc(50% + 8px);
  min-width: 16px; height: 16px; padding: 0 4px;
  display: grid; place-items: center;
  background: var(--fuchsia); color: #fff;
  font-size: 0.6rem; font-weight: 700; line-height: 1;
  border-radius: var(--r-pill);
  box-shadow: 0 0 0 2px var(--glass-strong), var(--glow-fuchsia);
  transform-origin: center;
  animation: ssBadgePop 0.4s var(--ease-spring);   /* rejoué à chaque display:none→grid */
}
.ss-tab-badge[hidden] { display: none; }
@keyframes ssBadgePop { 0% { transform: scale(0); } 58% { transform: scale(1.28); } 100% { transform: scale(1); } }

/* onglet central surélevé — l'œil Secret Agency */
.ss-tab-center { flex: 0 0 78px; }
.ss-tab-center .ss-eye {
  position: relative; top: -18px;
  width: 62px; height: 62px; border-radius: var(--r-pill);
  display: grid; place-items: center;
  background: radial-gradient(circle at 50% 38%, #1a1140, #0a0518);
  border: 1.5px solid rgba(168, 90, 255, 0.6);
  box-shadow: 0 6px 20px rgba(0,0,0,0.5), 0 0 22px rgba(224,64,251,0.35), 0 0 44px rgba(138,43,226,0.55);
  transition: transform var(--dur-press) var(--ease-spring);
}
/* Halo violet rayonnant derrière l'œil (point focal bas d'écran, cf. concept art) */
.ss-tab-center .ss-eye::before {
  content: ''; position: absolute; inset: -16px; border-radius: 50%; z-index: -1;
  pointer-events: none;
  background: radial-gradient(circle, rgba(138,43,226,0.5) 0%, rgba(123,47,255,0.18) 45%, transparent 72%);
}
.ss-tab-center:active .ss-eye { transform: scale(0.9); }
.ss-tab-center.is-active .ss-eye {
  border-color: var(--fuchsia);
  box-shadow: 0 6px 20px rgba(0,0,0,0.5), 0 0 28px rgba(224,64,251,0.6), 0 0 52px rgba(138,43,226,0.6);
}
.ss-tab-center .ss-eye svg { width: 34px; height: 22px; display: block; }
.ss-tab-center .ss-tab-lbl { position: relative; top: -13px; }

/* ═══════════════════════════════════════════════════════════════════════════
   3b. Menu plein écran (ouvert par l'œil central) — fond ~70% + flou, style iPhone
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-menu {
  position: fixed; inset: 0; z-index: 1100;
  overflow-y: auto; -webkit-overflow-scrolling: touch;
  background: rgba(6, 9, 30, 0.5);
  -webkit-backdrop-filter: blur(26px) saturate(140%);
  backdrop-filter: blur(26px) saturate(140%);
  padding: calc(var(--safe-t) + var(--sp-8)) var(--sp-5) calc(var(--tabbar-h) + var(--safe-b) + var(--sp-8));
  opacity: 0; pointer-events: none;
  transition: opacity var(--dur-view) var(--ease-out);
}
#ss-menu.is-open { opacity: 1; pointer-events: auto; }
#ss-menu .ss-menu-inner {
  width: 100%; max-width: var(--app-max); margin: 0 auto;
  transform: scale(0.94); opacity: 0;
  transition: transform var(--dur-view) var(--ease-spring), opacity var(--dur-view) var(--ease-out);
}
#ss-menu.is-open .ss-menu-inner { transform: scale(1); opacity: 1; }
#ss-menu .ss-menu-title {
  font-family: var(--font-display); font-weight: 900; font-size: 1.7rem;
  color: var(--white); text-align: center; margin-bottom: var(--sp-2);
}
#ss-menu .ss-menu-hint {
  text-align: center; font-size: 0.66rem; letter-spacing: 0.02em;
  color: var(--text-mid); margin-bottom: var(--sp-5);
}
.ss-menu-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-5) var(--sp-3); }

/* Réorganisation — mode édition façon iOS.
   -webkit-touch-callout:none = tue le menu contextuel Safari à l'appui long. */
.ss-menu-item {
  position: relative;
  touch-action: manipulation;
  -webkit-touch-callout: none; -webkit-user-select: none; user-select: none;
}
/* Épingle (coin haut-gauche) — indicateur si épinglée, bouton en mode édition */
.ss-menu-pin {
  position: absolute; top: 2px; left: 2px; z-index: 4;
  width: 22px; height: 22px; display: none; place-items: center;
  border-radius: 50%; font-size: 0.66rem; line-height: 1;
  color: var(--text-mid); background: rgba(4, 6, 20, 0.6);
  border: 1px solid var(--hairline); pointer-events: none;
}
.ss-menu-item.is-pinned .ss-menu-pin {
  display: grid; color: var(--amber);
  background: rgba(200, 151, 58, 0.18); border-color: rgba(200, 151, 58, 0.55);
}
#ss-menu.editing .ss-menu-pin { display: grid; pointer-events: auto; }   /* tappable seulement en édition */
#ss-menu.editing .ss-menu-item { touch-action: none; }   /* pas de scroll pendant le drag */
#ss-menu.editing .ss-menu-item:not(.is-placeholder) { animation: ssJiggle 0.34s ease-in-out infinite; }
@keyframes ssJiggle { 0%,100% { transform: rotate(-1.4deg); } 50% { transform: rotate(1.4deg); } }
/* Original « pris » = fantôme laissé dans la grille (montre où l'icône va retomber) */
.ss-menu-item.is-placeholder { opacity: 0.28; animation: none !important; }
/* Clone flottant qui suit le doigt (enfant de <body>, hors #ss-menu → fixed = viewport) */
.ss-menu-proxy {
  position: fixed; z-index: 2000; margin: 0; pointer-events: none;
  transform: scale(1.12); filter: drop-shadow(0 12px 26px rgba(0, 0, 0, 0.6));
}

/* Bouton « Terminé » — visible seulement en mode édition */
.ss-menu-done {
  display: none; margin: var(--sp-6) auto 0; padding: 12px 28px; min-height: 46px;
  border: 0; cursor: pointer; border-radius: var(--r-pill);
  font-family: var(--font-ui); font-weight: 700; font-size: 0.86rem;
  background: linear-gradient(135deg, var(--cyan), var(--azure)); color: #04121f;
}
#ss-menu.editing .ss-menu-done { display: block; }
#ss-menu.editing .ss-menu-close { display: none; }
#ss-menu.editing .ss-menu-hint { color: var(--cyan); }
.ss-menu-item {
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  text-decoration: none; color: var(--cream);
  transition: transform var(--dur-press) var(--ease-spring);
}
.ss-menu-item:active { transform: scale(0.9); }
.ss-menu-ico {
  width: 62px; height: 62px; border-radius: 20px;
  display: grid; place-items: center; font-size: 1.55rem;
  background: var(--surface-1); border: 1px solid var(--hairline);
  box-shadow: var(--shadow-card);
}
.ss-menu-lbl { font-size: 0.68rem; font-weight: 600; text-align: center; line-height: 1.2; color: var(--text-mid-strong); }
.ss-menu-close {
  display: grid; place-items: center;
  width: 48px; height: 48px; margin: var(--sp-6) auto 0;
  border-radius: var(--r-pill); cursor: pointer;
  background: rgba(255, 255, 255, 0.06); border: 1px solid var(--hairline);
  color: var(--cream); font-size: 1.2rem;
  transition: transform var(--dur-press) var(--ease-spring);
}
.ss-menu-close:active { transform: scale(0.9); }

/* ═══════════════════════════════════════════════════════════════════════════
   4. Conteneur de page + titre "large" iOS
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-page { width: 100%; max-width: var(--app-max); margin: 0 auto; padding: 0 var(--sp-4); }
.ss-largetitle {
  font-family: var(--font-display);
  font-weight: 900; letter-spacing: 0.01em;
  font-size: 1.9rem; color: var(--white);
  padding: var(--sp-4) 0 var(--sp-2);
}
.ss-largetitle .ss-largetitle-sub {
  display: block; font-family: var(--font-ui);
  font-weight: 500; font-size: 0.82rem; letter-spacing: 0;
  color: var(--text-mid-strong); margin-top: 3px;
}

/* ═══════════════════════════════════════════════════════════════════════════
   5. Cartes (dashboard) — coins mous, gradient par accent, ombre douce
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-card {
  position: relative; display: block; text-decoration: none;
  border-radius: var(--r-card);
  padding: var(--sp-4);
  background: var(--surface-1);
  border: 1px solid var(--hairline);
  box-shadow: var(--shadow-card);
  color: var(--text);
  transition: transform var(--dur-press) var(--ease-spring), box-shadow var(--dur-press);
  overflow: hidden;
}
.ss-card:active { transform: scale(0.97); }
.ss-card-ico {
  display: grid; place-items: center;
  width: 42px; height: 42px; border-radius: var(--r-tile);
  font-size: 1.3rem; margin-bottom: var(--sp-3);
  background: rgba(255,255,255,0.06);
}
.ss-card-title { display: block; font-weight: 700; font-size: 1rem; color: var(--white); }
.ss-card-desc  { display: block; font-size: 0.76rem; color: var(--text-mid-strong); margin-top: 2px; line-height: 1.35; }

/* teintes d'accent par carte (dégradé subtil + icône colorée) */
.ss-card--cyan    { background: linear-gradient(155deg, rgba(0,229,255,0.14), var(--surface-1) 62%); }
.ss-card--cyan    .ss-card-ico { color: var(--cyan);    background: rgba(0,229,255,0.14); }
.ss-card--fuchsia { background: linear-gradient(155deg, rgba(224,64,251,0.16), var(--surface-1) 62%); }
.ss-card--fuchsia .ss-card-ico { color: var(--fuchsia); background: rgba(224,64,251,0.15); }
.ss-card--violet  { background: linear-gradient(155deg, rgba(123,47,255,0.16), var(--surface-1) 62%); }
.ss-card--violet  .ss-card-ico { color: #a877ff;        background: rgba(123,47,255,0.16); }
.ss-card--amber   { background: linear-gradient(155deg, rgba(200,151,58,0.16), var(--surface-1) 62%); }
.ss-card--amber   .ss-card-ico { color: var(--amber);   background: rgba(200,151,58,0.16); }
.ss-card--green   { background: linear-gradient(155deg, rgba(0,230,118,0.14), var(--surface-1) 62%); }
.ss-card--green   .ss-card-ico { color: var(--green);   background: rgba(0,230,118,0.14); }

/* badge compteur en coin de carte */
.ss-card-badge {
  position: absolute; top: var(--sp-3); right: var(--sp-3);
  min-width: 22px; height: 22px; padding: 0 6px;
  display: grid; place-items: center;
  background: var(--fuchsia); color: #fff;
  font-size: 0.72rem; font-weight: 700; border-radius: var(--r-pill);
  box-shadow: var(--glow-fuchsia);
  transform-origin: center; animation: ssBadgePop 0.4s var(--ease-spring);
}

.ss-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-3); }

/* rangée de raccourcis à défilement horizontal (accès secondaire) */
.ss-hscroll {
  display: flex; gap: var(--sp-3);
  overflow-x: auto; scroll-snap-type: x proximity;
  padding: var(--sp-1) 0 var(--sp-2);
  -ms-overflow-style: none; scrollbar-width: none;
}
.ss-hscroll::-webkit-scrollbar { display: none; }
.ss-hscroll > * { scroll-snap-align: start; flex: 0 0 auto; }
.ss-chip {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  width: 72px; padding: var(--sp-3) var(--sp-1);
  border-radius: var(--r-tile); text-decoration: none;
  background: var(--surface-2); border: 1px solid var(--hairline);
  color: var(--text-mid-strong); text-align: center;
  transition: transform var(--dur-press) var(--ease-spring);
}
.ss-chip:active { transform: scale(0.94); }
.ss-chip-ico { font-size: 1.25rem; }
.ss-chip-lbl { font-size: 0.62rem; font-weight: 600; line-height: 1.2; }

/* ═══════════════════════════════════════════════════════════════════════════
   6. Listes "inset grouped" iOS (secrets, historique, profil)
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-list {
  border-radius: var(--r-card);
  background: var(--surface-1);
  border: 1px solid var(--hairline);
  overflow: hidden;
}
.ss-list-row {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-4); min-height: 52px;
  text-decoration: none; color: var(--text);
  border-top: 1px solid var(--hairline);
  transition: background var(--dur-press);
}
.ss-list-row:first-child { border-top: 0; }
.ss-list-row:active { background: rgba(255,255,255,0.04); }
.ss-list-row-ico { flex: 0 0 auto; font-size: 1.1rem; width: 26px; text-align: center; color: var(--cyan); }
.ss-list-row-main { flex: 1; min-width: 0; }
.ss-list-row-title { font-weight: 600; font-size: 0.92rem; }
.ss-list-row-sub   { font-size: 0.74rem; color: var(--text-mid-strong); }
.ss-list-row-val   { font-size: 0.8rem; font-weight: 600; }
.ss-list-row-chevron { flex: 0 0 auto; color: var(--text-dim); font-size: 1.1rem; }
.ss-val-ok   { color: var(--green); }
.ss-val-todo { color: var(--text-mid); }

/* ═══════════════════════════════════════════════════════════════════════════
   7. Contrôle segmenté (EN COURS / TERMINÉES)
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-segment {
  display: flex; padding: 3px; gap: 3px;
  background: var(--surface-2); border-radius: var(--r-pill);
  border: 1px solid var(--hairline);
}
.ss-segment button {
  flex: 1; border: 0; cursor: pointer; min-height: 38px;
  border-radius: var(--r-pill);
  font-family: var(--font-ui); font-size: 0.78rem; font-weight: 600;
  color: var(--text-mid-strong); background: transparent;
  transition: background var(--dur-press), color var(--dur-press);
}
.ss-segment button.is-active {
  background: linear-gradient(135deg, var(--cyan), var(--azure));
  color: #04121f; box-shadow: var(--glow-cyan);
}

/* ═══════════════════════════════════════════════════════════════════════════
   8. Boutons pilule
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 12px 22px; min-height: 46px;
  border: 0; cursor: pointer; text-decoration: none;
  border-radius: var(--r-pill);
  font-family: var(--font-ui); font-size: 0.86rem; font-weight: 700; letter-spacing: 0.01em;
  transition: transform var(--dur-press) var(--ease-spring), filter var(--dur-press);
}
.ss-btn:active { transform: scale(0.95); }
.ss-btn--primary { background: linear-gradient(135deg, var(--fuchsia), #b026d3); color: #fff; box-shadow: var(--glow-fuchsia); }
.ss-btn--cyan    { background: linear-gradient(135deg, var(--cyan), var(--azure)); color: #04121f; box-shadow: var(--glow-cyan); }
.ss-btn--ghost   { background: rgba(255,255,255,0.05); color: var(--text); border: 1px solid var(--hairline); }
.ss-btn[disabled]{ opacity: 0.5; cursor: not-allowed; }
.ss-btn--block   { display: flex; width: 100%; }

/* ═══════════════════════════════════════════════════════════════════════════
   9. Barre de progression arrondie (missions, XP)
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-progress { height: 8px; border-radius: var(--r-pill); background: rgba(255,255,255,0.08); overflow: hidden; }
.ss-progress > i {
  display: block; height: 100%; border-radius: var(--r-pill);
  background: linear-gradient(90deg, var(--cyan), var(--fuchsia));
  transition: width var(--dur-view) var(--ease-out);
}
.ss-tabnum { font-variant-numeric: tabular-nums; }

/* ═══════════════════════════════════════════════════════════════════════════
   10. Bottom sheet (poignée de drag) — remplace les modals centrés
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-sheet-scrim {
  position: fixed; inset: 0; z-index: 1200;
  background: rgba(2, 4, 16, 0.6);
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
  opacity: 0; transition: opacity var(--dur-view) var(--ease-out);
}
.ss-sheet-scrim.is-open { opacity: 1; }
.ss-sheet {
  position: fixed; z-index: 1201; left: 50%; bottom: 0;
  transform: translate(-50%, 100%);
  width: 100%; max-width: var(--app-max);
  padding: var(--sp-2) var(--sp-5) calc(var(--sp-6) + var(--safe-b));
  background: var(--glass-strong);
  -webkit-backdrop-filter: blur(24px); backdrop-filter: blur(24px);
  border-top-left-radius: var(--r-sheet); border-top-right-radius: var(--r-sheet);
  border-top: 1px solid var(--glass-border-hover);
  box-shadow: var(--shadow-float);
  transition: transform var(--dur-view) var(--ease-spring);
}
.ss-sheet.is-open { transform: translate(-50%, 0); }
.ss-sheet-grip {
  width: 38px; height: 4px; border-radius: var(--r-pill);
  background: rgba(255,255,255,0.25); margin: var(--sp-2) auto var(--sp-4);
}
.ss-sheet-title { font-family: var(--font-display); font-weight: 800; font-size: 1.2rem; color: var(--white); margin-bottom: var(--sp-2); }

/* ═══════════════════════════════════════════════════════════════════════════
   11. Transitions de navigation cross-document (Chrome 126+/Safari 18.2)
       Le chrome reste fixe, le contenu glisse. Fallback silencieux ailleurs.
   ═══════════════════════════════════════════════════════════════════════════ */
/* Transition FIABLE partout : fondu + léger glissé du CONTENU à chaque chargement de
   page (marche sur tout iOS, y compris PWA standalone). Cible le contenu, pas le body,
   pour ne pas animer la tab bar/header fixes. */
body[data-ss-shell] .ss-page,
body[data-ss-shell] #main-content,
body[data-ss-shell] #home {
  animation: ssPageIn 0.30s var(--ease-out) backwards;
}
@keyframes ssPageIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }

/* Bonus Safari 18.2+ : View Transitions cross-document → le chrome reste stable
   pendant la nav. ⚠ CRITIQUE : deux éléments avec le MÊME view-transition-name
   annulent TOUTE la transition (silencieux) → noms distincts obligatoires. */
@view-transition { navigation: auto; }
#ss-tabbar { view-transition-name: ss-tabbar; }
#ss-header { view-transition-name: ss-header; }
body[data-ss-shell] #cagnotte-header { view-transition-name: ss-cagnotte; }

/* Glissement directionnel du contenu (push/pop iOS). Les types 'ss-forward' /
   'ss-back' sont ajoutés en JS (ss-shell.js, events pageswap/pagereveal) selon le
   sens de nav. Le chrome nommé (tabbar/header/cagnotte) garde sa transition propre
   → il reste en place pendant que SEUL le contenu (root) glisse. */
@keyframes ss-slide-in-right  { from { transform: translateX(100%); }            to { transform: translateX(0); } }
@keyframes ss-slide-out-left  { from { transform: translateX(0); opacity: 1; }   to { transform: translateX(-28%); opacity: 0; } }
@keyframes ss-slide-in-left   { from { transform: translateX(-28%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
@keyframes ss-slide-out-right { from { transform: translateX(0); }               to { transform: translateX(100%); } }
:root:active-view-transition-type(ss-forward)::view-transition-old(root) { animation: ss-slide-out-left  0.32s var(--ease-out) both; }
:root:active-view-transition-type(ss-forward)::view-transition-new(root) { animation: ss-slide-in-right  0.32s var(--ease-out) both; }
:root:active-view-transition-type(ss-back)::view-transition-old(root)    { animation: ss-slide-out-right 0.32s var(--ease-out) both; }
:root:active-view-transition-type(ss-back)::view-transition-new(root)    { animation: ss-slide-in-left   0.32s var(--ease-out) both; }

/* Barre de progression de navigation (réseau lent / navigateurs sans View Transition). */
#ss-navprog {
  position: fixed; top: 0; left: 0; height: 2.5px; width: 0; z-index: 3000; opacity: 0;
  pointer-events: none; background: linear-gradient(90deg, var(--cyan), var(--fuchsia));
  box-shadow: 0 0 8px var(--cyan);
}
#ss-navprog.is-active { width: 90%; opacity: 1; transition: width 1.4s cubic-bezier(0.1,0.7,0.2,1), opacity 0.2s; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition-duration: 1ms !important; animation-duration: 1ms !important; }
  body[data-ss-shell] .ss-page, body[data-ss-shell] #main-content, body[data-ss-shell] #home { animation: none; }
  @view-transition { navigation: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   12. Polish partagé des pages migrées (chrome commun)
   Sélecteurs préfixés `body[data-ss-shell]` → spécificité (id + attribut) qui
   BAT les définitions `#id` inline de chaque page, quel que soit l'ordre de
   chargement. Restyle uniquement le chrome COMMUN, jamais le contenu bespoke.
   Les pages principales (missions/buzz/…) gardent leurs overrides plus
   spécifiques (`#main-content .section-title`, etc.) qui l'emportent ici.
   ═══════════════════════════════════════════════════════════════════════════ */

/* En-tête cagnotte (copié à l'identique sur ~6 pages) → bande verre iOS */
body[data-ss-shell] #cagnotte-header {
  height: auto; justify-content: flex-start; gap: var(--sp-3);
  padding: calc(var(--safe-t) + 10px) var(--sp-4) 10px;
  background: linear-gradient(to bottom, var(--glass-chrome), var(--glass-chrome-2));
  -webkit-backdrop-filter: saturate(180%) blur(22px); backdrop-filter: saturate(180%) blur(22px);
  border-bottom: 1px solid var(--hairline); box-shadow: none;
}
body[data-ss-shell] #cagnotte-header::before,
body[data-ss-shell] #cagnotte-header::after { display: none; }   /* retire les crochets HUD */
body[data-ss-shell] #cagnotte-header #cagnotte-amount { font-family: var(--font-display); font-weight: 900; font-size: 1.7rem; }
body[data-ss-shell] #cagnotte-header .cagnotte-meta { flex: 1; min-width: 0; }
body[data-ss-shell] #cagnotte-header .cagnotte-pseudo,
body[data-ss-shell] #cagnotte-header #player-pseudo-name { color: var(--cyan); }

/* Wrapper largeur téléphone */
body[data-ss-shell] #main-content { max-width: var(--app-max); }

/* Labels de section → iOS */
body[data-ss-shell] .section-title {
  font-family: var(--font-ui); font-size: 0.66rem; font-weight: 700;
  letter-spacing: 0.16em; text-transform: uppercase; color: var(--text-mid);
}

/* Panneaux HUD partagés → arrondis, sans crochets */
body[data-ss-shell] .hud-panel { border-radius: var(--r-card); }
body[data-ss-shell] .hud-panel::before,
body[data-ss-shell] .hud-panel::after { display: none; }

/* États vides */
body[data-ss-shell] .empty-state { font-family: var(--font-ui); }

/* ═══════════════════════════════════════════════════════════════════════════
   13. Cadres — thème constellation : fond #231930 @30% + bordure violet→bleu
   Technique double-background (padding-box = fond, border-box = dégradé) → coins
   arrondis respectés. !important pour uniformiser malgré les fonds par-carte.
   ═══════════════════════════════════════════════════════════════════════════ */
body[data-ss-shell] .ss-card,
body[data-ss-shell] .ss-list,
#home .hx-card,
#home .hx-event,
#home #claim-box {
  border: 1px solid transparent !important;
  background:
    linear-gradient(var(--frame-fill), var(--frame-fill)) padding-box,
    var(--frame-grad) border-box !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   14. Retour tactile (press states) + non-sélection du chrome
   `.ss-pressed` est posée/retirée au pointeur par ss-shell.js. iOS ne déclenche
   pas `:active` de façon fiable hors <button>/<a> → on pilote en JS, ce qui
   couvre AUSSI le contenu legacy des pages. Retour au repos = spring ci-dessous.
   ═══════════════════════════════════════════════════════════════════════════ */
body[data-ss-shell] .ss-card,
body[data-ss-shell] .ss-btn,
body[data-ss-shell] .ss-chip,
body[data-ss-shell] .ss-list-row,
body[data-ss-shell] .ss-menu-item,
body[data-ss-shell] .ss-tap,
body[data-ss-shell] .hx-card,
body[data-ss-shell] .hx-event {
  transition: transform 260ms var(--ease-spring), filter 180ms linear, box-shadow 180ms linear;
  -webkit-user-select: none; user-select: none;
  -webkit-tap-highlight-color: transparent;
}
body[data-ss-shell] .ss-pressed {
  transform: scale(0.955) !important;
  filter: brightness(0.9);
  transition-duration: 90ms !important;   /* enfoncement rapide, relâchement spring */
}

/* Chrome non-sélectionnable (titres/labels) — signal "site web" = flash au tap */
body[data-ss-shell] .section-title,
body[data-ss-shell] .ss-largetitle,
body[data-ss-shell] .ss-title,
body[data-ss-shell] .ss-menu-title,
body[data-ss-shell] .ss-menu-hint,
body[data-ss-shell] .ss-tab-lbl,
body[data-ss-shell] .ss-card-title,
body[data-ss-shell] .ss-card-desc { -webkit-user-select: none; user-select: none; }

/* ═══════════════════════════════════════════════════════════════════════════
   15. Bottom sheets — grabber + entrée animée + glisser-pour-fermer
   Uniformise le dialogue de confirmation partagé (#ss-confirm-*) sur toutes les
   pages migrées. Spécificité (body[attr] + #id) > #id inline des pages, quel que
   soit l'ordre de chargement. Le glisser vertical est géré dans ss-shell.js.
   ═══════════════════════════════════════════════════════════════════════════ */
body[data-ss-shell] #ss-confirm-overlay {
  align-items: flex-end; justify-content: center; padding: 0;
  background: rgba(2, 4, 16, 0.6);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
  animation: ssScrimIn 0.28s var(--ease-out);
}
body[data-ss-shell] #ss-confirm-box {
  width: 100%; max-width: var(--app-max); margin: 0;
  padding: var(--sp-2) var(--sp-5) calc(var(--sp-6) + var(--safe-b));
  border-radius: var(--r-sheet) var(--r-sheet) 0 0;
  animation: ssSheetIn 0.42s var(--ease-spring);
  will-change: transform;
  touch-action: none;                       /* glisser vertical capté en JS */
}
body[data-ss-shell] #ss-confirm-box::before {          /* grabber (poignée) */
  content: ''; display: block;
  width: 38px; height: 4px; margin: 2px auto var(--sp-4);
  border-radius: var(--r-pill); background: rgba(255, 255, 255, 0.25);
}
body[data-ss-shell] #ss-confirm-box.ss-dragging { animation: none; }
body[data-ss-shell] #ss-confirm-box.ss-snapback { transition: transform 0.32s var(--ease-spring); }
@keyframes ssSheetIn { from { transform: translateY(100%); } to { transform: translateY(0); } }
@keyframes ssScrimIn { from { opacity: 0; } to { opacity: 1; } }

/* ═══════════════════════════════════════════════════════════════════════════
   16. Dynamic Island — pastille haute qui surgit, s'étend, se rétracte
   Remplace l'affichage des toasts sur les pages migrées (bridge dans ss-shell.js).
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-island {
  position: fixed; z-index: 1500;
  top: calc(var(--safe-t) + 8px); left: 50%;
  max-width: min(92vw, 400px);
  display: flex; align-items: center; gap: 9px;
  padding: 9px 15px;
  background: #0a0b12; color: var(--cream);
  border-radius: var(--r-pill);
  box-shadow: 0 12px 34px rgba(0, 0, 0, 0.6), inset 0 0 0 1px rgba(255, 255, 255, 0.07);
  font-family: var(--font-ui); font-size: 0.82rem; font-weight: 600; line-height: 1.2;
  transform: translateX(-50%) translateY(-150%) scale(0.55);
  opacity: 0; pointer-events: none;
  transition: transform 0.5s var(--ease-spring), opacity 0.3s var(--ease-out);
}
#ss-island.is-showing { transform: translateX(-50%) translateY(0) scale(1); opacity: 1; pointer-events: auto; }
.ss-island-ico { flex: 0 0 auto; width: 22px; height: 22px; display: grid; place-items: center; border-radius: 50%; background: rgba(255, 255, 255, 0.1); }
.ss-island-ico svg { width: 14px; height: 14px; display: block; }
.ss-island-txt { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#ss-island.ss-island--voix    { box-shadow: 0 12px 34px rgba(0,0,0,.6), inset 0 0 0 1px rgba(244,115,32,.55), 0 0 22px rgba(244,115,32,.32); }
#ss-island.ss-island--voix    .ss-island-ico { background: rgba(244,115,32,.2); color: #f47320; }
#ss-island.ss-island--mission { box-shadow: 0 12px 34px rgba(0,0,0,.6), inset 0 0 0 1px rgba(200,169,110,.5), 0 0 20px rgba(200,169,110,.28); }
#ss-island.ss-island--mission .ss-island-ico { background: rgba(200,169,110,.2); color: var(--amber); }
#ss-island.ss-island--success .ss-island-ico { background: rgba(0,230,118,.2); color: var(--green); }
#ss-island.ss-island--info    .ss-island-ico { background: rgba(0,229,255,.18); color: var(--cyan); }

/* ═══════════════════════════════════════════════════════════════════════════
   17. Skeletons shimmer — remplacent les spinners pendant le chargement Firestore
   Utilitaire : ajouter .ss-skeleton à un conteneur (texte masqué + shimmer).
   Auto-appliqué sur les valeurs cagnotte (voir ss-shell.js).
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-skeleton {
  color: transparent !important; border-radius: var(--r-row);
  background:
    linear-gradient(100deg, rgba(255,255,255,0.04) 30%, rgba(255,255,255,0.12) 50%, rgba(255,255,255,0.04) 70%)
    rgba(255, 255, 255, 0.05);
  background-size: 220% 100%;
  animation: ssShimmer 1.15s ease-in-out infinite;
  pointer-events: none; -webkit-user-select: none; user-select: none;
}
.ss-skeleton * { visibility: hidden; }
.ss-skel-inline { display: inline-block; min-width: 64px; height: 1em; vertical-align: middle; }
@keyframes ssShimmer { from { background-position: 180% 0; } to { background-position: -60% 0; } }

/* ═══════════════════════════════════════════════════════════════════════════
   18. Overlay d'installation (A2HS) + actions du menu plein écran
   Réutilise le bottom sheet (.ss-sheet / .ss-sheet-scrim). Guide iOS Partager →
   écran d'accueil ; bouton natif sur Android via beforeinstallprompt.
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-install .ss-sheet-title { text-align: center; }
.ss-install-sub {
  text-align: center; font-size: 0.82rem; line-height: 1.45;
  color: var(--text-mid-strong); margin: 0 auto var(--sp-5); max-width: 300px;
}
.ss-install-steps { display: flex; flex-direction: column; gap: var(--sp-3); margin-bottom: var(--sp-5); }
.ss-install-step {
  display: flex; align-items: center; gap: var(--sp-3);
  font-size: 0.9rem; color: var(--cream);
  padding: var(--sp-3) var(--sp-4); border-radius: var(--r-row);
  background: var(--surface-2); border: 1px solid var(--hairline);
}
.ss-install-step b { color: var(--white); font-weight: 700; }
.ss-install-step .ss-install-n {
  flex: 0 0 auto; width: 26px; height: 26px; border-radius: 50%;
  display: grid; place-items: center; font-size: 0.8rem; font-weight: 800;
  background: rgba(0,229,255,0.14); border: 1px solid rgba(0,229,255,0.4); color: var(--cyan);
}
.ss-install-step > span:nth-child(2) { flex: 1; }
.ss-install-step .ss-install-glyph { flex: 0 0 auto; color: var(--cyan); display: grid; place-items: center; }
.ss-install-actions { display: flex; flex-direction: column; gap: var(--sp-2); }

.ss-menu-actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); justify-content: center; margin-bottom: var(--sp-5); }
.ss-menu-actions:empty { display: none; margin: 0; }
.ss-menu-action {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 9px 16px; min-height: 40px; cursor: pointer;
  border-radius: var(--r-pill); border: 1px solid var(--hairline);
  background: var(--surface-2); color: var(--cream);
  font-family: var(--font-ui); font-size: 0.78rem; font-weight: 600;
  transition: transform var(--dur-press) var(--ease-spring);
}
.ss-menu-action:active { transform: scale(0.94); }

/* ═══════════════════════════════════════════════════════════════════════════
   19. Bannière de notification (style iOS) — s'affiche à la réception d'un event
   Slide du haut, verre frosté sombre, taille d'une notif iPhone. Swipe/tap gérés
   dans ss-shell.js.
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-nbanner {
  position: fixed; z-index: 1600;
  top: calc(var(--safe-t) + 8px); left: 50%;
  width: calc(100% - 20px); max-width: 420px;
  display: flex; gap: 12px; align-items: flex-start;
  padding: 12px 14px;
  border-radius: 20px;
  background: rgba(28, 28, 34, 0.72);
  -webkit-backdrop-filter: blur(30px) saturate(180%); backdrop-filter: blur(30px) saturate(180%);
  box-shadow: 0 14px 40px rgba(0, 0, 0, 0.5), inset 0 0 0 0.5px rgba(255, 255, 255, 0.12);
  color: #fff; font-family: var(--font-ui);
  transform: translateX(-50%) translateY(-160%);
  opacity: 0; pointer-events: none;
  cursor: pointer; -webkit-tap-highlight-color: transparent; user-select: none; -webkit-user-select: none;
}
/* Entrée/sortie via @keyframes (les transitions transform entre états de classe
   sont peu fiables sur iOS Safari — l'animation joue toujours à l'ajout de classe). */
#ss-nbanner.is-showing {
  transform: translateX(-50%) translateY(0); opacity: 1; pointer-events: auto;
  animation: nbIn 0.5s var(--ease-spring);
}
#ss-nbanner.is-hiding {
  transform: translateX(-50%) translateY(-160%); opacity: 0; pointer-events: none;
  animation: nbOut 0.34s var(--ease-out);
}
@keyframes nbIn  { from { transform: translateX(-50%) translateY(-160%); opacity: 0; } to { transform: translateX(-50%) translateY(0); opacity: 1; } }
@keyframes nbOut { from { transform: translateX(-50%) translateY(0); opacity: 1; } to { transform: translateX(-50%) translateY(-160%); opacity: 0; } }
#ss-nbanner .ns-icon {
  flex: 0 0 auto; width: 38px; height: 38px; border-radius: 10px; overflow: hidden;
  background: #0b0f1e; display: grid; place-items: center;
}
#ss-nbanner .ns-icon img { width: 100%; height: 100%; object-fit: cover; display: block; }
#ss-nbanner .ns-main { flex: 1; min-width: 0; }
#ss-nbanner .ns-head { display: flex; align-items: baseline; gap: 8px; }
#ss-nbanner .ns-app {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: 0.7rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: rgba(255,255,255,0.7);
}
#ss-nbanner .ns-time { flex: 0 0 auto; font-size: 0.66rem; color: rgba(255,255,255,0.5); }
#ss-nbanner .ns-title { font-size: 0.9rem; font-weight: 700; margin-top: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#ss-nbanner .ns-body {
  font-size: 0.84rem; color: rgba(255,255,255,0.82); line-height: 1.35; margin-top: 2px;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}

/* ═══════════════════════════════════════════════════════════════════════════
   20. Pull-to-refresh (spinner iOS) — tirer vers le bas en haut de page = reload
   Geste + logique dans ss-shell.js. overscroll-behavior:none (§1) évite le bounce.
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-ptr {
  position: fixed; z-index: 1400;
  top: calc(var(--safe-t) + 6px); left: 50%;
  transform: translateX(-50%) translateY(0);
  width: 30px; height: 30px; display: grid; place-items: center;
  opacity: 0; pointer-events: none;
}
#ss-ptr .ss-ptr-spin {
  width: 26px; height: 26px; border-radius: 50%;
  border: 2.5px solid rgba(255, 255, 255, 0.22);
  border-top-color: var(--cyan);
}
#ss-ptr.is-ready .ss-ptr-spin { border-top-color: var(--fuchsia); }
#ss-ptr.is-refreshing .ss-ptr-spin { animation: ssSpin 0.7s linear infinite; transform: none !important; }
@keyframes ssSpin { to { transform: rotate(360deg); } }

/* ═══════════════════════════════════════════════════════════════════════════
   21. Écran d'appel iOS (SSShell.callScreen) + glitch (SSShell.glitch)
   « Le téléphone est possédé » — habillage diégétique La Voix.
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-callscreen {
  position: fixed; inset: 0; z-index: 2000;
  display: flex; opacity: 0; pointer-events: none;
  transition: opacity 0.3s var(--ease-out);
  background: linear-gradient(180deg, #0a0b1e, #05060f);
}
#ss-callscreen::before {
  content: ''; position: absolute; inset: 0;
  background:
    radial-gradient(ellipse 90% 50% at 50% 22%, rgba(224,64,251,0.22), transparent 60%),
    radial-gradient(ellipse 80% 40% at 50% 82%, rgba(0,229,255,0.10), transparent 60%);
}
#ss-callscreen.is-open { opacity: 1; pointer-events: auto; }
#ss-callscreen .ss-call-inner {
  position: relative; z-index: 1; flex: 1;
  display: flex; flex-direction: column; align-items: center;
  width: 100%; max-width: var(--app-max); margin: 0 auto;
  padding: calc(var(--safe-t) + 70px) var(--sp-6) calc(var(--safe-b) + 52px);
}
.ss-call-top { text-align: center; }
.ss-call-avatar {
  width: 108px; height: 108px; border-radius: 50%; margin: 0 auto var(--sp-5);
  display: grid; place-items: center;
  background: radial-gradient(circle at 50% 38%, #14203f, #060a1e);
  border: 1.5px solid rgba(0, 229, 255, 0.5);
  box-shadow: 0 0 40px rgba(224, 64, 251, 0.4);
}
.ss-call-avatar svg { width: 58px; height: 38px; }
#ss-callscreen.is-incoming .ss-call-avatar { animation: ssCallPulse 1.4s ease-in-out infinite; }
@keyframes ssCallPulse { 0%,100% { box-shadow: 0 0 30px rgba(224,64,251,0.35); } 50% { box-shadow: 0 0 58px rgba(224,64,251,0.72); } }
.ss-call-name { font-family: var(--font-display); font-weight: 800; font-size: 2rem; color: #fff; letter-spacing: 0.02em; }
.ss-call-sub { font-size: 0.92rem; color: rgba(255,255,255,0.6); margin-top: 8px; }
.ss-call-extra { flex: 1; display: flex; flex-direction: column; justify-content: flex-end; width: 100%; padding-bottom: var(--sp-6); }
.ss-call-extra .ss-btn { margin: 0 auto; }
.ss-call-actions { display: flex; justify-content: center; gap: 60px; }
.ss-call-slot { display: flex; flex-direction: column; align-items: center; gap: 8px; }
.ss-call-slot span { font-size: 0.72rem; color: rgba(255,255,255,0.7); }
.ss-call-btn {
  width: 68px; height: 68px; border-radius: 50%; border: 0; cursor: pointer;
  display: grid; place-items: center; color: #fff;
  transition: transform var(--dur-press) var(--ease-spring);
}
.ss-call-btn svg { width: 30px; height: 30px; }
.ss-call-btn.accept  { background: #34c759; animation: ssCallBtnPulse 1.4s ease-in-out infinite; }
.ss-call-btn.decline { background: #ff3b30; }
.ss-call-btn.decline svg { transform: rotate(134deg); }
.ss-call-btn:active { transform: scale(0.9); }
@keyframes ssCallBtnPulse { 0%,100% { transform: scale(1); } 50% { transform: scale(1.08); } }

#ss-glitch {
  position: fixed; inset: 0; z-index: 2100; pointer-events: none; opacity: 0;
  background:
    repeating-linear-gradient(0deg, rgba(255,255,255,0.05) 0 1px, transparent 1px 3px),
    linear-gradient(90deg, rgba(255,0,80,0.12), rgba(0,229,255,0.12));
  mix-blend-mode: screen;
}
#ss-glitch.is-on { animation: ssGlitch 0.5s steps(2) 1; }
@keyframes ssGlitch {
  0%   { opacity: 0; transform: translate(0, 0); }
  12%  { opacity: 1; transform: translate(-3px, 1px); }
  32%  { opacity: 0.7; transform: translate(3px, -2px); }
  54%  { opacity: 1; transform: translate(-2px, 0); }
  74%  { opacity: 0.5; transform: translate(2px, 1px); }
  100% { opacity: 0; transform: translate(0, 0); }
}
/* bande de balayage cyan (scanline TV) pendant le glitch */
#ss-glitch::after {
  content: ''; position: absolute; left: 0; right: 0; height: 26px; top: -10%;
  background: linear-gradient(180deg, transparent, rgba(0,229,255,0.22), transparent);
}
#ss-glitch.is-on::after { animation: ssGlitchBand 0.5s linear 1; }
@keyframes ssGlitchBand { 0% { top: -10%; } 100% { top: 110%; } }

/* ═══════════════════════════════════════════════════════════════════════════
   22. Face ID théâtral (SSShell.faceId) — scan facial 100% CSS, pur théâtre
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-faceid {
  position: fixed; inset: 0; z-index: 2050;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 18px;
  background: rgba(4, 6, 20, 0.88);
  -webkit-backdrop-filter: blur(18px) saturate(130%); backdrop-filter: blur(18px) saturate(130%);
  opacity: 0; transition: opacity 0.3s var(--ease-out);
}
#ss-faceid.is-open { opacity: 1; }
#ss-faceid.is-done { opacity: 0; }
.ss-fid-frame { position: relative; width: 122px; height: 122px; color: var(--cyan); }
.ss-fid-frame svg { width: 100%; height: 100%; display: block; }
#ss-faceid.is-ok .ss-fid-frame { color: #34c759; }
#ss-faceid.is-ok .ss-fid-frame .ss-fid-face { opacity: 0; }
.ss-fid-frame .ss-fid-face { transition: opacity 0.2s; }
.ss-fid-scan {
  position: absolute; left: 14px; right: 14px; height: 3px; border-radius: 2px; top: 14px;
  background: linear-gradient(90deg, transparent, var(--cyan), transparent);
  box-shadow: 0 0 14px rgba(0,229,255,0.8); opacity: 0;
}
#ss-faceid.is-scanning .ss-fid-scan { opacity: 1; animation: ssFidScan 0.85s ease-in-out infinite alternate; }
@keyframes ssFidScan { from { top: 14px; } to { top: 104px; } }
.ss-fid-check {
  position: absolute; inset: 0; display: grid; place-items: center;
  font-size: 54px; line-height: 1; color: #34c759; font-weight: 700;
  opacity: 0; transform: scale(0.4);
  transition: opacity 0.22s, transform 0.3s var(--ease-spring);
}
#ss-faceid.is-ok .ss-fid-check { opacity: 1; transform: scale(1); }
#ss-faceid.is-ok .ss-fid-scan { display: none; }
.ss-fid-title { font-family: var(--font-display); font-weight: 800; font-size: 1.08rem; letter-spacing: 0.05em; color: var(--white); }
.ss-fid-sub { font-size: 0.82rem; color: var(--text-mid-strong); min-height: 1.2em; }

/* ═══════════════════════════════════════════════════════════════════════════
   23. Écran verrouillé d'ouverture (SSShell.lockScreen) — heure + notifs + slider
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-lock {
  position: fixed; inset: 0; z-index: 2040;
  display: flex; flex-direction: column; align-items: center;
  padding: calc(var(--safe-t) + 52px) 20px calc(var(--safe-b) + 30px);
  background-color: #050743;
  background-image:
    radial-gradient(ellipse 72% 22% at 16% 5%,  rgba(123, 47, 255, 0.15), transparent 60%),
    radial-gradient(ellipse 62% 20% at 86% 20%, rgba(41, 121, 255, 0.12), transparent 62%),
    url("img/stars.svg");
  background-repeat: no-repeat, no-repeat, repeat;
  transition: opacity 0.4s var(--ease-out), transform 0.45s var(--ease-out);
}
#ss-lock.is-unlocked { opacity: 0; transform: translateY(-46px); pointer-events: none; }
.ss-lock-time {
  font-family: var(--font-ui); font-weight: 300;
  font-size: 4.4rem; line-height: 1; color: var(--white); letter-spacing: 0.01em;
}
.ss-lock-time.is-glitch { animation: ssTimeJump 0.45s steps(3) 1; }
@keyframes ssTimeJump {
  15% { transform: translateX(-5px) skewX(-8deg); opacity: 0.55; color: var(--fuchsia); }
  45% { transform: translateX(6px) skewX(4deg); }
  70% { transform: translateX(-3px); opacity: 0.8; color: var(--cyan); }
  100% { transform: none; opacity: 1; }
}
.ss-lock-date { font-size: 0.92rem; color: var(--text-mid-strong); margin-top: 7px; text-transform: capitalize; }
.ss-lock-eye { margin-top: 14px; opacity: 0.85; }
.ss-lock-eye svg { width: 44px; height: 29px; display: block; }
.ss-lock-notifs {
  width: 100%; max-width: 400px;
  margin-top: auto; margin-bottom: 14px;
  display: flex; flex-direction: column; gap: 10px;
}
.ss-lock-notif {
  background: rgba(255,255,255,0.1); border: 1px solid var(--hairline);
  border-radius: 18px; padding: 11px 14px;
  -webkit-backdrop-filter: blur(20px) saturate(150%); backdrop-filter: blur(20px) saturate(150%);
}
.ss-lock-notif .ln-app { font-size: 0.56rem; letter-spacing: 0.14em; color: var(--text-mid); text-transform: uppercase; }
.ss-lock-notif .ln-title { font-size: 0.86rem; font-weight: 700; color: var(--white); margin-top: 2px; }
.ss-lock-notif .ln-body {
  font-size: 0.78rem; color: var(--text-mid-strong); margin-top: 1px;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.ss-lock-slide {
  position: relative; width: 100%; max-width: 340px; height: 56px; flex: 0 0 auto;
  border-radius: 28px; background: rgba(255,255,255,0.08); border: 1px solid var(--hairline);
  display: flex; align-items: center; justify-content: center; overflow: hidden;
  -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px);
}
.ss-lock-slide-lbl {
  font-size: 0.8rem; letter-spacing: 0.06em;
  background: linear-gradient(90deg, rgba(255,255,255,0.35), #fff, rgba(255,255,255,0.35));
  background-size: 200% 100%;
  -webkit-background-clip: text; background-clip: text; color: transparent;
  animation: ssLockShimmer 2.4s linear infinite;
}
@keyframes ssLockShimmer { from { background-position: 180% 0; } to { background-position: -80% 0; } }
.ss-lock-thumb {
  position: absolute; left: 4px; top: 3px; width: 48px; height: 48px; border-radius: 24px;
  background: #fff; color: #0a0e26; display: grid; place-items: center;
  font-size: 1.25rem; font-weight: 700; touch-action: none;
  box-shadow: 0 2px 10px rgba(0,0,0,0.45);
}
.ss-lock-alt {
  margin-top: 12px; min-height: 34px; background: none; border: 0; cursor: pointer;
  color: var(--text-mid); font-size: 0.72rem; text-decoration: underline;
  opacity: 0; pointer-events: none; transition: opacity 0.3s;
}
#ss-lock.show-alt .ss-lock-alt { opacity: 1; pointer-events: auto; }

/* ═══════════════════════════════════════════════════════════════════════════
   24. Stories plein écran (SSStories — onboarding + récap Wrapped)
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-stories {
  position: fixed; inset: 0; z-index: 2060; display: flex; flex-direction: column;
  background: #050743; overflow: hidden;
  opacity: 0; transition: opacity 0.3s var(--ease-out);
}
#ss-stories.is-open { opacity: 1; }
#ss-stories.is-done { opacity: 0; }
.ss-story-bars {
  position: absolute; z-index: 5; left: 12px; right: 12px;
  top: calc(var(--safe-t, 0px) + 10px);
  display: flex; gap: 5px;
}
.ss-story-bar { flex: 1; height: 3px; border-radius: 2px; background: rgba(255,255,255,0.25); overflow: hidden; }
.ss-story-bar i { display: block; height: 100%; width: 0; background: #fff; border-radius: 2px; }
.ss-story-bar.done i { width: 100%; }
.ss-story-bar.active i { animation: ssStoryFill linear forwards; }
@keyframes ssStoryFill { from { width: 0; } to { width: 100%; } }
#ss-stories .ss-story-close {
  position: absolute; z-index: 6; right: 10px; top: calc(var(--safe-t, 0px) + 22px);
  width: 42px; height: 42px; border: 0; border-radius: 50%; cursor: pointer;
  background: rgba(0,0,0,0.3); color: #fff; font-size: 1.2rem; line-height: 1;
}
.ss-story-slide {
  position: absolute; inset: 0; display: none; flex-direction: column;
  align-items: center; justify-content: center; text-align: center;
  padding: calc(var(--safe-t, 0px) + 60px) 30px calc(var(--safe-b, 0px) + 60px);
  gap: 14px;
}
.ss-story-slide.active { display: flex; animation: ssSlideIn 0.35s var(--ease-out); }
@keyframes ssSlideIn { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }
.ss-story-kicker { font-size: 0.62rem; letter-spacing: 0.28em; text-transform: uppercase; color: rgba(0,229,255,0.7); }
.ss-story-big {
  font-family: var(--font-display); font-weight: 900; font-size: 2rem; line-height: 1.12; color: #fff;
}
.ss-story-huge { font-family: var(--font-display); font-weight: 900; font-size: 4.6rem; line-height: 1; color: var(--cyan); text-shadow: 0 0 34px rgba(0,229,255,0.4); }
.ss-story-txt { font-size: 0.92rem; line-height: 1.55; color: rgba(245,237,224,0.8); max-width: 320px; }
.ss-story-eye svg { width: 92px; height: 60px; }
/* Liste d'objectifs dans une slide (briefing de réhabilitation) : alignée à gauche,
   parce qu'une consigne à retenir se lit en colonne, pas centrée comme un slogan. */
.ss-story-list {
  list-style: none; margin: 4px 0 0; padding: 0;
  max-width: 320px; width: 100%; text-align: left;
}
.ss-story-list li {
  position: relative; padding: 9px 0 9px 26px;
  font-size: 0.9rem; line-height: 1.45; color: rgba(245,237,224,0.85);
  border-bottom: 1px solid rgba(255,255,255,0.08);
}
.ss-story-list li:last-child { border-bottom: 0; }
.ss-story-list li::before {
  content: '○'; position: absolute; left: 4px; top: 9px;
  color: var(--cyan); font-size: 0.85rem;
}
.ss-story-list b { color: #fff; font-weight: 700; }
.ss-story-cta {
  margin-top: 10px; min-height: 50px; padding: 13px 34px; cursor: pointer;
  border: 0; border-radius: 999px; background: linear-gradient(135deg, var(--cyan), #2979ff);
  color: #04121f; font-family: var(--font-ui); font-weight: 700; font-size: 0.86rem; letter-spacing: 0.06em;
}
.ss-story-cta--ghost { background: rgba(255,255,255,0.1); color: #fff; border: 1px solid rgba(255,255,255,0.3); }
/* zones tap invisibles (préc / suiv) */
.ss-story-nav { position: absolute; top: 0; bottom: 0; width: 34%; z-index: 4; }
.ss-story-nav.prev { left: 0; } .ss-story-nav.next { right: 0; width: 66%; }

/* ═══════════════════════════════════════════════════════════════════════════
   25. Switch iOS (.ss-switch = <label><input type=checkbox><i></i></label>)
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-switch { position: relative; display: inline-block; flex: 0 0 auto; width: 51px; height: 31px; }
.ss-switch input { position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer; }
.ss-switch i {
  position: absolute; inset: 0; border-radius: 999px; pointer-events: none;
  background: rgba(120,120,128,0.32); transition: background 0.22s;
}
.ss-switch i::after {
  content: ''; position: absolute; top: 2px; left: 2px; width: 27px; height: 27px; border-radius: 50%;
  background: #fff; box-shadow: 0 3px 8px rgba(0,0,0,0.35);
  transition: transform 0.22s var(--ease-spring);
}
.ss-switch input:checked + i { background: #34c759; }
.ss-switch input:checked + i::after { transform: translateX(20px); }
.ss-switch input:disabled + i { opacity: 0.4; }

/* ═══════════════════════════════════════════════════════════════════════════
   26. Liste Réglages inset-grouped (iOS Settings)
   ═══════════════════════════════════════════════════════════════════════════ */
.ss-set-group { margin: 18px 0 0; }
.ss-set-label {
  font-size: 0.6rem; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--text-mid); padding: 0 16px 7px;
}
.ss-set-list {
  border-radius: 14px; overflow: hidden;
  background: rgba(255,255,255,0.07); border: 1px solid rgba(255,255,255,0.08);
  -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px);
}
.ss-set-row {
  display: flex; align-items: center; gap: 12px;
  min-height: 48px; padding: 8px 16px;
  color: var(--cream); font-size: 0.88rem;
}
.ss-set-row + .ss-set-row { border-top: 1px solid rgba(255,255,255,0.07); }
.ss-set-ico { flex: 0 0 30px; height: 30px; border-radius: 7px; display: grid; place-items: center; font-size: 0.95rem; }
.ss-set-main { flex: 1; min-width: 0; }
.ss-set-title { font-size: 0.88rem; color: #fff; }
.ss-set-sub { font-size: 0.66rem; color: var(--text-mid); margin-top: 1px; }
.ss-set-val { flex: 0 0 auto; font-size: 0.8rem; color: var(--text-mid); }
.ss-set-chev { flex: 0 0 auto; color: var(--text-dim); font-size: 1rem; }
a.ss-set-row { text-decoration: none; }
button.ss-set-row { width: 100%; border: 0; background: none; cursor: pointer; text-align: left; font-family: var(--font-ui); }
.ss-set-row.danger .ss-set-title { color: #ff5a6e; }
.ss-set-note { font-size: 0.64rem; color: var(--text-dim); padding: 7px 16px 0; line-height: 1.5; }

/* ═══════════════════════════════════════════════════════════════════════════
   27. Menu contextuel appui long (cartes accueil)
   ═══════════════════════════════════════════════════════════════════════════ */
#ss-ctx {
  position: fixed; inset: 0; z-index: 1700;
  background: rgba(4,6,20,0.45);
  -webkit-backdrop-filter: blur(16px) saturate(130%); backdrop-filter: blur(16px) saturate(130%);
  opacity: 0; transition: opacity 0.22s var(--ease-out);
}
#ss-ctx.is-open { opacity: 1; }
.ss-ctx-menu {
  position: absolute; min-width: 210px;
  border-radius: 14px; overflow: hidden;
  background: rgba(28,32,54,0.92); border: 1px solid rgba(255,255,255,0.12);
  -webkit-backdrop-filter: blur(24px); backdrop-filter: blur(24px);
  box-shadow: 0 18px 50px rgba(0,0,0,0.55);
  transform: scale(0.86); transform-origin: top center; opacity: 0;
  transition: transform 0.22s var(--ease-spring), opacity 0.18s;
}
#ss-ctx.is-open .ss-ctx-menu { transform: scale(1); opacity: 1; }
.ss-ctx-item {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  width: 100%; min-height: 46px; padding: 10px 16px; border: 0; cursor: pointer;
  background: none; color: #fff; font-family: var(--font-ui); font-size: 0.88rem; text-align: left;
}
.ss-ctx-item + .ss-ctx-item { border-top: 1px solid rgba(255,255,255,0.08); }
.ss-ctx-item:active { background: rgba(255,255,255,0.08); }
.ss-ctx-item.danger { color: #ff5a6e; }
.ss-ctx-ico { font-size: 1rem; }

/* ═══════════════════════════════════════════════════════════════════════════
   28. Centre de contrôle (glisser depuis le haut) — #ss-cc + scrim
   ═══════════════════════════════════════════════════════════════════════════ */
/* Poignée visible (haut-gauche) : tap ouvre, glisser vers le bas fait descendre le centre */
#ss-cc-handle {
  position: fixed; z-index: 1500;
  top: calc(var(--safe-t, 0px) + 6px); left: 10px;
  display: flex; align-items: center; gap: 6px;
  padding: 5px 11px 5px 9px; border-radius: 999px;
  background: rgba(255,255,255,0.09); border: 1px solid rgba(255,255,255,0.14);
  -webkit-backdrop-filter: blur(16px) saturate(150%); backdrop-filter: blur(16px) saturate(150%);
  color: var(--text-mid-strong); cursor: grab; touch-action: none;
  -webkit-user-select: none; user-select: none;
  box-shadow: 0 4px 16px rgba(0,0,0,0.32);
  transition: transform var(--dur-press) var(--ease-spring), background 0.2s;
}
#ss-cc-handle:active { cursor: grabbing; transform: scale(0.94); background: rgba(255,255,255,0.16); }
#ss-cc-handle[hidden] { display: none; }
#ss-cc-handle .cch-grip { display: flex; flex-direction: column; gap: 3px; }
#ss-cc-handle .cch-grip i { display: block; width: 15px; height: 2px; border-radius: 2px; background: currentColor; opacity: 0.85; }
#ss-cc-handle .cch-ico { font-size: 0.72rem; line-height: 1; }

#ss-cc-scrim {
  position: fixed; inset: 0; z-index: 1790;
  background: rgba(3,5,16,0.45);
  opacity: 0; pointer-events: none; transition: opacity 0.25s var(--ease-out);
}
#ss-cc-scrim.is-open { opacity: 1; pointer-events: auto; }
#ss-cc {
  position: fixed; z-index: 1800; left: 50%; top: 0;
  width: 100%; max-width: var(--app-max);
  height: 100dvh;                              /* plein écran, façon centre de notifications iOS */
  transform: translate(-50%, -103%);
  display: flex; flex-direction: column;
  padding: calc(var(--safe-t, 0px) + 20px) 18px calc(var(--safe-b, 0px) + 10px);
  background: linear-gradient(to bottom, rgba(10,13,36,0.9), rgba(7,10,32,0.86));
  -webkit-backdrop-filter: blur(28px) saturate(160%); backdrop-filter: blur(28px) saturate(160%);
  box-shadow: 0 22px 60px rgba(0,0,0,0.55);
  will-change: transform;
  /* pas de transition CSS : le mouvement est piloté par element.animate() (WAAPI) —
     les transitions entre classes sont peu fiables sur iOS (piège déjà vécu §19) */
}
#ss-cc.is-open { transform: translate(-50%, 0); }
.ss-cc-clock { text-align: center; margin-bottom: 16px; flex: 0 0 auto; }
.ss-cc-time { font-family: var(--font-ui); font-weight: 300; font-size: 3rem; line-height: 1; color: #fff; }
.ss-cc-date { font-size: 0.74rem; color: var(--text-mid); margin-top: 4px; text-transform: capitalize; }
/* widgets du centre (Komtés / La Voix) */
.ss-cc-widgets { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px; flex: 0 0 auto; }
.ss-cc-widget {
  min-height: 86px; border-radius: 16px; padding: 11px 13px;
  background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.09);
  display: flex; flex-direction: column; gap: 4px; overflow: hidden;
}
.ss-cc-widget .ccw-kicker { font-size: 0.54rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--text-mid); }
.ss-cc-widget .ccw-main { font-family: var(--font-display); font-weight: 800; font-size: 1.5rem; line-height: 1.05; color: #fff; }
.ss-cc-widget .ccw-sub {
  font-size: 0.68rem; color: var(--text-mid-strong); line-height: 1.35;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.ss-cc-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 9px; }
.ss-cc-tile {
  min-height: 72px; border-radius: 16px; border: 1px solid rgba(255,255,255,0.09);
  background: rgba(255,255,255,0.08); cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px;
  color: var(--cream); font-family: var(--font-ui); text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition: transform var(--dur-press) var(--ease-spring), background 0.2s, border-color 0.2s;
}
.ss-cc-tile:active { transform: scale(0.93); }
.ss-cc-tile .cc-ico { font-size: 1.3rem; line-height: 1; }
.ss-cc-tile .cc-lbl { font-size: 0.58rem; letter-spacing: 0.04em; color: var(--text-mid-strong); }
.ss-cc-tile.is-on { background: rgba(0,229,255,0.16); border-color: rgba(0,229,255,0.45); }   /* fallback */
.ss-cc-tile.is-on { background: color-mix(in srgb, var(--cyan) 16%, transparent); border-color: color-mix(in srgb, var(--cyan) 45%, transparent); }
.ss-cc-tile.is-on .cc-lbl { color: var(--cyan); }
.ss-cc-grid { flex: 0 0 auto; }
.ss-cc-notifs {
  margin-top: 12px; display: flex; flex-direction: column; gap: 7px;
  flex: 1 1 auto; min-height: 0; overflow-y: auto;    /* le reste de l'écran, scrollable */
  -webkit-overflow-scrolling: touch;
}
.ss-cc-notif {
  border-radius: 12px; padding: 8px 12px;
  background: rgba(255,255,255,0.07); border: 1px solid rgba(255,255,255,0.07);
}
.ss-cc-notif .ccn-title { font-size: 0.76rem; font-weight: 700; color: #fff; }
.ss-cc-notif .ccn-body {
  font-size: 0.7rem; color: var(--text-mid-strong); margin-top: 1px;
  display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;
}
.ss-cc-grab {
  flex: 0 0 auto; width: 44px; height: 5px; border-radius: 3px; margin: 12px auto 0;
  background: rgba(255,255,255,0.35); cursor: pointer;
}
/* pastille « observation » (théâtre) */
.ss-cc-watch {
  flex: 0 0 auto; align-self: center; margin-bottom: 8px;
  display: inline-flex; align-items: center; gap: 7px;
  padding: 5px 12px; border-radius: 999px;
  background: rgba(255,255,255,0.07); border: 1px solid rgba(255,255,255,0.1);
  font-size: 0.62rem; letter-spacing: 0.03em; color: var(--text-mid-strong);
}
.ss-cc-watch[hidden] { display: none; }
.cc-watch-dot { width: 7px; height: 7px; border-radius: 50%; background: #34c759; box-shadow: 0 0 8px rgba(52,199,89,0.7); animation: ccWatchBlink 2s infinite; }
@keyframes ccWatchBlink { 0%,100% { opacity: 1; } 50% { opacity: 0.3; } }
/* widgets cliquables + états */
a.ss-cc-widget--link { text-decoration: none; }
.ss-cc-widget[hidden] { display: none; }
#ss-ccw-draw-main.is-ready { color: #6fdc93; }
.ss-cc-widget--bourse { background: rgba(255,30,192,0.12); border-color: rgba(255,30,192,0.32); }   /* fallback */
.ss-cc-widget--bourse { background: color-mix(in srgb, var(--fuchsia) 12%, transparent); border-color: color-mix(in srgb, var(--fuchsia) 32%, transparent); }
/* en-tête notifs + tout lire */
.ss-cc-notifs-head {
  flex: 0 0 auto; display: flex; align-items: center; justify-content: space-between;
  margin: 12px 2px 6px; font-size: 0.58rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-mid);
}
#ss-cc-readall { background: none; border: 0; cursor: pointer; color: var(--cyan); font-family: var(--font-ui); font-size: 0.66rem; font-weight: 700; letter-spacing: 0.04em; }
.ss-cc-notif-empty { font-size: 0.74rem; color: var(--text-dim); padding: 6px 2px; }
/* notif actionnable (tap ouvre la page, ✓/✕ inline) */
.ss-cc-notif { display: flex; align-items: center; gap: 10px; cursor: pointer; }
.ss-cc-notif .ccn-body-wrap { flex: 1; min-width: 0; }
.ss-cc-notif .ccn-acts { flex: 0 0 auto; display: flex; gap: 6px; }
.ccn-act {
  width: 32px; height: 32px; border-radius: 50%; cursor: pointer;
  border: 1px solid rgba(255,255,255,0.16); background: rgba(255,255,255,0.06);
  color: var(--cream); font-size: 0.9rem; line-height: 1; display: grid; place-items: center;
}
.ccn-act:active { transform: scale(0.88); }
.ccn-act.ccn-del { color: #ff8095; border-color: rgba(255,61,113,0.3); }

/* ══════════════════════════════════════════════════════════════════════════
   « La Brume » — overlay événement Halloween (injecté par ss-brume.js).
   pointer-events:none partout (jamais bloquant). z-index 950 : au-dessus du
   contenu (flex-top=900, scroll), sous la tab bar (1000), les modales (1100+)
   et les scènes/toasts (2000+) → la brume voile la page sans masquer le drame.
   ══════════════════════════════════════════════════════════════════════════ */
#ss-brume-fx { position: fixed; inset: 0; z-index: 950; pointer-events: none; }
#ss-brume-fx .brume-haze {
  position: absolute; inset: 0; opacity: 0;
  background:
    radial-gradient(120% 80% at 50% 0%, rgba(180,190,205,0.35), transparent 60%),
    radial-gradient(140% 100% at 50% 100%, rgba(150,160,180,0.45), transparent 55%),
    rgba(200,205,215,0.30);
  transition: opacity 1.1s ease;
  mix-blend-mode: screen;
}
#ss-brume-fx .brume-rise {
  position: absolute; left: 0; right: 0; bottom: 0; height: 0;
  background: linear-gradient(0deg,
    rgba(210,214,224,0.72) 0%,
    rgba(198,204,216,0.55) 40%,
    rgba(190,198,212,0.28) 75%,
    transparent 100%);
  filter: blur(2px);
  transition: height 1.1s ease;
}
/* Jauge indicatrice (coin haut, sous la safe-area). */
#ss-brume-fx .brume-meter {
  position: absolute; top: calc(var(--safe-t, 0px) + 8px); left: 50%; transform: translateX(-50%);
  width: min(220px, 60vw); height: 16px; border-radius: 999px;
  background: rgba(10,5,16,0.55); border: 1px solid rgba(255,117,24,0.5);
  overflow: hidden; display: flex; align-items: center;
  box-shadow: 0 2px 10px rgba(0,0,0,0.4);
}
#ss-brume-fx .brume-meter-fill {
  position: absolute; left: 0; top: 0; bottom: 0; width: 0%;
  background: linear-gradient(90deg, #6a1b9a, #ff7518);
  transition: width 1.1s ease;
}
#ss-brume-fx .brume-meter-txt {
  position: relative; width: 100%; text-align: center;
  font-family: 'Josefin Sans', sans-serif; font-size: 0.6rem; letter-spacing: 0.12em;
  color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,0.7);
}
#ss-brume-fx.brume-critical .brume-meter { animation: brume-pulse 1.1s ease-in-out infinite; }
@keyframes brume-pulse { 0%,100% { box-shadow: 0 0 4px rgba(255,46,46,0.4); } 50% { box-shadow: 0 0 16px rgba(255,46,46,0.9); } }


/* ── Pause globale des animations quand l’app passe en arrière-plan ─────────
   `html.ss-fx-paused` est posée par ss-theme.js sur visibilitychange. Les
   feuilles de skin s’en servaient déjà ; cette règle l’étend à TOUT, y compris
   les ~75 animations infinies des feuilles de base. Sur iPhone, une animation
   qui tourne pour un écran qu’on ne regarde pas, c’est de la batterie et du GPU
   pour rien.
   `!important` assumé : c’est un interrupteur global, il doit battre les
   raccourcis `animation:` plus spécifiques (un `#id .cls { animation: … }`
   l’emporterait sinon).
   `paused` reprend exactement où l’animation s’était arrêtée — aucun saut
   visuel au retour au premier plan. */
html.ss-fx-paused *,
html.ss-fx-paused *::before,
html.ss-fx-paused *::after { animation-play-state: paused !important; }
