fix(settings): colour tiles show alpha as a checkerboard (#615)

General settings colour tiles (room fills and glow) paint their colour at
its opacity over the checkerboard again, so "No light sources" at 0 % no
longer looks like solid grey. The label ink is chosen from the visible
colour (hex mixed with the checkerboard by alpha). Colour plates
(flat-swatch without cover-swatch) stay solid — now witnessed by the
#605 smoke on Wall fill at 40 %.

- hp-color-opacity: one `_solidSwatch` condition drives background and
  opacity; cover-swatch keeps the checkerboard
- editors/color-tile-ink.ts: pure isLightHex/colorTileInk, unit-tested
- smoke_dialog_polish_605: tileAlpha, defaultsDiffer, noneInkDark,
  liveAlpha, platesFlat, plateSolid; oneSurface drops the opaque check
- mutants M-615-tile, M-615-plate, M-615-label
- USER-GUIDE (ru/en): "Colour tile" row; both changelogs

Issue: #615
User-Visible: yes
This commit is contained in:
Claude
2026-09-24 05:11:01 +00:00
committed by claude[bot]
parent 22c7d6340a
commit 0aa580b7e1
55 changed files with 730 additions and 526 deletions
@@ -1,312 +1,312 @@
{
"schema": 1,
"fingerprint": "be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6",
"fingerprint": "815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 289449,
"initialViewGzipBytes": 289462,
"initialPanelFiles": [
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-panel.js"
],
"initialPanelGzipBytes": 290971,
"initialPanelGzipBytes": 290984,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
"initialPanelOnlyGzipBytes": 2324,
"initialPanelOnlyGzipBytes": 2326,
"lazyFiles": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/de-CjsIUY-d.js",
"houseplan-assets/editor-Dv3uqeSS.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/fr-D2W98VDc.js",
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-editor-runtime--nYeDmTG.js",
"houseplan-assets/houseplan-onboarding-runtime-zgKhvtTD.js",
"houseplan-assets/hp-zigbee-topology-overlay-C5T09STo.js",
"houseplan-assets/iso-scene-render-3HN3TF4R.js",
"houseplan-assets/live-interaction-runtime-kRE37k2_.js",
"houseplan-assets/pdf-export-DKVHRlMO.js",
"houseplan-assets/summary-panel-runtime-loaded-aaGs9bci.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js",
"houseplan-assets/zigbee-topology-runtime-C4WynS64.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/de-p7pVAzC5.js",
"houseplan-assets/editor-CWxYrmoY.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/fr-CU6iMobp.js",
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-editor-runtime-pSkvaQM5.js",
"houseplan-assets/houseplan-onboarding-runtime-CiHHi22E.js",
"houseplan-assets/hp-zigbee-topology-overlay-a6sAxtXn.js",
"houseplan-assets/iso-scene-render-BjukQD6q.js",
"houseplan-assets/live-interaction-runtime-DmiiE9c0.js",
"houseplan-assets/pdf-export-BbIoVP0N.js",
"houseplan-assets/summary-panel-runtime-loaded-BjwWCRFl.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js",
"houseplan-assets/zigbee-topology-runtime-CJOCW8yM.js"
],
"lazyGzipBytes": 460916,
"lazyGzipBytes": 461043,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/editor-Dv3uqeSS.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-editor-runtime--nYeDmTG.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/editor-CWxYrmoY.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-editor-runtime-pSkvaQM5.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js"
],
"lazyEditorGzipBytes": 244420,
"lazyEditorGzipBytes": 244523,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-onboarding-runtime-zgKhvtTD.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-onboarding-runtime-CiHHi22E.js"
],
"lazyOnboardingGzipBytes": 34521,
"lazyOnboardingGzipBytes": 34595,
"lazyLocaleFiles": [
"houseplan-assets/de-CjsIUY-d.js",
"houseplan-assets/fr-D2W98VDc.js"
"houseplan-assets/de-p7pVAzC5.js",
"houseplan-assets/fr-CU6iMobp.js"
],
"lazyLocaleGzipBytes": 55255,
"lazyLocaleGzipBytes": 55260,
"lazyIsometricFiles": [
"houseplan-assets/iso-scene-render-3HN3TF4R.js"
"houseplan-assets/iso-scene-render-BjukQD6q.js"
],
"lazyIsometricGzipBytes": 17640,
"lazyIsometricGzipBytes": 17643,
"lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js"
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js"
],
"lazyFurnitureArtGzipBytes": 16940,
"lazyFurnitureArtGzipBytes": 16939,
"lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/pdf-export-DKVHRlMO.js"
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/pdf-export-BbIoVP0N.js"
],
"lazyPdfGzipBytes": 126827,
"lazyPdfGzipBytes": 126826,
"files": [
{
"path": "houseplan-assets/backdrop-pick-YbdnEEmM.js",
"sha256": "07acc6fc3e12ba2fe3e1b07e19a3f57308a0834a03db3c01bdba22ea43b9a7fd",
"rawBytes": 76524,
"gzipBytes": 24571,
"path": "houseplan-assets/backdrop-pick-B3VcgA8R.js",
"sha256": "fce11f333838ed85c321e8830626af50da86d7d2c88f6858ffeb7c7cffbaf7a4",
"rawBytes": 76685,
"gzipBytes": 24639,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-CjsIUY-d.js",
"sha256": "25fa2d8f19df083532e8f022d86c21d290f3e79badaf7b4d058158c50a02286c",
"path": "houseplan-assets/de-p7pVAzC5.js",
"sha256": "e910868f40bc8f2f04f4ccc420f15dd9dc56e40ba5921d3a4046d284394fac9b",
"rawBytes": 92247,
"gzipBytes": 27864,
"gzipBytes": 27867,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-Dv3uqeSS.js",
"sha256": "b1cdd26dec11ae7d904a675fbc27964757819886d1034ab63d2c9d91b42e3655",
"path": "houseplan-assets/editor-CWxYrmoY.js",
"sha256": "7ef52fd3dfa6d4df98595252fdbd5ccf5d268bfc326507731d2bebc9c2168236",
"rawBytes": 3833,
"gzipBytes": 1583,
"gzipBytes": 1584,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"sha256": "aee7494545b43e2c932163c572b19483d9ac35c022daf437bcfd3aa21589aa07",
"path": "houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"sha256": "157c5a65350a55fd9fb30047bf5a701a788acc4f9f26315fe83be5b7b336c3d1",
"rawBytes": 25600,
"gzipBytes": 5055,
"gzipBytes": 5056,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-D2W98VDc.js",
"sha256": "12e70d1138d31d87f8c7f25d750bef3ecb7c84e23925845c101f0af4298208c0",
"path": "houseplan-assets/fr-CU6iMobp.js",
"sha256": "83ffa10a40cd1ac8d92042f202ac308cab1a19b00aadff2de6d45abdc36b900e",
"rawBytes": 94579,
"gzipBytes": 27391,
"gzipBytes": 27393,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"sha256": "63e67cda0c59f37fee93410ae4193ae79d730b83293eea331edefaf63e280d11",
"path": "houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"sha256": "68536778e45acdebd7d355165648debb12256cb331332eefacf6d321a89d8c90",
"rawBytes": 52035,
"gzipBytes": 16940,
"gzipBytes": 16939,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-e9vxRZcR.js",
"sha256": "98c44bf6f915d6121132c133cc12b2e27ea344f1c8203e7af54741f317aa1a5e",
"path": "houseplan-assets/houseplan-card-BK6N6vCh.js",
"sha256": "b241af5d3be85b71f1fb0ea3961a9bf7d546944d7ed0f39d7941eeef7d30dbcc",
"rawBytes": 1022206,
"gzipBytes": 288647,
"gzipBytes": 288658,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-CjsIUY-d.js",
"houseplan-assets/editor-Dv3uqeSS.js",
"houseplan-assets/fr-D2W98VDc.js",
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-editor-runtime--nYeDmTG.js",
"houseplan-assets/houseplan-onboarding-runtime-zgKhvtTD.js",
"houseplan-assets/hp-zigbee-topology-overlay-C5T09STo.js",
"houseplan-assets/iso-scene-render-3HN3TF4R.js",
"houseplan-assets/live-interaction-runtime-kRE37k2_.js",
"houseplan-assets/pdf-export-DKVHRlMO.js",
"houseplan-assets/summary-panel-runtime-loaded-aaGs9bci.js"
"houseplan-assets/de-p7pVAzC5.js",
"houseplan-assets/editor-CWxYrmoY.js",
"houseplan-assets/fr-CU6iMobp.js",
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-editor-runtime-pSkvaQM5.js",
"houseplan-assets/houseplan-onboarding-runtime-CiHHi22E.js",
"houseplan-assets/hp-zigbee-topology-overlay-a6sAxtXn.js",
"houseplan-assets/iso-scene-render-BjukQD6q.js",
"houseplan-assets/live-interaction-runtime-DmiiE9c0.js",
"houseplan-assets/pdf-export-BbIoVP0N.js",
"houseplan-assets/summary-panel-runtime-loaded-BjwWCRFl.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime--nYeDmTG.js",
"sha256": "f476a861b5a2d77cd2ecea724c57d4e9e6dce6fa161eb18cc9479d2ec9752641",
"rawBytes": 678218,
"gzipBytes": 188846,
"path": "houseplan-assets/houseplan-editor-runtime-pSkvaQM5.js",
"sha256": "aed0acdc901977f8030a9a18b8c39bb3d50f4561ce1438efa6d31d526787c56b",
"rawBytes": 678291,
"gzipBytes": 188874,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js"
],
"dynamicImports": [
"houseplan-assets/zigbee-topology-runtime-C4WynS64.js"
"houseplan-assets/zigbee-topology-runtime-CJOCW8yM.js"
]
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-zgKhvtTD.js",
"sha256": "5613ece2554c3ee9afc3e71dce63370d3e0bbeab9489e297ffaee74f33670e6f",
"path": "houseplan-assets/houseplan-onboarding-runtime-CiHHi22E.js",
"sha256": "296670055f2e8ba1307627e99ffef33e0a1d14afbc58d62372d80b2a1aa89ad7",
"rawBytes": 15986,
"gzipBytes": 4895,
"gzipBytes": 4900,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/hp-zigbee-topology-overlay-C5T09STo.js",
"sha256": "d836d918b89ee5685f7d2d10b194cf17feb7ca956c2112c78c4d62db7042ef24",
"path": "houseplan-assets/hp-zigbee-topology-overlay-a6sAxtXn.js",
"sha256": "5138c2587c2a977da432b1e21f4bb50a04abebb5289313029bc93b8da4d3ea7c",
"rawBytes": 10759,
"gzipBytes": 3686,
"gzipBytes": 3689,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js",
"houseplan-assets/zigbee-topology-runtime-C4WynS64.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js",
"houseplan-assets/zigbee-topology-runtime-CJOCW8yM.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/iso-scene-render-3HN3TF4R.js",
"sha256": "0c1137699d170125b0b3a6a7dd5177a06e270d74e8b3020711c100b4c59bbe0d",
"path": "houseplan-assets/iso-scene-render-BjukQD6q.js",
"sha256": "da3bf48f3689029d56ae53d0c953d6ae9951c923638f9ffc8024e33bf6eb6ded",
"rawBytes": 51983,
"gzipBytes": 17640,
"gzipBytes": 17643,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/live-interaction-runtime-kRE37k2_.js",
"sha256": "e0537b8b7d78df3e70208e5601b95b538509265184027a62b559c43626372385",
"path": "houseplan-assets/live-interaction-runtime-DmiiE9c0.js",
"sha256": "71f2d84857d2dc2c65b616a8866d2ca48745b4bbd570131a170ff0f4ba070ffd",
"rawBytes": 8216,
"gzipBytes": 3203,
"gzipBytes": 3209,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/pdf-export-DKVHRlMO.js",
"sha256": "fef91b049f58622de45132f31b3ab7f606df5db8eee3fc68d3809b2c5ece7e5d",
"path": "houseplan-assets/pdf-export-BbIoVP0N.js",
"sha256": "dbab430775060907b1257a13b45405f87576449f963789f9e1de4677df79a7c3",
"rawBytes": 236264,
"gzipBytes": 109887,
"isEntry": false,
"imports": [
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-editor-Bj45k8M3.js",
"sha256": "1463acf70394eb7c8fc09b8182b227648b00919bb2fc5ad6a6ae189b1a051a2e",
"path": "houseplan-assets/summary-panel-editor-BD2k7xqn.js",
"sha256": "ae850f2188219dd3a538ad6875ba60219495d04fb0bd4588ddc49acfc9f2c0a6",
"rawBytes": 14862,
"gzipBytes": 3423,
"gzipBytes": 3430,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/summary-panel-runtime-loaded-aaGs9bci.js"
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-assets/summary-panel-runtime-loaded-BjwWCRFl.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-metrics-3K7HlQXp.js",
"sha256": "246a3ee30014c9096527044921c104b76cef9555ebd1b2fbfcaeea54daf010cc",
"path": "houseplan-assets/summary-panel-metrics-B2o8lQjN.js",
"sha256": "60ff0e4ac8d10415995e8e368fcba531155036d54e4639dd19db7ede2fa76a3f",
"rawBytes": 2611,
"gzipBytes": 1306,
"gzipBytes": 1307,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-runtime-loaded-aaGs9bci.js",
"sha256": "527c40315a7cbbfa84289d6c8360688df121f368bf2609488e0b3b527ed2988a",
"path": "houseplan-assets/summary-panel-runtime-loaded-BjwWCRFl.js",
"sha256": "a802e37424129bc1fb2af89378eb62c9f253746f874f67e519c3318d0b63777f",
"rawBytes": 72637,
"gzipBytes": 20166,
"gzipBytes": 20167,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": [
"houseplan-assets/summary-panel-editor-Bj45k8M3.js",
"houseplan-assets/summary-panel-metrics-3K7HlQXp.js"
"houseplan-assets/summary-panel-editor-BD2k7xqn.js",
"houseplan-assets/summary-panel-metrics-B2o8lQjN.js"
]
},
{
"path": "houseplan-assets/zigbee-topology-CXRVgVl2.js",
"sha256": "a68916a24db8c6acc389707ad40f95d8963d4521e40c09e6fa32b6430584569a",
"path": "houseplan-assets/zigbee-topology-HR6MzuFg.js",
"sha256": "05ce1c0d62036b14277677edb1a7664cd048ddebf96d409b4a9252505e6df184",
"rawBytes": 18962,
"gzipBytes": 7425,
"gzipBytes": 7431,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-runtime-C4WynS64.js",
"sha256": "598d78eb03a6b75e7bf9ce8ac7fdbc7ee514d6c7f056e8651309c541313ced0e",
"path": "houseplan-assets/zigbee-topology-runtime-CJOCW8yM.js",
"sha256": "c73e5640b571a33d6680d89323d6c4e17a68b51662f1a20353f8a7e7483a7cee",
"rawBytes": 3942,
"gzipBytes": 1764,
"gzipBytes": 1765,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "ff5753ceb4dce57c6f1701baad303c37770735cb53b2a61c14e1225e07ac898b",
"sha256": "09bdb79c2d770515f788e35d35192245a7da69d32d982ee626a97f2099444a7d",
"rawBytes": 1205,
"gzipBytes": 802,
"gzipBytes": 804,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
"sha256": "90fb829ea2a8310205a7bc7c8d5d57bd38eedb0d62c961eed13d3bc3119b011a",
"sha256": "cf09e6ca6f686c3135304b26cc657aad1cfe37aef658a71bdfb1c750691186ba",
"rawBytes": 6165,
"gzipBytes": 2324,
"gzipBytes": 2326,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
}
@@ -1,14 +1,14 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";import{aD as e,l as o,aG as t,ee as s,A as a,ef as i,eg as l,eh as n,E as r,c}from"./houseplan-card-e9vxRZcR.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__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";import{aD as e,l as o,aG as t,ee as s,A as a,ef as i,eg as l,eh as n,E as r,c}from"./houseplan-card-BK6N6vCh.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),u=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>h[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(f.slice(0,3))}
${u(f.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${d(f.slice(3))}
${u(f.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";import{c as a,A as e}from"./houseplan-card-e9vxRZcR.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-aaGs9bci.js";import"./form-kit.styles-Dlhk9WKB.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__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";import{c as a,A as e}from"./houseplan-card-BK6N6vCh.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-BjwWCRFl.js";import"./form-kit.styles-BM8wqY1Y.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
<span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong>
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
<input id="summary-local-show" data-summary-local-show type="checkbox"
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";import{ek as e,N as t,a$ as n,L as i,ae as o,ac as r,bT as s,bS as a,a_ as c,aZ as l,b0 as d,el as u,em as f,bV as m,en as g}from"./houseplan-card-e9vxRZcR.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=d(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,d="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*b(c,l,d=_){try{let u=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=d(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/o;u+=a(v)*_*_/1e4}return u}catch{return null}}function 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=u(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};
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";import{ek as e,N as t,a$ as n,L as i,ae as o,ac as r,bT as a,bS as s,a_ as c,aZ as l,b0 as u,el as d,em as f,bV as m,en as g}from"./houseplan-card-BK6N6vCh.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),a=i.binding.slice(o+1),s="device"===r?e.registry.devices?.[a]:null,c="entity"===r?e.registry.entities?.[a]:null,l="device"===r?a:c?.device_id,u="device"===r?s?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(a))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,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 s=t(e);if(!s)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||s;v=y(v,a(c,m.physicalBodies)),yield}const _=m.cellCm/o;d+=s(v)*_*_/1e4}return d}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function b(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=d(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{h as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,b as summarySystemValue,p as totalCleanFloorAreaM2};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";import{n as t,b as n}from"./zigbee-topology-CXRVgVl2.js";import{aM as e}from"./houseplan-card-e9vxRZcR.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__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";import{n as t,b as n}from"./zigbee-topology-HR6MzuFg.js";import{aM as e}from"./houseplan-card-BK6N6vCh.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function f(t){if(!0!==t?.user?.is_admin)throw a("permission")}function p(n){const e=i(n);return e?c(e,"zha",async()=>{if(f(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function m(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function g(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(f(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,p=null,g=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,g=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const f=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&p?.(n):c&&g?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await m(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await m(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{p as readZhaTopology,g as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";try{await import("./houseplan-assets/houseplan-card-e9vxRZcR.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__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";try{await import("./houseplan-assets/houseplan-card-BK6N6vCh.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
+63 -4
View File
@@ -1,6 +1,8 @@
// #605: geometry and behavior witnesses for the seven residual settings-dialog
// mismatches. In particular, a Linux screenshot alone missed clipped opacity
// digits on Windows, so we measure text against the actual input content box.
// #615 revised item 3 for colour tiles: alpha shows as a checkerboard, while
// colour plates stay solid (both witnessed below).
import { launch, checkAll, finish } from './serve.mjs';
const { page, browser } = await launch({ width: 560, height: 900 });
@@ -38,11 +40,67 @@ for (const theme of ['light', 'dark']) {
const host = picker.getBoundingClientRect();
const area = swatch.getBoundingClientRect();
const painted = picker.renderRoot.querySelector('.swatch');
return picker.flatSwatch && picker.coverSwatch
// #615 changed #605 item 3 for tiles: still one surface without a
// second square, but alpha is now visible (see tileAlpha below), so
// the painted layer is no longer required to be opaque.
return picker.flatSwatch && picker.coverSwatch && !!painted
&& Math.abs(host.width - area.width + 2) <= 2
&& Math.abs(host.height - area.height + 2) <= 2
&& getComputedStyle(painted).opacity === '1';
&& Math.abs(host.height - area.height + 2) <= 2;
});
// #615 AC1: every tile paints its colour at its own alpha over the same
// checkerboard the trigger uses elsewhere, so 0 % reads as "no colour".
const layer = (tile) => {
const picker = tile.querySelector('hp-color-opacity');
const trigger = picker.renderRoot.querySelector('.trigger');
const painted = picker.renderRoot.querySelector('.swatch');
return { picker, opacity: Number(getComputedStyle(painted).opacity),
checker: getComputedStyle(trigger).backgroundImage.includes('linear-gradient') };
};
const tileAlpha = tiles.length === 10 && tiles.every((tile) => {
const { picker, opacity, checker } = layer(tile);
return checker && Math.abs(opacity - Math.round(picker.opacity * 100) / 100) <= 0.01;
});
const tileByLabel = (key) => tiles.find((tile) =>
tile.querySelector('.hpf-colortile-swatch > span')?.textContent.trim() === c._t(key));
const none = tileByLabel('gs.light_none');
const on = tileByLabel('gs.light_on');
const defaultsDiffer = !!none && !!on
&& layer(none).opacity === 0 && Math.abs(layer(on).opacity - 0.18) <= 0.01;
// #615 AC2: at 0 % the label sits on the bare checkerboard — dark ink.
const noneInkDark = !!none
&& getComputedStyle(none.querySelector('.hpf-colortile-swatch')).color === 'rgb(31, 42, 48)';
// #615 AC1: typing into the tile's % field repaints before Save.
const typeInto = async (input, value) => {
input.value = value;
input.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
await c.updateComplete;
const picker = input.closest('.hpf-colortile, .hpf-colorfield')?.querySelector('hp-color-opacity');
await picker?.updateComplete;
};
const savedBefore = JSON.stringify(c._serverCfg);
const onInput = on?.querySelector('.hpf-colortile-meta input');
let liveAlpha = false;
if (onInput) {
await typeInto(onInput, '0');
const zero = layer(on).opacity;
await typeInto(onInput, '100');
const full = layer(on).opacity;
await typeInto(onInput, '18');
liveAlpha = zero === 0 && full === 1 && JSON.stringify(c._serverCfg) === savedBefore;
}
// #615 AC3 (b): colour plates stay solid at any alpha. Without this the
// tile mode could leak to every flat-swatch (mutant M-615-plate).
const plates = [...dialog.querySelectorAll('.hpf-colorfield hp-color-opacity')];
const platesFlat = plates.length >= 2 && plates.every((picker) => picker.flatSwatch && !picker.coverSwatch);
const wallPicker = dialog.querySelector('.hpf-card[data-card="plan"] .hpf-colorrow .hpf-colorfield hp-color-opacity');
const wallInput = wallPicker?.closest('.hpf-colorfield').querySelector('.hpf-opacity input');
let plateSolid = false;
if (wallInput) {
await typeInto(wallInput, '40');
plateSolid = wallPicker.opacity === 0.4
&& getComputedStyle(wallPicker.renderRoot.querySelector('.swatch')).opacity === '1'
&& getComputedStyle(wallPicker.renderRoot.querySelector('.trigger')).backgroundImage === 'none';
}
const hex = [...dialog.querySelectorAll('.hpf-hex')];
const upperHex = hex.length >= 11 && hex.every((node) => node.textContent === node.textContent.toUpperCase());
const picker = tiles[0].querySelector('hp-color-opacity');
@@ -75,7 +133,8 @@ for (const theme of ['light', 'dark']) {
const noNative = dialog.querySelectorAll('input[type="color"]').length === 0;
c._settingsDialog = null;
await c.updateComplete;
return { fits, noSpinner, noOverflow, oneSurface, upperHex, opensPicker,
return { fits, noSpinner, noOverflow, oneSurface, tileAlpha, defaultsDiffer, noneInkDark,
liveAlpha, platesFlat, plateSolid, upperHex, opensPicker,
resetsDraftOnly, outlined, leftAligned, noNative };
});
for (const [key, ok] of Object.entries(out)) result[`${theme}_${width}_${key}`] = ok;
+145 -145
View File
@@ -1,312 +1,312 @@
{
"schema": 1,
"fingerprint": "be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6",
"fingerprint": "815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 289449,
"initialViewGzipBytes": 289462,
"initialPanelFiles": [
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-panel.js"
],
"initialPanelGzipBytes": 290971,
"initialPanelGzipBytes": 290984,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
"initialPanelOnlyGzipBytes": 2324,
"initialPanelOnlyGzipBytes": 2326,
"lazyFiles": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/de-CjsIUY-d.js",
"houseplan-assets/editor-Dv3uqeSS.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/fr-D2W98VDc.js",
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-editor-runtime--nYeDmTG.js",
"houseplan-assets/houseplan-onboarding-runtime-zgKhvtTD.js",
"houseplan-assets/hp-zigbee-topology-overlay-C5T09STo.js",
"houseplan-assets/iso-scene-render-3HN3TF4R.js",
"houseplan-assets/live-interaction-runtime-kRE37k2_.js",
"houseplan-assets/pdf-export-DKVHRlMO.js",
"houseplan-assets/summary-panel-runtime-loaded-aaGs9bci.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js",
"houseplan-assets/zigbee-topology-runtime-C4WynS64.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/de-p7pVAzC5.js",
"houseplan-assets/editor-CWxYrmoY.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/fr-CU6iMobp.js",
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-editor-runtime-pSkvaQM5.js",
"houseplan-assets/houseplan-onboarding-runtime-CiHHi22E.js",
"houseplan-assets/hp-zigbee-topology-overlay-a6sAxtXn.js",
"houseplan-assets/iso-scene-render-BjukQD6q.js",
"houseplan-assets/live-interaction-runtime-DmiiE9c0.js",
"houseplan-assets/pdf-export-BbIoVP0N.js",
"houseplan-assets/summary-panel-runtime-loaded-BjwWCRFl.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js",
"houseplan-assets/zigbee-topology-runtime-CJOCW8yM.js"
],
"lazyGzipBytes": 460916,
"lazyGzipBytes": 461043,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/editor-Dv3uqeSS.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-editor-runtime--nYeDmTG.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/editor-CWxYrmoY.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-editor-runtime-pSkvaQM5.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js"
],
"lazyEditorGzipBytes": 244420,
"lazyEditorGzipBytes": 244523,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-onboarding-runtime-zgKhvtTD.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-onboarding-runtime-CiHHi22E.js"
],
"lazyOnboardingGzipBytes": 34521,
"lazyOnboardingGzipBytes": 34595,
"lazyLocaleFiles": [
"houseplan-assets/de-CjsIUY-d.js",
"houseplan-assets/fr-D2W98VDc.js"
"houseplan-assets/de-p7pVAzC5.js",
"houseplan-assets/fr-CU6iMobp.js"
],
"lazyLocaleGzipBytes": 55255,
"lazyLocaleGzipBytes": 55260,
"lazyIsometricFiles": [
"houseplan-assets/iso-scene-render-3HN3TF4R.js"
"houseplan-assets/iso-scene-render-BjukQD6q.js"
],
"lazyIsometricGzipBytes": 17640,
"lazyIsometricGzipBytes": 17643,
"lazyFurnitureArtFiles": [
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js"
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js"
],
"lazyFurnitureArtGzipBytes": 16940,
"lazyFurnitureArtGzipBytes": 16939,
"lazyPdfFiles": [
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/pdf-export-DKVHRlMO.js"
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/pdf-export-BbIoVP0N.js"
],
"lazyPdfGzipBytes": 126827,
"lazyPdfGzipBytes": 126826,
"files": [
{
"path": "houseplan-assets/backdrop-pick-YbdnEEmM.js",
"sha256": "07acc6fc3e12ba2fe3e1b07e19a3f57308a0834a03db3c01bdba22ea43b9a7fd",
"rawBytes": 76524,
"gzipBytes": 24571,
"path": "houseplan-assets/backdrop-pick-B3VcgA8R.js",
"sha256": "fce11f333838ed85c321e8830626af50da86d7d2c88f6858ffeb7c7cffbaf7a4",
"rawBytes": 76685,
"gzipBytes": 24639,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-CjsIUY-d.js",
"sha256": "25fa2d8f19df083532e8f022d86c21d290f3e79badaf7b4d058158c50a02286c",
"path": "houseplan-assets/de-p7pVAzC5.js",
"sha256": "e910868f40bc8f2f04f4ccc420f15dd9dc56e40ba5921d3a4046d284394fac9b",
"rawBytes": 92247,
"gzipBytes": 27864,
"gzipBytes": 27867,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-Dv3uqeSS.js",
"sha256": "b1cdd26dec11ae7d904a675fbc27964757819886d1034ab63d2c9d91b42e3655",
"path": "houseplan-assets/editor-CWxYrmoY.js",
"sha256": "7ef52fd3dfa6d4df98595252fdbd5ccf5d268bfc326507731d2bebc9c2168236",
"rawBytes": 3833,
"gzipBytes": 1583,
"gzipBytes": 1584,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"sha256": "aee7494545b43e2c932163c572b19483d9ac35c022daf437bcfd3aa21589aa07",
"path": "houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"sha256": "157c5a65350a55fd9fb30047bf5a701a788acc4f9f26315fe83be5b7b336c3d1",
"rawBytes": 25600,
"gzipBytes": 5055,
"gzipBytes": 5056,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-D2W98VDc.js",
"sha256": "12e70d1138d31d87f8c7f25d750bef3ecb7c84e23925845c101f0af4298208c0",
"path": "houseplan-assets/fr-CU6iMobp.js",
"sha256": "83ffa10a40cd1ac8d92042f202ac308cab1a19b00aadff2de6d45abdc36b900e",
"rawBytes": 94579,
"gzipBytes": 27391,
"gzipBytes": 27393,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"sha256": "63e67cda0c59f37fee93410ae4193ae79d730b83293eea331edefaf63e280d11",
"path": "houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"sha256": "68536778e45acdebd7d355165648debb12256cb331332eefacf6d321a89d8c90",
"rawBytes": 52035,
"gzipBytes": 16940,
"gzipBytes": 16939,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-e9vxRZcR.js",
"sha256": "98c44bf6f915d6121132c133cc12b2e27ea344f1c8203e7af54741f317aa1a5e",
"path": "houseplan-assets/houseplan-card-BK6N6vCh.js",
"sha256": "b241af5d3be85b71f1fb0ea3961a9bf7d546944d7ed0f39d7941eeef7d30dbcc",
"rawBytes": 1022206,
"gzipBytes": 288647,
"gzipBytes": 288658,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-CjsIUY-d.js",
"houseplan-assets/editor-Dv3uqeSS.js",
"houseplan-assets/fr-D2W98VDc.js",
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-editor-runtime--nYeDmTG.js",
"houseplan-assets/houseplan-onboarding-runtime-zgKhvtTD.js",
"houseplan-assets/hp-zigbee-topology-overlay-C5T09STo.js",
"houseplan-assets/iso-scene-render-3HN3TF4R.js",
"houseplan-assets/live-interaction-runtime-kRE37k2_.js",
"houseplan-assets/pdf-export-DKVHRlMO.js",
"houseplan-assets/summary-panel-runtime-loaded-aaGs9bci.js"
"houseplan-assets/de-p7pVAzC5.js",
"houseplan-assets/editor-CWxYrmoY.js",
"houseplan-assets/fr-CU6iMobp.js",
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-editor-runtime-pSkvaQM5.js",
"houseplan-assets/houseplan-onboarding-runtime-CiHHi22E.js",
"houseplan-assets/hp-zigbee-topology-overlay-a6sAxtXn.js",
"houseplan-assets/iso-scene-render-BjukQD6q.js",
"houseplan-assets/live-interaction-runtime-DmiiE9c0.js",
"houseplan-assets/pdf-export-BbIoVP0N.js",
"houseplan-assets/summary-panel-runtime-loaded-BjwWCRFl.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime--nYeDmTG.js",
"sha256": "f476a861b5a2d77cd2ecea724c57d4e9e6dce6fa161eb18cc9479d2ec9752641",
"rawBytes": 678218,
"gzipBytes": 188846,
"path": "houseplan-assets/houseplan-editor-runtime-pSkvaQM5.js",
"sha256": "aed0acdc901977f8030a9a18b8c39bb3d50f4561ce1438efa6d31d526787c56b",
"rawBytes": 678291,
"gzipBytes": 188874,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js"
],
"dynamicImports": [
"houseplan-assets/zigbee-topology-runtime-C4WynS64.js"
"houseplan-assets/zigbee-topology-runtime-CJOCW8yM.js"
]
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-zgKhvtTD.js",
"sha256": "5613ece2554c3ee9afc3e71dce63370d3e0bbeab9489e297ffaee74f33670e6f",
"path": "houseplan-assets/houseplan-onboarding-runtime-CiHHi22E.js",
"sha256": "296670055f2e8ba1307627e99ffef33e0a1d14afbc58d62372d80b2a1aa89ad7",
"rawBytes": 15986,
"gzipBytes": 4895,
"gzipBytes": 4900,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-YbdnEEmM.js",
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/backdrop-pick-B3VcgA8R.js",
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/hp-zigbee-topology-overlay-C5T09STo.js",
"sha256": "d836d918b89ee5685f7d2d10b194cf17feb7ca956c2112c78c4d62db7042ef24",
"path": "houseplan-assets/hp-zigbee-topology-overlay-a6sAxtXn.js",
"sha256": "5138c2587c2a977da432b1e21f4bb50a04abebb5289313029bc93b8da4d3ea7c",
"rawBytes": 10759,
"gzipBytes": 3686,
"gzipBytes": 3689,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js",
"houseplan-assets/zigbee-topology-runtime-C4WynS64.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js",
"houseplan-assets/zigbee-topology-runtime-CJOCW8yM.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/iso-scene-render-3HN3TF4R.js",
"sha256": "0c1137699d170125b0b3a6a7dd5177a06e270d74e8b3020711c100b4c59bbe0d",
"path": "houseplan-assets/iso-scene-render-BjukQD6q.js",
"sha256": "da3bf48f3689029d56ae53d0c953d6ae9951c923638f9ffc8024e33bf6eb6ded",
"rawBytes": 51983,
"gzipBytes": 17640,
"gzipBytes": 17643,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/live-interaction-runtime-kRE37k2_.js",
"sha256": "e0537b8b7d78df3e70208e5601b95b538509265184027a62b559c43626372385",
"path": "houseplan-assets/live-interaction-runtime-DmiiE9c0.js",
"sha256": "71f2d84857d2dc2c65b616a8866d2ca48745b4bbd570131a170ff0f4ba070ffd",
"rawBytes": 8216,
"gzipBytes": 3203,
"gzipBytes": 3209,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/pdf-export-DKVHRlMO.js",
"sha256": "fef91b049f58622de45132f31b3ab7f606df5db8eee3fc68d3809b2c5ece7e5d",
"path": "houseplan-assets/pdf-export-BbIoVP0N.js",
"sha256": "dbab430775060907b1257a13b45405f87576449f963789f9e1de4677df79a7c3",
"rawBytes": 236264,
"gzipBytes": 109887,
"isEntry": false,
"imports": [
"houseplan-assets/furniture-plan-art.generated-YwpfkuFp.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/furniture-plan-art.generated-CCyMX6Ar.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-editor-Bj45k8M3.js",
"sha256": "1463acf70394eb7c8fc09b8182b227648b00919bb2fc5ad6a6ae189b1a051a2e",
"path": "houseplan-assets/summary-panel-editor-BD2k7xqn.js",
"sha256": "ae850f2188219dd3a538ad6875ba60219495d04fb0bd4588ddc49acfc9f2c0a6",
"rawBytes": 14862,
"gzipBytes": 3423,
"gzipBytes": 3430,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/summary-panel-runtime-loaded-aaGs9bci.js"
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-assets/summary-panel-runtime-loaded-BjwWCRFl.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-metrics-3K7HlQXp.js",
"sha256": "246a3ee30014c9096527044921c104b76cef9555ebd1b2fbfcaeea54daf010cc",
"path": "houseplan-assets/summary-panel-metrics-B2o8lQjN.js",
"sha256": "60ff0e4ac8d10415995e8e368fcba531155036d54e4639dd19db7ede2fa76a3f",
"rawBytes": 2611,
"gzipBytes": 1306,
"gzipBytes": 1307,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/summary-panel-runtime-loaded-aaGs9bci.js",
"sha256": "527c40315a7cbbfa84289d6c8360688df121f368bf2609488e0b3b527ed2988a",
"path": "houseplan-assets/summary-panel-runtime-loaded-BjwWCRFl.js",
"sha256": "a802e37424129bc1fb2af89378eb62c9f253746f874f67e519c3318d0b63777f",
"rawBytes": 72637,
"gzipBytes": 20166,
"gzipBytes": 20167,
"isEntry": false,
"imports": [
"houseplan-assets/form-kit.styles-Dlhk9WKB.js",
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/form-kit.styles-BM8wqY1Y.js",
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": [
"houseplan-assets/summary-panel-editor-Bj45k8M3.js",
"houseplan-assets/summary-panel-metrics-3K7HlQXp.js"
"houseplan-assets/summary-panel-editor-BD2k7xqn.js",
"houseplan-assets/summary-panel-metrics-B2o8lQjN.js"
]
},
{
"path": "houseplan-assets/zigbee-topology-CXRVgVl2.js",
"sha256": "a68916a24db8c6acc389707ad40f95d8963d4521e40c09e6fa32b6430584569a",
"path": "houseplan-assets/zigbee-topology-HR6MzuFg.js",
"sha256": "05ce1c0d62036b14277677edb1a7664cd048ddebf96d409b4a9252505e6df184",
"rawBytes": 18962,
"gzipBytes": 7425,
"gzipBytes": 7431,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/zigbee-topology-runtime-C4WynS64.js",
"sha256": "598d78eb03a6b75e7bf9ce8ac7fdbc7ee514d6c7f056e8651309c541313ced0e",
"path": "houseplan-assets/zigbee-topology-runtime-CJOCW8yM.js",
"sha256": "c73e5640b571a33d6680d89323d6c4e17a68b51662f1a20353f8a7e7483a7cee",
"rawBytes": 3942,
"gzipBytes": 1764,
"gzipBytes": 1765,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js",
"houseplan-assets/zigbee-topology-CXRVgVl2.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js",
"houseplan-assets/zigbee-topology-HR6MzuFg.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "ff5753ceb4dce57c6f1701baad303c37770735cb53b2a61c14e1225e07ac898b",
"sha256": "09bdb79c2d770515f788e35d35192245a7da69d32d982ee626a97f2099444a7d",
"rawBytes": 1205,
"gzipBytes": 802,
"gzipBytes": 804,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
"sha256": "90fb829ea2a8310205a7bc7c8d5d57bd38eedb0d62c961eed13d3bc3119b011a",
"sha256": "cf09e6ca6f686c3135304b26cc657aad1cfe37aef658a71bdfb1c750691186ba",
"rawBytes": 6165,
"gzipBytes": 2324,
"gzipBytes": 2326,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-e9vxRZcR.js"
"houseplan-assets/houseplan-card-BK6N6vCh.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__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";import{aD as e,l as o,aG as t,ee as s,A as a,ef as i,eg as l,eh as n,E as r,c}from"./houseplan-card-e9vxRZcR.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__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";import{aD as e,l as o,aG as t,ee as s,A as a,ef as i,eg as l,eh as n,E as r,c}from"./houseplan-card-BK6N6vCh.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),u=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>h[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(f.slice(0,3))}
${u(f.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${d(f.slice(3))}
${u(f.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";import{c as a,A as e}from"./houseplan-card-e9vxRZcR.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-aaGs9bci.js";import"./form-kit.styles-Dlhk9WKB.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__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";import{c as a,A as e}from"./houseplan-card-BK6N6vCh.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-BjwWCRFl.js";import"./form-kit.styles-BM8wqY1Y.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
<span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong>
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
<input id="summary-local-show" data-summary-local-show type="checkbox"
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";import{ek as e,N as t,a$ as n,L as i,ae as o,ac as r,bT as s,bS as a,a_ as c,aZ as l,b0 as d,el as u,em as f,bV as m,en as g}from"./houseplan-card-e9vxRZcR.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=d(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,d="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:l(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*b(c,l,d=_){try{let u=0;for(const f of l){const l=c.spaces.find(e=>String(e?.id)===f.id);if(!l)continue;const m=e(l,f),g=d(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(c,m.physicalBodies)),yield}const _=m.cellCm/o;u+=a(v)*_*_/1e4}return u}catch{return null}}function 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=u(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};
@@ -0,0 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";import{ek as e,N as t,a$ as n,L as i,ae as o,ac as r,bT as a,bS as s,a_ as c,aZ as l,b0 as u,el as d,em as f,bV as m,en as g}from"./houseplan-card-BK6N6vCh.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),a=i.binding.slice(o+1),s="device"===r?e.registry.devices?.[a]:null,c="entity"===r?e.registry.entities?.[a]:null,l="device"===r?a:c?.device_id,u="device"===r?s?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,d="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||u||"",f=d&&e.areaToSpace[d]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(a))&&t.add(l)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,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 s=t(e);if(!s)continue;const c=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||s;v=y(v,a(c,m.physicalBodies)),yield}const _=m.cellCm/o;d+=s(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};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";import{n as t,b as n}from"./zigbee-topology-CXRVgVl2.js";import{aM as e}from"./houseplan-card-e9vxRZcR.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__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";import{n as t,b as n}from"./zigbee-topology-HR6MzuFg.js";import{aM as e}from"./houseplan-card-BK6N6vCh.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function f(t){if(!0!==t?.user?.is_admin)throw a("permission")}function p(n){const e=i(n);return e?c(e,"zha",async()=>{if(f(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function m(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function g(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(f(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,p=null,g=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,g=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const f=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&p?.(n):c&&g?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await m(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await m(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{p as readZhaTopology,g as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
+1 -1
View File
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="be980214e65258ad0c8ec0480b3b70c46a1e6f817bba2cda8d2f16c104021db6";try{await import("./houseplan-assets/houseplan-card-e9vxRZcR.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__="815423f7441c6aa6fc98a18af73aa4585f914b4c299930218640eec25cbdae6f";try{await import("./houseplan-assets/houseplan-card-BK6N6vCh.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
+6
View File
@@ -2,6 +2,12 @@
## Unreleased
- Colour tiles in General settings (room fill and glow colours) show their
opacity again: a checkerboard shows through the colour, so **No light
sources** at 0 % no longer looks like solid grey, and the tile name stays
readable on what is actually visible. Colour plates stay solid
([#615](https://github.com/Matysh/houseplan-card/issues/615)).
## v1.78.0-beta.1 — 2026-09-23
- The Furniture palette now shows the revised front-view icon for the
+6
View File
@@ -8,6 +8,12 @@
## Не выпущено
- Плитки цвета в общих настройках (цвета заливки комнат и свечения) снова
показывают прозрачность: сквозь цвет просвечивает шахматка, поэтому «Нет
источников света» на 0 % больше не выглядит сплошным серым, а название
плитки читается на том цвете, который виден. Плашки цвета остаются
сплошными ([#615](https://github.com/Matysh/houseplan-card/issues/615)).
## v1.78.0-beta.1 — 2026-09-23
- В палитре мебели категория «Посудомоечная машина» теперь показывает новую
+1
View File
@@ -453,6 +453,7 @@ elements:
| Switch row | Icon, title, caption and a switch on the right | Turns one setting on or off; the whole row is the tap target |
| Segment | A few options in one frame, the chosen one highlighted | Picks from a short list instead of a dropdown; arrow keys and screen readers work as with radio buttons |
| Colour plate | Solid swatch, `#RRGGBB` code, opacity number and Reset where available | The swatch opens the palette; the number edits opacity directly. In General settings, **Wall fill** also has Reset, applied when you save |
| Colour tile | The name on the colour; a checkerboard under the colour shows through by its opacity; below it the `#RRGGBB` code and the `%` number | Used in General settings for fill and glow colours. The whole upper part opens the palette; the number edits opacity. At 0 % only the checkerboard is visible — rooms are not filled with this colour |
| Field with a unit | A number with `cm`, `°C`, `m`, `%` or `°` inside the frame | An empty field means "as in General settings" or "as the space" when the hint says so |
| Slider with a number | Slider, editable number and "Reset to 100%" | Drag, or type the exact value |
| Picker button | A dropdown-styled button | Opens a panel with search and a list below it; the panel expands the card instead of floating over it |
+1
View File
@@ -399,6 +399,7 @@ Zigbee2MQTT для каждого указанного базового топи
| Строка с тумблером | Иконка, название, подпись и переключатель справа | Включает или выключает одну настройку; вся строка — цель нажатия |
| Сегмент | Несколько вариантов в одной рамке, выбранный подсвечен | Выбор из короткого списка вместо выпадающего меню; стрелки и чтение с экрана работают как у радиокнопок |
| Плашка цвета | Сплошной цвет, код `#RRGGBB`, число прозрачности и «Сбросить», где доступно | Цвет открывает палитру; число меняет прозрачность напрямую. В общих настройках «Заливка стен» тоже имеет сброс, который применяется при сохранении |
| Плитка цвета | Название на цвете; под цветом шахматка, которая просвечивает по прозрачности; ниже код `#RRGGBB` и число `%` | Встречается в общих настройках, в цветах заливки и свечения. Вся верхняя часть открывает палитру; число меняет прозрачность. При 0 % видна одна шахматка — комнаты этим цветом не заливаются |
| Поле с единицей | Число и `см`, `°C`, `м`, `%` или `°` внутри рамки | Пустое поле означает наследование только там, где это прямо написано в подсказке. В обязательном поле пустой или неверный черновик остаётся видимым и блокирует сохранение |
| Слайдер с числом | Ползунок, редактируемое число и «Сбросить до 100%» | Двигайте ползунок или введите точное значение |
| Кнопка выбора | Кнопка в стиле выпадающего меню | Раскрывает под собой панель с поиском и списком; панель раздвигает карточку, а не всплывает поверх |
+39
View File
@@ -11086,6 +11086,45 @@ const MUTANT_DEFINITIONS = [
replace: " onOpacity: (a) => this._setFillColor(key === 'light_on' ? 'light_off' : key, { c: v.c, a }),",
}],
},
{
id: 'M-615-tile',
guard: 'node demo/smoke_dialog_polish_605.mjs',
because: '#615 AC1: плитка цвета General обязана показывать прозрачность шахматкой — '
+ 'при 0 % видна одна шахматка, при 100 % плотный цвет. Если плитка снова считается '
+ 'сплошной плашкой, «No light sources» на 0 % опять выглядит насыщенным серым, '
+ 'а единственным признаком остаётся число рядом',
patches: [{
file: 'src/hp-color-opacity.ts',
find: ' return this.flatSwatch && !this.coverSwatch;',
replace: ' return this.flatSwatch;',
}],
},
{
id: 'M-615-plate',
guard: 'node demo/smoke_dialog_polish_605.mjs',
because: '#615 AC3 (б): режим шахматки привязан к cover-swatch, а плашки цвета '
+ '(flat-swatch без cover-swatch) остаются сплошными при любом α. Если режим включается '
+ 'по flat-swatch, шахматка протекает на Wall fill, фон и плашки Space/Room/Device — '
+ 'до #615 это не проверял ни один смок',
patches: [{
file: 'src/hp-color-opacity.ts',
find: ' return this.flatSwatch && !this.coverSwatch;',
replace: ' return !this.flatSwatch && this.coverSwatch;',
}],
},
{
id: 'M-615-label',
guard: 'npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs '
+ '&& node --test --test-name-pattern="#615" test/form-kit.test.mjs',
because: '#615 AC2: подпись плитки выбирается по видимому цвету — hex, смешанному с '
+ 'шахматкой по α. По одному hex тёмный цвет на 0 % получает белую подпись на светлой '
+ 'шахматке, и название плитки пропадает',
patches: [{
file: 'src/editors/color-tile-ink.ts',
find: ' const a = Number.isFinite(alpha) ? Math.min(1, Math.max(0, alpha)) : 1;',
replace: ' const a = 1;',
}],
},
{
id: 'general-north-clear-writes-zero',
guard: 'node demo/smoke_general_settings_form.mjs',
+52
View File
@@ -0,0 +1,52 @@
/**
* Цвет подписи на плитке цвета General settings (#615).
*
* С #615 плитка показывает прозрачность шахматкой: цвет лежит поверх шахматки
* с непрозрачностью α. Подпись должна читаться на том, что человек видит, а не
* на «чистом» `hex`: при α=0 видна одна шахматка, и белая подпись на ней
* пропадает даже у почти чёрного цвета.
*
* Чистые функции без DOM и lit — живут отдельно от `form-kit.ts`, чтобы юнит
* мог их импортировать (`tsconfig.test.json`), а бандл держал их в ленивом
* графе редакторов вместе с единственным потребителем.
*/
/** Тёмная подпись плитки — та же, что была до #615. */
export const TILE_INK_DARK = '#1f2a30';
export const TILE_INK_LIGHT = '#fff';
/**
* Средний тон шахматки `hp-color-opacity` (`#b8b8b8` / `#eee`, поровну):
* (184 + 238) / 2 = 211 = `#d3d3d3`. Смешивание с ним по α даёт видимый цвет.
*/
export const CHECKER_MEAN = 211;
function parseHex(hex: string): [number, number, number] | null {
const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());
if (!m) return null;
const n = parseInt(m[1], 16);
return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
}
function isLightRgb([r, g, b]: [number, number, number]): boolean {
return (0.299 * r + 0.587 * g + 0.114 * b) / 255 > 0.6;
}
/** Светлый ли цвет — для контраста подписи поверх свотча плитки. */
export function isLightHex(hex: string): boolean {
const rgb = parseHex(hex);
return rgb ? isLightRgb(rgb) : true;
}
/**
* Цвет подписи по яркости ВИДИМОГО цвета: `hex`, смешанный со средним тоном
* шахматки по α (контракт #615 п.4). При α=1 совпадает с `isLightHex(hex)`,
* при α=0 подпись тёмная у любого цвета — под ней одна светлая шахматка.
*/
export function colorTileInk(hex: string, alpha: number): string {
const rgb = parseHex(hex);
if (!rgb) return TILE_INK_DARK;
const a = Number.isFinite(alpha) ? Math.min(1, Math.max(0, alpha)) : 1;
const seen = rgb.map((v) => v * a + CHECKER_MEAN * (1 - a)) as [number, number, number];
return isLightRgb(seen) ? TILE_INK_DARK : TILE_INK_LIGHT;
}
+7 -9
View File
@@ -13,6 +13,7 @@
import { html, nothing, type TemplateResult } from 'lit';
import { CARD_DIALOG_FORM_KIT, cardDialogFormKitTokens, formKitCss } from '../styles/form-kit.styles';
import { colorTileInk } from './color-tile-ink';
/**
* Лист набора живёт в ленивом редакторском графе, а не в `cardStyles` (#594 AC8).
@@ -297,23 +298,20 @@ export interface ColorTileOptions {
onOpacity: (opacity: number) => void;
}
/** Светлый ли цвет — для контраста подписи поверх свотча плитки. */
export function isLightHex(hex: string): boolean {
const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());
if (!m) return true;
const n = parseInt(m[1], 16);
const r = (n >> 16) & 255; const g = (n >> 8) & 255; const b = n & 255;
return (0.299 * r + 0.587 * g + 0.114 * b) / 255 > 0.6;
}
export { isLightHex } from './color-tile-ink';
/**
* Плитка цвета (§3.1 «Плитки цвета»): название поверх свотча на всю ширину,
* ниже hex и число прозрачности. Свотч — trigger существующего пикера.
*
* #615: поверхность рисует сам trigger (`cover-swatch`) — шахматка и цвет
* поверх неё с непрозрачностью α, поэтому у обёртки своего фона нет. Подпись
* выбирается по видимому цвету (`colorTileInk`), а не по одному `hex`.
*/
export function colorTile({ label, hex, opacity, opacityLabel, picker, onOpacity }: ColorTileOptions): TemplateResult {
const pct = Math.round(Math.min(1, Math.max(0, opacity)) * 100);
return html`<div class="hpf-colortile">
<div class="hpf-colortile-swatch" style=${`background:${hex};color:${isLightHex(hex) ? '#1f2a30' : '#fff'}`}>
<div class="hpf-colortile-swatch" style=${`color:${colorTileInk(hex, opacity)}`}>
${picker}<span>${label}</span>
</div>
<div class="hpf-colortile-meta">
+18 -4
View File
@@ -42,7 +42,11 @@ export class HpColorOpacity extends LitElement {
public hideLabel = false;
/** Settings form-kit uses a solid swatch instead of the alpha checkerboard. */
public flatSwatch = false;
/** Let the existing trigger cover an entire settings colour tile. */
/**
* Let the existing trigger cover an entire settings colour tile. #615: the
* tile is the one flat-swatch surface that still shows alpha — checkerboard
* under the colour, colour at its opacity — so the picture matches the `%`.
*/
public coverSwatch = false;
public pickerLabels: ColorPickerLabels = DEFAULT_LABELS;
@@ -112,7 +116,7 @@ export class HpColorOpacity extends LitElement {
linear-gradient(45deg, #b8b8b8 25%, #eee 25%) 5px 5px / 10px 10px;
cursor: pointer;
}
:host([flat-swatch]) .trigger { background: none; }
.trigger.solid { background: none; }
:host([cover-swatch]) { display: block; width: 100%; height: 100%; }
:host([cover-swatch]) .trigger {
width: 100%; height: 100%; padding: 0; border: 0; border-radius: 6px;
@@ -838,18 +842,28 @@ export class HpColorOpacity extends LitElement {
</div>`;
}
/**
* Solid plate (#600/#605): flat-swatch without cover-swatch paints the colour
* opaque with no checkerboard. Colour tiles (cover-swatch) keep the alpha
* checkerboard (#615). One condition for both the background and the opacity.
*/
private get _solidSwatch(): boolean {
return this.flatSwatch && !this.coverSwatch;
}
render() {
const pct = Math.round(Math.min(1, Math.max(0, Number(this.opacity) || 0)) * 100);
const solid = this._solidSwatch;
const color = safeStoredColor(this.color, '#607d8b');
const title = this.showOpacity
? `${this.label || 'Color'}: ${color}, ${pct}%`
: `${this.label || 'Color'}: ${color}`;
return html`
${this.label && !this.hideLabel ? html`<span class="label">${this.label}</span>` : nothing}
<button class="trigger" type="button" .disabled=${this.disabled}
<button class=${solid ? 'trigger solid' : 'trigger'} type="button" .disabled=${this.disabled}
aria-label=${title} aria-haspopup="dialog" aria-expanded=${this._open ? 'true' : 'false'}
title=${title} @click=${this._toggle}>
<span class="swatch" style=${`background:${color};opacity:${this.flatSwatch ? 1 : this.showOpacity ? pct / 100 : 1}`}></span>
<span class="swatch" style=${`background:${color};opacity:${solid ? 1 : this.showOpacity ? pct / 100 : 1}`}></span>
</button>
${this._open && !this.disabled && this._supportsPopover() ? this._pickerTemplate(true) : nothing}
`;
+28
View File
@@ -6,6 +6,9 @@ import {
CARD_DIALOG_FORM_KIT, SUMMARY_PANEL_FORM_KIT, formKitCss,
} from '../test-build/styles/form-kit.styles.js';
import { summaryPanelEditorCss } from '../test-build/summary-panel-editor-style.js';
import {
TILE_INK_DARK, TILE_INK_LIGHT, colorTileInk, isLightHex,
} from '../test-build/editors/color-tile-ink.js';
/**
* #594. Набор контролов поднят из редактора боковой панели, и главный вопрос к
@@ -164,3 +167,28 @@ test('#594 сегментированный переключатель оста
assert.match(css, /\.hpf-seg input \{[\s\S]*?opacity: 0;/,
'радиокнопка перестала быть скрытой — сегмент нарисуется дважды');
});
test('#615: подпись плитки цвета выбирается по видимому цвету, а не по одному hex', () => {
// Плитка показывает α шахматкой. При α=0 под подписью только светлая
// шахматка, и белая подпись на ней пропадает даже у почти чёрного цвета —
// ровно тот случай, который ловит мутант M-615-label (подпись по hex без α).
assert.equal(colorTileInk('#0d1b2a', 0), TILE_INK_DARK, 'α=0: тёмный цвет, но видна шахматка — подпись тёмная');
assert.equal(colorTileInk('#0d1b2a', 1), TILE_INK_LIGHT, 'α=1: плотный тёмный цвет — подпись белая');
for (const a of [0, 0.18, 0.5, 1]) {
assert.equal(colorTileInk('#ffd45c', a), TILE_INK_DARK, `светлый #ffd45c при α=${a} — подпись тёмная`);
}
// `light_none` по умолчанию: #6b7480 при 0 %.
assert.equal(colorTileInk('#6b7480', 0), TILE_INK_DARK);
// При α=1 выбор обязан совпасть с прежним правилом `isLightHex(hex)`.
for (const hex of ['#0d1b2a', '#ffd45c', '#6b7480', '#ffffff', '#000000', '#3f8f5a', '#e05252', '#9aa4ad']) {
assert.equal(colorTileInk(hex, 1), isLightHex(hex) ? TILE_INK_DARK : TILE_INK_LIGHT, `α=1 для ${hex}`);
}
// Смешивание монотонно по α: у тёмного цвета подпись переключается ровно
// один раз — с тёмной на белую.
const flips = [...Array(101).keys()].map((i) => colorTileInk('#0d1b2a', i / 100))
.filter((ink, i, all) => i > 0 && ink !== all[i - 1]).length;
assert.equal(flips, 1);
// Некорректный hex и нечисловая α не роняют плитку.
assert.equal(colorTileInk('nope', 0.5), TILE_INK_DARK);
assert.equal(colorTileInk('#0d1b2a', Number.NaN), TILE_INK_LIGHT);
});
+1 -1
View File
@@ -23,7 +23,7 @@
"src/devices.ts", "src/device-inbox.ts",
"src/virtual-light-state.ts", "src/config-store.ts", "src/config-reload-authority.ts", "src/config-write-conflict.ts", "src/summary-panel.ts", "src/summary-panel-metrics.ts", "src/summary-panel-i18n.ts", "src/summary-panel-identity.ts", "src/summary-panel-picker.ts", "src/summary-panel-runtime-loaded.ts",
"src/backdrop-probe.ts",
"src/types.ts", "src/editors/dialog-baseline.ts", "src/editors/general-form-state.ts", "src/editors/space-form-state.ts", "src/editors/marker-form-state.ts",
"src/types.ts", "src/editors/dialog-baseline.ts", "src/editors/color-tile-ink.ts", "src/editors/general-form-state.ts", "src/editors/space-form-state.ts", "src/editors/marker-form-state.ts",
"src/space-geometry.ts", "src/junction-limits.ts",
"src/space-order.ts", "src/card-editor-validation.ts",
"src/signing.ts", "src/initial-load.ts", "src/space-model-selection.ts", "src/space-dialog.ts",