Promotes the per-brief theme picker from a buried section at the bottom
of the JSON-textarea edit page to a dedicated /briefs/:id/theme route
that feels like a real edit tool.
New route layout (5fr / 4fr split, sticky preview on xl+):
- Left: ThemeEditor (8 accent presets + custom hex; 4 heading-font
tiles each rendering "The Branded Glass Moment" in the candidate
font; 3 background presets; agency-name input; save / reset).
- Right: ThemePreview — slice of the per-report dashboard styled by
the picked theme, updates LIVE on every tweak before save.
ThemePreview renders a mock dashboard topbar (with agency name + accent
eyebrow), 3 KPI tiles, leaderboard row (rank + format dot + accent
bar + plays), sample trend card (maturity pill + format chip + truth
quote + KPI strip), primary/secondary buttons, accent-2 swatch.
Inline-styled with full hex values so changing the picker doesn't
bleed into the operator app's chrome.
ThemeEditor refactored to expose live state via optional onPreview
callback. Internal save/reset behaviour unchanged.
Discoverability:
- Brief detail page: "Theme & branding" button in the header action row
next to "Export JSON" and "Run pipeline".
- Brief edit page: footer link "Theme & branding ↗" replaces the
inline editor that lived at the bottom (now redundant).
- Brief list rows: small accent-dot indicator in the right-side
metadata column when a theme is set, plus a per-row "Add theme" /
"Edit theme" link in the action footer.
Operator app's index.html now also loads Fraunces / Playfair /
Space Grotesk / Inter / JetBrains Mono so the preview is WYSIWYG.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>