@xyo-network/react-node-renderer 2.64.0 → 2.64.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 (78) hide show
  1. package/dist/browser/Cytoscape/CytoscapeElements.js +40 -9
  2. package/dist/browser/Cytoscape/CytoscapeElements.js.map +1 -1
  3. package/dist/browser/Cytoscape/CytoscapeIcons.js +2 -1
  4. package/dist/browser/Cytoscape/CytoscapeIcons.js.map +1 -1
  5. package/dist/browser/Cytoscape/CytoscapeStyles.js +4 -3
  6. package/dist/browser/Cytoscape/CytoscapeStyles.js.map +1 -1
  7. package/dist/browser/Cytoscape/index.js +220 -4
  8. package/dist/browser/Cytoscape/index.js.map +1 -1
  9. package/dist/browser/Cytoscape/lib/encodeSvg.js +3 -2
  10. package/dist/browser/Cytoscape/lib/encodeSvg.js.map +1 -1
  11. package/dist/browser/Cytoscape/lib/iconMap.js +2 -1
  12. package/dist/browser/Cytoscape/lib/iconMap.js.map +1 -1
  13. package/dist/browser/Cytoscape/lib/index.js +80 -5
  14. package/dist/browser/Cytoscape/lib/index.js.map +1 -1
  15. package/dist/browser/Cytoscape/lib/layout/ColaLayout.js +2 -1
  16. package/dist/browser/Cytoscape/lib/layout/ColaLayout.js.map +1 -1
  17. package/dist/browser/Cytoscape/lib/layout/ConcentricLayout.js +2 -1
  18. package/dist/browser/Cytoscape/lib/layout/ConcentricLayout.js.map +1 -1
  19. package/dist/browser/Cytoscape/lib/layout/index.js +22 -2
  20. package/dist/browser/Cytoscape/lib/layout/index.js.map +1 -1
  21. package/dist/browser/Cytoscape/lib/parseModuleType.js +2 -1
  22. package/dist/browser/Cytoscape/lib/parseModuleType.js.map +1 -1
  23. package/dist/browser/components/ModuleCardParser.js +3 -2
  24. package/dist/browser/components/ModuleCardParser.js.map +1 -1
  25. package/dist/browser/components/ModuleGraphFlexBox.js +459 -11
  26. package/dist/browser/components/ModuleGraphFlexBox.js.map +1 -1
  27. package/dist/browser/components/ProvidedNodeRenderer.js +352 -5
  28. package/dist/browser/components/ProvidedNodeRenderer.js.map +1 -1
  29. package/dist/browser/components/RelationalGraph.js +15 -5
  30. package/dist/browser/components/RelationalGraph.js.map +1 -1
  31. package/dist/browser/components/WithCola.js +3 -2
  32. package/dist/browser/components/WithCola.js.map +1 -1
  33. package/dist/browser/components/cytoscape-extensions/WithExtensions.js +3 -2
  34. package/dist/browser/components/cytoscape-extensions/WithExtensions.js.map +1 -1
  35. package/dist/browser/components/cytoscape-extensions/index.js +18 -1
  36. package/dist/browser/components/cytoscape-extensions/index.js.map +1 -1
  37. package/dist/browser/components/index.js +381 -4
  38. package/dist/browser/components/index.js.map +1 -1
  39. package/dist/browser/components/lib/index.js +0 -1
  40. package/dist/browser/components/lib/index.js.map +1 -1
  41. package/dist/browser/components/story/TestData.js +4 -3
  42. package/dist/browser/components/story/TestData.js.map +1 -1
  43. package/dist/browser/components/story/index.js +48 -1
  44. package/dist/browser/components/story/index.js.map +1 -1
  45. package/dist/browser/contexts/CytoscapeInstance/Context.js +2 -1
  46. package/dist/browser/contexts/CytoscapeInstance/Context.js.map +1 -1
  47. package/dist/browser/contexts/CytoscapeInstance/Provider.js +9 -3
  48. package/dist/browser/contexts/CytoscapeInstance/Provider.js.map +1 -1
  49. package/dist/browser/contexts/CytoscapeInstance/index.js +23 -4
  50. package/dist/browser/contexts/CytoscapeInstance/index.js.map +1 -1
  51. package/dist/browser/contexts/CytoscapeInstance/use.js +8 -2
  52. package/dist/browser/contexts/CytoscapeInstance/use.js.map +1 -1
  53. package/dist/browser/contexts/index.js +23 -1
  54. package/dist/browser/contexts/index.js.map +1 -1
  55. package/dist/browser/hooks/cytoscape/index.js +395 -6
  56. package/dist/browser/hooks/cytoscape/index.js.map +1 -1
  57. package/dist/browser/hooks/cytoscape/useAddNewElements.js +51 -4
  58. package/dist/browser/hooks/cytoscape/useAddNewElements.js.map +1 -1
  59. package/dist/browser/hooks/cytoscape/useCytoscapeElements.js +113 -4
  60. package/dist/browser/hooks/cytoscape/useCytoscapeElements.js.map +1 -1
  61. package/dist/browser/hooks/cytoscape/useCytoscapeOptions.js +136 -4
  62. package/dist/browser/hooks/cytoscape/useCytoscapeOptions.js.map +1 -1
  63. package/dist/browser/hooks/cytoscape/useCytoscapeStyle.js +105 -4
  64. package/dist/browser/hooks/cytoscape/useCytoscapeStyle.js.map +1 -1
  65. package/dist/browser/hooks/cytoscape/useIcons.js +51 -3
  66. package/dist/browser/hooks/cytoscape/useIcons.js.map +1 -1
  67. package/dist/browser/hooks/cytoscape/useNewElements.js +160 -5
  68. package/dist/browser/hooks/cytoscape/useNewElements.js.map +1 -1
  69. package/dist/browser/hooks/cytoscape/usePopperListener.js +2 -1
  70. package/dist/browser/hooks/cytoscape/usePopperListener.js.map +1 -1
  71. package/dist/browser/hooks/cytoscape/useRelationalGraphOptions.js +306 -7
  72. package/dist/browser/hooks/cytoscape/useRelationalGraphOptions.js.map +1 -1
  73. package/dist/browser/hooks/index.js +395 -1
  74. package/dist/browser/hooks/index.js.map +1 -1
  75. package/dist/browser/index.js +484 -3
  76. package/dist/browser/index.js.map +1 -1
  77. package/dist/docs.json +88 -88
  78. package/package.json +25 -25
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/Cytoscape/lib/parseModuleType.ts"],"sourcesContent":["import { isArchivistInstance } from '@xyo-network/archivist-model'\nimport { isBridgeInstance } from '@xyo-network/bridge-model'\nimport { isDivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleInstance } from '@xyo-network/module'\nimport { isNodeInstance } from '@xyo-network/node-model'\nimport { isSentinelInstance } from '@xyo-network/sentinel'\nimport { isWitnessModule } from '@xyo-network/witness'\n\nimport { CyNodeModuleTypes } from './CyNodeModuleTypes'\n\nexport const parseModuleType = (module?: ModuleInstance): CyNodeModuleTypes => {\n let type: CyNodeModuleTypes = 'module'\n if (module) {\n if (isArchivistInstance(module)) {\n type = 'archivist'\n } else if (isBridgeInstance(module)) {\n type = 'bridge'\n } else if (isDivinerInstance(module)) {\n type = 'diviner'\n } else if (isNodeInstance(module)) {\n type = 'node'\n } else if (isSentinelInstance(module)) {\n type = 'sentinel'\n } else if (isWitnessModule(module)) {\n type = 'witness'\n } else {\n type = 'module'\n }\n }\n return type\n}\n"],"mappings":"AAAA,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAElC,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAIzB,MAAM,kBAAkB,CAAC,WAA+C;AAC7E,MAAI,OAA0B;AAC9B,MAAI,QAAQ;AACV,QAAI,oBAAoB,MAAM,GAAG;AAC/B,aAAO;AAAA,IACT,WAAW,iBAAiB,MAAM,GAAG;AACnC,aAAO;AAAA,IACT,WAAW,kBAAkB,MAAM,GAAG;AACpC,aAAO;AAAA,IACT,WAAW,eAAe,MAAM,GAAG;AACjC,aAAO;AAAA,IACT,WAAW,mBAAmB,MAAM,GAAG;AACrC,aAAO;AAAA,IACT,WAAW,gBAAgB,MAAM,GAAG;AAClC,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/Cytoscape/lib/parseModuleType.ts"],"sourcesContent":["import { isArchivistInstance } from '@xyo-network/archivist-model'\nimport { isBridgeInstance } from '@xyo-network/bridge-model'\nimport { isDivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleInstance } from '@xyo-network/module'\nimport { isNodeInstance } from '@xyo-network/node-model'\nimport { isSentinelInstance } from '@xyo-network/sentinel'\nimport { isWitnessModule } from '@xyo-network/witness'\n\nimport { CyNodeModuleTypes } from './CyNodeModuleTypes'\n\nexport const parseModuleType = (module?: ModuleInstance): CyNodeModuleTypes => {\n let type: CyNodeModuleTypes = 'module'\n if (module) {\n if (isArchivistInstance(module)) {\n type = 'archivist'\n } else if (isBridgeInstance(module)) {\n type = 'bridge'\n } else if (isDivinerInstance(module)) {\n type = 'diviner'\n } else if (isNodeInstance(module)) {\n type = 'node'\n } else if (isSentinelInstance(module)) {\n type = 'sentinel'\n } else if (isWitnessModule(module)) {\n type = 'witness'\n } else {\n type = 'module'\n }\n }\n return type\n}\n"],"mappings":";AAAA,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAElC,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAIzB,IAAM,kBAAkB,CAAC,WAA+C;AAC7E,MAAI,OAA0B;AAC9B,MAAI,QAAQ;AACV,QAAI,oBAAoB,MAAM,GAAG;AAC/B,aAAO;AAAA,IACT,WAAW,iBAAiB,MAAM,GAAG;AACnC,aAAO;AAAA,IACT,WAAW,kBAAkB,MAAM,GAAG;AACpC,aAAO;AAAA,IACT,WAAW,eAAe,MAAM,GAAG;AACjC,aAAO;AAAA,IACT,WAAW,mBAAmB,MAAM,GAAG;AACrC,aAAO;AAAA,IACT,WAAW,gBAAgB,MAAM,GAAG;AAClC,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1,9 +1,10 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ // src/components/ModuleCardParser.tsx
2
2
  import { asArchivistInstance } from "@xyo-network/archivist-model";
