mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-05 14:19:04 +00:00
feat: LED strips — editor notes, docs, demo, smokes, golden scenes, profile (#780)
Stage 5 of #780. - Import summary: «Strips left unbound after import: {n}» from the backend `unbound_led_strips` count; «Optimize plans» reports strips passing through walls per space and edits none (AC16). - Linear field for long strips (ТЗ §13.2): pieces of at most the radius along the polyline, emitters thinned to r/4, each piece clipped to the visibility fans of its own emitters as separate clipPath children (no boolean pass per piece), one floor clip for the whole layer, no fan at all where nothing blocks within the radius; a grid index of body faces and boxed inside tests; unchanged fields skip re-diffing. 50×50 on the large house: first stable frame ~1.4 s, warm space ~1.1 s locally. - led-strips-v1 profile: demo/benchmark_led_strips.mjs with the derived large-house fixture (10×5, 50×50, none), absolute limits of the ТЗ table in demo/performance/budgets-led-strips.json, exact counters (zero recomputes on HA ticks/camera/colour, ≤50 cache entries, no growth over 20 cycles); added to the full performance workflow. - Bundle: LAZY_LED_GZIP_CEILING 10 KiB, LAZY_LED_EDITOR_GZIP_CEILING 11 KiB (measured + 10 %, rounded up); overlaps with the initial and editor graphs refused; the lazy editor graph stays inside its ceiling. - Smokes smoke_led_strip_draw/bind/glow, linked in smoke-links; 13 mutants in the registry (7 browser guards in the inventory); config field registry entry `spaces[].led_strips`. - Golden: five new scenes on the `golden-led` space of the visual fixture (`ledStrips` option, the designer's four strips on #868D94), matrix v71. - Docs: LIGHT, DEVICE-PRESENTATION, USER-GUIDE (en/ru), UX-MODES, ARCHITECTURE, ISOMETRIC, CONFIG-COMPATIBILITY, TOUCH-SUPPORT, demo/stand README, performance README; docs/design/led-strips with the unchanged designer archive, two paired frames and ACCEPTANCE.md; both changelogs. Issue: #780 User-Visible: yes
This commit is contained in:
@@ -14,11 +14,11 @@ to prove that the Node witness actually kills it.
|
||||
| --- | ---: | --- |
|
||||
| Performance threshold | 4 | The witness measures real browser wall-time or frame work; a pure assertion cannot prove the budget. |
|
||||
| Browser harness integrity | 4 | The mutation breaks page-error, round-trip or page-registration observation in the browser harness itself. |
|
||||
| Paint, cascade and layer composition | 26 | The invariant depends on computed CSS, SVG paint, clipping, stacking or pixels produced by Chromium. |
|
||||
| Pointer geometry and trusted interaction | 45 | The invariant depends on hit testing, pointer capture, touch/keyboard dispatch or live DOM geometry. |
|
||||
| Paint, cascade and layer composition | 30 | The invariant depends on computed CSS, SVG paint, clipping, stacking or pixels produced by Chromium. |
|
||||
| Pointer geometry and trusted interaction | 47 | The invariant depends on hit testing, pointer capture, touch/keyboard dispatch or live DOM geometry. |
|
||||
| Responsive DOM layout | 38 | The invariant depends on measured element boxes, responsive breakpoints, native/HA dialog shells or focusable target size. |
|
||||
| Custom-element and HA browser lifecycle | 99 | The invariant crosses Lit/custom-element lifecycle, browser storage/events, lazy loading or a complete HA-card state transition. |
|
||||
| **Total** | **216 / 200** | Above the guideline `mutation-gate --check` warns rather than fails (#699); each guard above it is held by its own reason in this inventory and its `because`. |
|
||||
| Custom-element and HA browser lifecycle | 100 | The invariant crosses Lit/custom-element lifecycle, browser storage/events, lazy loading or a complete HA-card state transition. |
|
||||
| **Total** | **223 / 200** | Above the guideline `mutation-gate --check` warns rather than fails (#699); each guard above it is held by its own reason in this inventory and its `because`. |
|
||||
|
||||
## Measured effect
|
||||
|
||||
@@ -91,6 +91,10 @@ The invariant depends on computed CSS, SVG paint, clipping, stacking or pixels p
|
||||
- `iso-sun-card-drops-occluders`
|
||||
- `iso-sun-flat-wedges-remain`
|
||||
- `iso-theme-dark-wall-rule-returns`
|
||||
- `led-core-coloured-under-glow`
|
||||
- `led-icon-not-suppressed`
|
||||
- `led-source-stays-round-at-anchor`
|
||||
- `led-unbound-in-view`
|
||||
- `stage3-w4-device-target-loses-44px-floor`
|
||||
- `stage3-w5-runtime-nudge-writes-storage`
|
||||
- `stage3-w6-no-borders-keeps-raised-plates`
|
||||
@@ -119,6 +123,8 @@ The invariant depends on hit testing, pointer capture, touch/keyboard dispatch o
|
||||
- `furniture-shift-listeners-not-attached`
|
||||
- `furniture-wall-runtime-drops-drag-side`
|
||||
- `furniture-wall-runtime-drops-raw-intent`
|
||||
- `led-pan-adds-point`
|
||||
- `led-pinch-calls-action`
|
||||
- `live-pinch-compositor-demoted-on-active-lit-commit`
|
||||
- `opening-dimension-overlay-hidden`
|
||||
- `opening-search-hides-none`
|
||||
@@ -228,8 +234,6 @@ The invariant crosses Lit/custom-element lifecycle, browser storage/events, lazy
|
||||
- `device-focus-tooltip-handler-removed`
|
||||
- `device-focus-tooltip-room-hover-overwrites`
|
||||
- `device-inbox-batch-rollback`
|
||||
- `household-enter-stops-acting`
|
||||
- `household-marker-drops-keyboard-reach`
|
||||
- `device-markers-rendered-without-keys`
|
||||
- `device-pointer-leave-clears-focus-fallback`
|
||||
- `device-position-cancel-routed-to-commit`
|
||||
@@ -240,10 +244,13 @@ The invariant crosses Lit/custom-element lifecycle, browser storage/events, lazy
|
||||
- `floor-geometry-key-global-epoch`
|
||||
- `floor-geometry-key-ignores-content`
|
||||
- `french-locale-wrong-dictionary`
|
||||
- `household-enter-stops-acting`
|
||||
- `household-marker-drops-keyboard-reach`
|
||||
- `hp-dialog-escape-does-not-close`
|
||||
- `junction-limit-baseline-cache-stale`
|
||||
- `junction-limit-candidate-fail-open`
|
||||
- `junction-limit-write-gate-removed`
|
||||
- `led-auto-slot-reserved`
|
||||
- `locale-failure-toast-dropped`
|
||||
- `marker-reject-keeps-optimistic-candidate`
|
||||
- `marker-rollback-keeps-enqueue-time-revision`
|
||||
@@ -278,16 +285,16 @@ The invariant crosses Lit/custom-element lifecycle, browser storage/events, lazy
|
||||
- `support-stale-preview-response-revives-consent`
|
||||
- `support-timeout-claims-success`
|
||||
- `vacuum-overlay-back-to-the-dock-space-filter`
|
||||
- `volumetric-kiosk-ignores-setting`
|
||||
- `view-current-space-aria-removed`
|
||||
- `volumetric-kiosk-ignores-setting`
|
||||
- `wall-face-apply-skips-overlap-guard`
|
||||
- `wallthick-hit-narrowed`
|
||||
- `warm-pending-mode-leaves-revive-waiting`
|
||||
- `warm-resume-overwrites-view-return-camera`
|
||||
- `warm-resume-camera-depends-on-dialog`
|
||||
- `warm-pan-during-runtime-keeps-refit-blocked`
|
||||
- `warm-late-resume-beats-user-mode`
|
||||
- `warm-late-resume-crosses-space`
|
||||
- `warm-pan-during-runtime-keeps-refit-blocked`
|
||||
- `warm-pending-mode-leaves-revive-waiting`
|
||||
- `warm-resume-camera-depends-on-dialog`
|
||||
- `warm-resume-overwrites-view-return-camera`
|
||||
- `writer-history-skips-finished-chain-normalization`
|
||||
- `zigbee-topology-endpoint-cleanup-skipped`
|
||||
- `zigbee-topology-endpoint-elevation-removed`
|
||||
|
||||
Reference in New Issue
Block a user