/* ==========================================================================
 * COZY MODE — "Warm Letter" theme
 * --------------------------------------------------------------------------
 * Activated only when <body data-ux-mode="cozy"> is set (see core/ux-mode.js).
 * Commits hard to an analog / letter-writing aesthetic: cream paper, navy
 * ink, warm earth shadows, generous spacing, and subtle paper grain. The
 * Fraunces-serif / Lexend-sans voice pairing this file was built around was
 * RETIRED 2026-07-30 — cozy now uses standard's Inter/Poppins, one size up.
 *
 * Scope rule: every selector starts with `[data-ux-mode="cozy"]` so
 * Standard mode is completely untouched.
 *
 * Typography: Fraunces (display/serif) + Lexend (body/sans) are
 * research-backed for warmth and aging-eye readability respectively.
 * ========================================================================== */

/* The Google Fonts @import for Fraunces + Lexend that used to sit here is GONE
   (2026-07-30). It was always redundant — both families are self-hosted via
   tokens.css -> fonts/fonts.css -> fraunces.css / lexend.css — so this was a
   render-blocking request to a third party for fonts we already serve. It is
   doubly pointless now that cozy uses standard's Inter/Poppins: `document.fonts`
   reports Lexend as never loaded on any page, and the only surviving Fraunces
   consumer is STANDARD mode's empire-scene.css (.empire-scene-tagline /
   .empire-panel-quote via `var(--font-serif, …)`), which the self-hosted faces
   cover.
   ⚠️ Do not "clean up" the self-hosted fraunces.css alongside this: standard
   mode still needs it. And do NOT remove the Cormorant Garamond import in
   fonts/fonts.css either — that family is NOT self-hosted and is still used by
   literal name in inline-legal.css and hero-video.css. */

/* --- Design tokens ------------------------------------------------------- */
[data-ux-mode="cozy"] {
    --cozy-paper:           #F7EFE0;   /* aged cream background */
    --cozy-paper-elevated:  #FFFBF2;   /* cards, lifted surfaces */
    --cozy-ink:             #1A2438;   /* primary text, navy-ink */
    --cozy-ink-muted:       #5A5540;   /* secondary text, warm graphite */
    --cozy-ink-faded:       rgba(26, 36, 56, 0.55);
    --cozy-rose:            #A8475F;   /* primary CTA — 5.63:1 w/ white (was #C66B6B, 3.67:1 → failed AA). 2026-05-17 token reconciliation. */
    --cozy-rose-dark:       #8F3A4F;   /* hover — 7.28:1 */
    --cozy-rose-soft:       #C66B6B;   /* old token retained as a non-CTA "blush" tint (chips/borders only — never CTA label bg) */
    --cozy-gold:            #B69763;   /* accent, dividers, flourish */
    --cozy-gold-soft:       rgba(182, 151, 99, 0.35);
    --cozy-sage:            #7E9777;   /* success, done state */
    --cozy-warm-shadow:     rgba(90, 60, 30, 0.10);
    --cozy-warm-shadow-lg:  rgba(90, 60, 30, 0.18);
    --cozy-border-hairline: 1px solid rgba(166, 130, 85, 0.20);
    --cozy-border-strong:   1px solid rgba(166, 130, 85, 0.45);
    --cozy-radius:          20px;
    --cozy-radius-lg:       28px;

    /* TYPEFACE: cozy uses the SAME families as standard mode, only larger
       (owner directive 2026-07-30: "should be the same font as standard but a
       bit larger"). Cozy used to introduce two extra families and mix them —
       'Fraunces' (a SERIF) for every heading/display surface and 'Lexend' (a
       different sans) for body — against standard's Poppins/Inter pair. Four
       families across two modes, with a serif/sans switch inside one theme, is
       what read as inconsistent.

       These four tokens are the single lever for that: ~77 rules across
       cozy-theme.css, app-shell.css, marketing.css and timeline-design.css all
       resolve their font-family through one of them, so re-pointing them here
       converts every one of those surfaces at once.

       `--font-serif` and `--font-body-cozy` are redefined *inside the cozy
       scope only*. This selector is the <html> element, so descendants inherit
       these values, while `:root` in tokens.css keeps the real serif for
       standard mode — nothing outside cozy changes. Do NOT "tidy" these into
       tokens.css `:root`; that would repaint standard mode too.

       Both standard stacks keep 'Noto Sans SC' ahead of the system font names,
       which is the QA R6 property (a system name earlier in the list
       short-circuits per-character CJK fallback and Chinese renders as tofu).
       Preserve that ordering in any future edit to --font-sans/--font-display. */
    --cozy-font-display:    var(--font-display);
    --cozy-font-body:       var(--font-sans);

    /* "A bit larger", not much larger. This token declared 20px against
       standard's 16px, but it never took effect on any app page: app-shell.css
       and marketing.css both load AFTER this file and set
       `[data-ux-mode="cozy"] body { font-size: 16px }` at identical
       specificity, so the later sheet won and cozy body text rendered at
       exactly the standard 16px. Those two rules now read this token instead,
       making it the one source of truth — so 17px is a real +1px lift on what
       users actually see, where 20px would have been a sudden +25% jump on
       every cozy page and risks the same overflow class that the nav hit. */
    --cozy-text-base:       17px;
    /* Kept at base+2, the relationship the original 20/22 pair encoded. While
       base was being overridden to 16px this sat 6px above body text rather
       than 2px, which is part of what looked uneven. */
    --cozy-text-lift:       19px;
    --cozy-text-hero:       42px;
    --cozy-text-display:    56px;
    --cozy-line-height:     1.75;
}

/* `--font-serif` and `--font-body-cozy` are the two font tokens that live in
   tokens.css `:root`, and cozy has to re-point BOTH to the standard families
   (~14 rules in app-shell.css / marketing.css / timeline-design.css resolve
   their font-family through them).
   ⚠️ This needs `html[…]` (0,1,1), NOT the bare `[data-ux-mode="cozy"]` (0,1,0)
   used above, and NOT a placement inside that block. `:root` is also (0,1,0),
   so an equal-specificity override only wins on source order — and BOTH
   `app-shell.css` (line 16) and `marketing.css` (line 15) `@import` tokens.css
   from their own top, which the cascade treats as inserted at that point. Since
   both sheets load AFTER this file, that re-import re-applies the `:root`
   defaults last and silently reverted these two tokens to Fraunces/Lexend.
   The tell was that the swap appeared to work on exactly the two pages that
   load neither sheet (wizard-templates, pricing) and nowhere else.
   Element+attribute beats `:root` regardless of source order, so do NOT
   "simplify" this back into the token block above. */
html[data-ux-mode="cozy"] {
    --font-serif:           var(--font-display);
    --font-body-cozy:       var(--font-sans);
}

/* Per-page inline stylesheets (user_profile_inline.css, wisdom.html,
   habits.html, pricing.html, progress.css, profile.css, etc.) redefine
   `--text-muted` / `--text-primary` / `--color-text-muted` on :root to
   dark-mode values like `rgba(248, 250, 252, 0.7)` or `#f8fafc`. Those
   inline definitions match `:root` (specificity 0,0,1) and cascade AFTER
   the external `cozy-theme.css`, so cozy's default tokens lose.

   Re-bind every page-level text-color variable to cozy ink at
   `:root[data-ux-mode="cozy"]` (specificity 0,0,2) so cozy wins
   regardless of load order. This is the single biggest fix for "light
   text can't be seen" — it rescues anything using
   `color: var(--text-muted, ...)`, which is the dominant pattern. */
:root[data-ux-mode="cozy"] {
    --text-primary:      #1A2438;
    --text-secondary:    #3A3E4E;
    --text-muted:        #5A5540;
    --text-main:         #1A2438;  /* used by user_profile_init.js inline styles */
    --color-text-muted:  #5A5540;
    --text-subtle:       rgba(26, 36, 56, 0.55);
    /* Panels/cards using these var names become cream paper instead of
       dark glass — otherwise dark backgrounds leak through the cozy
       surface. */
    --glass-bg:          #FFFBF2;
    --glass-border:      rgba(166, 130, 85, 0.22);
    --bg-card:           #FFFBF2;
    --bg-elevated:       #FFFBF2;
    --surface-card:      #FFFBF2;
    --card-bg:           #FFFBF2;
    --card-border:       rgba(166, 130, 85, 0.22);
    --border-color:      rgba(166, 130, 85, 0.22);
}

/* Loading skeletons use a dark-overlay bg built for the dark/standard theme; in
   cozy that rendered dark --text-muted text on a dark box (~1.3:1, round 44 a11y).
   Flip the surface to a cream tint so the muted text reads. Higher specificity
   than .loading, so it covers progress.css AND the habits.html inline rule. */
[data-ux-mode="cozy"] .loading {
    background: rgba(251, 245, 233, 0.88);
    border-color: rgba(166, 130, 85, 0.30);
    color: var(--text-muted);
}

/* --- Base surface -------------------------------------------------------- */
[data-ux-mode="cozy"] body,
[data-ux-mode="cozy"] {
    background: var(--cozy-paper);
    color: var(--cozy-ink);
    font-family: var(--cozy-font-body);
    font-size: var(--cozy-text-base);
    line-height: var(--cozy-line-height);
    font-weight: 400;
    letter-spacing: 0.005em;
}

/* Subtle paper grain behind everything — an inline SVG data URI so no extra
   network request. Opacity ~5% so it reads as texture, not noise. */
[data-ux-mode="cozy"] body::before {
    content: '';
    position: fixed;
    inset: 0;
    pointer-events: none;
    z-index: 0;
    opacity: 0.045;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='0.7'/></svg>");
}
/* Ensure body children stack above the ::before grain texture (z-index 0).
   Exclude elements that intentionally use position:fixed — overriding them
   to `position: relative` breaks the mobile bottom nav (pushed off-screen),
   the cookie banner, modals, and any toast/dialog layer. z-index alone is
   enough to raise the top-level sections above the texture; fixed elements
   already form their own stacking context. */
[data-ux-mode="cozy"] body > *:not(.mobile-bottom-nav):not(.cc-overlay):not([role="dialog"]):not(dialog):not(.modal):not(.toast):not(.top-nav):not(nav):not(.page-guide):not(#pageGuide) {
    position: relative;
    z-index: 1;
}
[data-ux-mode="cozy"] body > .mobile-bottom-nav,
[data-ux-mode="cozy"] body > .cc-overlay {
    z-index: 900;
}
/* The top nav must stack ABOVE the main content so its user-avatar
   dropdown (children at z-index: 31000) actually paints on top. Without
   this, nav+main were siblings at the same z-index: 1 — DOM order won
   and main (later in document) covered the dropdown, making every
   dropdown-item click pass through to the page underneath. */
[data-ux-mode="cozy"] body > .top-nav,
[data-ux-mode="cozy"] body > nav.top-nav {
    position: relative;
    z-index: 1000;
}

/* --- Typography ---------------------------------------------------------- */
[data-ux-mode="cozy"] h1,
[data-ux-mode="cozy"] h2,
[data-ux-mode="cozy"] h3,
[data-ux-mode="cozy"] h4 {
    font-family: var(--cozy-font-display);
    font-weight: 600;
    color: var(--cozy-ink);
    letter-spacing: -0.015em;
    line-height: 1.2;
}
[data-ux-mode="cozy"] h1 { font-size: var(--cozy-text-display); }
[data-ux-mode="cozy"] h2 { font-size: var(--cozy-text-hero); }
[data-ux-mode="cozy"] h3 { font-size: 28px; }
[data-ux-mode="cozy"] h4 { font-size: 22px; font-weight: 500; }

[data-ux-mode="cozy"] p {
    font-size: var(--cozy-text-base);
    line-height: var(--cozy-line-height);
}

/* The mobile menu overlay keeps its DARK surface in cozy, so cozy rose ink
   on it is warm ink on dark paper (3.02:1, 2026-08-03). Excluded here as
   well as on the :not() variant lower down — BOTH rules paint links, and
   fixing only one leaves the barer selector still winning. */
[data-ux-mode="cozy"] a:not(.mobile-nav-link):not(.mobile-action-link) {
    color: var(--cozy-rose);
    text-underline-offset: 4px;
    text-decoration-thickness: 1px;
}
[data-ux-mode="cozy"] a:hover { color: var(--cozy-rose-dark); }

/* --- Icons fix (root cause: stroke inherits background color) ------------ */
[data-ux-mode="cozy"] [data-icon] svg,
[data-ux-mode="cozy"] .mbn-icon svg,
[data-ux-mode="cozy"] .jac-icon svg,
[data-ux-mode="cozy"] .lucide {
    stroke: var(--cozy-ink);
    color: var(--cozy-ink);
    fill: none;
    stroke-width: 2;
    width: 1em;
    height: 1em;
    vertical-align: -0.15em;
}
[data-ux-mode="cozy"] .btn-primary [data-icon] svg,
[data-ux-mode="cozy"] button.primary [data-icon] svg,
[data-ux-mode="cozy"] .cozy-cta [data-icon] svg {
    stroke: var(--cozy-paper);
    color: var(--cozy-paper);
}

/* Journal capture cards (Just talk / Write / Photo + words) — the
   .jac-title / .jac-desc spans keep their tiny standard sizes (14px / 12px)
   and .jac-desc inherits a light --fg-muted, so the card text reads small
   and washed-out on cozy's cream cards. Pin to cozy ink + scale up to suit
   the cozy 20px base. */
