@matter-server/dashboard 0.6.1 → 0.6.2-alpha.0-20260422-4efb179

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +19 -0
  2. package/dist/esm/client/models/descriptions.d.ts +10 -0
  3. package/dist/esm/client/models/descriptions.d.ts.map +1 -1
  4. package/dist/esm/client/models/descriptions.js +5684 -1881
  5. package/dist/esm/client/models/descriptions.js.map +1 -1
  6. package/dist/esm/components/dialog-box/dialog-box.d.ts.map +1 -1
  7. package/dist/esm/components/dialog-box/show-dialog-box.d.ts.map +1 -1
  8. package/dist/esm/components/dialogs/acl/model.d.ts.map +1 -1
  9. package/dist/esm/components/dialogs/binding/model.d.ts.map +1 -1
  10. package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts.map +1 -1
  11. package/dist/esm/components/dialogs/binding/show-node-binding-dialog.d.ts.map +1 -1
  12. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-dialog.d.ts.map +1 -1
  13. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-existing.d.ts.map +1 -1
  14. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.d.ts.map +1 -1
  15. package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.d.ts.map +1 -1
  16. package/dist/esm/components/dialogs/commission-node-dialog/show-commission-node-dialog.d.ts.map +1 -1
  17. package/dist/esm/components/dialogs/dev/attribute-write-dialog.d.ts +34 -0
  18. package/dist/esm/components/dialogs/dev/attribute-write-dialog.d.ts.map +1 -0
  19. package/dist/esm/components/dialogs/dev/attribute-write-dialog.js +187 -0
  20. package/dist/esm/components/dialogs/dev/attribute-write-dialog.js.map +6 -0
  21. package/dist/esm/components/dialogs/dev/command-invoke-dialog.d.ts +33 -0
  22. package/dist/esm/components/dialogs/dev/command-invoke-dialog.d.ts.map +1 -0
  23. package/dist/esm/components/dialogs/dev/command-invoke-dialog.js +221 -0
  24. package/dist/esm/components/dialogs/dev/command-invoke-dialog.js.map +6 -0
  25. package/dist/esm/components/dialogs/dev/parse-json-payload.d.ts +27 -0
  26. package/dist/esm/components/dialogs/dev/parse-json-payload.d.ts.map +1 -0
  27. package/dist/esm/components/dialogs/dev/parse-json-payload.js +25 -0
  28. package/dist/esm/components/dialogs/dev/parse-json-payload.js.map +6 -0
  29. package/dist/esm/components/dialogs/dev/show-attribute-write-dialog.d.ts +17 -0
  30. package/dist/esm/components/dialogs/dev/show-attribute-write-dialog.d.ts.map +1 -0
  31. package/dist/esm/components/dialogs/dev/show-attribute-write-dialog.js +21 -0
  32. package/dist/esm/components/dialogs/dev/show-attribute-write-dialog.js.map +6 -0
  33. package/dist/esm/components/dialogs/dev/show-command-invoke-dialog.d.ts +16 -0
  34. package/dist/esm/components/dialogs/dev/show-command-invoke-dialog.d.ts.map +1 -0
  35. package/dist/esm/components/dialogs/dev/show-command-invoke-dialog.js +20 -0
  36. package/dist/esm/components/dialogs/dev/show-command-invoke-dialog.js.map +6 -0
  37. package/dist/esm/components/dialogs/settings/log-level-dialog.d.ts +2 -11
  38. package/dist/esm/components/dialogs/settings/log-level-dialog.d.ts.map +1 -1
  39. package/dist/esm/components/dialogs/settings/log-level-dialog.js +13 -140
  40. package/dist/esm/components/dialogs/settings/log-level-dialog.js.map +1 -1
  41. package/dist/esm/components/dialogs/settings/log-level-section.d.ts +34 -0
  42. package/dist/esm/components/dialogs/settings/log-level-section.d.ts.map +1 -0
  43. package/dist/esm/components/dialogs/settings/log-level-section.js +181 -0
  44. package/dist/esm/components/dialogs/settings/log-level-section.js.map +6 -0
  45. package/dist/esm/components/dialogs/settings/settings-dialog.d.ts +31 -0
  46. package/dist/esm/components/dialogs/settings/settings-dialog.d.ts.map +1 -0
  47. package/dist/esm/components/dialogs/settings/settings-dialog.js +165 -0
  48. package/dist/esm/components/dialogs/settings/settings-dialog.js.map +6 -0
  49. package/dist/esm/components/dialogs/settings/show-log-level-dialog.d.ts.map +1 -1
  50. package/dist/esm/components/dialogs/settings/show-settings-dialog.d.ts +8 -0
  51. package/dist/esm/components/dialogs/settings/show-settings-dialog.d.ts.map +1 -0
  52. package/dist/esm/components/dialogs/settings/show-settings-dialog.js +15 -0
  53. package/dist/esm/components/dialogs/settings/show-settings-dialog.js.map +6 -0
  54. package/dist/esm/components/ha-svg-icon.d.ts.map +1 -1
  55. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
  56. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts.map +1 -1
  57. package/dist/esm/pages/cluster-commands/clusters/level-control-commands.d.ts.map +1 -1
  58. package/dist/esm/pages/cluster-commands/clusters/on-off-commands.d.ts.map +1 -1
  59. package/dist/esm/pages/components/footer.d.ts.map +1 -1
  60. package/dist/esm/pages/components/header.d.ts +2 -0
  61. package/dist/esm/pages/components/header.d.ts.map +1 -1
  62. package/dist/esm/pages/components/header.js +47 -3
  63. package/dist/esm/pages/components/header.js.map +1 -1
  64. package/dist/esm/pages/components/node-details.d.ts.map +1 -1
  65. package/dist/esm/pages/components/server-details.d.ts.map +1 -1
  66. package/dist/esm/pages/matter-cluster-view.d.ts +13 -2
  67. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  68. package/dist/esm/pages/matter-cluster-view.js +338 -4
  69. package/dist/esm/pages/matter-cluster-view.js.map +2 -2
  70. package/dist/esm/pages/matter-dashboard-app.d.ts.map +1 -1
  71. package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
  72. package/dist/esm/pages/matter-network-view.d.ts.map +1 -1
  73. package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
  74. package/dist/esm/pages/matter-server-view.d.ts.map +1 -1
  75. package/dist/esm/pages/network/base-network-graph.d.ts.map +1 -1
  76. package/dist/esm/pages/network/base-network-graph.js +1 -0
  77. package/dist/esm/pages/network/base-network-graph.js.map +1 -1
  78. package/dist/esm/pages/network/device-panel.d.ts.map +1 -1
  79. package/dist/esm/pages/network/network-details.d.ts.map +1 -1
  80. package/dist/esm/pages/network/thread-graph.d.ts.map +1 -1
  81. package/dist/esm/pages/network/update-connections-dialog.d.ts.map +1 -1
  82. package/dist/esm/pages/network/wifi-graph.d.ts.map +1 -1
  83. package/dist/esm/util/clone_class.d.ts.map +1 -1
  84. package/dist/esm/util/dev-mode-service.d.ts +14 -0
  85. package/dist/esm/util/dev-mode-service.d.ts.map +1 -0
  86. package/dist/esm/util/dev-mode-service.js +37 -0
  87. package/dist/esm/util/dev-mode-service.js.map +6 -0
  88. package/dist/esm/util/fire_event.d.ts.map +1 -1
  89. package/dist/esm/util/prevent_default.d.ts.map +1 -1
  90. package/dist/esm/util/theme-service.d.ts.map +1 -1
  91. package/dist/web/index.html +6 -0
  92. package/dist/web/js/attribute-write-dialog-BjBvI9Vg.js +166 -0
  93. package/dist/web/js/command-invoke-dialog-GfZXZjFc.js +192 -0
  94. package/dist/web/js/{commission-node-dialog-DfwKU9qk.js → commission-node-dialog-BAEMNaRj.js} +4 -4
  95. package/dist/web/js/{commission-node-existing-C7ITvNfj.js → commission-node-existing-NbcOLhCW.js} +2 -2
  96. package/dist/web/js/{commission-node-thread-D-icSzto.js → commission-node-thread-CPS6eA4_.js} +2 -2
  97. package/dist/web/js/{commission-node-wifi-DwUkXlWz.js → commission-node-wifi-DgnCq_XI.js} +2 -2
  98. package/dist/web/js/{dialog-box-BmpaTrvT.js → dialog-box-CRmSjFmJ.js} +1 -1
  99. package/dist/web/js/{fire_event-2ZxL-AHZ.js → fire_event-CMN0BnIt.js} +1 -1
  100. package/dist/web/js/main.js +2 -2
  101. package/dist/web/js/{matter-dashboard-app-BtHTmAPq.js → matter-dashboard-app-Cne9OvsE.js} +6201 -1897
  102. package/dist/web/js/{node-binding-dialog-MMx9rkCF.js → node-binding-dialog-C3d1oHJA.js} +1 -1
  103. package/dist/web/js/parse-json-payload-DU9TWKdu.js +32 -0
  104. package/dist/web/js/{log-level-dialog-D4hubdib.js → settings-dialog-WGqWo_ox.js} +583 -69
  105. package/package.json +29 -29
  106. package/src/client/models/descriptions.ts +5690 -1878
  107. package/src/components/dialogs/dev/attribute-write-dialog.ts +169 -0
  108. package/src/components/dialogs/dev/command-invoke-dialog.ts +204 -0
  109. package/src/components/dialogs/dev/parse-json-payload.ts +37 -0
  110. package/src/components/dialogs/dev/show-attribute-write-dialog.ts +30 -0
  111. package/src/components/dialogs/dev/show-command-invoke-dialog.ts +28 -0
  112. package/src/components/dialogs/settings/log-level-dialog.ts +15 -138
  113. package/src/components/dialogs/settings/log-level-section.ts +174 -0
  114. package/src/components/dialogs/settings/settings-dialog.ts +165 -0
  115. package/src/components/dialogs/settings/show-settings-dialog.ts +14 -0
  116. package/src/pages/components/header.ts +47 -3
  117. package/src/pages/matter-cluster-view.ts +366 -4
  118. package/src/pages/network/base-network-graph.ts +1 -1
  119. package/src/tsconfig.json +9 -2
  120. package/src/util/dev-mode-service.ts +44 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ const URL_PARAM = "dev";
