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