[data-ux-mode="cozy"] .journal-action-card .jac-title {
    font-size: 18px !important;
    color: var(--cozy-ink, #1A2438) !important;
}
[data-ux-mode="cozy"] .journal-action-card .jac-desc {
    font-size: 15px !important;
    color: var(--cozy-ink-muted, #5A5540) !important;
}

/* --- Navigation --------------------------------------------------------- */
[data-ux-mode="cozy"] nav,
[data-ux-mode="cozy"] .main-navigation,
[data-ux-mode="cozy"] .top-nav {
    background: var(--cozy-paper-elevated);
    border-bottom: var(--cozy-border-hairline);
    box-shadow: 0 1px 0 var(--cozy-gold-soft);
}
[data-ux-mode="cozy"] nav a,
[data-ux-mode="cozy"] .nav-link {
    color: var(--cozy-ink);
    font-size: 18px;
    font-weight: 500;
    padding: 14px 18px;
}
/* QA R2: the broad `nav a` rule above (18px/14px) also matches the mobile
   .bottom-nav, blowing each tab label past its ~61px column so they overlapped
   ("Progres…ission…ForumJourna…"). Restore the compact bottom-nav sizing in
   cozy mode. Specificity (0,2,1) beats `[data-ux-mode] nav a` (0,1,2). */
[data-ux-mode="cozy"] .bottom-nav a,
[data-ux-mode="cozy"] .bottom-nav button {
    font-size: 10px;
    padding: 6px 4px;
}
[data-ux-mode="cozy"] nav a:hover,
[data-ux-mode="cozy"] .nav-link:hover {
    color: var(--cozy-rose);
    background: rgba(198, 107, 107, 0.08);
    border-radius: 12px;
}
[data-ux-mode="cozy"] nav a .label,
[data-ux-mode="cozy"] .nav-link .label { margin-left: 8px; }

/* Brand / logo name */
[data-ux-mode="cozy"] .brand,
[data-ux-mode="cozy"] .logo-text {
    font-family: var(--cozy-font-display);
    color: var(--cozy-ink);
    font-size: 22px;
    font-weight: 600;
    letter-spacing: 0;
}

/* --- Cards / surfaces --------------------------------------------------- */
[data-ux-mode="cozy"] .card,
[data-ux-mode="cozy"] .panel,
[data-ux-mode="cozy"] .pricing-card,
[data-ux-mode="cozy"] .tip-panel,
[data-ux-mode="cozy"] .home-card,
[data-ux-mode="cozy"] .spirit-card,
[data-ux-mode="cozy"] .cozy-card {
    background: var(--cozy-paper-elevated);
    border: var(--cozy-border-hairline);
    border-radius: var(--cozy-radius);
    box-shadow: 0 6px 24px var(--cozy-warm-shadow), 0 1px 0 rgba(255,255,255,0.6) inset;
    padding: 32px;
    color: var(--cozy-ink);
}

[data-ux-mode="cozy"] .card h2,
[data-ux-mode="cozy"] .card h3,
[data-ux-mode="cozy"] .panel h2,
[data-ux-mode="cozy"] .panel h3 {
    margin-top: 0;
}

/* --- Buttons ------------------------------------------------------------ */
/* ⚠️ Anything NOT in these :not() lists gets 56px min-height + 28px horizontal
   padding + an 18px label. That is right for a real text button and wrong for
   every compact or icon-sized control, and this rule has broken three separate
   batches of them now: .btn-icon/.menu-btn (SVG flex-crushed to width:0, see
   below), .theme-toggle button ("Cozy" overflowed the sidebar, 2026-05-24), and
   the five added 2026-07-30 below. Found by hit-testing scrollWidth vs
   clientWidth in cozy at 390px and 1440px — the geometry is inflated in BOTH,
   but the clipping only becomes visible where space is tight.
     .composer-send        chat's Send pill (8px/14px, 12px label) — 23px clipped
                           at 390px, i.e. the primary action on the main surface
     .cozy-read-aloud-btn  48px circle, injected by chat_init.js — 9px, both
     .journal-search-clear 26px circle — 9px, both
     .month-glance-navbtn  26px circle — 4px, both
     .mobile-menu-close    48px square — 6px at 390px
     .pp-btn / .pp-dismiss Progress payoff receipt (payoff-card.css, 2026-09-04
                           §356 #8) — 28px dismiss circle + compact next-move pill;
                           the card also carries id-anchored overrides, this is the
                           at-source guard so a future edit cannot re-inflate them
   Excluded rather than re-sized here on purpose: each already has correct
   geometry in its own sheet (app-shell.css / navigation.css / journal-cards.css
   / month-glance.css / chat_init.js), which standard mode renders correctly.
   Duplicating those numbers into this file would just rot. Colour still needs
   cozy handling for the two that inherit a light-on-dark token — see the
   companion rule below.
   When adding a new compact/icon button anywhere, add it here too. */
[data-ux-mode="cozy"] .btn:not(.btn-icon):not(.menu-btn):not(.composer-send),
[data-ux-mode="cozy"] button:not(.pricing-toggle-switch):not(.close-btn):not(.icon-btn):not(.btn-icon):not(.menu-btn):not(.persona-btn):not(.tab-btn):not(.profile-nav-btn):not(.wiz-fav-star):not(.composer-send):not(.cozy-read-aloud-btn):not(.journal-search-clear):not(.month-glance-navbtn):not(.mobile-menu-close):not(.fb-cat):not(.pp-btn):not(.pp-dismiss),
[data-ux-mode="cozy"] .cozy-cta {
    min-height: 56px;
    padding: 14px 28px;
    font-size: 18px;
    font-family: var(--cozy-font-body);
    font-weight: 500;
    border-radius: 16px;
    border: var(--cozy-border-strong);
    background: var(--cozy-paper-elevated);
    color: var(--cozy-ink);
    cursor: pointer;
    transition: transform 180ms ease, box-shadow 220ms ease, background 180ms ease;
    box-shadow: 0 4px 12px var(--cozy-warm-shadow);
}
/* Same exclusions as the geometry rule above — a 20px shadow bloom sized for a
   56px text button looks wrong under a 26px circle. */
[data-ux-mode="cozy"] .btn:not(.btn-icon):not(.menu-btn):not(.composer-send):hover,
[data-ux-mode="cozy"] button:not(.pricing-toggle-switch):not(.close-btn):not(.icon-btn):not(.btn-icon):not(.menu-btn):not(.persona-btn):not(.tab-btn):not(.profile-nav-btn):not(.wiz-fav-star):not(.composer-send):not(.cozy-read-aloud-btn):not(.journal-search-clear):not(.month-glance-navbtn):not(.mobile-menu-close):hover {
    transform: translateY(-1px);
    box-shadow: 0 8px 20px var(--cozy-warm-shadow-lg);
}

/* Companion to the exclusions above: two of those controls colour themselves
   from tokens that assume a DARK surface — .journal-search-clear and
   .month-glance-navbtn both use `var(--fg-muted, #94a3b8)`, and
   .mobile-menu-close uses `var(--nav-text)`. Excluding them from the cozy
   text-button rule restores their geometry but leaves that light-grey glyph on
   cream paper. Re-ink them (geometry deliberately untouched — it is correct in
   their own sheets). */
[data-ux-mode="cozy"] .journal-search-clear,
[data-ux-mode="cozy"] .month-glance-navbtn,
[data-ux-mode="cozy"] .mobile-menu-close {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .month-glance-navbtn {
    border-color: var(--cozy-gold-soft) !important;
}

/* Icon-only buttons (.btn-icon, .menu-btn — e.g. the journal topbar menu /
   bell / settings) are excluded from the text-button rule above: its
   14px/28px padding put 56px of horizontal padding on a ~44px button, which
   flex-crushed the SVG to width:0 and made the icon vanish in cozy. Give
   them compact icon-button geometry and a hard-sized, cozy-ink SVG. */
[data-ux-mode="cozy"] .btn-icon,
[data-ux-mode="cozy"] .menu-btn {
    min-height: 44px !important;
    min-width: 44px !important;
    width: 44px !important;
    height: 44px !important;
    padding: 10px !important;
    border-radius: 12px !important;
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    color: var(--cozy-ink) !important;
    box-shadow: 0 2px 6px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .btn-icon svg,
[data-ux-mode="cozy"] .menu-btn svg {
    width: 22px !important;
    height: 22px !important;
    flex: 0 0 auto !important;
    stroke: var(--cozy-ink) !important;
    color: var(--cozy-ink) !important;
}

/* The sidebar Standard/Cozy mode toggle is a 2-up segmented control whose two
   <button>s carry no excluding class, so the cozy text-button rule above
   (min-height:56px / padding:14px 28px / 18px) bloated them and the grid blew
   out — the "Cozy" option overflowed the sidebar and was clipped (reported
   2026-05-24). Restore the compact toggle geometry from app-shell.css.
   !important is required to beat that rule's high :not()-chain specificity. */
[data-ux-mode="cozy"] .theme-toggle button {
    /* 44px tap target (§15.3) — height-only; the 2026-05-24 hazard was WIDTH
       (padding/font inflation clipping "Cozy"), which this does not touch. */
    min-height: 44px !important;
    padding: 7px 0 !important;
    font-size: 12px !important;
    font-weight: 500 !important;
    border: 0 !important;
    border-radius: 9px !important;
    background: transparent !important;
    box-shadow: none !important;
}
[data-ux-mode="cozy"] .theme-toggle button.active {
    background: var(--surface-2, #fffbf2) !important;
    box-shadow: var(--shadow-md) !important;
}

/* Primary CTA — the rose one */
[data-ux-mode="cozy"] .btn.primary,
[data-ux-mode="cozy"] .btn-primary,
[data-ux-mode="cozy"] button.primary,
[data-ux-mode="cozy"] button[type="submit"].primary,
[data-ux-mode="cozy"] .cozy-cta.primary {
    background: var(--cozy-rose);
    color: var(--cozy-paper);
    border-color: var(--cozy-rose);
    font-weight: 600;
}
[data-ux-mode="cozy"] .btn.primary:hover,
[data-ux-mode="cozy"] .btn-primary:hover,
[data-ux-mode="cozy"] button.primary:hover {
    background: var(--cozy-rose-dark);
    border-color: var(--cozy-rose-dark);
}

/* --- Big mic / voice button -------------------------------------------- */
[data-ux-mode="cozy"] .voice-input-btn,
[data-ux-mode="cozy"] [data-role="voice-btn"],
[data-ux-mode="cozy"] .cozy-mic {
    width: 88px !important;
    height: 88px !important;
    border-radius: 50% !important;
    background: var(--cozy-rose) !important;
    color: var(--cozy-paper) !important;
    border: none !important;
    font-size: 2rem !important;
    box-shadow: 0 12px 30px var(--cozy-warm-shadow-lg);
    animation: cozy-mic-pulse 3.2s ease-in-out infinite;
}
[data-ux-mode="cozy"] .voice-input-btn svg,
[data-ux-mode="cozy"] .cozy-mic svg {
    stroke: var(--cozy-paper);
    color: var(--cozy-paper);
}
@keyframes cozy-mic-pulse {
    0%, 100% { box-shadow: 0 12px 30px var(--cozy-warm-shadow-lg); }
    50%      { box-shadow: 0 16px 44px rgba(198, 107, 107, 0.35); }
}

/* --- Chat bubbles — the signature serif-for-iSpirit move --------------- */
[data-ux-mode="cozy"] .messages,
[data-ux-mode="cozy"] #messages {
    padding: 24px 16px 32px;
    gap: 20px;
}

/* User's own messages — sans, clean, right-aligned feel */
[data-ux-mode="cozy"] .row.user .bubble,
[data-ux-mode="cozy"] .message.user .bubble,
[data-ux-mode="cozy"] .user-message {
    font-family: var(--cozy-font-body);
    font-size: var(--cozy-text-lift);
    font-weight: 400;
    line-height: 1.65;
    background: var(--cozy-paper-elevated);
    color: var(--cozy-ink);
    border: var(--cozy-border-hairline);
    border-radius: 22px 22px 6px 22px;
    padding: 18px 24px;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow);
}

/* iSpirit's replies — serif, italicised, letter-from-a-devoted-creature */
[data-ux-mode="cozy"] .row.assistant .bubble,
[data-ux-mode="cozy"] .message.assistant .bubble,
[data-ux-mode="cozy"] .assistant-message,
[data-ux-mode="cozy"] .ai-message {
    font-family: var(--cozy-font-display);
    font-size: var(--cozy-text-lift);
    font-weight: 400;
    font-style: italic;
    line-height: 1.7;
    background: linear-gradient(180deg, #FFFBF2 0%, #FCF4E2 100%);
    color: var(--cozy-ink);
    border: 1px solid var(--cozy-gold-soft);
    border-radius: 22px 22px 22px 6px;
    padding: 20px 26px;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow);
}
/* Small gold flourish top-left of iSpirit bubbles to mark them as 'from your pet' */
[data-ux-mode="cozy"] .row.assistant .bubble::before,
[data-ux-mode="cozy"] .message.assistant .bubble::before,
[data-ux-mode="cozy"] .assistant-message::before {
    content: '❧';
    font-family: var(--cozy-font-display);
    font-style: normal;
    color: var(--cozy-gold);
    font-size: 18px;
    display: block;
    margin-bottom: 6px;
    line-height: 1;
}

/* Chat input area */
[data-ux-mode="cozy"] .composer,
[data-ux-mode="cozy"] #composer {
    background: var(--cozy-paper-elevated);
    border-top: var(--cozy-border-hairline);
    padding: 20px 24px;
    gap: 16px;
}
[data-ux-mode="cozy"] #text,
[data-ux-mode="cozy"] .composer textarea,
[data-ux-mode="cozy"] .chat-input {
    font-family: var(--cozy-font-body);
    font-size: var(--cozy-text-lift);
    color: var(--cozy-ink);
    background: var(--cozy-paper);
    border: var(--cozy-border-hairline);
    border-radius: 16px;
    padding: 16px 20px;
    line-height: 1.6;
    min-height: 56px;
}
[data-ux-mode="cozy"] #text::placeholder { color: var(--cozy-ink-faded); }

/* --- Spirit Baby / home surface focus ---------------------------------- */
/* Enlarge the avatar card so it dominates the viewport */
[data-ux-mode="cozy"] .room,
[data-ux-mode="cozy"] .spirit-room,
[data-ux-mode="cozy"] .spirit-avatar-card {
    max-width: 560px;
    margin: 0 auto 32px;
    padding: 0;
    border-radius: var(--cozy-radius-lg);
    overflow: hidden;
    background: var(--cozy-paper-elevated);
    border: var(--cozy-border-hairline);
    box-shadow: 0 14px 36px var(--cozy-warm-shadow-lg);
}

/* iSpirit nickname beneath avatar — Fraunces italic hero */
[data-ux-mode="cozy"] .baby-name,
[data-ux-mode="cozy"] .spirit-nickname,
[data-ux-mode="cozy"] .nickname {
    font-family: var(--cozy-font-display);
    font-style: italic;
    font-weight: 600;
    font-size: var(--cozy-text-hero);
    color: var(--cozy-ink);
    text-align: center;
    margin: 24px 0 8px;
    letter-spacing: -0.01em;
}

/* Stage pill chain: faded, minimal */
[data-ux-mode="cozy"] .stage-chain,
[data-ux-mode="cozy"] .stages {
    gap: 8px;
    justify-content: center;
    margin: 12px 0 28px;
}
[data-ux-mode="cozy"] .stage-chain .stage,
[data-ux-mode="cozy"] .stages .stage {
    font-family: var(--cozy-font-display);
    font-size: 13px;
    font-weight: 500;
    color: var(--cozy-ink-faded);
    padding: 4px 10px;
    border: 1px solid transparent;
    background: transparent;
}
[data-ux-mode="cozy"] .stage-chain .stage.active,
[data-ux-mode="cozy"] .stages .stage.active {
    color: var(--cozy-rose);
    border-color: var(--cozy-rose);
    border-radius: 999px;
    background: rgba(198, 107, 107, 0.07);
}

/* Hide the noisy widgets we don't want in cozy mode — mood picker row of
   empty icons, broken 940% progress bar, empty ghost cards. These elements
   are still present for Standard mode; we just remove them from cozy. */
[data-ux-mode="cozy"] .mood-picker-row,
[data-ux-mode="cozy"] .cec-credits-indicator,
[data-ux-mode="cozy"] .gamification-panel,
[data-ux-mode="cozy"] .xp-progress-bar {
    display: none !important;
}

/* Feed / Chat / Capture action trio — enlarge + warm */
[data-ux-mode="cozy"] .home-actions,
[data-ux-mode="cozy"] .action-cards {
    grid-template-columns: 1fr !important;
    gap: 16px !important;
    max-width: 560px;
    margin: 0 auto;
}
[data-ux-mode="cozy"] .home-actions .card,
[data-ux-mode="cozy"] .action-card {
    min-height: 92px;
    padding: 20px 28px;
    display: flex;
    align-items: center;
    gap: 18px;
    font-family: var(--cozy-font-display);
    font-size: 22px;
    font-weight: 500;
    color: var(--cozy-ink);
    background: var(--cozy-paper-elevated);
    border: var(--cozy-border-hairline);
    box-shadow: 0 6px 20px var(--cozy-warm-shadow);
    text-align: left;
}

/* Below-fold dividers — gold flourish */
[data-ux-mode="cozy"] hr,
[data-ux-mode="cozy"] .section-divider {
    border: none;
    height: 1px;
    background: linear-gradient(
        90deg,
        transparent 0%,
        var(--cozy-gold-soft) 30%,
        var(--cozy-gold) 50%,
        var(--cozy-gold-soft) 70%,
        transparent 100%
    );
    margin: 48px auto;
    max-width: 360px;
}

/* --- Migration notice bar — override inline styles with !important ----
   Scoped OFF #verifyNudge: the email-verification nudge (AppShell) also carries
   role="status" and was getting this gold→rose gradient + cream text while its
   own children kept navy ink → mixed text, ✕ ~1.8:1 in cozy (QA round 57).
   Scoped OFF .payoff-card too (2026-09-04, §356 #8): the Progress receipt is a
   paper card announced by aria-live; it dropped role="status" to escape this
   gradient, and if it ever carries the role again it must keep its paper. */
[data-ux-mode="cozy"] [role="status"]:not(#verifyNudge):not(.payoff-card) {
    background: linear-gradient(90deg, var(--cozy-gold), var(--cozy-rose)) !important;
    color: var(--cozy-paper) !important;
    font-family: var(--cozy-font-body) !important;
    font-size: 16px !important;
    padding: 14px 24px !important;
    box-shadow: 0 2px 10px var(--cozy-warm-shadow) !important;
}

/* Email-verification nudge in cozy: solid warm paper + dark ink (cozy Rule #16
   — solid paper, not gradient glass) so message, Resend, and ✕ all clear AA. */
[data-ux-mode="cozy"] #verifyNudge {
    background: var(--cozy-paper-elevated, #FFFBF2) !important;
    color: var(--cozy-ink, #1a2438) !important;
    border-bottom: 1px solid var(--cozy-gold, #B69763) !important;
}
[data-ux-mode="cozy"] #verifyNudge span { color: var(--cozy-ink, #1a2438) !important; }
[data-ux-mode="cozy"] #verifyNudge button[aria-label="Dismiss"],
[data-ux-mode="cozy"] #verifyNudge button[aria-label="关闭"] { color: var(--cozy-ink, #1a2438) !important; opacity: 0.85 !important; }

/* --- Real spirit-baby DOM — adapt to actual classes -------------------- */
/* The page uses .panel, .quick-reflect, .hbtns, .voice-btn, .home-card etc. */

/* Top back/header strip */
[data-ux-mode="cozy"] .sb-header {
    max-width: 720px;
    margin: 16px auto 8px;
    padding: 12px 20px;
    font-family: var(--cozy-font-display);
    font-size: 17px;
    color: var(--cozy-ink-muted);
    background: transparent;
    border: none;
}
[data-ux-mode="cozy"] .sb-header a {
    color: var(--cozy-ink-muted);
    text-decoration: none;
    padding: 6px 12px;
    border-radius: 10px;
    font-family: var(--cozy-font-body);
    font-size: 16px;
}
[data-ux-mode="cozy"] .sb-header a:hover {
    background: rgba(198, 107, 107, 0.08);
    color: var(--cozy-rose);
}

/* The hero room/avatar card — make it a prominent portrait */
[data-ux-mode="cozy"] .room {
    max-width: 560px;
    margin: 20px auto 24px;
    padding: 28px 24px 36px;
    border-radius: var(--cozy-radius-lg);
    background: linear-gradient(180deg, #FFFBF2 0%, #F7EFE0 100%);
    border: var(--cozy-border-hairline);
    box-shadow: 0 16px 40px var(--cozy-warm-shadow-lg);
    min-height: 420px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    position: relative;
    overflow: hidden;
}
[data-ux-mode="cozy"] .room::after {
    /* soft gold inner glow */
    content: '';
    position: absolute;
    inset: 0;
    background: radial-gradient(circle at 50% 35%, rgba(198, 107, 107, 0.06), transparent 65%);
    pointer-events: none;
}

/* Spirit name under the avatar — Fraunces italic hero */
[data-ux-mode="cozy"] .room + * + *,
[data-ux-mode="cozy"] .sp-name,
[data-ux-mode="cozy"] .room .name,
[data-ux-mode="cozy"] #spiritName {
    font-family: var(--cozy-font-display) !important;
    font-style: italic !important;
    font-size: var(--cozy-text-hero) !important;
    font-weight: 600 !important;
}

/* The white content panel */
[data-ux-mode="cozy"] .panel {
    background: var(--cozy-paper-elevated);
    border: var(--cozy-border-hairline);
    border-radius: var(--cozy-radius-lg) var(--cozy-radius-lg) 0 0;
    box-shadow: 0 -2px 20px var(--cozy-warm-shadow);
    padding: 36px 24px 32px;
    max-width: 640px;
    margin: 0 auto;
}

/* Mood picker — warm up the emoji buttons */
[data-ux-mode="cozy"] .quick-reflect {
    margin-bottom: 32px;
    text-align: center;
}
[data-ux-mode="cozy"] .qr-label {
    display: block;
    font-family: var(--cozy-font-display);
    font-style: italic;
    font-size: 22px;
    color: var(--cozy-ink-muted);
    margin-bottom: 16px;
}
[data-ux-mode="cozy"] .qr-moods {
    display: flex;
    justify-content: center;
    gap: 16px;
    flex-wrap: wrap;
}
[data-ux-mode="cozy"] .qr-mood {
    width: 62px !important;
    height: 62px !important;
    min-height: 62px !important;
    border-radius: 50% !important;
    background: var(--cozy-paper) !important;
    border: var(--cozy-border-hairline) !important;
    font-size: 30px !important;
    line-height: 1 !important;
    padding: 0 !important;
    cursor: pointer;
    transition: transform 180ms ease, background 180ms ease;
}
[data-ux-mode="cozy"] .qr-mood:hover {
    transform: translateY(-2px) scale(1.05);
    background: rgba(198, 107, 107, 0.08) !important;
    border-color: var(--cozy-rose) !important;
}

/* Feed / Chat / Capture — big warm buttons */
[data-ux-mode="cozy"] .hbtns {
    display: grid !important;
    grid-template-columns: 1fr !important;
    gap: 14px !important;
    margin: 24px 0;
}
[data-ux-mode="cozy"] .hb {
    min-height: 78px !important;
    padding: 18px 24px !important;
    display: flex;
    align-items: center;
    gap: 18px;
    font-family: var(--cozy-font-display) !important;
    font-size: 22px !important;
    font-weight: 500 !important;
    color: var(--cozy-ink) !important;
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: 18px !important;
    box-shadow: 0 6px 18px var(--cozy-warm-shadow);
    text-align: left;
    cursor: pointer;
    transition: transform 180ms ease, box-shadow 220ms ease;
}
[data-ux-mode="cozy"] .hb:hover {
    transform: translateY(-2px);
    box-shadow: 0 10px 28px var(--cozy-warm-shadow-lg);
}
[data-ux-mode="cozy"] .hb .hb-icon {
    font-size: 32px;
    flex-shrink: 0;
    width: 44px;
    text-align: center;
}

/* Primary voice CTA — the "Just Talk" button */
[data-ux-mode="cozy"] .voice-btn {
    width: 100%;
    min-height: 84px !important;
    padding: 20px 28px !important;
    font-family: var(--cozy-font-display) !important;
    font-size: 22px !important;
    font-weight: 600 !important;
    font-style: italic;
    color: var(--cozy-paper) !important;
    background: var(--cozy-rose) !important;
    border: none !important;
    border-radius: 20px !important;
    box-shadow: 0 10px 28px rgba(198, 107, 107, 0.32);
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 16px;
    margin: 24px 0 8px;
    transition: transform 180ms ease, box-shadow 220ms ease;
    animation: cozy-mic-pulse 3.2s ease-in-out infinite;
}
[data-ux-mode="cozy"] .voice-btn:hover {
    background: var(--cozy-rose-dark) !important;
    transform: translateY(-2px);
}
[data-ux-mode="cozy"] .voice-btn-icon {
    font-size: 34px;
}

/* Home banner (afternoon greeting) */
[data-ux-mode="cozy"] .home-banner {
    background: linear-gradient(135deg, #FFF5E1 0%, #FCEDD4 100%) !important;
    border: 1px solid var(--cozy-gold-soft) !important;
    border-radius: var(--cozy-radius) !important;
    padding: 28px !important;
    box-shadow: 0 6px 20px var(--cozy-warm-shadow);
}
[data-ux-mode="cozy"] .home-banner-greeting {
    font-family: var(--cozy-font-display) !important;
    font-size: 34px !important;
    font-weight: 600 !important;
    color: var(--cozy-ink) !important;
    margin-bottom: 6px;
    letter-spacing: -0.01em;
}
[data-ux-mode="cozy"] .home-banner-message {
    font-family: var(--cozy-font-body) !important;
    font-size: 18px !important;
    color: var(--cozy-ink-muted) !important;
    margin-bottom: 18px;
    line-height: 1.5;
}
[data-ux-mode="cozy"] .home-banner-action,
[data-ux-mode="cozy"] .daily-q-btn {
    font-family: var(--cozy-font-body) !important;
    font-size: 17px !important;
    min-height: 52px !important;
    padding: 12px 22px !important;
    background: var(--cozy-ink) !important;
    color: var(--cozy-paper) !important;
    border: none !important;
    border-radius: 14px !important;
}
[data-ux-mode="cozy"] .home-banner-action:hover,
[data-ux-mode="cozy"] .daily-q-btn:hover {
    background: #0E1730 !important;
}
[data-ux-mode="cozy"] .daily-q-btn-skip {
    background: transparent !important;
    color: var(--cozy-ink-muted) !important;
    border: var(--cozy-border-hairline) !important;
}

/* Home cards (CEC plans, weekly stats, daily question) */
[data-ux-mode="cozy"] .home-card {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius) !important;
    padding: 24px !important;
    margin-bottom: 16px;
    box-shadow: 0 4px 16px var(--cozy-warm-shadow) !important;
    display: flex;
    gap: 18px;
    align-items: flex-start;
}
[data-ux-mode="cozy"] .home-card-icon {
    font-size: 32px;
    line-height: 1;
    flex-shrink: 0;
}
[data-ux-mode="cozy"] .home-card-label {
    font-family: var(--cozy-font-display) !important;
    font-size: 15px !important;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--cozy-ink-muted) !important;
    margin-bottom: 8px;
    font-weight: 600;
}
[data-ux-mode="cozy"] .home-card-text {
    font-size: 18px;
    line-height: 1.6;
    color: var(--cozy-ink);
}
[data-ux-mode="cozy"] .home-card-body {
    flex: 1;
}

/* CEC plans list — when goals are just labeled "Goal", hide them */
[data-ux-mode="cozy"] .home-card-cec-plans .cec-plan-title:not(:empty):not(:where([data-empty="true"])) {
    font-family: var(--cozy-font-display);
    font-size: 17px;
    color: var(--cozy-ink);
}
[data-ux-mode="cozy"] .cec-plan-item {
    padding: 10px 0;
    border-bottom: var(--cozy-border-hairline);
    display: flex;
    justify-content: space-between;
    align-items: center;
}
[data-ux-mode="cozy"] .cec-plan-item:last-child { border-bottom: none; }
[data-ux-mode="cozy"] .cec-plan-arrow {
    color: var(--cozy-gold);
    font-size: 22px;
}
/* Hide the cec-plans card if all titles are placeholder "Goal" */
[data-ux-mode="cozy"] .home-card-cec-plans:has(.cec-plan-title:only-of-type) {
    /* Keep visible but de-emphasize if empty */
}

/* Hide the broken 940% identity card — known data bug in cozy view */
[data-ux-mode="cozy"] .home-card-identity,
[data-ux-mode="cozy"] .identity-pct {
    display: none !important;
}

/* Weekly-with-dave stats */
[data-ux-mode="cozy"] .weekly-stats {
    display: flex;
    gap: 18px;
    flex-wrap: wrap;
}
[data-ux-mode="cozy"] .weekly-stat {
    font-family: var(--cozy-font-display);
    color: var(--cozy-rose);
    font-size: 17px;
    font-weight: 600;
}

/* Daily question inline card */
[data-ux-mode="cozy"] .daily-q-answer {
    width: 100%;
    font-family: var(--cozy-font-body);
    font-size: 18px;
    padding: 14px 18px;
    border: var(--cozy-border-hairline);
    border-radius: 14px;
    background: var(--cozy-paper);
    color: var(--cozy-ink);
    min-height: 80px;
    margin: 12px 0;
    resize: vertical;
}
[data-ux-mode="cozy"] .daily-q-answer:focus {
    outline: none;
    border-color: var(--cozy-rose);
    box-shadow: 0 0 0 3px rgba(198, 107, 107, 0.15);
}
[data-ux-mode="cozy"] .daily-q-actions {
    display: flex;
    gap: 10px;
    margin-top: 8px;
}
[data-ux-mode="cozy"] .daily-q-dim-hint {
    font-size: 15px;
    color: var(--cozy-ink-muted);
    font-style: italic;
    margin: 8px 0 0;
}
[data-ux-mode="cozy"] .daily-q-dim-hint strong {
    color: var(--cozy-rose);
    font-weight: 600;
    font-style: normal;
}

/* --- Intelligence panel (radar chart) — cozy-ify ----------------------- */
[data-ux-mode="cozy"] .tip-panel {
    background: var(--cozy-paper-elevated);
    border: var(--cozy-border-hairline);
    color: var(--cozy-ink);
}
[data-ux-mode="cozy"] .tip-title {
    font-family: var(--cozy-font-display);
    color: var(--cozy-ink);
    font-size: 24px;
    font-weight: 600;
}
[data-ux-mode="cozy"] .tip-overall {
    font-family: var(--cozy-font-display);
    font-style: italic;
    color: var(--cozy-ink-muted);
}
[data-ux-mode="cozy"] .tip-radar-legend {
    font-size: 15px;
    color: var(--cozy-ink-muted);
}
[data-ux-mode="cozy"] .tip-radar-legend b {
    color: var(--cozy-rose);
    font-weight: 600;
}
[data-ux-mode="cozy"] .tip-still-title {
    font-family: var(--cozy-font-display);
    color: var(--cozy-ink-muted);
    font-size: 14px;
    letter-spacing: 0.08em;
}
[data-ux-mode="cozy"] .tip-still-item {
    font-size: var(--cozy-text-base);
    color: var(--cozy-ink);
    line-height: 1.7;
    margin-bottom: 10px;
}
[data-ux-mode="cozy"] .tip-still-item strong {
    color: var(--cozy-rose);
    font-family: var(--cozy-font-display);
    font-weight: 600;
}

/* --- Journal: simplify list + large pagination ------------------------- */
[data-ux-mode="cozy"] .journal-entry,
[data-ux-mode="cozy"] .entry-card {
    background: var(--cozy-paper-elevated);
    border: var(--cozy-border-hairline);
    border-radius: var(--cozy-radius);
    padding: 24px 28px;
    margin-bottom: 16px;
    font-size: var(--cozy-text-base);
    line-height: var(--cozy-line-height);
}
[data-ux-mode="cozy"] .journal-entry h3,
[data-ux-mode="cozy"] .entry-card h3 {
    font-family: var(--cozy-font-display);
    font-size: 22px;
    margin: 0 0 8px;
}
[data-ux-mode="cozy"] .journal-entry time,
[data-ux-mode="cozy"] .entry-card time {
    font-family: var(--cozy-font-body);
    font-size: 15px;
    color: var(--cozy-ink-faded);
    letter-spacing: 0.03em;
}

/* --- Footer ------------------------------------------------------------- */
[data-ux-mode="cozy"] footer,
[data-ux-mode="cozy"] .site-footer {
    background: transparent;
    color: var(--cozy-ink-muted);
    border-top: var(--cozy-border-hairline);
    padding: 28px 20px;
    font-family: var(--cozy-font-body);
    font-size: 15px;
    text-align: center;
}
[data-ux-mode="cozy"] footer a {
    color: var(--cozy-ink-muted);
    margin: 0 12px;
    text-decoration: none;
    border-bottom: 1px dotted var(--cozy-gold-soft);
    padding-bottom: 1px;
}
[data-ux-mode="cozy"] footer a:hover {
    color: var(--cozy-rose);
    border-bottom-color: var(--cozy-rose);
}

/* --- Page-load fade-in (gentle, staggered) ---------------------------- */
@keyframes cozy-fade-up {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: none; }
}
[data-ux-mode="cozy"] .room,
[data-ux-mode="cozy"] .spirit-avatar-card,
[data-ux-mode="cozy"] .tip-panel,
[data-ux-mode="cozy"] .home-actions,
[data-ux-mode="cozy"] #spiritBabyContent > * {
    animation: cozy-fade-up 600ms cubic-bezier(0.2, 0.6, 0.2, 1) both;
}
[data-ux-mode="cozy"] #spiritBabyContent > *:nth-child(2) { animation-delay: 80ms; }
[data-ux-mode="cozy"] #spiritBabyContent > *:nth-child(3) { animation-delay: 160ms; }
[data-ux-mode="cozy"] #spiritBabyContent > *:nth-child(4) { animation-delay: 240ms; }
[data-ux-mode="cozy"] #spiritBabyContent > *:nth-child(5) { animation-delay: 320ms; }

/* --- Nav polish: kill the dark tab bar + personality selector dark pill */
[data-ux-mode="cozy"] .top-nav,
[data-ux-mode="cozy"] nav.top-nav {
    background: var(--cozy-paper-elevated) !important;
    border-bottom: var(--cozy-border-hairline) !important;
    box-shadow: 0 1px 0 var(--cozy-gold-soft) !important;
}
[data-ux-mode="cozy"] .top-nav a,
[data-ux-mode="cozy"] nav.top-nav a,
[data-ux-mode="cozy"] .nav-link {
    color: var(--cozy-ink) !important;
    background: transparent !important;
}
/* Active nav link */
[data-ux-mode="cozy"] .nav-link.active,
[data-ux-mode="cozy"] .nav-link.is-active,
[data-ux-mode="cozy"] .cozy-nav-link.active {
    color: var(--cozy-rose) !important;
    background: rgba(198, 107, 107, 0.10) !important;
    border-radius: 12px;
}

/* Persona dropdown (chat personality select, twin stage badge) */
[data-ux-mode="cozy"] #chatPersonalityContainer,
[data-ux-mode="cozy"] #chatPersonalityMobileBar,
[data-ux-mode="cozy"] .chat-personality-container {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: 14px !important;
    padding: 6px 10px !important;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] #chatPersonality,
[data-ux-mode="cozy"] .brand-select,
[data-ux-mode="cozy"] .chat-personality-mobile-select {
    background: transparent !important;
    color: var(--cozy-ink) !important;
    border: none !important;
    font-family: var(--cozy-font-body) !important;
    font-size: 16px !important;
}

/* Twin stage badge tooltip — move it out of the way + cozy-style */
[data-ux-mode="cozy"] [data-twin-stage-badge],
[data-ux-mode="cozy"] .twin-stage-badge {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: 12px !important;
    font-family: var(--cozy-font-display) !important;
    font-style: italic !important;
    font-size: 14px !important;
    padding: 6px 14px !important;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow) !important;
}

