@xyo-network/react-node-renderer 2.77.0 → 2.77.1

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 (31) hide show
  1. package/dist/browser/components/relational/graph/Graph.d.cts +0 -1
  2. package/dist/browser/components/relational/graph/Graph.d.cts.map +1 -1
  3. package/dist/browser/components/relational/graph/Graph.d.mts +0 -1
  4. package/dist/browser/components/relational/graph/Graph.d.mts.map +1 -1
  5. package/dist/browser/components/relational/graph/Graph.d.ts +0 -1
  6. package/dist/browser/components/relational/graph/Graph.d.ts.map +1 -1
  7. package/dist/browser/index.cjs +1 -840
  8. package/dist/browser/index.cjs.map +1 -1
  9. package/dist/browser/index.js +1 -815
  10. package/dist/browser/index.js.map +1 -1
  11. package/dist/neutral/components/relational/graph/Graph.d.cts +0 -1
  12. package/dist/neutral/components/relational/graph/Graph.d.cts.map +1 -1
  13. package/dist/neutral/components/relational/graph/Graph.d.mts +0 -1
  14. package/dist/neutral/components/relational/graph/Graph.d.mts.map +1 -1
  15. package/dist/neutral/components/relational/graph/Graph.d.ts +0 -1
  16. package/dist/neutral/components/relational/graph/Graph.d.ts.map +1 -1
  17. package/dist/neutral/index.cjs +1 -840
  18. package/dist/neutral/index.cjs.map +1 -1
  19. package/dist/neutral/index.js +1 -815
  20. package/dist/neutral/index.js.map +1 -1
  21. package/dist/node/components/relational/graph/Graph.d.cts +0 -1
  22. package/dist/node/components/relational/graph/Graph.d.cts.map +1 -1
  23. package/dist/node/components/relational/graph/Graph.d.mts +0 -1
  24. package/dist/node/components/relational/graph/Graph.d.mts.map +1 -1
  25. package/dist/node/components/relational/graph/Graph.d.ts +0 -1
  26. package/dist/node/components/relational/graph/Graph.d.ts.map +1 -1
  27. package/dist/node/index.cjs +1 -880
  28. package/dist/node/index.cjs.map +1 -1
  29. package/dist/node/index.js +1 -827
  30. package/dist/node/index.js.map +1 -1
  31. package/package.json +10 -9
