@matter-server/dashboard 0.2.6 → 0.2.7-alpha.0-20260118-45c7af0

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 (53) hide show
  1. package/README.md +16 -0
  2. package/dist/esm/client/models/descriptions.js +1754 -1754
  3. package/dist/esm/components/dialogs/binding/node-binding-dialog.d.ts.map +1 -1
  4. package/dist/esm/components/dialogs/binding/node-binding-dialog.js +8 -4
  5. package/dist/esm/components/dialogs/binding/node-binding-dialog.js.map +1 -1
  6. package/dist/esm/components/dialogs/settings/log-level-dialog.d.ts +33 -0
  7. package/dist/esm/components/dialogs/settings/log-level-dialog.d.ts.map +1 -0
  8. package/dist/esm/components/dialogs/settings/log-level-dialog.js +185 -0
  9. package/dist/esm/components/dialogs/settings/log-level-dialog.js.map +6 -0
  10. package/dist/esm/components/dialogs/settings/show-log-level-dialog.d.ts +8 -0
  11. package/dist/esm/components/dialogs/settings/show-log-level-dialog.d.ts.map +1 -0
  12. package/dist/esm/components/dialogs/settings/show-log-level-dialog.js +15 -0
  13. package/dist/esm/components/dialogs/settings/show-log-level-dialog.js.map +6 -0
  14. package/dist/esm/entrypoint/main.d.ts +1 -1
  15. package/dist/esm/entrypoint/main.d.ts.map +1 -1
  16. package/dist/esm/entrypoint/main.js +1 -0
  17. package/dist/esm/entrypoint/main.js.map +1 -1
  18. package/dist/esm/pages/components/header.d.ts +9 -0
  19. package/dist/esm/pages/components/header.d.ts.map +1 -1
  20. package/dist/esm/pages/components/header.js +68 -6
  21. package/dist/esm/pages/components/header.js.map +1 -1
  22. package/dist/esm/pages/matter-dashboard-app.d.ts +6 -1
  23. package/dist/esm/pages/matter-dashboard-app.d.ts.map +1 -1
  24. package/dist/esm/pages/matter-dashboard-app.js +119 -24
  25. package/dist/esm/pages/matter-dashboard-app.js.map +1 -1
  26. package/dist/esm/util/theme-service.d.ts +27 -0
  27. package/dist/esm/util/theme-service.d.ts.map +1 -0
  28. package/dist/esm/util/theme-service.js +71 -0
  29. package/dist/esm/util/theme-service.js.map +6 -0
  30. package/dist/web/index.html +35 -0
  31. package/dist/web/js/{commission-node-dialog--19-sX9D.js → commission-node-dialog-CoaDIV2Y.js} +5 -5
  32. package/dist/web/js/{commission-node-existing-DY6SnsHb.js → commission-node-existing-DEU_mJjO.js} +5 -4
  33. package/dist/web/js/{commission-node-thread-CXquVvK5.js → commission-node-thread-DZ6DghSs.js} +5 -4
  34. package/dist/web/js/{commission-node-wifi-VQGVOrr7.js → commission-node-wifi-DOyin0q3.js} +5 -4
  35. package/dist/web/js/{dialog-box-qX-alVZJ.js → dialog-box-B5sunUPv.js} +2 -2
  36. package/dist/web/js/{fire_event-B13DcOc9.js → fire_event-C9Duc1j-.js} +1 -1
  37. package/dist/web/js/log-level-dialog-B7LsZYUL.js +3232 -0
  38. package/dist/web/js/main.js +163 -8
  39. package/dist/web/js/{matter-dashboard-app-CU3-L2nl.js → matter-dashboard-app-DlHSE_Qh.js} +13253 -13039
  40. package/dist/web/js/{node-binding-dialog-D4rr_G9I.js → node-binding-dialog-BifZsigR.js} +12 -7
  41. package/dist/web/js/outlined-text-field-D2BOt1yD.js +968 -0
  42. package/dist/web/js/{prevent_default-Dw7ifAL-.js → prevent_default-CuW2EnKR.js} +1 -1
  43. package/dist/web/js/validator-MOJiFndw.js +1122 -0
  44. package/package.json +4 -4
  45. package/src/client/models/descriptions.ts +1754 -1754
  46. package/src/components/dialogs/binding/node-binding-dialog.ts +8 -4
  47. package/src/components/dialogs/settings/log-level-dialog.ts +179 -0
  48. package/src/components/dialogs/settings/show-log-level-dialog.ts +14 -0
  49. package/src/entrypoint/main.ts +1 -0
  50. package/src/pages/components/header.ts +72 -8
  51. package/src/pages/matter-dashboard-app.ts +123 -26
  52. package/src/util/theme-service.ts +98 -0
  53. package/dist/web/js/outlined-text-field-CtlEkpbk.js +0 -2086
