Keep the day-cycle outline on its own compositing layer

The "Follows the sun" background made the plan crawl in Firefox: 23 MB of
textures per frame, sixteen of about twenty picture-cache tiles thrown
away every frame, nine frames per second. The card's own JavaScript was
idle for 89 % of that.

The cost is the outer outline. It is a triple drop-shadow over the
grouped paper footprint, and although the group holds paper silhouettes
only and never changes on hover or pan, the filter lived in the plan's
own layer — so every repaint of the plan re-ran three blur passes over
the whole sheet. One hint moves the filtered paper into its own layer
and unhooks it from the plan's repaints.

Measured on a demo-stand pan (Chromium, CDP, summed RasterTask): 1456.6
ms against a static background's 96.7 ms before, 84.7 ms against 103.2
ms after. The new smoke measures that ratio and fails above two.

The picture does not change: the outline outside the plan matches byte
for byte and the frame's mean colour moves from 176.59 to 176.66 of 255.
Splitting the layer does move the remaining content onto a different
sub-pixel grid, so the diagonal wall hatch anti-aliases differently and
the four day-cycle baselines are re-taken on the beta candidate.

Issue: #532
User-Visible: yes
This commit is contained in:
Claude
2026-09-11 17:01:04 +00:00
committed by claude[bot]
parent 7a81d41bab
commit ced9b41642
53 changed files with 677 additions and 492 deletions
@@ -1,309 +1,309 @@
{
"schema": 1,
"fingerprint": "dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039",
"fingerprint": "f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 287242,
"initialViewGzipBytes": 287246,
"initialPanelFiles": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-card.js",
"houseplan-panel.js"
],
"initialPanelGzipBytes": 289548,
"initialPanelGzipBytes": 289551,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
"initialPanelOnlyGzipBytes": 2306,
"initialPanelOnlyGzipBytes": 2305,
"lazyFiles": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/de-BAfQ3noX.js",
"houseplan-assets/editor-Ca9vnH-K.js",
"houseplan-assets/fr-a4v8Ohtu.js",
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/houseplan-editor-runtime-BVcD08Op.js",
"houseplan-assets/houseplan-onboarding-runtime-0ApfaTVi.js",
"houseplan-assets/hp-zigbee-topology-overlay-B_T0ilCj.js",
"houseplan-assets/iso-scene-render-DtlvcvOT.js",
"houseplan-assets/live-interaction-runtime-CjYDG1SP.js",
"houseplan-assets/pdf-export-CY9TOlZ5.js",
"houseplan-assets/summary-panel-runtime-loaded-CB4AHgRN.js",
"houseplan-assets/zigbee-topology-DitREaKv.js",
"houseplan-assets/zigbee-topology-runtime-Cez46hoy.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/de-BzGLbwvZ.js",
"houseplan-assets/editor-C1xpueyG.js",
"houseplan-assets/fr-C3geGtjl.js",
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/houseplan-editor-runtime-Dj6agWVl.js",
"houseplan-assets/houseplan-onboarding-runtime-J0_74gcV.js",
"houseplan-assets/hp-zigbee-topology-overlay-DwyWKwR8.js",
"houseplan-assets/iso-scene-render-DJJ7WLdq.js",
"houseplan-assets/live-interaction-runtime-jSU7kWgv.js",
"houseplan-assets/pdf-export-DpRho-Fx.js",
"houseplan-assets/summary-panel-runtime-loaded-Cu8UM3xX.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js",
"houseplan-assets/zigbee-topology-runtime-CiKM8bMZ.js"
],
"lazyGzipBytes": 417431,
"lazyGzipBytes": 417414,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/editor-Ca9vnH-K.js",
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/houseplan-editor-runtime-BVcD08Op.js",
"houseplan-assets/zigbee-topology-DitREaKv.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/editor-C1xpueyG.js",
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/houseplan-editor-runtime-Dj6agWVl.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js"
],
"lazyEditorGzipBytes": 204999,
"lazyEditorGzipBytes": 204996,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/houseplan-onboarding-runtime-0ApfaTVi.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/houseplan-onboarding-runtime-J0_74gcV.js"
],
"lazyOnboardingGzipBytes": 13916,
"lazyLocaleFiles": [
"houseplan-assets/de-BAfQ3noX.js",
"houseplan-assets/fr-a4v8Ohtu.js"
"houseplan-assets/de-BzGLbwvZ.js",
"houseplan-assets/fr-C3geGtjl.js"
],
"lazyLocaleGzipBytes": 54820,
"lazyLocaleGzipBytes": 54817,
"lazyIsometricFiles": [
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/iso-scene-render-DtlvcvOT.js"
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/iso-scene-render-DJJ7WLdq.js"
],
"lazyIsometricGzipBytes": 13460,
"lazyIsometricGzipBytes": 13456,
"lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js"
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js"
],
"lazyFurnitureArtGzipBytes": 10254,
"lazyFurnitureArtGzipBytes": 10255,
"lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/pdf-export-CY9TOlZ5.js"
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/pdf-export-DpRho-Fx.js"
],
"lazyPdfGzipBytes": 120128,
"files": [
{
"path": "houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"sha256": "ce22e7599ea095db52bf13da52204107ed2d535fb57f69766e3669dfea1c9ef2",
"path": "houseplan-assets/backdrop-pick-B2vh4ldK.js",
"sha256": "50c3c752cc39625b8e9693a517bf09c50152befe468d634bd9f157a880d13c2b",
"rawBytes": 19956,
"gzipBytes": 6879,
"gzipBytes": 6880,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-BAfQ3noX.js",
"sha256": "38d0ffe6551c85bc7a5686943679357a726928644136850dc646e0cdd5713bab",
"path": "houseplan-assets/de-BzGLbwvZ.js",
"sha256": "d003e6380ff0cf2a41e7e956de4d343b21c45e9f9bde0d57a2e2ebc4db5adb51",
"rawBytes": 91402,
"gzipBytes": 27694,
"gzipBytes": 27692,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-Ca9vnH-K.js",
"sha256": "fd8b9731bc4a417cb0545e06677c836e98fa59a7b28e7cf0345d87c25f4aaed7",
"path": "houseplan-assets/editor-C1xpueyG.js",
"sha256": "074d2bb9067d77491a11ea32a6443dcc22af8fe684af24e18001cb500d8dc7b2",
"rawBytes": 3832,
"gzipBytes": 1583,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-a4v8Ohtu.js",
"sha256": "ccc6ccd7d3736f7567080f000de2dd04ecf60989163720e46d11063cd3ace9ee",
"path": "houseplan-assets/fr-C3geGtjl.js",
"sha256": "52b7f50e7dcc34671a868a19250bb48a657a4956e157221daf961159fb2095d5",
"rawBytes": 93667,
"gzipBytes": 27126,
"gzipBytes": 27125,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"sha256": "d8e59b11da6c8f4a665b33cc6d92e9eb9e2e9ef94fed1071ba5988ce5c98e438",
"path": "houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"sha256": "43d140c50a1359d5e94e2806f505c262a04edfa872d443c83198a2215a4b988f",
"rawBytes": 33655,
"gzipBytes": 10254,
"gzipBytes": 10255,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/guard-BYWHhzjw.js",
"sha256": "b81804f104d25d22dbc909341c48821dbe950aad94054b9512f5322a04fdfc8b",
"path": "houseplan-assets/guard-Cf4E-8ce.js",
"sha256": "d0895bcb2a7b722d7d036235d9fbbed3887b2907b1ea8ec961fecb5ab1ac6ef4",
"rawBytes": 518,
"gzipBytes": 369,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-DEVy5dLN.js",
"sha256": "d8cf65be7367f51ed4c8069825965c002036ec16321e3dc83dce1638ec7d2565",
"rawBytes": 1020996,
"gzipBytes": 286437,
"path": "houseplan-assets/houseplan-card-CvCwcI3S.js",
"sha256": "d0f9cb54803bb7dacf2e0275fb26372e4b4232357c199b9521b4b75ee102ea04",
"rawBytes": 1021015,
"gzipBytes": 286443,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-BAfQ3noX.js",
"houseplan-assets/editor-Ca9vnH-K.js",
"houseplan-assets/fr-a4v8Ohtu.js",
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/houseplan-editor-runtime-BVcD08Op.js",
"houseplan-assets/houseplan-onboarding-runtime-0ApfaTVi.js",
"houseplan-assets/hp-zigbee-topology-overlay-B_T0ilCj.js",
"houseplan-assets/iso-scene-render-DtlvcvOT.js",
"houseplan-assets/live-interaction-runtime-CjYDG1SP.js",
"houseplan-assets/pdf-export-CY9TOlZ5.js",
"houseplan-assets/summary-panel-runtime-loaded-CB4AHgRN.js"
"houseplan-assets/de-BzGLbwvZ.js",
"houseplan-assets/editor-C1xpueyG.js",
"houseplan-assets/fr-C3geGtjl.js",
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/houseplan-editor-runtime-Dj6agWVl.js",
"houseplan-assets/houseplan-onboarding-runtime-J0_74gcV.js",
"houseplan-assets/hp-zigbee-topology-overlay-DwyWKwR8.js",
"houseplan-assets/iso-scene-render-DJJ7WLdq.js",
"houseplan-assets/live-interaction-runtime-jSU7kWgv.js",
"houseplan-assets/pdf-export-DpRho-Fx.js",
"houseplan-assets/summary-panel-runtime-loaded-Cu8UM3xX.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-BVcD08Op.js",
"sha256": "b26691e5ac6338578a23ab3d6c0a774e36c4e708f2bb4a48894ab7e4b0ca7c96",
"path": "houseplan-assets/houseplan-editor-runtime-Dj6agWVl.js",
"sha256": "28b55c311643e4b2ac783f060ac2d8af851a49fc65a264d1954101ea36074865",
"rawBytes": 668813,
"gzipBytes": 178484,
"gzipBytes": 178480,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/zigbee-topology-DitREaKv.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js"
],
"dynamicImports": [
"houseplan-assets/zigbee-topology-runtime-Cez46hoy.js"
"houseplan-assets/zigbee-topology-runtime-CiKM8bMZ.js"
]
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-0ApfaTVi.js",
"sha256": "e1fc28837937564eee4a602230cdaf3fbabe35703a7ecda43ce74def1159d0b7",
"path": "houseplan-assets/houseplan-onboarding-runtime-J0_74gcV.js",
"sha256": "f26d85e6c6b9276ed1b8dddf68f8d6fec58285034a5612e7bc621d0650fe3b39",
"rawBytes": 28287,
"gzipBytes": 7037,
"gzipBytes": 7036,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/hp-zigbee-topology-overlay-B_T0ilCj.js",
"sha256": "d9f0676bc0034a3baed8c9108f8799aa261cbabbef86929ef812cd90e0e9e302",
"path": "houseplan-assets/hp-zigbee-topology-overlay-DwyWKwR8.js",
"sha256": "38630979c6005defc2870cbd670e93a2bc72e7103c0619a2db8bbc9e5e35add0",
"rawBytes": 10756,
"gzipBytes": 3684,
"gzipBytes": 3682,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/zigbee-topology-DitREaKv.js",
"houseplan-assets/zigbee-topology-runtime-Cez46hoy.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js",
"houseplan-assets/zigbee-topology-runtime-CiKM8bMZ.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/iso-scene-render-DtlvcvOT.js",
"sha256": "ad3e8c6b41caf6edc5e3b259dcffa3bff98c0110ae80cbd3bf736d5eccfb7d0f",
"path": "houseplan-assets/iso-scene-render-DJJ7WLdq.js",
"sha256": "0fe3c080025e143c7c1e36360c048bdfeb7de15ad5614e51ccd93a474ac01a76",
"rawBytes": 38562,
"gzipBytes": 13091,
"gzipBytes": 13087,
"isEntry": false,
"imports": [
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/live-interaction-runtime-CjYDG1SP.js",
"sha256": "886197ec8207c347463a743dd3a7a2f95bb05efbe4545332a41c12891cc3242e",
"path": "houseplan-assets/live-interaction-runtime-jSU7kWgv.js",
"sha256": "f82bbf39d216aa1da371f477a98bf0db290a322b978159534ec77313272a73b2",
"rawBytes": 6032,
"gzipBytes": 2433,
"gzipBytes": 2432,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/pdf-export-CY9TOlZ5.js",
"sha256": "0fa7863db13ffe8d654f35cf25222639be2f6c4ed018941feffde0503da2b425",
"path": "houseplan-assets/pdf-export-DpRho-Fx.js",
"sha256": "b3f320d2a9fc4dae77d252e9ca71a9e8bf76aab8143296f070d0d8501afb60d3",
"rawBytes": 236244,
"gzipBytes": 109874,
"gzipBytes": 109873,
"isEntry": false,
"imports": [
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-editor-DeBQ1tcV.js",
"sha256": "b1bbc6089d46f90c81c295e0305374ca2f2c5fca0322f27d4e9ecb9bb76ead28",
"path": "houseplan-assets/summary-panel-editor-Cq0L-N9R.js",
"sha256": "27880dfef9a780a4bbd5003875801eec32943df47d5a41de9ba2ddf33475e798",
"rawBytes": 14824,
"gzipBytes": 3401,
"gzipBytes": 3402,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/summary-panel-runtime-loaded-CB4AHgRN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-assets/summary-panel-runtime-loaded-Cu8UM3xX.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-metrics-B3ruGJoU.js",
"sha256": "d68458815e4a7772cd87bf55f1448ba1794c54b1e6c749825f0672952051a93c",
"path": "houseplan-assets/summary-panel-metrics-Ci8fAKZP.js",
"sha256": "185fd9a451dec36588013e643f7fa30a91b198bed52e7b95bbe742b47da3af4e",
"rawBytes": 2610,
"gzipBytes": 1306,
"gzipBytes": 1304,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-runtime-loaded-CB4AHgRN.js",
"sha256": "d7d78a52ff91ce0dd1d07eb8e670e931814ef71c969f67069485d1313adeafe4",
"path": "houseplan-assets/summary-panel-runtime-loaded-Cu8UM3xX.js",
"sha256": "1a47e72af54209e481ea42ba635d5539d5fa93230054cb32ec2c37f163a37f8f",
"rawBytes": 72272,
"gzipBytes": 19728,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": [
"houseplan-assets/summary-panel-editor-DeBQ1tcV.js",
"houseplan-assets/summary-panel-metrics-B3ruGJoU.js"
"houseplan-assets/summary-panel-editor-Cq0L-N9R.js",
"houseplan-assets/summary-panel-metrics-Ci8fAKZP.js"
]
},
{
"path": "houseplan-assets/zigbee-topology-DitREaKv.js",
"sha256": "d29bb086e6862441a6115d431ed71e4ee0b96201a10bdfedb93d3f11280264ca",
"rawBytes": 18961,
"gzipBytes": 7430,
"path": "houseplan-assets/zigbee-topology-runtime-CiKM8bMZ.js",
"sha256": "df8412087da621cc7e9bccfb3548af001e39ff202d98a407be75f007c3bf0211",
"rawBytes": 3941,
"gzipBytes": 1763,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-runtime-Cez46hoy.js",
"sha256": "5bb047f1c003a211e0a57f2fa03d37e968144ca741d99b2f3e486ee70e4aa130",
"rawBytes": 3941,
"gzipBytes": 1765,
"path": "houseplan-assets/zigbee-topology-RVaqPxNn.js",
"sha256": "fee6dd544594966f44db71dc5529031b2fc8adfe11fe78290b1d0f5bd33e20a0",
"rawBytes": 18961,
"gzipBytes": 7429,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/zigbee-topology-DitREaKv.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "2cf259caacb83ef37c3e5e743f88bcd61a6f48131af71fa565528f409b2f1f82",
"sha256": "d1bd483cc0d9e5030c33d713eed4ce01674aaee15d7a09ed230e3470bbe186c1",
"rawBytes": 1205,
"gzipBytes": 805,
"gzipBytes": 803,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
"sha256": "02fa46808fbf68c9245ec2b518ec2047953678b13b054a923259f1a8d9e9cb9a",
"sha256": "2827d1118a9d90c49306e0c01b4f1a7b448c24cf51b1ca0ec829bd95c1b37995",
"rawBytes": 6124,
"gzipBytes": 2306,
"gzipBytes": 2305,
"isEntry": true,
"imports": [
"houseplan-card.js"
@@ -1,14 +1,14 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";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-DEVy5dLN.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";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-CvCwcI3S.js";class f extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,f={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},h=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>h[e.name]||e.name}
.computeLabel=${e=>f[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(f.slice(0,3))}
${d(h.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(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);
${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);
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";import{dS as r,dT as t,dU as s}from"./houseplan-card-DEVy5dLN.js";const e={},a=r(class extends t{constructor(){super(...arguments),this.ot=e}render(r,t){return t()}update(r,[t,e]){if(Array.isArray(t)){if(Array.isArray(this.ot)&&this.ot.length===t.length&&t.every((r,t)=>r===this.ot[t]))return s}else if(this.ot===t)return s;return this.ot=Array.isArray(t)?Array.from(t):t,this.render(t,e)}});export{a as i};
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";import{dS as r,dT as t,dU as e}from"./houseplan-card-CvCwcI3S.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__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";import{b as a,A as e}from"./houseplan-card-DEVy5dLN.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-CB4AHgRN.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__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";import{b as a,A as e}from"./houseplan-card-CvCwcI3S.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-Cu8UM3xX.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 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";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-DEVy5dLN.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 b(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*_(c,l,d=b){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 b=m.cellCm/o;u+=a(v)*b*b/1e4}return u}catch{return null}}function h(e,t,n=b){const i=_(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function p(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{_ as cleanFloorAreaSteps,v as representedHaDeviceIds,b as spaceWallGeometry,S as summaryEntityValue,p as summarySystemValue,h as totalCleanFloorAreaM2};
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";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 l,a0 as c,ax as u,ea as d,eb as f,bq as m,ec as g}from"./houseplan-card-CvCwcI3S.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,l="entity"===r?e.registry.entities?.[s]:null,c="device"===r?s:l?.device_id,u="device"===r?a?.area_id:l?.area_id||c&&e.registry.devices?.[c]?.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;c&&e.registry.devices?.[c]&&e.spaceIds.has(f)&&(!n.devices.has(c)||"entity"===r&&n.liveEntities.has(s))&&t.add(c)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=l(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:c(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*h(l,c,u=_){try{let d=0;for(const f of c){const c=l.spaces.find(e=>String(e?.id)===f.id);if(!c)continue;const m=e(c,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 l=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(l,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__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";import{n as t,b as n}from"./zigbee-topology-DitREaKv.js";import{B as e}from"./houseplan-card-DEVy5dLN.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}),b=new Promise((t,n)=>{f=t,m=n}),w=[];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&&w.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&&w.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(b,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of w)try{t()}catch{}}})}export{f as readZhaTopology,m as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";import{n as t,b as n}from"./zigbee-topology-RVaqPxNn.js";import{B as e}from"./houseplan-card-CvCwcI3S.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function f(t){if(!0!==t?.user?.is_admin)throw a("permission")}function p(n){const e=i(n);return e?c(e,"zha",async()=>{if(f(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function g(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function m(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(f(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,p=null,m=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,m=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const f=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&p?.(n):c&&m?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await g(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await g(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{p as readZhaTopology,m as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";try{await import("./houseplan-assets/houseplan-card-DEVy5dLN.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__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";try{await import("./houseplan-assets/houseplan-card-CvCwcI3S.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
+141
View File
@@ -0,0 +1,141 @@
// Стоимость растеризации дневного цикла — свидетель #532.
//
// Владелец: «в Firefox план тормозит; со статичным цветом фона тормоза
// пропадают». Профиль подтвердил: наш JS спал 89 % времени, а в GPU-процессе
// на кадр уезжало 23 МБ текстур. Виновником оказалась не сцена плана, а
// тройной drop-shadow внешнего контура: группа .hp-paperg несёт одни бумажные
// силуэты и при ховере и панораме не меняется, но фильтр жил в общем слое
// плана — и каждая перерисовка плана заново прогоняла три прохода размытия по
// габариту всего листа. Лечится одной подсказкой will-change: filter, которая
// уводит отфильтрованную бумагу в свой композиционный слой.
//
// Смок проверяет две вещи, и вторая — не время, а ОТНОШЕНИЕ: абсолютные
// миллисекунды зависят от машины и раннера, отношение «дневной цикл к
// статичному фону» — нет. Оба замера идут в одном процессе, на одной странице,
// подряд, поэтому делят между собой и прогрев, и загрузку машины.
//
// Замер аналитики на панораме демо-стенда: 7.9 без подсказки, 0.26 с ней.
// Порог 2.0 стоит примерно посередине по логарифму и даёт запас в обе стороны.
//
// Движок здесь Chromium — он же движок CI и golden. Приговор по Gecko даёт
// профиль Firefox с машины владельца: подсказка это совет движку, и Gecko
// вправе отклонить её по бюджету памяти (layout.css.will-change.budget).
// Смок нужен не вместо того профиля, а чтобы правку нельзя было молча снять.
import { launch, check, finish } from './serve.mjs';
const PAN_STEPS = 60;
const RATIO_CEILING = 2.0;
const { page, browser } = await launch({ width: 1400, height: 900 }, 1);
const cdp = await page.context().newCDPSession(page);
const setBackground = async (mode) => {
await page.evaluate(async (mode) => {
const card = window.__card;
card._serverCfg.settings = { ...(card._serverCfg.settings || {}), bg_mode: mode };
// Пространство со своим bg_mode переопределяет глобальный — снимаем, иначе
// смок мерил бы не то, что переключил.
for (const space of card._serverCfg.spaces) {
space.settings = { ...(space.settings || {}) };
delete space.settings.bg_mode;
}
card.hass = { ...card.hass, states: { ...card.hass.states, 'sun.sun': {
entity_id: 'sun.sun', state: 'above_horizon',
attributes: { azimuth: 180, elevation: 40, rising: false },
} } };
card._cfgRev = (card._cfgRev || 0) + 1;
card.requestUpdate();
await card.updateComplete;
}, mode);
// Переход фильтра длится 1100 мс: замер до его конца мерил бы анимацию.
await page.waitForTimeout(1400);
};
const outlineStyle = () => page.evaluate(() => {
const root = window.__card.shadowRoot || window.__card.renderRoot;
const stage = root.querySelector('.stage');
const group = root.querySelector('.hp-paperg');
if (!group) return null;
const style = getComputedStyle(group);
return {
daycycle: stage.classList.contains('daycycle'),
filter: style.filter,
willChange: style.willChange,
};
});
const stageBox = () => page.evaluate(() => {
const root = window.__card.shadowRoot || window.__card.renderRoot;
const rect = root.querySelector('.stage').getBoundingClientRect();
return { x: rect.x, y: rect.y, w: rect.width, h: rect.height };
});
/** Одна панорама с зажатой кнопкой; возвращает суммарный RasterTask в мс. */
const measurePan = async () => {
const box = await stageBox();
const events = [];
const collect = ({ value }) => events.push(...value);
cdp.on('Tracing.dataCollected', collect);
await cdp.send('Tracing.start', {
traceConfig: { includedCategories: ['disabled-by-default-devtools.timeline'] },
transferMode: 'ReportEvents',
});
const cx = box.x + box.w / 2, cy = box.y + box.h / 2;
await page.mouse.move(cx, cy);
await page.mouse.down();
for (let step = 0; step < PAN_STEPS; step += 1) {
await page.mouse.move(cx + Math.sin(step / 6) * 140, cy + Math.cos(step / 9) * 90);
// Два кадра на шаг: первый ставит кадр в очередь, второй ждёт, пока он
// действительно отрисуется. Иначе замер считает не работу, а очередь.
await page.evaluate(() => new Promise((resolve) => {
requestAnimationFrame(() => requestAnimationFrame(resolve));
}));
}
await page.mouse.up();
await page.waitForTimeout(200);
const complete = new Promise((resolve) => cdp.once('Tracing.tracingComplete', resolve));
await cdp.send('Tracing.end');
await complete;
cdp.off('Tracing.dataCollected', collect);
let micros = 0, tasks = 0;
for (const event of events) {
if (event.name !== 'RasterTask' || event.ph !== 'X' || typeof event.dur !== 'number') continue;
micros += event.dur;
tasks += 1;
}
return { ms: micros / 1000, tasks };
};
const out = {};
// 1. Подсказка стоит там и только там, где стоит фильтр.
await setBackground('daynight');
const dayStyle = await outlineStyle();
out.dayCycleClassOn = dayStyle?.daycycle === true;
out.dayCycleOutlineFiltered = /drop-shadow/.test(dayStyle?.filter || '');
out.dayCycleOutlinePromoted = /filter/.test(dayStyle?.willChange || '');
await setBackground('static');
const staticStyle = await outlineStyle();
out.staticClassOff = staticStyle?.daycycle === false;
out.staticOutlineUnfiltered = (staticStyle?.filter || 'none') === 'none';
// Статичный фон не платит за чужую подсказку ни слоем, ни памятью.
out.staticOutlineNotPromoted = !/filter/.test(staticStyle?.willChange || '');
// 2. Отношение растеризации на настоящей панораме.
const staticPan = await measurePan();
await setBackground('daynight');
const dayPan = await measurePan();
out.rasterTasksObserved = staticPan.tasks > 0 && dayPan.tasks > 0;
const ratio = staticPan.ms > 0 ? dayPan.ms / staticPan.ms : Infinity;
out.rasterRatioWithinBudget = ratio <= RATIO_CEILING;
console.log(JSON.stringify({
staticPanMs: Number(staticPan.ms.toFixed(1)), staticPanTasks: staticPan.tasks,
dayCyclePanMs: Number(dayPan.ms.toFixed(1)), dayCyclePanTasks: dayPan.tasks,
ratio: Number(ratio.toFixed(2)), ceiling: RATIO_CEILING,
}, null, 1));
for (const [name, value] of Object.entries(out)) check(name, value);
await finish(browser, out);
+139 -139
View File
@@ -1,309 +1,309 @@
{
"schema": 1,
"fingerprint": "dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039",
"fingerprint": "f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 287242,
"initialViewGzipBytes": 287246,
"initialPanelFiles": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-card.js",
"houseplan-panel.js"
],
"initialPanelGzipBytes": 289548,
"initialPanelGzipBytes": 289551,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
"initialPanelOnlyGzipBytes": 2306,
"initialPanelOnlyGzipBytes": 2305,
"lazyFiles": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/de-BAfQ3noX.js",
"houseplan-assets/editor-Ca9vnH-K.js",
"houseplan-assets/fr-a4v8Ohtu.js",
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/houseplan-editor-runtime-BVcD08Op.js",
"houseplan-assets/houseplan-onboarding-runtime-0ApfaTVi.js",
"houseplan-assets/hp-zigbee-topology-overlay-B_T0ilCj.js",
"houseplan-assets/iso-scene-render-DtlvcvOT.js",
"houseplan-assets/live-interaction-runtime-CjYDG1SP.js",
"houseplan-assets/pdf-export-CY9TOlZ5.js",
"houseplan-assets/summary-panel-runtime-loaded-CB4AHgRN.js",
"houseplan-assets/zigbee-topology-DitREaKv.js",
"houseplan-assets/zigbee-topology-runtime-Cez46hoy.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/de-BzGLbwvZ.js",
"houseplan-assets/editor-C1xpueyG.js",
"houseplan-assets/fr-C3geGtjl.js",
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/houseplan-editor-runtime-Dj6agWVl.js",
"houseplan-assets/houseplan-onboarding-runtime-J0_74gcV.js",
"houseplan-assets/hp-zigbee-topology-overlay-DwyWKwR8.js",
"houseplan-assets/iso-scene-render-DJJ7WLdq.js",
"houseplan-assets/live-interaction-runtime-jSU7kWgv.js",
"houseplan-assets/pdf-export-DpRho-Fx.js",
"houseplan-assets/summary-panel-runtime-loaded-Cu8UM3xX.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js",
"houseplan-assets/zigbee-topology-runtime-CiKM8bMZ.js"
],
"lazyGzipBytes": 417431,
"lazyGzipBytes": 417414,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/editor-Ca9vnH-K.js",
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/houseplan-editor-runtime-BVcD08Op.js",
"houseplan-assets/zigbee-topology-DitREaKv.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/editor-C1xpueyG.js",
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/houseplan-editor-runtime-Dj6agWVl.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js"
],
"lazyEditorGzipBytes": 204999,
"lazyEditorGzipBytes": 204996,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/houseplan-onboarding-runtime-0ApfaTVi.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/houseplan-onboarding-runtime-J0_74gcV.js"
],
"lazyOnboardingGzipBytes": 13916,
"lazyLocaleFiles": [
"houseplan-assets/de-BAfQ3noX.js",
"houseplan-assets/fr-a4v8Ohtu.js"
"houseplan-assets/de-BzGLbwvZ.js",
"houseplan-assets/fr-C3geGtjl.js"
],
"lazyLocaleGzipBytes": 54820,
"lazyLocaleGzipBytes": 54817,
"lazyIsometricFiles": [
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/iso-scene-render-DtlvcvOT.js"
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/iso-scene-render-DJJ7WLdq.js"
],
"lazyIsometricGzipBytes": 13460,
"lazyIsometricGzipBytes": 13456,
"lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js"
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js"
],
"lazyFurnitureArtGzipBytes": 10254,
"lazyFurnitureArtGzipBytes": 10255,
"lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/pdf-export-CY9TOlZ5.js"
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/pdf-export-DpRho-Fx.js"
],
"lazyPdfGzipBytes": 120128,
"files": [
{
"path": "houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"sha256": "ce22e7599ea095db52bf13da52204107ed2d535fb57f69766e3669dfea1c9ef2",
"path": "houseplan-assets/backdrop-pick-B2vh4ldK.js",
"sha256": "50c3c752cc39625b8e9693a517bf09c50152befe468d634bd9f157a880d13c2b",
"rawBytes": 19956,
"gzipBytes": 6879,
"gzipBytes": 6880,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-BAfQ3noX.js",
"sha256": "38d0ffe6551c85bc7a5686943679357a726928644136850dc646e0cdd5713bab",
"path": "houseplan-assets/de-BzGLbwvZ.js",
"sha256": "d003e6380ff0cf2a41e7e956de4d343b21c45e9f9bde0d57a2e2ebc4db5adb51",
"rawBytes": 91402,
"gzipBytes": 27694,
"gzipBytes": 27692,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-Ca9vnH-K.js",
"sha256": "fd8b9731bc4a417cb0545e06677c836e98fa59a7b28e7cf0345d87c25f4aaed7",
"path": "houseplan-assets/editor-C1xpueyG.js",
"sha256": "074d2bb9067d77491a11ea32a6443dcc22af8fe684af24e18001cb500d8dc7b2",
"rawBytes": 3832,
"gzipBytes": 1583,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-a4v8Ohtu.js",
"sha256": "ccc6ccd7d3736f7567080f000de2dd04ecf60989163720e46d11063cd3ace9ee",
"path": "houseplan-assets/fr-C3geGtjl.js",
"sha256": "52b7f50e7dcc34671a868a19250bb48a657a4956e157221daf961159fb2095d5",
"rawBytes": 93667,
"gzipBytes": 27126,
"gzipBytes": 27125,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"sha256": "d8e59b11da6c8f4a665b33cc6d92e9eb9e2e9ef94fed1071ba5988ce5c98e438",
"path": "houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"sha256": "43d140c50a1359d5e94e2806f505c262a04edfa872d443c83198a2215a4b988f",
"rawBytes": 33655,
"gzipBytes": 10254,
"gzipBytes": 10255,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/guard-BYWHhzjw.js",
"sha256": "b81804f104d25d22dbc909341c48821dbe950aad94054b9512f5322a04fdfc8b",
"path": "houseplan-assets/guard-Cf4E-8ce.js",
"sha256": "d0895bcb2a7b722d7d036235d9fbbed3887b2907b1ea8ec961fecb5ab1ac6ef4",
"rawBytes": 518,
"gzipBytes": 369,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-DEVy5dLN.js",
"sha256": "d8cf65be7367f51ed4c8069825965c002036ec16321e3dc83dce1638ec7d2565",
"rawBytes": 1020996,
"gzipBytes": 286437,
"path": "houseplan-assets/houseplan-card-CvCwcI3S.js",
"sha256": "d0f9cb54803bb7dacf2e0275fb26372e4b4232357c199b9521b4b75ee102ea04",
"rawBytes": 1021015,
"gzipBytes": 286443,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-BAfQ3noX.js",
"houseplan-assets/editor-Ca9vnH-K.js",
"houseplan-assets/fr-a4v8Ohtu.js",
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/houseplan-editor-runtime-BVcD08Op.js",
"houseplan-assets/houseplan-onboarding-runtime-0ApfaTVi.js",
"houseplan-assets/hp-zigbee-topology-overlay-B_T0ilCj.js",
"houseplan-assets/iso-scene-render-DtlvcvOT.js",
"houseplan-assets/live-interaction-runtime-CjYDG1SP.js",
"houseplan-assets/pdf-export-CY9TOlZ5.js",
"houseplan-assets/summary-panel-runtime-loaded-CB4AHgRN.js"
"houseplan-assets/de-BzGLbwvZ.js",
"houseplan-assets/editor-C1xpueyG.js",
"houseplan-assets/fr-C3geGtjl.js",
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/houseplan-editor-runtime-Dj6agWVl.js",
"houseplan-assets/houseplan-onboarding-runtime-J0_74gcV.js",
"houseplan-assets/hp-zigbee-topology-overlay-DwyWKwR8.js",
"houseplan-assets/iso-scene-render-DJJ7WLdq.js",
"houseplan-assets/live-interaction-runtime-jSU7kWgv.js",
"houseplan-assets/pdf-export-DpRho-Fx.js",
"houseplan-assets/summary-panel-runtime-loaded-Cu8UM3xX.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-BVcD08Op.js",
"sha256": "b26691e5ac6338578a23ab3d6c0a774e36c4e708f2bb4a48894ab7e4b0ca7c96",
"path": "houseplan-assets/houseplan-editor-runtime-Dj6agWVl.js",
"sha256": "28b55c311643e4b2ac783f060ac2d8af851a49fc65a264d1954101ea36074865",
"rawBytes": 668813,
"gzipBytes": 178484,
"gzipBytes": 178480,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/zigbee-topology-DitREaKv.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js"
],
"dynamicImports": [
"houseplan-assets/zigbee-topology-runtime-Cez46hoy.js"
"houseplan-assets/zigbee-topology-runtime-CiKM8bMZ.js"
]
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-0ApfaTVi.js",
"sha256": "e1fc28837937564eee4a602230cdaf3fbabe35703a7ecda43ce74def1159d0b7",
"path": "houseplan-assets/houseplan-onboarding-runtime-J0_74gcV.js",
"sha256": "f26d85e6c6b9276ed1b8dddf68f8d6fec58285034a5612e7bc621d0650fe3b39",
"rawBytes": 28287,
"gzipBytes": 7037,
"gzipBytes": 7036,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-yGeZ_1BL.js",
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/backdrop-pick-B2vh4ldK.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/hp-zigbee-topology-overlay-B_T0ilCj.js",
"sha256": "d9f0676bc0034a3baed8c9108f8799aa261cbabbef86929ef812cd90e0e9e302",
"path": "houseplan-assets/hp-zigbee-topology-overlay-DwyWKwR8.js",
"sha256": "38630979c6005defc2870cbd670e93a2bc72e7103c0619a2db8bbc9e5e35add0",
"rawBytes": 10756,
"gzipBytes": 3684,
"gzipBytes": 3682,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/zigbee-topology-DitREaKv.js",
"houseplan-assets/zigbee-topology-runtime-Cez46hoy.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js",
"houseplan-assets/zigbee-topology-runtime-CiKM8bMZ.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/iso-scene-render-DtlvcvOT.js",
"sha256": "ad3e8c6b41caf6edc5e3b259dcffa3bff98c0110ae80cbd3bf736d5eccfb7d0f",
"path": "houseplan-assets/iso-scene-render-DJJ7WLdq.js",
"sha256": "0fe3c080025e143c7c1e36360c048bdfeb7de15ad5614e51ccd93a474ac01a76",
"rawBytes": 38562,
"gzipBytes": 13091,
"gzipBytes": 13087,
"isEntry": false,
"imports": [
"houseplan-assets/guard-BYWHhzjw.js",
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/guard-Cf4E-8ce.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/live-interaction-runtime-CjYDG1SP.js",
"sha256": "886197ec8207c347463a743dd3a7a2f95bb05efbe4545332a41c12891cc3242e",
"path": "houseplan-assets/live-interaction-runtime-jSU7kWgv.js",
"sha256": "f82bbf39d216aa1da371f477a98bf0db290a322b978159534ec77313272a73b2",
"rawBytes": 6032,
"gzipBytes": 2433,
"gzipBytes": 2432,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/pdf-export-CY9TOlZ5.js",
"sha256": "0fa7863db13ffe8d654f35cf25222639be2f6c4ed018941feffde0503da2b425",
"path": "houseplan-assets/pdf-export-DpRho-Fx.js",
"sha256": "b3f320d2a9fc4dae77d252e9ca71a9e8bf76aab8143296f070d0d8501afb60d3",
"rawBytes": 236244,
"gzipBytes": 109874,
"gzipBytes": 109873,
"isEntry": false,
"imports": [
"houseplan-assets/furniture-plan-art.generated-CWJaBLIz.js",
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/furniture-plan-art.generated-Cq22RSiq.js",
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-editor-DeBQ1tcV.js",
"sha256": "b1bbc6089d46f90c81c295e0305374ca2f2c5fca0322f27d4e9ecb9bb76ead28",
"path": "houseplan-assets/summary-panel-editor-Cq0L-N9R.js",
"sha256": "27880dfef9a780a4bbd5003875801eec32943df47d5a41de9ba2ddf33475e798",
"rawBytes": 14824,
"gzipBytes": 3401,
"gzipBytes": 3402,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/summary-panel-runtime-loaded-CB4AHgRN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-assets/summary-panel-runtime-loaded-Cu8UM3xX.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-metrics-B3ruGJoU.js",
"sha256": "d68458815e4a7772cd87bf55f1448ba1794c54b1e6c749825f0672952051a93c",
"path": "houseplan-assets/summary-panel-metrics-Ci8fAKZP.js",
"sha256": "185fd9a451dec36588013e643f7fa30a91b198bed52e7b95bbe742b47da3af4e",
"rawBytes": 2610,
"gzipBytes": 1306,
"gzipBytes": 1304,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-runtime-loaded-CB4AHgRN.js",
"sha256": "d7d78a52ff91ce0dd1d07eb8e670e931814ef71c969f67069485d1313adeafe4",
"path": "houseplan-assets/summary-panel-runtime-loaded-Cu8UM3xX.js",
"sha256": "1a47e72af54209e481ea42ba635d5539d5fa93230054cb32ec2c37f163a37f8f",
"rawBytes": 72272,
"gzipBytes": 19728,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": [
"houseplan-assets/summary-panel-editor-DeBQ1tcV.js",
"houseplan-assets/summary-panel-metrics-B3ruGJoU.js"
"houseplan-assets/summary-panel-editor-Cq0L-N9R.js",
"houseplan-assets/summary-panel-metrics-Ci8fAKZP.js"
]
},
{
"path": "houseplan-assets/zigbee-topology-DitREaKv.js",
"sha256": "d29bb086e6862441a6115d431ed71e4ee0b96201a10bdfedb93d3f11280264ca",
"rawBytes": 18961,
"gzipBytes": 7430,
"path": "houseplan-assets/zigbee-topology-runtime-CiKM8bMZ.js",
"sha256": "df8412087da621cc7e9bccfb3548af001e39ff202d98a407be75f007c3bf0211",
"rawBytes": 3941,
"gzipBytes": 1763,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js",
"houseplan-assets/zigbee-topology-RVaqPxNn.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-runtime-Cez46hoy.js",
"sha256": "5bb047f1c003a211e0a57f2fa03d37e968144ca741d99b2f3e486ee70e4aa130",
"rawBytes": 3941,
"gzipBytes": 1765,
"path": "houseplan-assets/zigbee-topology-RVaqPxNn.js",
"sha256": "fee6dd544594966f44db71dc5529031b2fc8adfe11fe78290b1d0f5bd33e20a0",
"rawBytes": 18961,
"gzipBytes": 7429,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js",
"houseplan-assets/zigbee-topology-DitREaKv.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "2cf259caacb83ef37c3e5e743f88bcd61a6f48131af71fa565528f409b2f1f82",
"sha256": "d1bd483cc0d9e5030c33d713eed4ce01674aaee15d7a09ed230e3470bbe186c1",
"rawBytes": 1205,
"gzipBytes": 805,
"gzipBytes": 803,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-DEVy5dLN.js"
"houseplan-assets/houseplan-card-CvCwcI3S.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
"sha256": "02fa46808fbf68c9245ec2b518ec2047953678b13b054a923259f1a8d9e9cb9a",
"sha256": "2827d1118a9d90c49306e0c01b4f1a7b448c24cf51b1ca0ec829bd95c1b37995",
"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__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";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-DEVy5dLN.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";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-CvCwcI3S.js";class f extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,f={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},h=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>h[e.name]||e.name}
.computeLabel=${e=>f[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(f.slice(0,3))}
${d(h.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(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);
${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);
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";import{dS as r,dT as t,dU as s}from"./houseplan-card-DEVy5dLN.js";const e={},a=r(class extends t{constructor(){super(...arguments),this.ot=e}render(r,t){return t()}update(r,[t,e]){if(Array.isArray(t)){if(Array.isArray(this.ot)&&this.ot.length===t.length&&t.every((r,t)=>r===this.ot[t]))return s}else if(this.ot===t)return s;return this.ot=Array.isArray(t)?Array.from(t):t,this.render(t,e)}});export{a as i};
+1
View File
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";import{dS as r,dT as t,dU as e}from"./houseplan-card-CvCwcI3S.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__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";import{b as a,A as e}from"./houseplan-card-DEVy5dLN.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-CB4AHgRN.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__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";import{b as a,A as e}from"./houseplan-card-CvCwcI3S.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-Cu8UM3xX.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 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";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-DEVy5dLN.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 b(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*_(c,l,d=b){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 b=m.cellCm/o;u+=a(v)*b*b/1e4}return u}catch{return null}}function h(e,t,n=b){const i=_(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function p(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{_ as cleanFloorAreaSteps,v as representedHaDeviceIds,b as spaceWallGeometry,S as summaryEntityValue,p as summarySystemValue,h as totalCleanFloorAreaM2};
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";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 l,a0 as c,ax as u,ea as d,eb as f,bq as m,ec as g}from"./houseplan-card-CvCwcI3S.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,l="entity"===r?e.registry.entities?.[s]:null,c="device"===r?s:l?.device_id,u="device"===r?a?.area_id:l?.area_id||c&&e.registry.devices?.[c]?.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;c&&e.registry.devices?.[c]&&e.spaceIds.has(f)&&(!n.devices.has(c)||"entity"===r&&n.liveEntities.has(s))&&t.add(c)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=l(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:c(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*h(l,c,u=_){try{let d=0;for(const f of c){const c=l.spaces.find(e=>String(e?.id)===f.id);if(!c)continue;const m=e(c,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 l=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(l,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__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";import{n as t,b as n}from"./zigbee-topology-DitREaKv.js";import{B as e}from"./houseplan-card-DEVy5dLN.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}),b=new Promise((t,n)=>{f=t,m=n}),w=[];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&&w.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&&w.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(b,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of w)try{t()}catch{}}})}export{f as readZhaTopology,m as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";import{n as t,b as n}from"./zigbee-topology-RVaqPxNn.js";import{B as e}from"./houseplan-card-CvCwcI3S.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function f(t){if(!0!==t?.user?.is_admin)throw a("permission")}function p(n){const e=i(n);return e?c(e,"zha",async()=>{if(f(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function g(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function m(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(f(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,p=null,m=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,m=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const f=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&p?.(n):c&&m?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await g(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await g(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{p as readZhaTopology,m as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
+1 -1
View File
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dfcbb1b71778cc7ba07be84f07b876575d5c63600838b93cdb2db147b99ec039";try{await import("./houseplan-assets/houseplan-card-DEVy5dLN.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__="f40ffc9357a1340e70f3959e98bf17da6858dff6a2b4f32392befa4ce825f0b3";try{await import("./houseplan-assets/houseplan-card-CvCwcI3S.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
+8
View File
@@ -2,6 +2,14 @@
## Unreleased
- The “Follows the sun” background no longer slows the plan down. The plan's
outer outline is a blur over the whole sheet, and it lived in the same layer
as the plan: any mouse movement made the engine re-run it. The outline now
keeps its own layer. Measured on a demo-stand pan, rasterization fell from
fifteen times a static background to the same order as one. The picture is
unchanged, to the pixel
([#532](https://github.com/Matysh/houseplan-card/issues/532)).
## v1.74.0 — 2026-09-11
- The plan is noticeably smoother, and in Firefox the difference is dramatic.
+8
View File
@@ -8,6 +8,14 @@
## Не выпущено
- Фон «Следует за Солнцем» больше не замедляет план. Внешний контур плана —
это размытие по габариту всего листа, и оно жило в общем слое с планом: любое
движение мыши заставляло движок прогонять его заново. Теперь контур держится
отдельным слоем. Замер на панораме демо-стенда: растеризация упала с
пятнадцатикратной к статичному фону до сопоставимой с ним. Картинка
не изменилась ни на пиксель
([#532](https://github.com/Matysh/houseplan-card/issues/532)).
## v1.74.0 — 2026-09-11
- План стал заметно плавнее, а в Firefox разница разительная. Перетаскивание
+7
View File
@@ -75,6 +75,13 @@ The public setting remains a two-value selector. `static` uses `bg_color`.
05:00→13:00→21:00 fallback arc. It has zero visible opacity at night.
- Four constant environment layers cross-fade for exactly 1100 ms with
`cubic-bezier(.22,.61,.36,1)`. Reduced motion disables the transition.
- The zero-offset outline is a filter over the grouped paper footprint, so it
is kept on its own compositing layer (`will-change: filter`, scoped to the
day-cycle stage). The group holds paper silhouettes only and does not change
while the plan is hovered or panned; without the hint every repaint of the
plan re-ran three blur passes over the whole sheet, which cost a Firefox
window about fifteen times the rasterization of a static background (#532).
A static background carries neither the filter nor the hint.
- Only the environment and the zero-offset alpha-aware outline outside the
grouped plan-paper footprint change. The plan, paper, floors, room fills,
Glow/spill, devices, labels, decor/backdrop, vacuum, hover, and window rays
+12 -12
View File
@@ -3,7 +3,7 @@
"fixture": "synthetic-only",
"chromium": "151.0.7922.34",
"oxipng": "oxipng 10.2.0",
"sourceFingerprint": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceFingerprint": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"captureScriptSha256": "9e4b0ae533407fe003a129078aec020f2c83d67cdb6fc6da696ce3d829beaeb5",
"command": "npm run build && node demo/docs/capture.mjs",
"scenarios": {
@@ -15,7 +15,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "76c35a87810e3dc6890bda7b43da133f57d8860031204a62cda7115c15950090"
},
"view-touch": {
@@ -26,7 +26,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "795585acb09488236ebb8028a7fcbd918404c5fe01560bb9b4559de13d441625"
},
"space-create": {
@@ -37,7 +37,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "9f0970de09772674c3156b9fc5b2d49de0ceb22be11ecf8b136047d37d100a84"
},
"room-contour-close": {
@@ -48,7 +48,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "0c354a79f9c3660788b6c5e889a27b6bd78b1f209dc0eef6bb43e2c1344028c4"
},
"plan-context-tray": {
@@ -59,7 +59,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "64169c543291bc4df806dcf8ff484b42c8ea55eb343323d945344e0e28f2ce97"
},
"device-editor": {
@@ -70,7 +70,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "3c8703175605fcf0387d654cd30783ecfd33e21743e70b45190a5ae1a8d355c2"
},
"device-display-preview": {
@@ -81,7 +81,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "5d6193202102f5e6d85567f1111fa105895b933979fbf369c6ba0b1029deb823"
},
"background-editor": {
@@ -92,7 +92,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "375900a29aa62632883ede6727b7dbb8b48cabe9d7d0e16425f9779c837f3dd9"
},
"room-card": {
@@ -103,7 +103,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "3d85424676c823ddca3fa7dab3cce089b6030e48c05d16d2d48d922c66c0cbd2"
},
"device-info": {
@@ -114,7 +114,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "ac962820f8e1c5cb5b042d39b18dc95905fa840cb2d4749060d991be4f6977c2"
},
"pdf-export": {
@@ -125,7 +125,7 @@
},
"theme": "light",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "4537692fd57a3ed95528eddd748eee5cb6e456ffab7cc49169853d62459252cd"
}
},
+12
View File
@@ -2400,6 +2400,18 @@ const MUTANT_DEFINITIONS = [
replace: "const HANDLE_PAINT_ORDER = ['corners', 'edges'] as const;",
}],
},
{
id: 'daycycle-outline-not-promoted',
guard: 'node demo/smoke_daycycle_raster.mjs',
because: 'the day-cycle outline is a triple drop-shadow over the whole sheet; without its own '
+ 'compositing layer every repaint of the plan re-runs three blur passes, and a demo-stand '
+ 'pan costs fifteen times the rasterization of a static background (#532 AC1/AC2)',
patches: [{
file: 'src/styles/plan.styles.ts',
find: ' will-change: filter;\n',
replace: '',
}],
},
{
id: 'align-guides-exclude-dead-source',
guard: 'node demo/smoke_align_guides.mjs',
+9
View File
@@ -86,12 +86,21 @@ export const planStyles = css`
opacity 1100ms cubic-bezier(.22, .61, .36, 1);
}
.stage.mode-transition .hp-day-cycle-env { transition: none; }
/* #532: the outline keeps its OWN compositing layer. The group holds paper
silhouettes only and does not change on hover or pan, but the filter used
to live in the plan's own layer — so every repaint of the plan re-ran
three blur passes over the whole sheet. Measured on a demo-stand pan
(Chromium, CDP, summed RasterTask): 852 ms without the hint against 28 ms
with it, where a static background costs 108 ms. The hint costs one layer
of memory, so it is scoped to .daycycle and a static background never
pays for it. */
.stage.daycycle .hp-paperg,
.hp-static-stage.daycycle .hp-paperg {
filter:
drop-shadow(0 0 1px var(--hp-day-cycle-outline-near))
drop-shadow(0 0 5px var(--hp-day-cycle-outline-mid))
drop-shadow(0 0 10px var(--hp-day-cycle-outline-far));
will-change: filter;
transition: filter 1100ms cubic-bezier(.22, .61, .36, 1);
}
@media (prefers-reduced-motion: reduce) {