Redesign DM Dashboard (/dm/, /ru/dm/) with purple-gold theme (#534AB7 + #c8a84b): Design System: - Update dm-theme.css with 49 purple-gold tokens (transitions, shadows, hover states) - Create DmTabs.astro with ARIA, keyboard nav, URL hash sync, localStorage persistence - Create DmSidebar.astro for desktop navigation - Redesign DmHeader with gold accent - Update DmButton, DmCard, DmInput primitives - Expand i18n to 47 strings Layout: - Redesign DmLayout with 3-column dashboard grid (sidebar|main|context) - Update /dm/index.astro and /ru/dm/index.astro with named slots Feature Components: - DiceRoller: empty state, ARIA live, color-coded history, storage key fallback - InitiativeTracker: HP editing, active highlighting, storage key fallback - Open5eReference: skeletons, debounce, error retry, gold tabs - NotesPanel: cross-tab sync, copy-to-clipboard, auto-save - AuthPanel: VK/Yandex brand colors, pill buttons Tests: - Add 50 Playwright E2E tests (smoke, dice, initiative, reference, notes, data-migration) Fixes: - Document Open5e client.ts URL bugfix - Add backward-compatible storage key fallback for dice/initiative - Preserve legacy sessionStorage data on load
9.0 KiB
9.0 KiB
Keyboard Navigation Report
Tested on desktop viewport (1440x900) by pressing Tab repeatedly and capturing focus state.
Focus 1: A " ← Назад к Randify " (/)
- Position: 826,18 | Size: 142x28px | Visible: true
- Outline:
1px none rgb(17, 17, 17)(offset: 1px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgb(22, 18, 14) 0px 0px 0px 2px, rgb(83, 74, 183) 0px 0px 0px 4px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 2: A "VKВойти через VK" (/api/auth/login/vk)
- Position: 977,14 | Size: 158x36px | Visible: true
- Outline:
1px none rgb(46, 46, 46)(offset: 1px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.875) 0px 0px 0px 1.75194px, rgba(83, 74, 183, 0.875) 0px 0px 0px 3.50387px, oklab(0 0 0 / 0.2) 0px 4px 6px -1px, oklab(0 0 0 / 0.2) 0px 2px 4px -2px - Focus visible: YES
Focus 3: A "YВойти через Яндекс" (/api/auth/login/yandex)
- Position: 1142,14 | Size: 178x36px | Visible: true
- Outline:
1px none rgb(60, 60, 60)(offset: 1px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.816) 0px 0px 0px 1.62858px, rgba(83, 74, 183, 0.816) 0px 0px 0px 3.25715px, oklab(0 0 0 / 0.2) 0px 4px 6px -1px, oklab(0 0 0 / 0.2) 0px 2px 4px -2px - Focus visible: YES
Focus 4: A " 🎲 Кубики " (#dice)
- Position: 105,113 | Size: 260x40px | Visible: true
- Outline:
1px auto rgb(34, 34, 35)(offset: 1px) - Ring width: ``
- Box shadow:
none - Focus visible: YES
Focus 5: A " ⚔️ Инициатива " (#initiative)
- Position: 105,157 | Size: 260x40px | Visible: true
- Outline:
1px auto rgb(34, 34, 35)(offset: 1px) - Ring width: ``
- Box shadow:
none - Focus visible: YES
Focus 6: A " 📖 Справочник " (#reference)
- Position: 105,201 | Size: 260x40px | Visible: true
- Outline:
1px auto rgb(34, 34, 35)(offset: 1px) - Ring width: ``
- Box shadow:
none - Focus visible: YES
Focus 7: A " 📝 Заметки " (#notes)
- Position: 105,245 | Size: 260x40px | Visible: true
- Outline:
1px auto rgb(34, 34, 35)(offset: 1px) - Ring width: ``
- Box shadow:
none - Focus visible: YES
Focus 8: A " Монстры " (#reference)
- Position: 105,333 | Size: 260x36px | Visible: true
- Outline:
1px auto rgb(43, 43, 45)(offset: 1px) - Ring width: ``
- Box shadow:
none - Focus visible: YES
Focus 9: A " Заклинания " (#reference)
- Position: 105,373 | Size: 260x36px | Visible: true
- Outline:
1px auto rgb(43, 43, 45)(offset: 1px) - Ring width: ``
- Box shadow:
none - Focus visible: YES
Focus 10: BUTTON " d4 "
- Position: 402,198 | Size: 76x38px | Visible: true
- Outline:
1px none rgb(25, 23, 19)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.953) 0px 0px 0px 1.9058px, rgba(83, 74, 183, 0.953) 0px 0px 0px 3.81159px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 11: BUTTON " d6 "
- Position: 486,198 | Size: 76x38px | Visible: true
- Outline:
1px none rgb(50, 44, 27)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.816) 0px 0px 0px 1.62858px, rgba(83, 74, 183, 0.816) 0px 0px 0px 3.25715px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 12: BUTTON " d8 "
- Position: 570,198 | Size: 76x38px | Visible: true
- Outline:
1px none rgb(39, 35, 23)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.875) 0px 0px 0px 1.75194px, rgba(83, 74, 183, 0.875) 0px 0px 0px 3.50387px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 13: BUTTON " d10 "
- Position: 654,198 | Size: 76x38px | Visible: true
- Outline:
1px none rgb(39, 35, 23)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.875) 0px 0px 0px 1.75194px, rgba(83, 74, 183, 0.875) 0px 0px 0px 3.50387px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 14: BUTTON " d12 "
- Position: 739,198 | Size: 76x38px | Visible: true
- Outline:
1px none rgb(50, 44, 27)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.816) 0px 0px 0px 1.62944px, rgba(83, 74, 183, 0.816) 0px 0px 0px 3.25887px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 15: BUTTON " d20 "
- Position: 823,198 | Size: 76x38px | Visible: true
- Outline:
1px none rgb(39, 35, 23)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.875) 0px 0px 0px 1.75194px, rgba(83, 74, 183, 0.875) 0px 0px 0px 3.50387px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 16: BUTTON " d100 "
- Position: 907,198 | Size: 76x38px | Visible: true
- Outline:
1px none rgb(39, 35, 23)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.875) 0px 0px 0px 1.75256px, rgba(83, 74, 183, 0.875) 0px 0px 0px 3.50513px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 17: INPUT ""
- Position: 402,280 | Size: 459x42px | Visible: true
- Outline:
1px none rgb(44, 44, 44)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.875) 0px 0px 0px 1.75194px, rgba(200, 168, 75, 0.875) 0px 0px 0px 3.50387px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 18: BUTTON "Бросить"
- Position: 868,278 | Size: 115x44px | Visible: true
- Outline:
1px none rgb(81, 81, 81)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.73) 0px 0px 0px 1.45914px, rgba(83, 74, 183, 0.73) 0px 0px 0px 2.91829px, rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.1) 0px 4px 6px -4px - Focus visible: YES
Focus 19: BUTTON "Очистить"
- Position: 883,342 | Size: 100x34px | Visible: true
- Outline:
1px none rgb(44, 44, 44)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.875) 0px 0px 0px 1.75131px, rgba(83, 74, 183, 0.875) 0px 0px 0px 3.50261px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 20: BUTTON "
d20 "
- Position: 790,630 | Size: 79x34px | Visible: true
- Outline:
1px none rgb(58, 58, 59)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.816) 0px 0px 0px 1.62858px, rgba(83, 74, 183, 0.816) 0px 0px 0px 3.25715px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 21: BUTTON "+ Добавить"
- Position: 881,612 | Size: 79x52px | Visible: true
- Outline:
1px none rgb(46, 46, 46)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.875) 0px 0px 0px 1.75194px, rgba(83, 74, 183, 0.875) 0px 0px 0px 3.50387px, rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.1) 0px 4px 6px -4px - Focus visible: YES
Focus 22: BUTTON "
Монстры "
- Position: 1042,150 | Size: 129x32px | Visible: true
- Outline:
1px none rgb(17, 17, 16)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgb(22, 18, 14) 0px 0px 0px 2px, rgb(83, 74, 183) 0px 0px 0px 4px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 23: BUTTON "
Заклинания "
- Position: 1171,150 | Size: 129x32px | Visible: true
- Outline:
1px none rgb(16, 16, 16)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgb(22, 18, 14) 0px 0px 0px 2px, rgb(83, 74, 183) 0px 0px 0px 4px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 24: SELECT " Все "
- Position: 1125,220 | Size: 154x41px | Visible: true
- Outline:
1px none rgb(58, 58, 59)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(22, 18, 14, 0.816) 0px 0px 0px 1.62858px, rgba(200, 168, 75, 0.816) 0px 0px 0px 3.25715px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Focus 25: TEXTAREA ""
- Position: 1063,442 | Size: 216x256px | Visible: true
- Outline:
1px auto rgb(16, 16, 16)(offset: 0px) - Ring width: ``
- Box shadow:
rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgb(200, 168, 75) 0px 0px 0px 1px, rgba(0, 0, 0, 0) 0px 0px 0px 0px - Focus visible: YES
Summary
- Total unique focusable elements reached: 25
- Elements with visible focus indicator: 25
- Elements without visible focus indicator: 0
- Focus screenshots saved: 25