@@ -14,10 +14,13 @@ var __decorateClass = (decorators, target, key, kind) => {
14
14
  * SPDX-License-Identifier: Apache-2.0
15
15
  */
16
16
  import { ContextProvider } from "@lit/context";
17
- import { LitElement, html } from "lit";
17
+ import { mdiRefresh } from "@mdi/js";
18
+ import { LitElement, css, html } from "lit";
18
19
  import { customElement, state } from "lit/decorators.js";
19
20
  import { clientContext } from "../client/client-context.js";
21
+ import "../components/ha-svg-icon";
20
22
  import { clone } from "../util/clone_class.js";
23
+ import "./components/header";
21
24
  import "./matter-cluster-view";
22
25
  import "./matter-endpoint-view";
23
26
  import "./matter-node-view";
@@ -31,28 +34,14 @@ let MatterDashboardApp = class extends LitElement {
31
34
  };
32
35
  this._state = "connecting";
33
36
  this.provider = new ContextProvider(this, { context: clientContext, initialValue: this.client });
37
+ this._reconnect = () => {
38
+ this._state = "connecting";
39
+ this._connect();
40
+ };
34
41
  }
35
42
  firstUpdated(_changedProperties) {
36
43
  super.firstUpdated(_changedProperties);
37
- this.client.startListening().then(
38
- () => {
39
- this._state = "connected";
40
- this.client.addEventListener("nodes_changed", () => {
41
- this.requestUpdate();
42
- this.provider.setValue(clone(this.client));
43
- });
44
- this.client.addEventListener("server_info_updated", () => {
45
- this.provider.setValue(clone(this.client));
46
- });
47
- this.client.addEventListener("connection_lost", () => {
48
- this._state = "disconnected";
49
- });
50
- },
51
- (err) => {
52
- this._state = "error";
53
- this._error = err.message;
54
- }
55
- );
44
+ this._connect();
56
45
  const updateRoute = () => {
57
46
  const pathParts = location.hash.substring(1).split("/");
58
47
  this._route = {
@@ -63,17 +52,66 @@ let MatterDashboardApp = class extends LitElement {
63
52
  window.addEventListener("hashchange", updateRoute);
64
53
  updateRoute();
65
54
  }
55
+ _connect() {
56
+ this.client.startListening().then(
57
+ () => {
58
+ this._state = "connected";
59
+ this._setupEventListeners();
60
+ },
61
+ (_err) => {
62
+ this._state = "error";
63
+ }
64
+ );
65
+ }
66
+ _setupEventListeners() {
67
+ this.client.addEventListener("nodes_changed", () => {
68
+ this.requestUpdate();
69
+ this.provider.setValue(clone(this.client));
70
+ });
71
+ this.client.addEventListener("server_info_updated", () => {
72
+ this.provider.setValue(clone(this.client));
73
+ });
74
+ this.client.addEventListener("connection_lost", () => {
75
+ this._state = "disconnected";
76
+ });
77
+ }
66
78
  render() {
67
79
  if (this._state === "connecting") {
68
- return html`<p>Connecting...</p>`;
80
+ return html`
81
+ <dashboard-header title="Matter Server"></dashboard-header>
82
+ <div class="status-page">
83
+ <p class="status-message">Connecting...</p>
84
+ </div>
85
+ `;
69
86
  }
70
87
  if (this._state === "disconnected") {
71
- return html`<p>Connection lost</p>`;
88
+ return html`
89
+ <dashboard-header title="Matter Server"></dashboard-header>
90
+ <div class="status-page">
91
+ <p class="status-message error">Connection lost</p>
92
+ <p class="status-hint">
93
+ The connection to the Matter Server was lost. Please check if the server is running.
94
+ </p>
95
+ <button class="retry-button" @click=${this._reconnect}>
96
+ <ha-svg-icon .path=${mdiRefresh}></ha-svg-icon>
97
+ Reconnect
98
+ </button>
99
+ </div>
100
+ `;
72
101
  }
73
102
  if (this._state === "error") {
74
103
  return html`
75
- <p>Error: ${this._error}</p>
76
- <button @click=${this.client.disconnect}>Clear stored URL</button>
104
+ <dashboard-header title="Matter Server"></dashboard-header>
105
+ <div class="status-page">
106
+ <p class="status-message error">No connection</p>
107
+ <p class="status-hint">
108
+ Unable to connect to the Matter Server. Please check if the server is running.
109
+ </p>
110
+ <button class="retry-button" @click=${this._reconnect}>
111
+ <ha-svg-icon .path=${mdiRefresh}></ha-svg-icon>
112
+ Reconnect
113
+ </button>
114
+ </div>
77
115
  `;
78
116
  }
79
117
  if (this._route.prefix === "node" && this._route.path.length == 3) {
@@ -110,6 +148,63 @@ let MatterDashboardApp = class extends LitElement {
110
148
  ></matter-server-view>`;
111
149
  }
112
150
  };
151
+ MatterDashboardApp.styles = css`
152
+ :host {
153
+ display: block;
154
+ min-height: 100vh;
155
+ background-color: var(--md-sys-color-background);
156
+ }
157
+
158
+ .status-page {
159
+ display: flex;
160
+ flex-direction: column;
161
+ align-items: center;
162
+ justify-content: center;
163
+ padding: 48px 24px;
164
+ text-align: center;
165
+ }
166
+
167
+ .status-message {
168
+ font-size: 1.5rem;
169
+ color: var(--md-sys-color-on-background);
170
+ margin: 0 0 16px 0;
171
+ }
172
+
173
+ .status-message.error {
174
+ color: var(--danger-color);
175
+ }
176
+
177
+ .status-hint {
178
+ font-size: 1rem;
179
+ color: var(--md-sys-color-on-surface-variant);
180
+ margin: 0;
181
+ max-width: 400px;
182
+ }
183
+
184
+ .retry-button {
185
+ display: inline-flex;
186
+ align-items: center;
187
+ gap: 8px;
188
+ margin-top: 24px;
189
+ padding: 12px 24px;
190
+ font-size: 1rem;
191
+ background-color: var(--md-sys-color-primary);
192
+ color: var(--md-sys-color-on-primary);
193
+ --icon-primary-color: var(--md-sys-color-on-primary);
194
+ border: none;
195
+ border-radius: 4px;
196
+ cursor: pointer;
197
+ }
198
+
199
+ .retry-button:hover {
200
+ opacity: 0.9;
201
+ }
202
+
203
+ .retry-button ha-svg-icon {
204
+ width: 20px;
205
+ height: 20px;
206
+ }
207
+ `;
113
208
  __decorateClass([
114
209
  state()
115
210
  ], MatterDashboardApp.prototype, "_route", 2);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/pages/matter-dashboard-app.ts"],
4
- "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,uBAAuB;AAEhC,SAAS,YAA8B,YAAY;AACnD,SAAS,eAAe,aAAa;AACrC,SAAS,qBAAqB;AAC9B,SAAS,aAAa;AAEtB,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AASP,IAAM,qBAAN,cAAiC,WAAW;AAAA,EAA5C;AAAA;AACa,SAAQ,SAAgB;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,CAAC;AAAA,IACX;AAKA,SAAQ,SAAgE;AAIxE,SAAQ,WAAW,IAAI,gBAAgB,MAAM,EAAE,SAAS,eAAe,cAAc,KAAK,OAAO,CAAC;AAAA;AAAA,EAE/E,aAAa,oBAA6E;AACzG,UAAM,aAAa,kBAAkB;AACrC,SAAK,OAAO,eAAe,EAAE;AAAA,MACzB,MAAM;AACF,aAAK,SAAS;AACd,aAAK,OAAO,iBAAiB,iBAAiB,MAAM;AAChD,eAAK,cAAc;AACnB,eAAK,SAAS,SAAS,MAAM,KAAK,MAAM,CAAC;AAAA,QAC7C,CAAC;AACD,aAAK,OAAO,iBAAiB,uBAAuB,MAAM;AACtD,eAAK,SAAS,SAAS,MAAM,KAAK,MAAM,CAAC;AAAA,QAC7C,CAAC;AACD,aAAK,OAAO,iBAAiB,mBAAmB,MAAM;AAClD,eAAK,SAAS;AAAA,QAClB,CAAC;AAAA,MACL;AAAA,MACA,CAAC,QAAqB;AAClB,aAAK,SAAS;AACd,aAAK,SAAS,IAAI;AAAA,MACtB;AAAA,IACJ;AAGA,UAAM,cAAc,MAAM;AACtB,YAAM,YAAY,SAAS,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG;AACtD,WAAK,SAAS;AAAA,QACV,QAAQ,UAAU,UAAU,IAAI,KAAK,UAAU,CAAC;AAAA,QAChD,MAAM,UAAU,UAAU,IAAI,YAAY,UAAU,MAAM,CAAC;AAAA,MAC/D;AAAA,IACJ;AACA,WAAO,iBAAiB,cAAc,WAAW;AACjD,gBAAY;AAAA,EAChB;AAAA,EAES,SAAS;AACd,QAAI,KAAK,WAAW,cAAc;AAC9B,aAAO;AAAA,IACX;AACA,QAAI,KAAK,WAAW,gBAAgB;AAChC,aAAO;AAAA,IACX;AACA,QAAI,KAAK,WAAW,SAAS;AACzB,aAAO;AAAA,4BACS,KAAK,MAAM;AAAA,iCACN,KAAK,OAAO,UAAU;AAAA;AAAA,IAE/C;AACA,QAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,KAAK,UAAU,GAAG;AAE/D,aAAO;AAAA;AAAA,8BAEW,KAAK,MAAM;AAAA,4BACb,KAAK,OAAO,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,gCAClC,SAAS,KAAK,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;AAAA,+BAClC,SAAS,KAAK,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;AAAA;AAAA;AAAA,IAGxD;AACA,QAAI,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,KAAK,UAAU,GAAG;AAE/D,aAAO;AAAA;AAAA,8BAEW,KAAK,MAAM;AAAA,4BACb,KAAK,OAAO,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,gCAClC,SAAS,KAAK,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;AAAA;AAAA;AAAA,IAGzD;AACA,QAAI,KAAK,OAAO,WAAW,QAAQ;AAE/B,aAAO;AAAA;AAAA,8BAEW,KAAK,MAAM;AAAA,4BACb,KAAK,OAAO,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA,IAG1D;AAEA,WAAO;AAAA,sBACO,KAAK,MAAM;AAAA,qBACZ,KAAK,OAAO,KAAK;AAAA,qBACjB,KAAK,MAAM;AAAA;AAAA,EAE5B;AACJ;AAlGqB;AAAA,EAAhB,MAAM;AAAA,GADL,mBACe;AAQT;AAAA,EADP,MAAM;AAAA,GARL,mBASM;AATN,qBAAN;AAAA,EADC,cAAc,sBAAsB;AAAA,GAC/B;",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Theme service for managing dark/light mode preferences.
8
+ * Supports three modes: light, dark, and system (auto-detect from OS).
9
+ */
10
+ export type ThemePreference = "light" | "dark" | "system";
11
+ export type EffectiveTheme = "light" | "dark";
12
+ declare class ThemeServiceImpl {
13
+ private _preference;
14
+ private _mediaQuery;
15
+ private _listeners;
16
+ constructor();
17
+ get preference(): ThemePreference;
18
+ get effectiveTheme(): EffectiveTheme;
19
+ setPreference(pref: ThemePreference): void;
20
+ cycleTheme(): ThemePreference;
21
+ subscribe(callback: (theme: EffectiveTheme) => void): () => void;
22
+ private _loadPreference;
23
+ private _applyTheme;
24
+ }
25
+ export declare const ThemeService: ThemeServiceImpl;
26
+ export {};
27
+ //# sourceMappingURL=theme-service.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ const STORAGE_KEY = "matterTheme";
7
+ class ThemeServiceImpl {
8
+ constructor() {
9
+ this._preference = "system";
10
+ this._listeners = /* @__PURE__ */ new Set();
11
+ this._mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
12
+ this._mediaQuery.addEventListener("change", () => this._applyTheme());
13
+ this._loadPreference();
14
+ this._applyTheme();
15
+ }
16
+ get preference() {
17
+ return this._preference;
18
+ }
19
+ get effectiveTheme() {
20
+ if (this._preference === "system") {
21
+ return this._mediaQuery.matches ? "dark" : "light";
22
+ }
23
+ return this._preference;
24
+ }
25
+ setPreference(pref) {
26
+ this._preference = pref;
27
+ localStorage.setItem(STORAGE_KEY, pref);
28
+ this._applyTheme();
29
+ }
30
+ cycleTheme() {
31
+ const cycle = ["light", "dark", "system"];
32
+ const currentIndex = cycle.indexOf(this._preference);
33
+ const nextIndex = (currentIndex + 1) % cycle.length;
34
+ this.setPreference(cycle[nextIndex]);
35
+ return this._preference;
36
+ }
37
+ subscribe(callback) {
38
+ this._listeners.add(callback);
39
+ return () => this._listeners.delete(callback);
40
+ }
41
+ _loadPreference() {
42
+ const urlParams = new URLSearchParams(window.location.search);
43
+ const themeParam = urlParams.get("theme");
44
+ if (themeParam && ["light", "dark", "system"].includes(themeParam)) {
45
+ this._preference = themeParam;
46
+ localStorage.setItem(STORAGE_KEY, themeParam);
47
+ urlParams.delete("theme");
48
+ const newUrl = urlParams.toString() ? `${window.location.pathname}?${urlParams.toString()}${window.location.hash}` : `${window.location.pathname}${window.location.hash}`;
49
+ history.replaceState({}, "", newUrl);
50
+ return;
51
+ }
52
+ const stored = localStorage.getItem(STORAGE_KEY);
53
+ if (stored && ["light", "dark", "system"].includes(stored)) {
54
+ this._preference = stored;
55
+ }
56
+ }
57
+ _applyTheme() {
58
+ const effective = this.effectiveTheme;
59
+ document.documentElement.classList.toggle("dark-theme", effective === "dark");
60
+ const metaThemeColor = document.querySelector('meta[name="theme-color"]');
61
+ if (metaThemeColor) {
62
+ metaThemeColor.setAttribute("content", effective === "dark" ? "#1e1e1e" : "#03a9f4");
63
+ }
64
+ this._listeners.forEach((cb) => cb(effective));
65
+ }
66
+ }
67
+ const ThemeService = new ThemeServiceImpl();
68
+ export {
69
+ ThemeService
70
+ };
71
+ //# sourceMappingURL=theme-service.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/theme-service.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,MAAM,cAAc;AAEpB,MAAM,iBAAiB;AAAA,EAKnB,cAAc;AAJd,SAAQ,cAA+B;AAEvC,SAAQ,aAAmD,oBAAI,IAAI;AAG/D,SAAK,cAAc,OAAO,WAAW,8BAA8B;AACnE,SAAK,YAAY,iBAAiB,UAAU,MAAM,KAAK,YAAY,CAAC;AACpE,SAAK,gBAAgB;AACrB,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,IAAI,aAA8B;AAC9B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,iBAAiC;AACjC,QAAI,KAAK,gBAAgB,UAAU;AAC/B,aAAO,KAAK,YAAY,UAAU,SAAS;AAAA,IAC/C;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,cAAc,MAA6B;AACvC,SAAK,cAAc;AACnB,iBAAa,QAAQ,aAAa,IAAI;AACtC,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,aAA8B;AAC1B,UAAM,QAA2B,CAAC,SAAS,QAAQ,QAAQ;AAC3D,UAAM,eAAe,MAAM,QAAQ,KAAK,WAAW;AACnD,UAAM,aAAa,eAAe,KAAK,MAAM;AAC7C,SAAK,cAAc,MAAM,SAAS,CAAC;AACnC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,UAAU,UAAuD;AAC7D,SAAK,WAAW,IAAI,QAAQ;AAC5B,WAAO,MAAM,KAAK,WAAW,OAAO,QAAQ;AAAA,EAChD;AAAA,EAEQ,kBAAwB;AAE5B,UAAM,YAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC5D,UAAM,aAAa,UAAU,IAAI,OAAO;AACxC,QAAI,cAAc,CAAC,SAAS,QAAQ,QAAQ,EAAE,SAAS,UAAU,GAAG;AAEhE,WAAK,cAAc;AACnB,mBAAa,QAAQ,aAAa,UAAU;AAE5C,gBAAU,OAAO,OAAO;AACxB,YAAM,SAAS,UAAU,SAAS,IAC5B,GAAG,OAAO,SAAS,QAAQ,IAAI,UAAU,SAAS,CAAC,GAAG,OAAO,SAAS,IAAI,KAC1E,GAAG,OAAO,SAAS,QAAQ,GAAG,OAAO,SAAS,IAAI;AACxD,cAAQ,aAAa,CAAC,GAAG,IAAI,MAAM;AACnC;AAAA,IACJ;AAGA,UAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,QAAI,UAAU,CAAC,SAAS,QAAQ,QAAQ,EAAE,SAAS,MAAM,GAAG;AACxD,WAAK,cAAc;AAAA,IACvB;AAAA,EAEJ;AAAA,EAEQ,cAAoB;AACxB,UAAM,YAAY,KAAK;AACvB,aAAS,gBAAgB,UAAU,OAAO,cAAc,cAAc,MAAM;AAG5E,UAAM,iBAAiB,SAAS,cAAc,0BAA0B;AACxE,QAAI,gBAAgB;AAChB,qBAAe,aAAa,WAAW,cAAc,SAAS,YAAY,SAAS;AAAA,IACvF;AAEA,SAAK,WAAW,QAAQ,QAAM,GAAG,SAAS,CAAC;AAAA,EAC/C;AACJ;AAEO,MAAM,eAAe,IAAI,iBAAiB;",
5
+ "names": []
6
+ }
@@ -17,11 +17,18 @@
17
17
  --md-ref-typeface-plain: var(--roboto-font);
18
18
 
19
19
  --md-sys-color-background: #f5f5f5;
20
+ --md-sys-color-on-background: #1c1b1f;
20
21
  --md-sys-color-surface: #fff;
22
+ --md-sys-color-on-surface: #1c1b1f;
23
+ --md-sys-color-on-surface-variant: #49454f;
24
+ --md-sys-color-surface-variant: #e7e0ec;
21
25
  --md-sys-color-surface-container: #fff;
26
+ --md-sys-color-surface-container-low: #f7f2fa;
22
27
  --md-sys-color-surface-container-high: #fff;
23
28
  --md-sys-color-surface-container-highest: #f5f5f5;
24
29
  --md-sys-color-secondary-container: #e0e0e0;
30
+ --md-sys-color-outline: #79747e;
31
+ --md-sys-color-outline-variant: #cac4d0;
25
32
 
26
33
  --md-sys-typescale-headline-font: var(--roboto-font);
27
34
  --md-sys-typescale-title-font: var(--roboto-font);
@@ -31,9 +38,37 @@
31
38
  font-family: var(--roboto-font);
32
39
  }
33
40
 
41
+ body {
42
+ --primary-color: var(--md-sys-color-primary);
43
+ }
44
+
34
45
  a {
35
46
  color: var(--primary-color);
36
47
  }
48
+
49
+ /* Dark theme overrides */
50
+ html.dark-theme body {
51
+ --md-sys-color-primary: #4fc3f7;
52
+ --md-sys-color-on-primary: #003544;
53
+ --md-sys-color-background: #121212;
54
+ --md-sys-color-on-background: #e6e1e5;
55
+ --md-sys-color-surface: #1e1e1e;
56
+ --md-sys-color-on-surface: #e6e1e5;
57
+ --md-sys-color-on-surface-variant: #cac4d0;
58
+ --md-sys-color-surface-variant: #49454f;
59
+ --md-sys-color-surface-container: #1e1e1e;
60
+ --md-sys-color-surface-container-low: #1a1a1a;
61
+ --md-sys-color-surface-container-high: #2b2b2b;
62
+ --md-sys-color-surface-container-highest: #363636;
63
+ --md-sys-color-secondary-container: #4a4458;
64
+ --md-sys-color-on-secondary-container: #e8def8;
65
+ --md-sys-color-outline: #938f99;
66
+ --md-sys-color-outline-variant: #49454f;
67
+ --text-color: rgba(255, 255, 255, 0.6);
68
+ --danger-color: #ff7961;
69
+ --primary-color: #4fc3f7;
70
+ color-scheme: dark;
71
+ }
37
72
  </style>
38
73
  </head>
39
74
  <body></body>
@@ -1,5 +1,5 @@
1
- import { r, n, t, i, b } from './matter-dashboard-app-CU3-L2nl.js';
2
- import { p as preventDefault } from './prevent_default-Dw7ifAL-.js';
1
+ import { r, n, t, i, h as b } from './matter-dashboard-app-DlHSE_Qh.js';
2
+ import { p as preventDefault } from './prevent_default-CuW2EnKR.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -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-VQGVOrr7.js');
47
+ import('./commission-node-wifi-DOyin0q3.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-CXquVvK5.js');
54
+ import('./commission-node-thread-DZ6DghSs.js');
55
55
  this._mode = "thread";
56
56
  }
57
57
  _commissionExisting() {
58
- import('./commission-node-existing-DY6SnsHb.js');
58
+ import('./commission-node-existing-DEU_mJjO.js');
59
59
  this._mode = "existing";
60
60
  }
61
61
  _nodeCommissioned(ev) {
@@ -1,8 +1,9 @@
1
- import { r, c, n, d as clientContext, e, t, i, A, b } from './matter-dashboard-app-CU3-L2nl.js';
2
- import { f as fireEvent } from './fire_event-B13DcOc9.js';
3
- import './outlined-text-field-CtlEkpbk.js';
1
+ import { r, p as c, n, q as clientContext, a as e, t, i, A, h as b } from './matter-dashboard-app-DlHSE_Qh.js';
2
+ import { f as fireEvent } from './fire_event-C9Duc1j-.js';
3
+ import './outlined-text-field-D2BOt1yD.js';
4
4
  import './main.js';
5
- import './prevent_default-Dw7ifAL-.js';
5
+ import './validator-MOJiFndw.js';
6
+ import './prevent_default-CuW2EnKR.js';
6
7
 
7
8
  var __defProp = Object.defineProperty;
8
9
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,8 +1,9 @@
1
- import { r, c, n, d as clientContext, e, t, i, A, b } from './matter-dashboard-app-CU3-L2nl.js';
2
- import { f as fireEvent } from './fire_event-B13DcOc9.js';
3
- import './outlined-text-field-CtlEkpbk.js';
1
+ import { r, p as c, n, q as clientContext, a as e, t, i, A, h as b } from './matter-dashboard-app-DlHSE_Qh.js';
2
+ import { f as fireEvent } from './fire_event-C9Duc1j-.js';
3
+ import './outlined-text-field-D2BOt1yD.js';
4
4
  import './main.js';
5
- import './prevent_default-Dw7ifAL-.js';
5
+ import './validator-MOJiFndw.js';
6
+ import './prevent_default-CuW2EnKR.js';
6
7
 
7
8
  var __defProp = Object.defineProperty;
8
9
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,8 +1,9 @@
1
- import { r, c, n, d as clientContext, e, t, i, A, b } from './matter-dashboard-app-CU3-L2nl.js';
2
- import { f as fireEvent } from './fire_event-B13DcOc9.js';
3
- import './outlined-text-field-CtlEkpbk.js';
1
+ import { r, p as c, n, q as clientContext, a as e, t, i, A, h as b } from './matter-dashboard-app-DlHSE_Qh.js';
2
+ import { f as fireEvent } from './fire_event-C9Duc1j-.js';
3
+ import './outlined-text-field-D2BOt1yD.js';
4
4
  import './main.js';
5
- import './prevent_default-Dw7ifAL-.js';
5
+ import './validator-MOJiFndw.js';
6
+ import './prevent_default-CuW2EnKR.js';
6
7
 
7
8
  var __defProp = Object.defineProperty;
8
9
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,5 +1,5 @@
1
- import { n, t, i, b } from './matter-dashboard-app-CU3-L2nl.js';
2
- import { p as preventDefault } from './prevent_default-Dw7ifAL-.js';
1
+ import { n, t, i, h as b } from './matter-dashboard-app-DlHSE_Qh.js';
2
+ import { p as preventDefault } from './prevent_default-CuW2EnKR.js';
3
3
  import './main.js';
4
4
 
5
5
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- import { m as mixinDelegatesAria, i, _ as __decorate, n, f as e, A, b, a as i$1, t } from './matter-dashboard-app-CU3-L2nl.js';
1
+ import { m as mixinDelegatesAria, i, _ as __decorate, n, f as e, A, h as b, j as i$1, t } from './matter-dashboard-app-DlHSE_Qh.js';
2
2
 
3
3
  /**
4
4
  * @license