fix: openings and markers keep their identity across a space switch (#525)

Lit reuses list nodes by position. The opening list and the device markers had
no keys, so on a space switch the leaf that held a slot kept its DOM node and
only changed values — and `.op-leaf` (transform) and `.op-arc`
(stroke-dashoffset) carry a 0.6 s transition, so the browser animated a door
that never moved: the new floor's leaf drove in from the previous floor's
opening angle. Measured on two spaces with a door in the same place and
opposite contact states: the node is reused, transform goes
`rotate(-90deg) → rotate(0deg)`, dash offset `0 → 125.66`, both transitions
`running`. The marker shell adds two more with its `box-shadow`.

Both lists are now rendered through `repeat(…, (item) => item.id, …)`, the
same lesson `glow-scene.ts` already learned for the Glow spots. The trap is
written where it starts — above the two transitions in `plan.styles.ts` —
because that is the file someone edits when adding the next animated property.
`houseplan-card.ts` is at its line ceiling, and the note would have cost the
budget a dozen lines for nothing: the swap itself is line-for-line.

The witness walks the shadow tree per element. `document.getAnimations()` is
empty here EVEN ON THE BROKEN CODE — the card lives in a shadow root and the
document-level call does not reach into it, and the issue proposed exactly
that call. The smoke also builds its own fixture: the demo home has no
openings at all, so two doors in two spaces are prepared in the smoke, and it
asserts the other half of the contract as well — a real contact change inside
one space still animates the leaf.

On `origin/dev` the smoke fails on five facts, naming the offenders:
`op-arc:stroke-dashoffset`, `op-leaf:transform`, `device-shell-frame:box-shadow`
twice. Mutants `openings-rendered-without-keys` and
`device-markers-rendered-without-keys` put each `map` back.

Perf, 7 samples against `19e421b3`: spaceSwitchMs 524.8 (limit 769.35, base
512.9), switchCycleMs 1293.9 (1696.28, 1256.5), firstStableRenderMs 2533.8
(3000, 2529.2), modelReadyMs 732.7 (944.97, 726.9), longTask.maxSingleMs 663
(910, 660) — `benchmark:compare` green in full.

The initial View graph grows 241 B gzip: `repeat` enters it for the first
time. The #438 ceiling is recentred 300 400 → 300 700 with the usual dated
note; measured 300 059 B keeps 641 B above and 1 359 B below the band. The
301 066 B budget is untouched, but only 366 B now separate the ceiling from
it — the #367 headroom debt has stopped being theoretical.

Issue: #525
User-Visible: yes
This commit is contained in:
Claude
2026-09-11 01:42:46 +00:00
committed by claude[bot]
parent 95175a7616
commit 9edef041a9
50 changed files with 813 additions and 578 deletions
@@ -1,309 +1,309 @@
{ {
"schema": 1, "schema": 1,
"fingerprint": "f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec", "fingerprint": "7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618",
"entry": "houseplan-card.js", "entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js", "panelEntry": "houseplan-panel.js",
"initialViewFiles": [ "initialViewFiles": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-card.js" "houseplan-card.js"
], ],
"initialViewGzipBytes": 299818, "initialViewGzipBytes": 300059,
"initialPanelFiles": [ "initialPanelFiles": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-card.js", "houseplan-card.js",
"houseplan-panel.js" "houseplan-panel.js"
], ],
"initialPanelGzipBytes": 302123, "initialPanelGzipBytes": 302365,
"initialPanelOnlyFiles": [ "initialPanelOnlyFiles": [
"houseplan-panel.js" "houseplan-panel.js"
], ],
"initialPanelOnlyGzipBytes": 2305, "initialPanelOnlyGzipBytes": 2306,
"lazyFiles": [ "lazyFiles": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/de-Rx23MWgW.js", "houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/editor-BKd7m0Cl.js", "houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/fr-Cmciv8Kg.js", "houseplan-assets/fr-lBEFwYGK.js",
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-editor-runtime-Ct6C87Tu.js", "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/houseplan-onboarding-runtime-BNaIaYhC.js", "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"houseplan-assets/hp-zigbee-topology-overlay-BRzrNvxL.js", "houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"houseplan-assets/iso-scene-render-cM25hLUD.js", "houseplan-assets/iso-scene-render-RhSO-S9j.js",
"houseplan-assets/live-interaction-runtime-CfFnUimM.js", "houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"houseplan-assets/pdf-export-C7QX7Os6.js", "houseplan-assets/pdf-export-CsCJxU0E.js",
"houseplan-assets/summary-panel-runtime-loaded-fHmauMhT.js", "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js", "houseplan-assets/zigbee-topology-LI-FVdpo.js",
"houseplan-assets/zigbee-topology-runtime-cidfav1L.js" "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
], ],
"lazyGzipBytes": 418163, "lazyGzipBytes": 418179,
"lazyEditorFiles": [ "lazyEditorFiles": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/editor-BKd7m0Cl.js", "houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-editor-runtime-Ct6C87Tu.js", "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js" "houseplan-assets/zigbee-topology-LI-FVdpo.js"
], ],
"lazyEditorGzipBytes": 205716, "lazyEditorGzipBytes": 205726,
"lazyOnboardingFiles": [ "lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/houseplan-onboarding-runtime-BNaIaYhC.js" "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js"
], ],
"lazyOnboardingGzipBytes": 14184, "lazyOnboardingGzipBytes": 14187,
"lazyLocaleFiles": [ "lazyLocaleFiles": [
"houseplan-assets/de-Rx23MWgW.js", "houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/fr-Cmciv8Kg.js" "houseplan-assets/fr-lBEFwYGK.js"
], ],
"lazyLocaleGzipBytes": 54858, "lazyLocaleGzipBytes": 54854,
"lazyIsometricFiles": [ "lazyIsometricFiles": [
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/iso-scene-render-cM25hLUD.js" "houseplan-assets/iso-scene-render-RhSO-S9j.js"
], ],
"lazyIsometricGzipBytes": 13458, "lazyIsometricGzipBytes": 13460,
"lazyFurnitureArtFiles": [ "lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js" "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js"
], ],
"lazyFurnitureArtGzipBytes": 10252, "lazyFurnitureArtGzipBytes": 10255,
"lazyPdfFiles": [ "lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/pdf-export-C7QX7Os6.js" "houseplan-assets/pdf-export-CsCJxU0E.js"
], ],
"lazyPdfGzipBytes": 120368, "lazyPdfGzipBytes": 120372,
"files": [ "files": [
{ {
"path": "houseplan-assets/backdrop-pick-Cn3C2LDS.js", "path": "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"sha256": "ce4df7477daa960c9f146de09dd7e9f383e13dd1199b32ccf5e8fdbc03361594", "sha256": "e76da9cb2c5c8a32b2798c6f8785819bd7ff6ee624987feb8ff2c89522f87fef",
"rawBytes": 21134, "rawBytes": 21134,
"gzipBytes": 7147, "gzipBytes": 7148,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/de-Rx23MWgW.js", "path": "houseplan-assets/de-HksnN-9C.js",
"sha256": "35001ee0702c4b0a1dec055a4ce59450a4944610d1c3f4b2395f6b43a8c516a8", "sha256": "3a1ada3b04ef3eb7e9c6856c700d589e90e962a6753087b59f89b481c68a9499",
"rawBytes": 91441, "rawBytes": 91441,
"gzipBytes": 27712, "gzipBytes": 27710,
"isEntry": false, "isEntry": false,
"imports": [], "imports": [],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/editor-BKd7m0Cl.js", "path": "houseplan-assets/editor-CSFqqHwT.js",
"sha256": "fb68ec6ca16c3dde08e8b423492f76b762ebe22275c40a7bc36fa8acce4da4ad", "sha256": "a5adebb3a438356deb0e5a35fa218bcb4ab6a8be23d6e535b6cd350170775926",
"rawBytes": 3832, "rawBytes": 3832,
"gzipBytes": 1584, "gzipBytes": 1585,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/fr-Cmciv8Kg.js", "path": "houseplan-assets/fr-lBEFwYGK.js",
"sha256": "587aee0ac33d157d50d4f80a3fe66846dc6bf779cdad865b1c43eacab78d1c4e", "sha256": "de104eb96b8e4fbb2895ab861300878eb3f27dc616e4737bc2e9e818286c9d88",
"rawBytes": 93719, "rawBytes": 93719,
"gzipBytes": 27146, "gzipBytes": 27144,
"isEntry": false, "isEntry": false,
"imports": [], "imports": [],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "path": "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"sha256": "1209c487274724f24a596cc73f632e59cd1955ff25f42e506177656abc2e54f6", "sha256": "9b63fd1d6479a45b433b323468a56b46ab0e0e3d2a5bfb82b6349d475e59eee8",
"rawBytes": 33655, "rawBytes": 33655,
"gzipBytes": 10252, "gzipBytes": 10255,
"isEntry": false, "isEntry": false,
"imports": [], "imports": [],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/guard-B-DpMbo8.js", "path": "houseplan-assets/guard-Bdo2w6Sq.js",
"sha256": "fcf685e554aae83843223f5c19b3db5e194eb54ff6344ba0448cb6f82a01cb9c", "sha256": "b98da3eb22fde2449b43c37851d7e2cbbcb14103b20b7c6b417fa4bab2502416",
"rawBytes": 518, "rawBytes": 518,
"gzipBytes": 372, "gzipBytes": 371,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/houseplan-card-Bp1zKCs9.js", "path": "houseplan-assets/houseplan-card-DkiI2BOK.js",
"sha256": "fbccd0542cc2244ad027ae8f23faea17d5bbbe1ebf7c4a9a44c2609714a7f100", "sha256": "e7bdf9f5d1b699c27b57f25c369b137eceae0cf6f3ec7f2d364ef6c2bd552887",
"rawBytes": 1078600, "rawBytes": 1079369,
"gzipBytes": 299014, "gzipBytes": 299254,
"isEntry": false, "isEntry": false,
"imports": [], "imports": [],
"dynamicImports": [ "dynamicImports": [
"houseplan-assets/de-Rx23MWgW.js", "houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/editor-BKd7m0Cl.js", "houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/fr-Cmciv8Kg.js", "houseplan-assets/fr-lBEFwYGK.js",
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/houseplan-editor-runtime-Ct6C87Tu.js", "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/houseplan-onboarding-runtime-BNaIaYhC.js", "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"houseplan-assets/hp-zigbee-topology-overlay-BRzrNvxL.js", "houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"houseplan-assets/iso-scene-render-cM25hLUD.js", "houseplan-assets/iso-scene-render-RhSO-S9j.js",
"houseplan-assets/live-interaction-runtime-CfFnUimM.js", "houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"houseplan-assets/pdf-export-C7QX7Os6.js", "houseplan-assets/pdf-export-CsCJxU0E.js",
"houseplan-assets/summary-panel-runtime-loaded-fHmauMhT.js" "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js"
] ]
}, },
{ {
"path": "houseplan-assets/houseplan-editor-runtime-Ct6C87Tu.js", "path": "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"sha256": "1b4a0ed9da5735e0ead38d031fa24a8046ba1684144b8cc0bbbb0f3fbaec851f", "sha256": "00be6a1cdb443cd875e736984baf86b77e63d96474ec72d4d66bf2baa9f1a2ba",
"rawBytes": 672339, "rawBytes": 672339,
"gzipBytes": 178931, "gzipBytes": 178936,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js" "houseplan-assets/zigbee-topology-LI-FVdpo.js"
], ],
"dynamicImports": [ "dynamicImports": [
"houseplan-assets/zigbee-topology-runtime-cidfav1L.js" "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
] ]
}, },
{ {
"path": "houseplan-assets/houseplan-onboarding-runtime-BNaIaYhC.js", "path": "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"sha256": "354e2a62dc98b9c0540ef2fd946d7d6ffe57228eaea970a160ed342c067b85a5", "sha256": "f81b58bde08ff74bab903803cc709e18449900dc91a3f64106db737bbabd55e3",
"rawBytes": 28287, "rawBytes": 28287,
"gzipBytes": 7037, "gzipBytes": 7039,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/hp-zigbee-topology-overlay-BRzrNvxL.js", "path": "houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"sha256": "477c0a0d7c9b3cfcc31ae10ec258ad1dc0813d0e2a85090d9cc7b39bdc9cb264", "sha256": "968345cc4eaaf6cc46accbdc30b4fff83e3fc40a5a7b7a0f611229f0e53ec6b9",
"rawBytes": 11034, "rawBytes": 11034,
"gzipBytes": 3730, "gzipBytes": 3731,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js", "houseplan-assets/zigbee-topology-LI-FVdpo.js",
"houseplan-assets/zigbee-topology-runtime-cidfav1L.js" "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/iso-scene-render-cM25hLUD.js", "path": "houseplan-assets/iso-scene-render-RhSO-S9j.js",
"sha256": "23631a94530e942caf4f396db1a88d0a40b42e668b25988ea0c903fe475bae4b", "sha256": "b5c630c05c0c2648c96006ab51cf271ae2ca585742df4bd9ad456ce9dac86646",
"rawBytes": 38562, "rawBytes": 38562,
"gzipBytes": 13086, "gzipBytes": 13089,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/live-interaction-runtime-CfFnUimM.js", "path": "houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"sha256": "3bfa67222093a06ca360d43b666a5b68bd6ec4e5a4997b6876a57b1c0f3bd189", "sha256": "319a2a94cf85acd20b27522ae71b81e25ee1f2d69f1688256c5eeed4dddec3d5",
"rawBytes": 5196, "rawBytes": 5196,
"gzipBytes": 2128, "gzipBytes": 2129,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/pdf-export-C7QX7Os6.js", "path": "houseplan-assets/pdf-export-CsCJxU0E.js",
"sha256": "fda446084e6a626d103d53b326b2e8053c8188e99c52db752bcfe29b1144ae5e", "sha256": "eccac69e0d54ceeff8fceb8db69a0f20f5339443cb7961f8916f9a850bb1ae6c",
"rawBytes": 237254, "rawBytes": 237254,
"gzipBytes": 110116, "gzipBytes": 110117,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/summary-panel-editor-v6P_pydT.js", "path": "houseplan-assets/summary-panel-editor-BC_vG9Hn.js",
"sha256": "a3f855dedeef4f4495e0839c343d627fbcf08eb4bde465f8155b9d2db9897489", "sha256": "5c7fd338b94152ae5e1194f07c6353863a9e22c4f2e99424f5795484da989a64",
"rawBytes": 14824, "rawBytes": 14824,
"gzipBytes": 3400, "gzipBytes": 3401,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/summary-panel-runtime-loaded-fHmauMhT.js" "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/summary-panel-metrics-CWsAhuuf.js", "path": "houseplan-assets/summary-panel-metrics-C2M32Xkf.js",
"sha256": "5dc4acc6d8b5204659a47617d8f9fcc33e49d250706cc3b0eea91b7639d5b5d3", "sha256": "bca21f0d66af64c7c1ef501a8cd38e04e2a74ee7196e004f6f60397d9e9a72f1",
"rawBytes": 2610, "rawBytes": 2610,
"gzipBytes": 1307, "gzipBytes": 1308,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/summary-panel-runtime-loaded-fHmauMhT.js", "path": "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js",
"sha256": "4b2b0b337120ddf130777bd73a9c77f646bbd74adc861b2f749cf73b209eea5d", "sha256": "54c791fdd19e77c24ac142794c4207345eaec03d2ab15dfdf3b991afa32bb812",
"rawBytes": 72272, "rawBytes": 72272,
"gzipBytes": 19727, "gzipBytes": 19729,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [ "dynamicImports": [
"houseplan-assets/summary-panel-editor-v6P_pydT.js", "houseplan-assets/summary-panel-editor-BC_vG9Hn.js",
"houseplan-assets/summary-panel-metrics-CWsAhuuf.js" "houseplan-assets/summary-panel-metrics-C2M32Xkf.js"
] ]
}, },
{ {
"path": "houseplan-assets/zigbee-topology-BqMFLBzX.js", "path": "houseplan-assets/zigbee-topology-LI-FVdpo.js",
"sha256": "60da11d2bdb40780b5ca7853c8ca5c7c70f334442a56eda9052f76df260c458b", "sha256": "d01ec49d20c5f3dc028a59107f1f9060634ab93d6d112e03a7c2b85792159440",
"rawBytes": 18961, "rawBytes": 18961,
"gzipBytes": 7430, "gzipBytes": 7431,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/zigbee-topology-runtime-cidfav1L.js", "path": "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js",
"sha256": "ad947ed4a3a1c0da71322a8cb3d2487b735c5d53abea0c129f0727f5a9ad0d12", "sha256": "3a0fad7d479bbeb161434e498a3c8ac7f88da62ef37c173b66f95057098bcc97",
"rawBytes": 3941, "rawBytes": 3941,
"gzipBytes": 1765, "gzipBytes": 1765,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js" "houseplan-assets/zigbee-topology-LI-FVdpo.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-card.js", "path": "houseplan-card.js",
"sha256": "40819c556cd468a5dac8bfb8dc2eb5e5b14a9a78684d402a470d026d9aab4781", "sha256": "21da7b3390ea9d4992e33bf4d6fdf684145b53f407e253a599e70a459585298d",
"rawBytes": 1205, "rawBytes": 1205,
"gzipBytes": 804, "gzipBytes": 805,
"isEntry": true, "isEntry": true,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-panel.js", "path": "houseplan-panel.js",
"sha256": "d678f3b11374134cd913c92a93916f04cbde2b184fad191f4e599f43317d4909", "sha256": "a664721695cf5c85903eea440d05a295cb6d6d2cd1e3669fd5c65c9752534492",
"rawBytes": 6124, "rawBytes": 6124,
"gzipBytes": 2305, "gzipBytes": 2306,
"isEntry": true, "isEntry": true,
"imports": [ "imports": [
"houseplan-card.js" "houseplan-card.js"
@@ -1,14 +1,14 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{m as e,l as o,t,e3 as s,A as a,e4 as i,e5 as l,e6 as n,dU as r,b as c}from"./houseplan-card-Bp1zKCs9.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{m as e,l as o,t,e3 as s,A as a,e4 as i,e5 as l,e6 as n,dU as r,b as c}from"./houseplan-card-DkiI2BOK.js";class f extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,f={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},h=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass} .hass=${this.hass}
.data=${this._formData} .data=${this._formData}
.schema=${e} .schema=${e}
.computeLabel=${e=>h[e.name]||e.name} .computeLabel=${e=>f[e.name]||e.name}
@value-changed=${this._valueChanged} @value-changed=${this._valueChanged}
></ha-form>`;return c` ></ha-form>`;return c`
${d(f.slice(0,3))} ${d(h.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert" ${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere"> style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})} ${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a} </div>`:a}
${d(f.slice(3))} ${d(h.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h); `}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}f.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",f);
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{dS as r,dT as t,dU as e}from"./houseplan-card-Bp1zKCs9.js";const s={},a=r(class extends t{constructor(){super(...arguments),this.ot=s}render(r,t){return t()}update(r,[t,s]){if(Array.isArray(t)){if(Array.isArray(this.ot)&&this.ot.length===t.length&&t.every((r,t)=>r===this.ot[t]))return e}else if(this.ot===t)return e;return this.ot=Array.isArray(t)?Array.from(t):t,this.render(t,s)}});export{a as i}; globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{dS as r,dT as t,dU as e}from"./houseplan-card-DkiI2BOK.js";const s={},a=r(class extends t{constructor(){super(...arguments),this.ot=s}render(r,t){return t()}update(r,[t,s]){if(Array.isArray(t)){if(Array.isArray(this.ot)&&this.ot.length===t.length&&t.every((r,t)=>r===this.ot[t]))return e}else if(this.ot===t)return e;return this.ot=Array.isArray(t)?Array.from(t):t,this.render(t,s)}});export{a as i};
@@ -1,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{b as a,A as e}from"./houseplan-card-Bp1zKCs9.js";import{s,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-fHmauMhT.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show"> globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{b as a,A as e}from"./houseplan-card-DkiI2BOK.js";import{s,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-DQS834xA.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
<span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong> <span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong>
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span> <small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
<input id="summary-local-show" data-summary-local-show type="checkbox" <input id="summary-local-show" data-summary-local-show type="checkbox"
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{e9 as e,L as t,a2 as n,J as i,an as o,N as r,bo as s,bn as a,a1 as c,a0 as l,ax as d,ea as u,eb as f,bq as m,ec as g}from"./houseplan-card-Bp1zKCs9.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=d(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,d="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*h(c,l,d=_){try{let u=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=d(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/o;u+=a(v)*_*_/1e4}return u}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function b(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=u(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{h as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,b as summarySystemValue,p as totalCleanFloorAreaM2}; globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{e9 as e,L as t,a2 as n,J as i,an as o,N as r,bo as s,bn as a,a1 as c,a0 as l,ax as d,ea as u,eb as f,bq as m,ec as g}from"./houseplan-card-DkiI2BOK.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=d(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,d="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*h(c,l,d=_){try{let u=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=d(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/o;u+=a(v)*_*_/1e4}return u}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function b(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=u(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{h as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,b as summarySystemValue,p as totalCleanFloorAreaM2};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{n as t,b as n}from"./zigbee-topology-BqMFLBzX.js";import{B as e}from"./houseplan-card-Bp1zKCs9.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function p(t){if(!0!==t?.user?.is_admin)throw a("permission")}function f(n){const e=i(n);return e?c(e,"zha",async()=>{if(p(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function g(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function m(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(p(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,f=null,m=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{f=t,m=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const p=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&f?.(n):c&&m?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof p&&b.push(p),await g(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await g(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{f as readZhaTopology,m as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot}; globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{n as t,b as n}from"./zigbee-topology-LI-FVdpo.js";import{B as e}from"./houseplan-card-DkiI2BOK.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function f(t){if(!0!==t?.user?.is_admin)throw a("permission")}function p(n){const e=i(n);return e?c(e,"zha",async()=>{if(f(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function g(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function m(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(f(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,p=null,m=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,m=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const f=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&p?.(n):c&&m?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await g(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await g(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{p as readZhaTopology,m as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";try{await import("./houseplan-assets/houseplan-card-Bp1zKCs9.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-card.js: the implementation chunk is unavailable",e)} globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";try{await import("./houseplan-assets/houseplan-card-DkiI2BOK.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-card.js: the implementation chunk is unavailable",e)}
File diff suppressed because one or more lines are too long
+139
View File
@@ -0,0 +1,139 @@
// Переключение пространств не доигрывает чужие переходы (#525).
//
// Lit переиспользует узлы списка по позиции. Пока у створки двери
// (`.op-leaf`, `transform`) и у дуги (`.op-arc`, `stroke-dashoffset`) есть
// переход в 0.6 с, позиционное переиспользование превращает смену
// пространства в анимацию: створка нового этажа доезжает из положения двери,
// которая занимала этот слот раньше. То же у оболочки маркера
// (`.device-shell-frame`, `box-shadow`).
//
// Две ловушки, обе стоили бы свидетелю правдивости:
// 1. `document.getAnimations()` здесь пуст ДАЖЕ НА СЛОМАННОМ КОДЕ — карточка
// живёт в shadow root, и документный вызов туда не заходит. Считаем
// поэлементно, обходя вложенные теневые деревья.
// 2. В демо-доме проёмов нет вовсе (`space.openings` пуст у обоих
// пространств), поэтому дверь в двух пространствах готовит сам смок.
import { launch, checkAll, finish } from './serve.mjs';
const { page, browser } = await launch();
const res = await page.evaluate(async () => {
const out = {};
const c = window.__card;
const root = () => c.shadowRoot || c.renderRoot;
const frame = () => new Promise((resolve) => requestAnimationFrame(() => resolve()));
const settle = async (frames = 10, ms = 500) => {
for (let i = 0; i < frames; i++) await frame();
await new Promise((resolve) => setTimeout(resolve, ms));
};
/** Все бегущие анимации внутри карточки, включая вложенные shadow root. */
const runningAnimations = () => {
const found = [];
const walk = (node) => {
for (const element of node.querySelectorAll('*')) {
const list = element.getAnimations ? element.getAnimations() : [];
for (const animation of list) {
if (animation.playState !== 'running') continue;
found.push({
cls: element.getAttribute?.('class') || element.tagName,
property: animation.transitionProperty || animation.animationName || '?',
});
}
if (element.shadowRoot) walk(element.shadowRoot);
}
};
walk(root());
return found;
};
// Вкладка подсвечивается, слайд едет, значения сводной панели проявляются —
// это и есть переключение. Всё остальное, что бежит сразу после него,
// доигрывает чужие данные.
const EXPECTED = (entry) => /(^|\s)tab(\s|$)|zoomwrap/.test(entry.cls)
|| /^summary-/.test(entry.property);
// ---- фикстура: дверь на одном месте в двух пространствах ---------------
const ids = c._serverCfg.spaces.map((space) => space.id).slice(0, 2);
out.twoSpacesExist = ids.length === 2;
const physicalize = (space) => {
for (const room of [...(space.rooms || [])]) {
const rendered = c._spaceModelById(space.id)?.rooms?.find((item) => item.id === room.id);
if (!rendered?.poly?.length) continue;
c._wallDialog = {
a: rendered.poly[0], b: rendered.poly[1], value: '15', roomId: room.id,
source: { kind: 'room' }, sx: 0, sy: 0,
};
c._wallThickApply(true);
}
};
for (const id of ids) physicalize(c._serverCfg.spaces.find((space) => space.id === id));
c._geometryHistory.length = 0;
const contactOpen = 'binary_sensor.probe_door_open';
const contactShut = 'binary_sensor.probe_door_shut';
const withContacts = (openState) => ({
...c.hass,
states: {
...c.hass.states,
[contactOpen]: { entity_id: contactOpen, state: openState, attributes: { device_class: 'door' } },
[contactShut]: { entity_id: contactShut, state: 'off', attributes: { device_class: 'door' } },
},
entities: {
...(c.hass.entities || {}),
[contactOpen]: { entity_id: contactOpen },
[contactShut]: { entity_id: contactShut },
},
});
c.hass = withContacts('on');
const door = (id, contact) => ({
id, type: 'door', x: 0.2, y: 0.14, angle: 0, length: 0.08, contact,
});
c._serverCfg.spaces.find((space) => space.id === ids[0]).openings = [door('opA', contactOpen)];
c._serverCfg.spaces.find((space) => space.id === ids[1]).openings = [door('opB', contactShut)];
c._cfgEpoch++;
c.requestUpdate();
await c.updateComplete;
// ---- 1) штатное переключение не анимирует чужую створку ----------------
c._pickSpace(ids[0]);
await c.updateComplete;
await settle();
const leafBefore = root().querySelector('.op-leaf');
out.doorIsDrawnInTheFirstSpace = !!leafBefore;
out.quietBeforeTheSwitch = runningAnimations().filter((entry) => !EXPECTED(entry)).length === 0;
// поворот створки живёт инлайновым стилем, не атрибутом
const leafTransform = (leaf) => leaf?.style?.transform || leaf?.getAttribute('transform') || null;
const transformBefore = leafTransform(leafBefore);
c._pickSpace(ids[1]);
await c.updateComplete;
await frame();
const afterSwitch = runningAnimations();
const leafAfter = root().querySelector('.op-leaf');
out.doorIsDrawnInTheSecondSpace = !!leafAfter;
out.theTwoDoorsDifferInState = !!transformBefore && transformBefore !== leafTransform(leafAfter);
out.noOpeningTransitionOnSwitch = afterSwitch
.filter((entry) => /op-leaf|op-arc/.test(entry.cls)).length === 0;
out.noMarkerTransitionOnSwitch = afterSwitch
.filter((entry) => /device-shell-frame/.test(entry.cls)).length === 0;
const unexpected = afterSwitch.filter((entry) => !EXPECTED(entry));
out.onlyTheSwitchItselfAnimates = unexpected.length === 0;
out.unexpectedAnimations = unexpected.map((entry) => `${entry.cls}:${entry.property}`);
// ещё кадр — переход мог стартовать с задержкой в один тик
await frame();
await frame();
const later = runningAnimations().filter((entry) => !EXPECTED(entry));
out.stillQuietOneFrameLater = later.length === 0;
// ---- 2) настоящая смена состояния двери по-прежнему анимируется --------
await settle();
out.quietBeforeTheRealChange = runningAnimations()
.filter((entry) => /op-leaf|op-arc/.test(entry.cls)).length === 0;
c.hass = { ...c.hass, states: { ...c.hass.states,
[contactShut]: { entity_id: contactShut, state: 'on', attributes: { device_class: 'door' } } } };
await c.updateComplete;
await frame();
const onRealChange = runningAnimations();
out.aRealDoorOpeningStillAnimates = onRealChange
.filter((entry) => /op-leaf/.test(entry.cls)).length >= 1;
return out;
});
checkAll(res, { unexpectedAnimations: [] });
await finish(browser, res);
+141 -141
View File
@@ -1,309 +1,309 @@
{ {
"schema": 1, "schema": 1,
"fingerprint": "f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec", "fingerprint": "7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618",
"entry": "houseplan-card.js", "entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js", "panelEntry": "houseplan-panel.js",
"initialViewFiles": [ "initialViewFiles": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-card.js" "houseplan-card.js"
], ],
"initialViewGzipBytes": 299818, "initialViewGzipBytes": 300059,
"initialPanelFiles": [ "initialPanelFiles": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-card.js", "houseplan-card.js",
"houseplan-panel.js" "houseplan-panel.js"
], ],
"initialPanelGzipBytes": 302123, "initialPanelGzipBytes": 302365,
"initialPanelOnlyFiles": [ "initialPanelOnlyFiles": [
"houseplan-panel.js" "houseplan-panel.js"
], ],
"initialPanelOnlyGzipBytes": 2305, "initialPanelOnlyGzipBytes": 2306,
"lazyFiles": [ "lazyFiles": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/de-Rx23MWgW.js", "houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/editor-BKd7m0Cl.js", "houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/fr-Cmciv8Kg.js", "houseplan-assets/fr-lBEFwYGK.js",
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-editor-runtime-Ct6C87Tu.js", "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/houseplan-onboarding-runtime-BNaIaYhC.js", "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"houseplan-assets/hp-zigbee-topology-overlay-BRzrNvxL.js", "houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"houseplan-assets/iso-scene-render-cM25hLUD.js", "houseplan-assets/iso-scene-render-RhSO-S9j.js",
"houseplan-assets/live-interaction-runtime-CfFnUimM.js", "houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"houseplan-assets/pdf-export-C7QX7Os6.js", "houseplan-assets/pdf-export-CsCJxU0E.js",
"houseplan-assets/summary-panel-runtime-loaded-fHmauMhT.js", "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js", "houseplan-assets/zigbee-topology-LI-FVdpo.js",
"houseplan-assets/zigbee-topology-runtime-cidfav1L.js" "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
], ],
"lazyGzipBytes": 418163, "lazyGzipBytes": 418179,
"lazyEditorFiles": [ "lazyEditorFiles": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/editor-BKd7m0Cl.js", "houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-editor-runtime-Ct6C87Tu.js", "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js" "houseplan-assets/zigbee-topology-LI-FVdpo.js"
], ],
"lazyEditorGzipBytes": 205716, "lazyEditorGzipBytes": 205726,
"lazyOnboardingFiles": [ "lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/houseplan-onboarding-runtime-BNaIaYhC.js" "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js"
], ],
"lazyOnboardingGzipBytes": 14184, "lazyOnboardingGzipBytes": 14187,
"lazyLocaleFiles": [ "lazyLocaleFiles": [
"houseplan-assets/de-Rx23MWgW.js", "houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/fr-Cmciv8Kg.js" "houseplan-assets/fr-lBEFwYGK.js"
], ],
"lazyLocaleGzipBytes": 54858, "lazyLocaleGzipBytes": 54854,
"lazyIsometricFiles": [ "lazyIsometricFiles": [
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/iso-scene-render-cM25hLUD.js" "houseplan-assets/iso-scene-render-RhSO-S9j.js"
], ],
"lazyIsometricGzipBytes": 13458, "lazyIsometricGzipBytes": 13460,
"lazyFurnitureArtFiles": [ "lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js" "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js"
], ],
"lazyFurnitureArtGzipBytes": 10252, "lazyFurnitureArtGzipBytes": 10255,
"lazyPdfFiles": [ "lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/pdf-export-C7QX7Os6.js" "houseplan-assets/pdf-export-CsCJxU0E.js"
], ],
"lazyPdfGzipBytes": 120368, "lazyPdfGzipBytes": 120372,
"files": [ "files": [
{ {
"path": "houseplan-assets/backdrop-pick-Cn3C2LDS.js", "path": "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"sha256": "ce4df7477daa960c9f146de09dd7e9f383e13dd1199b32ccf5e8fdbc03361594", "sha256": "e76da9cb2c5c8a32b2798c6f8785819bd7ff6ee624987feb8ff2c89522f87fef",
"rawBytes": 21134, "rawBytes": 21134,
"gzipBytes": 7147, "gzipBytes": 7148,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/de-Rx23MWgW.js", "path": "houseplan-assets/de-HksnN-9C.js",
"sha256": "35001ee0702c4b0a1dec055a4ce59450a4944610d1c3f4b2395f6b43a8c516a8", "sha256": "3a1ada3b04ef3eb7e9c6856c700d589e90e962a6753087b59f89b481c68a9499",
"rawBytes": 91441, "rawBytes": 91441,
"gzipBytes": 27712, "gzipBytes": 27710,
"isEntry": false, "isEntry": false,
"imports": [], "imports": [],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/editor-BKd7m0Cl.js", "path": "houseplan-assets/editor-CSFqqHwT.js",
"sha256": "fb68ec6ca16c3dde08e8b423492f76b762ebe22275c40a7bc36fa8acce4da4ad", "sha256": "a5adebb3a438356deb0e5a35fa218bcb4ab6a8be23d6e535b6cd350170775926",
"rawBytes": 3832, "rawBytes": 3832,
"gzipBytes": 1584, "gzipBytes": 1585,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/fr-Cmciv8Kg.js", "path": "houseplan-assets/fr-lBEFwYGK.js",
"sha256": "587aee0ac33d157d50d4f80a3fe66846dc6bf779cdad865b1c43eacab78d1c4e", "sha256": "de104eb96b8e4fbb2895ab861300878eb3f27dc616e4737bc2e9e818286c9d88",
"rawBytes": 93719, "rawBytes": 93719,
"gzipBytes": 27146, "gzipBytes": 27144,
"isEntry": false, "isEntry": false,
"imports": [], "imports": [],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "path": "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"sha256": "1209c487274724f24a596cc73f632e59cd1955ff25f42e506177656abc2e54f6", "sha256": "9b63fd1d6479a45b433b323468a56b46ab0e0e3d2a5bfb82b6349d475e59eee8",
"rawBytes": 33655, "rawBytes": 33655,
"gzipBytes": 10252, "gzipBytes": 10255,
"isEntry": false, "isEntry": false,
"imports": [], "imports": [],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/guard-B-DpMbo8.js", "path": "houseplan-assets/guard-Bdo2w6Sq.js",
"sha256": "fcf685e554aae83843223f5c19b3db5e194eb54ff6344ba0448cb6f82a01cb9c", "sha256": "b98da3eb22fde2449b43c37851d7e2cbbcb14103b20b7c6b417fa4bab2502416",
"rawBytes": 518, "rawBytes": 518,
"gzipBytes": 372, "gzipBytes": 371,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/houseplan-card-Bp1zKCs9.js", "path": "houseplan-assets/houseplan-card-DkiI2BOK.js",
"sha256": "fbccd0542cc2244ad027ae8f23faea17d5bbbe1ebf7c4a9a44c2609714a7f100", "sha256": "e7bdf9f5d1b699c27b57f25c369b137eceae0cf6f3ec7f2d364ef6c2bd552887",
"rawBytes": 1078600, "rawBytes": 1079369,
"gzipBytes": 299014, "gzipBytes": 299254,
"isEntry": false, "isEntry": false,
"imports": [], "imports": [],
"dynamicImports": [ "dynamicImports": [
"houseplan-assets/de-Rx23MWgW.js", "houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/editor-BKd7m0Cl.js", "houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/fr-Cmciv8Kg.js", "houseplan-assets/fr-lBEFwYGK.js",
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/houseplan-editor-runtime-Ct6C87Tu.js", "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/houseplan-onboarding-runtime-BNaIaYhC.js", "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"houseplan-assets/hp-zigbee-topology-overlay-BRzrNvxL.js", "houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"houseplan-assets/iso-scene-render-cM25hLUD.js", "houseplan-assets/iso-scene-render-RhSO-S9j.js",
"houseplan-assets/live-interaction-runtime-CfFnUimM.js", "houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"houseplan-assets/pdf-export-C7QX7Os6.js", "houseplan-assets/pdf-export-CsCJxU0E.js",
"houseplan-assets/summary-panel-runtime-loaded-fHmauMhT.js" "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js"
] ]
}, },
{ {
"path": "houseplan-assets/houseplan-editor-runtime-Ct6C87Tu.js", "path": "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"sha256": "1b4a0ed9da5735e0ead38d031fa24a8046ba1684144b8cc0bbbb0f3fbaec851f", "sha256": "00be6a1cdb443cd875e736984baf86b77e63d96474ec72d4d66bf2baa9f1a2ba",
"rawBytes": 672339, "rawBytes": 672339,
"gzipBytes": 178931, "gzipBytes": 178936,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js" "houseplan-assets/zigbee-topology-LI-FVdpo.js"
], ],
"dynamicImports": [ "dynamicImports": [
"houseplan-assets/zigbee-topology-runtime-cidfav1L.js" "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
] ]
}, },
{ {
"path": "houseplan-assets/houseplan-onboarding-runtime-BNaIaYhC.js", "path": "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"sha256": "354e2a62dc98b9c0540ef2fd946d7d6ffe57228eaea970a160ed342c067b85a5", "sha256": "f81b58bde08ff74bab903803cc709e18449900dc91a3f64106db737bbabd55e3",
"rawBytes": 28287, "rawBytes": 28287,
"gzipBytes": 7037, "gzipBytes": 7039,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/backdrop-pick-Cn3C2LDS.js", "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/hp-zigbee-topology-overlay-BRzrNvxL.js", "path": "houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"sha256": "477c0a0d7c9b3cfcc31ae10ec258ad1dc0813d0e2a85090d9cc7b39bdc9cb264", "sha256": "968345cc4eaaf6cc46accbdc30b4fff83e3fc40a5a7b7a0f611229f0e53ec6b9",
"rawBytes": 11034, "rawBytes": 11034,
"gzipBytes": 3730, "gzipBytes": 3731,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js", "houseplan-assets/zigbee-topology-LI-FVdpo.js",
"houseplan-assets/zigbee-topology-runtime-cidfav1L.js" "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/iso-scene-render-cM25hLUD.js", "path": "houseplan-assets/iso-scene-render-RhSO-S9j.js",
"sha256": "23631a94530e942caf4f396db1a88d0a40b42e668b25988ea0c903fe475bae4b", "sha256": "b5c630c05c0c2648c96006ab51cf271ae2ca585742df4bd9ad456ce9dac86646",
"rawBytes": 38562, "rawBytes": 38562,
"gzipBytes": 13086, "gzipBytes": 13089,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/guard-B-DpMbo8.js", "houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/live-interaction-runtime-CfFnUimM.js", "path": "houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"sha256": "3bfa67222093a06ca360d43b666a5b68bd6ec4e5a4997b6876a57b1c0f3bd189", "sha256": "319a2a94cf85acd20b27522ae71b81e25ee1f2d69f1688256c5eeed4dddec3d5",
"rawBytes": 5196, "rawBytes": 5196,
"gzipBytes": 2128, "gzipBytes": 2129,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/pdf-export-C7QX7Os6.js", "path": "houseplan-assets/pdf-export-CsCJxU0E.js",
"sha256": "fda446084e6a626d103d53b326b2e8053c8188e99c52db752bcfe29b1144ae5e", "sha256": "eccac69e0d54ceeff8fceb8db69a0f20f5339443cb7961f8916f9a850bb1ae6c",
"rawBytes": 237254, "rawBytes": 237254,
"gzipBytes": 110116, "gzipBytes": 110117,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/furniture-plan-art.generated-CyDdfRbk.js", "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/summary-panel-editor-v6P_pydT.js", "path": "houseplan-assets/summary-panel-editor-BC_vG9Hn.js",
"sha256": "a3f855dedeef4f4495e0839c343d627fbcf08eb4bde465f8155b9d2db9897489", "sha256": "5c7fd338b94152ae5e1194f07c6353863a9e22c4f2e99424f5795484da989a64",
"rawBytes": 14824, "rawBytes": 14824,
"gzipBytes": 3400, "gzipBytes": 3401,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/summary-panel-runtime-loaded-fHmauMhT.js" "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/summary-panel-metrics-CWsAhuuf.js", "path": "houseplan-assets/summary-panel-metrics-C2M32Xkf.js",
"sha256": "5dc4acc6d8b5204659a47617d8f9fcc33e49d250706cc3b0eea91b7639d5b5d3", "sha256": "bca21f0d66af64c7c1ef501a8cd38e04e2a74ee7196e004f6f60397d9e9a72f1",
"rawBytes": 2610, "rawBytes": 2610,
"gzipBytes": 1307, "gzipBytes": 1308,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/summary-panel-runtime-loaded-fHmauMhT.js", "path": "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js",
"sha256": "4b2b0b337120ddf130777bd73a9c77f646bbd74adc861b2f749cf73b209eea5d", "sha256": "54c791fdd19e77c24ac142794c4207345eaec03d2ab15dfdf3b991afa32bb812",
"rawBytes": 72272, "rawBytes": 72272,
"gzipBytes": 19727, "gzipBytes": 19729,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [ "dynamicImports": [
"houseplan-assets/summary-panel-editor-v6P_pydT.js", "houseplan-assets/summary-panel-editor-BC_vG9Hn.js",
"houseplan-assets/summary-panel-metrics-CWsAhuuf.js" "houseplan-assets/summary-panel-metrics-C2M32Xkf.js"
] ]
}, },
{ {
"path": "houseplan-assets/zigbee-topology-BqMFLBzX.js", "path": "houseplan-assets/zigbee-topology-LI-FVdpo.js",
"sha256": "60da11d2bdb40780b5ca7853c8ca5c7c70f334442a56eda9052f76df260c458b", "sha256": "d01ec49d20c5f3dc028a59107f1f9060634ab93d6d112e03a7c2b85792159440",
"rawBytes": 18961, "rawBytes": 18961,
"gzipBytes": 7430, "gzipBytes": 7431,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-assets/zigbee-topology-runtime-cidfav1L.js", "path": "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js",
"sha256": "ad947ed4a3a1c0da71322a8cb3d2487b735c5d53abea0c129f0727f5a9ad0d12", "sha256": "3a0fad7d479bbeb161434e498a3c8ac7f88da62ef37c173b66f95057098bcc97",
"rawBytes": 3941, "rawBytes": 3941,
"gzipBytes": 1765, "gzipBytes": 1765,
"isEntry": false, "isEntry": false,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js", "houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-BqMFLBzX.js" "houseplan-assets/zigbee-topology-LI-FVdpo.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-card.js", "path": "houseplan-card.js",
"sha256": "40819c556cd468a5dac8bfb8dc2eb5e5b14a9a78684d402a470d026d9aab4781", "sha256": "21da7b3390ea9d4992e33bf4d6fdf684145b53f407e253a599e70a459585298d",
"rawBytes": 1205, "rawBytes": 1205,
"gzipBytes": 804, "gzipBytes": 805,
"isEntry": true, "isEntry": true,
"imports": [ "imports": [
"houseplan-assets/houseplan-card-Bp1zKCs9.js" "houseplan-assets/houseplan-card-DkiI2BOK.js"
], ],
"dynamicImports": [] "dynamicImports": []
}, },
{ {
"path": "houseplan-panel.js", "path": "houseplan-panel.js",
"sha256": "d678f3b11374134cd913c92a93916f04cbde2b184fad191f4e599f43317d4909", "sha256": "a664721695cf5c85903eea440d05a295cb6d6d2cd1e3669fd5c65c9752534492",
"rawBytes": 6124, "rawBytes": 6124,
"gzipBytes": 2305, "gzipBytes": 2306,
"isEntry": true, "isEntry": true,
"imports": [ "imports": [
"houseplan-card.js" "houseplan-card.js"
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,14 +1,14 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{m as e,l as o,t,e3 as s,A as a,e4 as i,e5 as l,e6 as n,dU as r,b as c}from"./houseplan-card-Bp1zKCs9.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{m as e,l as o,t,e3 as s,A as a,e4 as i,e5 as l,e6 as n,dU as r,b as c}from"./houseplan-card-DkiI2BOK.js";class f extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,f={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},h=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass} .hass=${this.hass}
.data=${this._formData} .data=${this._formData}
.schema=${e} .schema=${e}
.computeLabel=${e=>h[e.name]||e.name} .computeLabel=${e=>f[e.name]||e.name}
@value-changed=${this._valueChanged} @value-changed=${this._valueChanged}
></ha-form>`;return c` ></ha-form>`;return c`
${d(f.slice(0,3))} ${d(h.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert" ${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere"> style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})} ${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a} </div>`:a}
${d(f.slice(3))} ${d(h.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h); `}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}f.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",f);
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{dS as r,dT as t,dU as e}from"./houseplan-card-Bp1zKCs9.js";const s={},a=r(class extends t{constructor(){super(...arguments),this.ot=s}render(r,t){return t()}update(r,[t,s]){if(Array.isArray(t)){if(Array.isArray(this.ot)&&this.ot.length===t.length&&t.every((r,t)=>r===this.ot[t]))return e}else if(this.ot===t)return e;return this.ot=Array.isArray(t)?Array.from(t):t,this.render(t,s)}});export{a as i}; globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{dS as r,dT as t,dU as e}from"./houseplan-card-DkiI2BOK.js";const s={},a=r(class extends t{constructor(){super(...arguments),this.ot=s}render(r,t){return t()}update(r,[t,s]){if(Array.isArray(t)){if(Array.isArray(this.ot)&&this.ot.length===t.length&&t.every((r,t)=>r===this.ot[t]))return e}else if(this.ot===t)return e;return this.ot=Array.isArray(t)?Array.from(t):t,this.render(t,s)}});export{a as i};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{b as a,A as e}from"./houseplan-card-Bp1zKCs9.js";import{s,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-fHmauMhT.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show"> globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{b as a,A as e}from"./houseplan-card-DkiI2BOK.js";import{s,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-DQS834xA.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
<span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong> <span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong>
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span> <small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
<input id="summary-local-show" data-summary-local-show type="checkbox" <input id="summary-local-show" data-summary-local-show type="checkbox"
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{e9 as e,L as t,a2 as n,J as i,an as o,N as r,bo as s,bn as a,a1 as c,a0 as l,ax as d,ea as u,eb as f,bq as m,ec as g}from"./houseplan-card-Bp1zKCs9.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=d(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,d="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*h(c,l,d=_){try{let u=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=d(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/o;u+=a(v)*_*_/1e4}return u}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function b(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=u(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{h as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,b as summarySystemValue,p as totalCleanFloorAreaM2}; globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{e9 as e,L as t,a2 as n,J as i,an as o,N as r,bo as s,bn as a,a1 as c,a0 as l,ax as d,ea as u,eb as f,bq as m,ec as g}from"./houseplan-card-DkiI2BOK.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=d(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,d="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*h(c,l,d=_){try{let u=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=d(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/o;u+=a(v)*_*_/1e4}return u}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function b(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=u(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{h as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,b as summarySystemValue,p as totalCleanFloorAreaM2};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";import{n as t,b as n}from"./zigbee-topology-BqMFLBzX.js";import{B as e}from"./houseplan-card-Bp1zKCs9.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function p(t){if(!0!==t?.user?.is_admin)throw a("permission")}function f(n){const e=i(n);return e?c(e,"zha",async()=>{if(p(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function g(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function m(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(p(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,f=null,m=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{f=t,m=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const p=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&f?.(n):c&&m?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof p&&b.push(p),await g(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await g(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{f as readZhaTopology,m as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot}; globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";import{n as t,b as n}from"./zigbee-topology-LI-FVdpo.js";import{B as e}from"./houseplan-card-DkiI2BOK.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function f(t){if(!0!==t?.user?.is_admin)throw a("permission")}function p(n){const e=i(n);return e?c(e,"zha",async()=>{if(f(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function g(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function m(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(f(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,p=null,m=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,m=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const f=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&p?.(n):c&&m?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await g(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await g(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{p as readZhaTopology,m as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
+1 -1
View File
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f00ccb2e025e4749d8b21b734ae6193bd0a556f441d56991773969a015d817ec";try{await import("./houseplan-assets/houseplan-card-Bp1zKCs9.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-card.js: the implementation chunk is unavailable",e)} globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618";try{await import("./houseplan-assets/houseplan-card-DkiI2BOK.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-card.js: the implementation chunk is unavailable",e)}
+1 -1
View File
File diff suppressed because one or more lines are too long
+5
View File
@@ -2,6 +2,11 @@
## Unreleased ## Unreleased
- Switching between spaces no longer replays a neighbouring door's leaf
movement, in either direction. The animation now belongs to a real sensor
change and nothing else
([#525](https://github.com/Matysh/houseplan-card/issues/525)).
## v1.74.0-beta.1 — 2026-09-10 ## v1.74.0-beta.1 — 2026-09-10
- Alignment guides follow the object again while you drag it: the marker in the - Alignment guides follow the object again while you drag it: the marker in the
+5
View File
@@ -8,6 +8,11 @@
## Не выпущено ## Не выпущено
- При переключении между пространствами двери и окна больше не доигрывают
движение створки соседней двери — ни в одну сторону, ни в другую. Анимация
остаётся только за настоящей сменой состояния датчика
([#525](https://github.com/Matysh/houseplan-card/issues/525)).
## v1.74.0-beta.1 — 2026-09-10 ## v1.74.0-beta.1 — 2026-09-10
- Направляющие выравнивания снова идут за объектом во время жеста: за значком - Направляющие выравнивания снова идут за объектом во время жеста: за значком
+12 -1
View File
@@ -223,8 +223,19 @@ export const LOW_HEADROOM_WARNING_BYTES = 15_000;
* последовательности, флаг и замыкание в `_loadFromServer`). Измеренный факт * последовательности, флаг и замыкание в `_loadFromServer`). Измеренный факт
* 299 812 Б оставляет 588 Б сверху и 1 412 Б до нижней границы полосы; общий * 299 812 Б оставляет 588 Б сверху и 1 412 Б до нижней границы полосы; общий
* бюджет 301 066 Б и долг #367 не меняются. * бюджет 301 066 Б и долг #367 не меняются.
*
* 2026-09-11, #525: потолок перецентрирован 300 400 → 300 700. Списки проёмов
* и маркеров переведены на ключи (`repeat` по `id`) — без них Lit
* переиспользовал узлы по позиции и при смене пространства доигрывал переход
* створки соседней двери. Цена — сама директива `repeat`, впервые попавшая в
* начальный граф View: +241 Б gzip (проверено альтернативой `keyed` в
* обёртке-IIFE — та дороже, +373 Б). Измеренный факт 300 059 Б оставляет
* 641 Б сверху и 1 359 Б до нижней границы полосы. Общий бюджет 301 066 Б не
* меняется, но зазор между потолком и бюджетом сжался до 366 Б: долг #367
* из предупреждения стал ограничением, следующая правка начального графа
* упрётся в него всерьёз.
*/ */
export const INITIAL_VIEW_GZIP_CEILING = 300_400; export const INITIAL_VIEW_GZIP_CEILING = 300_700;
export const INITIAL_VIEW_CEILING_BAND = 2_000; export const INITIAL_VIEW_CEILING_BAND = 2_000;
/** /**
+24
View File
@@ -7297,6 +7297,30 @@ const MUTANT_DEFINITIONS = [
replace: ' this._loadOk = true;', replace: ' this._loadOk = true;',
}], }],
}, },
{
id: 'openings-rendered-without-keys',
guard: 'node demo/smoke_space_switch_transitions.mjs',
because: 'Lit reuses list nodes by position: without a key the leaf of the next space '
+ 'inherits the node of whatever door held that slot, and its 0.6s transform transition '
+ 'animates a door that never moved (#525 AC1)',
patches: [{
file: 'src/houseplan-card.ts',
find: ' return svg`<g class="openinglayer">${repeat(items, (o) => o.id, (o) => {',
replace: ' return svg`<g class="openinglayer">${items.map((o) => {',
}],
},
{
id: 'device-markers-rendered-without-keys',
guard: 'node demo/smoke_space_switch_transitions.mjs',
because: 'the marker shell carries a `box-shadow` transition, so a positional reuse replays '
+ 'it on every space switch; the key also keeps `data-id` honest for the live editor '
+ 'painter, which finds the dragged marker by that attribute (#525 AC2)',
patches: [{
file: 'src/houseplan-card.ts',
find: ' ${repeat(devs, (d) => d.id, (d) => this._renderDevice(',
replace: ' ${devs.map((d) => this._renderDevice(',
}],
},
{ {
id: 'live-editor-devices-drops-align-guides', id: 'live-editor-devices-drops-align-guides',
guard: 'node demo/smoke_align_guides.mjs', guard: 'node demo/smoke_align_guides.mjs',
+2 -2
View File
@@ -11784,7 +11784,7 @@ export class HouseplanCard extends LitElement {
view, view,
(point) => this._scenePoint(point), (point) => this._scenePoint(point),
)} )}
${devs.map((d) => this._renderDevice( ${repeat(devs, (d) => d.id, (d) => this._renderDevice(
d, view, showLqi, isoOverlays?.devices.get(d.id), d, view, showLqi, isoOverlays?.devices.get(d.id),
))} ))}
${this._renderVacuums(this._renderVacuumDevices, view, space.id)} ${this._renderVacuums(this._renderVacuumDevices, view, space.id)}
@@ -12993,7 +12993,7 @@ export class HouseplanCard extends LitElement {
const walls = this._spaceWalls; const walls = this._spaceWalls;
const openCuts = this._openCuts(); const openCuts = this._openCuts();
const openingWallIndex = this._openingWallIndexFor(space, openCuts).value; const openingWallIndex = this._openingWallIndexFor(space, openCuts).value;
return svg`<g class="openinglayer">${items.map((o) => { return svg`<g class="openinglayer">${repeat(items, (o) => o.id, (o) => {
if (o.orphanReason) return svg`<g class="opening orphan" data-hp="opening-orphan" if (o.orphanReason) return svg`<g class="opening orphan" data-hp="opening-orphan"
data-id=${o.id} role="button" tabindex="0" data-id=${o.id} role="button" tabindex="0"
aria-label=${this._t('opening.partition_orphan')} aria-label=${this._t('opening.partition_orphan')}
+12 -1
View File
@@ -519,7 +519,18 @@ export const planStyles = css`
stroke: var(--hp-accent); stroke: var(--hp-accent);
stroke-opacity: 1; stroke-opacity: 1;
} }
/* doors, windows & gates */ /* doors, windows & gates
#525: these two transitions are the reason the opening list is rendered
with repeat(items, (o) => o.id, ...) and not a bare map(). Lit reuses
list nodes by POSITION, so on a space switch the leaf that held a slot
kept its DOM node and only changed values — and the browser dutifully
animated a door that never moved: the new floor's leaf drove in from the
previous floor's opening angle, 0.6 s of an event that did not happen.
Anything animated that is rendered from a list needs a key. The Glow
spots learned it first (glow-scene.ts, opacity), the openings and the
device markers (.device-shell-frame, box-shadow) with this issue.
Witness: demo/smoke_space_switch_transitions.mjs. */
.op-leaf { .op-leaf {
transition: transform 0.6s ease; transition: transform 0.6s ease;
} }
+18
View File
@@ -147,3 +147,21 @@ test('свидетель направляющих ведёт жест, а не
assert.match(source, /ZeroSettledRenders/); assert.match(source, /ZeroSettledRenders/);
}); });
// #525. Карточка живёт в shadow root, и `document.getAnimations()` в неё не
// заходит: на сломанном коде документный вызов возвращал пустой список, пока
// створка двери честно доигрывала чужой переход. Свидетель обязан считать
// поэлементно, обходя вложенные теневые деревья, — иначе он зелен всегда.
test('свидетель переходов при переключении меряет поэлементно (#525)', () => {
const source = read('smoke_space_switch_transitions.mjs');
// Ловушка названа в шапке смока словами — упоминание в комментарии это не
// вызов; проверяется код, а не текст о нём.
const code = source.replace(/\/\*[\s\S]*?\*\//g, '').replace(/^\s*\/\/.*$/gm, '');
assert.doesNotMatch(code, /document\.getAnimations\(\)/,
'smoke_space_switch_transitions.mjs: документный getAnimations() пуст даже на'
+ ' сломанном коде — считать надо по узлам внутри renderRoot (#525)');
assert.match(code, /element\.getAnimations\(\)/);
assert.match(code, /element\.shadowRoot\) walk\(element\.shadowRoot\)/,
'обход обязан заходить во вложенные shadow root');
assert.match(code, /_pickSpace/, 'переключение делается штатным путём');
});