@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
@@ -12,6 +12,7 @@ import { LitElement } from "lit";
12
12
  import "../components/ha-svg-icon";
13
13
  import "./components/footer";
14
14
  import "./components/header";
15
+ import type { ActiveView } from "./components/header.js";
15
16
  import "./components/server-details";
16
17
  declare global {
17
18
  interface HTMLElementTagNameMap {
@@ -21,6 +22,9 @@ declare global {
21
22
  declare class MatterServerView extends LitElement {
22
23
  client: MatterClient;
23
24
  nodes: MatterClient["nodes"];
25
+ activeView?: ActiveView;
26
+ hasThreadDevices?: boolean;
27
+ hasWifiDevices?: boolean;
24
28
  private _cachedNodes?;
25
29
  private _cachedNodeEntries?;
26
30
  private getNodeEntries;
@@ -1 +1 @@
1
- {"version":3,"file":"matter-server-view.d.ts","sourceRoot":"","sources":["../../../src/pages/matter-server-view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,EAAgB,YAAY,EAAc,MAAM,0BAA0B,CAAC;AAElF,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAErD,OAAO,2BAA2B,CAAC;AAEnC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,6BAA6B,CAAC;AAErC,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,oBAAoB,EAAE,gBAAgB,CAAC;KAC1C;CACJ;AAED,cACM,gBAAiB,SAAQ,UAAU;IAC9B,MAAM,EAAG,YAAY,CAAC;IAGtB,KAAK,EAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,kBAAkB,CAAC,CAAyB;IAEpD,OAAO,CAAC,cAAc;IAQb,MAAM;IAiDf,OAAgB,MAAM,0BA8CpB;CACL"}
1
+ {"version":3,"file":"matter-server-view.d.ts","sourceRoot":"","sources":["../../../src/pages/matter-server-view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,+BAA+B,CAAC;AACvC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,EAAgB,YAAY,EAAc,MAAM,0BAA0B,CAAC;AAElF,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAErD,OAAO,2BAA2B,CAAC;AAEnC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,6BAA6B,CAAC;AAErC,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,oBAAoB,EAAE,gBAAgB,CAAC;KAC1C;CACJ;AAED,cACM,gBAAiB,SAAQ,UAAU;IAC9B,MAAM,EAAG,YAAY,CAAC;IAGtB,KAAK,EAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAG9B,UAAU,CAAC,EAAE,UAAU,CAAC;IAGxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAG3B,cAAc,CAAC,EAAE,OAAO,CAAC;IAEhC,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,kBAAkB,CAAC,CAAyB;IAEpD,OAAO,CAAC,cAAc;IAQb,MAAM;IAuDf,OAAgB,MAAM,0BA8CpB;CACL"}
@@ -37,7 +37,13 @@ let MatterServerView = class extends LitElement {
37
37
  render() {
38
38
  const nodes = this.getNodeEntries(this.nodes);
39
39
  return html`
40
- <dashboard-header title="Open Home Foundation Matter Server" .client=${this.client}></dashboard-header>
40
+ <dashboard-header
41
+ title="Open Home Foundation Matter Server"
42
+ .client=${this.client}
43
+ .activeView=${this.activeView}
44
+ .hasThreadDevices=${this.hasThreadDevices}
45
+ .hasWifiDevices=${this.hasWifiDevices}
46
+ ></dashboard-header>
41
47
 
42
48
  <!-- server details section -->
43
49
  <div class="container">
@@ -129,6 +135,15 @@ MatterServerView.styles = css`
129
135
  __decorateClass([
130
136
  property()
131
137
  ], MatterServerView.prototype, "nodes", 2);
138
+ __decorateClass([
139
+ property()
140
+ ], MatterServerView.prototype, "activeView", 2);
141
+ __decorateClass([
142
+ property({ type: Boolean })
143
+ ], MatterServerView.prototype, "hasThreadDevices", 2);
144
+ __decorateClass([
145
+ property({ type: Boolean })
146
+ ], MatterServerView.prototype, "hasWifiDevices", 2);
132
147
  MatterServerView = __decorateClass([
133
148
  customElement("matter-server-view")
134
149
  ], MatterServerView);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/pages/matter-server-view.ts"],
4
- "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,SAAS,oBAA8C;AACvD,SAAS,uBAAuB;AAChC,SAAS,KAAK,MAAM,YAAY,eAAe;AAC/C,SAAS,eAAe,gBAAgB;AACxC,OAAO;AACP,SAAS,yBAAyB;AAClC,OAAO;AACP,OAAO;AACP,OAAO;AASP,IAAM,mBAAN,cAA+B,WAAW;AAAA,EAS9B,eAAe,OAAsD;AACzE,QAAI,UAAU,KAAK,cAAc;AAC7B,WAAK,eAAe;AACpB,WAAK,qBAAqB,OAAO,QAAQ,KAAK;AAAA,IAClD;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAES,SAAS;AACd,UAAM,QAAQ,KAAK,eAAe,KAAK,KAAK;AAE5C,WAAO;AAAA,mFACoE,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA,0CAIpD,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAW/B,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM;AACzB,aAAO;AAAA,6DAC8B,SAAS,KAAK,OAAO,EAAE;AAAA;AAAA,2CAEzC,KAAK,OAAO;AAAA;AAAA,4CAEX;AAAA,QACA,aAAa,KAAK,OAAO,KACrB,KAAK,OAAO,WAAW,iBAAiB,SACtC,SACA,KAAK,OAAO,WAAW;AAAA,QAC7B,KAAK;AAAA,MACT,CAAC;AAAA;AAAA,sCAEH,KAAK,YAAY,KAAK,yCAAyC;AAAA;AAAA;AAAA,sCAG/D,KAAK,YAAY,GAAG,KAAK,SAAS,QAAQ,OAAO,IAAI,KAAK,UAAU;AAAA,sCACpE,KAAK,WAAW;AAAA;AAAA,gEAEU,eAAe;AAAA;AAAA;AAAA,IAG3D,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB;AAiDJ;AAjHM,iBAkEc,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9DlB;AAAA,EADN,SAAS;AAAA,GAHR,iBAIK;AAJL,mBAAN;AAAA,EADC,cAAc,oBAAoB;AAAA,GAC7B;",
4
+ "mappings": ";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,SAAS,oBAA8C;AACvD,SAAS,uBAAuB;AAChC,SAAS,KAAK,MAAM,YAAY,eAAe;AAC/C,SAAS,eAAe,gBAAgB;AACxC,OAAO;AACP,SAAS,yBAAyB;AAClC,OAAO;AACP,OAAO;AAEP,OAAO;AASP,IAAM,mBAAN,cAA+B,WAAW;AAAA,EAkB9B,eAAe,OAAsD;AACzE,QAAI,UAAU,KAAK,cAAc;AAC7B,WAAK,eAAe;AACpB,WAAK,qBAAqB,OAAO,QAAQ,KAAK;AAAA,IAClD;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAES,SAAS;AACd,UAAM,QAAQ,KAAK,eAAe,KAAK,KAAK;AAE5C,WAAO;AAAA;AAAA;AAAA,0BAGW,KAAK,MAAM;AAAA,8BACP,KAAK,UAAU;AAAA,oCACT,KAAK,gBAAgB;AAAA,kCACvB,KAAK,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,0CAKX,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAW/B,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM;AACzB,aAAO;AAAA,6DAC8B,SAAS,KAAK,OAAO,EAAE;AAAA;AAAA,2CAEzC,KAAK,OAAO;AAAA;AAAA,4CAEX;AAAA,QACA,aAAa,KAAK,OAAO,KACrB,KAAK,OAAO,WAAW,iBAAiB,SACtC,SACA,KAAK,OAAO,WAAW;AAAA,QAC7B,KAAK;AAAA,MACT,CAAC;AAAA;AAAA,sCAEH,KAAK,YAAY,KAAK,yCAAyC;AAAA;AAAA;AAAA,sCAG/D,KAAK,YAAY,GAAG,KAAK,SAAS,QAAQ,OAAO,IAAI,KAAK,UAAU;AAAA,sCACpE,KAAK,WAAW;AAAA;AAAA,gEAEU,eAAe;AAAA;AAAA;AAAA,IAG3D,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB;AAiDJ;AAhIM,iBAiFc,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA7ElB;AAAA,EADN,SAAS;AAAA,GAHR,iBAIK;AAGA;AAAA,EADN,SAAS;AAAA,GANR,iBAOK;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GATzB,iBAUK;AAGA;AAAA,EADN,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAZzB,iBAaK;AAbL,mBAAN;AAAA,EADC,cAAc,oBAAoB;AAAA,GAC7B;",
5
5
  "names": []
6
6
  }
@@ -0,0 +1,74 @@
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
+ import { LitElement } from "lit";
8
+ import { DataSet, Network } from "vis-network/standalone";
9
+ import type { NetworkGraphEdge, NetworkGraphNode } from "./network-types.js";
10
+ /**
11
+ * Base class for network graph components (Thread and WiFi).
12
+ * Provides shared vis.js network initialization, highlighting, and theme support.
13
+ */
14
+ export declare abstract class BaseNetworkGraph extends LitElement {
15
+ nodes: Record<string, MatterNode>;
16
+ protected _selectedNodeId: number | string | null;
17
+ protected _network?: Network;
18
+ protected _nodesDataSet?: DataSet<NetworkGraphNode>;
19
+ protected _edgesDataSet?: DataSet<NetworkGraphEdge>;
20
+ protected _container?: HTMLDivElement;
21
+ protected _resizeObserver?: ResizeObserver;
22
+ protected _themeUnsubscribe?: () => void;
23
+ protected _updateDebounceTimer?: ReturnType<typeof setTimeout>;
24
+ /** Store original edge colors for restoration after highlighting */
25
+ private _originalEdgeColors;
26
+ protected _getFontColor(): string;
27
+ protected _getDimmedEdgeColor(): string;
28
+ /**
29
+ * Returns physics options for the network. Override in subclasses for different behavior.
30
+ */
31
+ protected _getPhysicsOptions(): any;
32
+ updated(changedProperties: Map<string, unknown>): void;
33
+ /**
34
+ * Try to find and attach the graph container if it wasn't available before.
35
+ * This handles the case where empty state was rendered initially.
36
+ */
37
+ private _tryAttachContainer;
38
+ /** Debounced graph update to avoid excessive redraws */
39
+ protected _debouncedUpdateGraph(): void;
40
+ firstUpdated(): void;
41
+ disconnectedCallback(): void;
42
+ protected _initializeNetwork(): void;
43
+ /**
44
+ * Returns true if the graph is initialized and ready for interaction.
45
+ */
46
+ isReady(): boolean;
47
+ /**
48
+ * Fits all nodes into view.
49
+ */
50
+ fit(): void;
51
+ /**
52
+ * Selects a node by ID and focuses on it.
53
+ */
54
+ selectNode(nodeId: number | string): void;
55
+ protected _dispatchNodeSelected(nodeId: number | string | null): void;
56
+ /**
57
+ * Highlights edges connected to the selected node and makes neighbor nodes more prominent.
58
+ */
59
+ protected _highlightConnections(nodeId: number | string): void;
60
+ /**
61
+ * Clears all highlights and restores default styling.
62
+ */
63
+ protected _clearHighlights(): void;
64
+ /**
65
+ * Clear stored edge colors when graph is updated (edges are recreated).
66
+ */
67
+ protected _clearOriginalEdgeColors(): void;
68
+ /**
69
+ * Abstract method to be implemented by subclasses for graph-specific updates.
70
+ */
71
+ protected abstract _updateGraph(): void;
72
+ static styles: import("lit").CSSResult;
73
+ }
74
+ //# sourceMappingURL=base-network-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-network-graph.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/base-network-graph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAO,MAAM,KAAK,CAAC;AAGtC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;;GAGG;AACH,8BAAsB,gBAAiB,SAAQ,UAAU;IAE9C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAM;IAG9C,SAAS,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAQ;IAEzD,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpD,SAAS,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpD,SAAS,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IACtC,SAAS,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC;IAC3C,SAAS,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC,SAAS,CAAC,oBAAoB,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAE/D,oEAAoE;IACpE,OAAO,CAAC,mBAAmB,CAAgE;IAE3F,SAAS,CAAC,aAAa,IAAI,MAAM;IAIjC,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAIvC;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,GAAG;IAoB1B,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAc/D;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAmB3B,wDAAwD;IACxD,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAS9B,YAAY,IAAI,IAAI;IAoCpB,oBAAoB,IAAI,IAAI;IAgBrC,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAyFpC;;OAEG;IACI,OAAO,IAAI,OAAO;IAIzB;;OAEG;IACI,GAAG,IAAI,IAAI;IASlB;;OAEG;IACI,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkBhD,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI;IAUrE;;OAEG;IACH,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAqE9D;;OAEG;IACH,SAAS,CAAC,gBAAgB,IAAI,IAAI;IA8BlC;;OAEG;IACH,SAAS,CAAC,wBAAwB,IAAI,IAAI;IAI1C;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI;IAEvC,OAAgB,MAAM,0BAuCpB;CACL"}
@@ -0,0 +1,403 @@
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) {
114
+ this._network.setOptions({
115
+ nodes: {
116
+ font: {
117
+ color: this._getFontColor()
118
+ }
119
+ }
120
+ });
121
+ this._updateGraph();
122
+ }
123
+ });
124
+ }
125
+ disconnectedCallback() {
126
+ super.disconnectedCallback();
127
+ this._resizeObserver?.disconnect();
128
+ this._themeUnsubscribe?.();
129
+ if (this._updateDebounceTimer) {
130
+ clearTimeout(this._updateDebounceTimer);
131
+ }
132
+ this._nodesDataSet?.clear();
133
+ this._edgesDataSet?.clear();
134
+ this._network?.destroy();
135
+ this._network = void 0;
136
+ this._nodesDataSet = void 0;
137
+ this._edgesDataSet = void 0;
138
+ this._originalEdgeColors.clear();
139
+ }
140
+ _initializeNetwork() {
141
+ if (!this._container) return;
142
+ const rect = this._container.getBoundingClientRect();
143
+ if (rect.width === 0 || rect.height === 0) {
144
+ return;
145
+ }
146
+ this._nodesDataSet = new DataSet();
147
+ this._edgesDataSet = new DataSet();
148
+ const options = {
149
+ width: `${rect.width}px`,
150
+ height: `${rect.height}px`,
151
+ autoResize: false,
152
+ // We handle resize manually
153
+ nodes: {
154
+ shape: "image",
155
+ size: 30,
156
+ font: {
157
+ size: 12,
158
+ color: this._getFontColor()
159
+ },
160
+ borderWidth: 2,
161
+ borderWidthSelected: 3
162
+ },
163
+ edges: {
164
+ width: 2,
165
+ smooth: {
166
+ type: "continuous",
167
+ roundness: 0.5
168
+ }
169
+ },
170
+ physics: this._getPhysicsOptions(),
171
+ interaction: {
172
+ hover: true,
173
+ tooltipDelay: 200,
174
+ hideEdgesOnDrag: true
175
+ }
176
+ };
177
+ this._network = new Network(
178
+ this._container,
179
+ {
180
+ nodes: this._nodesDataSet,
181
+ edges: this._edgesDataSet
182
+ },
183
+ options
184
+ );
185
+ this._network.on("selectNode", (params) => {
186
+ if (params.nodes.length > 0) {
187
+ this._selectedNodeId = params.nodes[0];
188
+ this._highlightConnections(this._selectedNodeId);
189
+ this._dispatchNodeSelected(this._selectedNodeId);
190
+ }
191
+ });
192
+ this._network.on("deselectNode", () => {
193
+ this._selectedNodeId = null;
194
+ this._clearHighlights();
195
+ this._dispatchNodeSelected(null);
196
+ });
197
+ this._network.on("stabilizationIterationsDone", () => {
198
+ this._network?.fit({
199
+ animation: {
200
+ duration: 500,
201
+ easingFunction: "easeInOutQuad"
202
+ }
203
+ });
204
+ });
205
+ this._network.on("stabilized", () => {
206
+ this._network?.fit({
207
+ animation: {
208
+ duration: 300,
209
+ easingFunction: "easeInOutQuad"
210
+ }
211
+ });
212
+ });
213
+ this._updateGraph();
214
+ }
215
+ /**
216
+ * Returns true if the graph is initialized and ready for interaction.
217
+ */
218
+ isReady() {
219
+ return this._network !== void 0 && this._nodesDataSet !== void 0;
220
+ }
221
+ /**
222
+ * Fits all nodes into view.
223
+ */
224
+ fit() {
225
+ this._network?.fit({
226
+ animation: {
227
+ duration: 300,
228
+ easingFunction: "easeInOutQuad"
229
+ }
230
+ });
231
+ }
232
+ /**
233
+ * Selects a node by ID and focuses on it.
234
+ */
235
+ selectNode(nodeId) {
236
+ if (!this._network) return;
237
+ this._selectedNodeId = nodeId;
238
+ this._network.selectNodes([nodeId]);
239
+ this._highlightConnections(nodeId);
240
+ this._dispatchNodeSelected(nodeId);
241
+ this._network.focus(nodeId, {
242
+ scale: 1.2,
243
+ animation: {
244
+ duration: 500,
245
+ easingFunction: "easeInOutQuad"
246
+ }
247
+ });
248
+ }
249
+ _dispatchNodeSelected(nodeId) {
250
+ this.dispatchEvent(
251
+ new CustomEvent("node-selected", {
252
+ detail: { nodeId },
253
+ bubbles: true,
254
+ composed: true
255
+ })
256
+ );
257
+ }
258
+ /**
259
+ * Highlights edges connected to the selected node and makes neighbor nodes more prominent.
260
+ */
261
+ _highlightConnections(nodeId) {
262
+ if (!this._edgesDataSet || !this._nodesDataSet) return;
263
+ const allEdges = this._edgesDataSet.get();
264
+ for (const edge of allEdges) {
265
+ const edgeId = String(edge.id);
266
+ if (!this._originalEdgeColors.has(edgeId)) {
267
+ const colorObj = edge.color;
268
+ this._originalEdgeColors.set(edgeId, {
269
+ color: colorObj?.color ?? "#999999",
270
+ highlight: colorObj?.highlight ?? "#999999"
271
+ });
272
+ }
273
+ }
274
+ const connectedEdges = this._edgesDataSet.get({
275
+ filter: (edge) => edge.from === nodeId || edge.to === nodeId
276
+ });
277
+ const neighborIds = /* @__PURE__ */ new Set();
278
+ for (const edge of connectedEdges) {
279
+ if (edge.from === nodeId) {
280
+ neighborIds.add(edge.to);
281
+ } else {
282
+ neighborIds.add(edge.from);
283
+ }
284
+ }
285
+ const dimmedColor = this._getDimmedEdgeColor();
286
+ const edgeUpdates = allEdges.map((edge) => {
287
+ const isConnected = edge.from === nodeId || edge.to === nodeId;
288
+ const originalColor = this._originalEdgeColors.get(String(edge.id));
289
+ return {
290
+ id: edge.id,
291
+ width: isConnected ? 3 : 1,
292
+ // Dim non-connected edges
293
+ color: isConnected ? { color: originalColor?.color, highlight: originalColor?.highlight } : {
294
+ color: dimmedColor,
295
+ highlight: dimmedColor
296
+ }
297
+ };
298
+ });
299
+ this._edgesDataSet.update(edgeUpdates);
300
+ const allNodes = this._nodesDataSet.get();
301
+ const nodeUpdates = allNodes.map((node) => {
302
+ const isNeighbor = neighborIds.has(node.id);
303
+ const isSelected = node.id === nodeId;
304
+ return {
305
+ id: node.id,
306
+ size: isSelected ? 40 : isNeighbor ? 35 : 25,
307
+ font: {
308
+ size: isSelected ? 14 : isNeighbor ? 13 : 11,
309
+ color: this._getFontColor(),
310
+ bold: isSelected || isNeighbor ? { color: this._getFontColor() } : void 0
311
+ },
312
+ opacity: isSelected || isNeighbor ? 1 : 0.5
313
+ };
314
+ });
315
+ this._nodesDataSet.update(nodeUpdates);
316
+ }
317
+ /**
318
+ * Clears all highlights and restores default styling.
319
+ */
320
+ _clearHighlights() {
321
+ if (!this._edgesDataSet || !this._nodesDataSet) return;
322
+ const allEdges = this._edgesDataSet.get();
323
+ const edgeUpdates = allEdges.map((edge) => {
324
+ const originalColor = this._originalEdgeColors.get(String(edge.id));
325
+ return {
326
+ id: edge.id,
327
+ width: 2,
328
+ color: originalColor ?? { color: "#999999", highlight: "#999999" }
329
+ };
330
+ });
331
+ this._edgesDataSet.update(edgeUpdates);
332
+ const allNodes = this._nodesDataSet.get();
333
+ const nodeUpdates = allNodes.map((node) => ({
334
+ id: node.id,
335
+ size: 30,
336
+ font: {
337
+ size: 12,
338
+ color: this._getFontColor(),
339
+ bold: void 0
340
+ },
341
+ opacity: 1
342
+ }));
343
+ this._nodesDataSet.update(nodeUpdates);
344
+ }
345
+ /**
346
+ * Clear stored edge colors when graph is updated (edges are recreated).
347
+ */
348
+ _clearOriginalEdgeColors() {
349
+ this._originalEdgeColors.clear();
350
+ }
351
+ static {
352
+ this.styles = css`
353
+ :host {
354
+ display: block;
355
+ width: 100%;
356
+ height: 100%;
357
+ min-height: 0;
358
+ }
359
+
360
+ .graph-container {
361
+ width: 100%;
362
+ height: 100%;
363
+ background-color: var(--md-sys-color-surface, #fff);
364
+ border-radius: 8px;
365
+ border: 1px solid var(--md-sys-color-outline-variant, #ccc);
366
+ }
367
+
368
+ .empty-state {
369
+ display: flex;
370
+ flex-direction: column;
371
+ align-items: center;
372
+ justify-content: center;
373
+ height: 100%;
374
+ color: var(--md-sys-color-on-surface-variant, #666);
375
+ text-align: center;
376
+ padding: 24px;
377
+ box-sizing: border-box;
378
+ background-color: var(--md-sys-color-surface, #fff);
379
+ border-radius: 8px;
380
+ border: 1px solid var(--md-sys-color-outline-variant, #ccc);
381
+ }
382
+
383
+ .empty-state p {
384
+ margin: 8px 0;
385
+ }
386
+
387
+ .empty-state .hint {
388
+ font-size: 0.875rem;
389
+ opacity: 0.7;
390
+ }
391
+ `;
392
+ }
393
+ }
394
+ __decorateClass([
395
+ property({ type: Object })
396
+ ], BaseNetworkGraph.prototype, "nodes", 2);
397
+ __decorateClass([
398
+ state()
399
+ ], BaseNetworkGraph.prototype, "_selectedNodeId", 2);
400
+ export {
401
+ BaseNetworkGraph
402
+ };
403
+ //# 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"}