        @font-face { font-family: 'Executive'; src: url('../assets/fonts/Executive-Regular.otf') format('opentype'); font-weight: 400; }
        @font-face { font-family: 'Executive'; src: url('../assets/fonts/Executive-Bold.otf') format('opentype'); font-weight: 700; }
        /* Shared light-mode background — same liquid gradient the app uses in
           light mode, so login + app read as one continuous backdrop. The
           LiquidBackground shader (js/three-bg.js, via auth-bg.js) reads these
           --liquid-* vars; data-theme="light" on <html> selects the light feel. */
        :root {
            --bg-main: #eef6fa;
            /* PALE SILVER HOLOGRAM — pastel iridescent tints (rose · gold · cyan ·
               periwinkle · lavender · mint) over a near-white silver base, so the
               foil logo reads as bright pale chrome catching holographic light. */
            --liquid-color-1: #FFC9E4; /* pale rose */
            --liquid-color-2: #FFF4C9; /* pale gold */
            --liquid-color-3: #C9F0FF; /* pale cyan */
            --liquid-color-4: #CFE0FF; /* pale periwinkle */
            --liquid-color-5: #E6D6FF; /* pale lavender */
            --liquid-color-6: #D2FBE8; /* pale mint */
            --liquid-base: #eef6fa;    /* pale sky */
        }
        * { box-sizing: border-box; }
        html, body { height: 100%; }
        body {
            margin: 0; min-height: 100vh;
            display: flex; justify-content: center; align-items: flex-start;
            background: var(--bg-main); color: #FFFFFF;
            font-family: 'Host Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            padding: 24px;
            overflow: hidden;
        }
        #auth-bg { position: fixed; inset: 0; z-index: 0; }
        #auth-bg canvas { display: block; }
        .hidden { display: none !important; }

        /* Retro TV / film grain over the WHOLE 3D scene (gradient + silver logo
           alike), sitting above the canvas but below the login UI so the pill
           stays crisp. The stepped position jumps = boiling TV-static grain. */
        .scene-grain {
            position: fixed; inset: 0; z-index: 0; pointer-events: none;
            opacity: 0.5; mix-blend-mode: overlay; will-change: background-position;
            background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.72' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
            background-size: 240px 240px;
            animation: grainShift 0.6s steps(6) infinite;
        }
        @keyframes grainShift {
            0%   { background-position: 0 0; }
            17%  { background-position: -62px 38px; }
            33%  { background-position: 44px -56px; }
            50%  { background-position: -34px -44px; }
            67%  { background-position: 58px 46px; }
            83%  { background-position: -50px 14px; }
            100% { background-position: 0 0; }
        }
        @media (prefers-reduced-motion: reduce) { .scene-grain { animation: none; } }

        /* ---------- public top bar (login / about / pricing / signup) ----------
           LOEWE structure, mirroring the app header: small brand mark + plain
           text links LEFT (underline = current page), the single dark CTA
           RIGHT. Flat — no pills, transparent over the scene. */
        .auth-topbar {
            /* width + gutters MATCH the logged-in app header (the standard):
               .floating-topbar is max 1280 (1200 content + 2×40 gutter), 40px inline pad. */
            position: fixed; top: 0; left: 0; right: 0; z-index: 10;
            max-width: calc(1200px + var(--space-10) * 2); margin-inline: auto;
            display: flex; justify-content: space-between; align-items: center;
            gap: 16px; padding: 20px var(--space-10) 14px;
            animation: authTopbarIn 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;
        }
        /* full-bleed frosted strip behind the fixed bar (mirrors the app's
           .bar-flat::before) so scrolling content reads legibly beneath it. */
        .auth-topbar::before {
            content: ''; position: absolute; inset: 0; left: 50%; transform: translateX(-50%);
            width: 100vw; z-index: -1;
            background: rgba(238, 246, 250, 0.72);
            -webkit-backdrop-filter: blur(18px) saturate(140%); backdrop-filter: blur(18px) saturate(140%);
        }
        html.demo-dark .auth-topbar::before {
            background: rgba(10, 11, 15, 0.72);
        }
        @keyframes authTopbarIn {
            from { opacity: 0; transform: translateY(-10px); }
            to   { opacity: 1; transform: translateY(0); }
        }
        @media (prefers-reduced-motion: reduce) { .auth-topbar { animation: none; } }

        /* LEFT — text links, one row. Typography = the SIGNED-IN app header verbatim
           (.bar-flat .top-nav-link): 14px · weight 460 · opacity .58 · 24px gap ·
           underline offset 7px / 1.5px · active = underline + weight 600. */
        .auth-nav { display: flex; align-items: center; gap: 24px; min-width: 0; }

        .auth-nav-link {
            font-size: 14px; font-weight: 460; color: #18181B; text-decoration: none;
            padding: 6px 0; white-space: nowrap; letter-spacing: 0.01em;
            opacity: 0.58; transition: opacity 0.18s ease;
            text-underline-offset: 7px; text-decoration-thickness: 1.5px;
        }
        /* Hover = opacity only (NO underline). The underline indicator is driven
           SOLELY by .active (the current page, JS-managed), so a :hover underline can
           never get "stuck" after the SPA view-swap changes layout without the mouse
           moving (Chromium keeps :hover until the next move). active = underline + 600. */
        .auth-nav-link:hover { opacity: 1; }
        .auth-nav-link.active { opacity: 1; text-decoration: underline; font-weight: 600; }
        /* BUGFIX: after a mouse click, an <a>/<button> keeps :focus and the browser
           draws its default focus ring — which lingered on the clicked nav item and
           read as a stuck "active" state. Show the ring for KEYBOARD focus only
           (:focus-visible); suppress it for pointer clicks. Applies to the whole bar. */
        .auth-topbar a:focus,
        .auth-topbar button:focus { outline: none; }
        .auth-topbar a:focus-visible,
        .auth-topbar button:focus-visible { outline: 2px solid currentColor; outline-offset: 3px; border-radius: 4px; }

        /* RIGHT — the one dark CTA */
        .auth-actions { display: flex; align-items: center; flex-shrink: 0; }
        .auth-signin {
            display: inline-flex; align-items: center; justify-content: center;
            padding: 9px 18px; border-radius: 999px;
            color: #ffffff; background: #18181B; text-decoration: none;
            font-size: 13.5px; font-weight: 600; letter-spacing: 0.02em; white-space: nowrap;
            box-shadow: 0 2px 8px rgba(17, 19, 28, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.22);
            transition: transform 0.18s ease, box-shadow 0.18s ease;
        }
        .auth-signin:hover { transform: translateY(-1px); box-shadow: 0 4px 14px rgba(17, 19, 28, 0.34), inset 0 1px 0 rgba(255, 255, 255, 0.22); }
        .auth-signin:active { transform: translateY(0) scale(0.98); }

        @media (max-width: 720px) {
            .auth-topbar { gap: 10px; padding: 14px 14px 10px; }
            .auth-nav { gap: 16px; }
            .auth-nav-link { display: none; }   /* keep brand mark + create-account on phones */
        }
        @media (max-width: 520px) {
            .auth-topbar { gap: 7px; padding-inline: 10px; }
            .auth-signin { font-size: 12px; padding-inline: 13px; letter-spacing: 0; }
        }

        /* ============================================================
           PUBLIC SITE PAGES (about / pricing) — CINEMATIC.
           Reuses the DASHBOARD's typographic system & values (Host Grotesk
           weight scale 350/460/600/760, --text-* scale, tracking, spacing,
           radii, light-theme ink colours) and its flat document boards
           (--bg-card + --shadow-2). Content floats in those boards over the
           live 3D foil-logo scene; the header nav uses the dashboard's
           sliding .pill-glider and switches About/Pricing as instant views.
           ============================================================ */
        /* dashboard tokens — ported 1:1 from app.css :root + light theme, so the
           marketing pages (and the shared modals) read in the exact same values.
           Declared on :root so the modals work on login/setup too. */
        :root {
            --font-sans: "Host Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
                "PingFang HK", "PingFang TC", "Hiragino Sans", "Microsoft JhengHei", "Noto Sans CJK TC", sans-serif;
            /* KEEP IN STEP WITH app/base.css — this block is a 1:1 port, and it is
               declared AFTER the app stylesheets, so anything stale here silently
               shadows the real tokens on every signed-out page. It held the whole
               pre-adaptation ladder (13/15/32/44, 760 weight, 0em tracking, 8/12/16
               radii) while base.css had already moved, which would have stopped the
               new system at the login door. */
            --text-xs: 12px; --text-sm: 13px; --text-base: 14px; --text-md: 18px; --text-lg: 24px; --text-xl: 30px; --text-2xl: 48px;
            --fw-light: 400; --fw-regular: 400; --fw-medium: 500; --fw-semibold: 600; --fw-bold: 600;
            --leading-display: 1.1; --leading-tight: 1.2; --leading-normal: 1.4; --leading-relaxed: 1.6;
            --tracking-display: -0.025em; --tracking-tight: -0.015em; --tracking-normal: 0em; --tracking-wide: 0.08em; --tracking-caps: 0.1em;
            --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-8: 32px; --space-10: 40px;
            --radius-control: 18px; --radius-container: 24px;
            --radius-sm: var(--radius-control); --radius-md: var(--radius-control);
            --radius-lg: var(--radius-container); --radius-board: var(--radius-container);
            --radius-doc: 4px; --radius-pill: 999px;
            --ink: #18181B; --muted: #71717A; --card: #FFFFFF; --paper: #F4F4F5;
            --divider: #E4E4E7; --divider-strong: #D4D4D8; --border-ink: #1F1F23;
            --success-green: #01eb72; --danger-red: #ff0f0f;
            --shadow-tint: 17, 19, 28;
            --shadow-2: 0 1px 2px rgba(var(--shadow-tint), 0.05), 0 3px 8px rgba(var(--shadow-tint), 0.05);
            --shadow-3: 0 1px 3px rgba(var(--shadow-tint), 0.06), 0 10px 28px rgba(var(--shadow-tint), 0.10);
        }
        body.site {
            display: block; padding: 0; height: auto; min-height: 100vh;
            overflow-x: hidden; overflow-y: auto;
            background-color: var(--bg-main); color: var(--ink);
            font-family: var(--font-sans);
            /* theme flip is INSTANT — transitioning a var()-based colour doesn't
               reliably fire in Chromium (the declared value string is unchanged,
               only the variable resolves differently), which can leave the page
               stuck on the light background. Instant matches the live app's toggle. */
        }
        body.modal-open { overflow: hidden; }

        .site-wrap { position: relative; z-index: 1; max-width: calc(1200px + var(--space-10) * 2); margin: 0 auto; padding: 96px var(--space-10) 120px; } /* box = 1200 content + 2×40 gutter → text edge at the app's 120px, same as the bar */

        /* hero — title floats over the foil; a soft radial scrim keeps ink legible */
        .site-hero { position: relative; padding: 8px 0 var(--space-10); }
        .site-hero::before {
            content: ''; position: absolute; z-index: -1; left: -8%; right: -8%; top: -56px; bottom: 0;
            background: radial-gradient(125% 92% at 28% 38%, rgba(244, 246, 250, 0.92), rgba(244, 246, 250, 0) 72%);
            pointer-events: none;
        }
        .site-eyebrow { font-size: var(--text-sm); font-weight: var(--fw-medium); text-transform: uppercase; letter-spacing: var(--tracking-wide); color: var(--muted); margin: 0 0 var(--space-5); }
        /* hero type is LEFT-ALIGNED (the app standard) — overrides the card-mode global h1 centering */
        .site-h1 { font-family: var(--font-sans); font-weight: var(--fw-bold); font-size: clamp(34px, 5vw, var(--text-2xl)); line-height: var(--leading-display); letter-spacing: var(--tracking-display); color: var(--ink); margin: 0 0 var(--space-5); text-align: left; }
        .site-lead { font-size: var(--text-md); line-height: var(--leading-relaxed); font-weight: var(--fw-regular); color: var(--muted); max-width: 620px; margin: 0; text-align: left; }
        /* hero CTA row sits centred under the centred lead (Home view) */
        .site-hero .site-cta-row { justify-content: flex-start; margin-top: var(--space-6); }

        /* vertical stack of content blocks within a view */
        .site-stack > * + * { margin-top: var(--space-6); }

        /* DASHBOARD BOARD — flat opaque document module (matches app.css .glass-panel:
           --bg-card surface, no border, realistic layered drop shadow). */
        /* selective liquid glass — frosted so the foil scene tints through, still legible */
        .site-board { background: rgba(255, 255, 255, 0.82); -webkit-backdrop-filter: blur(22px) saturate(140%); backdrop-filter: blur(22px) saturate(140%); border: 1px solid rgba(255, 255, 255, 0.55); border-radius: var(--radius-board); box-shadow: var(--shadow-2); padding: var(--space-8); }
        .board-head { margin-bottom: var(--space-6); }
        .board-title { font-size: 12.5px; font-weight: var(--fw-semibold); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--ink); margin: 0; }
        .board-sub { font-size: var(--text-sm); color: var(--muted); margin: var(--space-2) 0 0; }

        /* Header nav is flat (underline-only) — the liquid-glass .pill-glider that
           used to sit behind the active link is retired here (matches the app). */
        .pill-glider { display: none !important; }

        /* ---- instant view switch (About <-> Pricing) ---- */
        .site-view { display: none; }
        .site-view.is-active { display: block; animation: siteViewIn 0.34s cubic-bezier(0.16, 1, 0.3, 1) both; }
        @keyframes siteViewIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
        @media (prefers-reduced-motion: reduce) { .site-view.is-active { animation: none; } }

        /* Home view — the sign-in pill, centred over the foil within the SPA
           (replaces the old 'bare' zen-wrap; the scene is now shared, never reloads) */
        /* sign-in lives in the BOTTOM space (the hero logo owns the centre). Cancel
           .site-wrap's document bottom padding so the field pins near the viewport
           floor without adding scroll. */
        .zen-home { display: flex; flex-direction: column; align-items: center; justify-content: flex-end; min-height: calc(100vh - 96px); margin-bottom: -120px; padding-bottom: 6vh; }
        .zen-home .zen-stack { transform: none; }

        /* ---- Notion-style content blocks (About) in dashboard values ---- */
        .note-callout { display: flex; gap: var(--space-3); align-items: flex-start; background: var(--paper); border-radius: var(--radius-md); padding: var(--space-4) var(--space-5); margin: 0 0 var(--space-6); font-size: var(--text-base); line-height: var(--leading-normal); color: var(--ink); }
        .note-callout .emoji { font-size: 18px; line-height: 1.45; flex: 0 0 auto; }
        .note-h { display: flex; gap: 10px; align-items: baseline; font-weight: var(--fw-bold); font-size: var(--text-lg); letter-spacing: var(--tracking-display); color: var(--ink); margin: var(--space-6) 0 var(--space-4); }
        .note-h:first-child { margin-top: 0; }
        .note-h .emoji { font-size: 18px; }
        .note-p { font-size: var(--text-base); line-height: var(--leading-relaxed); color: var(--muted); margin: 0 0 var(--space-3); max-width: 640px; }
        .note-p strong { color: var(--ink); font-weight: var(--fw-semibold); }
        .note-list { display: flex; flex-direction: column; gap: 2px; margin: var(--space-2) 0 0; }
        .note-item { display: flex; gap: var(--space-3); align-items: baseline; padding: 10px; margin: 0 -10px; border-radius: var(--radius-sm); transition: background 0.14s ease; }
        .note-item:hover { background: rgba(17, 19, 28, 0.04); }
        .note-item .emoji { font-size: 17px; flex: 0 0 auto; width: 22px; text-align: center; line-height: 1.4; }
        .note-item .txt { font-size: var(--text-base); line-height: var(--leading-normal); color: var(--muted); }
        .note-item .txt strong { color: var(--ink); font-weight: var(--fw-semibold); }

        /* ============================================================
           ABOUT BENTO — a packed grid of glass tiles, each an enlarged emoji icon
           + a punchy line. 4-col grid; tiles span 1/2/4 cols and the hero spans 2 rows.
           ============================================================ */
        .about-bento { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 176px; gap: 14px; margin-top: var(--space-6); }
        .bt {
            position: relative; display: flex; flex-direction: column; justify-content: space-between;
            padding: 22px; border-radius: 20px; overflow: hidden;
            background: rgba(255, 255, 255, 0.82);
            -webkit-backdrop-filter: blur(22px) saturate(140%); backdrop-filter: blur(22px) saturate(140%);
            border: 1px solid rgba(255, 255, 255, 0.55); box-shadow: var(--shadow-2);
            transition: transform 0.2s ease, box-shadow 0.2s ease;
        }
        .bt:hover { transform: translateY(-2px); box-shadow: var(--shadow-3); }
        .bt-2 { grid-column: span 2; }
        .bt-4 { grid-column: span 4; }
        .bt-r2 { grid-row: span 2; }
        .bt-emoji { font-size: 40px; line-height: 1; filter: drop-shadow(0 6px 14px rgba(17, 19, 28, 0.14)); }
        .bt-r2 .bt-emoji { font-size: 64px; }
        .bt-title { font-size: 18px; font-weight: 760; letter-spacing: -0.01em; line-height: 1.15; color: var(--ink); margin: 0 0 5px; }
        .bt-r2 .bt-title { font-size: clamp(24px, 2.4vw, 30px); margin-bottom: 8px; }
        .bt-desc { font-size: 14px; line-height: 1.45; color: var(--muted); margin: 0; }
        .bt-r2 .bt-desc { font-size: 16px; line-height: 1.5; max-width: 24ch; }
        /* hero tile — subtle iridescent wash so it anchors the grid */
        .bt-hero { background:
            radial-gradient(120% 90% at 12% 0%, rgba(255, 201, 228, 0.28), rgba(255, 201, 228, 0) 60%),
            radial-gradient(120% 90% at 100% 100%, rgba(201, 240, 255, 0.30), rgba(201, 240, 255, 0) 60%),
            rgba(255, 255, 255, 0.86); }
        .bt-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
        .bt-chips span { font-size: 12.5px; font-weight: var(--fw-semibold); padding: 5px 11px; border-radius: var(--radius-pill); background: var(--paper); color: var(--ink); }
        /* CTA tile — horizontal: emoji + copy left, buttons right */
        .bt-cta { flex-direction: row; align-items: center; gap: var(--space-5); }
        .bt-cta .bt-emoji { font-size: 44px; flex: 0 0 auto; }
        .bt-cta .bt-text { flex: 1; min-width: 0; }
        .bt-cta .bt-title { margin-bottom: 3px; }
        .bt-cta-actions { display: flex; gap: var(--space-3); align-items: center; flex-shrink: 0; }

        /* dark: glass tiles + chips follow demo-dark (like .site-board) */
        html.demo-dark .bt { background: rgba(255, 255, 255, 0.045); border-color: rgba(255, 255, 255, 0.10); }
        html.demo-dark .bt-emoji { filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.4)); }
        html.demo-dark .bt-hero { background:
            radial-gradient(120% 90% at 12% 0%, rgba(255, 201, 228, 0.14), rgba(255, 201, 228, 0) 60%),
            radial-gradient(120% 90% at 100% 100%, rgba(201, 240, 255, 0.16), rgba(201, 240, 255, 0) 60%),
            rgba(255, 255, 255, 0.06); }
        html.demo-dark .bt-chips span { background: rgba(255, 255, 255, 0.08); }

        @media (max-width: 860px) {
            .about-bento { grid-template-columns: repeat(2, 1fr); }
            .bt-4 { grid-column: span 2; }
            .bt-cta { flex-direction: column; align-items: flex-start; justify-content: space-between; }
        }
        @media (max-width: 520px) {
            .about-bento { grid-template-columns: 1fr; grid-auto-rows: auto; }
            .bt, .bt-2, .bt-4 { grid-column: auto; min-height: 150px; }
            .bt-r2 { grid-row: auto; }
        }

        .site-cta-row { display: flex; gap: var(--space-3); align-items: center; flex-wrap: wrap; }

        /* ---- buttons — dashboard pill controls (override auth.css generic button rules) ---- */
        .site-btn-dark {
            display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2);
            width: auto; margin: 0; padding: 13px 22px; border: 0; border-radius: var(--radius-pill); cursor: pointer;
            background: var(--ink); color: #fff; font-family: inherit; font-size: var(--text-base); font-weight: var(--fw-semibold); letter-spacing: 0; text-decoration: none; white-space: nowrap;
            box-shadow: 0 2px 8px rgba(17, 19, 28, 0.20), inset 0 1px 0 rgba(255, 255, 255, 0.18);
            transition: transform 0.16s ease, box-shadow 0.16s ease;
        }
        .site-btn-dark:hover { transform: translateY(-1px); box-shadow: 0 6px 16px rgba(17, 19, 28, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.18); }
        .site-btn-dark:active { transform: translateY(0) scale(0.99); }
        .site-btn-ghost {
            display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2);
            width: auto; margin: 0; padding: 12px 18px; border-radius: var(--radius-pill); cursor: pointer;
            background: var(--card); color: var(--ink); font-family: inherit; font-size: var(--text-base); font-weight: var(--fw-semibold); text-decoration: none; white-space: nowrap;
            border: 1px solid var(--divider-strong); box-shadow: var(--shadow-2);
            transition: background 0.16s ease, transform 0.16s ease;
        }
        .site-btn-ghost:hover { background: var(--paper); transform: translateY(-1px); }

        /* ---- Pricing: billing toggle (dashboard segmented control) ---- */
        .bill-toggle { display: inline-flex; align-items: center; gap: var(--space-1); margin-top: var(--space-6); background: var(--card); border-radius: var(--radius-pill); padding: 4px; box-shadow: var(--shadow-2); }
        .bill-opt { width: auto; margin: 0; border: 0; background: transparent; cursor: pointer; font-family: inherit; font-size: var(--text-sm); font-weight: var(--fw-semibold); color: var(--muted); padding: 8px 16px; border-radius: var(--radius-pill); box-shadow: none; transition: color 0.15s ease, background 0.15s ease; }
        .bill-opt:hover { transform: none; box-shadow: none; color: var(--ink); }
        .bill-opt.active { background: var(--ink); color: #fff; }
        .bill-save { font-size: var(--text-sm); font-weight: var(--fw-semibold); color: var(--success-green); margin-left: 10px; }

        /* ---- Pricing: tier cards — selective liquid glass; fixed-height zones
           keep every "Join the waitlist" button on one horizontal line ---- */
        .tier-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-4); align-items: stretch; }
        .tier {
            position: relative; display: flex; flex-direction: column; padding: var(--space-6);
            background: rgba(255, 255, 255, 0.80);
            -webkit-backdrop-filter: blur(22px) saturate(145%); backdrop-filter: blur(22px) saturate(145%);
            border: 1px solid rgba(255, 255, 255, 0.55); border-radius: var(--radius-board);
            box-shadow: var(--shadow-2);
        }
        .tier.featured {
            background:
                radial-gradient(120% 80% at 15% 0%, rgba(255, 201, 228, 0.22), rgba(255, 201, 228, 0) 55%),
                radial-gradient(120% 80% at 100% 100%, rgba(201, 240, 255, 0.24), rgba(201, 240, 255, 0) 55%),
                rgba(255, 255, 255, 0.92);
            box-shadow: var(--shadow-3); border-color: var(--ink);
        }
        /* enlarged emoji icon at the top of each tier — matches the About bento tiles */
        .tier-emoji { font-size: 34px; line-height: 1; margin: 0 0 12px; filter: drop-shadow(0 5px 12px rgba(17, 19, 28, 0.14)); }
        html.demo-dark .tier-emoji { filter: drop-shadow(0 5px 12px rgba(0, 0, 0, 0.4)); }
        /* badge sits OUT of flow (straddles the top edge) so it never shifts the card's content */
        .tier-badge { position: absolute; top: -11px; left: var(--space-6); font-size: 10px; font-weight: var(--fw-bold); letter-spacing: var(--tracking-caps); text-transform: uppercase; color: #fff; background: var(--ink); padding: 5px 11px; border-radius: var(--radius-pill); box-shadow: 0 4px 12px rgba(17, 19, 28, 0.28); }
        .tier-name { font-size: 12.5px; font-weight: var(--fw-semibold); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--ink); }
        .tier-tag { font-size: var(--text-sm); line-height: var(--leading-normal); color: var(--muted); margin: var(--space-2) 0 var(--space-5); min-height: 38px; }
        .tier-price { display: flex; align-items: baseline; gap: 3px; }
        .tier-cur { font-size: var(--text-base); font-weight: var(--fw-semibold); color: var(--muted); }
        .tier-amount { font-size: 38px; font-weight: var(--fw-bold); letter-spacing: var(--tracking-display); color: var(--ink); font-variant-numeric: tabular-nums; line-height: 1; }
        .tier-period { font-size: var(--text-sm); color: var(--muted); }
        /* billed line + savings chip, reserved height so the CTA never moves on toggle */
        .tier-meta { min-height: 44px; margin-top: var(--space-2); display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
        .tier-billed { font-size: 12px; color: var(--muted); }
        .tier-save { display: inline-flex; align-items: center; font-size: 11.5px; font-weight: var(--fw-semibold); color: #067a44; background: rgba(1, 235, 114, 0.16); padding: 3px 9px; border-radius: var(--radius-pill); }
        .tier-save[hidden] { display: none; }
        .tier-cta { margin-top: var(--space-4); width: 100%; }
        .tier-feats { list-style: none; padding: var(--space-5) 0 0; margin: var(--space-5) 0 0; border-top: 1px solid var(--divider); display: flex; flex-direction: column; gap: 10px; }
        .tier-feats li { font-size: var(--text-sm); line-height: var(--leading-normal); color: var(--muted); display: flex; gap: var(--space-2); align-items: flex-start; }
        .tier-feats li svg { flex: 0 0 auto; width: 15px; height: 15px; margin-top: 1px; color: var(--ink); }
        @media (max-width: 880px) { .tier-grid { grid-template-columns: repeat(2, 1fr); } }
        @media (max-width: 540px) { .tier-grid { grid-template-columns: 1fr; } .tier-tag { min-height: 0; } }

        /* ---- Pricing: comparison matrix (inside a board) ---- */
        .matrix-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
        .matrix { width: 100%; min-width: 660px; border-collapse: collapse; font-size: var(--text-sm); }
        .matrix th, .matrix td { padding: 13px 14px; border-bottom: 1px solid var(--divider); text-align: center; vertical-align: middle; }
        .matrix thead th { font-size: 12px; font-weight: var(--fw-semibold); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--ink); border-bottom: 1.5px solid var(--divider-strong); }
        .matrix thead th.col-feat { text-align: left; }
        .matrix tbody th { text-align: left; font-weight: var(--fw-regular); color: var(--muted); }
        .matrix .col-feat { width: 34%; }
        .matrix tr.grp th { background: transparent; font-weight: var(--fw-semibold); text-transform: uppercase; font-size: 11px; letter-spacing: var(--tracking-caps); color: var(--muted); padding-top: 26px; border-bottom: 0; }
        .matrix td.val { font-variant-numeric: tabular-nums; color: var(--ink); font-weight: var(--fw-semibold); }
        .matrix td.tick svg { width: 17px; height: 17px; color: var(--ink); }
        .matrix td.dash { color: var(--divider-strong); font-weight: var(--fw-semibold); }

        .matrix-foot { font-size: var(--text-sm); line-height: var(--leading-relaxed); color: var(--muted); margin: 0; }
        /* slim disclaimer footnote under a CTA / get-started box */
        .cta-fineprint { font-size: var(--text-sm); line-height: var(--leading-relaxed); color: var(--muted); margin: var(--space-5) 0 0; }
        .link-inline { width: auto; margin: 0; padding: 0; border: 0; background: transparent; box-shadow: none; font: inherit; color: var(--ink); font-weight: var(--fw-semibold); text-decoration: underline; text-underline-offset: 2px; cursor: pointer; }
        .link-inline:hover { transform: none; box-shadow: none; opacity: 0.7; }

        /* ---- shared modals: demo / waitlist / create-account (dashboard values) ---- */
        .site-modal-overlay { position: fixed; inset: 0; z-index: 1000; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(12, 13, 18, 0.55); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); animation: siteOvIn 0.2s ease both; }
        .site-modal-overlay[hidden] { display: none; }
        @keyframes siteOvIn { from { opacity: 0; } to { opacity: 1; } }
        .site-modal { position: relative; width: 100%; max-width: 444px; background: var(--card); color: var(--ink); border-radius: var(--radius-lg); padding: var(--space-8) 30px var(--space-6); box-shadow: 0 30px 80px -20px rgba(0, 0, 0, 0.5); animation: siteModIn 0.32s cubic-bezier(0.16, 1, 0.3, 1) both; }
        @keyframes siteModIn { from { opacity: 0; transform: translateY(12px) scale(0.98); } to { opacity: 1; transform: none; } }
        .site-modal-close { position: absolute; top: 15px; right: 15px; width: 32px; height: 32px; margin: 0; padding: 0; border: 0; background: transparent; border-radius: 50%; cursor: pointer; color: var(--muted); display: flex; align-items: center; justify-content: center; box-shadow: none; transition: background 0.15s ease; }
        .site-modal-close:hover { background: rgba(17, 19, 28, 0.06); transform: none; box-shadow: none; }
        .site-modal-close svg { width: 18px; height: 18px; }
        .site-modal-eyebrow { font-size: var(--text-sm); font-weight: var(--fw-medium); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--muted); margin-bottom: 10px; }
        .site-modal h2 { font-family: var(--font-sans); font-size: var(--text-lg); font-weight: var(--fw-bold); letter-spacing: var(--tracking-display); line-height: var(--leading-tight); text-align: left; margin: 0 0 10px; color: var(--ink); }
        .site-modal p { font-size: var(--text-base); line-height: var(--leading-normal); color: var(--muted); margin: 0 0 22px; text-align: left; }
        .site-modal p strong { color: var(--ink); font-weight: var(--fw-semibold); }
        .site-modal .site-btn-dark { width: 100%; }

        .wl-field { display: flex; gap: var(--space-2); }
        .wl-field input[type=email] { flex: 1; min-width: 0; width: auto; margin: 0; padding: 12px 16px; border: 1px solid var(--divider-strong); border-radius: var(--radius-pill); background: var(--card); color: var(--ink); font-family: inherit; font-size: var(--text-base); outline: none; transition: border-color 0.15s ease, box-shadow 0.15s ease; }
        .wl-field input[type=email]::placeholder { color: rgba(24, 24, 27, 0.36); }
        .wl-field input[type=email]:focus { border-color: var(--ink); box-shadow: 0 0 0 3px rgba(17, 19, 28, 0.08); background: var(--card); }
        .wl-field .site-btn-dark { width: auto; flex: 0 0 auto; padding: 12px 22px; }
        .wl-error { color: var(--danger-red); font-size: 12.5px; margin-top: 10px; }
        .wl-roles-label { font-size: var(--text-sm); font-weight: var(--fw-medium); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--muted); margin: 22px 0 10px; }
        .wl-roles { display: flex; flex-wrap: wrap; gap: 7px; }
        .wl-role { width: auto; margin: 0; padding: 7px 13px; border: 1px solid var(--divider-strong); border-radius: var(--radius-pill); background: var(--card); color: var(--muted); font-family: inherit; font-size: 12.5px; font-weight: var(--fw-semibold); cursor: pointer; box-shadow: none; user-select: none; transition: background 0.14s ease, color 0.14s ease, border-color 0.14s ease; }
        .wl-role:hover { background: var(--paper); transform: none; box-shadow: none; }
        .wl-role.selected { background: var(--ink); color: #fff; border-color: var(--ink); }
        .wl-success { text-align: left; }
        .wl-success h2 { margin-top: 4px; }
        .wl-success p { margin-bottom: 0; }
        .wl-check-icon { width: 46px; height: 46px; border-radius: 50%; background: var(--success-green); color: #06281a; display: flex; align-items: center; justify-content: center; margin-bottom: 16px; }
        .wl-check-icon svg { width: 23px; height: 23px; }

        /* top-bar active page = flat underline only (see .auth-nav-link.active above);
           no pill / no glass fill. */

        @media (max-width: 640px) {
            .site-wrap { padding: 112px 18px 88px; }
        }

        /* ---------- card mode (create account / setup) ---------- */
        /* Centre the card vertically over the foil; auto margins let a tall form
           still scroll into view on short screens (instead of clipping). */
        body.auth-card-mode { overflow-y: auto; }
        body.auth-card-mode .auth-card { margin-top: auto; margin-bottom: auto; }
        .auth-card {
            position: relative; z-index: 1;
            width: 100%; max-width: 372px;
            margin-top: 44vh;
            padding: 32px 32px 28px;
            border-radius: 22px;
            background: rgba(13, 13, 17, 0.52);
            backdrop-filter: blur(28px) saturate(180%) brightness(1.06);
            -webkit-backdrop-filter: blur(28px) saturate(180%) brightness(1.06);
            border: 1px solid rgba(255, 255, 255, 0.12);
            box-shadow:
                0 24px 64px -16px rgba(0, 0, 0, 0.6),
                inset 0 1px 1px rgba(255, 255, 255, 0.16);
        }
        .auth-card::after {
            content: ''; position: absolute; inset: -1px; border-radius: inherit; padding: 1px;
            background: conic-gradient(from 215deg,
                rgba(255, 158, 224, 0.35), rgba(142, 227, 255, 0.28),
                rgba(183, 157, 255, 0.33), rgba(157, 255, 208, 0.26),
                rgba(255, 243, 166, 0.30), rgba(127, 180, 255, 0.28),
                rgba(255, 158, 224, 0.35));
            -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
            -webkit-mask-composite: xor;
            mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
            mask-composite: exclude;
            pointer-events: none;
        }
        h1 { font-family: 'Host Grotesk', sans-serif; font-weight: 500; font-size: 22px; letter-spacing: 0.2px; margin: 0 0 4px; text-align: center; }
        .sub { font-size: 13px; color: rgba(255,255,255,0.55); margin: 0 0 26px; line-height: 1.5; text-align: center; }
        label { display: block; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.5); margin: 0 0 6px; text-transform: uppercase; letter-spacing: 0.06em; }
        .auth-card input {
            width: 100%; padding: 12px 14px; margin-bottom: 18px;
            background: rgba(255, 255, 255, 0.06);
            border: 1px solid rgba(255, 255, 255, 0.14);
            border-radius: 12px; color: #FFFFFF; font-size: 15px; outline: none;
            transition: border-color 0.2s, background 0.2s;
        }
        .auth-card input:focus { border-color: rgba(255, 255, 255, 0.65); background: rgba(255, 255, 255, 0.09); }
        .auth-card button:not(.pw-eye), .btn-link {
            display: block; width: 100%; padding: 13px;
            background: #FFFFFF; color: #09090B; border: none;
            border-radius: 999px; font-size: 15px; font-weight: 600; cursor: pointer; margin-top: 4px;
            text-align: center; text-decoration: none;
            transition: transform 0.15s ease, box-shadow 0.15s ease;
            box-shadow: 0 4px 18px rgba(0, 0, 0, 0.35);
        }
        .auth-card button:not(.pw-eye):hover, .btn-link:hover { transform: translateY(-1px); box-shadow: 0 8px 26px rgba(0, 0, 0, 0.45); }
        .auth-card button:not(.pw-eye):active, .btn-link:active { transform: translateY(0); }
        .err { background: rgba(225,29,72,0.14); border: 1px solid rgba(225,29,72,0.35); color: #FB7185;
            font-size: 13px; padding: 10px 12px; border-radius: 10px; margin-bottom: 20px; }
        .hint { font-size: 12px; color: rgba(255,255,255,0.45); margin-top: 18px; text-align: center; line-height: 1.5; }
        .hint a { color: rgba(255,255,255,0.82); text-decoration: underline; text-underline-offset: 2px; }
        .hint a:hover { color: #fff; }
        /* password field + reveal toggle (signup) */
        .pw-wrap { position: relative; margin-bottom: 18px; }
        .pw-wrap input { margin-bottom: 0; padding-right: 46px; }
        .pw-eye {
            position: absolute; top: 0; right: 0; width: 46px; height: 100%; margin: 0; padding: 0;
            display: flex; align-items: center; justify-content: center;
            background: transparent; border: 0; border-radius: 0; box-shadow: none; cursor: pointer;
            color: rgba(255,255,255,0.45); transition: color 0.15s ease;
        }
        .pw-eye:hover { color: rgba(255,255,255,0.85); transform: none; box-shadow: none; }
        .pw-eye:active { transform: none; }
        .pw-eye svg { width: 18px; height: 18px; display: block; }
        .pw-eye .ic-hide { display: none; }
        .pw-eye.on .ic-show { display: none; }
        .pw-eye.on .ic-hide { display: block; }

        /* ---- card mode is theme-reactive: the values above are the DARK glass card
           (demo-dark). In LIGHT theme (default <html data-theme="light">) the card +
           its inputs/labels/buttons flip to a light surface, matching the site. ---- */
        html[data-theme="light"] body.auth-card-mode { color: var(--ink); }
        html[data-theme="light"] .auth-card {
            background: rgba(255, 255, 255, 0.72);
            border-color: rgba(17, 19, 28, 0.08);
            box-shadow: 0 24px 64px -16px rgba(17, 19, 28, 0.22), inset 0 1px 1px rgba(255, 255, 255, 0.7);
        }
        html[data-theme="light"] .auth-card h1 { color: var(--ink); }
        html[data-theme="light"] .auth-card .sub { color: var(--muted); }
        html[data-theme="light"] .auth-card label { color: rgba(17, 19, 28, 0.55); }
        html[data-theme="light"] .auth-card input { background: rgba(17, 19, 28, 0.03); border-color: rgba(17, 19, 28, 0.14); color: var(--ink); }
        html[data-theme="light"] .auth-card input:focus { border-color: var(--ink); background: #fff; }
        html[data-theme="light"] .auth-card button:not(.pw-eye), html[data-theme="light"] .btn-link { background: var(--ink); color: #fff; box-shadow: 0 4px 18px rgba(17, 19, 28, 0.22); }
        html[data-theme="light"] .auth-card .hint { color: var(--muted); }
        html[data-theme="light"] .auth-card .hint a { color: var(--ink); }
        html[data-theme="light"] .auth-card .pw-eye { color: rgba(17, 19, 28, 0.4); }
        html[data-theme="light"] .auth-card .pw-eye:hover { color: var(--ink); }

        /* the top bar's currentColor icons (language globe) must read on card/bare
           pages too — those set body colour white for the dark card, so pin the bar. */
        .auth-topbar { color: #18181B; }
        html.demo-dark .auth-topbar { color: #FAFAFA; }

        /* LANGUAGE DROPDOWN — mirrored from app.css so the globe + menu are styled on
           EVERY auth page (card/bare pages don't load app.css). Theme-safe colours. */
        .lang-dd { position: relative; display: inline-flex; }
        .lang-dd-btn {
            display: flex; align-items: center; justify-content: center;
            width: 26px; height: 26px; padding: 0; margin: 0; border: 0; background: none;
            color: currentColor; opacity: 0.72; cursor: pointer; border-radius: 50%;
            transition: opacity 0.16s ease;
        }
        .lang-dd-btn:hover, .lang-dd.open .lang-dd-btn { opacity: 1; }
        .lang-dd-btn svg { width: 19px; height: 19px; display: block; }
        .lang-dd-menu {
            position: absolute; top: calc(100% + 10px); right: 0; z-index: 60;
            min-width: 168px; padding: 6px; margin: 0;
            background: var(--card, #fff); border: 1px solid var(--divider, rgba(128, 128, 128, 0.2));
            border-radius: 12px; box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.28), 0 2px 6px rgba(0, 0, 0, 0.08);
            opacity: 0; visibility: hidden; transform: translateY(-6px) scale(0.98); transform-origin: top right;
            transition: opacity 0.16s ease, transform 0.16s ease, visibility 0.16s;
        }
        .lang-dd.open .lang-dd-menu { opacity: 1; visibility: visible; transform: translateY(0) scale(1); }
        .lang-dd-menu button {
            display: flex; align-items: center; justify-content: space-between; gap: 12px;
            width: 100%; margin: 0; padding: 9px 12px; border: 0; background: none; box-shadow: none;
            border-radius: 8px; cursor: pointer; text-align: left; white-space: nowrap;
            font-family: inherit; font-size: 13.5px; font-weight: var(--fw-medium, 500);
            color: var(--ink, #18181B); transition: background 0.14s ease;
        }
        .lang-dd-menu button:hover { background: rgba(128, 128, 128, 0.14); }
        .lang-dd-menu button.active { font-weight: var(--fw-semibold, 600); }
        .lang-dd-menu button.active::after { content: '✓'; font-size: 12px; opacity: 0.8; }

        /* ---------- bare mode: the zen morphing login pill ---------- */
        .zen-wrap {
            position: fixed; inset: 0; z-index: 1;
            display: flex; align-items: center; justify-content: center;
            pointer-events: none;
        }
        .zen-stack {
            pointer-events: auto;
            display: flex; flex-direction: column; align-items: center; gap: 14px;
            width: min(400px, calc(100vw - 48px));
            transform: translateY(17vh); /* below the logo's center stage */
        }
        .zen-err {
            color: #FB7185; font-size: 13px; text-align: center;
            text-shadow: 0 1px 8px rgba(0,0,0,0.6);
        }
        /* Full-width pill matching the input pill below; the email text sits left
           and the edit (pencil) icon is pinned to the FAR RIGHT END of the pill. */
        /* entered-email token — FLAT typographic (no pill): muted label · pencil */
        .zen-chip {
            display: inline-flex; align-items: center; gap: 7px; align-self: flex-start;
            padding: 0 0 2px; border: none; border-radius: 0; background: none; box-shadow: none;
            color: rgba(24, 24, 27, 0.5); font-size: 12.5px; font-weight: 500; letter-spacing: 0.02em;
            cursor: pointer; user-select: none; transition: color 0.18s ease;
        }
        .zen-chip:hover { transform: none; box-shadow: none; color: #18181B; }
        .zen-chip span { min-width: 0; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
        .zen-chip svg { width: 12px; height: 12px; opacity: 0.7; flex-shrink: 0; }
        /* Flat WHITE pill — same language as the app header (flat surface, soft
           realistic shadow, pill radius). No glass. */
        /* Flat white pill — same height language as the app header (~46px).
           Input + button sit inside the pill at the same density as header nav items. */
        .zen-pill {
            position: relative; width: 100%; height: 46px;
            border-radius: 999px;
            background: #ffffff;
            box-shadow:
                0 2px 6px rgba(17, 19, 28, 0.08),
                0 18px 44px -8px rgba(17, 19, 28, 0.22);
            overflow: hidden;
        }
        .zen-stage {
            position: absolute; inset: 0;
            display: flex; align-items: center; gap: 8px;
            padding: 4px 4px 4px 20px;
            transition: transform 0.45s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.32s ease;
        }
        .zen-stage.off-left  { transform: translateX(-48px); opacity: 0; pointer-events: none; }
        .zen-stage.off-right { transform: translateX(48px);  opacity: 0; pointer-events: none; }
        .zen-stage input {
            flex: 1; min-width: 0;
            background: transparent; border: none; outline: none; box-shadow: none;
            color: #18181B; caret-color: #18181B; font-size: 14px; padding: 0; margin: 0;
            -webkit-appearance: none; appearance: none;
            font-family: 'Host Grotesk', -apple-system, sans-serif;
            font-weight: 500;
            letter-spacing: 0.01em;
            line-height: 1.2;
            border-radius: 0;
            margin-left: -20px;
            padding-left: 20px;
            margin-top: -4px; padding-top: 4px;
            margin-bottom: -4px; padding-bottom: 4px;
        }
        .zen-stage input::placeholder { color: rgba(24,24,27,0.36); }
        .zen-stage input:-webkit-autofill,
        .zen-stage input:-webkit-autofill:hover,
        .zen-stage input:-webkit-autofill:focus,
        .zen-stage input:-webkit-autofill:active {
            border-radius: 0 !important;
            -webkit-box-shadow: 0 0 0 1000px #ffffff inset !important;
            box-shadow: 0 0 0 1000px #ffffff inset !important;
            -webkit-text-fill-color: #18181B !important;
            caret-color: #18181B;
        }
        .zen-btn {
            width: 38px; height: 38px; flex-shrink: 0;
            margin: 0; padding: 0;
            display: flex; align-items: center; justify-content: center;
            border: none; border-radius: 50%;
            background: #18181B; color: #FFFFFF; cursor: pointer;
            box-shadow: 0 2px 8px rgba(17,19,28,0.28), inset 0 1px 0 rgba(255,255,255,0.22);
            transition: transform 0.15s ease, box-shadow 0.15s ease;
        }
        .zen-btn:hover { transform: scale(1.07); box-shadow: 0 4px 14px rgba(17,19,28,0.34), inset 0 1px 0 rgba(255,255,255,0.22); }
        .zen-btn:active { transform: scale(0.95); }
        .zen-btn svg { width: 18px; height: 18px; }
        /* Logout: the whole pill is a link — no nested button */
        .zen-sign-pill { display: block; text-decoration: none; cursor: pointer; }
        .zen-sign-label { flex: 1; min-width: 0; font-size: 16px; color: rgba(255,255,255,0.68); user-select: none; }
        .zen-sign-pill:hover .zen-btn { transform: scale(1.07); box-shadow: 0 6px 22px rgba(0,0,0,0.5); }
        .zen-sign-label { font-size: 14px; }
        .zen-btn.loading svg { display: none; }
        .zen-btn.loading::after {
            content: ''; width: 15px; height: 15px;
            border: 2px solid rgba(255,255,255,0.30); border-top-color: #ffffff;
            border-radius: 50%;
            animation: zenspin 0.7s linear infinite;
        }
        @keyframes zenspin { to { transform: rotate(360deg); } }
        .zen-caption {
            font-family: 'Host Grotesk', sans-serif;
            font-size: 11px; letter-spacing: 0.42em; text-indent: 0.42em;
            color: rgba(255,255,255,0.5);
            text-shadow: 0 1px 10px rgba(0,0,0,0.6);
            user-select: none;
        }
        @keyframes zenshake {
            0%, 100% { transform: translateX(0); }
            20% { transform: translateX(-9px); } 40% { transform: translateX(8px); }
            60% { transform: translateX(-6px); } 80% { transform: translateX(4px); }
        }
        .zen-pill.shake { animation: zenshake 0.4s ease; }

        /* ---- login entry = FLAT typographic sign-in field: ⚡ bolt + hairline-
           underline input + a BARE arrow (no pill, no circle). Keeps the
           email→password stage slide. ---- */
        .zen-pill.zen-ask {
            background: transparent;
            border-radius: 0;
            box-shadow: none;
            border-bottom: 1.5px solid rgba(24, 24, 27, 0.28);
            transition: border-color 0.18s ease;
        }
        .zen-pill.zen-ask:focus-within { border-bottom-color: #18181B; }
        .zen-bolt {
            position: absolute; left: 2px; top: 50%; transform: translateY(-50%); z-index: 3;
            width: 18px; height: 18px; color: #18181B; opacity: 0.85; pointer-events: none;
        }
        .zen-bolt svg { width: 100%; height: 100%; display: block; }
        .zen-ask .zen-stage { padding-left: 30px; padding-right: 0; }
        .zen-ask .zen-stage input { margin-left: 0; padding-left: 0; font-weight: 500; font-size: 15px; letter-spacing: 0.01em; }
        .zen-ask .zen-stage input::placeholder { color: rgba(24, 24, 27, 0.45); }

        /* bare arrow — flat, no circle background */
        .zen-ask .zen-btn {
            width: auto; height: auto; flex-shrink: 0;
            background: transparent; box-shadow: none; border-radius: 0;
            color: #18181B; opacity: 0.85; padding: 4px 2px 4px 10px;
            transition: opacity 0.16s ease, transform 0.16s ease;
        }
        .zen-ask .zen-btn:hover { transform: translateX(2px); box-shadow: none; opacity: 1; }
        .zen-ask .zen-btn:active { transform: translateX(0); }
        .zen-ask .zen-btn svg { width: 20px; height: 20px; }
        .zen-ask .zen-btn.loading::after { border-color: rgba(24, 24, 27, 0.28); border-top-color: #18181B; }

        /* AUTOFILL: keep the field transparent — no yellow box, no white box.
           The very long background-color transition prevents the autofill paint;
           box-shadow reset drops the old white masking pill. */
        .zen-ask .zen-stage input:-webkit-autofill,
        .zen-ask .zen-stage input:-webkit-autofill:hover,
        .zen-ask .zen-stage input:-webkit-autofill:focus,
        .zen-ask .zen-stage input:-webkit-autofill:active {
            -webkit-box-shadow: none !important; box-shadow: none !important;
            -webkit-text-fill-color: #18181B !important;
            caret-color: #18181B;
            transition: background-color 100000s ease 0s, color 100000s ease 0s;
        }

        /* ============================================================
           IN-BAR SIGN-IN — the app's ⚡ ask-field, verbatim, in the same
           header position; here it signs you in. Email → password stages
           swap in place; bolt = back to email. Flat, no pill.
           ============================================================ */
        .auth-actions { gap: 16px; }
        .bar-ask {
            position: relative; display: flex; align-items: center; gap: 7px;
            width: 212px; padding-bottom: 3px; margin: 0;
            border-bottom: 1.5px solid rgba(24, 24, 27, 0.28);
            transition: border-color 0.18s ease;
        }
        .bar-ask:focus-within { border-bottom-color: #18181B; }
        .bar-bolt {
            display: flex; width: 16px; height: 16px; flex-shrink: 0;
            padding: 0; margin: 0; border: 0; background: none;
            color: #18181B; opacity: 0.85; cursor: pointer;
        }
        .bar-bolt svg { width: 100%; height: 100%; display: block; }
        .bar-fields { flex: 1; min-width: 0; display: flex; }
        .bar-ask input {
            flex: 1; min-width: 0; width: 100%;
            border: 0; background: transparent; outline: none;
            padding: 3px 0; margin: 0;
            font-family: inherit; font-size: 13.5px; font-weight: 500;
            letter-spacing: 0.01em; color: #18181B;
        }
        .bar-ask input::placeholder { color: rgba(24, 24, 27, 0.45); }
        .bar-ask #bar-pass { display: none; }
        .bar-ask[data-stage="pass"] #bar-email { display: none; }
        .bar-ask[data-stage="pass"] #bar-pass { display: block; }
        .bar-go {
            display: flex; width: 18px; height: 16px; flex-shrink: 0;
            padding: 0; margin: 0; border: 0; background: none;
            color: #18181B; opacity: 0.85; cursor: pointer;
            transition: transform 0.16s ease, opacity 0.16s ease;
        }
        .bar-go svg { width: 16px; height: 16px; }
        .bar-go:hover { opacity: 1; transform: translateX(2px); }
        .bar-err {
            position: absolute; top: calc(100% + 6px); right: 0;
            font-size: 11px; font-weight: 500; color: #E11D48; white-space: nowrap;
        }
        .bar-ask.shake { animation: zenshake 0.4s ease; }
        /* autofill: never paint yellow (or white) into the transparent field.
           background-clip:text is the Safari-proof kill (the UA fill clips to the
           glyphs); the endless transition covers Chromium. */
        .bar-ask input:-webkit-autofill,
        .bar-ask input:-webkit-autofill:hover,
        .bar-ask input:-webkit-autofill:focus,
        .bar-ask input:-webkit-autofill:active {
            -webkit-box-shadow: none !important; box-shadow: none !important;
            -webkit-text-fill-color: #18181B !important;
            -webkit-background-clip: text; background-clip: text;
            caret-color: #18181B;
            transition: background-color 100000s ease 0s, color 100000s ease 0s;
        }

        /* PILL-BUG hardening — the card-mode GLOBAL button style (white pill bg,
           999px radius, big drop shadow, width:100%, hover lift) must never leak
           into the flat bar controls. Reset every piece of it, incl. states. */
        .bar-bolt, .bar-go, .bar-theme, .bar-lang-btn {
            width: auto; min-width: 0; display: flex;
            background: none; border: 0; border-radius: 0;
            box-shadow: none; margin: 0; transform: none; text-align: left;
        }
        .bar-bolt { width: 16px; }
        .bar-go { width: 18px; }
        .bar-theme { width: 18px; }
        .bar-bolt:hover, .bar-theme:hover, .bar-lang-btn:hover,
        .bar-bolt:active, .bar-go:active, .bar-theme:active, .bar-lang-btn:active,
        .bar-bolt:focus, .bar-go:focus, .bar-theme:focus, .bar-lang-btn:focus {
            background: none; box-shadow: none; transform: none;
        }
        .bar-go:hover { background: none; box-shadow: none; transform: translateX(2px); }

        /* language — typographic, underline = active (drives the demo's currency) */
        .bar-lang { display: flex; align-items: center; gap: 10px; }
        .bar-lang-btn {
            border: 0; background: none; padding: 2px 0; margin: 0; cursor: pointer;
            font-family: inherit; font-size: 11.5px; font-weight: 600; letter-spacing: 0.06em;
            color: #18181B; opacity: 0.45;
            text-underline-offset: 5px; text-decoration-thickness: 1.5px;
            transition: opacity 0.16s ease;
        }
        .bar-lang-btn:hover { opacity: 0.85; }
        .bar-lang-btn.active { opacity: 1; text-decoration: underline; }

        /* theme — bare line icon; moon ⇄ sun with the demo's dark state */
        .bar-theme {
            display: flex; width: 18px; height: 18px; flex-shrink: 0;
            padding: 0; margin: 0; border: 0; background: none;
            color: #18181B; opacity: 0.72; cursor: pointer;
            transition: opacity 0.16s ease;
        }
        .bar-theme:hover { opacity: 1; }
        .bar-theme svg { width: 100%; height: 100%; display: block; }
        .bar-theme .ic-sun { display: none; }
        html.demo-dark .bar-theme .ic-moon { display: none; }
        html.demo-dark .bar-theme .ic-sun { display: block; }

        /* ============================================================
           DARK PREVIEW — the bar's moon toggle flips the WHOLE landing, not just
           an isolated module. Because the 3D canvas is now TRANSPARENT (alpha),
           the foil logo floats straight on this dark page — no separate light box.
           demo-dark drops <html data-theme="light">, so these element+class rules
           win the cascade over auth.css :root. Tokens mirror the app's dark theme
           so the landing and the live app read as one continuous dark surface.
           ============================================================ */
        html.demo-dark {
            --ink: #FAFAFA; --muted: #A1A1AA;
            --card: #17171B; --paper: #1C1C21;
            --divider: #2A2A31; --divider-strong: #34343C;
            --bg-main: #0A0B0F; --bg-base: #0A0B0F;
        }
        html.demo-dark body,
        html.demo-dark body.site { background-color: var(--bg-main); }
        /* keep the original pale-sky hero in light (beats app.css [data-theme=light]) */
        html[data-theme="light"] { --bg-main: #eef6fa; --bg-base: #eef6fa; }
        /* top-bar text + controls invert so they read on the dark page */
        html.demo-dark .auth-nav-link { color: #FAFAFA; }
        html.demo-dark .auth-signin {
            background: #FAFAFA; color: #09090B;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.28);
        }
        html.demo-dark .bar-ask { border-bottom-color: rgba(255, 255, 255, 0.30); }
        html.demo-dark .bar-ask:focus-within { border-bottom-color: #FAFAFA; }
        html.demo-dark .bar-ask input,
        html.demo-dark .bar-bolt,
        html.demo-dark .bar-go,
        html.demo-dark .bar-theme,
        html.demo-dark .bar-lang-btn { color: #FAFAFA; }
        html.demo-dark .bar-ask input::placeholder { color: rgba(255, 255, 255, 0.45); }
        html.demo-dark .bar-ask input:-webkit-autofill,
        html.demo-dark .bar-ask input:-webkit-autofill:hover,
        html.demo-dark .bar-ask input:-webkit-autofill:focus {
            -webkit-text-fill-color: #FAFAFA !important; caret-color: #FAFAFA;
        }
        /* .zen-slogan uses --ink / --muted → it auto-flips with the tokens above */

        /* ============================================================
           HOME HERO — the 3D logo owns the centre; an Apple-style slogan
           sits bottom left. No scroll cue (the demo strip peeks instead).
           ============================================================ */
        body.site { scroll-behavior: smooth; }
        /* hero ≈ first screen (below the fixed bar), with only a thin peek of the
           demo strip; the slogan pins to the true bottom-left corner. */
        .zen-hero { position: relative; height: calc(100vh - 150px); min-height: 440px; }
        .zen-slogan {
            position: absolute; bottom: 20px; left: 0;
            display: flex; flex-direction: column; gap: 2px;
        }
        .zen-slogan-l1, .zen-slogan-l2 {
            font-size: clamp(30px, 3.2vw, 42px); font-weight: 760;
            letter-spacing: 0; line-height: 1.12; color: var(--ink);
        }
        .zen-slogan-l2 { color: var(--muted); }
        /* optional Apple-style sub-line under the slogan (About / Pricing heroes) */
        .zen-slogan-sub {
            margin-top: 16px; max-width: 480px;
            font-size: clamp(15px, 1.35vw, 18px); font-weight: var(--fw-regular);
            line-height: 1.5; letter-spacing: 0; color: var(--muted);
        }

        /* ============================================================
           HOME SECTIONS — shared header for the three landing chapters
           (gallery · AI stack · trust). Apple-quiet: eyebrow, big head, short sub.
           ============================================================ */
        .home-sec { margin: 110px 0 0; }
        .home-sec:first-of-type { margin-top: 24px; }
        .home-sec-head { max-width: 640px; margin: 0 0 36px; }
        .home-eyebrow { margin: 0 0 12px; font-size: 12.5px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
        .home-h2 { margin: 0 0 12px; font-size: clamp(28px, 3vw, 40px); font-weight: 760; letter-spacing: -0.01em; line-height: 1.12; color: var(--ink); }
        .home-sub { margin: 0; font-size: 16px; line-height: 1.55; color: var(--muted); }
        .home-credit { margin: 20px 2px 0; text-align: right; font-size: 12px; letter-spacing: 0.02em; color: var(--muted); }

        /* ============================================================
           3 · COMPARISON — the old way vs dejimalive, a two-column spec sheet:
           hairline rows, the one muted rival column, the dejimalive column as
           one continuous paper band (negative vertical margins let the cell
           fills join across rows; the hairlines running over it read as the
           sheet's rules). Token colours → theme-reactive. Scrolls sideways on
           phones: the grid keeps its minimum width.
           ============================================================ */
        .cmp-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
        .cmp { min-width: 620px; }
        .cmp-row { display: grid; grid-template-columns: 1fr 1.1fr 1.25fr; gap: 0 28px; align-items: start; padding: 15px 2px; border-top: 1px solid var(--divider); }
        .cmp-row:last-of-type { border-bottom: 1px solid var(--divider); }
        .cmp-head { border-top: 0; }
        .cmp-head span { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); line-height: 1.5; }
        .cmp-head .cmp-dj { color: var(--ink); }
        .cmp-dim { font-size: 14.5px; font-weight: 600; letter-spacing: -0.005em; line-height: 1.45; color: var(--ink); }
        .cmp-cell { font-size: 13.5px; line-height: 1.55; color: var(--muted); }
        .cmp-row .cmp-dj { background: var(--paper); margin: -15px 0; padding: 15px 14px; height: calc(100% + 30px); box-sizing: border-box; }
        .cmp-cell.cmp-dj { color: var(--ink); font-weight: 500; }
        .cmp-head .cmp-dj { border-radius: 14px 14px 0 0; }
        .cmp-row:last-of-type .cmp-dj { border-radius: 0 0 14px 14px; }

        /* ============================================================
           5 · FAQ — "Asked at 2:47 AM": flat document rows (hairline rules,
           plus toggles) in the house style; native <details> so every answer
           stays server-rendered and crawlable. Token colours → theme-reactive.
           ============================================================ */
        .faq { max-width: 780px; }
        .faq-item { border-top: 1px solid var(--divider); }
        .faq-item:last-of-type { border-bottom: 1px solid var(--divider); }
        .faq-item summary { display: flex; align-items: baseline; justify-content: space-between; gap: 18px; padding: 19px 2px; cursor: pointer; list-style: none; }
        .faq-item summary::-webkit-details-marker { display: none; }
        .faq-item summary:hover .faq-q { color: var(--ink); opacity: 0.75; }
        .faq-q { margin: 0; font-size: clamp(16px, 1.6vw, 19px); font-weight: 600; letter-spacing: -0.005em; line-height: 1.4; color: var(--ink); transition: opacity 0.15s ease; }
        .faq-plus { flex: 0 0 auto; font-size: 23px; font-weight: 300; line-height: 1; color: var(--muted); transition: transform 0.25s ease; }
        .faq-item[open] .faq-plus { transform: rotate(45deg); }
        .faq-a { margin: 0; padding: 0 2px 22px; max-width: 660px; font-size: 15px; line-height: 1.65; color: var(--muted); }
        .faq-ctas { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 28px; }

        /* ============================================================
           1 · PRODUCT GALLERY — the app's OWN modules, on the app's own grid.
           .g-mod is a thin alias of the product's .board: opaque bg-card, NO border,
           NO backdrop blur, shadow only — the recipe every floating surface in the
           app moved to. It used to be a parallel frosted-glass system on a scatter
           of tilts (--r/--y), which showed visitors a design language the product
           had already abandoned. Cards now sit on one aligned grid and share their
           baselines; the lift on hover is the same one .pj-card uses.
           Everything INSIDE a card is a real app component (.cf-cap / .cf-val /
           .pj-status / .pb-bar-* / .ai-board / .ai-list) so the page can never
           drift from the product again.
           ============================================================ */
        .gallery { display: grid; grid-template-columns: repeat(6, 1fr); gap: 18px; align-items: stretch; }
        .g-mod {
            position: relative; display: flex; flex-direction: column; gap: 14px;
            padding: 22px 24px;
            border-radius: var(--radius-lg, 16px);
            background: var(--bg-card, #fff);
            border: none;
            box-shadow: var(--shadow-2);
            transition: transform 0.25s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.25s ease;
        }
        .g-mod:hover { transform: translateY(-3px); box-shadow: var(--shadow-3); z-index: 3; }
        /* the dashboard's own stacking order, held on one 6-column grid */
        .g-kpis  { grid-column: 1 / 7; flex-direction: row; gap: 0; }
        .g-cf    { grid-column: 1 / 5; }
        .g-pdoc  { grid-column: 5 / 7; }
        .g-perf  { grid-column: 1 / 3; }
        .g-act   { grid-column: 3 / 7; }
        /* KPI band: three figure-units sharing one baseline, hairline-separated —
           the overview's own arrangement */
        .g-kpis .gk-cell { flex: 1; display: flex; flex-direction: column; gap: 9px; padding: 0 26px; }
        .g-kpis .gk-cell + .gk-cell { border-left: 1px solid var(--divider, rgba(128,128,128,0.18)); }
        .g-kpis .gk-cell:first-child { padding-left: 0; }
        .g-kpis .gk-cell:last-child { padding-right: 0; }
        .g-kpis .kpi-value { font-size: var(--text-xl, 32px); line-height: 1; margin: 0; }
        /* Performance hero shares the cash-flow hero's type, one size down */
        .g-perf .gp-hero { display: flex; align-items: baseline; gap: 4px; }
        .g-perf .gp-rule { height: 1px; background: var(--divider, rgba(128,128,128,0.18)); margin: 4px 0 2px; }
        .g-perf .cf-hero-num { font-size: 40px; }
        .g-perf .gp-row { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
        /* the gallery hosts real app components — give them the app's own spacing
           inside a landing card, and stop auth.css's generic resets reaching them */
        .g-mod .cf-cap { display: block; }
        .g-mod .ai-board { padding: 0; background: none; }
        .g-mod .ai-board-stats { border-top-color: var(--divider); padding: 13px 0 0; }
        .g-mod .ai-list { background: var(--bg-main); }
        .g-mod .board-header { margin: 0 0 4px; padding: 0; border: none; }
        .g-mod .board-title { font-size: 13px; }
        .g-mod .pdoc-card { margin: 0; width: auto; min-width: 0; flex: 1; }
        .g-mod .activity-row:last-child { border-bottom: none; }
        .g-mod .cf-aging { border-top: 1px solid var(--divider); padding: 16px 0 0; margin-top: 2px; }
        .g-mod .cf-grid { border: none; }
        .g-mod .perf-lessons { margin-top: 10px; padding-top: 11px; }
        /* the shelf CTA is a <button> in the app; as a static <span> it needs the
           centring the button element gave it for free */
        .g-mod .pdoc-action { display: flex; align-items: center; justify-content: center; box-sizing: border-box; }
        /* four figure-units share 794px here, not the board full width — let the
           caption WRAP rather than ellipsis away, and hold one shared baseline */
        .g-mod .cf-grid .cf-cap { white-space: normal; overflow: visible; text-overflow: clip; min-height: 2.4em; }

        /* ── ONE CAPTION TIER ─────────────────────────────────────────────────
           On the dashboard a board TITLE is dark 13px and a figure caption is
           muted 10.5px caps — two voices, because a working screen needs to be
           navigable. A gallery is read, not navigated: every label drops to the
           same quiet caps so the FIGURES carry the whole section. */
        .g-mod .board-title,
        .g-mod .cf-cap,
        .g-mod .pdoc-amt-cap,
        .g-mod .pdoc-phase,
        .g-mod .perf-qkey,
        .g-mod .pdoc-badge {
            font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase;
            font-weight: var(--fw-medium, 460); color: var(--muted, #71717a);
        }
        .g-mod .board-title { margin: 0 0 22px; }
        .g-mod .cf-cap { line-height: 1.5; }

        /* ── TWO FIGURE TIERS ─────────────────────────────────────────────────
           display (card hero) and data (figure-unit). Nothing else. */
        .g-mod .cf-hero-num { font-size: 46px; letter-spacing: -0.02em; line-height: 1; }
        .g-mod .cf-hero-unit { font-size: 15px; font-weight: var(--fw-medium, 460); color: var(--muted); }
        .g-mod .kpi-value { font-size: 38px; letter-spacing: -0.02em; }
        .g-mod .cf-val,
        .g-mod .pdoc-amt { font-size: 26px; font-weight: var(--fw-bold, 760); letter-spacing: -0.01em; line-height: 1; }
        .g-perf .cf-hero-num { font-size: 46px; }

        /* ── SHARED BASELINES ─────────────────────────────────────────────────
           the caption block is a FIXED height, so a wrapped caption can never
           knock its neighbour's figure off the line */
        .g-mod .cf-grid { align-items: start; }
        .g-mod .cf-grid .cf-cap { min-height: 30px; display: flex; align-items: flex-start; }
        .g-mod .cf-cell { gap: 0; }
        .g-mod .cf-fig { display: flex; flex-direction: column; justify-content: flex-start; }
        .g-mod .cf-hero { display: flex; flex-direction: column; gap: 14px; }
        .g-mod .cf-hero-foot { flex-direction: column; align-items: flex-start; gap: 9px; }

        /* ── FLATTEN THE NESTED CARD ──────────────────────────────────────────
           the shelf card carries its own border/shadow on the dashboard because
           it sits on a shelf of siblings. Alone inside a board it is a card in a
           card — drop the frame, keep the content. */
        .g-mod .pdoc-card {
            background: none; border: none; box-shadow: none; padding: 0;
            display: flex; flex-direction: column; gap: 9px;
        }
        .g-mod .pdoc-card-top { margin: 0 0 4px; }
        .g-mod .pdoc-num { font-size: 15px; font-weight: var(--fw-semibold, 600); letter-spacing: 0; }
        .g-mod .pdoc-who { font-size: 15px; font-weight: var(--fw-semibold, 600); color: var(--ink, #18181B); }
        .g-mod .pdoc-proj { font-size: 13px; color: var(--muted); }
        .g-mod .pdoc-amt-wrap { display: flex; flex-direction: column; gap: 7px; margin-top: 8px; }
        .g-mod .pdoc-actions { margin-top: auto; padding-top: 18px; }
        /* the CTA demonstrates, it does not invite a click here — outline, not ink */
        .g-mod .pdoc-action {
            display: flex; align-items: center; justify-content: center; box-sizing: border-box;
            background: none; color: var(--ink, #18181B);
            box-shadow: inset 0 0 0 1px var(--divider-strong, rgba(128,128,128,0.3));
            font-size: 12px; font-weight: var(--fw-semibold, 600); letter-spacing: 0;
            text-transform: none; padding: 11px 18px;
        }

        /* ── EVEN RHYTHM ──────────────────────────────────────────────────────
           one gap between a caption and its figure, one between groups */
        .g-mod { gap: 0; padding: 26px 28px; }
        .g-mod .cf-aging { border-top: 1px solid var(--divider); padding: 20px 0 0; margin-top: 22px; }
        .g-mod .perf-qbar { margin-top: 12px; }
        .g-mod .perf-qlegend { margin-top: 12px; }
        .g-mod .perf-lessons { margin-top: 18px; padding-top: 16px; }
        .g-perf .gp-rule { margin: 22px 0 18px; }
        .g-perf .gp-row { margin-bottom: 0; }
        .g-mod .activity-row { padding: 15px 0; }
        .g-mod .activity-row:first-of-type { padding-top: 4px; }
        .g-kpis { padding: 30px 28px; }
        /* the currency suffix is "(" + <span> + ")" — three text nodes that can
           break apart mid-parenthesis. Keep the caption together. */
        .g-mod .cf-cap, .g-mod .pdoc-amt-cap { text-wrap: balance; }
        .g-mod .cf-grid .cf-cap { white-space: nowrap; min-height: 0; }
        .g-mod .cf-grid .cf-cell { gap: 11px; }
        /* a 4-col card next to a tall one leaves slack — push the A/R strip to the
           BOTTOM so the space reads as composition, not as a hole in the middle */
        .g-cf { justify-content: flex-start; }
        .g-cf .cf-aging { margin-top: auto; }
        .g-mod .cf-hero { gap: 11px; }
        .g-mod .cf-hero-foot { gap: 7px; }
        .g-perf .cf-hero-foot { margin-top: 11px; }
        /* the hero cell is taller than the figure cells, so the column rules ran on
           past the numbers. Centre the figures against the hero and the rules read
           as a measure, not as a leftover. */
        .g-mod .cf-fig { justify-content: center; }
        .g-mod .activity-row:last-child { padding-bottom: 4px; }

        /* explicit line-height: `normal` computes per-glyph and knocks sibling
           figure-units off their shared baseline by a sub-pixel */

        /* trend chart — legend rides the header row (chart.js style), the plot
           runs edge-to-edge and owns every pixel below it */

        /* KPI trio — centred in the card, figures on one shared baseline,
           a quiet numeric delta under each so the space is spent, not empty */
        .g-kpi { justify-content: center; }

        /* runway — months over a 12-month track, then cash/burn as two
           figure-units; content distributes over the card's height */
        .g-run { justify-content: space-between; }

        /* margin donut — caption up top like every module, the ring fills the rest */
        .g-donut { align-items: stretch; }

        /* invoice pdoc card — the amount row owns its full width: figure left,
           phase chip right */

        /* activity feed — every row closes with a figure + timestamp block */

        html.demo-dark .g-mod { background: rgba(255, 255, 255, 0.05); border-color: rgba(255, 255, 255, 0.10); }

        /* ============================================================
           2 · AI CARD STACK — sticky deck: each card pins below the bar and the
           next slides over it. Fancy mesh-gradient backgrounds, big emoji, index.
           ============================================================ */
        /* ONE showcase — no stage box: the pill rail (LEFT) and the module deck
           (RIGHT) float directly on the page like the §1 gallery, house tokens
           throughout so the section rides the light/dark theme with the page. */
        /* ============================================================
           2 · AI INSIDE — FOUR FLOWS ON ONE TIMELINE.
           §1 is a GRID of finished boards: the dashboard at rest, all metrics,
           nothing to press. A second grid would read as a weaker helping of the
           same dish — so §2 is a SEQUENCE. One numbered spine, three beats per
           function, and on each beat the REAL surface at MODAL SCALE: the app's
           own .ai-drop / .ai-board / .ai-list / .qa-hint / .pj-status / .ai-paper,
           uncropped and unscaled. Input chrome (a drop zone, a field, buttons) is
           what separates the sections: §1 is something you LOOK AT, §2 is
           something you DO.
           The four functions swap under a .pill-group tab row — the app's own
           segmented control, so the liquid-glass .pill-glider (pill-slider.js,
           already loaded on this page) carries the active tab with no new recipe.
           Deliberately static inside the panels: no autoplay, no keyframes.
           (The previous .ai-rail / .ai-card / .ai-stage / .ai-crop / .ai-shot /
           .ai-well crop-frame set is gone with the rail it served.)
           ============================================================ */

        /* THE TAB ROW — the modal's segmented control at page scale. Centred,
           sized to its content, and it keeps the glider: the same glass capsule
           that rides the Quick-Add type pills. */
        .sqf-tabbar { display: flex; justify-content: center; margin: -6px 0 46px; }
        .sqf-tabs { padding: 5px; }
        /* the tab row is the one pill group sitting straight on the PAGE, and in
           dark --bg-main is within a hair of it — the track would vanish and the
           pills would float unanchored */
        html.demo-dark .sqf-tabs { background: rgba(255, 255, 255, 0.07); }
        .sqf-tabs .btn-pill { flex: 0 0 auto; padding: 11px 24px; font-size: 14px; }
        .sqf-tabs .btn-pill.active { color: var(--ink, var(--text-main, #18181B)); }
        .sqf-panel { display: none; }
        .sqf-panel.is-active { display: block; }
        /* the panel's own lead-in: Apple's bold claim + the sentence that earns it */
        .sqf-lede {
            max-width: 660px; margin: 0 0 52px;
            font-size: 17px; line-height: 1.55; color: var(--muted, #6b6b76);
        }
        .sqf-lede b { color: var(--ink, var(--text-main, #18181B)); font-weight: 600; }

        .sqf-beat {
            display: grid;
            grid-template-columns: 46px minmax(0, 0.86fr) minmax(0, 1.14fr);
            column-gap: 40px;
        }
        .sqf-beat + .sqf-beat { margin-top: 76px; }
        /* THE SPINE — the hairline that makes three panels read as ONE flow
           rather than three cards. It is the whole differentiator from §1. */
        .sqf-spine { position: relative; }
        .sqf-step {
            display: block; padding-top: 3px;
            font-size: 12px; font-weight: 600; letter-spacing: 0.1em;
            font-variant-numeric: tabular-nums; color: var(--muted, #6b6b76);
        }
        .sqf-spine::after {
            content: ''; position: absolute; left: 7px; top: 28px; bottom: -76px;
            width: 1px; background: var(--muted, #6b6b76); opacity: 0.22;
        }
        .sqf-beat:last-child .sqf-spine::after { display: none; }
        /* THE COPY — a short claim, one sentence that earns it, then a quiet
           scope line that admits the limits. */
        .sqf-say { min-width: 0; }
        .sqf-t {
            margin: 0 0 13px; font-size: clamp(20px, 1.6vw, 24px);
            font-weight: 600; letter-spacing: -0.012em; line-height: 1.24;
            color: var(--ink, #18181B);
        }
        .sqf-t--sm { font-size: 18px; margin-bottom: 7px; }
        .sqf-d { margin: 0; font-size: 15px; line-height: 1.6; color: var(--muted, #6b6b76); }
        .sqf-f { margin: 15px 0 0; font-size: 12.5px; line-height: 1.5; color: var(--muted, #6b6b76); opacity: 0.66; }

        /* THE SURFACE — the app's board recipe (opaque · shadow · no border) at
           the size the modal actually draws it. Nothing is scaled or cropped. */
        .sqf-see { min-width: 0; }
        .sqf-surface {
            display: flex; flex-direction: column;
            background: var(--bg-card, #fff);
            border-radius: 20px; padding: 24px;
            box-shadow: var(--shadow-3);
        }
        /* the modal-card affordance rules must travel WITH the widgets — outside a
           .modal-card the fields and buttons would lose their pill corners, and the
           surface would stop being the thing it is quoting */
        .sqf-surface .modal-input { border-radius: var(--radius-pill, 999px); padding: 13px 22px; }
        .sqf-surface .btn { border-radius: var(--radius-pill, 999px); cursor: default; }
        .sqf-surface .form-group:last-of-type { margin-bottom: 4px; }
        /* a multi-line field can't pill (the app says so too) — it keeps the soft
           large radius, and the selector must out-weigh the pill rule above */
        .sqf-surface .sqf-brief {
            border-radius: 18px; padding: 15px 20px;
            font-size: 14px; line-height: 1.6;
            font-weight: var(--fw-medium, 460); color: var(--text-main);
        }
        .sqf-surface .sq-drop { margin-top: 0; }
        .sqf-surface .ai-board + .qa-hint { margin-top: 14px; }
        .sqf-surface .ai-sec-note { margin-top: 12px; }
        .sqf-surface .ai-media { height: 84px; }
        .sqf-surface .ai-media .material-icons { font-size: 32px; }
        .sqf-surface .qa-select { margin-top: 2px; }
        /* the amount well and the doc total render their figure as a SPAN here (a
           live <input> on a marketing page would be a focus trap) — the input
           rules that shape it assume a form control, so restore the box */
        .sqf-surface .input-amount-huge { display: block; line-height: 1.05; }
        /* .ai-fig-val holds a NAME here (the account, the period), not a figure */
        .sqf-fig-sm { font-size: 13px !important; font-weight: var(--fw-semibold) !important; }
        /* the document total sits right-aligned under the line items, as in the form */
        .sqf-total {
            display: flex; flex-direction: column; align-items: flex-end; gap: 4px;
            margin-top: 22px; padding-top: 20px;
            border-top: 1px solid var(--divider);
        }
        .sqf-total-amt { width: auto; }
        .sqf-total .input-amount-huge { width: auto; font-size: 38px; border-bottom: none; padding: 0; margin: 0; }
        .sqf-total .amount-currency { position: static; margin-right: 10px; }
        /* the preview's two asset toggles are a segmented control, not full-width */
        .sqf-doc-toggles { align-self: flex-start; margin-bottom: 18px; }
        .sqf-doc-toggles .btn-pill { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 5px; }
        .sqf-doc-toggles .material-icons { font-size: 15px; }
        .sqf-doclib { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 16px; }

        /* DOCUMENT sheet — real paper, always white in both themes. On the
           Documents beat it sits on a warm field so it reads as paper on a desk
           rather than a card on a card. */
        .sqf-surface--desk { background: #e9e6df; }
        html.demo-dark .sqf-surface--desk { background: #2a2823; }
        .ai-paper {
            background: #fff; color: #18181B;
            border-radius: 6px; padding: 20px 18px 46px;
            box-shadow: var(--shadow-3);
            display: flex; flex-direction: column; gap: 9px;
            position: relative; overflow: hidden;
        }
        /* the foot must clear the signature AND the chop — they sit over the sheet,
           not in the flow, so the padding is what keeps them off the total line */
        .ai-paper--sheet { padding: 30px 30px 132px; gap: 12px; }
        .ai-paper--sheet .ai-paper-mark { font-size: 20px; }
        .ai-paper--sheet .ai-paper-no { font-size: 11px; }
        .ai-paper--sheet .ai-paper-to { font-size: 15px; }
        .ai-paper--sheet .ai-paper-line { font-size: 12.5px; }
        .ai-paper--sheet .ai-paper-total b { font-size: 26px; }
        .ai-paper-top { display: flex; align-items: baseline; justify-content: space-between; }
        .ai-paper-mark { font-size: 15px; font-weight: 760; letter-spacing: -0.02em; }
        .ai-paper-kind { font-size: 8.5px; letter-spacing: 0.14em; text-transform: uppercase; font-weight: 600; color: #8a8a93; }
        .ai-paper-no { font-size: 10px; letter-spacing: 0.06em; color: #8a8a93; }
        .ai-paper-to { font-size: 13px; font-weight: 600; }
        .ai-paper-rule { height: 1px; background: #e4e4e8; }
        .ai-paper-line { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; font-size: 11px; }
        .ai-paper-line b { font-weight: 600; }
        .ai-paper-line--dim { color: #8a8a93; }
        .ai-paper-total { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
        .ai-paper-total .cf-cap { font-size: 8.5px; color: #8a8a93; }
        .ai-paper-total b { font-size: 19px; font-weight: 760; letter-spacing: -0.01em; }
        /* the studio's actual signature and chop, the same two files the PDF uses */
        .ai-paper-sign { position: absolute; left: 30px; bottom: 26px; width: 132px; opacity: 0.9; }
        .ai-paper-stamp { position: absolute; right: 26px; bottom: 14px; width: 88px; opacity: 0.88; transform: rotate(-9deg); }

        /* THE HUMAN PASS — the rule all four flows share, stated once with the
           real Save pill beside it. A recessed strip, not another card. */
        .sqf-pass {
            display: flex; align-items: center; gap: 22px; flex-wrap: wrap;
            margin-top: 82px; padding: 24px 28px;
            background: var(--bg-main, #F4F4F5); border-radius: 20px;
        }
        /* in dark, --bg-main sits within a hair of the page — the quiet field
           would vanish, so it takes the same lifted tint the .bt tiles use */
        html.demo-dark .sqf-pass { background: rgba(255, 255, 255, 0.05); }
        .sqf-pass-ico {
            flex: 0 0 auto; width: 42px; height: 42px; border-radius: 50%;
            display: inline-flex; align-items: center; justify-content: center;
            background: var(--bg-card, #fff); color: var(--ink, #18181B);
            box-shadow: var(--shadow-3);
        }
        .sqf-pass-ico .material-icons { font-size: 21px; }
        .sqf-pass-say { flex: 1 1 300px; min-width: 0; }
        .sqf-pass-btn {
            flex: 0 0 auto; padding: 13px 26px; cursor: default;
            border-radius: var(--radius-pill, 999px);
        }
        .sqf-pass-btn .material-icons { font-size: 19px; }

        /* a STATIC pill rail — the real chip row, no scrolling, no glider. Real
           account names overrun a 480px rail, so the trailing chip fades out
           instead of being cut: the same "it continues" signal the app's own
           scrolling chip rail gives. */
        .qa-acc-pills-static {
            display: flex; gap: 6px; flex-wrap: nowrap; overflow: hidden;
            -webkit-mask-image: linear-gradient(90deg, #000 84%, transparent 100%);
            mask-image: linear-gradient(90deg, #000 84%, transparent 100%);
        }
        .qa-acc-pills-static .qa-acc-pill {
            flex: 0 0 auto; padding: 8px 13px; font-size: 11.5px;
            background: var(--bg-main); color: var(--text-muted);
            border: none; border-radius: var(--radius-pill, 999px);
            font-weight: var(--fw-semibold, 600); white-space: nowrap;
        }
        .qa-acc-pills-static .qa-acc-pill.active { background: var(--text-main); color: var(--bg-card); }

        /* the spine is a desktop device; below it the beat stacks and the step
           number simply leads the copy */
        @media (max-width: 1000px) {
            .sqf-beat { grid-template-columns: minmax(0, 1fr); }
            .sqf-beat + .sqf-beat { margin-top: 58px; }
            .sqf-spine { margin-bottom: 10px; }
            .sqf-spine::after { display: none; }
            .sqf-say { margin-bottom: 24px; }
            .sqf-lede { margin-bottom: 42px; }
        }
        @media (max-width: 700px) {
            /* four tabs cannot sit on one phone line — the row scrolls sideways,
               which is what the app's own filter rails do */
            .sqf-tabbar { justify-content: flex-start; overflow-x: auto; scrollbar-width: none; margin-inline: calc(50% - 50vw); padding-inline: calc(50vw - 50%); }
            .sqf-tabbar::-webkit-scrollbar { display: none; }
            .sqf-tabs { flex: 0 0 auto; }
            .sqf-tabs .btn-pill { padding: 10px 18px; font-size: 13px; }
            .sqf-lede { font-size: 15.5px; }
            .sqf-surface { padding: 18px; border-radius: 16px; }
            .sqf-surface--desk { padding: 14px; }
            .ai-paper--sheet { padding: 22px 20px 92px; }
            .sqf-pass { padding: 20px; gap: 16px; margin-top: 62px; }
        }
        /* ---- live-code REPLICAS of the real modules inside each AI card ----
           (the Overview AI drop card · the Quick-Add hub tabs · the header
           ask-field · a statement match). Token surfaces → theme-reactive. */
        .ai-live {
            position: relative; z-index: 1; display: flex; flex-direction: column; gap: 12px;
            padding: 18px; border-radius: 16px; font-variant-numeric: tabular-nums;
            background: var(--card); border: 1px solid var(--divider); box-shadow: var(--shadow-3);
        }
        /* (the Ask-AI card was removed with the deck — the header ask field it
           mirrored is gone from the app too.) */

        /* bank statement lines finding their entries */
        .alb-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; }
        .alb-row + .alb-row { border-top: 1px solid var(--divider); padding-top: 12px; }
        .alb-main { flex: 1; min-width: 140px; display: flex; flex-direction: column; gap: 1px; }
        .alb-main b { font-size: 12px; font-weight: 600; letter-spacing: 0.02em; color: var(--ink); }
        .alb-main span { font-size: 11px; color: var(--muted); }
        .alb-amt { font-size: 13.5px; font-weight: 700; color: var(--ink); }
        .alb-chip { display: inline-flex; align-items: center; gap: 4px; font-size: 10.5px; font-weight: 600; color: var(--muted); background: var(--paper); padding: 3px 9px; border-radius: var(--radius-pill); white-space: nowrap; }
        .alb-chip--ok { color: #067a44; background: rgba(1, 235, 114, 0.16); }
        html.demo-dark .alb-chip--ok { color: #6df2b6; background: rgba(1, 235, 114, 0.14); }

        /* ============================================================
           4 · TRUST — security & sophisticated accounting. Left: a classic
           T-account trial balance (double-ruled totals, green Balanced pill).
           Right: a vault of concentric rings around a lock + guarantee chips.
           ============================================================ */
        .trust-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; align-items: stretch; }
        .trust-tile {
            display: flex; flex-direction: column; padding: 28px; border-radius: 20px;
            background: rgba(255, 255, 255, 0.85);
            -webkit-backdrop-filter: blur(20px) saturate(140%); backdrop-filter: blur(20px) saturate(140%);
            border: 1px solid rgba(255, 255, 255, 0.55); box-shadow: var(--shadow-2);
        }
        .trust-t { margin: 0 0 6px; font-size: 21px; font-weight: 760; letter-spacing: -0.01em; color: var(--ink); }
        .trust-d { margin: 0 0 22px; font-size: 14.5px; line-height: 1.5; color: var(--muted); max-width: 46ch; }

        .ta { margin-top: auto; font-variant-numeric: tabular-nums; }
        .ta-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
        .ta-title { font-size: 11px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); }
        .ta-badge { font-size: 11.5px; font-weight: 600; color: #067a44; background: rgba(1, 235, 114, 0.16); padding: 3px 10px; border-radius: var(--radius-pill); }
        html.demo-dark .ta-badge { color: #6df2b6; background: rgba(1, 235, 114, 0.14); }
        .ta-cols, .ta-row, .ta-total { display: grid; grid-template-columns: 1.6fr 1fr 1fr; gap: 10px; align-items: baseline; }
        .ta-cols { font-size: 10.5px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); padding-bottom: 6px; border-bottom: 1px solid var(--divider-strong); }
        .ta-cols span:nth-child(n+2), .ta-row span:nth-child(n+2), .ta-total span:nth-child(n+2) { text-align: right; }
        .ta-row { padding: 8px 0; border-bottom: 1px solid var(--divider); font-size: 13.5px; color: var(--muted); }
        .ta-row span:nth-child(n+2) { color: var(--ink); font-weight: 600; }
        .ta-total { padding-top: 10px; font-size: 14px; font-weight: 700; color: var(--ink); }
        /* the accountant's double rule under the totals */
        .ta-total span:nth-child(n+2) { border-bottom: 3px double var(--ink); padding-bottom: 3px; }

        .vault { position: relative; margin-top: auto; height: 210px; display: flex; align-items: center; justify-content: center; }
        .vault-rings { position: relative; width: 200px; height: 200px; display: flex; align-items: center; justify-content: center; }
        .vault-rings::before, .vault-rings::after, .vault-rings .vault-ring3 {
            content: ''; position: absolute; border-radius: 50%; border: 1px solid rgba(17, 19, 28, 0.14);
        }
        .vault-rings::before { inset: 0; border-color: rgba(17, 19, 28, 0.06); }
        .vault-rings::after { inset: 28px; border-color: rgba(17, 19, 28, 0.10); }
        .vault-rings .vault-ring3 { inset: 56px; border-color: rgba(17, 19, 28, 0.16); }
        .vault-emoji { font-size: 48px; line-height: 1; filter: drop-shadow(0 8px 18px rgba(17, 19, 28, 0.2)); }
        html.demo-dark .vault-rings::before { border-color: rgba(255, 255, 255, 0.08); }
        html.demo-dark .vault-rings::after { border-color: rgba(255, 255, 255, 0.13); }
        html.demo-dark .vault-rings .vault-ring3 { border-color: rgba(255, 255, 255, 0.20); }
        .vault-chips { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-top: 14px; }
        .vault-chips span { font-size: 12px; font-weight: 600; color: var(--ink); background: var(--paper); padding: 6px 12px; border-radius: var(--radius-pill); white-space: nowrap; }
        html.demo-dark .trust-tile { background: rgba(255, 255, 255, 0.05); border-color: rgba(255, 255, 255, 0.10); }
        html.demo-dark .vault-chips span { background: rgba(255, 255, 255, 0.08); }

        /* home sections — responsive */
        @media (max-width: 900px) {
            .gallery { grid-template-columns: repeat(2, 1fr); }
            .g-chart, .g-act { grid-column: span 2; grid-row: auto; }
            .g-kpi { grid-column: span 2; }
            .g-run, .g-donut, .g-pdoc { grid-column: span 1; }
            .trust-grid { grid-template-columns: 1fr; }
        }
        @media (max-width: 560px) {
            .gallery { grid-template-columns: 1fr; }
            .g-run, .g-donut, .g-pdoc { grid-column: span 1; }
        }

        /* ---- legal pages (Privacy / Terms) — a calm document over the scene ---- */
        .legal-hero { padding-top: 20px; }
        .legal-eyebrow { margin: 0 0 12px; font-size: 12.5px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
        .legal-stack { max-width: 780px; }
        .legal-link { color: var(--ink); font-weight: var(--fw-semibold); text-decoration: underline; text-underline-offset: 2px; }

        /* ---- PLAIN DOCUMENT — the actual Privacy Policy / Terms ------------------
           A legal document is not a marketing page. It is read in order, cited by
           section number, quoted in correspondence and quite often printed — so it gets
           document typography, not product typography: one measured column, numbered
           headings, a hairline between sections, and nothing decorative. The frosted
           boards and emoji that used to carry this content made a contract look like a
           feature list. */
        .legal-doc { max-width: 720px; }
        .legal-doc > * + * { margin-top: 0; }                     /* .site-stack's rhythm off — sections own their spacing */
        /* effective date · version · scope — the header every such document opens with */
        .legal-meta {
            margin: 0 0 var(--space-8); padding: 0 0 var(--space-6);
            border-bottom: 1px solid var(--divider-strong);
            font-size: var(--text-sm); line-height: 1.7; color: var(--muted);
        }
        .legal-meta b { color: var(--ink); font-weight: var(--fw-semibold); }
        /* a note that is ABOUT the document rather than part of it */
        .legal-note {
            margin: 0 0 var(--space-8); padding: 12px 16px;
            border-left: 2px solid var(--divider-strong);
            font-size: var(--text-sm); line-height: 1.6; color: var(--muted);
        }
        /* --space-7 does not exist in the scale (it jumps 6 → 8); using it silently
           resolved to 0 and collapsed every section into the one above it. */
        .legal-sec { padding-top: var(--space-8); margin-top: var(--space-8); border-top: 1px solid var(--divider); }
        .legal-sec:first-of-type { padding-top: 0; margin-top: 0; border-top: 0; }
        .legal-sec h2 {
            margin: 0 0 var(--space-4);
            font-size: var(--text-lg); font-weight: var(--fw-semibold);
            letter-spacing: normal; line-height: 1.3; color: var(--ink);
        }
        .legal-sec h3 {
            margin: var(--space-6) 0 var(--space-3);
            font-size: var(--text-base); font-weight: var(--fw-semibold); color: var(--ink);
        }
        .legal-sec p { margin: 0 0 1.05em; font-size: var(--text-base); line-height: 1.62; color: var(--muted); }
        .legal-sec p:last-child, .legal-sec ul:last-child { margin-bottom: 0; }
        .legal-sec ul { margin: 0 0 1.05em; padding-left: 1.25em; }
        .legal-sec li { margin: 0 0 0.5em; font-size: var(--text-base); line-height: 1.62; color: var(--muted); }
        .legal-sec li:last-child { margin-bottom: 0; }
        .legal-sec strong, .legal-sec b { color: var(--ink); font-weight: var(--fw-semibold); }
        .legal-sec a { color: var(--ink); text-decoration: underline; text-underline-offset: 2px; }
        /* the closing line — how the document signs off */
        .legal-end {
            margin-top: var(--space-8); padding-top: var(--space-6);
            border-top: 1px solid var(--divider-strong);
            font-size: var(--text-sm); line-height: 1.6; color: var(--muted); font-style: italic;
        }
        /* IT GETS PRINTED. Terms are saved to PDF and attached to emails, so the scene,
           the chrome and the page furniture come off and the column takes the paper. */
        @media print {
            #auth-bg, .scene-grain, .auth-topbar, .site-footer, #starfield { display: none !important; }
            body.site { background: #fff !important; }
            .legal-doc, .legal-stack { max-width: none; }
            .legal-sec { break-inside: avoid; }
            .legal-sec p, .legal-sec li, .legal-meta, .legal-end { color: #000; }
        }

        /* ============================================================
           PRE-LOGIN FOOTER — flat, typographic, theme-aware. Full-bleed frosted
           band with a hairline top rule; brand + four link columns, fine-print bar.
           ============================================================ */
        .site-footer {
            position: relative; z-index: 1; margin-top: 40px;
            border-top: 1px solid var(--divider);
            background: rgba(255, 255, 255, 0.55);
            -webkit-backdrop-filter: blur(18px) saturate(140%); backdrop-filter: blur(18px) saturate(140%);
        }
        .site-footer-inner { max-width: calc(1200px + var(--space-10) * 2); margin: 0 auto; padding: 56px var(--space-10) 30px; }
        .site-footer-top {
            display: grid; grid-template-columns: 1.6fr 1.4fr; gap: 48px;
            padding-bottom: 40px; border-bottom: 1px solid var(--divider);
        }
        .site-footer-mark { display: inline-block; font-size: 20px; font-weight: 760; letter-spacing: -0.01em; color: var(--ink); text-decoration: none; }
        .site-footer-mark span { color: var(--muted); font-weight: 460; }
        .site-footer-tagline { margin: 14px 0 0; font-size: 14px; line-height: 1.6; color: var(--muted); max-width: 340px; }
        .site-footer-cta { display: flex; align-items: center; gap: 16px; margin: 22px 0 0; flex-wrap: wrap; }
        .site-footer-btn {
            display: inline-flex; align-items: center; padding: 9px 18px; border-radius: 999px;
            background: var(--ink); color: #fff; font-size: 13.5px; font-weight: 600; text-decoration: none;
            box-shadow: 0 2px 8px rgba(var(--shadow-tint), 0.20), inset 0 1px 0 rgba(255, 255, 255, 0.18);
            transition: transform 0.16s ease;
        }
        .site-footer-btn:hover { transform: translateY(-1px); }
        .site-footer-link-demo { font-size: 13.5px; font-weight: 600; color: var(--ink); text-decoration: none; opacity: 0.72; transition: opacity 0.16s ease; }
        .site-footer-link-demo:hover { opacity: 1; text-decoration: underline; text-underline-offset: 3px; }
        .site-footer-social { display: flex; gap: 12px; margin: 24px 0 0; }
        .site-footer-social a {
            display: flex; align-items: center; justify-content: center; width: 34px; height: 34px;
            border-radius: 50%; border: 1px solid var(--divider-strong); color: var(--muted);
            transition: color 0.16s ease, border-color 0.16s ease, transform 0.16s ease;
        }
        .site-footer-social a:hover { color: var(--ink); border-color: var(--ink); transform: translateY(-1px); }
        .site-footer-social svg { width: 16px; height: 16px; display: block; }
        .site-footer-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; }
        .site-footer-col h4 { margin: 0 0 14px; font-size: 11.5px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
        .site-footer-col a { display: block; margin: 0 0 11px; font-size: 14px; font-weight: 460; color: var(--ink); text-decoration: none; opacity: 0.78; transition: opacity 0.15s ease; }
        .site-footer-col a:hover { opacity: 1; text-decoration: underline; text-underline-offset: 3px; }
        .site-footer-bottom { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-top: 24px; font-size: 12.5px; color: var(--muted); flex-wrap: wrap; }

        /* ---- DARK: surfaces + inverted pills that DON'T ride the --ink/--muted/--card
             tokens (hardcoded-white boards & tiers, ink-bg buttons, hovers, hero scrim,
             frosted footer). The token-based marketing text/borders already auto-flip. ---- */
        html.demo-dark .site-board { background: rgba(255, 255, 255, 0.045); border-color: rgba(255, 255, 255, 0.10); }
        html.demo-dark .tier { background: rgba(255, 255, 255, 0.045); border-color: rgba(255, 255, 255, 0.10); }
        html.demo-dark .tier.featured {
            background:
                radial-gradient(120% 80% at 15% 0%, rgba(255, 201, 228, 0.12), rgba(255, 201, 228, 0) 55%),
                radial-gradient(120% 80% at 100% 100%, rgba(201, 240, 255, 0.14), rgba(201, 240, 255, 0) 55%),
                rgba(255, 255, 255, 0.08);
            border-color: rgba(255, 255, 255, 0.55);
        }
        html.demo-dark .site-btn-dark { color: #09090B; }        /* bg is already light via --ink */
        html.demo-dark .site-footer-btn { color: #09090B; }
        html.demo-dark .tier-badge { color: #09090B; }
        html.demo-dark .bill-opt.active { color: #09090B; }
        html.demo-dark .wl-role.selected { color: #09090B; }
        html.demo-dark .note-item:hover { background: rgba(255, 255, 255, 0.05); }
        html.demo-dark .site-modal-close:hover { background: rgba(255, 255, 255, 0.08); }
        html.demo-dark .site-hero::before { background: radial-gradient(125% 92% at 28% 38%, rgba(20, 22, 30, 0.55), rgba(20, 22, 30, 0) 72%); }
        html.demo-dark .site-footer { background: rgba(255, 255, 255, 0.028); }

        @media (max-width: 1120px) { .bar-ask { display: none; } }
        @media (max-width: 900px) {
            .site-footer-top { grid-template-columns: 1fr; gap: 34px; }
            .site-footer-cols { grid-template-columns: repeat(2, 1fr); gap: 24px; }
        }
        @media (max-width: 720px) {
            .bar-lang { display: none; }
            .zen-slogan-l1, .zen-slogan-l2 { font-size: 26px; }
            .site-footer-inner { padding: 44px 18px 26px; }
            .site-footer-bottom { flex-direction: column; align-items: flex-start; gap: 8px; }
        }
        @media (max-width: 460px) {
            .site-footer-cols { grid-template-columns: 1fr; }
        }

        /* Liquid-glass refraction — lens the flowing backdrop at the glass
           surface (Chromium); falls back to plain blur elsewhere. */
        /* (Login pill + chip are now FLAT white — no glass refraction. The card
           mode, used by setup / signed-out, keeps its glass.) */
        @supports (backdrop-filter: url('#liquid-glass')) or (-webkit-backdrop-filter: url('#liquid-glass')) {
            .auth-card { backdrop-filter: blur(40px) saturate(200%) brightness(1.08) url('#liquid-glass');
                         -webkit-backdrop-filter: blur(40px) saturate(200%) brightness(1.08) url('#liquid-glass'); }
        }

        /* ============================================================
           Account onboarding wizard — bare mode, a light Swiss document
           card over the 3D scene. Scoped under .ob so it overrides the
           global dark-glass input/button/h1 styles from card mode.
           Effortless: one-tap auto-advancing type cards, height-morphing
           step transitions, numeric progress, a finish flourish.
           ============================================================ */
        .zen-wrap:has(.ob) { align-items: flex-start; overflow-y: auto; }
        .ob {
            pointer-events: auto; position: relative; z-index: 1;
            width: min(468px, calc(100vw - 36px));
            margin: 116px auto 56px;
            max-height: calc(100vh - 150px); overflow-y: auto;
            padding: var(--space-8) var(--space-8) var(--space-6);
            background: rgba(255, 255, 255, 0.94);
            -webkit-backdrop-filter: blur(24px) saturate(150%);
            backdrop-filter: blur(24px) saturate(150%);
            border: 1px solid rgba(255, 255, 255, 0.65);
            border-radius: var(--radius-board);
            box-shadow: var(--shadow-3);
            color: var(--ink); text-align: left;
            animation: obCardIn 0.55s cubic-bezier(0.16, 1, 0.3, 1) both;
        }
        @keyframes obCardIn { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }

        /* progress — two thin segments + tabular numeral */
        .ob-progress { display: flex; align-items: center; gap: 8px; margin: 0 0 var(--space-6); }
        .ob-prog-seg { height: 3px; width: 26px; border-radius: var(--radius-pill); background: var(--divider-strong); transition: background 0.4s ease; }
        .ob-prog-seg.on { background: var(--ink); }
        .ob-prog-num { margin-left: auto; font-size: 12px; font-weight: var(--fw-medium); letter-spacing: var(--tracking-wide); color: var(--muted); font-variant-numeric: tabular-nums; }
        .ob-prog-num b { font-weight: var(--fw-bold); color: var(--ink); }

        .ob-eyebrow { font-size: var(--text-sm); font-weight: var(--fw-medium); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--muted); margin: 0 0 var(--space-3); }
        .ob .ob-h { font-family: var(--font-sans); font-weight: var(--fw-bold); font-size: var(--text-xl); letter-spacing: var(--tracking-display); line-height: var(--leading-tight); color: var(--ink); margin: 0 0 var(--space-2); text-align: left; }
        .ob-sub { font-size: var(--text-base); line-height: var(--leading-normal); color: var(--muted); margin: 0 0 var(--space-6); }

        /* step machine — absolutely stacked panes, height morphs between them */
        .ob-steps { position: relative; transition: height 0.42s cubic-bezier(0.16, 1, 0.3, 1); }
        .ob-step { position: absolute; top: 0; left: 0; width: 100%; display: none; }
        .ob-step.active { display: block; }
        .ob.anim-fwd  .ob-step.active { animation: obStepIn 0.42s cubic-bezier(0.16, 1, 0.3, 1) both; }
        .ob.anim-back .ob-step.active { animation: obStepInBack 0.42s cubic-bezier(0.16, 1, 0.3, 1) both; }
        @keyframes obStepIn     { from { opacity: 0; transform: translateX(22px); }  to { opacity: 1; transform: none; } }
        @keyframes obStepInBack { from { opacity: 0; transform: translateX(-22px); } to { opacity: 1; transform: none; } }

        .ob-group + .ob-group { margin-top: var(--space-5); }
        .ob-group-label { font-size: 11px; font-weight: var(--fw-semibold); letter-spacing: var(--tracking-caps); text-transform: uppercase; color: var(--muted); margin: 0 0 10px; }
        .ob-chips { display: flex; flex-direction: column; gap: var(--space-2); }
        .ob-chip {
            display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
            width: 100%; margin: 0; padding: 14px 16px; cursor: pointer; text-align: left;
            background: var(--card); border: 1px solid var(--divider-strong); border-radius: var(--radius-md);
            box-shadow: none; transition: border-color 0.16s ease, transform 0.16s ease, box-shadow 0.16s ease;
        }
        .ob-chip:hover { border-color: var(--ink); transform: translateY(-1px); box-shadow: var(--shadow-2); }
        .ob-chip.selected { border-color: var(--ink); box-shadow: inset 0 0 0 2px var(--ink); transform: none; }
        .ob-chip-txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
        .ob-chip-name { font-size: var(--text-base); font-weight: var(--fw-semibold); color: var(--ink); }
        .ob-chip-desc { font-size: var(--text-sm); font-weight: var(--fw-regular); color: var(--muted); }
        .ob-chip-go { flex: 0 0 auto; font-size: 18px; font-weight: var(--fw-semibold); color: var(--ink); opacity: 0; transform: translateX(-6px); transition: opacity 0.16s ease, transform 0.16s ease; }
        .ob-chip:hover .ob-chip-go, .ob-chip.selected .ob-chip-go { opacity: 1; transform: none; }

        .ob .ob-label { display: block; font-size: 11px; font-weight: var(--fw-semibold); letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); margin: var(--space-4) 0 6px; }
        .ob-label.is-first, .ob-step > .ob-label:first-of-type { margin-top: 0; }
        .ob-label .ob-opt { text-transform: none; letter-spacing: 0; font-weight: var(--fw-regular); color: rgba(113, 113, 122, 0.7); margin-left: 4px; }
        .ob .ob-input {
            width: 100%; margin: 0; padding: 12px 14px;
            background: var(--card); border: 1px solid var(--divider-strong); border-radius: var(--radius-md);
            color: var(--ink); font-family: inherit; font-size: var(--text-base); outline: none;
            transition: border-color 0.15s ease, box-shadow 0.15s ease;
        }
        .ob .ob-input::placeholder { color: rgba(24, 24, 27, 0.36); }
        .ob .ob-input:focus { border-color: var(--ink); box-shadow: 0 0 0 3px rgba(17, 19, 28, 0.08); }

        .ob-members { display: flex; flex-direction: column; gap: var(--space-2); }
        .ob-member { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2); }
        .ob-add {
            width: auto; margin: 10px 0 0; padding: 8px 14px; cursor: pointer;
            background: transparent; border: 1px dashed var(--divider-strong); border-radius: var(--radius-pill);
            color: var(--muted); font-family: inherit; font-size: var(--text-sm); font-weight: var(--fw-semibold); box-shadow: none;
            transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
        }
        .ob-add:hover { background: var(--paper); color: var(--ink); border-color: var(--muted); transform: none; box-shadow: none; }

        .ob-foot { display: flex; gap: var(--space-2); align-items: center; margin-top: var(--space-8); }
        .ob .ob-finish {
            flex: 1; width: auto; margin: 0; padding: 14px 20px; cursor: pointer;
            background: var(--ink); color: #fff; border: 0; border-radius: var(--radius-pill);
            font-family: inherit; font-size: var(--text-base); font-weight: var(--fw-semibold);
            box-shadow: var(--shadow-2); transition: transform 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;
        }
        .ob .ob-finish:hover { transform: translateY(-1px); box-shadow: var(--shadow-3); }
        .ob .ob-finish.is-busy { opacity: 0.6; cursor: progress; transform: none; box-shadow: none; }
        .ob .ob-back {
            flex: 0 0 auto; width: auto; margin: 0; padding: 14px 18px; cursor: pointer;
            background: transparent; color: var(--muted); border: 0; border-radius: var(--radius-pill);
            font-family: inherit; font-size: var(--text-base); font-weight: var(--fw-semibold); box-shadow: none;
            transition: color 0.15s ease;
        }
        .ob .ob-back:hover { color: var(--ink); transform: none; box-shadow: none; }

        .ob-err {
            margin-top: var(--space-4); padding: 10px 12px; border-radius: var(--radius-sm);
            background: rgba(255, 15, 15, 0.10); border: 1px solid rgba(255, 15, 15, 0.3); color: #b91c1c; font-size: var(--text-sm);
        }

        /* finish flourish — covers the card on success, then we redirect */
        .ob-done {
            position: absolute; inset: 0; z-index: 2;
            display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
            background: rgba(255, 255, 255, 0.66); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px);
            border-radius: inherit; opacity: 0; pointer-events: none; transition: opacity 0.3s ease;
        }
        .ob.is-done .ob-done { opacity: 1; }
        .ob.is-done .ob-progress, .ob.is-done .ob-steps, .ob.is-done .ob-err { opacity: 0; transition: opacity 0.25s ease; }
        .ob-done-check {
            width: 52px; height: 52px; border-radius: 50%; color: #fff; background: var(--ink);
            display: flex; align-items: center; justify-content: center; margin-bottom: 8px;
            animation: obPop 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;
        }
        .ob-done-check svg { width: 26px; height: 26px; }
        .ob-done-h { font-size: var(--text-lg); font-weight: var(--fw-bold); color: var(--ink); }
        .ob-done-sub { font-size: var(--text-sm); color: var(--muted); }
        @keyframes obPop { 0% { opacity: 0; transform: scale(0.6); } 60% { transform: scale(1.08); } 100% { opacity: 1; transform: scale(1); } }

        @media (prefers-reduced-motion: reduce) {
            .ob, .ob-steps, .ob.anim-fwd .ob-step.active, .ob.anim-back .ob-step.active, .ob-done-check { animation: none !important; transition: none !important; }
        }
        @media (max-width: 520px) {
            .ob { margin-top: 96px; padding: var(--space-6) var(--space-5) var(--space-5); }
            .ob-member { grid-template-columns: 1fr; }
            .ob .ob-h { font-size: var(--text-lg); }
        }

        /* onboarding wizard DARK variant — the .ob card + chips/inputs use tokens (so
           text/borders auto-flip), but the card bg, placeholder, focus ring and the
           ink-bg finish pill are hardcoded light; override them for demo-dark. */
        html.demo-dark .ob { background: rgba(22, 24, 32, 0.82); border-color: rgba(255, 255, 255, 0.10); }
        html.demo-dark .ob .ob-input::placeholder { color: rgba(255, 255, 255, 0.38); }
        html.demo-dark .ob .ob-input:focus { box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.10); }
        html.demo-dark .ob .ob-finish { color: #09090B; }   /* --ink is light in dark → inverted pill */

        /* ============================================================
           Preview / tester mode — a badge on the signup card + a floating
           control bar on the onboarding wizard. Nothing is saved.
           ============================================================ */
        .prev-badge {
            display: inline-flex; align-items: center; gap: 7px;
            margin: 0 0 18px; padding: 6px 11px; border-radius: var(--radius-pill);
            background: rgba(255,255,255,0.10); border: 1px solid rgba(255,255,255,0.20);
            color: rgba(255,255,255,0.82); font-size: 10.5px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase;
        }
        .prev-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--success-green); box-shadow: 0 0 0 3px rgba(1,235,114,0.20); }

        .prev-bar {
            position: fixed; left: 50%; bottom: 22px; transform: translateX(-50%); z-index: 20;
            pointer-events: auto; display: flex; align-items: center; gap: 8px;
            padding: 7px 8px 7px 16px; border-radius: var(--radius-pill);
            background: rgba(17,19,28,0.92); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
            box-shadow: var(--shadow-3); color: #fff; max-width: calc(100vw - 24px);
            animation: obCardIn 0.5s cubic-bezier(0.16,1,0.3,1) both;
        }
        .prev-bar-dot { flex: 0 0 auto; width: 7px; height: 7px; border-radius: 50%; background: var(--success-green); box-shadow: 0 0 0 3px rgba(1,235,114,0.22); }
        .prev-bar-label { font-size: 12px; font-weight: 600; color: rgba(255,255,255,0.7); white-space: nowrap; margin-right: 4px; }
        .prev-bar-btn {
            width: auto; margin: 0; padding: 8px 13px; cursor: pointer; box-shadow: none;
            display: inline-flex; align-items: center; text-decoration: none; white-space: nowrap;
            background: rgba(255,255,255,0.13); color: #fff; border: 0; border-radius: var(--radius-pill);
            font-family: inherit; font-size: 12px; font-weight: 600; line-height: 1; transition: background 0.15s ease;
        }
        .prev-bar-btn:hover { background: rgba(255,255,255,0.24); transform: none; box-shadow: none; }
        @media (max-width: 520px) { .prev-bar-label { display: none; } }
