mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 03:38:47 +00:00
Validate / hacs (push) Failing after 12s
Validate / hassfest (push) Failing after 13s
Validate / frontend (push) Successful in 3m2s
Validate / golden (push) Failing after 51s
Validate / backend (push) Failing after 6m50s
Validate / smoke (push) Failing after 13m44s
Validate / performance (push) Failing after 24m13s
57 lines
3.3 KiB
Markdown
57 lines
3.3 KiB
Markdown
# ТЗ #31 — Доступная семантика режима View
|
|
|
|
- Issue: https://github.com/Matysh/houseplan-card/issues/31
|
|
- Приоритет: P1
|
|
- Статус ТЗ: draft, требуется UX-проверка screen reader
|
|
- Зависимость: room dialog #28
|
|
|
|
## Цель
|
|
|
|
Обеспечить основные View-сценарии клавиатурой и screen reader без сотен
|
|
tab-stop и без изменения pointer UX.
|
|
|
|
## Рекомендуемая модель
|
|
|
|
Над SVG существует одна визуально скрытая, но screen-reader доступная
|
|
`PlanNavigator`-структура с тремя группами: Комнаты, Устройства, Проёмы.
|
|
Внутри применяется roving tabindex: в общем Tab-порядке одна активная запись,
|
|
стрелки перемещают активную запись, Home/End — края группы, Ctrl+стрелка —
|
|
соседняя группа. SVG shapes остаются `aria-hidden`, чтобы не дублировать дерево.
|
|
|
|
## Accessible projection
|
|
|
|
Один pure resolver создаёт для объекта:
|
|
|
|
- стабильный id и role (`button` для действия, `group` для read-only);
|
|
- label: имя, тип, комната, локализованное состояние, основное действие;
|
|
- description: доступные метрики/предупреждения;
|
|
- action: room dialog, device action/more-info, opening status.
|
|
|
|
`static_icon` влияет на визуал, но accessible label всё равно сообщает реальное
|
|
HA-состояние. Disabled/orphaned объекты явно называются недоступными.
|
|
|
|
## Keyboard и focus lifecycle
|
|
|
|
- Enter/Space активирует основной action; контекстное more-info остаётся
|
|
отдельной подписанной командой в открывшейся карточке.
|
|
- Смена пространства фокусирует PlanNavigator heading, затем первую комнату.
|
|
- Закрытие room/device dialog возвращает фокус на исходную запись.
|
|
- Исчезнувший объект возвращает фокус к ближайшему соседу/заголовку.
|
|
- Kiosk сохраняет доступный View, но editor controls отсутствуют.
|
|
|
|
## Нецветовые состояния
|
|
|
|
Critical alarm получает alert glyph и текст; open/unlocked — outline/glyph;
|
|
mechanical activity — motion glyph/accessible live text. Не добавлять постоянные
|
|
satellite badges каждому marker. `prefers-reduced-motion` отключает pulse, но
|
|
не текстовый state.
|
|
|
|
## Проверки и приёмка
|
|
|
|
- axe: name/role/value, landmark, focus order, dialog boundaries;
|
|
- NVDA/Chrome и TalkBack ручной checklist;
|
|
- keyboard: room, ordinary device, alarm, opening, disabled device;
|
|
- 200 markers дают один Tab entry на plan navigator, не 200;
|
|
- выключенный цвет/анимация не лишает пользователя состояния;
|
|
- pointer hit-testing и golden View не меняются без осознанного glyph delta.
|