/* ═══ Day to Day · BUNDLED system stylesheet ═══
 * Concatenated from system/{tokens, components, controls, shell, drawer, lists, timeline}.css for fast,
 * single-request loading. Section banners preserved below. */

/* ╔══════ @font-face — self-hosted variable fonts ══════╗
 * 2026-07 type system (rollout/system.css-tokens.amendment.css §1a):
 * Clash Display (headings/display), General Sans (body + all UI,
 * incl. italic), Newsreader italic (release/work titles — the one
 * serif), Geist Mono (labels/metadata — unchanged). Variable fonts:
 * one file covers the full weight range, so font-weight on any
 * element interpolates correctly. font-display: swap → fallback
 * renders immediately, swaps when the file lands. */
@font-face {
  font-family: 'Clash Display';
  src: url('fonts/ClashDisplay-Variable.woff2') format('woff2-variations');
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'General Sans';
  src: url('fonts/GeneralSans-Variable.woff2') format('woff2-variations');
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'General Sans';
  src: url('fonts/GeneralSans-Italic-Variable.woff2') format('woff2-variations');
  font-weight: 400 700;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: 'Newsreader';
  src: url('fonts/Newsreader-Italic-Variable.woff2') format('woff2-variations');
  font-weight: 400 500;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: 'Geist Mono';
  src: url('fonts/GeistMono-Variable.woff2') format('woff2-variations');
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
}


/* ╔══════ tokens.css ══════╗ */
/* ═══════════════════════════════════════════════════════════════════
 *  Day to Day · Design Tokens
 *  ─────────────────────────────────────────────────────────────────
 *  The single source of truth for color, type, radii, and the
 *  signature 'lift' glass texture.
 *
 *  This file is loaded first by every product page. Consumers
 *  reference these CSS variables only — never hardcoded values.
 *
 *  Design language
 *  ───────────────
 *  · Warm paper background — not beige, not blue, just barely-warm white
 *  · Ink as brand — no color is the brand; emphasis comes from
 *    typography and the 'lift' texture, not from an accent
 *  · One semantic color (URGENT) for "this needs you now" — deep oxblood
 *  · A per-artist mood palette (--m-*) — bound only to the artist's
 *    own surfaces (roster tile, calendar artist rail). NEVER on system
 *    chrome. The system stays monochrome; the artist brings the color.
 *  · Geist + Geist Mono — sans for everything, mono for labels + metadata
 *
 *  Naming rules
 *  ────────────
 *  · Tokens use semantic intent: --bg, --ink, --urgent, --m-rose
 *  · No literal-color tokens (--orange, --blue). The palette is
 *    private to this file.
 * ═══════════════════════════════════════════════════════════════════ */

:root {
  /* ─────────── Theme (semantic layer · light) ───────────
     Light is the default at :root. The theme boot script stamps
     [data-theme] on <html>; dark re-declares the SAME role names
     under :root[data-theme="dark"] (separate workstream, #106).
     Components only ever read the semantic tokens below. */
  color-scheme: light;               /* native controls/scrollbars match */

  /* ─────────── Paper ───────────
     Near-white with a barely-there warmth. Sits much closer to
     paper-white than to beige — keeps the page bright and confident,
     reads as premium not generic. */
  --bg:           #FAFAF7;
  --bg-2:         #F4F2EE;   /* slightly recessed surface, rarely needed */
  --surface:      #FFFFFF;   /* solid white card variant */

  /* ─────────── Ink ───────────
     Warm dark, used at four weights. AAA on --bg. */
  --ink:          #1A1612;   /* default body text */
  --ink-strong:   #0E0B08;   /* headlines, emphasised type, system marks */
  --ink-soft:     #524A40;   /* secondary copy */
  --ink-muted:    #857B6E;   /* metadata, labels, placeholders */
  --ink-faint:    #9C9285;   /* faint meta, decorative dividers, disabled */
  --hairline:     rgba(28, 22, 12, 0.08);
  --hairline-soft:rgba(28, 22, 12, 0.04);

  /* Ink-strong fill contrast (#106 dark-safe): the text/icon colour that sits ON
     a solid --ink-strong fill — the active filter pill, count badges, primary
     button, today's date circle, the Release event chip. Sibling to --accent-ink
     (text ON an accent fill). The --ink-strong FILL flips on its own by theme
     (near-black → #fff in dark); this token flips the TEXT the other way so the
     block stays a high-contrast solid, never white-on-white. Solid-ink chrome
     that reads #fff on paper must read this token instead. On-photo #fff (marquee
     dot/name, hero name/badge) sits on imagery, not this fill — leave it #fff. */
  --on-ink-strong: #fff;

  /* Solid ink disc fill (avatar initials, FAB, account chips in the shell) — a
     near-black disc in light; its glyph reads --on-ink-strong. Flips to a
     near-white disc in dark so the dark glyph stays legible (the #000 end-stop is
     theme-blind on its own, which is what broke the discs white-on-white). */
  --ink-disc: linear-gradient(135deg, var(--ink-strong), #000);

  /* ─────────── Brand ───────────
     There is no brand colour. The 'brand' is ink. Emphasis is
     typographic. This token exists so future components can read
     --brand-* without knowing the implementation. */
  --brand:        var(--ink-strong);
  --brand-deep:   #000000;
  --brand-wash:   rgba(14, 11, 8, 0.06);
  --brand-edge:   rgba(14, 11, 8, 0.18);

  /* ─────────── Shell atmosphere (redesign · App Shells spec) ───────────
     The redesign shell (js/shell.js) reads these. Values are verbatim from
     the App Shells build reference (Redesign Files/DayToDay - App Shells.dc.html):
       --icon  soft warm-grey for nav glyphs (quieter than --ink-muted)
       --chip  neutral pill/badge fill (nav counts, roster ticks)
     Light-only for now (system.css is light until #106 lands the dark set;
     the spec's dark values — --icon:rgba(255,255,255,.5) · --chip:rgba(255,255,255,.07)
     — go in the #106 [data-theme="dark"] block, not scattered per surface). */
  --icon:         #9a8f80;
  --chip:         rgba(28, 22, 12, 0.05);

  /* ─────────── Urgent ───────────
     The single semantic colour. Used ONLY for items that need
     attention right now — overdue tasks, today's hot deadlines,
     budget thresholds, the welcome-back left rail, the notification
     badge. Never decorative. */
  --urgent:       #8B1E2E;
  --urgent-soft:  rgba(139, 30, 46, 0.10);

  /* ─────────── Per-artist mood ───────────
     2026-07 palette (amendment §3). The system stays monochrome
     (studio chrome = ink); the ARTIST brings the colour, bound via
     D2D_applyMood(el, artist.mood) reading --m-<slug>. Appears ONLY
     on the artist's own surfaces, NEVER on shared system chrome.
     One lightness/chroma family so they read as a set, all sitting
     calmly beside the acid. New-artist default slug = 'acid'. */
  --m-acid:   #D6F038;   /* default / first pick in the artist-accent picker */
  --m-rose:   #D14B8C;
  --m-violet: #6B52DB;
  --m-teal:   #178C93;
  --m-coral:  #E26A3A;
  /* wider set of picks */
  --m-sky:    #2F82D6;
  --m-amber:  #C6871C;
  --m-plum:   #9E4FC4;
  --m-moss:   #5E9A34;
  --m-ocean:  #1E6B85;

  /* ─────────── Light-accent contrast helpers (amendment §2) ───────────
     Buttons stay monochrome ink — acid is only the default pick in the
     artist-accent picker. A LIGHT accent (acid, amber, moss) can never
     carry white text and can never be body text:
       · text/icons ON a light accent fill → var(--accent-ink)
       · a light accent used as TEXT on paper → var(--accent-on-light)
     Reference values (acid default shown); derive per bound accent by
     luminance, don't hardcode acid. */
  --accent:          #D6F038;   /* the default bound accent (acid) */
  --accent-ink:      #0E0B08;   /* text/icons that sit ON a LIGHT accent fill (= --ink-strong) */
  --accent-on-light: #5F6B12;   /* a light accent used as TEXT on paper (deep olive, AA ≥4.5:1) */
  --accent-on-dark:  #D6F038;   /* on dark, a light accent reads as itself */
  --accent-on:       #5F6B12;   /* theming role alias — light-theme value of accent-as-text */

  /* ─────────── Milestone types ───────────
     Category colours for milestone-type chips (Release · Announce · Fan
     activation · Social · Goal), used on the Strategy hero "next move",
     the Strategy timeline, and the Plan. Muted, earthy hues so they read as
     classification, never competing with the artist mood accent or urgent.
     Release is the headline event and renders as a solid ink chip. */
  --ms-announce: #3B5BA5;   /* slate blue */
  --ms-fan:      #B0663F;   /* terracotta */
  --ms-social:   #2F7E78;   /* teal */
  --ms-goal:     #94701A;   /* ochre */

  /* ─────────── Asset tone washes ───────────
     Decorative category washes for the Assets gallery (.asset-tone family) and the
     release-scope filter swatches. Stored as RGB triplets so the same hue can wash
     at different opacities (card tint vs filter swatch). Purely atmospheric — not
     core ink/bg, so they live here rather than as literals scattered per surface. */
  --tone-warm-rgb:  126, 28, 46;    /* cherry / red wash */
  --tone-amber-rgb: 196, 154, 60;   /* gold wash */
  --tone-cool-rgb:  46, 58, 74;     /* slate-blue wash */

  /* ─────────── Track production stages ───────────
     The audio production pipeline for a track — demo → mix → master. Used on
     the Overview "Music" bar (and available to any track-state display). Reads
     as progression: raw sand → worked periwinkle → finished ink. */
  --stage-demo:   #BCA98E;   /* raw — warm sand */
  --stage-mix:    #6E78C7;   /* in progress — periwinkle */
  --stage-master: #241C13;   /* finished — deep ink */

  /* ─────────── Social strategy pillars ───────────
     Categorical colour for content pillars on Socials (post stripe, pillar
     chips, the strategy-pillars donut). A 4-tone scale that REUSES the
     existing palette — the music-card stage hues (periwinkle / warm sand)
     plus two milestone-type hues (terracotta / teal) — so nothing new is
     invented. Assigned by a pillar's stable sort index, cycling p1→p4.
     Consume via the .pillar-tone helpers below or var(--pillar-N). */
  --pillar-1: var(--stage-mix);    /* periwinkle  — e.g. Music & releases */
  --pillar-2: var(--stage-demo);   /* warm sand   — e.g. Behind the scenes */
  --pillar-3: var(--ms-fan);       /* terracotta  — e.g. Fan engagement */
  --pillar-4: var(--ms-social);    /* teal        — e.g. World & lifestyle */

  /* ─────────── Status (semantic) ───────────
     Info (blue) + positive (green) sit alongside the one urgent accent — the
     ONLY status hues in the system. Every status pill / chip / dot reads these
     tokens, never a raw literal. Wash = ~10% fill, edge = ~20% border. */
  --status-info:          #2360B8;
  --status-info-wash:     rgba(42,111,219,0.10);
  --status-info-edge:     rgba(42,111,219,0.22);
  --status-positive:      #1E6B45;
  --status-positive-wash: rgba(30,107,69,0.10);
  --status-positive-edge: rgba(30,107,69,0.20);
  --status-warn:          #B26B00;   /* held/pencilled states (was a page-level fallback) */

  /* Module-family tints — ONE source for every [data-mod] surface
     (.pill-category chips, calendar type chips / pills / week edges).
     Ink = readable text tone; wash/edge = ~8-12% fill, ~20% border. */
  --mod-music-ink:      #A52A6B; --mod-music-wash:     rgba(214,51,132,0.08);  --mod-music-edge:     rgba(214,51,132,0.18);
  --mod-campaigns-ink:  #3D46B0; --mod-campaigns-wash: rgba(79,90,224,0.08);   --mod-campaigns-edge: rgba(79,90,224,0.18);
  --mod-live-ink:       #1A5468; --mod-live-wash:      rgba(30,107,133,0.08);  --mod-live-edge:      rgba(30,107,133,0.18);
  --mod-socials-ink:    #7E5C92; --mod-socials-wash:   rgba(181,143,201,0.12); --mod-socials-edge:   rgba(181,143,201,0.24);

  /* Mood-derived aliases — DEFAULTS (no-mood fallback). On moodful elements
     these are overridden by INLINE custom properties bound in JS
     (D2D_applyMood / D2D_moodStyle), each referencing the artist's base
     --m-<mood> token — so the stylesheet carries no theme-scoped token
     definitions. Components just read var(--tile-color) / var(--artist-accent)
     / etc. and inherit the inline value from the nearest moodful ancestor. */
  --mood-color:    var(--ink-strong);
  --tile-color:    transparent;
  --artist-accent: var(--ink-strong);
  --hero-mood:     transparent;
  --cover-mood:    transparent;

  /* ─────────── Type ───────────
     2026-07 type system (amendment §1b):
     --display  headings & display type  (Clash Display, 500–600)
     --sans     body & all UI            (General Sans)
     --serif    release / work titles    (Newsreader italic — the one serif,
                reserved for track & release names, never body)
     --mono     labels, dates, metadata  (Geist Mono — unchanged) */
  --display: 'Clash Display', 'General Sans', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; /* @kind font */
  --sans:    'General Sans', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; /* @kind font */
  --serif:   'Newsreader', Georgia, 'Times New Roman', serif; /* @kind font */
  --mono:    'Geist Mono', 'SF Mono', ui-monospace, monospace; /* @kind font */

  /* Display-face weight ceiling (2026-07 §1b): Clash tops out at 500–600, never 700.
     --fw-display       section headers & standard display headings
     --fw-display-hero  large hero display (≥40px) — a more refined big-Clash
     --fw-figure        hero/stat FIGURES on cards — money/metric/count/% numerals
                        (founder ruling 2026-07-17: numbers read calm, never shouty).
                        A real primitive split off --fw-display so figures no longer
                        borrow the overloaded title weight; future figures inherit it. */
  --fw-display:      500;   /* founder ruling 2026-07-17: card/section titles read calm at 500 too */
  --fw-display-hero: 500;
  --fw-figure:       500;

  /* ─────────── Type role hierarchy (Chip #142 · 3-altitude discipline) ───────────
     Clash (--display) had drifted onto ~13 roles on Home / ~8 on Artist, so
     nothing read as the focal point. These role tokens give Clash back its
     scarcity: one knob per altitude, so which FACE each element uses is a token
     flip, not a per-selector hunt.
       --font-hero    altitude 1 · page hero + immersive card name → Clash (display)
       --font-figure  altitude 2 · big metric numerals → Clash (founder: keep, with
                      tabular-nums at the call site so figures don't jitter)
       --font-title   altitude 3 · section / card titles + empty-state heads → Sans
       --fw-title     the weight titles carry (Sans 600) */
  --font-hero:   var(--display);
  --font-figure: var(--display);
  --font-title:  var(--sans);
  --fw-title:    600;
  --fw-title-light: 500;   /* lighter title stem — list/table ROW titles (#101):
                              a genuinely lighter weight than --fw-title, not a
                              colour softening. Theme-independent → defined once. */
  --fw-page-title: 600;    /* site page-header h1 stem (#227, founder walk 2026-07-18):
                              the one conformed page-title weight — .heading-title +
                              every per-page h1 (.cv2-title/.mus-h1/.fin-h1/…). */

  /* ─────────── Radii ───────────
     Four steps. r-sm for chips & inline tags, r-md for inline lists
     (priority, activity), r-lg for panels & tiles, r-xl for hero
     primitives (Ask). */
  --r-sm: 8px;
  --r-md: 14px;
  --r-lg: 20px;
  --r-xl: 28px;

  /* ─────────── Lift ───────────
     Signature glass texture. Used on the topbar pill, the ask input,
     the week-ahead panel, the digest list, the activity list, and
     the roster tiles. Three layers stack:
       1. soft warm-white gradient body
       2. 1px ink hairline
       3. shadow stack: inner highlight + 1px line + soft drop + deep drop
     Apply via .lift on any container. Hover state available via
     --lift-shadow-hover for interactive elements. */
  --lift-bg:      linear-gradient(180deg, rgba(255,255,255,0.99) 0%, rgba(255,255,255,0.90) 100%); /* @kind color */
  --lift-stroke:  1px solid rgba(28,22,12,0.06); /* @kind color */
  --lift-shadow:  0 1px 0 rgba(255,255,255,0.8) inset,
                  0 -1px 0 rgba(28,22,12,0.02) inset,
                  0 1px 2px rgba(28,22,12,0.04),
                  0 6px 14px -6px rgba(28,22,12,0.09),
                  0 18px 36px -16px rgba(28,22,12,0.11);
  --lift-shadow-hover:
                  0 1px 0 rgba(255,255,255,0.8) inset,
                  0 1px 2px rgba(28,22,12,0.05),
                  0 10px 24px -8px rgba(28,22,12,0.13),
                  0 28px 56px -20px rgba(28,22,12,0.15);
  --lift-inner:   inset 0 1px 0 #fff;   /* card top-light (theming role) */

  /* ─────────── Header (Chip S · 2026-07-07) ───────────
     A whisper of glass on the app-shell bar, a deliberate founder-chosen
     deviation from the solid App Shells spec. Content blurs gently under the
     sticky header on scroll; never near the legacy 20px frost. Dark values live
     in the :root[data-theme="dark"] block below (#106 owns the full dark
     palette; these two header tokens ship early with Chip S). */
  --header-bg:   color-mix(in oklab, var(--bg) 80%, transparent); /* @kind color */
  --header-blur: blur(12px) saturate(115%);

  /* ─────────── Pearl surface (Chip #142 · dashboard cards) ───────────
     A subtle, BLUR-FREE nacre for the standard dashboard cards (Home .hv2-card,
     Artist .aw-card — never the immersive marquee card). Three layers, all
     token-driven so light/dark is a flip, never generic glassmorphism:
       1 · --surface-pearl  a barely-warm top-lit body gradient (+ --pearl-top
           inner highlight, prepended to the card's box-shadow stack)
       2 · --pearl-sheen    a diagonal nacre sheen, rendered as a ::before overlay;
           transparent across the central band so text contrast is unaffected
       3 · --pearl-edge     a faint iridescent hairline — a very-low-chroma
           multi-hue ring (a hint of the mood palette: rose→violet→teal→amber),
           painted in the card's border via a padding-box/border-box gradient so
           it never fights border-radius. A jewelled edge, never a bold outline.
     No blur, no animation (the calm posture holds); dark highlight alphas ≤ .08. */
  --surface-pearl: linear-gradient(180deg, #FFFFFF, #FCFBF8); /* @kind color */
  --pearl-top:     inset 0 1px 0 rgba(255,255,255,0.92);
  --pearl-sheen:   linear-gradient(125deg, rgba(255,255,255,0.55) 0%, rgba(255,255,255,0) 32%, rgba(255,255,255,0) 68%, rgba(255,251,242,0.42) 100%); /* @kind color */
  --pearl-edge:    linear-gradient(135deg, rgba(209,75,140,0.18) 0%, rgba(107,82,219,0.12) 34%, rgba(23,140,147,0.12) 66%, rgba(198,135,28,0.16) 100%); /* @kind color */
}

/* ─────────── Palette A/B · Option A "clean warm" (#326, staging flag) ───────────
   OPT-IN ONLY. js/shell.js reads ?palette=clean and stamps [data-palette="clean"]
   on the root (persisted so it sticks across a walk). This block overrides ONLY
   the tokens the Option A proposal moves — additive, so with NO attribute the
   DEFAULT look stays byte-identical. Placed BEFORE the DARK block on purpose:
   every token here is re-declared by :root[data-theme="dark"] below at equal
   specificity, so a dark viewer keeps the dark ramp (later source wins). Option A
   is a light-mode change; dark needs no tweak, so there is no dark-clean block. */
:root[data-palette="clean"] {
  --bg:           #FAFAFA;   /* was #FAFAF7 — neutral paper */
  --bg-2:         #F3F3F1;   /* was #F4F2EE — recessed panel neutralises */
  /* --surface stays #FFFFFF (unchanged in Option A) */
  --ink:          #18171A;   /* was #1A1612 — body ink cools */
  --ink-strong:   #0D0C0F;   /* was #0E0B08 */
  --ink-soft:     #4A4A50;   /* was #524A40 */
  --ink-muted:    #6C6A70;   /* was #857B6E — mono metadata darkens */
  --ink-faint:    #8A888E;   /* was #9C9285 */
  --hairline:     rgba(22,20,26,0.08);              /* was rgba(28,22,12,0.08) */
  --surface-pearl: linear-gradient(180deg, #FFFFFF, #FCFCFB); /* warm end #FCFBF8 → #FCFCFB · @kind color */
}

/* ─────────── DARK — the full semantic palette (#106) ───────────
   Dark is RE-DERIVED, not inverted light. Elevation rises by LIGHTNESS
   (bg → surface); the ink ramp is off-white at graded alpha (never pure #fff
   for body, which vibrates); status hues are lifted so they survive on
   charcoal; and lift carries depth via a lighter surface + top inner-light +
   hairline, not a drop shadow. Every role here re-declares a token that has a
   light value at :root, so the theme flip is a value swap and nothing else.
   Ported from Redesign Files/rollout/theming.tokens.css §2; the header (Chip S)
   and pearl (#142) tokens that already shipped here are preserved below. */
:root[data-theme="dark"] {
  color-scheme: dark;                /* native controls/scrollbars match */

  /* Paper + surfaces — near-black with the paper's warmth, never #000.
     Elevation rises by lightness: --bg (lowest) → --surface (raised card). */
  --bg:           #0C0C10;
  --bg-2:         #101015;
  --surface:      #17171D;

  /* Ink ramp — off-white at graded alpha. --ink-strong is the only near-solid,
     used sparingly. --ink-muted is the text-contrast floor; --ink-faint is
     non-text only (dividers, disabled). */
  --ink:          rgba(255, 255, 255, 0.90);
  --ink-strong:   #FFFFFF;
  --ink-soft:     rgba(255, 255, 255, 0.72);
  --ink-muted:    rgba(255, 255, 255, 0.62);
  --ink-faint:    rgba(255, 255, 255, 0.40);
  --hairline:     rgba(255, 255, 255, 0.09);
  --hairline-soft:rgba(255, 255, 255, 0.05);

  /* Ink-strong fill contrast — dark (#106 solid-chrome): the loud solid-ink chrome
     no longer renders near-white in dark (counts → dark --chip, utility discs →
     dark --ink-disc, the FAB key → --fill-strong), so its label/glyph reads the
     LIGHT ink, mirroring how light renders #fff-on-near-black. This one flip turns
     every count numeral, disc glyph and FAB label light; the coloured state marks
     (active pill, cmd-pill, today) set their own on-colour and are unaffected. The
     primary button / active tab are NOT in this set — they invert to a white fill
     with dark text (see the dark .btn-primary / .seg rules). */
  --on-ink-strong: var(--ink-strong);
  /* Solid ink disc — dark (#106): a QUIET dark disc, not the near-white block the
     founder rejected. Utility discs (avatar initials, account chips) pair it with a
     --hairline edge; their glyph reads --on-ink-strong (light). The FAB / + keys
     override this fill with --fill-strong so they read as the raised key. */
  --ink-disc: linear-gradient(135deg, #242430, #1A1A20);

  /* Elevated dark key (#106) — the FAB (and mobile +) reads as a raised warm-charcoal
     key in dark: a brighter edge than the .09 hairline so it reads as THE key, a
     whisper of top-light, a soft ambient depth. This is now the FAB's idiom only —
     the primary button and active tab were REVISED to a solid white fill with dark
     text (founder's later call). Dark-only — light keeps its per-selector look. */
  --fill-strong:        linear-gradient(180deg, #34343F, #262630); /* @kind color */
  --fill-strong-edge:   rgba(255, 255, 255, 0.18);
  --fill-strong-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 8px 20px -12px rgba(0, 0, 0, 0.7);

  /* Shell atmosphere — the App Shells spec's dark values, reserved for #106 in
     the light :root note: nav glyphs + neutral chip fill go light-on-dark. */
  --icon:         rgba(255, 255, 255, 0.50);
  --chip:         rgba(255, 255, 255, 0.07);

  /* Urgent — the one semantic accent; oxblood-family but brighter so it holds. */
  --urgent:       #FF6B72;
  --urgent-soft:  rgba(255, 107, 114, 0.14);

  /* Per-artist mood — lifted ~8% so each stays vivid on charcoal; acid unchanged. */
  --m-acid:   #D6F038;
  --m-rose:   #E85C9E;
  --m-violet: #8875F0;
  --m-teal:   #2CA8AF;
  --m-coral:  #F0824D;
  --m-sky:    #4F9BE8;
  --m-amber:  #E0A93C;
  --m-plum:   #B96FD8;
  --m-moss:   #79B84E;
  --m-ocean:  #37A6C9;

  /* Accent — acid is already electric on dark, so it is used full. Ink still
     sits ON an acid fill; the accent-as-text alias becomes full acid on dark. */
  --accent:       #D6F038;
  --accent-ink:   #0E0B08;
  --accent-on:    #D6F038;   /* theming role alias — dark value of accent-as-text */

  /* Status — saturated mids die on dark; each is lifted so it stays legible. */
  --status-info:      #6AA5FF;
  --status-positive:  #46B98A;
  --status-warn:      #E0A93C;

  /* Module-family tints — dark (#106 module-colour dark gap). The light --mod-*-ink
     hues (dark blue/teal/magenta/mauve) are dark-on-dark and go illegible on the
     dark chip, so each INK is lifted to a bright version of the SAME hue — campaign
     periwinkle, live teal, music rose, socials mauve stay recognisably themselves,
     just brightened for the dark surface (chip text clears WCAG AA). Wash/edge keep
     their hue triplet and lift their alpha a touch so the chip still reads as a
     tinted pill (not a bare hairline) against the darker canvas. Drives the
     .pill-category chips, the list-kit provenance/.scope chip, and the calendar
     type chips later. */
  --mod-music-ink:      #F090BE; --mod-music-wash:     rgba(214,51,132,0.16);  --mod-music-edge:     rgba(232,92,158,0.34);
  --mod-campaigns-ink:  #A2AAF7; --mod-campaigns-wash: rgba(120,130,240,0.16); --mod-campaigns-edge: rgba(136,146,246,0.34);
  --mod-live-ink:       #5CC7DB; --mod-live-wash:      rgba(55,166,201,0.15);  --mod-live-edge:      rgba(70,180,215,0.32);
  --mod-socials-ink:    #CDA9E0; --mod-socials-wash:   rgba(190,150,215,0.16); --mod-socials-edge:   rgba(198,160,222,0.32);

  /* Text-entry placeholder — dark (#106). --ink-muted / --ink-faint go too faint on
     the dark field to read as help text, so placeholders read this dedicated,
     muted-but-legible value instead (light rules keep --ink-muted / --ink-faint
     untouched; this token is applied only in [data-theme="dark"] placeholder rules). */
  --ink-placeholder:  rgba(255, 255, 255, 0.70);

  /* Lift — shadows barely read on dark, so elevation is a LIGHTER surface + a
     top inner-light + a hairline, with only a soft ambient depth. The hover
     value follows the same model (subtle inset, deeper ambient) so a dark card
     never flashes the light build's bright white top line on hover. */
  --lift-bg:      linear-gradient(180deg, #1B1B22 0%, #141419 100%); /* @kind color */
  --lift-stroke:  1px solid rgba(255, 255, 255, 0.08); /* @kind color */
  --lift-shadow:  0 1px 0 rgba(255, 255, 255, 0.06) inset,
                  0 20px 40px -24px rgba(0, 0, 0, 0.70);
  --lift-shadow-hover:
                  0 1px 0 rgba(255, 255, 255, 0.08) inset,
                  0 24px 48px -22px rgba(0, 0, 0, 0.80);
  --lift-inner:   inset 0 1px 0 rgba(255, 255, 255, 0.06); /* card top-light */

  /* Header glass (Chip S · #142) — re-mixes against the dark --bg declared above. */
  --header-bg:   color-mix(in oklab, var(--bg) 76%, transparent); /* @kind color */
  --header-blur: blur(14px) saturate(115%);

  /* Pearl surface (#142) — dark values (Design Language dark strip; highlight
     alphas ≤ .08). Body deepens to the dark-strip card gradient; sheen +
     iridescent edge stay a whisper (pastel-white hue hints) so the nacre reads
     without ever glaring. */
  --surface-pearl: linear-gradient(180deg, #17171D, #121218); /* @kind color */
  --pearl-top:     inset 0 1px 0 rgba(255,255,255,0.06);
  --pearl-sheen:   linear-gradient(125deg, rgba(255,255,255,0.07) 0%, rgba(255,255,255,0) 32%, rgba(255,255,255,0) 68%, rgba(255,255,255,0.035) 100%); /* @kind color */
  --pearl-edge:    linear-gradient(135deg, rgba(233,168,200,0.08) 0%, rgba(178,165,235,0.06) 34%, rgba(150,214,219,0.06) 66%, rgba(226,196,140,0.07) 100%); /* @kind color */
}

/* ─────────── Base ───────────
   Minimal reset + body type. */
*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
/* Root background matches --bg so cross-page navigation paints cream from the
   first frame — kills the brief white flash the browser shows in the compositing
   gap before <body> paints (html had no background, so its default white showed). */
html { background: var(--bg); }
body {
  font-family: var(--sans);
  font-size: 14px;
  line-height: 1.5;
  color: var(--ink);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  min-height: 100vh;
  overflow-x: hidden;
  position: relative;
}
/* Soft atmospheric bloom — anchors the canvas without competing */
body::before {
  content: ""; position: fixed; inset: 0; pointer-events: none; z-index: 0;
  background:
    radial-gradient(60% 45% at 50% -10%, rgba(28,22,12,0.05), transparent 60%),
    radial-gradient(40% 32% at 92% 100%, rgba(15,90,79,0.05), transparent 60%);
}
/* Option A "clean warm" (#326) — cools the top-glow to a near-neutral matching the
   clean ink ramp; the teal corner is unchanged. Placed BEFORE the dark bloom so a
   dark viewer keeps the dark wash (equal specificity, later source wins). */
:root[data-palette="clean"] body::before {
  background:
    radial-gradient(60% 45% at 50% -10%, rgba(20,19,24,0.045), transparent 60%),
    radial-gradient(40% 32% at 92% 100%, rgba(15,90,79,0.05), transparent 60%);
}
/* Dark bloom (#106) — a cooler, fainter wash (white top, teal corner) so the
   dark canvas has the same quiet depth as light. Blur-free, very low alpha. */
:root[data-theme="dark"] body::before {
  background:
    radial-gradient(60% 45% at 50% -10%, rgba(255,255,255,0.04), transparent 60%),
    radial-gradient(40% 32% at 92% 100%, rgba(55,166,201,0.05), transparent 60%);
}
body > * { position: relative; z-index: 1; }

a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; border: 0; background: none; color: inherit; padding: 0; }
::selection { background: var(--brand); color: white; }
/* Dark (#106): --brand resolves to --ink-strong (#fff) in dark, so keep the
   selection a strong-on-canvas highlight instead of white-on-white. */
:root[data-theme="dark"] ::selection { background: var(--ink-strong); color: var(--bg); }

/* Tiny helpers — keep here so components don't redefine them */
.u-mono { font-family: var(--mono); letter-spacing: 0.02em; }
.u-display { font-family: var(--display); }
.u-nowrap { white-space: nowrap; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; }
}


/* ╔══════ components.css ══════╗ */
/* ═══════════════════════════════════════════════════════════════════
 *  Day to Day · Components
 *  Reusable across every product page. Reads tokens from tokens.css.
 *
 *  Index
 *  ─────
 *   1. Lift                  — system glass texture (applied via .lift)
 *   2. Topbar pill           — sticky header chrome
 *   3. Page wrap             — max-width container
 *   4. Section primitive     — section, section-bar, label/meta/action
 *   5. Greeting              — meta line + heading
 *   6. Absence band          — conditional welcome-back strip
 *   7. Ask                   — natural-language input (the wow moment)
 *   8. Share                 — utility share line
 *   9. Chips                 — week-chip (multi) + digest-filter (single)
 *  10. Week grid             — multi-row 7-day calendar
 *  11. Digest list           — priority feed
 *  12. Mood tile             — duotone artist card (.tile)
 *  13. Activity list         — recent activity row
 * ═══════════════════════════════════════════════════════════════════ */

/* ─────────── 1. Lift ─────────── */
.lift {
  background: var(--lift-bg);
  border: var(--lift-stroke);
  box-shadow: var(--lift-shadow);
  backdrop-filter: blur(20px) saturate(150%);
  -webkit-backdrop-filter: blur(20px) saturate(150%);
  position: relative;
}
.lift::before {
  content: ""; position: absolute;
  inset: 0;
  border-radius: inherit;
  background: linear-gradient(180deg, rgba(255,255,255,0.5), rgba(255,255,255,0) 30%);
  pointer-events: none;
  mix-blend-mode: overlay;
  opacity: 0.6;
}

/* ─────────── 2. Topbar pill ─────────── */
.top {
  position: sticky; top: 14px; z-index: 80;
  margin: 14px auto 0;
  width: calc(100% - 28px);
  max-width: 1320px;
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 18px;
  padding: 8px 12px 8px 18px;
  border-radius: 999px;
}
.top-mark { display: inline-flex; align-items: center; gap: 12px; white-space: nowrap; }
.top-mark-svg { width: 26px; height: 26px; flex-shrink: 0; display: block; }
.top-mark-svg .form { fill: var(--ink-strong); }
.top-word {
  font-family: var(--sans);
  font-weight: 600;
  font-size: 14px;
  letter-spacing: 0.32em;
  text-transform: lowercase;
  color: var(--ink-strong);
  white-space: nowrap;
  padding-top: 2px;
}
.top-meta {
  justify-self: center;
  font-family: var(--mono);
  font-size: 12px;
  letter-spacing: 0.02em;
  color: var(--ink-muted);
  white-space: nowrap;
}
.top-meta strong { color: var(--ink-strong); font-weight: 500; }
.top-actions { display: flex; align-items: center; gap: 6px; }
.top-search {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 7px 12px;
  border-radius: 999px;
  background: rgba(255,255,255,0.5);
  border: 1px solid rgba(28,22,12,0.07);
  color: var(--ink-muted);
  font-family: var(--mono);
  font-size: 12px;
  cursor: text;
  transition: border-color 200ms, color 200ms;
  white-space: nowrap;
}
.top-search:hover { border-color: rgba(28,22,12,0.18); color: var(--ink-strong); }
.top-search svg { width: 13px; height: 13px; stroke-width: 1.6; }
.top-search .kbd {
  font-family: var(--mono); font-size: 10px; color: var(--ink-faint);
  padding: 1px 5px; border: 1px solid rgba(28,22,12,0.07);
  border-radius: 3px; line-height: 1;
}
.top-btn {
  width: 36px; height: 36px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-soft);
  transition: background 200ms, color 200ms;
  position: relative;
}
.top-btn:hover { background: rgba(255,255,255,0.6); color: var(--ink-strong); }
.top-btn svg { width: 16px; height: 16px; stroke-width: 1.6; }
.top-btn .badge {
  display: none; /* hidden by default; the unread count (.badge.has-count) shows it */
  position: absolute; top: 8px; right: 8px;
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--urgent);
  box-shadow: 0 0 0 2px var(--bg), 0 0 8px rgba(139,30,46,0.5);
}
.top-avatar {
  width: 36px; height: 36px; border-radius: 50%;
  background: var(--ink-disc);
  color: var(--on-ink-strong);
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--sans); font-weight: 600; font-size: 12px;
  letter-spacing: 0.04em; cursor: pointer;
  box-shadow: 0 1px 1px rgba(255,255,255,0.3) inset, 0 4px 12px -2px rgba(14,11,8,0.45);
}

/* ─────────── 3. Page wrap ─────────── */
.page {
  max-width: 1320px;
  margin: 0 auto;
  padding: 22px 14px 80px;
  display: flex;
  flex-direction: column;
  gap: 24px;
}

/* ─────────── 4. Section primitive ─────────── */
.section { display: flex; flex-direction: column; gap: 10px; }
.section-bar {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 16px;
  margin-bottom: 16px;
}
.section-label-line { display: flex; align-items: baseline; gap: 14px; min-width: 0; flex-wrap: wrap; }
.section-label {
  font-family: var(--mono);
  font-weight: 600;
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--ink-strong);
  white-space: nowrap;
}
.section-meta {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--ink-muted);
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.section-action {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--ink-muted);
  letter-spacing: 0.02em;
  transition: color 200ms;
  white-space: nowrap;
}
.section-action:hover { color: var(--ink-strong); }

/* When a section header is immediately followed by the task-list toolbar,
   the two are one control cluster — drop the header's bottom margin so the
   section-block flex gap (16px) is the only spacing, not 16+16. */
.section-bar:has(+ #tasklist-toolbar) { margin-bottom: 0; }

/* Canonical "+ Add …" section action. Use on a .section-action button whose
   text is just the label ("Add partner"); the leading "+ " is rendered by
   the rule so every add-action across the app reads identically and the
   plus can never end up on the wrong side. Pairs with the .btn "+ Add …"
   primary buttons, which follow the same plus-on-the-left order. */
.section-action--add { display: inline-flex; align-items: baseline; gap: 5px; }
.section-action--add::before { content: "+"; font-weight: 600; }

/* ─────────── 5. Greeting ─────────── */
.greeting-meta {
  display: flex; align-items: center; gap: 10px;
  font-family: var(--mono); font-weight: 500;
  font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--ink-muted); white-space: nowrap;
}
.greeting-meta .pulse {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--urgent);
  box-shadow: 0 0 10px rgba(139,30,46,0.5);
}
.greeting-meta .sep { color: var(--ink-faint); }

.greeting-line {
  font-family: var(--display);
  font-weight: var(--fw-display);
  font-size: clamp(32px, 4vw, 52px);
  letter-spacing: -0.02em;
  line-height: 1.0;
  color: var(--ink-strong);
  margin: 0;
  text-wrap: balance;
}
/* Emphasis is weight, not colour. */
.greeting-line .name { color: var(--ink-strong); font-weight: 800; }

/* ─────────── 6. Absence band ─────────── */
.absence {
  display: flex; align-items: center; gap: 14px;
  margin-top: 12px;
  padding: 7px 8px 7px 14px;
  border-radius: 999px;
  flex-wrap: wrap;
  background: rgba(255,255,255,0.55);
  border: 1px solid rgba(28,22,12,0.05);
  backdrop-filter: blur(16px) saturate(150%);
  -webkit-backdrop-filter: blur(16px) saturate(150%);
  position: relative;
}
.absence::after {
  content: ""; position: absolute;
  left: 0; top: 8px; bottom: 8px; width: 2px;
  background: var(--ink-strong);
  border-radius: 0 2px 2px 0;
}
.absence-eyebrow {
  font-family: var(--mono);
  font-weight: 600;
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-strong);
  white-space: nowrap;
}
.absence-line {
  font-family: var(--sans);
  font-size: 12.5px;
  color: var(--ink-soft);
}
.absence-line strong { color: var(--ink-strong); font-weight: 600; }
.absence-chips { display: flex; align-items: center; gap: 14px; margin-left: auto; flex-wrap: wrap; }
.absence-chip {
  display: inline-flex; align-items: baseline; gap: 4px;
  font-family: var(--mono);
  font-size: 11px;
  color: var(--ink-muted);
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.absence-chip .num {
  font-family: var(--sans); font-weight: 600;
  font-size: 12px; color: var(--ink-strong); line-height: 1;
}
.absence-action {
  font-family: var(--mono); font-weight: 500;
  font-size: 11px; letter-spacing: 0.04em;
  color: var(--ink-strong);
  padding-bottom: 1px; border-bottom: 1px solid var(--ink-strong);
  cursor: pointer; white-space: nowrap;
  transition: color 200ms, border-color 200ms;
}
.absence-action:hover { color: var(--urgent); border-color: var(--urgent); }
.absence-close {
  width: 22px; height: 22px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-faint);
  transition: background 200ms, color 200ms;
}
.absence-close:hover { background: rgba(28,22,12,0.06); color: var(--ink-strong); }

/* ─────────── 7. Ask ─────────── */
.ask {
  display: flex; align-items: center; gap: 16px;
  padding: 18px 18px 18px 20px;
  border-radius: var(--r-xl);
  cursor: text;
  transition: box-shadow 200ms;
}
.ask:hover { box-shadow: var(--lift-shadow-hover); }
.ask:focus-within { box-shadow: var(--lift-shadow-hover), 0 0 0 3px var(--brand-wash); }
.ask-mark {
  width: 42px; height: 42px; border-radius: 50%;
  background: var(--ink-disc);
  color: var(--on-ink-strong);
  display: inline-flex; align-items: center; justify-content: center;
  flex-shrink: 0;
  box-shadow: 0 1px 1px rgba(255,255,255,0.3) inset, 0 4px 12px -2px rgba(14,11,8,0.4);
}
.ask-mark svg { width: 18px; height: 18px; stroke-width: 2; }
.ask-input {
  flex: 1;
  font-family: var(--sans);
  font-size: 20px;
  font-weight: 500;
  letter-spacing: -0.02em;
  color: var(--ink-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.ask-input em {
  font-style: normal;
  color: var(--ink-strong);
  font-weight: 700;
}
.ask-chips {
  display: flex; align-items: center; gap: 5px;
  flex-wrap: nowrap;
  overflow: hidden;
}
.ask-chip {
  padding: 5px 10px;
  background: rgba(28,22,12,0.04);
  border-radius: 999px;
  color: var(--ink-soft);
  font-family: var(--mono); font-size: 11px;
  letter-spacing: 0.02em;
  transition: all 200ms;
  white-space: nowrap;
}
.ask-chip:hover { background: var(--ink-strong); color: var(--bg); }
.ask-kbd {
  font-family: var(--mono); font-size: 10.5px;
  color: var(--ink-muted);
  padding: 5px 8px;
  border: 1px solid rgba(28,22,12,0.08);
  background: rgba(255,255,255,0.7);
  border-radius: 5px; line-height: 1;
  flex-shrink: 0;
}
@media (max-width: 1200px) { .ask-chips { display: none; } }

/* ─────────── 8. Share ─────────── */
.share {
  display: flex; align-items: baseline; gap: 12px;
  padding: 2px 8px;
  flex-wrap: wrap;
}
.share-eyebrow {
  font-family: var(--mono); font-weight: 600;
  font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--ink-strong); white-space: nowrap;
}
.share-line {
  font-family: var(--sans); font-size: 12.5px;
  color: var(--ink-muted); line-height: 1.4;
}
.share-action {
  margin-left: auto;
  font-family: var(--mono); font-weight: 500;
  font-size: 11px; letter-spacing: 0.04em;
  color: var(--ink-strong);
  padding-bottom: 1px; border-bottom: 1px solid var(--ink-strong);
  cursor: pointer; white-space: nowrap;
  transition: color 200ms, border-color 200ms;
}
.share-action:hover { color: var(--urgent); border-color: var(--urgent); }

/* ─────────── 9. Chips ─────────── */
/* 9a. .chip-check — multi-select checkbox pills (week-ahead filters) */
.chip-check {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 10px 4px 8px;
  border: 1px solid rgba(28,22,12,0.08);
  background: rgba(255,255,255,0.6);
  border-radius: 999px;
  color: var(--ink-soft);
  font-family: var(--mono); font-size: 11px;
  letter-spacing: 0.02em;
  cursor: pointer;
  transition: all 200ms;
  white-space: nowrap;
}
.chip-check::before {
  content: ""; display: inline-block;
  width: 12px; height: 12px;
  border-radius: 3px;
  border: 1.2px solid rgba(28,22,12,0.18);
  background: transparent;
  transition: background 200ms, border-color 200ms;
  flex-shrink: 0;
}
.chip-check.active { color: var(--ink-strong); background: white; border-color: rgba(28,22,12,0.14); }
.chip-check.active::before {
  background: var(--ink-strong);
  border-color: var(--ink-strong);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='2.5 6 5 8.5 9.5 3.5'/></svg>");
  background-size: 10px 10px;
  background-position: center;
  background-repeat: no-repeat;
}
.chip-check:hover { border-color: rgba(28,22,12,0.22); }

/* 9b. (segmented control consolidated into .seg — see section 8) */

/* Generic chip-toolbar wrapper used by week-ahead etc. */
.chip-toolbar {
  display: flex; align-items: center; gap: 6px;
  flex-wrap: wrap;
}
.chip-toolbar-label {
  font-family: var(--mono); font-weight: 500;
  font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--ink-muted);
  margin-right: 4px;
}

/* ─────────── 10. Week grid ─────────── */
/* Cross-artist 7-day calendar. Lift-wrapped, 4 artist rows.
   Per-artist mood is the vertical rail on the left of each artist
   column. Urgent events earn the deep oxblood left-rail. */
.week-panel {
  border-radius: var(--r-lg);
  overflow: hidden;
}
.week-grid {
  display: grid;
  grid-template-columns: 156px repeat(7, minmax(0, 1fr));
}
.week-corner {
  padding: 12px 16px;
  font-family: var(--mono);
  font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--ink-muted); font-weight: 500;
  border-right: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline);
  background: rgba(255,255,255,0.4);
}
.week-day {
  padding: 10px 12px;
  border-right: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline);
  position: relative;
  min-width: 0;
  background: rgba(255,255,255,0.4);
}
.week-day:last-of-type { border-right: 0; }
.week-day.today {
  background: linear-gradient(180deg, rgba(28,22,12,0.07) 0%, rgba(28,22,12,0.03) 100%);
}
.week-day.today::after {
  content: "";
  position: absolute; left: 0; right: 0; bottom: -1px;
  height: 3px;
  background: var(--ink-strong);
  border-radius: 2px 2px 0 0;
}
.week-day-dow {
  font-family: var(--mono); font-weight: 500;
  font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-muted);
}
.week-day.today .week-day-dow { color: var(--ink-strong); font-weight: 600; }
.week-day-num {
  font-family: var(--sans); font-weight: 700;
  font-size: 26px; line-height: 1;
  letter-spacing: -0.025em;
  color: var(--ink-strong);
  margin-top: 4px;
  font-feature-settings: "tnum";
}
.week-day-tag {
  font-family: var(--mono); font-size: 10px;
  color: var(--ink-strong);
  margin-top: 4px;
  letter-spacing: 0.06em; font-weight: 600;
}

.week-row { display: contents; }
.week-artist {
  padding: 12px 16px 12px 20px;
  border-right: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline);
  display: flex; flex-direction: column; gap: 2px;
  min-width: 0;
  background: rgba(255,255,255,0.25);
  position: relative;
}
.week-artist::before {
  content: "";
  position: absolute; left: 0; top: 14px; bottom: 14px; width: 3px;
  background: var(--mood-color);
  border-radius: 0 2px 2px 0;
}
.week-artist .row-1 {
  font-family: var(--sans); font-weight: 600;
  font-size: 13.5px; color: var(--ink-strong);
  letter-spacing: -0.005em;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.week-artist .row-2 {
  font-family: var(--mono); font-weight: 500;
  font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-muted);
  white-space: nowrap;
}
/* ═══════════════════════════════════════════════════════════════════
 *  PER-ARTIST MOOD — the artist's accent colour. Bound as INLINE custom
 *  properties on each moodful element (the shell, hero, tiles, campaign
 *  cards, week rows) by D2D_applyMood / D2D_moodStyle in js/data.js, each
 *  referencing the :root --m-<mood> base token. No CSS theme scopes — the
 *  stylesheet stays free of scoped token definitions; components simply read
 *  var(--tile-color) / var(--artist-accent) / var(--hero-mood) / etc.
 * ═══════════════════════════════════════════════════════════════════ */

.week-cell {
  padding: 6px 7px;
  border-right: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline);
  min-width: 0;
  display: flex; flex-direction: column; gap: 4px;
  min-height: 64px;
}
.week-cell:nth-child(8n) { border-right: 0; }
.week-cell.today { background: rgba(28,22,12,0.03); }
.week-event {
  padding: 7px 9px 8px;
  background: linear-gradient(180deg, rgba(255,255,253,0.98) 0%, rgba(255,254,250,0.78) 100%);
  border: 1px solid rgba(28,22,12,0.06);
  border-left: 2px solid rgba(28,22,12,0.22);
  border-radius: 5px;
  cursor: pointer;
  transition: transform 150ms, box-shadow 150ms;
  min-width: 0;
  box-shadow:
    0 1px 0 rgba(255,255,255,0.8) inset,
    0 1px 2px rgba(28,22,12,0.04),
    0 3px 6px -2px rgba(28,22,12,0.05);
}
.week-event:hover {
  transform: translateY(-1px);
  box-shadow:
    0 1px 0 rgba(255,255,255,0.8) inset,
    0 6px 14px -4px rgba(28,22,12,0.12),
    0 16px 28px -12px rgba(28,22,12,0.10);
}
.week-event.urgent { border-left-color: var(--urgent); }
.week-event-meta {
  display: flex; align-items: baseline; gap: 6px;
  margin-bottom: 1px;
}
.week-event-type {
  font-family: var(--mono);
  font-size: 8.5px;
  letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-muted);
  font-weight: 600;
}
.week-event.urgent .week-event-type { color: var(--urgent); }
.week-event-time {
  font-family: var(--mono);
  font-size: 9.5px;
  color: var(--ink-muted);
}
.week-event-title {
  font-family: var(--sans);
  font-size: 11.5px;
  font-weight: 500;
  color: var(--ink-strong);
  line-height: 1.22;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.week-row-empty .week-cell { min-height: 32px; }
.week-row-empty .week-artist { padding: 6px 16px 6px 20px; }
.week-row-empty .week-artist .row-1 { font-weight: 500; color: var(--ink-muted); }
@media (max-width: 1100px) {
  .week-grid { grid-template-columns: 130px repeat(7, minmax(0, 1fr)); }
}

/* ─────────── 11. Digest list ─────────── */
/* Compact row list — used by /home Priority and by artist dashboard.
   Identity carried by ARTIST NAME (typographic), urgency carried
   by the left rail + label colour. No per-artist dots. */
.digest-list {
  border-radius: var(--r-md);
  overflow: hidden;
}
.digest-row {
  display: grid;
  grid-template-columns: 6px 160px 140px 1fr 110px 14px;
  gap: 14px;
  padding: 13px 18px 13px 14px;
  align-items: center;
  border-bottom: 1px solid var(--hairline);
  cursor: pointer;
  transition: background 150ms;
  position: relative;
}
.digest-row:last-child { border-bottom: 0; }
.digest-row:hover { background: rgba(255,255,255,0.5); }
.digest-rank {
  width: 3px; align-self: stretch;
  background: transparent;
  border-radius: 0 2px 2px 0;
  margin: 6px 0;
}
.digest-row.urgent .digest-rank { background: var(--urgent); }
.digest-artist {
  font-family: var(--sans);
  font-weight: 600;
  font-size: 13.5px;
  color: var(--ink-strong);
  letter-spacing: -0.005em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.digest-type {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-muted);
  font-weight: 500;
  white-space: nowrap;
}
.digest-row.urgent .digest-type { color: var(--urgent); }
.digest-detail {
  font-family: var(--sans);
  font-size: 13px;
  color: var(--ink-soft);
  line-height: 1.4;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.digest-detail strong { color: var(--ink-strong); font-weight: 500; }
.digest-when {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--ink-muted);
  letter-spacing: 0.02em;
  text-align: right;
  white-space: nowrap;
}
.digest-when.urgent { color: var(--urgent); font-weight: 600; }
.digest-chevron {
  color: var(--ink-faint);
  font-size: 14px;
  text-align: right;
  transition: transform 150ms, color 150ms;
}
.digest-row:hover .digest-chevron { transform: translateX(3px); color: var(--ink-strong); }

/* ─────────── 12. Mood tile ─────────── */
/* Duotone artist card. B&W photo + per-artist mood multiply.
   Used on /home Roster. Reusable wherever an artist needs a
   visually identifiable presence (artist switcher, search results,
   "owned by" attributions). */
.tile {
  position: relative;
  aspect-ratio: 4 / 5;
  border-radius: var(--r-lg);
  overflow: hidden;
  cursor: pointer;
  transition: transform 320ms cubic-bezier(0.2, 0, 0, 1), box-shadow 320ms;
  box-shadow: var(--lift-shadow);
}
.tile:hover { transform: translateY(-3px); box-shadow: var(--lift-shadow-hover); }
.tile { background: var(--tile-color); }
.tile::before {
  content: ""; position: absolute; inset: 0;
  /* Photo URL is expected from a CSS custom prop --tile-photo;
     defaults to the elara scene image used in wireframes. */
  background: var(--tile-photo, none) center 18% / cover no-repeat;
  filter: grayscale(1) contrast(1.4) brightness(1.15);
}
.tile::after {
  content: ""; position: absolute; inset: 0;
  background: var(--tile-color);
  mix-blend-mode: multiply;
}
.tile .fade {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, transparent 35%, rgba(0,0,0,0.72) 100%);
  z-index: 1;
  pointer-events: none;
}
.tile-top {
  position: absolute; top: 14px; left: 14px; right: 14px;
  display: flex; align-items: center; justify-content: flex-end;
  z-index: 2;
}
.tile-phase {
  padding: 5px 10px;
  background: rgba(0,0,0,0.42);
  border: 1px solid rgba(255,255,255,0.22);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-radius: 999px;
  font-family: var(--mono);
  font-weight: 500;
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: white;
  white-space: nowrap;
}
.tile-phase.muted { color: rgba(255,255,255,0.65); }
.tile-bottom {
  position: absolute; left: 14px; right: 14px; bottom: 14px;
  z-index: 2;
  display: flex; flex-direction: column; gap: 10px;
}
.tile-name {
  font-family: var(--display);
  font-weight: var(--fw-display);
  font-size: clamp(22px, 2vw, 28px);
  letter-spacing: -0.015em;
  line-height: 0.95;
  color: white;
  text-wrap: balance;
  margin: 0;
}
.tile-card {
  padding: 10px 12px;
  background: rgba(0,0,0,0.55);
  border: 1px solid rgba(255,255,255,0.12);
  backdrop-filter: blur(22px) saturate(160%);
  -webkit-backdrop-filter: blur(22px) saturate(160%);
  border-radius: 12px;
  display: flex; flex-direction: column; gap: 6px;
}
.tile-line {
  display: grid;
  grid-template-columns: 50px 1fr;
  gap: 10px;
  align-items: baseline;
  font-family: var(--sans);
  font-size: 12px;
  line-height: 1.3;
}
.tile-line .k {
  font-family: var(--mono); font-weight: 500;
  font-size: 9.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.55);
  white-space: nowrap;
}
.tile-line .v {
  color: white; font-weight: 500;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.tile-line .v.muted { color: rgba(255,255,255,0.5); font-style: italic; font-weight: 400; }

/* ─────────── 13. Activity list ─────────── */
.activity-list {
  border-radius: var(--r-md);
  overflow: hidden;
}
.activity-row {
  display: grid;
  grid-template-columns: 26px 150px 1fr 100px;
  gap: 14px;
  padding: 10px 20px;
  align-items: center;
  border-bottom: 1px solid var(--hairline);
  transition: background 150ms;
}
.activity-row:last-child { border-bottom: 0; }
.activity-row:hover { background: rgba(255,255,255,0.5); }
.activity-avatar {
  width: 24px; height: 24px;
  border-radius: 50%;
  background: rgba(255,255,255,0.7);
  border: 1px solid rgba(28,22,12,0.07);
  color: var(--ink-strong);
  display: flex; align-items: center; justify-content: center;
  font-family: var(--sans);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.02em;
}
.activity-artist {
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 600;
  color: var(--ink-strong);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.activity-detail {
  font-family: var(--sans);
  font-size: 13px;
  color: var(--ink-soft);
  line-height: 1.4;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.activity-detail strong { color: var(--ink-strong); font-weight: 500; }
.activity-when {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--ink-muted);
  letter-spacing: 0.02em;
  text-align: right;
  white-space: nowrap;
}


/* ╔══════ controls.css ══════╗ */
/* ═══════════════════════════════════════════════════════════════════
 *  Day to Day · Controls
 *  ─────────────────────────────────────────────────────────────────
 *  Shared atoms used across every surface: buttons, dropdown menus,
 *  and the status pill family + its 4-state picker. Home aesthetic —
 *  ink-as-brand, no accent. Reads tokens from tokens.css.
 *
 *  Index
 *  ─────
 *   1. Buttons        — primary / secondary / tertiary / danger
 *   2. Menus          — floating dropdowns (sort-menu, actions menu)
 *   3. Status pills    — draft / in-progress / blocked / done + category
 *   4. Status picker   — chip + caret → 4-state popover
 *   5. Toasts          — success / error / delete-undo
 * ═══════════════════════════════════════════════════════════════════ */

/* ─────────── 1. Buttons ─────────── */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  height: 36px; padding: 0 16px;
  border-radius: 999px;
  font-family: var(--sans); font-weight: 600; font-size: 13px;
  letter-spacing: -0.005em;
  white-space: nowrap;
  transition: background 200ms, color 200ms, border-color 200ms, box-shadow 200ms;
}
.btn-primary {
  background: linear-gradient(180deg, var(--ink-strong), #000);
  color: var(--bg);
  box-shadow: 0 1px 1px rgba(255,255,255,0.2) inset, 0 4px 12px -3px rgba(14,11,8,0.4);
}
.btn-primary:hover { box-shadow: 0 1px 1px rgba(255,255,255,0.2) inset, 0 6px 16px -3px rgba(14,11,8,0.5); }
.btn-secondary {
  background: rgba(255,255,255,0.7);
  border: 1px solid var(--hairline);
  color: var(--ink-strong);
}
.btn-secondary:hover { background: white; border-color: rgba(28,22,12,0.18); }
/* #106 dark solid-chrome — buttons. Light (above) is untouched: the primary keeps
   its ink→black gradient, the secondary its white chip. Dark inverts light's
   solid-ink key: the founder now wants the primary to be a solid WHITE fill with
   dark text — the exact inverse of light's near-black fill (var(--ink-strong) flips
   to #fff and var(--surface) to the dark card, so background:var(--ink-strong);
   color:var(--surface) IS the light active-tab pairing, read the other way). This
   REVISES the earlier warm-charcoal --fill-strong key; that raised-charcoal idiom
   now lives only on the FAB. The secondary stays a GHOST OUTLINE (transparent,
   hairline border) so it reads clearly subordinate to the white key. */
[data-theme="dark"] .btn-primary {
  background: var(--ink-strong);
  color: var(--surface);
  box-shadow: 0 6px 16px -6px rgba(0,0,0,0.7);
}
[data-theme="dark"] .btn-primary:hover {
  box-shadow: 0 8px 20px -6px rgba(0,0,0,0.82);
}
[data-theme="dark"] .btn-secondary { background: transparent; border-color: var(--hairline); color: var(--ink-strong); }
[data-theme="dark"] .btn-secondary:hover { background: rgba(255,255,255,0.06); border-color: rgba(255,255,255,0.16); }
/* Segmented control — same inverted-key idiom as the primary. The light active pill
   is a literal `background: white` with dark text; in dark that would go
   white-on-white (ink-strong flips to #fff), so the active tab reads the solid
   WHITE fill + dark text pairing explicitly (var(--ink-strong)/var(--surface)),
   matching light inverted. The track quiets to the dark chip fill. Found on #112's
   calendar; applies to every .seg user. */
[data-theme="dark"] .seg { background: var(--chip); border-color: var(--hairline); }
[data-theme="dark"] .seg-btn.is-active, [data-theme="dark"] .seg-btn.active, [data-theme="dark"] .seg-btn[aria-checked="true"] {
  background: var(--ink-strong);
  color: var(--surface);
  box-shadow: 0 2px 8px -3px rgba(0,0,0,0.6);
}
.btn-tertiary {
  background: transparent;
  color: var(--ink-soft);
  padding: 0 12px;
}
.btn-tertiary:hover { background: rgba(28,22,12,0.05); color: var(--ink-strong); }
.btn.footer-btn-danger, .btn-tertiary.footer-btn-danger { color: var(--urgent); }
.btn.footer-btn-danger:hover, .btn-tertiary.footer-btn-danger:hover { background: var(--urgent-soft); color: var(--urgent); }
.btn:disabled, .btn[aria-disabled="true"] { opacity: 0.45; pointer-events: none; }

/* Inline "+ Add …" affordance (drawer sections, quick-add) */
.add-affordance {
  align-self: flex-start;
  font-family: var(--mono); font-weight: 500; font-size: 11.5px; letter-spacing: 0.02em;
  color: var(--ink-strong);
  padding: 4px 0;
  border-bottom: 1px solid transparent;
  transition: border-color 200ms, color 200ms;
}
.add-affordance:hover { border-bottom-color: var(--ink-strong); }
.add-affordance.is-deferred, .add-affordance[aria-disabled="true"] { color: var(--ink-faint); pointer-events: none; }

/* ─────────── 2. Menus ─────────── */
.menu-wrap { position: relative; }
.menu, .sort-menu, .card-actions-menu, .status-picker, .avatar-menu, .switcher-menu {
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  min-width: 168px;
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--r-md);
  box-shadow: var(--lift-shadow);
  padding: 5px;
  z-index: 90;
  display: none;
}
.menu.is-open, .sort-menu.is-open, .card-actions-menu.is-open,
.status-picker.is-open, .avatar-menu.is-open, .switcher-menu.is-open { display: block; }
.menu-item, .sort-menu-item {
  display: flex; align-items: center; gap: 9px;
  width: 100%;
  padding: 8px 10px;
  border-radius: var(--r-sm);
  font-family: var(--sans); font-size: 13px; color: var(--ink);
  text-align: left;
  transition: background 150ms, color 150ms;
}
.menu-item:hover, .sort-menu-item:hover { background: rgba(28,22,12,0.05); color: var(--ink-strong); }
.menu-item-destructive { color: var(--urgent); }
.menu-item-destructive:hover { background: var(--urgent-soft); color: var(--urgent); }
.sort-menu-item.is-current { background: rgba(28,22,12,0.05); color: var(--ink-strong); font-weight: 600; }

/* Row actions trigger (⋯) */
.card-actions-wrap { position: relative; }
.card-actions {
  width: 28px; height: 28px; border-radius: 7px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-muted);
  transition: background 150ms, color 150ms;
}
.card-actions:hover { background: rgba(28,22,12,0.06); color: var(--ink-strong); }
.card-actions-glyph { width: 15px; height: 15px; fill: currentColor; }

/* ─────────── 3. Status pills ─────────── */
.pill {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 10px;
  border-radius: 999px;
  font-family: var(--mono); font-weight: 500;
  font-size: 10.5px; letter-spacing: 0.06em;
  white-space: nowrap;
  border: 1px solid transparent;
}
/* Status uses tinted neutrals + the one urgent accent for blocked. The
   palette stays quiet — status is conveyed by label + a small dot weight. */
.pill-draft        { background: rgba(28,22,12,0.05);  color: var(--ink-muted);  border-color: var(--hairline); }
.pill-in-progress  { background: var(--status-info-wash); color: var(--status-info);           border-color: var(--status-info-edge); }
.pill-paused       { background: var(--urgent-soft);   color: var(--urgent);     border-color: rgba(139,30,46,0.18); }
.pill-completed    { background: var(--status-positive-wash); color: var(--status-positive);           border-color: var(--status-positive-edge); }

/* Category chip — module-family tint via [data-mod]. Quiet by default. */
.pill-category { background: rgba(28,22,12,0.05); color: var(--ink-soft); border-color: var(--hairline); }
.pill-category[data-mod="music"]     { background: var(--mod-music-wash);     color: var(--mod-music-ink);     border-color: var(--mod-music-edge); }
.pill-category[data-mod="campaigns"] { background: var(--mod-campaigns-wash); color: var(--mod-campaigns-ink); border-color: var(--mod-campaigns-edge); }
.pill-category[data-mod="live"]      { background: var(--mod-live-wash);      color: var(--mod-live-ink);      border-color: var(--mod-live-edge); }
.pill-category[data-mod="socials"]   { background: var(--mod-socials-wash);   color: var(--mod-socials-ink);   border-color: var(--mod-socials-edge); }
.pill-category[data-mod="business"]  { background: rgba(28,22,12,0.06);    color: var(--ink-soft); border-color: var(--hairline); }
.pill-category[data-mod="neutral"]   { background: rgba(28,22,12,0.05);    color: var(--ink-muted); border-color: var(--hairline); }

/* ─────────── 4. Status picker (chip + caret → popover) ─────────── */
.status-chip-wrap { position: relative; display: inline-flex; }
.pill-btn {
  cursor: pointer;
  transition: filter 150ms, box-shadow 150ms;
}
.pill-btn:hover { box-shadow: 0 0 0 3px rgba(28,22,12,0.05); }
.status-chip-caret { font-size: 8px; opacity: 0.7; margin-left: 1px; }
.status-picker { min-width: 156px; right: auto; left: 0; }
.status-pill-opt {
  display: flex; align-items: center; width: 100%;
  padding: 6px 8px; border-radius: var(--r-sm);
  transition: background 150ms;
}
.status-pill-opt:hover { background: rgba(28,22,12,0.05); }
.status-pill-opt.is-current { background: rgba(28,22,12,0.05); }

/* ─────────── 5. Toasts ─────────── */
.toast {
  position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%);
  z-index: 200;
  display: inline-flex; align-items: center; gap: 11px;
  padding: 12px 16px;
  border-radius: 999px;
  background: var(--ink-strong);
  color: var(--bg);
  font-family: var(--sans); font-size: 13px; font-weight: 500;
  box-shadow: 0 8px 24px -6px rgba(14,11,8,0.5);
}
.toast-check {
  width: 18px; height: 18px; border-radius: 50%;
  background: rgba(255,255,255,0.16);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 11px;
}
.toast-action {
  font-family: var(--mono); font-size: 11px; letter-spacing: 0.04em;
  color: var(--bg);
  padding-bottom: 1px; border-bottom: 1px solid rgba(255,255,255,0.5);
  margin-left: 4px;
}
.toast-action:hover { border-bottom-color: var(--bg); }
/* Error variant — a save/write failed. The urgent (danger) fill + alert glyph
   read unmistakably as an error, never a green success. */
.toast--error { background: var(--urgent); }
.toast--error .toast-check { background: rgba(255,255,255,0.22); font-weight: 700; }


/* ╔══════ shell.css ══════╗ */
/* ═══════════════════════════════════════════════════════════════════
 *  Day to Day · App Shell
 *  ─────────────────────────────────────────────────────────────────
 *  The workspace chrome that wraps every ARTIST-scoped surface
 *  (dashboard, campaigns, campaign plan, tasks). Built in the same
 *  language as Home.html: warm paper, ink-as-brand, mono labels, the
 *  signature `lift` glass. The system chrome stays monochrome; the
 *  per-artist mood appears only on artist-bound accents.
 *
 *  Authored ONCE here + mounted via partials/ so every surface gets a
 *  byte-identical shell. Reads tokens from tokens.css; depends on
 *  components.css (.section-bar/.section-label) + controls.css.
 *
 *  Index
 *  ─────
 *   1. Shell layout          — sidebar + main grid
 *   2. Sidebar               — workspace nav (account + artist modes)
 *   3. Artist topbar         — breadcrumb + actions (switcher/search/etc)
 *   4. Content canvas        — the scroll region inside the shell
 *   5. Hero / page header    — cover image + band + avatar + chips
 *   6. Tabs                  — campaign-surface section nav
 *   7. Dashboard modules     — "where things stand" tiles
 *   8. Filter group          — segmented radio (Today / Overdue / …)
 *   9. List rows             — priority + recent (slim row list)
 *  10. Quick reference       — 3-card reference strip
 *  11. Single-artist week    — 7-day strip (artist dashboard)
 * ═══════════════════════════════════════════════════════════════════ */

:root {
  --sidebar-w: 250px;
  --shell-max: 1180px;   /* content column cap inside the shell */
}

/* Per-artist accent — bound on the shell via [data-mood]. Used sparingly
   on the artist's OWN surface (hero accent band, avatar ring, the
   week 'today' marker, section ticks) so the artist's colour is felt,
   not just a dot. System chrome (sidebar, topbar) stays monochrome.
   URGENT (oxblood) is never replaced by the accent. Mood→accent mapping
   now lives in the unified [data-mood] theme scopes; default is in :root. */

/* ─────────── 1. Shell layout ─────────── */
/* The [hidden] attribute must always win, even over display:grid/flex
   (fixes the card↔list toggle leaving both visible). */
[hidden] { display: none !important; }
.shell {
  display: grid;
  grid-template-columns: var(--sidebar-w) minmax(0, 1fr);
  /* Fixed app shell — the chrome stays in one view; ONLY .shell-main scrolls.
     Scroll consumers go through D2D_scrollY / D2D_scrollTo / D2D_onScroll. */
  height: 100vh;
  overflow: hidden;
}
.shell-main {
  min-width: 0;
  display: flex;
  flex-direction: column;
  height: 100vh;
  overflow-y: auto;
}

/* ─────────── 2. Sidebar ─────────── */
.sidebar {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 0 14px 14px;
  border-right: 1px solid var(--hairline);
  /* A near-solid white rail so the chrome reads distinct from the warm-paper
     content canvas (page background stays --bg, consistent with Home). */
  background: rgba(255,255,255,0.92);
  backdrop-filter: blur(20px) saturate(140%);
  -webkit-backdrop-filter: blur(20px) saturate(140%);
  scrollbar-width: thin;
}
.sidebar::-webkit-scrollbar { width: 6px; }
.sidebar::-webkit-scrollbar-thumb { background: rgba(28,22,12,0.10); border-radius: 3px; }

.sidebar-mark {
  display: inline-flex; align-items: center; gap: 11px;
  /* Same 60px row height as the artist topbar, so the mark + wordmark sit on
     the exact line of the header across the hairline. */
  height: 60px; box-sizing: border-box; flex-shrink: 0;
  padding: 0 8px;
  white-space: nowrap;
  border-bottom: 1px solid var(--hairline-soft);
}
.sidebar-mark-svg { width: 24px; height: 24px; flex-shrink: 0; display: block; }
.sidebar-mark-svg .form { fill: var(--ink-strong); }
.sidebar-word {
  font-family: var(--sans); font-weight: 600;
  font-size: 13px; letter-spacing: 0.3em;
  text-transform: lowercase; color: var(--ink-strong);
  padding-top: 2px;
}

.sidebar-group {
  display: flex; flex-direction: column; gap: 1px;
}
.sidebar-grouplabel {
  font-family: var(--mono); font-weight: 500;
  font-size: 9.5px; letter-spacing: 0.2em; text-transform: uppercase;
  color: var(--ink-faint);
  padding: 4px 10px 6px;
}
.sidebar-item {
  display: flex; align-items: center; gap: 11px;
  padding: 6px 10px;
  border-radius: 9px;
  color: var(--ink-soft);
  font-family: var(--sans); font-size: 13.5px; font-weight: 500;
  letter-spacing: -0.005em;
  transition: background 150ms, color 150ms;
  position: relative;
  white-space: nowrap;
}
.sidebar-item:hover { background: rgba(28,22,12,0.045); color: var(--ink-strong); }
.sidebar-icon { width: 17px; height: 17px; flex-shrink: 0; stroke-width: 1.7; }
.sidebar-item.active {
  background: var(--ink-strong);
  color: var(--bg);
  box-shadow: 0 1px 1px rgba(255,255,255,0.25) inset, 0 4px 12px -4px rgba(14,11,8,0.4);
}
.sidebar-item.active:hover { background: var(--ink-strong); color: var(--bg); }
.sidebar-item.is-disabled {
  color: var(--ink-faint);
  pointer-events: none;
  cursor: default;
}
.sidebar-item.is-disabled .sidebar-icon { opacity: 0.6; }

.sidebar-spacer { flex: 1; }

/* ── image-slot skin — the drop-slot component ships generic greys; skin it
      to the system everywhere it appears (Brand logos / references / boards).
      The --slot-* vars feed the component's shadow styles. ── */
image-slot {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.03em; color: var(--ink-muted);
  --slot-bg: var(--surface);
  --slot-ring: var(--ink-faint);
  --slot-accent: var(--ink-strong);
  --slot-accent-wash: var(--brand-wash);
  --slot-sub-line: rgba(28,22,12,0.2);
  --slot-sub-hover: var(--ink-strong);
}

/* ── Collapsible sidebar — collapses to an icons-only rail so working pages
      get the width. Toggle lives above the user block; the preference is
      shared across every page (localStorage d2d.sidebar.collapsed). ── */
.sidebar-collapse {
  display: flex; align-items: center; gap: 8px;
  padding: 3px 10px; margin: 0;
  border: 0; background: transparent; border-radius: 7px;
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase; text-align: left;
  color: var(--ink-faint); cursor: pointer;
  transition: color 150ms, background 150ms;
}
.sidebar-collapse:hover { color: var(--ink-strong); background: rgba(28,22,12,0.04); }
.sidebar-collapse .sidebar-icon { width: 13px; height: 13px; transition: transform 220ms; }
.shell.is-sidebar-collapsed { --sidebar-w: 68px; }
.shell.is-sidebar-collapsed .sidebar-label,
.shell.is-sidebar-collapsed .sidebar-word,
.shell.is-sidebar-collapsed .sidebar-grouplabel { display: none; }
.shell.is-sidebar-collapsed .sidebar-item,
.shell.is-sidebar-collapsed .sidebar-collapse,
.shell.is-sidebar-collapsed .sidebar-mark { justify-content: center; padding-left: 0; padding-right: 0; }
.shell.is-sidebar-collapsed .sidebar-group + .sidebar-group { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--hairline-soft); }
.shell.is-sidebar-collapsed .sidebar-collapse .sidebar-icon { transform: rotate(180deg); }
/* Collapsed-rail tooltip — fixed on body so the scrolling sidebar can't clip it */
.sidebar-tip {
  position: fixed; transform: translateY(-50%); z-index: 200;
  background: var(--ink-strong); color: #fff;
  font-family: var(--sans); font-size: 12px; font-weight: 500;
  padding: 5px 11px; border-radius: 6px; white-space: nowrap;
  pointer-events: none; box-shadow: 0 6px 18px -6px rgba(28,22,12,0.35);
}

/* D-011 empty-account invitation — inline tertiary text, no boxed CTA */
.empty-invite {
  font-family: var(--sans); font-size: 13.5px; line-height: 1.6;
  color: var(--ink-muted); margin: 4px 2px 0; max-width: 52ch; text-wrap: pretty;
}
.empty-invite a { color: var(--ink-strong); font-weight: 600; text-decoration: none; }
.empty-invite a:hover { text-decoration: underline; }

/* Account menu 'soon' rows — the topbar avatar menu is the ONE user menu
   (Settings · Activity · Recently deleted · Log out); these style its
   not-yet-real entries on every page incl. Home's local topbar. */
.avatar-menu .menu-item.is-soon { color: var(--ink-faint); cursor: default; }
.avatar-menu .menu-item.is-soon:hover { background: transparent; color: var(--ink-faint); }
.avatar-menu .soon-tag {
  margin-left: auto;
  font-family: var(--mono); font-size: 8px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ink-faint);
  border: 1px solid var(--hairline); border-radius: 999px;
  padding: 1px 6px;
}

/* ─────────── 3. Artist topbar ─────────── */
.topbar-artist {
  position: sticky; top: 0; z-index: 70;
  display: flex; align-items: center; gap: 18px;
  padding: 13px 26px;
  min-height: 60px;
  /* Always-on frosted "lift" glass bar — the brand's signature glass texture on
     the top header row, so it reads as a distinct bar on every artist surface
     (not only after scroll). Matches the sidebar/content chrome whiteness; the
     .is-scrolled state simply deepens it. */
  background: rgba(255,255,255,0.9);
  border-bottom: 1px solid var(--hairline);
  backdrop-filter: blur(20px) saturate(150%);
  -webkit-backdrop-filter: blur(20px) saturate(150%);
  transition: background 200ms, border-color 200ms, box-shadow 200ms, backdrop-filter 200ms;
}
.topbar-artist.is-scrolled {
  background: rgba(255,255,255,0.95);
  border-bottom-color: var(--hairline);
  backdrop-filter: blur(24px) saturate(160%);
  -webkit-backdrop-filter: blur(24px) saturate(160%);
  box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset, 0 8px 20px -16px rgba(28,22,12,0.35);
}
.crumb {
  display: flex; align-items: center; gap: 9px;
  margin-right: auto;
  font-family: var(--mono); font-size: 11.5px; letter-spacing: 0.02em;
  color: var(--ink-muted);
  min-width: 0;
}
.crumb a { color: var(--ink-muted); transition: color 150ms; white-space: nowrap; }
.crumb a:hover { color: var(--ink-strong); }
.crumb .sep { color: var(--ink-faint); }
.crumb .current {
  color: var(--ink-strong); font-weight: 500;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

.topbar-actions { display: flex; align-items: center; gap: 8px; }

/* Artist switcher pill — the one place a mood dot is allowed on chrome. */
.artist-pill {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 6px 10px 6px 11px;
  border-radius: 999px;
  background: rgba(255,255,255,0.6);
  border: 1px solid var(--hairline);
  transition: border-color 200ms, background 200ms;
  white-space: nowrap;
}
.artist-pill:hover { border-color: rgba(28,22,12,0.18); background: white; }
.artist-pill-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--pill-mood, var(--ink-strong)); flex-shrink: 0;
}
.artist-pill-name {
  font-family: var(--sans); font-weight: 600; font-size: 13px;
  color: var(--ink-strong); letter-spacing: -0.01em;
}
.artist-pill-chev { display: inline-flex; align-items: center; color: var(--ink-muted); transition: transform 150ms; }
.artist-pill-chev .chev-ic { width: 12px; height: 12px; }
.artist-pill.is-open .artist-pill-chev { transform: rotate(180deg); }

.topbar-search {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 7px 12px;
  border-radius: 999px;
  background: rgba(255,255,255,0.5);
  border: 1px solid var(--hairline);
  color: var(--ink-muted);
  font-family: var(--mono); font-size: 11.5px;
  cursor: text;
  transition: border-color 200ms, color 200ms;
  white-space: nowrap;
}
.topbar-search:hover { border-color: rgba(28,22,12,0.18); color: var(--ink-strong); }
.topbar-search svg { width: 13px; height: 13px; stroke-width: 1.6; }
.topbar-search .kbd {
  font-family: var(--mono); font-size: 10px; color: var(--ink-faint);
  padding: 1px 5px; border: 1px solid var(--hairline); border-radius: 3px; line-height: 1;
}
.topbar-btn {
  width: 34px; height: 34px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-soft);
  transition: background 200ms, color 200ms;
  position: relative;
}
.topbar-btn:hover { background: rgba(255,255,255,0.7); color: var(--ink-strong); }
.topbar-btn svg { width: 16px; height: 16px; stroke-width: 1.6; }
.topbar-btn .badge {
  display: none; /* hidden by default; the unread count (.badge.has-count) shows it */
  position: absolute; top: 7px; right: 7px;
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--urgent);
  box-shadow: 0 0 0 2px var(--bg), 0 0 8px rgba(139,30,46,0.5);
}
.topbar-avatar {
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--ink-disc);
  color: var(--on-ink-strong);
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--sans); font-weight: 600; font-size: 12px;
  box-shadow: 0 1px 1px rgba(255,255,255,0.3) inset, 0 4px 12px -2px rgba(14,11,8,0.45);
}

/* Artist switcher dropdown (anchored under the artist pill) */
.switcher-wrap { position: relative; }
.switcher-menu { min-width: 268px; }
.switcher-item {
  display: flex; align-items: center; gap: 10px;
  width: 100%;
  padding: 8px 10px;
  border-radius: var(--r-sm);
  font-family: var(--sans); font-size: 13px; color: var(--ink);
  text-align: left; line-height: 1.3;
  transition: background 150ms, color 150ms;
}
.switcher-item:hover { background: rgba(28,22,12,0.05); color: var(--ink-strong); }
.switcher-item.is-current { background: rgba(28,22,12,0.05); color: var(--ink-strong); font-weight: 600; }
.switcher-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--pill-mood, var(--ink-strong)); flex-shrink: 0; }
.switcher-item-name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.switcher-item-phase {
  font-family: var(--mono); font-size: 9px; font-weight: 500;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted);
  padding: 2px 7px; border: 1px solid var(--hairline); border-radius: 999px;
  white-space: nowrap; flex-shrink: 0;
}
.switcher-check { width: 14px; flex-shrink: 0; color: var(--ink-strong); font-size: 11px; text-align: center; }
.switcher-check-spacer { width: 14px; flex-shrink: 0; }
.switcher-divider { height: 1px; background: var(--hairline-soft); margin: 5px 6px; }
.switcher-item-modal { color: var(--ink-muted); font-size: 12.5px; }
.switcher-item-modal:hover { color: var(--ink-strong); }
.switcher-item-modal[aria-disabled="true"] { color: var(--ink-faint); pointer-events: none; }
.switcher-item-icon { width: 14px; text-align: center; color: var(--ink-faint); flex-shrink: 0; }

/* ─────────── 4. Content canvas ─────────── */
.content {
  flex: 1;
  display: flex;
  flex-direction: column;
  padding-bottom: 80px;
}
.content-wrap {
  width: 100%;
  max-width: var(--shell-max);
  margin: 0 auto;
  padding: 0 26px;
}
/* A section = a mono label bar + its content, with a clear gap so labels
   and filter pills never sit on top of the cards below them. */
.section-block { margin-top: 40px; display: flex; flex-direction: column; gap: 16px; }
.section-block:first-child { margin-top: 26px; }

/* ─────────── 5. Hero / page header ─────────── */
/* Full-bleed cover image + a band beneath carrying identity. Shared by
   the artist dashboard (avatar inset) and the campaign surfaces (chips +
   tabs). Per-artist mood tints the cover via multiply + a thin band rail. */
.hero { display: block; }
.hero-image {
  height: 200px;
  background:
    linear-gradient(180deg, rgba(28,22,12,0) 40%, rgba(28,22,12,0.12) 100%),
    var(--hero-photo, linear-gradient(135deg, color-mix(in oklab, var(--hero-mood, var(--ink-strong)) 60%, #0E0B08), var(--hero-mood, var(--ink-strong)))) var(--hero-focal, center 32%) / cover no-repeat;
  position: relative;
  /* thin per-artist accent band along the bottom edge of the cover */
  border-bottom: 3px solid var(--artist-accent, var(--ink-strong));
}
.hero-image::after {
  content: ""; position: absolute; inset: 0;
  background: var(--hero-mood, transparent);
  mix-blend-mode: multiply;
  opacity: 0.42;
}
/* Cover-photo edit affordance — live only (chrome.js renders it). A set cover
   reveals Change/Remove on hover (top-right); an empty band shows a centered
   "Add cover photo" prompt so it's discoverable. Glassy chip idiom, tokens only. */
.hero-cover-edit {
  position: absolute; top: 12px; right: 14px; z-index: 2;
  display: flex; align-items: center; gap: 8px;
  opacity: 0; transition: opacity .14s ease;
}
.hero-image:hover .hero-cover-edit,
.hero-cover-edit:focus-within,
.hero-cover-edit.is-busy { opacity: 1; }
.hero-cover-edit.is-empty { inset: 0; justify-content: center; opacity: 1; }
.hero-cover-btn {
  font: 600 12px/1 var(--sans);
  padding: 8px 13px; border-radius: 999px;
  color: var(--ink-strong);
  background: rgba(255,255,255,0.82);
  border: 1px solid var(--hairline);
  box-shadow: var(--lift-shadow);
  cursor: pointer;
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
}
.hero-cover-btn:hover { background: #fff; }
.hero-cover-edit.is-busy .hero-cover-btn { cursor: default; opacity: .75; }
/* Reposition mode (E1) — drag the cover to set its focal point. */
.hero-image.is-repositioning { cursor: move; }
.hero-image.is-repositioning .hero-cover-edit { display: none; }
.hero-reposition-bar {
  position: absolute; right: 14px; bottom: 14px; z-index: 3;
  display: flex; align-items: center; gap: 8px;
}
.hero-reposition-hint {
  font: 600 11px/1 var(--mono); letter-spacing: .02em; color: #fff;
  background: rgba(14,11,8,0.58); padding: 7px 10px; border-radius: 999px;
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
}

.hero-band {
  max-width: var(--shell-max);
  margin: 0 auto;
  padding: 20px 26px 10px;
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 24px;
  position: relative;
}
.hero-band.has-avatar { padding-top: 60px; }
.hero-avatar {
  position: absolute;
  left: 26px; top: 0;
  transform: translateY(-50%);
  width: 92px; height: 92px;
  border-radius: 50%;
  border: 4px solid var(--bg);
  background: var(--bg-2) var(--avatar-photo, none) center / cover no-repeat;
  box-shadow: 0 0 0 2px var(--artist-accent, var(--ink-strong)), var(--lift-shadow);
  z-index: 2;
}
.hero-band-main { min-width: 0; }
.hero-chips { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
.hero-chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 11px;
  border-radius: 999px;
  background: rgba(255,255,255,0.6);
  border: 1px solid var(--hairline);
  font-family: var(--mono); font-weight: 500;
  font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink-soft);
  white-space: nowrap;
}
.hero-chip-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--chip-mood, var(--ink-strong)); }
.hero-chip.is-disabled { color: var(--ink-faint); }
.hero-name-row { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; }
.hero-name {
  font-family: var(--display); font-weight: var(--fw-display-hero);
  font-size: clamp(30px, 3.4vw, 44px);
  letter-spacing: -0.035em; line-height: 1.0;
  margin: 0; color: var(--ink-strong);
  text-wrap: balance;
}
.hero-phase {
  font-family: var(--mono); font-weight: 500;
  font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--artist-accent, var(--ink-muted)); white-space: nowrap;
  display: inline-flex; align-items: center; gap: 7px;
  padding: 4px 11px 4px 9px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--artist-accent, var(--ink-muted)) 9%, transparent);
  border: 1px solid color-mix(in srgb, var(--artist-accent, var(--ink-muted)) 22%, transparent);
}
.hero-phase::before {
  content: ""; width: 6px; height: 6px; border-radius: 50%;
  background: var(--artist-accent, var(--ink-muted));
}
.hero-sub {
  font-family: var(--mono); font-size: 11.5px;
  color: var(--ink-muted); margin: 11px 0 0; letter-spacing: 0.02em;
  line-height: 1.5;
}
.hero-sub .sub-sep { color: var(--ink-faint); margin: 0 8px; }
.hero-bio {
  font-family: var(--sans); font-size: 13.5px;
  color: var(--ink-soft); margin: 10px 0 0; max-width: 64ch; line-height: 1.5;
}
.hero-actions { flex-shrink: 0; display: flex; align-items: center; gap: 8px; }
.hero-action-cog {
  width: 36px; height: 36px; border-radius: 999px;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.6);
  border: 1px solid var(--hairline);
  color: var(--ink-soft); font-size: 18px; line-height: 1;
  transition: background 200ms, color 200ms, border-color 200ms;
}
.hero-action-cog:hover { background: white; color: var(--ink-strong); border-color: rgba(28,22,12,0.18); }

/* ─────────── 6. Tabs — centered floating pill bar w/ sliding thumb ─────────── */
.tabs-rail {
  display: flex; justify-content: center;
  max-width: var(--shell-max);
  margin: 26px auto 4px;
  padding: 0 26px;
}
.tabs {
  position: relative;
  display: inline-flex; align-items: center; gap: 2px;
  padding: 5px;
  border-radius: 999px;
  background: var(--lift-bg);
  border: var(--lift-stroke);
  box-shadow: var(--lift-shadow);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}
/* the gliding thumb */
.tab-thumb {
  position: absolute;
  top: 5px; bottom: 5px; left: 0; width: 0;
  border-radius: 999px;
  background: var(--ink-strong);
  box-shadow: 0 1px 1px rgba(255,255,255,0.18) inset, 0 4px 12px -3px rgba(14,11,8,0.4);
  transition: left 200ms cubic-bezier(0.16, 1, 0.3, 1), width 200ms cubic-bezier(0.16, 1, 0.3, 1);
  z-index: 0;
}
.tab {
  position: relative; z-index: 1;
  padding: 9px 18px;
  font-family: var(--sans); font-weight: 600; font-size: 14px;
  letter-spacing: -0.006em;
  color: var(--ink-soft);
  border-radius: 999px;
  transition: color 200ms cubic-bezier(0.16, 1, 0.3, 1);
  white-space: nowrap;
  -webkit-font-smoothing: antialiased;
}
/* The single tab the thumb currently sits under is always white-on-ink. JS
   keeps exactly one `.lit` (active on rest, hovered while gliding) so the
   label can never end up dark-on-dark. */
.tab:hover { color: var(--ink-strong); }
.tab.lit, .tab.lit:hover { color: var(--bg); }
.tab[aria-disabled="true"], .tab[aria-disabled="true"]:hover { color: var(--ink-faint); cursor: default; }
@media (prefers-reduced-motion: reduce) { .tab-thumb { transition: none; } }

/* ─────────── 7. Dashboard modules ─────────── */
.workspaces {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px;
}
@media (max-width: 980px) { .workspaces { grid-template-columns: repeat(2, 1fr); } }
.module {
  border-radius: var(--r-lg);
  padding: 18px;
  background: var(--lift-bg);
  border: var(--lift-stroke);
  box-shadow: var(--lift-shadow);
  display: flex; flex-direction: column; gap: 12px;
  min-height: 180px;
  transition: box-shadow 200ms cubic-bezier(0.16, 1, 0.3, 1), transform 200ms cubic-bezier(0.16, 1, 0.3, 1);
}
.module:hover { box-shadow: var(--lift-shadow-hover); transform: translateY(-2px); }
.module-head { display: flex; align-items: center; gap: 10px; padding-bottom: 12px; border-bottom: 1px solid var(--hairline-soft); }
.module-icon {
  width: 30px; height: 30px; border-radius: 9px; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(28,22,12,0.05); color: var(--ink-strong);
}
.module-icon svg { width: 16px; height: 16px; stroke-width: 1.6; }
.module:hover .module-icon { background: var(--ink-strong); color: var(--bg); transition: background 200ms, color 200ms; }
.module-name {
  font-family: var(--mono); font-weight: 600;
  font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--ink-strong);
}
.module-head-spacer { flex: 1; }
.module-stat {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em;
  color: var(--ink-muted); white-space: nowrap;
}
.module-stat.urgent { color: var(--urgent); }
.module-empty { display: flex; flex-direction: column; gap: 4px; flex: 1; justify-content: flex-end; }
.compact-eyebrow {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink-muted); margin: 0;
}
.compact-headline {
  font-family: var(--sans); font-weight: 600; font-size: 15px;
  color: var(--ink-strong); margin: 2px 0 0; letter-spacing: -0.01em;
}
.compact-hint {
  font-family: var(--sans); font-size: 12px; color: var(--ink-muted);
  margin: 2px 0 8px; line-height: 1.4;
}
.compact-cta {
  align-self: flex-start;
  white-space: nowrap;
  font-family: var(--mono); font-weight: 500; font-size: 11px; letter-spacing: 0.02em;
  color: var(--ink-strong);
  padding-bottom: 1px; border-bottom: 1px solid var(--ink-strong);
  transition: color 200ms, border-color 200ms;
}
.compact-cta:hover { color: var(--urgent); border-color: var(--urgent); }
.compact-cta.is-disabled { color: var(--ink-faint); border-color: var(--ink-faint); pointer-events: none; }

/* ─────────── 8. Segmented control (.seg) ───────────
   ONE pill-segmented control for every single-select toggle in the app:
   status & priority filters, view switches, the milestone strip/table
   toggle. Counts via .seg-btn-count. The active state responds to
   .is-active, .active, AND aria-checked, so any handler convention works.
   Compact variant: .seg--sm (e.g. inside a card header). */
.seg {
  display: inline-flex; gap: 0;
  padding: 3px;
  background: rgba(28,22,12,0.05);
  border: 1px solid rgba(28,22,12,0.06);
  border-radius: 999px;
  align-self: flex-start;
}
.seg-btn {
  padding: 5px 14px;
  border-radius: 999px;
  color: var(--ink-muted);
  font-family: var(--sans); font-size: 12.5px; font-weight: 500;
  transition: background 150ms, color 150ms, box-shadow 150ms;
  white-space: nowrap;
}
.seg-btn:hover { color: var(--ink-strong); }
.seg-btn.is-active, .seg-btn.active, .seg-btn[aria-checked="true"] {
  background: white; color: var(--ink-strong);
  box-shadow: 0 1px 2px rgba(28,22,12,0.06), 0 0 0 1px rgba(28,22,12,0.04);
}
.seg-btn-count { color: var(--ink-faint); margin-left: 6px; }
.seg-btn.is-active .seg-btn-count, .seg-btn.active .seg-btn-count, .seg-btn[aria-checked="true"] .seg-btn-count { color: var(--ink-strong); }
/* Compact variant — milestone strip/table toggle */
.seg--sm .seg-btn { padding: 4px 12px; font-size: 11.5px; }

/* ─────────── 9. List rows (priority + recent) ─────────── */
.list {
  border-radius: var(--r-md);
  overflow: hidden;
  background: var(--lift-bg);
  border: var(--lift-stroke);
  box-shadow: var(--lift-shadow);
}
.list-row {
  display: grid;
  grid-template-columns: 140px 1fr auto 14px;
  gap: 14px;
  padding: 12px 18px;
  align-items: center;
  border-bottom: 1px solid var(--hairline);
  cursor: pointer;
  transition: background 150ms;
}
.list-row:last-child { border-bottom: 0; }
.list-row:hover { background: rgba(255,255,255,0.5); }
.list-row-type {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink-muted); white-space: nowrap;
}
.list-row.urgent .list-row-type { color: var(--urgent); }
.list-row-detail {
  font-family: var(--sans); font-size: 13px; color: var(--ink-soft);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.4;
}
.list-row-detail strong { color: var(--ink-strong); font-weight: 600; }
.list-row-when {
  font-family: var(--mono); font-size: 11px; color: var(--ink-muted);
  text-align: right; white-space: nowrap;
}
.list-row.urgent .list-row-when { color: var(--urgent); font-weight: 600; }
.list-row-chevron { color: var(--ink-faint); font-size: 14px; text-align: right; transition: transform 150ms, color 150ms; }
.list-row:hover .list-row-chevron { transform: translateX(3px); color: var(--ink-strong); }
.list-empty {
  padding: 16px 18px;
  font-family: var(--sans); font-size: 13px; color: var(--ink-muted);
}

/* ─────────── 10. Quick reference ─────────── */
.quickref { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
@media (max-width: 880px) { .quickref { grid-template-columns: 1fr; } }
.qref-card {
  border-radius: var(--r-md);
  padding: 18px;
  background: var(--lift-bg);
  border: var(--lift-stroke);
  box-shadow: var(--lift-shadow);
  transition: box-shadow 200ms cubic-bezier(0.16, 1, 0.3, 1), transform 200ms cubic-bezier(0.16, 1, 0.3, 1);
}
.qref-card:hover { box-shadow: var(--lift-shadow-hover); transform: translateY(-2px); }
.qref-head { margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--hairline-soft); }
.qref-label {
  font-family: var(--mono); font-weight: 600;
  font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--ink-strong);
}
.qref-empty { display: flex; flex-direction: column; align-items: flex-start; gap: 14px; }
.qref-empty-text { font-family: var(--sans); font-size: 13px; color: var(--ink-muted); margin: 0; line-height: 1.5; }

/* ─────────── 11. Single-artist week strip ─────────── */
.week-single {
  border-radius: var(--r-lg);
  overflow: hidden;
  background: var(--lift-bg);
  border: var(--lift-stroke);
  box-shadow: var(--lift-shadow);
}
.week-single-grid { display: grid; grid-template-columns: repeat(7, 1fr); }
.week-single-day {
  padding: 10px 12px;
  border-right: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline);
  background: rgba(255,255,255,0.4);
  position: relative;
}
.week-single-day:last-child { border-right: 0; }
.week-single-day.today { background: linear-gradient(180deg, rgba(28,22,12,0.07), rgba(28,22,12,0.03)); }
.week-single-day.today::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 3px;
  background: var(--artist-accent, var(--ink-strong)); border-radius: 2px 2px 0 0;
}
.week-single-grid .week-day-dow {
  font-family: var(--mono); font-weight: 500;
  font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-muted);
}
.week-single-grid .week-day-num {
  font-family: var(--sans); font-weight: 700; font-size: 24px; line-height: 1;
  letter-spacing: -0.025em; color: var(--ink-strong); margin-top: 4px;
}
.week-single-grid .week-day-tag {
  font-family: var(--mono); font-size: 10px; color: var(--ink-strong);
  margin-top: 4px; letter-spacing: 0.06em; font-weight: 600;
}
.week-single-row { display: grid; grid-template-columns: repeat(7, 1fr); }
.week-single-empty { font-family: var(--mono); font-size: 12px; color: var(--ink-faint); text-align: center; padding: 18px 0 4px; margin: 0; letter-spacing: 0.02em; }
.week-single-cell {
  min-height: 72px;
  border-right: 1px solid var(--hairline);
  padding: 7px 7px;
}
.week-single-cell:last-child { border-right: 0; }
.week-single-cell.today { background: rgba(28,22,12,0.03); }

/* Artist-scoped activity row (no artist column — the surface is already scoped) */
.activity-row.is-scoped { grid-template-columns: 26px 1fr auto; }
.activity-row.is-scoped .activity-detail { font-size: 13px; }

/* ─────────── Tasks page heading ─────────── */
.tasks-pagehead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.tasks-eyebrow { font-family: var(--mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-muted); margin: 0 0 6px; }
.tasks-title { font-family: var(--sans); font-weight: 800; font-size: clamp(26px, 3vw, 34px); letter-spacing: -0.03em; color: var(--ink-strong); margin: 0; line-height: 1.05; }

/* ─────────── Responsive shell ─────────── */
@media (max-width: 860px) {
  .shell { grid-template-columns: 1fr; }
  .sidebar { display: none; }
}


/* ╔══════ drawer.css ══════╗ */
/* ═══════════════════════════════════════════════════════════════════
 *  Day to Day · Canonical Drawer + Task Table
 *  ─────────────────────────────────────────────────────────────────
 *  THE shared detail-drawer primitive (12-drawer-pattern.md / 05ci) and
 *  the shared task table (05c / 29-tasks), restyled from the wireframes'
 *  Archivo/Inter into the Day to Day system (tokens.css).
 *
 *  Authored ONCE. partials/task-drawer.js renders the drawer; every
 *  surface that lists tasks (Campaign Plan, Tasks) mounts the SAME
 *  module — so the drawer is byte-identical everywhere. This is the
 *  fix for "the drawer renders differently on each page".
 *
 *  Locks honoured from the spec:
 *   · right slide-out, 520px, backdrop ~18% black
 *   · sticky header (breadcrumb + utilities) + sticky footer
 *   · three states: read-only / edit / creating-new
 *   · status enum not_started · in_progress · blocked · done (+ computed overdue)
 *   · section order: status → title → desc → key details → linked →
 *     notes → reminders → tags → history
 *
 *  Index
 *  ─────
 *   1. Backdrop + drawer shell
 *   2. Drawer header (breadcrumb + utilities)
 *   3. Create-mode tabs
 *   4. Status pill row
 *   5. Title + description
 *   6. Drawer sections + key-detail grid
 *   7. Inputs (edit / create)
 *   8. Scope + assignee + tags + chips
 *   9. Linked items
 *  10. Notes
 *  11. Reminders
 *  12. History
 *  13. Footer
 *  14. Task table (shared list) + quick-add
 *  15. Task list head (filters / sort / status chips)
 * ═══════════════════════════════════════════════════════════════════ */

/* ─────────── 1. Backdrop + drawer shell ─────────── */
.drawer-backdrop {
  position: fixed; inset: 0; z-index: 120;
  background: rgba(14, 11, 8, 0.20);
  opacity: 0;
  pointer-events: none;   /* closed backdrop must not eat page clicks (sidebar etc.) */
  transition: opacity 200ms cubic-bezier(0.2, 0, 0, 1);
}
/* Blur belongs to the OPEN state only. backdrop-filter ignores the element's own
   opacity, so a closed (opacity:0) backdrop left in the DOM — this shell is
   appended once and never removed — would blur the whole page forever. */
.drawer-backdrop.is-open { opacity: 1; pointer-events: auto; backdrop-filter: blur(1.5px); -webkit-backdrop-filter: blur(1.5px); }

.drawer {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 121;
  width: 520px; max-width: 94vw;
  background: var(--surface);
  border-left: 1px solid var(--hairline);
  box-shadow: -12px 0 40px -12px rgba(14,11,8,0.28);
  display: flex; flex-direction: column;
  transform: translateX(100%);
  pointer-events: none;   /* off-screen + inert until open */
  transition: transform 320ms cubic-bezier(0.16, 1, 0.3, 1);
}
.drawer.is-open { transform: translateX(0); pointer-events: auto; }

/* ─────────── 2. Drawer header ─────────── */
.drawer-header {
  flex-shrink: 0;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 14px 20px;
  border-bottom: 1px solid var(--hairline);
  background: var(--surface);
}
.drawer-eyebrow {
  display: flex; align-items: center; gap: 7px; min-width: 0;
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ink-soft);
}
.drawer-crumb { color: var(--ink-muted); transition: color 150ms; white-space: nowrap; }
.drawer-crumb:hover { color: var(--ink-strong); }
.drawer-crumb-sep { color: var(--ink-faint); }
.drawer-crumb-current { color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.drawer-header-actions { display: flex; align-items: center; gap: 2px; flex-shrink: 0; }
.drawer-icon-btn {
  width: 30px; height: 30px; border-radius: 8px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-muted); font-size: 14px;
  transition: background 150ms, color 150ms;
}
.drawer-icon-btn:hover { background: rgba(28,22,12,0.06); color: var(--ink-strong); }

/* ─────────── 3. Create-mode tabs ─────────── */
.drawer-tabs {
  flex-shrink: 0;
  display: flex; gap: 0;
  padding: 0 20px;
  border-bottom: 1px solid var(--hairline);
  background: var(--bg);
}
.drawer-tab {
  padding: 11px 14px;
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink-muted); font-weight: 500;
  border-bottom: 2px solid transparent;
  transition: color 150ms, border-color 150ms;
}
.drawer-tab.is-active { color: var(--ink-strong); font-weight: 600; border-bottom-color: var(--ink-strong); }

/* ─────────── Drawer body ─────────── */
.drawer-body {
  flex: 1; overflow-y: auto;
  padding: 22px 24px 30px;
  scrollbar-width: thin;
}
.drawer-body::-webkit-scrollbar { width: 7px; }
.drawer-body::-webkit-scrollbar-thumb { background: rgba(28,22,12,0.12); border-radius: 4px; }

/* ─────────── 4. Status control (dropdown) ─────────── */
.status-field { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }
.status-field-label {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-faint); font-weight: 600;
}
.status-dd { position: relative; }
.status-dd-trigger {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 7px 13px; border-radius: 999px;
  background: var(--bg); border: 1px solid var(--hairline);
  font-family: var(--sans); font-weight: 600; font-size: 13px; color: var(--ink-strong);
  transition: border-color 150ms;
}
.status-dd-trigger:hover { border-color: rgba(28,22,12,0.20); }
.status-dd-chev { font-size: 9px; color: var(--ink-muted); }
.status-dd-menu {
  position: absolute; top: calc(100% + 6px); left: 0; min-width: 196px;
  background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md);
  box-shadow: var(--lift-shadow); padding: 5px; z-index: 130; display: none;
}
.status-dd-menu.is-open { display: block; }
.status-dd-opt {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 8px 10px; border-radius: var(--r-sm);
  font-family: var(--sans); font-size: 13px; color: var(--ink); text-align: left;
  transition: background 150ms;
}
.status-dd-opt:hover { background: rgba(28,22,12,0.05); }
.status-dd-opt.is-current { background: rgba(28,22,12,0.05); font-weight: 600; }
.status-dd-check { margin-left: auto; color: var(--ink-strong); font-size: 11px; }
/* Status dot — not_started (ring) · in_progress (half) · blocked (oxblood) · done (filled) */
.status-dot { width: 11px; height: 11px; border-radius: 50%; border: 1.5px solid var(--ink-faint); flex-shrink: 0; }
.status-dot.in_progress { border-color: var(--artist-accent, var(--ink-strong)); background: linear-gradient(90deg, var(--artist-accent, var(--ink-strong)) 50%, transparent 50%); }
.status-dot.blocked { border-color: var(--urgent); background: var(--urgent); }
.status-dot.done { border-color: var(--ink-strong); background: var(--ink-strong); }

/* ─────────── 4b. Status pill row (legacy) ─────────── */
.status-chip-row { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-bottom: 14px; }
.status-chip {
  display: inline-flex; align-items: center;
  padding: 5px 12px;
  background: var(--bg);
  border: 1px solid var(--hairline);
  border-radius: 999px;
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ink-muted); font-weight: 500;
  transition: background 150ms, color 150ms, border-color 150ms;
}
.status-chip:hover { color: var(--ink-strong); border-color: rgba(28,22,12,0.16); }
.status-chip.is-active {
  background: var(--ink-strong); border-color: var(--ink-strong); color: var(--bg);
}
.status-chip.is-active.blocked { background: var(--urgent); border-color: var(--urgent); }
.overdue-badge {
  font-family: var(--mono); font-size: 10px; font-weight: 600; letter-spacing: 0.04em;
  color: var(--urgent); margin-left: 4px;
}

/* ─────────── 5. Title + description ─────────── */
.drawer-title {
  font-family: var(--sans); font-weight: 700; font-size: 22px;
  letter-spacing: -0.02em; line-height: 1.18; color: var(--ink-strong);
  margin: 0 0 8px; text-wrap: pretty;
}
.drawer-description {
  font-family: var(--sans); font-size: 13.5px; color: var(--ink-soft);
  line-height: 1.55; margin: 0 0 4px;
}

/* ─────────── 6. Sections + key-detail grid ─────────── */
.drawer-section { padding: 20px 0; border-top: 1px solid var(--hairline); }
.drawer-section:first-of-type { border-top: 0; padding-top: 6px; }
.drawer-section-head {
  display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 12px;
}
.drawer-section-label {
  /* 12px (was 10) — founder direction 2026-06-09: drawer section headers must not
     read smaller than the 12.5px input text. Mono uppercase at 12px sits optically
     level with it. Applies to every drawer (universal atom). */
  font-family: var(--mono); font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink-soft); font-weight: 600;
}
.drawer-section-meta { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); }

/* Read-row — canonical label/value definition row inside a drawer-section.
   Universal drawer atom (deal · finance · …). Label left (mono caps muted),
   value right (sans). Promoted from the deal drawer so every drawer shares it. */
.read-row { display: grid; grid-template-columns: 128px 1fr; gap: 12px; padding: 9px 0; border-bottom: 1px solid var(--hairline); align-items: baseline; }
.read-row:last-child { border-bottom: none; }
.read-row-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.read-row-value { font-family: var(--sans); font-size: 13px; color: var(--ink-strong); line-height: 1.45; }
.read-row-value.mono { font-family: var(--mono); font-size: 12.5px; }
.read-row-value.muted { color: var(--ink-faint); }

/* ─────── Drawer progressive disclosure — "+ Add" affordances ───────
   Optional drawer fields render as a quiet add-affordance until they hold data
   (exec pass 2026-06-09); pre-filled fields open expanded. Universal atoms —
   used by the Live + Deal drawers; adopt everywhere optional fields exist. */
.drawer-adds { display: flex; flex-direction: column; gap: 0; margin: 6px 0 2px; }
.drawer-add { display: inline-flex; align-items: center; gap: 7px; align-self: flex-start; font-family: var(--sans); font-size: 12.5px; color: var(--ink-soft); cursor: pointer; padding: 6px 0; transition: color 150ms; }
.drawer-add:hover { color: var(--ink-strong); }
.drawer-add-plus { font-size: 13px; color: var(--ink-faint); }
.drawer-addable { display: none; margin: 8px 0 12px; }
.drawer-addable.on { display: block; }
.drawer-addable .field-grid { margin: 0; }

/* ─────── Card ⋯ actions menu — universal (Deals · Live · Campaigns lists) ─────── */
.cardmenu-btn { flex-shrink: 0; appearance: none; border: 1px solid transparent; background: transparent; cursor: pointer; width: 28px; height: 28px;
  border-radius: var(--r-sm); color: var(--ink-muted); font-size: 17px; line-height: 1; display: flex; align-items: center; justify-content: center; transition: background 150ms, color 150ms, border-color 150ms; }
.cardmenu-btn:hover { background: var(--bg-2); color: var(--ink-strong); border-color: var(--hairline); }
.cardmenu-btn.on-cover { position: absolute; top: 10px; right: 10px; z-index: 2; background: rgba(255,255,255,0.92); color: var(--ink-soft); border-color: transparent; border-radius: 999px; }
.cardmenu-btn.on-cover:hover { background: #fff; color: var(--ink-strong); }
/* #106 dark solid-chrome — the ⋯ disc on card covers. Light keeps its white disc
   (reads on imagery, untouched above); dark swaps it for a quiet dark disc lifted
   just off --surface, with a --hairline edge, so it reads on a dark cover without
   the white blob. */
[data-theme="dark"] .cardmenu-btn.on-cover { background: color-mix(in oklab, var(--surface) 88%, #fff 4%); color: var(--ink-soft); border-color: var(--hairline); }
[data-theme="dark"] .cardmenu-btn.on-cover:hover { background: color-mix(in oklab, var(--surface) 82%, #fff 7%); color: var(--ink-strong); border-color: var(--hairline); }
/* z-index 1300 = the "above an open drawer" popover tier (matches .lk-pop / .dk-picker);
   80 rendered the ⋯/enum popover BEHIND the .dk-panel (z-index 141) — the deal-drawer
   status/type dropdown bug. A body-portalled menu must always float above the drawer. */
.cardmenu-pop { background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md); box-shadow: var(--lift-shadow-hover);
  padding: 5px; display: flex; flex-direction: column; gap: 1px; min-width: 168px; z-index: 1300; }
.cardmenu-item { appearance: none; background: none; border: 0; text-align: left; width: 100%; padding: 8px 11px; border-radius: var(--r-sm);
  font-family: var(--sans); font-size: 13px; color: var(--ink-strong); cursor: pointer; line-height: 1.3; }
.cardmenu-item:hover { background: var(--brand-wash); }
.drawer-section-action {
  font-family: var(--mono); font-size: 11px; color: var(--ink-soft);
  transition: color 150ms;
}
.drawer-section-action:hover { color: var(--ink-strong); }

.field-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px 18px; }
.field { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.field.full { grid-column: 1 / -1; }
.field-label {
  /* 10.5px (was 9) — same 2026-06-09 legibility pass; matches the .share-drawer
     precedent, which is now the base size. */
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--ink-soft); font-weight: 600;
}
.field-value { font-family: var(--sans); font-size: 13px; color: var(--ink-strong); line-height: 1.4; }
.field-value.alert, .field-value.over { font-weight: 600; }
.field-value.alert { color: var(--urgent); }
.field-value-detail { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); margin-top: 1px; }

/* ─────────── 7. Inputs (edit / create) ─────────── */
.field-input, .field-select, .drawer-title-input, .drawer-description-input {
  width: 100%;
  font-family: var(--sans); font-size: 13px; color: var(--ink-strong);
  background: var(--surface);
  border: 1px solid var(--hairline); border-radius: var(--r-sm);
  padding: 8px 11px; line-height: 1.4;
  transition: border-color 150ms, box-shadow 150ms;
}
.field-input:focus, .drawer-title-input:focus, .drawer-description-input:focus {
  outline: none; border-color: rgba(28,22,12,0.30);
  box-shadow: 0 0 0 3px rgba(28,22,12,0.05);
}
.field-input.mono { font-family: var(--mono); font-size: 12px; }
/* Shared date field — native picker (calendar popup) dressed as our input. */
.field-date { position: relative; }
.field-date-input { width: 100%; cursor: pointer; color: var(--ink-strong); }
.field-date-input:focus { outline: none; border-color: rgba(28,22,12,0.30); box-shadow: 0 0 0 3px rgba(28,22,12,0.05); }
.field-date-input::-webkit-calendar-picker-indicator {
  cursor: pointer; opacity: 0.55; margin-left: 4px;
  transition: opacity 150ms;
}
.field-date-input:hover::-webkit-calendar-picker-indicator { opacity: 0.9; }
/* Empty native date inputs render their dd/mm/yyyy template muted to read as a placeholder. */
.field-date-input:in-range::-webkit-datetime-edit,
.field-date-input::-webkit-datetime-edit { color: var(--ink-strong); }
.field-date-input[value=""]::-webkit-datetime-edit { color: var(--ink-muted); }
.field-input::placeholder, .drawer-title-input::placeholder, .drawer-description-input::placeholder {
  color: var(--ink-muted); font-style: italic;
}
/* #106 dark placeholder legibility — the light rules above (and .note-input /
   .quick-add-input below) read --ink-muted / --ink-faint, which go too faint to
   register as help text on the dark field. Dark repoints every shared text-entry
   placeholder to the readable --ink-placeholder token. Light is untouched. */
[data-theme="dark"] .field-input::placeholder,
[data-theme="dark"] .drawer-title-input::placeholder,
[data-theme="dark"] .drawer-description-input::placeholder,
[data-theme="dark"] .note-input::placeholder,
[data-theme="dark"] .quick-add-input::placeholder {
  color: var(--ink-placeholder);
}
.field-select {
  display: flex; align-items: center; justify-content: space-between; cursor: pointer;
}
.field-select.placeholder { color: var(--ink-muted); font-style: italic; }
.field-select-chevron { color: var(--ink-muted); font-size: 9px; }
/* Interactive enum dropdown — native <select> dressed as our input. The
   wrapper positions the shared chevron; the select clears its own arrow. */
.field-select-wrap { position: relative; }
.field-enum-select {
  width: 100%; cursor: pointer;
  font-family: var(--sans); font-size: 13px; color: var(--ink-strong);
  background: var(--surface);
  border: 1px solid var(--hairline); border-radius: var(--r-sm);
  padding: 8px 32px 8px 11px; line-height: 1.4;
  appearance: none; -webkit-appearance: none; -moz-appearance: none;
  transition: border-color 150ms, box-shadow 150ms;
}
.field-enum-select.mono { font-family: var(--mono); font-size: 12px; }
.field-enum-select:hover { border-color: rgba(28,22,12,0.18); }
.field-enum-select:focus { outline: none; border-color: rgba(28,22,12,0.30); box-shadow: 0 0 0 3px rgba(28,22,12,0.05); }
.field-select-wrap .field-select-chevron {
  position: absolute; right: 11px; top: 50%; transform: translateY(-50%); pointer-events: none;
}
.drawer-title-input {
  font-family: var(--sans); font-weight: 700; font-size: 20px; letter-spacing: -0.015em;
  margin-bottom: 14px;
}
.drawer-description-input {
  min-height: 72px; resize: vertical; line-height: 1.55; margin-bottom: 4px;
}

/* ─────────── 8. Scope + assignee + chips ─────────── */
.scope-chips, .tag-chips { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
.scope-chip {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 10px; border-radius: 999px;
  background: rgba(28,22,12,0.05);
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ink-soft); font-weight: 500; line-height: 1.5;
  cursor: pointer; transition: background 150ms, color 150ms;
}
.scope-chip.is-active { background: var(--ink-strong); color: var(--bg); }
.scope-chip.project { background: var(--surface); border: 1px solid var(--hairline); color: var(--ink-soft); }
.scope-chip.project.is-active { background: var(--ink-strong); color: var(--bg); border-color: var(--ink-strong); }

/* Entity-drawer additions (Campaign · Milestone). Single-select chip pickers
   (Type / scope / confirmed), header artist chip, template toggle row, and
   the "+ Add time / + Add location" reveal affordances. */
.pick-chips { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
.pick-chip {
  display: inline-flex; align-items: center;
  padding: 5px 12px; border-radius: 999px;
  background: rgba(28,22,12,0.05); border: 1px solid transparent;
  font-family: var(--sans); font-size: 12.5px; font-weight: 500;
  color: var(--ink-soft); cursor: pointer; white-space: nowrap;
  transition: background 150ms, color 150ms, border-color 150ms;
}
.pick-chip:hover { color: var(--ink-strong); background: rgba(28,22,12,0.08); }
.pick-chip.is-active { background: var(--ink-strong); color: var(--bg); border-color: var(--ink-strong); }
.field-sublabel { display: block; font-family: var(--sans); font-size: 11.5px; color: var(--ink-muted); margin: -2px 0 7px; }
.drawer-artist-chip {
  display: inline-flex; align-items: center; gap: 7px; margin-right: 8px;
  padding: 4px 10px; border-radius: 999px; background: rgba(255,255,255,0.6); border: 1px solid var(--hairline);
  font-family: var(--sans); font-weight: 600; font-size: 12px; color: var(--ink-strong); white-space: nowrap;
}
.drawer-artist-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--chip-mood, var(--ink-strong)); }
.toggle-section .toggle-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
.toggle-row-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.toggle-row-label { font-family: var(--sans); font-weight: 600; font-size: 13.5px; color: var(--ink-strong); }
.toggle-row-hint { font-family: var(--sans); font-size: 12px; color: var(--ink-muted); line-height: 1.4; max-width: 42ch; }
.inline-add {
  display: inline-block; font-family: var(--mono); font-size: 11.5px; color: var(--ink-strong);
  padding: 6px 0 4px; border-bottom: 1px solid transparent; cursor: pointer; transition: border-color 150ms;
}
.inline-add:hover { border-bottom-color: var(--ink-strong); }
.reveal-input { margin-top: 4px; }

.assignee-pill {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 4px 12px 4px 4px;
  background: var(--bg); border: 1px solid var(--hairline); border-radius: 999px;
  font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong);
}
.avatar-small {
  width: 22px; height: 22px; border-radius: 50%; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--ink-disc); color: var(--on-ink-strong);
  font-family: var(--sans); font-weight: 600; font-size: 9px;
}

.tag-chip {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 10px; border-radius: 999px;
  background: rgba(28,22,12,0.05);
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink-soft); font-weight: 500; line-height: 1.5;
}
.tag-chip-remove { color: var(--ink-faint); cursor: pointer; }
.tag-chip-remove:hover { color: var(--urgent); }
.tag-chip.tag-chip-add {
  background: transparent; border: 1px dashed var(--hairline); color: var(--ink-muted); cursor: pointer;
}
.tag-chip.tag-chip-add:hover { border-color: var(--ink-strong); color: var(--ink-strong); }

/* ─────────── 9. Linked items ─────────── */
.linked-group { margin-bottom: 12px; }
.linked-group:last-child { margin-bottom: 0; }
.linked-group-name {
  display: block; font-family: var(--sans); font-size: 12px; font-weight: 600;
  color: var(--ink-soft); margin-bottom: 6px;
}
.linked-card {
  display: grid; grid-template-columns: 34px 1fr auto; gap: 11px; align-items: center;
  padding: 9px 12px; margin-bottom: 6px;
  background: var(--bg); border: 1px solid var(--hairline); border-radius: var(--r-sm);
  transition: background 150ms;
}
.linked-card:hover { background: rgba(255,255,255,0.7); }
.linked-card-icon {
  width: 34px; height: 34px; border-radius: 7px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--surface); border: 1px solid var(--hairline);
  font-family: var(--mono); font-size: 9px; font-weight: 600; color: var(--ink-muted);
}
.linked-card-info { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.linked-card-name { font-family: var(--sans); font-size: 12.5px; font-weight: 600; color: var(--ink-strong); line-height: 1.3; }
.linked-card-meta { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); }
.linked-card-action {
  font-family: var(--mono); font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ink-muted); white-space: nowrap;
}
.linked-card-action:hover { color: var(--ink-strong); }
.add-linked-btn {
  display: flex; align-items: center; gap: 6px; width: 100%;
  padding: 8px 12px; margin-top: 6px;
  background: transparent; border: 1px dashed var(--hairline); border-radius: var(--r-sm);
  font-family: var(--sans); font-size: 12px; color: var(--ink-muted);
  transition: color 150ms, border-color 150ms;
}
.add-linked-btn:hover { color: var(--ink-strong); border-color: rgba(28,22,12,0.22); }

/* Campaign drawer · Tracks — type-to-search the artist's library or create a
   placeholder, assign single/project, set per-single release dates. Reuses the
   field/pick-chip idioms; only the search results + row frame are new. */
.campaign-tracks { display: flex; flex-direction: column; gap: 8px; }
.ctrack-search-wrap { position: relative; }
.ctrack-results {
  position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 20;
  background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-sm);
  box-shadow: 0 8px 24px rgba(14,11,8,0.10); overflow: hidden;
}
.ctrack-result {
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px; width: 100%;
  padding: 8px 11px; background: transparent; border: none; text-align: left; cursor: pointer;
  border-bottom: 1px solid var(--hairline-soft); transition: background 120ms;
}
.ctrack-result:last-child { border-bottom: none; }
.ctrack-result:hover { background: var(--brand-wash); }
.ctrack-result-create { background: rgba(28,22,12,0.02); }
.ctrack-result-title { font-family: var(--sans); font-size: 13px; color: var(--ink-strong); }
.ctrack-result-meta { font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink-muted); }
.ctrack-row { display: flex; align-items: center; gap: 10px; border: 1px solid var(--hairline); border-radius: var(--r-sm); padding: 7px 10px; }
.ctrack-title { flex: 1; min-width: 0; font-family: var(--sans); font-size: 13px; color: var(--ink-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ctrack-rt { flex: 0 0 auto; flex-wrap: nowrap; }
.ctrack-rt .pick-chip { padding: 3px 9px; font-size: 11px; }
.ctrack-date-slot { flex: 0 0 auto; display: flex; align-items: center; justify-content: flex-end; min-width: 130px; }
.ctrack-date-slot .field-date-input { width: 130px; padding: 5px 8px; font-size: 12px; }
.ctrack-inherit { font-size: 12px; color: var(--ink-muted); white-space: nowrap; }
.ctrack-remove {
  flex: 0 0 auto; background: transparent; border: none; cursor: pointer; line-height: 1;
  font-size: 13px; color: var(--ink-muted); padding: 2px; transition: color 150ms;
}
.ctrack-remove:hover { color: var(--ink-strong); }

/* Task drawer · "Linked to" — chips for the cross-entity links (campaign /
   track / show / goal / deal), added via the shared smart-search. */
.linkedto-wrap { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.linkedto-chips { display: contents; }
.linkedto-chip { display: inline-flex; align-items: center; gap: 7px; padding: 4px 10px; border-radius: 999px; background: rgba(28,22,12,0.05); font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong); }
.linkedto-chip-type { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); }
.linkedto-x { background: none; border: none; cursor: pointer; color: var(--ink-muted); font-size: 13px; line-height: 1; padding: 0; }
.linkedto-x:hover { color: var(--ink-strong); }
.linkedto-wrap .add-linked-btn { width: auto; margin-top: 0; }

/* ─────────── 10. Notes ─────────── */
.note-entry {
  padding: 10px 12px; margin-bottom: 8px;
  background: var(--bg); border: 1px solid var(--hairline); border-radius: var(--r-sm);
}
.note-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 4px; }
.note-author { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft); font-weight: 500; }
.note-when { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); }
.note-body { font-family: var(--sans); font-size: 12.5px; color: var(--ink); line-height: 1.5; }
.note-body .d-mention { color: var(--ink-strong); font-weight: 600; }
.note-input-wrap {
  display: flex; gap: 8px; align-items: flex-start; margin-top: 10px;
  padding: 9px 11px; background: var(--bg); border: 1px solid var(--hairline); border-radius: var(--r-sm);
}
.note-input {
  flex: 1; border: 0; background: transparent; resize: none; outline: none; padding: 0;
  font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong); line-height: 1.5; min-height: 34px;
}
.note-input::placeholder { color: var(--ink-faint); font-style: italic; }
.note-input-actions { display: flex; gap: 2px; }
.note-input-icon {
  width: 24px; height: 24px; border-radius: 6px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-muted); font-size: 12px;
  transition: background 150ms, color 150ms;
}
.note-input-icon:hover { background: rgba(28,22,12,0.06); color: var(--ink-strong); }

/* ─────────── 11. Reminders ─────────── */
.reminder-block {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 12px; margin-bottom: 6px;
  background: var(--bg); border: 1px solid var(--hairline); border-radius: var(--r-sm);
}
.reminder-bell {
  flex-shrink: 0;
  font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; font-weight: 600;
  color: var(--ink-muted);
  background: var(--surface); border: 1px solid var(--hairline); padding: 3px 7px; border-radius: 5px;
}
.reminder-text-body { flex: 1; font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong); line-height: 1.4; }
.reminder-edit { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); white-space: nowrap; }
.reminder-edit:hover { color: var(--ink-strong); }

/* ─────────── 12. History ─────────── */
.history-toggle { display: inline-flex; align-items: center; gap: 8px; font-family: var(--sans); font-size: 12.5px; color: var(--ink-soft); padding: 4px 0; }
.history-toggle:hover { color: var(--ink-strong); }
.history-chevron { font-size: 12px; color: var(--ink-muted); display: inline-block; width: 14px; text-align: center; transition: transform 150ms; }
.history-toggle.is-open .history-chevron { transform: rotate(90deg); }
.history-list { display: none; margin-top: 10px; }
.history-list.is-open { display: block; }
.history-entry { display: flex; gap: 12px; padding: 6px 0; font-family: var(--sans); font-size: 12px; color: var(--ink-soft); line-height: 1.5; }
.history-when { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); flex-shrink: 0; width: 64px; }

/* ─────────── 13. Footer ─────────── */
.drawer-footer {
  flex-shrink: 0;
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 12px 20px;
  border-top: 1px solid var(--hairline); background: var(--surface);
}
.drawer-footer-left, .drawer-footer-right { display: flex; align-items: center; gap: 8px; }

/* ─────────── 14. Task table (shared list) ─────────── */
.task-table {
  border-radius: var(--r-md); overflow: hidden;
  background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow);
}
.task-row {
  display: grid;
  grid-template-columns: 74px minmax(150px, 1fr) 132px 116px 116px 28px 26px;
  gap: 12px; align-items: center;
  padding: 12px 18px;
  border-bottom: 1px solid var(--hairline);
  cursor: pointer; transition: background 150ms;
}
.task-row:last-child { border-bottom: 0; }
.task-row:hover { background: rgba(255,255,255,0.6); }
.task-row.done { opacity: 0.62; }
.task-row.done .task-title { text-decoration: line-through; color: var(--ink-muted); }

/* status dot — not_started (ring) · in_progress (half) · blocked (oxblood) · done (filled) · overdue (oxblood ring) */
.task-status { width: 12px; height: 12px; border-radius: 50%; border: 1.5px solid var(--ink-faint); }
.task-status.in-progress { border-color: var(--ink-strong); background: linear-gradient(90deg, var(--ink-strong) 50%, transparent 50%); }
.task-status.blocked { border-color: var(--urgent); background: var(--urgent); }

/* Editable in-row status cell (dropdown). Quiet by default — the dot carries
   the signal, the label reads as metadata so the TITLE stays primary. */
.task-status-cell { position: relative; }
.status-cell-trigger {
  display: inline-flex; align-items: center; gap: 8px; width: 100%;
  padding: 5px 7px; border-radius: 7px;
  border: 1px solid transparent; background: transparent;
  font-family: var(--sans); font-size: 12px; font-weight: 400; color: var(--ink-muted);
  transition: background 150ms, border-color 150ms, color 150ms;
}
.status-cell-trigger:hover { background: rgba(28,22,12,0.04); border-color: var(--hairline); color: var(--ink-strong); }
.task-status-cell .status-dot { width: 11px; height: 11px; border-radius: 50%; flex-shrink: 0; border: 1.5px solid var(--ink-faint); box-sizing: border-box; }
.task-status-cell .status-dot.not_started { border-color: var(--ink-faint); background: transparent; }
.task-status-cell .status-dot.in_progress, .task-status-cell .status-dot.in-progress { border-color: var(--status-info); background: linear-gradient(90deg, var(--status-info) 50%, transparent 50%); }
.task-status-cell .status-dot.blocked { border-color: var(--urgent); background: var(--urgent); }
.task-status-cell .status-dot.done { border-color: var(--ink-strong); background: var(--ink-strong); }
.task-status-cell .status-dot.overdue { border-color: var(--urgent); background: transparent; box-shadow: 0 0 0 2px var(--urgent-soft); }
.status-cell-label { flex: 1; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.status-cell-chev { display: inline-flex; align-items: center; color: var(--ink-faint); opacity: 0; transition: opacity 150ms; }
.task-row:hover .status-cell-chev, .status-cell-trigger[aria-expanded="true"] .status-cell-chev { opacity: 1; }
.status-cell-chev .chev-ic { width: 11px; height: 11px; }
.status-cell-menu {
  position: absolute; top: calc(100% + 4px); left: 0; z-index: 40;
  min-width: 168px; padding: 5px;
  background: var(--surface); border: 1px solid var(--hairline);
  border-radius: var(--r-md); box-shadow: var(--lift-shadow);
  display: none;
}
.status-cell-menu.is-open { display: block; }
.status-cell-opt {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 7px 9px; border-radius: var(--r-sm);
  font-family: var(--sans); font-size: 13px; color: var(--ink); text-align: left;
}
.status-cell-opt:hover { background: rgba(28,22,12,0.05); }
.status-cell-opt.is-current { background: rgba(28,22,12,0.05); font-weight: 600; }
.status-cell-opt .status-dot { width: 11px; height: 11px; border-radius: 50%; flex-shrink: 0; border: 1.5px solid var(--ink-faint); box-sizing: border-box; }
.status-cell-opt .status-dot.not_started { border-color: var(--ink-faint); }
.status-cell-opt .status-dot.in_progress { border-color: var(--status-info); background: linear-gradient(90deg, var(--status-info) 50%, transparent 50%); }
.status-cell-opt .status-dot.blocked { border-color: var(--urgent); background: var(--urgent); }
.status-cell-opt .status-dot.done { border-color: var(--ink-strong); background: var(--ink-strong); }
.status-cell-opt span:nth-child(2) { flex: 1; }
.status-cell-check { color: var(--ink-strong); font-size: 11px; }
.task-status.done { border-color: var(--ink-strong); background: var(--ink-strong); }
.task-status.overdue { border-color: var(--urgent); background: transparent; box-shadow: 0 0 0 2px var(--urgent-soft); }

.task-category {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ink-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  align-self: center;
}
.task-info { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.task-title {
  font-family: var(--sans); font-size: 14px; font-weight: 500; color: var(--ink-strong);
  line-height: 1.3; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; letter-spacing: -0.005em;
}
.task-meta { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.task-meta-text {
  font-family: var(--sans); font-size: 12px; color: var(--ink-muted); line-height: 1.4;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.task-entity-chips { display: inline-flex; gap: 5px; flex-wrap: wrap; flex-shrink: 0; }
.task-entity-chip {
  display: inline-flex; align-items: center; gap: 4px;
  font-family: var(--mono); font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink-soft); background: rgba(28,22,12,0.05); padding: 2px 8px 2px 6px; border-radius: 999px;
  font-weight: 500; line-height: 1.5; white-space: nowrap; border: 1px solid transparent;
}
.task-entity-chip svg { width: 10px; height: 10px; flex-shrink: 0; opacity: 0.65; }
.task-entity-chip[data-etype="campaign"] { color: var(--ink-strong); background: var(--surface); border-color: var(--hairline); }
.task-entity-chip[data-etype="goal"] { color: var(--status-positive); background: var(--status-positive-wash); }
.task-entity-chip[data-etype="show"] { color: var(--status-info); background: var(--status-info-wash); }
.task-entity-chip[data-etype="all"] { color: var(--ink-muted); background: transparent; border-color: var(--hairline); }

.task-signals { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.task-signal { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.04em; color: var(--ink-faint); white-space: nowrap; }
.task-tag-chip {
  font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink-muted); background: rgba(28,22,12,0.04); padding: 1px 6px; border-radius: 4px;
}

.task-cost-wrap { min-width: 0; overflow: hidden; }
.task-cost { font-family: var(--mono); font-size: 12px; color: var(--ink-soft); text-align: right; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.task-cost.over { color: var(--urgent); font-weight: 600; }
.task-cost.empty { color: var(--ink-faint); }
.task-cost-detail { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); text-align: right; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.task-due-cell { min-width: 0; overflow: hidden; }
.task-due { font-family: var(--mono); font-size: 11.5px; color: var(--ink-soft); display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.task-due.overdue { color: var(--urgent); font-weight: 600; }
.task-due.due-soon { color: var(--ink-strong); font-weight: 600; }
.task-due.done { color: var(--ink-faint); }
.task-due-detail { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.task-assignee { display: flex; justify-content: center; }
.task-avatar {
  width: 26px; height: 26px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--ink-disc); color: var(--on-ink-strong);
  font-family: var(--sans); font-weight: 600; font-size: 9.5px;
}
.task-actions {
  width: 28px; height: 28px; border-radius: 7px; justify-self: end;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-muted); font-size: 15px;
  transition: background 150ms, color 150ms;
}
.task-actions:hover { background: rgba(28,22,12,0.06); color: var(--ink-strong); }

/* Quick-add row — canonical primitive, always FIRST row in a list */
.quick-add-row {
  display: flex; align-items: center; gap: 11px;
  padding: 12px 18px;
  border-bottom: 1px solid var(--hairline);
  background: rgba(28,22,12,0.015);
  cursor: text;
}
.quick-add-icon {
  width: 18px; height: 18px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1.5px dashed var(--ink-faint); color: var(--ink-faint); font-size: 12px; flex-shrink: 0;
}
.quick-add-input {
  flex: 1; border: 0; background: transparent; outline: none;
  font-family: var(--sans); font-size: 13px; color: var(--ink-strong);
}
.quick-add-input::placeholder { color: var(--ink-faint); font-style: italic; }
/* Brief highlight when a row is added inline via quick-add. */
@keyframes justAddedFlash { from { background: color-mix(in srgb, var(--artist-accent, var(--ink-strong)) 12%, transparent); } to { background: transparent; } }
.task-row.just-added { animation: justAddedFlash 1.1s ease-out; }

/* ─────────── Shared chevron icon — crisp, legible, replaces the old hairline glyphs. ─────────── */
.chev-ic { width: 14px; height: 14px; flex-shrink: 0; display: inline-block; vertical-align: middle; transition: transform 150ms; }

/* Cost rollup — quiet meta on the Tasks section bar (was a full band). */
.tasks-cost-inline { display: inline-flex; align-items: center; gap: 9px; font-family: var(--mono); font-size: 11.5px; color: var(--ink-soft); }
.tasks-cost-fig { color: var(--ink-strong); font-weight: 500; }
.tasks-cost-fig.muted { color: var(--ink-soft); font-weight: 400; }
.tasks-cost-sep { color: var(--ink-faint); }
.tasks-cost-inline .section-action { margin-left: 4px; }

/* Task-group header (Tasks page buckets: Today / This week / Later / Done) */
.task-group { margin-top: 22px; }
.task-group:first-of-type { margin-top: 0; }
.task-group-head {
  display: flex; align-items: baseline; gap: 12px; margin-bottom: 10px;
}
.task-group-name {
  font-family: var(--mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-strong); font-weight: 600;
}
.task-group-count { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); }

/* ─────────── Week strip (Tasks page hero snapshot) ─────────── */
/* Shared widget (29-tasks "WEEK STRIP"): 7 columns, today expanded with
   live task titles, other days show dot-pips; past days dimmed. Today's
   accent uses the artist mood. Rendered by partials/week-strip.js. */
.week-strip {
  display: grid; grid-template-columns: repeat(7, 1fr);
  border-radius: var(--r-md); overflow: hidden;
  background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow);
}
.week-strip-col {
  display: flex; flex-direction: column;
  padding: 15px 12px 13px; min-height: 148px; min-width: 0;
  border-right: 1px solid var(--hairline);
  border-top: 2px solid transparent;
  cursor: pointer; transition: background 150ms;
}
.week-strip-col:last-child { border-right: 0; }
.week-strip-col:hover { background: rgba(255,255,255,0.5); }
.week-strip-col.past { opacity: 0.5; }
.week-strip-col.today { border-top-color: var(--artist-accent, var(--ink-strong)); background: linear-gradient(180deg, rgba(28,22,12,0.04), transparent 70%); }
.week-strip-dow {
  font-family: var(--mono); font-size: 9px; font-weight: 500;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); margin-bottom: 6px;
}
.week-strip-col.today .week-strip-dow { color: var(--ink-soft); }
.week-strip-date {
  font-family: var(--sans); font-weight: 600; font-size: 20px; line-height: 1;
  letter-spacing: -0.02em; color: var(--ink-muted); margin-bottom: 10px;
}
.week-strip-col.today .week-strip-date { font-size: 34px; color: var(--ink-strong); margin-bottom: 12px; }
.week-strip-tasks { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.week-strip-task {
  display: flex; align-items: center; gap: 6px; min-width: 0;
  font-family: var(--sans); font-size: 11px; color: var(--ink-soft); line-height: 1.3;
}
.week-strip-task-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--artist-accent, var(--ink-strong)); flex-shrink: 0; }
.week-strip-task-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.week-strip-more { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); margin-top: 3px; }
.week-strip-dots { display: flex; gap: 3px; align-items: center; margin-top: auto; }
.week-strip-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--ink-faint); }

/* ─────────── Group-by control (legacy static markup removed; shared toolbar lives in .tl-dd) ─────────── */

.readiness-row-chev { color: var(--ink-soft); }
.history-chevron { display: inline-flex; align-items: center; }

@media (max-width: 980px) {
  .task-row { grid-template-columns: 70px minmax(130px, 1fr) 120px 116px 28px 26px; }
  .task-row .task-cost-wrap { display: none; }
}
@media (max-width: 620px) {
  .task-row { grid-template-columns: minmax(0, 1fr) 112px 26px; }
  .task-row .task-category, .task-row .task-due-cell, .task-row .task-assignee { display: none; }
}

/* ── Shared task-list toolbar (Filter ▾ · Group ▾ · Export) — rendered by
      mountTaskList; identical on the Tasks page + Campaign Plan. ── */
/* The toolbar lives inside a flex-gap .section-block, so the gap handles
   spacing below it — no own margin (avoids a doubled, sparse-looking gap). */
.tasklist-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 0; }
.tasklist-toolbar-left { display: inline-flex; align-items: center; gap: 8px; margin-right: auto; flex-wrap: wrap; }
.tasklist-toolbar-right { display: inline-flex; align-items: center; gap: 8px; }
.tl-dd { position: relative; }
.tl-dd-trigger {
  display: inline-flex; align-items: center; gap: 7px;
  height: 32px; padding: 0 11px; border-radius: 999px;
  background: rgba(255,255,255,0.7); border: 1px solid var(--hairline);
  font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong);
  transition: border-color 150ms, background 150ms;
}
.tl-dd-trigger:hover { border-color: rgba(28,22,12,0.18); background: white; }
.tl-dd-trigger[aria-expanded="true"] { border-color: rgba(28,22,12,0.28); }
.tl-dd-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); }
.tl-dd-value { font-weight: 600; }
.tl-dd-chev { display: inline-flex; align-items: center; color: var(--ink-muted); }
.tl-dd-chev .chev-ic { width: 12px; height: 12px; }
.tl-dd-menu { left: 0; right: auto; min-width: 184px; }
.tl-dd-count { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); margin-left: 4px; }
.tl-export { height: 32px; }
.tl-export-ic { font-size: 13px; }

/* Faceted filter popover (Status · Category · Scope) — multi-select; within
   a facet = OR, across facets = AND. Replaces the single status dropdown. */
.tl-filter-badge {
  min-width: 17px; height: 17px; padding: 0 5px; border-radius: 999px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--ink-strong); color: var(--bg);
  font-family: var(--mono); font-size: 9.5px; font-weight: 600; line-height: 1;
}
.tl-filter-menu { min-width: 232px; padding: 0; }
.tl-facet { padding: 9px 5px 6px; border-bottom: 1px solid var(--hairline-soft); }
.tl-facet:last-of-type { border-bottom: 0; }
.tl-facet-label {
  font-family: var(--mono); font-size: 9px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-faint); font-weight: 600; padding: 0 10px 4px;
}
.tl-facet-opt {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 6px 10px; border-radius: var(--r-sm);
  font-family: var(--sans); font-size: 13px; color: var(--ink); text-align: left;
}
.tl-facet-opt:hover { background: rgba(28,22,12,0.05); }
.tl-facet-check {
  width: 16px; height: 16px; border-radius: 4px; flex-shrink: 0;
  border: 1.5px solid var(--hairline); background: var(--surface);
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--bg); font-size: 10px;
}
.tl-facet-opt[aria-checked="true"] .tl-facet-check { background: var(--ink-strong); border-color: var(--ink-strong); }
.tl-facet-opt-label { flex: 1; }
.tl-facet-opt-count { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); }
.tl-filter-foot {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 12px; border-top: 1px solid var(--hairline);
}
.tl-filter-summary { font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); }
.tl-filter-clear {
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.04em; color: var(--ink-strong);
  padding-bottom: 1px; border-bottom: 1px solid var(--ink-strong);
}
.tl-filter-clear:hover { color: var(--urgent); border-color: var(--urgent); }
.tl-filter-clear.is-disabled { color: var(--ink-faint); border-color: transparent; pointer-events: none; }


/* ╔══════ lists.css ══════╗ */
/* ═══════════════════════════════════════════════════════════════════
 *  Day to Day · List pages
 *  ─────────────────────────────────────────────────────────────────
 *  Shared chrome + cards for module LIST surfaces (Campaigns, and —
 *  per the spec's 4-slot context pattern — future Live / Deals / Music
 *  lists). Authored ONCE in the Day to Day system so every list page
 *  composes these rather than re-inventing cards. Spec: 04-campaigns-list.
 *
 *  Index
 *  ─────
 *   1. List-page wrapper + heading band
 *   2. Controls row (filter chips · sort · view toggle)
 *   3. Cards grid + campaign card
 *   4. Create card (dashed affordance)
 *   5. Indicator rows (strategy bar · readiness · partners)
 *   6. List (dense table) view
 *   7. No-results / empty state
 * ═══════════════════════════════════════════════════════════════════ */

/* ─────────── 1. Wrapper + heading band ─────────── */
.list-page { display: flex; flex-direction: column; gap: 20px; }

/* ─────────── Universal person affordance (22-people-architecture retrofit) ───────────
 * Any element tagged [data-person] opens the canonical contact drawer. Keep the
 * cue light — most carriers already have their own row/card hover; this adds the
 * pointer + a faint underline-on-hover for inline name spans. */
[data-person] { cursor: pointer; }
.person-link { color: inherit; text-decoration: none; border-bottom: 1px solid transparent; transition: border-color 150ms, color 150ms; }
.person-link:hover { color: var(--ink-strong); border-bottom-color: var(--ink-faint); }

/* Cross-surface highlight-on-arrival — pulses the element a ?fx= link points to
   (e.g. Finance → a deal's payment-schedule row) so the user sees where it lives. */
@keyframes fxFlash {
  0%   { box-shadow: 0 0 0 3px var(--brand-edge, rgba(28,22,12,0.4)); background: var(--brand-wash, rgba(28,22,12,0.06)); }
  70%  { box-shadow: 0 0 0 3px var(--brand-edge, rgba(28,22,12,0.4)); background: var(--brand-wash, rgba(28,22,12,0.06)); }
  100% { box-shadow: 0 0 0 0 transparent; background: transparent; }
}
.fx-flash { animation: fxFlash 2.6s ease-out; border-radius: var(--r-sm); }
@media (prefers-reduced-motion: reduce) { .fx-flash { animation: none; outline: 2px solid var(--brand-edge, var(--ink-strong)); } }


.heading-band { display: flex; align-items: baseline; gap: 14px; }
.heading-title {
  /* Site page-header canon (#227, founder walk 2026-07-18 — the Live/Music/
     Campaigns .cv2-title treatment is the one right choice): --font-hero /600/
     34px /-0.025em / line-height 1. Supersedes the #101 --fw-display-hero (500). */
  font-family: var(--font-hero); font-weight: var(--fw-page-title); font-size: 34px;
  letter-spacing: -0.025em; line-height: 1; color: var(--ink-strong); margin: 0;
}
@media (max-width: 920px) { .heading-title { font-size: 26px; } }
.heading-count { font-family: var(--mono); font-size: 12px; letter-spacing: 0.04em; color: var(--ink-muted); white-space: nowrap; }
.heading-spacer { flex: 1; }

/* ─────────── 2. Controls row ─────────── */
.controls {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  padding-bottom: 16px; border-bottom: 1px solid var(--hairline);
}
.controls-spacer { flex: 1; }
.controls-sort {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 6px 12px; border-radius: 999px;
  background: rgba(255,255,255,0.6); border: 1px solid var(--hairline);
  font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong);
  transition: border-color 150ms;
}
.controls-sort:hover { border-color: rgba(28,22,12,0.18); }
.controls-sort-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); }
.controls-sort-chev { display: inline-flex; align-items: center; color: var(--ink-muted); }
.controls-sort-chev .chev-ic { width: 12px; height: 12px; }

/* ─────────── 3. Cards grid + campaign card ─────────── */
.cards-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 360px));
  gap: 16px;
}
.campaign-card {
  display: flex; flex-direction: column;
  border-radius: var(--r-lg); overflow: hidden;
  background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow);
  cursor: pointer;
  transition: border-color 150ms, box-shadow 200ms, transform 200ms;
}
.campaign-card:hover {
  box-shadow: 0 1px 2px rgba(28,22,12,0.04), 0 12px 28px -8px rgba(14,11,8,0.16);
  transform: translateY(-2px);
}
.campaign-card-cover {
  aspect-ratio: 16 / 8; position: relative; overflow: hidden;
  background:
    linear-gradient(180deg, rgba(28,22,12,0) 45%, rgba(28,22,12,0.28) 100%),
    var(--cover-photo, linear-gradient(135deg, color-mix(in oklab, var(--cover-mood, var(--ink-strong)) 60%, #0E0B08), var(--cover-mood, var(--ink-strong)))) var(--cover-focal, center 30%) / cover no-repeat;
}
.campaign-card-cover::after {
  content: ""; position: absolute; inset: 0;
  background: var(--cover-mood, transparent); mix-blend-mode: multiply; opacity: 0.4;
}
.campaign-card-cover-name {
  position: absolute; left: 16px; bottom: 12px; z-index: 1;
  font-family: var(--sans); font-weight: 800; font-size: 26px; letter-spacing: -0.03em;
  color: white; text-shadow: 0 2px 16px rgba(14,11,8,0.4); line-height: 1;
}
.campaign-card-body { padding: 15px 17px 17px; display: flex; flex-direction: column; gap: 11px; flex: 1; }
.campaign-card-chips { display: flex; gap: 7px; flex-wrap: wrap; }
.campaign-card-chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 9px; border-radius: 999px;
  background: rgba(28,22,12,0.05); border: 1px solid var(--hairline);
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ink-soft); font-weight: 500; line-height: 1.4;
}
.campaign-card-chip-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--chip-mood, var(--ink-strong)); }
.campaign-card-chip.status-draft { color: var(--ink-faint); }
.campaign-card-dates { font-family: var(--mono); font-size: 11px; color: var(--ink-muted); line-height: 1.4; }
.campaign-card-context {
  font-family: var(--sans); font-size: 12.5px; color: var(--ink-muted); line-height: 1.5;
  padding-top: 11px; border-top: 1px solid var(--hairline);
}
.campaign-card-context .urgent { color: var(--urgent); font-weight: 600; }
.campaign-card-context .link { color: var(--ink-strong); font-weight: 600; }
.campaign-card-context .link:hover { text-decoration: underline; }

/* ─────────── 4. Create card ─────────── */
.campaign-create-card {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;
  min-height: 200px;
  border-radius: var(--r-lg);
  border: 1px dashed rgba(28,22,12,0.20); background: rgba(28,22,12,0.012);
  color: var(--ink-muted);
  transition: border-color 200ms, color 200ms, background 200ms;
}
.campaign-create-card:hover { border-color: var(--ink-strong); color: var(--ink-strong); background: rgba(28,22,12,0.025); }
.campaign-create-plus {
  width: 38px; height: 38px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1.5px solid currentColor; font-size: 20px; line-height: 1;
}
.campaign-create-label { font-family: var(--sans); font-weight: 600; font-size: 13.5px; }
.campaign-create-hint { font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; color: var(--ink-faint); }

/* ─────────── 5. Indicator rows ─────────── */
.campaign-card-indicators {
  display: flex; flex-direction: column; gap: 9px;
  padding-top: 11px; margin-top: 1px; border-top: 1px solid var(--hairline);
}
.campaign-card-indicators-head {
  display: flex; align-items: center; gap: 6px;
  font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint);
}
.sample-tag {
  display: inline-flex; align-items: center; gap: 4px;
  color: var(--ink-faint); font-style: normal;
}
.sample-tag::before { content: "◌"; font-size: 9px; }
.campaign-card-indicator { display: grid; grid-template-columns: 68px 1fr auto; gap: 11px; align-items: center; line-height: 1.3; }
.campaign-card-indicator-label {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ink-muted); font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.campaign-card-indicator-bar { height: 3px; background: rgba(28,22,12,0.10); border-radius: 2px; overflow: hidden; }
.campaign-card-indicator-bar-fill { height: 100%; background: var(--artist-accent, var(--ink-strong)); border-radius: 2px; }
.campaign-card-indicator-value { font-family: var(--mono); font-size: 9.5px; color: var(--ink-strong); font-weight: 500; white-space: nowrap; }
.campaign-card-indicator-text { font-family: var(--sans); font-size: 12px; color: var(--ink-strong); }

/* ─────────── 6. List (dense table) view ─────────── */
.list-table {
  border-radius: var(--r-md); overflow: hidden;
  background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow);
}
.list-table-head, .list-table-row {
  display: grid;
  grid-template-columns: 1.8fr 90px 130px 1.4fr 14px;
  gap: 16px; align-items: center; padding: 11px 18px;
}
.list-table-head {
  border-bottom: 1px solid var(--hairline); background: rgba(28,22,12,0.015);
}
.list-table-head span {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint);
}
.list-table-row { border-bottom: 1px solid var(--hairline); cursor: pointer; transition: background 150ms; }
.list-table-row:last-child { border-bottom: 0; }
.list-table-row:hover { background: rgba(255,255,255,0.6); }
.list-table-name { font-family: var(--sans); font-weight: 600; font-size: 13.5px; color: var(--ink-strong); display: flex; align-items: center; gap: 9px; }
.list-table-name-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--chip-mood, var(--ink-strong)); flex-shrink: 0; }
.list-table-type { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-muted); }
.list-table-cell { font-family: var(--mono); font-size: 11.5px; color: var(--ink-soft); }
.list-table-cell.urgent { color: var(--urgent); font-weight: 600; }
.list-table-chevron { color: var(--ink-faint); font-size: 14px; text-align: right; }

/* ─────────── 7. No-results / empty ─────────── */
.list-empty-state {
  padding: 40px 24px; text-align: center;
  border-radius: var(--r-md); border: 1px dashed var(--hairline); background: rgba(28,22,12,0.012);
}
.list-empty-text { font-family: var(--sans); font-size: 14px; color: var(--ink-muted); margin: 0 0 8px; }
.list-empty-clear {
  font-family: var(--mono); font-size: 11.5px; color: var(--ink-strong);
  padding-bottom: 1px; border-bottom: 1px solid var(--ink-strong);
}
.list-empty-clear:hover { color: var(--urgent); border-color: var(--urgent); }

/* Canonical EMPTY STATE — whole-section / first-run "nothing here yet".
   Centered icon tile + headline + one line of guidance + a single CTA. Sits
   inside a lift card or a dashed well. Distinct from the inline list/module
   empties (which are quieter, in-flow). */
.empty-state {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 4px; padding: 48px 28px;
  border-radius: var(--r-lg); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow);
}
.empty-state.well { background: rgba(28,22,12,0.012); border: 1px dashed var(--hairline); box-shadow: none; }
.empty-state-icon {
  width: 48px; height: 48px; border-radius: 14px; margin-bottom: 12px;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(28,22,12,0.05); color: var(--ink-soft);
}
.empty-state-icon svg { width: 24px; height: 24px; stroke-width: 1.5; }
.empty-state-title { font-family: var(--sans); font-weight: 700; font-size: 17px; letter-spacing: -0.015em; color: var(--ink-strong); margin: 0; }
.empty-state-hint { font-family: var(--sans); font-size: 13.5px; color: var(--ink-muted); margin: 0; line-height: 1.5; max-width: 42ch; }
.empty-state-actions { display: flex; gap: 10px; margin-top: 16px; flex-wrap: wrap; justify-content: center; }
/* Compact variant — for aggregator/overview widgets where the well sits in a
   tighter column. */
.empty-state-compact { padding: 30px 22px; }
.empty-state-compact .empty-state-icon { width: 40px; height: 40px; border-radius: 11px; margin-bottom: 10px; }
.empty-state-compact .empty-state-icon svg { width: 20px; height: 20px; }
.empty-state-compact .empty-state-title { font-size: 15px; }
.empty-state-compact .empty-state-hint { font-size: 12.5px; }

@media (max-width: 640px) {
  .list-table-head, .list-table-row { grid-template-columns: 1fr auto 14px; }
  .list-table-head span:nth-child(2), .list-table-head span:nth-child(3), .list-table-head span:nth-child(4),
  .list-table-row > :nth-child(2), .list-table-row > :nth-child(3), .list-table-row > :nth-child(4) { display: none; }
}


/* ╔══════ timeline.css ══════╗ */
/* ═══════════════════════════════════════════════════════════════════
 *  Day to Day · Milestone timeline
 *  ─────────────────────────────────────────────────────────────────
 *  Shared campaign-surface widget: a continuous horizontal timeline
 *  RAIL (markers sit on a real axis) — a refined take on the canonical
 *  "Milestones strip" (05c). Today is an accent pin; past events dim;
 *  the next-up event carries the artist accent. Strip ⇄ Table toggle.
 *  Rendered by partials/milestones.js. Glyph alphabet (locked):
 *    ◆ fill = release · ◇ outline = announce / fan activation / goal ·
 *    ● social = scheduled post.
 *
 *  Index: 1. Shell + header  2. Rail + axis  3. Node  4. Glyphs
 *         5. Today pin  6. Legend  7. Table view
 * ═══════════════════════════════════════════════════════════════════ */

/* ─────────── 1. Shell + header ─────────── */
.timeline {
  border-radius: var(--r-md);
  background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow);
  overflow: hidden;
}
.timeline-head {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 16px; border-bottom: 1px solid var(--hairline);
}
.timeline-head-spacer { flex: 1; }
.timeline-count { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); }
/* Past events recede so the eye lands on Today + what's next (at-a-glance). */
.timeline-node.past { opacity: 0.42; }
.timeline-node.past:hover { opacity: 0.7; }
.timeline-body { gap: 3px; }
.timeline-label { font-size: 14px; }
/* Quieter legend — supporting caption, not a feature. */
.timeline-legend { opacity: 0.62; gap: 16px; padding-top: 4px; }
.timeline-legend-item { font-size: 10px; }

/* ─────────── 2. Rail + axis ─────────── */
.timeline-scroll { overflow-x: auto; scrollbar-width: thin; padding: 20px 18px 16px; }
.timeline-scroll::-webkit-scrollbar { height: 7px; }
.timeline-scroll::-webkit-scrollbar-thumb { background: rgba(28,22,12,0.12); border-radius: 4px; }
.timeline-track { display: flex; align-items: flex-start; min-width: min-content; position: relative; }
/* Campaign Plan strip — spread nodes across the full width instead of left-packing
   (founder: dots bunched left, dead space right). Fills the track when events fit;
   falls back to natural width + scroll when they overflow. Scoped so the Live-Tour
   plan keeps the bare left-packed timeline. */
.timeline--spread .timeline-track { width: 100%; justify-content: space-between; }
/* the continuous time axis — past→future fade, sits behind the glyph row */
.timeline-track::before {
  content: ""; position: absolute; left: 16px; right: 16px; top: 53px; height: 1.5px; border-radius: 2px;
  background: linear-gradient(90deg, rgba(28,22,12,0.22) 0%, rgba(28,22,12,0.22) var(--axis-now, 25%), var(--hairline) var(--axis-now, 25%), var(--hairline) 100%);
}

/* ─────────── 3. Node ─────────── */
.timeline-node {
  flex: 0 0 auto; width: 142px; padding: 0 7px;
  display: flex; flex-direction: column; align-items: center; position: relative;
}
.timeline-node.past { opacity: 0.5; }
.timeline-date-top { height: 42px; text-align: center; display: flex; flex-direction: column; gap: 1px; justify-content: flex-start; }
.timeline-dow { font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); }
.timeline-dnum { font-family: var(--sans); font-weight: 700; font-size: 16px; letter-spacing: -0.01em; color: var(--ink-strong); line-height: 1; }
.timeline-month { font-family: var(--mono); font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); margin-left: 3px; }
.timeline-glyph-wrap {
  height: 22px; display: flex; align-items: center; justify-content: center;
  position: relative; z-index: 1;
}
.timeline-glyph-halo { display: inline-flex; }
.timeline-body { text-align: center; margin-top: 11px; display: flex; flex-direction: column; gap: 3px; }
.timeline-type { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); }
.timeline-label { font-family: var(--sans); font-weight: 600; font-size: 12.5px; color: var(--ink-strong); line-height: 1.3; text-wrap: balance; }
.timeline-foot { font-family: var(--mono); font-size: 9.5px; color: var(--ink-faint); letter-spacing: 0.02em; }
.timeline-foot .tl-scope { color: var(--ink-muted); }

/* next-up — carries the artist accent */
.timeline-node.next-up .timeline-type { color: var(--artist-accent, var(--ink-strong)); font-weight: 600; }
.timeline-node.next-up .timeline-foot .tl-count { color: var(--artist-accent, var(--ink-strong)); font-weight: 600; }

/* ─────────── 4. Glyphs — refined circular markers on the axis ─────────── */
.tl-glyph { display: inline-block; box-sizing: border-box; border-radius: 50%; }
.tl-glyph.fill { width: 13px; height: 13px; background: var(--ink-strong); box-shadow: 0 0 0 4px var(--surface), 0 0 0 5px rgba(28,22,12,0.12); }
.tl-glyph.outline { width: 12px; height: 12px; border: 2px solid var(--ink-soft); background: var(--surface); box-shadow: 0 0 0 4px var(--surface); }
.tl-glyph.social { width: 7px; height: 7px; background: var(--ink-faint); box-shadow: 0 0 0 4px var(--surface); }
.timeline-node.next-up .tl-glyph.fill { background: var(--artist-accent, var(--ink-strong)); box-shadow: 0 0 0 4px var(--surface), 0 0 0 6px color-mix(in srgb, var(--artist-accent, var(--ink-strong)) 32%, transparent); }
.timeline-node.next-up .tl-glyph.outline { border-color: var(--artist-accent, var(--ink-strong)); box-shadow: 0 0 0 4px var(--surface), 0 0 0 6px color-mix(in srgb, var(--artist-accent, var(--ink-strong)) 32%, transparent); }
.timeline-node.next-up .tl-glyph.social { background: var(--artist-accent, var(--ink-strong)); }

/* ─────────── 5. Today pin ─────────── */
.timeline-today {
  flex: 0 0 auto; width: 70px; padding: 0 4px; position: relative;
  display: flex; flex-direction: column; align-items: center;
}
.timeline-today-head { height: 42px; text-align: center; display: flex; flex-direction: column; gap: 1px; }
.timeline-today-label { font-family: var(--mono); font-size: 9px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--artist-accent, var(--ink-strong)); font-weight: 700; }
.timeline-today-date { font-family: var(--sans); font-weight: 700; font-size: 13px; color: var(--ink-strong); line-height: 1.05; }
.timeline-today-tickwrap { height: 22px; display: flex; align-items: center; justify-content: center; position: relative; z-index: 2; }
.timeline-today-tick { width: 11px; height: 11px; border-radius: 50%; background: var(--artist-accent, var(--ink-strong)); box-shadow: 0 0 0 4px var(--surface); }
.timeline-today-stem { position: absolute; top: 53px; bottom: 8px; width: 2px; background: var(--artist-accent, var(--ink-strong)); opacity: 0.32; }

/* ─────────── 6. Legend ─────────── */
.timeline-legend { display: flex; gap: 16px; align-items: center; padding: 0 16px 13px; flex-wrap: wrap; }
.timeline-legend-item { display: inline-flex; align-items: center; gap: 7px; font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; color: var(--ink-muted); }

/* ─────────── 7. Table view ─────────── */
.timeline-table { display: none; }
.timeline.is-table .timeline-scroll, .timeline.is-table .timeline-legend { display: none; }
.timeline.is-table .timeline-table { display: block; }
.timeline-table-row {
  display: grid; grid-template-columns: 78px 22px 1fr 90px 96px; gap: 14px; align-items: center;
  padding: 11px 16px; border-bottom: 1px solid var(--hairline);
}
.timeline-table-row:last-child { border-bottom: 0; }
.timeline-table-row.past { opacity: 0.55; }
.timeline-table-row.next-up { background: color-mix(in srgb, var(--artist-accent, var(--ink-strong)) 5%, transparent); }
.timeline-table-date { font-family: var(--mono); font-size: 11px; color: var(--ink-strong); }
.timeline-table-date small { color: var(--ink-faint); }
.timeline-table-glyph { display: flex; justify-content: center; }
.timeline-table-label { font-family: var(--sans); font-size: 13px; font-weight: 600; color: var(--ink-strong); }
.timeline-table-type { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-muted); }
.timeline-table-meta { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); text-align: right; }
.timeline-table-row.next-up .timeline-table-meta { color: var(--artist-accent, var(--ink-strong)); font-weight: 600; }

/* ═══════════════════════════════════════════════════════════════════
 *  Release readiness — per-release deliverable progress + expandable
 *  checklists (shared; rendered by partials/readiness.js). Spec: 05c
 *  Readiness section / 11-release-readiness.md.
 * ═══════════════════════════════════════════════════════════════════ */
.readiness { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); overflow: hidden; }
.readiness-row { border-bottom: 1px solid var(--hairline); }
.readiness-row:last-child { border-bottom: 0; }
.readiness-row.expanded { background: rgba(28,22,12,0.014); }
.readiness-row-head {
  display: grid; grid-template-columns: 1fr auto 30px; gap: 14px; align-items: center;
  padding: 14px 18px 8px; cursor: pointer;
}
.readiness-row-name { display: flex; align-items: center; gap: 11px; font-family: var(--sans); font-weight: 600; font-size: 14px; color: var(--ink-strong); min-width: 0; }
.readiness-row-tag { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 500; color: var(--ink-muted); background: rgba(28,22,12,0.05); padding: 2px 6px; border-radius: var(--r-sm); white-space: nowrap; flex-shrink: 0; }
.readiness-row-swatch { width: 22px; height: 22px; border-radius: 6px; flex-shrink: 0; }
.readiness-row-swatch.dark  { background: linear-gradient(135deg, #2D2D2A, #1A1A18); }
.readiness-row-swatch.light { background: linear-gradient(135deg, #E8E0D6, #C9B7A0); }
.readiness-row-swatch.mid   { background: linear-gradient(135deg, #D8DCDF, #A8B0B8); }
.readiness-row-meta { display: flex; align-items: center; gap: 8px; font-family: var(--mono); font-size: 11px; color: var(--ink-muted); white-space: nowrap; }
.readiness-row-meta strong { color: var(--ink-strong); font-weight: 600; }
/* Expand/collapse affordance — larger tap target + visible triangle. */
.readiness-row-chev {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: 8px; justify-self: end;
  font-size: 12px; color: var(--ink-muted);
  transition: transform 150ms, background 150ms, color 150ms;
}
.readiness-row-head:hover .readiness-row-chev { background: rgba(28,22,12,0.06); color: var(--ink-strong); }
.readiness-row.expanded .readiness-row-chev { transform: rotate(90deg); }
.readiness-bar-wrap { padding: 0 18px 14px; }
.readiness-bar { height: 8px; background: rgba(28,22,12,0.08); border-radius: 999px; overflow: hidden; }
.readiness-bar-fill { height: 100%; background: var(--artist-accent, var(--ink-strong)); border-radius: 999px; }
.readiness-checklist { padding: 0 18px 18px; display: none; }
.readiness-row.expanded .readiness-checklist { display: grid; grid-template-columns: 1fr 1fr; gap: 2px 30px; }
.readiness-cat { margin-top: 16px; break-inside: avoid; }
.readiness-cat:first-child, .readiness-cat:nth-child(2) { margin-top: 4px; }
.readiness-cat-head { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); font-weight: 600; margin-bottom: 8px; }
.readiness-item { display: grid; grid-template-columns: 20px minmax(0,1fr) auto; gap: 11px; align-items: center; padding: 5px 0; }
.readiness-item-status { width: 18px; height: 18px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; flex-shrink: 0; }
.readiness-item-status.satisfied { background: rgba(30,107,69,0.12); color: var(--status-positive); }
.readiness-item-status.missing { border: 1.5px dashed var(--hairline); }
.readiness-item-label { font-family: var(--sans); font-size: 13px; color: var(--ink-strong); line-height: 1.3; }
.readiness-item.is-missing .readiness-item-label { color: var(--ink-soft); }
.readiness-item-task { font-family: var(--mono); font-size: 10px; color: var(--ink-soft); cursor: pointer; white-space: nowrap; }
.readiness-item-task:hover { color: var(--ink-strong); }

/* ═══════════════════════════════════════════════════════════════════
 *  Campaign Overview — state-of-the-union. Adds only a sticky section-
 *  progress rail + the needs-attention urgency strip; everything else
 *  (week strip, readiness, modules, activity, lists) reuses shared bits.
 * ═══════════════════════════════════════════════════════════════════ */
.section-progress {
  position: sticky; top: 56px; z-index: 40;
  display: flex; align-items: center; gap: 0; flex-wrap: wrap;
  padding: 13px 0 14px; margin-bottom: 26px;
  border-bottom: 1px solid var(--hairline);
  background: linear-gradient(180deg, var(--bg) 60%, rgba(250,250,247,0.86));
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
}
/* Quiet sub-nav in a different register from the mono-uppercase section
   headers (sans, title-case, dot-led) so the two never echo — but spanned
   with connector lines so it reads as a structured rail, not a floating list. */
.section-progress-item {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--sans); font-size: 13px; font-weight: 500; letter-spacing: -0.005em;
  color: var(--ink-muted); white-space: nowrap; transition: color 150ms;
}
.section-progress-item::before {
  content: ""; width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0;
  background: var(--hairline); transition: background 150ms, transform 150ms;
}
.section-progress-item:hover { color: var(--ink-strong); }
.section-progress-item.active { color: var(--ink-strong); font-weight: 600; }
.section-progress-item.active::before { background: var(--artist-accent, var(--ink-strong)); transform: scale(1.25); }
.section-progress-line { flex: 1; height: 1px; background: var(--hairline); margin: 0 16px; min-width: 16px; }

/* ── Campaign Overview cockpit ── */
/* Two-column cockpit body */
.cockpit-cols { display: grid; grid-template-columns: 1.5fr 1fr; gap: 14px; align-items: start; }
.cockpit-cols.even { grid-template-columns: 1fr 1fr; }
@media (max-width: 880px) { .cockpit-cols { grid-template-columns: 1fr; } }

/* Next beats — condensed upcoming milestones */
.beats { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); overflow: hidden; }
.beat-row { display: grid; grid-template-columns: 46px 1fr auto; gap: 13px; align-items: center; padding: 13px 16px; border-bottom: 1px solid var(--hairline); cursor: pointer; transition: background 150ms; }
.beat-row:last-child { border-bottom: 0; }
.beat-row:hover { background: rgba(255,255,255,0.5); }
.beat-date { text-align: center; }
.beat-date-num { display: block; font-family: var(--sans); font-weight: 700; font-size: 19px; line-height: 1; letter-spacing: -0.02em; color: var(--ink-strong); }
.beat-date-mon { display: block; font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); margin-top: 3px; }
.beat-main { min-width: 0; }
.beat-type { display: block; font-family: var(--mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); }
.beat-label { display: block; font-family: var(--sans); font-weight: 600; font-size: 13.5px; color: var(--ink-strong); margin-top: 2px; line-height: 1.3; }
.beat-count { font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); white-space: nowrap; }
.beat-row.next-up .beat-count { color: var(--artist-accent, var(--ink-strong)); font-weight: 600; }

/* Readiness columns (Overview) — one card per release; per-category cells
   (filled = ready) give visual completeness + the type-of-work breakdown. */
.readiness-cols { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
@media (max-width: 900px) { .readiness-cols { grid-template-columns: 1fr; } }
.rc-card {
  display: block; border-radius: var(--r-md); padding: 16px 17px;
  background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow);
  transition: box-shadow 200ms cubic-bezier(0.16, 1, 0.3, 1), transform 200ms cubic-bezier(0.16, 1, 0.3, 1);
}
.rc-card:hover { box-shadow: var(--lift-shadow-hover); transform: translateY(-2px); }
.rc-head { display: flex; align-items: center; gap: 10px; }
.rc-swatch { width: 20px; height: 20px; border-radius: 6px; flex-shrink: 0; }
.rc-swatch.light { background: linear-gradient(135deg, #E8E0D6, #C9B7A0); }
.rc-swatch.mid { background: linear-gradient(135deg, #D8DCDF, #A8B0B8); }
.rc-swatch.dark { background: linear-gradient(135deg, #2D2D2A, #1A1A18); }
.rc-name { flex: 1; min-width: 0; font-family: var(--sans); font-weight: 600; font-size: 13.5px; color: var(--ink-strong); line-height: 1.2; }
.rc-pct { font-family: var(--sans); font-weight: var(--fw-figure); font-size: 20px; letter-spacing: -0.03em; color: var(--ink-strong); flex-shrink: 0; }
.rc-sub { font-family: var(--mono); font-size: 10px; letter-spacing: 0.02em; color: var(--ink-muted); margin-top: 7px; }
.rc-cats { margin-top: 14px; display: flex; flex-direction: column; gap: 9px; }
.rc-cat { display: grid; grid-template-columns: 88px 1fr auto; gap: 10px; align-items: center; }
.rc-cat-label { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); white-space: nowrap; }
.rc-cells { display: flex; gap: 3px; flex-wrap: wrap; }
.rc-cell { width: 10px; height: 10px; border-radius: 3px; border: 1px solid var(--hairline); background: transparent; }
.rc-cell.done { background: var(--ink-strong); border-color: var(--ink-strong); }
.rc-cat-count { font-family: var(--mono); font-size: 9.5px; color: var(--ink-faint); white-space: nowrap; }

/* ── Overview · Next up — the next release: name, date/countdown, readiness % ── */
.ov-nextup { display: flex; align-items: center; gap: 28px; flex-wrap: wrap; border-radius: var(--r-lg); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 20px 24px; }
.ov-nextup-main { min-width: 0; flex: 1; }
.ov-nextup-eyebrow { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.ov-nextup-name { font-family: var(--serif); font-style: italic; font-weight: 500; font-size: clamp(20px, 2.4vw, 26px); letter-spacing: -0.01em; color: var(--ink-strong); line-height: 1.15; margin-top: 8px; }
.ov-nextup-when { font-family: var(--mono); font-size: 12px; color: var(--ink-soft); margin-top: 7px; }
.ov-nextup-ready { width: 232px; flex-shrink: 0; padding-left: 26px; border-left: 1px solid var(--hairline); }
@media (max-width: 620px) { .ov-nextup-ready { width: 100%; padding-left: 0; border-left: 0; border-top: 1px solid var(--hairline); padding-top: 16px; } }
.ov-nextup-ready-top { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.ov-nextup-ready-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.ov-nextup-pct { font-family: var(--sans); font-weight: var(--fw-figure); font-size: 22px; letter-spacing: -0.03em; color: var(--ink-strong); }
.ov-nextup-bar { height: 6px; border-radius: 999px; background: rgba(28,22,12,0.08); overflow: hidden; margin: 10px 0 7px; }
.ov-nextup-fill { height: 100%; border-radius: 999px; background: var(--artist-accent, var(--ink-strong)); }
.ov-nextup-sub { font-family: var(--mono); font-size: 11px; color: var(--ink-muted); }

/* ── Overview · Music — production-stage distribution as one stacked bar +
   a legend naming the tracks at each stage (demo → mix → master). ── */
.ov-music-wrap { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 18px 20px; }
.ov-music-bar { display: flex; gap: 3px; height: 44px; border-radius: 8px; overflow: hidden; }
.ov-music-seg { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; min-width: 46px; }
.ov-music-seg-n { font-family: var(--sans); font-weight: 700; font-size: 15px; letter-spacing: -0.02em; line-height: 1; }
.ov-music-seg-label { font-family: var(--mono); font-size: 7.5px; letter-spacing: 0.14em; text-transform: uppercase; opacity: 0.75; }
.ov-music-seg.demo { background: color-mix(in oklab, var(--stage-demo) 38%, transparent); color: color-mix(in oklab, var(--stage-demo) 64%, var(--ink-strong)); }
.ov-music-seg.mix { background: color-mix(in oklab, var(--stage-mix) 26%, transparent); color: color-mix(in oklab, var(--stage-mix) 78%, var(--ink-strong)); }
.ov-music-seg.master { background: var(--stage-master); color: var(--bg); }
.ov-music-legend { display: flex; flex-direction: column; gap: 8px; margin-top: 15px; }
.ov-music-legend-item { display: flex; align-items: center; gap: 10px; }
.ov-music-legend-dot { width: 9px; height: 9px; border-radius: 3px; flex-shrink: 0; }
.ov-music-legend-dot.demo { background: var(--stage-demo); }
.ov-music-legend-dot.mix { background: var(--stage-mix); }
.ov-music-legend-dot.master { background: var(--stage-master); }
.ov-music-legend-stage { font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; min-width: 54px; }
.ov-music-legend-tracks { font-family: var(--sans); font-size: 13px; color: var(--ink-strong); min-width: 0; }

/* ── Overview · Readiness — deliverable progress as filled cells ── */
.ov-ready { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); overflow: hidden; }
.ov-ready-row { display: block; padding: 14px 16px; border-bottom: 1px solid var(--hairline); transition: background 150ms; }
.ov-ready-row:last-child { border-bottom: 0; }
.ov-ready-row:hover { background: rgba(255,255,255,0.5); }
.ov-ready-top { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.ov-ready-name { font-family: var(--sans); font-weight: 600; font-size: 13.5px; color: var(--ink-strong); line-height: 1.25; min-width: 0; }
.ov-ready-when { font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); white-space: nowrap; }
.ov-ready-when.released { color: color-mix(in oklab, var(--ms-social) 72%, var(--ink-strong)); }
.ov-ready-cells { display: flex; flex-wrap: wrap; gap: 4px; margin: 11px 0 8px; }
.ov-ready-cell { width: 13px; height: 13px; border-radius: 3px; border: 1px solid var(--hairline); background: transparent; }
.ov-ready-cell.on { background: var(--ink-strong); border-color: var(--ink-strong); }
.ov-ready-count { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); }

/* ── Overview · Rollout strip — the campaign arc at a glance. A horizontal
   line of milestone stops (releases emphasised), past dimmed, next-up ringed.
   Answers "where are we in the rollout" without opening Plan. ── */
.ov-rollout { border-radius: var(--r-lg); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 22px 24px 18px; overflow-x: auto; }
.ov-rollout-track { display: flex; align-items: flex-start; min-width: min-content; position: relative; }
.ov-stop { position: relative; flex: 1 1 0; min-width: 100px; display: flex; flex-direction: column; align-items: center; text-align: center; padding: 0 5px; }
.ov-stop::before { content: ""; position: absolute; top: 13px; left: -50%; width: 100%; height: 2px; background: var(--hairline); z-index: 0; }
.ov-stop:first-child::before { display: none; }
.ov-stop.past::before { background: color-mix(in oklab, var(--ink-strong) 22%, transparent); }
.ov-stop-node { position: relative; z-index: 1; width: 28px; height: 28px; border-radius: 50%; background: var(--bg); border: 2px solid var(--ink-faint); display: flex; align-items: center; justify-content: center; }
.ov-stop-node::after { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--ink-faint); }
.ov-stop.past .ov-stop-node { border-color: var(--ink-strong); }
.ov-stop.past .ov-stop-node::after { background: var(--ink-strong); }
.ov-stop.release .ov-stop-node { width: 30px; height: 30px; background: var(--ink-strong); border-color: var(--ink-strong); }
.ov-stop.release .ov-stop-node::after { width: 9px; height: 9px; background: var(--bg); }
.ov-stop.next .ov-stop-node { border-color: var(--artist-accent, var(--ink-strong)); box-shadow: 0 0 0 4px color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 16%, transparent); }
.ov-stop.next .ov-stop-node::after { background: var(--artist-accent, var(--ink-strong)); }
.ov-stop-date { font-family: var(--mono); font-size: 10.5px; font-weight: 600; color: var(--ink-strong); margin-top: 9px; }
.ov-stop.past .ov-stop-date { color: var(--ink-muted); }
.ov-stop-label { font-family: var(--sans); font-size: 11.5px; color: var(--ink-soft); line-height: 1.3; margin-top: 3px; max-width: 13ch; }
.ov-stop-tag { font-family: var(--mono); font-size: 8px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; color: var(--ink-faint); margin-top: 4px; }
.ov-stop.next .ov-stop-tag { color: var(--artist-accent, var(--ink-strong)); }

/* ── Overview · Music status — each track's production stage (writing → demo →
   mix → master → released) as a 4-step meter. The state of the record. ── */
.ov-targets { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); overflow: hidden; }

/* ── Overview · Targets — compact progress against the campaign's goals
   (synced with Goals). Supporting band, not the headline. ── */
.ov-target { display: grid; grid-template-columns: 1fr auto; gap: 7px 14px; align-items: baseline; padding: 13px 16px; border-bottom: 1px solid var(--hairline); }
.ov-target:last-child { border-bottom: 0; }
.ov-target-metric { font-family: var(--sans); font-weight: 600; font-size: 13px; color: var(--ink-strong); line-height: 1.3; min-width: 0; }
.ov-target-nums { font-family: var(--mono); font-size: 11px; color: var(--ink-muted); white-space: nowrap; justify-self: end; }
.ov-target-nums strong { color: var(--ink-strong); font-weight: 600; }
.ov-target-track { grid-column: 1 / -1; display: flex; align-items: center; gap: 10px; }
.ov-target-bar { flex: 1; height: 5px; border-radius: 999px; background: rgba(28,22,12,0.08); overflow: hidden; }
.ov-target-fill { height: 100%; border-radius: 999px; background: var(--artist-accent, var(--ink-strong)); }
.ov-target-pct { font-family: var(--mono); font-size: 10px; color: var(--ink-soft); white-space: nowrap; }
.ov-target-when { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); white-space: nowrap; }
.ov-target.pending .ov-target-track { opacity: 0.55; }

/* ── Overview · Budget mini + Strategy focus pull-outs ── */
.ov-budget { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 17px 18px; }
.ov-budget-top { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 12px; }
.ov-budget-fig { font-family: var(--sans); font-weight: var(--fw-figure); font-size: 24px; letter-spacing: -0.03em; color: var(--ink-strong); }
.ov-budget-fig small { font-family: var(--mono); font-size: 11px; font-weight: 500; letter-spacing: 0; color: var(--ink-muted); margin-left: 6px; }
.ov-budget-pct { font-family: var(--mono); font-size: 11px; color: var(--ink-soft); }
.ov-budget-bar { height: 8px; border-radius: 999px; background: rgba(28,22,12,0.08); overflow: hidden; }
.ov-budget-bar-fill { height: 100%; border-radius: 999px; background: var(--ink-strong); }
.ov-budget-areas { display: flex; flex-direction: column; gap: 8px; margin-top: 14px; }
.ov-budget-area { display: grid; grid-template-columns: 1fr auto; gap: 10px; font-family: var(--mono); font-size: 11px; }
.ov-budget-area-name { color: var(--ink-soft); }
.ov-budget-area-num { color: var(--ink-muted); }

/* ─────────── 9. Fan strategy — user-defined cards ─────────── */

/* ═══════════════════════════════════════════════════════════════════
 *  Campaign Commercial — money view. Headline budget · Snapshot (spending
 *  pulse) · Budget by area (expandable, derived from task costs) · Partners.
 *  Shared primitives (also used by Live Commercial later). Spec: 05d.
 * ═══════════════════════════════════════════════════════════════════ */

/* Headline budget — cap + composition + rollup */
.headline-budget { border-radius: var(--r-lg); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 24px 26px; }
.headline-budget-eyebrow { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-muted); }
.headline-budget-cap { font-family: var(--sans); font-weight: 800; font-size: clamp(34px, 4vw, 46px); letter-spacing: -0.035em; line-height: 1; color: var(--ink-strong); margin: 12px 0 0; }
.headline-budget-rollup { font-family: var(--sans); font-size: 14px; color: var(--ink-soft); margin: 14px 0 0; line-height: 1.5; }
.headline-budget-rollup strong { color: var(--ink-strong); font-weight: 600; }
.headline-budget-rollup .muted { color: var(--ink-muted); }

/* Snapshot — editorial pacing line + spending-pulse bar (in a lift card) */
.snapshot-card { border-radius: var(--r-lg); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 22px 24px; }
/* Section-card header — the section title lives INSIDE the white card as its
   first row (redesign #118 fidelity): a Sans title (--font-title, altitude 3),
   an optional mono meta, and a quiet add-link / action cluster pushed right.
   Pairs with .snapshot-card. */
.snapshot-head { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.snapshot-title { font-family: var(--font-title); font-weight: var(--fw-title); font-size: 16px; letter-spacing: -0.01em; color: var(--ink-strong); }
.snapshot-meta { font-family: var(--mono); font-size: 11px; color: var(--ink-muted); letter-spacing: 0.02em; white-space: nowrap; }
.snapshot-add { margin-left: auto; display: inline-flex; align-items: baseline; gap: 4px; font-family: var(--sans); font-size: 12.5px; color: var(--ink-soft); background: none; border: 0; padding: 0; cursor: pointer; white-space: nowrap; transition: color 200ms; }
.snapshot-add::before { content: "+"; font-weight: 600; }
.snapshot-add:hover { color: var(--ink-strong); }
.money-state-headline { font-family: var(--sans); font-size: 18px; font-weight: 400; line-height: 1.5; color: var(--ink-strong); letter-spacing: -0.005em; margin: 0 0 20px; max-width: 64ch; }
.money-state-headline strong { font-weight: 700; }
.money-state-headline .figure { font-weight: 700; }
.budget-pulse { display: flex; gap: 2px; height: 32px; border-radius: 8px; overflow: hidden; background: rgba(28,22,12,0.06); }
.budget-pulse-seg { position: relative; overflow: hidden; min-width: 8px; }
.budget-pulse-seg.remaining { background: rgba(28,22,12,0.08); }
.budget-pulse-legend-dot.remaining { background: rgba(28,22,12,0.14); }
.budget-pulse-legend { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 6px 22px; margin-top: 16px; }
.budget-pulse-legend-item { display: flex; align-items: center; gap: 9px; font-family: var(--mono); font-size: 11px; color: var(--ink-soft); }
.budget-pulse-legend-dot { width: 9px; height: 9px; border-radius: 3px; background: var(--ink-strong); flex-shrink: 0; }
.budget-pulse-legend-item .lg-name { flex: 1; min-width: 0; color: var(--ink-strong); }
.budget-pulse-legend-item .lg-num { color: var(--ink-muted); }

/* Budget by area — expandable rows */
.budget-list { border-radius: var(--r-md); overflow: hidden; background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); }
.budget-list-head, .budget-row { display: grid; grid-template-columns: minmax(120px,1fr) 72px 72px 80px 84px 56px; gap: 10px; align-items: center; padding: 12px 18px; }
.budget-list-head { border-bottom: 1px solid var(--hairline); }
.budget-list-head span { font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); }
.budget-list-head .col-num { text-align: right; }
.budget-row { border-bottom: 1px solid var(--hairline); cursor: pointer; transition: background 150ms; }
.budget-row:last-of-type { border-bottom: 0; }
.budget-row:hover { background: rgba(255,255,255,0.5); }
.budget-row-name { font-family: var(--sans); font-weight: 600; font-size: 13.5px; color: var(--ink-strong); line-height: 1.3; }
.budget-row-name-meta { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); margin-top: 3px; }
.budget-row-num { font-family: var(--sans); font-size: 13px; color: var(--ink-strong); text-align: right; }
.budget-row-num.muted { color: var(--ink-muted); }
.budget-variance { font-family: var(--sans); font-size: 12.5px; font-weight: 600; text-align: right; color: var(--status-positive); }
.budget-variance.over { color: var(--urgent); }
.budget-bar { position: relative; height: 8px; background: rgba(28,22,12,0.08); border-radius: 999px; overflow: hidden; }
.budget-bar-fill { position: absolute; inset: 0 auto 0 0; background: var(--status-positive); border-radius: 999px; }
.budget-bar-fill.over { background: var(--urgent); }
.budget-row-chev { color: var(--ink-muted); display: inline-flex; align-items: center; justify-content: center; transition: transform 150ms; }
.budget-row-chev .chev-ic { width: 13px; height: 13px; }
.budget-row.expanded .budget-row-chev { transform: rotate(90deg); }
.budget-row-expanded { display: none; background: rgba(28,22,12,0.015); padding: 4px 18px 10px; }
.budget-row-expanded.show { display: block; }
.budget-sub { display: grid; grid-template-columns: minmax(120px,1fr) 72px 72px 80px 84px 56px; gap: 10px; align-items: center; padding: 9px 0; border-bottom: 1px solid var(--hairline-soft); cursor: pointer; }
.budget-sub:last-child { border-bottom: 0; }
.budget-sub-name { display: flex; align-items: center; gap: 9px; font-family: var(--sans); font-size: 13px; color: var(--ink-soft); min-width: 0; }
.budget-sub-name > .bl-name-txt { min-width: 0; overflow-wrap: normal; word-break: normal; }
.budget-sub-name > .line-marker, .budget-sub-name > .budget-scope-chip { flex-shrink: 0; white-space: nowrap; }
.budget-sub-num { font-family: var(--sans); font-size: 12.5px; text-align: right; color: var(--ink-soft); }
.budget-sub-num.muted { color: var(--ink-muted); }
.budget-sub-num.over { color: var(--urgent); }
.budget-sub-status { text-align: left; }
.bl-status { display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 999px; font-family: var(--mono); font-size: 9px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; }
.bl-status.paid { background: var(--status-positive-wash); color: var(--status-positive); }
.bl-status.pending { background: rgba(28,22,12,0.06); color: var(--ink-muted); }
.bl-status.approved { background: var(--status-info-wash); color: var(--status-info); }
.bl-status.to_be_charged { background: var(--status-info-wash); color: var(--status-info); }
.bl-status.overdue { background: color-mix(in oklab, var(--urgent) 12%, transparent); color: var(--urgent); }
.line-marker { display: inline-flex; align-items: center; padding: 1px 7px; border-radius: 5px; font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; flex-shrink: 0; }
.line-marker.task { background: var(--surface); border: 1px solid var(--hairline); color: var(--ink-muted); }
.line-marker.manual { background: rgba(28,22,12,0.06); color: var(--ink-soft); }
.line-marker.recurring { background: var(--ink-strong); color: var(--bg); }
.line-marker.plan { background: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 14%, transparent); border: 1px solid color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 32%, transparent); color: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 72%, var(--ink-strong)); }
.bl-status.planned { background: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 12%, transparent); color: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 70%, var(--ink-strong)); }
.budget-sub-plan { cursor: default; }
.budget-sub-plan .budget-sub-go { opacity: 0.5; }
/* Strategy-sourced area: a small pill on the area name + a note in the
   expanded panel pointing back to where the budget is set. */
.budget-src-pill { margin-left: 8px; display: inline-flex; align-items: center; padding: 1px 7px; border-radius: 999px; font-family: var(--mono); font-size: 8px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; vertical-align: middle; color: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 70%, var(--ink-strong)); background: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 12%, transparent); border: 1px solid color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 28%, transparent); }
.budget-plan-note { font-family: var(--sans); font-size: 12px; color: var(--ink-soft); line-height: 1.5; padding: 9px 0 11px; border-bottom: 1px solid var(--hairline-soft); margin-bottom: 4px; }
.budget-plan-note strong { color: var(--ink-strong); font-weight: 600; }
.budget-plan-link { color: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 70%, var(--ink-strong)); text-decoration: underline; text-underline-offset: 2px; }
.budget-scope-chip { display: inline-flex; align-items: center; padding: 1px 7px; border-radius: 999px; font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.06em; color: var(--ink-soft); background: rgba(28,22,12,0.05); border: 1px solid var(--hairline); flex-shrink: 0; }

/* Budget-drawer type toggle (Expense/Income) + variance readout */
.type-toggle { display: inline-flex; gap: 0; padding: 3px; background: rgba(28,22,12,0.05); border: 1px solid var(--hairline); border-radius: 999px; margin-bottom: 18px; }
.type-btn { padding: 7px 20px; border-radius: 999px; font-family: var(--sans); font-weight: 600; font-size: 13px; color: var(--ink-muted); transition: background 150ms, color 150ms; }
.type-btn:hover { color: var(--ink-strong); }
.type-btn.is-active { background: var(--surface); color: var(--ink-strong); box-shadow: 0 1px 2px rgba(28,22,12,0.06), 0 0 0 1px rgba(28,22,12,0.05); }
.field-readout { padding: 9px 12px; border-radius: var(--r-sm); background: rgba(28,22,12,0.03); border: 1px solid var(--hairline); font-size: 13px; color: var(--ink-soft); }
.field-readout.under { color: var(--status-positive); }
.field-readout.over { color: var(--urgent); }

/* Recurrence — picker + conditional stop-conditions sub-form */
.rec-stop { margin-top: 12px; padding: 14px 14px 12px; border-radius: var(--r-sm); background: rgba(28,22,12,0.03); border: 1px solid var(--hairline); }
.rec-stop-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; margin-bottom: 8px; }
.rec-stop-rows { display: flex; flex-direction: column; gap: 7px; }
.rec-stop-row { display: flex; align-items: center; gap: 8px; font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong); }
.rec-stop-row input[type="radio"] { accent-color: var(--ink-strong); }
.rec-stop-row .field-input { flex: 0 0 auto; min-width: 0; padding: 5px 8px; font-size: 12px; }
.rec-stop-row .rec-stop-date { width: 130px; }
.rec-stop-row .rec-stop-count { width: 60px; text-align: center; }
.rec-stop-custom { display: flex; align-items: center; gap: 8px; margin-top: 10px; font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong); }
.rec-stop-custom .field-label { font-size: 12.5px; letter-spacing: 0; text-transform: none; color: var(--ink-strong); margin: 0; }
.rec-stop-custom .rec-stop-interval { width: 60px; text-align: center; padding: 5px 8px; font-size: 12px; }

/* Multi-select chips (Applies-to) — same look as pick-chip but toggleable */
.pick-chip.multi { user-select: none; }

/* Linked-entity card (Linked partner / task / deal — auto-render or empty CTA) */
.linked-section .drawer-section-head { margin-bottom: 10px; }
.linked-card { display: flex; flex-direction: column; gap: 4px; padding: 14px 16px; border-radius: var(--r-sm); background: var(--surface); border: 1px solid var(--hairline); }
.linked-card-name { font-family: var(--sans); font-weight: 600; font-size: 13.5px; color: var(--ink-strong); }
.linked-card-meta { font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); }
.linked-card-action { align-self: flex-start; margin-top: 6px; font-family: var(--mono); font-size: 11px; color: var(--ink-strong); padding-bottom: 1px; border-bottom: 1px solid var(--ink-strong); }
.linked-card-action:hover { color: var(--urgent); border-color: var(--urgent); }

/* Mark-as-paid radio rows (Budget line CREATE state) */
.paid-section { display: flex; flex-direction: column; gap: 10px; }
.paid-row { padding: 12px 14px; border-radius: var(--r-sm); border: 1px solid var(--hairline); background: var(--surface); transition: border-color 150ms, background 150ms; }
.paid-row:has(input:checked) { border-color: var(--ink-strong); background: rgba(28,22,12,0.025); }
.paid-opt { display: flex; align-items: flex-start; gap: 11px; cursor: pointer; }
.paid-opt input[type="radio"] { margin-top: 2px; accent-color: var(--ink-strong); flex-shrink: 0; }
.paid-opt-title { font-family: var(--sans); font-weight: 600; font-size: 13.5px; color: var(--ink-strong); }
.paid-opt-hint { font-family: var(--sans); font-size: 12px; color: var(--ink-muted); margin-top: 3px; line-height: 1.5; }
.paid-opt-hint code { font-family: var(--mono); font-size: 11px; background: rgba(28,22,12,0.05); padding: 1px 5px; border-radius: 4px; color: var(--ink-strong); }
.budget-total-row { display: grid; grid-template-columns: minmax(120px,1fr) 64px 64px 70px 72px 20px; gap: 10px; align-items: center; padding: 13px 18px; border-top: 1px solid var(--hairline); background: rgba(28,22,12,0.02); }
.budget-total-row .bt-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-strong); font-weight: 600; }
.budget-total-row .budget-row-num { font-weight: 600; }

/* Partners — the drawn commercial value-card treatment (W3, #236/#204: mirror the
   Live Commercial partner cards). A bordered cell, the partner's value as a big
   figure (income partners read green with a leading +), a coloured status word
   (no dot — the campaign register) and Edit → in the foot, in a 2-up grid.
   Campaign-Commercial is the only consumer; Live Commercial ships the same
   treatment inline as .ltc-partner (folding both onto this one primitive is the
   separate Live-conformance lane). */
.partner-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }
@media (max-width: 760px) { .partner-grid { grid-template-columns: 1fr; } }
.partner-card { border-radius: 11px; background: transparent; border: 1px solid var(--hairline); box-shadow: none; padding: 13px; cursor: pointer; transition: border-color 150ms; }
.partner-card:hover { border-color: var(--ink-faint); }
.partner-card-top { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
.partner-card-name { font-family: var(--sans); font-weight: var(--fw-title-light); font-size: 13.5px; color: var(--ink); min-width: 0; overflow-wrap: anywhere; }
.partner-card-type { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); white-space: nowrap; }
.partner-card-fee { font-family: var(--font-figure); font-variant-numeric: tabular-nums; font-weight: var(--fw-figure); font-size: 18px; letter-spacing: -0.01em; color: var(--ink-strong); margin-top: 7px; }
.partner-card-fee.pos { color: var(--status-positive); }
.partner-card-fee.none { font-family: var(--sans); font-weight: 400; font-size: 13px; letter-spacing: 0; color: var(--ink-muted); }
.partner-card-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 10px; padding-top: 0; border-top: 0; }
.partner-card-status { font-family: var(--sans); font-size: 11.5px; color: var(--ink-soft); }
.partner-card-status.pos { color: var(--status-positive); }
.partner-card-status.warn { color: var(--status-warn); }
.partner-card-edit { font-family: var(--mono); font-size: 10px; color: var(--ink-soft); text-decoration: none; white-space: nowrap; }
.partner-card-edit:hover { color: var(--ink-strong); }

/* Income — the drawn commercial list treatment (W3, #236/#204: mirror the Live
   Commercial income list). A quiet summary sub-line, then flush rows. */
.income-headline { font-family: var(--sans); font-size: 12.5px; color: var(--ink-muted); margin: 0 0 10px; line-height: 1.4; font-variant-numeric: tabular-nums; }
/* Commercial empty states (Income + Partners): don't double-shell the Income
   empty in the big snapshot card, span the Partners well across the grid, and
   tighten both wells — the standard well height is too tall for these
   aggregator sections. Scoped to these sections; the shared .empty-state is
   unchanged everywhere else. */
.income-card:has(.empty-state) { padding: 0; border: 0; box-shadow: none; background: transparent; }
#partners-section .partner-grid .empty-state { grid-column: 1 / -1; }
#income-section .empty-state.well,
#partners-section .empty-state.well { padding: 22px 20px; }
#income-section .empty-state-icon,
#partners-section .empty-state-icon { width: 34px; height: 34px; border-radius: 10px; margin-bottom: 8px; }
#income-section .empty-state-icon svg,
#partners-section .empty-state-icon svg { width: 17px; height: 17px; }
#income-section .empty-state-actions,
#partners-section .empty-state-actions { margin-top: 12px; }
/* The rows sit flush inside the card (no boxed grid, no card-in-card): a name with
   a quiet mono source caption under it, a strong mono amount and a coloured status
   word (no dot — the campaign register), split by hairline-soft dividers. */
.income-list { display: flex; flex-direction: column; }
.income-row { display: flex; align-items: center; gap: 12px; padding: 11px 0; border-bottom: 1px solid var(--hairline-soft); }
.income-row:last-child { border-bottom: 0; }
.income-row-name { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; font-family: var(--sans); font-size: 13.5px; font-weight: var(--fw-title-light); color: var(--ink); }
.income-row-source { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); }
.income-row-num { font-family: var(--mono); font-size: 13px; font-weight: 600; color: var(--ink-strong); font-variant-numeric: tabular-nums; text-align: right; }
.income-row-status { font-family: var(--sans); font-size: 11.5px; color: var(--ink-soft); text-align: right; white-space: nowrap; width: 88px; flex-shrink: 0; }
.income-row-status.pos { color: var(--status-positive); }
.income-row-status.warn { color: var(--status-warn); }

/* Budget multi-field quick-add row — collapsed to a quiet add affordance by
   default; the fields render only once the row is selected. */
.budget-quick-add { display: flex; align-items: center; gap: 12px; padding: 11px 18px; border-bottom: 1px solid var(--hairline); }
.budget-quick-add .qa-label { font-family: var(--sans); font-size: 13px; color: var(--ink-muted); }
.budget-quick-add.is-collapsed { cursor: pointer; transition: background 120ms; }
.budget-quick-add.is-collapsed:hover { background: rgba(28,22,12,0.02); }
.budget-quick-add.is-collapsed:hover .qa-label { color: var(--ink-strong); }
.budget-quick-add.is-collapsed:hover .qa-icon { color: var(--ink-strong); border-color: var(--ink-soft); }
.budget-quick-add .qa-icon { width: 20px; height: 20px; border-radius: 50%; border: 1px dashed var(--hairline); display: inline-flex; align-items: center; justify-content: center; color: var(--ink-muted); font-size: 13px; flex-shrink: 0; }
.budget-quick-add input { border: 0; background: transparent; font-family: var(--sans); font-size: 13px; color: var(--ink-strong); }
.budget-quick-add input:focus { outline: none; }
.budget-quick-add #qa-name { flex: 1; min-width: 0; }
.budget-quick-add input::placeholder { color: var(--ink-muted); }
.budget-quick-add .qa-amount { flex: 0 0 90px; text-align: right; font-family: var(--mono); }
.budget-head-actions { display: inline-flex; align-items: center; gap: 8px; }
.budget-sub-go { display: inline-flex; align-items: center; justify-content: center; color: var(--ink-faint); }
.budget-sub-go .chev-ic { width: 12px; height: 12px; }
.budget-sub-manual { cursor: pointer; }

/* ═══════════════════════════════════════════════════════════════════
 *  Campaign Strategy — the campaign's long-form planning document.
 *  Vision · Core concept · Creative direction · Moodboard · Timeline ·
 *  Targets · Audiences · Marketing · Fan strategy · Social strategy.
 *  Same warm-paper / ink-as-brand / lift language as the other campaign
 *  tabs. Long-form authoring, so it swaps the horizontal section rail for
 *  a right-hand sticky TOC. Per-artist mood appears only on quiet accents
 *  (active TOC tick, completion fill, release node). Spec: 05a. */

/* ── Layout: full-width long-form document. The section nav is a floating
      rail (see below), not a reserved column, so the document breathes. ── */
.strat-layout { display: block; margin-top: 32px; }
.strat-main { min-width: 0; max-width: none; }

/* Floating section rail — collapsed to a column of dots hugging the right
   edge; hover/focus expands it into a labelled panel. Gives wayfinding on a
   long document without permanently eating ~25% of the content width.
   NOTE: shared with Live-Tour-Strategy (same classes) — the persistent
   variant below is scoped to .strat-wrap--toc so this base is untouched. */
.strat-toc {
  position: fixed; right: 22px; top: 50%; transform: translateY(-50%);
  z-index: 40; display: flex; flex-direction: column; align-items: stretch;
  max-width: 50px; padding: 10px; border-radius: 16px;
  background: transparent; border: 1px solid transparent; box-shadow: none;
  overflow: hidden;
  opacity: 0; pointer-events: none;
  transition: max-width 200ms ease, background 200ms, border-color 200ms, box-shadow 200ms, padding 200ms, opacity 220ms ease;
}
.strat-toc.is-visible { opacity: 1; pointer-events: auto; }
.strat-toc:hover, .strat-toc:focus-within {
  max-width: 236px; padding: 14px 16px;
  background: var(--lift-bg); border-color: var(--hairline);
  box-shadow: 0 12px 34px rgba(28,22,12,0.14), 0 2px 8px rgba(28,22,12,0.08);
}
@media (max-width: 1024px) { .strat-toc { display: none; } }
/* Reserve a slim right gutter for the rail so it never sits over the cards. */
@media (min-width: 1025px) { .strat-wrap { padding-right: 78px; } }

.strat-toc-label {
  font-family: var(--mono); font-size: 9px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--ink-faint); font-weight: 600; text-align: right; white-space: nowrap;
  opacity: 0; height: 0; margin: 0; padding: 0; border-bottom: 1px solid transparent;
  transition: opacity 160ms, height 200ms, padding 200ms, margin 200ms;
}
.strat-toc:hover .strat-toc-label, .strat-toc:focus-within .strat-toc-label {
  opacity: 1; height: auto; padding-bottom: 11px; margin-bottom: 6px; border-bottom-color: var(--hairline);
}
.strat-toc-list { display: flex; flex-direction: column; gap: 1px; }
.strat-toc-item {
  display: flex; align-items: center; justify-content: flex-end; gap: 11px; padding: 6px 0;
  font-family: var(--sans); font-size: 12.5px; color: var(--ink-muted); line-height: 1.3;
  cursor: pointer; transition: color 150ms;
}
.strat-toc-item:hover { color: var(--ink-strong); }
.strat-toc-item.active { color: var(--ink-strong); font-weight: 600; }
.strat-toc-text {
  white-space: nowrap; text-align: right;
  opacity: 0; transform: translateX(8px); transition: opacity 150ms, transform 200ms;
}
.strat-toc:hover .strat-toc-text, .strat-toc:focus-within .strat-toc-text { opacity: 1; transform: none; }
.strat-toc-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; background: var(--ink-faint); transition: background 150ms, transform 150ms; }

/* ── Campaign Strategy persistent ToC (#93 Pass 3 A) ── scoped to
   .strat-wrap--toc so the shared Live-Tour-Strategy rail keeps its original
   float-on-hover behaviour. Here the rail is an in-flow, sticky, fully
   labelled side column: a real menu + progress map, always visible. ── */
.strat-wrap--toc { padding-right: 0; }
.strat-wrap--toc .strat-layout { display: flex; gap: 28px; align-items: flex-start; }
.strat-wrap--toc .strat-main { flex: 1; }
.strat-wrap--toc .strat-toc {
  position: sticky; right: auto; top: 88px; transform: none; z-index: 1;
  align-self: flex-start; flex-shrink: 0; width: 210px; max-width: none;
  max-height: calc(100vh - 108px); overflow-y: auto; opacity: 1; pointer-events: auto;
  padding: 14px 16px; background: var(--lift-bg); border-color: var(--hairline);
  box-shadow: 0 12px 34px rgba(28,22,12,0.10), 0 2px 8px rgba(28,22,12,0.06);
}
.strat-wrap--toc .strat-toc-label { opacity: 1; height: auto; text-align: left; padding-bottom: 11px; margin-bottom: 6px; border-bottom-color: var(--hairline); }
.strat-wrap--toc .strat-toc-item { justify-content: space-between; padding: 6px 8px; border-radius: 7px; border-left: 2px solid transparent; transition: color 150ms, background 150ms, border-color 150ms; }
.strat-wrap--toc .strat-toc-item:hover { background: rgba(28,22,12,0.02); }
.strat-wrap--toc .strat-toc-item.active { background: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 7%, transparent); border-left-color: var(--artist-accent, var(--ink-strong)); }
.strat-wrap--toc .strat-toc-text { opacity: 1; transform: none; text-align: left; overflow: hidden; text-overflow: ellipsis; }
/* Make collapse obvious on the campaign page (#93 A): a clearer chevron. */
.strat-wrap--toc .strat-chev { width: 15px; height: 15px; color: var(--ink-muted); transition: color 150ms, transform 180ms; }
.strat-wrap--toc .strat-section.collapsible > .strat-head:hover .strat-chev { color: var(--ink-strong); }
/* Collapsed rows read as cards (not flat on the canvas), matching the white
   content cards. Open heads stay plain — their content card carries the surface. */
.strat-wrap--toc .strat-section.collapsible:not(.is-open) > .strat-head {
  align-items: center; padding: 13px 18px;
  background: var(--lift-bg); border: var(--lift-stroke); border-radius: var(--r-md); box-shadow: var(--lift-shadow);
  transition: box-shadow 150ms;
}
.strat-wrap--toc .strat-section.collapsible:not(.is-open) > .strat-head:hover { box-shadow: var(--lift-shadow), 0 0 0 1px rgba(28, 22, 12, 0.1); }
.strat-toc-dot.partial { background: var(--ink-faint); }
.strat-toc-dot.empty { background: transparent; border: 1px solid var(--ink-faint); }
.strat-toc-item:hover .strat-toc-dot { background: var(--ink-soft); }
.strat-toc-item.active .strat-toc-dot { background: var(--artist-accent, var(--ink-strong)); transform: scale(1.45); }
/* "Sharing" is excluded from the completion count (its dot carries .meta so
   the maths skips it) but otherwise looks and behaves like any TOC item. */

/* ── Section primitive ── */
.strat-section { padding-top: 8px; margin-bottom: 60px; scroll-margin-top: 90px; }
/* Lead-content card for Vision + Core concept, so every section reads as carded
   (matches the Creative-direction card). Concept's themes sit as their own grid
   below it, not nested. */
.strat-cardbody { border-radius: var(--r-lg); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 22px 24px; }
.strat-cardbody + .strat-themes { margin-top: 12px; }
.strat-cardbody .strat-meta { margin-top: 12px; }
.strat-hero-actions { display: inline-flex; align-items: center; gap: 8px; }
.strat-section:last-child { margin-bottom: 24px; }
.strat-head { display: flex; align-items: baseline; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; row-gap: 8px; }
.strat-eyebrow { font-family: var(--mono); font-weight: 600; font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--ink-strong); white-space: nowrap; }
.strat-status { font-family: var(--mono); font-size: 11px; color: var(--ink-muted); letter-spacing: 0.02em; }
.strat-edit { margin-left: auto; font-family: var(--mono); font-size: 11px; color: var(--ink-muted); white-space: nowrap; transition: color 150ms; cursor: pointer; }
.strat-edit:hover { color: var(--ink-strong); }
.strat-edit.add { display: inline-flex; align-items: baseline; gap: 5px; }
.strat-edit.add::before { content: "+"; font-weight: 600; }
/* Persistent "+ add another" affordance at the foot of a collection (#91 C1) — keeps the
   header Add link but saves a trip to the corner when adding several in a row. */
.strat-add-more { margin: 14px 0 0; }
.strat-sync { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-soft); font-weight: 600; padding: 3px 9px 3px 8px; border-radius: 999px; background: rgba(255,255,255,0.6); border: 1px solid var(--hairline); white-space: nowrap; }
.strat-sync::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--artist-accent, var(--ink-strong)); }

/* ── 1. Vision — large editorial statement ── */
.strat-vision { font-family: var(--sans); font-weight: 400; font-size: 14.5px; line-height: 1.65; color: var(--ink); margin: 0; max-width: 64ch; text-wrap: pretty; white-space: pre-wrap; }
.strat-vision strong { font-weight: 700; }
.strat-meta { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); margin-top: 16px; letter-spacing: 0.02em; }

/* ── 2. Core concept — anchor + body + themes ── */
.strat-anchor { font-family: var(--sans); font-weight: 700; font-size: 20px; letter-spacing: -0.015em; line-height: 1.3; color: var(--ink-strong); margin: 0 0 14px; }
.strat-body { font-family: var(--sans); font-size: 14.5px; color: var(--ink); line-height: 1.65; margin: 0 0 22px; max-width: 64ch; }
.strat-themes { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }

/* Section overview (C2) — headline + intro ahead of a section's cards (marketing,
   fan, targets); mirrors the core-concept anchor + body, on a lifted .strat-cardbody. */
.strat-overview { position: relative; margin: 0 0 16px; }
.strat-overview-edit { position: absolute; top: 22px; right: 24px; margin-left: 0; }
.strat-overview-title { font-family: var(--sans); font-weight: 700; font-size: 18px; letter-spacing: -0.015em; line-height: 1.3; color: var(--ink-strong); margin: 0 0 12px; padding-right: 52px; }
.strat-overview-body { font-family: var(--sans); font-size: 14.5px; color: var(--ink); line-height: 1.65; margin: 0; max-width: 64ch; }
.strat-overview-title:empty::before, .strat-overview-body:empty::before { content: attr(data-ph); color: var(--ink-muted); font-weight: 400; pointer-events: none; }
@media (max-width: 680px) { .strat-themes { grid-template-columns: 1fr; } }
.strat-theme { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 15px 16px; }
.strat-theme-num { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); letter-spacing: 0.06em; }
.strat-theme-title { font-family: var(--sans); font-weight: 600; font-size: 14px; color: var(--ink-strong); line-height: 1.3; margin: 7px 0 6px; }
.strat-theme-body { font-family: var(--sans); font-size: 12.5px; color: var(--ink-soft); line-height: 1.5; margin: 0; }

/* ── 3. Creative direction — statement card + field grid ── */
.strat-creative { border-radius: var(--r-lg); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 22px 24px; }
.strat-statement { font-family: var(--sans); font-weight: 600; font-size: 17px; letter-spacing: -0.01em; line-height: 1.4; color: var(--ink-strong); margin: 0 0 10px; }
.strat-statement-sub { font-family: var(--sans); font-size: 13.5px; color: var(--ink-soft); line-height: 1.6; margin: 0; }
.strat-creative-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px 22px; margin-top: 22px; padding-top: 20px; border-top: 1px solid var(--hairline); }
@media (max-width: 680px) { .strat-creative-grid { grid-template-columns: 1fr; } }
.strat-field { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.strat-field-label { font-family: var(--mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.strat-field-value { font-family: var(--sans); font-size: 13px; color: var(--ink-strong); line-height: 1.55; }
.strat-keywords { display: flex; gap: 6px; flex-wrap: wrap; }
.strat-keyword { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-soft); background: rgba(28,22,12,0.05); border: 1px solid var(--hairline); border-radius: 999px; padding: 3px 9px; line-height: 1.4; display: inline-flex; align-items: center; white-space: nowrap; }
.strat-palette { display: flex; gap: 7px; flex-wrap: wrap; }
.strat-swatch { width: 30px; height: 30px; border-radius: 7px; border: 1px solid var(--hairline); box-shadow: 0 1px 2px rgba(28,22,12,0.06) inset; }

/* ── 4. Moodboard — deck slot + collapsible grid ── */
.strat-deck { display: flex; align-items: center; gap: 12px; padding: 12px 15px; border-radius: var(--r-md); background: rgba(28,22,12,0.025); border: 1px solid var(--hairline); margin-bottom: 12px; }
.strat-deck-eyebrow { font-family: var(--mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; flex-shrink: 0; }
.strat-deck-name { flex: 1; min-width: 0; font-family: var(--sans); font-size: 13px; color: var(--ink-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.strat-deck-name .strat-deck-meta { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); }
.strat-deck-action { font-family: var(--mono); font-size: 11px; color: var(--ink-soft); white-space: nowrap; cursor: pointer; }
.strat-deck-action:hover { color: var(--ink-strong); }
.strat-mood-toggle { display: flex; align-items: center; gap: 10px; padding: 9px 14px; border-radius: var(--r-md); background: rgba(255,255,255,0.5); border: 1px solid var(--hairline); cursor: pointer; transition: background 150ms; }
.strat-mood-toggle:hover { background: white; }
.strat-mood-toggle .chev-ic { width: 13px; height: 13px; color: var(--ink-muted); }
.strat-mood-toggle.is-open .chev-ic { transform: rotate(90deg); }
.strat-mood-toggle-label { font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong); font-weight: 500; }
.strat-mood-toggle-count { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); }
.strat-mood-toggle-action { margin-left: auto; font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.04em; color: var(--ink-muted); }
.strat-mood-wrap { margin-top: 10px; }
.strat-mood-wrap[hidden] { display: none; }
.strat-mood-grid { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 104px; gap: 9px; }
@media (max-width: 680px) { .strat-mood-grid { grid-template-columns: repeat(3, 1fr); } }
/* Campaign moodboard — Pinterest-style masonry (scoped to #mood-grid; the Live Tour
   moodboard #lts-mood-grid keeps the uniform grid above). Real images size to their
   natural aspect via CSS columns; demo placeholders default to a portrait tile. */
#mood-grid { display: block; column-count: 4; column-gap: 9px; }
@media (max-width: 900px) { #mood-grid { column-count: 3; } }
@media (max-width: 560px) { #mood-grid { column-count: 2; } }
#mood-grid .strat-mood-card { width: 100%; margin: 0 0 9px; break-inside: avoid; -webkit-column-break-inside: avoid; }
#mood-grid .strat-mood-card.img { aspect-ratio: 3 / 4; }
#mood-grid .strat-mood-card.img.has-img { aspect-ratio: auto; }
#mood-grid .strat-mood-img { width: 100%; display: block; }
#mood-grid .strat-mood-card.link { min-height: 130px; }
#mood-grid .strat-mood-add { min-height: 130px; }
/* Moodboard reference cards — each is an uploaded image or an external link,
   removable (×) and added via the "+ Add reference" card (upload or link). */
.strat-mood-card { position: relative; border-radius: 9px; overflow: hidden; border: 1px solid var(--hairline); }
.strat-mood-card.img { background: linear-gradient(150deg, #E7E1D8 0%, #CBB9A6 100%) center / cover no-repeat; filter: grayscale(0.15); }
.strat-mood-card.img::after { content: ""; position: absolute; inset: 0; background: var(--artist-accent, transparent); mix-blend-mode: multiply; opacity: 0.08; }
.strat-mood-card.link { background: var(--surface); display: flex; flex-direction: column; justify-content: flex-end; gap: 2px; padding: 11px 12px; }
.strat-mood-link-ic { width: 26px; height: 26px; border-radius: 6px; display: inline-flex; align-items: center; justify-content: center; background: rgba(28,22,12,0.05); border: 1px solid var(--hairline); color: var(--ink-soft); margin-bottom: auto; }
.strat-mood-link-ic svg { width: 14px; height: 14px; }
.strat-mood-link-host { font-family: var(--mono); font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); }
.strat-mood-link-title { font-family: var(--sans); font-size: 11.5px; font-weight: 600; color: var(--ink-strong); line-height: 1.25; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.strat-mood-x { position: absolute; top: 6px; right: 6px; width: 20px; height: 20px; border-radius: 50%; border: none; background: rgba(14,11,8,0.62); color: #fff; font-size: 13px; line-height: 1; cursor: pointer; opacity: 0; transition: opacity 130ms; display: inline-flex; align-items: center; justify-content: center; z-index: 2; }
.strat-mood-card:hover .strat-mood-x { opacity: 1; }
.strat-mood-x:hover { background: var(--urgent); }
.strat-mood-add { position: relative; border-radius: 9px; border: 1px dashed var(--ink-faint); background: transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--ink-muted); transition: color 150ms, border-color 150ms; padding: 0; }
.strat-mood-add:hover { color: var(--ink-strong); border-color: var(--ink-soft); }
.strat-mood-add-default { display: flex; flex-direction: column; align-items: center; gap: 5px; }
.strat-mood-add-plus { font-size: 19px; line-height: 1; }
.strat-mood-add-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase; }
/* moodboard add-chooser — the campaign Strategy moodboard now uses the shared
   add-reference popover, but the Live Tour Strategy page still uses this chooser. */
.strat-mood-add-choose { display: flex; gap: 6px; }
.strat-mood-add-choose[hidden] { display: none; }
.strat-mood-opt { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-soft); background: var(--bg); border: 1px solid var(--hairline); border-radius: 6px; padding: 6px 10px; cursor: pointer; }
.strat-mood-opt:hover { color: var(--ink-strong); border-color: var(--ink-soft); }
.strat-mood-source { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); margin: 12px 0 0; }
.strat-mood-source a { color: var(--ink-soft); cursor: pointer; }
.strat-mood-source a:hover { color: var(--ink-strong); }

/* ── 5. Timeline — milestone-type chip + the per-release track sub-row.
      (The timeline itself is the .strat-spine-* component further below.) ── */
/* ── Milestone-type chip (design-system component) ──
   Colour-codes a milestone by type. Reusable: the Strategy hero "next move",
   the Strategy timeline, and the Plan all use it. A type modifier sets --ms-c;
   the chip renders as a soft tint + coloured label + matching border. Release
   is the headline event and renders as a solid ink chip. */
.ms-chip {
  display: inline-flex; align-items: center; white-space: nowrap;
  font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600;
  border-radius: 999px; padding: 2px 9px; line-height: 1.5;
  color: color-mix(in oklab, var(--ms-c, var(--ink-soft)) 82%, var(--ink-strong));
  background: color-mix(in oklab, var(--ms-c, var(--ink-strong)) 12%, transparent);
  border: 1px solid color-mix(in oklab, var(--ms-c, var(--ink-strong)) 30%, transparent);
}
.ms-chip.announce { --ms-c: var(--ms-announce); }
.ms-chip.fan      { --ms-c: var(--ms-fan); }
.ms-chip.social   { --ms-c: var(--ms-social); }
.ms-chip.goal     { --ms-c: var(--ms-goal); }
.ms-chip.release {
  color: var(--bg); background: var(--ink-strong); border-color: var(--ink-strong);
}
/* Release-format tag (#93 d) — Single vs the project (EP / album), in the
   artist's accent so it reads as "this artist's release" and never collides
   with the milestone-type colours above. Reuses the .ms-chip primitive. */
.ms-chip.format { --ms-c: var(--artist-accent, var(--ink-strong)); }
/* Sits to the right of the date, inline before the title (keeps the spine's
   3-column grid intact — the tag lives inside the info column, not the grid). */
.strat-spine-titlerow { position: relative; display: flex; align-items: center; min-width: 0; }
/* The tag sits centered in the gap between the date and the title (absolutely
   placed so it never pushes the title off its column). The offset lands its
   centre on the gap midpoint — ~42px left of the title, half the date→title gap. */
.strat-spine-fmt { position: absolute; left: -42px; transform: translateX(-50%); }

.strat-track { display: flex; align-items: center; gap: 10px; padding: 8px 11px; border-radius: var(--r-sm); background: var(--bg); border: 1px solid var(--hairline); }
.strat-track.placeholder { border-style: dashed; }
.strat-track-icon { width: 22px; height: 22px; border-radius: 5px; flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; background: var(--surface); border: 1px solid var(--hairline); color: var(--ink-muted); }
.strat-track-icon svg { width: 12px; height: 12px; }
.strat-track-name { font-family: var(--sans); font-weight: 600; font-size: 13px; color: var(--ink-strong); }
.strat-track.placeholder .strat-track-name { color: var(--ink-muted); font-style: italic; font-weight: 500; }
.strat-track-single { font-family: var(--mono); font-size: 8px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft); background: var(--surface); border: 1px solid var(--hairline); border-radius: 999px; padding: 2px 8px; font-weight: 600; }
.strat-track-status { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft); border: 1px solid var(--hairline); border-radius: 4px; padding: 2px 7px; font-weight: 600; }
.strat-track-spacer { flex: 1; }
.strat-track-play { width: 22px; height: 22px; border-radius: 50%; border: 1px solid var(--hairline); display: inline-flex; align-items: center; justify-content: center; color: var(--ink-soft); flex-shrink: 0; cursor: pointer; }
.strat-track-play svg { width: 9px; height: 9px; }
.strat-track.placeholder .strat-track-play { opacity: 0.4; cursor: default; }
.strat-track-link { font-family: var(--mono); font-size: 10.5px; color: var(--ink-soft); white-space: nowrap; cursor: pointer; }
.strat-track-link:hover { color: var(--ink-strong); }

/* Per-track concepts sub-section */
.strat-subdivider { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin: 30px 0 16px; padding-top: 18px; border-top: 1px solid var(--hairline); }
.strat-subhead { font-family: var(--mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-soft); font-weight: 600; }
.strat-concepts { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; }
@media (max-width: 680px) { .strat-concepts { grid-template-columns: 1fr; } }
.strat-concept { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 16px 18px; }
.strat-concept-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding-bottom: 11px; margin-bottom: 12px; border-bottom: 1px solid var(--hairline); }
.strat-concept-name { font-family: var(--sans); font-weight: 600; font-size: 15px; color: var(--ink-strong); line-height: 1.3; margin: 0; }
.strat-concept-num { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); white-space: nowrap; }
.strat-concept-fields { display: flex; flex-direction: column; gap: 11px; }
.strat-concept-field { display: flex; flex-direction: column; gap: 3px; }
.strat-concept-label { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.strat-concept-value { font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong); line-height: 1.5; }
.strat-concept.add { display: flex; align-items: center; justify-content: center; background: transparent; box-shadow: none; border: 1px dashed var(--ink-faint); color: var(--ink-muted); font-family: var(--mono); font-size: 11.5px; min-height: 160px; cursor: pointer; transition: color 150ms, border-color 150ms; }
.strat-concept.add:hover { color: var(--ink-strong); border-color: var(--ink-soft); }

/* ── 6. Targets — table synced with Goals ── */
.strat-targets { border-radius: var(--r-md); overflow: hidden; background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); }
.strat-target-row { display: grid; grid-template-columns: 1fr 96px 110px 132px; gap: 14px; align-items: center; padding: 14px 18px; border-bottom: 1px solid var(--hairline); }
.strat-target-row:last-child { border-bottom: 0; }
.strat-target-row.head { padding: 10px 18px; align-items: baseline; background: rgba(28,22,12,0.015); }
.strat-target-th { font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); font-weight: 600; }
.strat-target-th.right { text-align: right; }
.strat-target-metric { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.strat-target-name { font-family: var(--sans); font-weight: 600; font-size: 13px; color: var(--ink-strong); line-height: 1.3; }
.strat-pillar { width: fit-content; font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; color: var(--ink-soft); background: rgba(28,22,12,0.05); border-radius: 4px; padding: 2px 7px; }
.strat-target-current { font-family: var(--mono); font-size: 12.5px; color: var(--ink-muted); text-align: right; }
.strat-target-goal { font-family: var(--sans); font-weight: 700; font-size: 15px; letter-spacing: -0.01em; color: var(--ink-strong); text-align: right; }
.strat-target-when { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
.strat-target-date { font-family: var(--mono); font-size: 12px; color: var(--ink-soft); }
.strat-target-formula { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); }
.strat-target-add { padding: 12px 18px; font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); cursor: pointer; }
.strat-target-add:hover { color: var(--ink-strong); }

/* ── 7. Audiences — 3-up cards + sound positioning ── */
.strat-aud-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; align-items: start; }
@media (max-width: 820px) { .strat-aud-grid { grid-template-columns: 1fr; } }
.strat-aud-card { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 18px 19px; display: flex; flex-direction: column; }
.strat-aud-head { display: flex; gap: 10px; padding-bottom: 12px; margin-bottom: 12px; border-bottom: 1px solid var(--hairline); }
.strat-aud-num { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); padding-top: 3px; }
.strat-aud-name { font-family: var(--sans); font-weight: 600; font-size: 15px; color: var(--ink-strong); line-height: 1.25; margin: 0 0 3px; }
.strat-aud-demo { font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); letter-spacing: 0.02em; }
.strat-aud-fields { display: flex; flex-direction: column; gap: 13px; }
.strat-aud-field { display: flex; flex-direction: column; gap: 4px; }
.strat-aud-label { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.strat-aud-value { font-family: var(--sans); font-size: 12.5px; color: var(--ink-strong); line-height: 1.55; }
.strat-positioning { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 18px 20px; margin-top: 34px; }
.strat-positioning-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding-bottom: 12px; margin-bottom: 12px; border-bottom: 1px solid var(--hairline); }
.strat-positioning-name { font-family: var(--sans); font-weight: 600; font-size: 15px; color: var(--ink-strong); margin: 0; }
.strat-positioning-tag { font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); }
.strat-positioning-line { font-family: var(--sans); font-size: 13.5px; color: var(--ink-strong); line-height: 1.55; margin: 0 0 12px; }
.strat-refs { display: flex; gap: 6px; flex-wrap: wrap; }
.strat-ref { font-family: var(--sans); font-size: 12px; color: var(--ink-soft); background: var(--surface); border: 1px solid var(--hairline); border-radius: 999px; padding: 3px 11px; line-height: 1.4; display: inline-flex; align-items: center; white-space: nowrap; }

/* ── 8. Marketing strategy — area cards ── */
.strat-cap { margin-left: auto; display: inline-flex; align-items: center; gap: 7px; white-space: nowrap; font-family: var(--mono); font-size: 10.5px; color: var(--ink-soft); background: rgba(255,255,255,0.6); border: 1px solid var(--hairline); border-radius: 999px; padding: 4px 11px; }
.strat-cap::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--ink-faint); }
.strat-cap a { color: var(--ink-soft); cursor: pointer; }
.strat-cap a:hover { color: var(--ink-strong); }
.strat-cap + .strat-edit { margin-left: 14px; }
.strat-mk-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; align-items: start; }
@media (max-width: 680px) { .strat-mk-grid { grid-template-columns: 1fr; } }
.strat-mk-card { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 17px 19px; display: flex; flex-direction: column; gap: 10px; }
.strat-mk-card.wide { grid-column: 1 / -1; }
.strat-mk-head { display: flex; align-items: baseline; gap: 10px; padding-bottom: 10px; border-bottom: 1px solid var(--hairline); }
.strat-mk-name { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-strong); font-weight: 600; }
.strat-mk-meta { font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); }
.strat-mk-edit { margin-left: auto; font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); cursor: pointer; }
.strat-mk-edit:hover { color: var(--ink-strong); }
.strat-mk-headline { font-family: var(--sans); font-weight: 600; font-size: 15px; color: var(--ink-strong); line-height: 1.3; margin: 0; }
.strat-mk-body { font-family: var(--sans); font-size: 13px; color: var(--ink-soft); line-height: 1.55; margin: 0; }
.strat-mk-chips { display: flex; gap: 6px; flex-wrap: wrap; margin-top: auto; }
.strat-mk-chip { font-family: var(--mono); font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-soft); background: rgba(28,22,12,0.04); border: 1px solid var(--hairline); border-radius: 999px; padding: 3px 9px; line-height: 1.4; display: inline-flex; align-items: center; white-space: nowrap; }

/* Channel split — a budget area divided across channels. The stacked bar and
   legend amounts are the source of truth; the bar widths compute from amounts,
   and a reconciliation line flags the total against the area's planned budget
   (balanced · unallocated · over). Editable in the card's edit mode. */
.strat-split { display: flex; flex-direction: column; gap: 9px; }
.strat-split-bar { display: flex; height: 12px; border-radius: 5px; overflow: hidden; border: 1px solid var(--hairline); background: rgba(28,22,12,0.05); }
.strat-split-seg { border-right: 1px solid var(--surface); min-width: 2px; }
.strat-split-seg:last-child { border-right: 0; }
.strat-split-legend { display: flex; flex-direction: column; gap: 7px; }
.strat-split-item { display: flex; align-items: center; gap: 8px; font-family: var(--mono); font-size: 11.5px; color: var(--ink-soft); }
.strat-split-dot { width: 9px; height: 9px; border-radius: 2px; flex-shrink: 0; }
.strat-split-name { color: var(--ink-strong); }
.strat-split-amount { margin-left: auto; color: var(--ink-strong); font-weight: 500; }
.strat-split-recon { display: flex; align-items: baseline; gap: 8px; padding-top: 8px; border-top: 1px solid var(--hairline); font-family: var(--mono); font-size: 11px; }
.strat-split-recon-label { color: var(--ink-muted); }
.strat-split-recon-total { color: var(--ink-strong); font-weight: 600; }
.strat-split-recon-flag { margin-left: auto; font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; padding: 2px 8px; border-radius: 999px; }
.strat-split-recon-flag.balanced { color: var(--ms-social); background: color-mix(in oklab, var(--ms-social) 12%, transparent); }
.strat-split-recon-flag.under { color: var(--ms-goal); background: color-mix(in oklab, var(--ms-goal) 14%, transparent); }
.strat-split-recon-flag.over { color: var(--urgent); background: color-mix(in oklab, var(--urgent) 12%, transparent); }
/* edit mode */
.strat-split-item.is-edit { gap: 8px; }
.strat-split-name-input { font-family: var(--mono); font-size: 11.5px; color: var(--ink-strong); background: var(--bg); border: 1px solid var(--hairline); border-radius: 5px; padding: 3px 8px; min-width: 0; flex: 1; }
.strat-split-amount-wrap { margin-left: auto; display: inline-flex; align-items: center; gap: 2px; }
.strat-split-amount-input { width: 72px; font-family: var(--mono); font-size: 11.5px; color: var(--ink-strong); background: var(--bg); border: 1px solid var(--hairline); border-radius: 5px; padding: 3px 8px; text-align: right; }
.strat-split-x { width: 18px; height: 18px; flex-shrink: 0; border: none; border-radius: 50%; background: rgba(28,22,12,0.1); color: var(--ink-soft); font-size: 12px; line-height: 1; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
.strat-split-x:hover { background: color-mix(in oklab, var(--urgent) 16%, transparent); color: var(--urgent); }
.strat-split-add { align-self: flex-start; font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); cursor: pointer; }
.strat-split-add:hover { color: var(--ink-strong); }
.strat-mk-card.add { background: transparent; box-shadow: none; border: 1px dashed var(--ink-faint); align-items: center; justify-content: center; color: var(--ink-muted); font-family: var(--mono); font-size: 11.5px; min-height: 150px; cursor: pointer; transition: color 150ms, border-color 150ms; }
.strat-mk-card.add:hover { color: var(--ink-strong); border-color: var(--ink-soft); }

/* Marketing budget line — the planned spend set here, counted on Commercial.
   One per area; editable in card-edit mode; empty areas read "No budget set". */
.strat-mk-budget { display: flex; align-items: baseline; gap: 8px; margin-top: 12px; padding-top: 11px; border-top: 1px solid var(--hairline); }
.strat-mk-budget-ic { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.strat-mk-budget-amount { font-family: var(--sans); font-weight: 700; font-size: 15px; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat-mk-budget.empty .strat-mk-budget-amount { color: var(--ink-faint); font-weight: 600; font-size: 13px; }
.strat-editing .strat-mk-budget-amount { min-width: 28px; }
.strat-editing .strat-mk-budget.empty .strat-mk-budget-amount { color: var(--ink-strong); font-weight: 700; font-size: 15px; }

/* Strategy section empty state — reuses the design-system `.empty-state.well`,
   sized for in-document use (a section shows this when its collection is empty
   instead of a stray dashed "add" card). Compact variant for sub-collections
   like per-track concepts. */
.strat-empty { margin-top: 6px; padding: 32px 24px; gap: 3px; }
.strat-empty .empty-state-icon { width: 40px; height: 40px; border-radius: 11px; margin-bottom: 10px; }
.strat-empty .empty-state-icon svg { width: 20px; height: 20px; }
.strat-empty .empty-state-title { font-size: 15px; }
.strat-empty .empty-state-hint { font-size: 12.5px; }
.strat-empty .empty-state-actions { margin-top: 13px; }
.strat-empty-compact { padding: 22px 20px; }
.strat-empty-compact .empty-state-icon { width: 34px; height: 34px; margin-bottom: 8px; }
.strat-empty-compact .empty-state-icon svg { width: 17px; height: 17px; }
.strat-fan-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; align-items: start; }
@media (max-width: 680px) { .strat-fan-grid { grid-template-columns: 1fr; } }
.strat-fan-card { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 17px 19px; }
.strat-fan-top { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 6px; }
.strat-fan-eyebrow { font-family: var(--mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.strat-fan-edit { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); cursor: pointer; }
.strat-fan-edit:hover { color: var(--ink-strong); }
.strat-fan-title { font-family: var(--sans); font-weight: 600; font-size: 15px; color: var(--ink-strong); line-height: 1.3; margin: 0 0 8px; }
.strat-fan-body { font-family: var(--sans); font-size: 12.5px; color: var(--ink-soft); line-height: 1.55; margin: 0 0 12px; }
.strat-fan-list { display: flex; flex-direction: column; gap: 7px; padding-top: 11px; border-top: 1px solid var(--hairline); }
.strat-fan-item { display: flex; gap: 9px; font-family: var(--sans); font-size: 12.5px; color: var(--ink); line-height: 1.45; }
.strat-fan-item { display: flex; gap: 9px; align-items: center; font-family: var(--sans); font-size: 12.5px; color: var(--ink); line-height: 1.45; }
.strat-fan-item::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--artist-accent, var(--ink-faint)); margin-top: 7px; flex-shrink: 0; align-self: flex-start; }

/* Marketing activation bullets — same grammar as fan bullets so a line can
   become a milestone from either place. */
.strat-mk-list { display: flex; flex-direction: column; gap: 9px; margin-top: auto; padding-top: 11px; border-top: 1px solid var(--hairline); }
/* Small heading over the bullet lists so the points have context (founder #91 B3/B4) */
.strat-fan-list::before, .strat-mk-list::before { content: "Key points"; font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); font-weight: 600; }
.strat-mk-item { display: flex; gap: 9px; align-items: center; position: relative; font-family: var(--sans); font-size: 12.5px; color: var(--ink); line-height: 1.45; }
.strat-mk-item::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--artist-accent, var(--ink-faint)); flex-shrink: 0; align-self: flex-start; margin-top: 7px; }
.strat-bullet-text { flex: 1; min-width: 0; }

/* Milestone affordance — persistent per bullet. "+" when none exists yet, or a
   date tag once a milestone is created. Both open the milestone drawer. */
.strat-ms-aff { flex-shrink: 0; display: inline-flex; align-items: center; gap: 5px; cursor: pointer; font-family: var(--mono); border: 1px solid var(--hairline); background: var(--bg); transition: color 140ms, border-color 140ms, background 140ms; }
.strat-ms-aff svg { flex-shrink: 0; }
.strat-ms-aff.no-ms { width: 22px; height: 22px; padding: 0; border-radius: 50%; justify-content: center; color: var(--ink-muted); }
.strat-ms-aff.no-ms svg { width: 12px; height: 12px; }
.strat-ms-aff.no-ms:hover { color: var(--ink-strong); border-color: var(--ink-soft); background: var(--surface); }
.strat-ms-aff.has-ms { height: 22px; padding: 0 9px 0 8px; border-radius: 999px; font-size: 10px; letter-spacing: 0.02em; font-weight: 600; color: color-mix(in oklab, var(--artist-accent, var(--ink-soft)) 70%, var(--ink-strong)); border-color: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 28%, var(--hairline)); background: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 8%, transparent); }
.strat-ms-aff.has-ms svg { width: 11px; height: 11px; }
.strat-ms-aff.has-ms:hover { border-color: color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 50%, var(--hairline)); }

/* Bullet "+" chooser popup — Add task / Add milestone. */
.strat-ms-menu { position: absolute; z-index: 200; min-width: 168px; padding: 5px; border-radius: var(--r-md); background: var(--lift-bg); border: 1px solid var(--hairline); box-shadow: 0 14px 38px rgba(28,22,12,0.16), 0 2px 8px rgba(28,22,12,0.08); display: flex; flex-direction: column; gap: 1px; }
.strat-ms-menu-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 11px; border: 0; background: transparent; border-radius: var(--r-sm); cursor: pointer; font-family: var(--sans); font-size: 13px; font-weight: 500; color: var(--ink-strong); text-align: left; transition: background 120ms; }
.strat-ms-menu-item:hover { background: rgba(28,22,12,0.05); }

/* ── 10. Social strategy — user-defined label + value rows ── */
.strat-social { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 6px 22px; }
.strat-social-row { display: grid; grid-template-columns: 150px 1fr auto; gap: 22px; align-items: start; padding: 16px 0; border-bottom: 1px solid var(--hairline); }
.strat-social-row:last-child { border-bottom: 0; }
.strat-social-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; padding-top: 2px; align-self: start; }
.strat-social-label.strat-field-edit { text-transform: none; letter-spacing: 0; font-size: 12px; }
.strat-social-content { min-width: 0; }
.strat-social-value { font-family: var(--sans); font-size: 13px; color: var(--ink-strong); line-height: 1.6; }
/* Per-pillar refs/docs are C3 chips now (.strat-card-refs); the old .strat-social-ref* styles were removed with the C6 rework. */
.strat-social-edit { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); cursor: pointer; }
.strat-social-edit:hover { color: var(--ink-strong); }
.strat-social-deeplink { font-family: var(--sans); font-size: 12.5px; color: var(--ink-muted); margin: 14px 0 0; }
.strat-social-deeplink a { color: var(--ink-soft); cursor: pointer; }
.strat-social-deeplink a:hover { color: var(--ink-strong); }

/* ── Share history (full-width, below the two-column layout — mirrors Brief) ── */
.strat-share { border-radius: var(--r-md); overflow: hidden; background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); margin-top: 12px; }
.strat-share-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 13px 18px; border-bottom: 1px solid var(--hairline); }
.strat-share-headtext { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.strat-share-headactions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.strat-share-title { font-family: var(--mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-strong); font-weight: 600; }
.strat-share-meta { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); }
.strat-share-row { display: grid; grid-template-columns: 1.6fr 0.7fr 0.6fr 0.9fr auto; gap: 14px; align-items: center; padding: 13px 18px; border-bottom: 1px solid var(--hairline); }
.strat-share-row:last-child { border-bottom: 0; }
.strat-share-row.head span { font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); font-weight: 600; }
.strat-share-recipient { display: flex; align-items: center; gap: 11px; min-width: 0; }
.strat-share-avatar { width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0; background: rgba(255,255,255,0.7); border: 1px solid var(--hairline); display: inline-flex; align-items: center; justify-content: center; font-family: var(--sans); font-weight: 600; font-size: 10px; color: var(--ink-soft); }
.strat-share-rtext { min-width: 0; }
.strat-share-rname { font-family: var(--sans); font-weight: 600; font-size: 13px; color: var(--ink-strong); line-height: 1.3; }
.strat-share-rrole { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); }
.strat-share-cell { font-family: var(--mono); font-size: 11.5px; color: var(--ink-soft); }
.strat-share-cell.strong { color: var(--ink-strong); font-weight: 600; }
.strat-share-actions { display: flex; gap: 6px; justify-content: flex-end; }
.strat-share-btn { font-family: var(--mono); font-size: 10.5px; color: var(--ink-soft); border: 1px solid var(--hairline); border-radius: 999px; padding: 4px 11px; cursor: pointer; white-space: nowrap; transition: color 150ms, border-color 150ms; }
.strat-share-btn:hover { color: var(--ink-strong); border-color: rgba(28,22,12,0.18); }
.strat-share-btn.danger:hover { color: var(--urgent); border-color: rgba(139,30,46,0.3); }

/* ── Strategy-driven header — the authored objective, the next committed
      strategic move (next activation milestone), and plan completeness. No
      vanity metrics (those are Overview's); share/export live at the foot. ── */
.strat-hero { display: flex; flex-direction: column; gap: 14px; border-radius: var(--r-lg); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 22px 26px; margin-top: 22px; }
.strat-hero-topline { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.strat-hero-eyebrow { font-family: var(--mono); font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.strat-hero-stamp { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); white-space: nowrap; }
.strat-hero-objective { font-family: var(--sans); font-weight: 600; font-size: clamp(15.5px, 1.5vw, 18px); letter-spacing: -0.015em; line-height: 1.5; color: var(--ink-strong); margin: 0; text-wrap: pretty; max-width: none; white-space: pre-wrap; }
.strat-hero-foot { display: flex; align-items: center; justify-content: space-between; gap: 16px 24px; flex-wrap: wrap; padding-top: 15px; border-top: 1px solid var(--hairline); }
/* "Next move" reads as a coloured call to action (#93 a): the whole chip sits
   in a soft wash of its milestone-type colour, set via --ms-c in strategy.js
   so it tracks the next move's kind (announce / fan / social / release). */
.strat-hero-next { display: inline-flex; align-items: center; gap: 9px; min-width: 0; cursor: pointer; text-align: left;
  background: color-mix(in oklab, var(--ms-c, var(--ink-strong)) 9%, transparent);
  border: 1px solid color-mix(in oklab, var(--ms-c, var(--ink-strong)) 30%, transparent);
  border-radius: 999px; padding: 6px 13px; transition: background 150ms, border-color 150ms; }
.strat-hero-next:hover { background: color-mix(in oklab, var(--ms-c, var(--ink-strong)) 15%, transparent); }
.strat-hero-next-label { font-family: var(--mono); font-size: 9px; letter-spacing: 0.16em; text-transform: uppercase; font-weight: 700; white-space: nowrap; color: color-mix(in oklab, var(--ms-c, var(--ink-muted)) 80%, var(--ink-strong)); }
.strat-hero-next-name { font-family: var(--sans); font-weight: 600; font-size: 14px; color: var(--ink-strong); letter-spacing: -0.01em; }
.strat-hero-next:hover .strat-hero-next-name { text-decoration: underline; text-underline-offset: 2px; text-decoration-color: color-mix(in oklab, var(--ms-c, var(--ink-strong)) 40%, transparent); }
.strat-hero-next-when { font-family: var(--mono); font-size: 12px; color: var(--ink-soft); white-space: nowrap; }
.strat-hero-prog { display: flex; align-items: center; gap: 11px; }
.strat-hero-prog-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; white-space: nowrap; }
.strat-hero-prog-bar { width: 140px; height: 5px; border-radius: 999px; background: rgba(28,22,12,0.08); overflow: hidden; }
.strat-hero-prog-fill { height: 100%; border-radius: 999px; background: var(--artist-accent, var(--ink-strong)); }
.strat-hero-prog-meta { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); white-space: nowrap; }

/* ── Visual targets — progress bars (current → goal) replace the number
      table. A manager reads "where we are vs where we're going" at a
      glance. Not-started targets show a faint empty bar with a start note. ── */
.strat-tgt { display: flex; flex-direction: column; gap: 10px; }
.strat-tgt-row { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); padding: 15px 18px; }
.strat-tgt-top { display: flex; align-items: baseline; gap: 10px; margin-bottom: 12px; }
.strat-tgt-name { font-family: var(--sans); font-weight: 600; font-size: 14px; color: var(--ink-strong); letter-spacing: -0.01em; }
.strat-tgt-pillar { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; color: var(--ink-soft); background: rgba(28,22,12,0.05); border-radius: 4px; padding: 2px 7px; }
.strat-tgt-date { margin-left: auto; font-family: var(--mono); font-size: 11px; color: var(--ink-muted); white-space: nowrap; }
.strat-tgt-track { position: relative; height: 9px; border-radius: 999px; background: rgba(28,22,12,0.07); overflow: hidden; }
.strat-tgt-fill { position: absolute; inset: 0 auto 0 0; border-radius: 999px; background: var(--artist-accent, var(--ink-strong)); }
.strat-tgt-row.pending .strat-tgt-track { background: repeating-linear-gradient(45deg, rgba(28,22,12,0.04) 0 6px, rgba(28,22,12,0.07) 6px 12px); }
.strat-tgt-nums { display: flex; align-items: baseline; justify-content: space-between; margin-top: 9px; }
.strat-tgt-cur { font-family: var(--mono); font-size: 12px; color: var(--ink-muted); }
.strat-tgt-cur strong { color: var(--ink-strong); font-weight: 600; }
.strat-tgt-pct { font-family: var(--sans); font-size: 11.5px; font-weight: 600; color: var(--ink-soft); }
.strat-tgt-goal { font-family: var(--sans); font-size: 13px; font-weight: 700; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat-tgt-add { border-radius: var(--r-md); border: 1px dashed var(--ink-faint); color: var(--ink-muted); font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; padding: 12px; text-align: center; cursor: pointer; transition: color 150ms, border-color 150ms; }
.strat-tgt-add:hover { color: var(--ink-strong); border-color: var(--ink-soft); }

/* ── Timeline spine — the campaign's cadence as a vertical rule with
      nodes. Releases are filled (mood-ringed) anchor moments; announces
      and activations are outline nodes; gaps read on the rule between. ── */
.strat-spine { position: relative; padding-left: 30px; }
.strat-spine::before { content: ""; position: absolute; left: 6px; top: 8px; bottom: 18px; width: 2px; background: linear-gradient(var(--hairline), var(--hairline)); border-radius: 2px; }
.strat-spine-item { position: relative; padding-bottom: 8px; }
.strat-spine-node { position: absolute; left: -30px; top: 4px; width: 14px; height: 14px; border-radius: 50%; background: var(--bg); border: 2px solid var(--ink-faint); box-sizing: border-box; z-index: 1; }
.strat-spine-node.release { background: var(--ink-strong); border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 26%, transparent); }
.strat-spine-card { border-radius: var(--r-md); background: var(--lift-bg); border: var(--lift-stroke); box-shadow: var(--lift-shadow); overflow: hidden; }
.strat-spine-main { display: grid; grid-template-columns: 88px 1fr auto; gap: 14px; align-items: center; padding: 13px 16px; }
.strat-spine-date { display: flex; flex-direction: column; gap: 1px; }
.strat-spine-day { font-family: var(--sans); font-weight: 700; font-size: 15px; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat-spine-dow { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-faint); }
.strat-spine-info { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.strat-spine-end { display: inline-flex; align-items: center; gap: 8px; }
.field-optional { font-family: var(--mono); font-size: 9px; letter-spacing: 0.06em; color: var(--ink-faint); font-weight: 400; margin-left: 6px; }
.strat-spine-stat { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft); border: 1px solid var(--hairline); border-radius: 4px; padding: 2px 6px; white-space: nowrap; }
.strat-spine-title { font-family: var(--sans); font-weight: 600; font-size: 14px; color: var(--ink-strong); line-height: 1.3; }
.strat-spine-body { font-family: var(--sans); font-size: 12.5px; color: var(--ink-soft); line-height: 1.45; }
.strat-spine-track-wrap { padding: 0 16px 12px 16px; }
.strat-spine-gap { position: relative; height: 26px; padding-left: 4px; display: flex; align-items: center; font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; color: var(--ink-faint); }

/* ── Collapsible sections — every section is an accordion: a chevron in the
      head toggles its body. Campaign Strategy collapses by default (#93 C, via
      markup) and remembers each section's state per user; Live-Tour-Strategy
      ships them open. Collapsed rows show a one-line summary + count (campaign
      only). Edit / Add / sync affordances hide while closed. The clearer
      campaign chevron lives in the .strat-wrap--toc block above. ── */
.strat-section.collapsible > .strat-head { cursor: pointer; user-select: none; }
.strat-chev { width: 13px; height: 13px; color: var(--ink-faint); flex-shrink: 0; transform: rotate(0deg); transform-origin: center; transition: color 150ms; margin-right: -2px; }
.strat-section.collapsible > .strat-head:hover .strat-chev { color: var(--ink-soft); }
.strat-section.collapsible.is-open > .strat-head .strat-chev { transform: rotate(90deg); }
/* collapsed: hide everything but the head, plus the head's act affordances */
.strat-section.collapsible:not(.is-open) > *:not(.strat-head) { display: none; }
.strat-section.collapsible:not(.is-open) { margin-bottom: 20px; }
.strat-section.collapsible:not(.is-open) > .strat-head { margin-bottom: 0; }
.strat-section.collapsible:not(.is-open) .strat-head .strat-edit,
.strat-section.collapsible:not(.is-open) .strat-head .strat-sync,
.strat-section.collapsible:not(.is-open) .strat-head .strat-cap { display: none; }
/* Collapsed-row summary + count (#93 Pass 3 C). Only shown while closed; the
   summary is a one-line descriptor of the section, the count a live tally. */
.strat-head-summary { flex: 1; min-width: 0; font-family: var(--sans); font-size: 13px; color: var(--ink-muted); line-height: 1.35; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.strat-head-count { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); white-space: nowrap; flex-shrink: 0; }
.strat-section.collapsible.is-open > .strat-head .strat-head-summary,
.strat-section.collapsible.is-open > .strat-head .strat-head-count { display: none; }
/* Right-align every header action: only the first pushes off the eyebrow with
   margin-left:auto; any following link sits beside it. Was: two auto margins
   split the free space, dropping "Edit" mid-row. #93 (b) */
.strat-head > :is(.strat-edit, .strat-sync, .strat-cap) ~ .strat-edit { margin-left: 0; }

/* Drawer note — muted explanatory paragraph inside a drawer section
   (e.g. the Target drawer's "syncs with Goals"). */
.drawer-note { font-family: var(--sans); font-size: 12.5px; color: var(--ink-muted); line-height: 1.55; margin: 0; }

/* ── Strategy inline editing — the document edits in place. Clicking a
      section or card's "Edit" lifts it onto white, turns its prose into
      editable fields (subtle ring; the focused one picks up the accent),
      and reveals controls to add/remove tags, swatches and bullets. Done /
      Cancel; "+ Add" drops a new card. Only milestones and targets use a
      drawer. ── */
.strat-field-edit {
  display: block;
  background: var(--bg); border-radius: 6px;
  box-shadow: inset 0 0 0 1px rgba(28,22,12,0.16);
  padding: 6px 9px; margin: 3px 0; cursor: text; outline: none;
  white-space: pre-wrap;
  transition: box-shadow 120ms;
}
.strat-fan-item.strat-field-edit { display: flex; align-items: flex-start; }
.strat-field-edit:focus { box-shadow: inset 0 0 0 1px var(--artist-accent, var(--ink-strong)), 0 0 0 3px color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 16%, transparent); }
.strat-field-edit:empty::before { content: attr(data-ph); color: var(--ink-faint); }
/* Resting empty-state hint for the campaign objective (set live via data-ph); vanishes once an objective is saved. */
.strat-hero-objective:empty::before { content: attr(data-ph); color: var(--ink-muted); font-weight: 400; pointer-events: none; }
/* Preserve authored line breaks on the long-form prose fields (matches the editor). */
.strat-body, .strat-statement, .strat-statement-sub, .strat-anchor, .strat-field-value, .strat-aud-value, .strat-mk-body, .strat-fan-body, .strat-social-value, .strat-theme-body, .strat-concept-value, .strat-overview-body { white-space: pre-wrap; }

/* White lift behind a block section being edited (Vision, Core concept) */
.strat-section.strat-editing { background: #fff; border-radius: var(--r-lg); box-shadow: var(--lift-shadow), 0 0 0 1px var(--hairline); padding: 12px 24px 24px; margin-left: -24px; margin-right: -24px; }
.strat-section.strat-editing > .strat-head { margin-bottom: 16px; }
/* White lift on a card/row being edited */
.strat-aud-card.strat-editing, .strat-mk-card.strat-editing, .strat-fan-card.strat-editing,
.strat-concept.strat-editing, .strat-creative.strat-editing, .strat-positioning.strat-editing {
  background: #fff !important;
  box-shadow: 0 0 0 1px color-mix(in oklab, var(--artist-accent, var(--ink-strong)) 26%, transparent), var(--lift-shadow-lg, 0 12px 32px rgba(28,22,12,0.13)) !important;
}
/* Social rows live in a table, so they edit IN PLACE — a subtle inline
   highlight, not a detached card lift (which read as a popup). */
.strat-social-row.strat-editing {
  background: rgba(28,22,12,0.028) !important;
  box-shadow: inset 0 0 0 1px var(--hairline) !important;
  border-radius: 8px; padding: 14px 16px; margin: 2px 0;
}

/* Marketing card edit mode — tidy header + budget row.
   Hide the non-editable meta while editing, let the name field breathe on its
   own line, and give the budget fields sane widths so placeholders don't break. */
.strat-mk-card.strat-editing .strat-mk-head { flex-wrap: wrap; row-gap: 8px; }
.strat-mk-card.strat-editing .strat-mk-meta { display: none; }
.strat-mk-card.strat-editing .strat-mk-name.strat-field-edit {
  flex: 1 1 100%; min-width: 0; white-space: normal; text-transform: none;
  letter-spacing: 0.02em; font-size: 12px;
}
.strat-mk-budget { align-items: center; }
.strat-mk-card.strat-editing .strat-mk-budget { flex-wrap: wrap; row-gap: 8px; }
.strat-mk-card.strat-editing .strat-mk-budget-amount.strat-field-edit {
  font-family: var(--sans); font-weight: 700; font-size: 15px;
  min-width: 96px; max-width: 130px;
}
/* Inline-edit footer — Cancel / Done sit in their own bar at the foot of the
   scope being edited, so they never squish a card heading or sit beside a
   social text box. The original "Edit" trigger is hidden while editing. */
.is-editing-hidden { visibility: hidden; pointer-events: none; }
.strat-edit-footer { display: flex; justify-content: flex-end; align-items: center; gap: 8px; margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--hairline); grid-column: 1 / -1; }
.strat-social-row .strat-edit-footer { margin-top: 12px; }

/* Editable tag chips — a removable × on each chip + an add chip, shown only
   while the surrounding scope is in edit mode. Used for aesthetic principles,
   sound-positioning artists, marketing chips, social/fan references. */
.strat-tag-x { display: none; margin-left: 7px; width: 14px; height: 14px; border: none; border-radius: 50%; background: rgba(28,22,12,0.12); color: var(--ink-soft); font-size: 11px; line-height: 1; padding: 0; cursor: pointer; vertical-align: middle; align-items: center; justify-content: center; }
.strat-editing .strat-tag-x { display: inline-flex; }
.strat-tag-x:hover { background: var(--urgent); color: #fff; }
.strat-tag-add { display: none; font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); background: transparent; border: 1px dashed var(--ink-faint); border-radius: 999px; padding: 4px 11px; cursor: pointer; line-height: 1.4; }
.strat-editing .strat-tag-add { display: inline-block; }
.strat-tag-add:hover { color: var(--ink-strong); border-color: var(--ink-soft); }
.strat-tag-new { outline: none; }
.strat-tag-new:empty::before { content: "type…"; color: var(--ink-faint); }

/* Editable colour swatches — each swatch carries a hidden native colour input
   (which exposes a hex field), a remove ×, and a trailing "+ add swatch". */
.strat-swatch { position: relative; }
.strat-editing .strat-palette .strat-swatch { cursor: pointer; }
.strat-swatch-x { display: none; position: absolute; top: -7px; right: -7px; width: 16px; height: 16px; border: 1px solid var(--hairline); border-radius: 50%; background: #fff; color: var(--ink-soft); font-size: 11px; line-height: 1; padding: 0; cursor: pointer; z-index: 2; box-shadow: 0 1px 3px rgba(28,22,12,0.18); }
.strat-editing .strat-swatch-x { display: inline-flex; align-items: center; justify-content: center; }
.strat-swatch-x:hover { background: var(--urgent); color: #fff; border-color: var(--urgent); }

/* In-app hex picker (A1) — popover replacing the native colour input. */
.strat-hexpop { position: absolute; z-index: 200; width: 190px; padding: 12px; border-radius: var(--r-md); background: var(--lift-bg); border: 1px solid var(--hairline); box-shadow: 0 14px 38px rgba(28, 22, 12, 0.16), 0 2px 8px rgba(28, 22, 12, 0.08); }
.strat-hexpop-top { display: flex; align-items: center; gap: 7px; margin-bottom: 11px; }
.strat-hexpop-preview { width: 30px; height: 30px; flex: 0 0 auto; border-radius: 7px; border: 1px solid var(--hairline); box-shadow: 0 1px 2px rgba(28, 22, 12, 0.06) inset; }
.strat-hexpop-hash { font-family: var(--mono); font-size: 13px; color: var(--ink-muted); }
.strat-hexpop-input { flex: 1 1 auto; min-width: 0; font-family: var(--mono); font-size: 13px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-strong); background: #fff; border: 1px solid var(--hairline); border-radius: var(--r-sm); padding: 7px 9px; }
.strat-hexpop-input:focus { outline: none; border-color: var(--ink-soft); }
.strat-hexpop-palette { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
.strat-hexpop-chip { width: 100%; aspect-ratio: 1 / 1; border-radius: 6px; border: 1px solid var(--hairline); padding: 0; cursor: pointer; transition: transform 100ms; }
.strat-hexpop-chip:hover { transform: scale(1.12); }

/* Card attachments (C3) — file/link chips on marketing + fan cards. */
.strat-card-refs:empty { display: none; }
.strat-card-refs { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
.strat-ref-chip { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; padding: 5px 9px; border-radius: 999px; background: var(--bg-2); border: 1px solid var(--hairline); font: 500 11.5px/1 var(--sans); color: var(--ink-soft); text-decoration: none; transition: color 120ms, border-color 120ms; }
.strat-ref-chip:hover { color: var(--ink-strong); border-color: var(--ink-faint); }
.strat-ref-chip svg { width: 13px; height: 13px; flex: 0 0 auto; }
.strat-ref-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; }
.strat-ref-x { display: none; width: 15px; height: 15px; margin-left: 1px; border: 0; border-radius: 50%; background: rgba(28, 22, 12, 0.08); color: var(--ink-soft); font-size: 11px; line-height: 1; padding: 0; cursor: pointer; }
.strat-editing .strat-ref-x { display: inline-flex; align-items: center; justify-content: center; }
.strat-ref-x:hover { background: var(--urgent); color: #fff; }
.strat-refs-actions { display: inline-flex; gap: 6px; align-items: center; }
.strat-ref-add { font: 500 11.5px/1 var(--sans); color: var(--ink-muted); padding: 5px 9px; border-radius: 999px; border: 1px dashed var(--hairline); background: transparent; cursor: pointer; }
.strat-ref-add:hover { color: var(--ink-strong); border-color: var(--ink-faint); }

/* Shared add-reference popover (file or external URL) — replaces window.prompt; used by card attachments + moodboard. */
.strat-refpop { position: absolute; z-index: 200; width: 244px; padding: 12px; border-radius: var(--r-md); background: var(--lift-bg); border: 1px solid var(--hairline); box-shadow: 0 14px 38px rgba(28, 22, 12, 0.16), 0 2px 8px rgba(28, 22, 12, 0.08); }
.strat-refpop-file { width: 100%; justify-content: center; }
.strat-refpop-or { font: 500 10px/1 var(--mono); letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-faint); text-align: center; margin: 10px 0; }
.strat-refpop-urlrow { display: flex; gap: 6px; }
.strat-refpop-url { flex: 1 1 auto; min-width: 0; }
.strat-refpop-add { flex: 0 0 auto; }

/* Capped key-points list (#1A) — read mode shows the first 3 + a "View N more" toggle. */
.strat-list-capped > .strat-mk-item:nth-child(n + 4), .strat-list-capped > .strat-fan-item:nth-child(n + 4) { display: none; }
.strat-list-more { margin-top: 8px; font: 500 11.5px/1 var(--mono); letter-spacing: 0.02em; color: var(--ink-muted); background: none; border: 0; padding: 2px 0; cursor: pointer; }
.strat-list-more:hover { color: var(--ink-strong); }
/* Prose cap (#93 c) — long copy (creative-direction fields, sub-statements)
   clamps to a few lines in read mode with a "See more" toggle; the prose sibling
   of .strat-list-more. Edit mode shows full (the cap is removed by JS). */
.strat-prose-capped { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; line-clamp: 4; overflow: hidden; }
.strat-prose-more { margin-top: 6px; font: 500 11.5px/1 var(--mono); letter-spacing: 0.02em; color: var(--ink-muted); background: none; border: 0; padding: 2px 0; cursor: pointer; }
.strat-prose-more:hover { color: var(--ink-strong); }
.strat-add-swatch { display: none; width: 30px; height: 30px; border-radius: 7px; border: 1px dashed var(--ink-faint); background: transparent; color: var(--ink-muted); font-size: 16px; line-height: 1; cursor: pointer; align-items: center; justify-content: center; }
.strat-editing .strat-add-swatch { display: inline-flex; }
.strat-add-swatch:hover { color: var(--ink-strong); border-color: var(--ink-soft); }

/* Add-bullet affordance (Fan strategy lists) */
.strat-add-bullet { display: none; margin-top: 9px; font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); cursor: pointer; }
.strat-editing .strat-add-bullet { display: inline-block; }
.strat-add-bullet:hover { color: var(--ink-strong); }
.strat-fan-item { position: relative; }
.strat-bullet-x { display: none; margin-left: 8px; width: 14px; height: 14px; border: none; border-radius: 50%; background: rgba(28,22,12,0.12); color: var(--ink-soft); font-size: 11px; line-height: 1; padding: 0; cursor: pointer; flex-shrink: 0; align-self: center; }
.strat-editing .strat-bullet-x { display: inline-flex; align-items: center; justify-content: center; }
.strat-bullet-x:hover { background: var(--urgent); color: #fff; }

/* Per-track concept → track selector (links to campaign tracks) */
.strat-concept-track-select { display: none; min-width: 170px; max-width: 100%; font-family: var(--sans); font-size: 14px; font-weight: 600; color: var(--ink-strong); background: var(--bg); border: 1px solid rgba(28,22,12,0.16); border-radius: 6px; padding: 6px 9px; outline: none; }
.strat-concept.strat-editing .strat-concept-track-select { display: block; }
.strat-concept.strat-editing .strat-concept-name { display: none; }
/* Fan category dropdown (mirrors the concept track selector) — shows in edit mode in place of the eyebrow text */
.strat-fan-cat-select { display: none; min-width: 140px; max-width: 100%; font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; color: var(--ink-soft); background: var(--bg); border: 1px solid rgba(28,22,12,0.16); border-radius: 6px; padding: 5px 8px; outline: none; }
.strat-fan-card.strat-editing .strat-fan-cat-select { display: inline-block; }
.strat-fan-card.strat-editing .strat-fan-eyebrow { display: none; }

/* edit affordances added inline on cards that didn't ship with one */
.strat-aud-edit, .strat-concept-edit { margin-left: auto; font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); cursor: pointer; white-space: nowrap; transition: color 150ms; }
.strat-aud-edit:hover, .strat-concept-edit:hover { color: var(--ink-strong); }
.strat-spine-card { cursor: pointer; transition: box-shadow 150ms; }
.strat-spine-card:hover { box-shadow: var(--lift-shadow), 0 0 0 1px rgba(28,22,12,0.10); }
.strat-tgt-row { cursor: pointer; transition: box-shadow 150ms; }
.strat-tgt-row:hover { box-shadow: var(--lift-shadow), 0 0 0 1px rgba(28,22,12,0.10); }
.strat-positioning-edit { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); cursor: pointer; transition: color 150ms; }
.strat-positioning-edit:hover { color: var(--ink-strong); }

/* ─────────── Social strategy pillars — reusable swatch family ───────────
   A pillar's colour is one of the 4 --pillar-N tokens, selected by tone class
   p1..p4. Three sizes share the scale: a small dot (post row), a rounded
   gradient swatch (strategy cards / legend), and a left stripe (post card). */
.pillar-dot { width: 9px; height: 9px; border-radius: 3px; flex-shrink: 0; display: inline-block; }
.pillar-dot.p1 { background: var(--pillar-1); }
.pillar-dot.p2 { background: var(--pillar-2); }
.pillar-dot.p3 { background: var(--pillar-3); }
.pillar-dot.p4 { background: var(--pillar-4); }
.pillar-swatch { width: 20px; height: 20px; border-radius: 6px; flex-shrink: 0; }
.pillar-swatch.p1 { background: linear-gradient(135deg, color-mix(in oklab, var(--pillar-1) 88%, white), var(--pillar-1)); }
.pillar-swatch.p2 { background: linear-gradient(135deg, color-mix(in oklab, var(--pillar-2) 88%, white), var(--pillar-2)); }
.pillar-swatch.p3 { background: linear-gradient(135deg, color-mix(in oklab, var(--pillar-3) 88%, white), var(--pillar-3)); }
.pillar-swatch.p4 { background: linear-gradient(135deg, color-mix(in oklab, var(--pillar-4) 88%, white), var(--pillar-4)); }
.pillar-stripe.p1 { background: var(--pillar-1); }
.pillar-stripe.p2 { background: var(--pillar-2); }
.pillar-stripe.p3 { background: var(--pillar-3); }
.pillar-stripe.p4 { background: var(--pillar-4); }

/* Asset-tone thumbnails — shared with Campaign Assets. Ink / slate / oxblood
   washes over the warm page; .deep is the dark master tile. .empty is the
   dashed no-asset placeholder (auto-hide proof). */
.asset-tone { position: relative; overflow: hidden; background: linear-gradient(135deg, rgba(14,11,8,0.13), rgba(14,11,8,0.04)); }
.asset-tone.warm  { background: linear-gradient(135deg, rgba(var(--tone-warm-rgb),0.16), rgba(14,11,8,0.05)); }
.asset-tone.amber { background: linear-gradient(135deg, rgba(var(--tone-amber-rgb),0.20), rgba(14,11,8,0.05)); }
.asset-tone.cool  { background: linear-gradient(135deg, rgba(var(--tone-cool-rgb),0.18), rgba(14,11,8,0.05)); }
.asset-tone.soft  { background: linear-gradient(135deg, rgba(14,11,8,0.10), rgba(14,11,8,0.03)); }
.asset-tone.deep  { background: linear-gradient(135deg, rgba(14,11,8,0.82), rgba(14,11,8,0.62)); }
.asset-tone.empty { background: var(--bg); border: 1px dashed var(--brand-edge); }
.asset-tone.empty::after { content: ''; position: absolute; left: 50%; top: 50%; width: 26%; height: 26%; transform: translate(-50%,-50%); border: 1px dashed var(--brand-edge); border-radius: 3px; }

/* ═══════════════════════════════════════════════════════════════════
 *  End of bundled stylesheet.
 * ═══════════════════════════════════════════════════════════════════ */


/* ═════════════════════════════════════════════════════════════════
   DAY-SHEET DOCUMENT (shared) — the Show Brief sections rendered by
   js/live-brief-doc.js, consumed on the tour Brief tab and the
   standalone Live-Show-Brief page (16-mirror#show-brief-as-day-sheet).
   ═════════════════════════════════════════════════════════════════ */
/* Day timeline rows (show_schedule_items) */
.lsb-time-row { display: grid; grid-template-columns: 64px 1fr; gap: 12px; align-items: baseline; padding: 8px 0; border-bottom: 1px solid var(--hairline-soft); }
.lsb-time-row:last-child { border-bottom: 0; }
.lsb-time { font-family: var(--mono); font-size: 12px; font-weight: 600; color: var(--ink-strong); }
.lsb-time-label { font-family: var(--sans); font-size: 13px; font-weight: 600; color: var(--ink); }
.lsb-time-row.is-key .lsb-time { color: var(--artist-accent, var(--ink-strong)); }
.lsb-time-meta { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); margin-left: 8px; font-weight: 400; }
/* Show-day logistics rows */
.lsb-log-row { display: grid; grid-template-columns: 64px 1fr auto; gap: 12px; align-items: baseline; padding: 8px 0; border-bottom: 1px solid var(--hairline-soft); }
.lsb-log-row:last-child { border-bottom: 0; }
.lsb-log-kind { font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); }
.lsb-log-label { font-family: var(--sans); font-size: 13px; color: var(--ink); }
.lsb-log-sub { font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); margin-top: 2px; }
.lsb-log-status { font-family: var(--mono); font-size: 9px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--status-positive); }
.lsb-log-status.held { color: var(--status-warn); }
/* Key contacts — tap-to-call */
.lsb-contact { display: flex; align-items: center; gap: 11px; padding: 8px 0; border-bottom: 1px solid var(--hairline-soft); }
.lsb-contact:last-child { border-bottom: 0; }
.lsb-contact-av { width: 30px; height: 30px; border-radius: 50%; background: var(--bg-2); border: 1px solid var(--hairline); display: inline-flex; align-items: center; justify-content: center; font-family: var(--mono); font-size: 10px; color: var(--ink-soft); flex-shrink: 0; }
.lsb-contact-name { font-family: var(--sans); font-size: 13px; font-weight: 600; color: var(--ink-strong); }
.lsb-contact-role { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); margin-top: 1px; }
.lsb-contact-call { margin-left: auto; font-family: var(--mono); font-size: 11px; color: var(--ink-soft); text-decoration: none; padding: 5px 11px; border: 1px solid var(--hairline); border-radius: 999px; white-space: nowrap; }
.lsb-contact-call:hover { color: var(--ink-strong); border-color: var(--ink-strong); }
/* Setlist */
.lsb-setlist { font-family: var(--sans); font-size: 13.5px; color: var(--ink); line-height: 2; white-space: pre-line; }
/* Parent tour context panel */
.lsb-tour-panel { background: var(--bg-2); border: 1px solid var(--hairline); border-radius: var(--r-sm); padding: 13px 16px; display: flex; flex-direction: column; gap: 3px; }
.lsb-tour-name { font-family: var(--sans); font-size: 13px; font-weight: 700; color: var(--ink-strong); }
.lsb-tour-meta { font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); }
.lsb-empty { font-family: var(--sans); font-size: 12.5px; color: var(--ink-muted); padding: 4px 0; }


/* ╔══════ campaigns-v2.css ══════╗
 * Campaigns list redesign (#113) — attention-ordered release dashboard.
 * Design source: "Redesign Files/DayToDay - Campaigns.dc.html".
 * Upcoming hero command card → Planning drafts → Released archive.
 * Tokens only; accent = the bound artist accent (D2D_applyMood). */

/* Neutral cover scrim — ONE shared treatment for photo covers (#113 #114
   founder redirect): the Campaigns list hero (.cv2-hero-cover) and the
   Campaign Overview header (.cov2-head) carry the same neutral ink ramp,
   strong at the text edge fading across the photo, plus the text-protecting
   shade under the title/meta. No artist tint. Light sits lighter than the
   first cut (founder: too strong). ONE scrim for BOTH themes (#118 A5,
   founder 2026-07-09): the dark-specific overrides were deleted so dark ==
   light on the Commercial hero AND the Campaigns-list cover — the white
   cover text stays legible on the 0.56 strong end. */
:root {
  /* Second lightening pass (founder, 2026-07-08, on the real Unlovable cover):
     the scrim + bottom shade + photo desaturation STACK, so the first light
     values still read heavy. Strong end protects the title zone only; the
     photo side falls off to nearly clear. Shared by light + dark. */
  --cover-scrim-strong: rgba(14, 11, 8, 0.56);
  --cover-scrim-mid: rgba(14, 11, 8, 0.42);
  --cover-scrim-fade: rgba(14, 11, 8, 0.2);
  --cover-scrim-soft: rgba(14, 11, 8, 0.06);
  --cover-scrim-shade: rgba(14, 11, 8, 0.42);
}

.cv2-page { display: flex; flex-direction: column; gap: 22px; padding-top: 24px;
  /* accent as TEXT must survive light accents (acid/amber/moss) — deepen toward ink (amendment §2) */
  --accent-text: color-mix(in oklab, var(--artist-accent) 58%, var(--ink-strong)); }

/* heading */
.cv2-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; }
.cv2-title { margin: 0; font-family: var(--display); font-weight: var(--fw-page-title); font-size: 34px; letter-spacing: -0.025em; line-height: 1; color: var(--ink-strong); }

/* section rails */
.cv2-sec-head { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.cv2-sec-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--artist-accent); flex-shrink: 0; }
.cv2-sec-label { font-family: var(--mono); font-size: 11px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-strong); }
.cv2-sec-head.is-quiet .cv2-sec-label { color: var(--ink-soft); }
.cv2-sec-count { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); }
.cv2-sec-rule { flex: 1; height: 1px; background: var(--hairline); }

/* hero command card */
.cv2-hero { display: flex; background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--lift-shadow); cursor: pointer; }
.cv2-hero + .cv2-hero { margin-top: 14px; }
.cv2-hero-cover { position: relative; width: 300px; flex-shrink: 0; overflow: hidden; }
.cv2-hero-cover-img { position: absolute; inset: 0;
  background: linear-gradient(135deg, color-mix(in oklab, var(--cover-mood, var(--ink-strong)) 60%, var(--ink-strong)), var(--cover-mood, var(--ink-strong))) center / cover no-repeat; }
.cv2-hero.has-photo .cv2-hero-cover-img { background: var(--cover-photo) var(--cover-focal, center 30%) / cover no-repeat; filter: saturate(0.82) contrast(1.02); }
/* neutral scrim (the accent multiply tint is gone — #113 founder redirect): the
   shared ramp aimed at the bottom text zone, mirroring the Overview header's */
.cv2-hero-cover-tint { position: absolute; inset: 0; background: linear-gradient(0deg, var(--cover-scrim-strong) 0%, var(--cover-scrim-mid) 30%, var(--cover-scrim-fade) 62%, var(--cover-scrim-soft) 100%); }
.cv2-hero-cover-shade { position: absolute; inset: 0; background: linear-gradient(180deg, transparent 50%, var(--cover-scrim-shade) 100%); }
.cv2-hero-cover-grain { position: absolute; inset: 0; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='90' height='90'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); mix-blend-mode: overlay; opacity: 0.13; }
.cv2-hero-cover-body { position: relative; height: 100%; min-height: 216px; display: flex; flex-direction: column; justify-content: flex-end; padding: 18px; }
.cv2-hero-cover-meta { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(255,255,255,0.72); margin-bottom: 6px; }
.cv2-hero-cover-name { font-family: var(--serif); font-style: italic; font-weight: 500; font-size: 38px; letter-spacing: -0.02em; line-height: 0.95; color: #fff; overflow-wrap: anywhere; }
.cv2-hero-cover-out { margin-top: 9px; font-size: 13px; color: rgba(255,255,255,0.86); }
.cv2-hero-cover-out b { font-weight: 600; color: #fff; }

.cv2-hero-body { flex: 1; min-width: 0; padding: 22px 24px; display: flex; flex-direction: column; }
.cv2-hero-top { display: flex; align-items: flex-start; gap: 18px; }
.cv2-hero-top-main { flex: 1; min-width: 0; }
.cv2-kicker { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 8px; }
.cv2-next-name-row { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.cv2-next-name { font-family: var(--serif); font-style: italic; font-weight: 500; font-size: 24px; letter-spacing: -0.01em; color: var(--ink-strong); }
.cv2-reltag { padding: 2px 7px; border-radius: 5px; background: color-mix(in srgb, var(--artist-accent) 10%, transparent); color: var(--accent-text); font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; }
.cv2-count-pill { margin-top: 7px; display: inline-flex; align-items: center; gap: 8px; padding: 5px 12px; border-radius: 999px; background: color-mix(in srgb, var(--artist-accent) 6%, transparent); border: 1px solid color-mix(in srgb, var(--artist-accent) 16%, transparent); font-size: 13px; color: var(--ink); }
.cv2-count-pill b { font-weight: 600; color: var(--ink-strong); }
.cv2-count-pill .cv2-days { font-weight: 600; color: var(--accent-text); }

/* readiness ring (desktop) */
.cv2-ring-wrap { flex-shrink: 0; }
.cv2-ring { position: relative; width: 84px; height: 84px; }
.cv2-ring .cv2-ring-track { stroke: var(--hairline); }
.cv2-ring .cv2-ring-fill { stroke: var(--artist-accent); }
.cv2-ring-in { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.cv2-ring-pct { font-family: var(--display); font-weight: var(--fw-figure); font-size: 21px; letter-spacing: -0.02em; color: var(--ink-strong); }
.cv2-ring-cap { font-family: var(--mono); font-size: 7px; letter-spacing: 0.1em; color: var(--ink-muted); }

/* readiness bar (stacked layout) */
.cv2-ready-bar-wrap { display: none; margin-top: 14px; padding-top: 13px; border-top: 1px solid var(--hairline-soft); }
.cv2-ready-bar-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 7px; }
.cv2-ready-bar-count { font-size: 12.5px; color: var(--ink-soft); }
.cv2-ready-bar-count b { font-weight: 600; color: var(--ink-strong); }
.cv2-ready-bar { height: 7px; border-radius: 4px; background: var(--hairline); overflow: hidden; }
.cv2-ready-bar-fill { height: 100%; background: var(--artist-accent); }

/* hero detail rows */
.cv2-hero-row { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--hairline-soft); display: flex; align-items: center; gap: 12px; }
.cv2-hero-row-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); flex-shrink: 0; }
.cv2-hero-row-main { font-size: 13.5px; font-weight: 500; color: var(--ink-strong); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cv2-hero-row-meta { margin-left: auto; font-size: 12.5px; color: var(--ink-soft); flex-shrink: 0; }
/* readiness → count + ring only on the list card (#113); the item breakdown lives on the Overview */
.cv2-left { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--hairline-soft); }
.cv2-left-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); }
.cv2-hero-foot { display: flex; align-items: center; justify-content: flex-end; gap: 12px; margin-top: auto; padding-top: 18px; border-top: 1px solid var(--hairline-soft); }

/* two-column: planning + released */
.cv2-cols { display: flex; gap: 22px; align-items: flex-start; }
.cv2-col-plan { flex: 1; min-width: 0; }
.cv2-col-rel { flex: 1.25; min-width: 0; }

.cv2-plan-card { display: flex; align-items: flex-start; gap: 15px; background: var(--surface); border: 1px dashed var(--brand-edge); border-radius: var(--r-md); padding: 18px; text-decoration: none; color: inherit; cursor: pointer; box-shadow: 0 1px 2px rgba(28,22,12,0.03); }
.cv2-plan-card + .cv2-plan-card { margin-top: 12px; }
.cv2-plan-card:hover { border-color: var(--ink-faint); }
.cv2-plan-thumb { width: 56px; height: 56px; border-radius: var(--r-sm); flex-shrink: 0; background: repeating-linear-gradient(135deg, var(--bg-2) 0 7px, var(--bg) 7px 14px); border: 1px solid var(--hairline); }
.cv2-plan-thumb.has-photo { background: var(--cover-photo) var(--cover-focal, center 30%) / cover no-repeat; border: 0; }
.cv2-plan-main { flex: 1; min-width: 0; }
.cv2-plan-name-row { display: flex; align-items: center; gap: 9px; margin-bottom: 3px; flex-wrap: wrap; }
.cv2-plan-name { font-family: var(--serif); font-style: italic; font-weight: 500; font-size: 18px; color: var(--ink-strong); }
.cv2-tag-muted { padding: 2px 7px; border-radius: 5px; background: var(--brand-wash); color: var(--ink-muted); font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; }
.cv2-plan-type { font-size: 13px; color: var(--ink-soft); }
.cv2-plan-nodate { font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink-muted); margin-top: 6px; }
.cv2-plan-arrow { margin-left: auto; align-self: flex-start; color: var(--ink-faint); flex-shrink: 0; }
.cv2-plan-card:hover .cv2-plan-arrow { color: var(--ink-strong); }

.cv2-rel-list { background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md); box-shadow: 0 1px 2px rgba(28,22,12,0.04); overflow: hidden; }
.cv2-rel-row { display: flex; align-items: center; gap: 14px; padding: 14px 16px; border-bottom: 1px solid var(--hairline-soft); text-decoration: none; color: inherit; cursor: pointer; }
.cv2-rel-row:last-child { border-bottom: 0; }
.cv2-rel-row:hover { background: var(--bg); }
.cv2-rel-thumb { width: 48px; height: 48px; border-radius: var(--r-sm); flex-shrink: 0; background: linear-gradient(150deg, color-mix(in oklab, var(--cover-mood, var(--ink-strong)) 45%, var(--ink-strong)), color-mix(in oklab, var(--cover-mood, var(--ink-strong)) 72%, var(--ink-strong))); }
.cv2-rel-thumb.has-photo { background: var(--cover-photo) var(--cover-focal, center 30%) / cover no-repeat; }
.cv2-rel-main { flex: 1; min-width: 0; }
.cv2-rel-name-row { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.cv2-rel-name { font-family: var(--serif); font-style: italic; font-weight: 500; font-size: 15.5px; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cv2-rel-type { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); flex-shrink: 0; }
.cv2-rel-meta { font-size: 12.5px; color: var(--ink-muted); margin-top: 2px; }
.cv2-rel-pill { display: inline-flex; align-items: center; gap: 6px; padding: 4px 9px; border-radius: 7px; background: var(--status-positive-wash); flex-shrink: 0; }
.cv2-rel-pill-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--status-positive); }
.cv2-rel-pill-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--status-positive); }
.cv2-rel-recap { font-size: 12.5px; color: var(--ink-soft); display: inline-flex; align-items: center; gap: 5px; flex-shrink: 0; }
.cv2-rel-recap .chev-ic { width: 12px; height: 12px; }
.cv2-rel-row:hover .cv2-rel-recap { color: var(--ink-strong); }

/* empty states */
.cv2-empty-hero { position: relative; background: var(--surface); border: 1px dashed var(--brand-edge); border-radius: var(--r-lg); padding: 44px 36px; text-align: center; overflow: hidden; }
.cv2-empty-hero::before { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient(135deg, var(--hairline-soft) 0 9px, transparent 9px 18px); opacity: 0.4; }
.cv2-empty-hero-inner { position: relative; }
.cv2-empty-title { margin: 0; font-family: var(--display); font-weight: 600; font-size: 23px; letter-spacing: -0.02em; color: var(--ink-strong); }
.cv2-empty-copy { margin: 9px auto 20px; max-width: 380px; font-size: 14px; line-height: 1.5; color: var(--ink-soft); }
.cv2-ghost { border: 1px dashed var(--brand-edge); border-radius: var(--r-md); padding: 16px; font-size: 13px; color: var(--ink-muted); background: transparent; }

/* loading skeleton — painted until the live data reconciles; an empty state
   never shows mid-load (#114 founder redirect). Sizes are set inline per slot
   (the Home.html skeleton idiom). */
@keyframes cv2-shimmer { 0% { opacity: 0.55; } 50% { opacity: 1; } 100% { opacity: 0.55; } }
.cv2-skel { display: inline-block; border-radius: 5px; background: var(--brand-wash); animation: cv2-shimmer 1.6s ease-in-out infinite; }
.cv2-skel-cover { position: absolute; inset: 0; background: var(--bg-2); animation: cv2-shimmer 1.6s ease-in-out infinite; }

/* stacked layout */
@media (max-width: 920px) {
  .cv2-title { font-size: 26px; }
  .cv2-hero { flex-direction: column; }
  .cv2-hero-cover { width: auto; height: 152px; }
  .cv2-hero-cover-body { min-height: 0; }
  .cv2-hero-cover-name { font-size: 30px; }
  .cv2-ring-wrap { display: none; }
  .cv2-ready-bar-wrap { display: block; }
  .cv2-cols { flex-direction: column; }
  .cv2-col-plan, .cv2-col-rel { flex: none; width: 100%; }
}

/* ─────────────────────────────────────────────────────────────────────────
   Roster-table mobile pattern (#111) — SHARED across the list/table pages.
   Tasks is the first adopter; the same treatment is meant to be reused by
   Contacts, Deals, Finance, Music and Library so every roster-style table
   reflows the same way.

   The desktop table is a CSS grid whose columns each page sets per-render.
   Below the shell's phone breakpoint (720px, the width where the app shell
   itself swaps its rail for the mobile bottom bar) each row reflows to a
   stacked 2-line card: the leading control on the left spanning both lines,
   the primary cell (title) on line 1, and the secondary cells reflowed to a
   wrapping meta line beneath. No column truncation, nothing clipped off the
   right edge.

   Opt in per page by adding these hooks — desktop styling stays on the page,
   only the reflow lives here:
     .rtable          the table container (semantic marker)
     .rtable-head     the column-header row  → hidden on mobile
     .rtable-row      each row               → stays the page's grid on desktop
     .rtable-check    the leading control    → spans both card lines
     .rtable-primary  the primary/title cell → card line 1
     .rtable-trail    an optional trailing mark (avatar) → card line 1, right
     .rtable-meta     wraps the secondary cells → display:contents on desktop
                      (so the page grid is untouched), a wrapping meta line on
                      mobile. Give it the secondary cells only; keep the check,
                      primary and trailing mark as siblings of it.
   ───────────────────────────────────────────────────────────────────────── */
.rtable-meta { display: contents; }

/* Scoped under .rtable so the reflow reliably wins over each page's own base
   row/header rules (e.g. Tasks' .tv2-cols{display:grid}), which share the same
   specificity and would otherwise cascade later. grid-template-columns keeps
   !important to beat the per-row inline template the page renders. */
@media (max-width: 720px) {
  .rtable .rtable-head { display: none; }
  .rtable .rtable-row {
    grid-template-columns: 22px minmax(0, 1fr) auto !important;
    column-gap: 12px;
    row-gap: 6px;
    align-items: start;
  }
  .rtable .rtable-check { grid-column: 1; grid-row: 1 / span 2; align-self: start; }
  .rtable .rtable-primary { grid-column: 2; grid-row: 1; min-width: 0; }
  .rtable .rtable-trail { grid-column: 3; grid-row: 1; align-self: start; }
  .rtable .rtable-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    column-gap: 9px;
    row-gap: 3px;
    grid-column: 2 / -1;
    grid-row: 2;
    min-width: 0;
  }
  .rtable .rtable-meta > * { min-width: 0; max-width: 100%; }
}

/* ═══════════════ Campaign Overview v2 (#114) — cov2- ═══════════════
   The campaign's state-of-the-union: cover header + tab rail, next-release
   hero with the 5 readiness lanes (founder lock: lanes only, items live behind
   the checklist link), rollout, music pipeline, tasks / goals / budget.
   Tokens only; on-cover whites follow the hero-cover idiom (always on an ink
   scrim, both themes). */
.cov2-page { display: flex; flex-direction: column; gap: 16px; padding-top: 18px;
  --accent-text: color-mix(in oklab, var(--artist-accent) 58%, var(--ink-strong)); }

/* ── cover header ── */
.cov2-head { position: relative; border-radius: var(--r-lg); overflow: hidden; border: 1px solid var(--hairline); box-shadow: var(--lift-shadow); background: var(--ink-disc); }
.cov2-head-img { position: absolute; inset: 0; background: var(--cover-photo) var(--cover-focal, center 26%) / cover no-repeat; filter: saturate(0.82) contrast(1.02); }
/* the shared neutral cover-scrim tokens (defined in the campaigns-v2 block):
   ONE ramp for both themes now (#118 A5) */
/* The header is a SHORT WIDE band, so the 95° ramp's strong+mid zone covers
   proportionally far more photo than the list's tall vertical card — the same
   tokens read darker here (founder, 2026-07-08). The ramp compresses the dark
   zone to hug the title and starts the shade lower; both themes share it. */
.cov2-head-scrim { position: absolute; inset: 0; background: linear-gradient(95deg, var(--cover-scrim-strong) 0%, var(--cover-scrim-mid) 20%, var(--cover-scrim-fade) 44%, var(--cover-scrim-soft) 76%); }
.cov2-head-shade { position: absolute; inset: 0; background: linear-gradient(180deg, transparent 62%, var(--cover-scrim-shade) 100%); }
.cov2-head.is-draft .cov2-head-scrim { background: repeating-linear-gradient(135deg, rgba(255,255,255,0.035) 0 11px, transparent 11px 22px); }
.cov2-head.is-draft .cov2-head-shade { display: none; }
.cov2-head-in { position: relative; padding: 22px 24px 0; }
.cov2-head-top { display: flex; align-items: flex-start; gap: 20px; }
.cov2-head-main { flex: 1; min-width: 0; }
.cov2-eyebrow-row { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.cov2-eyebrow { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(255,255,255,0.72); }
.cov2-head-pill { display: inline-flex; align-items: center; padding: 3px 9px; border-radius: 999px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2); color: rgba(255,255,255,0.9); font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; }
.cov2-title { margin: 0; font-family: var(--font-hero); font-weight: var(--fw-display-hero); font-size: 46px; letter-spacing: -0.03em; line-height: 0.95; color: #fff; overflow-wrap: anywhere; }
.cov2-meta { margin-top: 11px; display: flex; flex-wrap: wrap; align-items: center; gap: 12px; font-size: 14.5px; color: rgba(255,255,255,0.9); }
.cov2-meta b { font-weight: 600; color: #fff; }
.cov2-meta-dim { color: rgba(255,255,255,0.66); }
.cov2-meta-dot { width: 4px; height: 4px; border-radius: 50%; background: rgba(255,255,255,0.45); flex-shrink: 0; }
.cov2-head-actions { display: flex; align-items: center; gap: 9px; flex-shrink: 0; }
.cov2-share-btn { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; background: rgba(255,255,255,0.92); border: none; border-radius: 10px; font: 600 13px/1 var(--sans); color: var(--accent-ink); cursor: pointer; box-shadow: var(--lift-shadow); }
.cov2-share-btn:hover { background: #fff; }
.cov2-menu-btn { width: 38px; height: 38px; border-radius: 10px; background: rgba(255,255,255,0.14); border: 1px solid rgba(255,255,255,0.24); color: #fff; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); font-size: 18px; line-height: 1; }
.cov2-tabs { display: flex; align-items: center; gap: 4px; margin-top: 20px; padding-bottom: 14px; overflow-x: auto; }
.cov2-tab { font-size: 13.5px; text-decoration: none; padding: 7px 15px; border-radius: 999px; background: rgba(255,255,255,0.08); color: rgba(255,255,255,0.74); white-space: nowrap; flex-shrink: 0; }
.cov2-tab.is-active { background: rgba(255,255,255,0.92); color: var(--accent-ink); font-weight: 600; }
/* (the disabled-rail-tab idiom retired 2026-07-16 — the founder's no-filler
   rule: a tab whose page doesn't exist is omitted + ticketed, never 'soon') */

/* ── shared card chrome (pearl, matching Home/Artist dashboard cards) ── */
.cov2-card { background: var(--surface-pearl) padding-box, var(--pearl-edge) border-box; border: 1px solid transparent; border-radius: var(--r-lg); position: relative; overflow: hidden;
  box-shadow: var(--pearl-top), 0 1px 2px rgba(28,22,12,0.04), 0 8px 20px -10px rgba(28,22,12,0.14); padding: 20px; }
.cov2-card::before { content: ''; position: absolute; inset: 0; border-radius: inherit; background: var(--pearl-sheen); pointer-events: none; z-index: 0; }
.cov2-card > * { position: relative; z-index: 1; }
.cov2-card-head { display: flex; align-items: center; gap: 9px; margin-bottom: 14px; }
.cov2-card-title { font-family: var(--font-title); font-weight: var(--fw-title); font-size: 16px; letter-spacing: -0.01em; color: var(--ink-strong); }
.cov2-card-meta { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); }
.cov2-card-link { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--ink-soft); text-decoration: none; background: none; border: none; padding: 0; cursor: pointer; font-family: var(--sans); }
.cov2-card-link:hover { color: var(--ink-strong); }
.cov2-card-link .chev-ic { width: 13px; height: 13px; }
.cov2-ghost-line { font-size: 13px; color: var(--ink-soft); padding: 6px 0 2px; }
/* loading skeleton — a section paints this until its data marker lands; empty
   copy only renders loaded-and-genuinely-empty (#114 founder redirect) */
.cov2-skel { display: inline-block; border-radius: 5px; background: var(--brand-wash); animation: cv2-shimmer 1.6s ease-in-out infinite; }

/* ── hero · next release ── */
.cov2-hero { display: flex; padding: 0; }
.cov2-hero-main { flex: 1; min-width: 0; padding: 22px; display: flex; flex-direction: column; }
.cov2-kicker { font-family: var(--mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 13px; }
.cov2-rel-row { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 7px; }
.cov2-rel-name { font-family: var(--serif); font-style: italic; font-weight: 500; font-size: 28px; letter-spacing: -0.01em; color: var(--ink-strong); }
.cov2-reltag { padding: 2px 7px; border-radius: 5px; background: color-mix(in srgb, var(--artist-accent) 10%, transparent); color: var(--accent-text); font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; }
.cov2-rel-date { font-size: 14.5px; color: var(--ink-soft); }
.cov2-rel-date b { font-weight: 600; color: var(--ink-strong); }
.cov2-rel-context { margin-top: 8px; font-size: 13px; color: var(--ink-muted); }
.cov2-rel-context em { font-style: italic; font-family: var(--serif); color: var(--ink-soft); }
.cov2-hero-foot { margin-top: auto; display: flex; align-items: center; gap: 16px; padding-top: 22px; }
.cov2-ring { position: relative; width: 96px; height: 96px; flex-shrink: 0; }
.cov2-ring .track { stroke: var(--hairline); }
.cov2-ring .fill { stroke: var(--artist-accent); }
.cov2-ring-in { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.cov2-ring-pct { font-family: var(--font-figure); font-variant-numeric: tabular-nums; font-weight: var(--fw-figure); font-size: 23px; letter-spacing: -0.02em; color: var(--ink-strong); }
.cov2-ring-cap { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; color: var(--ink-muted); }
.cov2-left-line { font-size: 14.5px; color: var(--ink-strong); font-weight: 600; }
.cov2-left-line span { color: var(--ink-muted); font-weight: 400; }
.cov2-hero-side { width: 404px; flex-shrink: 0; border-left: 1px solid var(--hairline); background: var(--bg-2); padding: 22px; display: flex; flex-direction: column; }
.cov2-side-head { display: flex; align-items: center; gap: 9px; margin-bottom: 14px; }
.cov2-side-count { margin-left: auto; font-family: var(--mono); font-size: 11px; color: var(--ink-soft); }
.cov2-lanes { display: flex; flex-direction: column; gap: 11px; }
.cov2-lane { display: flex; align-items: center; gap: 10px; }
.cov2-lane-label { font-size: 13px; color: var(--ink-soft); width: 128px; flex-shrink: 0; }
.cov2-lane-bar { flex: 1; height: 6px; border-radius: 3px; background: var(--hairline); overflow: hidden; }
.cov2-lane-fill { height: 100%; }
.cov2-lane-fill.is-done { background: var(--status-positive); }
.cov2-lane-fill.is-part { background: var(--status-warn); }
.cov2-lane-count { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); width: 28px; text-align: right; }
.cov2-checklist-btn { display: flex; align-items: center; justify-content: center; gap: 7px; width: 100%; margin-top: 16px; padding: 9px; border-radius: 10px; border: 1px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); background: var(--surface); font: 600 12.5px/1 var(--sans); color: var(--ink-strong); cursor: pointer; text-decoration: none; }
.cov2-checklist-btn:hover { border-color: var(--ink-faint); }

/* ── rollout (horizontal, project campaigns) ── */
.cov2-roll { position: relative; padding: 6px 0 2px; overflow-x: auto; }
.cov2-roll-line { position: absolute; left: 0; right: 0; top: 13px; height: 2px; background: var(--hairline); }
.cov2-roll-fill { position: absolute; left: 0; top: 13px; height: 2px; background: var(--artist-accent); }
.cov2-roll-grid { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(150px, 1fr); position: relative; }
.cov2-roll-dot { width: 12px; height: 12px; border-radius: 50%; background: var(--surface); border: 2px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); box-sizing: border-box; }
.cov2-roll-item.is-past .cov2-roll-dot { background: var(--ink-faint); border-color: var(--ink-faint); }
.cov2-roll-item.is-next .cov2-roll-dot { width: 14px; height: 14px; background: var(--artist-accent); border: none; box-shadow: 0 0 0 4px color-mix(in srgb, var(--artist-accent) 14%, transparent); }
.cov2-roll-body { margin-top: 12px; padding-right: 14px; }
.cov2-roll-date { font-family: var(--mono); font-size: 10px; color: var(--ink-soft); font-weight: 600; text-transform: uppercase; }
.cov2-roll-item.is-next .cov2-roll-date { color: var(--ink-strong); }
.cov2-roll-name { font-size: 14px; font-weight: 600; color: var(--ink-strong); margin-top: 2px; overflow-wrap: anywhere; }
.cov2-roll-type { font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; color: var(--ink-muted); margin-top: 3px; text-transform: uppercase; }
.cov2-roll-item.is-next .cov2-roll-type { color: var(--accent-text); }

/* ── key dates (vertical, single campaigns) ── */
.cov2-kd { position: relative; }
.cov2-kd-line { position: absolute; left: 6px; top: 6px; bottom: 6px; width: 2px; background: var(--hairline); }
.cov2-kd-item { display: flex; gap: 14px; padding-bottom: 15px; }
.cov2-kd-item:last-child { padding-bottom: 0; }
.cov2-kd-dot { position: relative; z-index: 1; width: 13px; height: 13px; border-radius: 50%; background: var(--surface); border: 2px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); box-sizing: border-box; flex-shrink: 0; margin-top: 1px; }
.cov2-kd-item.is-past .cov2-kd-dot { background: var(--ink-faint); border-color: var(--ink-faint); }
.cov2-kd-item.is-next .cov2-kd-dot { width: 15px; height: 15px; background: var(--artist-accent); border: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--artist-accent) 14%, transparent); }
.cov2-kd-date { font-family: var(--mono); font-size: 10px; color: var(--ink-soft); font-weight: 600; text-transform: uppercase; }
.cov2-kd-item.is-next .cov2-kd-date { color: var(--accent-text); }
.cov2-kd-name { font-size: 14px; font-weight: 600; color: var(--ink-strong); margin-top: 2px; }
.cov2-kd-type { font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; color: var(--ink-muted); margin-top: 3px; text-transform: uppercase; }
.cov2-kd-item.is-next .cov2-kd-type { color: var(--accent-text); }

/* ── music pipeline ── */
.cov2-mus-rail { position: relative; margin-bottom: 15px; }
.cov2-mus-line { position: absolute; left: 16.6%; right: 16.6%; top: 8px; height: 2px; background: var(--hairline); }
.cov2-mus-cols { display: grid; grid-template-columns: repeat(3, 1fr); position: relative; }
.cov2-mus-col { text-align: center; }
.cov2-stage-dot { display: inline-block; width: 14px; height: 14px; border-radius: 50%; background: var(--surface); border: 2.5px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); box-sizing: border-box; }
.cov2-mus-col.tone-mix .cov2-stage-dot { border-color: var(--status-warn); }
.cov2-mus-col.tone-master .cov2-stage-dot { border-color: var(--status-positive); }
.cov2-mus-col.is-current .cov2-stage-dot { width: 18px; height: 18px; border: none; margin-bottom: -2px; }
.cov2-mus-col.is-current.tone-demo .cov2-stage-dot { background: var(--ink-faint); box-shadow: 0 0 0 4px color-mix(in srgb, var(--ink-faint) 14%, transparent); }
.cov2-mus-col.is-current.tone-mix .cov2-stage-dot { background: var(--status-warn); box-shadow: 0 0 0 4px color-mix(in srgb, var(--status-warn) 14%, transparent); }
.cov2-mus-col.is-current.tone-master .cov2-stage-dot { background: var(--status-positive); box-shadow: 0 0 0 4px color-mix(in srgb, var(--status-positive) 14%, transparent); }
.cov2-stage-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; margin-top: 8px; }
.cov2-mus-col.tone-mix .cov2-stage-label { color: var(--status-warn); }
.cov2-mus-col.tone-master .cov2-stage-label { color: var(--status-positive); }
.cov2-stage-count { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); margin-top: 3px; }
.cov2-chips { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; align-items: start; }
.cov2-chip-col { display: flex; flex-direction: column; gap: 7px; align-items: center; min-width: 0; }
.cov2-chip { display: inline-flex; align-items: center; gap: 7px; max-width: 100%; padding: 6px 11px 6px 8px; background: var(--surface); border: 1px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); border-radius: 999px; }
.cov2-chip-disc { width: 16px; height: 16px; border-radius: 50%; background: var(--hairline); display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; color: var(--ink-soft); }
.cov2-chip.tone-mix .cov2-chip-disc { background: color-mix(in srgb, var(--status-warn) 16%, transparent); color: var(--status-warn); }
.cov2-chip.tone-master { background: color-mix(in srgb, var(--status-positive) 7%, transparent); border-color: color-mix(in srgb, var(--status-positive) 22%, transparent); }
.cov2-chip.tone-master .cov2-chip-disc { background: var(--status-positive); color: var(--bg); }
.cov2-chip-name { font-family: var(--serif); font-style: italic; font-size: 13px; font-weight: 500; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cov2-chip-state { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; color: var(--status-warn); margin-left: 2px; text-transform: uppercase; }
.cov2-chip-more { font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; color: var(--ink-muted); text-align: center; padding: 5px; }

/* ── bottom row: tasks · goals · budget ── */
.cov2-row3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; align-items: start; }
.cov2-count-disc { min-width: 22px; height: 22px; padding: 0 7px; border-radius: 999px; background: var(--ink-disc); color: var(--on-ink-strong); display: inline-flex; align-items: center; justify-content: center; font-weight: 700; font-size: 11.5px; font-variant-numeric: tabular-nums; }
.cov2-late { font-family: var(--mono); font-size: 10px; color: var(--urgent); letter-spacing: 0.04em; }
.cov2-task-row { display: flex; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--hairline-soft); cursor: pointer; text-align: left; width: 100%; background: none; border-left: none; border-right: none; border-top: none; font-family: var(--sans); }
.cov2-task-row:last-child { border-bottom: none; }
.cov2-task-bar { width: 3px; align-self: stretch; border-radius: 2px; background: var(--ink-faint); flex-shrink: 0; }
.cov2-task-row.is-late .cov2-task-bar { background: var(--urgent); }
.cov2-task-row.is-soon .cov2-task-bar { background: var(--artist-accent); }
.cov2-task-title { font-size: 13px; font-weight: var(--fw-title-light); color: var(--ink); }
.cov2-task-meta { font-size: 11.5px; color: var(--ink-muted); margin-top: 2px; }
.cov2-goal { margin-bottom: 14px; }
.cov2-goal:last-child { margin-bottom: 0; }
.cov2-goal-head { display: flex; align-items: center; gap: 7px; margin-bottom: 7px; }
.cov2-goal-name { font-size: 13px; font-weight: 600; color: var(--ink-strong); flex: 1; min-width: 0; }
.cov2-goal-count { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); font-variant-numeric: tabular-nums; }
.cov2-goal-bar { height: 6px; border-radius: 3px; background: var(--hairline); overflow: hidden; }
.cov2-goal-fill { height: 100%; background: var(--artist-accent); }
.cov2-budget-fig { display: flex; align-items: baseline; gap: 9px; margin-bottom: 11px; }
.cov2-budget-num { font-family: var(--font-figure); font-variant-numeric: tabular-nums; font-weight: var(--fw-figure); font-size: 25px; letter-spacing: -0.02em; color: var(--ink-strong); }
.cov2-budget-of { font-size: 12.5px; color: var(--ink-muted); }
.cov2-budget-bar { height: 7px; border-radius: 4px; background: var(--hairline); overflow: hidden; }
.cov2-budget-fill { height: 100%; background: var(--ink-strong); }
.cov2-areas { margin-top: 15px; padding-top: 13px; border-top: 1px solid var(--hairline-soft); display: flex; flex-direction: column; gap: 9px; }
.cov2-areas-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 1px; }
.cov2-area { display: flex; align-items: center; gap: 9px; }
.cov2-area-name { font-size: 12px; color: var(--ink-soft); width: 86px; flex-shrink: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cov2-area-bar { flex: 1; height: 5px; border-radius: 3px; background: var(--hairline); overflow: hidden; }
.cov2-area-fill { height: 100%; background: var(--ink-strong); }
.cov2-area-amt { font-family: var(--mono); font-size: 10px; color: var(--ink-soft); width: 44px; text-align: right; font-variant-numeric: tabular-nums; }

/* ── first-run setup ── */
.cov2-setup { padding: 26px 26px 24px; }
.cov2-setup-head { max-width: 560px; margin-bottom: 22px; }
.cov2-setup-title { margin: 0; font-family: var(--font-title); font-weight: var(--fw-title); font-size: 24px; letter-spacing: -0.02em; color: var(--ink-strong); }
.cov2-setup-copy { margin: 8px 0 0; font-size: 14.5px; line-height: 1.5; color: var(--ink-soft); }
.cov2-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 13px; }
.cov2-step { border: 1px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); border-radius: 13px; padding: 17px; }
.cov2-step.is-active { border-color: color-mix(in srgb, var(--artist-accent) 28%, transparent); background: color-mix(in srgb, var(--artist-accent) 4%, transparent); }
.cov2-step-head { display: flex; align-items: center; gap: 9px; margin-bottom: 11px; }
.cov2-step-num { width: 24px; height: 24px; border-radius: 50%; background: var(--hairline); color: var(--ink-muted); display: inline-flex; align-items: center; justify-content: center; font-family: var(--mono); font-size: 12px; font-weight: 600; flex-shrink: 0; }
.cov2-step.is-active .cov2-step-num { background: var(--artist-accent); color: var(--accent-ink); }
.cov2-step-title { font-family: var(--font-title); font-weight: var(--fw-title); font-size: 16px; letter-spacing: -0.01em; color: var(--ink-soft); }
.cov2-step.is-active .cov2-step-title { color: var(--ink-strong); }
.cov2-step-copy { margin: 0 0 14px; font-size: 13px; line-height: 1.45; color: var(--ink-muted); }
.cov2-ghost-sec-head { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.cov2-ghost-sec-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-muted); font-weight: 600; }
.cov2-ghost-sec-rule { flex: 1; height: 1px; background: var(--hairline-soft); }
.cov2-ghosts { display: grid; grid-template-columns: repeat(4, 1fr); gap: 13px; }
.cov2-ghost-card { border: 1px dashed color-mix(in srgb, var(--ink-faint) 55%, transparent); border-radius: 14px; padding: 16px; }
.cov2-ghost-title { font-size: 13px; font-weight: 600; color: var(--ink-muted); margin-bottom: 9px; }
.cov2-ghost-copy { font-size: 12.5px; color: var(--ink-muted); }

/* two-col mid row (single campaigns: key dates + music) */
.cov2-mid2 { display: grid; grid-template-columns: 1.5fr 1fr; gap: 16px; align-items: start; }

/* ── responsive ── */
@media (max-width: 1080px) {
  .cov2-hero { flex-direction: column; }
  .cov2-hero-side { width: auto; border-left: none; border-top: 1px solid var(--hairline); }
  .cov2-row3 { grid-template-columns: 1fr; }
  .cov2-mid2 { grid-template-columns: 1fr; }
  .cov2-steps { grid-template-columns: 1fr; }
  .cov2-ghosts { grid-template-columns: repeat(2, 1fr); }
  .cov2-title { font-size: 38px; }
}

/* ═══════════════ Campaign Strategy v2 (#116) — strat2- ═══════════════
   The living brief: objective + "Plan complete" meter (= release readiness,
   the Overview ring's number — founder ruling), live Targets (⇄ Goals),
   Timeline (feeds Plan), Marketing with create-and-link chips (drop a key
   date on the Plan / a budget line into Commercial), Fan strategy,
   Positioning (concept + creative + per-track + audiences, all editable
   in place), Moodboard / Social cross-links. Reuses the cov2- campaign
   cover header + card chrome so the campaign shell is ONE treatment.
   Namespaced strat2- (the bare .strat-* classes are shared with
   Live-Tour-Strategy — never restyled here). Tokens only. The soft card
   tint is color-mix(--bg-2 50%, --surface): the polish round stepped the
   full --bg-2 beige down to half strength (founder redirect). */

/* ── objective card ── */
.strat2-obj-head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; flex-wrap: wrap; }
.strat2-eyebrow { font-family: var(--mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-muted); }
.strat2-sync { display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); font-size: 10px; color: var(--status-positive); }
.strat2-obj-actions { margin-left: auto; display: inline-flex; align-items: center; gap: 9px; }
.strat2-btn { display: inline-flex; align-items: center; gap: 6px; padding: 7px 13px; border-radius: 9px; border: 1px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); background: var(--surface); font: 500 12.5px/1 var(--sans); color: var(--ink-soft); cursor: pointer; }
.strat2-btn:hover { border-color: var(--ink-faint); color: var(--ink-strong); }
.strat2-btn-primary { border: none; background: var(--ink-disc); color: var(--on-ink-strong); font-weight: 600; }
/* #116 item 4 — the shared .strat2-btn:hover flips colour to --ink-strong, which
   on the dark --ink-disc fill read black-on-black on the primary. Re-assert the
   on-ink colour and lift the fill slightly. Dark-key primary style is used by the
   quick-add popover + Plan's Full-timeline overlay too (keep this correct). */
.strat2-btn-primary:hover { color: var(--on-ink-strong); background: var(--ink-disc); box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--ink-strong) 40%, transparent); }
.strat2-btn-primary:disabled { background: color-mix(in srgb, var(--ink-strong) 22%, transparent); color: var(--on-ink-strong); cursor: default; box-shadow: none; }
.strat2-btn-danger { margin-left: auto; color: var(--urgent); }
.strat2-btn-danger:hover { color: var(--urgent); border-color: color-mix(in srgb, var(--urgent) 45%, transparent); }
/* Objective line — stepped down from the export's 27px display size (founder
   redirect: real long text "looks gigantic"). Short lines keep a modest
   pull-quote look; long lines (.is-long, >160 chars) read at body altitude. */
.strat2-obj-line { margin: 0 0 20px; font-family: var(--font-hero); font-weight: var(--fw-display-hero); font-size: 21px; letter-spacing: -0.015em; line-height: 1.35; max-width: 820px; text-wrap: pretty; color: var(--ink-strong); }
.strat2-obj-line.is-long { font-family: var(--sans); font-weight: 500; font-size: 15.5px; letter-spacing: 0; line-height: 1.55; max-width: 720px; }
.strat2-obj-well { border: 1px dashed color-mix(in srgb, var(--artist-accent) 34%, transparent); border-radius: 12px; padding: 18px; background: color-mix(in srgb, var(--artist-accent) 3%, transparent); cursor: text; margin-bottom: 13px; }
.strat2-obj-well-line { font-family: var(--font-hero); font-weight: var(--fw-display-hero); font-size: 21px; letter-spacing: -0.01em; line-height: 1.3; color: var(--ink-muted); }
.strat2-obj-caret { display: inline-block; width: 2px; height: 20px; background: var(--artist-accent); margin-left: 2px; vertical-align: -3px; }
.strat2-obj-help { margin: 0; font-size: 13px; line-height: 1.5; color: var(--ink-soft); max-width: 560px; }
/* "Plan complete" meter row (release readiness — the Overview ring's number) */
.strat2-obj-foot { display: flex; align-items: center; justify-content: flex-end; gap: 10px; padding-top: 18px; border-top: 1px solid var(--hairline); }
.strat2-meter-label { font-size: 12.5px; color: var(--ink-muted); }
.strat2-meter { width: 120px; height: 6px; border-radius: 3px; background: var(--hairline); overflow: hidden; }
.strat2-meter-fill { height: 100%; background: var(--status-positive); }
.strat2-meter-pct { font-family: var(--mono); font-size: 11px; font-weight: 600; color: var(--ink-strong); font-variant-numeric: tabular-nums; }

/* ── section chrome (inside cov2-card) ── */
.strat2-sec-head { display: flex; align-items: center; gap: 11px; margin-bottom: 5px; flex-wrap: wrap; }
.strat2-sec-title { font-family: var(--font-title); font-weight: var(--fw-title); font-size: 19px; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat2-sec-tag { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); }
.strat2-sec-link { margin-left: auto; font-size: 12.5px; color: var(--ink-soft); cursor: pointer; text-decoration: none; background: none; border: none; padding: 0; font-family: var(--sans); }
.strat2-sec-link:hover { color: var(--ink-strong); }
/* quiet in-section add/edit affordances (themes, palette, fold sub-sections) */
.strat2-addrow { margin-top: 10px; }
.strat2-add-link { border: none; background: none; padding: 0; font: 500 12.5px/1.2 var(--sans); color: var(--ink-soft); cursor: pointer; }
.strat2-add-link:hover { color: var(--ink-strong); }
.strat2-editable { cursor: pointer; }
.strat2-editable:hover { border-color: var(--ink-faint); }
.strat2-sec-sub { font-size: 12.5px; color: var(--ink-muted); margin-bottom: 18px; }

/* ── targets ── */
.strat2-tgts { display: grid; grid-template-columns: 1fr 1fr; gap: 16px 28px; }
.strat2-tgt-top { display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px; min-width: 0; }
.strat2-tgt-name { font-size: 14px; font-weight: 600; color: var(--ink-strong); }
.strat2-tgt-date { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); }
.strat2-tgt-cur { margin-left: auto; font-family: var(--font-figure); font-variant-numeric: tabular-nums; font-weight: var(--fw-figure); font-size: 17px; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat2-tgt-of { font-size: 12px; color: var(--ink-muted); }
.strat2-tgt-bar { height: 8px; border-radius: 4px; background: var(--hairline); overflow: hidden; }
.strat2-tgt-fill { height: 100%; }
.strat2-tgt-fill.is-good { background: var(--status-positive); }
.strat2-tgt-fill.is-part { background: var(--status-warn); }
.strat2-tgt-fill.is-none { background: var(--urgent); }
.strat2-tgt-pending { font-size: 12px; color: var(--ink-muted); }

/* ── timeline ── */
.strat2-spine { position: relative; padding-left: 4px; }
.strat2-spine-line { position: absolute; left: 11px; top: 6px; bottom: 6px; width: 2px; background: var(--hairline); }
.strat2-tl-item { display: flex; gap: 16px; margin-bottom: 15px; }
.strat2-tl-item:last-child { margin-bottom: 0; }
.strat2-tl-dot { width: 16px; height: 16px; border-radius: 50%; background: var(--surface); border: 2px solid color-mix(in srgb, var(--ink-faint) 65%, transparent); z-index: 1; flex-shrink: 0; margin-top: 2px; box-sizing: border-box; }
.strat2-tl-item.is-past .strat2-tl-dot { background: var(--ink-faint); border-color: var(--ink-faint); }
.strat2-tl-item.is-next .strat2-tl-dot { background: var(--artist-accent); border-color: var(--artist-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--artist-accent) 14%, transparent); }
.strat2-tl-main { flex: 1; min-width: 0; }
.strat2-tl-top { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.strat2-tl-date { font-family: var(--mono); font-size: 11px; font-weight: 600; color: var(--ink-strong); text-transform: uppercase; }
.strat2-tl-name { font-size: 14.5px; font-weight: var(--fw-title-light); color: var(--ink); }
.strat2-tl-pill { margin-left: auto; padding: 2px 9px; border-radius: 999px; background: color-mix(in srgb, var(--ink-faint) 20%, transparent); color: var(--ink-soft); font-family: var(--mono); font-size: 10px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; }
.strat2-tl-item.is-next .strat2-tl-pill { background: color-mix(in srgb, var(--artist-accent) 12%, transparent); color: var(--accent-text); }
.strat2-tl-body { margin: 4px 0 0; font-size: 13px; color: var(--ink-soft); line-height: 1.5; }

/* ── marketing ── */
.strat2-mk-row { display: flex; gap: 11px; align-items: flex-start; padding: 9px 0; border-bottom: 1px solid var(--hairline-soft); }
.strat2-mk-row:last-child { border-bottom: none; }
.strat2-mk-dot { width: 7px; height: 7px; border-radius: 2px; background: var(--ink-strong); margin-top: 6px; flex-shrink: 0; }
.strat2-mk-main { flex: 1; min-width: 0; }
.strat2-mk-top { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.strat2-mk-name { font-size: 13.5px; font-weight: 600; color: var(--ink-strong); }
.strat2-mk-meta { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); }
.strat2-mk-chips { margin-left: auto; display: inline-flex; align-items: center; gap: 7px; flex-shrink: 0; flex-wrap: wrap; }
.strat2-mk-chip { display: inline-flex; align-items: center; gap: 5px; font-family: var(--mono); font-size: 10px; color: var(--ink-soft); background: color-mix(in srgb, var(--bg-2) 50%, var(--surface)); border: 1px solid color-mix(in srgb, var(--ink-faint) 45%, transparent); padding: 3px 8px; border-radius: 6px; cursor: pointer; flex-shrink: 0; text-decoration: none; }
.strat2-mk-chip:hover { border-color: var(--ink-faint); color: var(--ink-strong); }
.strat2-mk-chip.is-act { color: var(--ink-strong); }
.strat2-mk-body { font-size: 12.5px; color: var(--ink-soft); line-height: 1.45; margin-top: 2px; }
.strat2-split { margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--hairline); }
.strat2-split-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 10px; }
.strat2-split-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); }
.strat2-split-total { font-family: var(--mono); font-size: 11px; color: var(--ink-strong); font-weight: 600; margin-left: auto; font-variant-numeric: tabular-nums; }
.strat2-split-bar { display: flex; height: 9px; border-radius: 5px; overflow: hidden; gap: 2px; margin-bottom: 9px; }
.strat2-split-seg { min-width: 3px; }
.strat2-split-seg:nth-child(3n+1) { background: var(--ink-strong); }
.strat2-split-seg:nth-child(3n+2) { background: var(--ink-soft); }
.strat2-split-seg:nth-child(3n+3) { background: var(--ink-muted); }
.strat2-split-legend { display: flex; gap: 18px; flex-wrap: wrap; }
.strat2-split-key { display: flex; align-items: center; gap: 6px; }
.strat2-split-swatch { width: 8px; height: 8px; border-radius: 2px; }
.strat2-split-key:nth-child(3n+1) .strat2-split-swatch { background: var(--ink-strong); }
.strat2-split-key:nth-child(3n+2) .strat2-split-swatch { background: var(--ink-soft); }
.strat2-split-key:nth-child(3n+3) .strat2-split-swatch { background: var(--ink-muted); }
.strat2-split-name { font-size: 12px; color: var(--ink-soft); }
.strat2-split-amt { font-family: var(--mono); font-size: 10.5px; color: var(--ink-strong); font-variant-numeric: tabular-nums; }

/* ── fan strategy ── */
.strat2-fan-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
/* small tint matching the positioning cards (founder redirect: the two sections agree) */
.strat2-fan-card { border: 1px solid color-mix(in srgb, var(--ink-faint) 45%, transparent); border-radius: 12px; padding: 16px 17px; background: color-mix(in srgb, var(--bg-2) 50%, var(--surface)); }
.strat2-fan-head { display: flex; align-items: baseline; gap: 9px; margin-bottom: 11px; }
.strat2-fan-head .strat2-card-edit { margin-left: auto; }
.strat2-fan-eyebrow { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); }
.strat2-fan-title { margin: 0 0 11px; font-size: 14.5px; font-weight: 700; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat2-fan-desc { margin: -6px 0 11px; font-size: 12px; color: var(--ink-muted); line-height: 1.45; }
.strat2-fan-list { display: flex; flex-direction: column; gap: 8px; }
.strat2-fan-item { position: relative; padding-left: 18px; font-size: 12.5px; color: var(--ink-soft); line-height: 1.45; }
.strat2-fan-item::before { content: ''; position: absolute; left: 2px; top: 7px; width: 8px; height: 3px; border-radius: 2px; background: var(--status-positive); }

/* ── positioning ── */
.strat2-anchor { margin: 0 0 10px; font-family: var(--font-hero); font-weight: var(--fw-display-hero); font-size: 23px; letter-spacing: -0.02em; line-height: 1.2; max-width: 720px; text-wrap: pretty; color: var(--ink-strong); }
.strat2-pos-body { margin: 0 0 20px; font-size: 14px; line-height: 1.6; color: var(--ink-soft); max-width: 740px; text-wrap: pretty; }
.strat2-themes { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.strat2-theme { border: 1px solid color-mix(in srgb, var(--ink-faint) 45%, transparent); border-radius: 11px; padding: 13px 15px; background: color-mix(in srgb, var(--bg-2) 50%, var(--surface)); }
.strat2-theme-num { font-family: var(--mono); font-size: 10px; color: var(--accent-text); margin-bottom: 6px; }
.strat2-theme-title { margin: 0 0 4px; font-size: 13.5px; font-weight: 700; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat2-theme-body { margin: 0; font-size: 12px; line-height: 1.45; color: var(--ink-soft); }
.strat2-pos-grid { display: grid; grid-template-columns: 1.1fr 1fr; gap: 24px; margin-top: 16px; padding-top: 18px; border-top: 1px solid var(--hairline); }
.strat2-mini-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 9px; }
/* fixed-width swatches, wrapping left (founder redirect: a colour is never
   stretched to fill the bar — 3 colours read the same width as 6) */
.strat2-fold-btn { display: flex; align-items: center; gap: 8px; width: 100%; margin-top: 18px; padding: 11px 14px; border-radius: 10px; border: 1px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); background: color-mix(in srgb, var(--bg-2) 50%, var(--surface)); font: 600 12.5px/1.2 var(--sans); color: var(--ink-strong); cursor: pointer; text-align: left; }
.strat2-fold-btn .chev-ic { transition: transform 0.15s ease; color: var(--ink-muted); }
.strat2-fold-btn[aria-expanded="true"] .chev-ic { transform: rotate(90deg); }
.strat2-fold-state { margin-left: auto; font-family: var(--mono); font-size: 10px; color: var(--ink-muted); letter-spacing: 0.1em; text-transform: uppercase; }
.strat2-fold { margin-top: 16px; }
.strat2-fold-sec { margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--hairline); }
.strat2-fold-sec:first-child { margin-top: 0; padding-top: 4px; border-top: none; }
.strat2-cd-line { margin: 0 0 9px; font-family: var(--font-title); font-weight: var(--fw-title); font-size: 18px; letter-spacing: -0.02em; line-height: 1.25; max-width: 680px; text-wrap: pretty; color: var(--ink-strong); }
.strat2-cd-sub { margin: 0 0 16px; font-size: 13.5px; line-height: 1.6; color: var(--ink-soft); max-width: 720px; text-wrap: pretty; }
.strat2-cd-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 18px 28px; }
.strat2-cd-field p { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--ink-soft); }
.strat2-tc-grid, .strat2-aud-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.strat2-tc-card { border: 1px solid color-mix(in srgb, var(--ink-faint) 45%, transparent); border-radius: 11px; padding: 13px 15px; }
.strat2-tc-head { display: flex; align-items: baseline; gap: 7px; margin-bottom: 10px; }
.strat2-tc-name { margin: 0; font-size: 14px; font-weight: 700; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat2-tc-field { font-size: 12px; color: var(--ink-soft); line-height: 1.5; margin-top: 6px; }
.strat2-tc-field b { font-weight: 600; color: var(--ink-strong); }
.strat2-aud-card { border: 1px solid color-mix(in srgb, var(--ink-faint) 45%, transparent); border-radius: 11px; padding: 14px 15px; background: color-mix(in srgb, var(--bg-2) 50%, var(--surface)); }
.strat2-aud-name { margin: 0 0 2px; font-size: 13.5px; font-weight: 700; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat2-aud-demo { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); margin-bottom: 8px; }
.strat2-aud-body { margin: 0; font-size: 12px; line-height: 1.5; color: var(--ink-soft); }

/* ── cross-links ── */
.strat2-links { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.strat2-link-card { display: flex; align-items: center; gap: 13px; text-decoration: none; cursor: pointer; }
.strat2-link-swatch { width: 40px; height: 40px; border-radius: 9px; background: linear-gradient(135deg, color-mix(in srgb, var(--artist-accent) 55%, var(--ink-strong)), var(--ink-strong)); flex-shrink: 0; }
.strat2-link-swatch.is-accent { background: color-mix(in srgb, var(--artist-accent) 12%, transparent); }
.strat2-link-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.strat2-link-title { font-size: 13.5px; font-weight: 600; color: var(--ink-strong); }
.strat2-link-count { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); font-weight: 400; margin-left: 4px; }
.strat2-link-sub { font-size: 12px; color: var(--ink-muted); margin-top: 1px; }
.strat2-link-go { font-size: 13px; color: var(--ink-soft); flex-shrink: 0; }
.strat2-link-card:hover .strat2-link-go { color: var(--ink-strong); }

/* ── first-run / section-empty ghosts ── */
.strat2-ghost-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 13px; }
.strat2-ghost { border: 1px solid color-mix(in srgb, var(--ink-faint) 50%, transparent); border-radius: 14px; padding: 17px 18px; background: var(--surface); }
.strat2-ghost.is-passive { border-style: dashed; background: repeating-linear-gradient(135deg, color-mix(in srgb, var(--ink-strong) 1%, transparent) 0 9px, transparent 9px 18px); }
.strat2-ghost-head { display: flex; align-items: center; gap: 9px; margin-bottom: 7px; }
.strat2-ghost-title { font-family: var(--font-title); font-weight: var(--fw-title); font-size: 15.5px; color: var(--ink-strong); }
.strat2-ghost.is-passive .strat2-ghost-title { color: var(--ink-muted); }
.strat2-ghost-tag { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); margin-left: auto; }
.strat2-ghost-copy { margin: 0 0 13px; font-size: 12.5px; line-height: 1.45; color: var(--ink-muted); }
.strat2-ghost.is-passive .strat2-ghost-copy { margin-bottom: 0; }
.strat2-ghost-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 13px; border-radius: 9px; border: 1px solid color-mix(in srgb, var(--ink-faint) 55%, transparent); background: var(--surface); font: 600 12.5px/1 var(--sans); color: var(--ink-strong); cursor: pointer; }
.strat2-ghost-btn:hover { border-color: var(--ink-faint); }

/* ── inline editors (objective / positioning / add-forms) ── */
.strat2-editor { display: flex; flex-direction: column; gap: 9px; }
.strat2-input, .strat2-textarea { width: 100%; box-sizing: border-box; padding: 9px 11px; border-radius: 9px; border: 1px solid color-mix(in srgb, var(--ink-faint) 60%, transparent); background: var(--surface); color: var(--ink-strong); font: 400 13.5px/1.45 var(--sans); }
.strat2-textarea { resize: vertical; min-height: 64px; }
.strat2-input:focus, .strat2-textarea:focus { outline: none; border-color: var(--artist-accent); }
.strat2-editor-actions { display: flex; align-items: center; gap: 8px; }
.strat2-field-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); }

/* ═══════════════ Campaign Strategy v2 — Drawer-System conformance (#116) ═══════════════
   Adds the canon components (Tier-0 fan card, T1 channel drawer, colour-picker
   popover, tag editors, quick-add key-date popover, universal confirm) + the
   shared timeline treatment (#116 item 10 / #115 item 2: weekday · no today pin ·
   type info line). All strat2- namespaced; the shared timeline classes below are
   the ones Campaign-Plan-v2 consumes via js/campaign-timeline.js. */

/* ── item 6 · one calm sync label (replaces the loud "Live · synced" pill) ──
   Muted, like the sibling section tags — the founder called the green pill
   cheesy, so this is quiet text, not a badge. */
.strat2-synced { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-muted); }

/* ── item 7 · the field is the control · editable cards signal by focus-ring ── */
.strat2-input:focus, .strat2-textarea:focus { border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ink-strong) 8%, transparent); }
.strat2-editable:focus-visible { outline: none; border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ink-strong) 8%, transparent); }
/* inline editor reads as a light Tier-0 card (one pattern everywhere) */
.strat2-editor { padding: 15px 16px; border: 1px solid var(--hairline); border-radius: 13px; background: color-mix(in srgb, var(--bg-2) 40%, var(--surface)); box-shadow: 0 12px 34px -22px rgba(20, 21, 27, 0.42); }
.strat2-editor-title { display: flex; align-items: center; gap: 8px; font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 2px; }
.strat2-editor-title::before { content: ''; width: 7px; height: 7px; border-radius: 2px; background: var(--artist-accent); }

/* ── item 9 · objective text fills the card · meter centred + wider ── */
.strat2-obj-line { max-width: none; }
.strat2-obj-line.is-long { max-width: none; }
.strat2-obj-foot { justify-content: center; }
.strat2-obj-foot .strat2-meter { width: 280px; }

/* ── item 10 · shared timeline row (weekday · no today pin · type info line) ── */
.strat2-tl-day { font-family: var(--mono); font-size: 10px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); }
.strat2-tl-type { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 3px; font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.04em; color: var(--ink-muted); }
.strat2-tl-type-t { text-transform: uppercase; letter-spacing: 0.08em; font-weight: 600; color: var(--ink-soft); }
.strat2-tl-sep { color: var(--ink-faint); }
.strat2-tl-next { text-transform: uppercase; letter-spacing: 0.08em; font-weight: 600; color: var(--accent-text); }
.strat2-tl-type.is-next .strat2-tl-type-t { color: var(--accent-text); }
/* "+ Add key date" trigger (dashed accent pill · Tier-0 quick-add) */
.strat2-tl-add { display: inline-flex; align-items: center; gap: 7px; margin-top: 16px; padding: 7px 13px; border-radius: 999px; border: 1.5px dashed color-mix(in srgb, var(--artist-accent) 42%, transparent); background: color-mix(in srgb, var(--artist-accent) 5%, transparent); font: 600 12.5px/1 var(--sans); color: var(--ink-strong); cursor: pointer; }
.strat2-tl-add:hover { background: color-mix(in srgb, var(--artist-accent) 9%, transparent); }
.strat2-tl-add-plus { color: var(--artist-accent); font-size: 14px; line-height: 1; }

/* ── Tier-0 · quick-add key-date popover ── */
.strat2-qa { z-index: 1200; width: 364px; max-width: calc(100vw - 24px); background: var(--surface); border-radius: 16px; border: 1px solid var(--hairline); box-shadow: 0 1px 3px rgba(20, 21, 27, 0.12), 0 26px 56px -18px rgba(20, 21, 27, 0.42); font-family: var(--sans); color: var(--ink-strong); }
.strat2-qa-arrow { position: absolute; top: -7px; left: 28px; width: 13px; height: 13px; background: var(--surface); border-left: 1px solid var(--hairline); border-top: 1px solid var(--hairline); transform: rotate(45deg); }
.strat2-qa-head { display: flex; align-items: center; justify-content: space-between; padding: 15px 16px 0; }
.strat2-qa-eyebrow { display: inline-flex; align-items: center; gap: 8px; font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); }
.strat2-qa-tick { width: 7px; height: 7px; border-radius: 2px; background: var(--artist-accent); }
.strat2-qa-x { width: 24px; height: 24px; border-radius: 7px; border: none; background: transparent; color: var(--ink-muted); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; }
.strat2-qa-x:hover { color: var(--ink-strong); background: var(--hairline); }
.strat2-qa-name-wrap { padding: 11px 16px 0; }
.strat2-qa-name { width: 100%; box-sizing: border-box; border: none; outline: none; background: transparent; font-family: var(--font-hero); font-weight: var(--fw-display-hero); font-size: 22px; letter-spacing: -0.02em; color: var(--ink-strong); }
.strat2-qa-name::placeholder { color: var(--ink-muted); }
.strat2-qa-fields { display: flex; gap: 8px; padding: 13px 16px 0; }
.strat2-qa-field { flex: 1; display: flex; align-items: center; gap: 8px; padding: 9px 11px; border: 1px solid color-mix(in srgb, var(--ink-faint) 65%, transparent); border-radius: 10px; font-size: 13px; font-weight: 500; color: var(--ink-strong); background: var(--surface); position: relative; }
.strat2-qa-field:focus-within { border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ink-strong) 8%, transparent); }
.strat2-qa-ico { color: var(--ink-muted); display: inline-flex; }
.strat2-qa-date { border: none; outline: none; background: transparent; font: 500 13px/1 var(--sans); color: var(--ink-strong); width: 100%; }
.strat2-qa-sel { padding-right: 30px; }
.strat2-qa-type { -webkit-appearance: none; appearance: none; border: none; outline: none; background: transparent; font: 500 13px/1 var(--sans); color: var(--ink-strong); width: 100%; cursor: pointer; }
.strat2-qa-chev { position: absolute; right: 11px; color: var(--ink-muted); pointer-events: none; }
.strat2-qa-prev { margin: 14px 16px 0; padding: 13px 14px 15px; background: color-mix(in srgb, var(--bg-2) 50%, var(--surface)); border: 1px solid var(--hairline); border-radius: 11px; }
.strat2-qa-prev-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 13px; }
.strat2-qa-prev-track { position: relative; height: 40px; }
.strat2-qa-prev-line { position: absolute; left: 0; right: 0; top: 30px; height: 2px; background: var(--hairline); }
.strat2-qa-prev-end { position: absolute; top: 26px; width: 6px; height: 6px; border-radius: 50%; background: var(--ink-faint); transform: translateX(-50%); }
.strat2-qa-mark { position: absolute; top: 24px; width: 10px; height: 10px; border-radius: 50%; background: var(--artist-accent); border: 2px solid var(--surface); box-shadow: 0 0 0 1px color-mix(in srgb, var(--artist-accent) 30%, transparent); transform: translateX(-50%); }
.strat2-qa-chip { position: absolute; top: -2px; transform: translateX(-42%); display: inline-flex; align-items: center; gap: 6px; padding: 4px 9px; border-radius: 8px; background: var(--surface); border: 1px solid color-mix(in srgb, var(--artist-accent) 25%, transparent); box-shadow: 0 4px 12px -6px rgba(20, 21, 27, 0.25); white-space: nowrap; font-size: 11px; font-weight: 600; color: var(--ink-strong); }
.strat2-qa-chip-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--artist-accent); }
.strat2-qa-prev-months { display: flex; justify-content: space-between; margin-top: 2px; font-family: var(--mono); font-size: 10px; color: var(--ink-faint); }
.strat2-qa-foot { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px 16px; }
.strat2-qa-more { border: none; background: none; padding: 0; font: 500 12.5px/1 var(--sans); color: var(--ink-soft); cursor: pointer; }
.strat2-qa-more:hover { color: var(--ink-strong); }
.strat2-qa-save { padding: 9px 16px; border-radius: 10px; font: 600 13px/1 var(--sans); cursor: pointer; }

/* ── Tier-0 · fan strategy card (audience toggle · activations → Plan tasks) ── */
.strat2-fancard { display: flex; flex-direction: column; border: 1px solid var(--hairline); border-radius: 14px; background: var(--surface); box-shadow: 0 12px 34px -20px rgba(20, 21, 27, 0.42); }
.strat2-fancard-head { display: flex; align-items: center; justify-content: space-between; padding: 14px 15px 0; }
.strat2-seg { display: inline-flex; background: color-mix(in srgb, var(--ink-strong) 5%, transparent); border-radius: 8px; padding: 3px; }
.strat2-seg-opt { padding: 5px 11px; border-radius: 6px; font: 500 12px/1 var(--sans); color: var(--ink-muted); cursor: pointer; border: none; background: transparent; }
.strat2-seg-opt.is-on { background: var(--surface); color: var(--ink-strong); font-weight: 600; box-shadow: 0 1px 2px color-mix(in srgb, var(--ink-strong) 8%, transparent); }
.strat2-fancard-title { padding: 12px 15px 0; }
.strat2-fancard-title input { width: 100%; box-sizing: border-box; border: none; outline: none; background: transparent; font-family: var(--font-hero); font-weight: var(--fw-display-hero); font-size: 19px; letter-spacing: -0.01em; color: var(--ink-strong); }
.strat2-fancard-title input::placeholder { color: var(--ink-muted); }
.strat2-fancard-desc { padding: 9px 15px 0; }
.strat2-fancard-desc textarea { width: 100%; box-sizing: border-box; border: 1px solid color-mix(in srgb, var(--ink-faint) 65%, transparent); border-radius: 11px; padding: 10px 12px; font: 400 12.5px/1.5 var(--sans); color: var(--ink-strong); background: var(--surface); resize: vertical; min-height: 46px; }
.strat2-fancard-desc textarea:focus { outline: none; border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ink-strong) 8%, transparent); }
.strat2-acts { padding: 13px 15px 0; }
.strat2-acts-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 9px; }
.strat2-acts-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); }
.strat2-acts-hint { font-size: 10.5px; color: var(--ink-muted); }
.strat2-acts-list { display: flex; flex-direction: column; gap: 7px; }
.strat2-act { display: flex; align-items: flex-start; gap: 9px; padding: 9px 11px; border: 1px solid color-mix(in srgb, var(--ink-faint) 60%, transparent); border-radius: 10px; }
.strat2-act-check { width: 17px; height: 17px; border-radius: 5px; border: 1.5px solid color-mix(in srgb, var(--ink-faint) 95%, transparent); box-sizing: border-box; flex-shrink: 0; margin-top: 1px; cursor: pointer; background: var(--surface); display: inline-flex; align-items: center; justify-content: center; padding: 0; color: var(--on-ink-strong); }
.strat2-act-check.is-on { background: var(--ink-strong); border-color: var(--ink-strong); }
.strat2-act-check svg { opacity: 0; }
.strat2-act-check.is-on svg { opacity: 1; }
.strat2-act-text { flex: 1; border: none; outline: none; background: transparent; font: 400 12.5px/1.45 var(--sans); color: var(--ink-strong); }
.strat2-act-text::placeholder { color: var(--ink-muted); }
.strat2-act-badge { font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; color: var(--status-positive); background: var(--status-positive-wash); padding: 2px 6px; border-radius: 5px; flex-shrink: 0; margin-top: 1px; }
.strat2-act-rm { border: none; background: none; color: var(--ink-muted); cursor: pointer; padding: 0; flex-shrink: 0; display: inline-flex; margin-top: 1px; }
.strat2-act-rm:hover { color: var(--urgent); }
.strat2-act-add { display: flex; align-items: center; gap: 8px; padding: 9px 11px; border: 1px dashed color-mix(in srgb, var(--ink-faint) 70%, transparent); border-radius: 10px; cursor: pointer; font-size: 12px; color: var(--ink-muted); background: transparent; width: 100%; }
.strat2-act-add:hover { color: var(--ink-strong); }
.strat2-fancard-note { padding: 12px 15px 0; font-size: 11px; color: var(--ink-muted); }
.strat2-fancard-foot { display: flex; align-items: center; justify-content: flex-end; gap: 9px; padding: 12px 15px 15px; }
/* a fan card in edit mode drops its own card chrome so the editor's shows */
.strat2-fan-card-editing { padding: 0; border: none; background: transparent; box-shadow: none; cursor: default; }
/* displayed fan card · a ticked activation carries a TASK badge */
.strat2-fan-item { display: flex; align-items: flex-start; gap: 8px; }
.strat2-fan-item-txt { flex: 1; }
.strat2-fan-task { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--status-positive); background: var(--status-positive-wash); padding: 1px 5px; border-radius: 4px; flex-shrink: 0; margin-top: 1px; }

/* ── T1 · marketing channel drawer (page-local · shared .drawer shell) ── */
.strat2-chan-picker { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--ink-faint) 70%, transparent); border-radius: 11px; background: var(--surface); }
.strat2-chan-picker:focus-within { border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ink-strong) 8%, transparent); }
.strat2-chan-name { font-family: var(--font-title); font-weight: var(--fw-title); font-size: 18px; letter-spacing: -0.01em; color: var(--ink-strong); -webkit-appearance: none; appearance: none; border: none; outline: none; background: transparent; cursor: pointer; width: 100%; }
.strat2-chan-set { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); margin-top: 7px; }
.strat2-df { margin-bottom: 16px; }
.strat2-df-label { font-size: 12px; font-weight: 600; color: var(--ink-strong); margin-bottom: 9px; }
.strat2-df-hint { font-size: 11.5px; color: var(--ink-muted); margin-bottom: 6px; }
.strat2-df-box { display: flex; align-items: center; gap: 9px; padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--ink-faint) 70%, transparent); border-radius: 11px; background: var(--surface); }
.strat2-df-box:focus-within { border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ink-strong) 8%, transparent); }
.strat2-df-input, .strat2-df-select { width: 100%; border: none; outline: none; background: transparent; font: 500 13px/1.4 var(--sans); color: var(--ink-strong); }
.strat2-df-select { -webkit-appearance: none; appearance: none; cursor: pointer; }
.strat2-df-textarea { width: 100%; box-sizing: border-box; border: 1px solid color-mix(in srgb, var(--ink-faint) 70%, transparent); border-radius: 11px; padding: 11px 13px; font: 400 13px/1.5 var(--sans); color: var(--ink-strong); background: var(--surface); resize: vertical; min-height: 60px; }
.strat2-df-textarea:focus { border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ink-strong) 8%, transparent); outline: none; }
.strat2-df-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.strat2-df-swatch { width: 8px; height: 8px; border-radius: 2px; background: var(--artist-accent); flex-shrink: 0; }
.strat2-df-note { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border-radius: 11px; background: color-mix(in srgb, var(--ink-strong) 3%, transparent); border: 1px solid var(--hairline); font-size: 12px; line-height: 1.45; color: var(--ink-soft); margin-top: 11px; }
.strat2-df-toggle-row { display: flex; align-items: center; gap: 11px; padding: 11px 12px; border: 1px solid color-mix(in srgb, var(--status-positive) 22%, transparent); background: var(--status-positive-wash); border-radius: 11px; }
.strat2-df-toggle-main { flex: 1; min-width: 0; }
.strat2-df-toggle-t { font-size: 13px; font-weight: 600; color: var(--ink-strong); }
.strat2-df-toggle-s { font-family: var(--mono); font-size: 10px; text-transform: uppercase; color: var(--ink-muted); margin-top: 1px; }
.strat2-toggle { width: 34px; height: 20px; border-radius: 999px; background: color-mix(in srgb, var(--ink-faint) 95%, transparent); position: relative; flex-shrink: 0; cursor: pointer; border: none; padding: 0; transition: background 150ms; }
.strat2-toggle.is-on { background: var(--status-positive); }
.strat2-toggle-knob { position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: #fff; transition: left 150ms; }
.strat2-toggle.is-on .strat2-toggle-knob { left: 16px; }
.strat2-drawer-foot { flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; padding: 14px 22px; border-top: 1px solid var(--hairline); background: var(--surface); }
.strat2-drawer-danger { border: none; background: none; padding: 0; font: 500 12.5px/1 var(--sans); color: var(--urgent); cursor: pointer; }
.strat2-drawer-btns { display: flex; gap: 9px; }

/* ── Tier-0 · custom colour picker (palette input · item 8) ── */
.strat2-pal-ed { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.strat2-pal-sw { position: relative; width: 36px; height: 36px; border-radius: 9px; border: 1px solid var(--hairline); cursor: pointer; padding: 0; }
.strat2-pal-sw-rm { position: absolute; top: -6px; right: -6px; width: 16px; height: 16px; border-radius: 50%; background: var(--ink-strong); color: var(--on-ink-strong); border: 1.5px solid var(--surface); display: none; align-items: center; justify-content: center; cursor: pointer; padding: 0; line-height: 1; }
.strat2-pal-sw:hover .strat2-pal-sw-rm { display: inline-flex; }
.strat2-pal-add { width: 36px; height: 36px; border-radius: 9px; border: 1.5px dashed color-mix(in srgb, var(--ink-faint) 80%, transparent); background: transparent; color: var(--ink-muted); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; font-size: 17px; line-height: 1; }
.strat2-pal-add:hover { color: var(--ink-strong); border-color: var(--ink-faint); }
.strat2-cp { z-index: 1200; width: 280px; background: var(--surface); border-radius: 15px; border: 1px solid var(--hairline); box-shadow: 0 1px 3px rgba(20, 21, 27, 0.12), 0 24px 52px -18px rgba(20, 21, 27, 0.42); font-family: var(--sans); color: var(--ink-strong); }
.strat2-cp-arrow { position: absolute; top: -7px; left: 24px; width: 13px; height: 13px; background: var(--surface); border-left: 1px solid var(--hairline); border-top: 1px solid var(--hairline); transform: rotate(45deg); }
.strat2-cp-head { display: flex; align-items: center; justify-content: space-between; padding: 14px 15px 0; }
.strat2-cp-eyebrow { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); }
.strat2-cp-field { position: relative; height: 138px; border-radius: 11px; overflow: hidden; border: 1px solid var(--hairline); margin: 12px 15px 0; cursor: crosshair; }
.strat2-cp-fw { position: absolute; inset: 0; background: linear-gradient(90deg, #fff, rgba(255, 255, 255, 0)); }
.strat2-cp-fb { position: absolute; inset: 0; background: linear-gradient(0deg, #000, rgba(0, 0, 0, 0)); }
.strat2-cp-thumb { position: absolute; width: 15px; height: 15px; border-radius: 50%; border: 2.5px solid #fff; box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3); transform: translate(-50%, -50%); pointer-events: none; }
.strat2-cp-hue { position: relative; height: 13px; border-radius: 999px; margin: 14px 15px 0; background: linear-gradient(90deg, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00); cursor: pointer; }
.strat2-cp-hue-thumb { position: absolute; top: 50%; width: 18px; height: 18px; border-radius: 50%; background: #fff; border: 1px solid rgba(20, 21, 27, 0.18); box-shadow: 0 1px 4px rgba(20, 21, 27, 0.3); transform: translate(-50%, -50%); pointer-events: none; }
.strat2-cp-hexrow { display: flex; gap: 9px; align-items: center; padding: 15px 15px 0; }
.strat2-cp-swatch { width: 34px; height: 34px; border-radius: 9px; border: 1px solid var(--hairline); flex-shrink: 0; }
.strat2-cp-hexbox { flex: 1; display: flex; align-items: center; padding: 0 11px; height: 36px; border: 1px solid color-mix(in srgb, var(--ink-faint) 70%, transparent); border-radius: 9px; }
.strat2-cp-hexbox:focus-within { border-color: var(--ink-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ink-strong) 8%, transparent); }
.strat2-cp-hash { font-family: var(--mono); font-size: 13px; color: var(--ink-muted); }
.strat2-cp-hex { border: none; outline: none; width: 100%; font: 500 13px/1 var(--mono); letter-spacing: 0.04em; color: var(--ink-strong); text-transform: uppercase; background: transparent; margin-left: 2px; }
.strat2-cp-recent-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); margin: 13px 15px 8px; }
.strat2-cp-recents { display: flex; gap: 8px; padding: 0 15px; min-height: 22px; }
.strat2-cp-recent { width: 22px; height: 22px; border-radius: 6px; border: 1px solid var(--hairline); cursor: pointer; padding: 0; }
.strat2-cp-foot { display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 14px 15px 15px; }

/* ── principle / sounds-like tag editor (item 8 · individual add-remove tags) ── */
.strat2-tag-ed { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.strat2-tag { display: inline-flex; align-items: center; gap: 6px; padding: 4px 6px 4px 10px; border-radius: 999px; background: color-mix(in srgb, var(--bg-2) 50%, var(--surface)); border: 1px solid color-mix(in srgb, var(--ink-faint) 45%, transparent); font-size: 12px; color: var(--ink-strong); }
.strat2-tag-rm { border: none; background: none; padding: 0; color: var(--ink-muted); cursor: pointer; display: inline-flex; line-height: 1; }
.strat2-tag-rm:hover { color: var(--urgent); }
.strat2-tag-input { border: 1px dashed color-mix(in srgb, var(--ink-faint) 60%, transparent); border-radius: 999px; outline: none; background: transparent; font: 400 12px/1 var(--sans); color: var(--ink-strong); min-width: 92px; padding: 5px 11px; }
.strat2-tag-input:focus { border-style: solid; border-color: color-mix(in srgb, var(--ink-faint) 90%, transparent); }

/* ── universal confirm dialog (#143 · fan-activation untick, destructive) ── */
.strat2-confirm-bd { position: fixed; inset: 0; z-index: 1300; background: rgba(12, 12, 18, 0.38); }
.strat2-confirm { position: fixed; top: 14vh; left: 50%; transform: translateX(-50%); width: 400px; max-width: calc(100vw - 32px); background: var(--surface); border-radius: 16px; box-shadow: 0 24px 60px -18px rgba(12, 12, 18, 0.5); overflow: hidden; font-family: var(--sans); color: var(--ink-strong); z-index: 1301; }
.strat2-confirm-body { padding: 20px 22px 0; }
.strat2-confirm-title { font-family: var(--font-hero); font-weight: var(--fw-display-hero); font-size: 19px; letter-spacing: -0.02em; color: var(--ink-strong); }
.strat2-confirm-text { margin: 9px 0 0; font-size: 13.5px; line-height: 1.5; color: var(--ink-soft); }
.strat2-confirm-foot { display: flex; align-items: center; justify-content: flex-end; gap: 9px; padding: 18px 22px; }
.strat2-confirm-danger { padding: 9px 17px; border-radius: 10px; border: none; background: var(--urgent); color: #fff; font: 600 13px/1 var(--sans); cursor: pointer; }

/* ── responsive (mobile frame) ── */
@media (max-width: 860px) {
  .strat2-tgts, .strat2-fan-grid, .strat2-ghost-grid, .strat2-links, .strat2-pos-grid, .strat2-cd-fields { grid-template-columns: 1fr; }
  .strat2-themes, .strat2-tc-grid, .strat2-aud-grid { grid-template-columns: 1fr; }
  .strat2-obj-line { font-size: 18px; line-height: 1.35; }
  .strat2-obj-line.is-long { font-size: 15px; }
  .strat2-anchor { font-size: 17px; line-height: 1.22; }
  .strat2-sec-title { font-size: 16px; }
  .strat2-tl-pill { margin-left: 0; }
  .strat2-mk-chips { margin-left: 0; width: 100%; }
  .strat2-obj-foot .strat2-meter { width: 200px; }
  .strat2-df-row { grid-template-columns: 1fr; }
}

/* ── release-readiness checklist drawer (#115) — SHARED (js/checklist-drawer.js)
   Opened from the campaign Plan (band meter rows + "Checklist" affordance) AND
   the campaign Overview ("Open full checklist"). Relocated here out of the Plan
   page's inline <style> so both surfaces get it. Per-release tabs (the #115
   accent→amber→ink identity-dot cycle) · progress header · the 5 founder lanes
   in two columns · tickable items. Frames: "Plan — Readiness checklist overlay"
   (+ fresh, + mobile). ── */
.cpl2-ck-scrim { position: fixed; inset: 0; z-index: 80; background: rgba(14,11,8,0.34); display: flex; align-items: flex-start; justify-content: center; padding: 4vh 16px; overflow-y: auto; }
.cpl2-ck { width: 100%; max-width: 760px; background: var(--surface); border-radius: var(--r-lg); border: var(--lift-stroke); box-shadow: var(--lift-shadow-hover); overflow: hidden; outline: none; }
.cpl2-ck-grab { display: none; }
.cpl2-ck-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 18px 22px 0; }
.cpl2-ck-eyebrow { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 4px; }
.cpl2-ck-title { margin: 0; font-family: var(--font-title); font-weight: var(--fw-title); font-size: 20px; letter-spacing: -0.02em; color: var(--ink-strong); }
.cpl2-ck-x { width: 34px; height: 34px; border-radius: var(--r-sm); border: 1px solid var(--hairline); background: var(--surface); color: var(--ink-soft); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; }
.cpl2-ck-x:hover { color: var(--ink-strong); }
.cpl2-ck-tabs { display: flex; align-items: stretch; padding: 14px 22px 0; overflow-x: auto; }
.cpl2-ck-tab { display: inline-flex; align-items: center; gap: 8px; padding: 0 4px 12px; margin-right: 22px; background: none; border: none; border-bottom: 2px solid transparent; font: 400 13.5px/1.2 var(--sans); color: var(--ink-soft); cursor: pointer; white-space: nowrap; flex-shrink: 0; }
.cpl2-ck-tab .dot { width: 9px; height: 9px; border-radius: 50%; background: var(--ck-tone, var(--ink-strong)); flex-shrink: 0; }
.cpl2-ck-tab .cnt { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); background: var(--chip); padding: 1px 6px; border-radius: 5px; }
.cpl2-ck-tab.is-active { border-bottom-color: var(--ck-tone, var(--ink-strong)); color: var(--ink-strong); font-weight: 600; }
.cpl2-ck-tab.is-active .cnt { background: color-mix(in srgb, var(--ck-tone, var(--ink-strong)) 10%, transparent); color: var(--ink-strong); }
.cpl2-ck-tabs .fill { flex: 1; border-bottom: 1px solid var(--hairline); }
.cpl2-ck-prog { display: flex; align-items: center; gap: 14px; padding: 16px 22px; border-bottom: 1px solid var(--hairline); }
.cpl2-ck-prog.has-ticks { background: color-mix(in srgb, var(--artist-accent) 3%, transparent); }
.cpl2-ck-prog .bar { flex: 1; height: 8px; border-radius: 5px; background: var(--hairline); overflow: hidden; }
.cpl2-ck-prog .bar > div { height: 100%; background: var(--artist-accent); }
.cpl2-ck-prog .pct { font-family: var(--font-figure); font-variant-numeric: tabular-nums; font-weight: var(--fw-figure); font-size: 18px; color: var(--ink-strong); }
.cpl2-ck-prog .meta { font-family: var(--mono); font-size: 10px; color: var(--ink-muted); white-space: nowrap; }
.cpl2-ck-hint { display: flex; align-items: center; gap: 9px; padding: 11px 22px; background: var(--bg); border-bottom: 1px solid var(--hairline-soft); }
.cpl2-ck-hint .hi { display: inline-flex; color: var(--ink-muted); flex-shrink: 0; }
.cpl2-ck-hint span { font-size: 12px; color: var(--ink-soft); }
.cpl2-ck-body { padding: 6px 22px 22px; max-height: 62vh; overflow-y: auto; display: grid; grid-template-columns: 1fr 1fr; gap: 0 40px; align-items: start; }
.cpl2-ck-lane { padding: 14px 0 6px; }
.cpl2-ck-lane + .cpl2-ck-lane { border-top: 1px solid var(--hairline-soft); }
.cpl2-ck-lane-head { display: flex; align-items: center; gap: 8px; margin-bottom: 9px; }
.cpl2-ck-lane-head .li { display: inline-flex; color: var(--ink-muted); }
.cpl2-ck-lane-head .ln { font-size: 12.5px; font-weight: 600; color: var(--ink-soft); }
.cpl2-ck-lane-head .lc { font-family: var(--mono); font-size: 10px; margin-left: auto; color: var(--ink-muted); }
.cpl2-ck-lane-head .lc.is-part { color: var(--m-amber); }
.cpl2-ck-lane-head .lc.is-full { color: var(--status-positive); }
.cpl2-ck-item { display: flex; align-items: center; gap: 10px; padding: 6px 0; cursor: pointer; position: relative; }
.cpl2-ck-item input { position: absolute; opacity: 0; width: 16px; height: 16px; margin: 0; cursor: pointer; }
.cpl2-ck-item .box { width: 16px; height: 16px; border-radius: 5px; border: 1.5px solid var(--ink-faint); box-sizing: border-box; flex-shrink: 0; display: flex; align-items: center; justify-content: center; color: transparent; }
.cpl2-ck-item input:checked ~ .box { background: var(--status-positive); border-color: var(--status-positive); color: #fff; }
.cpl2-ck-item input:focus-visible ~ .box { box-shadow: 0 0 0 3px var(--brand-wash); border-color: var(--brand-edge); }
.cpl2-ck-item .lbl { font-size: 13px; color: var(--ink-soft); }
.cpl2-ck-item input:checked ~ .lbl { color: var(--ink-strong); }
/* tour scope (#125) — the run card, "Per show" eyebrow + footer the tour
   checklist adds on the same shell (js/checklist-drawer.js openTour) */
.cpl2-ck-run { margin: 14px 22px 0; border: 1px solid var(--hairline); background: var(--bg); border-radius: 12px; padding: 13px 16px; }
.cpl2-ck-run-head { display: flex; align-items: center; gap: 9px; margin-bottom: 8px; }
.cpl2-ck-run-head .ln { font-size: 12.5px; font-weight: 600; color: var(--ink-soft); }
.cpl2-ck-run-head .lc { font-family: var(--mono); font-size: 10px; margin-left: auto; color: var(--ink-muted); }
.cpl2-ck-run-head .lc.is-part { color: var(--m-amber); }
.cpl2-ck-run-head .lc.is-full { color: var(--status-positive); }
.cpl2-ck-run-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 40px; }
.cpl2-ck-sec { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-muted); padding: 16px 22px 0; }
.cpl2-ck-foot { display: flex; align-items: center; gap: 9px; padding: 12px 22px 16px; border-top: 1px solid var(--hairline-soft); }
.cpl2-ck-foot span { font-size: 12px; color: var(--ink-soft); }
.cpl2-ck-foot a { font-weight: 600; color: var(--ink-strong); text-decoration: none; }
.cpl2-ck-foot a:hover { text-decoration: underline; }
@media (max-width: 720px) { .cpl2-ck-run-grid { grid-template-columns: 1fr; } }

/* checklist drawer → bottom sheet (the mobile frame): grab handle, chip tabs,
   single-column lanes */
@media (max-width: 720px) {
  .cpl2-ck-scrim { padding: 0; align-items: flex-end; }
  .cpl2-ck { max-width: none; border-radius: var(--r-lg) var(--r-lg) 0 0; }
  .cpl2-ck-grab { display: flex; justify-content: center; padding: 9px 0 0; }
  .cpl2-ck-grab span { width: 36px; height: 4px; border-radius: 2px; background: var(--ink-faint); }
  .cpl2-ck-head { padding: 6px 16px 0; }
  .cpl2-ck-head .cname { display: none; }
  .cpl2-ck-tabs { gap: 7px; padding: 12px 16px; }
  .cpl2-ck-tab { margin-right: 0; padding: 6px 11px; border: 1px solid var(--hairline); border-radius: 8px; border-bottom-width: 1px; font-size: 12px; background: var(--surface); gap: 7px; }
  .cpl2-ck-tab .dot { width: 7px; height: 7px; }
  .cpl2-ck-tab .cnt { background: none; padding: 0; }
  .cpl2-ck-tab.is-active { border-color: color-mix(in srgb, var(--ck-tone, var(--ink-strong)) 22%, transparent); background: color-mix(in srgb, var(--ck-tone, var(--ink-strong)) 8%, transparent); color: color-mix(in oklab, var(--ck-tone, var(--ink-strong)) 58%, var(--ink-strong)); }
  .cpl2-ck-tab.is-active .cnt { background: none; color: inherit; }
  .cpl2-ck-tabs .fill { display: none; }
  .cpl2-ck-prog { padding: 13px 16px; border-top: 1px solid var(--hairline-soft); }
  .cpl2-ck-prog .pct { font-size: 17px; }
  .cpl2-ck-prog .meta .xy { display: none; }
  .cpl2-ck-hint { padding: 11px 16px; }
  .cpl2-ck-body { grid-template-columns: 1fr; padding: 6px 16px 18px; max-height: 68vh; }
  .cpl2-ck-col + .cpl2-ck-col .cpl2-ck-lane:first-child { border-top: 1px solid var(--hairline-soft); }
}

/* ═══ Audience — platform marks + chart tokens (#138) ═══
   Mark backgrounds are SANCTIONED EXACT VALUES per audience-scope.md §5
   (rulings locked 2026-07-16): spotify deliberately the system green, not
   Spotify brand green; x is neutral (ink glyph on a quiet wash). These are
   brand-mark fills, identical in both themes — the white glyph carries
   legibility on dark, plus a dark-only hairline ring on the chip (#200,
   below). The no-invented-hex rule holds everywhere else. */
:root {
  --aud-spotify: #1e8a5b; /* §5 */
  --aud-apple: linear-gradient(135deg, #fa57c1, #f23f62); /* §5 */
  --aud-youtube: #ff0033; /* §5 */
  --aud-tiktok: #16171d; /* §5 */
  --aud-instagram: linear-gradient(135deg, #f9ce34, #ee2a7b 50%, #6228d7); /* §5 */
  --aud-x-bg: rgba(20, 21, 27, 0.06); /* §5 */
  /* Chart util (audience-scope.md §7 — sanctioned values): drawn stroke =
     the §5 system green; grid maps to the DS hairline so it stays dark-safe. */
  --chart-line: #1e8a5b; /* §7 */
  --chart-area-from: rgba(30, 138, 91, 0.16); /* §7 */
}

/* The square platform mark (frames: 30px card mark · 28px list · 24px popover).
   Glyph is the vendored Phosphor logo via D2D_icon (js/icons.js). */
.aud-mark {
  width: 30px;
  height: 30px;
  border-radius: 8px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  color: #fff; /* glyph on a dark brand fill — DS idiom */
}
.aud-mark svg {
  width: 18px;
  height: 18px;
}
.aud-mark--spotify { background: var(--aud-spotify); }
.aud-mark--apple_music { background: var(--aud-apple); }
.aud-mark--apple_music svg { width: 17px; height: 17px; }
.aud-mark--youtube { background: var(--aud-youtube); }
.aud-mark--tiktok { background: var(--aud-tiktok); }
.aud-mark--tiktok svg { width: 17px; height: 17px; }
.aud-mark--instagram { background: var(--aud-instagram); }
.aud-mark--instagram svg { width: 17px; height: 17px; }
.aud-mark--x { background: var(--aud-x-bg); color: var(--ink-strong); }
.aud-mark--x svg { width: 16px; height: 16px; }
/* untracked platform — the frames' neutral "not connected" mark treatment
   (drawn on the X / Twitter card): quiet wash, muted glyph */
.aud-mark--off { background: var(--aud-x-bg); color: var(--ink-muted); }
.aud-mark--off svg { width: 16px; height: 16px; }
.aud-mark--sm { width: 24px; height: 24px; border-radius: 7px; }
.aud-mark--sm svg { width: 14px; height: 14px; }
/* #200 dark ruling: on dark surfaces the tiktok (#16171D) and x (ink-wash)
   fills sit tone-on-tone with the card, so only the glyph floats. A hairline
   ring on every mark keeps the chip boundary reading as a chip. Dark only —
   light mode and the §5 fills are untouched. */
[data-theme="dark"] .aud-mark { border: 1px solid var(--hairline); }