3
3
  import { asDivinerInstance } from "@xyo-network/diviner-model";
4
4
  import { ArchivistCard } from "@xyo-network/react-archivist";
5
5
  import { DivinerCard, ModuleCard } from "@xyo-network/react-module";
6
- const ModuleCardParser = ({ module }) => {
6
+ import { jsx } from "react/jsx-runtime";
7
+ var ModuleCardParser = ({ module }) => {
7
8
  switch (true) {
8
9
  case module?.config.schema.includes("archivist"):
9
10
  return /* @__PURE__ */ jsx(ArchivistCard, { module: asArchivistInstance(module) });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ModuleCardParser.tsx"],"sourcesContent":["import { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { asDivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleInstance } from '@xyo-network/module'\nimport { ArchivistCard } from '@xyo-network/react-archivist'\nimport { DivinerCard, ModuleCard } from '@xyo-network/react-module'\n\nexport interface ModuleCardParserProps {\n module?: ModuleInstance\n}\n\nexport const ModuleCardParser: React.FC<ModuleCardParserProps> = ({ module }) => {\n switch (true) {\n case module?.config.schema.includes('archivist'):\n return <ArchivistCard module={asArchivistInstance(module)} />\n case module?.config.schema.includes('diviner'):\n return <DivinerCard module={asDivinerInstance(module)} />\n default:\n return <ModuleCard module={module} />\n }\n}\n"],"mappings":"AAaa;AAbb,SAAS,2BAA2B;AACpC,SAAS,yBAAyB;AAElC,SAAS,qBAAqB;AAC9B,SAAS,aAAa,kBAAkB;AAMjC,MAAM,mBAAoD,CAAC,EAAE,OAAO,MAAM;AAC/E,UAAQ,MAAM;AAAA,IACZ,KAAK,QAAQ,OAAO,OAAO,SAAS,WAAW;AAC7C,aAAO,oBAAC,iBAAc,QAAQ,oBAAoB,MAAM,GAAG;AAAA,IAC7D,KAAK,QAAQ,OAAO,OAAO,SAAS,SAAS;AAC3C,aAAO,oBAAC,eAAY,QAAQ,kBAAkB,MAAM,GAAG;AAAA,IACzD;AACE,aAAO,oBAAC,cAAW,QAAgB;AAAA,EACvC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ModuleCardParser.tsx"],"sourcesContent":["import { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { asDivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleInstance } from '@xyo-network/module'\nimport { ArchivistCard } from '@xyo-network/react-archivist'\nimport { DivinerCard, ModuleCard } from '@xyo-network/react-module'\n\nexport interface ModuleCardParserProps {\n module?: ModuleInstance\n}\n\nexport const ModuleCardParser: React.FC<ModuleCardParserProps> = ({ module }) => {\n switch (true) {\n case module?.config.schema.includes('archivist'):\n return <ArchivistCard module={asArchivistInstance(module)} />\n case module?.config.schema.includes('diviner'):\n return <DivinerCard module={asDivinerInstance(module)} />\n default:\n return <ModuleCard module={module} />\n }\n}\n"],"mappings":";AAAA,SAAS,2BAA2B;AACpC,SAAS,yBAAyB;AAElC,SAAS,qBAAqB;AAC9B,SAAS,aAAa,kBAAkB;AAS3B;AAHN,IAAM,mBAAoD,CAAC,EAAE,OAAO,MAAM;AAC/E,UAAQ,MAAM;AAAA,IACZ,KAAK,QAAQ,OAAO,OAAO,SAAS,WAAW;AAC7C,aAAO,oBAAC,iBAAc,QAAQ,oBAAoB,MAAM,GAAG;AAAA,IAC7D,KAAK,QAAQ,OAAO,OAAO,SAAS,SAAS;AAC3C,aAAO,oBAAC,eAAY,QAAQ,kBAAkB,MAAM,GAAG;AAAA,IACzD;AACE,aAAO,oBAAC,cAAW,QAAgB;AAAA,EACvC;AACF;","names":[]}
@@ -1,17 +1,465 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { Button } from "@mui/material";
1
+ // src/components/ModuleGraphFlexBox.tsx
2
+ import { Button as Button2 } from "@mui/material";
3
+ import { useEffect as useEffect6 } from "react";
4
+
5
+ // src/contexts/CytoscapeInstance/Context.ts
6
+ import { createContextEx } from "@xyo-network/react-shared";
7
+ var CytoscapeInstanceContext = createContextEx();
8
+
9
+ // src/contexts/CytoscapeInstance/use.ts
10
+ import { useContextEx } from "@xyo-network/react-shared";
11
+ var useCytoscapeInstance = (required = false) => useContextEx(CytoscapeInstanceContext, "CytoscapeInstance", required);
12
+
13
+ // src/hooks/cytoscape/useAddNewElements.tsx
3
14
  import { useEffect } from "react";
4
- import { useCytoscapeInstance } from "../contexts";
5
- import { useAddNewElements, useNewElements, usePopperListener, useRelationalGraphOptions } from "../hooks";
6
- import { WithExtensions } from "./cytoscape-extensions";
7
- import { NodeRelationalGraphFlexBox } from "./RelationalGraph";
8
- const ModuleGraphFlexBox = ({ rootModule, ...props }) => {
15
+
16
+ // src/Cytoscape/CytoscapeElements.ts
17
+ import { isNodeInstance as isNodeInstance2 } from "@xyo-network/node-model";
18
+
19
+ // src/Cytoscape/lib/encodeSvg.ts
20
+ import { renderToStaticMarkup } from "react-dom/server";
21
+ var dataUri = "data:image/svg+xml,";
22
+ var encodeSvg = (reactElement, color) => {
23
+ const svgString = renderToStaticMarkup(reactElement);
24
+ const doc = new DOMParser().parseFromString(svgString, "text/html");
25
+ const svgElement = doc.getElementsByTagName("svg")[0];
26
+ if (svgElement) {
27
+ svgElement.setAttribute("xmlns", "http://www.w3.org/2000/svg");
28
+ svgElement.setAttribute("height", "100");
29
+ svgElement.style.fill = color ?? "black";
30
+ }
31
+ return `${dataUri}${window.encodeURIComponent(svgElement.outerHTML)}`;
32
+ };
33
+
34
+ // src/Cytoscape/lib/iconMap.ts
35
+ var generateIconMap = () => ({
36
+ archivist: "",
37
+ bridge: "",
38
+ diviner: "",
39
+ module: "",
40
+ node: "",
41
+ sentinel: "",
42
+ witness: ""
43
+ });
44
+
45
+ // src/Cytoscape/lib/layout/ColaLayout.ts
46
+ var ColaLayout = {
47
+ centerGraph: false,
48
+ convergenceThreshold: 0.01,
49
+ name: "cola"
50
+ };
51
+
52
+ // src/Cytoscape/lib/layout/ConcentricLayout.ts
53
+ var ConcentricLayout = {
54
+ concentric: function(node) {
55
+ return node.degree();
56
+ },
57
+ levelWidth: function() {
58
+ return 2;
59
+ },
60
+ minNodeSpacing: 75,
61
+ name: "concentric"
62
+ };
63
+
64
+ // src/Cytoscape/lib/parseModuleType.ts
65
+ import { isArchivistInstance } from "@xyo-network/archivist-model";
66
+ import { isBridgeInstance } from "@xyo-network/bridge-model";
67
+ import { isDivinerInstance } from "@xyo-network/diviner-model";
68
+ import { isNodeInstance } from "@xyo-network/node-model";
69
+ import { isSentinelInstance } from "@xyo-network/sentinel";
70
+ import { isWitnessModule } from "@xyo-network/witness";
71
+ var parseModuleType = (module) => {
72
+ let type = "module";
73
+ if (module) {
74
+ if (isArchivistInstance(module)) {
75
+ type = "archivist";
76
+ } else if (isBridgeInstance(module)) {
77
+ type = "bridge";
78
+ } else if (isDivinerInstance(module)) {
79
+ type = "diviner";
80
+ } else if (isNodeInstance(module)) {
81
+ type = "node";
82
+ } else if (isSentinelInstance(module)) {
83
+ type = "sentinel";
84
+ } else if (isWitnessModule(module)) {
85
+ type = "witness";
86
+ } else {
87
+ type = "module";
88
+ }
89
+ }
90
+ return type;
91
+ };
92
+
93
+ // src/Cytoscape/CytoscapeElements.ts
94
+ var CytoscapeElements = class _CytoscapeElements {
95
+ static MaxNameLength = 20;
96
+ static buildEdge(rootNode, newNode) {
97
+ return {
98
+ data: {
99
+ id: `${rootNode.data.id}/${newNode.data.id}`,
100
+ source: rootNode.data.id,
101
+ target: newNode.data.id
102
+ }
103
+ };
104
+ }
105
+ static async buildElements(module) {
106
+ const newRootNode = _CytoscapeElements.buildRootNode(module);
107
+ const newElements = [newRootNode];
108
+ try {
109
+ const childElements = await _CytoscapeElements.recurseNodes(module);
110
+ childElements?.forEach((module2) => {
111
+ const newNode = _CytoscapeElements.buildNode(module2, newRootNode.data.id);
112
+ newElements.push(newNode);
113
+ const newEdge = _CytoscapeElements.buildEdge(newRootNode, newNode);
114
+ newElements.push(newEdge);
115
+ });
116
+ return newElements;
117
+ } catch (e) {
118
+ console.error("error resolving modules", e);
119
+ return [];
120
+ }
121
+ }
122
+ static buildNode(module, rootNodeId) {
123
+ const { address, config } = module;
124
+ const normalizedName = config.name ?? address.substring(0, 8);
125
+ return {
126
+ data: {
127
+ address,
128
+ id: address,
129
+ name: normalizedName,
130
+ rootNodeId,
131
+ type: parseModuleType(module)
132
+ }
133
+ };
134
+ }
135
+ static buildRootNode = (module) => {
136
+ return _CytoscapeElements.buildNode(module);
137
+ };
138
+ static normalizeName(name) {
139
+ if (!name)
140
+ return;
141
+ if (name.length > this.MaxNameLength)
142
+ return `${name.substring(0, 20)}...`;
143
+ return name;
144
+ }
145
+ static async recurseNodes(module, maxTraversals = 1) {
146
+ let localDepth = 0;
147
+ const childModules = [];
148
+ const traverse = async (nestedNode) => {
149
+ if (localDepth < maxTraversals) {
150
+ const modules = await nestedNode.resolve(void 0, { direction: "down", maxDepth: 2 });
151
+ await Promise.all(
152
+ modules.map(async (child) => {
153
+ if (child !== nestedNode && isNodeInstance2(child)) {
154
+ localDepth++;
155
+ await traverse(child);
156
+ } else if (child !== module) {
157
+ childModules.push(child);
158
+ }
159
+ })
160
+ );
161
+ }
162
+ };
163
+ await traverse(module);
164
+ return childModules;
165
+ }
166
+ };
167
+
168
+ // src/Cytoscape/CytoscapeIcons.tsx
169
+ import {
170
+ BubbleChartRounded as BubbleChartRoundedIcon,
171
+ Hub as HubIcon,
172
+ InsertLinkRounded as InsertLinkRoundedIcon,
173
+ Inventory2Rounded as Inventory2RoundedIcon,
174
+ QuestionMarkRounded as QuestionMarkRoundedIcon,
175
+ TimerRounded as TimerRoundedIcon,
176
+ VisibilityRounded as VisibilityRoundedIcon
177
+ } from "@mui/icons-material";
178
+ var CyIconSet = {
179
+ archivist: Inventory2RoundedIcon,
180
+ bridge: InsertLinkRoundedIcon,
181
+ diviner: BubbleChartRoundedIcon,
182
+ module: QuestionMarkRoundedIcon,
183
+ node: HubIcon,
184
+ sentinel: TimerRoundedIcon,
185
+ witness: VisibilityRoundedIcon
186
+ };
187
+
188
+ // src/Cytoscape/CytoscapeStyles.ts
189
+ var NodeIdStyles = (color, outlineColor) => ({
190
+ selector: "node[name]",
191
+ style: {
192
+ color,
193
+ "font-family": "Lexend Deca, Helvetica, sans-serif",
194
+ "font-size": 12,
195
+ "overlay-padding": "6px",
196
+ "text-halign": "center",
197
+ "text-outline-color": outlineColor,
198
+ "text-outline-width": "1px",
199
+ "text-valign": "top"
200
+ }
201
+ });
202
+ var NodeStyled = (icons, bgColor, hideLabels = false) => ({
203
+ selector: "node",
204
+ style: {
205
+ "background-color": bgColor,
206
+ "background-height": "75%",
207
+ "background-image": (elem) => icons[elem.data("type")],
208
+ "background-width": "24",
209
+ label: hideLabels ? void 0 : "data(name)",
210
+ shape: "round-rectangle"
211
+ }
212
+ });
213
+ var EdgeStyled = (lineColor, targetArrowColor) => ({
214
+ selector: "edge",
215
+ style: {
216
+ "curve-style": "bezier",
217
+ "line-color": lineColor,
218
+ "line-opacity": 0.1,
219
+ "target-arrow-color": targetArrowColor,
220
+ "target-arrow-shape": "triangle",
221
+ width: 3
222
+ }
223
+ });
224
+
225
+ // src/hooks/cytoscape/usePopperListener.tsx
226
+ import { useTheme } from "@mui/material";
227
+ import { useCallback } from "react";
228
+ var usePopperListener = () => {
229
+ const theme = useTheme();
230
+ const popperListener = useCallback(
231
+ (node, hideLabels, cy) => {
232
+ const div = document.createElement("div");
233
+ const shadowColor = theme.palette.getContrastText(theme.palette.text.primary);
234
+ const popper2 = node.popper({
235
+ content: () => {
236
+ div.innerHTML = node.data().name;
237
+ div.style.opacity = "0";
238
+ div.style.transition = "opacity .25s";
239
+ div.style.textShadow = `0 0 3px ${shadowColor}`;
240
+ document.body.appendChild(div);
241
+ return div;
242
+ }
243
+ });
244
+ const update = async () => {
245
+ await popper2.update();
246
+ };
247
+ node.on("position", update);
248
+ node.on("mouseover", () => hideLabels ? div.style.opacity = "1" : void 0);
249
+ node.on("mouseout", () => hideLabels ? div.style.opacity = "0" : void 0);
250
+ cy?.on("pan zoom resize", update);
251
+ },
252
+ [theme]
253
+ );
254
+ return popperListener;
255
+ };
256
+
257
+ // src/hooks/cytoscape/useAddNewElements.tsx
258
+ var useAddNewElements = (newElements = [], hideLabels) => {
259
+ const { cy } = useCytoscapeInstance(true);
260
+ const popperListener = usePopperListener();
261
+ useEffect(() => {
262
+ if (newElements.length > 1) {
263
+ const renderedElements = cy?.add(newElements);
264
+ renderedElements?.nodes().forEach((node) => popperListener(node, hideLabels, cy));
265
+ cy?.layout(ColaLayout).run();
266
+ }
267
+ }, [cy, hideLabels, newElements, popperListener]);
268
+ };
269
+
270
+ // src/hooks/cytoscape/useCytoscapeElements.ts
271
+ import { useAsyncEffect } from "@xylabs/react-async-effect";
272
+ import { isNodeInstance as isNodeInstance3 } from "@xyo-network/node-model";
273
+ import { useEffect as useEffect2, useState } from "react";
274
+ var useCytoscapeElements = (module) => {
275
+ const [elements, setElements] = useState([]);
276
+ useAsyncEffect(
277
+ // eslint-disable-next-line react-hooks/exhaustive-deps
278
+ async () => {
279
+ if (module) {
280
+ const newElements = await CytoscapeElements.buildElements(module) ?? [];
281
+ setElements(newElements);
282
+ }
283
+ },
284
+ [module]
285
+ );
286
+ useEffect2(() => {
287
+ let attachedListener = void 0;
288
+ let detachedListener = void 0;
289
+ if (module && isNodeInstance3(module)) {
290
+ attachedListener = module.on("moduleAttached", async () => {
291
+ const newElements = await CytoscapeElements.buildElements(module) ?? [];
292
+ setElements(newElements);
293
+ });
294
+ detachedListener = module.on("moduleDetached", async () => {
295
+ const newElements = await CytoscapeElements.buildElements(module) ?? [];
296
+ setElements(newElements);
297
+ });
298
+ }
299
+ return () => {
300
+ attachedListener?.();
301
+ detachedListener?.();
302
+ };
303
+ }, [module]);
304
+ return elements;
305
+ };
306
+
307
+ // src/hooks/cytoscape/useCytoscapeOptions.ts
308
+ import { useMemo as useMemo3 } from "react";
309
+
310
+ // src/hooks/cytoscape/useCytoscapeStyle.tsx
311
+ import { useTheme as useTheme3 } from "@mui/material";
312
+ import { useMemo as useMemo2 } from "react";
313
+
314
+ // src/hooks/cytoscape/useIcons.tsx
315
+ import { useTheme as useTheme2 } from "@mui/material";
316
+ import { useMemo } from "react";
317
+ import { jsx } from "react/jsx-runtime";
318
+ var useIcons = () => {
319
+ const theme = useTheme2();
320
+ const icons = useMemo(() => {
321
+ const iconMap = generateIconMap();
322
+ return Object.entries(CyIconSet).reduce((acc, [name, IconComponent]) => {
323
+ const icon = /* @__PURE__ */ jsx(IconComponent, { fontSize: "small" });
324
+ acc[name] = encodeSvg(icon, theme.palette.getContrastText(theme.palette.text.primary));
325
+ return acc;
326
+ }, iconMap);
327
+ }, [theme.palette]);
328
+ return icons;
329
+ };
330
+
331
+ // src/hooks/cytoscape/useCytoscapeStyle.tsx
332
+ var useCytoscapeStyle = (hideLabels = false) => {
333
+ const theme = useTheme3();
334
+ const icons = useIcons();
335
+ const style = useMemo2(
336
+ () => [
337
+ NodeIdStyles(theme.palette.text.primary, theme.palette.getContrastText(theme.palette.text.primary)),
338
+ NodeStyled(icons, theme.palette.primary.main, hideLabels),
339
+ EdgeStyled(theme.palette.divider, theme.palette.divider)
340
+ ],
341
+ [icons, hideLabels, theme]
342
+ );
343
+ return style;
344
+ };
345
+
346
+ // src/hooks/cytoscape/useCytoscapeOptions.ts
347
+ var useCytoscapeOptions = (elements, style, layout) => {
348
+ const defaultStyle = useCytoscapeStyle();
349
+ const options = useMemo3(() => {
350
+ if (elements && layout && style) {
351
+ return {
352
+ elements,
353
+ layout: layout ?? ConcentricLayout,
354
+ style: style ?? defaultStyle
355
+ };
356
+ }
357
+ }, [elements, layout, style]);
358
+ return options;
359
+ };
360
+
361
+ // src/hooks/cytoscape/useNewElements.tsx
362
+ import { useModuleFromNode } from "@xyo-network/react-node";
363
+ import { useEffect as useEffect3, useState as useState2 } from "react";
364
+ var useNewElements = () => {
365
+ const { cy } = useCytoscapeInstance(true);
366
+ const [selectedElement, setSelectedElement] = useState2();
367
+ const { address: selectedAddress } = selectedElement?.data() ?? {};
368
+ const [module] = useModuleFromNode(selectedAddress);
369
+ const newElements = useCytoscapeElements(module);
370
+ useEffect3(() => {
371
+ if (selectedAddress) {
372
+ const element = cy?.$(`node[id="${selectedAddress}"]`);
373
+ if (element?.length)
374
+ cy?.center(element);
375
+ }
376
+ }, [cy, selectedAddress]);
377
+ return { newElements, setSelectedElement };
378
+ };
379
+
380
+ // src/hooks/cytoscape/useRelationalGraphOptions.tsx
381
+ import { useState as useState3 } from "react";
382
+ var useRelationalGraphOptions = (module) => {
383
+ const [hideLabels, setHideLabels] = useState3(false);
384
+ const handleToggleLabels = () => {
385
+ setHideLabels((oldValue) => !oldValue);
386
+ };
387
+ const elements = useCytoscapeElements(module);
388
+ const style = useCytoscapeStyle(hideLabels);
389
+ const options = useCytoscapeOptions(elements, style, ColaLayout);
390
+ return { handleToggleLabels, hideLabels, options };
391
+ };
392
+
393
+ // src/components/cytoscape-extensions/WithExtensions.tsx
394
+ import { use } from "cytoscape";
395
+ import cola from "cytoscape-cola";
396
+ import popper from "cytoscape-popper";
397
+ import { useEffect as useEffect4, useState as useState4 } from "react";
398
+ import { Fragment, jsx as jsx2 } from "react/jsx-runtime";
399
+ var WithExtensions = ({ children }) => {
400
+ const [initialized, setInitialized] = useState4(false);
401
+ useEffect4(() => {
402
+ use(cola);
403
+ use(popper);
404
+ setInitialized(true);
405
+ }, []);
406
+ return /* @__PURE__ */ jsx2(Fragment, { children: initialized ? children : void 0 });
407
+ };
408
+
409
+ // src/components/RelationalGraph.tsx
410
+ import { Button, ButtonGroup, styled } from "@mui/material";
411
+ import { FlexCol, FlexRow } from "@xylabs/react-flexbox";
412
+ import { useShareForwardedRef } from "@xyo-network/react-shared";
413
+ import cytoscape from "cytoscape";
414
+ import { forwardRef, useEffect as useEffect5, useState as useState5 } from "react";
415
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
416
+ var NodeRelationalGraphFlexBox = forwardRef(({ actions, options, ...props }, ref) => {
417
+ const [cy, setCy] = useState5();
418
+ const { setCy: setCyContext } = useCytoscapeInstance();
419
+ const sharedRef = useShareForwardedRef(ref);
420
+ const handleReset = () => {
421
+ cy?.reset();
422
+ cy?.fit(void 0, 20);
423
+ };
424
+ useEffect5(() => {
425
+ if (sharedRef) {
426
+ const newCy = cytoscape({
427
+ container: sharedRef.current,
428
+ ...options
429
+ });
430
+ setCy(newCy);
431
+ }
432
+ }, [options, sharedRef]);
433
+ useEffect5(() => {
434
+ setCyContext?.(cy);
435
+ }, [cy, setCyContext]);
436
+ return /* @__PURE__ */ jsxs(FlexCol, { ...props, children: [
437
+ /* @__PURE__ */ jsx3(ActionsContainer, { children: /* @__PURE__ */ jsxs(ButtonGroup, { children: [
438
+ actions,
439
+ /* @__PURE__ */ jsx3(Button, { size: "small", variant: "contained", onClick: handleReset, children: "Reset" })
440
+ ] }) }),
441
+ /* @__PURE__ */ jsx3(FlexCol, { alignItems: "stretch", height: "100%", position: "absolute", ref: sharedRef, width: "100%" })
442
+ ] });
443
+ });
444
+ NodeRelationalGraphFlexBox.displayName = "NodeRelationalGraph";
445
+ var ActionsContainer = styled(FlexRow, { name: "ActionsContainer" })(({ theme }) => ({
446
+ flexWrap: "wrap",
447
+ gap: theme.spacing(1),
448
+ position: "absolute",
449
+ right: "10px",
450
+ top: "10px",
451
+ zIndex: 2
452
+ }));
453
+
454
+ // src/components/ModuleGraphFlexBox.tsx
455
+ import { jsx as jsx4 } from "react/jsx-runtime";
456
+ var ModuleGraphFlexBox = ({ rootModule, ...props }) => {
9
457
  const { cy } = useCytoscapeInstance(true);
10
458
  const popperListener = usePopperListener();
11
459
  const { handleToggleLabels, hideLabels, options } = useRelationalGraphOptions(rootModule ?? void 0);
12
460
  const { newElements, setSelectedElement } = useNewElements();
13
461
  useAddNewElements(newElements, hideLabels);
14
- useEffect(() => {
462
+ useEffect6(() => {
15
463
  const listener = (event) => {
16
464
  const element = event.target[0];
17
465
  if (element.isNode())
@@ -22,15 +470,15 @@ const ModuleGraphFlexBox = ({ rootModule, ...props }) => {
22
470
  cy?.off("select", listener);
23
471
  };
24
472
  }, [cy, setSelectedElement]);
25
- useEffect(() => {
473
+ useEffect6(() => {
26
474
  cy?.ready(() => {
27
475
  cy.nodes().forEach((node) => popperListener(node, hideLabels, cy));
28
476
  });
29
477
  }, [cy, hideLabels, popperListener, setSelectedElement]);
30
- return /* @__PURE__ */ jsx(WithExtensions, { children: /* @__PURE__ */ jsx(
478
+ return /* @__PURE__ */ jsx4(WithExtensions, { children: /* @__PURE__ */ jsx4(
31
479
  NodeRelationalGraphFlexBox,
32
480
  {
33
- actions: /* @__PURE__ */ jsx(Button, { size: "small", onClick: handleToggleLabels, variant: "contained", children: "Toggle Labels" }),
481
+ actions: /* @__PURE__ */ jsx4(Button2, { size: "small", onClick: handleToggleLabels, variant: "contained", children: "Toggle Labels" }),
34
482
  options,
35
483
  ...props
36
484
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ModuleGraphFlexBox.tsx"],"sourcesContent":["import { Button } from '@mui/material'\nimport { FlexBoxProps } from '@xylabs/react-flexbox'\nimport { ModuleInstance } from '@xyo-network/module'\nimport { EventObject } from 'cytoscape'\nimport { useEffect } from 'react'\n\nimport { useCytoscapeInstance } from '../contexts'\nimport { useAddNewElements, useNewElements, usePopperListener, useRelationalGraphOptions } from '../hooks'\nimport { WithExtensions } from './cytoscape-extensions'\nimport { NodeRelationalGraphFlexBox } from './RelationalGraph'\n\nexport interface ModuleGraphFlexBoxProps extends FlexBoxProps {\n rootModule?: ModuleInstance | null\n}\n\nexport const ModuleGraphFlexBox: React.FC<ModuleGraphFlexBoxProps> = ({ rootModule, ...props }) => {\n const { cy } = useCytoscapeInstance(true)\n const popperListener = usePopperListener()\n const { handleToggleLabels, hideLabels, options } = useRelationalGraphOptions(rootModule ?? undefined)\n\n const { newElements, setSelectedElement } = useNewElements()\n\n useAddNewElements(newElements, hideLabels)\n\n useEffect(() => {\n const listener = (event: EventObject) => {\n const element = event.target[0]\n if (element.isNode()) setSelectedElement(element)\n }\n cy?.on('select', listener)\n\n return () => {\n cy?.off('select', listener)\n }\n }, [cy, setSelectedElement])\n\n useEffect(() => {\n cy?.ready(() => {\n cy.nodes().forEach((node) => popperListener(node, hideLabels, cy))\n })\n }, [cy, hideLabels, popperListener, setSelectedElement])\n\n return (\n <WithExtensions>\n <NodeRelationalGraphFlexBox\n actions={\n <Button size={'small'} onClick={handleToggleLabels} variant=\"contained\">\n Toggle Labels\n </Button>\n }\n options={options}\n {...props}\n />\n </WithExtensions>\n )\n}\n"],"mappings":"AA8CU;AA9CV,SAAS,cAAc;AAIvB,SAAS,iBAAiB;AAE1B,SAAS,4BAA4B;AACrC,SAAS,mBAAmB,gBAAgB,mBAAmB,iCAAiC;AAChG,SAAS,sBAAsB;AAC/B,SAAS,kCAAkC;AAMpC,MAAM,qBAAwD,CAAC,EAAE,YAAY,GAAG,MAAM,MAAM;AACjG,QAAM,EAAE,GAAG,IAAI,qBAAqB,IAAI;AACxC,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,EAAE,oBAAoB,YAAY,QAAQ,IAAI,0BAA0B,cAAc,MAAS;AAErG,QAAM,EAAE,aAAa,mBAAmB,IAAI,eAAe;AAE3D,oBAAkB,aAAa,UAAU;AAEzC,YAAU,MAAM;AACd,UAAM,WAAW,CAAC,UAAuB;AACvC,YAAM,UAAU,MAAM,OAAO,CAAC;AAC9B,UAAI,QAAQ,OAAO;AAAG,2BAAmB,OAAO;AAAA,IAClD;AACA,QAAI,GAAG,UAAU,QAAQ;AAEzB,WAAO,MAAM;AACX,UAAI,IAAI,UAAU,QAAQ;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,IAAI,kBAAkB,CAAC;AAE3B,YAAU,MAAM;AACd,QAAI,MAAM,MAAM;AACd,SAAG,MAAM,EAAE,QAAQ,CAAC,SAAS,eAAe,MAAM,YAAY,EAAE,CAAC;AAAA,IACnE,CAAC;AAAA,EACH,GAAG,CAAC,IAAI,YAAY,gBAAgB,kBAAkB,CAAC;AAEvD,SACE,oBAAC,kBACC;AAAA,IAAC;AAAA;AAAA,MACC,SACE,oBAAC,UAAO,MAAM,SAAS,SAAS,oBAAoB,SAAQ,aAAY,2BAExE;AAAA,MAEF;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ModuleGraphFlexBox.tsx","../../../src/contexts/CytoscapeInstance/Context.ts","../../../src/contexts/CytoscapeInstance/use.ts","../../../src/hooks/cytoscape/useAddNewElements.tsx","../../../src/Cytoscape/CytoscapeElements.ts","../../../src/Cytoscape/lib/encodeSvg.ts","../../../src/Cytoscape/lib/iconMap.ts","../../../src/Cytoscape/lib/layout/ColaLayout.ts","../../../src/Cytoscape/lib/layout/ConcentricLayout.ts","../../../src/Cytoscape/lib/parseModuleType.ts","../../../src/Cytoscape/CytoscapeIcons.tsx","../../../src/Cytoscape/CytoscapeStyles.ts","../../../src/hooks/cytoscape/usePopperListener.tsx","../../../src/hooks/cytoscape/useCytoscapeElements.ts","../../../src/hooks/cytoscape/useCytoscapeOptions.ts","../../../src/hooks/cytoscape/useCytoscapeStyle.tsx","../../../src/hooks/cytoscape/useIcons.tsx","../../../src/hooks/cytoscape/useNewElements.tsx","../../../src/hooks/cytoscape/useRelationalGraphOptions.tsx","../../../src/components/cytoscape-extensions/WithExtensions.tsx","../../../src/components/RelationalGraph.tsx"],"sourcesContent":["import { Button } from '@mui/material'\nimport { FlexBoxProps } from '@xylabs/react-flexbox'\nimport { ModuleInstance } from '@xyo-network/module'\nimport { EventObject } from 'cytoscape'\nimport { useEffect } from 'react'\n\nimport { useCytoscapeInstance } from '../contexts'\nimport { useAddNewElements, useNewElements, usePopperListener, useRelationalGraphOptions } from '../hooks'\nimport { WithExtensions } from './cytoscape-extensions'\nimport { NodeRelationalGraphFlexBox } from './RelationalGraph'\n\nexport interface ModuleGraphFlexBoxProps extends FlexBoxProps {\n rootModule?: ModuleInstance | null\n}\n\nexport const ModuleGraphFlexBox: React.FC<ModuleGraphFlexBoxProps> = ({ rootModule, ...props }) => {\n const { cy } = useCytoscapeInstance(true)\n const popperListener = usePopperListener()\n const { handleToggleLabels, hideLabels, options } = useRelationalGraphOptions(rootModule ?? undefined)\n\n const { newElements, setSelectedElement } = useNewElements()\n\n useAddNewElements(newElements, hideLabels)\n\n useEffect(() => {\n const listener = (event: EventObject) => {\n const element = event.target[0]\n if (element.isNode()) setSelectedElement(element)\n }\n cy?.on('select', listener)\n\n return () => {\n cy?.off('select', listener)\n }\n }, [cy, setSelectedElement])\n\n useEffect(() => {\n cy?.ready(() => {\n cy.nodes().forEach((node) => popperListener(node, hideLabels, cy))\n })\n }, [cy, hideLabels, popperListener, setSelectedElement])\n\n return (\n <WithExtensions>\n <NodeRelationalGraphFlexBox\n actions={\n <Button size={'small'} onClick={handleToggleLabels} variant=\"contained\">\n Toggle Labels\n </Button>\n }\n options={options}\n {...props}\n />\n </WithExtensions>\n )\n}\n","import { createContextEx } from '@xyo-network/react-shared'\n\nimport { CytoscapeInstanceState } from './State'\n\nexport const CytoscapeInstanceContext = createContextEx<CytoscapeInstanceState>()\n","import { useContextEx } from '@xyo-network/react-shared'\n\nimport { CytoscapeInstanceContext } from './Context'\n\nexport const useCytoscapeInstance = (required = false) => useContextEx(CytoscapeInstanceContext, 'CytoscapeInstance', required)\n","import { ElementDefinition } from 'cytoscape'\nimport { useEffect } from 'react'\n\nimport { useCytoscapeInstance } from '../../contexts'\nimport { ColaLayout } from '../../Cytoscape'\nimport { usePopperListener } from './usePopperListener'\n\nexport const useAddNewElements = (newElements: ElementDefinition[] = [], hideLabels?: boolean) => {\n const { cy } = useCytoscapeInstance(true)\n const popperListener = usePopperListener()\n\n useEffect(() => {\n if (newElements.length > 1) {\n const renderedElements = cy?.add(newElements)\n renderedElements?.nodes().forEach((node) => popperListener(node, hideLabels, cy))\n cy?.layout(ColaLayout).run()\n }\n }, [cy, hideLabels, newElements, popperListener])\n}\n","import { ModuleInstance } from '@xyo-network/module'\nimport { isNodeInstance } from '@xyo-network/node-model'\nimport { ElementDefinition } from 'cytoscape'\n\nimport { parseModuleType } from './lib'\n\nexport class CytoscapeElements {\n static MaxNameLength = 20\n\n static buildEdge(rootNode: ElementDefinition, newNode: ElementDefinition) {\n return {\n data: {\n id: `${rootNode.data.id}/${newNode.data.id}`,\n source: rootNode.data.id,\n target: newNode.data.id,\n },\n }\n }\n\n static async buildElements(module: ModuleInstance): Promise<ElementDefinition[]> {\n const newRootNode = CytoscapeElements.buildRootNode(module)\n const newElements: ElementDefinition[] = [newRootNode]\n\n try {\n const childElements = await CytoscapeElements.recurseNodes(module)\n childElements?.forEach((module) => {\n const newNode = CytoscapeElements.buildNode(module, newRootNode.data.id)\n newElements.push(newNode)\n\n const newEdge = CytoscapeElements.buildEdge(newRootNode, newNode)\n newElements.push(newEdge)\n })\n\n return newElements\n } catch (e) {\n console.error('error resolving modules', e)\n return []\n }\n }\n\n static buildNode(module: ModuleInstance, rootNodeId?: string): ElementDefinition {\n const { address, config } = module\n const normalizedName = config.name ?? address.substring(0, 8)\n return {\n data: {\n address,\n id: address,\n name: normalizedName,\n rootNodeId,\n type: parseModuleType(module),\n },\n }\n }\n\n static buildRootNode = (module: ModuleInstance): ElementDefinition => {\n return CytoscapeElements.buildNode(module)\n }\n\n static normalizeName(name?: string) {\n if (!name) return\n if (name.length > this.MaxNameLength) return `${name.substring(0, 20)}...`\n return name\n }\n\n static async recurseNodes(module: ModuleInstance, maxTraversals = 1): Promise<ModuleInstance[]> {\n let localDepth = 0\n const childModules: ModuleInstance[] = []\n\n const traverse = async (nestedNode: ModuleInstance) => {\n if (localDepth < maxTraversals) {\n const modules = await nestedNode.resolve(undefined, { direction: 'down', maxDepth: 2 })\n await Promise.all(\n modules.map(async (child) => {\n if (child !== nestedNode && isNodeInstance(child)) {\n localDepth++\n await traverse(child)\n // don't re add the root module that was passed in\n } else if (child !== module) {\n childModules.push(child)\n }\n }),\n )\n }\n }\n\n await traverse(module)\n\n return childModules\n }\n}\n","import { ReactElement } from 'react'\n// eslint-disable-next-line import/no-internal-modules\nimport { renderToStaticMarkup } from 'react-dom/server'\n\nconst dataUri = 'data:image/svg+xml,'\n\nexport const encodeSvg = (reactElement: ReactElement, color?: string) => {\n const svgString = renderToStaticMarkup(reactElement)\n\n const doc = new DOMParser().parseFromString(svgString, 'text/html')\n const svgElement = doc.getElementsByTagName('svg')[0]\n if (svgElement) {\n svgElement.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n svgElement.setAttribute('height', '100')\n svgElement.style.fill = color ?? 'black'\n }\n\n return `${dataUri}${window.encodeURIComponent(svgElement.outerHTML)}`\n}\n","import { CyNodeModuleTypes } from './CyNodeModuleTypes'\n\nexport const generateIconMap: () => Record<CyNodeModuleTypes, string> = () => ({\n archivist: '',\n bridge: '',\n diviner: '',\n module: '',\n node: '',\n sentinel: '',\n witness: '',\n})\n","export const ColaLayout = {\n centerGraph: false,\n convergenceThreshold: 0.01,\n name: 'cola',\n}\n","import { CytoscapeOptions } from 'cytoscape'\n\nexport const ConcentricLayout: CytoscapeOptions['layout'] = {\n concentric: function (node) {\n return node.degree()\n },\n levelWidth: function () {\n return 2\n },\n minNodeSpacing: 75,\n name: 'concentric',\n}\n","import { isArchivistInstance } from '@xyo-network/archivist-model'\nimport { isBridgeInstance } from '@xyo-network/bridge-model'\nimport { isDivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleInstance } from '@xyo-network/module'\nimport { isNodeInstance } from '@xyo-network/node-model'\nimport { isSentinelInstance } from '@xyo-network/sentinel'\nimport { isWitnessModule } from '@xyo-network/witness'\n\nimport { CyNodeModuleTypes } from './CyNodeModuleTypes'\n\nexport const parseModuleType = (module?: ModuleInstance): CyNodeModuleTypes => {\n let type: CyNodeModuleTypes = 'module'\n if (module) {\n if (isArchivistInstance(module)) {\n type = 'archivist'\n } else if (isBridgeInstance(module)) {\n type = 'bridge'\n } else if (isDivinerInstance(module)) {\n type = 'diviner'\n } else if (isNodeInstance(module)) {\n type = 'node'\n } else if (isSentinelInstance(module)) {\n type = 'sentinel'\n } else if (isWitnessModule(module)) {\n type = 'witness'\n } else {\n type = 'module'\n }\n }\n return type\n}\n","import {\n BubbleChartRounded as BubbleChartRoundedIcon,\n Hub as HubIcon,\n InsertLinkRounded as InsertLinkRoundedIcon,\n Inventory2Rounded as Inventory2RoundedIcon,\n QuestionMarkRounded as QuestionMarkRoundedIcon,\n TimerRounded as TimerRoundedIcon,\n VisibilityRounded as VisibilityRoundedIcon,\n} from '@mui/icons-material'\nimport { SvgIconTypeMap } from '@mui/material'\nimport { OverridableComponent } from '@mui/material/OverridableComponent'\n\nimport { CyNodeModuleTypes } from './lib'\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const CyIconSet: Record<CyNodeModuleTypes, OverridableComponent<SvgIconTypeMap<{}, 'svg'>>> = {\n archivist: Inventory2RoundedIcon,\n bridge: InsertLinkRoundedIcon,\n diviner: BubbleChartRoundedIcon,\n module: QuestionMarkRoundedIcon,\n node: HubIcon,\n sentinel: TimerRoundedIcon,\n witness: VisibilityRoundedIcon,\n}\n","import { Stylesheet } from 'cytoscape'\n\nimport { CyNodeModuleTypes } from './lib'\n\nexport const NodeIdStyles = (color?: string, outlineColor?: string): Stylesheet => ({\n selector: 'node[name]',\n style: {\n color,\n 'font-family': 'Lexend Deca, Helvetica, sans-serif',\n 'font-size': 12,\n 'overlay-padding': '6px',\n 'text-halign': 'center',\n 'text-outline-color': outlineColor,\n 'text-outline-width': '1px',\n 'text-valign': 'top',\n },\n})\n\nexport const NodeStyled = (icons: Record<CyNodeModuleTypes, string>, bgColor?: string, hideLabels = false): Stylesheet => ({\n selector: 'node',\n style: {\n 'background-color': bgColor,\n 'background-height': '75%',\n 'background-image': (elem) => icons[elem.data('type') as CyNodeModuleTypes],\n 'background-width': '24',\n label: hideLabels ? undefined : 'data(name)',\n shape: 'round-rectangle',\n },\n})\n\nexport const EdgeStyled = (lineColor?: string, targetArrowColor?: string) => ({\n selector: 'edge',\n style: {\n 'curve-style': 'bezier',\n 'line-color': lineColor,\n 'line-opacity': 0.1,\n 'target-arrow-color': targetArrowColor,\n 'target-arrow-shape': 'triangle',\n width: 3,\n },\n})\n","import { useTheme } from '@mui/material'\nimport { Core, NodeSingular } from 'cytoscape'\nimport { useCallback } from 'react'\n\nexport const usePopperListener = () => {\n const theme = useTheme()\n\n const popperListener = useCallback(\n (node: NodeSingular, hideLabels?: boolean, cy?: Core) => {\n const div = document.createElement('div')\n const shadowColor = theme.palette.getContrastText(theme.palette.text.primary)\n\n const popper = node.popper({\n content: () => {\n div.innerHTML = node.data().name\n div.style.opacity = '0'\n div.style.transition = 'opacity .25s'\n div.style.textShadow = `0 0 3px ${shadowColor}`\n\n document.body.appendChild(div)\n\n return div\n },\n })\n\n const update = async () => {\n await popper.update()\n }\n\n node.on('position', update)\n node.on('mouseover', () => (hideLabels ? (div.style.opacity = '1') : undefined))\n node.on('mouseout', () => (hideLabels ? (div.style.opacity = '0') : undefined))\n\n cy?.on('pan zoom resize', update)\n },\n [theme],\n )\n\n return popperListener\n}\n","import { useAsyncEffect } from '@xylabs/react-async-effect'\nimport { EventUnsubscribeFunction, ModuleInstance } from '@xyo-network/module'\nimport { isNodeInstance } from '@xyo-network/node-model'\nimport { ElementDefinition } from 'cytoscape'\nimport { useEffect, useState } from 'react'\n\nimport { CytoscapeElements } from '../../Cytoscape'\n\nexport const useCytoscapeElements = (module?: ModuleInstance | null) => {\n const [elements, setElements] = useState<ElementDefinition[]>([])\n\n useAsyncEffect(\n // eslint-disable-next-line react-hooks/exhaustive-deps\n async () => {\n if (module) {\n const newElements = (await CytoscapeElements.buildElements(module)) ?? []\n setElements(newElements)\n }\n },\n [module],\n )\n\n useEffect(() => {\n let attachedListener: EventUnsubscribeFunction | undefined = undefined\n let detachedListener: EventUnsubscribeFunction | undefined = undefined\n\n if (module && isNodeInstance(module)) {\n attachedListener = module.on('moduleAttached', async () => {\n const newElements = (await CytoscapeElements.buildElements(module)) ?? []\n setElements(newElements)\n })\n detachedListener = module.on('moduleDetached', async () => {\n const newElements = (await CytoscapeElements.buildElements(module)) ?? []\n setElements(newElements)\n })\n }\n\n return () => {\n attachedListener?.()\n detachedListener?.()\n }\n }, [module])\n\n return elements\n}\n","import { CytoscapeOptions } from 'cytoscape'\nimport { useMemo } from 'react'\n\nimport { ConcentricLayout } from '../../Cytoscape'\nimport { useCytoscapeStyle } from './useCytoscapeStyle'\n\nexport const useCytoscapeOptions = (\n elements: CytoscapeOptions['elements'],\n style?: CytoscapeOptions['style'],\n layout?: CytoscapeOptions['layout'],\n) => {\n const defaultStyle = useCytoscapeStyle()\n\n const options = useMemo<CytoscapeOptions | undefined>(() => {\n if (elements && layout && style) {\n return {\n elements,\n layout: layout ?? ConcentricLayout,\n style: style ?? defaultStyle,\n }\n }\n }, [elements, layout, style])\n\n return options\n}\n","import { useTheme } from '@mui/material'\nimport { CytoscapeOptions } from 'cytoscape'\nimport { useMemo } from 'react'\n\nimport { EdgeStyled, NodeIdStyles, NodeStyled } from '../../Cytoscape'\nimport { useIcons } from './useIcons'\n\nexport const useCytoscapeStyle = (hideLabels = false) => {\n const theme = useTheme()\n const icons = useIcons()\n\n const style: CytoscapeOptions['style'] = useMemo(\n () => [\n NodeIdStyles(theme.palette.text.primary, theme.palette.getContrastText(theme.palette.text.primary)),\n NodeStyled(icons, theme.palette.primary.main, hideLabels),\n EdgeStyled(theme.palette.divider, theme.palette.divider),\n ],\n [icons, hideLabels, theme],\n )\n\n return style\n}\n","import { useTheme } from '@mui/material'\nimport { useMemo } from 'react'\n\nimport { CyIconSet, CyNodeModuleTypes, encodeSvg, generateIconMap } from '../../Cytoscape'\n\nexport const useIcons = () => {\n const theme = useTheme()\n const icons = useMemo(() => {\n const iconMap = generateIconMap()\n return Object.entries(CyIconSet).reduce((acc, [name, IconComponent]) => {\n const icon = <IconComponent fontSize=\"small\" />\n acc[name as CyNodeModuleTypes] = encodeSvg(icon, theme.palette.getContrastText(theme.palette.text.primary))\n return acc\n }, iconMap)\n }, [theme.palette])\n\n return icons\n}\n","import { useModuleFromNode } from '@xyo-network/react-node'\nimport { NodeDataDefinition } from 'cytoscape'\nimport { useEffect, useState } from 'react'\n\nimport { useCytoscapeInstance } from '../../contexts'\nimport { useCytoscapeElements } from './useCytoscapeElements'\n\nexport const useNewElements = () => {\n const { cy } = useCytoscapeInstance(true)\n const [selectedElement, setSelectedElement] = useState<NodeDataDefinition>()\n const { address: selectedAddress } = selectedElement?.data() ?? {}\n const [module] = useModuleFromNode(selectedAddress)\n const newElements = useCytoscapeElements(module)\n\n useEffect(() => {\n if (selectedAddress) {\n const element = cy?.$(`node[id=\"${selectedAddress}\"]`)\n if (element?.length) cy?.center(element)\n }\n }, [cy, selectedAddress])\n\n return { newElements, setSelectedElement }\n}\n","import { ModuleInstance } from '@xyo-network/module'\nimport { useState } from 'react'\n\nimport { ColaLayout } from '../../Cytoscape'\nimport { useCytoscapeElements } from './useCytoscapeElements'\nimport { useCytoscapeOptions } from './useCytoscapeOptions'\nimport { useCytoscapeStyle } from './useCytoscapeStyle'\n\nexport const useRelationalGraphOptions = (module?: ModuleInstance) => {\n const [hideLabels, setHideLabels] = useState(false)\n\n const handleToggleLabels = () => {\n setHideLabels((oldValue) => !oldValue)\n }\n\n const elements = useCytoscapeElements(module)\n const style = useCytoscapeStyle(hideLabels)\n const options = useCytoscapeOptions(elements, style, ColaLayout)\n\n return { handleToggleLabels, hideLabels, options }\n}\n","import { use } from 'cytoscape'\nimport cola from 'cytoscape-cola'\nimport popper from 'cytoscape-popper'\nimport { PropsWithChildren, useEffect, useState } from 'react'\n\nexport const WithExtensions: React.FC<PropsWithChildren> = ({ children }) => {\n const [initialized, setInitialized] = useState(false)\n useEffect(() => {\n use(cola)\n use(popper)\n setInitialized(true)\n }, [])\n\n return <>{initialized ? children : undefined}</>\n}\n","import { Button, ButtonGroup, styled } from '@mui/material'\nimport { FlexCol, FlexRow } from '@xylabs/react-flexbox'\nimport { useShareForwardedRef } from '@xyo-network/react-shared'\nimport cytoscape, { Core } from 'cytoscape'\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { useCytoscapeInstance } from '../contexts'\nimport { NodeRelationalGraphProps } from './lib'\n\nexport const NodeRelationalGraphFlexBox = forwardRef<HTMLDivElement, NodeRelationalGraphProps>(({ actions, options, ...props }, ref) => {\n const [cy, setCy] = useState<Core>()\n const { setCy: setCyContext } = useCytoscapeInstance()\n const sharedRef = useShareForwardedRef(ref)\n\n const handleReset = () => {\n cy?.reset()\n cy?.fit(undefined, 20)\n }\n\n useEffect(() => {\n if (sharedRef) {\n const newCy = cytoscape({\n container: sharedRef.current,\n ...options,\n })\n setCy(newCy)\n }\n }, [options, sharedRef])\n\n useEffect(() => {\n setCyContext?.(cy)\n }, [cy, setCyContext])\n\n return (\n <FlexCol {...props}>\n <ActionsContainer>\n <ButtonGroup>\n {actions}\n <Button size={'small'} variant={'contained'} onClick={handleReset}>\n Reset\n </Button>\n </ButtonGroup>\n </ActionsContainer>\n {/* Cytoscape Element */}\n <FlexCol alignItems=\"stretch\" height=\"100%\" position=\"absolute\" ref={sharedRef} width=\"100%\"></FlexCol>\n </FlexCol>\n )\n})\n\nNodeRelationalGraphFlexBox.displayName = 'NodeRelationalGraph'\n\nconst ActionsContainer = styled(FlexRow, { name: 'ActionsContainer' })(({ theme }) => ({\n flexWrap: 'wrap',\n gap: theme.spacing(1),\n position: 'absolute',\n right: '10px',\n top: '10px',\n zIndex: 2,\n}))\n\n/** @deprecated */\nexport const NodeRelationalGraph = NodeRelationalGraphFlexBox\n"],"mappings":"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","names":["Button","useEffect","isNodeInstance","module","isNodeInstance","popper","isNodeInstance","useEffect","useEffect","isNodeInstance","useMemo","useTheme","useMemo","useTheme","useTheme","useTheme","useMemo","useMemo","useEffect","useState","useState","useEffect","useState","useState","useEffect","useState","jsx","useEffect","useState","jsx","useState","useEffect","jsx","useEffect","Button"]}