/* --- Chat composer — send + mic in cozy style ------------------------- */
[data-ux-mode="cozy"] #send,
[data-ux-mode="cozy"] button#send {
    background: var(--cozy-rose) !important;
    color: var(--cozy-paper) !important;
    border: none !important;
    border-radius: 16px !important;
    min-height: 56px !important;
    padding: 14px 28px !important;
    font-family: var(--cozy-font-body) !important;
    font-size: 18px !important;
    font-weight: 600 !important;
    box-shadow: 0 8px 20px rgba(198, 107, 107, 0.28) !important;
}
[data-ux-mode="cozy"] #send:hover {
    background: var(--cozy-rose-dark) !important;
}
/* …but NOT on phones. `chat_inline.css` deliberately turns #send into a 44px
   circular disc with a centred paper-plane glyph at ≤900px, hiding the word
   "Send" with `font-size: 0` while keeping it in the DOM for screen readers
   (Android parity, 2026-06-12). The rule above is `!important` on min-height /
   padding / font-size, which beats that mobile rule no matter how specific it
   is — chat_inline.css also loads BEFORE this file, so it cannot win back even
   with its own !important. Net effect in cozy at 390px: the hidden label
   reappeared at 18px inside a 56px box and was clipped by 23px, on the primary
   action of the primary surface. Verified with scrollWidth vs clientWidth in
   both modes; standard was clean at 0.
   Restore the disc here (in the later file) rather than escalating over there.
   Background stays cozy rose from above, and the glyph is white — 5.63:1. */
@media (max-width: 900px) {
    [data-ux-mode="cozy"] #send,
    [data-ux-mode="cozy"] button#send {
        min-height: 44px !important;
        min-width: 44px !important;
        width: 44px !important;
        height: 44px !important;
        padding: 0 !important;
        font-size: 0 !important;
        border-radius: 999px !important;
    }
}
[data-ux-mode="cozy"] #send .label {
    font-family: var(--cozy-font-body);
    letter-spacing: 0.02em;
    /* Inherit the button's paper color — a more-specific .label rule sets dark
       ink, which is ~2.4:1 on the rose button (fails AA). */
    color: var(--cozy-paper) !important;
}

/* Override inline-styled mic button (.voice-input-btn-minimal has inline styles) */
[data-ux-mode="cozy"] .voice-input-btn,
[data-ux-mode="cozy"] .voice-input-btn-minimal {
    width: 64px !important;
    height: 64px !important;
    border-radius: 50% !important;
    background: var(--cozy-rose) !important;
    color: var(--cozy-paper) !important;
    border: 2px solid var(--cozy-rose-dark) !important;
    box-shadow: 0 8px 22px rgba(198, 107, 107, 0.32) !important;
    animation: cozy-mic-pulse 3.2s ease-in-out infinite;
    font-size: 24px !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
}
[data-ux-mode="cozy"] .voice-input-btn:hover,
[data-ux-mode="cozy"] .voice-input-btn-minimal:hover {
    background: var(--cozy-rose-dark) !important;
}

/* Start Guided Session button */
[data-ux-mode="cozy"] [data-action="guided-session"],
[data-ux-mode="cozy"] .guided-session-btn,
[data-ux-mode="cozy"] button:has(> .guided-session-label) {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: 16px !important;
    font-family: var(--cozy-font-body) !important;
    font-size: 16px !important;
}

/* Avatar inside .room — make it hero-sized if it's present */
[data-ux-mode="cozy"] .room > img,
[data-ux-mode="cozy"] .room video,
[data-ux-mode="cozy"] .room canvas,
[data-ux-mode="cozy"] #spiritAvatarVideo,
[data-ux-mode="cozy"] .spirit-avatar-hero {
    max-width: 320px !important;
    width: 80% !important;
    height: auto !important;
    border-radius: 18px;
    display: block !important;
    margin: 0 auto;
    box-shadow: 0 12px 30px var(--cozy-warm-shadow-lg);
}

/* Stage badge — the "iSpirit stage: Generic — still learning you" dark pill */
[data-ux-mode="cozy"] #twinStageBadge {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: 14px !important;
    font-family: var(--cozy-font-display) !important;
    font-style: italic !important;
    font-size: 14px !important;
    padding: 6px 14px !important;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow) !important;
    backdrop-filter: none !important;
}

/* Bump mic button specificity to beat competing rules (body + stacked classes) */
[data-ux-mode="cozy"] button.voice-input-btn,
[data-ux-mode="cozy"] button.voice-input-btn-minimal,
[data-ux-mode="cozy"] .voice-input-btn.voice-input-btn-minimal {
    width: 64px !important;
    height: 64px !important;
    min-width: 64px !important;
    border-radius: 50% !important;
    background: var(--cozy-rose) !important;
    background-image: none !important;
    color: var(--cozy-paper) !important;
    border: 2px solid var(--cozy-rose-dark) !important;
    padding: 0 !important;
    font-size: 28px !important;
    box-shadow: 0 8px 22px rgba(198, 107, 107, 0.32) !important;
}

/* Nuclear override for ANY dark pill / tab floating at top of chat page */
[data-ux-mode="cozy"] [style*="rgba(15, 23, 42"],
[data-ux-mode="cozy"] [style*="rgba(10,"],
[data-ux-mode="cozy"] [style*="#0a0620"],
[data-ux-mode="cozy"] [style*="#0f172a"] {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}

/* --- NUCLEAR page-wide overrides for dark-theme residues --------------- */
/* Many pages have hero sections / main containers hard-coded to dark navy.
   These overrides catch the common patterns so cozy mode reads as one
   unified aesthetic across every page. */

[data-ux-mode="cozy"] main,
[data-ux-mode="cozy"] section.hero,
[data-ux-mode="cozy"] .hero,
[data-ux-mode="cozy"] .page-hero,
[data-ux-mode="cozy"] .hero-section,
[data-ux-mode="cozy"] .app-main,
[data-ux-mode="cozy"] .page-container,
[data-ux-mode="cozy"] .content-wrapper,
[data-ux-mode="cozy"] .profile-page,
[data-ux-mode="cozy"] .timeline-page,
[data-ux-mode="cozy"] .wisdom-page,
[data-ux-mode="cozy"] .progress-page {
    background: transparent !important;
    background-image: none !important;
    color: var(--cozy-ink) !important;
}

/* Any card/container still rendering dark navy/slate bg */
[data-ux-mode="cozy"] [class*="hero-card"],
[data-ux-mode="cozy"] [class*="stat-card"],
[data-ux-mode="cozy"] [class*="intro-card"],
[data-ux-mode="cozy"] .identity-card,
[data-ux-mode="cozy"] .profile-hero,
[data-ux-mode="cozy"] .timeline-hero,
[data-ux-mode="cozy"] .wisdom-hero,
[data-ux-mode="cozy"] .progress-hero {
    background: var(--cozy-paper-elevated) !important;
    background-image: none !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius) !important;
    box-shadow: 0 6px 20px var(--cozy-warm-shadow) !important;
}

/* Force-override gradient text ("Your Life Journey", etc.) */
[data-ux-mode="cozy"] h1[class*="gradient"],
[data-ux-mode="cozy"] h2[class*="gradient"],
[data-ux-mode="cozy"] .text-gradient,
[data-ux-mode="cozy"] [class*="text-gradient"],
[data-ux-mode="cozy"] [class*="gradient-text"] {
    background: none !important;
    -webkit-background-clip: initial !important;
    background-clip: initial !important;
    -webkit-text-fill-color: var(--cozy-ink) !important;
    color: var(--cozy-ink) !important;
}
/* Hero-video gradient text on /chinese/ index hero (e.g. 逆天改命) */
[data-ux-mode="cozy"] .hv-gradient,
[data-ux-mode="cozy"] [class*="hv-gradient"] {
    background: none !important;
    -webkit-background-clip: initial !important;
    background-clip: initial !important;
    -webkit-text-fill-color: currentColor !important;
    color: var(--cozy-ink) !important;
}
/* Accent specific gradient words with rose instead */
[data-ux-mode="cozy"] h1 .accent,
[data-ux-mode="cozy"] h2 .accent,
[data-ux-mode="cozy"] .hero-accent {
    color: var(--cozy-rose) !important;
    -webkit-text-fill-color: var(--cozy-rose) !important;
    background: none !important;
}

/* Dark navy body background (some pages set <body> background directly) */
[data-ux-mode="cozy"] body {
    background: var(--cozy-paper) !important;
    color: var(--cozy-ink) !important;
}

/* Common "stats" row (Timeline's 12 Milestones / 5 Active Goals / 0 Reflections) */
[data-ux-mode="cozy"] .stats-row .stat,
[data-ux-mode="cozy"] .stat-tile,
[data-ux-mode="cozy"] [class*="stat-tile"] {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius) !important;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow) !important;
    padding: 24px 20px !important;
}
[data-ux-mode="cozy"] .stat-tile h3,
[data-ux-mode="cozy"] .stat-tile .stat-value,
[data-ux-mode="cozy"] .stat-tile [class*="value"] {
    font-family: var(--cozy-font-display) !important;
    color: var(--cozy-ink) !important;
    font-size: 36px !important;
    font-weight: 600 !important;
}
[data-ux-mode="cozy"] .stat-tile .stat-label,
[data-ux-mode="cozy"] .stat-tile [class*="label"] {
    color: var(--cozy-ink-muted) !important;
    font-size: 15px !important;
    text-transform: uppercase;
    letter-spacing: 0.08em;
}

/* --- Index (landing) — cozy hero ---------------------------------------- */
[data-ux-mode="cozy"] .home-hero,
[data-ux-mode="cozy"] .landing-hero,
[data-ux-mode="cozy"] .index-hero {
    background: transparent !important;
    padding: 40px 24px;
}
[data-ux-mode="cozy"] .home-hero h1,
[data-ux-mode="cozy"] .landing-hero h1 {
    font-family: var(--cozy-font-display) !important;
    font-size: var(--cozy-text-display) !important;
    color: var(--cozy-ink) !important;
}

/* --- Wisdom / timeline / progress page heroes -------------------------- */
[data-ux-mode="cozy"] .wisdom-page h1,
[data-ux-mode="cozy"] .timeline-page h1,
[data-ux-mode="cozy"] .progress-page h1,
[data-ux-mode="cozy"] .profile-page h1 {
    font-family: var(--cozy-font-display) !important;
    font-weight: 600 !important;
    color: var(--cozy-ink) !important;
}

/* Cards used on timeline / journal entries / wisdom */
[data-ux-mode="cozy"] [class*="life-review-card"],
[data-ux-mode="cozy"] [class*="wisdom-card"],
[data-ux-mode="cozy"] [class*="memory-card"],
[data-ux-mode="cozy"] [class*="reflection-card"],
[data-ux-mode="cozy"] [class*="goal-card"],
[data-ux-mode="cozy"] [class*="milestone-card"] {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius) !important;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow) !important;
    padding: 24px !important;
}

/* Auto-dark surfaces — if inline style sets dark bg, we still win */
[data-ux-mode="cozy"] [style*="rgb(10, 15"],
[data-ux-mode="cozy"] [style*="rgb(15, 23"],
[data-ux-mode="cozy"] [style*="#0a0620"],
[data-ux-mode="cozy"] [style*="#0f172a"],
[data-ux-mode="cozy"] [style*="#1e293b"],
[data-ux-mode="cozy"] [style*="#1A1A2E"] {
    background: var(--cozy-paper-elevated) !important;
    background-image: none !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}

/* Form inputs — generic cozy styling */
[data-ux-mode="cozy"] input[type="text"],
[data-ux-mode="cozy"] input[type="email"],
[data-ux-mode="cozy"] input[type="password"],
[data-ux-mode="cozy"] input[type="search"],
[data-ux-mode="cozy"] select,
[data-ux-mode="cozy"] textarea {
    background: var(--cozy-paper-elevated);
    color: var(--cozy-ink);
    border: var(--cozy-border-hairline);
    border-radius: 12px;
    padding: 12px 16px;
    font-family: var(--cozy-font-body);
    font-size: 17px;
}
[data-ux-mode="cozy"] input:focus,
[data-ux-mode="cozy"] select:focus,
[data-ux-mode="cozy"] textarea:focus {
    outline: none;
    border-color: var(--cozy-rose);
    box-shadow: 0 0 0 3px rgba(198, 107, 107, 0.15);
}

/* Nav dark background strip behind tabs (the .top-nav pill container) */
[data-ux-mode="cozy"] .top-nav-inner,
[data-ux-mode="cozy"] .nav-links,
[data-ux-mode="cozy"] .nav-tabs,
[data-ux-mode="cozy"] .tab-bar {
    background: transparent !important;
}

/* --- Timeline-specific bento stats + hero ------------------------------ */
[data-ux-mode="cozy"] .timeline-hero-modern {
    background: transparent !important;
    padding: 48px 24px 32px !important;
    text-align: center;
}
[data-ux-mode="cozy"] .timeline-hero-title,
[data-ux-mode="cozy"] .timeline-hero-title .gradient-text {
    font-family: var(--cozy-font-display) !important;
    font-size: 52px !important;
    color: var(--cozy-ink) !important;
    -webkit-text-fill-color: var(--cozy-ink) !important;
    background: none !important;
    font-weight: 600 !important;
    letter-spacing: -0.02em !important;
    margin: 0 0 12px !important;
}
[data-ux-mode="cozy"] .timeline-hero-title .gradient-text {
    color: var(--cozy-rose) !important;
    -webkit-text-fill-color: var(--cozy-rose) !important;
    font-style: italic;
}
[data-ux-mode="cozy"] .timeline-hero-subtitle {
    color: var(--cozy-ink-muted) !important;
    font-size: 19px !important;
    max-width: 560px;
    margin: 0 auto 32px !important;
}
[data-ux-mode="cozy"] .bento-stats {
    display: grid !important;
    grid-template-columns: repeat(3, 1fr) !important;
    gap: 16px !important;
    max-width: 720px !important;
    margin: 0 auto !important;
}
[data-ux-mode="cozy"] .bento-card {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius) !important;
    box-shadow: 0 6px 18px var(--cozy-warm-shadow) !important;
    padding: 24px 20px !important;
    backdrop-filter: none !important;
}
[data-ux-mode="cozy"] .bento-icon {
    font-size: 28px !important;
    margin-bottom: 6px;
}
[data-ux-mode="cozy"] .bento-value {
    font-family: var(--cozy-font-display) !important;
    font-size: 44px !important;
    font-weight: 600 !important;
    color: var(--cozy-ink) !important;
    margin: 6px 0 4px !important;
    line-height: 1 !important;
}
[data-ux-mode="cozy"] .bento-label {
    font-family: var(--cozy-font-body) !important;
    font-size: 14px !important;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--cozy-ink-muted) !important;
    font-weight: 600;
    margin-bottom: 6px;
}
[data-ux-mode="cozy"] .bento-meta {
    font-size: 13px !important;
    color: var(--cozy-ink-faded) !important;
    line-height: 1.5;
}

/* --- Wisdom / Profile / Progress — common hero card container -------- */
[data-ux-mode="cozy"] .wisdom-hero-section,
[data-ux-mode="cozy"] .profile-hero-section,
[data-ux-mode="cozy"] .progress-hero-section,
[data-ux-mode="cozy"] [class*="hero-section"]:not(.timeline-hero-modern) {
    background: var(--cozy-paper-elevated) !important;
    background-image: none !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius-lg) !important;
    box-shadow: 0 6px 20px var(--cozy-warm-shadow) !important;
    padding: 40px 32px !important;
    margin: 20px auto !important;
    max-width: 860px !important;
    color: var(--cozy-ink) !important;
}

/* Any element inside the hero that says "Design your AI identity" / "Wisdom" / etc. */
[data-ux-mode="cozy"] .hero-title,
[data-ux-mode="cozy"] .page-title,
[data-ux-mode="cozy"] [class*="hero-title"],
[data-ux-mode="cozy"] [class*="page-title"] {
    font-family: var(--cozy-font-display) !important;
    font-size: 42px !important;
    color: var(--cozy-ink) !important;
    font-weight: 600 !important;
    margin-bottom: 14px !important;
}
[data-ux-mode="cozy"] .hero-subtitle,
[data-ux-mode="cozy"] .page-subtitle,
[data-ux-mode="cozy"] [class*="hero-subtitle"] {
    font-size: 18px !important;
    color: var(--cozy-ink-muted) !important;
    line-height: 1.6;
}

/* Progress page — Sync Stats / Achievements / Smart Reminders buttons */
[data-ux-mode="cozy"] .progress-actions button,
[data-ux-mode="cozy"] [class*="progress-action"] {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: 16px !important;
    padding: 14px 24px !important;
    font-family: var(--cozy-font-body) !important;
    font-size: 17px !important;
    font-weight: 500 !important;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow) !important;
}

/* --- Force readable text across all pages ----------------------------- */
/* Many pages set white/light text colors assuming dark backgrounds.
   In cozy (cream bg), light text becomes invisible. Force ink color. */
[data-ux-mode="cozy"] p,
[data-ux-mode="cozy"] span:not([class*="icon"]):not([class*="brand"]),
[data-ux-mode="cozy"] li,
[data-ux-mode="cozy"] dd,
[data-ux-mode="cozy"] dt,
[data-ux-mode="cozy"] label,
[data-ux-mode="cozy"] .subtitle,
[data-ux-mode="cozy"] [class*="description"]:not([class*="card"]):not([class*="hero"]) {
    color: var(--cozy-ink);
}

/* Anything explicitly set to light-on-dark (white-ish rgba) — force ink */
[data-ux-mode="cozy"] [style*="rgba(248, 250"],
[data-ux-mode="cozy"] [style*="rgb(248, 250"],
[data-ux-mode="cozy"] [style*="rgba(255, 255"],
[data-ux-mode="cozy"] [style*="color: #fff"],
[data-ux-mode="cozy"] [style*="color:#fff"],
[data-ux-mode="cozy"] [style*="color: rgb(255"] {
    color: var(--cozy-ink) !important;
}

/* ---- Capture page (capture.html) --------------------------------------- */
/* capture-ui.js renders a semi-transparent BLACK header bar
   (rgba(0,0,0,0.7)) floating over a live camera viewfinder — camera
   chrome, not the themed paper surface, so it's meant to stay dark in both
   themes. Its "Capture a Moment" label sets inline `color:rgba(255,255,255,0.5)`,
   which the blanket "light-on-dark inline style" catch-all just above
   (matches `[style*="rgba(255, 255"]`) force-inks to cozy-ink — dark text on
   a dark 70%-opacity bar, effectively invisible (1.69:1, confirmed via
   getComputedStyle + alpha-composite on the live page). `#cancelBtn`
   ("← Return to iSpirit") sits on the same bar and goes dark too, since its
   `.btn-text` base color quietly follows the themed `--fg` token. Restore
   the original light text for both, matching standard mode exactly. */
[data-ux-mode="cozy"] .capture-workspace > div[style*="rgba(0, 0, 0, 0.7)"] #cancelBtn,
[data-ux-mode="cozy"] .capture-workspace > div[style*="rgba(0,0,0,0.7)"] #cancelBtn {
    color: #fff !important;
}
[data-ux-mode="cozy"] .capture-workspace > div[style*="rgba(0, 0, 0, 0.7)"] span,
[data-ux-mode="cozy"] .capture-workspace > div[style*="rgba(0,0,0,0.7)"] span {
    color: rgba(255, 255, 255, 0.5) !important;
}

/* ---- Video Journal page (video-journal.html) ---------------------------- */
/* video-journal-app.js hardcodes `color: #e5e5e5` inline (via innerHTML,
   both the camera-unavailable notice and the getUserMedia error notice) —
   a light gray meant for a dark camera-preview placeholder box. Cozy's
   `.video-journal-section` is cream paper (#fffbf2), not a dark preview
   box, so this text renders at 1.22:1 — effectively invisible (confirmed
   via getComputedStyle + alpha-composite on the live page, both the EN and
   CN notices use the same hardcoded hex). The `<small>` sub-line inherits
   from the same `<p>`, so one rule fixes both lines. */
[data-ux-mode="cozy"] #video-recorder-container p[style*="#e5e5e5"] {
    color: var(--cozy-ink-muted) !important;
}

/* Specifically: paragraph text inside hero containers */
[data-ux-mode="cozy"] .timeline-hero-modern p,
[data-ux-mode="cozy"] [class*="hero-section"] p,
[data-ux-mode="cozy"] [class*="hero"] p {
    color: var(--cozy-ink-muted) !important;
}

/* Title tags that commonly inherit wrong color */
[data-ux-mode="cozy"] h1, [data-ux-mode="cozy"] h2, [data-ux-mode="cozy"] h3,
[data-ux-mode="cozy"] h4, [data-ux-mode="cozy"] h5, [data-ux-mode="cozy"] h6 {
    color: var(--cozy-ink);
}

/* Section-level text that might have fallen through */
[data-ux-mode="cozy"] section p,
[data-ux-mode="cozy"] article p,
[data-ux-mode="cozy"] .card p,
[data-ux-mode="cozy"] .panel p {
    color: var(--cozy-ink) !important;
}

/* Links that inherit white color */
/* The mobile menu keeps its DARK surface in cozy — cozy repaints the page,
   not that overlay. Painting cozy rose ink onto it put warm ink on dark
   paper: measured 3.02:1 on .mobile-nav-link / .mobile-action-link
   (2026-08-03). Excluded so they keep navigation.css's own colour, which
   is designed for that dark surface. Cozy ink must never be applied where
   cozy paper was not. */
