@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.
- package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts +2 -2
- package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts +36 -0
- package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts.map +1 -0
- package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js +159 -0
- package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js.map +6 -0
- package/dist/esm/pages/cluster-commands/index.d.ts +1 -0
- package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/index.js +1 -0
- package/dist/esm/pages/cluster-commands/index.js.map +1 -1
- package/dist/esm/pages/components/footer.d.ts.map +1 -1
- package/dist/esm/pages/components/footer.js +4 -7
- package/dist/esm/pages/components/footer.js.map +1 -1
- package/dist/esm/pages/components/header.d.ts +5 -0
- package/dist/esm/pages/components/header.d.ts.map +1 -1
- package/dist/esm/pages/components/header.js +75 -0
- package/dist/esm/pages/components/header.js.map +1 -1
- package/dist/esm/pages/components/node-details.js +1 -1
- package/dist/esm/pages/components/node-details.js.map +1 -1
- package/dist/esm/pages/components/server-details.d.ts.map +1 -1
- package/dist/esm/pages/components/server-details.js +0 -1
- package/dist/esm/pages/components/server-details.js.map +1 -1
- package/dist/esm/pages/matter-dashboard-app.d.ts +12 -0
- package/dist/esm/pages/matter-dashboard-app.d.ts.map +1 -1
- package/dist/esm/pages/matter-dashboard-app.js +84 -4
- package/dist/esm/pages/matter-dashboard-app.js.map +1 -1
- package/dist/esm/pages/matter-network-view.d.ts +52 -0
- package/dist/esm/pages/matter-network-view.d.ts.map +1 -0
- package/dist/esm/pages/matter-network-view.js +309 -0
- package/dist/esm/pages/matter-network-view.js.map +6 -0
- package/dist/esm/pages/matter-node-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-node-view.js +70 -1
- package/dist/esm/pages/matter-node-view.js.map +1 -1
- package/dist/esm/pages/matter-server-view.d.ts +4 -0
- package/dist/esm/pages/matter-server-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-server-view.js +16 -1
- package/dist/esm/pages/matter-server-view.js.map +1 -1
- package/dist/esm/pages/network/base-network-graph.d.ts +74 -0
- package/dist/esm/pages/network/base-network-graph.d.ts.map +1 -0
- package/dist/esm/pages/network/base-network-graph.js +403 -0
- package/dist/esm/pages/network/base-network-graph.js.map +6 -0
- package/dist/esm/pages/network/device-icons.d.ts +52 -0
- package/dist/esm/pages/network/device-icons.d.ts.map +1 -0
- package/dist/esm/pages/network/device-icons.js +197 -0
- package/dist/esm/pages/network/device-icons.js.map +6 -0
- package/dist/esm/pages/network/device-panel.d.ts +31 -0
- package/dist/esm/pages/network/device-panel.d.ts.map +1 -0
- package/dist/esm/pages/network/device-panel.js +183 -0
- package/dist/esm/pages/network/device-panel.js.map +6 -0
- package/dist/esm/pages/network/network-details.d.ts +47 -0
- package/dist/esm/pages/network/network-details.d.ts.map +1 -0
- package/dist/esm/pages/network/network-details.js +686 -0
- package/dist/esm/pages/network/network-details.js.map +6 -0
- package/dist/esm/pages/network/network-types.d.ts +153 -0
- package/dist/esm/pages/network/network-types.d.ts.map +1 -0
- package/dist/esm/pages/network/network-types.js +19 -0
- package/dist/esm/pages/network/network-types.js.map +6 -0
- package/dist/esm/pages/network/network-utils.d.ts +170 -0
- package/dist/esm/pages/network/network-utils.d.ts.map +1 -0
- package/dist/esm/pages/network/network-utils.js +472 -0
- package/dist/esm/pages/network/network-utils.js.map +6 -0
- package/dist/esm/pages/network/thread-graph.d.ts +27 -0
- package/dist/esm/pages/network/thread-graph.d.ts.map +1 -0
- package/dist/esm/pages/network/thread-graph.js +134 -0
- package/dist/esm/pages/network/thread-graph.js.map +6 -0
- package/dist/esm/pages/network/wifi-graph.d.ts +27 -0
- package/dist/esm/pages/network/wifi-graph.d.ts.map +1 -0
- package/dist/esm/pages/network/wifi-graph.js +167 -0
- package/dist/esm/pages/network/wifi-graph.js.map +6 -0
- package/dist/web/js/{commission-node-dialog-CBSDiqRW.js → commission-node-dialog-B1_khzZb.js} +5 -5
- package/dist/web/js/{commission-node-existing-TP6s8Tez.js → commission-node-existing-RpdajrwF.js} +2 -5
- package/dist/web/js/{commission-node-thread-DOB8pu6x.js → commission-node-thread-5f2itkTG.js} +2 -5
- package/dist/web/js/{commission-node-wifi-tzavmk1j.js → commission-node-wifi-DZ_pWqsa.js} +2 -5
- package/dist/web/js/{dialog-box-Dknil_Be.js → dialog-box-DEUxM4B1.js} +2 -2
- package/dist/web/js/{fire_event-DRpOSjJR.js → fire_event-BczBMT8E.js} +1 -1
- package/dist/web/js/{log-level-dialog-TXkma-7Z.js → log-level-dialog-Cr3PfX1X.js} +2 -3
- package/dist/web/js/main.js +1 -1
- package/dist/web/js/matter-dashboard-app-BuCe_Jxf.js +29990 -0
- package/dist/web/js/{node-binding-dialog-D52FCBFP.js → node-binding-dialog-DMiHNDLA.js} +2 -4
- package/dist/web/js/{prevent_default-BPgSQsuY.js → prevent_default-D4FX_PIh.js} +2 -42
- package/package.json +5 -4
- package/src/pages/cluster-commands/base-cluster-commands.ts +2 -2
- package/src/pages/cluster-commands/clusters/basic-information-commands.ts +171 -0
- package/src/pages/cluster-commands/index.ts +1 -0
- package/src/pages/components/footer.ts +4 -7
- package/src/pages/components/header.ts +81 -0
- package/src/pages/components/node-details.ts +2 -2
- package/src/pages/components/server-details.ts +0 -1
- package/src/pages/matter-dashboard-app.ts +105 -5
- package/src/pages/matter-network-view.ts +325 -0
- package/src/pages/matter-node-view.ts +75 -1
- package/src/pages/matter-server-view.ts +17 -1
- package/src/pages/network/base-network-graph.ts +463 -0
- package/src/pages/network/device-icons.ts +283 -0
- package/src/pages/network/device-panel.ts +180 -0
- package/src/pages/network/network-details.ts +750 -0
- package/src/pages/network/network-types.ts +161 -0
- package/src/pages/network/network-utils.ts +752 -0
- package/src/pages/network/thread-graph.ts +164 -0
- package/src/pages/network/wifi-graph.ts +192 -0
- package/dist/web/js/matter-dashboard-app-B7GUghkC.js +0 -17254
- package/dist/web/js/outlined-text-field-D1DyKQY-.js +0 -968
- 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;
|
|
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
|
|
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;
|
|
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"}
|