7
+ class DevModeServiceImpl {
8
+ constructor() {
9
+ this._listeners = /* @__PURE__ */ new Set();
10
+ }
11
+ get active() {
12
+ const value = new URLSearchParams(window.location.search).get(URL_PARAM);
13
+ return value !== null && value !== "";
14
+ }
15
+ setActive(on) {
16
+ const url = new URL(window.location.href);
17
+ if (on) {
18
+ url.searchParams.set(URL_PARAM, "on");
19
+ } else {
20
+ url.searchParams.delete(URL_PARAM);
21
+ }
22
+ history.replaceState(null, "", url.toString());
23
+ const active = this.active;
24
+ this._listeners.forEach((cb) => cb(active));
25
+ }
26
+ subscribe(callback) {
27
+ this._listeners.add(callback);
28
+ return () => {
29
+ this._listeners.delete(callback);
30
+ };
31
+ }
32
+ }
33
+ const DevModeService = new DevModeServiceImpl();
34
+ export {
35
+ DevModeService
36
+ };
37
+ //# sourceMappingURL=dev-mode-service.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/dev-mode-service.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,MAAM,YAAY;AAElB,MAAM,mBAAmB;AAAA,EAAzB;AACI,SAAQ,aAA6C,oBAAI,IAAI;AAAA;AAAA,EAE7D,IAAI,SAAkB;AAClB,UAAM,QAAQ,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,SAAS;AACvE,WAAO,UAAU,QAAQ,UAAU;AAAA,EACvC;AAAA,EAEA,UAAU,IAAmB;AACzB,UAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,QAAI,IAAI;AACJ,UAAI,aAAa,IAAI,WAAW,IAAI;AAAA,IACxC,OAAO;AACH,UAAI,aAAa,OAAO,SAAS;AAAA,IACrC;AACA,YAAQ,aAAa,MAAM,IAAI,IAAI,SAAS,CAAC;AAC7C,UAAM,SAAS,KAAK;AACpB,SAAK,WAAW,QAAQ,QAAM,GAAG,MAAM,CAAC;AAAA,EAC5C;AAAA,EAEA,UAAU,UAAiD;AACvD,SAAK,WAAW,IAAI,QAAQ;AAC5B,WAAO,MAAM;AACT,WAAK,WAAW,OAAO,QAAQ;AAAA,IACnC;AAAA,EACJ;AACJ;AAEO,MAAM,iBAAiB,IAAI,mBAAmB;",
5
+ "names": []
6
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"fire_event.d.ts","sourceRoot":"","sources":["../../../src/util/fire_event.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgCH,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,aAAa;KAAG;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,YAAY,CAAC,CAAC,CAAE,SAAQ,KAAK;IAC1C,MAAM,EAAE,CAAC,CAAC;CACb;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,SAAS,iBAAiB,EACzD,MAAM,WAAW,GAAG,MAAM,EAC1B,MAAM,SAAS,EACf,SAAS,aAAa,CAAC,SAAS,CAAC,EACjC,UAAU;IACN,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,UAWJ,CAAC"}
1
+ {"version":3,"file":"fire_event.d.ts","sourceRoot":"","sources":["../../../src/util/fire_event.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgCH,OAAO,CAAC,MAAM,CAAC,CAAC;IACZ,UAAU,aAAa;KAAG;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,YAAY,CAAC,CAAC,CAAE,SAAQ,KAAK;IAC1C,MAAM,EAAE,CAAC,CAAC;CACb;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,SAAS,iBAAiB,QACnD,WAAW,GAAG,MAAM,QACpB,SAAS,WACN,aAAa,CAAC,SAAS,CAAC,YACvB;IACN,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,UAWJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"prevent_default.d.ts","sourceRoot":"","sources":["../../../src/util/prevent_default.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,cAAc,GAAI,IAAI,KAAK,SAAwB,CAAC"}
1
+ {"version":3,"file":"prevent_default.d.ts","sourceRoot":"","sources":["../../../src/util/prevent_default.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,cAAc,OAAQ,KAAK,SAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"theme-service.d.ts","sourceRoot":"","sources":["../../../src/util/theme-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AAEH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,CAAC;AAI9C,cAAM,gBAAgB;IAClB,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,UAAU,CAAmD;;IASrE,IAAI,UAAU,IAAI,eAAe,CAEhC;IAED,IAAI,cAAc,IAAI,cAAc,CAKnC;IAED,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAM1C,UAAU,IAAI,eAAe;IAQ7B,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAKhE,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,WAAW;CAYtB;AAED,eAAO,MAAM,YAAY,kBAAyB,CAAC"}
1
+ {"version":3,"file":"theme-service.d.ts","sourceRoot":"","sources":["../../../src/util/theme-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AAEH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,CAAC;AAI9C,cAAM,gBAAgB;IAClB,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,UAAU,CAAmD;IAErE,cAKC;IAED,IAAI,UAAU,IAAI,eAAe,CAEhC;IAED,IAAI,cAAc,IAAI,cAAc,CAKnC;IAED,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAIzC;IAED,UAAU,IAAI,eAAe,CAM5B;IAED,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAG/D;IAED,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,WAAW;CAYtB;AAED,eAAO,MAAM,YAAY,kBAAyB,CAAC"}
@@ -47,6 +47,10 @@
47
47
  --md-sys-color-outline: #79747e;
48
48
  --md-sys-color-outline-variant: #cac4d0;
49
49
 
50
+ /* Developer-mode accent (deep violet — distinct from primary-cyan and error-red) */
51
+ --dev-color: #5e35b1;
52
+ --dev-on-color: #ffffff;
53
+
50
54
  /* Graph / network semantic colors */
51
55
  --signal-color-strong: #4caf50;
52
56
  --signal-color-medium: #ff9800;
@@ -104,6 +108,8 @@
104
108
  --md-sys-color-on-primary-container: #d0e4ff;
105
109
  --md-sys-color-outline: #938f99;
106
110
  --md-sys-color-outline-variant: #49454f;
111
+ --dev-color: #b39ddb;
112
+ --dev-on-color: #311b92;
107
113
  --signal-color-strong: #66bb6a;
108
114
  --signal-color-medium: #ffa726;
109
115
  --signal-color-weak: #ef5350;
@@ -0,0 +1,166 @@
1
+ import { q as i, n, u as r, d as e, i as i$1, A, O as formatHex, j as b, K as handleAsync, t } from './matter-dashboard-app-Cne9OvsE.js';
2
+ import { t as toBigIntAwareJson } from './main.js';
3
+ import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
4
+ import { p as parseJsonPayload } from './parse-json-payload-DU9TWKdu.js';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
+ var __decorateClass = (decorators, target, key, kind) => {
9
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
10
+ for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
+ if (kind && result) __defProp(target, key, result);
12
+ return result;
13
+ };
14
+ let AttributeWriteDialog = class extends i$1 {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.currentValue = null;
18
+ this._busy = false;
19
+ this._error = null;
20
+ }
21
+ firstUpdated() {
22
+ if (this._textarea && this._textarea.value === "") {
23
+ this._textarea.value = toBigIntAwareJson(this.currentValue ?? null, 2);
24
+ }
25
+ }
26
+ get _attributePath() {
27
+ return `${this.endpointId}/${this.clusterId}/${this.attributeId}`;
28
+ }
29
+ _close() {
30
+ this.shadowRoot.querySelector("md-dialog").close();
31
+ }
32
+ _handleClosed() {
33
+ this.parentNode.removeChild(this);
34
+ }
35
+ async _write() {
36
+ this._error = null;
37
+ const parsed = parseJsonPayload(this._textarea.value);
38
+ if (!parsed.ok) {
39
+ this._error = `Invalid JSON: ${parsed.error}`;
40
+ return;
41
+ }
42
+ this._busy = true;
43
+ try {
44
+ await this.client.writeAttribute(this.nodeId, this._attributePath, parsed.value);
45
+ this._close();
46
+ } catch (err) {
47
+ this._error = err instanceof Error ? err.message : String(err);
48
+ } finally {
49
+ this._busy = false;
50
+ }
51
+ }
52
+ render() {
53
+ return b`
54
+ <md-dialog open @cancel=${preventDefault} @closed=${this._handleClosed}>
55
+ <div slot="headline">Write ${this.label}</div>
56
+ <div slot="content">
57
+ <p class="path" id="write-path">
58
+ Path <code>${this._attributePath}</code>
59
+ (${formatHex(this.endpointId)}/${formatHex(this.clusterId)}/${formatHex(this.attributeId)})
60
+ </p>
61
+ <label class="textarea-label" for="write-payload">Value (JSON)</label>
62
+ <textarea
63
+ id="write-payload"
64
+ class="payload"
65
+ spellcheck="false"
66
+ autocomplete="off"
67
+ autocapitalize="off"
68
+ aria-describedby="write-path${this._error ? " write-error" : ""}"
69
+ rows="10"
70
+ ></textarea>
71
+ ${this._error ? b`<div id="write-error" class="error" role="alert">${this._error}</div>` : A}
72
+ </div>
73
+ <div slot="actions">
74
+ <md-text-button @click=${this._close} ?disabled=${this._busy}>Cancel</md-text-button>
75
+ <md-text-button @click=${handleAsync(() => this._write())} ?disabled=${this._busy}>
76
+ ${this._busy ? "Writing..." : "Write"}
77
+ </md-text-button>
78
+ </div>
79
+ </md-dialog>
80
+ `;
81
+ }
82
+ };
83
+ AttributeWriteDialog.styles = i`
84
+ md-dialog {
85
+ min-width: 520px;
86
+ max-width: 720px;
87
+ }
88
+
89
+ .path {
90
+ margin: 0 0 12px 0;
91
+ font-size: 0.85rem;
92
+ color: var(--md-sys-color-on-surface-variant);
93
+ }
94
+
95
+ .path code {
96
+ font-family: var(--monospace-font);
97
+ background: var(--md-sys-color-surface-container-high);
98
+ padding: 0 4px;
99
+ border-radius: 3px;
100
+ }
101
+
102
+ .textarea-label {
103
+ display: block;
104
+ margin: 0 0 6px 0;
105
+ font-size: 0.85rem;
106
+ font-weight: 500;
107
+ color: var(--md-sys-color-on-surface);
108
+ }
109
+
110
+ .payload {
111
+ width: 100%;
112
+ box-sizing: border-box;
113
+ font-family: var(--monospace-font);
114
+ font-size: 0.9rem;
115
+ padding: 8px;
116
+ background: var(--md-sys-color-surface-container-low);
117
+ color: var(--md-sys-color-on-surface);
118
+ border: 1px solid var(--md-sys-color-outline);
119
+ border-radius: 6px;
120
+ resize: vertical;
121
+ min-height: 140px;
122
+ }
123
+
124
+ .payload:focus {
125
+ outline: 2px solid var(--dev-color);
126
+ outline-offset: -1px;
127
+ }
128
+
129
+ .error {
130
+ margin-top: 10px;
131
+ padding: 10px 12px;
132
+ background: var(--md-sys-color-error-container);
133
+ color: var(--md-sys-color-on-error-container);
134
+ border-radius: 6px;
135
+ font-size: 0.875rem;
136
+ white-space: pre-wrap;
137
+ word-break: break-word;
138
+ }
139
+ `;
140
+ __decorateClass([n({
141
+ attribute: false
142
+ })], AttributeWriteDialog.prototype, "client", 2);
143
+ __decorateClass([n({
144
+ type: Number
145
+ })], AttributeWriteDialog.prototype, "nodeId", 2);
146
+ __decorateClass([n({
147
+ type: Number
148
+ })], AttributeWriteDialog.prototype, "endpointId", 2);
149
+ __decorateClass([n({
150
+ type: Number
151
+ })], AttributeWriteDialog.prototype, "clusterId", 2);
152
+ __decorateClass([n({
153
+ type: Number
154
+ })], AttributeWriteDialog.prototype, "attributeId", 2);
155
+ __decorateClass([n({
156
+ type: String
157
+ })], AttributeWriteDialog.prototype, "label", 2);
158
+ __decorateClass([n({
159
+ attribute: false
160
+ })], AttributeWriteDialog.prototype, "currentValue", 2);
161
+ __decorateClass([r()], AttributeWriteDialog.prototype, "_busy", 2);
162
+ __decorateClass([r()], AttributeWriteDialog.prototype, "_error", 2);
163
+ __decorateClass([e("textarea")], AttributeWriteDialog.prototype, "_textarea", 2);
164
+ AttributeWriteDialog = __decorateClass([t("attribute-write-dialog")], AttributeWriteDialog);
165
+
166
+ export { AttributeWriteDialog };
@@ -0,0 +1,192 @@
1
+ import { q as i, n, u as r, d as e, i as i$1, A, O as formatHex, j as b, K as handleAsync, t } from './matter-dashboard-app-Cne9OvsE.js';
2
+ import { t as toBigIntAwareJson } from './main.js';
3
+ import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
4
+ import { p as parseJsonPayload, i as isPlainObject } from './parse-json-payload-DU9TWKdu.js';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
+ var __decorateClass = (decorators, target, key, kind) => {
9
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
10
+ for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
+ if (kind && result) __defProp(target, key, result);
12
+ return result;
13
+ };
14
+ let CommandInvokeDialog = class extends i$1 {
15
+ constructor() {
16
+ super(...arguments);
17
+ this._busy = false;
18
+ this._error = null;
19
+ this._response = null;
20
+ }
21
+ firstUpdated() {
22
+ if (this._textarea && this._textarea.value === "") {
23
+ this._textarea.value = "{}";
24
+ }
25
+ }
26
+ _close() {
27
+ this.shadowRoot.querySelector("md-dialog").close();
28
+ }
29
+ _handleClosed() {
30
+ this.parentNode.removeChild(this);
31
+ }
32
+ async _invoke() {
33
+ this._error = null;
34
+ const parsed = parseJsonPayload(this._textarea.value);
35
+ if (!parsed.ok) {
36
+ this._error = `Invalid JSON: ${parsed.error}`;
37
+ this._response = null;
38
+ return;
39
+ }
40
+ const payload = parsed.value;
41
+ if (!isPlainObject(payload)) {
42
+ this._error = "Payload must be a JSON object (use {} for commands with no arguments).";
43
+ this._response = null;
44
+ return;
45
+ }
46
+ this._busy = true;
47
+ try {
48
+ const result = await this.client.deviceCommand(this.nodeId, this.endpointId, this.clusterId, this.commandName, payload);
49
+ this._response = toBigIntAwareJson(result ?? null, 2);
50
+ this._error = null;
51
+ } catch (err) {
52
+ this._error = err instanceof Error ? err.message : String(err);
53
+ this._response = null;
54
+ } finally {
55
+ this._busy = false;
56
+ }
57
+ }
58
+ render() {
59
+ return b`
60
+ <md-dialog open @cancel=${preventDefault} @closed=${this._handleClosed}>
61
+ <div slot="headline">Invoke ${this.commandLabel}</div>
62
+ <div slot="content">
63
+ <p class="path" id="invoke-path">
64
+ Cluster <code>${this.clusterId}</code> (${formatHex(this.clusterId)}) · Endpoint
65
+ <code>${this.endpointId}</code> · Command <code>${this.commandName}</code>
66
+ </p>
67
+ <label class="textarea-label" for="payload">Payload (JSON)</label>
68
+ <textarea
69
+ id="payload"
70
+ class="payload"
71
+ spellcheck="false"
72
+ autocomplete="off"
73
+ autocapitalize="off"
74
+ aria-describedby="invoke-path${this._error ? " invoke-error" : ""}"
75
+ rows="8"
76
+ ></textarea>
77
+ ${this._error ? b`<div id="invoke-error" class="error" role="alert">${this._error}</div>` : A}
78
+ ${this._response !== null ? b`
79
+ <label class="textarea-label">Response</label>
80
+ <pre class="response"><code>${this._response}</code></pre>
81
+ ` : A}
82
+ </div>
83
+ <div slot="actions">
84
+ <md-text-button @click=${this._close} ?disabled=${this._busy}>Close</md-text-button>
85
+ <md-text-button @click=${handleAsync(() => this._invoke())} ?disabled=${this._busy}>
86
+ ${this._busy ? "Invoking..." : "Invoke"}
87
+ </md-text-button>
88
+ </div>
89
+ </md-dialog>
90
+ `;
91
+ }
92
+ };
93
+ CommandInvokeDialog.styles = i`
94
+ md-dialog {
95
+ min-width: 520px;
96
+ max-width: 720px;
97
+ }
98
+
99
+ .path {
100
+ margin: 0 0 12px 0;
101
+ font-size: 0.85rem;
102
+ color: var(--md-sys-color-on-surface-variant);
103
+ }
104
+
105
+ .path code {
106
+ font-family: var(--monospace-font);
107
+ background: var(--md-sys-color-surface-container-high);
108
+ padding: 0 4px;
109
+ border-radius: 3px;
110
+ }
111
+
112
+ .textarea-label {
113
+ display: block;
114
+ margin: 6px 0 6px 0;
115
+ font-size: 0.85rem;
116
+ font-weight: 500;
117
+ color: var(--md-sys-color-on-surface);
118
+ }
119
+
120
+ .payload {
121
+ width: 100%;
122
+ box-sizing: border-box;
123
+ font-family: var(--monospace-font);
124
+ font-size: 0.9rem;
125
+ padding: 8px;
126
+ background: var(--md-sys-color-surface-container-low);
127
+ color: var(--md-sys-color-on-surface);
128
+ border: 1px solid var(--md-sys-color-outline);
129
+ border-radius: 6px;
130
+ resize: vertical;
131
+ min-height: 120px;
132
+ }
133
+
134
+ .payload:focus {
135
+ outline: 2px solid var(--dev-color);
136
+ outline-offset: -1px;
137
+ }
138
+
139
+ .error {
140
+ margin-top: 10px;
141
+ padding: 10px 12px;
142
+ background: var(--md-sys-color-error-container);
143
+ color: var(--md-sys-color-on-error-container);
144
+ border-radius: 6px;
145
+ font-size: 0.875rem;
146
+ white-space: pre-wrap;
147
+ word-break: break-word;
148
+ }
149
+
150
+ .response {
151
+ margin: 6px 0 0 0;
152
+ padding: 10px 12px;
153
+ background: var(--md-sys-color-surface-container-low);
154
+ color: var(--md-sys-color-on-surface);
155
+ border: 1px solid var(--md-sys-color-outline);
156
+ border-radius: 6px;
157
+ max-height: 260px;
158
+ overflow: auto;
159
+ font-size: 0.85rem;
160
+ }
161
+
162
+ .response code {
163
+ font-family: var(--monospace-font);
164
+ white-space: pre-wrap;
165
+ word-break: break-word;
166
+ }
167
+ `;
168
+ __decorateClass([n({
169
+ attribute: false
170
+ })], CommandInvokeDialog.prototype, "client", 2);
171
+ __decorateClass([n({
172
+ type: Number
173
+ })], CommandInvokeDialog.prototype, "nodeId", 2);
174
+ __decorateClass([n({
175
+ type: Number
176
+ })], CommandInvokeDialog.prototype, "endpointId", 2);
177
+ __decorateClass([n({
178
+ type: Number
179
+ })], CommandInvokeDialog.prototype, "clusterId", 2);
180
+ __decorateClass([n({
181
+ type: String
182
+ })], CommandInvokeDialog.prototype, "commandName", 2);
183
+ __decorateClass([n({
184
+ type: String
185
+ })], CommandInvokeDialog.prototype, "commandLabel", 2);
186
+ __decorateClass([r()], CommandInvokeDialog.prototype, "_busy", 2);
187
+ __decorateClass([r()], CommandInvokeDialog.prototype, "_error", 2);
188
+ __decorateClass([r()], CommandInvokeDialog.prototype, "_response", 2);
189
+ __decorateClass([e("textarea")], CommandInvokeDialog.prototype, "_textarea", 2);
190
+ CommandInvokeDialog = __decorateClass([t("command-invoke-dialog")], CommandInvokeDialog);
191
+
192
+ export { CommandInvokeDialog };
@@ -1,4 +1,4 @@
1
- import { r, n, t, i, j as b } from './matter-dashboard-app-BtHTmAPq.js';
1
+ import { u as r, n, t, i, j as b } from './matter-dashboard-app-Cne9OvsE.js';
2
2
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
3
3
  import './main.js';
4
4
 
@@ -44,18 +44,18 @@ let ComissionNodeDialog = class extends i {
44
44
  if (!this.client.serverInfo.bluetooth_enabled) {
45
45
  return;
46
46
  }
47
- import('./commission-node-wifi-DwUkXlWz.js');
47
+ import('./commission-node-wifi-DgnCq_XI.js');
48
48
  this._mode = "wifi";
49
49
  }
50
50
  _commissionThread() {
51
51
  if (!this.client.serverInfo.bluetooth_enabled) {
52
52
  return;
53
53
  }
54
- import('./commission-node-thread-D-icSzto.js');
54
+ import('./commission-node-thread-CPS6eA4_.js');
55
55
  this._mode = "thread";
56
56
  }
57
57
  _commissionExisting() {
58
- import('./commission-node-existing-C7ITvNfj.js');
58
+ import('./commission-node-existing-NbcOLhCW.js');
59
59
  this._mode = "existing";
60
60
  }
61
61
  _nodeCommissioned(ev) {
@@ -1,5 +1,5 @@
1
- import { r, H as c, I as clientContext, n, a as e, t, i, A, G as handleAsync, j as b, F as showAlertDialog } from './matter-dashboard-app-BtHTmAPq.js';
2
- import { f as fireEvent } from './fire_event-2ZxL-AHZ.js';
1
+ import { u as r, P as c, Q as clientContext, n, d as e, t, i, A, K as handleAsync, j as b, J as showAlertDialog } from './matter-dashboard-app-Cne9OvsE.js';
2
+ import { f as fireEvent } from './fire_event-CMN0BnIt.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -1,5 +1,5 @@
1
- import { r, H as c, I as clientContext, n, a as e, t, i, A, G as handleAsync, j as b, F as showAlertDialog } from './matter-dashboard-app-BtHTmAPq.js';
2
- import { f as fireEvent } from './fire_event-2ZxL-AHZ.js';
1
+ import { u as r, P as c, Q as clientContext, n, d as e, t, i, A, K as handleAsync, j as b, J as showAlertDialog } from './matter-dashboard-app-Cne9OvsE.js';
2
+ import { f as fireEvent } from './fire_event-CMN0BnIt.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -1,5 +1,5 @@
1
- import { r, H as c, I as clientContext, n, a as e, t, i, A, G as handleAsync, j as b, F as showAlertDialog } from './matter-dashboard-app-BtHTmAPq.js';
2
- import { f as fireEvent } from './fire_event-2ZxL-AHZ.js';
1
+ import { u as r, P as c, Q as clientContext, n, d as e, t, i, A, K as handleAsync, j as b, J as showAlertDialog } from './matter-dashboard-app-Cne9OvsE.js';
2
+ import { f as fireEvent } from './fire_event-CMN0BnIt.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- import { k as i, n, i as i$1, j as b, t } from './matter-dashboard-app-BtHTmAPq.js';
1
+ import { q as i, n, i as i$1, j as b, t } from './matter-dashboard-app-Cne9OvsE.js';
2
2
  import { p as preventDefault } from './prevent_default-D-ohDGsN.js';
3
3
  import './main.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { m as mixinDelegatesAria, i, _ as __decorate, n, A, f as e, j as b, k as i$1, t } from './matter-dashboard-app-BtHTmAPq.js';
1
+ import { m as mixinDelegatesAria, i, _ as __decorate, n, A, h as e, j as b, q as i$1, t } from './matter-dashboard-app-Cne9OvsE.js';
2
2
 
3
3
  /**
4
4
  * @license
@@ -757,7 +757,7 @@ const ThemeService = new ThemeServiceImpl();
757
757
  * SPDX-License-Identifier: Apache-2.0
758
758
  */
759
759
  async function main() {
760
- import('./matter-dashboard-app-BtHTmAPq.js').then(function (n) { return n.K; });
760
+ import('./matter-dashboard-app-Cne9OvsE.js').then(function (n) { return n.S; });
761
761
  let url = "";
762
762
  const isProductionServer = window.__MATTERJS_PRODUCTION_MODE__ === true || location.origin.includes(":5580") || location.href.includes("hassio_ingress") || location.href.includes("/api/ingress/");
763
763
  if (!isProductionServer) {
@@ -792,4 +792,4 @@ async function main() {
792
792
  }
793
793
  main();
794
794
 
795
- export { ThemeService as T, toBigIntAwareJson as t };
795
+ export { ThemeService as T, parseBigIntAwareJson as p, toBigIntAwareJson as t };