mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-06 14:39:22 +00:00
fix: keep SVG compositor stable during pinch (#579)
Issue: #579 User-Visible: yes
This commit is contained in:
@@ -1,295 +1,295 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"fingerprint": "d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159",
|
||||
"fingerprint": "0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e",
|
||||
"entry": "houseplan-card.js",
|
||||
"panelEntry": "houseplan-panel.js",
|
||||
"initialViewFiles": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-card.js"
|
||||
],
|
||||
"initialViewGzipBytes": 290382,
|
||||
"initialViewGzipBytes": 290379,
|
||||
"initialPanelFiles": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-panel.js"
|
||||
],
|
||||
"initialPanelGzipBytes": 291904,
|
||||
"initialPanelGzipBytes": 291901,
|
||||
"initialPanelOnlyFiles": [
|
||||
"houseplan-panel.js"
|
||||
],
|
||||
"initialPanelOnlyGzipBytes": 2326,
|
||||
"initialPanelOnlyGzipBytes": 2325,
|
||||
"lazyFiles": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/de-BqcBM4iq.js",
|
||||
"houseplan-assets/editor-CIvbEeB2.js",
|
||||
"houseplan-assets/fr-BAoFzzc3.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-CsNNJl3l.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-CYaYpfm2.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-C0-2Ab2v.js",
|
||||
"houseplan-assets/iso-scene-render-3EdX0BoY.js",
|
||||
"houseplan-assets/live-interaction-runtime-DM2yMgdu.js",
|
||||
"houseplan-assets/pdf-export-XX1GPztN.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-DIxHoayT.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BQfoYHCE.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/de-JVEEGD9u.js",
|
||||
"houseplan-assets/editor-C5Zq-3aA.js",
|
||||
"houseplan-assets/fr-B-ete5Dh.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BNMtEwiN.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-D2XH4RQC.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-D3IWAxB8.js",
|
||||
"houseplan-assets/iso-scene-render-ceJKJKhC.js",
|
||||
"houseplan-assets/live-interaction-runtime-CxW-k-p_.js",
|
||||
"houseplan-assets/pdf-export-BAtsOfAV.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-BcKBuVQ7.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-CWcX1vcd.js"
|
||||
],
|
||||
"lazyGzipBytes": 418492,
|
||||
"lazyGzipBytes": 418510,
|
||||
"lazyEditorFiles": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/editor-CIvbEeB2.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-CsNNJl3l.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/editor-C5Zq-3aA.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BNMtEwiN.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js"
|
||||
],
|
||||
"lazyEditorGzipBytes": 204790,
|
||||
"lazyEditorGzipBytes": 204784,
|
||||
"lazyOnboardingFiles": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-CYaYpfm2.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-D2XH4RQC.js"
|
||||
],
|
||||
"lazyOnboardingGzipBytes": 13917,
|
||||
"lazyOnboardingGzipBytes": 13914,
|
||||
"lazyLocaleFiles": [
|
||||
"houseplan-assets/de-BqcBM4iq.js",
|
||||
"houseplan-assets/fr-BAoFzzc3.js"
|
||||
"houseplan-assets/de-JVEEGD9u.js",
|
||||
"houseplan-assets/fr-B-ete5Dh.js"
|
||||
],
|
||||
"lazyLocaleGzipBytes": 54855,
|
||||
"lazyLocaleGzipBytes": 54845,
|
||||
"lazyIsometricFiles": [
|
||||
"houseplan-assets/iso-scene-render-3EdX0BoY.js"
|
||||
"houseplan-assets/iso-scene-render-ceJKJKhC.js"
|
||||
],
|
||||
"lazyIsometricGzipBytes": 13233,
|
||||
"lazyIsometricGzipBytes": 13232,
|
||||
"lazyFurnitureArtFiles": [
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js"
|
||||
],
|
||||
"lazyFurnitureArtGzipBytes": 10251,
|
||||
"lazyFurnitureArtGzipBytes": 10252,
|
||||
"lazyPdfFiles": [
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/pdf-export-XX1GPztN.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/pdf-export-BAtsOfAV.js"
|
||||
],
|
||||
"lazyPdfGzipBytes": 120124,
|
||||
"lazyPdfGzipBytes": 120125,
|
||||
"files": [
|
||||
{
|
||||
"path": "houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"sha256": "7d2704f07f35bdd9d891d04a48694ee69d36c90abadded0ed4b8fb1940561a98",
|
||||
"path": "houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"sha256": "3a8a8a4b522eaae770f7b0cdd5612aaa542fd81e2fef1adcb58d21d9b093b360",
|
||||
"rawBytes": 19956,
|
||||
"gzipBytes": 6881,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/de-BqcBM4iq.js",
|
||||
"sha256": "350110f548daff8f7100bd7940a093f9c261cb7784023f3b7475a1fa20bbf978",
|
||||
"path": "houseplan-assets/de-JVEEGD9u.js",
|
||||
"sha256": "f300635f221656a36e591183395cc38c77c093e2347ce98ac0b0f324f7ec8306",
|
||||
"rawBytes": 91437,
|
||||
"gzipBytes": 27713,
|
||||
"gzipBytes": 27709,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/editor-CIvbEeB2.js",
|
||||
"sha256": "1ace4d116f3bd8e1374025c15529abae63a4e7acca98fdda0f9369d660d0edfd",
|
||||
"path": "houseplan-assets/editor-C5Zq-3aA.js",
|
||||
"sha256": "4878d5efac2222fdd3fda5e695588a8d5cfe463027397b2fc8499bd6e649c6a7",
|
||||
"rawBytes": 3831,
|
||||
"gzipBytes": 1584,
|
||||
"gzipBytes": 1583,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/fr-BAoFzzc3.js",
|
||||
"sha256": "93335f06e2aa7d85db030a64f35537a95aa2fd3be848f7e22c762beadb5b7282",
|
||||
"path": "houseplan-assets/fr-B-ete5Dh.js",
|
||||
"sha256": "c4d9a2f7bf0fca73861727752c5cd9b41e8cda469685e32eb34dedc8ec0f790b",
|
||||
"rawBytes": 93701,
|
||||
"gzipBytes": 27142,
|
||||
"gzipBytes": 27136,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"sha256": "e735209eeb73905e9093727bd26e853393d7a81a1936ab7fe2eb69f21c0d6d1a",
|
||||
"path": "houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"sha256": "69da2271017aa401f35e87387fb06d384617ee78f0d534bbd28792f5c3cb33e8",
|
||||
"rawBytes": 33655,
|
||||
"gzipBytes": 10251,
|
||||
"gzipBytes": 10252,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"sha256": "a737e64453d152573e62efcce1bb39e1fd361ea1a096ffc4d078568e58ddf5d9",
|
||||
"path": "houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"sha256": "83f27e261a8a7a32463b67762c859e431d1468a32af7249627ec326f16696772",
|
||||
"rawBytes": 1031731,
|
||||
"gzipBytes": 289578,
|
||||
"gzipBytes": 289576,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/de-BqcBM4iq.js",
|
||||
"houseplan-assets/editor-CIvbEeB2.js",
|
||||
"houseplan-assets/fr-BAoFzzc3.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-CsNNJl3l.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-CYaYpfm2.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-C0-2Ab2v.js",
|
||||
"houseplan-assets/iso-scene-render-3EdX0BoY.js",
|
||||
"houseplan-assets/live-interaction-runtime-DM2yMgdu.js",
|
||||
"houseplan-assets/pdf-export-XX1GPztN.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-DIxHoayT.js"
|
||||
"houseplan-assets/de-JVEEGD9u.js",
|
||||
"houseplan-assets/editor-C5Zq-3aA.js",
|
||||
"houseplan-assets/fr-B-ete5Dh.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BNMtEwiN.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-D2XH4RQC.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-D3IWAxB8.js",
|
||||
"houseplan-assets/iso-scene-render-ceJKJKhC.js",
|
||||
"houseplan-assets/live-interaction-runtime-CxW-k-p_.js",
|
||||
"houseplan-assets/pdf-export-BAtsOfAV.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-BcKBuVQ7.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-editor-runtime-CsNNJl3l.js",
|
||||
"sha256": "2432c7c92a8215127c55f4de42b9110c5be07211380bdf63554c84b9da1ced1a",
|
||||
"path": "houseplan-assets/houseplan-editor-runtime-BNMtEwiN.js",
|
||||
"sha256": "7a0814ddc88324ad5dcb87f43852bd1f92ed90e4bda658cab3a8cdfee3209c18",
|
||||
"rawBytes": 669271,
|
||||
"gzipBytes": 178648,
|
||||
"gzipBytes": 178643,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/zigbee-topology-runtime-BQfoYHCE.js"
|
||||
"houseplan-assets/zigbee-topology-runtime-CWcX1vcd.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-onboarding-runtime-CYaYpfm2.js",
|
||||
"sha256": "922d711d0ebd990abbdd2017ec2d1500657990912174f09d7ba9b5565fecf59b",
|
||||
"path": "houseplan-assets/houseplan-onboarding-runtime-D2XH4RQC.js",
|
||||
"sha256": "6484dea33a514dff985b752d3f3ff87086a87ab2e46e79d29773d382d9fe4695",
|
||||
"rawBytes": 28287,
|
||||
"gzipBytes": 7036,
|
||||
"gzipBytes": 7033,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/hp-zigbee-topology-overlay-C0-2Ab2v.js",
|
||||
"sha256": "d84ea36eb73f528bbca3546f1d34c5260aa3dcc1f43bd4e619cf912af40f723f",
|
||||
"path": "houseplan-assets/hp-zigbee-topology-overlay-D3IWAxB8.js",
|
||||
"sha256": "1dd14e9ee7bb06dd0ca154b471e16f410abc14c0beb5e310266f71514e770f9b",
|
||||
"rawBytes": 10756,
|
||||
"gzipBytes": 3685,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BQfoYHCE.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-CWcX1vcd.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/iso-scene-render-3EdX0BoY.js",
|
||||
"sha256": "bc931160eb3ac245b9e00d28c5a0d3490da3fdca040fe420f91c53f93df6afa4",
|
||||
"path": "houseplan-assets/iso-scene-render-ceJKJKhC.js",
|
||||
"sha256": "e7032d13f4479fa28d8b378c900a339577e74f5c377da9b080697e20e02f5903",
|
||||
"rawBytes": 39206,
|
||||
"gzipBytes": 13233,
|
||||
"gzipBytes": 13232,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/live-interaction-runtime-DM2yMgdu.js",
|
||||
"sha256": "7c60d43699ec1783a3c03c839c2c9b4ebb15a0ddbdfe89f8d8e66677993e5d88",
|
||||
"rawBytes": 8018,
|
||||
"gzipBytes": 3168,
|
||||
"path": "houseplan-assets/live-interaction-runtime-CxW-k-p_.js",
|
||||
"sha256": "3b0f3ae94e957cb662f63abeb5b7fb95012da6654a0ad5a857cf7b1b6a4cb6ac",
|
||||
"rawBytes": 8216,
|
||||
"gzipBytes": 3209,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/pdf-export-XX1GPztN.js",
|
||||
"sha256": "afcd88c645e00a09334b81b315aa2c3f55c1990ac0fdd3dfc368fbe9cd91423f",
|
||||
"path": "houseplan-assets/pdf-export-BAtsOfAV.js",
|
||||
"sha256": "2e57254cc4a637a6ed689ee1de9af9f4dc60595489683b238ead4026f7e4d60b",
|
||||
"rawBytes": 236244,
|
||||
"gzipBytes": 109873,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-editor-CBwv4kam.js",
|
||||
"sha256": "02d4e89f2ef3b21cb2b1610ca0fbefd76aa9148dab5ca668fb363589b4d33593",
|
||||
"path": "houseplan-assets/summary-panel-editor-BAGJ8QwD.js",
|
||||
"sha256": "72d3ad8f8d61228dc255eed21ff157ad9c96ee8a35bd7b7b999f4090adb1925c",
|
||||
"rawBytes": 14824,
|
||||
"gzipBytes": 3399,
|
||||
"gzipBytes": 3401,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-DIxHoayT.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-BcKBuVQ7.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-metrics-B6CJZI9N.js",
|
||||
"sha256": "80f5f4a5fd64c5fd9d8aabf77a5725eb0d3c4faf70fd71584d15f633b5d345ab",
|
||||
"path": "houseplan-assets/summary-panel-metrics-CXnAEe7_.js",
|
||||
"sha256": "c73f5de8717a8a7d5e7e0d0861fb9d007876b50c4c62f97b3c7f1739cd5bb38f",
|
||||
"rawBytes": 2610,
|
||||
"gzipBytes": 1306,
|
||||
"gzipBytes": 1304,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-runtime-loaded-DIxHoayT.js",
|
||||
"sha256": "a499bb8c131749f907ab40e35278fb42614f4ceb69bd1c2851caf783bb676134",
|
||||
"path": "houseplan-assets/summary-panel-runtime-loaded-BcKBuVQ7.js",
|
||||
"sha256": "8609218f07a5ec5399a2ba61707a2854dfaa65e80b11dc628ddb3ece70d77f72",
|
||||
"rawBytes": 73366,
|
||||
"gzipBytes": 20088,
|
||||
"gzipBytes": 20089,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/summary-panel-editor-CBwv4kam.js",
|
||||
"houseplan-assets/summary-panel-metrics-B6CJZI9N.js"
|
||||
"houseplan-assets/summary-panel-editor-BAGJ8QwD.js",
|
||||
"houseplan-assets/summary-panel-metrics-CXnAEe7_.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/zigbee-topology-Db-fJcSP.js",
|
||||
"sha256": "28dc59974540c1ea830110312a20f6f68be2a5efefcca35f3064360192b9d0c9",
|
||||
"path": "houseplan-assets/zigbee-topology-DlU7AXvw.js",
|
||||
"sha256": "f7f21945cb650b57fa6469a7205aa687415b208f9649e2e8bae9dd27aa6cf4e6",
|
||||
"rawBytes": 18961,
|
||||
"gzipBytes": 7426,
|
||||
"gzipBytes": 7425,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/zigbee-topology-runtime-BQfoYHCE.js",
|
||||
"sha256": "a0b74aca8004c02a00ed4876d3caaa49b94b1390f010549577aeb65ed817a828",
|
||||
"path": "houseplan-assets/zigbee-topology-runtime-CWcX1vcd.js",
|
||||
"sha256": "7ae2a9b1aac6ea4ee128341cce087684b546efd2788b97fa6941138ddb702f9f",
|
||||
"rawBytes": 3941,
|
||||
"gzipBytes": 1764,
|
||||
"gzipBytes": 1760,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-card.js",
|
||||
"sha256": "fb6202fca8c9d6ffca89a1d6dc62ba82effc13e1badd9616cdd8a09f637652dd",
|
||||
"sha256": "642174a115a5be423b55f552e351f4445e58f744c22c4eb1378fc376ef16d65b",
|
||||
"rawBytes": 1205,
|
||||
"gzipBytes": 804,
|
||||
"gzipBytes": 803,
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-panel.js",
|
||||
"sha256": "a0fd94ef2c6c5cf67be0bbf81a2af9aef8df7b49e826677451eace4b5e84ebd4",
|
||||
"sha256": "8383bd59c693f7f9cc4b2aee4886b6a9fb90a715d91630e6473ce3aeae09216b",
|
||||
"rawBytes": 6165,
|
||||
"gzipBytes": 2326,
|
||||
"gzipBytes": 2325,
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
}
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{q as e,l as o,v as t,e3 as s,A as a,e4 as i,e5 as l,e6 as n,E as r,c}from"./houseplan-card-BO0fsT6F.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__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{q as e,l as o,v as t,e3 as s,A as a,e4 as i,e5 as l,e6 as n,E as r,c}from"./houseplan-card-BCGpvbDT.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this._formData}
|
||||
.schema=${e}
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+5
-5
File diff suppressed because one or more lines are too long
+3
-3
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{l as t,b3 as s,A as e,v as a,c as o,cm as l,cn as i,co as h,cp as c,b0 as n,cq as r,cv as p,cr as d,cs as _,ct as u,cu as g,cw as m,cx as b,ds as $,dt as v,du as f,a$ as y,b1 as w,dv as D}from"./houseplan-card-BO0fsT6F.js";import{c as k,e as S,r as C,a as M}from"./backdrop-pick-CCnzTYhd.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?o`<hp-help data-help-key=${l}
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{l as t,b3 as s,A as e,v as a,c as o,cm as l,cn as i,co as h,cp as c,b0 as n,cq as r,cv as p,cr as d,cs as _,ct as u,cu as g,cw as m,cx as b,ds as $,dt as v,du as f,a$ as y,b1 as w,dv as D}from"./houseplan-card-BCGpvbDT.js";import{c as k,e as S,r as C,a as M}from"./backdrop-pick-Caayxvt2.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?o`<hp-help data-help-key=${l}
|
||||
.text=${a(h,l)} .ariaLabel=${a(h,i)}></hp-help>`:e}_openSpaceDialog(t,s){if(!this.host._serverStorage||!this.host._serverCfg)return void this.host._showToast(this.host._t("toast.integration_missing"));if("edit"===t){const e=this.host._serverCfg.spaces.find(t=>t.id===s);if(!e)return;const a=l(e),o=e.settings?.custom_fill&&"object"==typeof e.settings.custom_fill?i(e.settings.custom_fill):null,p="none"===a.fill?{...o||h,a:0}:o;return void(this.host._spaceDialog={mode:t,spaceId:s,title:e.title,planUrl:e.plan_url||null,planFile:null,source:e.plan_url?"file":"draw",showBorders:a.showBorders,showNames:a.showNames,zeroWallStyle:r(e),displayTouched:!0,hideDecor:a.hideDecor,hideOpenings:a.hideOpenings,roomColor:a.color,roomOpacity:a.opacity,fillMode:"none"===a.fill?"custom":a.fill,customFill:p,glowEnabled:a.glow,bgColor:a.bgColor,bgMode:"static"===e.settings?.bg_mode||"daynight"===e.settings?.bg_mode?e.settings.bg_mode:null,northDeg:n({},e.settings),sunRays:"boolean"==typeof e.settings?.sun_rays?e.settings.sun_rays:null,tempMin:a.tempMin,tempMax:a.tempMax,showLqi:a.showLqi??this.host._config?.show_signal??!0,cardFontScale:a.cardFontScale,labelTemp:a.labelTemp,labelHum:a.labelHum,labelLqi:a.labelLqi,labelLight:a.labelLight,cellCm:Number(e.cell_cm)>0?Number(e.cell_cm):5,cellCmInput:c(Number(e.cell_cm)>0?Number(e.cell_cm):5,this.host._imperial),cellCmTouched:!1,busy:!1})}const e=p(this.host._imperial);this.host._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,...m(),hideDecor:!1,hideOpenings:!1,zeroWallStyle:"dashed",roomColor:g,roomOpacity:u,fillMode:"custom",customFill:{...h,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:_,tempMax:d,showLqi:this.host._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:e,cellCmInput:c(e,this.host._imperial),cellCmTouched:!1,busy:!1}}async _pickPlanFile(t){const s=t.target,e=s.files?.[0];if(!e||!this.host._spaceDialog)return;s.value="";const a=await k(e);if("reject"===a.kind)return void this.host._showToast(this.host._t("toast.plan_formats"));if("guard"===a.kind)return void(this.host._backdropGuard=a.state);const o=await S(e,a.ext,e.name);this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:o})}_renderBackdropGuard(){return C(this.host,t=>{this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:t})},()=>{this.host._backdropGuard=null},this.host.hass)??e}_useServerPlan(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this.host._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let s=0;s<40;s++){const s=this.host._display(t);if(s){const e=await new Promise(t=>{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:0),e.onerror=()=>t(0),e.src=s}),a=this.host._spaceDialog;return a&&a.planUrl===t&&Number.isFinite(e)&&e>0?(this.host._spaceDialog={...a,savedAspect:e},e):0}if(await new Promise(t=>setTimeout(t,150)),this.host._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){const s=this.host._spaceDialog,e=s?.saved?.find(s=>s.name===t);if(!s||!e||e.used_by.length||e.url===s.planUrl)return;const a=await this.host._confirmDanger({key:"delete-plan",kind:"destructive",title:this.host._t("confirm.delete_plan_title"),message:this.host._t("confirm.delete_plan_body"),objectName:t,confirmLabel:this.host._t("btn.delete"),cancelLabel:this.host._t("btn.cancel")}),o=this.host._spaceDialog,l=o?.saved?.find(s=>s.name===t);if(a&&o&&l&&l.url===e.url&&l.modified===e.modified&&!l.used_by.length&&l.url!==o.planUrl)try{await this.host.hass.callWS({type:"houseplan/plans/delete",name:t});const s=this.host._spaceDialog;s?.saved&&(this.host._spaceDialog={...s,saved:s.saved.filter(s=>s.name!==t)})}catch(t){this.host._showToast(this.host._t("toast.plan_delete_failed",{err:this.host._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return o`<div class="savedplans muted">${this.host._t("space.loading")}</div>`;const s=t.saved||[];if(!s.length)return o`<div class="savedplans muted">${this.host._t("space.no_saved")}</div>`;return o`<div class="savedplans">
|
||||
${s.map(s=>{return o`
|
||||
<div class="savedplan ${s.url===t.planUrl?"cur":""}">
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{c as a,A as e}from"./houseplan-card-BO0fsT6F.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-DIxHoayT.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__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{c as a,A as e}from"./houseplan-card-BCGpvbDT.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-BcKBuVQ7.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
|
||||
<span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong>
|
||||
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
|
||||
<input id="summary-local-show" data-summary-local-show type="checkbox"
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{e9 as e,P as t,a5 as n,M as i,aq as r,N as o,br as s,bq as a,a4 as c,a3 as l,aA as u,ea as d,eb as f,bt as m,ec as g}from"./houseplan-card-BO0fsT6F.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 r=String(i.binding||"").indexOf(":");if(r<1)continue;const o=i.binding.slice(0,r),s=i.binding.slice(r+1),a="device"===o?e.registry.devices?.[s]:null,c="entity"===o?e.registry.entities?.[s]:null,l="device"===o?s:c?.device_id,u="device"===o?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===o&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,r,o);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,r,o)}}function*h(c,l,u=_){try{let d=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=u(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,r,o,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/r;d+=a(v)*_*_/1e4}return d}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let r=i.next();for(;!r.done;)r=i.next();return r.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};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{e9 as e,P as t,a5 as n,M as i,aq as r,N as o,br as a,bq as s,a4 as c,a3 as l,aA as u,ea as d,eb as f,bt as m,ec as g}from"./houseplan-card-BCGpvbDT.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 r=String(i.binding||"").indexOf(":");if(r<1)continue;const o=i.binding.slice(0,r),a=i.binding.slice(r+1),s="device"===o?e.registry.devices?.[a]:null,c="entity"===o?e.registry.entities?.[a]:null,l="device"===o?a:c?.device_id,u="device"===o?s?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===o&&n.liveEntities.has(a))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,r,o);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,r,o)}}function*h(c,l,u=_){try{let d=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=u(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const s=t(e);if(!s)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,r,o,g.roomGeom,g.multiWallNodes)||s;v=y(v,a(c,m.physicalBodies)),yield}const _=m.cellCm/r;d+=s(v)*_*_/1e4}return d}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let r=i.next();for(;!r.done;)r=i.next();return r.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};
|
||||
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{n as t,b as n}from"./zigbee-topology-Db-fJcSP.js";import{F as e}from"./houseplan-card-BO0fsT6F.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 m(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 g(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,g=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{f=t,g=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const p=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&f?.(n):c&&g?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof p&&b.push(p),await m(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 m(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{f as readZhaTopology,g as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{n as t,b as n}from"./zigbee-topology-DlU7AXvw.js";import{F as e}from"./houseplan-card-BCGpvbDT.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 m(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 g(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,g=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,g=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&&g?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await m(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 m(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,g as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
|
||||
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";try{await import("./houseplan-assets/houseplan-card-BO0fsT6F.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__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";try{await import("./houseplan-assets/houseplan-card-BCGpvbDT.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
@@ -4,13 +4,15 @@
|
||||
import { mkdirSync, writeFileSync } from 'node:fs';
|
||||
import { launch, check, finish } from './serve.mjs';
|
||||
|
||||
const { page, browser } = await launch({ width: 820, height: 760 });
|
||||
const { page, browser } = await launch(
|
||||
{ width: 820, height: 760 }, 1, [], { hasTouch: true },
|
||||
);
|
||||
const session = await page.context().newCDPSession(page);
|
||||
const frames = [];
|
||||
let stopped = false;
|
||||
|
||||
session.on('Page.screencastFrame', (event) => {
|
||||
if (frames.length < 120) frames.push(event.data);
|
||||
if (frames.length < 180) frames.push(event.data);
|
||||
void session.send('Page.screencastFrameAck', { sessionId: event.sessionId });
|
||||
});
|
||||
|
||||
@@ -36,6 +38,46 @@ try {
|
||||
format: 'png', everyNthFrame: 1, maxWidth: 820, maxHeight: 760,
|
||||
});
|
||||
await wait(120);
|
||||
|
||||
// #579: exercise a real multi-frame pinch while CDP records compositor-
|
||||
// presented frames. DOM screenshots cannot witness the transient white or
|
||||
// transparent WebView frame reported by users.
|
||||
const pinchFrameStart = frames.length;
|
||||
await page.evaluate(async () => {
|
||||
const card = window.__card;
|
||||
const stage = (card.shadowRoot || card.renderRoot).querySelector('.stage');
|
||||
const rect = stage.getBoundingClientRect();
|
||||
const centerX = rect.x + rect.width / 2;
|
||||
const centerY = rect.y + rect.height / 2;
|
||||
stage.setPointerCapture = () => {};
|
||||
stage.releasePointerCapture = () => {};
|
||||
const send = (type, pointerId, x, buttons = 1) => stage.dispatchEvent(new PointerEvent(type, {
|
||||
bubbles: true,
|
||||
composed: true,
|
||||
pointerId,
|
||||
pointerType: 'touch',
|
||||
isPrimary: pointerId === 731,
|
||||
button: type === 'pointerdown' ? 0 : -1,
|
||||
buttons,
|
||||
clientX: x,
|
||||
clientY: centerY,
|
||||
}));
|
||||
send('pointerdown', 731, centerX - 72);
|
||||
send('pointerdown', 732, centerX + 72);
|
||||
const distances = [80, 91, 70, 98, 66, 104, 73, 96, 68, 101, 75, 94];
|
||||
for (const distance of distances) {
|
||||
send('pointermove', 731, centerX - distance);
|
||||
send('pointermove', 732, centerX + distance);
|
||||
await new Promise(requestAnimationFrame);
|
||||
}
|
||||
send('pointerup', 731, centerX - distances.at(-1), 0);
|
||||
send('pointerup', 732, centerX + distances.at(-1), 0);
|
||||
await card.updateComplete;
|
||||
await new Promise(requestAnimationFrame);
|
||||
});
|
||||
await wait(180);
|
||||
const pinchPresentedFrames = frames.length - pinchFrameStart;
|
||||
|
||||
await page.evaluate(() => window.__card._pageVisibility({
|
||||
kind: 'visible', token: 73, at: Date.now(), hiddenFor: 20_000, long: true,
|
||||
}));
|
||||
@@ -110,11 +152,12 @@ try {
|
||||
Buffer.from(data, 'base64'),
|
||||
));
|
||||
writeFileSync('artifacts/continuity-screencast/metrics.json', JSON.stringify({
|
||||
stage, frames: metrics, forbidden: forbidden.length,
|
||||
stage, frames: metrics, forbidden: forbidden.length, pinchPresentedFrames,
|
||||
}, null, 2));
|
||||
|
||||
const result = {
|
||||
capturedPresentedFrames: frames.length >= 2,
|
||||
capturedPinchPresentedFrames: pinchPresentedFrames >= 4,
|
||||
baselineContainsPlanDetail: baseline.variance >= 12 && baseline.mean >= 4,
|
||||
noEmptyOrBlackPresentedFrame: forbidden.length === 0,
|
||||
};
|
||||
|
||||
@@ -53,7 +53,11 @@ const liveState = () => page.evaluate(() => {
|
||||
sceneCount: scenes.length,
|
||||
allSceneOverflowOpen: scenes.length > 0
|
||||
&& scenes.every((node) => node.style.overflow === 'visible'),
|
||||
allTemporaryStylesCleared: scenes.every((node) => !node.style.overflow && !node.style.transform),
|
||||
allScenePromoted: scenes.length > 0 && scenes.every((node) => node.style.transform
|
||||
&& node.style.transformOrigin && node.style.willChange === 'transform'
|
||||
&& node.style.overflow === 'visible'),
|
||||
allTemporaryStylesCleared: scenes.every((node) => !node.style.overflow
|
||||
&& !node.style.transform && !node.style.transformOrigin && !node.style.willChange),
|
||||
marker: centre(root.querySelector('[data-hp="device"]')),
|
||||
room: centre(root.querySelector('[data-hp="room"]')),
|
||||
};
|
||||
@@ -193,6 +197,8 @@ const runPan = async ({ name, kind, dx, dy, edge, parity = false }) => {
|
||||
sceneCount: immediateState.sceneCount,
|
||||
overflowImmediate: immediateState.allSceneOverflowOpen,
|
||||
overflowHeld: heldState.allSceneOverflowOpen,
|
||||
promotedImmediate: immediateState.allScenePromoted,
|
||||
promotedHeld: heldState.allScenePromoted,
|
||||
targetStableWhileHeld: JSON.stringify(immediateState.view) === JSON.stringify(heldState.view),
|
||||
temporaryStylesCleared: settledState.allTemporaryStylesCleared,
|
||||
parityPx,
|
||||
@@ -201,9 +207,8 @@ const runPan = async ({ name, kind, dx, dy, edge, parity = false }) => {
|
||||
&& immediateCoverage.referenceScenePixels > 500 && immediateCoverage.missing === 0;
|
||||
checks[`${name}HeldCoverage`] = heldCoverage.sameSize
|
||||
&& heldCoverage.referenceScenePixels > 500 && heldCoverage.missing === 0;
|
||||
checks[`${name}UsesTemporaryOverflow`] = (immediateState.transformed === 0
|
||||
|| immediateState.allSceneOverflowOpen)
|
||||
&& (heldState.transformed === 0 || heldState.allSceneOverflowOpen)
|
||||
checks[`${name}UsesTemporaryOverflow`] = immediateState.allScenePromoted
|
||||
&& heldState.allScenePromoted
|
||||
&& settledState.allTemporaryStylesCleared;
|
||||
checks[`${name}TargetStableWhileHeld`] = diagnostics[name].targetStableWhileHeld;
|
||||
if (parity) checks[`${name}MarkerParity`] = parityPx !== null && parityPx <= 1;
|
||||
@@ -245,6 +250,8 @@ const runTouchZoomOut = async ({ name }) => {
|
||||
heldTransformed: heldState.transformed,
|
||||
overflowImmediate: immediateState.allSceneOverflowOpen,
|
||||
overflowHeld: heldState.allSceneOverflowOpen,
|
||||
promotedImmediate: immediateState.allScenePromoted,
|
||||
promotedHeld: heldState.allScenePromoted,
|
||||
targetStableWhileHeld: JSON.stringify(immediateState.view) === JSON.stringify(heldState.view),
|
||||
temporaryStylesCleared: settledState.allTemporaryStylesCleared,
|
||||
};
|
||||
@@ -253,13 +260,90 @@ const runTouchZoomOut = async ({ name }) => {
|
||||
&& immediateCoverage.referenceScenePixels > 5000 && immediateCoverage.missing === 0;
|
||||
checks[`${name}HeldCoverage`] = heldCoverage.sameSize
|
||||
&& heldCoverage.referenceScenePixels > 5000 && heldCoverage.missing === 0;
|
||||
checks[`${name}UsesTemporaryOverflow`] = (immediateState.transformed === 0
|
||||
|| immediateState.allSceneOverflowOpen)
|
||||
&& (heldState.transformed === 0 || heldState.allSceneOverflowOpen)
|
||||
checks[`${name}UsesTemporaryOverflow`] = immediateState.allScenePromoted
|
||||
&& heldState.allScenePromoted
|
||||
&& settledState.allTemporaryStylesCleared;
|
||||
checks[`${name}TargetStableWhileHeld`] = diagnostics[name].targetStableWhileHeld;
|
||||
};
|
||||
|
||||
// #579: observe the actual style attribute through several budget refreshes.
|
||||
// Starting the observer after the first promoted frame excludes the legitimate
|
||||
// initial style construction; from that point until pointerup every oldValue
|
||||
// must already describe the same promoted compositor lifecycle.
|
||||
const runStablePromotion = async () => {
|
||||
await resetCamera();
|
||||
await preparePointerCapture();
|
||||
const origin = await pointerCentre();
|
||||
await dispatchTouch('pointerdown', 721, origin.x - 80, origin.y);
|
||||
await dispatchTouch('pointerdown', 722, origin.x + 80, origin.y);
|
||||
await dispatchTouch('pointermove', 721, origin.x - 90, origin.y);
|
||||
await dispatchTouch('pointermove', 722, origin.x + 90, origin.y);
|
||||
await frame();
|
||||
const initial = await liveState();
|
||||
await page.evaluate(() => {
|
||||
const card = document.querySelector('houseplan-card');
|
||||
const scenes = [...card.renderRoot.querySelectorAll('[data-hp-live-viewbox]')];
|
||||
const records = [];
|
||||
const observer = new MutationObserver((batch) => records.push(...batch));
|
||||
for (const scene of scenes) observer.observe(scene, {
|
||||
attributes: true, attributeFilter: ['style', 'viewBox'], attributeOldValue: true,
|
||||
});
|
||||
window.__hp579Promotion = { observer, records };
|
||||
});
|
||||
|
||||
// Force the exact second ownership boundary from the bug: Home Assistant or
|
||||
// another reactive input may deliver a complete Lit frame while both touch
|
||||
// contacts are still held. Waiting for incidental fixture activity made the
|
||||
// mutation witness timing-dependent on slower Linux runners.
|
||||
await page.evaluate(async () => {
|
||||
const card = document.querySelector('houseplan-card');
|
||||
card.requestUpdate();
|
||||
await card.updateComplete;
|
||||
});
|
||||
await frame();
|
||||
|
||||
for (const distance of [112, 72, 118]) {
|
||||
await page.waitForTimeout(110);
|
||||
await dispatchTouch('pointermove', 721, origin.x - distance, origin.y);
|
||||
await dispatchTouch('pointermove', 722, origin.x + distance, origin.y);
|
||||
await frame();
|
||||
}
|
||||
const active = await page.evaluate(async () => {
|
||||
await Promise.resolve();
|
||||
const card = document.querySelector('houseplan-card');
|
||||
const scenes = [...card.renderRoot.querySelectorAll('[data-hp-live-viewbox]')];
|
||||
const state = window.__hp579Promotion;
|
||||
const records = [...state.records, ...state.observer.takeRecords()];
|
||||
state.observer.disconnect();
|
||||
delete window.__hp579Promotion;
|
||||
const styleRecords = records.filter((record) => record.attributeName === 'style');
|
||||
const promoted = (text) => typeof text === 'string'
|
||||
&& text.includes('overflow: visible') && text.includes('transform-origin:')
|
||||
&& text.includes('will-change: transform') && text.includes('transform:');
|
||||
return {
|
||||
sceneCount: scenes.length,
|
||||
styleMutations: styleRecords.length,
|
||||
viewBoxMutations: records.filter((record) => record.attributeName === 'viewBox').length,
|
||||
demotedOldValues: styleRecords.filter((record) => !promoted(record.oldValue)).length,
|
||||
allPromoted: scenes.every((scene) => promoted(scene.getAttribute('style'))),
|
||||
};
|
||||
});
|
||||
await dispatchTouch('pointerup', 721, origin.x - 118, origin.y, 0);
|
||||
await dispatchTouch('pointerup', 722, origin.x + 118, origin.y, 0);
|
||||
await settle();
|
||||
const terminal = await liveState();
|
||||
diagnostics.stablePromotion = { initial, active, terminal };
|
||||
checks.stablePromotionStartsOnce = initial.allScenePromoted;
|
||||
checks.stablePromotionSurvivesRefresh = active.sceneCount > 0 && active.allPromoted
|
||||
&& active.demotedOldValues === 0;
|
||||
// The forced Lit commit contributes one deliberate anchor write per scene;
|
||||
// subtract it before judging the ordinary 100 ms / 15% refresh budget.
|
||||
const budgetedViewBoxMutations = active.viewBoxMutations - active.sceneCount;
|
||||
checks.stablePromotionKeepsViewBoxBudget = budgetedViewBoxMutations >= active.sceneCount * 3
|
||||
&& budgetedViewBoxMutations <= active.sceneCount * 5;
|
||||
checks.stablePromotionCleansAtTerminal = terminal.allTemporaryStylesCleared;
|
||||
};
|
||||
|
||||
await page.evaluate(async () => {
|
||||
const card = window.__card;
|
||||
const config = structuredClone(card._serverCfg);
|
||||
@@ -286,6 +370,7 @@ await runPan({ name: 'flatMouseBottomEdge', kind: 'mouse', dx: 0, dy: -48, edge:
|
||||
await runPan({ name: 'flatMouseTopEdge', kind: 'mouse', dx: 0, dy: 48, edge: 'top' });
|
||||
await runPan({ name: 'flatTouchRightEdge', kind: 'touch', dx: -65, dy: 0, edge: 'right' });
|
||||
await runTouchZoomOut({ name: 'flatTouchZoomOut' });
|
||||
await runStablePromotion();
|
||||
|
||||
await page.evaluate(async () => {
|
||||
history.replaceState(null, '', '?hp_alpha=1#space=f1');
|
||||
|
||||
Vendored
+131
-131
@@ -1,295 +1,295 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"fingerprint": "d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159",
|
||||
"fingerprint": "0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e",
|
||||
"entry": "houseplan-card.js",
|
||||
"panelEntry": "houseplan-panel.js",
|
||||
"initialViewFiles": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-card.js"
|
||||
],
|
||||
"initialViewGzipBytes": 290382,
|
||||
"initialViewGzipBytes": 290379,
|
||||
"initialPanelFiles": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-panel.js"
|
||||
],
|
||||
"initialPanelGzipBytes": 291904,
|
||||
"initialPanelGzipBytes": 291901,
|
||||
"initialPanelOnlyFiles": [
|
||||
"houseplan-panel.js"
|
||||
],
|
||||
"initialPanelOnlyGzipBytes": 2326,
|
||||
"initialPanelOnlyGzipBytes": 2325,
|
||||
"lazyFiles": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/de-BqcBM4iq.js",
|
||||
"houseplan-assets/editor-CIvbEeB2.js",
|
||||
"houseplan-assets/fr-BAoFzzc3.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-CsNNJl3l.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-CYaYpfm2.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-C0-2Ab2v.js",
|
||||
"houseplan-assets/iso-scene-render-3EdX0BoY.js",
|
||||
"houseplan-assets/live-interaction-runtime-DM2yMgdu.js",
|
||||
"houseplan-assets/pdf-export-XX1GPztN.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-DIxHoayT.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BQfoYHCE.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/de-JVEEGD9u.js",
|
||||
"houseplan-assets/editor-C5Zq-3aA.js",
|
||||
"houseplan-assets/fr-B-ete5Dh.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BNMtEwiN.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-D2XH4RQC.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-D3IWAxB8.js",
|
||||
"houseplan-assets/iso-scene-render-ceJKJKhC.js",
|
||||
"houseplan-assets/live-interaction-runtime-CxW-k-p_.js",
|
||||
"houseplan-assets/pdf-export-BAtsOfAV.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-BcKBuVQ7.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-CWcX1vcd.js"
|
||||
],
|
||||
"lazyGzipBytes": 418492,
|
||||
"lazyGzipBytes": 418510,
|
||||
"lazyEditorFiles": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/editor-CIvbEeB2.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-CsNNJl3l.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/editor-C5Zq-3aA.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BNMtEwiN.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js"
|
||||
],
|
||||
"lazyEditorGzipBytes": 204790,
|
||||
"lazyEditorGzipBytes": 204784,
|
||||
"lazyOnboardingFiles": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-CYaYpfm2.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-D2XH4RQC.js"
|
||||
],
|
||||
"lazyOnboardingGzipBytes": 13917,
|
||||
"lazyOnboardingGzipBytes": 13914,
|
||||
"lazyLocaleFiles": [
|
||||
"houseplan-assets/de-BqcBM4iq.js",
|
||||
"houseplan-assets/fr-BAoFzzc3.js"
|
||||
"houseplan-assets/de-JVEEGD9u.js",
|
||||
"houseplan-assets/fr-B-ete5Dh.js"
|
||||
],
|
||||
"lazyLocaleGzipBytes": 54855,
|
||||
"lazyLocaleGzipBytes": 54845,
|
||||
"lazyIsometricFiles": [
|
||||
"houseplan-assets/iso-scene-render-3EdX0BoY.js"
|
||||
"houseplan-assets/iso-scene-render-ceJKJKhC.js"
|
||||
],
|
||||
"lazyIsometricGzipBytes": 13233,
|
||||
"lazyIsometricGzipBytes": 13232,
|
||||
"lazyFurnitureArtFiles": [
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js"
|
||||
],
|
||||
"lazyFurnitureArtGzipBytes": 10251,
|
||||
"lazyFurnitureArtGzipBytes": 10252,
|
||||
"lazyPdfFiles": [
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/pdf-export-XX1GPztN.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/pdf-export-BAtsOfAV.js"
|
||||
],
|
||||
"lazyPdfGzipBytes": 120124,
|
||||
"lazyPdfGzipBytes": 120125,
|
||||
"files": [
|
||||
{
|
||||
"path": "houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"sha256": "7d2704f07f35bdd9d891d04a48694ee69d36c90abadded0ed4b8fb1940561a98",
|
||||
"path": "houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"sha256": "3a8a8a4b522eaae770f7b0cdd5612aaa542fd81e2fef1adcb58d21d9b093b360",
|
||||
"rawBytes": 19956,
|
||||
"gzipBytes": 6881,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/de-BqcBM4iq.js",
|
||||
"sha256": "350110f548daff8f7100bd7940a093f9c261cb7784023f3b7475a1fa20bbf978",
|
||||
"path": "houseplan-assets/de-JVEEGD9u.js",
|
||||
"sha256": "f300635f221656a36e591183395cc38c77c093e2347ce98ac0b0f324f7ec8306",
|
||||
"rawBytes": 91437,
|
||||
"gzipBytes": 27713,
|
||||
"gzipBytes": 27709,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/editor-CIvbEeB2.js",
|
||||
"sha256": "1ace4d116f3bd8e1374025c15529abae63a4e7acca98fdda0f9369d660d0edfd",
|
||||
"path": "houseplan-assets/editor-C5Zq-3aA.js",
|
||||
"sha256": "4878d5efac2222fdd3fda5e695588a8d5cfe463027397b2fc8499bd6e649c6a7",
|
||||
"rawBytes": 3831,
|
||||
"gzipBytes": 1584,
|
||||
"gzipBytes": 1583,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/fr-BAoFzzc3.js",
|
||||
"sha256": "93335f06e2aa7d85db030a64f35537a95aa2fd3be848f7e22c762beadb5b7282",
|
||||
"path": "houseplan-assets/fr-B-ete5Dh.js",
|
||||
"sha256": "c4d9a2f7bf0fca73861727752c5cd9b41e8cda469685e32eb34dedc8ec0f790b",
|
||||
"rawBytes": 93701,
|
||||
"gzipBytes": 27142,
|
||||
"gzipBytes": 27136,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"sha256": "e735209eeb73905e9093727bd26e853393d7a81a1936ab7fe2eb69f21c0d6d1a",
|
||||
"path": "houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"sha256": "69da2271017aa401f35e87387fb06d384617ee78f0d534bbd28792f5c3cb33e8",
|
||||
"rawBytes": 33655,
|
||||
"gzipBytes": 10251,
|
||||
"gzipBytes": 10252,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"sha256": "a737e64453d152573e62efcce1bb39e1fd361ea1a096ffc4d078568e58ddf5d9",
|
||||
"path": "houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"sha256": "83f27e261a8a7a32463b67762c859e431d1468a32af7249627ec326f16696772",
|
||||
"rawBytes": 1031731,
|
||||
"gzipBytes": 289578,
|
||||
"gzipBytes": 289576,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/de-BqcBM4iq.js",
|
||||
"houseplan-assets/editor-CIvbEeB2.js",
|
||||
"houseplan-assets/fr-BAoFzzc3.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-CsNNJl3l.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-CYaYpfm2.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-C0-2Ab2v.js",
|
||||
"houseplan-assets/iso-scene-render-3EdX0BoY.js",
|
||||
"houseplan-assets/live-interaction-runtime-DM2yMgdu.js",
|
||||
"houseplan-assets/pdf-export-XX1GPztN.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-DIxHoayT.js"
|
||||
"houseplan-assets/de-JVEEGD9u.js",
|
||||
"houseplan-assets/editor-C5Zq-3aA.js",
|
||||
"houseplan-assets/fr-B-ete5Dh.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BNMtEwiN.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-D2XH4RQC.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-D3IWAxB8.js",
|
||||
"houseplan-assets/iso-scene-render-ceJKJKhC.js",
|
||||
"houseplan-assets/live-interaction-runtime-CxW-k-p_.js",
|
||||
"houseplan-assets/pdf-export-BAtsOfAV.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-BcKBuVQ7.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-editor-runtime-CsNNJl3l.js",
|
||||
"sha256": "2432c7c92a8215127c55f4de42b9110c5be07211380bdf63554c84b9da1ced1a",
|
||||
"path": "houseplan-assets/houseplan-editor-runtime-BNMtEwiN.js",
|
||||
"sha256": "7a0814ddc88324ad5dcb87f43852bd1f92ed90e4bda658cab3a8cdfee3209c18",
|
||||
"rawBytes": 669271,
|
||||
"gzipBytes": 178648,
|
||||
"gzipBytes": 178643,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/zigbee-topology-runtime-BQfoYHCE.js"
|
||||
"houseplan-assets/zigbee-topology-runtime-CWcX1vcd.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-onboarding-runtime-CYaYpfm2.js",
|
||||
"sha256": "922d711d0ebd990abbdd2017ec2d1500657990912174f09d7ba9b5565fecf59b",
|
||||
"path": "houseplan-assets/houseplan-onboarding-runtime-D2XH4RQC.js",
|
||||
"sha256": "6484dea33a514dff985b752d3f3ff87086a87ab2e46e79d29773d382d9fe4695",
|
||||
"rawBytes": 28287,
|
||||
"gzipBytes": 7036,
|
||||
"gzipBytes": 7033,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/backdrop-pick-CCnzTYhd.js",
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/backdrop-pick-Caayxvt2.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/hp-zigbee-topology-overlay-C0-2Ab2v.js",
|
||||
"sha256": "d84ea36eb73f528bbca3546f1d34c5260aa3dcc1f43bd4e619cf912af40f723f",
|
||||
"path": "houseplan-assets/hp-zigbee-topology-overlay-D3IWAxB8.js",
|
||||
"sha256": "1dd14e9ee7bb06dd0ca154b471e16f410abc14c0beb5e310266f71514e770f9b",
|
||||
"rawBytes": 10756,
|
||||
"gzipBytes": 3685,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BQfoYHCE.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-CWcX1vcd.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/iso-scene-render-3EdX0BoY.js",
|
||||
"sha256": "bc931160eb3ac245b9e00d28c5a0d3490da3fdca040fe420f91c53f93df6afa4",
|
||||
"path": "houseplan-assets/iso-scene-render-ceJKJKhC.js",
|
||||
"sha256": "e7032d13f4479fa28d8b378c900a339577e74f5c377da9b080697e20e02f5903",
|
||||
"rawBytes": 39206,
|
||||
"gzipBytes": 13233,
|
||||
"gzipBytes": 13232,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/live-interaction-runtime-DM2yMgdu.js",
|
||||
"sha256": "7c60d43699ec1783a3c03c839c2c9b4ebb15a0ddbdfe89f8d8e66677993e5d88",
|
||||
"rawBytes": 8018,
|
||||
"gzipBytes": 3168,
|
||||
"path": "houseplan-assets/live-interaction-runtime-CxW-k-p_.js",
|
||||
"sha256": "3b0f3ae94e957cb662f63abeb5b7fb95012da6654a0ad5a857cf7b1b6a4cb6ac",
|
||||
"rawBytes": 8216,
|
||||
"gzipBytes": 3209,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/pdf-export-XX1GPztN.js",
|
||||
"sha256": "afcd88c645e00a09334b81b315aa2c3f55c1990ac0fdd3dfc368fbe9cd91423f",
|
||||
"path": "houseplan-assets/pdf-export-BAtsOfAV.js",
|
||||
"sha256": "2e57254cc4a637a6ed689ee1de9af9f4dc60595489683b238ead4026f7e4d60b",
|
||||
"rawBytes": 236244,
|
||||
"gzipBytes": 109873,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/furniture-plan-art.generated-BFj3YzSL.js",
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-MsQg9zvn.js",
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-editor-CBwv4kam.js",
|
||||
"sha256": "02d4e89f2ef3b21cb2b1610ca0fbefd76aa9148dab5ca668fb363589b4d33593",
|
||||
"path": "houseplan-assets/summary-panel-editor-BAGJ8QwD.js",
|
||||
"sha256": "72d3ad8f8d61228dc255eed21ff157ad9c96ee8a35bd7b7b999f4090adb1925c",
|
||||
"rawBytes": 14824,
|
||||
"gzipBytes": 3399,
|
||||
"gzipBytes": 3401,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-DIxHoayT.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-BcKBuVQ7.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-metrics-B6CJZI9N.js",
|
||||
"sha256": "80f5f4a5fd64c5fd9d8aabf77a5725eb0d3c4faf70fd71584d15f633b5d345ab",
|
||||
"path": "houseplan-assets/summary-panel-metrics-CXnAEe7_.js",
|
||||
"sha256": "c73f5de8717a8a7d5e7e0d0861fb9d007876b50c4c62f97b3c7f1739cd5bb38f",
|
||||
"rawBytes": 2610,
|
||||
"gzipBytes": 1306,
|
||||
"gzipBytes": 1304,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-runtime-loaded-DIxHoayT.js",
|
||||
"sha256": "a499bb8c131749f907ab40e35278fb42614f4ceb69bd1c2851caf783bb676134",
|
||||
"path": "houseplan-assets/summary-panel-runtime-loaded-BcKBuVQ7.js",
|
||||
"sha256": "8609218f07a5ec5399a2ba61707a2854dfaa65e80b11dc628ddb3ece70d77f72",
|
||||
"rawBytes": 73366,
|
||||
"gzipBytes": 20088,
|
||||
"gzipBytes": 20089,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/summary-panel-editor-CBwv4kam.js",
|
||||
"houseplan-assets/summary-panel-metrics-B6CJZI9N.js"
|
||||
"houseplan-assets/summary-panel-editor-BAGJ8QwD.js",
|
||||
"houseplan-assets/summary-panel-metrics-CXnAEe7_.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/zigbee-topology-Db-fJcSP.js",
|
||||
"sha256": "28dc59974540c1ea830110312a20f6f68be2a5efefcca35f3064360192b9d0c9",
|
||||
"path": "houseplan-assets/zigbee-topology-DlU7AXvw.js",
|
||||
"sha256": "f7f21945cb650b57fa6469a7205aa687415b208f9649e2e8bae9dd27aa6cf4e6",
|
||||
"rawBytes": 18961,
|
||||
"gzipBytes": 7426,
|
||||
"gzipBytes": 7425,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/zigbee-topology-runtime-BQfoYHCE.js",
|
||||
"sha256": "a0b74aca8004c02a00ed4876d3caaa49b94b1390f010549577aeb65ed817a828",
|
||||
"path": "houseplan-assets/zigbee-topology-runtime-CWcX1vcd.js",
|
||||
"sha256": "7ae2a9b1aac6ea4ee128341cce087684b546efd2788b97fa6941138ddb702f9f",
|
||||
"rawBytes": 3941,
|
||||
"gzipBytes": 1764,
|
||||
"gzipBytes": 1760,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js",
|
||||
"houseplan-assets/zigbee-topology-Db-fJcSP.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js",
|
||||
"houseplan-assets/zigbee-topology-DlU7AXvw.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-card.js",
|
||||
"sha256": "fb6202fca8c9d6ffca89a1d6dc62ba82effc13e1badd9616cdd8a09f637652dd",
|
||||
"sha256": "642174a115a5be423b55f552e351f4445e58f744c22c4eb1378fc376ef16d65b",
|
||||
"rawBytes": 1205,
|
||||
"gzipBytes": 804,
|
||||
"gzipBytes": 803,
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-panel.js",
|
||||
"sha256": "a0fd94ef2c6c5cf67be0bbf81a2af9aef8df7b49e826677451eace4b5e84ebd4",
|
||||
"sha256": "8383bd59c693f7f9cc4b2aee4886b6a9fb90a715d91630e6473ce3aeae09216b",
|
||||
"rawBytes": 6165,
|
||||
"gzipBytes": 2326,
|
||||
"gzipBytes": 2325,
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-BO0fsT6F.js"
|
||||
"houseplan-assets/houseplan-card-BCGpvbDT.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
}
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{q as e,l as o,v as t,e3 as s,A as a,e4 as i,e5 as l,e6 as n,E as r,c}from"./houseplan-card-BO0fsT6F.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__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{q as e,l as o,v as t,e3 as s,A as a,e4 as i,e5 as l,e6 as n,E as r,c}from"./houseplan-card-BCGpvbDT.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this._formData}
|
||||
.schema=${e}
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
+3
-3
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{l as t,b3 as s,A as e,v as a,c as o,cm as l,cn as i,co as h,cp as c,b0 as n,cq as r,cv as p,cr as d,cs as _,ct as u,cu as g,cw as m,cx as b,ds as $,dt as v,du as f,a$ as y,b1 as w,dv as D}from"./houseplan-card-BO0fsT6F.js";import{c as k,e as S,r as C,a as M}from"./backdrop-pick-CCnzTYhd.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?o`<hp-help data-help-key=${l}
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{l as t,b3 as s,A as e,v as a,c as o,cm as l,cn as i,co as h,cp as c,b0 as n,cq as r,cv as p,cr as d,cs as _,ct as u,cu as g,cw as m,cx as b,ds as $,dt as v,du as f,a$ as y,b1 as w,dv as D}from"./houseplan-card-BCGpvbDT.js";import{c as k,e as S,r as C,a as M}from"./backdrop-pick-Caayxvt2.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?o`<hp-help data-help-key=${l}
|
||||
.text=${a(h,l)} .ariaLabel=${a(h,i)}></hp-help>`:e}_openSpaceDialog(t,s){if(!this.host._serverStorage||!this.host._serverCfg)return void this.host._showToast(this.host._t("toast.integration_missing"));if("edit"===t){const e=this.host._serverCfg.spaces.find(t=>t.id===s);if(!e)return;const a=l(e),o=e.settings?.custom_fill&&"object"==typeof e.settings.custom_fill?i(e.settings.custom_fill):null,p="none"===a.fill?{...o||h,a:0}:o;return void(this.host._spaceDialog={mode:t,spaceId:s,title:e.title,planUrl:e.plan_url||null,planFile:null,source:e.plan_url?"file":"draw",showBorders:a.showBorders,showNames:a.showNames,zeroWallStyle:r(e),displayTouched:!0,hideDecor:a.hideDecor,hideOpenings:a.hideOpenings,roomColor:a.color,roomOpacity:a.opacity,fillMode:"none"===a.fill?"custom":a.fill,customFill:p,glowEnabled:a.glow,bgColor:a.bgColor,bgMode:"static"===e.settings?.bg_mode||"daynight"===e.settings?.bg_mode?e.settings.bg_mode:null,northDeg:n({},e.settings),sunRays:"boolean"==typeof e.settings?.sun_rays?e.settings.sun_rays:null,tempMin:a.tempMin,tempMax:a.tempMax,showLqi:a.showLqi??this.host._config?.show_signal??!0,cardFontScale:a.cardFontScale,labelTemp:a.labelTemp,labelHum:a.labelHum,labelLqi:a.labelLqi,labelLight:a.labelLight,cellCm:Number(e.cell_cm)>0?Number(e.cell_cm):5,cellCmInput:c(Number(e.cell_cm)>0?Number(e.cell_cm):5,this.host._imperial),cellCmTouched:!1,busy:!1})}const e=p(this.host._imperial);this.host._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,...m(),hideDecor:!1,hideOpenings:!1,zeroWallStyle:"dashed",roomColor:g,roomOpacity:u,fillMode:"custom",customFill:{...h,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:_,tempMax:d,showLqi:this.host._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:e,cellCmInput:c(e,this.host._imperial),cellCmTouched:!1,busy:!1}}async _pickPlanFile(t){const s=t.target,e=s.files?.[0];if(!e||!this.host._spaceDialog)return;s.value="";const a=await k(e);if("reject"===a.kind)return void this.host._showToast(this.host._t("toast.plan_formats"));if("guard"===a.kind)return void(this.host._backdropGuard=a.state);const o=await S(e,a.ext,e.name);this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:o})}_renderBackdropGuard(){return C(this.host,t=>{this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:t})},()=>{this.host._backdropGuard=null},this.host.hass)??e}_useServerPlan(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this.host._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let s=0;s<40;s++){const s=this.host._display(t);if(s){const e=await new Promise(t=>{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:0),e.onerror=()=>t(0),e.src=s}),a=this.host._spaceDialog;return a&&a.planUrl===t&&Number.isFinite(e)&&e>0?(this.host._spaceDialog={...a,savedAspect:e},e):0}if(await new Promise(t=>setTimeout(t,150)),this.host._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){const s=this.host._spaceDialog,e=s?.saved?.find(s=>s.name===t);if(!s||!e||e.used_by.length||e.url===s.planUrl)return;const a=await this.host._confirmDanger({key:"delete-plan",kind:"destructive",title:this.host._t("confirm.delete_plan_title"),message:this.host._t("confirm.delete_plan_body"),objectName:t,confirmLabel:this.host._t("btn.delete"),cancelLabel:this.host._t("btn.cancel")}),o=this.host._spaceDialog,l=o?.saved?.find(s=>s.name===t);if(a&&o&&l&&l.url===e.url&&l.modified===e.modified&&!l.used_by.length&&l.url!==o.planUrl)try{await this.host.hass.callWS({type:"houseplan/plans/delete",name:t});const s=this.host._spaceDialog;s?.saved&&(this.host._spaceDialog={...s,saved:s.saved.filter(s=>s.name!==t)})}catch(t){this.host._showToast(this.host._t("toast.plan_delete_failed",{err:this.host._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return o`<div class="savedplans muted">${this.host._t("space.loading")}</div>`;const s=t.saved||[];if(!s.length)return o`<div class="savedplans muted">${this.host._t("space.no_saved")}</div>`;return o`<div class="savedplans">
|
||||
${s.map(s=>{return o`
|
||||
<div class="savedplan ${s.url===t.planUrl?"cur":""}">
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
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
Vendored
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{c as a,A as e}from"./houseplan-card-BO0fsT6F.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-DIxHoayT.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__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{c as a,A as e}from"./houseplan-card-BCGpvbDT.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-BcKBuVQ7.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
|
||||
<span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong>
|
||||
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
|
||||
<input id="summary-local-show" data-summary-local-show type="checkbox"
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{e9 as e,P as t,a5 as n,M as i,aq as r,N as o,br as s,bq as a,a4 as c,a3 as l,aA as u,ea as d,eb as f,bt as m,ec as g}from"./houseplan-card-BO0fsT6F.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 r=String(i.binding||"").indexOf(":");if(r<1)continue;const o=i.binding.slice(0,r),s=i.binding.slice(r+1),a="device"===o?e.registry.devices?.[s]:null,c="entity"===o?e.registry.entities?.[s]:null,l="device"===o?s:c?.device_id,u="device"===o?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===o&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,r,o);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,r,o)}}function*h(c,l,u=_){try{let d=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=u(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,r,o,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/r;d+=a(v)*_*_/1e4}return d}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let r=i.next();for(;!r.done;)r=i.next();return r.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};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{e9 as e,P as t,a5 as n,M as i,aq as r,N as o,br as a,bq as s,a4 as c,a3 as l,aA as u,ea as d,eb as f,bt as m,ec as g}from"./houseplan-card-BCGpvbDT.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 r=String(i.binding||"").indexOf(":");if(r<1)continue;const o=i.binding.slice(0,r),a=i.binding.slice(r+1),s="device"===o?e.registry.devices?.[a]:null,c="entity"===o?e.registry.entities?.[a]:null,l="device"===o?a:c?.device_id,u="device"===o?s?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===o&&n.liveEntities.has(a))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,r,o);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,r,o)}}function*h(c,l,u=_){try{let d=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=u(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const s=t(e);if(!s)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,r,o,g.roomGeom,g.multiWallNodes)||s;v=y(v,a(c,m.physicalBodies)),yield}const _=m.cellCm/r;d+=s(v)*_*_/1e4}return d}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let r=i.next();for(;!r.done;)r=i.next();return r.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};
|
||||
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";import{n as t,b as n}from"./zigbee-topology-Db-fJcSP.js";import{F as e}from"./houseplan-card-BO0fsT6F.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 m(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 g(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,g=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{f=t,g=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const p=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&f?.(n):c&&g?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof p&&b.push(p),await m(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 m(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{f as readZhaTopology,g as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";import{n as t,b as n}from"./zigbee-topology-DlU7AXvw.js";import{F as e}from"./houseplan-card-BCGpvbDT.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 m(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 g(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,g=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,g=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&&g?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await m(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 m(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,g as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d925c89e114a68b64d6cc9b16a75880eab222143238f7a75106f1e99ccfe7159";try{await import("./houseplan-assets/houseplan-card-BO0fsT6F.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__="0aa07f15a35e57da89774909bc60ec4f962331aec1df3963cc08462a0c3abf5e";try{await import("./houseplan-assets/houseplan-card-BCGpvbDT.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)}
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+17
-10
@@ -1963,7 +1963,7 @@ core; known-LQI and solid parent routes remain single strokes. Cache data, IEEE
|
||||
addresses and raw payloads are never persisted, logged, exported or admitted
|
||||
to support diagnostics.
|
||||
|
||||
## Live viewport: a transform per frame, a `viewBox` on a budget (#531, 2026-09-11)
|
||||
## Live viewport: a transform per frame, a `viewBox` on a budget (#531, #579, 2026-09-14)
|
||||
|
||||
Rewriting the `viewBox` attribute is not a move, it is a repaint: the whole SVG
|
||||
scene is re-rasterized. Doing it once per gesture frame is what made panning
|
||||
@@ -1993,16 +1993,23 @@ clip for the card, but a camera or floor scene whose anchor is being transformed
|
||||
temporarily gets inline `overflow: visible`. That lets the already rasterized SVG
|
||||
cover the incoming edge until the budgeted `viewBox` catches up; otherwise the
|
||||
root SVG clips at its stale viewport and exposes a band of stage background.
|
||||
HTML layers never receive this exception. A budget refresh or the terminal
|
||||
commit removes the inline overflow together with the transform, so a settled
|
||||
scene returns to its ordinary authored styles. The coverage contract also holds
|
||||
when a pointer is held still between frames: the fast frame must contain every
|
||||
scene pixel that a forced target `viewBox` would contain inside `.stage`.
|
||||
HTML layers never receive this exception. From the first live paint through the
|
||||
terminal commit, every scene SVG stays in one compositor lifecycle: even an
|
||||
identity projection remains explicit and retains `transform-origin`,
|
||||
`will-change: transform` and `overflow: visible`. A budget refresh or a full Lit
|
||||
frame during an active gesture may replace the anchor `viewBox`, but may not
|
||||
demote and re-promote the scene; HA Companion WebView can present a white or
|
||||
transparent frame at that ownership boundary (#579). Only the terminal commit
|
||||
removes the inline styles, so a settled scene returns to its ordinary authored
|
||||
state. The coverage contract also holds when a pointer is held still between
|
||||
frames: the fast frame must contain every scene pixel that a forced target
|
||||
`viewBox` would contain inside `.stage`.
|
||||
|
||||
Neither the attribute nor the style is written when the string is unchanged: an
|
||||
idle frame must leave the DOM byte-identical, or the settled raster shifts by a
|
||||
few colour levels and golden frames flap. `commitHouseplanViewport` still ends
|
||||
the gesture the same way — transforms removed, final `viewBox` forced in.
|
||||
Neither the attribute nor an equal style property is written when its value is
|
||||
unchanged: an idle frame must leave the DOM byte-identical, or the settled raster
|
||||
shifts by a few colour levels and golden frames flap. `commitHouseplanViewport`
|
||||
still ends the gesture the same way — transforms removed, final `viewBox`
|
||||
forced in.
|
||||
|
||||
## The initial bundle carries English and Russian whole (#400, 2026-08-31)
|
||||
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
|
||||
## Unreleased
|
||||
|
||||
- Pinch-zooming in the Home Assistant Companion app no longer repeatedly moves
|
||||
the plan between compositor paths while the fingers are still down. Walls,
|
||||
floors, fills, hatching and lighting now remain continuously painted across
|
||||
budgeted redraws and Home Assistant updates; ordinary browser, isometric and
|
||||
kiosk behaviour is unchanged
|
||||
([#579](https://github.com/Matysh/houseplan-card/issues/579)).
|
||||
|
||||
- Pinch-zooming with the second finger on a device marker no longer re-arms the
|
||||
marker's long-press timer or opens both the House Plan device card and Home
|
||||
Assistant more-info. Delayed touch context-menu events are now kept inside
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
|
||||
## Не выпущено
|
||||
|
||||
- При масштабировании щипком в приложении Home Assistant план больше не
|
||||
переключается между режимами композитинга, пока пальцы остаются на экране.
|
||||
Стены, пол, заливки, штриховка и свет теперь остаются непрерывно видимыми при
|
||||
плановых перерисовках и обновлениях Home Assistant; поведение обычного
|
||||
браузера, изометрии и kiosk не изменилось
|
||||
([#579](https://github.com/Matysh/houseplan-card/issues/579)).
|
||||
|
||||
- Масштабирование щипком, при котором второй палец попал на значок устройства,
|
||||
больше не запускает заново таймер долгого нажатия и не открывает одновременно
|
||||
карточку House Plan и стандартное окно Home Assistant. Запоздалое touch-
|
||||
|
||||
+13
-2
@@ -2511,12 +2511,23 @@ websocket-resilience and golden verification.
|
||||
|
||||
`npm run continuity:screencast` is the separate compositor-level gate required
|
||||
before a stable release. It captures acknowledged PNG frames through CDP
|
||||
`Page.startScreencast`, crops the real plan stage, rejects uniform/black frame
|
||||
regressions and writes the exact frames plus metrics to
|
||||
`Page.startScreencast`, drives an oscillating multi-frame touch pinch, crops the
|
||||
real plan stage, requires multiple compositor-presented pinch frames and rejects
|
||||
uniform, black, white or transparent-looking frame regressions. It writes the
|
||||
exact frames plus metrics to
|
||||
`artifacts/continuity-screencast`. Prereleases keep the faster mandatory rAF
|
||||
smoke; the stable release workflow installs Chromium and runs the screencast
|
||||
before attaching the public card asset.
|
||||
|
||||
The #579 live-viewport witness is split deliberately. `test/live-viewport.test.mjs`
|
||||
proves that a budget refresh keeps the identity transform, transform origin,
|
||||
`will-change` and overflow without a demotion; `demo/smoke_live_pan_coverage.mjs`
|
||||
also holds the pointer through a full Lit commit in flat, isometric and kiosk
|
||||
modes, then proves terminal cleanup. Before a beta, repeat a physical pinch in
|
||||
HA Companion on the reported Android WebView: Chromium CDP proves the contract
|
||||
and records presented frames, but cannot claim that a vendor WebView compositor
|
||||
has no separate defect.
|
||||
|
||||
## Large-house performance gate
|
||||
|
||||
`npm run benchmark:large-house` runs a deterministic fictional three-floor
|
||||
|
||||
@@ -45,6 +45,13 @@ On phones, tablets, wall panels and HA Companion apps, the ordinary View must:
|
||||
remount;
|
||||
- preserve kiosk gestures and prevent accidental editor interactions.
|
||||
|
||||
During every intermediate pan or pinch frame, walls, floors, room fills,
|
||||
hatching, lighting and markers must remain continuously painted. The scene SVGs
|
||||
stay on one promoted compositor path from the first movement until the terminal
|
||||
frame; a budgeted redraw or an unrelated Home Assistant state update must never
|
||||
flash white, become transparent or momentarily expose the stage background.
|
||||
This contract applies equally to browsers and HA Companion WebViews.
|
||||
|
||||
Once a second touch joins an input sequence, that whole sequence is navigation
|
||||
only, whichever contact began on a device marker. Marker tap, long press,
|
||||
confirmation, service calls and touch-generated context menu stay blocked
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"fixture": "synthetic-only",
|
||||
"chromium": "151.0.7922.34",
|
||||
"oxipng": "oxipng 10.2.0",
|
||||
"sourceFingerprint": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceFingerprint": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"captureScriptSha256": "9e4b0ae533407fe003a129078aec020f2c83d67cdb6fc6da696ce3d829beaeb5",
|
||||
"command": "npm run build && node demo/docs/capture.mjs",
|
||||
"scenarios": {
|
||||
@@ -15,7 +15,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "76c35a87810e3dc6890bda7b43da133f57d8860031204a62cda7115c15950090"
|
||||
},
|
||||
"view-touch": {
|
||||
@@ -26,7 +26,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "795585acb09488236ebb8028a7fcbd918404c5fe01560bb9b4559de13d441625"
|
||||
},
|
||||
"space-create": {
|
||||
@@ -37,7 +37,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "9f0970de09772674c3156b9fc5b2d49de0ceb22be11ecf8b136047d37d100a84"
|
||||
},
|
||||
"room-contour-close": {
|
||||
@@ -48,7 +48,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "0c354a79f9c3660788b6c5e889a27b6bd78b1f209dc0eef6bb43e2c1344028c4"
|
||||
},
|
||||
"plan-context-tray": {
|
||||
@@ -59,7 +59,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "64169c543291bc4df806dcf8ff484b42c8ea55eb343323d945344e0e28f2ce97"
|
||||
},
|
||||
"device-editor": {
|
||||
@@ -70,7 +70,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "3c8703175605fcf0387d654cd30783ecfd33e21743e70b45190a5ae1a8d355c2"
|
||||
},
|
||||
"device-display-preview": {
|
||||
@@ -81,7 +81,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "5d6193202102f5e6d85567f1111fa105895b933979fbf369c6ba0b1029deb823"
|
||||
},
|
||||
"background-editor": {
|
||||
@@ -92,7 +92,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "375900a29aa62632883ede6727b7dbb8b48cabe9d7d0e16425f9779c837f3dd9"
|
||||
},
|
||||
"room-card": {
|
||||
@@ -103,7 +103,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "3d85424676c823ddca3fa7dab3cce089b6030e48c05d16d2d48d922c66c0cbd2"
|
||||
},
|
||||
"device-info": {
|
||||
@@ -114,7 +114,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "ac962820f8e1c5cb5b042d39b18dc95905fa840cb2d4749060d991be4f6977c2"
|
||||
},
|
||||
"pdf-export": {
|
||||
@@ -125,7 +125,7 @@
|
||||
},
|
||||
"theme": "light",
|
||||
"language": "en",
|
||||
"sourceSha256": "b36dd996c17e4c7be2d2fdfe438da3c4c98ee5ffcd483b21e64dafc20a956705",
|
||||
"sourceSha256": "58a0c82061aeaa744df96d8f089d2048469e69743920a6d9d67d4c0b84029d87",
|
||||
"imageSha256": "4537692fd57a3ed95528eddd748eee5cb6e456ffab7cc49169853d62459252cd"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -8024,6 +8024,30 @@ const MUTANT_DEFINITIONS = [
|
||||
replace: '',
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'live-pinch-compositor-demoted-on-budget-refresh',
|
||||
guard: 'node --test --test-name-pattern="#579" test/live-viewport.test.mjs',
|
||||
because: '#579: a budgeted viewBox refresh must re-anchor the picture without removing '
|
||||
+ 'the scene transform, will-change or overflow. Demoting and promoting the SVG during '
|
||||
+ 'an active pinch produces white or transparent frames in HA Companion WebView',
|
||||
patches: [{
|
||||
file: 'src/live-viewport.ts',
|
||||
find: ' const keepSceneLayer = options.keepSceneLayer === true;',
|
||||
replace: ' const keepSceneLayer = false; // mutant: demote at every identity refresh',
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'live-pinch-compositor-demoted-on-active-lit-commit',
|
||||
guard: 'node demo/smoke_live_pan_coverage.mjs',
|
||||
because: '#579: a full Lit update can land before the fingers are released. It may '
|
||||
+ 're-anchor viewBox, but it must preserve the same promoted scene lifecycle until the '
|
||||
+ 'terminal commit or the WebView flashes between compositor ownership paths',
|
||||
patches: [{
|
||||
file: 'src/live-interaction-runtime.ts',
|
||||
find: ' commitHouseplanViewport(this.host, this.active());',
|
||||
replace: ' commitHouseplanViewport(this.host);',
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'live-pan-rewrites-viewbox-every-frame',
|
||||
guard: 'node demo/smoke_live_pan_viewbox.mjs',
|
||||
|
||||
@@ -27,6 +27,15 @@
|
||||
|
||||
/** @type {SmokeLink[]} */
|
||||
export const SMOKE_LINKS = [
|
||||
{
|
||||
symbols: [
|
||||
'commitHouseplanViewport', 'isIdentityLiveLayerProjection', 'paintLiveViewport',
|
||||
],
|
||||
smokes: ['smoke_live_pan_coverage.mjs'],
|
||||
because: '#579: the production-bundle witness observes promotion through budgeted viewBox '
|
||||
+ 'refreshes and active Lit commits via scene style attributes; it intentionally does not '
|
||||
+ 'call the viewport helpers whose compositor lifecycle it guards',
|
||||
},
|
||||
{
|
||||
symbols: ['_renderDevice', '_renderOpenings'],
|
||||
smokes: ['smoke_space_switch_transitions.mjs'],
|
||||
|
||||
@@ -76,7 +76,7 @@ export class LiveRuntime {
|
||||
|| !!host._resize?.dragging;
|
||||
}
|
||||
public commit(): void {
|
||||
commitHouseplanViewport(this.host);
|
||||
commitHouseplanViewport(this.host, this.active());
|
||||
reconcileDeviceFocusTip(this.host);
|
||||
resetHouseplanHover(this.host);
|
||||
syncHouseplanHover(this.host);
|
||||
|
||||
+30
-16
@@ -139,10 +139,14 @@ const setLayerProjection = (
|
||||
style.overflow = 'visible';
|
||||
}
|
||||
const text = projectionText(projection);
|
||||
if (style.transform === text) return;
|
||||
style.transformOrigin = '0 0';
|
||||
style.willChange = 'transform';
|
||||
style.transform = text;
|
||||
// Promotion is gesture-scoped, not a per-frame hint (#579). Avoid even
|
||||
// equal writes while the projection changes: WebViews may treat them as
|
||||
// compositor lifecycle changes rather than harmless string assignments.
|
||||
if (style.transformOrigin !== '0 0' && style.transformOrigin !== '0px 0px') {
|
||||
style.transformOrigin = '0 0';
|
||||
}
|
||||
if (style.willChange !== 'transform') style.willChange = 'transform';
|
||||
if (style.transform !== text) style.transform = text;
|
||||
};
|
||||
|
||||
/** Атрибут пишется только когда строка действительно другая (#531). */
|
||||
@@ -165,7 +169,7 @@ export function paintLiveViewport(
|
||||
painted: LiveViewportFrame,
|
||||
current: LiveViewportFrame,
|
||||
anchor?: LiveViewportAnchor | null,
|
||||
options: { now?: number; force?: boolean } = {},
|
||||
options: { now?: number; force?: boolean; keepSceneLayer?: boolean } = {},
|
||||
): LiveViewportAnchor {
|
||||
const now = options.now ?? (typeof performance !== 'undefined' ? performance.now() : Date.now());
|
||||
const base: LiveViewportAnchor = anchor ?? { frame: painted, at: -Infinity };
|
||||
@@ -185,21 +189,23 @@ export function paintLiveViewport(
|
||||
setViewBox(svg, floorBox);
|
||||
}
|
||||
}
|
||||
// Сцена: от записанного якоря к текущему кадру. После перезаписи `viewBox`
|
||||
// это тождество, и трансформ снимается в том же кадре.
|
||||
// Сцена: от записанного якоря к текущему кадру. Budget refresh делает
|
||||
// проекцию тождественной, но активная live-сессия сохраняет compositor layer
|
||||
// до terminal commit (#579), не демотирует и не промотирует SVG каждые 100 мс.
|
||||
const sceneCamera = liveLayerProjection(next.frame.view, current.view);
|
||||
const sceneFloor = liveLayerProjection(next.frame.floor, current.floor);
|
||||
const keepSceneLayer = options.keepSceneLayer === true;
|
||||
for (const svg of root.querySelectorAll<SVGElement>('[data-hp-live-viewbox="camera"]')) {
|
||||
setLayerProjection(
|
||||
svg,
|
||||
isIdentityLiveLayerProjection(sceneCamera) ? null : sceneCamera,
|
||||
isIdentityLiveLayerProjection(sceneCamera) && !keepSceneLayer ? null : sceneCamera,
|
||||
{ exposeSceneOverflow: true },
|
||||
);
|
||||
}
|
||||
for (const svg of root.querySelectorAll<SVGElement>('[data-hp-live-viewbox="floor"]')) {
|
||||
setLayerProjection(
|
||||
svg,
|
||||
isIdentityLiveLayerProjection(sceneFloor) ? null : sceneFloor,
|
||||
isIdentityLiveLayerProjection(sceneFloor) && !keepSceneLayer ? null : sceneFloor,
|
||||
{ exposeSceneOverflow: true },
|
||||
);
|
||||
}
|
||||
@@ -235,7 +241,9 @@ export function scheduleHouseplanViewport(value: object, now = false): void {
|
||||
if (state.raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(state.raf);
|
||||
state.raf = 0; state.pending = null;
|
||||
if (!state.painted) state.painted = next;
|
||||
state.anchor = paintLiveViewport(host.renderRoot, state.painted, next, state.anchor);
|
||||
state.anchor = paintLiveViewport(
|
||||
host.renderRoot, state.painted, next, state.anchor, { keepSceneLayer: true },
|
||||
);
|
||||
return;
|
||||
}
|
||||
state.pending = next;
|
||||
@@ -247,12 +255,14 @@ export function scheduleHouseplanViewport(value: object, now = false): void {
|
||||
const root = host.renderRoot as ParentNode | undefined;
|
||||
if (!next || !root) return;
|
||||
if (!state.painted) state.painted = next;
|
||||
state.anchor = paintLiveViewport(root, state.painted, next, state.anchor);
|
||||
state.anchor = paintLiveViewport(
|
||||
root, state.painted, next, state.anchor, { keepSceneLayer: true },
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/** Record a complete Lit frame and remove any temporary HTML projection. */
|
||||
export function commitHouseplanViewport(value: object): void {
|
||||
/** Record a complete Lit frame and reconcile gesture-scoped projections. */
|
||||
export function commitHouseplanViewport(value: object, keepSceneLayer = false): void {
|
||||
const host = value as LiveViewportHost;
|
||||
const state = stateOf(value);
|
||||
if (state.raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(state.raf);
|
||||
@@ -264,9 +274,13 @@ export function commitHouseplanViewport(value: object): void {
|
||||
for (const layer of root.querySelectorAll<HTMLElement>('[data-hp-live-layer="camera"]')) {
|
||||
setLayerProjection(layer, null);
|
||||
}
|
||||
// Осевший кадр: `viewBox` записывается принудительно, трансформы сцены
|
||||
// снимаются вместе с ним — дальше кадр принадлежит Lit, а не живому пути.
|
||||
state.anchor = paintLiveViewport(root, state.painted, state.painted, state.anchor, { force: true });
|
||||
// A full Lit frame may arrive while a pointer or programmatic camera is still
|
||||
// active. It becomes the new exact anchor, but must not demote the scene in
|
||||
// the middle of that session (#579). The terminal Lit frame passes false and
|
||||
// restores the authored, transform-free idle DOM.
|
||||
state.anchor = paintLiveViewport(root, state.painted, state.painted, state.anchor, {
|
||||
force: true, keepSceneLayer,
|
||||
});
|
||||
}
|
||||
|
||||
export function disposeHouseplanViewport(host: object): void {
|
||||
|
||||
@@ -42,12 +42,17 @@ test('a settled live viewport removes its compositor transform', () => {
|
||||
const fakeRoot = () => {
|
||||
const node = (attrs) => {
|
||||
const el = {
|
||||
attrs: { ...attrs }, writes: 0, styleWrites: 0,
|
||||
attrs: { ...attrs }, writes: 0, styleWrites: 0, styleRemovals: [],
|
||||
getAttribute: (name) => (name in el.attrs ? el.attrs[name] : null),
|
||||
setAttribute: (name, value) => { el.attrs[name] = value; el.writes += 1; },
|
||||
style: new Proxy({ _v: {} }, {
|
||||
get: (target, key) => {
|
||||
if (key === 'removeProperty') return (name) => { delete target._v[name]; el.styleWrites += 1; };
|
||||
if (key === 'removeProperty') return (name) => {
|
||||
const camel = name.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
||||
delete target._v[camel];
|
||||
el.styleRemovals.push(name);
|
||||
el.styleWrites += 1;
|
||||
};
|
||||
if (key === '_v') return target._v;
|
||||
return target._v[key];
|
||||
},
|
||||
@@ -110,6 +115,55 @@ test('#531 AC2: по истечении бюджета viewBox пишется о
|
||||
assert.ok(root.layer.style.transform, 'слой по-прежнему спроецирован от осевшего кадра');
|
||||
});
|
||||
|
||||
test('#579 a live session keeps one promoted scene layer across budget refreshes', () => {
|
||||
const root = fakeRoot();
|
||||
const painted = frame(0, 0);
|
||||
let anchor = paintLiveViewport(root, painted, painted, null, {
|
||||
now: 0, keepSceneLayer: true,
|
||||
});
|
||||
const scenes = [root.camera, root.cameraPeer, root.floor];
|
||||
for (const scene of scenes) {
|
||||
assert.equal(scene.style.transform, 'translate(0%,0%) scale(1,1)');
|
||||
assert.equal(scene.style.transformOrigin, '0 0');
|
||||
assert.equal(scene.style.willChange, 'transform');
|
||||
assert.equal(scene.style.overflow, 'visible');
|
||||
}
|
||||
|
||||
anchor = paintLiveViewport(root, painted, frame(10, 0), anchor, {
|
||||
now: 50, keepSceneLayer: true,
|
||||
});
|
||||
const removalsBeforeRefresh = scenes.map((scene) => scene.styleRemovals.length);
|
||||
const viewBoxWritesBeforeRefresh = root.camera.writes;
|
||||
anchor = paintLiveViewport(root, painted, frame(20, 0), anchor, {
|
||||
now: 100, keepSceneLayer: true,
|
||||
});
|
||||
assert.equal(root.camera.writes, viewBoxWritesBeforeRefresh + 1, 'budget refresh still lands');
|
||||
for (const [index, scene] of scenes.entries()) {
|
||||
assert.equal(scene.style.transform, 'translate(0%,0%) scale(1,1)');
|
||||
assert.equal(scene.style.transformOrigin, '0 0');
|
||||
assert.equal(scene.style.willChange, 'transform');
|
||||
assert.equal(scene.style.overflow, 'visible');
|
||||
assert.equal(scene.styleRemovals.length, removalsBeforeRefresh[index],
|
||||
'refresh may not demote and re-promote the SVG');
|
||||
}
|
||||
|
||||
const styleWrites = scenes.reduce((sum, scene) => sum + scene.styleWrites, 0);
|
||||
anchor = paintLiveViewport(root, painted, frame(20, 0), anchor, {
|
||||
now: 101, keepSceneLayer: true,
|
||||
});
|
||||
assert.equal(scenes.reduce((sum, scene) => sum + scene.styleWrites, 0), styleWrites,
|
||||
'an unchanged promoted frame writes no style');
|
||||
|
||||
const settled = frame(20, 0);
|
||||
paintLiveViewport(root, settled, settled, anchor, { now: 110, force: true });
|
||||
for (const scene of scenes) {
|
||||
assert.equal(scene.style.transform, undefined);
|
||||
assert.equal(scene.style.transformOrigin, undefined);
|
||||
assert.equal(scene.style.willChange, undefined);
|
||||
assert.equal(scene.style.overflow, undefined);
|
||||
}
|
||||
});
|
||||
|
||||
test('#531 AC2а: рывок переписывает viewBox сразу, не дожидаясь бюджета времени', () => {
|
||||
const root = fakeRoot();
|
||||
const painted = frame(0, 0);
|
||||
|
||||
Reference in New Issue
Block a user