@@ -1,841 +1,2 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- ColaLayout: () => ColaLayout,
34
- ConcentricLayout: () => ConcentricLayout,
35
- CyIconSet: () => CyIconSet,
36
- CytoscapeElements: () => CytoscapeElements,
37
- CytoscapeInstanceContext: () => CytoscapeInstanceContext,
38
- CytoscapeInstanceProvider: () => CytoscapeInstanceProvider,
39
- EdgeStyled: () => EdgeStyled,
40
- ModuleCardParser: () => ModuleCardParser,
41
- ModuleGraphFlexBox: () => ModuleGraphFlexBox,
42
- ModuleGraphFlexBoxWithProvider: () => ModuleGraphFlexBoxWithProvider,
43
- Node: () => Node,
44
- NodeAsRoot: () => NodeAsRoot,
45
- NodeRelationalGraph: () => NodeRelationalGraph,
46
- NodeRelationalGraphFlexBox: () => NodeRelationalGraphFlexBox,
47
- NodeWithName: () => NodeWithName,
48
- ProvidedNodeRenderer: () => ProvidedNodeRenderer,
49
- encodeSvg: () => encodeSvg,
50
- generateIconMap: () => generateIconMap,
51
- parseModuleType: () => parseModuleType,
52
- useCytoscapeElements: () => useCytoscapeElements,
53
- useCytoscapeInstance: () => useCytoscapeInstance,
54
- useCytoscapeOptions: () => useCytoscapeOptions,
55
- useElements: () => useElements,
56
- useModuleDetails: () => useModuleDetails,
57
- useRelationalGraphOptions: () => useRelationalGraphOptions
58
- });
59
- module.exports = __toCommonJS(src_exports);
60
-
61
- // src/components/module/CardParser.tsx
62
- var import_archivist_model = require("@xyo-network/archivist-model");
63
- var import_diviner_model = require("@xyo-network/diviner-model");
64
- var import_react_archivist = require("@xyo-network/react-archivist");
65
- var import_react_module = require("@xyo-network/react-module");
66
- var import_jsx_runtime = require("react/jsx-runtime");
67
- var ModuleCardParser = ({ mod }) => {
68
- switch (true) {
69
- case (0, import_archivist_model.isArchivistInstance)(mod): {
70
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_archivist.ArchivistCard, { mod: (0, import_archivist_model.asArchivistInstance)(mod) });
71
- }
72
- case (0, import_diviner_model.isDivinerInstance)(mod): {
73
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_module.DivinerCard, { mod: (0, import_diviner_model.asDivinerInstance)(mod) });
74
- }
75
- default: {
76
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_module.ModuleCard, { mod });
77
- }
78
- }
79
- };
80
-
81
- // src/components/module/graph/GraphFlexBox.tsx
82
- var import_material7 = require("@mui/material");
83
- var import_react15 = require("react");
84
-
85
- // src/contexts/CytoscapeInstance/Context.ts
86
- var import_react_shared = require("@xyo-network/react-shared");
87
- var CytoscapeInstanceContext = (0, import_react_shared.createContextEx)();
88
-
89
- // src/contexts/CytoscapeInstance/Provider.tsx
90
- var import_react = require("react");
91
- var import_jsx_runtime2 = require("react/jsx-runtime");
92
- var CytoscapeInstanceProvider = ({ children, defaultInstance }) => {
93
- const [cy, setCy] = (0, import_react.useState)(defaultInstance);
94
- (0, import_react.useEffect)(() => {
95
- setCy(defaultInstance);
96
- }, [defaultInstance]);
97
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(CytoscapeInstanceContext.Provider, { value: { cy, provided: true, setCy }, children });
98
- };
99
-
100
- // src/contexts/CytoscapeInstance/use.ts
101
- var import_react_shared2 = require("@xyo-network/react-shared");
102
- var useCytoscapeInstance = (required = false) => (0, import_react_shared2.useContextEx)(CytoscapeInstanceContext, "CytoscapeInstance", required);
103
-
104
- // src/hooks/cytoscape/elements/useCytoscapeElements.ts
105
- var import_react_async_effect = require("@xylabs/react-async-effect");
106
- var import_node_model2 = require("@xyo-network/node-model");
107
- var import_react2 = require("react");
108
-
109
- // src/Cytoscape/CytoscapeElements.ts
110
- var import_exists = require("@xylabs/exists");
111
-
112
- // src/Cytoscape/lib/encodeSvg.ts
113
- var import_server = require("react-dom/server");
114
- var dataUri = "data:image/svg+xml,";
115
- var encodeSvg = (reactElement, color) => {
116
- const svgString = (0, import_server.renderToStaticMarkup)(reactElement);
117
- const doc = new DOMParser().parseFromString(svgString, "text/html");
118
- const svgElement = doc.querySelectorAll("svg")[0];
119
- if (svgElement) {
120
- svgElement.setAttribute("xmlns", "http://www.w3.org/2000/svg");
121
- svgElement.setAttribute("height", "100");
122
- svgElement.style.fill = color ?? "black";
123
- }
124
- return `${dataUri}${window.encodeURIComponent(svgElement.outerHTML)}`;
125
- };
126
-
127
- // src/Cytoscape/lib/iconMap.ts
128
- var generateIconMap = () => ({
129
- archivist: "",
130
- bridge: "",
131
- diviner: "",
132
- // eslint-disable-next-line id-denylist
133
- module: "",
134
- node: "",
135
- sentinel: "",
136
- witness: ""
137
- });
138
-
139
- // src/Cytoscape/lib/layout/ColaLayout.ts
140
- var ColaLayout = {
141
- centerGraph: false,
142
- convergenceThreshold: 0.01,
143
- name: "cola"
144
- };
145
-
146
- // src/Cytoscape/lib/layout/ConcentricLayout.ts
147
- var ConcentricLayout = {
148
- concentric: function(node) {
149
- return node.degree(false);
150
- },
151
- levelWidth: function() {
152
- return 2;
153
- },
154
- minNodeSpacing: 75,
155
- name: "concentric"
156
- };
157
-
158
- // src/Cytoscape/lib/parseModuleType.ts
159
- var import_archivist_model2 = require("@xyo-network/archivist-model");
160
- var import_bridge_model = require("@xyo-network/bridge-model");
161
- var import_diviner_model2 = require("@xyo-network/diviner-model");
162
- var import_node_model = require("@xyo-network/node-model");
163
- var import_sentinel_model = require("@xyo-network/sentinel-model");
164
- var import_witness_model = require("@xyo-network/witness-model");
165
- var parseModuleType = (mod) => {
166
- let type = "module";
167
- if (mod) {
168
- if ((0, import_archivist_model2.isArchivistInstance)(mod)) {
169
- type = "archivist";
170
- } else if ((0, import_bridge_model.isBridgeInstance)(mod)) {
171
- type = "bridge";
172
- } else if ((0, import_diviner_model2.isDivinerInstance)(mod)) {
173
- type = "diviner";
174
- } else if ((0, import_node_model.isNodeInstance)(mod)) {
175
- type = "node";
176
- } else if ((0, import_sentinel_model.isSentinelInstance)(mod)) {
177
- type = "sentinel";
178
- } else if ((0, import_witness_model.isWitnessModule)(mod)) {
179
- type = "witness";
180
- } else {
181
- type = "module";
182
- }
183
- }
184
- return type;
185
- };
186
-
187
- // src/Cytoscape/CytoscapeElements.ts
188
- var CytoscapeElements = {
189
- MaxNameLength: 20,
190
- buildEdge(rootNode, newNode, properties) {
191
- return {
192
- data: {
193
- id: `${rootNode.data.id}/${newNode.data.id}`,
194
- source: rootNode.data.id,
195
- target: newNode.data.id,
196
- ...properties
197
- }
198
- };
199
- },
200
- async buildElements(mod) {
201
- const info = await CytoscapeElements.recurseNodes(mod);
202
- const newElements = await this.buildElementsFromInfo(info, void 0, ["activeNode"]);
203
- return newElements;
204
- },
205
- async buildElementsFromInfo(info, root, classes = []) {
206
- const newNode = CytoscapeElements.buildNode(info.mod, { childCount: info.children.length, depth: info.depth }, classes);
207
- const newEdge = root ? CytoscapeElements.buildEdge(root, newNode, { depth: info.depth, siblingCount: info.children.length }) : void 0;
208
- const newElements = [newNode];
209
- if (newEdge) {
210
- newElements.push(newEdge);
211
- }
212
- for (const childInfo of info.children) {
213
- newElements.push(...await this.buildElementsFromInfo(childInfo, newNode));
214
- }
215
- return newElements;
216
- },
217
- buildNode(mod, properties, classes) {
218
- const { address, id } = mod;
219
- return {
220
- classes,
221
- data: {
222
- address,
223
- id: address,
224
- name: id,
225
- type: parseModuleType(mod),
226
- ...properties
227
- }
228
- };
229
- },
230
- buildRootNode: (mod) => {
231
- return CytoscapeElements.buildNode(mod, {}, ["activeNode"]);
232
- },
233
- normalizeName(name) {
234
- if (!name)
235
- return;
236
- if (name.length > this.MaxNameLength)
237
- return `${name.slice(0, 20)}...`;
238
- return name;
239
- },
240
- async recurseNodes(root, maxDepth = 10, depth = 1) {
241
- const info = { children: [], depth, mod: root };
242
- if (maxDepth > 0) {
243
- const children = await root.resolve("*", { direction: "down", maxDepth: 1 });
244
- info.children = (await Promise.all(
245
- children.map(async (child) => {
246
- if (child.address !== root.address) {
247
- return await this.recurseNodes(child, maxDepth - 1, depth + 1);
248
- }
249
- })
250
- )).filter(import_exists.exists);
251
- }
252
- return info;
253
- }
254
- };
255
-
256
- // src/Cytoscape/CytoscapeIcons.tsx
257
- var import_icons_material = require("@mui/icons-material");
258
- var CyIconSet = {
259
- archivist: import_icons_material.Inventory2Rounded,
260
- bridge: import_icons_material.InsertLinkRounded,
261
- diviner: import_icons_material.BubbleChartRounded,
262
- // eslint-disable-next-line id-denylist
263
- module: import_icons_material.QuestionMarkRounded,
264
- node: import_icons_material.Hub,
265
- sentinel: import_icons_material.TimerRounded,
266
- witness: import_icons_material.VisibilityRounded
267
- };
268
-
269
- // src/Cytoscape/CytoscapeStyles.ts
270
- var NodeWithName = (color, outlineColor) => ({
271
- selector: "node[name]",
272
- style: {
273
- color,
274
- "font-family": "Lexend Deca, Helvetica, sans-serif",
275
- "font-size": 12,
276
- "overlay-padding": "6px",
277
- "text-halign": "center",
278
- "text-outline-color": outlineColor,
279
- "text-outline-width": "1px",
280
- "text-valign": "top"
281
- }
282
- });
283
- var Node = (icons, bgColor, hideLabels = false) => ({
284
- selector: "node",
285
- style: {
286
- "background-color": bgColor,
287
- "background-height": "75%",
288
- "background-image": (elem) => icons[elem.data("type")],
289
- "background-width": "24",
290
- label: hideLabels ? void 0 : "data(name)",
291
- shape: "round-rectangle"
292
- }
293
- });
294
- var NodeAsRoot = (bgColor) => ({
295
- selector: ".activeNode",
296
- style: {
297
- "background-color": bgColor
298
- }
299
- });
300
- var EdgeStyled = (lineColor, targetArrowColor) => ({
301
- selector: "edge",
302
- style: {
303
- "curve-style": "bezier",
304
- "line-color": lineColor,
305
- "line-opacity": 0.1,
306
- "target-arrow-color": targetArrowColor,
307
- "target-arrow-shape": "triangle",
308
- width: 3
309
- }
310
- });
311
-
312
- // src/hooks/cytoscape/elements/useCytoscapeElements.ts
313
- var useCytoscapeElements = (mod) => {
314
- const [elements, setElements] = (0, import_react2.useState)([]);
315
- (0, import_react_async_effect.useAsyncEffect)(
316
- // eslint-disable-next-line react-hooks/exhaustive-deps
317
- async () => {
318
- const moduleInstance = mod?.deref();
319
- if (moduleInstance) {
320
- const newElements = await CytoscapeElements.buildElements(moduleInstance) ?? [];
321
- setElements(newElements);
322
- }
323
- },
324
- [mod]
325
- );
326
- (0, import_react2.useEffect)(() => {
327
- let attachedListener;
328
- let detachedListener;
329
- if (mod && (0, import_node_model2.isNodeInstance)(mod)) {
330
- attachedListener = mod.on("moduleAttached", async () => {
331
- const newElements = await CytoscapeElements.buildElements(mod) ?? [];
332
- setElements(newElements);
333
- });
334
- detachedListener = mod.on("moduleDetached", async () => {
335
- const newElements = await CytoscapeElements.buildElements(mod) ?? [];
336
- setElements(newElements);
337
- });
338
- }
339
- return () => {
340
- attachedListener?.();
341
- detachedListener?.();
342
- };
343
- }, [mod]);
344
- return elements;
345
- };
346
-
347
- // src/hooks/cytoscape/elements/useHoveredNode.tsx
348
- var import_react3 = require("react");
349
- var useHoveredNode = (renderedElements) => {
350
- const { cy } = useCytoscapeInstance(true);
351
- const [hoveredNode, setHoveredNode] = (0, import_react3.useState)();
352
- const nodeListener = (0, import_react3.useCallback)((node) => {
353
- node.on("mouseover tap", () => {
354
- setHoveredNode(node);
355
- });
356
- }, []);
357
- (0, import_react3.useEffect)(() => {
358
- if (renderedElements) {
359
- renderedElements.nodes().forEach(nodeListener);
360
- }
361
- }, [nodeListener, renderedElements]);
362
- (0, import_react3.useEffect)(() => {
363
- cy?.deref()?.ready(() => {
364
- cy?.deref()?.nodes().forEach(nodeListener);
365
- });
366
- }, [cy, nodeListener]);
367
- return [hoveredNode, setHoveredNode];
368
- };
369
-
370
- // src/hooks/cytoscape/elements/useNewElements.tsx
371
- var import_react_node = require("@xyo-network/react-node");
372
- var import_react4 = require("react");
373
- var useNewElements = (selectedElement) => {
374
- const selectedAddress = (0, import_react4.useMemo)(() => {
375
- const { address: selectedAddress2 } = selectedElement?.data() ?? {};
376
- return selectedAddress2;
377
- }, [selectedElement]);
378
- const [mod] = (0, import_react_node.useWeakModuleFromNode)(selectedAddress);
379
- const newElements = useCytoscapeElements(mod);
380
- return newElements;
381
- };
382
-
383
- // src/hooks/cytoscape/elements/useRenderNewElements.tsx
384
- var import_react5 = require("react");
385
- var useRenderNewElements = (newElements = [], hideLabels) => {
386
- const { cy } = useCytoscapeInstance(true);
387
- const [renderedElements, setRenderedElements] = (0, import_react5.useState)();
388
- (0, import_react5.useEffect)(() => {
389
- if (newElements.length > 1) {
390
- const renderedElements2 = cy?.deref()?.add(newElements);
391
- setRenderedElements(renderedElements2);
392
- cy?.deref()?.layout(ColaLayout).run();
393
- }
394
- }, [cy, hideLabels, newElements]);
395
- return renderedElements;
396
- };
397
-
398
- // src/hooks/cytoscape/elements/useSelectedElement.tsx
399
- var import_react6 = require("react");
400
- var useSelectedElement = () => {
401
- const [selectedElement, setSelectedElement] = (0, import_react6.useState)();
402
- const { cy } = useCytoscapeInstance(true);
403
- const updateStyles = (element) => {
404
- const nodes = cy?.deref()?.nodes();
405
- nodes?.toggleClass("activeNode", false);
406
- element.toggleClass("activeNode", true);
407
- };
408
- const toggleSelectedElement = (address) => {
409
- const selectedNode = cy?.deref()?.nodes(`[id="${address}"]`)?.[0];
410
- if (selectedNode) {
411
- setSelectedElement(selectedNode);
412
- updateStyles(selectedNode);
413
- }
414
- };
415
- return { selectedElement, toggleSelectedElement };
416
- };
417
-
418
- // src/hooks/cytoscape/elements/useElements.tsx
419
- var useElements = (hideLabels) => {
420
- const { selectedElement, toggleSelectedElement } = useSelectedElement();
421
- const newElements = useNewElements(selectedElement);
422
- const renderedElements = useRenderNewElements(newElements, hideLabels);
423
- const [hoveredNode, setHoveredNode] = useHoveredNode(renderedElements);
424
- return { hoveredNode, setHoveredNode, toggleSelectedElement };
425
- };
426
-
427
- // src/hooks/cytoscape/useCytoscapeOptions.ts
428
- var import_react9 = require("react");
429
-
430
- // src/hooks/cytoscape/useCytoscapeStyle.tsx
431
- var import_material2 = require("@mui/material");
432
- var import_react8 = require("react");
433
-
434
- // src/hooks/cytoscape/useIcons.tsx
435
- var import_material = require("@mui/material");
436
- var import_react7 = require("react");
437
- var import_jsx_runtime3 = require("react/jsx-runtime");
438
- var useIcons = () => {
439
- const theme = (0, import_material.useTheme)();
440
- const icons = (0, import_react7.useMemo)(() => {
441
- const iconMap = generateIconMap();
442
- return Object.entries(CyIconSet).reduce((acc, [name, IconComponent]) => {
443
- const icon = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(IconComponent, { fontSize: "small" });
444
- acc[name] = encodeSvg(icon, theme.palette.getContrastText(theme.palette.text.primary));
445
- return acc;
446
- }, iconMap);
447
- }, [theme.palette]);
448
- return icons;
449
- };
450
-
451
- // src/hooks/cytoscape/useCytoscapeStyle.tsx
452
- var useCytoscapeStyle = (hideLabels = false) => {
453
- const theme = (0, import_material2.useTheme)();
454
- const icons = useIcons();
455
- const style = (0, import_react8.useMemo)(
456
- () => [
457
- Node(icons, theme.palette.primary.main, hideLabels),
458
- NodeWithName(theme.palette.text.primary, theme.palette.getContrastText(theme.palette.text.primary)),
459
- NodeAsRoot(theme.palette.secondary.main),
460
- EdgeStyled(theme.palette.divider, theme.palette.divider)
461
- ],
462
- [icons, hideLabels, theme]
463
- );
464
- return style;
465
- };
466
-
467
- // src/hooks/cytoscape/useCytoscapeOptions.ts
468
- var useCytoscapeOptions = (elements, style, layout) => {
469
- const defaultStyle = useCytoscapeStyle();
470
- const resolvedLayout = layout ?? ConcentricLayout;
471
- const resolvedStyle = style ?? defaultStyle;
472
- const options = (0, import_react9.useMemo)(() => {
473
- if (elements && resolvedLayout && resolvedStyle) {
474
- return {
475
- elements,
476
- layout: resolvedLayout,
477
- style: resolvedStyle
478
- };
479
- }
480
- }, [elements, layout, style]);
481
- return options;
482
- };
483
-
484
- // src/hooks/cytoscape/useModuleDetails.tsx
485
- var import_react_promise = require("@xylabs/react-promise");
486
- var import_react10 = require("react");
487
- var useModuleDetails = (rootModule, onFoundModule) => {
488
- const { cy } = useCytoscapeInstance();
489
- const [moduleAddress, setModuleAddress] = (0, import_react10.useState)();
490
- const [foundModule] = (0, import_react_promise.usePromise)(async () => {
491
- if (moduleAddress === null)
492
- return null;
493
- const rootModuleInstance = rootModule?.deref();
494
- if (moduleAddress && rootModuleInstance) {
495
- const foundModule2 = await rootModuleInstance.resolve(moduleAddress);
496
- return foundModule2 ?? null;
497
- }
498
- }, [moduleAddress, rootModule]);
499
- (0, import_react10.useEffect)(() => {
500
- const resizeObserver = new ResizeObserver(() => {
501
- if (moduleAddress === null) {
502
- setTimeout(() => {
503
- cy?.deref()?.center();
504
- }, 100);
505
- } else if (foundModule && cy) {
506
- const node = cy?.deref()?.nodes(`[id="${moduleAddress}"]`)?.[0];
507
- setTimeout(() => {
508
- cy?.deref()?.center(node);
509
- }, 100);
510
- }
511
- });
512
- const container = cy?.deref()?.container();
513
- if (container) {
514
- resizeObserver.observe(container);
515
- }
516
- return () => {
517
- if (container)
518
- resizeObserver.unobserve(container);
519
- };
520
- }, [cy, moduleAddress, foundModule, rootModule]);
521
- (0, import_react10.useEffect)(() => {
522
- if (foundModule) {
523
- onFoundModule?.();
524
- }
525
- }, [cy, moduleAddress, foundModule, onFoundModule]);
526
- const onModuleDetails = (address) => {
527
- const moduleNode = cy?.deref()?.nodes(`[id="${address}"]`);
528
- const rootModuleNode = cy?.deref()?.nodes(`[id="${rootModule?.deref()?.address}"]`);
529
- const foundModuleNode = cy?.deref()?.nodes(`[id="${foundModule?.address}"]`);
530
- const notModuleNode = cy?.deref()?.nodes(`[id != "${address}"]`);
531
- if (address) {
532
- moduleNode?.toggleClass("activeNode", true);
533
- notModuleNode?.toggleClass("activeNode", false);
534
- } else {
535
- notModuleNode?.toggleClass("activeNode", false);
536
- const activeNode = foundModuleNode?.length ? foundModuleNode : rootModuleNode;
537
- activeNode?.toggleClass("activeNode", true);
538
- }
539
- setModuleAddress(address);
540
- };
541
- return { mod: foundModule, onModuleDetails };
542
- };
543
-
544
- // src/hooks/cytoscape/useRelationalGraphOptions.tsx
545
- var import_react11 = require("react");
546
- var useRelationalGraphOptions = (mod) => {
547
- const [hideLabels, setHideLabels] = (0, import_react11.useState)(true);
548
- const handleToggleLabels = () => {
549
- setHideLabels((oldValue) => !oldValue);
550
- };
551
- const elements = useCytoscapeElements(mod);
552
- const style = useCytoscapeStyle(hideLabels);
553
- const options = useCytoscapeOptions(elements, style, ConcentricLayout);
554
- return { handleToggleLabels, hideLabels, options };
555
- };
556
-
557
- // src/components/cytoscape-extensions/WithExtensions.tsx
558
- var import_cytoscape = __toESM(require("cytoscape"), 1);
559
- var import_cytoscape_cola = __toESM(require("cytoscape-cola"), 1);
560
- var import_cytoscape_cose_bilkent = __toESM(require("cytoscape-cose-bilkent"), 1);
561
- var import_cytoscape_dagre = __toESM(require("cytoscape-dagre"), 1);
562
- var import_cytoscape_euler = __toESM(require("cytoscape-euler"), 1);
563
- var import_react12 = require("react");
564
- var import_jsx_runtime4 = require("react/jsx-runtime");
565
- var WithExtensions = ({ children }) => {
566
- const [initialized, setInitialized] = (0, import_react12.useState)(false);
567
- (0, import_react12.useEffect)(() => {
568
- import_cytoscape.default.use(import_cytoscape_cola.default);
569
- import_cytoscape.default.use(import_cytoscape_dagre.default);
570
- import_cytoscape.default.use(import_cytoscape_cose_bilkent.default);
571
- import_cytoscape.default.use(import_cytoscape_euler.default);
572
- setInitialized(true);
573
- }, []);
574
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, { children: initialized ? children : void 0 });
575
- };
576
-
577
- // src/components/relational/graph/Graph.tsx
578
- var import_material3 = require("@mui/material");
579
- var import_hex = require("@xylabs/hex");
580
- var import_react_flexbox = require("@xylabs/react-flexbox");
581
- var import_react_identicon = require("@xylabs/react-identicon");
582
- var import_react_node2 = require("@xyo-network/react-node");
583
- var import_cytoscape2 = __toESM(require("cytoscape"), 1);
584
- var import_cytoscape_cola2 = __toESM(require("cytoscape-cola"), 1);
585
- var import_cytoscape_cose_bilkent2 = __toESM(require("cytoscape-cose-bilkent"), 1);
586
- var import_cytoscape_dagre2 = __toESM(require("cytoscape-dagre"), 1);
587
- var import_cytoscape_euler2 = __toESM(require("cytoscape-euler"), 1);
588
- var import_react13 = require("react");
589
- var import_jsx_runtime5 = require("react/jsx-runtime");
590
- var applyLayout = (cy, name = "cola", options) => {
591
- cy?.layout({ name, ...options }).run();
592
- };
593
- var loadLayout = (layout = "cola") => {
594
- switch (layout) {
595
- case "dagre": {
596
- import_cytoscape2.default.use(import_cytoscape_dagre2.default);
597
- break;
598
- }
599
- case "euler": {
600
- import_cytoscape2.default.use(import_cytoscape_euler2.default);
601
- break;
602
- }
603
- case "cose-bilkent": {
604
- import_cytoscape2.default.use(import_cytoscape_cose_bilkent2.default);
605
- break;
606
- }
607
- case "cola": {
608
- import_cytoscape2.default.use(import_cytoscape_cola2.default);
609
- break;
610
- }
611
- }
612
- };
613
- var ModuleHoverDetails = ({ name, address, ...props }) => {
614
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_material3.Card, { elevation: 3, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
615
- import_material3.CardHeader,
616
- {
617
- avatar: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_material3.Paper, { elevation: 6, sx: { bgcolor: "#fff", p: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_identicon.Identicon, { value: address, size: 24 }) }),
618
- title: name,
619
- subheader: address
620
- }
621
- ) });
622
- };
623
- var NodeRelationalGraphFlexBox = (0, import_react13.forwardRef)(
624
- ({ actions, children, node, layout, layoutOptions, showDetails, detail, options, onHover, ...props }, ref) => {
625
- const theme = (0, import_material3.useTheme)();
626
- const [cy, setCy] = (0, import_react13.useState)();
627
- const cytoscapeRef = (0, import_react13.useRef)();
628
- const [hoverPosition, setHoverBoundingBox] = (0, import_react13.useState)();
629
- const [hoverAddress, setHoverAddress] = (0, import_react13.useState)();
630
- const [moduleInstance] = (0, import_react_node2.useWeakModuleFromNode)(hoverAddress, { node });
631
- (0, import_react13.useEffect)(() => {
632
- cy?.on("mouseover tap", ({ target }) => {
633
- const cyNode = target;
634
- const bb = cyNode?.renderedBoundingBox?.();
635
- setHoverBoundingBox(bb);
636
- const id = cyNode.id?.();
637
- if (id) {
638
- if (id.includes("/")) {
639
- setHoverAddress(void 0);
640
- onHover?.();
641
- } else {
642
- setHoverAddress((0, import_hex.asAddress)(id));
643
- onHover?.((0, import_hex.asAddress)(id));
644
- }
645
- }
646
- });
647
- }, [onHover, cy]);
648
- const handleReset = () => {
649
- cy?.reset();
650
- applyLayout(cy, layout ?? "euler", layoutOptions);
651
- };
652
- (0, import_react13.useEffect)(() => {
653
- let newCy;
654
- const container = cytoscapeRef.current;
655
- if (container) {
656
- newCy = (0, import_cytoscape2.default)({
657
- container,
658
- ...options
659
- });
660
- setCy(newCy);
661
- }
662
- return () => {
663
- newCy?.destroy();
664
- setCy(void 0);
665
- };
666
- }, [options, cytoscapeRef, layoutOptions]);
667
- (0, import_react13.useEffect)(() => {
668
- if (cy) {
669
- loadLayout(layout);
670
- applyLayout(cy, layout ?? "euler", layoutOptions);
671
- }
672
- }, [cy, layoutOptions, layout]);
673
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_flexbox.FlexCol, { id: "relational-graph-wrapper", ref, ...props, children: [
674
- hoverAddress && hoverPosition ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_material3.Box, { position: "absolute", top: hoverPosition.y1, left: hoverPosition.x1, zIndex: 100, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ModuleHoverDetails, { address: hoverAddress, name: moduleInstance?.deref()?.id ?? "Unknown" }) }) : null,
675
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_flexbox.FlexRow, { justifyContent: "start", width: "100%", children: actions === null ? null : actions ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_material3.ButtonGroup, { children: [
676
- actions,
677
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_material3.Button, { size: "small", variant: "contained", onClick: handleReset, children: "Reset View" })
678
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_material3.Button, { size: "small", variant: "contained", onClick: handleReset, children: "Reset" }) }),
679
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_flexbox.FlexGrowRow, { width: "100%", alignItems: "start", children: [
680
- showDetails ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_flexbox.FlexCol, { height: "100%", width: "85%", children: detail }) : null,
681
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
682
- import_react_flexbox.FlexCol,
683
- {
684
- justifyContent: "start",
685
- classes: "cytoscape-wrap",
686
- width: showDetails ? "15%" : "100%",
687
- height: showDetails ? "50%" : "100%",
688
- border: showDetails ? `1px solid ${theme.palette.divider}` : void 0,
689
- children: [
690
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_flexbox.FlexCol, { alignItems: "stretch", position: "absolute", width: "100%", height: "100%", ref: cytoscapeRef }),
691
- children
692
- ]
693
- }
694
- )
695
- ] })
696
- ] });
697
- }
698
- );
699
- NodeRelationalGraphFlexBox.displayName = "NodeRelationalGraph";
700
- var NodeRelationalGraph = NodeRelationalGraphFlexBox;
701
-
702
- // src/components/relational/graph/ProvidedNodeRenderer.tsx
703
- var import_react_node3 = require("@xyo-network/react-node");
704
- var import_jsx_runtime6 = require("react/jsx-runtime");
705
- var ProvidedNodeRenderer = ({ node, ...props }) => {
706
- const [providedNode] = (0, import_react_node3.useWeakProvidedNode)();
707
- const elements = useCytoscapeElements(node ?? providedNode);
708
- const options = useCytoscapeOptions(elements);
709
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(NodeRelationalGraphFlexBox, { alignItems: "stretch", flexGrow: 1, height: "100%", options, ...props });
710
- };
711
-
712
- // src/components/module/graph/DetailsFlexbox.tsx
713
- var import_icons_material2 = require("@mui/icons-material");
714
- var import_material4 = require("@mui/material");
715
- var import_react_flexbox2 = require("@xylabs/react-flexbox");
716
- var import_jsx_runtime7 = require("react/jsx-runtime");
717
- var DetailsFlexbox = ({ children, onClose }) => {
718
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_flexbox2.FlexGrowCol, { alignItems: "end", justifyContent: "start", id: "module-detail", width: "100%", p: 2, gap: 2, children: [
719
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_flexbox2.FlexRow, { justifyContent: "end", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_material4.IconButton, { onClick: onClose, size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_icons_material2.CancelRounded, {}) }) }),
720
- children
721
- ] });
722
- };
723
-
724
- // src/components/module/graph/node/Hover.tsx
725
- var import_material5 = require("@mui/material");
726
- var import_react_flexbox3 = require("@xylabs/react-flexbox");
727
-
728
- // src/components/module/graph/node/hooks/useNodeElement.tsx
729
- var import_react14 = require("react");
730
- var useNodeElement = (node) => {
731
- const ref = (0, import_react14.useRef)(null);
732
- const [currentElement, setCurrentElement] = (0, import_react14.useState)(null);
733
- const [boundingBox, setBoundingBox] = (0, import_react14.useState)(node?.renderedBoundingBox());
734
- (0, import_react14.useEffect)(() => {
735
- setCurrentElement(null);
736
- }, [node]);
737
- (0, import_react14.useEffect)(() => {
738
- if (node) {
739
- setBoundingBox(node.renderedBoundingBox());
740
- }
741
- const listener = () => {
742
- setBoundingBox(node?.renderedBoundingBox());
743
- };
744
- node?.on("position", listener);
745
- return () => {
746
- node?.off("position", void 0, listener);
747
- };
748
- }, [node]);
749
- (0, import_react14.useEffect)(() => {
750
- setCurrentElement(ref.current);
751
- }, [boundingBox]);
752
- return { boundingBox, currentElement, ref };
753
- };
754
-
755
- // src/components/module/graph/node/Hover.tsx
756
- var import_jsx_runtime8 = require("react/jsx-runtime");
757
- var ModuleGraphNodeHover = ({ children, node }) => {
758
- const { boundingBox, ref, currentElement } = useNodeElement(node);
759
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
760
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StyledNodeGhostElementFlexCol, { ref, left: boundingBox?.x1, height: boundingBox?.h, top: boundingBox?.y1, width: boundingBox?.w }),
761
- node ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_jsx_runtime8.Fragment, { children: children?.(currentElement) }) : null
762
- ] });
763
- };
764
- var StyledNodeGhostElementFlexCol = (0, import_material5.styled)(import_react_flexbox3.FlexCol, { name: "StyledNodeGhostElementFlexCol" })(() => ({
765
- // For easier debugging of the 'ghost' element that matches the hovered cytoscape node
766
- // backgroundColor: '#fff',
767
- // opacity: 0.25,
768
- // eslint-disable-next-line sort-keys-fix/sort-keys-fix
769
- cursor: "pointer",
770
- pointerEvents: "none",
771
- position: "absolute"
772
- }));
773
-
774
- // src/components/module/graph/Popper.tsx
775
- var import_icons_material3 = require("@mui/icons-material");
776
- var import_material6 = require("@mui/material");
777
- var import_react_identicon2 = require("@xylabs/react-identicon");
778
- var import_jsx_runtime9 = require("react/jsx-runtime");
779
- var ModuleHoverPopper = ({ anchorEl, onClose, onModuleDetails, onModuleExplore, node, ...props }) => {
780
- const { address, name } = node?.data() ?? {};
781
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_jsx_runtime9.Fragment, { children: anchorEl ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_material6.Popper, { anchorEl, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_material6.Card, { elevation: 3, children: [
782
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
783
- import_material6.CardHeader,
784
- {
785
- action: onClose ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_material6.IconButton, { size: "small", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_icons_material3.CancelRounded, {}) }) : null,
786
- avatar: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_material6.Paper, { elevation: 6, sx: { bgcolor: "#fff", p: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_identicon2.Identicon, { value: address, size: 24 }) }),
787
- title: name,
788
- subheader: address
789
- }
790
- ),
791
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(StyledCardActions, { children: [
792
- onModuleDetails ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_material6.Button, { onClick: () => onModuleDetails?.(address), size: "small", variant: "contained", children: "Details" }) : null,
793
- onModuleExplore ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_material6.Button, { onClick: () => onModuleExplore?.(address), size: "small", variant: "contained", children: "Explore" }) : null
794
- ] })
795
- ] }) }) : null });
796
- };
797
- var StyledModuleHoverPopper = (0, import_material6.styled)(ModuleHoverPopper, { name: "StyledComponents" })(() => ({
798
- zIndex: 2
799
- }));
800
- var StyledCardActions = (0, import_material6.styled)(import_material6.CardActions, { name: "StyledCardActions" })(() => ({
801
- display: "flex",
802
- justifyContent: "center"
803
- }));
804
-
805
- // src/components/module/graph/GraphFlexBox.tsx
806
- var import_jsx_runtime10 = require("react/jsx-runtime");
807
- var ModuleGraphFlexBox = ({ hideActions, rootModule, disableModuleDetails, ...props }) => {
808
- const cytoscapeRef = (0, import_react15.useRef)(null);
809
- const { handleToggleLabels, hideLabels, options } = useRelationalGraphOptions(rootModule ?? void 0);
810
- const { hoveredNode, setHoveredNode, toggleSelectedElement } = useElements(hideLabels);
811
- const { mod, onModuleDetails } = useModuleDetails(rootModule, () => setHoveredNode(void 0));
812
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(WithExtensions, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
813
- NodeRelationalGraphFlexBox,
814
- {
815
- actions: mod ? null : hideActions ? null : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_material7.Button, { size: "small", onClick: handleToggleLabels, variant: "contained", children: "Toggle Labels" }),
816
- showDetails: !!mod,
817
- detail: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DetailsFlexbox, { onClose: () => onModuleDetails(null) }),
818
- options,
819
- ref: cytoscapeRef,
820
- width: "100%",
821
- ...props,
822
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ModuleGraphNodeHover, { node: hoveredNode, children: (element) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
823
- StyledModuleHoverPopper,
824
- {
825
- anchorEl: element,
826
- container: cytoscapeRef.current,
827
- node: hoveredNode,
828
- onClose: () => setHoveredNode(void 0),
829
- onModuleExplore: toggleSelectedElement,
830
- onModuleDetails: disableModuleDetails ? void 0 : onModuleDetails,
831
- placement: "top",
832
- open: true
833
- }
834
- ) })
835
- }
836
- ) });
837
- };
838
- var ModuleGraphFlexBoxWithProvider = (props) => {
839
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CytoscapeInstanceProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ModuleGraphFlexBox, { ...props }) });
840
- };
1
+ "use strict";var bo=Object.create;var z=Object.defineProperty;var Ro=Object.getOwnPropertyDescriptor;var Po=Object.getOwnPropertyNames;var So=Object.getPrototypeOf,wo=Object.prototype.hasOwnProperty;var Fo=(e,o)=>{for(var t in o)z(e,t,{get:o[t],enumerable:!0})},xe=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of Po(o))!wo.call(e,r)&&r!==t&&z(e,r,{get:()=>o[r],enumerable:!(n=Ro(o,r))||n.enumerable});return e};var C=(e,o,t)=>(t=e!=null?bo(So(e)):{},xe(o||!e||!e.__esModule?z(t,"default",{value:e,enumerable:!0}):t,e)),Bo=e=>xe(z({},"__esModule",{value:!0}),e);var $o={};Fo($o,{ColaLayout:()=>re,ConcentricLayout:()=>T,CyIconSet:()=>ie,CytoscapeElements:()=>g,CytoscapeInstanceContext:()=>D,CytoscapeInstanceProvider:()=>oe,EdgeStyled:()=>ce,ModuleCardParser:()=>ko,ModuleGraphFlexBox:()=>No,ModuleGraphFlexBoxWithProvider:()=>Oo,Node:()=>de,NodeAsRoot:()=>ae,NodeRelationalGraph:()=>Go,NodeRelationalGraphFlexBox:()=>P,NodeWithName:()=>le,ProvidedNodeRenderer:()=>Lo,encodeSvg:()=>te,generateIconMap:()=>ne,parseModuleType:()=>se,useCytoscapeElements:()=>b,useCytoscapeInstance:()=>x,useCytoscapeOptions:()=>A,useElements:()=>pe,useModuleDetails:()=>ue,useRelationalGraphOptions:()=>me});module.exports=Bo($o);var $=require("@xyo-network/archivist-model"),U=require("@xyo-network/diviner-model"),ge=require("@xyo-network/react-archivist"),V=require("@xyo-network/react-module"),O=require("react/jsx-runtime"),ko=({mod:e})=>{switch(!0){case(0,$.isArchivistInstance)(e):return(0,O.jsx)(ge.ArchivistCard,{mod:(0,$.asArchivistInstance)(e)});case(0,U.isDivinerInstance)(e):return(0,O.jsx)(V.DivinerCard,{mod:(0,U.asDivinerInstance)(e)});default:return(0,O.jsx)(V.ModuleCard,{mod:e})}};var ho=require("@mui/material"),vo=require("react");var he=require("@xyo-network/react-shared"),D=(0,he.createContextEx)();var Q=require("react");var ve=require("react/jsx-runtime"),oe=({children:e,defaultInstance:o})=>{let[t,n]=(0,Q.useState)(o);return(0,Q.useEffect)(()=>{n(o)},[o]),(0,ve.jsx)(D.Provider,{value:{cy:t,provided:!0,setCy:n},children:e})};var Ne=require("@xyo-network/react-shared");var x=(e=!1)=>(0,Ne.useContextEx)(D,"CytoscapeInstance",e);var Fe=require("@xylabs/react-async-effect"),Be=require("@xyo-network/node-model"),q=require("react");var we=require("@xylabs/exists");var Ee=require("react-dom/server"),Do="data:image/svg+xml,",te=(e,o)=>{let t=(0,Ee.renderToStaticMarkup)(e),r=new DOMParser().parseFromString(t,"text/html").querySelectorAll("svg")[0];return r&&(r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.setAttribute("height","100"),r.style.fill=o??"black"),`${Do}${window.encodeURIComponent(r.outerHTML)}`};var ne=()=>({archivist:"",bridge:"",diviner:"",module:"",node:"",sentinel:"",witness:""});var re={centerGraph:!1,convergenceThreshold:.01,name:"cola"};var T={concentric:function(e){return e.degree(!1)},levelWidth:function(){return 2},minNodeSpacing:75,name:"concentric"};var Me=require("@xyo-network/archivist-model"),Ie=require("@xyo-network/bridge-model"),be=require("@xyo-network/diviner-model"),Re=require("@xyo-network/node-model"),Pe=require("@xyo-network/sentinel-model"),Se=require("@xyo-network/witness-model"),se=e=>{let o="module";return e&&((0,Me.isArchivistInstance)(e)?o="archivist":(0,Ie.isBridgeInstance)(e)?o="bridge":(0,be.isDivinerInstance)(e)?o="diviner":(0,Re.isNodeInstance)(e)?o="node":(0,Pe.isSentinelInstance)(e)?o="sentinel":(0,Se.isWitnessModule)(e)?o="witness":o="module"),o};var g={MaxNameLength:20,buildEdge(e,o,t){return{data:{id:`${e.data.id}/${o.data.id}`,source:e.data.id,target:o.data.id,...t}}},async buildElements(e){let o=await g.recurseNodes(e);return await this.buildElementsFromInfo(o,void 0,["activeNode"])},async buildElementsFromInfo(e,o,t=[]){let n=g.buildNode(e.mod,{childCount:e.children.length,depth:e.depth},t),r=o?g.buildEdge(o,n,{depth:e.depth,siblingCount:e.children.length}):void 0,s=[n];r&&s.push(r);for(let i of e.children)s.push(...await this.buildElementsFromInfo(i,n));return s},buildNode(e,o,t){let{address:n,id:r}=e;return{classes:t,data:{address:n,id:n,name:r,type:se(e),...o}}},buildRootNode:e=>g.buildNode(e,{},["activeNode"]),normalizeName(e){if(e)return e.length>this.MaxNameLength?`${e.slice(0,20)}...`:e},async recurseNodes(e,o=10,t=1){let n={children:[],depth:t,mod:e};if(o>0){let r=await e.resolve("*",{direction:"down",maxDepth:1});n.children=(await Promise.all(r.map(async s=>{if(s.address!==e.address)return await this.recurseNodes(s,o-1,t+1)}))).filter(we.exists)}return n}};var m=require("@mui/icons-material"),ie={archivist:m.Inventory2Rounded,bridge:m.InsertLinkRounded,diviner:m.BubbleChartRounded,module:m.QuestionMarkRounded,node:m.Hub,sentinel:m.TimerRounded,witness:m.VisibilityRounded};var le=(e,o)=>({selector:"node[name]",style:{color:e,"font-family":"Lexend Deca, Helvetica, sans-serif","font-size":12,"overlay-padding":"6px","text-halign":"center","text-outline-color":o,"text-outline-width":"1px","text-valign":"top"}}),de=(e,o,t=!1)=>({selector:"node",style:{"background-color":o,"background-height":"75%","background-image":n=>e[n.data("type")],"background-width":"24",label:t?void 0:"data(name)",shape:"round-rectangle"}}),ae=e=>({selector:".activeNode",style:{"background-color":e}}),ce=(e,o)=>({selector:"edge",style:{"curve-style":"bezier","line-color":e,"line-opacity":.1,"target-arrow-color":o,"target-arrow-shape":"triangle",width:3}});var b=e=>{let[o,t]=(0,q.useState)([]);return(0,Fe.useAsyncEffect)(async()=>{let n=e?.deref();if(n){let r=await g.buildElements(n)??[];t(r)}},[e]),(0,q.useEffect)(()=>{let n,r;return e&&(0,Be.isNodeInstance)(e)&&(n=e.on("moduleAttached",async()=>{let s=await g.buildElements(e)??[];t(s)}),r=e.on("moduleDetached",async()=>{let s=await g.buildElements(e)??[];t(s)})),()=>{n?.(),r?.()}},[e]),o};var R=require("react");var ke=e=>{let{cy:o}=x(!0),[t,n]=(0,R.useState)(),r=(0,R.useCallback)(s=>{s.on("mouseover tap",()=>{n(s)})},[]);return(0,R.useEffect)(()=>{e&&e.nodes().forEach(r)},[r,e]),(0,R.useEffect)(()=>{o?.deref()?.ready(()=>{o?.deref()?.nodes().forEach(r)})},[o,r]),[t,n]};var De=require("@xyo-network/react-node"),Te=require("react");var Ae=e=>{let o=(0,Te.useMemo)(()=>{let{address:r}=e?.data()??{};return r},[e]),[t]=(0,De.useWeakModuleFromNode)(o);return b(t)};var J=require("react");var Ge=(e=[],o)=>{let{cy:t}=x(!0),[n,r]=(0,J.useState)();return(0,J.useEffect)(()=>{if(e.length>1){let s=t?.deref()?.add(e);r(s),t?.deref()?.layout(re).run()}},[t,o,e]),n};var Le=require("react");var He=()=>{let[e,o]=(0,Le.useState)(),{cy:t}=x(!0),n=s=>{t?.deref()?.nodes()?.toggleClass("activeNode",!1),s.toggleClass("activeNode",!0)};return{selectedElement:e,toggleSelectedElement:s=>{let i=t?.deref()?.nodes(`[id="${s}"]`)?.[0];i&&(o(i),n(i))}}};var pe=e=>{let{selectedElement:o,toggleSelectedElement:t}=He(),n=Ae(o),r=Ge(n,e),[s,i]=ke(r);return{hoveredNode:s,setHoveredNode:i,toggleSelectedElement:t}};var Qe=require("react");var Ue=require("@mui/material"),Ve=require("react");var We=require("@mui/material"),ze=require("react");var $e=require("react/jsx-runtime"),Oe=()=>{let e=(0,We.useTheme)();return(0,ze.useMemo)(()=>{let t=ne();return Object.entries(ie).reduce((n,[r,s])=>{let i=(0,$e.jsx)(s,{fontSize:"small"});return n[r]=te(i,e.palette.getContrastText(e.palette.text.primary)),n},t)},[e.palette])};var K=(e=!1)=>{let o=(0,Ue.useTheme)(),t=Oe();return(0,Ve.useMemo)(()=>[de(t,o.palette.primary.main,e),le(o.palette.text.primary,o.palette.getContrastText(o.palette.text.primary)),ae(o.palette.secondary.main),ce(o.palette.divider,o.palette.divider)],[t,e,o])};var A=(e,o,t)=>{let n=K(),r=t??T,s=o??n;return(0,Qe.useMemo)(()=>{if(e&&r&&s)return{elements:e,layout:r,style:s}},[e,t,o])};var qe=require("@xylabs/react-promise"),G=require("react");var ue=(e,o)=>{let{cy:t}=x(),[n,r]=(0,G.useState)(),[s]=(0,qe.usePromise)(async()=>{if(n===null)return null;let l=e?.deref();if(n&&l)return await l.resolve(n)??null},[n,e]);return(0,G.useEffect)(()=>{let l=new ResizeObserver(()=>{if(n===null)setTimeout(()=>{t?.deref()?.center()},100);else if(s&&t){let E=t?.deref()?.nodes(`[id="${n}"]`)?.[0];setTimeout(()=>{t?.deref()?.center(E)},100)}}),u=t?.deref()?.container();return u&&l.observe(u),()=>{u&&l.unobserve(u)}},[t,n,s,e]),(0,G.useEffect)(()=>{s&&o?.()},[t,n,s,o]),{mod:s,onModuleDetails:l=>{let u=t?.deref()?.nodes(`[id="${l}"]`),E=t?.deref()?.nodes(`[id="${e?.deref()?.address}"]`),S=t?.deref()?.nodes(`[id="${s?.address}"]`),I=t?.deref()?.nodes(`[id != "${l}"]`);l?(u?.toggleClass("activeNode",!0),I?.toggleClass("activeNode",!1)):(I?.toggleClass("activeNode",!1),(S?.length?S:E)?.toggleClass("activeNode",!0)),r(l)}}};var Je=require("react");var me=e=>{let[o,t]=(0,Je.useState)(!0),n=()=>{t(l=>!l)},r=b(e),s=K(o),i=A(r,s,T);return{handleToggleLabels:n,hideLabels:o,options:i}};var L=C(require("cytoscape"),1),Ke=C(require("cytoscape-cola"),1),Xe=C(require("cytoscape-cose-bilkent"),1),Ye=C(require("cytoscape-dagre"),1),Ze=C(require("cytoscape-euler"),1),X=require("react"),Y=require("react/jsx-runtime"),_e=({children:e})=>{let[o,t]=(0,X.useState)(!1);return(0,X.useEffect)(()=>{L.default.use(Ke.default),L.default.use(Ye.default),L.default.use(Xe.default),L.default.use(Ze.default),t(!0)},[]),(0,Y.jsx)(Y.Fragment,{children:o?e:void 0})};var c=require("@mui/material"),fe=require("@xylabs/hex"),h=require("@xylabs/react-flexbox"),eo=require("@xylabs/react-identicon"),oo=require("@xyo-network/react-node"),w=C(require("cytoscape"),1),to=C(require("cytoscape-cola"),1),no=C(require("cytoscape-cose-bilkent"),1),ro=C(require("cytoscape-dagre"),1),so=C(require("cytoscape-euler"),1),f=require("react"),a=require("react/jsx-runtime"),je=(e,o="cola",t)=>{e?.layout({name:o,...t}).run()},To=(e="cola")=>{switch(e){case"dagre":{w.default.use(ro.default);break}case"euler":{w.default.use(so.default);break}case"cose-bilkent":{w.default.use(no.default);break}case"cola":{w.default.use(to.default);break}}},Ao=({name:e,address:o,...t})=>(0,a.jsx)(c.Card,{elevation:3,...t,children:(0,a.jsx)(c.CardHeader,{avatar:(0,a.jsx)(c.Paper,{elevation:6,sx:{bgcolor:"#fff",p:1},children:(0,a.jsx)(eo.Identicon,{value:o,size:24})}),title:e,subheader:o})}),P=(0,f.forwardRef)(({actions:e,children:o,node:t,layout:n,layoutOptions:r,showDetails:s,detail:i,options:l,onHover:u,...E},S)=>{let I=(0,c.useTheme)(),[y,H]=(0,f.useState)(),_=(0,f.useRef)(),[j,Eo]=(0,f.useState)(),[ee,ye]=(0,f.useState)(),[Mo]=(0,oo.useWeakModuleFromNode)(ee,{node:t});(0,f.useEffect)(()=>{y?.on("mouseover tap",({target:B})=>{let k=B,Io=k?.renderedBoundingBox?.();Eo(Io);let W=k.id?.();W&&(W.includes("/")?(ye(void 0),u?.()):(ye((0,fe.asAddress)(W)),u?.((0,fe.asAddress)(W))))})},[u,y]);let Ce=()=>{y?.reset(),je(y,n??"euler",r)};return(0,f.useEffect)(()=>{let B,k=_.current;return k&&(B=(0,w.default)({container:k,...l}),H(B)),()=>{B?.destroy(),H(void 0)}},[l,_,r]),(0,f.useEffect)(()=>{y&&(To(n),je(y,n??"euler",r))},[y,r,n]),(0,a.jsxs)(h.FlexCol,{id:"relational-graph-wrapper",ref:S,...E,children:[ee&&j?(0,a.jsx)(c.Box,{position:"absolute",top:j.y1,left:j.x1,zIndex:100,children:(0,a.jsx)(Ao,{address:ee,name:Mo?.deref()?.id??"Unknown"})}):null,(0,a.jsx)(h.FlexRow,{justifyContent:"start",width:"100%",children:e===null?null:e?(0,a.jsxs)(c.ButtonGroup,{children:[e,(0,a.jsx)(c.Button,{size:"small",variant:"contained",onClick:Ce,children:"Reset View"})]}):(0,a.jsx)(c.Button,{size:"small",variant:"contained",onClick:Ce,children:"Reset"})}),(0,a.jsxs)(h.FlexGrowRow,{width:"100%",alignItems:"start",children:[s?(0,a.jsx)(h.FlexCol,{height:"100%",width:"85%",children:i}):null,(0,a.jsxs)(h.FlexCol,{justifyContent:"start",classes:"cytoscape-wrap",width:s?"15%":"100%",height:s?"50%":"100%",border:s?`1px solid ${I.palette.divider}`:void 0,children:[(0,a.jsx)(h.FlexCol,{alignItems:"stretch",position:"absolute",width:"100%",height:"100%",ref:_}),o]})]})]})});P.displayName="NodeRelationalGraph";var Go=P;var io=require("@xyo-network/react-node");var lo=require("react/jsx-runtime"),Lo=({node:e,...o})=>{let[t]=(0,io.useWeakProvidedNode)(),n=b(e??t),r=A(n);return(0,lo.jsx)(P,{alignItems:"stretch",flexGrow:1,height:"100%",options:r,...o})};var ao=require("@mui/icons-material"),co=require("@mui/material"),Z=require("@xylabs/react-flexbox"),F=require("react/jsx-runtime"),po=({children:e,onClose:o})=>(0,F.jsxs)(Z.FlexGrowCol,{alignItems:"end",justifyContent:"start",id:"module-detail",width:"100%",p:2,gap:2,children:[(0,F.jsx)(Z.FlexRow,{justifyContent:"end",children:(0,F.jsx)(co.IconButton,{onClick:o,size:"small",children:(0,F.jsx)(ao.CancelRounded,{})})}),e]});var mo=require("@mui/material"),fo=require("@xylabs/react-flexbox");var v=require("react"),uo=e=>{let o=(0,v.useRef)(null),[t,n]=(0,v.useState)(null),[r,s]=(0,v.useState)(e?.renderedBoundingBox());return(0,v.useEffect)(()=>{n(null)},[e]),(0,v.useEffect)(()=>{e&&s(e.renderedBoundingBox());let i=()=>{s(e?.renderedBoundingBox())};return e?.on("position",i),()=>{e?.off("position",void 0,i)}},[e]),(0,v.useEffect)(()=>{n(o.current)},[r]),{boundingBox:r,currentElement:t,ref:o}};var M=require("react/jsx-runtime"),yo=({children:e,node:o})=>{let{boundingBox:t,ref:n,currentElement:r}=uo(o);return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(Ho,{ref:n,left:t?.x1,height:t?.h,top:t?.y1,width:t?.w}),o?(0,M.jsx)(M.Fragment,{children:e?.(r)}):null]})},Ho=(0,mo.styled)(fo.FlexCol,{name:"StyledNodeGhostElementFlexCol"})(()=>({cursor:"pointer",pointerEvents:"none",position:"absolute"}));var Co=require("@mui/icons-material"),d=require("@mui/material"),xo=require("@xylabs/react-identicon"),p=require("react/jsx-runtime"),Wo=({anchorEl:e,onClose:o,onModuleDetails:t,onModuleExplore:n,node:r,...s})=>{let{address:i,name:l}=r?.data()??{};return(0,p.jsx)(p.Fragment,{children:e?(0,p.jsx)(d.Popper,{anchorEl:e,...s,children:(0,p.jsxs)(d.Card,{elevation:3,children:[(0,p.jsx)(d.CardHeader,{action:o?(0,p.jsx)(d.IconButton,{size:"small",onClick:o,children:(0,p.jsx)(Co.CancelRounded,{})}):null,avatar:(0,p.jsx)(d.Paper,{elevation:6,sx:{bgcolor:"#fff",p:1},children:(0,p.jsx)(xo.Identicon,{value:i,size:24})}),title:l,subheader:i}),(0,p.jsxs)(zo,{children:[t?(0,p.jsx)(d.Button,{onClick:()=>t?.(i),size:"small",variant:"contained",children:"Details"}):null,n?(0,p.jsx)(d.Button,{onClick:()=>n?.(i),size:"small",variant:"contained",children:"Explore"}):null]})]})}):null})},go=(0,d.styled)(Wo,{name:"StyledComponents"})(()=>({zIndex:2})),zo=(0,d.styled)(d.CardActions,{name:"StyledCardActions"})(()=>({display:"flex",justifyContent:"center"}));var N=require("react/jsx-runtime"),No=({hideActions:e,rootModule:o,disableModuleDetails:t,...n})=>{let r=(0,vo.useRef)(null),{handleToggleLabels:s,hideLabels:i,options:l}=me(o??void 0),{hoveredNode:u,setHoveredNode:E,toggleSelectedElement:S}=pe(i),{mod:I,onModuleDetails:y}=ue(o,()=>E(void 0));return(0,N.jsx)(_e,{children:(0,N.jsx)(P,{actions:I||e?null:(0,N.jsx)(ho.Button,{size:"small",onClick:s,variant:"contained",children:"Toggle Labels"}),showDetails:!!I,detail:(0,N.jsx)(po,{onClose:()=>y(null)}),options:l,ref:r,width:"100%",...n,children:(0,N.jsx)(yo,{node:u,children:H=>(0,N.jsx)(go,{anchorEl:H,container:r.current,node:u,onClose:()=>E(void 0),onModuleExplore:S,onModuleDetails:t?void 0:y,placement:"top",open:!0})})})})},Oo=e=>(0,N.jsx)(oe,{children:(0,N.jsx)(No,{...e})});
841
2
  //# sourceMappingURL=index.cjs.map