@matter-server/dashboard 0.3.2 → 0.3.3

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 (104) hide show
  1. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts +2 -2
  2. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
  3. package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +1 -1
  4. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts +36 -0
  5. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts.map +1 -0
  6. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js +159 -0
  7. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js.map +6 -0
  8. package/dist/esm/pages/cluster-commands/index.d.ts +1 -0
  9. package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
  10. package/dist/esm/pages/cluster-commands/index.js +1 -0
  11. package/dist/esm/pages/cluster-commands/index.js.map +1 -1
  12. package/dist/esm/pages/components/footer.d.ts.map +1 -1
  13. package/dist/esm/pages/components/footer.js +4 -7
  14. package/dist/esm/pages/components/footer.js.map +1 -1
  15. package/dist/esm/pages/components/header.d.ts +5 -0
  16. package/dist/esm/pages/components/header.d.ts.map +1 -1
  17. package/dist/esm/pages/components/header.js +75 -0
  18. package/dist/esm/pages/components/header.js.map +1 -1
  19. package/dist/esm/pages/components/node-details.js +1 -1
  20. package/dist/esm/pages/components/node-details.js.map +1 -1
  21. package/dist/esm/pages/components/server-details.d.ts.map +1 -1
  22. package/dist/esm/pages/components/server-details.js +0 -1
  23. package/dist/esm/pages/components/server-details.js.map +1 -1
  24. package/dist/esm/pages/matter-dashboard-app.d.ts +12 -0
  25. package/dist/esm/pages/matter-dashboard-app.d.ts.map +1 -1
  26. package/dist/esm/pages/matter-dashboard-app.js +84 -4
  27. package/dist/esm/pages/matter-dashboard-app.js.map +1 -1
  28. package/dist/esm/pages/matter-network-view.d.ts +52 -0
  29. package/dist/esm/pages/matter-network-view.d.ts.map +1 -0
  30. package/dist/esm/pages/matter-network-view.js +309 -0
  31. package/dist/esm/pages/matter-network-view.js.map +6 -0
  32. package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
  33. package/dist/esm/pages/matter-node-view.js +70 -1
  34. package/dist/esm/pages/matter-node-view.js.map +1 -1
  35. package/dist/esm/pages/matter-server-view.d.ts +4 -0
  36. package/dist/esm/pages/matter-server-view.d.ts.map +1 -1
  37. package/dist/esm/pages/matter-server-view.js +16 -1
  38. package/dist/esm/pages/matter-server-view.js.map +1 -1
  39. package/dist/esm/pages/network/base-network-graph.d.ts +74 -0
  40. package/dist/esm/pages/network/base-network-graph.d.ts.map +1 -0
  41. package/dist/esm/pages/network/base-network-graph.js +403 -0
  42. package/dist/esm/pages/network/base-network-graph.js.map +6 -0
  43. package/dist/esm/pages/network/device-icons.d.ts +52 -0
  44. package/dist/esm/pages/network/device-icons.d.ts.map +1 -0
  45. package/dist/esm/pages/network/device-icons.js +197 -0
  46. package/dist/esm/pages/network/device-icons.js.map +6 -0
  47. package/dist/esm/pages/network/device-panel.d.ts +31 -0
  48. package/dist/esm/pages/network/device-panel.d.ts.map +1 -0
  49. package/dist/esm/pages/network/device-panel.js +183 -0
  50. package/dist/esm/pages/network/device-panel.js.map +6 -0
  51. package/dist/esm/pages/network/network-details.d.ts +47 -0
  52. package/dist/esm/pages/network/network-details.d.ts.map +1 -0
  53. package/dist/esm/pages/network/network-details.js +686 -0
  54. package/dist/esm/pages/network/network-details.js.map +6 -0
  55. package/dist/esm/pages/network/network-types.d.ts +153 -0
  56. package/dist/esm/pages/network/network-types.d.ts.map +1 -0
  57. package/dist/esm/pages/network/network-types.js +19 -0
  58. package/dist/esm/pages/network/network-types.js.map +6 -0
  59. package/dist/esm/pages/network/network-utils.d.ts +170 -0
  60. package/dist/esm/pages/network/network-utils.d.ts.map +1 -0
  61. package/dist/esm/pages/network/network-utils.js +472 -0
  62. package/dist/esm/pages/network/network-utils.js.map +6 -0
  63. package/dist/esm/pages/network/thread-graph.d.ts +27 -0
  64. package/dist/esm/pages/network/thread-graph.d.ts.map +1 -0
  65. package/dist/esm/pages/network/thread-graph.js +134 -0
  66. package/dist/esm/pages/network/thread-graph.js.map +6 -0
  67. package/dist/esm/pages/network/wifi-graph.d.ts +27 -0
  68. package/dist/esm/pages/network/wifi-graph.d.ts.map +1 -0
  69. package/dist/esm/pages/network/wifi-graph.js +167 -0
  70. package/dist/esm/pages/network/wifi-graph.js.map +6 -0
  71. package/dist/web/js/{commission-node-dialog-CBSDiqRW.js → commission-node-dialog-B1_khzZb.js} +5 -5
  72. package/dist/web/js/{commission-node-existing-TP6s8Tez.js → commission-node-existing-RpdajrwF.js} +2 -5
  73. package/dist/web/js/{commission-node-thread-DOB8pu6x.js → commission-node-thread-5f2itkTG.js} +2 -5
  74. package/dist/web/js/{commission-node-wifi-tzavmk1j.js → commission-node-wifi-DZ_pWqsa.js} +2 -5
  75. package/dist/web/js/{dialog-box-Dknil_Be.js → dialog-box-DEUxM4B1.js} +2 -2
  76. package/dist/web/js/{fire_event-DRpOSjJR.js → fire_event-BczBMT8E.js} +1 -1
  77. package/dist/web/js/{log-level-dialog-TXkma-7Z.js → log-level-dialog-Cr3PfX1X.js} +2 -3
  78. package/dist/web/js/main.js +1 -1
  79. package/dist/web/js/matter-dashboard-app-BuCe_Jxf.js +29990 -0
  80. package/dist/web/js/{node-binding-dialog-D52FCBFP.js → node-binding-dialog-DMiHNDLA.js} +2 -4
  81. package/dist/web/js/{prevent_default-BPgSQsuY.js → prevent_default-D4FX_PIh.js} +2 -42
  82. package/package.json +5 -4
  83. package/src/pages/cluster-commands/base-cluster-commands.ts +2 -2
  84. package/src/pages/cluster-commands/clusters/basic-information-commands.ts +171 -0
  85. package/src/pages/cluster-commands/index.ts +1 -0
  86. package/src/pages/components/footer.ts +4 -7
  87. package/src/pages/components/header.ts +81 -0
  88. package/src/pages/components/node-details.ts +2 -2
  89. package/src/pages/components/server-details.ts +0 -1
  90. package/src/pages/matter-dashboard-app.ts +105 -5
  91. package/src/pages/matter-network-view.ts +325 -0
  92. package/src/pages/matter-node-view.ts +75 -1
  93. package/src/pages/matter-server-view.ts +17 -1
  94. package/src/pages/network/base-network-graph.ts +463 -0
  95. package/src/pages/network/device-icons.ts +283 -0
  96. package/src/pages/network/device-panel.ts +180 -0
  97. package/src/pages/network/network-details.ts +750 -0
  98. package/src/pages/network/network-types.ts +161 -0
  99. package/src/pages/network/network-utils.ts +752 -0
  100. package/src/pages/network/thread-graph.ts +164 -0
  101. package/src/pages/network/wifi-graph.ts +192 -0
  102. package/dist/web/js/matter-dashboard-app-B7GUghkC.js +0 -17254
  103. package/dist/web/js/outlined-text-field-D1DyKQY-.js +0 -968
  104. package/dist/web/js/validator-C735j770.js +0 -1122
