@matter-server/dashboard 0.3.2 → 0.3.4

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 (124) hide show
  1. package/README.md +76 -0
  2. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts +2 -2
  3. package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
  4. package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +1 -1
  5. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts +36 -0
  6. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts.map +1 -0
  7. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js +159 -0
  8. package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js.map +6 -0
  9. package/dist/esm/pages/cluster-commands/index.d.ts +1 -0
  10. package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
  11. package/dist/esm/pages/cluster-commands/index.js +1 -0
  12. package/dist/esm/pages/cluster-commands/index.js.map +1 -1
  13. package/dist/esm/pages/components/footer.d.ts.map +1 -1
  14. package/dist/esm/pages/components/footer.js +4 -7
  15. package/dist/esm/pages/components/footer.js.map +1 -1
  16. package/dist/esm/pages/components/header.d.ts +5 -0
  17. package/dist/esm/pages/components/header.d.ts.map +1 -1
  18. package/dist/esm/pages/components/header.js +75 -0
  19. package/dist/esm/pages/components/header.js.map +1 -1
  20. package/dist/esm/pages/components/node-details.js +2 -2
  21. package/dist/esm/pages/components/node-details.js.map +1 -1
  22. package/dist/esm/pages/components/server-details.d.ts.map +1 -1
  23. package/dist/esm/pages/components/server-details.js +0 -1
  24. package/dist/esm/pages/components/server-details.js.map +1 -1
  25. package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
  26. package/dist/esm/pages/matter-cluster-view.js +9 -4
  27. package/dist/esm/pages/matter-cluster-view.js.map +1 -1
  28. package/dist/esm/pages/matter-dashboard-app.d.ts +12 -0
  29. package/dist/esm/pages/matter-dashboard-app.d.ts.map +1 -1
  30. package/dist/esm/pages/matter-dashboard-app.js +84 -4
  31. package/dist/esm/pages/matter-dashboard-app.js.map +1 -1
  32. package/dist/esm/pages/matter-endpoint-view.d.ts.map +1 -1
  33. package/dist/esm/pages/matter-endpoint-view.js +8 -2
  34. package/dist/esm/pages/matter-endpoint-view.js.map +1 -1
  35. package/dist/esm/pages/matter-network-view.d.ts +52 -0
  36. package/dist/esm/pages/matter-network-view.d.ts.map +1 -0
  37. package/dist/esm/pages/matter-network-view.js +309 -0
  38. package/dist/esm/pages/matter-network-view.js.map +6 -0
  39. package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
  40. package/dist/esm/pages/matter-node-view.js +86 -3
  41. package/dist/esm/pages/matter-node-view.js.map +1 -1
  42. package/dist/esm/pages/matter-server-view.d.ts +4 -0
  43. package/dist/esm/pages/matter-server-view.d.ts.map +1 -1
  44. package/dist/esm/pages/matter-server-view.js +16 -1
  45. package/dist/esm/pages/matter-server-view.js.map +1 -1
  46. package/dist/esm/pages/network/base-network-graph.d.ts +74 -0
  47. package/dist/esm/pages/network/base-network-graph.d.ts.map +1 -0
  48. package/dist/esm/pages/network/base-network-graph.js +411 -0
  49. package/dist/esm/pages/network/base-network-graph.js.map +6 -0
  50. package/dist/esm/pages/network/device-icons.d.ts +52 -0
  51. package/dist/esm/pages/network/device-icons.d.ts.map +1 -0
  52. package/dist/esm/pages/network/device-icons.js +197 -0
  53. package/dist/esm/pages/network/device-icons.js.map +6 -0
  54. package/dist/esm/pages/network/device-panel.d.ts +31 -0
  55. package/dist/esm/pages/network/device-panel.d.ts.map +1 -0
  56. package/dist/esm/pages/network/device-panel.js +183 -0
  57. package/dist/esm/pages/network/device-panel.js.map +6 -0
  58. package/dist/esm/pages/network/network-details.d.ts +77 -0
  59. package/dist/esm/pages/network/network-details.d.ts.map +1 -0
  60. package/dist/esm/pages/network/network-details.js +904 -0
  61. package/dist/esm/pages/network/network-details.js.map +6 -0
  62. package/dist/esm/pages/network/network-types.d.ts +159 -0
  63. package/dist/esm/pages/network/network-types.d.ts.map +1 -0
  64. package/dist/esm/pages/network/network-types.js +19 -0
  65. package/dist/esm/pages/network/network-types.js.map +6 -0
  66. package/dist/esm/pages/network/network-utils.d.ts +196 -0
  67. package/dist/esm/pages/network/network-utils.d.ts.map +1 -0
  68. package/dist/esm/pages/network/network-utils.js +540 -0
  69. package/dist/esm/pages/network/network-utils.js.map +6 -0
  70. package/dist/esm/pages/network/thread-graph.d.ts +27 -0
  71. package/dist/esm/pages/network/thread-graph.d.ts.map +1 -0
  72. package/dist/esm/pages/network/thread-graph.js +137 -0
  73. package/dist/esm/pages/network/thread-graph.js.map +6 -0
  74. package/dist/esm/pages/network/update-connections-dialog.d.ts +55 -0
  75. package/dist/esm/pages/network/update-connections-dialog.d.ts.map +1 -0
  76. package/dist/esm/pages/network/update-connections-dialog.js +284 -0
  77. package/dist/esm/pages/network/update-connections-dialog.js.map +6 -0
  78. package/dist/esm/pages/network/wifi-graph.d.ts +27 -0
  79. package/dist/esm/pages/network/wifi-graph.d.ts.map +1 -0
  80. package/dist/esm/pages/network/wifi-graph.js +169 -0
  81. package/dist/esm/pages/network/wifi-graph.js.map +6 -0
  82. package/dist/esm/util/format_hex.d.ts +18 -0
  83. package/dist/esm/util/format_hex.d.ts.map +1 -1
  84. package/dist/esm/util/format_hex.js +21 -1
  85. package/dist/esm/util/format_hex.js.map +1 -1
  86. package/dist/web/js/{commission-node-dialog-CBSDiqRW.js → commission-node-dialog-CcMuttYO.js} +5 -5
  87. package/dist/web/js/{commission-node-existing-TP6s8Tez.js → commission-node-existing-CqTRDMAr.js} +2 -5
  88. package/dist/web/js/{commission-node-thread-DOB8pu6x.js → commission-node-thread-DgwtTVwK.js} +2 -5
  89. package/dist/web/js/{commission-node-wifi-tzavmk1j.js → commission-node-wifi-XaN2SEnE.js} +2 -5
  90. package/dist/web/js/{dialog-box-Dknil_Be.js → dialog-box-COpDD8i7.js} +2 -2
  91. package/dist/web/js/{fire_event-DRpOSjJR.js → fire_event-mDYWi2sw.js} +1 -1
  92. package/dist/web/js/{log-level-dialog-TXkma-7Z.js → log-level-dialog-Bc32kZVw.js} +2 -3
  93. package/dist/web/js/main.js +1 -1
  94. package/dist/web/js/matter-dashboard-app-CrBHT4fT.js +31606 -0
  95. package/dist/web/js/{node-binding-dialog-D52FCBFP.js → node-binding-dialog-C8fqOJiB.js} +2 -4
  96. package/dist/web/js/prevent_default-D-ohDGsN.js +8 -0
  97. package/package.json +6 -5
  98. package/src/pages/cluster-commands/base-cluster-commands.ts +2 -2
  99. package/src/pages/cluster-commands/clusters/basic-information-commands.ts +171 -0
  100. package/src/pages/cluster-commands/index.ts +1 -0
  101. package/src/pages/components/footer.ts +4 -7
  102. package/src/pages/components/header.ts +81 -0
  103. package/src/pages/components/node-details.ts +3 -3
  104. package/src/pages/components/server-details.ts +0 -1
  105. package/src/pages/matter-cluster-view.ts +11 -4
  106. package/src/pages/matter-dashboard-app.ts +105 -5
  107. package/src/pages/matter-endpoint-view.ts +10 -3
  108. package/src/pages/matter-network-view.ts +325 -0
  109. package/src/pages/matter-node-view.ts +93 -4
  110. package/src/pages/matter-server-view.ts +17 -1
  111. package/src/pages/network/base-network-graph.ts +477 -0
  112. package/src/pages/network/device-icons.ts +283 -0
  113. package/src/pages/network/device-panel.ts +180 -0
  114. package/src/pages/network/network-details.ts +1015 -0
  115. package/src/pages/network/network-types.ts +167 -0
  116. package/src/pages/network/network-utils.ts +861 -0
  117. package/src/pages/network/thread-graph.ts +170 -0
  118. package/src/pages/network/update-connections-dialog.ts +327 -0
  119. package/src/pages/network/wifi-graph.ts +193 -0
  120. package/src/util/format_hex.ts +39 -0
  121. package/dist/web/js/matter-dashboard-app-B7GUghkC.js +0 -17254
  122. package/dist/web/js/outlined-text-field-D1DyKQY-.js +0 -968
  123. package/dist/web/js/prevent_default-BPgSQsuY.js +0 -814
  124. package/dist/web/js/validator-C735j770.js +0 -1122