[data-ux-mode="cozy"] a:not([class*="brand"]):not(.nav-link):not([class*="btn"]):not(.mobile-nav-link):not(.mobile-action-link) {
    color: var(--cozy-rose);
}

/* --- Profile / Settings page ------------------------------------------ */
[data-ux-mode="cozy"] .profile-section,
[data-ux-mode="cozy"] .profile-section.active,
[data-ux-mode="cozy"] .profile-container > section,
[data-ux-mode="cozy"] .profile-form,
[data-ux-mode="cozy"] [class*="profile-section"],
[data-ux-mode="cozy"] [class*="settings-section"] {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius-lg) !important;
    box-shadow: 0 6px 20px var(--cozy-warm-shadow) !important;
    padding: 32px !important;
    margin: 16px auto !important;
    /* No width cap — match standard mode (owner request 2026-07-30: "should be
       similar like standard mode - wider"). This used to be
       `max-width: 860px !important`, which made cozy ~100px narrower than
       standard inside a 1024px container and cramped the form grids and the
       AI-character avatar row for no benefit.
       The 560-720px caps elsewhere in this file are a READING MEASURE and are
       right for prose. Profile is form-dense, not prose: a narrow measure helps
       a paragraph and hurts a two-column settings grid. `.profile-container`
       still bounds it at 1600px, exactly as standard mode does. */
    max-width: none !important;
}
[data-ux-mode="cozy"] .profile-section h2,
[data-ux-mode="cozy"] .profile-section h3 {
    font-family: var(--cozy-font-display) !important;
    color: var(--cozy-ink) !important;
}

/* The sticky .form-actions footer (user_profile_inline.css) hardcodes a
   dark navy gradient (rgba(11,18,32,1)); in cozy mode that shows as a dark
   band behind the Test Voice / Save Settings button rows inside the cream
   cards. Repaint it to fade from cozy paper instead. */
