diff --git a/docs/superpowers/plans/2026-04-08-visual-identity-modern-fable.md b/docs/superpowers/plans/2026-04-08-visual-identity-modern-fable.md new file mode 100644 index 0000000..365601e --- /dev/null +++ b/docs/superpowers/plans/2026-04-08-visual-identity-modern-fable.md @@ -0,0 +1,785 @@ +# Modern Fable Visual Identity — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Replace the generic indigo dark-mode palette with a distinctive "Modern Fable" visual identity — deep violet + muted gold, signature card types, pill nav, Fraunces-as-narrator typography, and living micro-details. + +**Architecture:** Pure frontend changes across theme CSS, AppHeader, AppLogo, KnowledgeView, ChatPanel, BriefingView, and CalendarView. No backend changes. Each task is independently deployable — palette first, then cards, then nav, then typography, then details. + +**Tech Stack:** Vue 3 SFC (scoped CSS), CSS custom properties, Fraunces font (already loaded). + +--- + +## File Map + +| Action | Path | +|--------|------| +| Modify | `frontend/src/assets/theme.css` | +| Modify | `frontend/src/components/AppLogo.vue` | +| Modify | `frontend/src/components/AppHeader.vue` | +| Modify | `frontend/src/views/KnowledgeView.vue` | +| Modify | `frontend/src/components/ChatPanel.vue` | +| Modify | `frontend/src/views/BriefingView.vue` | +| Modify | `frontend/src/views/CalendarView.vue` | +| Modify | `frontend/src/App.vue` | + +--- + +### Task 1: Color palette update + logo + scrollbar + +**Files:** +- Modify: `frontend/src/assets/theme.css` +- Modify: `frontend/src/components/AppLogo.vue` + +- [ ] **Step 1: Update the dark theme palette in theme.css** + +In `frontend/src/assets/theme.css`, find the `[data-theme="dark"]` block and replace these values: + +```css +[data-theme="dark"] { + --color-bg: #0f0f14; + --color-bg-secondary: #16161f; + --color-bg-card: #1a1a24; + --color-surface: #16161f; + --color-text: #e4e4f0; + --color-text-secondary: #8888a8; + --color-text-muted: #52526a; + --color-border: rgba(124, 58, 237, 0.12); + --color-input-border: rgba(124, 58, 237, 0.22); + --color-primary: #a78bfa; + --color-danger: #f44336; + --color-tag-bg: #2a2a45; + --color-tag-text: #c4b5fd; + --color-shadow: rgba(0, 0, 0, 0.4); + --color-toast-success: #4caf50; + --color-toast-error: #f44336; + --color-status-todo: #9aa0a6; + --color-status-todo-bg: #2a2a35; + --color-status-in-progress: #a78bfa; + --color-status-in-progress-bg: #2a2a45; + --color-status-done: #4caf50; + --color-status-done-bg: #1b3a20; + --color-priority-low: #80cbc4; + --color-priority-low-bg: #1a3a38; + --color-priority-medium: #fdd835; + --color-priority-medium-bg: #3a3520; + --color-priority-high: #f44336; + --color-priority-high-bg: #3a1a1a; + --color-wikilink: #c4b5fd; + --color-wikilink-bg: #2a1a45; + --color-overdue: #f44336; + --color-code-bg: #12121a; + --color-code-inline-bg: #1a1a2a; + --color-table-stripe: #14141e; + --color-success: #4ade80; + --color-warning: #facc15; + --color-input-bar-bg: #1a1a24; + --color-input-bar-text: #e4e4f0; + --color-input-bar-placeholder: rgba(228, 228, 240, 0.35); + --color-overlay: rgba(0, 0, 0, 0.65); + --color-bubble-user-bg: rgba(255, 255, 255, 0.04); + --color-bubble-user-border: rgba(255, 255, 255, 0.10); + --color-bubble-user-text: #b0b0c8; + --color-bubble-asst-shadow: 0 4px 28px rgba(124, 58, 237, 0.14), 0 2px 8px rgba(0, 0, 0, 0.4); + --color-accent-warm: #d4a017; + --color-accent-warm-light: #e8c45a; + --color-primary-solid: #7c3aed; + --color-primary-deep: #5b21b6; +} +``` + +Note: `--color-accent-warm`, `--color-accent-warm-light`, `--color-primary-solid`, and `--color-primary-deep` are new variables. + +- [ ] **Step 2: Update the light theme palette** + +In the `:root` block, update these values: + +```css +:root { + --color-bg: #f5f5fb; + --color-bg-secondary: #ededf5; + --color-bg-card: #ffffff; + --color-surface: #f0f0f8; + --color-text: #1a1a1a; + --color-text-secondary: #666666; + --color-text-muted: #999999; + --color-border: #dddde8; + --color-input-border: #c8c8d8; + --color-primary: #7c3aed; + --color-danger: #d93025; + --color-tag-bg: #ede5ff; + --color-tag-text: #6d28d9; + --color-shadow: rgba(0, 0, 0, 0.08); + --color-toast-success: #34a853; + --color-toast-error: #d93025; + --color-status-todo: #5f6368; + --color-status-todo-bg: #e8eaed; + --color-status-in-progress: #7c3aed; + --color-status-in-progress-bg: #ede5ff; + --color-status-done: #34a853; + --color-status-done-bg: #e6f4ea; + --color-priority-low: #5f9ea0; + --color-priority-low-bg: #e0f2f1; + --color-priority-medium: #f9a825; + --color-priority-medium-bg: #fff8e1; + --color-priority-high: #d93025; + --color-priority-high-bg: #fce8e6; + --color-wikilink: #7b1fa2; + --color-wikilink-bg: #f3e5f5; + --color-overdue: #d93025; + --color-code-bg: #f0f0f8; + --color-code-inline-bg: #eaeaf4; + --color-table-stripe: #f4f4fb; + --color-success: #22c55e; + --color-warning: #eab308; + --color-input-bar-bg: #eaeaf3; + --color-input-bar-text: #1a1a1a; + --color-input-bar-placeholder: rgba(0, 0, 0, 0.4); + --color-overlay: rgba(0, 0, 0, 0.45); + --color-bubble-user-bg: rgba(0, 0, 0, 0.04); + --color-bubble-user-border: rgba(0, 0, 0, 0.10); + --color-bubble-user-text: #3a3a4a; + --color-bubble-asst-shadow: 0 2px 16px rgba(124, 58, 237, 0.10), 0 1px 4px rgba(0, 0, 0, 0.06); + --radius-sm: 6px; + --radius-md: 12px; + --radius-lg: 18px; + --radius-pill: 9999px; + --focus-ring: 0 0 0 2px rgba(124, 58, 237, 0.4); + /* Layout */ + --page-max-width: 1200px; + --page-padding-x: 1rem; + --sidebar-width: 260px; + /* New brand variables */ + --color-accent-warm: #b8860b; + --color-accent-warm-light: #d4a017; + --color-primary-solid: #7c3aed; + --color-primary-deep: #5b21b6; +} +``` + +- [ ] **Step 3: Update scrollbar color** + +Find: +```css +::-webkit-scrollbar-thumb { + background: rgba(99, 102, 241, 0.25); +} +::-webkit-scrollbar-thumb:hover { + background: rgba(99, 102, 241, 0.45); +} +``` + +Replace with: +```css +::-webkit-scrollbar-thumb { + background: rgba(124, 58, 237, 0.25); +} +::-webkit-scrollbar-thumb:hover { + background: rgba(124, 58, 237, 0.45); +} +``` + +- [ ] **Step 4: Update focus ring** + +Find: +```css + --focus-ring: 0 0 0 2px color-mix(in srgb, var(--color-primary) 40%, transparent); +``` + +Replace with: +```css + --focus-ring: 0 0 0 2px rgba(124, 58, 237, 0.4); +``` + +- [ ] **Step 5: Update AppLogo gradient** + +In `frontend/src/components/AppLogo.vue`, the logo uses `var(--color-primary)` which will automatically pick up the new violet value. No code change needed — the CSS variable update handles it. + +However, add a gradient `` for the book fill to use the deep gradient instead of a flat color. Find the `