# 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 `