/* ===== Palette ===================================================== Un seul thème (« Clean ») : noir et blanc, sobre. Deux variantes — claire par défaut, sombre via data-theme="dark" sur . Toutes les couleurs de l'UI passent par ces variables ; rien d'autre ne code une couleur en dur. */ :root{color-scheme:light;--font:-apple-system,BlinkMacSystemFont,'Segoe UI',Inter,Helvetica,Arial,sans-serif;--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--bubble:#f0f0f0;--bg:#ffffff;--panel:#fafafa;--border:#e0e0e2;--text:#0a0a0a;--dim:#6b6b70;--accent:#0a0a0a;--accent-bg:rgba(0,0,0,.05);--ok:#0a0a0a;--warn:#6b6b6b;--err:#c0392b;--mag:#6b6b6b;--code-bg:#f5f5f5;--danger-bg:#fbeae8;--warn-bg:#f2f2f2;--add:#1a7f37;--add-bg:rgba(26,127,55,.10);--del:#cf222e;--del-bg:rgba(207,34,46,.10)} [data-theme="dark"]{color-scheme:dark;--bubble:#232326;--bg:#0b0b0c;--panel:#161618;--border:#33333a;--text:#f2f2f4;--dim:#a0a0a8;--accent:#f5f5f5;--accent-bg:rgba(255,255,255,.07);--ok:#f5f5f5;--warn:#8e8e8e;--err:#f2777a;--mag:#8e8e8e;--code-bg:#000000;--danger-bg:#2e1a19;--warn-bg:#1c1c1c;--add:#4ac26b;--add-bg:rgba(74,194,107,.13);--del:#f85149;--del-bg:rgba(248,81,73,.13)} *{box-sizing:border-box} /* ⚠️ overflow:hidden sur html/body est INTERDIT EN PWA (tenté puis retiré le 2026-07-28) : en PWA iOS, si le document ne peut plus défiler, WebKit décale TOUTE la mise en page à l'ouverture du clavier pour montrer le champ actif — la carte de saisie se retrouve plaquée en haut de l'écran. Le rebond élastique du document est le prix à payer ; il est cosmétique, le clavier ne l'est pas. Laisser le document défiler se paie cher, et EN PWA AUSSI : la coque y fait 956 pt (obligatoire pour que la carte atteigne le bas de l'écran) alors que la fenêtre de mise en page n'en fait que 894 → il reste 62 pt de document défilable en permanence, même avec un fil VIDE, et la carte de saisie — posée en bottom:0 dans le body — part avec au lieu de rester collée en bas. On coupe donc le défilement du document PARTOUT (2026-07-29). Le fil, lui, défile toujours dans #chat, qui borne son rebond (overscroll:contain). ⚠️ SI LE CLAVIER iOS SE REMET À TOUT DÉCALER EN PWA, c'est ce overflow:hidden qu'il faut rouvrir en premier — c'était le compromis d'origine. */ /* Hauteur de la coque : elle DIFFÈRE entre PWA et navigateur, il faut les deux. - PWA (écran d'accueil) : 100vh, et SURTOUT ni 100dvh ni 100%. Mesuré sur iPhone (2026-07-28) : la vue web couvre tout l'écran (956 pt — le contenu passe bien sous l'horloge), mais la fenêtre de mise en page ne fait que 894 pt et reste calée en haut. Or 100dvh ET 100% valent tous deux 894 → il restait une bande morte de 62 pt (= la zone sûre du haut) en bas de l'écran, sous la carte de saisie. 100vh se réfère au GRAND viewport (956) : la seule unité juste dans ce cas. - Navigateur (barre d'URL + barre d'outils visibles) : 100vh vaut justement ce GRAND viewport, donc la coque dépasse la zone réellement visible → le document défile alors que le fil est vide, et le bas de la carte de saisie (modèle / contexte) est coupé. Ici c'est 100dvh qu'il faut : la hauteur visible du moment. D'où : 100dvh par défaut, et 100vh UNIQUEMENT en PWA. ⚠️ Le tri se fait sur l'attribut html[data-pwa] (pose par le script du ), PAS sur le media `display-mode:standalone` : WebKit adosse ce media au `display` du MANIFESTE, or cette app n'en a pas (elle vit en apple-mobile-web-app-capable). En PWA iOS il repond donc `browser`, la branche navigateur s'appliquait, et la bande morte de 62 pt sous la carte de saisie etait de retour (constate le 2026-07-29). ⚠️ Ne pas y ajouter overflow:hidden : voir plus haut, ça casse le clavier iOS. */ body{margin:0;font-family:var(--font);background:var(--bg);color:var(--text);height:100vh;height:100dvh;overscroll-behavior:none;display:flex;font-size:14px} html[data-pwa="1"] body{height:100vh} /* Seul #chat défile ; le document, lui, est figé (cf. l'avertissement ci-dessus). Exception PWA : on lui rend son défilement, sinon le clavier iOS casse tout. */ html,body{overflow:hidden} /* PWA plein écran (viewport-fit=cover) : on décale le contenu des bords pour ne pas passer sous l'encoche / la barre système / l'indicateur d'accueil. Les env(safe-area-inset-*) valent 0 hors PWA, donc aucun impact ailleurs. ⚠️ PAS de padding-bas ici : le composer est posé en bottom:0 DANS le body, donc une marge basse le décollerait du bord de l'écran et laisserait une bande de fond visible sous la carte (visible seulement en PWA, où l'inset vaut ~34 px). L'indicateur d'accueil est esquivé bloc par bloc, en padding INTERNE. */ body{padding:env(safe-area-inset-top) env(safe-area-inset-right) 0 env(safe-area-inset-left)} /* Listes déroulantes : la LISTE ouverte n'hérite pas du fond de son