Files
houseplan-card/legacy/specs/056-static-room-color.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

4.1 KiB
Raw Permalink Blame History

ТЗ #56 — Статичная пользовательская заливка комнаты

Цель

Добавить обычную выбранную пользователем room color как fill option на уровне пространства и комнаты, не смешивая её с border/name color.

Модель

  • fill_mode:'custom' добавляется frontend/backend enum;
  • space.settings.custom_fill?: {c:string,a:number}|null — default пространства;
  • room.settings.custom_fill?: {c:string,a:number}|null — explicit override;
  • effective color при room fill_mode:'custom': room value → space value → documented default #607d8b с alpha 0.18.

Если room наследует fill mode пространства, его custom color всё равно может быть заранее сохранён и используется только когда effective mode custom. Смена режима не стирает color.

Security

Каждый color проходит render-time safeColor() #21; backend применяет общий defence-in-depth validator. Invalid old value не ломает room и получает safe default без silent config rewrite. Opacity finite/clamp 0..1.

UX

  • Space dialog fill options после #64: Свой цвет, LQI, Свет, Температура. Новое пространство начинает со «Своего цвета» и alpha 0, сохраняя прежний визуальный default без заливки и с Glow-базой до явного выбора прозрачности. Persisted space none остаётся read-compatible и при редактировании проецируется в custom с alpha 0, поэтому Preview и Save без изменений не меняют внешний вид или Glow-базу; room-level none остаётся явным override.
  • При «Свой цвет» появляется общий hp-color-opacity.
  • Room dialog: inherit/modes; для custom — «Цвет пространства» либо explicit color+opacity с Reset.
  • Live preview использует тот же resolveEffectiveRoomFill projection.
  • Border/name room_color остаётся отдельным control с ясной подписью.

Render integration

Custom entry добавляется в единый fill resolver и автоматически используется room floor, clean-floor holes и thick-wall opening tunnel fill. Hover сохраняет effective color. Источник-pools Glow #55 рисуются поверх; тёмная Glow-база для видимого resolved custom fill отсутствует и не изменяет stored custom alpha. Если custom alpha равен 0 или динамический fill разрешился в null из-за отсутствия данных, вместо светлой дыры применяется Glow-база.

Edge cases

Transparent alpha 0 равен визуально no fill, но mode сохраняется. Nested rooms имеют независимые colors; parent не красит hole. Light/dark theme, borders off, partitions/columns и openings используют текущую geometry. Import future modern color, не поддержанный browser, безопасно fallback-ится.

Проверки и приёмка

  • resolver inheritance/mode/color/alpha truth table;
  • frontend/backend enum and range parity #33;
  • hostile/invalid/modern color corpus #21;
  • room/tunnel/hover/nested visual golden, custom+Glow;
  • Save/reload/reset/Cancel, new-space transparent default и old config no-op roundtrip;
  • пользователь может назначить устойчивый цвет комнате без влияния HA state.