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
190 lines
9.0 KiB
Markdown
190 lines
9.0 KiB
Markdown
# 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 |