@mp70/react-networks 0.3.1-alpha.0 → 0.5.0-alpha.0

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/index.d.ts CHANGED
@@ -253,7 +253,7 @@ type PortCableType = 'smf' | 'cat6' | 'om3' | 'om4' | 'om5' | 'cat5e' | 'cat6a'
253
253
  *
254
254
  * @public
255
255
  */
256
- type DeviceImageFit = 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';
256
+ type DeviceImageFit = 'cover' | 'contain' | 'contain-height' | 'fill' | 'none' | 'scale-down';
257
257
  /**
258
258
  * Device image repeat options.
259
259
  * @public
@@ -298,8 +298,9 @@ interface PortPosition {
298
298
  yPercent?: number;
299
299
  }
300
300
  /**
301
- * Simplified flat port input for device and PDU rendering.
302
- * `react-networks` groups these into front/rear `PortBlock[]` internally.
301
+ * Recommended simple port input for device and PDU rendering.
302
+ * Pass a flat array in `ports`; `react-networks` groups entries into front/rear
303
+ * `PortBlock[]` internally using each port's `face` and `group`.
303
304
  * @public
304
305
  */
305
306
  interface DevicePort {
@@ -319,6 +320,8 @@ interface DevicePort {
319
320
  cableType?: PortCableType;
320
321
  /** Optional power connector type for rendering (mainly for PDU ports) */
321
322
  connectorType?: 'C13' | 'C14' | 'C19' | 'C20';
323
+ /** Optional compatibility keys. When omitted, defaults are derived from type/cable/connector data. */
324
+ compatibility?: string[];
322
325
  /** Optional sort order within a face/group bucket */
323
326
  order?: number;
324
327
  /**
@@ -341,6 +344,8 @@ interface Port {
341
344
  cableType?: PortCableType;
342
345
  /** Optional power connector type for rendering (mainly for PDU ports) */
343
346
  connectorType?: 'C13' | 'C14' | 'C19' | 'C20';
347
+ /** Optional compatibility keys. When omitted, defaults are derived from type/cable/connector data. */
348
+ compatibility?: string[];
344
349
  /** Optional explicit handle placement */
345
350
  position?: PortPosition;
346
351
  }
@@ -399,11 +404,11 @@ interface NetworkNodeDataBase extends DeviceImageOptions {
399
404
  label: string;
400
405
  /** Current status of the node/device */
401
406
  status?: DeviceStatus | string;
402
- /** Flat port input that is normalized into grouped front/rear blocks internally */
407
+ /** Simple flat port input. Use `portGroups` / `rearPortGroups` for explicit grouped control. */
403
408
  ports?: DevicePort[] | number;
404
- /** Lower-level grouped front port input */
409
+ /** Advanced grouped front port input */
405
410
  portGroups?: PortBlock[];
406
- /** Lower-level grouped rear port input */
411
+ /** Advanced grouped rear port input */
407
412
  rearPortGroups?: PortBlock[];
408
413
  /** List of connected node IDs */
409
414
  connections?: string[];
@@ -419,6 +424,8 @@ interface NetworkNodeDataBase extends DeviceImageOptions {
419
424
  uHeight?: number;
420
425
  /** Device position within rack in U units */
421
426
  uPosition?: number;
427
+ /** Whether this node is currently mounted inside a rack container */
428
+ isRackMounted?: boolean;
422
429
  /** Current front/rear view orientation */
423
430
  view?: DeviceView;
424
431
  /** Rack face orientation */
@@ -701,9 +708,148 @@ type NetworkEdge<TData extends NetworkEdgeData = NetworkEdgeData> = {
701
708
  targetHandle?: string;
702
709
  /** Type of network connection */
703
710
  type?: NetworkEdgeType;
711
+ /** Whether the edge should be hidden from rendering */
712
+ hidden?: boolean;
704
713
  /** Edge data and configuration */
705
714
  data?: TData;
706
715
  };
716
+ /**
717
+ * High-level document format independent from React Flow handle ids.
718
+ * @public
719
+ */
720
+ interface DiagramDocument {
721
+ nodes: DiagramNode[];
722
+ edges: DiagramEdge[];
723
+ ui?: DiagramUiState;
724
+ metadata?: Record<string, unknown>;
725
+ }
726
+ /**
727
+ * Node kinds used by the document model.
728
+ * @public
729
+ */
730
+ type DiagramNodeKind = 'rack' | 'equipment' | 'pdu' | 'fiber' | 'tube' | 'cable' | 'multi-tube-cable' | 'splice' | 'coupler' | 'splitter' | 'container' | 'fibre-flow-cable' | 'fibre-flow-closure';
731
+ /**
732
+ * Placement data for document nodes.
733
+ * @public
734
+ */
735
+ interface DiagramNodePlacement {
736
+ position: {
737
+ x: number;
738
+ y: number;
739
+ };
740
+ parentId?: string;
741
+ extent?: 'parent';
742
+ rack?: {
743
+ uPosition?: number;
744
+ mountMode?: RackMountMode;
745
+ rackLayout?: RackLayoutMode;
746
+ rackWidthPx?: number;
747
+ rackFaceGapPx?: number;
748
+ };
749
+ container?: {
750
+ slotPosition?: number;
751
+ holderPosition?: number;
752
+ };
753
+ }
754
+ /**
755
+ * Endpoint definition for document nodes.
756
+ * @public
757
+ */
758
+ interface DiagramEndpoint {
759
+ id: string;
760
+ label: string;
761
+ face?: DeviceView | 'internal';
762
+ group?: string;
763
+ role?: 'network' | 'power' | 'fiber' | 'tube' | 'splice' | 'coupler' | 'splitter' | 'cable' | 'generic';
764
+ medium?: 'ethernet' | 'fiber' | 'power' | 'tube' | 'generic';
765
+ type?: PortType;
766
+ cableType?: PortCableType;
767
+ connector?: string;
768
+ compatibility?: string[];
769
+ layout?: PortPosition;
770
+ }
771
+ /**
772
+ * Render-focused node data for the document model.
773
+ * @public
774
+ */
775
+ interface DiagramNodeRender {
776
+ status?: DeviceStatus | string;
777
+ view?: DeviceView;
778
+ face?: DeviceView;
779
+ width?: Width | number;
780
+ widthPx?: number;
781
+ height?: number;
782
+ header?: string;
783
+ color?: string;
784
+ colorMode?: 'light' | 'dark' | 'system';
785
+ rackWidthPx?: number;
786
+ rackFaceGapPx?: number;
787
+ images?: DeviceImageOptions;
788
+ dimensions?: Record<string, number | undefined>;
789
+ showUMarkers?: boolean;
790
+ customHeaderText?: string;
791
+ powerSide?: PowerSide;
792
+ rotation?: number;
793
+ }
794
+ /**
795
+ * External reference attached to a document node.
796
+ * @public
797
+ */
798
+ interface DiagramExternalRef {
799
+ source: 'netbox' | 'inventory' | string;
800
+ id: string | number;
801
+ type?: string;
802
+ metadata?: Record<string, unknown>;
803
+ }
804
+ /**
805
+ * Document node.
806
+ * @public
807
+ */
808
+ interface DiagramNode {
809
+ id: string;
810
+ kind: DiagramNodeKind;
811
+ subtype?: string;
812
+ label: string;
813
+ placement: DiagramNodePlacement;
814
+ endpoints?: DiagramEndpoint[];
815
+ render?: DiagramNodeRender;
816
+ config?: Record<string, unknown>;
817
+ externalRefs?: DiagramExternalRef[];
818
+ metadata?: Record<string, unknown>;
819
+ }
820
+ /**
821
+ * Endpoint reference used by document edges.
822
+ * @public
823
+ */
824
+ interface DiagramEdgeEndpoint {
825
+ nodeId: string;
826
+ endpointId?: string | null;
827
+ }
828
+ /**
829
+ * Document edge.
830
+ * @public
831
+ */
832
+ interface DiagramEdge {
833
+ id: string;
834
+ source: DiagramEdgeEndpoint;
835
+ target: DiagramEdgeEndpoint;
836
+ type?: NetworkEdgeType;
837
+ hidden?: boolean;
838
+ data?: NetworkEdgeData;
839
+ metadata?: Record<string, unknown>;
840
+ }
841
+ /**
842
+ * Non-topology UI state stored alongside a document.
843
+ * @public
844
+ */
845
+ interface DiagramUiState {
846
+ nodeState?: Record<string, {
847
+ view?: DeviceView;
848
+ face?: DeviceView;
849
+ handleSideMap?: Record<string, DeviceView>;
850
+ }>;
851
+ metadata?: Record<string, unknown>;
852
+ }
707
853
  /**
708
854
  * Rack device types
709
855
  * @public
@@ -759,13 +905,13 @@ interface RackDevice extends DeviceImageOptions {
759
905
  mountMode?: RackMountMode;
760
906
  /** Device role in network */
761
907
  role?: string;
762
- /** Flat port input normalized by the renderer */
908
+ /** Recommended simple port input. Use `portGroups` / `rearPortGroups` for explicit grouped control. */
763
909
  ports?: DevicePort[];
764
910
  /** Current status of the device */
765
911
  status?: DeviceStatus | string;
766
- /** Lower-level grouped front port input */
912
+ /** Advanced grouped front port input */
767
913
  portGroups?: PortBlock[];
768
- /** Lower-level grouped rear port input */
914
+ /** Advanced grouped rear port input */
769
915
  rearPortGroups?: PortBlock[];
770
916
  /** Power port side for rear view */
771
917
  powerSide?: PowerSide;
@@ -973,6 +1119,12 @@ interface NetworkDiagramStoreApi {
973
1119
  * @public
974
1120
  */
975
1121
  interface NetworkDiagramProps {
1122
+ /** Controlled document model. When provided, it takes precedence over nodes/edges props. */
1123
+ document?: DiagramDocument;
1124
+ /** Initial document for uncontrolled document mode. */
1125
+ initialDocument?: DiagramDocument;
1126
+ /** Callback when the document changes in document mode. */
1127
+ onDocumentChange?: (document: DiagramDocument) => void;
976
1128
  /** Controlled nodes array */
977
1129
  nodes?: NetworkNode[];
978
1130
  /** Controlled edges array */
@@ -1051,30 +1203,6 @@ interface NetworkDiagramProps {
1051
1203
  fitViewOptions?: FitViewOptions;
1052
1204
  }
1053
1205
 
1054
- /**
1055
- * Main component for rendering interactive network diagrams.
1056
- *
1057
- * The NetworkDiagram component provides a complete solution for visualizing
1058
- * network infrastructure including racks, devices, fiber connections, and power distribution.
1059
- *
1060
- * @example
1061
- * ```tsx
1062
- * import { NetworkDiagram, NetworkNode, NetworkEdge } from '@mp70/react-networks';
1063
- *
1064
- * const nodes: NetworkNode[] = [
1065
- * {
1066
- * id: 'rack-1',
1067
- * type: 'rack',
1068
- * position: { x: 100, y: 100 },
1069
- * data: { label: 'Main Rack', uHeight: 42 }
1070
- * }
1071
- * ];
1072
- *
1073
- * <NetworkDiagram nodes={nodes} edges={[]} />
1074
- * ```
1075
- *
1076
- * @public
1077
- */
1078
1206
  declare const NetworkDiagram: React$1.FC<NetworkDiagramProps>;
1079
1207
 
1080
1208
  interface DiagramErrorBoundaryProps {
@@ -1194,12 +1322,9 @@ declare const PowerEdge: React$1.FC<EdgeProps>;
1194
1322
  * label: 'Web Server',
1195
1323
  * deviceType: 'server',
1196
1324
  * uPosition: 1,
1197
- * ports: [{
1198
- * name: 'Network Ports',
1199
- * ports: [
1200
- * { label: 'eth0', connected: true, type: 'ethernet' }
1201
- * ]
1202
- * }]
1325
+ * ports: [
1326
+ * { id: 'eth0', label: 'eth0', group: 'Network Ports', connected: true, type: 'ethernet' }
1327
+ * ]
1203
1328
  * }
1204
1329
  * }
1205
1330
  * ```
@@ -1976,6 +2101,30 @@ declare function hasFrontPorts(data: PortFaceData | undefined): boolean;
1976
2101
  declare function hasRearPorts(data: PortFaceData | undefined): boolean;
1977
2102
  declare function getDefaultDeviceView(data: PortFaceData | undefined): DeviceView;
1978
2103
 
2104
+ interface NetworkGraphSnapshot {
2105
+ nodes: NetworkNode[];
2106
+ edges: NetworkEdge[];
2107
+ }
2108
+ declare function networkGraphToDiagramDocument(snapshot: NetworkGraphSnapshot, previousDocument?: DiagramDocument): DiagramDocument;
2109
+ declare function diagramDocumentToNetworkGraph(document: DiagramDocument): NetworkGraphSnapshot;
2110
+
2111
+ type EndpointConnectionKind = 'power' | 'network' | 'unknown';
2112
+ interface EndpointMetadata {
2113
+ normalizedHandle: string;
2114
+ face?: DeviceView;
2115
+ kind: EndpointConnectionKind;
2116
+ compatibility: string[];
2117
+ }
2118
+ declare function resolveEndpointCompatibilityKeys(input: {
2119
+ compatibility?: string[];
2120
+ kind?: EndpointConnectionKind;
2121
+ type?: string;
2122
+ cableType?: string;
2123
+ connectorType?: string;
2124
+ handleId?: string;
2125
+ }): string[];
2126
+ declare function getEndpointMetadata(node?: NetworkNode, handle?: string | null): EndpointMetadata;
2127
+
1979
2128
  /**
1980
2129
  * Power connector utilities for consistent styling across devices and PDUs
1981
2130
  */
@@ -2307,6 +2456,10 @@ interface TemplateParseResult {
2307
2456
  *
2308
2457
  * **Port position semantics**: Positions use `xPercent` / `yPercent` (0-100)
2309
2458
  * to express where the port CENTER should be relative to the device face.
2459
+ * Raw imports may also use semantic edge strings like `top-left` or
2460
+ * `right-middle`; those are normalized into side/offset placements during
2461
+ * import. `xPercent` / `yPercent` remain the manual override path for
2462
+ * detailed templates.
2310
2463
  * The renderer (`DeviceNode`) converts these to pixel coordinates and clamps
2311
2464
  * them so the port stays fully inside the device bounds. Clamp bounds are
2312
2465
  * computed from the **actual** rendered port dimensions (which vary by port
@@ -2328,7 +2481,7 @@ interface RawTemplatePort {
2328
2481
  type?: string;
2329
2482
  connectorType?: string;
2330
2483
  connector_type?: string;
2331
- position?: {
2484
+ position?: string | {
2332
2485
  side?: string;
2333
2486
  offsetPercent?: number;
2334
2487
  offset_percent?: number;
@@ -2447,4 +2600,4 @@ declare function useNetworkDiagram(store: NetworkDiagramStore): NetworkDiagramSt
2447
2600
  declare function useNodes(store: NetworkDiagramStore): NetworkNode[];
2448
2601
  declare function useEdges(store: NetworkDiagramStore): NetworkEdge[];
2449
2602
 
2450
- export { COUPLERS_PER_PANEL, COUPLER_SLOT_HEIGHT_PX, COUPLER_WIDTH_PX, CableNode, ClosureNode, CouplerNode, type DeviceImageFit, type DeviceImageOptions, type DeviceImageRepeat, DeviceNode, DevicePlacementError, type DevicePlacementValidation, type DevicePort, type DeviceTemplateV2, DiagramErrorBoundary, type DiagramErrorBoundaryProps, FIBER_COLORS_12, type FiberCable, type FiberColorId, FiberEdge, FiberNode, FibreCableWithTubesExpanded, type FibreFlowCable, type FibreFlowCableKind, type FibreFlowCableNodeData, type FibreFlowCircuit, type FibreFlowClosure, type FibreFlowClosureNodeData, type FibreFlowEndpoint, FibreFlowMap, type FibreFlowMapProps, type FibreFlowSplice, FibreSplitNode, HANDLE_EXTENSION_PX, type MountClass, MultiTubeCableNode, NetworkDiagram, type NetworkDiagramFitViewOptions, type NetworkDiagramFlowMethods, type NetworkDiagramFlowObject, type NetworkDiagramOptions, type NetworkDiagramProps, type NetworkDiagramStoreApi, type NetworkDiagramToImageOptions, type NetworkEdge, type NetworkEdgeData, type NetworkNode, type NetworkNodeData, type NetworkNodeDataBase, type NetworkNodeDataByType, PANEL_BORDER_WIDTH, PANEL_HEADER_HEIGHT, PANEL_HEIGHT_PX, PANEL_PADDING, PANEL_TUBE_TRAY_SPACING, PANEL_WIDTH_PX, POWER_CONNECTORS, PatchPanelNode, type Port, type PortBlock, type PortCableType, type PortType, PowerEdge, RACK_HEADER_HEIGHT, RACK_WIDTH_PX, type RackConfig, type RackDevice, type RackLayoutMode, type RackMountMode, RackNode, type RackSchemaOptions, type RawNetboxTemplate, type RawTemplatePort, type RawTemplatePortBlock, type ReplaceEdgeOptions, type SpliceConfig, SpliceNode, SplicePlacementError, type SplicePlacementValidation, type SpliceSchemaOptions, type SpliceTrayConfig, SpliceTrayNode, TEMPLATE_SCHEMA_VERSION, type TemplateFaceData, type TemplateFrontRearPortLink, type TemplateParseResult, type TemplatePort, type TemplatePortBlock, type TemplateSource, type TemplateValidationIssue, type TemplateValidationReport, type TemplateWidth, TubeNode, U_HEIGHT_PX, type ValidateConnectionParams, type ValidationResult, VerticalPDU, Width, addDeviceToRack, addSpliceToTray, baseColorFor, buildNodesFromRackConfig, buildNodesFromSpliceConfig, buildPortBlocksFromPorts, calculateClosureDimensions, calculateCouplerRightX, calculateCouplerSlotSpacing, calculateCouplerSpacing, calculateDevicePositionFromU, calculatePanelDimensions, calculateSlotPositionFromY, calculateSplicePositionFromNumber, calculateUPositions, calculateYFromSlotPosition, countTemplateFacePorts, createNetworkDiagramStore, createRackConfigFromNodes, createSpliceConfigFromNodes, fiberSolidOrStriped, findNearestRack, findNextAvailableHolderPosition, findNextAvailableUPosition, generateLayout, getConnectorConfig, getCouplerDimensions, getDefaultDeviceView, getDeviceConnectorType, getFiberColor, getFrontPortBlocks, getInnerContentWidth, getPDUPortType, getPanelHeight, getPanelWidth, getPowerPortStyle, getRackBounds, getRearPortBlocks, getResolvedPortBlocks, getStatusColor, getTrayDimensions, getTubeDimensions, hasFrontPorts, hasRearPorts, inventoryCableToNetworkEdge, inventoryDeviceToNetworkNode, inventoryRackToNetworkNode, inventoryToNetworkDiagram, isHighPowerConnector, isPointInRack, isStriped, isUPositionAvailable, netboxCableToNetworkEdge, netboxDeviceToNetworkNode, netboxRackToNetworkNode, netboxToNetworkDiagram, parseNetboxTemplate, removeDeviceFromRack, removeSpliceFromTray, replaceEdge, snapToCouplerPosition, snapToSplicePosition, snapToUPosition, updateDeviceUPosition$1 as updateDeviceUPosition, updateDeviceUPosition as updateDeviceUPositionInSchema, updateSpliceHolderPosition, useEdges as useDiagramEdges, useNodes as useDiagramNodes, useNetworkDiagram, validateAndSnapDevice, validateRackDevicePlacements, validateRenderFidelity, validateSplicePlacements };
2603
+ export { COUPLERS_PER_PANEL, COUPLER_SLOT_HEIGHT_PX, COUPLER_WIDTH_PX, CableNode, ClosureNode, CouplerNode, type DeviceImageFit, type DeviceImageOptions, type DeviceImageRepeat, DeviceNode, DevicePlacementError, type DevicePlacementValidation, type DevicePort, type DeviceStatus, type DeviceTemplateV2, type DeviceView, type DiagramDocument, type DiagramEdge, type DiagramEdgeEndpoint, type DiagramEndpoint, DiagramErrorBoundary, type DiagramErrorBoundaryProps, type DiagramExternalRef, type DiagramNode, type DiagramNodeKind, type DiagramNodePlacement, type DiagramNodeRender, type DiagramUiState, FIBER_COLORS_12, type FiberCable, type FiberCableType, type FiberColorId, FiberEdge, FiberNode, FibreCableWithTubesExpanded, type FibreFlowCable, type FibreFlowCableKind, type FibreFlowCableNodeData, type FibreFlowCircuit, type FibreFlowClosure, type FibreFlowClosureNodeData, type FibreFlowEndpoint, FibreFlowMap, type FibreFlowMapProps, type FibreFlowSplice, FibreSplitNode, HANDLE_EXTENSION_PX, type MountClass, MultiTubeCableNode, NetworkDiagram, type NetworkDiagramFitViewOptions, type NetworkDiagramFlowMethods, type NetworkDiagramFlowObject, type NetworkDiagramOptions, type NetworkDiagramProps, type NetworkDiagramStoreApi, type NetworkDiagramToImageOptions, type NetworkEdge, type NetworkEdgeData, type NetworkGraphSnapshot, type NetworkNode, type NetworkNodeData, type NetworkNodeDataBase, type NetworkNodeDataByType, PANEL_BORDER_WIDTH, PANEL_HEADER_HEIGHT, PANEL_HEIGHT_PX, PANEL_PADDING, PANEL_TUBE_TRAY_SPACING, PANEL_WIDTH_PX, POWER_CONNECTORS, PatchPanelNode, type Port, type PortBlock, type PortCableType, type PortPosition, type PortType, PowerEdge, type PowerSide, RACK_HEADER_HEIGHT, RACK_WIDTH_PX, type RackConfig, type RackDevice, type RackDeviceType, type RackLayoutMode, type RackMountMode, RackNode, type RackSchemaOptions, type RawNetboxTemplate, type RawTemplatePort, type RawTemplatePortBlock, type ReplaceEdgeOptions, type SpliceConfig, SpliceNode, SplicePlacementError, type SplicePlacementValidation, type SpliceSchemaOptions, type SpliceTrayConfig, SpliceTrayNode, TEMPLATE_SCHEMA_VERSION, type TemplateFaceData, type TemplateFrontRearPortLink, type TemplateParseResult, type TemplatePort, type TemplatePortBlock, type TemplateSource, type TemplateValidationIssue, type TemplateValidationReport, type TemplateWidth, TubeNode, type UNumberingDirection, U_HEIGHT_PX, type ValidateConnectionParams, type ValidationResult, VerticalPDU, Width, addDeviceToRack, addSpliceToTray, baseColorFor, buildNodesFromRackConfig, buildNodesFromSpliceConfig, buildPortBlocksFromPorts, calculateClosureDimensions, calculateCouplerRightX, calculateCouplerSlotSpacing, calculateCouplerSpacing, calculateDevicePositionFromU, calculatePanelDimensions, calculateSlotPositionFromY, calculateSplicePositionFromNumber, calculateUPositions, calculateYFromSlotPosition, countTemplateFacePorts, createNetworkDiagramStore, createRackConfigFromNodes, createSpliceConfigFromNodes, diagramDocumentToNetworkGraph, fiberSolidOrStriped, findNearestRack, findNextAvailableHolderPosition, findNextAvailableUPosition, generateLayout, getConnectorConfig, getCouplerDimensions, getDefaultDeviceView, getDeviceConnectorType, getEndpointMetadata, getFiberColor, getFrontPortBlocks, getInnerContentWidth, getPDUPortType, getPanelHeight, getPanelWidth, getPowerPortStyle, getRackBounds, getRearPortBlocks, getResolvedPortBlocks, getStatusColor, getTrayDimensions, getTubeDimensions, hasFrontPorts, hasRearPorts, inventoryCableToNetworkEdge, inventoryDeviceToNetworkNode, inventoryRackToNetworkNode, inventoryToNetworkDiagram, isHighPowerConnector, isPointInRack, isStriped, isUPositionAvailable, netboxCableToNetworkEdge, netboxDeviceToNetworkNode, netboxRackToNetworkNode, netboxToNetworkDiagram, networkGraphToDiagramDocument, parseNetboxTemplate, removeDeviceFromRack, removeSpliceFromTray, replaceEdge, resolveEndpointCompatibilityKeys, snapToCouplerPosition, snapToSplicePosition, snapToUPosition, updateDeviceUPosition$1 as updateDeviceUPosition, updateDeviceUPosition as updateDeviceUPositionInSchema, updateSpliceHolderPosition, useEdges as useDiagramEdges, useNodes as useDiagramNodes, useNetworkDiagram, validateAndSnapDevice, validateRackDevicePlacements, validateRenderFidelity, validateSplicePlacements };