fix(2.5D): preserve geometry on settings toggle

Issue: #649
User-Visible: no
This commit is contained in:
Sergey Matyunin
2026-09-25 23:33:07 +03:00
parent 8703727951
commit 671862875c
74 changed files with 709 additions and 681 deletions
@@ -1,280 +1,280 @@
{
"schema": 1,
"fingerprint": "f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260",
"fingerprint": "5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 294341,
"initialViewGzipBytes": 294352,
"initialPanelFiles": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-panel.js"
],
"initialPanelGzipBytes": 295864,
"initialPanelGzipBytes": 295876,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
"initialPanelOnlyGzipBytes": 2328,
"lazyFiles": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/de-V5cC3Ttx.js",
"houseplan-assets/editor-liOE3B_G.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/fr-1B8rWKlk.js",
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-editor-runtime-BdZH8eJV.js",
"houseplan-assets/houseplan-onboarding-runtime-BvtG2OkS.js",
"houseplan-assets/hp-zigbee-topology-overlay-uftP7bY8.js",
"houseplan-assets/iso-scene-render-D89RXWBh.js",
"houseplan-assets/live-interaction-runtime-GxNGZK19.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/pdf-export-fThz_nIS.js",
"houseplan-assets/summary-panel-runtime-loaded-D0fIG-Q3.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js",
"houseplan-assets/zigbee-topology-runtime-BWxSwRhe.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/de-MzlGbnY6.js",
"houseplan-assets/editor-BX1SnD4J.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/fr-TPa5lJV2.js",
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-editor-runtime-DKrm0hOr.js",
"houseplan-assets/houseplan-onboarding-runtime-CBD6sBWn.js",
"houseplan-assets/hp-zigbee-topology-overlay-Cpu0oI1Z.js",
"houseplan-assets/iso-scene-render-bYK4WMxT.js",
"houseplan-assets/live-interaction-runtime-bLPjsVWC.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/pdf-export-C8uHUxp0.js",
"houseplan-assets/summary-panel-runtime-loaded-B3IRdSqz.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js",
"houseplan-assets/zigbee-topology-runtime-DnryinZD.js"
],
"lazyGzipBytes": 450776,
"lazyGzipBytes": 450768,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/editor-liOE3B_G.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-editor-runtime-BdZH8eJV.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/editor-BX1SnD4J.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-editor-runtime-DKrm0hOr.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js"
],
"lazyEditorGzipBytes": 232079,
"lazyEditorGzipBytes": 232072,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-onboarding-runtime-BvtG2OkS.js",
"houseplan-assets/namespace-language-zq-hVFq8.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-onboarding-runtime-CBD6sBWn.js",
"houseplan-assets/namespace-language-CpeRC5ot.js"
],
"lazyOnboardingGzipBytes": 27955,
"lazyOnboardingGzipBytes": 27953,
"lazyLocaleFiles": [
"houseplan-assets/de-V5cC3Ttx.js",
"houseplan-assets/fr-1B8rWKlk.js"
"houseplan-assets/de-MzlGbnY6.js",
"houseplan-assets/fr-TPa5lJV2.js"
],
"lazyLocaleGzipBytes": 55695,
"lazyLocaleGzipBytes": 55694,
"lazyIsometricFiles": [
"houseplan-assets/iso-scene-render-D89RXWBh.js"
"houseplan-assets/iso-scene-render-bYK4WMxT.js"
],
"lazyIsometricGzipBytes": 19196,
"lazyIsometricGzipBytes": 19200,
"lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js"
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js"
],
"lazyFurnitureArtGzipBytes": 16939,
"lazyFurnitureArtGzipBytes": 16937,
"lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/pdf-export-fThz_nIS.js"
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/pdf-export-C8uHUxp0.js"
],
"lazyPdfGzipBytes": 126825,
"lazyPdfGzipBytes": 126822,
"lazyNamespaceLocaleFiles": [
"houseplan-assets/settings-de-BMHTQ472.js",
"houseplan-assets/settings-fr-D8SL6nFA.js",
"houseplan-assets/settings-ru-BumtHm9r.js",
"houseplan-assets/support-de-CktcHcBj.js",
"houseplan-assets/support-fr-DVTMYo_D.js",
"houseplan-assets/support-ru-CzccOaBw.js",
"houseplan-assets/topology-de-D6B49_YR.js",
"houseplan-assets/topology-fr-BFckU28X.js",
"houseplan-assets/topology-ru-DChJy_0v.js"
"houseplan-assets/settings-de-DfuQAgfj.js",
"houseplan-assets/settings-fr-D6JfaJvC.js",
"houseplan-assets/settings-ru-CDvH04mr.js",
"houseplan-assets/support-de-L7KPiwIU.js",
"houseplan-assets/support-fr-DObaY7qr.js",
"houseplan-assets/support-ru-BgA3Xha3.js",
"houseplan-assets/topology-de-CWbqZHe1.js",
"houseplan-assets/topology-fr-DBsnwXZ7.js",
"houseplan-assets/topology-ru-BLfywUB4.js"
],
"lazyNamespaceLocaleGzipBytes": 21069,
"lazyNamespaceLocaleGzipBytes": 21071,
"files": [
{
"path": "houseplan-assets/backdrop-pick-BrHmkBKG.js",
"sha256": "74a43a21d9a75b867451b67bd2b24473c078fbe1b46ad986c17afaf911444c81",
"path": "houseplan-assets/backdrop-pick-CI0n5n1p.js",
"sha256": "7c2c0e0f79ad856ec7ad1f5dbebabb78fb4a4a1b5bf6806917ba1dffe382a6d1",
"rawBytes": 54017,
"gzipBytes": 17577,
"gzipBytes": 17576,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js"
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js"
],
"dynamicImports": [
"houseplan-assets/settings-de-BMHTQ472.js",
"houseplan-assets/settings-fr-D8SL6nFA.js",
"houseplan-assets/settings-ru-BumtHm9r.js"
"houseplan-assets/settings-de-DfuQAgfj.js",
"houseplan-assets/settings-fr-D6JfaJvC.js",
"houseplan-assets/settings-ru-CDvH04mr.js"
]
},
{
"path": "houseplan-assets/de-V5cC3Ttx.js",
"sha256": "a54d34755d17b0dcf8c67f06c5a44270aa92e432604212c8cae5cd09b81a5a0f",
"path": "houseplan-assets/de-MzlGbnY6.js",
"sha256": "01c76b83e3a5017b43a791662e10788e9550b87ebb7cb062d69068a27a7018f3",
"rawBytes": 93055,
"gzipBytes": 28072,
"gzipBytes": 28073,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-liOE3B_G.js",
"sha256": "ad91e43587567e1aad1cc8f183a9b98ba470562464c5801f1e7995b7174a9c89",
"path": "houseplan-assets/editor-BX1SnD4J.js",
"sha256": "c8727ce296b1881ea166eaa20d72994108cd933699234d5bb0471e17e3c93f2a",
"rawBytes": 3833,
"gzipBytes": 1585,
"gzipBytes": 1582,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/form-kit.styles-BgPQk8cY.js",
"sha256": "5c8d359ddba20c58a58d9d86453048b20d272645e43db50e938884c65f9f6316",
"path": "houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"sha256": "e05caa7bdc0bc58bea69c67f219c2c90d4c0bd6ec33d9b0a404f651474d77f18",
"rawBytes": 25600,
"gzipBytes": 5056,
"gzipBytes": 5057,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-1B8rWKlk.js",
"sha256": "3d4866972e9bbd0dc74db2e66c71f8cbd4057b645a6045d5a1bcba8f7581b972",
"path": "houseplan-assets/fr-TPa5lJV2.js",
"sha256": "07a55ae1b2ca8f29bcbbd6ec26142de5dd6d0e8d461fd291bded4b1726b356c7",
"rawBytes": 95410,
"gzipBytes": 27623,
"gzipBytes": 27621,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"sha256": "be2661e9238752f64efcebe95e25a8785bca4b62fb386eb42f0f2a0a84f2670d",
"path": "houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"sha256": "11acb923c573540fe195017ebabca3f7ffab03002e410ee05219e44aa8b12239",
"rawBytes": 52035,
"gzipBytes": 16939,
"gzipBytes": 16937,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-Bg60kMOY.js",
"sha256": "438b20a04573d2c00e56f9c60f3e220fff6fa943642e248290439dfd79b28d6e",
"rawBytes": 1038728,
"gzipBytes": 293536,
"path": "houseplan-assets/houseplan-card-CsJWLJ0i.js",
"sha256": "70eb7e82a41fc589afd8e26a4dcc36b0ec4329ae95b46ff50fd54f578982c9a2",
"rawBytes": 1038664,
"gzipBytes": 293548,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-V5cC3Ttx.js",
"houseplan-assets/editor-liOE3B_G.js",
"houseplan-assets/fr-1B8rWKlk.js",
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-editor-runtime-BdZH8eJV.js",
"houseplan-assets/houseplan-onboarding-runtime-BvtG2OkS.js",
"houseplan-assets/hp-zigbee-topology-overlay-uftP7bY8.js",
"houseplan-assets/iso-scene-render-D89RXWBh.js",
"houseplan-assets/live-interaction-runtime-GxNGZK19.js",
"houseplan-assets/pdf-export-fThz_nIS.js",
"houseplan-assets/summary-panel-runtime-loaded-D0fIG-Q3.js"
"houseplan-assets/de-MzlGbnY6.js",
"houseplan-assets/editor-BX1SnD4J.js",
"houseplan-assets/fr-TPa5lJV2.js",
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-editor-runtime-DKrm0hOr.js",
"houseplan-assets/houseplan-onboarding-runtime-CBD6sBWn.js",
"houseplan-assets/hp-zigbee-topology-overlay-Cpu0oI1Z.js",
"houseplan-assets/iso-scene-render-bYK4WMxT.js",
"houseplan-assets/live-interaction-runtime-bLPjsVWC.js",
"houseplan-assets/pdf-export-C8uHUxp0.js",
"houseplan-assets/summary-panel-runtime-loaded-B3IRdSqz.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-BdZH8eJV.js",
"sha256": "fdbc8fd4391072be91a2be1f2c00899ca05bbe46e654dd20ade4dd613958f5c0",
"path": "houseplan-assets/houseplan-editor-runtime-DKrm0hOr.js",
"sha256": "37a6010ce33d42ab4bdb02e24acd0b9a59ebba7aa2df4dd3b9657ce223a0f73b",
"rawBytes": 667537,
"gzipBytes": 186206,
"gzipBytes": 186207,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js"
],
"dynamicImports": [
"houseplan-assets/support-de-CktcHcBj.js",
"houseplan-assets/support-fr-DVTMYo_D.js",
"houseplan-assets/support-ru-CzccOaBw.js",
"houseplan-assets/zigbee-topology-runtime-BWxSwRhe.js"
"houseplan-assets/support-de-L7KPiwIU.js",
"houseplan-assets/support-fr-DObaY7qr.js",
"houseplan-assets/support-ru-BgA3Xha3.js",
"houseplan-assets/zigbee-topology-runtime-DnryinZD.js"
]
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-BvtG2OkS.js",
"sha256": "275d9cd6abb3a68b5037f62253de1b6de72a8537c791391e46b1cc84ec641aa7",
"path": "houseplan-assets/houseplan-onboarding-runtime-CBD6sBWn.js",
"sha256": "afb732f1076716cb98f8abf8d7e1acb4c37082150255bf71f020a61d0a176d6a",
"rawBytes": 15886,
"gzipBytes": 4910,
"gzipBytes": 4908,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/hp-zigbee-topology-overlay-uftP7bY8.js",
"sha256": "2d38d83e841ef117d5274b8ef39ff8a44f43d4e3be81439f36a5fa0b1d111928",
"path": "houseplan-assets/hp-zigbee-topology-overlay-Cpu0oI1Z.js",
"sha256": "1ec6363ceeec655751fa30d1ecacc777570fed4323b8a0c7c244c8f2dfda58e7",
"rawBytes": 10958,
"gzipBytes": 3767,
"gzipBytes": 3766,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js",
"houseplan-assets/zigbee-topology-runtime-BWxSwRhe.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js",
"houseplan-assets/zigbee-topology-runtime-DnryinZD.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/iso-scene-render-D89RXWBh.js",
"sha256": "bf457a5d9e19305506fc4ff4d1a5766065dadd8271fc6c8cc09f358b09575ed7",
"path": "houseplan-assets/iso-scene-render-bYK4WMxT.js",
"sha256": "cc2f2032067302fb2bdce84c2176b43ffe643d52ef5ec06282da9bce9249054d",
"rawBytes": 56457,
"gzipBytes": 19196,
"gzipBytes": 19200,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/live-interaction-runtime-GxNGZK19.js",
"sha256": "34e7fd38751a83786ddfef5867d28d82bf44b4f9831b20c4dee64938a33fa759",
"path": "houseplan-assets/live-interaction-runtime-bLPjsVWC.js",
"sha256": "a904a928da1c7073c9209f6ed0e702cbf2370f9329514ba28c967eb46af9a7cc",
"rawBytes": 8216,
"gzipBytes": 3208,
"gzipBytes": 3211,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/namespace-language-zq-hVFq8.js",
"sha256": "95a270960cadae44805559de7367a4143435f3fc67d18282689bb20c6e69e014",
"path": "houseplan-assets/namespace-language-CpeRC5ot.js",
"sha256": "479c62b55bdddd4c1a2ce4a9d73452db4a0518c60d31b1d045c7174e188c3e03",
"rawBytes": 675,
"gzipBytes": 412,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/pdf-export-fThz_nIS.js",
"sha256": "f12f8a157465ef89b115eac254e39f4bfb9d6a428c6444dd5d38d243145c8380",
"path": "houseplan-assets/pdf-export-C8uHUxp0.js",
"sha256": "580b25926708c36fb4f85430d343bf1bdea959e1bf12248886d0066649834508",
"rawBytes": 236264,
"gzipBytes": 109886,
"gzipBytes": 109885,
"isEntry": false,
"imports": [
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/settings-de-BMHTQ472.js",
"sha256": "b16c103ebed5c1e56bcfa42b97dc2d5fee85358d891447e114e941bffce1bd56",
"path": "houseplan-assets/settings-de-DfuQAgfj.js",
"sha256": "b047ba600986bb7f9be67ef5d650142dd8f224307709bfb1e36d72d84f2abc90",
"rawBytes": 7378,
"gzipBytes": 2880,
"gzipBytes": 2881,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/settings-fr-D8SL6nFA.js",
"sha256": "80b5a2ae94a6ee28edecfa719ab0dfaa140b78f5ff746555bc82153bbe5fdd81",
"path": "houseplan-assets/settings-fr-D6JfaJvC.js",
"sha256": "4a49c5142087707bcbad3ddd4c95d0ecd7cfe08191b2a463f7d632157a469c6c",
"rawBytes": 7620,
"gzipBytes": 2843,
"isEntry": false,
@@ -282,8 +282,8 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/settings-ru-BumtHm9r.js",
"sha256": "12bb199843170225f3530fc0e36a54d239da03a7f34ecc304f7c8fbfa0b5d1ae",
"path": "houseplan-assets/settings-ru-CDvH04mr.js",
"sha256": "957a51c026f91167bb01cbf6af5b09bac180257de28a85317f3d26d1a1eb7f6b",
"rawBytes": 10304,
"gzipBytes": 3326,
"isEntry": false,
@@ -291,56 +291,56 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-editor-BkZaI2dp.js",
"sha256": "f9162891a45296b376dbc55edde9385542461fc1d29d95921a33ea0e96b86d6c",
"rawBytes": 14862,
"gzipBytes": 3427,
"path": "houseplan-assets/summary-panel-editor-Bywe1bcT.js",
"sha256": "a799abcd27d96451bc583f40968c369e6c2cebef22e8ed2d840c71fff6dedf2d",
"rawBytes": 14867,
"gzipBytes": 3432,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/summary-panel-runtime-loaded-D0fIG-Q3.js"
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/summary-panel-runtime-loaded-B3IRdSqz.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-metrics-DzfhHOP_.js",
"sha256": "558994e1af0d59e45390f77c1829340bedbecc844716707c8d4c4b08e3d51245",
"path": "houseplan-assets/summary-panel-metrics-CloidLW8.js",
"sha256": "ce5eccc78a9af678800fa7e42e581428a8c3098b42853a9dc085c7287c7b34ce",
"rawBytes": 2611,
"gzipBytes": 1309,
"gzipBytes": 1308,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-runtime-loaded-D0fIG-Q3.js",
"sha256": "a830e752eeaafe128add5d7eef3e4e580e5d6da8d08a2612f2bacd200d7938a9",
"path": "houseplan-assets/summary-panel-runtime-loaded-B3IRdSqz.js",
"sha256": "d84c831ba31db0fd668cb5369b2077221a8beb4c10e64744b72c02a2623998c0",
"rawBytes": 72956,
"gzipBytes": 20242,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": [
"houseplan-assets/summary-panel-editor-BkZaI2dp.js",
"houseplan-assets/summary-panel-metrics-DzfhHOP_.js"
"houseplan-assets/summary-panel-editor-Bywe1bcT.js",
"houseplan-assets/summary-panel-metrics-CloidLW8.js"
]
},
{
"path": "houseplan-assets/support-de-CktcHcBj.js",
"sha256": "11123e521d135ebea86ed1ec7339dc90d974e7bb825f6be48adc92e282304b5e",
"path": "houseplan-assets/support-de-L7KPiwIU.js",
"sha256": "36ec6978dfee4aa9e137231462e5feeeb7a325dd8cef6653648bc67068f7a7b4",
"rawBytes": 6167,
"gzipBytes": 2398,
"gzipBytes": 2399,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/support-fr-DVTMYo_D.js",
"sha256": "65ecb04f3752aeb754eaac3d4b3160df74874b4b4f9eb8c18c7133de36026c4b",
"path": "houseplan-assets/support-fr-DObaY7qr.js",
"sha256": "770b58fa270b976c40199d504579711ca3fa3474c3516c5d761be9e18a40c04c",
"rawBytes": 6333,
"gzipBytes": 2433,
"isEntry": false,
@@ -348,17 +348,17 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/support-ru-CzccOaBw.js",
"sha256": "89badfdf3f8173fadf058269fd877fecf991c0473a6a93f1cd2c779ef46502a8",
"path": "houseplan-assets/support-ru-BgA3Xha3.js",
"sha256": "f93574aeda55492d327e306ac91d64413bffcc2bfa6ba88ea8c3ecf70cb9f85a",
"rawBytes": 8376,
"gzipBytes": 2876,
"gzipBytes": 2878,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/topology-de-D6B49_YR.js",
"sha256": "21c338625cbb25232b3d9586d2f27666c3262de4770a7ce3b2c09ee13692bd16",
"path": "houseplan-assets/topology-de-CWbqZHe1.js",
"sha256": "7dda3cdf32dde949d2b5048b5292d4ba49b4aad2c2634089cb7f4356a37a9ccc",
"rawBytes": 2698,
"gzipBytes": 1339,
"isEntry": false,
@@ -366,71 +366,71 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/topology-fr-BFckU28X.js",
"sha256": "d2e8f64e3bf668e545ca365d5c6ae3ec5d1dbe16649ae315b6cafb5eaef0f567",
"path": "houseplan-assets/topology-fr-DBsnwXZ7.js",
"sha256": "129a6552fc9b76ee486a110210f395a932f58991947ba57bae6ebc68bdce52f7",
"rawBytes": 2718,
"gzipBytes": 1357,
"gzipBytes": 1356,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/topology-ru-DChJy_0v.js",
"sha256": "83e7c562c23041767fe89d97ad4fa6f7fa9c01aee935babf6c5811ab59d45c35",
"path": "houseplan-assets/topology-ru-BLfywUB4.js",
"sha256": "e9a890c120a79f9c34a05a0240a33daaf43a462d418fe29754501b673bc5cae2",
"rawBytes": 3669,
"gzipBytes": 1617,
"gzipBytes": 1616,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-runtime-BWxSwRhe.js",
"sha256": "f4654a348362647ae149785f68e8f9ea196b7ddab3a7d53812ae6d039b3a1a13",
"rawBytes": 3983,
"gzipBytes": 1793,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-TeOwXMvQ.js",
"sha256": "84c0c429c8663ab3ad8673f816ab38e29a87cc9663903e037ccb930b01f3a263",
"path": "houseplan-assets/zigbee-topology-DeK7D_ZA.js",
"sha256": "026c63361c50d7f6648846cd08488befd3c738c1526ac16400f37876d300d707",
"rawBytes": 10958,
"gzipBytes": 4304,
"gzipBytes": 4301,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js"
],
"dynamicImports": [
"houseplan-assets/topology-de-D6B49_YR.js",
"houseplan-assets/topology-fr-BFckU28X.js",
"houseplan-assets/topology-ru-DChJy_0v.js"
"houseplan-assets/topology-de-CWbqZHe1.js",
"houseplan-assets/topology-fr-DBsnwXZ7.js",
"houseplan-assets/topology-ru-BLfywUB4.js"
]
},
{
"path": "houseplan-assets/zigbee-topology-runtime-DnryinZD.js",
"sha256": "24764adb11071cf7625d167fcda6860ee19b1d1a8f1a99f57d6b8526e099be93",
"rawBytes": 3983,
"gzipBytes": 1790,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "7fdb4c193f8b038df40717557b5dc2eba6550080e916734b64b5cce815a3059b",
"sha256": "5aca9a864d90f63602befe184164ef9db73e91b141f34c7cf690d9c447cfc6e1",
"rawBytes": 1205,
"gzipBytes": 805,
"gzipBytes": 804,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
"sha256": "69a82abf193431e19830f896f9481e32e3669f8b1bd1b6808c259994ccdfeb3f",
"sha256": "3dc1cc41f9a0ce7627fb3f4dcfaea0541d95d120b6ba6700564bc2a6d93bbd24",
"rawBytes": 6165,
"gzipBytes": 2328,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
}
File diff suppressed because one or more lines are too long
@@ -1,14 +1,14 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{aD as e,l as o,aG as t,ek as s,A as a,el as i,em as l,en as n,E as r,c}from"./houseplan-card-Bg60kMOY.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__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{aD as e,l as o,aG as t,ek as s,A as a,el as i,em as l,en as n,E as r,c}from"./houseplan-card-CsJWLJ0i.js";class f extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,f={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},h=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>h[e.name]||e.name}
.computeLabel=${e=>f[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(f.slice(0,3))}
${d(h.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${d(f.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
${d(h.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}f.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",f);
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{ep as a,eq as e,em as n}from"./houseplan-card-CsJWLJ0i.js";function c(n,c){return new a([{code:"en",dictionary:n},{code:"ru",loadDictionary:c.ru},{code:"de",loadDictionary:c.de},{code:"fr",loadDictionary:c.fr}],"5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221",console.warn,e)}function o(a){return function(a,e){return{state:n=>{const c=a.state(n);return"pending"!==c&&e.some(a=>"pending"===a.state(n))?"pending":c},dictionary:e=>a.dictionary(e),ensure:n=>Promise.all([a,...e].map(a=>a.ensure(n))).then(()=>{})}}(n,a)}export{c as n,o as s};
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{ep as e,eq as n,em as a}from"./houseplan-card-Bg60kMOY.js";function o(a,o){return new e([{code:"en",dictionary:a},{code:"ru",loadDictionary:o.ru},{code:"de",loadDictionary:o.de},{code:"fr",loadDictionary:o.fr}],"f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260",console.warn,n)}function r(e){return function(e,n){return{state:a=>{const o=e.state(a);return"pending"!==o&&n.some(e=>"pending"===e.state(a))?"pending":o},dictionary:n=>e.dictionary(n),ensure:a=>Promise.all([e,...n].map(e=>e.ensure(a))).then(()=>{})}}(a,e)}export{o as n,r as s};
@@ -1,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{c as a,A as e}from"./houseplan-card-Bg60kMOY.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-D0fIG-Q3.js";import"./form-kit.styles-BgPQk8cY.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__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{c as a,A as s}from"./houseplan-card-CsJWLJ0i.js";import{s as e,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-B3IRdSqz.js";import"./form-kit.styles-Ok4N7QdY.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&&!e(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(s=>s.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"
@@ -10,31 +10,31 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
dismiss-on-scrim aria-busy=${String(d.busy)}
@hp-close=${k}>
<div class="body summary-editor" @click=${()=>m.closeSource()}>
${d.localOnly?a`<p class="summary-local-hint">${b(d.localOnlyHint)}</p>`:e}
${d.localOnly?a`<p class="summary-local-hint">${b(d.localOnlyHint)}</p>`:s}
<section class="summary-general" aria-labelledby="summary-general-title">
<h3 id="summary-general-title">${b("summary.general_settings")}</h3>
<div class="summary-general-grid">
${d.localOnly?e:a`<div class="summary-field">
${d.localOnly?s:a`<div class="summary-field">
<label for="summary-panel-title">${b("summary.panel_title")}</label>
<input id="summary-panel-title" type="text" .value=${d.draft.title}
?disabled=${d.busy}
data-summary-error=${String(d.attempted&&"title"===y?.path)}
aria-invalid=${"error"===v("title")?.kind?"true":"false"}
@input=${a=>m.mutate(e=>{e.title=a.target.value})} />
${v("title")?a`<div class="summary-problem error">${h(v("title"))}</div>`:e}
@input=${a=>m.mutate(s=>{s.title=a.target.value})} />
${v("title")?a`<div class="summary-problem error">${h(v("title"))}</div>`:s}
</div>`}
${g}
${d.localOnly?e:a`<label class="summary-switch" for="summary-mobile-show">
${d.localOnly?s:a`<label class="summary-switch" for="summary-mobile-show">
<span class="summary-switch-caption"><strong>${b("summary.show_mobile")}</strong>
<small id="summary-mobile-show-hint">${b("summary.show_mobile_hint")}</small></span>
<input id="summary-mobile-show" data-summary-mobile-show type="checkbox"
.checked=${d.draft.show_on_mobile} ?disabled=${!d.localShow||d.busy}
aria-label=${b("summary.show_mobile")} aria-describedby="summary-mobile-show-hint"
@change=${a=>m.mutate(e=>{e.show_on_mobile=a.target.checked})} /></label>`}
@change=${a=>m.mutate(s=>{s.show_on_mobile=a.target.checked})} /></label>`}
</div>
${m.storageUnavailable?a`<div class="summary-problem warning">${b("summary.storage_unavailable")}</div>`:e}
${m.storageUnavailable?a`<div class="summary-problem warning">${b("summary.storage_unavailable")}</div>`:s}
</section>
${d.localOnly?e:a`
${d.localOnly?s:a`
<section class="summary-blocks-card" aria-labelledby="summary-blocks-title">
<header class="summary-blocks-heading">
<div><h3 id="summary-blocks-title">${b("summary.blocks")}</h3>
@@ -42,7 +42,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
<span class="summary-block-count">${b("summary.block_count").replace("{count}",String(d.draft.blocks.length)).replace("{limit}","10")}</span>
</header>
<div class="summary-editor-blocks">
${d.draft.blocks.map((s,t)=>{const u=`blocks.${t}`,n=v(`${u}.scope`);return a`<article class="summary-editor-block"
${d.draft.blocks.map((e,t)=>{const u=`blocks.${t}`,n=v(`${u}.scope`);return a`<article class="summary-editor-block"
@dragover=${a=>a.preventDefault()}
@drop=${a=>m.drop(a,`block:${t}`)}>
<div class="summary-block-head">
@@ -57,40 +57,40 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
?disabled=${t===d.draft.blocks.length-1||d.busy}
@click=${()=>m.mutate(a=>{a.blocks=r(a.blocks,t,t+1)})}>${l("down")}</button>
</div>
<input class="summary-block-title" type="text" .value=${s.title}
<input class="summary-block-title" type="text" .value=${e.title}
placeholder=${b("summary.block_title")} aria-label=${b("summary.block_title")}
?disabled=${d.busy}
data-summary-error=${String(d.attempted&&y?.path===`${u}.title`)}
aria-invalid=${"error"===v(`${u}.title`)?.kind?"true":"false"}
@input=${a=>m.mutate(e=>{e.blocks[t].title=a.target.value})} />
@input=${a=>m.mutate(s=>{s.blocks[t].title=a.target.value})} />
<button class="summary-icon-button summary-visibility" type="button"
?disabled=${d.busy} aria-pressed=${String(s.visible)}
title=${b(s.visible?"summary.hide_block":"summary.show_block")}
aria-label=${b(s.visible?"summary.hide_block":"summary.show_block")}
@click=${()=>m.mutate(a=>{a.blocks[t].visible=!a.blocks[t].visible})}>${l(s.visible?"eye":"eyeOff")}</button>
${v(`${u}.title`)?a`<div class="summary-problem error summary-block-title-error">${h(v(`${u}.title`))}</div>`:e}
?disabled=${d.busy} aria-pressed=${String(e.visible)}
title=${b(e.visible?"summary.hide_block":"summary.show_block")}
aria-label=${b(e.visible?"summary.hide_block":"summary.show_block")}
@click=${()=>m.mutate(a=>{a.blocks[t].visible=!a.blocks[t].visible})}>${l(e.visible?"eye":"eyeOff")}</button>
${v(`${u}.title`)?a`<div class="summary-problem error summary-block-title-error">${h(v(`${u}.title`))}</div>`:s}
<div class="summary-scope">
<select .value=${s.scope.type} ?disabled=${d.busy}
<select .value=${e.scope.type} ?disabled=${d.busy}
aria-label=${b("summary.scope")}
@change=${a=>m.mutate(e=>{e.blocks[t].scope="space"===a.target.value?{type:"space",space_id:c._space}:{type:"all"}})}>
<option value="all" ?selected=${"all"===s.scope.type}>${b("summary.scope_all")}</option>
<option value="space" ?selected=${"space"===s.scope.type}>${b("summary.scope_space")}</option>
@change=${a=>m.mutate(s=>{s.blocks[t].scope="space"===a.target.value?{type:"space",space_id:c._space}:{type:"all"}})}>
<option value="all" ?selected=${"all"===e.scope.type}>${b("summary.scope_all")}</option>
<option value="space" ?selected=${"space"===e.scope.type}>${b("summary.scope_space")}</option>
</select>
${"space"===s.scope.type?a`<select .value=${s.scope.space_id}
${"space"===e.scope.type?a`<select .value=${e.scope.space_id}
?disabled=${d.busy} aria-label=${b("summary.scope_space")}
data-summary-error=${String(d.attempted&&y?.path===`${u}.scope`)}
aria-invalid=${"error"===n?.kind?"true":"false"}
@change=${a=>m.mutate(e=>{const s=e.blocks[t].scope;"space"===s.type&&(s.space_id=a.target.value)})}>
${c._model.some(a=>a.id===s.scope.space_id)?e:a`<option value=${s.scope.space_id} selected>${s.scope.space_id}</option>`}
${c._model.map(e=>a`<option value=${e.id}
?selected=${e.id===s.scope.space_id}>${e.title}</option>`)}
</select>`:e}
@change=${a=>m.mutate(s=>{const e=s.blocks[t].scope;"space"===e.type&&(e.space_id=a.target.value)})}>
${c._model.some(a=>a.id===e.scope.space_id)?s:a`<option value=${e.scope.space_id} selected>${e.scope.space_id}</option>`}
${c._model.map(s=>a`<option value=${s.id}
?selected=${s.id===e.scope.space_id}>${s.title}</option>`)}
</select>`:s}
</div>
${n?a`<div class="summary-problem summary-scope-problem ${n.kind}">${h(n)}</div>`:e}
${n?a`<div class="summary-problem summary-scope-problem ${n.kind}">${h(n)}</div>`:s}
</div>
<div class="summary-block-body">
<div class="summary-editor-values">
${s.values.map((i,c)=>{const n=`${u}.values.${c}`,$=v(`${n}.source`),p=m.sourceToken(i.source),k=d.activeSource?.blockId===s.id&&d.activeSource.valueId===i.id,g="system"===i.source.type?b(`summary.system.${i.source.key}`):i.source.entity_id?m.entityIndex.labels.get(i.source.entity_id)||i.source.entity_id:b("summary.select_source"),_="system"===i.source.type?b("summary.system_source"):i.source.entity_id,f=k?o(m.entityIndex,d.entityFilter):null,w="entity"===i.source.type&&!!i.source.entity_id&&!m.entityIndex.labels.has(i.source.entity_id),S=`${s.id}\n${i.id}`;return a`<div class="summary-editor-value"
${e.values.map((i,c)=>{const n=`${u}.values.${c}`,$=v(`${n}.source`),p=m.sourceToken(i.source),k=d.activeSource?.blockId===e.id&&d.activeSource.valueId===i.id,g="system"===i.source.type?b(`summary.system.${i.source.key}`):i.source.entity_id?m.entityIndex.labels.get(i.source.entity_id)||i.source.entity_id:b("summary.select_source"),_="system"===i.source.type?b("summary.system_source"):i.source.entity_id,f=k?o(m.entityIndex,d.entityFilter):null,w="entity"===i.source.type&&!!i.source.entity_id&&!m.entityIndex.labels.has(i.source.entity_id),S=`${e.id}\n${i.id}`;return a`<div class="summary-editor-value"
@dragover=${a=>{a.preventDefault(),a.stopPropagation()}}
@drop=${a=>m.drop(a,`value:${t}:${c}`)}>
<span class="summary-drag" draggable=${String(!d.busy)} title=${b("summary.drag")}
@@ -101,7 +101,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
@click=${()=>m.mutate(a=>{a.blocks[t].values=r(a.blocks[t].values,c,c-1)})}>${l("up")}</button>
<button class="summary-icon-button" type="button" title=${b("summary.down")}
aria-label=${b("summary.down")}
?disabled=${c===s.values.length-1||d.busy}
?disabled=${c===e.values.length-1||d.busy}
@click=${()=>m.mutate(a=>{a.blocks[t].values=r(a.blocks[t].values,c,c+1)})}>${l("down")}</button>
</div>
<div class="summary-value-label">
@@ -109,8 +109,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
placeholder=${b("summary.value_name")} aria-label=${b("summary.value_name")}
data-summary-error=${String(d.attempted&&y?.path===`${n}.label`)}
aria-invalid=${"error"===v(`${n}.label`)?.kind?"true":"false"}
@input=${a=>m.mutate(e=>{e.blocks[t].values[c].label=a.target.value})} />
${v(`${n}.label`)?a`<div class="summary-problem error">${h(v(`${n}.label`))}</div>`:e}
@input=${a=>m.mutate(s=>{s.blocks[t].values[c].label=a.target.value})} />
${v(`${n}.label`)?a`<div class="summary-problem error">${h(v(`${n}.label`))}</div>`:s}
</div>
<div class="summary-source-field">
<button class="summary-source" type="button"
@@ -119,9 +119,9 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
data-summary-error=${String(d.attempted&&y?.path===`${n}.source`)}
aria-invalid=${"error"===$?.kind?"true":"false"}
aria-haspopup="listbox" aria-expanded=${k?"true":"false"}
@click=${a=>{a.stopPropagation(),k?m.closeSource():m.openSource(s.id,i.id)}}>
@click=${a=>{a.stopPropagation(),k?m.closeSource():m.openSource(e.id,i.id)}}>
<span class="summary-source-caption"><strong>${g}</strong>
${_?a`<small>${_}</small>`:e}</span>
${_?a`<small>${_}</small>`:s}</span>
${l("chevron")}
</button>
${k&&f?a`<div class="summary-source-picker"
@@ -135,39 +135,39 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
<div class="summary-source-results" role="listbox"
aria-label=${b("summary.select_source")}>
<div class="summary-source-group">${b("summary.system_group")}</div>
${["device_count","total_area","datetime"].map(e=>a`
${["device_count","total_area","datetime"].map(s=>a`
<button type="button" role="option"
?disabled=${d.busy}
aria-selected=${p===`system:${e}`?"true":"false"}
@click=${()=>m.setSource(s.id,i.id,`system:${e}`)}>
${b(`summary.system.${e}`)}
aria-selected=${p===`system:${s}`?"true":"false"}
@click=${()=>m.setSource(e.id,i.id,`system:${s}`)}>
${b(`summary.system.${s}`)}
</button>`)}
${w?a`<div class="summary-source-group">${b("summary.current_source")}</div>
<button type="button" role="option" class="broken" aria-selected="true"
?disabled=${d.busy}
@click=${()=>m.setSource(s.id,i.id,p)}>
@click=${()=>m.setSource(e.id,i.id,p)}>
${g}
</button>`:e}
</button>`:s}
<div class="summary-source-group">${b("summary.entities_group")}</div>
${f.entries.map(e=>a`<button type="button" role="option"
${f.entries.map(s=>a`<button type="button" role="option"
?disabled=${d.busy}
aria-selected=${p===`entity:${e.id}`?"true":"false"}
@click=${()=>m.setSource(s.id,i.id,`entity:${e.id}`)}>
<span>${e.label}</span><small>${e.id}</small>
aria-selected=${p===`entity:${s.id}`?"true":"false"}
@click=${()=>m.setSource(e.id,i.id,`entity:${s.id}`)}>
<span>${s.label}</span><small>${s.id}</small>
</button>`)}
${f.total?e:a`<div class="summary-empty">${b("summary.no_search_results")}</div>`}
${f.truncated?a`<div class="summary-refine">${b("summary.refine_search")}</div>`:e}
${f.total?s:a`<div class="summary-empty">${b("summary.no_search_results")}</div>`}
${f.truncated?a`<div class="summary-refine">${b("summary.refine_search")}</div>`:s}
</div>
</div>`:e}
${$?a`<div class="summary-problem ${$.kind}">${h($)}</div>`:e}
</div>`:s}
${$?a`<div class="summary-problem ${$.kind}">${h($)}</div>`:s}
</div>
<button class="summary-icon-button summary-value-remove" type="button"
title=${b("btn.delete")} aria-label=${b("btn.delete")} ?disabled=${d.busy}
@click=${()=>m.mutate(a=>{a.blocks[t].values.splice(c,1)})}>${l("close")}</button>
</div>`})}
<button class="summary-add summary-add-value" type="button"
?disabled=${s.values.length>=20||d.busy}
title=${s.values.length>=20?b("summary.limit_values"):""}
?disabled=${e.values.length>=20||d.busy}
title=${e.values.length>=20?b("summary.limit_values"):""}
@click=${()=>m.mutate(a=>{a.blocks[t].values.push(i())})}>
${l("plus")}${b("summary.add_value")}
</button>
@@ -186,11 +186,11 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
${l("plus")}${b("summary.add_block")}
</button>
</section>
${d.error?a`<div class="summary-problem error" role="alert">${d.error}</div>`:e}
${d.error?a`<div class="summary-problem error" role="alert">${d.error}</div>`:s}
${d.conflict?a`<button class="btn ghost summary-reload" type="button"
?disabled=${d.busy} @click=${()=>m.reload()}>
<ha-icon icon="mdi:reload"></ha-icon>${b("summary.reload_current")}
</button>`:e}
</button>`:s}
`}
</div>
<div class="row summary-editor-footer" slot="footer">
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{es as e,N as t,b2 as n,L as i,ae as o,ac as r,bZ as s,bY as a,b1 as c,b0 as l,b3 as u,et as d,eu as f,b$ as m,ev as g}from"./houseplan-card-CsJWLJ0i.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,u="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*h(c,l,u=_){try{let d=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=u(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/o;d+=a(v)*_*_/1e4}return d}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function b(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=d(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{h as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,b as summarySystemValue,p as totalCleanFloorAreaM2};
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{es as e,N as t,b2 as n,L as i,ae as o,ac as r,bZ as s,bY as a,b1 as l,b0 as c,b3 as u,et as d,eu as f,b$ as m,ev as g}from"./houseplan-card-Bg60kMOY.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,l="entity"===r?e.registry.entities?.[s]:null,c="device"===r?s:l?.device_id,u="device"===r?a?.area_id:l?.area_id||c&&e.registry.devices?.[c]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;c&&e.registry.devices?.[c]&&e.spaceIds.has(f)&&(!n.devices.has(c)||"entity"===r&&n.liveEntities.has(s))&&t.add(c)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=l(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:c(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*b(l,c,u=_){try{let d=0;for(const f of c){const c=l.spaces.find(e=>String(e?.id)===f.id);if(!c)continue;const m=e(c,f),g=u(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const l=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(l,m.physicalBodies)),yield}const _=m.cellCm/o;d+=a(v)*_*_/1e4}return d}catch{return null}}function h(e,t,n=_){const i=b(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function p(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=d(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{b as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,p as summarySystemValue,h as totalCleanFloorAreaM2};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";var e={title:"Zigbee-Verbindungen",toggle:"Zigbee-Verbindungen beim Darüberfahren über ein Gerät anzeigen",hint:"Es werden nur beobachtete direkte Nachbarn angezeigt. Beim Darüberfahren werden keine Daten abgerufen.",help:"Zeigt, mit welchen Zigbee-Geräten jedes Gerät direkt verbunden ist. Die Linienfarbe ist die Verbindungsqualität (LQI) auf derselben Skala wie der LQI-Wert des Geräts: rot bei 40 und darunter, grün bei 180 und darüber. Eine gestrichelte Linie bedeutet, dass die Qualität nicht gemeldet wurde. Ein Pfeil zeigt auf das nächste Gerät auf dem Weg zum Koordinator: ein Pfeil führt hinaus, eingehende Pfeile sind die Geräte, die über dieses Gerät routen. Eine Linie ohne Pfeil ist ein Ersatznachbar. Das ist der Routenbaum, den House Plan bildet, nicht der Weg eines Pakets in diesem Moment: eine Beschriftung am Pfeilende bedeutet, dass das Ziel nicht auf diesem Plan liegt, und ein fehlender Pfeil, dass die Route unbekannt ist. Die Daten stammen aus dem letzten Laden und veralten; Verbindungen sind nur mit der Maus sichtbar.",help_aria:"Hilfe: Zigbee-Verbindungen",admin_only:"Topologiedaten sind nur für Home-Assistant-Administratoren verfügbar.",save_first:"Speichere diese Einstellung, bevor Topologiedaten geladen werden.",zha:"ZHA",zha_read:"ZHA-Daten lesen",zha_hint:"Liest den ZHA-Topologiecache; es wird kein Funkscan gestartet.",z2m:"Zigbee2MQTT",z2m_topics:"Basistopics (eines pro Zeile)",z2m_update:"Karte aktualisieren",z2m_warning:"Ein Netzwerkscan kann 10 Sekunden bis 2 Minuten dauern und Zigbee vorübergehend verlangsamen.",status_idle:"Daten nicht geladen",status_loading:"Wird geladen…",status_ready:"Empfangen: {time}",status_stale:"Empfangen: {time} · veraltet",status_partial:"Empfangen: {time} · einige Knoten fehlen",status_no_links:"Empfangen: {time} · keine beobachteten Verbindungen gefunden",error_permission:"Administratorrechte sind erforderlich.",error_unsupported:"Dieser Anbieter oder die Home-Assistant-API ist nicht verfügbar.",error_timeout:"Der Anbieter hat nicht rechtzeitig geantwortet.",error_invalid_topic:"Prüfe das Zigbee2MQTT-Basistopic.",error_invalid_payload:"Der Anbieter hat nicht unterstützte Topologiedaten geliefert.",error_provider:"Topologiedaten konnten nicht geladen werden.",remote_count:"+{n} in anderen Bereichen",route_device_not_on_plan:"Gerät ist nicht im Plan",route_coordinator_not_on_plan:"Koordinator ist nicht im Plan",route_other_space:"anderer Bereich"};const n="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";export{e as dictionary,n as fingerprint};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";var e={title:"Zigbee-Verbindungen",toggle:"Zigbee-Verbindungen beim Darüberfahren über ein Gerät anzeigen",hint:"Es werden nur beobachtete direkte Nachbarn angezeigt. Beim Darüberfahren werden keine Daten abgerufen.",help:"Zeigt, mit welchen Zigbee-Geräten jedes Gerät direkt verbunden ist. Die Linienfarbe ist die Verbindungsqualität (LQI) auf derselben Skala wie der LQI-Wert des Geräts: rot bei 40 und darunter, grün bei 180 und darüber. Eine gestrichelte Linie bedeutet, dass die Qualität nicht gemeldet wurde. Ein Pfeil zeigt auf das nächste Gerät auf dem Weg zum Koordinator: ein Pfeil führt hinaus, eingehende Pfeile sind die Geräte, die über dieses Gerät routen. Eine Linie ohne Pfeil ist ein Ersatznachbar. Das ist der Routenbaum, den House Plan bildet, nicht der Weg eines Pakets in diesem Moment: eine Beschriftung am Pfeilende bedeutet, dass das Ziel nicht auf diesem Plan liegt, und ein fehlender Pfeil, dass die Route unbekannt ist. Die Daten stammen aus dem letzten Laden und veralten; Verbindungen sind nur mit der Maus sichtbar.",help_aria:"Hilfe: Zigbee-Verbindungen",admin_only:"Topologiedaten sind nur für Home-Assistant-Administratoren verfügbar.",save_first:"Speichere diese Einstellung, bevor Topologiedaten geladen werden.",zha:"ZHA",zha_read:"ZHA-Daten lesen",zha_hint:"Liest den ZHA-Topologiecache; es wird kein Funkscan gestartet.",z2m:"Zigbee2MQTT",z2m_topics:"Basistopics (eines pro Zeile)",z2m_update:"Karte aktualisieren",z2m_warning:"Ein Netzwerkscan kann 10 Sekunden bis 2 Minuten dauern und Zigbee vorübergehend verlangsamen.",status_idle:"Daten nicht geladen",status_loading:"Wird geladen…",status_ready:"Empfangen: {time}",status_stale:"Empfangen: {time} · veraltet",status_partial:"Empfangen: {time} · einige Knoten fehlen",status_no_links:"Empfangen: {time} · keine beobachteten Verbindungen gefunden",error_permission:"Administratorrechte sind erforderlich.",error_unsupported:"Dieser Anbieter oder die Home-Assistant-API ist nicht verfügbar.",error_timeout:"Der Anbieter hat nicht rechtzeitig geantwortet.",error_invalid_topic:"Prüfe das Zigbee2MQTT-Basistopic.",error_invalid_payload:"Der Anbieter hat nicht unterstützte Topologiedaten geliefert.",error_provider:"Topologiedaten konnten nicht geladen werden.",remote_count:"+{n} in anderen Bereichen",route_device_not_on_plan:"Gerät ist nicht im Plan",route_coordinator_not_on_plan:"Koordinator ist nicht im Plan",route_other_space:"anderer Bereich"};const n="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";export{e as dictionary,n as fingerprint};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";var e={title:"Liens Zigbee",toggle:"Afficher les liens Zigbee au survol d’un appareil",hint:"Seuls les voisins directs observés sont affichés. Le survol ne lance aucune requête.",help:"Montre avec quels appareils Zigbee chaque appareil communique directement. La couleur de la ligne est la qualité du lien (LQI) sur la même échelle que l'indicateur LQI de l'appareil : rouge à 40 et en dessous, vert à 180 et au-dessus. Une ligne pointillée signifie que la qualité n'a pas été communiquée. Une flèche pointe vers l'appareil suivant sur le chemin du coordinateur : une flèche part, les flèches entrantes sont les appareils qui passent par celui-ci. Une ligne sans flèche est un voisin de secours. C'est l'arbre de routes que construit House Plan, pas le trajet d'un paquet à cet instant : une étiquette au bout d'une flèche signifie que sa cible n'est pas sur ce plan, et l'absence de flèche que la route est inconnue. Les données proviennent du dernier chargement et vieillissent ; les liens ne sont visibles qu'à la souris.",help_aria:"Aide : liens Zigbee",admin_only:"Les données de topologie sont réservées aux administrateurs Home Assistant.",save_first:"Enregistrez ce réglage avant de charger les données de topologie.",zha:"ZHA",zha_read:"Lire les données ZHA",zha_hint:"Lit la topologie en cache de ZHA sans lancer d’analyse radio.",z2m:"Zigbee2MQTT",z2m_topics:"Topics de base (un par ligne)",z2m_update:"Actualiser la carte",z2m_warning:"L’analyse de la carte réseau peut durer de 10 secondes à 2 minutes et réduire temporairement la réactivité de Zigbee.",status_idle:"Données non chargées",status_loading:"Chargement…",status_ready:"Reçu : {time}",status_stale:"Reçu : {time} · obsolète",status_partial:"Reçu : {time} · certains nœuds sont omis",status_no_links:"Reçu : {time} · aucun lien observé trouvé",error_permission:"Les droits administrateur sont requis.",error_unsupported:"Ce fournisseur ou l’API Home Assistant n’est pas disponible.",error_timeout:"Le fournisseur n’a pas répondu à temps.",error_invalid_topic:"Vérifiez le topic de base Zigbee2MQTT.",error_invalid_payload:"Le fournisseur a renvoyé des données de topologie non prises en charge.",error_provider:"Impossible de charger les données de topologie.",remote_count:"+{n} dans d’autres espaces",route_device_not_on_plan:"appareil absent du plan",route_coordinator_not_on_plan:"coordinateur absent du plan",route_other_space:"autre espace"};const s="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";export{e as dictionary,s as fingerprint};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";var e={title:"Liens Zigbee",toggle:"Afficher les liens Zigbee au survol d’un appareil",hint:"Seuls les voisins directs observés sont affichés. Le survol ne lance aucune requête.",help:"Montre avec quels appareils Zigbee chaque appareil communique directement. La couleur de la ligne est la qualité du lien (LQI) sur la même échelle que l'indicateur LQI de l'appareil : rouge à 40 et en dessous, vert à 180 et au-dessus. Une ligne pointillée signifie que la qualité n'a pas été communiquée. Une flèche pointe vers l'appareil suivant sur le chemin du coordinateur : une flèche part, les flèches entrantes sont les appareils qui passent par celui-ci. Une ligne sans flèche est un voisin de secours. C'est l'arbre de routes que construit House Plan, pas le trajet d'un paquet à cet instant : une étiquette au bout d'une flèche signifie que sa cible n'est pas sur ce plan, et l'absence de flèche que la route est inconnue. Les données proviennent du dernier chargement et vieillissent ; les liens ne sont visibles qu'à la souris.",help_aria:"Aide : liens Zigbee",admin_only:"Les données de topologie sont réservées aux administrateurs Home Assistant.",save_first:"Enregistrez ce réglage avant de charger les données de topologie.",zha:"ZHA",zha_read:"Lire les données ZHA",zha_hint:"Lit la topologie en cache de ZHA sans lancer d’analyse radio.",z2m:"Zigbee2MQTT",z2m_topics:"Topics de base (un par ligne)",z2m_update:"Actualiser la carte",z2m_warning:"L’analyse de la carte réseau peut durer de 10 secondes à 2 minutes et réduire temporairement la réactivité de Zigbee.",status_idle:"Données non chargées",status_loading:"Chargement…",status_ready:"Reçu : {time}",status_stale:"Reçu : {time} · obsolète",status_partial:"Reçu : {time} · certains nœuds sont omis",status_no_links:"Reçu : {time} · aucun lien observé trouvé",error_permission:"Les droits administrateur sont requis.",error_unsupported:"Ce fournisseur ou l’API Home Assistant n’est pas disponible.",error_timeout:"Le fournisseur n’a pas répondu à temps.",error_invalid_topic:"Vérifiez le topic de base Zigbee2MQTT.",error_invalid_payload:"Le fournisseur a renvoyé des données de topologie non prises en charge.",error_provider:"Impossible de charger les données de topologie.",remote_count:"+{n} dans d’autres espaces",route_device_not_on_plan:"appareil absent du plan",route_coordinator_not_on_plan:"coordinateur absent du plan",route_other_space:"autre espace"};const s="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";export{e as dictionary,s as fingerprint};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";var e={title:"Связи Zigbee",toggle:"Показывать связи Zigbee при наведении на устройство",hint:"Показываются только наблюдаемые прямые соседи. Наведение ничего не запрашивает.",help:"Показывает, с какими устройствами Zigbee каждое связано напрямую. Цвет линии — качество связи (LQI) по той же шкале, что у показателя LQI устройства: красный при 40 и ниже, зелёный при 180 и выше. Пунктир — качество не сообщено. Стрелка ведёт к следующему устройству по пути к координатору: исходящая одна, входящие — те, кто ходит через это устройство. Линия без стрелки — запасной сосед. Это дерево маршрутов, которое строит House Plan, а не путь пакета в эту секунду: подпись на конце стрелки значит, что цель не на этом плане, а отсутствие стрелки — что путь неизвестен. Данные из последней загрузки и устаревают, связи видны только при работе мышью.",help_aria:"Справка: связи Zigbee",admin_only:"Данные топологии доступны только администраторам Home Assistant.",save_first:"Сохраните настройку перед загрузкой данных топологии.",zha:"ZHA",zha_read:"Прочитать данные ZHA",zha_hint:"Читает сохранённую топологию ZHA и не запускает радио-сканирование.",z2m:"Zigbee2MQTT",z2m_topics:"Базовые топики (по одному в строке)",z2m_update:"Обновить карту",z2m_warning:"Сканирование карты сети занимает от 10 секунд до 2 минут и временно может снизить отзывчивость Zigbee.",status_idle:"Данные не загружены",status_loading:"Загрузка…",status_ready:"Получено: {time}",status_stale:"Получено: {time} · данные устарели",status_partial:"Получено: {time} · часть узлов не показана",status_no_links:"Получено: {time} · наблюдаемые связи не найдены",error_permission:"Нужны права администратора.",error_unsupported:"Провайдер или API Home Assistant недоступен.",error_timeout:"Провайдер не ответил вовремя.",error_invalid_topic:"Проверьте базовый топик Zigbee2MQTT.",error_invalid_payload:"Провайдер вернул неподдерживаемые данные топологии.",error_provider:"Не удалось загрузить данные топологии.",remote_count:"+{n} в других пространствах",route_device_not_on_plan:"устройства нет на плане",route_coordinator_not_on_plan:"координатора нет на плане",route_other_space:"другое пространство"};const t="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";export{e as dictionary,t as fingerprint};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";var e={title:"Связи Zigbee",toggle:"Показывать связи Zigbee при наведении на устройство",hint:"Показываются только наблюдаемые прямые соседи. Наведение ничего не запрашивает.",help:"Показывает, с какими устройствами Zigbee каждое связано напрямую. Цвет линии — качество связи (LQI) по той же шкале, что у показателя LQI устройства: красный при 40 и ниже, зелёный при 180 и выше. Пунктир — качество не сообщено. Стрелка ведёт к следующему устройству по пути к координатору: исходящая одна, входящие — те, кто ходит через это устройство. Линия без стрелки — запасной сосед. Это дерево маршрутов, которое строит House Plan, а не путь пакета в эту секунду: подпись на конце стрелки значит, что цель не на этом плане, а отсутствие стрелки — что путь неизвестен. Данные из последней загрузки и устаревают, связи видны только при работе мышью.",help_aria:"Справка: связи Zigbee",admin_only:"Данные топологии доступны только администраторам Home Assistant.",save_first:"Сохраните настройку перед загрузкой данных топологии.",zha:"ZHA",zha_read:"Прочитать данные ZHA",zha_hint:"Читает сохранённую топологию ZHA и не запускает радио-сканирование.",z2m:"Zigbee2MQTT",z2m_topics:"Базовые топики (по одному в строке)",z2m_update:"Обновить карту",z2m_warning:"Сканирование карты сети занимает от 10 секунд до 2 минут и временно может снизить отзывчивость Zigbee.",status_idle:"Данные не загружены",status_loading:"Загрузка…",status_ready:"Получено: {time}",status_stale:"Получено: {time} · данные устарели",status_partial:"Получено: {time} · часть узлов не показана",status_no_links:"Получено: {time} · наблюдаемые связи не найдены",error_permission:"Нужны права администратора.",error_unsupported:"Провайдер или API Home Assistant недоступен.",error_timeout:"Провайдер не ответил вовремя.",error_invalid_topic:"Проверьте базовый топик Zigbee2MQTT.",error_invalid_payload:"Провайдер вернул неподдерживаемые данные топологии.",error_provider:"Не удалось загрузить данные топологии.",remote_count:"+{n} в других пространствах",route_device_not_on_plan:"устройства нет на плане",route_coordinator_not_on_plan:"координатора нет на плане",route_other_space:"другое пространство"};const a="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";export{e as dictionary,a as fingerprint};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{n as t,c as n}from"./zigbee-topology-TeOwXMvQ.js";import{aM as e}from"./houseplan-card-Bg60kMOY.js";import"./namespace-language-zq-hVFq8.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__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{n as t,c as n}from"./zigbee-topology-DeK7D_ZA.js";import{aM as e}from"./houseplan-card-CsJWLJ0i.js";import"./namespace-language-CpeRC5ot.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};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";try{await import("./houseplan-assets/houseplan-card-Bg60kMOY.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__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";try{await import("./houseplan-assets/houseplan-card-CsJWLJ0i.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 -3
View File
@@ -23,7 +23,7 @@ const read = (ids) => page.evaluate(([white, tinted]) => {
const marker = (id) => root.querySelector(`.devlayer .dev:not(.iso-tile-shadow)[data-id="${id}"]`);
const twin = (id) => root.querySelector(`.iso-tile-shadows .iso-tile-shadow[data-shadow-of="${id}"]`);
const shadow = (id) => {
const s = twin(id)?.querySelector('.device-core');
const s = twin(id);
const m = s && getComputedStyle(s).boxShadow
.match(/rgba?\(28, 32, 28(?:, ([\d.]+))?\) (-?[\d.]+)px (-?[\d.]+)px ([\d.]+)px (-?[\d.]+)px/);
return m ? { a: Number(m[1] ?? 1), dx: +m[2], dy: +m[3], blur: +m[4], spread: +m[5] } : null;
@@ -36,7 +36,7 @@ const read = (ids) => page.evaluate(([white, tinted]) => {
const edge = cs.boxShadow.match(/^(rgba?\([^)]*\)) 0px ([\d.]+)px 0px/);
const frame = dev.querySelector('.device-shell-frame');
const rect = core.getBoundingClientRect();
const twinCore = twin(id)?.querySelector('.device-core')?.getBoundingClientRect();
const twinCore = twin(id)?.getBoundingClientRect();
return {
w: rect.width, h: rect.height, top: rect.top,
radius: px(cs.borderTopLeftRadius), bg: cs.backgroundColor,
@@ -59,7 +59,8 @@ const read = (ids) => page.evaluate(([white, tinted]) => {
twinsInert: [...root.querySelectorAll('.iso-tile-shadow')].every((s) => getComputedStyle(s).pointerEvents === 'none'
&& s.getAttribute('aria-hidden') === 'true' && !s.hasAttribute('tabindex')),
twinsGeometryOnly: [...root.querySelectorAll('.iso-tile-shadows .dev.iso-tile-shadow')]
.every((s) => !s.querySelector('ha-icon, .device-pulse, .activity-dot, .newdot, .habadge, .lqi')),
.every((s) => !s.querySelector('ha-icon, .device-pulse, .activity-dot, .newdot, .habadge, .lqi')
&& (s.querySelector('.value-badge') || s.childElementCount === 0)),
badgeGap: (() => {
const dev = marker('d_temp');
const core = dev?.querySelector('.device-core')?.getBoundingClientRect();
+204 -204
View File
@@ -1,280 +1,280 @@
{
"schema": 1,
"fingerprint": "f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260",
"fingerprint": "5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 294341,
"initialViewGzipBytes": 294352,
"initialPanelFiles": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-panel.js"
],
"initialPanelGzipBytes": 295864,
"initialPanelGzipBytes": 295876,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
"initialPanelOnlyGzipBytes": 2328,
"lazyFiles": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/de-V5cC3Ttx.js",
"houseplan-assets/editor-liOE3B_G.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/fr-1B8rWKlk.js",
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-editor-runtime-BdZH8eJV.js",
"houseplan-assets/houseplan-onboarding-runtime-BvtG2OkS.js",
"houseplan-assets/hp-zigbee-topology-overlay-uftP7bY8.js",
"houseplan-assets/iso-scene-render-D89RXWBh.js",
"houseplan-assets/live-interaction-runtime-GxNGZK19.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/pdf-export-fThz_nIS.js",
"houseplan-assets/summary-panel-runtime-loaded-D0fIG-Q3.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js",
"houseplan-assets/zigbee-topology-runtime-BWxSwRhe.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/de-MzlGbnY6.js",
"houseplan-assets/editor-BX1SnD4J.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/fr-TPa5lJV2.js",
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-editor-runtime-DKrm0hOr.js",
"houseplan-assets/houseplan-onboarding-runtime-CBD6sBWn.js",
"houseplan-assets/hp-zigbee-topology-overlay-Cpu0oI1Z.js",
"houseplan-assets/iso-scene-render-bYK4WMxT.js",
"houseplan-assets/live-interaction-runtime-bLPjsVWC.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/pdf-export-C8uHUxp0.js",
"houseplan-assets/summary-panel-runtime-loaded-B3IRdSqz.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js",
"houseplan-assets/zigbee-topology-runtime-DnryinZD.js"
],
"lazyGzipBytes": 450776,
"lazyGzipBytes": 450768,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/editor-liOE3B_G.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-editor-runtime-BdZH8eJV.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/editor-BX1SnD4J.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-editor-runtime-DKrm0hOr.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js"
],
"lazyEditorGzipBytes": 232079,
"lazyEditorGzipBytes": 232072,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-onboarding-runtime-BvtG2OkS.js",
"houseplan-assets/namespace-language-zq-hVFq8.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-onboarding-runtime-CBD6sBWn.js",
"houseplan-assets/namespace-language-CpeRC5ot.js"
],
"lazyOnboardingGzipBytes": 27955,
"lazyOnboardingGzipBytes": 27953,
"lazyLocaleFiles": [
"houseplan-assets/de-V5cC3Ttx.js",
"houseplan-assets/fr-1B8rWKlk.js"
"houseplan-assets/de-MzlGbnY6.js",
"houseplan-assets/fr-TPa5lJV2.js"
],
"lazyLocaleGzipBytes": 55695,
"lazyLocaleGzipBytes": 55694,
"lazyIsometricFiles": [
"houseplan-assets/iso-scene-render-D89RXWBh.js"
"houseplan-assets/iso-scene-render-bYK4WMxT.js"
],
"lazyIsometricGzipBytes": 19196,
"lazyIsometricGzipBytes": 19200,
"lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js"
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js"
],
"lazyFurnitureArtGzipBytes": 16939,
"lazyFurnitureArtGzipBytes": 16937,
"lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/pdf-export-fThz_nIS.js"
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/pdf-export-C8uHUxp0.js"
],
"lazyPdfGzipBytes": 126825,
"lazyPdfGzipBytes": 126822,
"lazyNamespaceLocaleFiles": [
"houseplan-assets/settings-de-BMHTQ472.js",
"houseplan-assets/settings-fr-D8SL6nFA.js",
"houseplan-assets/settings-ru-BumtHm9r.js",
"houseplan-assets/support-de-CktcHcBj.js",
"houseplan-assets/support-fr-DVTMYo_D.js",
"houseplan-assets/support-ru-CzccOaBw.js",
"houseplan-assets/topology-de-D6B49_YR.js",
"houseplan-assets/topology-fr-BFckU28X.js",
"houseplan-assets/topology-ru-DChJy_0v.js"
"houseplan-assets/settings-de-DfuQAgfj.js",
"houseplan-assets/settings-fr-D6JfaJvC.js",
"houseplan-assets/settings-ru-CDvH04mr.js",
"houseplan-assets/support-de-L7KPiwIU.js",
"houseplan-assets/support-fr-DObaY7qr.js",
"houseplan-assets/support-ru-BgA3Xha3.js",
"houseplan-assets/topology-de-CWbqZHe1.js",
"houseplan-assets/topology-fr-DBsnwXZ7.js",
"houseplan-assets/topology-ru-BLfywUB4.js"
],
"lazyNamespaceLocaleGzipBytes": 21069,
"lazyNamespaceLocaleGzipBytes": 21071,
"files": [
{
"path": "houseplan-assets/backdrop-pick-BrHmkBKG.js",
"sha256": "74a43a21d9a75b867451b67bd2b24473c078fbe1b46ad986c17afaf911444c81",
"path": "houseplan-assets/backdrop-pick-CI0n5n1p.js",
"sha256": "7c2c0e0f79ad856ec7ad1f5dbebabb78fb4a4a1b5bf6806917ba1dffe382a6d1",
"rawBytes": 54017,
"gzipBytes": 17577,
"gzipBytes": 17576,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js"
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js"
],
"dynamicImports": [
"houseplan-assets/settings-de-BMHTQ472.js",
"houseplan-assets/settings-fr-D8SL6nFA.js",
"houseplan-assets/settings-ru-BumtHm9r.js"
"houseplan-assets/settings-de-DfuQAgfj.js",
"houseplan-assets/settings-fr-D6JfaJvC.js",
"houseplan-assets/settings-ru-CDvH04mr.js"
]
},
{
"path": "houseplan-assets/de-V5cC3Ttx.js",
"sha256": "a54d34755d17b0dcf8c67f06c5a44270aa92e432604212c8cae5cd09b81a5a0f",
"path": "houseplan-assets/de-MzlGbnY6.js",
"sha256": "01c76b83e3a5017b43a791662e10788e9550b87ebb7cb062d69068a27a7018f3",
"rawBytes": 93055,
"gzipBytes": 28072,
"gzipBytes": 28073,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-liOE3B_G.js",
"sha256": "ad91e43587567e1aad1cc8f183a9b98ba470562464c5801f1e7995b7174a9c89",
"path": "houseplan-assets/editor-BX1SnD4J.js",
"sha256": "c8727ce296b1881ea166eaa20d72994108cd933699234d5bb0471e17e3c93f2a",
"rawBytes": 3833,
"gzipBytes": 1585,
"gzipBytes": 1582,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/form-kit.styles-BgPQk8cY.js",
"sha256": "5c8d359ddba20c58a58d9d86453048b20d272645e43db50e938884c65f9f6316",
"path": "houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"sha256": "e05caa7bdc0bc58bea69c67f219c2c90d4c0bd6ec33d9b0a404f651474d77f18",
"rawBytes": 25600,
"gzipBytes": 5056,
"gzipBytes": 5057,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-1B8rWKlk.js",
"sha256": "3d4866972e9bbd0dc74db2e66c71f8cbd4057b645a6045d5a1bcba8f7581b972",
"path": "houseplan-assets/fr-TPa5lJV2.js",
"sha256": "07a55ae1b2ca8f29bcbbd6ec26142de5dd6d0e8d461fd291bded4b1726b356c7",
"rawBytes": 95410,
"gzipBytes": 27623,
"gzipBytes": 27621,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"sha256": "be2661e9238752f64efcebe95e25a8785bca4b62fb386eb42f0f2a0a84f2670d",
"path": "houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"sha256": "11acb923c573540fe195017ebabca3f7ffab03002e410ee05219e44aa8b12239",
"rawBytes": 52035,
"gzipBytes": 16939,
"gzipBytes": 16937,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-Bg60kMOY.js",
"sha256": "438b20a04573d2c00e56f9c60f3e220fff6fa943642e248290439dfd79b28d6e",
"rawBytes": 1038728,
"gzipBytes": 293536,
"path": "houseplan-assets/houseplan-card-CsJWLJ0i.js",
"sha256": "70eb7e82a41fc589afd8e26a4dcc36b0ec4329ae95b46ff50fd54f578982c9a2",
"rawBytes": 1038664,
"gzipBytes": 293548,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-V5cC3Ttx.js",
"houseplan-assets/editor-liOE3B_G.js",
"houseplan-assets/fr-1B8rWKlk.js",
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-editor-runtime-BdZH8eJV.js",
"houseplan-assets/houseplan-onboarding-runtime-BvtG2OkS.js",
"houseplan-assets/hp-zigbee-topology-overlay-uftP7bY8.js",
"houseplan-assets/iso-scene-render-D89RXWBh.js",
"houseplan-assets/live-interaction-runtime-GxNGZK19.js",
"houseplan-assets/pdf-export-fThz_nIS.js",
"houseplan-assets/summary-panel-runtime-loaded-D0fIG-Q3.js"
"houseplan-assets/de-MzlGbnY6.js",
"houseplan-assets/editor-BX1SnD4J.js",
"houseplan-assets/fr-TPa5lJV2.js",
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-editor-runtime-DKrm0hOr.js",
"houseplan-assets/houseplan-onboarding-runtime-CBD6sBWn.js",
"houseplan-assets/hp-zigbee-topology-overlay-Cpu0oI1Z.js",
"houseplan-assets/iso-scene-render-bYK4WMxT.js",
"houseplan-assets/live-interaction-runtime-bLPjsVWC.js",
"houseplan-assets/pdf-export-C8uHUxp0.js",
"houseplan-assets/summary-panel-runtime-loaded-B3IRdSqz.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-BdZH8eJV.js",
"sha256": "fdbc8fd4391072be91a2be1f2c00899ca05bbe46e654dd20ade4dd613958f5c0",
"path": "houseplan-assets/houseplan-editor-runtime-DKrm0hOr.js",
"sha256": "37a6010ce33d42ab4bdb02e24acd0b9a59ebba7aa2df4dd3b9657ce223a0f73b",
"rawBytes": 667537,
"gzipBytes": 186206,
"gzipBytes": 186207,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js"
],
"dynamicImports": [
"houseplan-assets/support-de-CktcHcBj.js",
"houseplan-assets/support-fr-DVTMYo_D.js",
"houseplan-assets/support-ru-CzccOaBw.js",
"houseplan-assets/zigbee-topology-runtime-BWxSwRhe.js"
"houseplan-assets/support-de-L7KPiwIU.js",
"houseplan-assets/support-fr-DObaY7qr.js",
"houseplan-assets/support-ru-BgA3Xha3.js",
"houseplan-assets/zigbee-topology-runtime-DnryinZD.js"
]
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-BvtG2OkS.js",
"sha256": "275d9cd6abb3a68b5037f62253de1b6de72a8537c791391e46b1cc84ec641aa7",
"path": "houseplan-assets/houseplan-onboarding-runtime-CBD6sBWn.js",
"sha256": "afb732f1076716cb98f8abf8d7e1acb4c37082150255bf71f020a61d0a176d6a",
"rawBytes": 15886,
"gzipBytes": 4910,
"gzipBytes": 4908,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-BrHmkBKG.js",
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js"
"houseplan-assets/backdrop-pick-CI0n5n1p.js",
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/hp-zigbee-topology-overlay-uftP7bY8.js",
"sha256": "2d38d83e841ef117d5274b8ef39ff8a44f43d4e3be81439f36a5fa0b1d111928",
"path": "houseplan-assets/hp-zigbee-topology-overlay-Cpu0oI1Z.js",
"sha256": "1ec6363ceeec655751fa30d1ecacc777570fed4323b8a0c7c244c8f2dfda58e7",
"rawBytes": 10958,
"gzipBytes": 3767,
"gzipBytes": 3766,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js",
"houseplan-assets/zigbee-topology-runtime-BWxSwRhe.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js",
"houseplan-assets/zigbee-topology-runtime-DnryinZD.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/iso-scene-render-D89RXWBh.js",
"sha256": "bf457a5d9e19305506fc4ff4d1a5766065dadd8271fc6c8cc09f358b09575ed7",
"path": "houseplan-assets/iso-scene-render-bYK4WMxT.js",
"sha256": "cc2f2032067302fb2bdce84c2176b43ffe643d52ef5ec06282da9bce9249054d",
"rawBytes": 56457,
"gzipBytes": 19196,
"gzipBytes": 19200,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/live-interaction-runtime-GxNGZK19.js",
"sha256": "34e7fd38751a83786ddfef5867d28d82bf44b4f9831b20c4dee64938a33fa759",
"path": "houseplan-assets/live-interaction-runtime-bLPjsVWC.js",
"sha256": "a904a928da1c7073c9209f6ed0e702cbf2370f9329514ba28c967eb46af9a7cc",
"rawBytes": 8216,
"gzipBytes": 3208,
"gzipBytes": 3211,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/namespace-language-zq-hVFq8.js",
"sha256": "95a270960cadae44805559de7367a4143435f3fc67d18282689bb20c6e69e014",
"path": "houseplan-assets/namespace-language-CpeRC5ot.js",
"sha256": "479c62b55bdddd4c1a2ce4a9d73452db4a0518c60d31b1d045c7174e188c3e03",
"rawBytes": 675,
"gzipBytes": 412,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/pdf-export-fThz_nIS.js",
"sha256": "f12f8a157465ef89b115eac254e39f4bfb9d6a428c6444dd5d38d243145c8380",
"path": "houseplan-assets/pdf-export-C8uHUxp0.js",
"sha256": "580b25926708c36fb4f85430d343bf1bdea959e1bf12248886d0066649834508",
"rawBytes": 236264,
"gzipBytes": 109886,
"gzipBytes": 109885,
"isEntry": false,
"imports": [
"houseplan-assets/furniture-plan-art.generated-TlsAq89U.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/furniture-plan-art.generated-B78c9LdB.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/settings-de-BMHTQ472.js",
"sha256": "b16c103ebed5c1e56bcfa42b97dc2d5fee85358d891447e114e941bffce1bd56",
"path": "houseplan-assets/settings-de-DfuQAgfj.js",
"sha256": "b047ba600986bb7f9be67ef5d650142dd8f224307709bfb1e36d72d84f2abc90",
"rawBytes": 7378,
"gzipBytes": 2880,
"gzipBytes": 2881,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/settings-fr-D8SL6nFA.js",
"sha256": "80b5a2ae94a6ee28edecfa719ab0dfaa140b78f5ff746555bc82153bbe5fdd81",
"path": "houseplan-assets/settings-fr-D6JfaJvC.js",
"sha256": "4a49c5142087707bcbad3ddd4c95d0ecd7cfe08191b2a463f7d632157a469c6c",
"rawBytes": 7620,
"gzipBytes": 2843,
"isEntry": false,
@@ -282,8 +282,8 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/settings-ru-BumtHm9r.js",
"sha256": "12bb199843170225f3530fc0e36a54d239da03a7f34ecc304f7c8fbfa0b5d1ae",
"path": "houseplan-assets/settings-ru-CDvH04mr.js",
"sha256": "957a51c026f91167bb01cbf6af5b09bac180257de28a85317f3d26d1a1eb7f6b",
"rawBytes": 10304,
"gzipBytes": 3326,
"isEntry": false,
@@ -291,56 +291,56 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-editor-BkZaI2dp.js",
"sha256": "f9162891a45296b376dbc55edde9385542461fc1d29d95921a33ea0e96b86d6c",
"rawBytes": 14862,
"gzipBytes": 3427,
"path": "houseplan-assets/summary-panel-editor-Bywe1bcT.js",
"sha256": "a799abcd27d96451bc583f40968c369e6c2cebef22e8ed2d840c71fff6dedf2d",
"rawBytes": 14867,
"gzipBytes": 3432,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/summary-panel-runtime-loaded-D0fIG-Q3.js"
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/summary-panel-runtime-loaded-B3IRdSqz.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-metrics-DzfhHOP_.js",
"sha256": "558994e1af0d59e45390f77c1829340bedbecc844716707c8d4c4b08e3d51245",
"path": "houseplan-assets/summary-panel-metrics-CloidLW8.js",
"sha256": "ce5eccc78a9af678800fa7e42e581428a8c3098b42853a9dc085c7287c7b34ce",
"rawBytes": 2611,
"gzipBytes": 1309,
"gzipBytes": 1308,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-runtime-loaded-D0fIG-Q3.js",
"sha256": "a830e752eeaafe128add5d7eef3e4e580e5d6da8d08a2612f2bacd200d7938a9",
"path": "houseplan-assets/summary-panel-runtime-loaded-B3IRdSqz.js",
"sha256": "d84c831ba31db0fd668cb5369b2077221a8beb4c10e64744b72c02a2623998c0",
"rawBytes": 72956,
"gzipBytes": 20242,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-BgPQk8cY.js",
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/form-kit.styles-Ok4N7QdY.js",
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": [
"houseplan-assets/summary-panel-editor-BkZaI2dp.js",
"houseplan-assets/summary-panel-metrics-DzfhHOP_.js"
"houseplan-assets/summary-panel-editor-Bywe1bcT.js",
"houseplan-assets/summary-panel-metrics-CloidLW8.js"
]
},
{
"path": "houseplan-assets/support-de-CktcHcBj.js",
"sha256": "11123e521d135ebea86ed1ec7339dc90d974e7bb825f6be48adc92e282304b5e",
"path": "houseplan-assets/support-de-L7KPiwIU.js",
"sha256": "36ec6978dfee4aa9e137231462e5feeeb7a325dd8cef6653648bc67068f7a7b4",
"rawBytes": 6167,
"gzipBytes": 2398,
"gzipBytes": 2399,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/support-fr-DVTMYo_D.js",
"sha256": "65ecb04f3752aeb754eaac3d4b3160df74874b4b4f9eb8c18c7133de36026c4b",
"path": "houseplan-assets/support-fr-DObaY7qr.js",
"sha256": "770b58fa270b976c40199d504579711ca3fa3474c3516c5d761be9e18a40c04c",
"rawBytes": 6333,
"gzipBytes": 2433,
"isEntry": false,
@@ -348,17 +348,17 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/support-ru-CzccOaBw.js",
"sha256": "89badfdf3f8173fadf058269fd877fecf991c0473a6a93f1cd2c779ef46502a8",
"path": "houseplan-assets/support-ru-BgA3Xha3.js",
"sha256": "f93574aeda55492d327e306ac91d64413bffcc2bfa6ba88ea8c3ecf70cb9f85a",
"rawBytes": 8376,
"gzipBytes": 2876,
"gzipBytes": 2878,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/topology-de-D6B49_YR.js",
"sha256": "21c338625cbb25232b3d9586d2f27666c3262de4770a7ce3b2c09ee13692bd16",
"path": "houseplan-assets/topology-de-CWbqZHe1.js",
"sha256": "7dda3cdf32dde949d2b5048b5292d4ba49b4aad2c2634089cb7f4356a37a9ccc",
"rawBytes": 2698,
"gzipBytes": 1339,
"isEntry": false,
@@ -366,71 +366,71 @@
"dynamicImports": []
},
{
"path": "houseplan-assets/topology-fr-BFckU28X.js",
"sha256": "d2e8f64e3bf668e545ca365d5c6ae3ec5d1dbe16649ae315b6cafb5eaef0f567",
"path": "houseplan-assets/topology-fr-DBsnwXZ7.js",
"sha256": "129a6552fc9b76ee486a110210f395a932f58991947ba57bae6ebc68bdce52f7",
"rawBytes": 2718,
"gzipBytes": 1357,
"gzipBytes": 1356,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/topology-ru-DChJy_0v.js",
"sha256": "83e7c562c23041767fe89d97ad4fa6f7fa9c01aee935babf6c5811ab59d45c35",
"path": "houseplan-assets/topology-ru-BLfywUB4.js",
"sha256": "e9a890c120a79f9c34a05a0240a33daaf43a462d418fe29754501b673bc5cae2",
"rawBytes": 3669,
"gzipBytes": 1617,
"gzipBytes": 1616,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-runtime-BWxSwRhe.js",
"sha256": "f4654a348362647ae149785f68e8f9ea196b7ddab3a7d53812ae6d039b3a1a13",
"rawBytes": 3983,
"gzipBytes": 1793,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js",
"houseplan-assets/zigbee-topology-TeOwXMvQ.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-TeOwXMvQ.js",
"sha256": "84c0c429c8663ab3ad8673f816ab38e29a87cc9663903e037ccb930b01f3a263",
"path": "houseplan-assets/zigbee-topology-DeK7D_ZA.js",
"sha256": "026c63361c50d7f6648846cd08488befd3c738c1526ac16400f37876d300d707",
"rawBytes": 10958,
"gzipBytes": 4304,
"gzipBytes": 4301,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js",
"houseplan-assets/namespace-language-zq-hVFq8.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js"
],
"dynamicImports": [
"houseplan-assets/topology-de-D6B49_YR.js",
"houseplan-assets/topology-fr-BFckU28X.js",
"houseplan-assets/topology-ru-DChJy_0v.js"
"houseplan-assets/topology-de-CWbqZHe1.js",
"houseplan-assets/topology-fr-DBsnwXZ7.js",
"houseplan-assets/topology-ru-BLfywUB4.js"
]
},
{
"path": "houseplan-assets/zigbee-topology-runtime-DnryinZD.js",
"sha256": "24764adb11071cf7625d167fcda6860ee19b1d1a8f1a99f57d6b8526e099be93",
"rawBytes": 3983,
"gzipBytes": 1790,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CsJWLJ0i.js",
"houseplan-assets/namespace-language-CpeRC5ot.js",
"houseplan-assets/zigbee-topology-DeK7D_ZA.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "7fdb4c193f8b038df40717557b5dc2eba6550080e916734b64b5cce815a3059b",
"sha256": "5aca9a864d90f63602befe184164ef9db73e91b141f34c7cf690d9c447cfc6e1",
"rawBytes": 1205,
"gzipBytes": 805,
"gzipBytes": 804,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
"sha256": "69a82abf193431e19830f896f9481e32e3669f8b1bd1b6808c259994ccdfeb3f",
"sha256": "3dc1cc41f9a0ce7627fb3f4dcfaea0541d95d120b6ba6700564bc2a6d93bbd24",
"rawBytes": 6165,
"gzipBytes": 2328,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-Bg60kMOY.js"
"houseplan-assets/houseplan-card-CsJWLJ0i.js"
],
"dynamicImports": []
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,14 +1,14 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{aD as e,l as o,aG as t,ek as s,A as a,el as i,em as l,en as n,E as r,c}from"./houseplan-card-Bg60kMOY.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__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{aD as e,l as o,aG as t,ek as s,A as a,el as i,em as l,en as n,E as r,c}from"./houseplan-card-CsJWLJ0i.js";class f extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,f={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},h=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>h[e.name]||e.name}
.computeLabel=${e=>f[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(f.slice(0,3))}
${d(h.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${d(f.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
${d(h.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}f.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",f);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{ep as a,eq as e,em as n}from"./houseplan-card-CsJWLJ0i.js";function c(n,c){return new a([{code:"en",dictionary:n},{code:"ru",loadDictionary:c.ru},{code:"de",loadDictionary:c.de},{code:"fr",loadDictionary:c.fr}],"5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221",console.warn,e)}function o(a){return function(a,e){return{state:n=>{const c=a.state(n);return"pending"!==c&&e.some(a=>"pending"===a.state(n))?"pending":c},dictionary:e=>a.dictionary(e),ensure:n=>Promise.all([a,...e].map(a=>a.ensure(n))).then(()=>{})}}(n,a)}export{c as n,o as s};
-1
View File
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{ep as e,eq as n,em as a}from"./houseplan-card-Bg60kMOY.js";function o(a,o){return new e([{code:"en",dictionary:a},{code:"ru",loadDictionary:o.ru},{code:"de",loadDictionary:o.de},{code:"fr",loadDictionary:o.fr}],"f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260",console.warn,n)}function r(e){return function(e,n){return{state:a=>{const o=e.state(a);return"pending"!==o&&n.some(e=>"pending"===e.state(a))?"pending":o},dictionary:n=>e.dictionary(n),ensure:a=>Promise.all([e,...n].map(e=>e.ensure(a))).then(()=>{})}}(a,e)}export{o as n,r as s};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{c as a,A as e}from"./houseplan-card-Bg60kMOY.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-D0fIG-Q3.js";import"./form-kit.styles-BgPQk8cY.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__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{c as a,A as s}from"./houseplan-card-CsJWLJ0i.js";import{s as e,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-B3IRdSqz.js";import"./form-kit.styles-Ok4N7QdY.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&&!e(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(s=>s.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"
@@ -10,31 +10,31 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
dismiss-on-scrim aria-busy=${String(d.busy)}
@hp-close=${k}>
<div class="body summary-editor" @click=${()=>m.closeSource()}>
${d.localOnly?a`<p class="summary-local-hint">${b(d.localOnlyHint)}</p>`:e}
${d.localOnly?a`<p class="summary-local-hint">${b(d.localOnlyHint)}</p>`:s}
<section class="summary-general" aria-labelledby="summary-general-title">
<h3 id="summary-general-title">${b("summary.general_settings")}</h3>
<div class="summary-general-grid">
${d.localOnly?e:a`<div class="summary-field">
${d.localOnly?s:a`<div class="summary-field">
<label for="summary-panel-title">${b("summary.panel_title")}</label>
<input id="summary-panel-title" type="text" .value=${d.draft.title}
?disabled=${d.busy}
data-summary-error=${String(d.attempted&&"title"===y?.path)}
aria-invalid=${"error"===v("title")?.kind?"true":"false"}
@input=${a=>m.mutate(e=>{e.title=a.target.value})} />
${v("title")?a`<div class="summary-problem error">${h(v("title"))}</div>`:e}
@input=${a=>m.mutate(s=>{s.title=a.target.value})} />
${v("title")?a`<div class="summary-problem error">${h(v("title"))}</div>`:s}
</div>`}
${g}
${d.localOnly?e:a`<label class="summary-switch" for="summary-mobile-show">
${d.localOnly?s:a`<label class="summary-switch" for="summary-mobile-show">
<span class="summary-switch-caption"><strong>${b("summary.show_mobile")}</strong>
<small id="summary-mobile-show-hint">${b("summary.show_mobile_hint")}</small></span>
<input id="summary-mobile-show" data-summary-mobile-show type="checkbox"
.checked=${d.draft.show_on_mobile} ?disabled=${!d.localShow||d.busy}
aria-label=${b("summary.show_mobile")} aria-describedby="summary-mobile-show-hint"
@change=${a=>m.mutate(e=>{e.show_on_mobile=a.target.checked})} /></label>`}
@change=${a=>m.mutate(s=>{s.show_on_mobile=a.target.checked})} /></label>`}
</div>
${m.storageUnavailable?a`<div class="summary-problem warning">${b("summary.storage_unavailable")}</div>`:e}
${m.storageUnavailable?a`<div class="summary-problem warning">${b("summary.storage_unavailable")}</div>`:s}
</section>
${d.localOnly?e:a`
${d.localOnly?s:a`
<section class="summary-blocks-card" aria-labelledby="summary-blocks-title">
<header class="summary-blocks-heading">
<div><h3 id="summary-blocks-title">${b("summary.blocks")}</h3>
@@ -42,7 +42,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
<span class="summary-block-count">${b("summary.block_count").replace("{count}",String(d.draft.blocks.length)).replace("{limit}","10")}</span>
</header>
<div class="summary-editor-blocks">
${d.draft.blocks.map((s,t)=>{const u=`blocks.${t}`,n=v(`${u}.scope`);return a`<article class="summary-editor-block"
${d.draft.blocks.map((e,t)=>{const u=`blocks.${t}`,n=v(`${u}.scope`);return a`<article class="summary-editor-block"
@dragover=${a=>a.preventDefault()}
@drop=${a=>m.drop(a,`block:${t}`)}>
<div class="summary-block-head">
@@ -57,40 +57,40 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
?disabled=${t===d.draft.blocks.length-1||d.busy}
@click=${()=>m.mutate(a=>{a.blocks=r(a.blocks,t,t+1)})}>${l("down")}</button>
</div>
<input class="summary-block-title" type="text" .value=${s.title}
<input class="summary-block-title" type="text" .value=${e.title}
placeholder=${b("summary.block_title")} aria-label=${b("summary.block_title")}
?disabled=${d.busy}
data-summary-error=${String(d.attempted&&y?.path===`${u}.title`)}
aria-invalid=${"error"===v(`${u}.title`)?.kind?"true":"false"}
@input=${a=>m.mutate(e=>{e.blocks[t].title=a.target.value})} />
@input=${a=>m.mutate(s=>{s.blocks[t].title=a.target.value})} />
<button class="summary-icon-button summary-visibility" type="button"
?disabled=${d.busy} aria-pressed=${String(s.visible)}
title=${b(s.visible?"summary.hide_block":"summary.show_block")}
aria-label=${b(s.visible?"summary.hide_block":"summary.show_block")}
@click=${()=>m.mutate(a=>{a.blocks[t].visible=!a.blocks[t].visible})}>${l(s.visible?"eye":"eyeOff")}</button>
${v(`${u}.title`)?a`<div class="summary-problem error summary-block-title-error">${h(v(`${u}.title`))}</div>`:e}
?disabled=${d.busy} aria-pressed=${String(e.visible)}
title=${b(e.visible?"summary.hide_block":"summary.show_block")}
aria-label=${b(e.visible?"summary.hide_block":"summary.show_block")}
@click=${()=>m.mutate(a=>{a.blocks[t].visible=!a.blocks[t].visible})}>${l(e.visible?"eye":"eyeOff")}</button>
${v(`${u}.title`)?a`<div class="summary-problem error summary-block-title-error">${h(v(`${u}.title`))}</div>`:s}
<div class="summary-scope">
<select .value=${s.scope.type} ?disabled=${d.busy}
<select .value=${e.scope.type} ?disabled=${d.busy}
aria-label=${b("summary.scope")}
@change=${a=>m.mutate(e=>{e.blocks[t].scope="space"===a.target.value?{type:"space",space_id:c._space}:{type:"all"}})}>
<option value="all" ?selected=${"all"===s.scope.type}>${b("summary.scope_all")}</option>
<option value="space" ?selected=${"space"===s.scope.type}>${b("summary.scope_space")}</option>
@change=${a=>m.mutate(s=>{s.blocks[t].scope="space"===a.target.value?{type:"space",space_id:c._space}:{type:"all"}})}>
<option value="all" ?selected=${"all"===e.scope.type}>${b("summary.scope_all")}</option>
<option value="space" ?selected=${"space"===e.scope.type}>${b("summary.scope_space")}</option>
</select>
${"space"===s.scope.type?a`<select .value=${s.scope.space_id}
${"space"===e.scope.type?a`<select .value=${e.scope.space_id}
?disabled=${d.busy} aria-label=${b("summary.scope_space")}
data-summary-error=${String(d.attempted&&y?.path===`${u}.scope`)}
aria-invalid=${"error"===n?.kind?"true":"false"}
@change=${a=>m.mutate(e=>{const s=e.blocks[t].scope;"space"===s.type&&(s.space_id=a.target.value)})}>
${c._model.some(a=>a.id===s.scope.space_id)?e:a`<option value=${s.scope.space_id} selected>${s.scope.space_id}</option>`}
${c._model.map(e=>a`<option value=${e.id}
?selected=${e.id===s.scope.space_id}>${e.title}</option>`)}
</select>`:e}
@change=${a=>m.mutate(s=>{const e=s.blocks[t].scope;"space"===e.type&&(e.space_id=a.target.value)})}>
${c._model.some(a=>a.id===e.scope.space_id)?s:a`<option value=${e.scope.space_id} selected>${e.scope.space_id}</option>`}
${c._model.map(s=>a`<option value=${s.id}
?selected=${s.id===e.scope.space_id}>${s.title}</option>`)}
</select>`:s}
</div>
${n?a`<div class="summary-problem summary-scope-problem ${n.kind}">${h(n)}</div>`:e}
${n?a`<div class="summary-problem summary-scope-problem ${n.kind}">${h(n)}</div>`:s}
</div>
<div class="summary-block-body">
<div class="summary-editor-values">
${s.values.map((i,c)=>{const n=`${u}.values.${c}`,$=v(`${n}.source`),p=m.sourceToken(i.source),k=d.activeSource?.blockId===s.id&&d.activeSource.valueId===i.id,g="system"===i.source.type?b(`summary.system.${i.source.key}`):i.source.entity_id?m.entityIndex.labels.get(i.source.entity_id)||i.source.entity_id:b("summary.select_source"),_="system"===i.source.type?b("summary.system_source"):i.source.entity_id,f=k?o(m.entityIndex,d.entityFilter):null,w="entity"===i.source.type&&!!i.source.entity_id&&!m.entityIndex.labels.has(i.source.entity_id),S=`${s.id}\n${i.id}`;return a`<div class="summary-editor-value"
${e.values.map((i,c)=>{const n=`${u}.values.${c}`,$=v(`${n}.source`),p=m.sourceToken(i.source),k=d.activeSource?.blockId===e.id&&d.activeSource.valueId===i.id,g="system"===i.source.type?b(`summary.system.${i.source.key}`):i.source.entity_id?m.entityIndex.labels.get(i.source.entity_id)||i.source.entity_id:b("summary.select_source"),_="system"===i.source.type?b("summary.system_source"):i.source.entity_id,f=k?o(m.entityIndex,d.entityFilter):null,w="entity"===i.source.type&&!!i.source.entity_id&&!m.entityIndex.labels.has(i.source.entity_id),S=`${e.id}\n${i.id}`;return a`<div class="summary-editor-value"
@dragover=${a=>{a.preventDefault(),a.stopPropagation()}}
@drop=${a=>m.drop(a,`value:${t}:${c}`)}>
<span class="summary-drag" draggable=${String(!d.busy)} title=${b("summary.drag")}
@@ -101,7 +101,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
@click=${()=>m.mutate(a=>{a.blocks[t].values=r(a.blocks[t].values,c,c-1)})}>${l("up")}</button>
<button class="summary-icon-button" type="button" title=${b("summary.down")}
aria-label=${b("summary.down")}
?disabled=${c===s.values.length-1||d.busy}
?disabled=${c===e.values.length-1||d.busy}
@click=${()=>m.mutate(a=>{a.blocks[t].values=r(a.blocks[t].values,c,c+1)})}>${l("down")}</button>
</div>
<div class="summary-value-label">
@@ -109,8 +109,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
placeholder=${b("summary.value_name")} aria-label=${b("summary.value_name")}
data-summary-error=${String(d.attempted&&y?.path===`${n}.label`)}
aria-invalid=${"error"===v(`${n}.label`)?.kind?"true":"false"}
@input=${a=>m.mutate(e=>{e.blocks[t].values[c].label=a.target.value})} />
${v(`${n}.label`)?a`<div class="summary-problem error">${h(v(`${n}.label`))}</div>`:e}
@input=${a=>m.mutate(s=>{s.blocks[t].values[c].label=a.target.value})} />
${v(`${n}.label`)?a`<div class="summary-problem error">${h(v(`${n}.label`))}</div>`:s}
</div>
<div class="summary-source-field">
<button class="summary-source" type="button"
@@ -119,9 +119,9 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
data-summary-error=${String(d.attempted&&y?.path===`${n}.source`)}
aria-invalid=${"error"===$?.kind?"true":"false"}
aria-haspopup="listbox" aria-expanded=${k?"true":"false"}
@click=${a=>{a.stopPropagation(),k?m.closeSource():m.openSource(s.id,i.id)}}>
@click=${a=>{a.stopPropagation(),k?m.closeSource():m.openSource(e.id,i.id)}}>
<span class="summary-source-caption"><strong>${g}</strong>
${_?a`<small>${_}</small>`:e}</span>
${_?a`<small>${_}</small>`:s}</span>
${l("chevron")}
</button>
${k&&f?a`<div class="summary-source-picker"
@@ -135,39 +135,39 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
<div class="summary-source-results" role="listbox"
aria-label=${b("summary.select_source")}>
<div class="summary-source-group">${b("summary.system_group")}</div>
${["device_count","total_area","datetime"].map(e=>a`
${["device_count","total_area","datetime"].map(s=>a`
<button type="button" role="option"
?disabled=${d.busy}
aria-selected=${p===`system:${e}`?"true":"false"}
@click=${()=>m.setSource(s.id,i.id,`system:${e}`)}>
${b(`summary.system.${e}`)}
aria-selected=${p===`system:${s}`?"true":"false"}
@click=${()=>m.setSource(e.id,i.id,`system:${s}`)}>
${b(`summary.system.${s}`)}
</button>`)}
${w?a`<div class="summary-source-group">${b("summary.current_source")}</div>
<button type="button" role="option" class="broken" aria-selected="true"
?disabled=${d.busy}
@click=${()=>m.setSource(s.id,i.id,p)}>
@click=${()=>m.setSource(e.id,i.id,p)}>
${g}
</button>`:e}
</button>`:s}
<div class="summary-source-group">${b("summary.entities_group")}</div>
${f.entries.map(e=>a`<button type="button" role="option"
${f.entries.map(s=>a`<button type="button" role="option"
?disabled=${d.busy}
aria-selected=${p===`entity:${e.id}`?"true":"false"}
@click=${()=>m.setSource(s.id,i.id,`entity:${e.id}`)}>
<span>${e.label}</span><small>${e.id}</small>
aria-selected=${p===`entity:${s.id}`?"true":"false"}
@click=${()=>m.setSource(e.id,i.id,`entity:${s.id}`)}>
<span>${s.label}</span><small>${s.id}</small>
</button>`)}
${f.total?e:a`<div class="summary-empty">${b("summary.no_search_results")}</div>`}
${f.truncated?a`<div class="summary-refine">${b("summary.refine_search")}</div>`:e}
${f.total?s:a`<div class="summary-empty">${b("summary.no_search_results")}</div>`}
${f.truncated?a`<div class="summary-refine">${b("summary.refine_search")}</div>`:s}
</div>
</div>`:e}
${$?a`<div class="summary-problem ${$.kind}">${h($)}</div>`:e}
</div>`:s}
${$?a`<div class="summary-problem ${$.kind}">${h($)}</div>`:s}
</div>
<button class="summary-icon-button summary-value-remove" type="button"
title=${b("btn.delete")} aria-label=${b("btn.delete")} ?disabled=${d.busy}
@click=${()=>m.mutate(a=>{a.blocks[t].values.splice(c,1)})}>${l("close")}</button>
</div>`})}
<button class="summary-add summary-add-value" type="button"
?disabled=${s.values.length>=20||d.busy}
title=${s.values.length>=20?b("summary.limit_values"):""}
?disabled=${e.values.length>=20||d.busy}
title=${e.values.length>=20?b("summary.limit_values"):""}
@click=${()=>m.mutate(a=>{a.blocks[t].values.push(i())})}>
${l("plus")}${b("summary.add_value")}
</button>
@@ -186,11 +186,11 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602
${l("plus")}${b("summary.add_block")}
</button>
</section>
${d.error?a`<div class="summary-problem error" role="alert">${d.error}</div>`:e}
${d.error?a`<div class="summary-problem error" role="alert">${d.error}</div>`:s}
${d.conflict?a`<button class="btn ghost summary-reload" type="button"
?disabled=${d.busy} @click=${()=>m.reload()}>
<ha-icon icon="mdi:reload"></ha-icon>${b("summary.reload_current")}
</button>`:e}
</button>`:s}
`}
</div>
<div class="row summary-editor-footer" slot="footer">
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{es as e,N as t,b2 as n,L as i,ae as o,ac as r,bZ as s,bY as a,b1 as c,b0 as l,b3 as u,et as d,eu as f,b$ as m,ev as g}from"./houseplan-card-CsJWLJ0i.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,u="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*h(c,l,u=_){try{let d=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=u(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/o;d+=a(v)*_*_/1e4}return d}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function b(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=d(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{h as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,b as summarySystemValue,p as totalCleanFloorAreaM2};
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{es as e,N as t,b2 as n,L as i,ae as o,ac as r,bZ as s,bY as a,b1 as l,b0 as c,b3 as u,et as d,eu as f,b$ as m,ev as g}from"./houseplan-card-Bg60kMOY.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,l="entity"===r?e.registry.entities?.[s]:null,c="device"===r?s:l?.device_id,u="device"===r?a?.area_id:l?.area_id||c&&e.registry.devices?.[c]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;c&&e.registry.devices?.[c]&&e.spaceIds.has(f)&&(!n.devices.has(c)||"entity"===r&&n.liveEntities.has(s))&&t.add(c)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=l(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:c(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*b(l,c,u=_){try{let d=0;for(const f of c){const c=l.spaces.find(e=>String(e?.id)===f.id);if(!c)continue;const m=e(c,f),g=u(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const l=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(l,m.physicalBodies)),yield}const _=m.cellCm/o;d+=a(v)*_*_/1e4}return d}catch{return null}}function h(e,t,n=_){const i=b(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function p(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=d(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{b as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,p as summarySystemValue,h as totalCleanFloorAreaM2};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";var e={title:"Zigbee-Verbindungen",toggle:"Zigbee-Verbindungen beim Darüberfahren über ein Gerät anzeigen",hint:"Es werden nur beobachtete direkte Nachbarn angezeigt. Beim Darüberfahren werden keine Daten abgerufen.",help:"Zeigt, mit welchen Zigbee-Geräten jedes Gerät direkt verbunden ist. Die Linienfarbe ist die Verbindungsqualität (LQI) auf derselben Skala wie der LQI-Wert des Geräts: rot bei 40 und darunter, grün bei 180 und darüber. Eine gestrichelte Linie bedeutet, dass die Qualität nicht gemeldet wurde. Ein Pfeil zeigt auf das nächste Gerät auf dem Weg zum Koordinator: ein Pfeil führt hinaus, eingehende Pfeile sind die Geräte, die über dieses Gerät routen. Eine Linie ohne Pfeil ist ein Ersatznachbar. Das ist der Routenbaum, den House Plan bildet, nicht der Weg eines Pakets in diesem Moment: eine Beschriftung am Pfeilende bedeutet, dass das Ziel nicht auf diesem Plan liegt, und ein fehlender Pfeil, dass die Route unbekannt ist. Die Daten stammen aus dem letzten Laden und veralten; Verbindungen sind nur mit der Maus sichtbar.",help_aria:"Hilfe: Zigbee-Verbindungen",admin_only:"Topologiedaten sind nur für Home-Assistant-Administratoren verfügbar.",save_first:"Speichere diese Einstellung, bevor Topologiedaten geladen werden.",zha:"ZHA",zha_read:"ZHA-Daten lesen",zha_hint:"Liest den ZHA-Topologiecache; es wird kein Funkscan gestartet.",z2m:"Zigbee2MQTT",z2m_topics:"Basistopics (eines pro Zeile)",z2m_update:"Karte aktualisieren",z2m_warning:"Ein Netzwerkscan kann 10 Sekunden bis 2 Minuten dauern und Zigbee vorübergehend verlangsamen.",status_idle:"Daten nicht geladen",status_loading:"Wird geladen…",status_ready:"Empfangen: {time}",status_stale:"Empfangen: {time} · veraltet",status_partial:"Empfangen: {time} · einige Knoten fehlen",status_no_links:"Empfangen: {time} · keine beobachteten Verbindungen gefunden",error_permission:"Administratorrechte sind erforderlich.",error_unsupported:"Dieser Anbieter oder die Home-Assistant-API ist nicht verfügbar.",error_timeout:"Der Anbieter hat nicht rechtzeitig geantwortet.",error_invalid_topic:"Prüfe das Zigbee2MQTT-Basistopic.",error_invalid_payload:"Der Anbieter hat nicht unterstützte Topologiedaten geliefert.",error_provider:"Topologiedaten konnten nicht geladen werden.",remote_count:"+{n} in anderen Bereichen",route_device_not_on_plan:"Gerät ist nicht im Plan",route_coordinator_not_on_plan:"Koordinator ist nicht im Plan",route_other_space:"anderer Bereich"};const n="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";export{e as dictionary,n as fingerprint};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";var e={title:"Zigbee-Verbindungen",toggle:"Zigbee-Verbindungen beim Darüberfahren über ein Gerät anzeigen",hint:"Es werden nur beobachtete direkte Nachbarn angezeigt. Beim Darüberfahren werden keine Daten abgerufen.",help:"Zeigt, mit welchen Zigbee-Geräten jedes Gerät direkt verbunden ist. Die Linienfarbe ist die Verbindungsqualität (LQI) auf derselben Skala wie der LQI-Wert des Geräts: rot bei 40 und darunter, grün bei 180 und darüber. Eine gestrichelte Linie bedeutet, dass die Qualität nicht gemeldet wurde. Ein Pfeil zeigt auf das nächste Gerät auf dem Weg zum Koordinator: ein Pfeil führt hinaus, eingehende Pfeile sind die Geräte, die über dieses Gerät routen. Eine Linie ohne Pfeil ist ein Ersatznachbar. Das ist der Routenbaum, den House Plan bildet, nicht der Weg eines Pakets in diesem Moment: eine Beschriftung am Pfeilende bedeutet, dass das Ziel nicht auf diesem Plan liegt, und ein fehlender Pfeil, dass die Route unbekannt ist. Die Daten stammen aus dem letzten Laden und veralten; Verbindungen sind nur mit der Maus sichtbar.",help_aria:"Hilfe: Zigbee-Verbindungen",admin_only:"Topologiedaten sind nur für Home-Assistant-Administratoren verfügbar.",save_first:"Speichere diese Einstellung, bevor Topologiedaten geladen werden.",zha:"ZHA",zha_read:"ZHA-Daten lesen",zha_hint:"Liest den ZHA-Topologiecache; es wird kein Funkscan gestartet.",z2m:"Zigbee2MQTT",z2m_topics:"Basistopics (eines pro Zeile)",z2m_update:"Karte aktualisieren",z2m_warning:"Ein Netzwerkscan kann 10 Sekunden bis 2 Minuten dauern und Zigbee vorübergehend verlangsamen.",status_idle:"Daten nicht geladen",status_loading:"Wird geladen…",status_ready:"Empfangen: {time}",status_stale:"Empfangen: {time} · veraltet",status_partial:"Empfangen: {time} · einige Knoten fehlen",status_no_links:"Empfangen: {time} · keine beobachteten Verbindungen gefunden",error_permission:"Administratorrechte sind erforderlich.",error_unsupported:"Dieser Anbieter oder die Home-Assistant-API ist nicht verfügbar.",error_timeout:"Der Anbieter hat nicht rechtzeitig geantwortet.",error_invalid_topic:"Prüfe das Zigbee2MQTT-Basistopic.",error_invalid_payload:"Der Anbieter hat nicht unterstützte Topologiedaten geliefert.",error_provider:"Topologiedaten konnten nicht geladen werden.",remote_count:"+{n} in anderen Bereichen",route_device_not_on_plan:"Gerät ist nicht im Plan",route_coordinator_not_on_plan:"Koordinator ist nicht im Plan",route_other_space:"anderer Bereich"};const n="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";export{e as dictionary,n as fingerprint};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";var e={title:"Liens Zigbee",toggle:"Afficher les liens Zigbee au survol d’un appareil",hint:"Seuls les voisins directs observés sont affichés. Le survol ne lance aucune requête.",help:"Montre avec quels appareils Zigbee chaque appareil communique directement. La couleur de la ligne est la qualité du lien (LQI) sur la même échelle que l'indicateur LQI de l'appareil : rouge à 40 et en dessous, vert à 180 et au-dessus. Une ligne pointillée signifie que la qualité n'a pas été communiquée. Une flèche pointe vers l'appareil suivant sur le chemin du coordinateur : une flèche part, les flèches entrantes sont les appareils qui passent par celui-ci. Une ligne sans flèche est un voisin de secours. C'est l'arbre de routes que construit House Plan, pas le trajet d'un paquet à cet instant : une étiquette au bout d'une flèche signifie que sa cible n'est pas sur ce plan, et l'absence de flèche que la route est inconnue. Les données proviennent du dernier chargement et vieillissent ; les liens ne sont visibles qu'à la souris.",help_aria:"Aide : liens Zigbee",admin_only:"Les données de topologie sont réservées aux administrateurs Home Assistant.",save_first:"Enregistrez ce réglage avant de charger les données de topologie.",zha:"ZHA",zha_read:"Lire les données ZHA",zha_hint:"Lit la topologie en cache de ZHA sans lancer d’analyse radio.",z2m:"Zigbee2MQTT",z2m_topics:"Topics de base (un par ligne)",z2m_update:"Actualiser la carte",z2m_warning:"L’analyse de la carte réseau peut durer de 10 secondes à 2 minutes et réduire temporairement la réactivité de Zigbee.",status_idle:"Données non chargées",status_loading:"Chargement…",status_ready:"Reçu : {time}",status_stale:"Reçu : {time} · obsolète",status_partial:"Reçu : {time} · certains nœuds sont omis",status_no_links:"Reçu : {time} · aucun lien observé trouvé",error_permission:"Les droits administrateur sont requis.",error_unsupported:"Ce fournisseur ou l’API Home Assistant n’est pas disponible.",error_timeout:"Le fournisseur n’a pas répondu à temps.",error_invalid_topic:"Vérifiez le topic de base Zigbee2MQTT.",error_invalid_payload:"Le fournisseur a renvoyé des données de topologie non prises en charge.",error_provider:"Impossible de charger les données de topologie.",remote_count:"+{n} dans d’autres espaces",route_device_not_on_plan:"appareil absent du plan",route_coordinator_not_on_plan:"coordinateur absent du plan",route_other_space:"autre espace"};const s="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";export{e as dictionary,s as fingerprint};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";var e={title:"Liens Zigbee",toggle:"Afficher les liens Zigbee au survol d’un appareil",hint:"Seuls les voisins directs observés sont affichés. Le survol ne lance aucune requête.",help:"Montre avec quels appareils Zigbee chaque appareil communique directement. La couleur de la ligne est la qualité du lien (LQI) sur la même échelle que l'indicateur LQI de l'appareil : rouge à 40 et en dessous, vert à 180 et au-dessus. Une ligne pointillée signifie que la qualité n'a pas été communiquée. Une flèche pointe vers l'appareil suivant sur le chemin du coordinateur : une flèche part, les flèches entrantes sont les appareils qui passent par celui-ci. Une ligne sans flèche est un voisin de secours. C'est l'arbre de routes que construit House Plan, pas le trajet d'un paquet à cet instant : une étiquette au bout d'une flèche signifie que sa cible n'est pas sur ce plan, et l'absence de flèche que la route est inconnue. Les données proviennent du dernier chargement et vieillissent ; les liens ne sont visibles qu'à la souris.",help_aria:"Aide : liens Zigbee",admin_only:"Les données de topologie sont réservées aux administrateurs Home Assistant.",save_first:"Enregistrez ce réglage avant de charger les données de topologie.",zha:"ZHA",zha_read:"Lire les données ZHA",zha_hint:"Lit la topologie en cache de ZHA sans lancer d’analyse radio.",z2m:"Zigbee2MQTT",z2m_topics:"Topics de base (un par ligne)",z2m_update:"Actualiser la carte",z2m_warning:"L’analyse de la carte réseau peut durer de 10 secondes à 2 minutes et réduire temporairement la réactivité de Zigbee.",status_idle:"Données non chargées",status_loading:"Chargement…",status_ready:"Reçu : {time}",status_stale:"Reçu : {time} · obsolète",status_partial:"Reçu : {time} · certains nœuds sont omis",status_no_links:"Reçu : {time} · aucun lien observé trouvé",error_permission:"Les droits administrateur sont requis.",error_unsupported:"Ce fournisseur ou l’API Home Assistant n’est pas disponible.",error_timeout:"Le fournisseur n’a pas répondu à temps.",error_invalid_topic:"Vérifiez le topic de base Zigbee2MQTT.",error_invalid_payload:"Le fournisseur a renvoyé des données de topologie non prises en charge.",error_provider:"Impossible de charger les données de topologie.",remote_count:"+{n} dans d’autres espaces",route_device_not_on_plan:"appareil absent du plan",route_coordinator_not_on_plan:"coordinateur absent du plan",route_other_space:"autre espace"};const s="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";export{e as dictionary,s as fingerprint};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";var e={title:"Связи Zigbee",toggle:"Показывать связи Zigbee при наведении на устройство",hint:"Показываются только наблюдаемые прямые соседи. Наведение ничего не запрашивает.",help:"Показывает, с какими устройствами Zigbee каждое связано напрямую. Цвет линии — качество связи (LQI) по той же шкале, что у показателя LQI устройства: красный при 40 и ниже, зелёный при 180 и выше. Пунктир — качество не сообщено. Стрелка ведёт к следующему устройству по пути к координатору: исходящая одна, входящие — те, кто ходит через это устройство. Линия без стрелки — запасной сосед. Это дерево маршрутов, которое строит House Plan, а не путь пакета в эту секунду: подпись на конце стрелки значит, что цель не на этом плане, а отсутствие стрелки — что путь неизвестен. Данные из последней загрузки и устаревают, связи видны только при работе мышью.",help_aria:"Справка: связи Zigbee",admin_only:"Данные топологии доступны только администраторам Home Assistant.",save_first:"Сохраните настройку перед загрузкой данных топологии.",zha:"ZHA",zha_read:"Прочитать данные ZHA",zha_hint:"Читает сохранённую топологию ZHA и не запускает радио-сканирование.",z2m:"Zigbee2MQTT",z2m_topics:"Базовые топики (по одному в строке)",z2m_update:"Обновить карту",z2m_warning:"Сканирование карты сети занимает от 10 секунд до 2 минут и временно может снизить отзывчивость Zigbee.",status_idle:"Данные не загружены",status_loading:"Загрузка…",status_ready:"Получено: {time}",status_stale:"Получено: {time} · данные устарели",status_partial:"Получено: {time} · часть узлов не показана",status_no_links:"Получено: {time} · наблюдаемые связи не найдены",error_permission:"Нужны права администратора.",error_unsupported:"Провайдер или API Home Assistant недоступен.",error_timeout:"Провайдер не ответил вовремя.",error_invalid_topic:"Проверьте базовый топик Zigbee2MQTT.",error_invalid_payload:"Провайдер вернул неподдерживаемые данные топологии.",error_provider:"Не удалось загрузить данные топологии.",remote_count:"+{n} в других пространствах",route_device_not_on_plan:"устройства нет на плане",route_coordinator_not_on_plan:"координатора нет на плане",route_other_space:"другое пространство"};const t="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";export{e as dictionary,t as fingerprint};
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";var e={title:"Связи Zigbee",toggle:"Показывать связи Zigbee при наведении на устройство",hint:"Показываются только наблюдаемые прямые соседи. Наведение ничего не запрашивает.",help:"Показывает, с какими устройствами Zigbee каждое связано напрямую. Цвет линии — качество связи (LQI) по той же шкале, что у показателя LQI устройства: красный при 40 и ниже, зелёный при 180 и выше. Пунктир — качество не сообщено. Стрелка ведёт к следующему устройству по пути к координатору: исходящая одна, входящие — те, кто ходит через это устройство. Линия без стрелки — запасной сосед. Это дерево маршрутов, которое строит House Plan, а не путь пакета в эту секунду: подпись на конце стрелки значит, что цель не на этом плане, а отсутствие стрелки — что путь неизвестен. Данные из последней загрузки и устаревают, связи видны только при работе мышью.",help_aria:"Справка: связи Zigbee",admin_only:"Данные топологии доступны только администраторам Home Assistant.",save_first:"Сохраните настройку перед загрузкой данных топологии.",zha:"ZHA",zha_read:"Прочитать данные ZHA",zha_hint:"Читает сохранённую топологию ZHA и не запускает радио-сканирование.",z2m:"Zigbee2MQTT",z2m_topics:"Базовые топики (по одному в строке)",z2m_update:"Обновить карту",z2m_warning:"Сканирование карты сети занимает от 10 секунд до 2 минут и временно может снизить отзывчивость Zigbee.",status_idle:"Данные не загружены",status_loading:"Загрузка…",status_ready:"Получено: {time}",status_stale:"Получено: {time} · данные устарели",status_partial:"Получено: {time} · часть узлов не показана",status_no_links:"Получено: {time} · наблюдаемые связи не найдены",error_permission:"Нужны права администратора.",error_unsupported:"Провайдер или API Home Assistant недоступен.",error_timeout:"Провайдер не ответил вовремя.",error_invalid_topic:"Проверьте базовый топик Zigbee2MQTT.",error_invalid_payload:"Провайдер вернул неподдерживаемые данные топологии.",error_provider:"Не удалось загрузить данные топологии.",remote_count:"+{n} в других пространствах",route_device_not_on_plan:"устройства нет на плане",route_coordinator_not_on_plan:"координатора нет на плане",route_other_space:"другое пространство"};const a="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";export{e as dictionary,a as fingerprint};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";import{n as t,c as n}from"./zigbee-topology-TeOwXMvQ.js";import{aM as e}from"./houseplan-card-Bg60kMOY.js";import"./namespace-language-zq-hVFq8.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__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";import{n as t,c as n}from"./zigbee-topology-DeK7D_ZA.js";import{aM as e}from"./houseplan-card-CsJWLJ0i.js";import"./namespace-language-CpeRC5ot.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};
+1 -1
View File
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f7157696873d78ffd49935bafb3b63714602550a2abe2ee00a0778cb17e0c260";try{await import("./houseplan-assets/houseplan-card-Bg60kMOY.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__="5238fc88927a60664c9ffac9d509a4309fcd242a32956fbcd00ae139f1786221";try{await import("./houseplan-assets/houseplan-card-CsJWLJ0i.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-card.js: the implementation chunk is unavailable",e)}
+1 -1
View File
File diff suppressed because one or more lines are too long
+12 -12
View File
@@ -3,7 +3,7 @@
"fixture": "synthetic-only",
"chromium": "151.0.7922.34",
"oxipng": "oxipng 10.2.0",
"sourceFingerprint": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceFingerprint": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"captureScriptSha256": "e2d14d89de793011615662af7c83c433768d4761f6cec7f0b3860c797494299e",
"command": "npm run build && node demo/docs/capture.mjs",
"scenarios": {
@@ -15,7 +15,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "5d1e816c2fde72316809991e9651e242d3cbcd897fb9db0554dc3bde943486f5"
},
"view-touch": {
@@ -26,7 +26,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "bc2001f9cd51715a38ad8d913b1c5a4f2220b3917c8dc03b2de65cfb3f62f808"
},
"space-create": {
@@ -37,7 +37,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "a74330dcdd0d590e2e0008c7030a9dc11df9793682b1a050a7aaa734c651cc30"
},
"room-contour-close": {
@@ -48,7 +48,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "0c354a79f9c3660788b6c5e889a27b6bd78b1f209dc0eef6bb43e2c1344028c4"
},
"plan-context-tray": {
@@ -59,7 +59,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "64169c543291bc4df806dcf8ff484b42c8ea55eb343323d945344e0e28f2ce97"
},
"device-editor": {
@@ -70,7 +70,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "a4c1f55438e669fe7533a01185d50f7396e6fab23a3f2b9c8a669c6a28e6b200"
},
"device-display-preview": {
@@ -81,7 +81,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "8029b1cd7329e3fc921ae9ca19abe6f7f2c7246eb45c891d088baedf9972fac2"
},
"background-editor": {
@@ -92,7 +92,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "375900a29aa62632883ede6727b7dbb8b48cabe9d7d0e16425f9779c837f3dd9"
},
"room-card": {
@@ -103,7 +103,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "c985783769da1bce50c9abe92ce1c6852d62701ce940f6f0a041d634ac21e888"
},
"device-info": {
@@ -114,7 +114,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "19e247d5bf49375b238292d45ae32e9eb38a83f5d1a53f6ddde860ed4adcef42"
},
"pdf-export": {
@@ -125,7 +125,7 @@
},
"theme": "light",
"language": "en",
"sourceSha256": "46e2451664b04a8f4ce531922b664998e8d0fa1b8e8a29100af0707b82c67799",
"sourceSha256": "78fc1fd4930659616e00f10574e3bf7642ad1c3113a27c5a318e79c097be97c8",
"imageSha256": "4537692fd57a3ed95528eddd748eee5cb6e456ffab7cc49169853d62459252cd"
}
},
+10
View File
@@ -51,6 +51,16 @@ const configOf = (cfgResp: AuthoritativeConfigResponse | undefined | null): Serv
return raw && Array.isArray((raw as ServerConfig).spaces) ? raw as ServerConfig : null;
};
/** An immutable top-level settings/markers replacement cannot alter geometry
* while it retains the exact spaces snapshot. Deserialised server responses
* own a new array and deliberately fail this fast path. */
export function preservesSpaceGeometry(
previous: ServerConfig | null | undefined,
next: ServerConfig | null | undefined,
): boolean {
return !!previous && !!next && previous.spaces === next.spaces;
}
const finiteRevision = (value: unknown, fallback: number): number =>
typeof value === 'number' && Number.isFinite(value) ? value : fallback;
+9 -12
View File
@@ -156,27 +156,24 @@ export function renderDeviceFace(
*/
export function renderDeviceShadowFace(
presentation: ResolvedDevicePresentation,
): TemplateResult {
): TemplateResult | typeof nothing {
const legacyMetrics = legacySupplementalMetrics(presentation);
const badge = presentation.valueBadge;
// The shadow root itself owns the core-sized shadow. Most markers therefore
// need no descendant DOM at all; only a badge/legacy section needs the flex
// geometry below to place its additional shadow beside the core (#649).
if (!badge && legacyMetrics.length === 0) return nothing;
const shellPosition = badge?.position || 'right';
const hasSections = !!badge || legacyMetrics.length > 0;
const shellClasses = [
'device-shell',
presentation.valueText != null ? 'text-shell' : '',
hasSections ? `with-values pos-${shellPosition}` : '',
`with-values pos-${shellPosition}`,
legacyMetrics.length ? 'with-legacy' : '',
].filter(Boolean).join(' ');
return html`
<span class=${shellClasses} aria-hidden="true">
<span class="device-core">
${presentation.valueText != null
? html`<span class="valtext"
style=${`--value-font-scale:${deviceTextScale(presentation.valueFullText || presentation.valueText)}`}
>${presentation.valueText}</span>`
: nothing}
</span>
${hasSections ? html`<span class="device-sections">
<span class="device-core"></span>
<span class="device-sections">
${badge
? html`<span
class=${valueBadgeClassName(badge)}
@@ -187,7 +184,7 @@ export function renderDeviceShadowFace(
class="value-badge legacy-secondary available tone-${metric.kind}"
style=${`--value-font-scale:${deviceTextScale(metric.text + metric.suffix)}`}
>${metric.text}${metric.suffix}</span>`)}
</span>` : nothing}
</span>
</span>
`;
}
+11 -5
View File
@@ -104,7 +104,7 @@ import type {
} from './types';
import type { RadarEditorDraft } from './radar-editor';
import {
adoptAuthoritativeGated, createConfigAdoption,
adoptAuthoritativeGated, createConfigAdoption, preservesSpaceGeometry,
type ConfigAdoption, type ConfigAdoptionHostPort, type GatedAdoptionInput, type GatedAdoptionResult,
} from './config-adoption';
import { recoverConfigWriteConflict } from './config-write-conflict';
@@ -3994,10 +3994,16 @@ export class HouseplanCard extends LitElement {
// `_serverCfg` is the root of every geometry cache. Keep the epoch
// invariant local to that reactive assignment so imports, reconnects and
// demo harnesses cannot accidentally reuse an older config object's data.
// #126's provenance/new-device write is the one exact exception: it changes
// no space input, and rebuilding a 20-room floor here doubled cold work.
// #126's provenance/new-device write is one exact exception. A second safe
// case is an immutable top-level settings/markers replacement that keeps
// the SAME spaces array: no room, wall, opening or decor input can have
// changed, so rebuilding every room and structural cache only to toggle
// the installation-wide 2.5D setting is pure waste (#649 release gate).
// A deserialised server response owns a new spaces array and stays conservative.
if (changed.has('_serverCfg')) {
const preserveGeometry = this._cfgEpochPreservedConfig === this._serverCfg;
const before = changed.get('_serverCfg') as ServerConfig | null | undefined;
const preserveGeometry = this._cfgEpochPreservedConfig === this._serverCfg
|| preservesSpaceGeometry(before, this._serverCfg);
this._cfgEpochPreservedConfig = null;
if (!preserveGeometry) this._cfgEpoch++;
this._renderLife.invalidate();
@@ -12408,7 +12414,7 @@ export class HouseplanCard extends LitElement {
const left = ((point[0] - view.x) / view.w) * 100;
const top = ((point[1] - view.y) / view.h) * 100;
const lockState = `${locked ? 'locked' : known ? 'unlocked' : 'unknown'} ${this._isoLightFloors?.has(isoPlacement?.owner?.id ?? '') ? 'iso-floor-light' : ''}`;
if (ghost) return renderIsoTileShadow('oplock', String(o.id), `${deviceThemeClass(this._renderPlanHass)} ${lockState}`, `left:${left}%;top:${top}%`, html`<span class="oplock-shell"><span class="oplock-core"></span></span>`);
if (ghost) return renderIsoTileShadow('oplock', String(o.id), `${deviceThemeClass(this._renderPlanHass)} ${lockState}`, `left:${left}%;top:${top}%`, nothing);
return html`<div class="oplock ${deviceThemeClass(this._renderPlanHass)} ${lockState}"
data-hp-iso-overlay-kind=${isoPlacement?.plane === 'raised' ? 'opening-lock' : nothing}
data-hp-iso-raised=${isoPlacement?.plane === 'raised' ? 'true' : nothing}
+2 -2
View File
@@ -13,7 +13,7 @@
* Flat never reaches this module: every selector is scoped to
* `.stage.projection-iso.mode-view`.
*/
import { html, type TemplateResult } from 'lit';
import { html, nothing, type TemplateResult } from 'lit';
import { colorLuma, parseHexColor, type Rgb } from './iso-materials';
export const ISO_ICON_SCALE = 1.12;
@@ -163,7 +163,7 @@ ${S} .oplock { --iso-radius: min(${u(ISO_TILE.radius)}, calc(var(--oplock-core-s
* layer under every marker, so a shadow never lands on a neighbour's tile.
*/
export function renderIsoTileShadow(kind: 'dev' | 'oplock', owner: string, classes: string, style: string,
face: TemplateResult): TemplateResult {
face: TemplateResult | typeof nothing): TemplateResult {
return html`<div class="${kind} iso-tile-shadow ${classes}" data-shadow-of=${owner} style=${style}
aria-hidden="true">${face}</div>`;
}
+16 -3
View File
@@ -74,8 +74,22 @@ const isoTilesStatic = css`
inset: 0;
pointer-events: none;
z-index: -1;
/* This absolute layer has no layout influence outside itself. Isolating
style/layout keeps a 200-marker shadow tree out of the rest of the
stage's toggle recalculation without clipping the deliberately
overflowing blur at individual marker bounds. */
contain: layout style;
}
/* The twin's root already has exactly the core/lock box. Paint its shadow
there instead of creating two hidden descendants for every marker. Badge
twins retain only the flex spacer and their extra value boxes. */
.stage.projection-iso.mode-view .iso-tile-shadow {
pointer-events: none;
contain: layout style;
border-radius: var(--iso-radius);
box-shadow: var(--iso-sh-dx) calc(var(--iso-sh-dy) + var(--iso-depth)) var(--iso-sh-blur)
calc(var(--iso-shadow-inset) * -1) rgb(28 32 28 / var(--iso-sh-a));
}
.stage.projection-iso.mode-view .iso-tile-shadow { pointer-events: none; }
.stage.projection-iso.mode-view .iso-tile-shadow::before { display: none; }
.stage.projection-iso.mode-view .iso-tile-shadow > :not(.device-shell):not(.oplock-shell),
.stage.projection-iso.mode-view .iso-tile-shadow .device-shell-frame,
@@ -84,8 +98,7 @@ const isoTilesStatic = css`
.stage.projection-iso.mode-view .iso-tile-shadow .oplock-core {
background: transparent;
color: transparent;
box-shadow: var(--iso-sh-dx) calc(var(--iso-sh-dy) + var(--iso-depth)) var(--iso-sh-blur)
calc(var(--iso-shadow-inset) * -1) rgb(28 32 28 / var(--iso-sh-a));
box-shadow: none;
}
.stage.projection-iso.mode-view .iso-tile-shadow .value-badge {
background: transparent;
+9
View File
@@ -5,6 +5,7 @@ import {
createConfigAdoption,
adoptAuthoritativeGated,
adoptStructuralResponses,
preservesSpaceGeometry,
} from '../test-build/config-adoption.js';
import { contentFingerprint } from '../test-build/visual-continuity.js';
import { virtualLightSnapshot } from '../test-build/virtual-light-state.js';
@@ -18,6 +19,14 @@ import { virtualLightSnapshot } from '../test-build/virtual-light-state.js';
const cfg = (title, extra = {}) => ({ spaces: [{ id: 'f1', title }], settings: {}, ...extra });
const cloneOf = (value) => JSON.parse(JSON.stringify(value));
test('#649 settings-only replacement preserves only the identical spaces snapshot', () => {
const spaces = [{ id: 'f1', title: 'One' }];
const before = { spaces, markers: [], settings: {} };
assert.equal(preservesSpaceGeometry(before, { ...before, settings: { volumetric_view: true } }), true);
assert.equal(preservesSpaceGeometry(before, { ...before, spaces: cloneOf(spaces) }), false);
assert.equal(preservesSpaceGeometry(null, before), false);
});
/** A host stub recording every side effect the adoption may trigger, in order. */
function hostStub(adoption, overrides = {}) {
const calls = [];