Files
houseplan-card/legacy/specs/034-frontend-decomposition.md
Claudeandclaude[bot] df46fd1c3e docs(hygiene): ТЗ выпущенных задач без живых ссылок — в legacy/specs (#682)
Волна 5 эпика #674, перенос ТЗ (класс C). Из 240 файлов `docs/specs/` в
`legacy/specs/` уехали 219: на них не ссылается ни один живой файл (код,
тесты, скрипты, workflow, документы вне архива и ревью). Остались 21 ТЗ —
на которые ссылаются код, ADR, ISOMETRIC, SUN, RADAR, LIGHT (`docs/specs/067`),
DECOR-EDITOR, support-relay, и те, на которые ссылаются они сами; README
каталога объясняет, где искать остальное. Открытых issue с файлом ТЗ среди
перенесённых нет. Относительные ссылки перенесённых файлов переписаны
(`../X` → `../../docs/X`, соседние оставшиеся ТЗ → `../../docs/specs/…`) —
все 26 резолвятся. Попутно: битая ссылка в
`089-isometric-view-stage1.md:8` на удалённый `089-isometric-view.md` —
теперь команда `git show` по истории. Строка в `legacy/README.md`.

Issue: #682
User-Visible: no
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
2026-09-27 22:10:46 +00:00

72 lines
3.2 KiB
Markdown

# ТЗ #34 — Поэтапная декомпозиция frontend
- Issue: https://github.com/Matysh/houseplan-card/issues/34
- Приоритет: P1
- Статус ТЗ: выполняется по slices
- Тип изменения: refactor-only, без пользовательского поведения
## Исходное состояние и цель
`src/houseplan-card.ts` сейчас около 14,9 тыс. строк, `styles.ts` — около 2,8
тыс. Корневой Lit-компонент должен стать composition/lifecycle shell, целевой
ориентир — менее 3500 строк после серии independently releasable slices.
## Правила slice
1. Один PR/этап переносит одну законченную ответственность вместе с types,
pure tests и owned styles.
2. Внешний DOM, i18n keys, stored payload, command names, pointer thresholds и
render order не меняются.
3. Существующие geometry/device/sun/vacuum pure modules остаются authority;
вторая модель запрещена.
4. Новый product code использует `unknown` + guards; `any` допустим только в
явно названном HA adapter boundary.
5. До/после slice проходит одинаковый test/golden/performance set.
## Целевая структура
- `app/`: card composition, normalized store, navigation/viewport;
- `editors/{plan,devices,decor}`: typed state machines и commands;
- `render/`: immutable projections для rooms/walls/openings/lighting/devices/vacuum;
- `dialogs/`: draft models, validation, serialization, render components;
- `components/`: общие dialog/confirm/color/tray primitives.
## Порядок
### Slice 1 — малые dialog models
Вынести partition/column property draft: `fromConfig`, validation,
`toPatch`, equality. Root сохраняет callbacks и geometry commands.
### Slice 2 — render-only layers
По одному: room shapes/hover, wall body, lighting, device overlay, vacuum.
Input — frozen projection; output — template + typed callbacks без store access.
### Slice 3 — крупные dialog models
Room/opening → space → device/settings. Не смешивать с IA #30.
### Slice 4 — editor controllers
Plan, Devices, Decor pointer/keyboard state machines; command stack остаётся
общим интерфейсом.
### Slice 5 — store/navigation/styles
Revision/conflict/save orchestration, warm viewport, затем scoped styles.
## Метрики и gate
- root lines и доля TS монотонно уменьшаются;
- feature module обычно <800 строк, исключение документируется;
- `any` count не растёт;
- circular import check, bundle size/perf budgets;
- no-op config roundtrip, complete smoke и reviewed golden без delta.
## Приёмка
Каждый slice может быть отдельно reverted/released, не содержит feature work и
имеет architectural note. Финал достигает целевой роли root и удаляет
временные compatibility adapters.