perf(markers): a marker's shadow no longer animates

The shadow of a device marker is sized from the marker, and the marker is
sized from the container: --device-shell-shadow is expressed in
--dev-size, which resolves to 2.5cqw. With box-shadow in the transition
list, every container-query re-evaluation — a tooltip, a scrollbar, a
rotation — produced a new computed value and restarted a 150 ms
non-composited transition on every marker at once.

The owner's Firefox profile shows what that costs: 244 box-shadow
transitions, all on span.device-shell-frame, all oncompositor:false, in
bursts of exactly 61 (the markers on screen), four bursts in two
seconds. During them the tab presented 103 frames in 11 seconds — 9.4
per second, CONTENT_FRAME_TIME median 149 ms and up to 320 — while the
refresh driver waited for paint 381 times. Our JavaScript in the worst
three seconds: 16 ms. Chromium starts the same transitions (measured:
one pixel of container width starts two per marker in both engines) and
merely pays less for them, which is why this hid there.

The shadow itself is unchanged; it simply applies at once. The core
keeps the same treatment, so the selection and focus rings appear
without a fade — an instant ring is ordinary feedback, a faded one costs
a full-frame repaint per marker. Hover still animates border-color.

Issue: #524
User-Visible: yes
This commit is contained in:
Codex
2026-09-11 08:28:49 +03:00
parent f4625dd4fb
commit 6b64801603
48 changed files with 586 additions and 410 deletions
@@ -1,109 +1,109 @@
{
"schema": 1,
"fingerprint": "7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618",
"fingerprint": "ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 300059,
"initialViewGzipBytes": 300577,
"initialPanelFiles": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-card.js",
"houseplan-panel.js"
],
"initialPanelGzipBytes": 302365,
"initialPanelGzipBytes": 302882,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
"initialPanelOnlyGzipBytes": 2306,
"initialPanelOnlyGzipBytes": 2305,
"lazyFiles": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/fr-lBEFwYGK.js",
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"houseplan-assets/iso-scene-render-RhSO-S9j.js",
"houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"houseplan-assets/pdf-export-CsCJxU0E.js",
"houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js",
"houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/de-VLLexfNZ.js",
"houseplan-assets/editor-DxwvfCN0.js",
"houseplan-assets/fr-sa0yIASm.js",
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/houseplan-editor-runtime-CPHsPq8i.js",
"houseplan-assets/houseplan-onboarding-runtime-CYnWHSzo.js",
"houseplan-assets/hp-zigbee-topology-overlay-BsRS5Mqx.js",
"houseplan-assets/iso-scene-render-CccMMhjh.js",
"houseplan-assets/live-interaction-runtime-DjugMgAq.js",
"houseplan-assets/pdf-export-BxY-xCel.js",
"houseplan-assets/summary-panel-runtime-loaded-sGYqBGeH.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js",
"houseplan-assets/zigbee-topology-runtime-DqQtbpDf.js"
],
"lazyGzipBytes": 418179,
"lazyGzipBytes": 418153,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/editor-DxwvfCN0.js",
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/houseplan-editor-runtime-CPHsPq8i.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js"
],
"lazyEditorGzipBytes": 205726,
"lazyEditorGzipBytes": 205708,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/houseplan-onboarding-runtime-CYnWHSzo.js"
],
"lazyOnboardingGzipBytes": 14187,
"lazyOnboardingGzipBytes": 14184,
"lazyLocaleFiles": [
"houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/fr-lBEFwYGK.js"
"houseplan-assets/de-VLLexfNZ.js",
"houseplan-assets/fr-sa0yIASm.js"
],
"lazyLocaleGzipBytes": 54854,
"lazyLocaleGzipBytes": 54857,
"lazyIsometricFiles": [
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/iso-scene-render-RhSO-S9j.js"
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/iso-scene-render-CccMMhjh.js"
],
"lazyIsometricGzipBytes": 13460,
"lazyIsometricGzipBytes": 13457,
"lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js"
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js"
],
"lazyFurnitureArtGzipBytes": 10255,
"lazyFurnitureArtGzipBytes": 10250,
"lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/pdf-export-CsCJxU0E.js"
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/pdf-export-BxY-xCel.js"
],
"lazyPdfGzipBytes": 120372,
"lazyPdfGzipBytes": 120366,
"files": [
{
"path": "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"sha256": "e76da9cb2c5c8a32b2798c6f8785819bd7ff6ee624987feb8ff2c89522f87fef",
"path": "houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"sha256": "576bbc6b2cc1e44839881fa20dd9fff9a1222f865448b26c5367a02c4d57284a",
"rawBytes": 21134,
"gzipBytes": 7148,
"gzipBytes": 7147,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-HksnN-9C.js",
"sha256": "3a1ada3b04ef3eb7e9c6856c700d589e90e962a6753087b59f89b481c68a9499",
"path": "houseplan-assets/de-VLLexfNZ.js",
"sha256": "ea2cf39e832157c796f0f419eddfe112ea85671f897c30422a93a2526b4593df",
"rawBytes": 91441,
"gzipBytes": 27710,
"gzipBytes": 27713,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-CSFqqHwT.js",
"sha256": "a5adebb3a438356deb0e5a35fa218bcb4ab6a8be23d6e535b6cd350170775926",
"path": "houseplan-assets/editor-DxwvfCN0.js",
"sha256": "03ef45f8ca06d3caa0b2a083b82a0189dd78a51a0a36de3903e05586e7516e47",
"rawBytes": 3832,
"gzipBytes": 1585,
"gzipBytes": 1583,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-lBEFwYGK.js",
"sha256": "de104eb96b8e4fbb2895ab861300878eb3f27dc616e4737bc2e9e818286c9d88",
"path": "houseplan-assets/fr-sa0yIASm.js",
"sha256": "aa8d30728b71a0d28378d056d4a5f13bca6e995f97443510302c097d4a5c0699",
"rawBytes": 93719,
"gzipBytes": 27144,
"isEntry": false,
@@ -111,199 +111,199 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"sha256": "9b63fd1d6479a45b433b323468a56b46ab0e0e3d2a5bfb82b6349d475e59eee8",
"path": "houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"sha256": "26925f6dfbc834d634bc634770ee2de220aa617c065b7a10945cb716f88cfcaf",
"rawBytes": 33655,
"gzipBytes": 10255,
"gzipBytes": 10250,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/guard-Bdo2w6Sq.js",
"sha256": "b98da3eb22fde2449b43c37851d7e2cbbcb14103b20b7c6b417fa4bab2502416",
"path": "houseplan-assets/guard-B08tQ2iB.js",
"sha256": "d699a561e07585dc1cf90708632355dc5d19cfc09a1700ffc3db88abbe1bf2c0",
"rawBytes": 518,
"gzipBytes": 371,
"gzipBytes": 370,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-DkiI2BOK.js",
"sha256": "e7bdf9f5d1b699c27b57f25c369b137eceae0cf6f3ec7f2d364ef6c2bd552887",
"rawBytes": 1079369,
"gzipBytes": 299254,
"path": "houseplan-assets/houseplan-card-D0jk3o_K.js",
"sha256": "6b8371e61f30688bf1b3671ed27c8b80119df432af13e6c5da481be80b97afc9",
"rawBytes": 1080267,
"gzipBytes": 299772,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/fr-lBEFwYGK.js",
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"houseplan-assets/iso-scene-render-RhSO-S9j.js",
"houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"houseplan-assets/pdf-export-CsCJxU0E.js",
"houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js"
"houseplan-assets/de-VLLexfNZ.js",
"houseplan-assets/editor-DxwvfCN0.js",
"houseplan-assets/fr-sa0yIASm.js",
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/houseplan-editor-runtime-CPHsPq8i.js",
"houseplan-assets/houseplan-onboarding-runtime-CYnWHSzo.js",
"houseplan-assets/hp-zigbee-topology-overlay-BsRS5Mqx.js",
"houseplan-assets/iso-scene-render-CccMMhjh.js",
"houseplan-assets/live-interaction-runtime-DjugMgAq.js",
"houseplan-assets/pdf-export-BxY-xCel.js",
"houseplan-assets/summary-panel-runtime-loaded-sGYqBGeH.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"sha256": "00be6a1cdb443cd875e736984baf86b77e63d96474ec72d4d66bf2baa9f1a2ba",
"path": "houseplan-assets/houseplan-editor-runtime-CPHsPq8i.js",
"sha256": "eba46a060a4e1f4251bdd325404dc60dc60d1d61760a5b65cedda28f90e34c51",
"rawBytes": 672339,
"gzipBytes": 178936,
"gzipBytes": 178932,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js"
],
"dynamicImports": [
"houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
"houseplan-assets/zigbee-topology-runtime-DqQtbpDf.js"
]
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"sha256": "f81b58bde08ff74bab903803cc709e18449900dc91a3f64106db737bbabd55e3",
"path": "houseplan-assets/houseplan-onboarding-runtime-CYnWHSzo.js",
"sha256": "934460727e0eefc0a3034af6b273fad466823f3b28c38e1039232367592e5d4e",
"rawBytes": 28287,
"gzipBytes": 7039,
"gzipBytes": 7037,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"sha256": "968345cc4eaaf6cc46accbdc30b4fff83e3fc40a5a7b7a0f611229f0e53ec6b9",
"path": "houseplan-assets/hp-zigbee-topology-overlay-BsRS5Mqx.js",
"sha256": "64939778e4086df63abe3d4e8a3116962b264d4f0ee0c5184f08f0c0bfdf376a",
"rawBytes": 11034,
"gzipBytes": 3731,
"gzipBytes": 3730,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js",
"houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js",
"houseplan-assets/zigbee-topology-runtime-DqQtbpDf.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/iso-scene-render-RhSO-S9j.js",
"sha256": "b5c630c05c0c2648c96006ab51cf271ae2ca585742df4bd9ad456ce9dac86646",
"path": "houseplan-assets/iso-scene-render-CccMMhjh.js",
"sha256": "c11e4b107da8102344d6999650fc0c069d0c0fbb59af01c313d44c3c7c4e6903",
"rawBytes": 38562,
"gzipBytes": 13089,
"gzipBytes": 13087,
"isEntry": false,
"imports": [
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"sha256": "319a2a94cf85acd20b27522ae71b81e25ee1f2d69f1688256c5eeed4dddec3d5",
"path": "houseplan-assets/live-interaction-runtime-DjugMgAq.js",
"sha256": "2dbe23d9ee303be1140dbccbedd3616c29e4f89538b07220fb4026239bf9fef5",
"rawBytes": 5196,
"gzipBytes": 2129,
"gzipBytes": 2127,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/pdf-export-CsCJxU0E.js",
"sha256": "eccac69e0d54ceeff8fceb8db69a0f20f5339443cb7961f8916f9a850bb1ae6c",
"path": "houseplan-assets/pdf-export-BxY-xCel.js",
"sha256": "b595eee94a34d3e10e7ba12520062f39144fa8dd68a31318679d45d68a8d80aa",
"rawBytes": 237254,
"gzipBytes": 110117,
"gzipBytes": 110116,
"isEntry": false,
"imports": [
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-editor-BC_vG9Hn.js",
"sha256": "5c7fd338b94152ae5e1194f07c6353863a9e22c4f2e99424f5795484da989a64",
"path": "houseplan-assets/summary-panel-editor-C5vWd7lx.js",
"sha256": "c26cac6a394f9a023a49af7a3597c9e08dab5fcef1cd153132bb80f87fbdab4e",
"rawBytes": 14824,
"gzipBytes": 3401,
"gzipBytes": 3402,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-assets/summary-panel-runtime-loaded-sGYqBGeH.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-metrics-C2M32Xkf.js",
"sha256": "bca21f0d66af64c7c1ef501a8cd38e04e2a74ee7196e004f6f60397d9e9a72f1",
"path": "houseplan-assets/summary-panel-metrics-nnK4peUR.js",
"sha256": "7a9f1a763bf85e363bd5eb9fde91f94e8aa8e20e08a54f544ed06576bbf6e8da",
"rawBytes": 2610,
"gzipBytes": 1308,
"gzipBytes": 1306,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js",
"sha256": "54c791fdd19e77c24ac142794c4207345eaec03d2ab15dfdf3b991afa32bb812",
"path": "houseplan-assets/summary-panel-runtime-loaded-sGYqBGeH.js",
"sha256": "8c97c663bdc659ad68a9a8cbb73b07237b750d42096aeaf7736fd157775402ac",
"rawBytes": 72272,
"gzipBytes": 19729,
"gzipBytes": 19727,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": [
"houseplan-assets/summary-panel-editor-BC_vG9Hn.js",
"houseplan-assets/summary-panel-metrics-C2M32Xkf.js"
"houseplan-assets/summary-panel-editor-C5vWd7lx.js",
"houseplan-assets/summary-panel-metrics-nnK4peUR.js"
]
},
{
"path": "houseplan-assets/zigbee-topology-LI-FVdpo.js",
"sha256": "d01ec49d20c5f3dc028a59107f1f9060634ab93d6d112e03a7c2b85792159440",
"path": "houseplan-assets/zigbee-topology-BrdakkCO.js",
"sha256": "2b70bb09cc3bd85cef479fe8135844e454dbb9d47c359584f68f15c88df6091d",
"rawBytes": 18961,
"gzipBytes": 7431,
"gzipBytes": 7426,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js",
"sha256": "3a0fad7d479bbeb161434e498a3c8ac7f88da62ef37c173b66f95057098bcc97",
"path": "houseplan-assets/zigbee-topology-runtime-DqQtbpDf.js",
"sha256": "8026b2637d3f9f7cbbd836d7f0ee2608e78d967df4b8081a8f9a946702818e6e",
"rawBytes": 3941,
"gzipBytes": 1765,
"gzipBytes": 1764,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "21da7b3390ea9d4992e33bf4d6fdf684145b53f407e253a599e70a459585298d",
"sha256": "8a0de07efe43bee3b80fba47439783accc2d689621efb43eb92bd948c331f37e",
"rawBytes": 1205,
"gzipBytes": 805,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
"sha256": "a664721695cf5c85903eea440d05a295cb6d6d2cd1e3669fd5c65c9752534492",
"sha256": "c5cddd44a2af9872e9d352b2915f8889858a3c3c88947409955a16c2cf392858",
"rawBytes": 6124,
"gzipBytes": 2306,
"gzipBytes": 2305,
"isEntry": true,
"imports": [
"houseplan-card.js"
@@ -1,14 +1,14 @@
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
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";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-D0jk3o_K.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
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>f[e.name]||e.name}
.computeLabel=${e=>h[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(h.slice(0,3))}
${d(f.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${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)}}f.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",f);
${d(f.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);
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
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};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";import{dS as r,dT as t,dU as e}from"./houseplan-card-D0jk3o_K.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__="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">
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";import{b as a,A as e}from"./houseplan-card-D0jk3o_K.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-sGYqBGeH.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>
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
<input id="summary-local-show" data-summary-local-show type="checkbox"
@@ -1 +1 @@
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};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";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 u,ea as d,eb as f,bq as m,ec as g}from"./houseplan-card-D0jk3o_K.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(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,u="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||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,u=_){try{let d=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=u(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;d+=a(v)*_*_/1e4}return d}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=d(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__="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};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";import{n as t,b as n}from"./zigbee-topology-BrdakkCO.js";import{B as e}from"./houseplan-card-D0jk3o_K.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};
@@ -1 +1 @@
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)}
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";try{await import("./houseplan-assets/houseplan-card-D0jk3o_K.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
+105
View File
@@ -0,0 +1,105 @@
// #524: маркеры не анимируют тень, выраженную в контейнерных единицах.
//
// Тень оболочки и кольцо ядра заданы через `--dev-size`, а он восходит к
// `2.5cqw`. Пока `box-shadow` стоял в списке переходов, ЛЮБОЙ пересчёт
// контейнерных запросов — а он случается от подсказки, полосы прокрутки,
// поворота экрана — менял вычисленное значение у каждого маркера и запускал
// на нём некомпозируемый 150-миллисекундный переход. В профиле владельца
// (Firefox 155) 61 такой переход разом давал 9,4 к/с и кадры по 149 мс.
//
// Свидетель судит ПРИЧИНУ, а не время кадра: считает старты переходов, а не
// миллисекунды, и поэтому не флейкует и не зависит от движка. Проверять это
// в Chromium честно: переход запускается в обоих движках одинаково, разница
// только в цене перерисовки.
import { launch, checkAll, finish } from './serve.mjs';
const { page, browser } = await launch({ width: 1100, height: 820 });
// Слушатель ставится один раз и живёт до конца прогона.
await page.evaluate(() => {
const card = window.__card;
const root = card.shadowRoot || card.renderRoot;
window.__starts = [];
root.addEventListener('transitionrun', (event) => {
const target = event.target;
window.__starts.push({
property: event.propertyName,
cls: target?.getAttribute?.('class') || target?.tagName || '?',
onMarker: !!target?.closest?.('.dev'),
});
}, true);
});
const out = await page.evaluate(async () => {
const result = {};
const card = window.__card;
const root = card.shadowRoot || card.renderRoot;
const frame = () => new Promise((resolve) => requestAnimationFrame(resolve));
const settle = async () => { await card.updateComplete; await frame(); await frame(); };
card._setMode('devices');
await settle();
const markers = [...root.querySelectorAll('[data-hp="device"]')];
result.enoughMarkers = markers.length >= 8;
result.everyMarkerHasShell = markers.every((marker) => !!marker.querySelector('.device-shell-frame'));
// AC1: ширина контейнера меняется на один пиксель — переходов тени быть не должно.
const stage = root.querySelector('.stage');
const width = stage.getBoundingClientRect().width;
window.__starts.length = 0;
stage.style.width = `${Math.round(width) - 1}px`;
await frame(); await frame();
await new Promise((resolve) => setTimeout(resolve, 200));
const afterResize = [...window.__starts];
stage.style.removeProperty('width');
await settle();
result.containerResizeStartsNoShadowTransition = afterResize
.every((entry) => entry.property !== 'box-shadow');
result.shadowTransitionsOnResize = afterResize.filter((e) => e.property === 'box-shadow').length;
result.resizeStartsNothingOnMarkers = afterResize.filter((e) => e.onMarker).length;
// AC3: кольцо выделения появляется сразу и без перехода.
const target = markers[0];
const core = target.querySelector('.device-core');
const ringWidth = () => {
const shadow = getComputedStyle(core).boxShadow;
const px = [...shadow.matchAll(/(-?\d+(?:\.\d+)?)px/g)].map((m) => Math.abs(Number(m[1])));
return Math.max(0, ...px);
};
const before = ringWidth();
card._selId = target.dataset.id;
card.requestUpdate();
await card.updateComplete;
await frame();
result.selectionRingAppearsInOneFrame = ringWidth() > before;
result.selectionRingDoesNotAnimate = (core.getAnimations?.() || []).length === 0;
card._selId = null;
card.requestUpdate();
await settle();
window.__starts.length = 0;
return result;
});
// AC2: наведение настоящей мышью — отклик остался, анимируется рамка.
const box = await page.evaluate(() => {
const card = window.__card;
const root = card.shadowRoot || card.renderRoot;
const marker = root.querySelector('[data-hp="device"]');
const rect = marker.getBoundingClientRect();
return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };
});
await page.mouse.move(box.x - 120, box.y - 120);
await page.waitForTimeout(60);
await page.mouse.move(box.x, box.y);
await page.waitForTimeout(250);
const hover = await page.evaluate(() => {
const starts = [...window.__starts];
return {
// Браузер сообщает длинные формы: border-top-color и так далее.
hoverAnimatesBorder: starts.some((entry) => /^border-\w+-color$/.test(entry.property) && entry.onMarker),
hoverStartsNoShadow: starts.every((entry) => entry.property !== 'box-shadow'),
};
});
checkAll({ ...out, ...hover }, { shadowTransitionsOnResize: 0, resizeStartsNothingOnMarkers: 0 });
await browser.close();
finish();
+140 -140
View File
@@ -1,109 +1,109 @@
{
"schema": 1,
"fingerprint": "7d8c26b95986499fd35534164d8e2bc2e897f0fbe9d846bccffa49f45116a618",
"fingerprint": "ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 300059,
"initialViewGzipBytes": 300577,
"initialPanelFiles": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-card.js",
"houseplan-panel.js"
],
"initialPanelGzipBytes": 302365,
"initialPanelGzipBytes": 302882,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
"initialPanelOnlyGzipBytes": 2306,
"initialPanelOnlyGzipBytes": 2305,
"lazyFiles": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/fr-lBEFwYGK.js",
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"houseplan-assets/iso-scene-render-RhSO-S9j.js",
"houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"houseplan-assets/pdf-export-CsCJxU0E.js",
"houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js",
"houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/de-VLLexfNZ.js",
"houseplan-assets/editor-DxwvfCN0.js",
"houseplan-assets/fr-sa0yIASm.js",
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/houseplan-editor-runtime-CPHsPq8i.js",
"houseplan-assets/houseplan-onboarding-runtime-CYnWHSzo.js",
"houseplan-assets/hp-zigbee-topology-overlay-BsRS5Mqx.js",
"houseplan-assets/iso-scene-render-CccMMhjh.js",
"houseplan-assets/live-interaction-runtime-DjugMgAq.js",
"houseplan-assets/pdf-export-BxY-xCel.js",
"houseplan-assets/summary-panel-runtime-loaded-sGYqBGeH.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js",
"houseplan-assets/zigbee-topology-runtime-DqQtbpDf.js"
],
"lazyGzipBytes": 418179,
"lazyGzipBytes": 418153,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/editor-DxwvfCN0.js",
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/houseplan-editor-runtime-CPHsPq8i.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js"
],
"lazyEditorGzipBytes": 205726,
"lazyEditorGzipBytes": 205708,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/houseplan-onboarding-runtime-CYnWHSzo.js"
],
"lazyOnboardingGzipBytes": 14187,
"lazyOnboardingGzipBytes": 14184,
"lazyLocaleFiles": [
"houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/fr-lBEFwYGK.js"
"houseplan-assets/de-VLLexfNZ.js",
"houseplan-assets/fr-sa0yIASm.js"
],
"lazyLocaleGzipBytes": 54854,
"lazyLocaleGzipBytes": 54857,
"lazyIsometricFiles": [
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/iso-scene-render-RhSO-S9j.js"
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/iso-scene-render-CccMMhjh.js"
],
"lazyIsometricGzipBytes": 13460,
"lazyIsometricGzipBytes": 13457,
"lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js"
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js"
],
"lazyFurnitureArtGzipBytes": 10255,
"lazyFurnitureArtGzipBytes": 10250,
"lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/pdf-export-CsCJxU0E.js"
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/pdf-export-BxY-xCel.js"
],
"lazyPdfGzipBytes": 120372,
"lazyPdfGzipBytes": 120366,
"files": [
{
"path": "houseplan-assets/backdrop-pick-BvtFVd_V.js",
"sha256": "e76da9cb2c5c8a32b2798c6f8785819bd7ff6ee624987feb8ff2c89522f87fef",
"path": "houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"sha256": "576bbc6b2cc1e44839881fa20dd9fff9a1222f865448b26c5367a02c4d57284a",
"rawBytes": 21134,
"gzipBytes": 7148,
"gzipBytes": 7147,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-HksnN-9C.js",
"sha256": "3a1ada3b04ef3eb7e9c6856c700d589e90e962a6753087b59f89b481c68a9499",
"path": "houseplan-assets/de-VLLexfNZ.js",
"sha256": "ea2cf39e832157c796f0f419eddfe112ea85671f897c30422a93a2526b4593df",
"rawBytes": 91441,
"gzipBytes": 27710,
"gzipBytes": 27713,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-CSFqqHwT.js",
"sha256": "a5adebb3a438356deb0e5a35fa218bcb4ab6a8be23d6e535b6cd350170775926",
"path": "houseplan-assets/editor-DxwvfCN0.js",
"sha256": "03ef45f8ca06d3caa0b2a083b82a0189dd78a51a0a36de3903e05586e7516e47",
"rawBytes": 3832,
"gzipBytes": 1585,
"gzipBytes": 1583,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-lBEFwYGK.js",
"sha256": "de104eb96b8e4fbb2895ab861300878eb3f27dc616e4737bc2e9e818286c9d88",
"path": "houseplan-assets/fr-sa0yIASm.js",
"sha256": "aa8d30728b71a0d28378d056d4a5f13bca6e995f97443510302c097d4a5c0699",
"rawBytes": 93719,
"gzipBytes": 27144,
"isEntry": false,
@@ -111,199 +111,199 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"sha256": "9b63fd1d6479a45b433b323468a56b46ab0e0e3d2a5bfb82b6349d475e59eee8",
"path": "houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"sha256": "26925f6dfbc834d634bc634770ee2de220aa617c065b7a10945cb716f88cfcaf",
"rawBytes": 33655,
"gzipBytes": 10255,
"gzipBytes": 10250,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/guard-Bdo2w6Sq.js",
"sha256": "b98da3eb22fde2449b43c37851d7e2cbbcb14103b20b7c6b417fa4bab2502416",
"path": "houseplan-assets/guard-B08tQ2iB.js",
"sha256": "d699a561e07585dc1cf90708632355dc5d19cfc09a1700ffc3db88abbe1bf2c0",
"rawBytes": 518,
"gzipBytes": 371,
"gzipBytes": 370,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-DkiI2BOK.js",
"sha256": "e7bdf9f5d1b699c27b57f25c369b137eceae0cf6f3ec7f2d364ef6c2bd552887",
"rawBytes": 1079369,
"gzipBytes": 299254,
"path": "houseplan-assets/houseplan-card-D0jk3o_K.js",
"sha256": "6b8371e61f30688bf1b3671ed27c8b80119df432af13e6c5da481be80b97afc9",
"rawBytes": 1080267,
"gzipBytes": 299772,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-HksnN-9C.js",
"houseplan-assets/editor-CSFqqHwT.js",
"houseplan-assets/fr-lBEFwYGK.js",
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"houseplan-assets/iso-scene-render-RhSO-S9j.js",
"houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"houseplan-assets/pdf-export-CsCJxU0E.js",
"houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js"
"houseplan-assets/de-VLLexfNZ.js",
"houseplan-assets/editor-DxwvfCN0.js",
"houseplan-assets/fr-sa0yIASm.js",
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/houseplan-editor-runtime-CPHsPq8i.js",
"houseplan-assets/houseplan-onboarding-runtime-CYnWHSzo.js",
"houseplan-assets/hp-zigbee-topology-overlay-BsRS5Mqx.js",
"houseplan-assets/iso-scene-render-CccMMhjh.js",
"houseplan-assets/live-interaction-runtime-DjugMgAq.js",
"houseplan-assets/pdf-export-BxY-xCel.js",
"houseplan-assets/summary-panel-runtime-loaded-sGYqBGeH.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-uP6vjZmA.js",
"sha256": "00be6a1cdb443cd875e736984baf86b77e63d96474ec72d4d66bf2baa9f1a2ba",
"path": "houseplan-assets/houseplan-editor-runtime-CPHsPq8i.js",
"sha256": "eba46a060a4e1f4251bdd325404dc60dc60d1d61760a5b65cedda28f90e34c51",
"rawBytes": 672339,
"gzipBytes": 178936,
"gzipBytes": 178932,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js"
],
"dynamicImports": [
"houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
"houseplan-assets/zigbee-topology-runtime-DqQtbpDf.js"
]
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-BdClDAcS.js",
"sha256": "f81b58bde08ff74bab903803cc709e18449900dc91a3f64106db737bbabd55e3",
"path": "houseplan-assets/houseplan-onboarding-runtime-CYnWHSzo.js",
"sha256": "934460727e0eefc0a3034af6b273fad466823f3b28c38e1039232367592e5d4e",
"rawBytes": 28287,
"gzipBytes": 7039,
"gzipBytes": 7037,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-BvtFVd_V.js",
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/backdrop-pick-D5Q4Lp1s.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/hp-zigbee-topology-overlay-DRpau2VG.js",
"sha256": "968345cc4eaaf6cc46accbdc30b4fff83e3fc40a5a7b7a0f611229f0e53ec6b9",
"path": "houseplan-assets/hp-zigbee-topology-overlay-BsRS5Mqx.js",
"sha256": "64939778e4086df63abe3d4e8a3116962b264d4f0ee0c5184f08f0c0bfdf376a",
"rawBytes": 11034,
"gzipBytes": 3731,
"gzipBytes": 3730,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js",
"houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js",
"houseplan-assets/zigbee-topology-runtime-DqQtbpDf.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/iso-scene-render-RhSO-S9j.js",
"sha256": "b5c630c05c0c2648c96006ab51cf271ae2ca585742df4bd9ad456ce9dac86646",
"path": "houseplan-assets/iso-scene-render-CccMMhjh.js",
"sha256": "c11e4b107da8102344d6999650fc0c069d0c0fbb59af01c313d44c3c7c4e6903",
"rawBytes": 38562,
"gzipBytes": 13089,
"gzipBytes": 13087,
"isEntry": false,
"imports": [
"houseplan-assets/guard-Bdo2w6Sq.js",
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/guard-B08tQ2iB.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/live-interaction-runtime-C_klxsXE.js",
"sha256": "319a2a94cf85acd20b27522ae71b81e25ee1f2d69f1688256c5eeed4dddec3d5",
"path": "houseplan-assets/live-interaction-runtime-DjugMgAq.js",
"sha256": "2dbe23d9ee303be1140dbccbedd3616c29e4f89538b07220fb4026239bf9fef5",
"rawBytes": 5196,
"gzipBytes": 2129,
"gzipBytes": 2127,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/pdf-export-CsCJxU0E.js",
"sha256": "eccac69e0d54ceeff8fceb8db69a0f20f5339443cb7961f8916f9a850bb1ae6c",
"path": "houseplan-assets/pdf-export-BxY-xCel.js",
"sha256": "b595eee94a34d3e10e7ba12520062f39144fa8dd68a31318679d45d68a8d80aa",
"rawBytes": 237254,
"gzipBytes": 110117,
"gzipBytes": 110116,
"isEntry": false,
"imports": [
"houseplan-assets/furniture-plan-art.generated-B3wZVvff.js",
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/furniture-plan-art.generated-DKbkMWv0.js",
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-editor-BC_vG9Hn.js",
"sha256": "5c7fd338b94152ae5e1194f07c6353863a9e22c4f2e99424f5795484da989a64",
"path": "houseplan-assets/summary-panel-editor-C5vWd7lx.js",
"sha256": "c26cac6a394f9a023a49af7a3597c9e08dab5fcef1cd153132bb80f87fbdab4e",
"rawBytes": 14824,
"gzipBytes": 3401,
"gzipBytes": 3402,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-assets/summary-panel-runtime-loaded-sGYqBGeH.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-metrics-C2M32Xkf.js",
"sha256": "bca21f0d66af64c7c1ef501a8cd38e04e2a74ee7196e004f6f60397d9e9a72f1",
"path": "houseplan-assets/summary-panel-metrics-nnK4peUR.js",
"sha256": "7a9f1a763bf85e363bd5eb9fde91f94e8aa8e20e08a54f544ed06576bbf6e8da",
"rawBytes": 2610,
"gzipBytes": 1308,
"gzipBytes": 1306,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-runtime-loaded-DQS834xA.js",
"sha256": "54c791fdd19e77c24ac142794c4207345eaec03d2ab15dfdf3b991afa32bb812",
"path": "houseplan-assets/summary-panel-runtime-loaded-sGYqBGeH.js",
"sha256": "8c97c663bdc659ad68a9a8cbb73b07237b750d42096aeaf7736fd157775402ac",
"rawBytes": 72272,
"gzipBytes": 19729,
"gzipBytes": 19727,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": [
"houseplan-assets/summary-panel-editor-BC_vG9Hn.js",
"houseplan-assets/summary-panel-metrics-C2M32Xkf.js"
"houseplan-assets/summary-panel-editor-C5vWd7lx.js",
"houseplan-assets/summary-panel-metrics-nnK4peUR.js"
]
},
{
"path": "houseplan-assets/zigbee-topology-LI-FVdpo.js",
"sha256": "d01ec49d20c5f3dc028a59107f1f9060634ab93d6d112e03a7c2b85792159440",
"path": "houseplan-assets/zigbee-topology-BrdakkCO.js",
"sha256": "2b70bb09cc3bd85cef479fe8135844e454dbb9d47c359584f68f15c88df6091d",
"rawBytes": 18961,
"gzipBytes": 7431,
"gzipBytes": 7426,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-runtime-DTi-kj9C.js",
"sha256": "3a0fad7d479bbeb161434e498a3c8ac7f88da62ef37c173b66f95057098bcc97",
"path": "houseplan-assets/zigbee-topology-runtime-DqQtbpDf.js",
"sha256": "8026b2637d3f9f7cbbd836d7f0ee2608e78d967df4b8081a8f9a946702818e6e",
"rawBytes": 3941,
"gzipBytes": 1765,
"gzipBytes": 1764,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js",
"houseplan-assets/zigbee-topology-LI-FVdpo.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js",
"houseplan-assets/zigbee-topology-BrdakkCO.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "21da7b3390ea9d4992e33bf4d6fdf684145b53f407e253a599e70a459585298d",
"sha256": "8a0de07efe43bee3b80fba47439783accc2d689621efb43eb92bd948c331f37e",
"rawBytes": 1205,
"gzipBytes": 805,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-DkiI2BOK.js"
"houseplan-assets/houseplan-card-D0jk3o_K.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
"sha256": "a664721695cf5c85903eea440d05a295cb6d6d2cd1e3669fd5c65c9752534492",
"sha256": "c5cddd44a2af9872e9d352b2915f8889858a3c3c88947409955a16c2cf392858",
"rawBytes": 6124,
"gzipBytes": 2306,
"gzipBytes": 2305,
"isEntry": true,
"imports": [
"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__="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
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";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-D0jk3o_K.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
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>f[e.name]||e.name}
.computeLabel=${e=>h[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(h.slice(0,3))}
${d(f.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${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)}}f.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",f);
${d(f.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);
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
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};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";import{dS as r,dT as t,dU as e}from"./houseplan-card-D0jk3o_K.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__="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">
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";import{b as a,A as e}from"./houseplan-card-D0jk3o_K.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-sGYqBGeH.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>
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
<input id="summary-local-show" data-summary-local-show type="checkbox"
@@ -1 +1 @@
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};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";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 u,ea as d,eb as f,bq as m,ec as g}from"./houseplan-card-D0jk3o_K.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(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,u="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||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,u=_){try{let d=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=u(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;d+=a(v)*_*_/1e4}return d}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=d(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__="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};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";import{n as t,b as n}from"./zigbee-topology-BrdakkCO.js";import{B as e}from"./houseplan-card-D0jk3o_K.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};
+1 -1
View File
@@ -1 +1 @@
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)}
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ff98640cc5310e1e90e00b0cf23e42c8b1ac0953c6ad38786af6378331273765";try{await import("./houseplan-assets/houseplan-card-D0jk3o_K.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
+7
View File
@@ -2,6 +2,13 @@
## Unreleased
- The plan is smooth again in Firefox. A device marker's shadow is sized from
the marker, which is sized from the container, so anything that changed the
container width — a tooltip, a scrollbar, a rotation — restarted a shadow
animation on every marker at once. Sixty-one of them at a time dropped
Firefox to nine frames per second; the shadow now simply appears, unchanged
([#524](https://github.com/Matysh/houseplan-card/issues/524)).
- 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
+7
View File
@@ -8,6 +8,13 @@
## Не выпущено
- План снова плавный в Firefox. Тень маркера устройства считается от размера
маркера, а он — от ширины контейнера, поэтому всё, что эту ширину меняло —
подсказка, полоса прокрутки, поворот экрана, — заново запускало анимацию
тени сразу у всех маркеров. Шестьдесят одна такая анимация роняла Firefox до
девяти кадров в секунду; теперь тень просто появляется, оставшись прежней
([#524](https://github.com/Matysh/houseplan-card/issues/524)).
- При переключении между пространствами двери и окна больше не доигрывают
движение створки соседней двери — ни в одну сторону, ни в другую. Анимация
остаётся только за настоящей сменой состояния датчика
+21
View File
@@ -279,6 +279,27 @@ node scripts/bundle-tree.mjs dist custom_components/houseplan/frontend
The full HA pytest harness requires Linux/WSL; native Windows lacks `fcntl`.
## Do not animate container-relative properties on the plan (#524)
A CSS property whose value is expressed in container query units — `cqw`,
`cqh`, or any custom property derived from them, such as `--dev-size` — must
not appear in a `transition` on elements the plan draws in quantity.
Container query styles are re-evaluated whenever the container's inline size
changes: a tooltip, a scrollbar, a rotation, a panel resize. Every such
re-evaluation produces a new computed value and therefore **restarts the
transition on every one of those elements at once**.
That is how `box-shadow` on device markers cost a real user 9.4 frames per
second in Firefox 155: sixty-one markers started a 150 ms non-composited
shadow transition four times in two seconds, and the refresh driver spent the
window waiting for paint. Chromium starts exactly the same transitions — it
merely pays less for them, which is why the defect hid there.
The witness is browser-independent and lives in
`demo/smoke_marker_shadow_transitions.mjs`: change the stage container width by
one pixel and assert that no `transitionrun` for `box-shadow` arrives.
## Dependency and cache gotchas
- **polygon-clipping is a trap**: its `.d.ts` declares named exports but the ESM build has only
+12
View File
@@ -3611,6 +3611,18 @@ const MUTANT_DEFINITIONS = [
replace: " if (ledger.caught[mutant.id] === fingerprint || mutant.id in ledger.caught) skipped.push(mutant);",
}],
},
{
id: 'marker-shadow-animates-again',
guard: 'node demo/smoke_marker_shadow_transitions.mjs',
because: '#524: тень маркера выражена в контейнерных единицах — с переходом любой пересчёт '
+ 'контейнерных запросов запускает некомпозируемый переход на каждом маркере; в профиле '
+ 'владельца 61 штука разом дала 9,4 к/с и кадры по 149 мс',
patches: [{
file: 'src/styles/devices.styles.ts',
find: ' transition: border-color .15s, opacity' + ' .2s;',
replace: ' transition: border-color .15s, box-shadow .15s, opacity .2s;',
}],
},
{
id: 'anchor-region-narrows-ambiguous-anchor',
guard: 'node --test --test-name-pattern="#518 AC4" test/mutation-gate.test.mjs',
+10 -2
View File
@@ -209,7 +209,12 @@ export const devicesStyles = css`
border-radius: 9999px;
background: transparent;
box-shadow: var(--device-shell-shadow);
transition: border-color .15s, box-shadow .15s, opacity .2s;
/* #524: тень оболочки выражена в --dev-size, а он — в cqw. Пока
box-shadow стоял в переходах, любой пересчёт контейнерных запросов
запускал некомпозируемый переход на КАЖДОМ маркере: на плане владельца
61 штука разом роняли Firefox до 9,4 к/с. Сама тень не изменилась —
она просто применяется сразу. */
transition: border-color .15s, opacity .2s;
pointer-events: auto;
/* Normative production fallback: never add a per-marker backdrop blur. */
backdrop-filter: none;
@@ -261,7 +266,10 @@ export const devicesStyles = css`
var(--device-core-inset-shadow),
0 0 0 var(--device-ring-width) var(--device-ring-color);
line-height: 0;
transition: background .15s, color .15s, box-shadow .15s, opacity .2s;
/* #524: то же и у ядра — кольцо выделения и внутренняя тень заданы
через --dev-size. Кольцо появляется мгновенно; плавное стоило бы
перерисовки кадра на каждый маркер при каждом пересчёте контейнера. */
transition: background .15s, color .15s, opacity .2s;
pointer-events: none;
}
.device-sections {