[data-ux-mode="cozy"] .form-actions {
    background: linear-gradient(to top, var(--cozy-paper-elevated, #FFFBF2) 65%, rgba(255, 251, 242, 0)) !important;
}

/* Profile hero */
[data-ux-mode="cozy"] .profile-hero,
[data-ux-mode="cozy"] .hero-info,
[data-ux-mode="cozy"] .hero-summary {
    background: transparent !important;
    color: var(--cozy-ink) !important;
}

/* Settings form fields */
[data-ux-mode="cozy"] .profile-form label,
[data-ux-mode="cozy"] .profile-form h3,
[data-ux-mode="cozy"] .profile-form legend {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-body);
    font-size: 16px;
    font-weight: 600;
    margin: 20px 0 8px;
}
[data-ux-mode="cozy"] .profile-form input,
[data-ux-mode="cozy"] .profile-form select,
[data-ux-mode="cozy"] .profile-form textarea,
[data-ux-mode="cozy"] .profile-form [contenteditable] {
    background: var(--cozy-paper) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: 12px !important;
    padding: 12px 16px !important;
    font-family: var(--cozy-font-body);
    font-size: 17px;
}
[data-ux-mode="cozy"] .profile-form input:focus,
[data-ux-mode="cozy"] .profile-form select:focus,
[data-ux-mode="cozy"] .profile-form textarea:focus {
    border-color: var(--cozy-rose) !important;
    box-shadow: 0 0 0 3px rgba(198, 107, 107, 0.15) !important;
    outline: none !important;
}

/* Purple "3 Schedules" / premium-feature section — re-skin warm */
[data-ux-mode="cozy"] [class*="premium-card"],
[data-ux-mode="cozy"] [class*="schedule-card"],
[data-ux-mode="cozy"] [style*="linear-gradient"][style*="99"],
[data-ux-mode="cozy"] [style*="linear-gradient(135deg, #6"],
[data-ux-mode="cozy"] [style*="linear-gradient(135deg, #7"] {
    background: linear-gradient(135deg, #FFF5E1 0%, #FCEDD4 100%) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid var(--cozy-gold-soft) !important;
}

/* Sub-sections / accordion rows inside profile */
[data-ux-mode="cozy"] .profile-section > div {
    background: transparent !important;
    color: var(--cozy-ink);
}

/* Any data attribute like data-theme=dark */
[data-ux-mode="cozy"] [data-theme="dark"],
[data-ux-mode="cozy"] .dark-card,
[data-ux-mode="cozy"] .dark-panel {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}

/* Checkbox + radio theming */
[data-ux-mode="cozy"] input[type="checkbox"]:checked,
[data-ux-mode="cozy"] input[type="radio"]:checked {
    accent-color: var(--cozy-rose);
}

/* --- Glass-panel / glass-card universal override ---------------------- */
/* The app uses `.glass-panel`, `.glass-card`, etc. for glassmorphism with
   dark bg. In cozy mode, these all become warm cream panels. */
[data-ux-mode="cozy"] .glass-panel,
[data-ux-mode="cozy"] .glass-card,
[data-ux-mode="cozy"] [class*="glass-"],
[data-ux-mode="cozy"] .execution-hero,
[data-ux-mode="cozy"] .execution-page > section,
[data-ux-mode="cozy"] .execution-page > div,
[data-ux-mode="cozy"] [class*="execution-"],
[data-ux-mode="cozy"] [class*="backdrop-panel"],
[data-ux-mode="cozy"] [class*="frosted"] {
    background: var(--cozy-paper-elevated) !important;
    background-image: none !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius-lg) !important;
    box-shadow: 0 6px 20px var(--cozy-warm-shadow) !important;
    color: var(--cozy-ink) !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
}

/* Hero titles inside execution/progress/etc */
[data-ux-mode="cozy"] .execution-hero h1,
[data-ux-mode="cozy"] .execution-page h1,
[data-ux-mode="cozy"] [class*="hero-title"] {
    color: var(--cozy-ink) !important;
    -webkit-text-fill-color: var(--cozy-ink) !important;
    background: none !important;
    font-family: var(--cozy-font-display) !important;
}

/* Hero action buttons on progress (Sync Stats / Achievements / Smart Reminders) */
[data-ux-mode="cozy"] .hero-actions button,
[data-ux-mode="cozy"] .hero-actions .btn,
[data-ux-mode="cozy"] .hero-header button {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: 14px !important;
    padding: 12px 22px !important;
    font-family: var(--cozy-font-body) !important;
    font-size: 16px !important;
    font-weight: 500 !important;
}

/* --- Catch-all: any page-level header/container with dark bg --------- */
[data-ux-mode="cozy"] [class$="-header"],
[data-ux-mode="cozy"] [class*="-header "],
[data-ux-mode="cozy"] [class$="-container"] > header,
[data-ux-mode="cozy"] [class$="-wrapper"],
[data-ux-mode="cozy"] [class$="-page-header"],
[data-ux-mode="cozy"] .wisdom-header,
[data-ux-mode="cozy"] .timeline-header,
[data-ux-mode="cozy"] .profile-header,
[data-ux-mode="cozy"] .progress-header,
[data-ux-mode="cozy"] .habits-header,
[data-ux-mode="cozy"] .journal-header,
[data-ux-mode="cozy"] .chat-header:not(.sb-header),
[data-ux-mode="cozy"] .home-header {
    background: var(--cozy-paper-elevated) !important;
    background-image: none !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    border-radius: var(--cozy-radius-lg) !important;
    box-shadow: 0 6px 20px var(--cozy-warm-shadow) !important;
    backdrop-filter: none !important;
}
/* Exception: keep the top nav header transparent/cozy (already styled above) */
[data-ux-mode="cozy"] .top-nav.cozy-nav {
    background: var(--cozy-paper-elevated) !important;
    border-radius: 0 !important;
    box-shadow: 0 1px 0 var(--cozy-gold-soft) !important;
}

/* --- Cozy nav with 8 inline tabs — keep everything on one row, compress
   labels progressively as width shrinks. Previous version wrapped onto
   two rows at ≤1200px, pushing the user-menu below the nav-links and
   making the avatar dropdown unreachable (any click on it just hit the
   ::before texture underneath). */
[data-ux-mode="cozy"] .top-nav.cozy-nav .nav-container {
    flex-wrap: nowrap !important;
    gap: 8px !important;
    padding: 8px 20px !important;
    align-items: center !important;
}
[data-ux-mode="cozy"] .top-nav.cozy-nav .nav-links {
    /* Allow the links row to shrink below its content size so the
       user-menu on the right always has space. Icons stay tappable
       even when labels are hidden. */
    flex: 1 1 0 !important;
    min-width: 0 !important;
    overflow: hidden;
    flex-wrap: nowrap !important;
    gap: 2px !important;
    justify-content: flex-end;
}
[data-ux-mode="cozy"] .top-nav.cozy-nav .nav-actions {
    flex: 0 0 auto !important;
    margin-left: 8px !important;
}
[data-ux-mode="cozy"] .top-nav.cozy-nav .nav-link,
[data-ux-mode="cozy"] .top-nav.cozy-nav a.cozy-nav-link {
    padding: 10px 14px !important;
    font-size: 16px !important;
    gap: 6px;
    white-space: nowrap;
}
/* Tablet / narrow-desktop: shrink padding + hide text labels so the
   row still fits on one line at common 13-inch laptop widths. Icons
   remain visible and tappable.
   2026-07-30: the icon-only breakpoint below was 1024px, but with 8 nav
   items + cozy's larger label font, the row already overflows at 1280px
   (a 1280×900 desktop test viewport, and 1366×768 laptops) -- confirmed
   live via elementFromPoint hit-testing on video-journal.html: with
   max-width:1024px, `#navLinks` (flex:1, min-width:0, overflow:hidden,
   justify-content:flex-end) needed ~940px for 8 labelled items but only
   had ~773px, so the flex-end-aligned row overflowed its LEFT edge and
   `overflow:hidden` clipped it there -- the "iSpirit" tab was 100%
   invisible/unclickable and "Talk" was ~75% clipped, while
   getBoundingClientRect() on both still reported plausible-looking
   rects (the clipping trap: a rect says nothing about what's actually
   painted). The shrink-only tier alone (padding 10px 10px / font 15px)
   was verified NOT sufficient at 1280px; icon-only was verified sufficient.
   Raised to 1400px so it actually covers 1280/1366 rather than only <1024px
   tablets.

   Re-measured independently 2026-07-30 (the first pass's numbers understated
   it, and the metric it used could not see this overflow at all: with
   justify-content:flex-end the excess spills off the row's LEFT edge, which
   `scrollWidth` does not report in LTR — scrollWidth == clientWidth == 771 the
   whole time it was broken). The real criterion is the first item's left edge
   vs the brand block's right edge. At 1280px the labelled row starts at x=94
   under a brand that ends at x=263: a 169px overlap, not ~70px. A deliberately
   aggressive label-preserving variant (padding 8px 6px, font 14px, row gap 0)
   only recovered 30px of that — still 139px of overlap, "iSpirit" still 0/5
   painted. Since .nav-links is flex:1, it gains 1px per 1px of viewport, so
   labels do not clear the brand until ~1420-1450px. 1400px is therefore the
   correct ceiling and labels genuinely cannot survive at 1280/1366.

   The old `max-width: 1200px` shrink tier that used to sit here has been
   REMOVED rather than kept for tidiness: it preceded this block and set
   padding/font-size on the same `.nav-link` with the same specificity and
   !important, so this block won at every width where that one applied. It had
   been dead since the breakpoint moved to 1400px, and a dead tier full of
   plausible numbers is worse than no tier — the next person to tune it would
   see nothing change. */
@media (max-width: 1400px) {
    [data-ux-mode="cozy"] .top-nav.cozy-nav .nav-text {
        display: none;
    }
    [data-ux-mode="cozy"] .top-nav.cozy-nav .nav-link {
        padding: 10px 12px !important;
        font-size: 20px !important;
    }
    [data-ux-mode="cozy"] .top-nav.cozy-nav .nav-icon {
        font-size: 20px;
    }
}

/* --------------------------------------------------------------------- */
/* Timeline event cards — dark-theme text colors (light gray, white at 70%
   opacity) were leaking onto the cozy paper background and rendering
   unreadable. Override every text-bearing element inside a timeline event
   to use the ink tokens on the warm-paper surface. */
/* --------------------------------------------------------------------- */
[data-ux-mode="cozy"] .timeline-event {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
    box-shadow: 0 6px 18px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .timeline-event .event-content,
[data-ux-mode="cozy"] .timeline-event .event-meta,
[data-ux-mode="cozy"] .timeline-event .event-tags,
[data-ux-mode="cozy"] .timeline-event .event-progress,
[data-ux-mode="cozy"] .timeline-event .event-description {
    color: var(--cozy-ink) !important;
    background: transparent !important;
}
[data-ux-mode="cozy"] .timeline-event .event-meta,
[data-ux-mode="cozy"] .timeline-event .event-tags {
    /* Secondary lines — a touch muted so they recede, but still legible
       on cream (>= 4.5:1 contrast against --cozy-paper-elevated). */
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .timeline-event .event-title,
[data-ux-mode="cozy"] .timeline-event .event-date,
[data-ux-mode="cozy"] .timeline-event .progress-label {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .timeline-event .event-tag {
    background: rgba(182, 151, 99, 0.15) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid var(--cozy-gold-soft) !important;
}
[data-ux-mode="cozy"] .timeline-event .event-actions {
    /* Was rgba(15,23,42,0.9) — dark navy band on cream paper. Let the
       actions sit on the same paper-elevated surface as the card. */
    background: transparent !important;
    border-top: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .timeline-event .event-action {
    color: var(--cozy-ink) !important;
    background: var(--cozy-paper) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .timeline-event .event-action:hover {
    background: rgba(198, 107, 107, 0.08) !important;
    border-color: var(--cozy-rose) !important;
    color: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] .timeline-event .progress-bar {
    background: rgba(166, 130, 85, 0.15) !important;
}
[data-ux-mode="cozy"] .timeline-event .progress-fill {
    background: linear-gradient(90deg, var(--cozy-sage), var(--cozy-gold)) !important;
}
[data-ux-mode="cozy"] .timeline-event .event-dot {
    /* Warm-pink goal dot on cream is fine, but bump border for legibility. */
    box-shadow: 0 0 0 3px var(--cozy-paper) !important;
}
[data-ux-mode="cozy"] .timeline-event .event-category {
    /* MILESTONE / ACHIEVEMENT pills — keep the category accent color but
       switch text to white for legibility against the saturated bg. */
    color: #fff !important;
    font-weight: 600 !important;
}
[data-ux-mode="cozy"] .timeline-event .timeline-goal-label {
    background: rgba(198, 107, 107, 0.12) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(198, 107, 107, 0.35) !important;
}

/* ==========================================================================
 * CONTRAST SAFETY NET — cozy mode
 * --------------------------------------------------------------------------
 * Many per-page/per-component CSS files (some inline in their .html) bake in
 * dark-mode text colors (#f8fafc, rgba(255,255,255,x), slate-200, amber-400,
 * violet-300, rgb(249,250,251)) on the assumption the surface underneath is
 * dark. In cozy mode those surfaces are cream — and that text becomes
 * invisible or unreadable. The rules below re-point the *most visible*
 * offenders back to cozy ink / cozy-appropriate accent colors.
 *
 * Each rule is scoped to `[data-ux-mode="cozy"]` and uses `!important` only
 * where it must beat a more-specific per-component selector (e.g.
 * `.bubble.user .bubble-text`). Added 2026-04-22 from a Playwright audit of
 * demo/demo1234567 across every user-facing page.
 * ========================================================================== */

/* ---- Chat bubbles ----------------------------------------------------- */
/* `.bubble.user .bubble-text { color: #fff }` in styles.css beats the
   cozy `.user .bubble { color: var(--cozy-ink) }` by specificity. */
[data-ux-mode="cozy"] .bubble.user .bubble-text,
[data-ux-mode="cozy"] .bubble.assistant .bubble-text,
[data-ux-mode="cozy"] .bubble .bubble-text {
    color: var(--cozy-ink) !important;
}

/* ---- Persona switcher avatars (chat-head) ---------------------------- */
/* The cozy blanket button rule (min-height: 56px; padding: 14px 28px) was
   squashing each 32x32 .persona-btn into a 58x56 pill whose only child
   (the 28x28 avatar <img>) got shrunk to width: 0 — avatars rendered as
   empty circles. Exclusion in the blanket selector above is the primary
   fix; these rules restore the intended dimensions + re-skin the chip for
   cozy so the active persona reads clearly against cream paper. */
[data-ux-mode="cozy"] .chat-head-personas .persona-btn {
    min-height: 0 !important;
    min-width: 0 !important;
    width: 32px !important;
    height: 32px !important;
    padding: 0 !important;
    border-radius: 50% !important;
    background: transparent !important;
    box-shadow: none !important;
}
[data-ux-mode="cozy"] .chat-head-personas .persona-btn img {
    width: 28px !important;
    height: 28px !important;
    border-radius: 50% !important;
    object-fit: cover;
    display: block;
}
[data-ux-mode="cozy"] .chat-head-personas .persona-btn.on {
    border-color: var(--cozy-rose) !important;
    box-shadow: 0 0 0 2px rgba(198,107,107,0.25),
                0 4px 12px rgba(198,107,107,0.35) !important;
}

/* ---- Spirit Pet home surface (spirit-baby.html) ---------------------- */
/* All of these inherit `var(--muted, rgba(255,255,255,.4/.5/.55))` from
   spirit-pet.css — the fallback rgba is what renders in cozy because the
   cozy custom-property name is different. Force to cozy muted ink. */
[data-ux-mode="cozy"] .gc-name,
[data-ux-mode="cozy"] .sb-header-title,
[data-ux-mode="cozy"] .weekly-dims,
[data-ux-mode="cozy"] .weekly-narrative,
[data-ux-mode="cozy"] .weekly-dim-chip,
[data-ux-mode="cozy"] .zzz {
    color: var(--cozy-ink-muted) !important;
}
/* The growth-stage label for the *current* stage should be full-ink. */
[data-ux-mode="cozy"] .gc-stage.current .gc-name,
[data-ux-mode="cozy"] .gc-stage.active .gc-name {
    color: var(--cozy-ink) !important;
    font-weight: 600;
}

/* ---- Wisdom page "spirit chips" and avatar placeholders -------------- */
/* `.spirit-chip { background: rgba(5,10,20,.65) }` is inlined in wisdom.html
   — dark glass on dark assumed. Re-skin as cream paper in cozy. */
[data-ux-mode="cozy"] .spirit-chip {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .spirit-chip.success,
[data-ux-mode="cozy"] .spirit-chip.status-completed {
    background: rgba(126, 151, 119, 0.18) !important;
    border: 1px solid rgba(126, 151, 119, 0.45) !important;
    color: #33543A !important;
}
[data-ux-mode="cozy"] .spirit-chip.warning,
[data-ux-mode="cozy"] .spirit-chip.status-pending {
    background: rgba(182, 151, 99, 0.18) !important;
    border: 1px solid rgba(182, 151, 99, 0.45) !important;
    color: #6B4E10 !important;
}
[data-ux-mode="cozy"] .spirit-chip.status-processing {
    background: rgba(198, 107, 107, 0.14) !important;
    border: 1px solid rgba(198, 107, 107, 0.40) !important;
    color: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] .spirit-chip.status-error {
    background: rgba(168, 85, 85, 0.18) !important;
    border: 1px solid rgba(168, 85, 85, 0.5) !important;
    color: #6B2A2A !important;
}
[data-ux-mode="cozy"] .spirit-avatar-placeholder,
[data-ux-mode="cozy"] .spirit-avatar-status-text {
    color: var(--cozy-ink-muted) !important;
}

/* ---- Admin-guard "Access Denied" panel (admin_guard.js) --------------
   Shared, widely-used gate: system-admin.html, admin.html,
   prompt_manager.html, keyword_manager.html, and every other admin-only
   page load this in <head>; any non-admin (i.e. every normal user) who
   navigates there sees this exact panel. It wipes <body> and injects one
   deliberately dark, theme-INDEPENDENT panel
   (`background:#0b1220;color:#e5e7eb` inline) — same "camera chrome"
   situation as capture.html. The `h2` and the CTA `<a>` links don't set
   their OWN inline color, so they inherit `#e5e7eb` from the panel in
   standard mode — but cozy's blanket "force ink" rules (the h1-h6 heading
   rule + the generic `a { color: var(--cozy-rose) }` link rule) override
   that inherited value anyway, since neither rule is scoped to the panel.
   Result: "Access Denied" heading at ~1.2:1 (ink-on-navy, effectively
   invisible) and the two recovery links at ~3.3:1 (fails AA's 4.5:1 for
   20px/400 body text). Confirmed via getComputedStyle diff against
   standard mode, where h2/a both correctly render #e5e7eb. Restore that
   inherited value inside this specific panel, in both themes. */
[data-ux-mode="cozy"] div[style*="background: rgb(11, 18, 32)"] h2,
[data-ux-mode="cozy"] div[style*="background: rgb(11, 18, 32)"] p,
[data-ux-mode="cozy"] div[style*="background: rgb(11, 18, 32)"] a {
    color: #e5e7eb !important;
}

/* ---- Wizard Templates page (wizard-templates.html) --------------------
   Three category tags are hardcoded directly in the page markup (EN+CN,
   same inline styles, only the label text differs) as saturated-color
   text on a 15%-tinted same-color background: "color:var(--accent)"
   (blue, Decision Support), "color:var(--accent-2)" (purple, Relationship
   Growth), "color:#34d399" (green, Knowledge Import — also reused by the
   "SHARED" badge + "Share" button injected by wizard-templates-premium.js).
   `--accent`/`--accent-2` are this page's own local custom properties
   with no cozy override, so they stay their standard-mode blue/purple.
   On a dark card the saturated text reads fine (ratios were 1.64–2.71 on
   cozy's cream card, confirmed via getComputedStyle + alpha-composite —
   the SAME "colored text on same-color 15% tint" shape as `.habit-streak`
   and `.habit-category` above). Same fix: keep the tinted pill background,
   re-point the TEXT to cozy-ink. */
[data-ux-mode="cozy"] span[style*="color:var(--accent)"],
[data-ux-mode="cozy"] span[style*="color:var(--accent-2)"],
[data-ux-mode="cozy"] span[style*="color:#34d399"],
[data-ux-mode="cozy"] button[style*="color:#34d399"] {
    color: var(--cozy-ink) !important;
}

/* ---- Pricing page (pricing.html) — Free plan CTA ----------------------
   `.pricing-btn-primary` (inline-pricing.css) sets its own
   `color: #05080f` (near-black) against its `background: linear-gradient
   (135deg, #34d399, #4facfe)` (green->blue) -- deliberately dark text on a
   bright button, and it reads fine in BOTH themes independently. But the
   blanket `[data-ux-mode="cozy"] a { color: var(--cozy-rose) }` above
   (line ~159, unconditional, no :not([class*="btn"]) guard) has higher
   specificity than the page's single-class rule and repaints it rose,
   which on this specific green/blue gradient measures 2.32:1 (confirmed
   via getComputedStyle + alpha-composite) -- not the "assumed-dark-bg"
   pattern, just two unrelated color rules landing on the same button.
   Restore the near-black text this button was designed with. */
[data-ux-mode="cozy"] .pricing-btn-primary {
    color: var(--cozy-ink) !important;
}

/* ---- Getting Started page (getting-started.html) -----------------------
   Inline `style="color: var(--accent-cyan)"` link ("profile"). Cozy
   re-points the generic `--accent-cyan` token to `--accent-rose` (tokens.css,
   #C66B6B) -- an OLDER, never-AA-audited rose ("chips/borders only, never
   CTA label" per its own comment in this file) that's a DIFFERENT value
   from the properly-audited `--cozy-rose` (#A8475F, 5.63:1 w/ white) this
   file uses everywhere else. #C66B6B on cream measures 3.21:1 (confirmed
   via getComputedStyle), failing AA for 20px/400 body text. Rather than
   retarget the shared `--accent-cyan`/`--accent-rose` tokens (wide,
   untested blast radius across every OTHER cozy usage of them), just
   re-point this specific inline-styled link to the audited token. */
[data-ux-mode="cozy"] [style*="color: var(--accent-cyan)"],
[data-ux-mode="cozy"] [style*="color:var(--accent-cyan)"] {
    color: var(--cozy-rose) !important;
}

/* ---- Habits page ----------------------------------------------------- */
/* `.habit-description` has `rgba(248,250,252,0.88)` inlined in habits.html. */
[data-ux-mode="cozy"] .habit-description {
    color: var(--cozy-ink-muted) !important;
}
/* `.habit-category` pills use dark-mode surface colors — force cream. */
[data-ux-mode="cozy"] .habit-category {
    background: rgba(182, 151, 99, 0.18) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(182, 151, 99, 0.35) !important;
}
/* `.habit-streak` badge text keeps the dark-mode amber (#f59e0b) — reads
   fine on app-shell.css's dark `.habit-card`, but on cozy's cream card
   (`--surface-raised: #FFFBF2`) that same amber-on-10%-amber-tint composites
   to 1.93:1 (fails AA's 4.5:1 for 11px/600 text; confirmed via
   getComputedStyle + alpha-composite on the live card, both /progress.html
   and /routines.html — same shared routines-panel.js component). Same fix
   shape as `.habit-category` above: keep the warm amber wash for the pill
   background, re-point the TEXT to cozy-ink. */
[data-ux-mode="cozy"] .habit-streak {
    color: var(--cozy-ink) !important;
    background: rgba(245, 158, 11, 0.18) !important;
    border: 1px solid rgba(245, 158, 11, 0.35) !important;
}
/* Advanced-mode toggle row text assumes a dark surface around it. */
[data-ux-mode="cozy"] .advanced-toggle,
[data-ux-mode="cozy"] .advanced-toggle .toggle-text,
[data-ux-mode="cozy"] .advanced-toggle p,
[data-ux-mode="cozy"] .advanced-toggle a {
    background-color: transparent !important;
}
[data-ux-mode="cozy"] .advanced-toggle,
[data-ux-mode="cozy"] .advanced-toggle * {
    color: var(--cozy-ink) !important;
}

/* ---- Pricing page (pricing.html inline <style>) ---------------------- */
/* Every light-text rule below is defined inside the page's own <style>
   block as `color: rgba(248, 250, 252, *)` or `color: #f8fafc`. Cozy
   needs to re-point them to ink. */
[data-ux-mode="cozy"] .pricing-hero p,
[data-ux-mode="cozy"] .pricing-hero span,
[data-ux-mode="cozy"] .pricing-features li,
[data-ux-mode="cozy"] .faq-item p,
[data-ux-mode="cozy"] .pricing-toggle span,
[data-ux-mode="cozy"] .pricing-toggle span.active,
[data-ux-mode="cozy"] .pricing-card .price-period,
[data-ux-mode="cozy"] .pricing-card .price-sub {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .faq-item strong,
[data-ux-mode="cozy"] .pricing-card h3,
[data-ux-mode="cozy"] .pricing-card .price {
    color: var(--cozy-ink) !important;
    font-weight: 700;
}
[data-ux-mode="cozy"] .pricing-toggle {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .pricing-toggle span.active {
    background: var(--cozy-paper) !important;
    box-shadow: 0 1px 3px var(--cozy-warm-shadow) !important;
}

/* ---- Progress page (my-progress.html) -------------------------------- */
/* Generated report cards use `rgb(249,250,251)` strong text on near-cream. */
[data-ux-mode="cozy"] .progress-report strong,
[data-ux-mode="cozy"] .report-body strong,
[data-ux-mode="cozy"] .cec-report strong,
[data-ux-mode="cozy"] .summary-card strong {
    color: var(--cozy-ink) !important;
    font-weight: 700;
}

/* ---- Profile personality pills (user_profile.html) ------------------- */
/* Tiny `rgb(226,232,240)` pills showing personality names on cream. */
[data-ux-mode="cozy"] .tier-badge,
[data-ux-mode="cozy"] .personality-pill,
[data-ux-mode="cozy"] .persona-pill,
[data-ux-mode="cozy"] .persona-card .persona-label,
[data-ux-mode="cozy"] .summary-section [style*="color"] {
    color: var(--cozy-ink) !important;
}

/* ---- Timeline wizard launcher cards ---------------------------------- */
/* `.wizard-launcher-arrow { color: rgba(255,255,255,0.4) }` on cream. */
[data-ux-mode="cozy"] .wizard-launcher-arrow {
    color: var(--cozy-gold) !important;
}
[data-ux-mode="cozy"] .wizard-launcher-card:hover .wizard-launcher-arrow {
    color: var(--cozy-rose-dark) !important;
}

/* ---- Timeline event-category pills (outside .timeline-event) --------- */
/* The existing `.timeline-event .event-category { color: #fff }` rule
   works only when the pill is inside a timeline-event card, which has a
   solid category-color background. A bare `.event-category` with a 20%
   alpha background paints white text on cream — invisible. Force a
   readable fallback: cozy ink on paper-elevated. Timeline-event cards
   continue to use the white-on-saturated-bg treatment. */
[data-ux-mode="cozy"] .event-category {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .event-category.goal,
[data-ux-mode="cozy"] .event-category.career,
[data-ux-mode="cozy"] .event-category.education,
[data-ux-mode="cozy"] .event-category.personal,
[data-ux-mode="cozy"] .event-category.habit,
[data-ux-mode="cozy"] .event-category.learning,
[data-ux-mode="cozy"] .event-category.vision,
[data-ux-mode="cozy"] .event-category.values {
    /* Darken the pill's text to full-ink and give it enough bg opacity to
       separate from cream. */
    color: var(--cozy-ink) !important;
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid var(--cozy-gold-soft) !important;
}
/* Inside a timeline-event card the category pill sits on a saturated bg,
   so white-on-saturated keeps the original intent. Re-affirm so our
   broader cozy rule above doesn't override it. */
[data-ux-mode="cozy"] .timeline-event .event-category {
    color: #fff !important;
}

/* ---- "Managed by admin" / "coming soon" captions --------------------- */
/* Small caption text with rgba(248,250,252,0.7) hardcoded. */
[data-ux-mode="cozy"] small[style*="248, 250, 252"],
[data-ux-mode="cozy"] span[style*="248, 250, 252"],
[data-ux-mode="cozy"] div[style*="248, 250, 252"] {
    color: var(--cozy-ink-muted) !important;
}

/* ---- Mobile bottom nav: ensure cream surface in cozy ----------------- */
/* Some builds compute the bottom-nav bg from dark tokens; force cream. */
[data-ux-mode="cozy"] .mobile-bottom-nav,
[data-ux-mode="cozy"] .mbn,
[data-ux-mode="cozy"] .mbn-bar,
[data-ux-mode="cozy"] nav.mobile-bottom-nav {
    background: var(--cozy-paper-elevated) !important;
    border-top: var(--cozy-border-hairline) !important;
    box-shadow: 0 -2px 12px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .mobile-bottom-nav a,
[data-ux-mode="cozy"] .mobile-bottom-nav .nav-icon,
[data-ux-mode="cozy"] .mobile-bottom-nav .nav-text,
[data-ux-mode="cozy"] .mbn a,
[data-ux-mode="cozy"] .mbn .mbn-icon,
[data-ux-mode="cozy"] .mbn .mbn-label {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .mobile-bottom-nav a.active,
[data-ux-mode="cozy"] .mobile-bottom-nav a.active .nav-text,
[data-ux-mode="cozy"] .mbn a.active,
[data-ux-mode="cozy"] .mbn a.active .mbn-label {
    color: var(--cozy-rose-dark) !important;
}

/* ---- Challenges page tab buttons ------------------------------------- */
/* `.tab-btn.active` sets color: #f8fafc and a near-cream bg — invisible. */
[data-ux-mode="cozy"] .tab-btn,
[data-ux-mode="cozy"] .tab-btn.active {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .tab-btn.active {
    background: var(--cozy-paper-elevated) !important;
    border-bottom: 2px solid var(--cozy-rose) !important;
}

/* ---- Footer links — darken rose for body-text contrast --------------- */
/* `#C66B6B` on cream is 3.21 — fine for H1 / big cards, fails AA for
   footer link text. `--cozy-rose-dark` (#A85555) is still 4.49 — right
   on the line. Use `#9D4A4A` which measures ≈4.95 on cream paper — a
   comfortable AA pass for 17px link text. */
[data-ux-mode="cozy"] footer a,
[data-ux-mode="cozy"] .dashboard-footer-links a,
[data-ux-mode="cozy"] .site-footer a,
[data-ux-mode="cozy"] .footer-links a {
    color: #9D4A4A !important;
}
[data-ux-mode="cozy"] footer a:hover,
[data-ux-mode="cozy"] .dashboard-footer-links a:hover,
[data-ux-mode="cozy"] .site-footer a:hover,
[data-ux-mode="cozy"] .footer-links a:hover {
    color: #7F3E3E !important;
}

/* ---- Inline dark-glass backgrounds on user_profile.html -------------- */
/* `#aiBossStatus` and friends inline `background: rgba(5, 10, 20, 0.6)`. */
[data-ux-mode="cozy"] #aiBossStatus,
[data-ux-mode="cozy"] #aiBossSchedules,
[data-ux-mode="cozy"] [id$="Status"][style*="rgba(5"],
[data-ux-mode="cozy"] [id$="Status"][style*="rgba(15"] {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] #aiBossStatusText,
[data-ux-mode="cozy"] #morningNextRun,
[data-ux-mode="cozy"] #eveningNextRun {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] #aiBossSchedules p {
    color: var(--cozy-ink-muted) !important;
}

/* `#2c3e50` footer on user_profile.html (hard-coded inline). */
[data-ux-mode="cozy"] footer[style*="2c3e50"],
[data-ux-mode="cozy"] footer[style*="#2c3e50"] {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border-top: var(--cozy-border-hairline) !important;
    box-shadow: 0 -1px 0 var(--cozy-gold-soft) !important;
}
[data-ux-mode="cozy"] footer[style*="2c3e50"] *,
[data-ux-mode="cozy"] footer[style*="#2c3e50"] * {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] footer[style*="2c3e50"] a,
[data-ux-mode="cozy"] footer[style*="#2c3e50"] a {
    color: #9D4A4A !important;  /* footer rose — AA ≈4.95 on cream */
}

/* Summary-value numbers ("57%" etc.) on profile — `#fbbf24` amber is
   illegible on cream (1.62). Use cozy gold-dark. */
[data-ux-mode="cozy"] .summary-value {
    color: #8A6E3C !important;  /* darker gold — ≈ 4.6 on cream */
}

/* Inline light-purple "Additional Features" banner (#c4b5fd). */
[data-ux-mode="cozy"] [style*="#c4b5fd"],
[data-ux-mode="cozy"] [style*="#C4B5FD"] {
    color: var(--cozy-ink) !important;
}

/* ---- Belt-and-braces: white text on cream is always invisible -------- */
/* When a page sets a literal white text color on an element that lands on
   cream paper in cozy, pull it back to ink. Restricted to body copy; we
   leave buttons, badges and hero chips alone (they usually sit on a
   saturated rose/gold bg where white is correct). */
[data-ux-mode="cozy"] p[style*="color: #fff"],
[data-ux-mode="cozy"] p[style*="color:#fff"],
[data-ux-mode="cozy"] span[style*="color: #fff"],
[data-ux-mode="cozy"] span[style*="color:#fff"],
[data-ux-mode="cozy"] div[style*="color: #fff"],
[data-ux-mode="cozy"] div[style*="color:#fff"] {
    /* Only override when the inline style is the *only* color source; we
       can't fully guarantee this in CSS, but inline styles almost always
       mean the author was tuning for standard dark mode. */
    color: var(--cozy-ink) !important;
}

/* --- Timeline + Progress cozy-mode fixes ------------------------------
   Root cause: timeline-page.css (and several dashboard pages) use
   semi-transparent dark rgba() gradients as card/container backgrounds.
   On dark body they look clean. On cozy's cream body they look muddy,
   and the white/rgba(255,255,255,*) text colors on top become low-
   contrast. These overrides anchor the backgrounds to cozy-paper and
   the text to cozy-ink.
   ---------------------------------------------------------------------- */

/* Timeline hero + filter bar + container panels */
[data-ux-mode="cozy"] .timeline-hero,
[data-ux-mode="cozy"] .timeline-hero-modern,
[data-ux-mode="cozy"] .timeline-container,
[data-ux-mode="cozy"] .filter-bar,
[data-ux-mode="cozy"] .wizard-launcher-panel,
[data-ux-mode="cozy"] .view-toggle-wrapper {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    box-shadow: 0 6px 18px var(--cozy-warm-shadow) !important;
    color: var(--cozy-ink) !important;
    backdrop-filter: none !important;
}

[data-ux-mode="cozy"] .timeline-hero h1,
[data-ux-mode="cozy"] .timeline-hero-modern h1,
[data-ux-mode="cozy"] .timeline-hero p,
[data-ux-mode="cozy"] .timeline-hero-modern p {
    color: var(--cozy-ink) !important;
}

/* Filter-bar internals: search input, pills, toggles */
[data-ux-mode="cozy"] .filter-bar input,
[data-ux-mode="cozy"] .filter-search-wrap input,
[data-ux-mode="cozy"] .filter-search-input {
    background: var(--cozy-paper) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}

[data-ux-mode="cozy"] .filter-bar input::placeholder,
[data-ux-mode="cozy"] .filter-search-input::placeholder {
    color: var(--cozy-ink-faded) !important;
}

/* View toggle (Timeline / Grid) + guide button */
[data-ux-mode="cozy"] .view-toggle,
[data-ux-mode="cozy"] .view-toggle button,
[data-ux-mode="cozy"] .tab-toggle,
[data-ux-mode="cozy"] .tab-toggle button {
    background: var(--cozy-paper) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}

[data-ux-mode="cozy"] .view-toggle button.active,
[data-ux-mode="cozy"] .tab-toggle button.active,
[data-ux-mode="cozy"] .view-toggle .active {
    background: var(--cozy-rose) !important;
    color: var(--cozy-paper) !important;
}

/* Category / filter pills */
[data-ux-mode="cozy"] .filter-pill,
[data-ux-mode="cozy"] .cat-filter-pill,
[data-ux-mode="cozy"] .category-pill {
    background: var(--cozy-paper) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}

[data-ux-mode="cozy"] .filter-pill.active,
[data-ux-mode="cozy"] .cat-filter-pill.active,
[data-ux-mode="cozy"] .category-pill.active {
    background: var(--cozy-rose) !important;
    color: var(--cozy-paper) !important;
    border-color: var(--cozy-rose) !important;
}

/* ---------- Wizard launcher cards (the muddy green/blue cards) ---- */
[data-ux-mode="cozy"] .wizard-launcher-card,
[data-ux-mode="cozy"] .wizard-launcher-add,
[data-ux-mode="cozy"] .wizard-launcher-record,
[data-ux-mode="cozy"] .wizard-launcher-plan,
[data-ux-mode="cozy"] .wizard-launcher-track,
[data-ux-mode="cozy"] .wizard-launcher-solve,
[data-ux-mode="cozy"] .wizard-launcher-other,
[data-ux-mode="cozy"] [class*="wizard-launcher-"] {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    color: var(--cozy-ink) !important;
    box-shadow: 0 4px 12px var(--cozy-warm-shadow) !important;
    backdrop-filter: none !important;
}

[data-ux-mode="cozy"] .wizard-launcher-card::before {
    display: none !important;
}

[data-ux-mode="cozy"] .wizard-launcher-card:hover,
[data-ux-mode="cozy"] .wizard-launcher-add:hover {
    background: var(--cozy-paper) !important;
    border-color: var(--cozy-rose) !important;
    box-shadow: 0 10px 24px var(--cozy-warm-shadow) !important;
    transform: translateY(-2px);
}

[data-ux-mode="cozy"] .wizard-launcher-content h3,
[data-ux-mode="cozy"] .wizard-launcher-content p {
    color: var(--cozy-ink) !important;
}

[data-ux-mode="cozy"] .wizard-launcher-content p {
    color: var(--cozy-ink-muted) !important;
}

[data-ux-mode="cozy"] .wizard-launcher-arrow {
    color: var(--cozy-ink-muted) !important;
}

[data-ux-mode="cozy"] .wizard-launcher-card:hover .wizard-launcher-arrow {
    color: var(--cozy-rose) !important;
}

/* ---------- Progress / reward / guide / dashboard cards ---------- */
[data-ux-mode="cozy"] .progress-card,
[data-ux-mode="cozy"] .reward-card,
[data-ux-mode="cozy"] .guide-card,
[data-ux-mode="cozy"] .guide-card-content,
[data-ux-mode="cozy"] .dashboard-card {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    color: var(--cozy-ink) !important;
    box-shadow: 0 4px 12px var(--cozy-warm-shadow) !important;
    backdrop-filter: none !important;
}

[data-ux-mode="cozy"] .progress-card h1,
[data-ux-mode="cozy"] .progress-card h2,
[data-ux-mode="cozy"] .progress-card h3,
[data-ux-mode="cozy"] .progress-card p,
[data-ux-mode="cozy"] .reward-card h3,
[data-ux-mode="cozy"] .reward-card p,
[data-ux-mode="cozy"] .guide-card h3,
[data-ux-mode="cozy"] .guide-card p,
[data-ux-mode="cozy"] .guide-card-icon {
    color: var(--cozy-ink) !important;
}

/* View-toggle labels (Timeline/Grid) + switch slider */
[data-ux-mode="cozy"] .view-label {
    color: var(--cozy-ink-muted) !important;
}

[data-ux-mode="cozy"] .view-label.active {
    color: var(--cozy-ink) !important;
    font-weight: 700;
}

[data-ux-mode="cozy"] .view-toggle-wrapper .switch .slider {
    background: var(--cozy-paper) !important;
    border: 1px solid var(--cozy-ink-muted) !important;
}

[data-ux-mode="cozy"] .view-toggle-wrapper .switch input:checked + .slider,
[data-ux-mode="cozy"] .view-toggle-wrapper .switch input:checked ~ .slider {
    background: var(--cozy-rose) !important;
    border-color: var(--cozy-rose) !important;
}

/* --- iSpirit personality card (spirit-baby.html, added 2026-05-09) ---- */
/* Card uses inline styles (rgba(20,18,32,.78) ink-on-ink in cozy = 1.6:1).
   Override with !important to win over inline. */
[data-ux-mode="cozy"] .ispirit-persona-card,
[data-ux-mode="cozy"] section.ispirit-persona-card {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(26, 36, 56, 0.12) !important;
    box-shadow: 0 4px 24px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .ispirit-persona-card h3,
[data-ux-mode="cozy"] .ispirit-persona-card p {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .ispirit-persona-card #ispirit-persona-sub {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .ispirit-persona-card a,
[data-ux-mode="cozy"] .ispirit-persona-card .ispirit-persona-card__cta {
    background: var(--cozy-rose) !important;
    color: #ffffff !important;
}
[data-ux-mode="cozy"] .ispirit-persona-card #ispirit-persona-revert {
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(26, 36, 56, 0.25) !important;
    background: transparent !important;
}

/* --- Journal calendar widget (journal-calendar.html) ----------------- */
/* Whole calendar grid had no cozy override — white-on-white in cozy. */
[data-ux-mode="cozy"] .calendar-grid {
    background: rgba(166, 130, 85, 0.20) !important;
}
[data-ux-mode="cozy"] .calendar-day-header {
    background: var(--cozy-paper) !important;
    color: var(--cozy-ink-muted) !important;
    border-bottom: 1px solid rgba(166, 130, 85, 0.25) !important;
}
[data-ux-mode="cozy"] .calendar-day,
[data-ux-mode="cozy"] .calendar-nav-btn {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border-color: rgba(26, 36, 56, 0.12) !important;
}
[data-ux-mode="cozy"] .calendar-nav-btn {
    background: var(--cozy-rose) !important;
    color: #ffffff !important;
    box-shadow: 0 4px 15px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .calendar-nav-btn:hover {
    background: var(--cozy-rose-dark) !important;
    color: #ffffff !important;
}
[data-ux-mode="cozy"] .calendar-nav-btn:disabled {
    background: var(--cozy-ink-muted) !important;
    color: var(--cozy-paper) !important;
    opacity: 0.6 !important;
}
[data-ux-mode="cozy"] .calendar-day.current-month {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .calendar-day.other-month {
    background: rgba(166, 130, 85, 0.06) !important;
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .calendar-day:hover {
    background: rgba(182, 151, 99, 0.18) !important;
    border-color: var(--cozy-gold) !important;
}
[data-ux-mode="cozy"] .calendar-day.today {
    background: linear-gradient(135deg,
        rgba(198, 107, 107, 0.18) 0%,
        rgba(182, 151, 99, 0.18) 100%) !important;
    border-color: var(--cozy-rose) !important;
    box-shadow: inset 0 0 0 1px var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .calendar-day.today .day-number {
    color: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] .calendar-day.selected {
    background: var(--cozy-rose) !important;
    color: #ffffff !important;
    border-color: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] .calendar-day.selected .day-number,
[data-ux-mode="cozy"] .calendar-day.selected .day-emoji {
    color: #ffffff !important;
}

/* ======================================================================
   Phase 4 cozy component overrides — 2026-05-17
   The cozy-mode-visual-reviewer audit found whole-panel misses where a
   dark hardcoded background never flips, leaving cozy ink invisible.
   Each block flips the panel to warm paper + restores legible ink.
   ====================================================================== */

/* --- Wisdom: spirit-card family (wisdom.html page-scoped <style>) ------ */
[data-ux-mode="cozy"] .spirit-card {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    box-shadow: 0 6px 18px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .spirit-card h3,
[data-ux-mode="cozy"] .spirit-history-title,
[data-ux-mode="cozy"] .spirit-history-question,
[data-ux-mode="cozy"] .spirit-stat-list strong {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .spirit-card p,
[data-ux-mode="cozy"] .spirit-history-meta,
[data-ux-mode="cozy"] .spirit-history-insight,
[data-ux-mode="cozy"] .spirit-history-empty,
[data-ux-mode="cozy"] .spirit-text-muted {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .spirit-stat-list li,
[data-ux-mode="cozy"] .spirit-history-item {
    background: var(--cozy-paper) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .spirit-history-empty {
    border: 1px dashed var(--cozy-gold-soft) !important;
}
[data-ux-mode="cozy"] .spirit-baby-info-banner {
    background: rgba(182, 151, 99, 0.12) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .spirit-baby-info-banner p,
[data-ux-mode="cozy"] .spirit-baby-info-banner * {
    color: var(--cozy-ink) !important;
}
/* status chips — dark-on-dark in cozy; give each a warm tint + ink */
[data-ux-mode="cozy"] .spirit-chip {
    background: rgba(182, 151, 99, 0.16) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .spirit-chip.status-completed,
[data-ux-mode="cozy"] .spirit-chip.success {
    background: rgba(126, 151, 119, 0.20) !important;
    color: #3f5238 !important;
}
[data-ux-mode="cozy"] .spirit-chip.status-error {
    background: rgba(198, 107, 107, 0.18) !important;
    color: var(--cozy-rose-dark) !important;
}

/* --- Wizard workspace: dark slate panels (wizard-workspace.css) --------
   The whole surface is a hardcoded dark theme. cozy-theme.css is now
   linked on timeline-wizard-workspace.html; these rules flip the panel
   stack to warm paper. Roots → cream bg; cards → elevated; text → ink. */
[data-ux-mode="cozy"] .wizard-workspace,
[data-ux-mode="cozy"] .wizard-stage,
[data-ux-mode="cozy"] .wizard-stage__content-wrapper,
[data-ux-mode="cozy"] .wizard-stage__body,
[data-ux-mode="cozy"] .wizard-step-container,
[data-ux-mode="cozy"] .wizard-v2-shell,
[data-ux-mode="cozy"] .wizard-v2-grid {
    background: var(--cozy-paper) !important;
}
[data-ux-mode="cozy"] .wizard-v2-card,
[data-ux-mode="cozy"] .wizard-unified-header,
[data-ux-mode="cozy"] .wizard-panel {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    box-shadow: 0 6px 18px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .wizard-textarea,
[data-ux-mode="cozy"] .wizard-input,
[data-ux-mode="cozy"] .wizard-v2-card textarea,
[data-ux-mode="cozy"] .wizard-v2-card input {
    background: #ffffff !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .wizard-panel__title,
[data-ux-mode="cozy"] .wizard-v2-card h2,
[data-ux-mode="cozy"] .wizard-v2-card h3,
[data-ux-mode="cozy"] .wizard-v2-card h4,
[data-ux-mode="cozy"] .wizard-unified-header h1,
[data-ux-mode="cozy"] .wizard-unified-header h2 {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .wizard-panel__meta,
[data-ux-mode="cozy"] .wizard-v2-card p,
[data-ux-mode="cozy"] .wizard-v2-card label,
[data-ux-mode="cozy"] .wizard-stage__body p {
    color: var(--cozy-ink-muted) !important;
}

/* --- WARNING-tier ratio bumps ----------------------------------------- */
/* Habits info banner + advanced-mode toggle text were grey-on-cream */
[data-ux-mode="cozy"] .habits-info {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .habits-info p,
[data-ux-mode="cozy"] .habits-info a,
[data-ux-mode="cozy"] #advancedModeToggle .toggle-text {
    color: var(--cozy-ink) !important;
}
/* Journal active filter pill — bump from 3.2:1 to AA */
[data-ux-mode="cozy"] .filter-pill.active {
    background: var(--cozy-rose) !important;
    color: #ffffff !important;
    border-color: var(--cozy-rose-dark) !important;
}
/* AppShell dashboard footer — grey-on-grey */
[data-ux-mode="cozy"] #dashboardFooter,
[data-ux-mode="cozy"] .dashboard-footer {
    background: var(--cozy-paper-elevated) !important;
}
[data-ux-mode="cozy"] #dashboardFooter a,
[data-ux-mode="cozy"] .dashboard-footer a,
[data-ux-mode="cozy"] #dashboardFooter span,
[data-ux-mode="cozy"] .dashboard-footer span {
    color: var(--cozy-ink-muted) !important;
}

/* ======================================================================
   Phase 4 WARNING-tier chip/badge fixes — 2026-05-17 (round B+C)
   Audit found several 3–4.5:1 ratios across chips/links/badges. Each
   rule bumps the foreground to ink (or rose/sage where the chip is
   semantic) on a warm tint background.
   ====================================================================== */

/* Progress chips + cec-plans empty state */
[data-ux-mode="cozy"] .today-card__goal,
[data-ux-mode="cozy"] .milestone-goal-label,
[data-ux-mode="cozy"] .milestone-tasks-badge {
    background: rgba(182, 151, 99, 0.16) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .cec-plans-empty {
    color: var(--cozy-ink-muted) !important;
}

/* Timeline chips, year-count, filter-search icon */
[data-ux-mode="cozy"] .year-count,
[data-ux-mode="cozy"] .event-category,
[data-ux-mode="cozy"] .event-category.milestone {
    background: rgba(182, 151, 99, 0.16) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .filter-search-icon { color: var(--cozy-ink-muted) !important; }

/* Journal: bulk-import link icon */
[data-ux-mode="cozy"] #bulkImportLink .jac-icon { color: var(--cozy-ink) !important; }

/* Spirit-baby stage tag + creature note */
[data-ux-mode="cozy"] .empire-scene-stage-tag {
    background: rgba(182, 151, 99, 0.20) !important;
    color: var(--cozy-ink) !important;
    border: var(--cozy-border-hairline) !important;
}
[data-ux-mode="cozy"] .empire-scene-creature-note {
    color: var(--cozy-ink) !important;
}

/* Insights empty-state CTA links: markup uses #correlationsGrid / #recommendationsList
   (IDs, not .class). The inline blue bg (#2e8ab8) gives ink 4.02:1 / paper 3.5:1 — both
   fail. Override the bg to rose (paper text = 5.63:1). Inline bg is non-!important so we win. */
[data-ux-mode="cozy"] #correlationsGrid a,
[data-ux-mode="cozy"] #recommendationsList a,
[data-ux-mode="cozy"] .no-data a,
[data-ux-mode="cozy"] #dashboardStats .stat-card a,
[data-ux-mode="cozy"] #achievementFeed .no-data a {
    background: var(--cozy-rose) !important;
    background-image: none !important;
    color: var(--cozy-paper) !important;
    text-decoration-color: var(--cozy-paper) !important;
    border-color: var(--cozy-rose) !important;
}

/* Profile: 4-tab inactive nav button was 3.83:1 */
[data-ux-mode="cozy"] .profile-nav-btn {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .profile-nav-btn.active,
[data-ux-mode="cozy"] .profile-nav-btn[aria-selected="true"] {
    color: var(--cozy-ink) !important;
    background: rgba(168, 71, 95, 0.10) !important;
    border-color: var(--cozy-rose) !important;
}

/* Premium voice usage olive-on-purple (~2:1) */
[data-ux-mode="cozy"] #premiumVoiceUsage {
    color: var(--cozy-ink-muted) !important;
}

/* Leaderboard empty-state icon was 1.07 (gradient text invisible) */
[data-ux-mode="cozy"] .leaderboard-empty-icon {
    color: var(--cozy-rose) !important;
    background: none !important;
    -webkit-text-fill-color: var(--cozy-rose) !important;
}

/* ==========================================================================
 * WIZARDS LAUNCHER + HABITS gap-close — cozy-r3 (2026-05-17)
 * --------------------------------------------------------------------------
 * Audit found four whole-component misses on /habits.html and
 * /timeline-wizard-workspace.html: (1) the featured-wizard icon chip
 * (`.wf-ico`) is cyan-on-cream + 1.1:1; (2) `.wf-arrow` cyan link →
 * cozy rose link; (3) the habits stat-grid `.filter-pill` row reuses
 * the dark-glass base for inactive; (4) the wizard-tmpl alternate
 * `.wt-cta`/`.wt-foot`/`.wt-head` family from app-shell.css still
 * reads as cyan-on-cream. Per-page CSS handles its own variants;
 * these rules cover the SHARED app-shell classes the per-page CSS
 * doesn't own. All scoped to [data-ux-mode="cozy"]; no standard
 * regression. AA verified by token reuse (gold-on-cream = 4.95).
 * ========================================================================== */

/* Featured wizard cards — `.wizard-feature` family from app-shell.css.
 * app-shell.css already swaps the card bg for cozy; we cover the
 * icon chip, count, arrow link, and body color which it does not. */
[data-ux-mode="cozy"] .wf-ico {
    background: rgba(168, 71, 95, 0.10) !important;
    color: var(--cozy-rose-dark, #8F3A4F) !important;
    border: 1px solid rgba(168, 71, 95, 0.22) !important;
}
[data-ux-mode="cozy"] .wizard-feature.primary .wf-ico {
    /* primary card uses gradient-brand in standard — replace with
     * solid cozy rose on white so the icon stays high-contrast. */
    background: var(--cozy-rose, #A8475F) !important;
    color: #ffffff !important;
    border-color: transparent !important;
}
[data-ux-mode="cozy"] .wizard-feature {
    color: var(--cozy-ink, #1A2438) !important;
    border-color: rgba(166, 130, 85, 0.22) !important;
}
[data-ux-mode="cozy"] .wf-body h3 { color: var(--cozy-ink, #1A2438) !important; }
[data-ux-mode="cozy"] .wf-body p { color: var(--cozy-ink-muted, #5A5540) !important; }
[data-ux-mode="cozy"] .wf-meta { color: var(--cozy-ink-muted, #5A5540) !important; }
[data-ux-mode="cozy"] .wf-arrow {
    color: var(--cozy-rose, #A8475F) !important;
}
[data-ux-mode="cozy"] .wizard-feature:hover .wf-arrow {
    color: var(--cozy-rose-dark, #8F3A4F) !important;
}
[data-ux-mode="cozy"] .wizard-feature:hover {
    border-color: rgba(168, 71, 95, 0.40) !important;
    box-shadow: 0 8px 22px rgba(90, 60, 30, 0.14) !important;
}

/* Wizard template cards from app-shell.css (`.wizard-tmpl` family).
 * Cozy mirror of the new `.wiz-tmpl-card` rules so the older variant
 * still reads correctly when a page renders it. */
[data-ux-mode="cozy"] .wizard-tmpl {
    border-color: rgba(166, 130, 85, 0.22) !important;
    color: var(--cozy-ink, #1A2438) !important;
}
[data-ux-mode="cozy"] .wizard-tmpl:hover {
    border-color: rgba(168, 71, 95, 0.40) !important;
}
[data-ux-mode="cozy"] .wt-head h4 { color: var(--cozy-ink, #1A2438) !important; }
[data-ux-mode="cozy"] .wizard-tmpl p { color: var(--cozy-ink-muted, #5A5540) !important; }
[data-ux-mode="cozy"] .wt-foot { color: var(--cozy-ink-muted, #5A5540) !important; }
[data-ux-mode="cozy"] .wt-cta {
    color: var(--cozy-rose, #A8475F) !important;
}
[data-ux-mode="cozy"] .wizard-tmpl:hover .wt-cta {
    color: var(--cozy-rose-dark, #8F3A4F) !important;
}

/* Wizard browse/build action buttons in the page-head */
[data-ux-mode="cozy"] .wizard-page-shell .page-head .btn {
    background: var(--cozy-paper-elevated, #FFFBF2) !important;
    border-color: rgba(166, 130, 85, 0.35) !important;
    color: var(--cozy-ink, #1A2438) !important;
}
[data-ux-mode="cozy"] .wizard-page-shell .page-head .btn-primary {
    background: var(--cozy-rose, #A8475F) !important;
    border-color: var(--cozy-rose-dark, #8F3A4F) !important;
    color: #ffffff !important;
}
[data-ux-mode="cozy"] .wizard-page-shell .page-head .btn-primary:hover {
    background: var(--cozy-rose-dark, #8F3A4F) !important;
    color: #ffffff !important;
}

/* Wizard launcher card eyebrow + meta from the older launcher panel */
[data-ux-mode="cozy"] .wizard-launcher-card__badge {
    background: rgba(182, 151, 99, 0.18) !important;
    border-color: rgba(182, 151, 99, 0.40) !important;
    color: #6b5424 !important;
}
[data-ux-mode="cozy"] .wizard-launcher-card__title {
    color: var(--cozy-ink, #1A2438) !important;
    /* No serif fallback: the token is always defined above, so the old
       `, 'Fraunces', Georgia, serif` arm was unreachable and now misdescribes
       the theme (cozy is sans throughout, matching standard). */
    font-family: var(--cozy-font-display) !important;
}

/* ==========================================================================
 * CHAT PAGE — Cozy parity sweep (2026-05-17 r1)
 * --------------------------------------------------------------------------
 * chat_inline.css ships a dark-glass `body.chat-page` baseline (specificity
 * 0,1,1) for: chat-head, .bubble.assistant, .bubble.user (purple gradient),
 * .chat-side .card, .composer + #send (cyan→purple). Cozy must override all
 * of those WITHOUT touching standard mode. Selectors mirror the same
 * `body.chat-page` shape (1,1,1) so they beat the originals on specificity.
 * ========================================================================== */

/* Chat head — chat_inline.css line 669 forces dark glass on .chat-head under
   body.chat-page, which beats the lone [data-ux-mode="cozy"] .chat-head
   override at line 336. Re-state with the body selector so cozy wins. */
[data-ux-mode="cozy"] body.chat-page .chat-head {
    background: var(--cozy-paper-elevated) !important;
    border-color: rgba(166, 130, 85, 0.28) !important;
    box-shadow: 0 4px 14px rgba(90, 60, 30, 0.08) !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-head-name .persona-name,
[data-ux-mode="cozy"] body.chat-page .chat-head-name [data-role="ispirit-nickname"] {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-head-name .as,
[data-ux-mode="cozy"] body.chat-page .chat-head-sub {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-head-sub .stage-chip {
    background: rgba(182, 151, 99, 0.15) !important;
    border-color: rgba(182, 151, 99, 0.42) !important;
    color: #8a6d4b !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-head-personas {
    background: rgba(182, 151, 99, 0.08) !important;
    border-color: rgba(166, 130, 85, 0.24) !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-head-personas .persona-btn.on {
    border-color: var(--cozy-rose) !important;
    box-shadow: 0 0 0 2px rgba(168, 71, 95, 0.20), 0 4px 12px rgba(168, 71, 95, 0.30) !important;
}

/* Assistant (iSpirit) bubble — was dark rgba(15,23,42,0.78) */
[data-ux-mode="cozy"] body.chat-page .bubble.assistant {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.28) !important;
    box-shadow: 0 4px 12px rgba(90, 60, 30, 0.08) !important;
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] body.chat-page .bubble.assistant .bubble-text,
[data-ux-mode="cozy"] body.chat-page .bubble.assistant .bubble-text * {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] body.chat-page .bubble.assistant .bubble-time {
    color: var(--cozy-ink-muted) !important;
    opacity: 0.75;
}
[data-ux-mode="cozy"] body.chat-page .row.assistant .avatar {
    background: rgba(168, 71, 95, 0.12) !important;
    border-color: rgba(168, 71, 95, 0.30) !important;
}

/* User bubble — was purple→violet gradient. Cozy: rose→burgundy.
   chat_inline.css line 557 already sets a cozy override but it's still
   purple (#7c3aed → #a78bfa). Replace with rose→burgundy for true cozy. */
[data-ux-mode="cozy"] body.chat-page .bubble.user,
[data-ux-mode="cozy"].chat-page .bubble.user {
    background: linear-gradient(135deg, var(--cozy-rose) 0%, #8B3A3A 100%) !important;
    border: 1px solid rgba(143, 58, 79, 0.45) !important;
    color: #FFFBF2 !important;
    box-shadow: 0 4px 12px rgba(143, 58, 79, 0.24) !important;
}
[data-ux-mode="cozy"] body.chat-page .bubble.user .bubble-text,
[data-ux-mode="cozy"] body.chat-page .bubble.user .bubble-text *,
[data-ux-mode="cozy"] body.chat-page .bubble.user .bubble-time {
    color: #FFFBF2 !important;
}
[data-ux-mode="cozy"] body.chat-page .bubble.user .bubble-time {
    color: rgba(255, 251, 242, 0.92) !important;  /* round 33: 0.75 → 0.92 to clear WCAG AA (was 4.31:1) on the rose bubble */
}
/* User avatar — purple gradient circle */
[data-ux-mode="cozy"] body.chat-page .row.user .avatar {
    background: linear-gradient(135deg, var(--cozy-rose) 0%, #8B3A3A 100%) !important;
    border-color: rgba(143, 58, 79, 0.45) !important;
    color: #FFFBF2 !important;
}

/* Right-rail cards (.chat-side .card) — were dark glass rgba(8,13,26,0.82) */
[data-ux-mode="cozy"] body.chat-page .chat-side .card {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.24) !important;
    box-shadow: 0 4px 12px rgba(90, 60, 30, 0.06) !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-side .card-title,
[data-ux-mode="cozy"] body.chat-page .chat-side .guide-block h4 {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-side .guide-desc,
[data-ux-mode="cozy"] body.chat-page .chat-side .guide-line {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-side .guide-line::before {
    color: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] body.chat-page .chat-side .hold-list li {
    background: rgba(182, 151, 99, 0.08) !important;
    border: 1px solid rgba(166, 130, 85, 0.22) !important;
    color: var(--cozy-ink) !important;
}

/* Composer — outer shell was rgba(8,13,26,0.92) */
[data-ux-mode="cozy"] body.chat-page .composer,
[data-ux-mode="cozy"] body.chat-page .chat-inner > .composer {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.30) !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
    box-shadow: 0 -2px 18px rgba(90, 60, 30, 0.06) !important;
}
[data-ux-mode="cozy"] body.chat-page .composer textarea {
    background: transparent !important;
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] body.chat-page .composer textarea::placeholder {
    color: var(--cozy-ink-faded) !important;
    opacity: 1 !important;
}
[data-ux-mode="cozy"] body.chat-page .composer .composer-btn {
    background: transparent !important;
    border: 1px solid rgba(166, 130, 85, 0.30) !important;
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] body.chat-page .composer .composer-btn:hover {
    background: rgba(168, 71, 95, 0.08) !important;
    color: var(--cozy-ink) !important;
    border-color: rgba(168, 71, 95, 0.45) !important;
}

/* Send button — was cyan→purple, cozy override at chat_inline.css:658 used
   rose→#7c3aed (still purple). Replace with true rose→burgundy. */
[data-ux-mode="cozy"] body.chat-page .composer #send {
    background: linear-gradient(135deg, var(--cozy-rose) 0%, #8B3A3A 100%) !important;
    border: none !important;
    color: #FFFBF2 !important;
    box-shadow: 0 4px 14px rgba(168, 71, 95, 0.32) !important;
}
[data-ux-mode="cozy"] body.chat-page .composer #send:hover {
    background: linear-gradient(135deg, var(--cozy-rose-dark) 0%, #6B2828 100%) !important;
    box-shadow: 0 6px 18px rgba(168, 71, 95, 0.40) !important;
}

/* Quick-reply suggestion chips + journal-from-chat pills (R7-8) */
[data-ux-mode="cozy"] body.chat-page .journal-from-chat-pill,
[data-ux-mode="cozy"] body.chat-page .conversation-followup-pill {
    background: rgba(168, 71, 95, 0.06) !important;
    border: 1px dashed rgba(168, 71, 95, 0.45) !important;
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] body.chat-page .journal-from-chat-pill:hover,
[data-ux-mode="cozy"] body.chat-page .conversation-followup-pill:hover {
    background: rgba(168, 71, 95, 0.12) !important;
    border-color: var(--cozy-rose) !important;
    color: var(--cozy-ink) !important;
}

/* Memory citation badge — purple in standard, rose in cozy */
[data-ux-mode="cozy"] body.chat-page .memory-citation-badge,
[data-ux-mode="cozy"] body.chat-page .citations-badge {
    background: rgba(168, 71, 95, 0.10) !important;
    border-color: rgba(168, 71, 95, 0.30) !important;
    color: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] body.chat-page .memory-citation-badge:hover,
[data-ux-mode="cozy"] body.chat-page .citations-badge:hover {
    background: rgba(168, 71, 95, 0.16) !important;
    border-color: var(--cozy-rose) !important;
}
/* Flagged-memory badge (memory-correction.js) hardcodes an inline #ff9500 —
   ≈2.13:1 on cozy paper (review 2026-08-14, static-verified). !important
   needed to beat the inline style. #9a5a1f ≈5.2:1 on paper, same warm-amber
   slot the wizard-confidence low state uses. */
[data-ux-mode="cozy"] .memory-flagged-badge {
    color: #9a5a1f !important;
}

/* Page-head "Deep thinker" / "Voice mode" pills — already have a cozy
   override at chat_inline.css:535 but it uses generic cream. Strengthen
   contrast: add ink text + rose hover ring. */
[data-ux-mode="cozy"] .chat-page-head-actions #chatDeepThinkerBtn,
[data-ux-mode="cozy"] .chat-page-head-actions #chatVoiceModeBtn {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.35) !important;
    color: var(--cozy-ink) !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
}
[data-ux-mode="cozy"] .chat-page-head-actions #chatDeepThinkerBtn:hover,
[data-ux-mode="cozy"] .chat-page-head-actions #chatVoiceModeBtn:hover {
    background: rgba(168, 71, 95, 0.08) !important;
    border-color: rgba(168, 71, 95, 0.45) !important;
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .chat-page-head-actions #chatDeepThinkerBtn.active,
[data-ux-mode="cozy"] .chat-page-head-actions #chatVoiceModeBtn.active {
    background: linear-gradient(135deg, rgba(168, 71, 95, 0.18), rgba(143, 58, 79, 0.18)) !important;
    border-color: var(--cozy-rose) !important;
    color: var(--cozy-rose-dark) !important;
}

/* ==========================================================================
 * TIMELINE PAGE — Cozy parity sweep (2026-05-17 r1)
 * --------------------------------------------------------------------------
 * timeline-design.css already has solid cozy coverage for year groups,
 * events, and stat cards. Remaining gaps: vertical timeline-line gradient
 * (cyan→purple), event-dot amber-on-cream contrast, milestone category
 * green-on-cream chip, modal/wizard dark glass surfaces.
 * ========================================================================== */

/* Central vertical rail — was cyan→purple gradient */
[data-ux-mode="cozy"] .timeline-line {
    background: linear-gradient(180deg,
        rgba(168, 71, 95, 0.42) 0%,
        rgba(182, 151, 99, 0.32) 100%) !important;
}

/* Event dots on the rail — were amber #fbbf24 with dark-navy ring */
[data-ux-mode="cozy"] .event-dot,
[data-ux-mode="cozy"] .timeline-goal-dot {
    background: var(--cozy-rose) !important;
    border-color: var(--cozy-paper) !important;
    box-shadow: 0 0 0 2px rgba(168, 71, 95, 0.18) !important;
}

/* Year-header rail bullet (pseudo). timeline-design.css:158 uses
   gradient-brand (cyan→purple) + cyan glow. Re-tint to rose+gold. */
[data-ux-mode="cozy"] .year-section.tl-year-group > .year-header::before {
    background: linear-gradient(135deg, var(--cozy-rose) 0%, var(--cozy-gold) 100%) !important;
    box-shadow: 0 0 12px rgba(168, 71, 95, 0.35) !important;
}

/* Event-card rail dots (pseudo). timeline-design.css:220 paints with
   accent-cyan, and category subclasses use purple/cyan/green. All need
   a palette compatible with cream paper. */
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event::before {
    background: var(--cozy-rose) !important;
    box-shadow: 0 0 0 3px var(--cozy-paper) !important;
}
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-milestone::before {
    background: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-goal::before,
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-mission::before,
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-habit::before {
    background: var(--cozy-sage) !important;
}
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-challenge::before {
    background: var(--cozy-gold) !important;
}
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-reflection::before,
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-learning::before,
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-vision::before,
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-career::before {
    background: #6B8AB5 !important;        /* muted teal-slate readable on cream */
}
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-relationship::before {
    background: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-achievement::before,
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event.cat-values::before {
    background: var(--cozy-rose-dark) !important;
}

/* Central rail (.tl-rail::before) — re-tint vertical line to rose/gold */
[data-ux-mode="cozy"] .timeline-content.tl-rail::before {
    background: linear-gradient(180deg,
        rgba(168, 71, 95, 0.30) 0%,
        rgba(182, 151, 99, 0.22) 100%) !important;
}

/* Milestone category chip — green tag on cream reads as chartreuse-y */
[data-ux-mode="cozy"] .event-category.milestone {
    color: #5d7a4d !important;          /* deep sage that hits ~5:1 on cream */
    border-color: rgba(126, 151, 119, 0.55) !important;
    background: rgba(126, 151, 119, 0.08) !important;
}

/* Timeline guide modal — dark glass */
[data-ux-mode="cozy"] .guide-modal.timeline-guide,
[data-ux-mode="cozy"] .timeline-guide {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.28) !important;
    color: var(--cozy-ink) !important;
    box-shadow: 0 12px 32px rgba(90, 60, 30, 0.14) !important;
}
[data-ux-mode="cozy"] .timeline-guide .timeline-guide-body,
[data-ux-mode="cozy"] .timeline-guide * {
    color: var(--cozy-ink) !important;
}

/* Timeline wizard modal shell */
[data-ux-mode="cozy"] .timeline-wizard {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.28) !important;
    color: var(--cozy-ink) !important;
    box-shadow: 0 12px 32px rgba(90, 60, 30, 0.14) !important;
}

/* Event date sublines (dates above events: "Mar 14", "Jul 11") were
   warm graphite #5A5540 ~5:1 — fine, but bump slightly for AAA */
[data-ux-mode="cozy"] .event-date {
    color: var(--cozy-ink) !important;
    opacity: 0.75;
}

/* ==========================================================================
 * EMPIRE SCENE (spirit-baby.html — Entrepreneur theme) — cozy-r4 (2026-05-17)
 * --------------------------------------------------------------------------
 * empire-scene.css hard-codes a dark-navy/purple gradient hero, the
 * "today-signal" pill on `rgba(0,0,0,0.42)`, the empire-shared-goals rail
 * on dark-glass, and the empire-cta in violet. None of these read on
 * cream paper. Re-skin them with cream surfaces, warm hairlines, and the
 * cozy rose / gold accent palette. Empire-scene structural classes
 * already use `var(--surface-1)` / `var(--fg)` which inherit cozy values
 * from tokens.css, so all panels (stats, identity, progress, content
 * panels) auto-flip — these overrides handle only the hard-coded bits.
 * ========================================================================== */

[data-ux-mode="cozy"] .empire-scene-hero,
[data-ux-mode="cozy"] .empire-stage-home_office,
[data-ux-mode="cozy"] .empire-stage-partner_office,
[data-ux-mode="cozy"] .empire-stage-team_office,
[data-ux-mode="cozy"] .empire-stage-growth_office,
[data-ux-mode="cozy"] .empire-stage-empire {
    background: linear-gradient(135deg, #FFFBF2 0%, #FCF4E2 60%, #F7EFE0 100%) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(166, 130, 85, 0.22) !important;
    box-shadow: 0 8px 24px var(--cozy-warm-shadow-lg) !important;
}
/* The hero's per-stage tint overlays (::before) were dark-purple/blue
   alpha washes. Soften to a warm-gold wash so it reads as accent, not
   gloom, on cream. */
[data-ux-mode="cozy"] .empire-stage-home_office::before,
[data-ux-mode="cozy"] .empire-stage-partner_office::before,
[data-ux-mode="cozy"] .empire-stage-team_office::before,
[data-ux-mode="cozy"] .empire-stage-growth_office::before,
[data-ux-mode="cozy"] .empire-stage-empire::before {
    background: rgba(182, 151, 99, 0.10) !important;
}
/* The decorative ::after glow was indigo. Re-tint warm. */
[data-ux-mode="cozy"] .empire-scene-hero::after {
    background: radial-gradient(circle, rgba(198, 107, 107, 0.18) 0%, transparent 70%) !important;
}
/* Creature drop-shadow was indigo — warm it. */
[data-ux-mode="cozy"] .empire-hero-creature-img {
    filter: drop-shadow(0 4px 24px rgba(168, 71, 95, 0.28)) !important;
}
/* Tagline was white-on-dark; flip to navy-on-cream. */
[data-ux-mode="cozy"] .empire-scene-tagline {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-display) !important;
}
/* Stage tag was purple chip. Re-skin as rose+gold pill. */
[data-ux-mode="cozy"] .empire-scene-stage-tag {
    color: var(--cozy-rose-dark) !important;
    background: rgba(168, 71, 95, 0.10) !important;
    border-color: rgba(168, 71, 95, 0.32) !important;
}

/* Today-signal pill was black-glass; cozy mirror = cream-glass with
   warm-shadow + navy text. */
[data-ux-mode="cozy"] .today-signal {
    background: rgba(255, 251, 242, 0.92) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(166, 130, 85, 0.28) !important;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow) !important;
}

/* Stat strip — values were #fff. Re-ink. (Labels already cozy via
   --fg-muted token cascade.) */
[data-ux-mode="cozy"] .empire-stat,
[data-ux-mode="cozy"] .empire-identity-panel,
[data-ux-mode="cozy"] .empire-scene-progress,
[data-ux-mode="cozy"] .empire-panel {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.22) !important;
    box-shadow: 0 2px 8px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .empire-stat-value {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-display) !important;
}
[data-ux-mode="cozy"] .empire-identity-pct-label strong {
    color: var(--cozy-rose-dark) !important;
}
/* Progress bar tracks were #1f2937 dark — re-tone to gold-soft. */
[data-ux-mode="cozy"] .empire-identity-bar-track,
[data-ux-mode="cozy"] .empire-progress-bar {
    background: rgba(166, 130, 85, 0.18) !important;
}
/* Gradient fills resolve via --accent-cyan/--accent-purple which
   already remap to rose/gold in cozy via tokens.css. No override
   needed, but bump opacity by re-declaring for clarity. */
[data-ux-mode="cozy"] .empire-identity-bar-fill,
[data-ux-mode="cozy"] .empire-progress-fill {
    background: linear-gradient(90deg, var(--cozy-rose) 0%, var(--cozy-gold) 100%) !important;
}
/* Identity chips were violet. Re-skin rose-tinted. */
[data-ux-mode="cozy"] .empire-identity-chip {
    background: rgba(168, 71, 95, 0.10) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(168, 71, 95, 0.28) !important;
}
/* List dots were cyan/purple — warm them. */
[data-ux-mode="cozy"] .empire-panel-list-dot {
    background: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .empire-panel-list-item--notice .empire-panel-list-dot {
    background: var(--cozy-gold) !important;
}
/* Quote text on panels was --fg light grey — anchor to navy ink. */
[data-ux-mode="cozy"] .empire-panel-quote {
    color: var(--cozy-ink) !important;
}

/* Shared Goals rail — re-skin from dark-glass to cream. */
[data-ux-mode="cozy"] .empire-shared-goals {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.22) !important;
}
[data-ux-mode="cozy"] .empire-shared-card {
    background: rgba(255, 251, 242, 0.6) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(166, 130, 85, 0.22) !important;
}
[data-ux-mode="cozy"] .empire-shared-card:hover {
    border-color: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .empire-cta {
    background: var(--cozy-rose) !important;
    color: var(--cozy-paper-elevated) !important;
    border: 1px solid var(--cozy-rose-dark) !important;
    font-family: var(--cozy-font-body) !important;
}
[data-ux-mode="cozy"] .empire-cta:hover {
    background: var(--cozy-rose-dark) !important;
    border-color: var(--cozy-rose-dark) !important;
}

/* Empire link-secondary was dark-pill. Re-skin warm. */
[data-ux-mode="cozy"] .empire-link-secondary {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(166, 130, 85, 0.28) !important;
}
[data-ux-mode="cozy"] .empire-link-secondary:hover {
    background: rgba(168, 71, 95, 0.08) !important;
    border-color: var(--cozy-rose) !important;
}

/* ==========================================================================
 * LANDING (index.html) — cozy-r4 polish (2026-05-17)
 * --------------------------------------------------------------------------
 * marketing.css already uses semantic tokens (--surface-2, --fg, --border)
 * which auto-flip in cozy via tokens.css. The aura/glow halos behind the
 * hero video, the gradient brand pills, and a couple of hard-coded
 * rgba(255,255,255,…) hover backgrounds were the only stragglers. The
 * scoped data-ux-mode rules already in marketing.css handle the ones it
 * could anticipate; the rest go here as page-level overrides so cozy
 * stays the single source of truth for the warm palette.
 * ========================================================================== */

[data-ux-mode="cozy"] .lp-hero::before {
    /* Standard mode painted a faint indigo radial wash; warm it. */
    background: radial-gradient(circle at 50% 0%, rgba(182, 151, 99, 0.18) 0%, transparent 70%) !important;
}
[data-ux-mode="cozy"] .lp-aura {
    background: radial-gradient(circle, rgba(198, 107, 107, 0.18), transparent 65%) !important;
}
[data-ux-mode="cozy"] .lp-aura.ring2 {
    background: radial-gradient(circle, rgba(182, 151, 99, 0.18), transparent 70%) !important;
}
/* Trust-pill SVGs were cyan — warm to rose. */
[data-ux-mode="cozy"] .trust-pill svg {
    color: var(--cozy-rose) !important;
}
/* Section divider was cyan gradient — warm it. */
[data-ux-mode="cozy"] .section-divider {
    background: linear-gradient(90deg, transparent, var(--cozy-gold-soft), transparent) !important;
}
/* Solution card icon background was the violet brand-gradient — keep
   the warm-gradient (already cozy via --gradient-brand) but soften the
   icon stroke onto cream. */
[data-ux-mode="cozy"] .ps-card-solution .ps-card-ico {
    color: var(--cozy-paper-elevated) !important;
}
/* Solution-list dot box-shadow used cyan glow. Replace with rose glow. */
[data-ux-mode="cozy"] .ps-card-solution .ps-list li .dot {
    box-shadow: 0 0 6px rgba(168, 71, 95, 0.45) !important;
}

/* btn-primary gradient + box-shadow used indigo halo — remap warm. */
[data-ux-mode="cozy"] .btn-primary {
    background: var(--cozy-rose) !important;
    color: var(--cozy-paper-elevated) !important;
    border-color: var(--cozy-rose-dark) !important;
    box-shadow: 0 6px 18px rgba(168, 71, 95, 0.28) !important;
}
[data-ux-mode="cozy"] .btn-primary:hover {
    background: var(--cozy-rose-dark) !important;
    box-shadow: 0 10px 24px rgba(168, 71, 95, 0.34) !important;
}
/* btn (secondary) hover used rgba(255,255,255,.04) — invisible on cream.
   marketing.css already added a [data-ux-mode="cozy"] override but make
   the resting border read as a hairline too. */
[data-ux-mode="cozy"] .btn {
    background: var(--cozy-paper-elevated) !important;
    border: 1px solid rgba(166, 130, 85, 0.32) !important;
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .btn:hover {
    border-color: var(--cozy-rose) !important;
}

/* Text-gradient on hero word — keep but warm it for cozy. */
[data-ux-mode="cozy"] .text-gradient {
    background: linear-gradient(135deg, var(--cozy-rose) 0%, var(--cozy-gold) 100%) !important;
    -webkit-background-clip: text !important;
    background-clip: text !important;
    -webkit-text-fill-color: transparent !important;
}

/* Pricing "popular" card — was indigo glow; warm + still distinctive. */
[data-ux-mode="cozy"] .price-card.popular {
    border-color: var(--cozy-rose) !important;
    box-shadow: 0 12px 32px rgba(168, 71, 95, 0.18) !important;
}

/* ==========================================================================
 * LOGIN (login.html) — cozy-r4 polish (2026-05-17)
 * --------------------------------------------------------------------------
 * marketing.css already redirects --surface-2 → cream for login-card via
 * tokens.css, and adds a per-mode shadow ramp. The remaining items:
 * the "lh-ico" badge behind each highlight bullet was indigo, and the
 * .back-link uses --accent-cyan. Re-warm both.
 * ========================================================================== */

[data-ux-mode="cozy"] .lh-ico {
    background: rgba(168, 71, 95, 0.10) !important;
    color: var(--cozy-rose-dark) !important;
    border: 1px solid rgba(168, 71, 95, 0.22) !important;
}
[data-ux-mode="cozy"] .login-pitch .eyebrow {
    color: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] .back-link {
    color: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .back-link:hover {
    color: var(--cozy-rose-dark) !important;
}
/* "Forgot password?" link contrast on cream */
[data-ux-mode="cozy"] .login-form-pane a {
    color: var(--cozy-rose-dark) !important;
}
/* Social-login button (Google / Apple) — were dark-glass; flip cream. */
[data-ux-mode="cozy"] .login-form-pane .social-btn,
[data-ux-mode="cozy"] .login-form-pane button[class*="oauth"],
[data-ux-mode="cozy"] .login-form-pane .btn-oauth,
[data-ux-mode="cozy"] .login-form-pane .btn-google,
[data-ux-mode="cozy"] .login-form-pane .btn-apple {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(166, 130, 85, 0.32) !important;
}
[data-ux-mode="cozy"] .login-form-pane .social-btn:hover,
[data-ux-mode="cozy"] .login-form-pane .btn-google:hover,
[data-ux-mode="cozy"] .login-form-pane .btn-apple:hover {
    border-color: var(--cozy-rose) !important;
}

/* ==========================================================================
 * PROGRESS + JOURNAL gap-close — cozy-r8 (2026-05-17)
 * --------------------------------------------------------------------------
 * Audit found ten cozy-mode regressions on /progress.html and minor ones on
 * /journal.html. Standard mode uses --accent (blue) / --accent-2 (purple)
 * gradients for stat icons, level badges, progress bars, recap icons, and
 * three-pane Today cards. Those gradients render as bright blue/purple on
 * the cream paper background — totally off-palette and (for the level badge)
 * dark-on-dark since the badge uses #05070F text. Today cards keep their
 * dark dashboard background (rgba(0,0,0,0.15)) which renders as big slate
 * blocks on cream. Each fix maps the standard chrome to cozy equivalents
 * (rose chip on rose-tint bg, sage progress fill, paper-elevated cards).
 * ========================================================================== */

/* ── Progress: stat-card icon chip (Streak / XP / etc.) ──────────────── */
[data-ux-mode="cozy"] .stat-card .stat-ico {
    background: rgba(168, 71, 95, 0.10) !important;
    border: 1px solid rgba(168, 71, 95, 0.28) !important;
    color: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .stat-card .stat-ico svg,
[data-ux-mode="cozy"] .stat-card .stat-ico .icon svg {
    stroke: var(--cozy-rose) !important;
    color: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .stat-card .stat-label {
    color: var(--cozy-ink-muted) !important;
    opacity: 1 !important;
}
[data-ux-mode="cozy"] .stat-card .stat-delta {
    /* ink-faded (0.55a) = 3.6:1 on paper -> fails AA body. Use ink-muted = 8:1. */
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .stat-card .stat-value {
    font-family: var(--cozy-font-display) !important;
}

/* ── Progress: level-card (Getting started · level 1 · progress bar) ── */
[data-ux-mode="cozy"] .level-card {
    background: var(--cozy-paper-elevated) !important;
    background-image: linear-gradient(160deg, #fff8ec, #fffaf2) !important;
    border: 1px solid rgba(166, 130, 85, 0.30) !important;
    box-shadow: 0 6px 20px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .level-card .level-badge {
    background: var(--cozy-rose) !important;
    background-image: linear-gradient(135deg, var(--cozy-rose), var(--cozy-rose-dark)) !important;
    color: #ffffff !important;
    box-shadow: 0 6px 16px rgba(168, 71, 95, 0.30) !important;
}
[data-ux-mode="cozy"] .level-card .level-name {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-display) !important;
}
[data-ux-mode="cozy"] .level-card .level-xp,
[data-ux-mode="cozy"] .level-card .level-progress-meta {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .level-card .progress-bar {
    background: rgba(166, 130, 85, 0.18) !important;
}
[data-ux-mode="cozy"] .level-card .progress-bar-fill {
    background: var(--cozy-rose) !important;
    background-image: linear-gradient(135deg, var(--cozy-rose), var(--cozy-gold)) !important;
}

/* ── Progress: recap-banner icon chip + close button ─────────────────── */
[data-ux-mode="cozy"] .recap-ico {
    background: var(--cozy-rose) !important;
    background-image: linear-gradient(135deg, var(--cozy-rose), var(--cozy-rose-dark)) !important;
    color: #ffffff !important;
}
[data-ux-mode="cozy"] .recap-ico svg,
[data-ux-mode="cozy"] .recap-ico .icon svg {
    stroke: #ffffff !important;
    color: #ffffff !important;
}
[data-ux-mode="cozy"] .recap-close {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .recap-close:hover {
    background: rgba(168, 71, 95, 0.10) !important;
    color: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .recap-since,
[data-ux-mode="cozy"] .recap-banner .eyebrow {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .recap-banner .recap-list li {
    color: var(--cozy-ink) !important;
}

/* ── Progress: page-head + page-head-actions (Reminders / Sync stats) ── */
[data-ux-mode="cozy"] .page-head .eyebrow {
    color: var(--cozy-ink-muted) !important;
    letter-spacing: 0.10em;
}
[data-ux-mode="cozy"] .page-head h1 {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-display) !important;
}
[data-ux-mode="cozy"] .page-head > div > p,
[data-ux-mode="cozy"] .page-head p {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .page-head-actions .btn,
[data-ux-mode="cozy"] .page-head-actions a.btn,
[data-ux-mode="cozy"] .page-head-actions button.btn,
[data-ux-mode="cozy"] .page-head .btn,
[data-ux-mode="cozy"] .page-head a.btn,
[data-ux-mode="cozy"] .page-head button.btn {
    background: #FFFBF2 !important;
    background-image: none !important;
    color: #1A2438 !important;
    border: 1px solid rgba(143, 58, 79, 0.40) !important;
    box-shadow: 0 2px 6px var(--cozy-warm-shadow) !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    line-height: 1.2 !important;
    padding: 9px 14px !important;
    min-height: 36px !important;
    text-shadow: none !important;
}
[data-ux-mode="cozy"] .page-head-actions .btn:hover,
[data-ux-mode="cozy"] .page-head .btn:hover {
    background: #FFF7E6 !important;
    border-color: var(--cozy-rose-dark) !important;
    color: var(--cozy-rose-dark) !important;
    transform: none !important;
}
[data-ux-mode="cozy"] .page-head-actions .btn.btn-primary,
[data-ux-mode="cozy"] .page-head-actions button.btn-primary,
[data-ux-mode="cozy"] .page-head-actions a.btn.btn-primary,
[data-ux-mode="cozy"] .page-head .btn.btn-primary,
[data-ux-mode="cozy"] .page-head button.btn-primary,
[data-ux-mode="cozy"] .page-head a.btn.btn-primary {
    background: var(--cozy-rose-dark) !important;
    background-image: none !important;
    color: #ffffff !important;
    border: 1px solid var(--cozy-rose-dark) !important;
    box-shadow: 0 4px 12px rgba(143, 58, 79, 0.28) !important;
    font-weight: 600 !important;
}
[data-ux-mode="cozy"] .page-head-actions .btn.btn-primary:hover,
[data-ux-mode="cozy"] .page-head-actions button.btn-primary:hover,
[data-ux-mode="cozy"] .page-head .btn.btn-primary:hover {
    background: #6F2A3B !important;
    color: #ffffff !important;
    border-color: #6F2A3B !important;
}
[data-ux-mode="cozy"] .page-head-actions .btn [data-icon] svg,
[data-ux-mode="cozy"] .page-head-actions .btn .icon svg,
[data-ux-mode="cozy"] .page-head .btn [data-icon] svg,
[data-ux-mode="cozy"] .page-head .btn .icon svg {
    stroke: currentColor !important;
    width: 16px !important;
    height: 16px !important;
}

/* ── Progress: glass-panel today-embed (the big "Today with your iSpirit"
   surface) — switch from translucent dark to cream paper ─────────────── */
[data-ux-mode="cozy"] .glass-panel.today-embed,
[data-ux-mode="cozy"] section.glass-panel,
[data-ux-mode="cozy"] .glass-panel {
    background: var(--cozy-paper-elevated) !important;
    background-image: none !important;
    border: 1px solid rgba(166, 130, 85, 0.22) !important;
    box-shadow: 0 4px 14px var(--cozy-warm-shadow) !important;
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .today-embed-header h2,
[data-ux-mode="cozy"] .today-embed-titles h2 {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-display) !important;
}
[data-ux-mode="cozy"] .today-subtitle,
[data-ux-mode="cozy"] #todaySubtitle {
    color: var(--cozy-ink-muted) !important;
}

/* ── Progress: three-pane (Done by your iSpirit / Your action today /
   Waiting on your call) — pane wrappers + the today-card items ──────── */
[data-ux-mode="cozy"] .today-pane {
    background: rgba(255, 247, 230, 0.55) !important;
    border: 1px solid rgba(166, 130, 85, 0.18) !important;
    border-radius: 16px !important;
}
[data-ux-mode="cozy"] .today-pane h2,
[data-ux-mode="cozy"] .today-pane h3 {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-display) !important;
}
[data-ux-mode="cozy"] .today-empty {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .today-card {
    background: var(--cozy-paper-elevated) !important;
    background-image: none !important;
    border: 1px solid rgba(166, 130, 85, 0.20) !important;
    color: var(--cozy-ink) !important;
    box-shadow: 0 2px 8px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .today-card.today-card--digital {
    border-left: 3px solid var(--cozy-sage) !important;
}
[data-ux-mode="cozy"] .today-card.today-card--action {
    border-left: 3px solid var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .today-card.today-card--decision {
    border-left: 3px solid var(--cozy-gold) !important;
}
[data-ux-mode="cozy"] .today-card h3,
[data-ux-mode="cozy"] .today-card__goal {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-display) !important;
}
[data-ux-mode="cozy"] .today-card__trace,
[data-ux-mode="cozy"] .today-card__meta {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .today-card__body {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .today-card__action-btn {
    background: var(--cozy-paper) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(166, 130, 85, 0.40) !important;
}
[data-ux-mode="cozy"] .today-card__action-btn:hover {
    background: #FFF7E6 !important;
    border-color: var(--cozy-rose) !important;
    color: var(--cozy-rose) !important;
}
[data-ux-mode="cozy"] .today-card__action-btn--primary {
    background: var(--cozy-rose) !important;
    color: #ffffff !important;
    border-color: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] .today-card__action-btn--primary:hover {
    background: var(--cozy-rose-dark) !important;
    color: #ffffff !important;
}
[data-ux-mode="cozy"] .today-card__drafted-pill {
    background: rgba(168, 71, 95, 0.10) !important;
    color: var(--cozy-rose) !important;
    border: 1px solid rgba(168, 71, 95, 0.30) !important;
}

/* ── Progress: progress-filter-bar (search + sort + class chips) ────── */
[data-ux-mode="cozy"] .progress-filter-bar,
[data-ux-mode="cozy"] .pfb-row {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .pfb-search input,
[data-ux-mode="cozy"] .pfb-sort select {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink) !important;
    border: 1px solid rgba(166, 130, 85, 0.40) !important;
}
[data-ux-mode="cozy"] .pfb-chip {
    background: var(--cozy-paper-elevated) !important;
    color: var(--cozy-ink-muted) !important;
    border: 1px solid rgba(166, 130, 85, 0.30) !important;
}
[data-ux-mode="cozy"] .pfb-chip:hover {
    background: #FFF7E6 !important;
    color: var(--cozy-ink) !important;
    border-color: rgba(166, 130, 85, 0.55) !important;
}
[data-ux-mode="cozy"] .pfb-chip.is-active {
    background: var(--cozy-rose) !important;
    color: #ffffff !important;
    border-color: var(--cozy-rose-dark) !important;
}
[data-ux-mode="cozy"] .pfb-divider {
    background: rgba(166, 130, 85, 0.30) !important;
}

/* ── Progress: seeded-goals + cec-credits panels in cozy ─────────────── */
[data-ux-mode="cozy"] .cec-credits-indicator,
[data-ux-mode="cozy"] .cec-credits-indicator * {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .seeded-goals-subtitle {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .seeded-goals-header h2 {
    color: var(--cozy-ink) !important;
    font-family: var(--cozy-font-display) !important;
}

/* ── Journal/Progress: anchor .btn.btn-primary inside page-head to rose so
   later cascading rules (progress.css, today.css, app-shell.css) can't
   leave it as the dark-mode purple-gradient default on cream. ─────── */
[data-ux-mode="cozy"] .page-head .btn-primary,
[data-ux-mode="cozy"] .page-head button.btn-primary,
[data-ux-mode="cozy"] .page-head a.btn-primary,
[data-ux-mode="cozy"] .page-head-actions .btn.btn-primary {
    background: var(--cozy-rose) !important;
    background-image: none !important;
    color: #ffffff !important;
    border: 1px solid var(--cozy-rose-dark) !important;
    box-shadow: none !important;
}
[data-ux-mode="cozy"] .page-head .btn-primary:hover,
[data-ux-mode="cozy"] .page-head .btn-primary:focus,
[data-ux-mode="cozy"] .page-head-actions .btn.btn-primary:hover {
    background: var(--cozy-rose-dark) !important;
    color: #ffffff !important;
}

/* ──────────────────────────────────────────────────────────────────────
   FINAL HARDENING — page-head action buttons readability (2026-05-17)
   --------------------------------------------------------------------
   User reported sitewide bug: top-right action buttons (Guide, Show all
   events, Add moment, New entry, Build a wizard, Voice, Deep thinker)
   had text the same colour as background, AND text was too small to read.
   Worst case = cozy mode where the page bg (cream #F7EFE0) is almost
   identical to the default .btn fill (cream-elevated #FFFBF2).

   This block sits at the very end so page-specific CSS files
   (chat_inline.css, wizard-workspace.css, habits-cards.css, progress.css,
   journal-cards.css, timeline-design.css, empire-scene.css) cannot win
   on specificity. Standard mode floor is enforced in app-shell.css.
   ──────────────────────────────────────────────────────────────────── */
[data-ux-mode="cozy"] header.page-head .page-head-actions .btn,
[data-ux-mode="cozy"] header.page-head .page-head-actions a.btn,
[data-ux-mode="cozy"] header.page-head .page-head-actions button.btn,
[data-ux-mode="cozy"] .wizard-page-shell .page-head .btn,
[data-ux-mode="cozy"] .chat-page-head-actions .btn,
[data-ux-mode="cozy"] .chat-page-head-actions #chatDeepThinkerBtn,
[data-ux-mode="cozy"] .chat-page-head-actions #chatVoiceModeBtn,
[data-ux-mode="cozy"] .habits-hero-actions .btn,
[data-ux-mode="cozy"] .spirit-baby-page-head .page-head-actions .btn,
[data-ux-mode="cozy"] .journal-page-head .page-head-actions .btn {
    background: #FFFBF2 !important;
    background-image: none !important;
    color: #1A2438 !important;
    border: 1px solid rgba(143, 58, 79, 0.45) !important;
    box-shadow: 0 2px 6px rgba(166, 130, 85, 0.18) !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    line-height: 1.2 !important;
    padding: 9px 14px !important;
    min-height: 36px !important;
    text-shadow: none !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
}
[data-ux-mode="cozy"] header.page-head .page-head-actions .btn:hover,
[data-ux-mode="cozy"] .wizard-page-shell .page-head .btn:hover,
[data-ux-mode="cozy"] .chat-page-head-actions .btn:hover,
[data-ux-mode="cozy"] .habits-hero-actions .btn:hover,
[data-ux-mode="cozy"] .spirit-baby-page-head .page-head-actions .btn:hover {
    background: #FFF7E6 !important;
    border-color: var(--cozy-rose-dark, #8F3A4F) !important;
    color: var(--cozy-rose-dark, #8F3A4F) !important;
}
[data-ux-mode="cozy"] header.page-head .page-head-actions .btn.btn-primary,
[data-ux-mode="cozy"] header.page-head .page-head-actions button.btn-primary,
[data-ux-mode="cozy"] header.page-head .page-head-actions a.btn.btn-primary,
[data-ux-mode="cozy"] .wizard-page-shell .page-head .btn.btn-primary,
[data-ux-mode="cozy"] .habits-hero-actions .btn.btn-primary,
[data-ux-mode="cozy"] .spirit-baby-page-head .page-head-actions .btn.btn-primary,
[data-ux-mode="cozy"] .journal-page-head .page-head-actions .btn.btn-primary {
    background: var(--cozy-rose-dark, #8F3A4F) !important;
    background-image: none !important;
    color: #ffffff !important;
    border: 1px solid var(--cozy-rose-dark, #8F3A4F) !important;
    box-shadow: 0 4px 12px rgba(143, 58, 79, 0.32) !important;
}
[data-ux-mode="cozy"] header.page-head .page-head-actions .btn.btn-primary:hover,
[data-ux-mode="cozy"] .wizard-page-shell .page-head .btn.btn-primary:hover,
[data-ux-mode="cozy"] .habits-hero-actions .btn.btn-primary:hover,
[data-ux-mode="cozy"] .spirit-baby-page-head .page-head-actions .btn.btn-primary:hover {
    background: #6F2A3B !important;
    color: #ffffff !important;
    border-color: #6F2A3B !important;
}

/* Standard-mode equivalent — beats chat_inline.css's faded var(--fg-muted)
   text colour on the chat-page-head-actions mode-pills, and page-local
   inline <style> blocks (e.g. habits.html) that set font-size: 13px / 12px
   with !important. We use !important here so this central readability
   floor wins over per-page CSS without us having to edit each page. */
header.page-head .page-head-actions .btn,
header.page-head .page-head-actions a.btn,
header.page-head .page-head-actions button.btn,
.wizard-page-shell .page-head .btn,
.chat-page-head-actions .btn,
.chat-page-head-actions #chatDeepThinkerBtn,
.chat-page-head-actions #chatVoiceModeBtn,
.habits-hero-actions .btn,
.spirit-baby-page-head .page-head-actions .btn,
.journal-page-head .page-head-actions .btn {
    font-size: 14px !important;
    font-weight: 600 !important;
    line-height: 1.2 !important;
    padding: 9px 14px !important;
    min-height: 36px !important;
}
.chat-page-head-actions #chatDeepThinkerBtn:not(.active),
.chat-page-head-actions #chatVoiceModeBtn:not(.active) {
    color: var(--fg, #e6edf3) !important;
}
header.page-head .page-head-actions .btn:not(.btn-primary),
.wizard-page-shell .page-head .btn:not(.btn-primary),
.habits-hero-actions .btn:not(.btn-primary),
.spirit-baby-page-head .page-head-actions .btn:not(.btn-primary),
.journal-page-head .page-head-actions .btn:not(.btn-primary) {
    color: var(--fg, #e6edf3);
}
header.page-head .page-head-actions .btn.btn-primary,
.wizard-page-shell .page-head .btn.btn-primary,
.habits-hero-actions .btn.btn-primary,
.spirit-baby-page-head .page-head-actions .btn.btn-primary,
.journal-page-head .page-head-actions .btn.btn-primary {
    color: #ffffff !important;
}

/* --- Cookie consent banner — cozy palette (2026-05-17) -----------------
   Default banner ships as dark-slate panel (#0f172a) — clashes hard on
   cozy cream pages. Re-skin to cream paper + navy ink + rose CTA so it
   matches the "Warm Letter" aesthetic. Specificity wins inline <style>
   because [data-ux-mode="cozy"] adds 0,1,1 specificity over the
   component's 0,0,1 selectors, and we use !important on the few props
   the inline rule pins via shorthand. Both buttons stay equally
   prominent (no dark-pattern de-emphasis on Essential Only). */
[data-ux-mode="cozy"] .cc-banner {
    background: var(--cozy-paper-elevated, #FFFBF2) !important;
    border: 1px solid rgba(166, 130, 85, 0.30) !important;
    box-shadow: 0 -6px 22px rgba(90, 60, 30, 0.16) !important;
    color: var(--cozy-ink, #1A2438);
}
[data-ux-mode="cozy"] .cc-text {
    color: var(--cozy-ink, #1A2438) !important;
}
[data-ux-mode="cozy"] .cc-text a {
    color: var(--cozy-rose, #A8475F) !important;
    text-decoration: underline;
    text-underline-offset: 3px;
}
[data-ux-mode="cozy"] .cc-text a:hover {
    color: var(--cozy-rose-dark, #8F3A4F) !important;
}
[data-ux-mode="cozy"] .cc-btn-accept {
    background: var(--cozy-rose, #A8475F) !important;
    color: #ffffff !important;
}
[data-ux-mode="cozy"] .cc-btn-accept:hover {
    background: var(--cozy-rose-dark, #8F3A4F) !important;
}
/* Essential Only — equal hit-target, ink on paper-elevated so it reads as
   a peer choice, not a "decline" punishment. 9.4:1 ink-on-cream. */
[data-ux-mode="cozy"] .cc-btn-essential {
    background: transparent !important;
    color: var(--cozy-ink, #1A2438) !important;
    border: 1px solid rgba(166, 130, 85, 0.45) !important;
}
[data-ux-mode="cozy"] .cc-btn-essential:hover {
    background: rgba(166, 130, 85, 0.10) !important;
}
/* Cookie banner vs the cozy chat composer at phone widths (OPEN_TASKS
   §15.3, measured 2026-07-30 at 390px): the QA R5 210px textarea floor
   makes the cozy composer ~254px tall (top y=526), and app-shell-polish's
   140px banner lift — sized for the standard composer — parked the banner
   (y 558-704) on the input and Send. No bottom offset clears a 254px
   composer without floating the banner over mid-screen history, so reuse
   the component's own auth-page pattern and anchor it to the TOP at these
   widths. Scope matches the R5 floor's media query; standard mode and
   wider cozy keep the bottom anchor. !important beats the polish rule's
   own !important via specificity (0,3,2 vs 0,2,1). */
/* Desktop cozy chat: the composer's height is DYNAMIC (autogrow textarea +
   placeholder wrap at cozy's 19px font — measured top y=767 one load, 705
   the next at 1400x900), so the polish file's 148px chat lift can still
   land the banner corner on Send. 210px clears the tallest measured state
   with margin. Mobile (≤480px) is handled by the top-anchor rule below. */
@media (min-width: 901px) {
  html[data-ux-mode="cozy"] body.chat-page .cc-overlay {
    bottom: 210px !important;
  }
}

@media (max-width: 480px) {
  html[data-ux-mode="cozy"] body.product-page.chat-page .cc-overlay {
    top: 0 !important;
    bottom: auto !important;
    align-items: flex-start;
    justify-content: center;
    padding: 12px 16px 0 !important;
  }
}

[data-ux-mode="cozy"] .cc-overlay:focus-within .cc-banner {
    outline: 2px solid rgba(168, 71, 95, 0.45) !important;
    outline-offset: 2px;
}

/* --- Respect reduced motion ------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    [data-ux-mode="cozy"] * {
        animation: none !important;
        transition: none !important;
    }
}


/* ====================================================================
   Cozy contrast audit 2026-05-22 — cascade-shadowed + page-level misses
   ==================================================================== */

/* (1) Timeline milestone category chip.
   cozy-theme.css:2978 already targets `.event-category.milestone` (spec 0,3,0) but is
   SHADOWED by timeline-design.css `.tl-rail .tl-event .event-category.milestone`
   (spec 0,5,0 + !important) -> live text was raw #34d399 green on cream = 1.86:1.
   Match the higher specificity to win. Cover sibling category colors too. */
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event .event-category {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .timeline-content.tl-rail .timeline-event.tl-event .event-category.milestone {
    color: #3f5a33 !important;                        /* deep forest ~6:1 on the tinted chip */
    border-color: rgba(126, 151, 119, 0.55) !important;
    background: rgba(126, 151, 119, 0.10) !important;
}

/* (2) /progress.html dashboard — progress.css authored for the dark body
   (rgba(15,23,42,*) card bgs, #bbf7d0 milestone titles, slate-400 chart empty-state). */
[data-ux-mode="cozy"] .achievement-item {
    background: var(--cozy-paper-elevated) !important;
    border: var(--cozy-border-hairline) !important;
    box-shadow: 0 6px 18px var(--cozy-warm-shadow) !important;
}
[data-ux-mode="cozy"] .achievement-title,
[data-ux-mode="cozy"] .achievement-description,
[data-ux-mode="cozy"] .milestone-item.completed .milestone-title {
    color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .achievement-time,
[data-ux-mode="cozy"] .weekly-chart-caption {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .weekly-chart-bar .wcb-day,
[data-ux-mode="cozy"] .weekly-chart-bar .wcb-value {
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .weekly-chart-bar.is-empty .wcb-day,
[data-ux-mode="cozy"] .weekly-chart-bar.is-empty .wcb-value {
    color: var(--cozy-ink-muted) !important;   /* real day/zero labels — 8:1, not faded 3.6 */
}
[data-ux-mode="cozy"] #legacySyncStatsBtn .btn-label {
    color: var(--cozy-paper) !important;
}

/* (3) /insights.html day-completion % — bright status colors fail on cream even as
   large text (00c853=2.17, ffab00=1.76, ff5252=2.87; large threshold 3.0). */
[data-ux-mode="cozy"] .day-completion.high   { color: #2f7d4f !important; }
[data-ux-mode="cozy"] .day-completion.medium { color: #8a5a00 !important; }
[data-ux-mode="cozy"] .day-completion.low    { color: #b3261e !important; }

/* (4) App-shell user avatar initial — cozy --gradient-brand ends at #c66b6b
   (retired rose-soft); white text on the light stop = 3.67:1. Anchor to solid rose. */
[data-ux-mode="cozy"] #appShellUserAvatar {
    background: var(--cozy-rose) !important;
    background-image: none !important;
    color: #fff !important;
}
[data-ux-mode="cozy"] #journalTypePills .filter-pill.active,
[data-ux-mode="cozy"] .filter-pill.active {
    background: var(--cozy-rose) !important;
    background-image: none !important;
    color: var(--cozy-paper) !important;
}

/* progress.css slate-400 (rgba(148,163,184,*)) eyebrows / meta / empty placeholders
   throughout the dashboard all fail on cream (1.5-2.5:1). Re-anchor to ink-muted (8:1). */
[data-ux-mode="cozy"] .achievement-empty,
[data-ux-mode="cozy"] .achievement-meta,
[data-ux-mode="cozy"] .milestone-empty,
[data-ux-mode="cozy"] .milestone-tasks-empty,
[data-ux-mode="cozy"] .today-empty,
[data-ux-mode="cozy"] .today-day-eyebrow,
[data-ux-mode="cozy"] .card-eyebrow,
[data-ux-mode="cozy"] .goal-card-date,
[data-ux-mode="cozy"] .goal-card-sub,
[data-ux-mode="cozy"] .goal-card-pct {
    color: var(--cozy-ink-muted) !important;
}

/* Journal entry-card: expand arrow + meta separator use ink-faded (3.6:1). Arrow is an
   interactive control -> ink-muted (8:1). Separator is decorative but bumped for parity. */
[data-ux-mode="cozy"] .journal-entry.entry-card button.entry-arrow,
[data-ux-mode="cozy"] .journal-entry.entry-card .entry-meta-sep {
    color: var(--cozy-ink-muted) !important;
}
/* Wisdom pattern-card footer: wisdom.html inline <style> sets rgba(108,95,74,0.65)=2.84:1.
   Inline block loads after this file, so add the card ancestor to out-specify it. */
[data-ux-mode="cozy"] .ispirit-pattern-card .ispirit-pattern-foot {
    color: var(--cozy-ink-muted) !important;
}

/* ── Cozy contrast gap fixes (review 2026-05-25) ─────────────────────────── */

/* Profile inactive tabs: profile.css forces a dark-mode slate bg !important at
   `.profile-tabs .profile-nav-btn`; the prior cozy override only recolored the
   text at lower specificity, leaving ink-muted on slate ~1.56:1. Override the
   background too, at matching specificity, to the active-tab tint family. */
[data-ux-mode="cozy"] .profile-tabs .profile-nav-btn {
    background: rgba(168, 71, 95, 0.06) !important;
    border-color: rgba(168, 71, 95, 0.22) !important;
    color: var(--cozy-ink-muted) !important;
}
[data-ux-mode="cozy"] .profile-tabs .profile-nav-btn span {
    color: var(--cozy-ink) !important;
}

/* Coverage-ring "%" label kept the dark-mode gold accent (#fbbf24) on the cozy
   cream disc ~1.46:1. Recolor to ink. */
[data-ux-mode="cozy"] .cov-ring span {
    color: var(--cozy-ink) !important;
}

/* Timeline event-category pills: the existing cozy pill rule allowlists only
   some categories; task/mission/achievement/challenge/reflection/relationship
   fell back to deprecated rose-soft text on paper ~3.56:1. Give them the same
   ink-on-paper-elevated treatment. */
[data-ux-mode="cozy"] .event-category.task,
[data-ux-mode="cozy"] .event-category.mission,
[data-ux-mode="cozy"] .event-category.achievement,
[data-ux-mode="cozy"] .event-category.challenge,
[data-ux-mode="cozy"] .event-category.reflection,
[data-ux-mode="cozy"] .event-category.relationship {
    color: var(--cozy-ink) !important;
    background: var(--cozy-paper-elevated, #fbf3e7) !important;
    border: 1px solid var(--cozy-gold-soft, rgba(182, 151, 99, 0.35)) !important;
}

/* Skip-to-content link: keep it white-on-deep-navy in cozy mode regardless of
   the global `[data-ux-mode=cozy] a` color cascade, which was tinting the
   static `.skip-link` to ink on its navy bg (~1.49:1 on focus). White on
   #1a3a8a ≈ 8.6:1. Covers both the static `.skip-link` and the
   navigation.js-injected `#skipToContent`. */
[data-ux-mode="cozy"] .skip-link,
[data-ux-mode="cozy"] #skipToContent {
    background: #1a3a8a !important;
    color: #ffffff !important;
}

/* ── QA round 58 cozy fixes (2026-06-11) ─────────────────────────────────
   MED-2: spirit-baby growth-stage pills. .gs-current ships #0f172a bg +
   white text (a 2026-05-10 fix for the DARK room sky), but cozy turns the
   .room cream and the broad cozy ink-recolor flips the pill text to navy
   ink → navy-on-navy 1.15:1. Re-anchor all three .gs states for cream:
   current = cream ink-block (13.5:1), done/future = ink on light tints. */
[data-ux-mode="cozy"] .gs-current {
    background: var(--cozy-ink) !important;
    color: var(--cozy-paper) !important;
    border-color: var(--cozy-ink) !important;
}
[data-ux-mode="cozy"] .gs-done {
    background: color-mix(in srgb, #2e7d4f 14%, transparent) !important;
    color: #1d5c39 !important;
}
[data-ux-mode="cozy"] .gs-future {
    background: color-mix(in srgb, var(--cozy-ink) 7%, transparent) !important;
    color: var(--cozy-ink-muted) !important;
}

/* MED-3: progress.html .milestone-empty keeps its dark translucent navy
   panel (rgba(15,23,42,.6)) under cozy while line 3880 re-anchors its text
   to ink-muted → muted ink on muddy gray 1.56:1. Give the panel a cream-
   compatible surface so the ink reads. LOW-2: the inline-styled "Go to
   Timeline" CTA link landed at 4.02:1 (ink on mid-blue via the global cozy
   a-recolor); pin a deeper blue + white (≈6:1). */
[data-ux-mode="cozy"] .milestone-empty {
    background: color-mix(in srgb, var(--cozy-ink) 5%, transparent) !important;
    border-color: color-mix(in srgb, var(--cozy-ink) 25%, transparent) !important;
}
[data-ux-mode="cozy"] .milestone-empty a {
    background: #1d6a94 !important;
    color: #ffffff !important;
}

/* Round 58 F1 (verification follow-up): the central 36px readability floors
   above (standard ~3719 / cozy ~3445) carry !important and beat the 44px
   mobile touch-target rules added in app-shell.css/chat_inline.css. Re-floor
   to 44px on phones HERE — same selectors + !important, later in the same
   sheet, so it wins both floors in both modes (WCAG 2.5.5). */
@media (max-width: 900px) {
    header.page-head .page-head-actions .btn,
    header.page-head .page-head-actions a.btn,
    header.page-head .page-head-actions button.btn,
    .wizard-page-shell .page-head .btn,
    .chat-page-head-actions .btn,
    .chat-page-head-actions #chatDeepThinkerBtn,
    .chat-page-head-actions #chatVoiceModeBtn,
    .habits-hero-actions .btn,
    .spirit-baby-page-head .page-head-actions .btn,
    .journal-page-head .page-head-actions .btn,
    [data-ux-mode="cozy"] .page-head-actions a.btn,
    [data-ux-mode="cozy"] .page-head-actions button.btn,
    [data-ux-mode="cozy"] .page-head .btn,
    [data-ux-mode="cozy"] .page-head a.btn,
    [data-ux-mode="cozy"] .page-head button.btn {
        min-height: 44px !important;
    }
}


/* Exam-countdown urgency chips — keep white text on their coloured pill in cozy.
   The generic [style*="color:#fff"] rule (above) forces inline-white text to ink,
   but these chips (exam-countdown.js) set their own coloured background and need
   white text for legibility. Re-assert white only for those chips. (Audit 2026-06-28
   — pre-existing 2.4:1 contrast, surfaced during the wide-content sweep.) */
[data-ux-mode="cozy"] .exam-countdown-card span[style*="background"] {
  color: #ffffff !important;
}

/* QA R13: Lexend@17px makes "Create a password" wider than the room left of
   the show/hide toggle at 390px — placeholder clipped in cozy only (the
   standard font fits). Narrow-viewport size for password fields. */
@media (max-width: 480px) {
  [data-ux-mode="cozy"] .password-field input { font-size: 15px; }
}


/* Page-guide body copy in cozy. `.page-guide .guide-header p` (0,2,1) beats
   the generic `[data-ux-mode="cozy"] p` (0,1,1), and its `var(--muted, #999)`
   falls back to #999 on cream paper — measured 2.49:1 (2026-08-03).
   Matched specificity so cozy ink wins where cozy paper is showing. */
/* NOTE the #id: `[data-ux-mode="cozy"] .page-guide p` computes to 0,2,1 —
   an exact TIE with page-guide.css's `.page-guide .guide-header p`, so load
   order decided and page-guide.css (loaded later) kept winning. The guide is
   a singleton, so the id breaks the tie deterministically. */
[data-ux-mode="cozy"] #pageGuide p,
[data-ux-mode="cozy"] #pageGuide li,
[data-ux-mode="cozy"] #pageGuide .guide-header p {
    color: var(--cozy-ink-muted, #5A5540);
}


/* Mobile menu in cozy — EXPLICIT colours, not tokens (2026-08-03).
   The overlay keeps its dark surface in cozy while cozy redefines --nav-text-muted
   and --cozy-rose for cream paper. So every token-based colour is calibrated for
   the wrong surface here: rose gave 3.02:1, and merely excluding it fell back to
   the redefined muted token at 2.81:1 — worse. The only stable fix on a surface
   the theme does not repaint is to state the colour outright. */
[data-ux-mode="cozy"] .mobile-nav-link,
[data-ux-mode="cozy"] .mobile-action-link {
    color: rgba(255, 255, 255, .88);
}
[data-ux-mode="cozy"] .mobile-nav-link.active {
    color: #fff;
}
