Files
houseplan-card/docs/specs/034-frontend-decomposition.md
Matysh 112c260314
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
Release v1.61.0-beta.1
2026-08-09 21:51:33 +03:00

3.2 KiB

ТЗ #34 — Поэтапная декомпозиция frontend

Исходное состояние и цель

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.