# Plan: DM Dashboard UI Redesign ## TL;DR > **Quick Summary**: Redesign the DM Dashboard (`/dm/`, `/ru/dm/`) with a purple-gold theme (`#534AB7` + `#c8a84b`), tab-based navigation, and a dashboard-style layout (3-column desktop, tabbed mobile). Preserve all existing functionality while creating an extensible design system. > > **Deliverables**: > - Updated design tokens in `dm-theme.css` > - New `DmTabs` navigation component > - Redesigned `DmLayout` with dashboard grid > - Visual refresh of all feature components (DiceRoller, InitiativeTracker, Open5eReference, NotesPanel, AuthPanel) > - Playwright E2E tests covering all user flows > - Updated `/dm/index.astro` and `/ru/dm/index.astro` > > **Estimated Effort**: Large > **Parallel Execution**: YES — 4 waves > **Critical Path**: Wave 1 (Design System) → Wave 2 (Layout + Tabs) → Wave 3 (Feature Components) → Wave 4 (Tests + Polish) --- ## Context ### Original Request Improve the DM Dashboard interface to be visually pleasing while preserving usability and functionality. Use provided mockups for inspiration. Must remain extensible for future features. ### Interview Summary **Key Decisions**: - **Color scheme**: Switch to purple-gold (`#534AB7` primary, `#c8a84b` secondary), matching mockups and main site accent - **Layout**: Tab-based navigation with 3-column dashboard on desktop, tabbed sections on mobile - **Language**: Russian-only, update both `/dm/` and `/ru/dm/` - **Testing**: Playwright E2E tests for UI interactions and visual regression - **Extensibility**: Must support unknown future features flexibly **Research Findings**: - Current DM Dashboard uses orange (`#E87722`) with 2-column grid and anchor navigation - UI primitives exist: DmButton, DmCard, DmInput, DmHeader - Feature components: DiceRoller, InitiativeTracker, Open5eReference, NotesPanel, AuthPanel - All state persistence (sessionStorage/localStorage) must be preserved - Tailwind CSS v4 with CSS custom properties via `.dm-theme` scoping ### Metis Review **Identified Gaps** (addressed): - Need explicit tab state management (URL hash or query param for shareability) - Must preserve sessionStorage/localStorage keys to avoid losing user data - Mobile tab navigation needs touch-friendly sizing (min 44px tap targets) - Extensibility requires a plugin-ready navigation slot in the layout ### Adversarial Review Findings (Hyperplan Team) The hyperplan team of 4 critics (unspecified-low, unspecified-high, ultrabrain, artistry) reviewed the plan. Key findings: **🎯 Coherence & Feasibility (critic-high)**: 1. **Dependency matrix is inconsistent**: T8 blocks T6-T7 but Wave 2 marks them as parallel. Resolution: T8 does NOT block T6-T7; sidebar is optional for page structure. 2. **Critical path is wrong**: T9-T13 depend on T6 (page structure), not just T4. Resolution: Critical path updated to T1-T4 → T5 → T6 → T9-T13. 3. **Layout conflict**: 3-column DmLayout conflicts with page's own 2-column grid. Resolution: DmLayout provides the grid; pages place sections into slots, not their own grid. 4. **No existing Playwright tests**: Found no `.spec.ts` files. Resolution: Add T0 to verify Playwright is installed and configured before writing tests. 5. **Pages already diverge**: `/dm/index.astro` and `/ru/dm/index.astro` have different padding/gap. Resolution: Make them identical in structure; differences should only be locale. 6. **Theme tokens insufficient**: Current `.dm-theme` has 11 properties; new design needs more. Resolution: Expand token set in T1. 7. **Missing i18n updates**: New strings (tab labels, sidebar sections) not in plan. Resolution: Add T4.5 for i18n updates. 8. **No task removes old anchor nav**: Plan introduces DmTabs but doesn't remove old anchor nav. Resolution: Explicitly include in T6. 9. **AuthPanel redesign needs clarification**: Must NOT Have says no auth logic changes, but visual redesign is fine. Resolution: Clarify T13 scope. **🔍 Quick Wins (critic-low)**: 10. **Missing loading skeletons**: Open5eReference needs skeleton screens for better UX. Resolution: Add to T11. 11. **No empty state designs**: Components need polished empty states. Resolution: Add acceptance criteria to T9-T12. 12. **Missing hover states**: Plan doesn't specify hover states for interactive elements. Resolution: Add to design token spec in T1. 13. **No search debounce**: Open5e search should debounce input. Resolution: Add to T11. **🧠 Deep Technical (critic-ultra)**: 14. **Tab state management**: URL hash is fragile. Recommendation: Use query param (`?tab=dice`) or localStorage for tab preference, with URL hash as fallback. 15. **Astro islands hydration**: Components with `client:*` directives may hydrate independently. Tabs need to work before AND after hydration. Resolution: Use CSS for initial tab visibility, JS enhances. 16. **Data preservation strategy**: Must verify old sessionStorage/localStorage data loads correctly after component redesign. Resolution: Add data migration verification to T18. 17. **ARIA live regions**: Dice results and initiative updates need `aria-live="polite"` for screen readers. Resolution: Add to T9-T10. 18. **localStorage cross-tab sync**: Notes panel should sync across tabs using `storage` event. Resolution: Add to T12. **🎨 UX & Visual (critic-art)**: 19. **Color contrast**: Purple (#534AB7) on dark backgrounds may fail WCAG AA for small text. Gold (#c8a84b) should be used for high-contrast elements. Resolution: Add contrast verification to T17. 20. **Typography consistency**: BaseLayout uses Space Grotesk, mockups use system sans-serif. Decision: Keep Space Grotesk for consistency with main site. 21. **Micro-interactions**: Need explicit hover transitions, active states, and focus styles. Resolution: Add transition tokens to T1. 22. **Mobile UX**: Top tabs may be hard to reach. Consider bottom sheet or swipe gestures for mobile. Resolution: Add to T17 as exploration item. 23. **Visual consistency risk**: 5 components redesigned in parallel may diverge. Resolution: Add consistency review gate before Wave 4. --- ## Work Objectives ### Core Objective Redesign the DM Dashboard with a visually cohesive purple-gold theme, dashboard-style layout, and tab-based navigation, while preserving all existing functionality and data persistence. ### Concrete Deliverables 1. Updated `src/styles/dm-theme.css` with purple-gold tokens 2. New `src/components/dm/DmTabs.astro` — tab navigation component 3. Redesigned `src/layouts/DmLayout.astro` — dashboard grid layout 4. Redesigned `src/components/dm/DmHeader.astro` — updated header styling 5. Redesigned `src/components/dm/DiceRoller.astro` — visual refresh 6. Redesigned `src/components/dm/InitiativeTracker.astro` — visual refresh 7. Redesigned `src/components/dm/Open5eReference.astro` — visual refresh 8. Redesigned `src/components/dm/NotesPanel.astro` — visual refresh 9. Redesigned `src/components/dm/AuthPanel.astro` — visual refresh 10. Updated `src/pages/dm/index.astro` and `src/pages/ru/dm/index.astro` 11. Playwright E2E tests in `tests/dm/` ### Definition of Done - [ ] `npm run build` completes without errors - [ ] Playwright E2E tests pass (`npm run test:e2e`) - [ ] All existing functionality works identically (dice rolls, initiative, Open5e search, notes, auth) - [ ] sessionStorage/localStorage data is preserved across redesign - [ ] Visual design matches mockup inspiration (purple-gold, cards, pill nav) - [ ] Layout is responsive: 3-column desktop, tabbed mobile ### Must Have - Purple (`#534AB7`) + gold (`#c8a84b`) color scheme - Tab-based navigation between sections (Dice, Initiative, Reference, Notes) - Dashboard-style 3-column layout on desktop (sidebar | main | context) - All existing functionality preserved with zero data loss - Playwright E2E tests for critical user flows - Both `/dm/` and `/ru/dm/` updated - Russian language throughout ### Must NOT Have (Guardrails) - NO changes to auth/OAuth logic - NO changes to Open5e API integration - NO backend/database schema changes - NO new functional features (generators, tools, etc.) - NO breaking changes to sessionStorage/localStorage keys - NO pure-black backgrounds (maintain warm dark tones from mockups) - NO hardcoded pixel values without design tokens - NO removal of accessibility features (focus rings, ARIA labels) --- ## Verification Strategy > **ZERO HUMAN INTERVENTION** — ALL verification is agent-executed. ### Test Decision - **Infrastructure exists**: YES (Playwright configured, `npm run test:e2e`) - **Automated tests**: YES (Playwright E2E) - **Framework**: Playwright - **Agent QA**: Every task includes agent-executed QA scenarios ### QA Policy Every task MUST include agent-executed QA scenarios. Evidence saved to `.sisyphus/evidence/task-{N}-{scenario-slug}.{ext}`. - **Frontend/UI**: Use Playwright skill — Navigate, interact, assert DOM, screenshot - **Visual regression**: Screenshot comparison for key states --- ## Execution Strategy ### Parallel Execution Waves ``` Wave 1 (Foundation — Design System + Tokens + Infra): ├── Task 0: Verify Playwright test infrastructure [quick] ├── Task 1: Update dm-theme.css with purple-gold tokens [quick] ├── Task 2: Create DmTabs tab navigation component [quick] ├── Task 3: Redesign DmHeader with new theme [quick] ├── Task 4: Update DmButton/DmCard/DmInput primitives [quick] └── Task 4.5: Update i18n strings for new UI [quick] Wave 2 (Layout + Structure): ├── Task 5: Redesign DmLayout with dashboard grid [unspecified-high] ├── Task 6: Update /dm/index.astro page structure [quick] ├── Task 7: Update /ru/dm/index.astro page structure [quick] └── Task 8: Create sidebar navigation component [quick] Wave 3 (Feature Components — MAX PARALLEL): ├── Task 9: Redesign DiceRoller [visual-engineering] ├── Task 10: Redesign InitiativeTracker [visual-engineering] ├── Task 11: Redesign Open5eReference [visual-engineering] ├── Task 12: Redesign NotesPanel [visual-engineering] └── Task 13: Redesign AuthPanel [visual-engineering] Wave 4 (Tests + Polish): ├── Task 14: Playwright E2E tests — dice flow [unspecified-high] ├── Task 15: Playwright E2E tests — initiative flow [unspecified-high] ├── Task 16: Playwright E2E tests — reference + notes flow [unspecified-high] ├── Task 17: Cross-browser visual QA + responsive testing [unspecified-high] └── Task 18: Build verification + data migration check [quick] Wave FINAL (Review): ├── Task F1: Plan compliance audit (oracle) ├── Task F2: Code quality review (unspecified-high) ├── Task F3: Real manual QA (unspecified-high) └── Task F4: Scope fidelity check (deep) -> Present results -> Get explicit user okay Critical Path: T0-T4, T4.5 (parallel, Wave 1) → T5 → T6 → T9-T13 (parallel, Wave 3) → T14-T18 (parallel, Wave 4) → F1-F4 (parallel, Wave FINAL) → user okay Parallel Speedup: ~65% faster than sequential Max Concurrent: 6 (Wave 1) ``` ### Dependency Matrix (Corrected) | Task | Depends On | Blocks | |------|-----------|--------| | T0 (Playwright) | — | T14-T16 | | T1 (Tokens) | — | T3, T4, T9-T13 | | T2 (DmTabs) | — | T5, T8 | | T3 (DmHeader) | T1 | T5 | | T4 (Primitives) | T1 | T9-T13 | | T4.5 (i18n) | — | T9-T12 | | T5 (DmLayout) | T2, T3 | T6-T7 | | T6 (/dm/ page) | T5 | T9-T13, T17-T18 | | T7 (/ru/dm/ page) | T5 | T17-T18 | | T8 (Sidebar) | T2 | — (optional, no downstream block) | | T9 (DiceRoller) | T4, T4.5, T6 | T14 | | T10 (InitiativeTracker) | T4, T4.5, T6 | T15 | | T11 (Open5eReference) | T4, T4.5, T6 | T16 | | T12 (NotesPanel) | T4, T4.5, T6 | T16 | | T13 (AuthPanel) | T4, T6 | T17 | | T14 (E2E dice) | T0, T9 | F3 | | T15 (E2E initiative) | T0, T10 | F3 | | T16 (E2E ref+notes) | T0, T11, T12 | F3 | | T17 (Visual QA) | T6, T7, T13 | F3 | | T18 (Build) | T6, T7 | F2 | ### Agent Dispatch Summary - **Wave 1**: 6 tasks → `quick` (T0-T4, T4.5) - **Wave 2**: 4 tasks → T5 `unspecified-high`, T6-T8 `quick` - **Wave 3**: 5 tasks → `visual-engineering` (T9-T13) - **Wave 4**: 5 tasks → T14-T17 `unspecified-high`, T18 `quick` - **FINAL**: 4 tasks → F1 `oracle`, F2 `unspecified-high`, F3 `unspecified-high`, F4 `deep` --- ## TODOs - [x] **T0. Verify Playwright test infrastructure** **What to do**: - Check if Playwright is installed: look for `@playwright/test` in `package.json` - Check if Playwright config exists: `playwright.config.ts` or similar - Check if test directory exists and has examples: `tests/` or `e2e/` - If Playwright is NOT fully configured: - Install `@playwright/test`: `npm install -D @playwright/test` - Create basic `playwright.config.ts` with project settings - Add `test:e2e` script to `package.json` if missing - Create a simple smoke test to verify setup works - If Playwright IS configured: - Verify config works by running existing tests - Document test patterns for DM Dashboard tests - **This task MUST complete before T14-T16** **Must NOT do**: - Write full DM Dashboard tests (that's T14-T16) - Change Vitest configuration **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [] - Reason: Infrastructure verification and setup **Parallelization**: - **Can Run In Parallel**: YES - **Parallel Group**: Wave 0 (preparation) - **Blocks**: T14-T16 - **Blocked By**: None **References**: - `package.json` — Check for `@playwright/test` - `playwright.config.ts` or `playwright.config.js` — Existing config - `tests/` directory — Existing tests **Acceptance Criteria**: - [ ] Playwright installation verified - [ ] Config file present and valid - [ ] `npm run test:e2e` command works (or `npx playwright test`) - [ ] Basic smoke test passes **QA Scenarios**: ``` Scenario: Playwright setup works Tool: Bash Preconditions: None Steps: 1. Check `package.json` for `@playwright/test` 2. Run `npx playwright test --list` (or create minimal test first) 3. Assert: No "command not found" or config errors Expected Result: Playwright is ready for E2E tests Evidence: .sisyphus/evidence/t0-playwright.txt ``` **Commit**: YES - Message: `chore(test): verify and setup Playwright E2E infrastructure` - Files: `package.json`, `playwright.config.ts` (if created) - [x] **T1. Update dm-theme.css with purple-gold tokens** **What to do**: - Replace orange tokens with purple-gold palette in `src/styles/dm-theme.css` - Primary accent: `#534AB7` (purple) - Secondary accent: `#c8a84b` (gold) - Update background colors to warm dark tones from mockups: `#16120e` (base), `#1e1912` (surface), `#221e18` (card) - Add semantic colors: green `#6ab04c` (crit/success), red `#e06060` (fail) - **NEW**: Add transition tokens: `--transition-fast: 150ms`, `--transition-base: 250ms`, `--transition-slow: 350ms` - **NEW**: Add hover state colors: `--accent-hover: #6b5fc7` (lighter purple), `--gold-hover: #d4b76a` (lighter gold) - **NEW**: Add focus ring token: `--focus-ring: 0 0 0 2px var(--bg-primary), 0 0 0 4px var(--accent)` - **NEW**: Add shadow tokens: `--shadow-sm`, `--shadow-md`, `--shadow-lg`, `--shadow-glow` (purple-tinted) - Keep CSS custom property structure intact (`.dm-theme` scope) - Ensure smooth transitions for color changes - **IMPORTANT**: Do NOT rename existing properties used by components — only change their values **Must NOT do**: - Change property names (to avoid breaking existing component references) - Remove any existing variables that components depend on - Use pure black (`#000000`) backgrounds **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [] - Reason: Simple CSS token update, no complex logic **Parallelization**: - **Can Run In Parallel**: YES - **Parallel Group**: Wave 1 (with T2, T3, T4, T4.5) - **Blocks**: T3, T9-T13 - **Blocked By**: None **References**: - `src/styles/dm-theme.css` — Current theme variables (preserve structure) - `src/layouts/BaseLayout.astro` — Base accent `#534ab7` for reference - Mockup color analysis in draft — Warm dark tones, purple/gold accents **Acceptance Criteria**: - [ ] `src/styles/dm-theme.css` updated with purple-gold tokens - [ ] **NEW**: At least 15+ CSS properties defined (expanded from 11) - [ ] **NEW**: Transition tokens present - [ ] **NEW**: Hover state colors present - [ ] **NEW**: Shadow tokens present - [ ] No component breaks due to missing variables - [ ] Build passes: `npm run build` **QA Scenarios**: ``` Scenario: Verify theme colors load correctly Tool: Playwright Preconditions: Dev server running (`npm run dev`) Steps: 1. Navigate to `http://localhost:4321/dm/` 2. Take screenshot of full page 3. Assert: No orange (#E87722) visible in major UI elements 4. Assert: Purple (#534AB7) visible in header/buttons 5. Assert: Gold (#c8a84b) visible in dice/labels Expected Result: Page renders with purple-gold theme, no orange remnants Evidence: .sisyphus/evidence/t1-theme-colors.png ``` **Commit**: YES - Message: `style(dm): update theme to purple-gold palette` - Files: `src/styles/dm-theme.css` - [x] **T2. Create DmTabs tab navigation component** **What to do**: - Create `src/components/dm/DmTabs.astro` component - Horizontal pill navigation: Кубики | Инициатива | Справочник | Заметки - Active state: purple fill (`#534AB7`) + white text - Inactive state: dark fill + gold-tinted border + muted text - Mobile: horizontally scrollable (`overflow-x: auto`, hide scrollbar) - Desktop: centered or left-aligned pill row - **REVISED**: Tab state management strategy: - **Initial render**: Use CSS (`:target` or hidden checkbox) to show correct tab based on URL hash, so tab is correct BEFORE JS hydrates - **Enhanced behavior**: JS reads URL hash on load, manages active state, updates hash on click - **Fallback**: If no hash, default to first tab (Кубики) - **Persistence**: Optionally save last active tab to localStorage for return visits - Emit custom event (`dm-tab-change`) for other components to listen - Accessible: `role="tablist"`, `role="tab"`, `aria-selected`, keyboard navigation (Arrow keys) - **NEW**: Touch-friendly sizing: min-height 44px, min-width 80px for tabs **Must NOT do**: - Implement actual section content switching (layout/page handles this) - Use client-side routing (keep Astro static behavior) - Break existing anchor links **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [] - Reason: Component creation with Tailwind classes and ARIA attributes **Parallelization**: - **Can Run In Parallel**: YES - **Parallel Group**: Wave 1 (with T1, T3-T4, T4.5) - **Blocks**: T5-T8 - **Blocked By**: None **References**: - `src/components/dm/DmButton.astro` — Button styling patterns, focus rings - Mockup navigation — Pill shape, active/inactive states - Current `src/pages/dm/index.astro` — Existing anchor nav structure **Acceptance Criteria**: - [ ] Component file created: `src/components/dm/DmTabs.astro` - [ ] 4 tabs rendered with correct labels - [ ] Active tab visually distinct (purple fill) - [ ] URL hash updates on tab click - [ ] Keyboard navigation works (Left/Right arrows) - [ ] **NEW**: Tab correct on initial load (before JS hydration) - [ ] **NEW**: Touch targets ≥44px - [ ] Build passes **QA Scenarios**: ``` Scenario: Tab switching and URL hash Tool: Playwright Preconditions: Dev server running, page with DmTabs mounted Steps: 1. Navigate to `http://localhost:4321/dm/` 2. Click tab "Инициатива" 3. Assert: URL contains `#initiative` 4. Assert: "Инициатива" tab has purple background 5. Assert: "Кубики" tab is inactive (dark background) 6. Press ArrowRight key 7. Assert: "Справочник" tab becomes active Expected Result: Tabs switch correctly, URL updates, keyboard works Evidence: .sisyphus/evidence/t2-tabs-navigation.png Scenario: Mobile scrollable tabs Tool: Playwright Preconditions: Dev server running Steps: 1. Set viewport to 375px width (iPhone SE) 2. Navigate to `http://localhost:4321/dm/` 3. Take screenshot 4. Assert: Tabs are in single horizontal row 5. Assert: No tabs wrap to second line 6. Assert: Tab height ≥44px Expected Result: Tabs horizontally scrollable on mobile with touch-friendly sizing Evidence: .sisyphus/evidence/t2-tabs-mobile.png Scenario: Initial tab state without JS Tool: Playwright Preconditions: Dev server running Steps: 1. Navigate to `http://localhost:4321/dm/#initiative` 2. Disable JavaScript in browser context 3. Refresh page 4. Assert: "Инициатива" tab is visually active Expected Result: Tab state works before hydration Evidence: .sisyphus/evidence/t2-tabs-nojs.png ``` **Commit**: YES - Message: `feat(dm): add DmTabs navigation component` - Files: `src/components/dm/DmTabs.astro` - [x] **T3. Redesign DmHeader with new theme** **What to do**: - Update `src/components/dm/DmHeader.astro` to match purple-gold theme - Keep existing structure: quill icon, title slot, auth slot - Update styling: use new theme tokens, add gold accent to icon - Ensure backdrop blur and sticky positioning preserved - Add subtle bottom border using gold-tinted color (`rgba(200,168,75,0.15)`) - Update logo/quill icon color to purple or gold - Maintain responsive behavior **Must NOT do**: - Change component props or slots - Remove backdrop blur - Break existing usages in DmLayout **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [] - Reason: Visual update of existing component **Parallelization**: - **Can Run In Parallel**: YES - **Parallel Group**: Wave 1 (with T1-T2, T4) - **Blocks**: T5 - **Blocked By**: T1 (needs theme tokens) **References**: - `src/components/dm/DmHeader.astro` — Current implementation - `src/styles/dm-theme.css` — Updated tokens (from T1) - Mockup header — Logo + user button styling **Acceptance Criteria**: - [ ] Header uses new theme colors - [ ] Backdrop blur preserved - [ ] No visual regressions in layout - [ ] Build passes **QA Scenarios**: ``` Scenario: Header renders with new theme Tool: Playwright Preconditions: Dev server running, T1 complete Steps: 1. Navigate to `http://localhost:4321/dm/` 2. Take screenshot of header area 3. Assert: Header background uses dark warm tone 4. Assert: Quill icon or logo uses purple/gold 5. Assert: Bottom border is subtle gold tint Expected Result: Header visually matches mockup inspiration Evidence: .sisyphus/evidence/t3-header.png ``` **Commit**: YES - Message: `style(dm): redesign DmHeader with purple-gold theme` - Files: `src/components/dm/DmHeader.astro` - [x] **T4. Update DmButton/DmCard/DmInput primitives** **What to do**: - Update `src/components/dm/DmButton.astro`: - Primary variant: purple fill (`#534AB7`) with gold shadow - Secondary variant: dark fill with gold border - Ghost variant: transparent with gold hover - Update focus rings to purple - Update `src/components/dm/DmCard.astro`: - Background: warm dark card surface (`#221e18`) - Border: subtle gold-tinted (`rgba(180,150,80,0.1)`) - Shadow: `shadow-lg shadow-black/20` preserved - Update `src/components/dm/DmInput.astro`: - Background: dark input surface - Border: gold-tinted focus state - Placeholder text: muted warm tone - Ensure all components use CSS custom properties where possible - Maintain existing props API (no breaking changes) **Must NOT do**: - Rename or remove props - Change component structure (slots, render logic) - Break existing usages **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [] - Reason: Visual updates to existing primitive components **Parallelization**: - **Can Run In Parallel**: YES - **Parallel Group**: Wave 1 (with T1-T3) - **Blocks**: T9-T13 - **Blocked By**: T1 (needs theme tokens) **References**: - `src/components/dm/DmButton.astro` — Current button implementation - `src/components/dm/DmCard.astro` — Current card implementation - `src/components/dm/DmInput.astro` — Current input implementation - Mockup buttons/cards — Pill shapes, borders, shadows **Acceptance Criteria**: - [ ] All three primitives use new theme colors - [ ] Existing props still work (variants, sizes, etc.) - [ ] No visual regressions in components that use them - [ ] Build passes **QA Scenarios**: ``` Scenario: Button variants render correctly Tool: Playwright Preconditions: Dev server running, T1 complete Steps: 1. Navigate to `http://localhost:4321/dm/` 2. Take screenshot showing buttons (e.g., in DiceRoller or InitiativeTracker) 3. Assert: Primary buttons have purple background 4. Assert: Secondary buttons have gold-tinted border Expected Result: Buttons match new theme Evidence: .sisyphus/evidence/t4-primitives.png ``` **Commit**: YES - Message: `style(dm): update UI primitives for purple-gold theme` - Files: `src/components/dm/DmButton.astro`, `src/components/dm/DmCard.astro`, `src/components/dm/DmInput.astro` - [x] **T4.5. Update i18n strings for new UI** **What to do**: - Update `src/i18n/dm-translations.ts` with new strings needed for redesigned UI: - Tab labels: "Кубики", "Инициатива", "Справочник", "Заметки" - Sidebar sections: "ИНСТРУМЕНТЫ", "СПРАВОЧНИК" - Action labels: "Бросить", "Следующий ход", "Очистить", "+ Добавить", "Сохранено" - Empty states: "Нет истории бросков", "Нет combatантов", "Нет результатов", "Начните писать заметки..." - Loading states: "Загрузка...", "Поиск..." - Ensure all existing strings are preserved - Use `useT(lang)` pattern consistent with existing translations - Export new typed translation keys **Must NOT do**: - Change existing translation keys (to avoid breaking components) - Add English translations (RU-only for DM Dashboard) **Recommended Agent Profile**: - **Category**: `quick` - **Skills**: [] - Reason: Simple string additions to existing translation file **Parallelization**: - **Can Run In Parallel**: YES - **Parallel Group**: Wave 1 (with T1-T4) - **Blocks**: T9-T13 (components need new strings) - **Blocked By**: None **References**: - `src/i18n/dm-translations.ts` — Current DM translations - `src/i18n/translations.ts` — Main site translation pattern **Acceptance Criteria**: - [ ] New strings added to `dm-translations.ts` - [ ] All strings used in redesigned components - [ ] TypeScript types updated - [ ] Build passes **QA Scenarios**: ``` Scenario: Translations load correctly Tool: Playwright Preconditions: Dev server running Steps: 1. Navigate to `http://localhost:4321/dm/` 2. Assert: Tab labels are in Russian 3. Assert: Button labels are in Russian 4. Assert: No untranslated English strings visible Expected Result: All UI text in Russian Evidence: .sisyphus/evidence/t4_5-i18n.png ``` **Commit**: YES (grouped with T4) - Message: `feat(dm): add i18n strings for redesigned UI` - Files: `src/i18n/dm-translations.ts` - [x] **T5. Redesign DmLayout with dashboard grid** **What to do**: - Redesign `src/layouts/DmLayout.astro` to support dashboard-style layout: - Desktop (lg+): 3-column grid container — sidebar slot (260px) | main slot (1fr) | context slot (300px) - Mobile/tablet (