@@ -0,0 +1,197 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import {
7
+ mdiAccessPoint,
8
+ mdiCeilingLight,
9
+ mdiDoorOpen,
10
+ mdiFan,
11
+ mdiGauge,
12
+ mdiHelp,
13
+ mdiHome,
14
+ mdiLightbulb,
15
+ mdiLock,
16
+ mdiMotionSensor,
17
+ mdiPowerPlug,
18
+ mdiRouter,
19
+ mdiSpeaker,
20
+ mdiTelevision,
21
+ mdiThermometer,
22
+ mdiToggleSwitch,
23
+ mdiWater,
24
+ mdiWifi
25
+ } from "@mdi/js";
26
+ import { ThemeService } from "../../util/theme-service.js";
27
+ function getDefaultIconColor() {
28
+ return ThemeService.effectiveTheme === "dark" ? "#b0b0b0" : "#666666";
29
+ }
30
+ const DeviceTypes = {
31
+ // Lighting
32
+ ON_OFF_LIGHT: 256,
33
+ DIMMABLE_LIGHT: 257,
34
+ COLOR_TEMPERATURE_LIGHT: 268,
35
+ EXTENDED_COLOR_LIGHT: 269,
36
+ // Plugs/Outlets
37
+ ON_OFF_PLUG: 266,
38
+ DIMMABLE_PLUG: 267,
39
+ // Switches
40
+ ON_OFF_SWITCH: 259,
41
+ DIMMER_SWITCH: 260,
42
+ COLOR_DIMMER_SWITCH: 261,
43
+ GENERIC_SWITCH: 15,
44
+ // Sensors
45
+ CONTACT_SENSOR: 21,
46
+ OCCUPANCY_SENSOR: 263,
47
+ TEMPERATURE_SENSOR: 770,
48
+ HUMIDITY_SENSOR: 775,
49
+ LIGHT_SENSOR: 262,
50
+ PRESSURE_SENSOR: 773,
51
+ FLOW_SENSOR: 774,
52
+ // HVAC
53
+ THERMOSTAT: 769,
54
+ FAN: 43,
55
+ // Closures
56
+ DOOR_LOCK: 10,
57
+ WINDOW_COVERING: 514,
58
+ // Media
59
+ SPEAKER: 34,
60
+ BASIC_VIDEO_PLAYER: 40,
61
+ TELEVISION: 35,
62
+ // Infrastructure
63
+ ROOT_NODE: 22,
64
+ BRIDGE: 14,
65
+ AGGREGATOR: 14,
66
+ // Same as bridge
67
+ // Water
68
+ WATER_LEAK_DETECTOR: 67,
69
+ WATER_VALVE: 66
70
+ };
71
+ const deviceTypeToIcon = {
72
+ // Lighting
73
+ [DeviceTypes.ON_OFF_LIGHT]: mdiLightbulb,
74
+ [DeviceTypes.DIMMABLE_LIGHT]: mdiLightbulb,
75
+ [DeviceTypes.COLOR_TEMPERATURE_LIGHT]: mdiCeilingLight,
76
+ [DeviceTypes.EXTENDED_COLOR_LIGHT]: mdiCeilingLight,
77
+ // Plugs/Outlets
78
+ [DeviceTypes.ON_OFF_PLUG]: mdiPowerPlug,
79
+ [DeviceTypes.DIMMABLE_PLUG]: mdiPowerPlug,
80
+ // Switches
81
+ [DeviceTypes.ON_OFF_SWITCH]: mdiToggleSwitch,
82
+ [DeviceTypes.DIMMER_SWITCH]: mdiToggleSwitch,
83
+ [DeviceTypes.COLOR_DIMMER_SWITCH]: mdiToggleSwitch,
84
+ [DeviceTypes.GENERIC_SWITCH]: mdiToggleSwitch,
85
+ // Sensors
86
+ [DeviceTypes.CONTACT_SENSOR]: mdiDoorOpen,
87
+ [DeviceTypes.OCCUPANCY_SENSOR]: mdiMotionSensor,
88
+ [DeviceTypes.TEMPERATURE_SENSOR]: mdiThermometer,
89
+ [DeviceTypes.HUMIDITY_SENSOR]: mdiGauge,
90
+ [DeviceTypes.LIGHT_SENSOR]: mdiGauge,
91
+ [DeviceTypes.PRESSURE_SENSOR]: mdiGauge,
92
+ [DeviceTypes.FLOW_SENSOR]: mdiGauge,
93
+ // HVAC
94
+ [DeviceTypes.THERMOSTAT]: mdiThermometer,
95
+ [DeviceTypes.FAN]: mdiFan,
96
+ // Closures
97
+ [DeviceTypes.DOOR_LOCK]: mdiLock,
98
+ [DeviceTypes.WINDOW_COVERING]: mdiHome,
99
+ // Media
100
+ [DeviceTypes.SPEAKER]: mdiSpeaker,
101
+ [DeviceTypes.BASIC_VIDEO_PLAYER]: mdiTelevision,
102
+ [DeviceTypes.TELEVISION]: mdiTelevision,
103
+ // Infrastructure
104
+ [DeviceTypes.ROOT_NODE]: mdiHome,
105
+ [DeviceTypes.BRIDGE]: mdiRouter,
106
+ [DeviceTypes.AGGREGATOR]: mdiRouter,
107
+ // Water
108
+ [DeviceTypes.WATER_LEAK_DETECTOR]: mdiWater,
109
+ [DeviceTypes.WATER_VALVE]: mdiWater
110
+ };
111
+ const threadRoleToIcon = {
112
+ 5: mdiRouter,
113
+ // Router
114
+ 6: mdiAccessPoint
115
+ // Leader
116
+ };
117
+ function getPrimaryDeviceType(node) {
118
+ const deviceTypeList1 = node.attributes["1/29/0"];
119
+ if (deviceTypeList1?.length) {
120
+ const entry = deviceTypeList1[0];
121
+ return entry?.["0"] ?? entry?.deviceType;
122
+ }
123
+ const deviceTypeList0 = node.attributes["0/29/0"];
124
+ if (deviceTypeList0?.length) {
125
+ const entry = deviceTypeList0[0];
126
+ return entry?.["0"] ?? entry?.deviceType;
127
+ }
128
+ return void 0;
129
+ }
130
+ function getDeviceIcon(node, threadRole) {
131
+ if (threadRole !== void 0 && threadRoleToIcon[threadRole]) {
132
+ const deviceType2 = getPrimaryDeviceType(node);
133
+ if (deviceType2 === DeviceTypes.ROOT_NODE || deviceType2 === DeviceTypes.BRIDGE || node.is_bridge) {
134
+ return threadRoleToIcon[threadRole];
135
+ }
136
+ }
137
+ if (node.is_bridge) {
138
+ return mdiRouter;
139
+ }
140
+ const deviceType = getPrimaryDeviceType(node);
141
+ if (deviceType !== void 0 && deviceTypeToIcon[deviceType]) {
142
+ return deviceTypeToIcon[deviceType];
143
+ }
144
+ return mdiHome;
145
+ }
146
+ function getNetworkTypeIcon(networkType) {
147
+ switch (networkType) {
148
+ case "thread":
149
+ return mdiAccessPoint;
150
+ case "wifi":
151
+ return mdiWifi;
152
+ case "ethernet":
153
+ return mdiRouter;
154
+ default:
155
+ return mdiHome;
156
+ }
157
+ }
158
+ function createIconDataUrl(iconPath, color, size = 48) {
159
+ const svg = `
160
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="${size}" height="${size}">
161
+ <circle cx="12" cy="12" r="11" fill="white" stroke="${color}" stroke-width="1"/>
162
+ <path d="${iconPath}" fill="${color}" transform="scale(0.6) translate(8,8)"/>
163
+ </svg>
164
+ `.trim();
165
+ return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
166
+ }
167
+ function createNodeIconDataUrl(node, threadRole, isSelected = false, isOffline = false) {
168
+ const iconPath = getDeviceIcon(node, threadRole);
169
+ let color;
170
+ if (isSelected) {
171
+ color = isOffline ? "#b71c1c" : "#1976d2";
172
+ } else if (isOffline) {
173
+ color = "#d32f2f";
174
+ } else {
175
+ color = getDefaultIconColor();
176
+ }
177
+ return createIconDataUrl(iconPath, color);
178
+ }
179
+ function createUnknownDeviceIconDataUrl(isRouter = false, isSelected = false) {
180
+ const iconPath = isRouter ? mdiAccessPoint : mdiHelp;
181
+ const color = isSelected ? "#1976d2" : "#ff9800";
182
+ return createIconDataUrl(iconPath, color);
183
+ }
184
+ function createWiFiRouterIconDataUrl(isSelected = false) {
185
+ const color = isSelected ? "#1976d2" : "#2196f3";
186
+ return createIconDataUrl(mdiWifi, color);
187
+ }
188
+ export {
189
+ createIconDataUrl,
190
+ createNodeIconDataUrl,
191
+ createUnknownDeviceIconDataUrl,
192
+ createWiFiRouterIconDataUrl,
193
+ getDeviceIcon,
194
+ getNetworkTypeIcon,
195
+ getPrimaryDeviceType
196
+ };
197
+ //# sourceMappingURL=device-icons.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/pages/network/device-icons.ts"],
4
+ "mappings": "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",
5
+ "names": ["deviceType"]
6
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import "@material/web/list/list";
7
+ import "@material/web/list/list-item";
8
+ import type { MatterNode } from "@matter-server/ws-client";
9
+ import { LitElement, nothing } from "lit";
10
+ import "../../components/ha-svg-icon";
11
+ declare global {
12
+ interface HTMLElementTagNameMap {
13
+ "device-panel": DevicePanel;
14
+ }
15
+ }
16
+ export type PanelType = "wifi" | "ethernet" | "bridges";
17
+ export declare class DevicePanel extends LitElement {
18
+ type: PanelType;
19
+ nodeIds: number[];
20
+ nodes: Record<string, MatterNode>;
21
+ expanded: boolean;
22
+ private _isExpanded;
23
+ willUpdate(changedProperties: Map<string, unknown>): void;
24
+ private _getIcon;
25
+ private _getTitle;
26
+ private _toggleExpanded;
27
+ private _handleNodeClick;
28
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
29
+ static styles: import("lit").CSSResult;
30
+ }
31
+ //# sourceMappingURL=device-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-panel.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/device-panel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAa,OAAO,EAAE,MAAM,KAAK,CAAC;AAErD,OAAO,8BAA8B,CAAC;AAGtC,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,cAAc,EAAE,WAAW,CAAC;KAC/B;CACJ;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAExD,qBACa,WAAY,SAAQ,UAAU;IAEhC,IAAI,EAAE,SAAS,CAAU;IAGzB,OAAO,EAAE,MAAM,EAAE,CAAM;IAGvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAM;IAGvC,QAAQ,UAAQ;IAGvB,OAAO,CAAC,WAAW,CAAQ;IAElB,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMlE,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAUf,MAAM;IAsCf,OAAgB,MAAM,0BA0DpB;CACL"}
@@ -0,0 +1,183 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ /**
12
+ * @license
13
+ * Copyright 2025-2026 Open Home Foundation
14
+ * SPDX-License-Identifier: Apache-2.0
15
+ */
16
+ import "@material/web/list/list";
17
+ import "@material/web/list/list-item";
18
+ import { mdiChevronDown, mdiChevronRight, mdiEthernet, mdiRouter, mdiWifi } from "@mdi/js";
19
+ import { LitElement, css, html, nothing } from "lit";
20
+ import { customElement, property, state } from "lit/decorators.js";
21
+ import "../../components/ha-svg-icon";
22
+ import { getDeviceName } from "./network-utils.js";
23
+ let DevicePanel = class extends LitElement {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.type = "wifi";
27
+ this.nodeIds = [];
28
+ this.nodes = {};
29
+ this.expanded = true;
30
+ this._isExpanded = true;
31
+ }
32
+ willUpdate(changedProperties) {
33
+ if (changedProperties.has("expanded")) {
34
+ this._isExpanded = this.expanded;
35
+ }
36
+ }
37
+ _getIcon() {
38
+ switch (this.type) {
39
+ case "wifi":
40
+ return mdiWifi;
41
+ case "ethernet":
42
+ return mdiEthernet;
43
+ case "bridges":
44
+ return mdiRouter;
45
+ }
46
+ }
47
+ _getTitle() {
48
+ switch (this.type) {
49
+ case "wifi":
50
+ return "WiFi Devices";
51
+ case "ethernet":
52
+ return "Ethernet Devices";
53
+ case "bridges":
54
+ return "Bridges";
55
+ }
56
+ }
57
+ _toggleExpanded() {
58
+ this._isExpanded = !this._isExpanded;
59
+ }
60
+ _handleNodeClick(nodeId) {
61
+ this.dispatchEvent(
62
+ new CustomEvent("node-selected", {
63
+ detail: { nodeId },
64
+ bubbles: true,
65
+ composed: true
66
+ })
67
+ );
68
+ }
69
+ render() {
70
+ if (this.nodeIds.length === 0) {
71
+ return nothing;
72
+ }
73
+ return html`
74
+ <div class="panel">
75
+ <div class="header" @click=${this._toggleExpanded}>
76
+ <ha-svg-icon .path=${this._getIcon()} class="type-icon"></ha-svg-icon>
77
+ <span class="title">${this._getTitle()}</span>
78
+ <span class="count">(${this.nodeIds.length})</span>
79
+ <ha-svg-icon
80
+ .path=${this._isExpanded ? mdiChevronDown : mdiChevronRight}
81
+ class="expand-icon"
82
+ ></ha-svg-icon>
83
+ </div>
84
+ ${this._isExpanded ? html`
85
+ <md-list class="device-list">
86
+ ${this.nodeIds.map((nodeId) => {
87
+ const node = this.nodes[nodeId.toString()];
88
+ if (!node) return nothing;
89
+ return html`
90
+ <md-list-item type="button" @click=${() => this._handleNodeClick(nodeId)}>
91
+ <div slot="headline">Node ${nodeId}</div>
92
+ <div slot="supporting-text">${getDeviceName(node)}</div>
93
+ <ha-svg-icon slot="end" .path=${mdiChevronRight}></ha-svg-icon>
94
+ </md-list-item>
95
+ `;
96
+ })}
97
+ </md-list>
98
+ ` : nothing}
99
+ </div>
100
+ `;
101
+ }
102
+ };
103
+ DevicePanel.styles = css`
104
+ :host {
105
+ display: block;
106
+ }
107
+
108
+ .panel {
109
+ background-color: var(--md-sys-color-surface, #fff);
110
+ border-radius: 8px;
111
+ border: 1px solid var(--md-sys-color-outline-variant, #ccc);
112
+ overflow: hidden;
113
+ }
114
+
115
+ .header {
116
+ display: flex;
117
+ align-items: center;
118
+ padding: 12px 16px;
119
+ cursor: pointer;
120
+ user-select: none;
121
+ background-color: var(--md-sys-color-surface-container, #f5f5f5);
122
+ }
123
+
124
+ .header:hover {
125
+ background-color: var(--md-sys-color-surface-container-high, #e8e8e8);
126
+ }
127
+
128
+ .type-icon {
129
+ --icon-primary-color: var(--md-sys-color-primary, #6200ee);
130
+ margin-right: 12px;
131
+ }
132
+
133
+ .title {
134
+ font-weight: 500;
135
+ color: var(--md-sys-color-on-surface, #333);
136
+ }
137
+
138
+ .count {
139
+ margin-left: 8px;
140
+ color: var(--md-sys-color-on-surface-variant, #666);
141
+ font-size: 0.875rem;
142
+ }
143
+
144
+ .expand-icon {
145
+ margin-left: auto;
146
+ --icon-primary-color: var(--md-sys-color-on-surface-variant, #666);
147
+ }
148
+
149
+ .device-list {
150
+ --md-list-item-leading-space: 16px;
151
+ --md-list-item-trailing-space: 16px;
152
+ }
153
+
154
+ md-list-item {
155
+ --md-list-item-one-line-container-height: 48px;
156
+ }
157
+
158
+ md-list-item::part(focus-ring) {
159
+ display: none;
160
+ }
161
+ `;
162
+ __decorateClass([
163
+ property()
164
+ ], DevicePanel.prototype, "type", 2);
165
+ __decorateClass([
166
+ property({ type: Array })
167
+ ], DevicePanel.prototype, "nodeIds", 2);
168
+ __decorateClass([
169
+ property({ type: Object })
170
+ ], DevicePanel.prototype, "nodes", 2);
171
+ __decorateClass([
172
+ property({ type: Boolean })
173
+ ], DevicePanel.prototype, "expanded", 2);
174
+ __decorateClass([
175
+ state()
176
+ ], DevicePanel.prototype, "_isExpanded", 2);
177
+ DevicePanel = __decorateClass([
178
+ customElement("device-panel")
179
+ ], DevicePanel);
180
+ export {
181
+ DevicePanel
182
+ };
183
+ //# sourceMappingURL=device-panel.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/pages/network/device-panel.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import "@material/web/divider/divider";
7
+ import type { MatterNode } from "@matter-server/ws-client";
8
+ import { LitElement, TemplateResult } from "lit";
9
+ import "../../components/ha-svg-icon";
10
+ declare global {
11
+ interface HTMLElementTagNameMap {
12
+ "network-details": NetworkDetails;
13
+ }
14
+ }
15
+ export declare class NetworkDetails extends LitElement {
16
+ selectedNodeId: number | string | null;
17
+ nodes: Record<string, MatterNode>;
18
+ unknownDevices: Map<string, {
19
+ extAddressHex: string;
20
+ isRouter: boolean;
21
+ seenBy: string[];
22
+ bestRssi: number | null;
23
+ }>;
24
+ wifiAccessPoints: Map<string, {
25
+ bssid: string;
26
+ connectedNodes: string[];
27
+ }>;
28
+ private _handleClose;
29
+ private _handleSelectNode;
30
+ /** Handle keyboard interaction for clickable elements (Enter/Space activates) */
31
+ private _handleKeyDown;
32
+ private _formatExtAddress;
33
+ private _getSignalIcon;
34
+ private _getSignalIconFromColor;
35
+ private _renderWiFiInfo;
36
+ private _renderThreadInfo;
37
+ private _renderNodeInfo;
38
+ /**
39
+ * Find the neighbor entry for an unknown device from a node's neighbor table.
40
+ */
41
+ private _findNeighborEntry;
42
+ private _renderUnknownDeviceInfo;
43
+ private _renderWiFiAccessPointInfo;
44
+ render(): TemplateResult<1>;
45
+ static styles: import("lit").CSSResult;
46
+ }
47
+ //# sourceMappingURL=network-details.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-details.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-details.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAsB,MAAM,KAAK,CAAC;AAErE,OAAO,8BAA8B,CAAC;AAoBtC,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,iBAAiB,EAAE,cAAc,CAAC;KACrC;CACJ;AAED,qBACa,cAAe,SAAQ,UAAU;IAEnC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAQ;IAG9C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAM;IAGvC,cAAc,EAAE,GAAG,CACtB,MAAM,EACN;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAC1F,CAAa;IAGP,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAa;IAE9F,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,iBAAiB;IAUzB,iFAAiF;IACjF,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,eAAe;IAwDvB,OAAO,CAAC,iBAAiB;IAgFzB,OAAO,CAAC,eAAe;IAqDvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,wBAAwB;IAwFhC,OAAO,CAAC,0BAA0B;IA4DzB,MAAM;IAoEf,OAAgB,MAAM,0BAmOpB;CACL"}