mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 11:49:16 +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
62 lines
3.2 KiB
Markdown
62 lines
3.2 KiB
Markdown
# ТЗ #41 — Клавиатурное редактирование выбранных объектов
|
||
|
||
- Issue: https://github.com/Matysh/houseplan-card/issues/41
|
||
- Приоритет: P2
|
||
- Статус ТЗ: prototype-first draft
|
||
- Scope: desktop editors; touch editing остаётся best-effort
|
||
|
||
## Цель Stage 1
|
||
|
||
Выбирать существующие объекты, открывать свойства, удалять и точно сдвигать их
|
||
по сетке без мыши. Полное рисование arbitrary polygon клавиатурой не входит.
|
||
|
||
## Focus model
|
||
|
||
Каждый editor предоставляет один `EditorObjectNavigator` с roving tabindex по
|
||
объектам текущего editable layer и стабильным spatial order: top→bottom,
|
||
left→right, затем id. Tab входит/выходит из navigator один раз; стрелки при
|
||
навигации выбирают соседний объект, а не прокручивают page.
|
||
|
||
Режимы:
|
||
|
||
- `navigate`: стрелки меняют selection;
|
||
- `move` после Space или явной tray action: стрелки двигают selected object;
|
||
Escape отменяет gesture до command commit, Enter завершает.
|
||
|
||
Так устраняется конфликт «стрелка выбирает или двигает». Pointer selection
|
||
синхронизирует active descendant.
|
||
|
||
## Команды
|
||
|
||
- Enter — свойства выбранного объекта;
|
||
- Delete/Backspace — только delete выбранного через #32 там, где требуется;
|
||
- Space — начать/закончить keyboard move;
|
||
- arrows move = один grid node; Shift+arrow = 10 nodes;
|
||
- Escape — отмена move, затем selection/tool по существующему приоритету;
|
||
- Ctrl+Z/Ctrl+Shift+Z — общий named command stack.
|
||
|
||
Команды запрещены при focus в input/textarea/select/contenteditable/dialog.
|
||
Browser scroll/pan shortcuts остаются вне navigator.
|
||
|
||
## Geometry semantics
|
||
|
||
Move применяет существующие snap/validation/command APIs объекта. Room vertices
|
||
и wall resize не входят в Stage 1; целиком movable markers, openings вдоль
|
||
wall, partitions, columns и decor входят по мере наличия безопасной команды.
|
||
Невалидный move не commit-ится и объявляет причину.
|
||
|
||
## Announcements
|
||
|
||
`aria-live=polite`: выбран тип/имя; move start; координаты/длина/угол после
|
||
шага; invalid reason; Undo/Redo command name. Частые key repeats throttled, но
|
||
финальное значение всегда объявляется.
|
||
|
||
## Проверки и приёмка
|
||
|
||
- prototype доказывает отсутствие scroll/pan/form conflicts;
|
||
- navigator order после add/delete/space change;
|
||
- move every supported object, invalid/opening constraints, command undo;
|
||
- focus restore после property/confirm dialog;
|
||
- NVDA/Chrome manual checklist и browser keyboard smoke;
|
||
- unsupported object имеет свойства/delete, но не ложно доступный Move.
|