feat: add opt-in Glow to space card

Issue: #374
User-Visible: yes
This commit is contained in:
Sergey Matyunin
2026-08-29 14:46:52 +03:00
parent 8914190c56
commit 0dfc74244b
55 changed files with 12101 additions and 11199 deletions
+9 -4
View File
@@ -1198,6 +1198,11 @@ Shared, framework-light modules keep the two views from diverging:
use the shared `ResolvedDevicePresentation` and `renderDeviceFace`; optional card settings
can disable ordinary live dressing, temperature or signal without creating another
semantic implementation.
- `src/glow-scene.ts` — one canonical Glow transport/runtime/SVG implementation
shared by the full renderer and the opt-in static adapter. The static card's
public `light_pools` flag defaults to false and gates barrier/visibility work
before it starts; each mounted card owns and disposes its bounded clip cache,
source transitions and timers.
- `src/config-store.ts` — module-level `{config, rev, configFingerprint, layout,
layoutRev, layoutFingerprint}` cache shared by all embedded
cards (dedupes `houseplan/config/get`), seeded synchronously from the full card's
@@ -1244,10 +1249,10 @@ its configured space.
pools → sun/interactive layers. A resolved data/static fill (`lqi`, `light`,
`temp`, `custom`) never receives the dark base, so its exact color and alpha
remain visible; a dynamic mode without usable data or a custom fill with
zero opacity receives the base instead of exposing bright paper. Radial pools stay
independent and continue to render. The static
room card uses the same data/base projection, omits empty base groups, and
deliberately has no live pools.
zero opacity receives the base instead of exposing bright paper. Radial pools
stay independent and continue to render. The static room card uses the same
data/base projection, omits empty base groups, and renders the same live pools
only when its default-off `light_pools` option is enabled.
- **Custom room fill** (#56): `space.settings.custom_fill` is the space color
and `room.settings.custom_fill` is an optional explicit override. The pure
projection is room → space → `{c:'#607d8b',a:.18}` and every read crosses
+6
View File
@@ -2,6 +2,12 @@
## Unreleased
- The read-only `houseplan-space-card` can now opt into the full plan's radial
Glow and wall shadows with `light_pools: true`. It uses the same source
colour, brightness, radius, openings and physical occluders while remaining
fully non-interactive; the option defaults to `false` to preserve the cheap
existing-card path ([#374](https://github.com/Matysh/houseplan-card/issues/374)).
- `houseplan-space-card` with an explicit `title: ""` now removes the empty
top framing strip together with the header, while preserving its side and
bottom spacing ([#372](https://github.com/Matysh/houseplan-card/issues/372)).
+7
View File
@@ -8,6 +8,13 @@
## Не выпущено
- В read-only `houseplan-space-card` теперь можно включить радиальный Glow и
тени от стен как на полном плане: `light_pools: true`. Цвет, яркость, радиус,
проёмы и физические преграды общие с полным рендерером, а схема остаётся
полностью неинтерактивной. По умолчанию опция выключена, чтобы существующие
карточки сохранили дешёвый путь отрисовки
([#374](https://github.com/Matysh/houseplan-card/issues/374)).
- `houseplan-space-card` с явно заданным `title: ""` теперь убирает вместе с
заголовком пустую полосу кадрирования сверху, сохраняя боковые и нижнее поля
([#372](https://github.com/Matysh/houseplan-card/issues/372)).
+11 -13
View File
@@ -248,20 +248,18 @@ The complete UI and runtime truth table lives in
## Which surfaces render pools
Pools — and therefore wall shadows — exist on the **full plan only**:
`houseplan-card` and the geometry editors. `visibilityPolygon()`
(`src/light-visibility.ts`) is imported by those surfaces and by nothing else.
The full `houseplan-card` always renders pools for rooms where Glow is enabled.
`houseplan-space-card` uses the same canonical source projection, barrier scene,
visibility clip and SVG pool renderer when its public `light_pools: true` option
is enabled. It remains off by default: in that path the static card builds no
barrier/visibility geometry, starts no Glow transition timers and paints only
the shared room/data/base projection.
`houseplan-space-card` takes the static path (`renderSpaceStatic()` in
`src/space-render.ts`) and deliberately has no live radial pools; it shares the
room fills and the independent data/base projection with the full plan, so a lit
room is painted flat. Without a pool there is no shape to occlude, so the compact
card shows no wall shadows. This is a cost decision, not an omission: the pool
layer is the heaviest thing the product renders — it owns its own performance
workflow, budgets and a per-run smoke (`large-house-glow-overlay-v1`).
Reported from the field as a bug (#370), because the user guide promised that
markers share everything with the full plan and said nothing about light.
The opt-in remains fully static — `.hp-static-stage` and the Glow layer have
`pointer-events:none`. It is independent from the card's `live_states` marker
dressing. Separate `large-space-card-default-v1` and
`large-space-card-glow-v1` profiles protect the cheap default and the bounded
opt-in path alongside the full-plan profiles.
## Performance
+7
View File
@@ -2141,6 +2141,13 @@ require hands on real hardware — they remain for the human pass.
- [ ] Unknown `space` → tidy error card [manual]
- [ ] `show_button: false` hides the footer
- [ ] Full card honours `#space=<id>` on load and on hashchange; invalid id ignored [manual]
- [ ] Static Glow (#374): omitted/false `light_pools` creates no pool layer,
visibility geometry, cache entries or transition timers; `true` renders
the same source coordinates, radius, colour, brightness, per-source floor
clip, opening transmission and masonry shadows as the full card. The
stage remains `pointer-events:none`, and `live_states:false` does not
disable pools [unit: glow-scene; auto: smoke_glow_blending; performance:
large-space-card-default-v1 + large-space-card-glow-v1].
## Unified device status and pulse activity (#98)
+8 -7
View File
@@ -763,17 +763,18 @@ text sizing. `cycle` enables automatic space changes; interaction pauses it for
hover, drag, more-info or actions. A footer button opens the full plan. Use it
for compact dashboard navigation, not for home control.
**Light is deliberately different here.** The compact card paints the flat fill
of a lit room and the data-mode fills, but it builds no radial light pools from
the lamps. Consequently it draws no wall shadows either: a shadow exists only as
the shape of a pool, and with no pools there is nothing to occlude. The full plan
computes the pools and how walls, openings and columns block them
(`docs/LIGHT.md`); that is the most expensive part of the render, and it is
exactly what the compact card trades away for being cheap.
The compact card keeps radial light pools and wall shadows off by default, so
existing dashboards retain the cheapest render path. Set `light_pools: true`
to show the full plan's Glow: the same source colour, brightness and radius,
additive overlap, passages and shadows from walls, partitions and columns.
This is independent from `live_states`; disabling ordinary live marker dressing
does not disable light transport. The option is intentionally heavier than the
default because every visible source needs clipped floor visibility geometry.
```yaml
type: custom:houseplan-space-card
space: ground
light_pools: true
```
By default the card uses the configured space name as its header. A non-empty
+10 -6
View File
@@ -1484,12 +1484,14 @@ House Plan скрывает только собственную шапку. Ша
план, но не открывают подсказки или more-info. Единственный интерактивный
элемент — нижняя кнопка перехода.
**Свет здесь другой, и это намеренно.** Компактная карточка рисует ровную
заливку освещённой комнаты и заливки data-режимов, но не строит радиальные пулы
света от ламп. Значит, на ней нет и теней от стен: тень существует только как
форма пула, и без пулов затенять нечего. Полный план считает пулы и перекрытие
светом стен, проёмов и колонн (`docs/LIGHT.md`) — это самая дорогая часть
отрисовки, и компактная карточка платит за свою дешевизну именно ею.
Радиальные пулы света и тени от стен по умолчанию выключены, поэтому уже
созданные компактные карточки сохраняют самый дешёвый путь отрисовки. Включите
`light_pools: true`, чтобы получить полный Glow: те же цвет, яркость и радиус
источника, сложение пересекающихся пятен, прохождение через проёмы и тени от
стен, перегородок и колонн. Опция не зависит от `live_states`: отключение
обычного живого оформления маркеров не выключает свет. Включённый режим тяжелее
default-варианта, потому что для каждого видимого источника строится геометрия
доступного ему пола.
```yaml
type: custom:houseplan-space-card
@@ -1502,6 +1504,7 @@ icon_size: 2.5
live_states: true
show_temperature: true
show_signal: true
light_pools: true
```
| Поле | По умолчанию | Назначение |
@@ -1515,6 +1518,7 @@ show_signal: true
| `live_states` | `true` | Рабочие/открытые/недоступные состояния, смена иконок и активность; тревоги видны всегда |
| `show_temperature` | `true` | Компактные температура и влажность у подходящих устройств |
| `show_signal` | `true` | LQI у маркеров, если он доступен |
| `light_pools` | `false` | Радиальные пулы Glow и тени от стен как на полном плане; более тяжёлая отрисовка |
Если название уже показано секцией dashboard, задайте `title: ""` явно. В
этом случае карточка уберёт заголовок и верхнее пустое поле сцены, но сохранит