html, body { min-height: 100%; margin: 0; background: #f4f8f5; }
#app[data-app-booting] { visibility: hidden; }
/* Prerendered marketing HTML may remain unmounted briefly. Hide its first-visit banner before
   paint when this browser has already made a consent choice. */
html.consent-decided .consent-banner { display: none !important; }
/* The application-route boot loader (see /boot-shell.js). Hidden unless the script opts the
   route in, so a public page can never flash it. The dark variant matches the ticket-handoff
   interstitial that mounts next, so the two paints read as one continuous state. */
.boot-shell { display: none; }
html.app-booting .boot-shell { position: fixed; inset: 0; z-index: 2147483000; display: grid; place-items: center; padding: 24px; background: #f4f8f5; }
html.app-booting.app-booting-dark .boot-shell { background: linear-gradient(145deg, #153d31, #09241c); }
html.app-booting .boot-shell-card { display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center; color: #163e32; font: 800 16px/1.4 Manrope, system-ui, sans-serif; }
html.app-booting.app-booting-dark .boot-shell-card { width: min(100%, 420px); padding: 40px; border-radius: 18px; background: #fff; box-shadow: 0 24px 56px rgba(0, 0, 0, .24); font-size: 18px; }
html.app-booting .boot-shell-spinner { width: 36px; height: 36px; border: 3px solid #dfe9e4; border-top-color: #2d7a58; border-radius: 50%; animation: boot-shell-spin .8s linear infinite; }
@keyframes boot-shell-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { html.app-booting .boot-shell-spinner { animation: none; } }