@@ -0,0 +1,411 @@
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 { LitElement, css } from "lit";
17
+ import { property, state } from "lit/decorators.js";
18
+ import { DataSet, Network } from "vis-network/standalone";
19
+ import { ThemeService } from "../../util/theme-service.js";
20
+ class BaseNetworkGraph extends LitElement {
21
+ constructor() {
22
+ super(...arguments);
23
+ this.nodes = {};
24
+ this._selectedNodeId = null;
25
+ /** Store original edge colors for restoration after highlighting */
26
+ this._originalEdgeColors = /* @__PURE__ */ new Map();
27
+ }
28
+ _getFontColor() {
29
+ return ThemeService.effectiveTheme === "dark" ? "#e0e0e0" : "#333333";
30
+ }
31
+ _getDimmedEdgeColor() {
32
+ return ThemeService.effectiveTheme === "dark" ? "#555555" : "#cccccc";
33
+ }
34
+ /**
35
+ * Returns physics options for the network. Override in subclasses for different behavior.
36
+ */
37
+ _getPhysicsOptions() {
38
+ return {
39
+ enabled: true,
40
+ solver: "forceAtlas2Based",
41
+ forceAtlas2Based: {
42
+ gravitationalConstant: -70,
43
+ centralGravity: 5e-3,
44
+ springLength: 130,
45
+ springConstant: 0.08,
46
+ damping: 0.4,
47
+ avoidOverlap: 0.6
48
+ },
49
+ stabilization: {
50
+ enabled: true,
51
+ iterations: 250,
52
+ updateInterval: 25
53
+ }
54
+ };
55
+ }
56
+ updated(changedProperties) {
57
+ super.updated(changedProperties);
58
+ if (!this._container && !this._resizeObserver) {
59
+ this._tryAttachContainer();
60
+ }
61
+ if (changedProperties.has("nodes")) {
62
+ this._debouncedUpdateGraph();
63
+ }
64
+ }
65
+ /**
66
+ * Try to find and attach the graph container if it wasn't available before.
67
+ * This handles the case where empty state was rendered initially.
68
+ */
69
+ _tryAttachContainer() {
70
+ const container = this.shadowRoot?.querySelector(".graph-container");
71
+ if (container) {
72
+ this._container = container;
73
+ this._resizeObserver = new ResizeObserver((entries) => {
74
+ const entry = entries[0];
75
+ if (entry && entry.contentRect.width > 0 && entry.contentRect.height > 0) {
76
+ if (!this._network) {
77
+ this._initializeNetwork();
78
+ } else {
79
+ this._network.setSize(`${entry.contentRect.width}px`, `${entry.contentRect.height}px`);
80
+ this._network.redraw();
81
+ }
82
+ }
83
+ });
84
+ this._resizeObserver.observe(this._container);
85
+ }
86
+ }
87
+ /** Debounced graph update to avoid excessive redraws */
88
+ _debouncedUpdateGraph() {
89
+ if (this._updateDebounceTimer) {
90
+ clearTimeout(this._updateDebounceTimer);
91
+ }
92
+ this._updateDebounceTimer = setTimeout(() => {
93
+ this._updateGraph();
94
+ }, 100);
95
+ }
96
+ firstUpdated() {
97
+ this._container = this.shadowRoot?.querySelector(".graph-container");
98
+ if (this._container) {
99
+ this._resizeObserver = new ResizeObserver((entries) => {
100
+ const entry = entries[0];
101
+ if (entry && entry.contentRect.width > 0 && entry.contentRect.height > 0) {
102
+ if (!this._network) {
103
+ this._initializeNetwork();
104
+ } else {
105
+ this._network.setSize(`${entry.contentRect.width}px`, `${entry.contentRect.height}px`);
106
+ this._network.redraw();
107
+ }
108
+ }
109
+ });
110
+ this._resizeObserver.observe(this._container);
111
+ }
112
+ this._themeUnsubscribe = ThemeService.subscribe(() => {
113
+ if (this._network && this._nodesDataSet) {
114
+ const fontColor = this._getFontColor();
115
+ this._network.setOptions({
116
+ nodes: {
117
+ font: {
118
+ color: fontColor
119
+ }
120
+ }
121
+ });
122
+ this._updateGraph();
123
+ const allNodes = this._nodesDataSet.get();
124
+ const nodeUpdates = allNodes.map((node) => ({
125
+ id: node.id,
126
+ font: { color: fontColor }
127
+ }));
128
+ this._nodesDataSet.update(nodeUpdates);
129
+ this._network.redraw();
130
+ }
131
+ });
132
+ }
133
+ disconnectedCallback() {
134
+ super.disconnectedCallback();
135
+ this._resizeObserver?.disconnect();
136
+ this._themeUnsubscribe?.();
137
+ if (this._updateDebounceTimer) {
138
+ clearTimeout(this._updateDebounceTimer);
139
+ }
140
+ this._nodesDataSet?.clear();
141
+ this._edgesDataSet?.clear();
142
+ this._network?.destroy();
143
+ this._network = void 0;
144
+ this._nodesDataSet = void 0;
145
+ this._edgesDataSet = void 0;
146
+ this._originalEdgeColors.clear();
147
+ }
148
+ _initializeNetwork() {
149
+ if (!this._container) return;
150
+ const rect = this._container.getBoundingClientRect();
151
+ if (rect.width === 0 || rect.height === 0) {
152
+ return;
153
+ }
154
+ this._nodesDataSet = new DataSet();
155
+ this._edgesDataSet = new DataSet();
156
+ const options = {
157
+ width: `${rect.width}px`,
158
+ height: `${rect.height}px`,
159
+ autoResize: false,
160
+ // We handle resize manually
161
+ nodes: {
162
+ shape: "image",
163
+ size: 30,
164
+ font: {
165
+ size: 12,
166
+ color: this._getFontColor()
167
+ },
168
+ borderWidth: 2,
169
+ borderWidthSelected: 3
170
+ },
171
+ edges: {
172
+ width: 2,
173
+ smooth: {
174
+ type: "continuous",
175
+ roundness: 0.5
176
+ }
177
+ },
178
+ physics: this._getPhysicsOptions(),
179
+ interaction: {
180
+ hover: true,
181
+ tooltipDelay: 200,
182
+ hideEdgesOnDrag: true
183
+ }
184
+ };
185
+ this._network = new Network(
186
+ this._container,
187
+ {
188
+ nodes: this._nodesDataSet,
189
+ edges: this._edgesDataSet
190
+ },
191
+ options
192
+ );
193
+ this._network.on("selectNode", (params) => {
194
+ if (params.nodes.length > 0) {
195
+ this._selectedNodeId = params.nodes[0];
196
+ this._highlightConnections(this._selectedNodeId);
197
+ this._dispatchNodeSelected(this._selectedNodeId);
198
+ }
199
+ });
200
+ this._network.on("deselectNode", () => {
201
+ this._selectedNodeId = null;
202
+ this._clearHighlights();
203
+ this._dispatchNodeSelected(null);
204
+ });
205
+ this._network.on("stabilizationIterationsDone", () => {
206
+ this._network?.fit({
207
+ animation: {
208
+ duration: 500,
209
+ easingFunction: "easeInOutQuad"
210
+ }
211
+ });
212
+ });
213
+ this._network.on("stabilized", () => {
214
+ this._network?.fit({
215
+ animation: {
216
+ duration: 300,
217
+ easingFunction: "easeInOutQuad"
218
+ }
219
+ });
220
+ });
221
+ this._updateGraph();
222
+ }
223
+ /**
224
+ * Returns true if the graph is initialized and ready for interaction.
225
+ */
226
+ isReady() {
227
+ return this._network !== void 0 && this._nodesDataSet !== void 0;
228
+ }
229
+ /**
230
+ * Fits all nodes into view.
231
+ */
232
+ fit() {
233
+ this._network?.fit({
234
+ animation: {
235
+ duration: 300,
236
+ easingFunction: "easeInOutQuad"
237
+ }
238
+ });
239
+ }
240
+ /**
241
+ * Selects a node by ID and focuses on it.
242
+ */
243
+ selectNode(nodeId) {
244
+ if (!this._network) return;
245
+ this._selectedNodeId = nodeId;
246
+ this._network.selectNodes([nodeId]);
247
+ this._highlightConnections(nodeId);
248
+ this._dispatchNodeSelected(nodeId);
249
+ this._network.focus(nodeId, {
250
+ scale: 1.2,
251
+ animation: {
252
+ duration: 500,
253
+ easingFunction: "easeInOutQuad"
254
+ }
255
+ });
256
+ }
257
+ _dispatchNodeSelected(nodeId) {
258
+ this.dispatchEvent(
259
+ new CustomEvent("node-selected", {
260
+ detail: { nodeId },
261
+ bubbles: true,
262
+ composed: true
263
+ })
264
+ );
265
+ }
266
+ /**
267
+ * Highlights edges connected to the selected node and makes neighbor nodes more prominent.
268
+ */
269
+ _highlightConnections(nodeId) {
270
+ if (!this._edgesDataSet || !this._nodesDataSet) return;
271
+ const allEdges = this._edgesDataSet.get();
272
+ for (const edge of allEdges) {
273
+ const edgeId = String(edge.id);
274
+ if (!this._originalEdgeColors.has(edgeId)) {
275
+ const colorObj = edge.color;
276
+ this._originalEdgeColors.set(edgeId, {
277
+ color: colorObj?.color ?? "#999999",
278
+ highlight: colorObj?.highlight ?? "#999999"
279
+ });
280
+ }
281
+ }
282
+ const connectedEdges = this._edgesDataSet.get({
283
+ filter: (edge) => edge.from === nodeId || edge.to === nodeId
284
+ });
285
+ const neighborIds = /* @__PURE__ */ new Set();
286
+ for (const edge of connectedEdges) {
287
+ if (edge.from === nodeId) {
288
+ neighborIds.add(edge.to);
289
+ } else {
290
+ neighborIds.add(edge.from);
291
+ }
292
+ }
293
+ const dimmedColor = this._getDimmedEdgeColor();
294
+ const edgeUpdates = allEdges.map((edge) => {
295
+ const isConnected = edge.from === nodeId || edge.to === nodeId;
296
+ const originalColor = this._originalEdgeColors.get(String(edge.id));
297
+ return {
298
+ id: edge.id,
299
+ width: isConnected ? 3 : 1,
300
+ // Dim non-connected edges
301
+ color: isConnected ? { color: originalColor?.color, highlight: originalColor?.highlight } : {
302
+ color: dimmedColor,
303
+ highlight: dimmedColor
304
+ }
305
+ };
306
+ });
307
+ this._edgesDataSet.update(edgeUpdates);
308
+ const allNodes = this._nodesDataSet.get();
309
+ const nodeUpdates = allNodes.map((node) => {
310
+ const isNeighbor = neighborIds.has(node.id);
311
+ const isSelected = node.id === nodeId;
312
+ return {
313
+ id: node.id,
314
+ size: isSelected ? 40 : isNeighbor ? 35 : 25,
315
+ font: {
316
+ size: isSelected ? 14 : isNeighbor ? 13 : 11,
317
+ color: this._getFontColor(),
318
+ bold: isSelected || isNeighbor ? { color: this._getFontColor() } : void 0
319
+ },
320
+ opacity: isSelected || isNeighbor ? 1 : 0.5
321
+ };
322
+ });
323
+ this._nodesDataSet.update(nodeUpdates);
324
+ }
325
+ /**
326
+ * Clears all highlights and restores default styling.
327
+ */
328
+ _clearHighlights() {
329
+ if (!this._edgesDataSet || !this._nodesDataSet) return;
330
+ const allEdges = this._edgesDataSet.get();
331
+ const edgeUpdates = allEdges.map((edge) => {
332
+ const originalColor = this._originalEdgeColors.get(String(edge.id));
333
+ return {
334
+ id: edge.id,
335
+ width: 2,
336
+ color: originalColor ?? { color: "#999999", highlight: "#999999" }
337
+ };
338
+ });
339
+ this._edgesDataSet.update(edgeUpdates);
340
+ const allNodes = this._nodesDataSet.get();
341
+ const nodeUpdates = allNodes.map((node) => ({
342
+ id: node.id,
343
+ size: 30,
344
+ font: {
345
+ size: 12,
346
+ color: this._getFontColor(),
347
+ bold: void 0
348
+ },
349
+ opacity: 1
350
+ }));
351
+ this._nodesDataSet.update(nodeUpdates);
352
+ }
353
+ /**
354
+ * Clear stored edge colors when graph is updated (edges are recreated).
355
+ */
356
+ _clearOriginalEdgeColors() {
357
+ this._originalEdgeColors.clear();
358
+ }
359
+ static {
360
+ this.styles = css`
361
+ :host {
362
+ display: block;
363
+ width: 100%;
364
+ height: 100%;
365
+ min-height: 0;
366
+ }
367
+
368
+ .graph-container {
369
+ width: 100%;
370
+ height: 100%;
371
+ background-color: var(--md-sys-color-surface, #fff);
372
+ border-radius: 8px;
373
+ border: 1px solid var(--md-sys-color-outline-variant, #ccc);
374
+ }
375
+
376
+ .empty-state {
377
+ display: flex;
378
+ flex-direction: column;
379
+ align-items: center;
380
+ justify-content: center;
381
+ height: 100%;
382
+ color: var(--md-sys-color-on-surface-variant, #666);
383
+ text-align: center;
384
+ padding: 24px;
385
+ box-sizing: border-box;
386
+ background-color: var(--md-sys-color-surface, #fff);
387
+ border-radius: 8px;
388
+ border: 1px solid var(--md-sys-color-outline-variant, #ccc);
389
+ }
390
+
391
+ .empty-state p {
392
+ margin: 8px 0;
393
+ }
394
+
395
+ .empty-state .hint {
396
+ font-size: 0.875rem;
397
+ opacity: 0.7;
398
+ }
399
+ `;
400
+ }
401
+ }
402
+ __decorateClass([
403
+ property({ type: Object })
404
+ ], BaseNetworkGraph.prototype, "nodes", 2);
405
+ __decorateClass([
406
+ state()
407
+ ], BaseNetworkGraph.prototype, "_selectedNodeId", 2);
408
+ export {
409
+ BaseNetworkGraph
410
+ };
411
+ //# sourceMappingURL=base-network-graph.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/pages/network/base-network-graph.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { MatterNode } from "@matter-server/ws-client";
7
+ /**
8
+ * Gets the primary device type ID for a node.
9
+ * Reads from DeviceTypeList attribute (0/29/0) on endpoint 1 or 0.
10
+ * The data comes as { 0: deviceTypeId, 1: revision } with numeric keys.
11
+ */
12
+ export declare function getPrimaryDeviceType(node: MatterNode): number | undefined;
13
+ /**
14
+ * Gets the appropriate MDI icon path for a node.
15
+ * Considers device type and Thread role.
16
+ */
17
+ export declare function getDeviceIcon(node: MatterNode, threadRole?: number): string;
18
+ /**
19
+ * Gets the appropriate MDI icon path for a network type.
20
+ */
21
+ export declare function getNetworkTypeIcon(networkType: string): string;
22
+ /**
23
+ * Creates an SVG data URL from an MDI icon path for use in vis.js.
24
+ * @param iconPath - The MDI icon path
25
+ * @param color - The icon color (CSS color string)
26
+ * @param size - The icon size in pixels
27
+ * @returns A data URL containing the SVG
28
+ */
29
+ export declare function createIconDataUrl(iconPath: string, color: string, size?: number): string;
30
+ /**
31
+ * Creates an SVG data URL for a network graph node.
32
+ * @param node - The Matter node
33
+ * @param threadRole - Optional Thread routing role
34
+ * @param isSelected - Whether the node is selected
35
+ * @param isOffline - Whether the node is offline
36
+ * @returns A data URL containing the SVG
37
+ */
38
+ export declare function createNodeIconDataUrl(node: MatterNode, threadRole?: number, isSelected?: boolean, isOffline?: boolean): string;
39
+ /**
40
+ * Creates an SVG data URL for an unknown Thread device (question mark).
41
+ * @param isRouter - Whether the device appears to be a router
42
+ * @param isSelected - Whether the node is selected
43
+ * @returns A data URL containing the SVG
44
+ */
45
+ export declare function createUnknownDeviceIconDataUrl(isRouter?: boolean, isSelected?: boolean): string;
46
+ /**
47
+ * Creates an SVG data URL for a WiFi access point/router.
48
+ * @param isSelected - Whether the node is selected
49
+ * @returns A data URL containing the SVG
50
+ */
51
+ export declare function createWiFiRouterIconDataUrl(isSelected?: boolean): string;
52
+ //# sourceMappingURL=device-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-icons.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/device-icons.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AA8I3D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAiBzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAuB3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAU5F;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACjC,IAAI,EAAE,UAAU,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,GAAE,OAAe,EAC3B,SAAS,GAAE,OAAe,GAC3B,MAAM,CAWR;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,GAAE,OAAe,EAAE,UAAU,GAAE,OAAe,GAAG,MAAM,CAI7G;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,GAAE,OAAe,GAAG,MAAM,CAG/E"}
@@ -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" : "#ff9800";
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
+ }