@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,8 +1,117 @@
1
+ // src/hooks/cytoscape/useCytoscapeElements.ts
1
2
  import { useAsyncEffect } from "@xylabs/react-async-effect";
2
- import { isNodeInstance } from "@xyo-network/node-model";
3
+ import { isNodeInstance as isNodeInstance3 } from "@xyo-network/node-model";
3
4
  import { useEffect, useState } from "react";
4
- import { CytoscapeElements } from "../../Cytoscape";
5
- const useCytoscapeElements = (module) => {
5
+
6
+ // src/Cytoscape/CytoscapeElements.ts
7
+ import { isNodeInstance as isNodeInstance2 } from "@xyo-network/node-model";
8
+
9
+ // src/Cytoscape/lib/parseModuleType.ts
10
+ import { isArchivistInstance } from "@xyo-network/archivist-model";
11
+ import { isBridgeInstance } from "@xyo-network/bridge-model";
12
+ import { isDivinerInstance } from "@xyo-network/diviner-model";
13
+ import { isNodeInstance } from "@xyo-network/node-model";
14
+ import { isSentinelInstance } from "@xyo-network/sentinel";
15
+ import { isWitnessModule } from "@xyo-network/witness";
16
+ var parseModuleType = (module) => {
17
+ let type = "module";
18
+ if (module) {
19
+ if (isArchivistInstance(module)) {
20
+ type = "archivist";
21
+ } else if (isBridgeInstance(module)) {
22
+ type = "bridge";
23
+ } else if (isDivinerInstance(module)) {
24
+ type = "diviner";
25
+ } else if (isNodeInstance(module)) {
26
+ type = "node";
27
+ } else if (isSentinelInstance(module)) {
28
+ type = "sentinel";
29
+ } else if (isWitnessModule(module)) {
30
+ type = "witness";
31
+ } else {
32
+ type = "module";
33
+ }
34
+ }
35
+ return type;
36
+ };
37
+
38
+ // src/Cytoscape/CytoscapeElements.ts
39
+ var CytoscapeElements = class _CytoscapeElements {
40
+ static MaxNameLength = 20;
41
+ static buildEdge(rootNode, newNode) {
42
+ return {
43
+ data: {
44
+ id: `${rootNode.data.id}/${newNode.data.id}`,
45
+ source: rootNode.data.id,
46
+ target: newNode.data.id
47
+ }
48
+ };
49
+ }
50
+ static async buildElements(module) {
51
+ const newRootNode = _CytoscapeElements.buildRootNode(module);
52
+ const newElements = [newRootNode];
53
+ try {
54
+ const childElements = await _CytoscapeElements.recurseNodes(module);
55
+ childElements?.forEach((module2) => {
56
+ const newNode = _CytoscapeElements.buildNode(module2, newRootNode.data.id);
57
+ newElements.push(newNode);
58
+ const newEdge = _CytoscapeElements.buildEdge(newRootNode, newNode);
59
+ newElements.push(newEdge);
60
+ });
61
+ return newElements;
62
+ } catch (e) {
63
+ console.error("error resolving modules", e);
64
+ return [];
65
+ }
66
+ }
67
+ static buildNode(module, rootNodeId) {
68
+ const { address, config } = module;
69
+ const normalizedName = config.name ?? address.substring(0, 8);
70
+ return {
71
+ data: {
72
+ address,
73
+ id: address,
74
+ name: normalizedName,
75
+ rootNodeId,
76
+ type: parseModuleType(module)
77
+ }
78
+ };
79
+ }
80
+ static buildRootNode = (module) => {
81
+ return _CytoscapeElements.buildNode(module);
82
+ };
83
+ static normalizeName(name) {
84
+ if (!name)
85
+ return;
86
+ if (name.length > this.MaxNameLength)
87
+ return `${name.substring(0, 20)}...`;
88
+ return name;
89
+ }
90
+ static async recurseNodes(module, maxTraversals = 1) {
91
+ let localDepth = 0;
92
+ const childModules = [];
93
+ const traverse = async (nestedNode) => {
94
+ if (localDepth < maxTraversals) {
95
+ const modules = await nestedNode.resolve(void 0, { direction: "down", maxDepth: 2 });
96
+ await Promise.all(
97
+ modules.map(async (child) => {
98
+ if (child !== nestedNode && isNodeInstance2(child)) {
99
+ localDepth++;
100
+ await traverse(child);
101
+ } else if (child !== module) {
102
+ childModules.push(child);
103
+ }
104
+ })
105
+ );
106
+ }
107
+ };
108
+ await traverse(module);
109
+ return childModules;
110
+ }
111
+ };
112
+
113
+ // src/hooks/cytoscape/useCytoscapeElements.ts
114
+ var useCytoscapeElements = (module) => {
6
115
  const [elements, setElements] = useState([]);
7
116
  useAsyncEffect(
8
117
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -17,7 +126,7 @@ const useCytoscapeElements = (module) => {
17
126
  useEffect(() => {
18
127
  let attachedListener = void 0;
19
128
  let detachedListener = void 0;
20
- if (module && isNodeInstance(module)) {
129
+ if (module && isNodeInstance3(module)) {
21
130
  attachedListener = module.on("moduleAttached", async () => {
22
131
  const newElements = await CytoscapeElements.buildElements(module) ?? [];
23
132
  setElements(newElements);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/hooks/cytoscape/useCytoscapeElements.ts"],"sourcesContent":["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"],"mappings":"AAAA,SAAS,sBAAsB;AAE/B,SAAS,sBAAsB;AAE/B,SAAS,WAAW,gBAAgB;AAEpC,SAAS,yBAAyB;AAE3B,MAAM,uBAAuB,CAAC,WAAmC;AACtE,QAAM,CAAC,UAAU,WAAW,IAAI,SAA8B,CAAC,CAAC;AAEhE;AAAA;AAAA,IAEE,YAAY;AACV,UAAI,QAAQ;AACV,cAAM,cAAe,MAAM,kBAAkB,cAAc,MAAM,KAAM,CAAC;AACxE,oBAAY,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,YAAU,MAAM;AACd,QAAI,mBAAyD;AAC7D,QAAI,mBAAyD;AAE7D,QAAI,UAAU,eAAe,MAAM,GAAG;AACpC,yBAAmB,OAAO,GAAG,kBAAkB,YAAY;AACzD,cAAM,cAAe,MAAM,kBAAkB,cAAc,MAAM,KAAM,CAAC;AACxE,oBAAY,WAAW;AAAA,MACzB,CAAC;AACD,yBAAmB,OAAO,GAAG,kBAAkB,YAAY;AACzD,cAAM,cAAe,MAAM,kBAAkB,cAAc,MAAM,KAAM,CAAC;AACxE,oBAAY,WAAW;AAAA,MACzB,CAAC;AAAA,IACH;AAEA,WAAO,MAAM;AACX,yBAAmB;AACnB,yBAAmB;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/hooks/cytoscape/useCytoscapeElements.ts","../../../../src/Cytoscape/CytoscapeElements.ts","../../../../src/Cytoscape/lib/parseModuleType.ts"],"sourcesContent":["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 { 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 { 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":"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","names":["isNodeInstance","isNodeInstance","module","isNodeInstance","isNodeInstance"]}
@@ -1,9 +1,141 @@
1
+ // src/hooks/cytoscape/useCytoscapeOptions.ts
2
+ import { useMemo as useMemo3 } from "react";
3
+
4
+ // src/Cytoscape/lib/encodeSvg.ts
5
+ import { renderToStaticMarkup } from "react-dom/server";
6
+ var dataUri = "data:image/svg+xml,";
7
+ var encodeSvg = (reactElement, color) => {
8
+ const svgString = renderToStaticMarkup(reactElement);
9
+ const doc = new DOMParser().parseFromString(svgString, "text/html");
10
+ const svgElement = doc.getElementsByTagName("svg")[0];
11
+ if (svgElement) {
12
+ svgElement.setAttribute("xmlns", "http://www.w3.org/2000/svg");
13
+ svgElement.setAttribute("height", "100");
14
+ svgElement.style.fill = color ?? "black";
15
+ }
16
+ return `${dataUri}${window.encodeURIComponent(svgElement.outerHTML)}`;
17
+ };
18
+
19
+ // src/Cytoscape/lib/iconMap.ts
20
+ var generateIconMap = () => ({
21
+ archivist: "",
22
+ bridge: "",
23
+ diviner: "",
24
+ module: "",
25
+ node: "",
26
+ sentinel: "",
27
+ witness: ""
28
+ });
29
+
30
+ // src/Cytoscape/lib/layout/ConcentricLayout.ts
31
+ var ConcentricLayout = {
32
+ concentric: function(node) {
33
+ return node.degree();
34
+ },
35
+ levelWidth: function() {
36
+ return 2;
37
+ },
38
+ minNodeSpacing: 75,
39
+ name: "concentric"
40
+ };
41
+
42
+ // src/Cytoscape/CytoscapeIcons.tsx
43
+ import {
44
+ BubbleChartRounded as BubbleChartRoundedIcon,
45
+ Hub as HubIcon,
46
+ InsertLinkRounded as InsertLinkRoundedIcon,
47
+ Inventory2Rounded as Inventory2RoundedIcon,
48
+ QuestionMarkRounded as QuestionMarkRoundedIcon,
49
+ TimerRounded as TimerRoundedIcon,
50
+ VisibilityRounded as VisibilityRoundedIcon
51
+ } from "@mui/icons-material";
52
+ var CyIconSet = {
53
+ archivist: Inventory2RoundedIcon,
54
+ bridge: InsertLinkRoundedIcon,
55
+ diviner: BubbleChartRoundedIcon,
56
+ module: QuestionMarkRoundedIcon,
57
+ node: HubIcon,
58
+ sentinel: TimerRoundedIcon,
59
+ witness: VisibilityRoundedIcon
60
+ };
61
+
62
+ // src/Cytoscape/CytoscapeStyles.ts
63
+ var NodeIdStyles = (color, outlineColor) => ({
64
+ selector: "node[name]",
65
+ style: {
66
+ color,
67
+ "font-family": "Lexend Deca, Helvetica, sans-serif",
68
+ "font-size": 12,
69
+ "overlay-padding": "6px",
70
+ "text-halign": "center",
71
+ "text-outline-color": outlineColor,
72
+ "text-outline-width": "1px",
73
+ "text-valign": "top"
74
+ }
75
+ });
76
+ var NodeStyled = (icons, bgColor, hideLabels = false) => ({
77
+ selector: "node",
78
+ style: {
79
+ "background-color": bgColor,
80
+ "background-height": "75%",
81
+ "background-image": (elem) => icons[elem.data("type")],
82
+ "background-width": "24",
83
+ label: hideLabels ? void 0 : "data(name)",
84
+ shape: "round-rectangle"
85
+ }
86
+ });
87
+ var EdgeStyled = (lineColor, targetArrowColor) => ({
88
+ selector: "edge",
89
+ style: {
90
+ "curve-style": "bezier",
91
+ "line-color": lineColor,
92
+ "line-opacity": 0.1,
93
+ "target-arrow-color": targetArrowColor,
94
+ "target-arrow-shape": "triangle",
95
+ width: 3
96
+ }
97
+ });
98
+
99
+ // src/hooks/cytoscape/useCytoscapeStyle.tsx
100
+ import { useTheme as useTheme2 } from "@mui/material";
101
+ import { useMemo as useMemo2 } from "react";
102
+
103
+ // src/hooks/cytoscape/useIcons.tsx
104
+ import { useTheme } from "@mui/material";
1
105
  import { useMemo } from "react";
2
- import { ConcentricLayout } from "../../Cytoscape";
3
- import { useCytoscapeStyle } from "./useCytoscapeStyle";
4
- const useCytoscapeOptions = (elements, style, layout) => {
106
+ import { jsx } from "react/jsx-runtime";
107
+ var useIcons = () => {
108
+ const theme = useTheme();
109
+ const icons = useMemo(() => {
110
+ const iconMap = generateIconMap();
111
+ return Object.entries(CyIconSet).reduce((acc, [name, IconComponent]) => {
112
+ const icon = /* @__PURE__ */ jsx(IconComponent, { fontSize: "small" });
113
+ acc[name] = encodeSvg(icon, theme.palette.getContrastText(theme.palette.text.primary));
114
+ return acc;
115
+ }, iconMap);
116
+ }, [theme.palette]);
117
+ return icons;
118
+ };
119
+
120
+ // src/hooks/cytoscape/useCytoscapeStyle.tsx
121
+ var useCytoscapeStyle = (hideLabels = false) => {
122
+ const theme = useTheme2();
123
+ const icons = useIcons();
124
+ const style = useMemo2(
125
+ () => [
126
+ NodeIdStyles(theme.palette.text.primary, theme.palette.getContrastText(theme.palette.text.primary)),
127
+ NodeStyled(icons, theme.palette.primary.main, hideLabels),
128
+ EdgeStyled(theme.palette.divider, theme.palette.divider)
129
+ ],
130
+ [icons, hideLabels, theme]
131
+ );
132
+ return style;
133
+ };
134
+
135
+ // src/hooks/cytoscape/useCytoscapeOptions.ts
136
+ var useCytoscapeOptions = (elements, style, layout) => {
5
137
  const defaultStyle = useCytoscapeStyle();
6
- const options = useMemo(() => {
138
+ const options = useMemo3(() => {
7
139
  if (elements && layout && style) {
8
140
  return {
9
141
  elements,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/hooks/cytoscape/useCytoscapeOptions.ts"],"sourcesContent":["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"],"mappings":"AACA,SAAS,eAAe;AAExB,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAE3B,MAAM,sBAAsB,CACjC,UACA,OACA,WACG;AACH,QAAM,eAAe,kBAAkB;AAEvC,QAAM,UAAU,QAAsC,MAAM;AAC1D,QAAI,YAAY,UAAU,OAAO;AAC/B,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,OAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,QAAQ,KAAK,CAAC;AAE5B,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/hooks/cytoscape/useCytoscapeOptions.ts","../../../../src/Cytoscape/lib/encodeSvg.ts","../../../../src/Cytoscape/lib/iconMap.ts","../../../../src/Cytoscape/lib/layout/ConcentricLayout.ts","../../../../src/Cytoscape/CytoscapeIcons.tsx","../../../../src/Cytoscape/CytoscapeStyles.ts","../../../../src/hooks/cytoscape/useCytoscapeStyle.tsx","../../../../src/hooks/cytoscape/useIcons.tsx"],"sourcesContent":["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 { 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","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 {\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 { 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"],"mappings":"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","names":["useMemo","useTheme","useMemo","useTheme","useMemo","useMemo"]}
@@ -1,11 +1,112 @@
1
+ // src/hooks/cytoscape/useCytoscapeStyle.tsx
2
+ import { useTheme as useTheme2 } from "@mui/material";
3
+ import { useMemo as useMemo2 } from "react";
4
+
5
+ // src/Cytoscape/lib/encodeSvg.ts
6
+ import { renderToStaticMarkup } from "react-dom/server";
7
+ var dataUri = "data:image/svg+xml,";
8
+ var encodeSvg = (reactElement, color) => {
9
+ const svgString = renderToStaticMarkup(reactElement);
10
+ const doc = new DOMParser().parseFromString(svgString, "text/html");
11
+ const svgElement = doc.getElementsByTagName("svg")[0];
12
+ if (svgElement) {
13
+ svgElement.setAttribute("xmlns", "http://www.w3.org/2000/svg");
14
+ svgElement.setAttribute("height", "100");
15
+ svgElement.style.fill = color ?? "black";
16
+ }
17
+ return `${dataUri}${window.encodeURIComponent(svgElement.outerHTML)}`;
18
+ };
19
+
20
+ // src/Cytoscape/lib/iconMap.ts
21
+ var generateIconMap = () => ({
22
+ archivist: "",
23
+ bridge: "",
24
+ diviner: "",
25
+ module: "",
26
+ node: "",
27
+ sentinel: "",
28
+ witness: ""
29
+ });
30
+
31
+ // src/Cytoscape/CytoscapeIcons.tsx
32
+ import {
33
+ BubbleChartRounded as BubbleChartRoundedIcon,
34
+ Hub as HubIcon,
35
+ InsertLinkRounded as InsertLinkRoundedIcon,
36
+ Inventory2Rounded as Inventory2RoundedIcon,
37
+ QuestionMarkRounded as QuestionMarkRoundedIcon,
38
+ TimerRounded as TimerRoundedIcon,
39
+ VisibilityRounded as VisibilityRoundedIcon
40
+ } from "@mui/icons-material";
41
+ var CyIconSet = {
42
+ archivist: Inventory2RoundedIcon,
43
+ bridge: InsertLinkRoundedIcon,
44
+ diviner: BubbleChartRoundedIcon,
45
+ module: QuestionMarkRoundedIcon,
46
+ node: HubIcon,
47
+ sentinel: TimerRoundedIcon,
48
+ witness: VisibilityRoundedIcon
49
+ };
50
+
51
+ // src/Cytoscape/CytoscapeStyles.ts
52
+ var NodeIdStyles = (color, outlineColor) => ({
53
+ selector: "node[name]",
54
+ style: {
55
+ color,
56
+ "font-family": "Lexend Deca, Helvetica, sans-serif",
57
+ "font-size": 12,
58
+ "overlay-padding": "6px",
59
+ "text-halign": "center",
60
+ "text-outline-color": outlineColor,
61
+ "text-outline-width": "1px",
62
+ "text-valign": "top"
63
+ }
64
+ });
65
+ var NodeStyled = (icons, bgColor, hideLabels = false) => ({
66
+ selector: "node",
67
+ style: {
68
+ "background-color": bgColor,
69
+ "background-height": "75%",
70
+ "background-image": (elem) => icons[elem.data("type")],
71
+ "background-width": "24",
72
+ label: hideLabels ? void 0 : "data(name)",
73
+ shape: "round-rectangle"
74
+ }
75
+ });
76
+ var EdgeStyled = (lineColor, targetArrowColor) => ({
77
+ selector: "edge",
78
+ style: {
79
+ "curve-style": "bezier",
80
+ "line-color": lineColor,
81
+ "line-opacity": 0.1,
82
+ "target-arrow-color": targetArrowColor,
83
+ "target-arrow-shape": "triangle",
84
+ width: 3
85
+ }
86
+ });
87
+
88
+ // src/hooks/cytoscape/useIcons.tsx
1
89
  import { useTheme } from "@mui/material";
2
90
  import { useMemo } from "react";
3
- import { EdgeStyled, NodeIdStyles, NodeStyled } from "../../Cytoscape";
4
- import { useIcons } from "./useIcons";
5
- const useCytoscapeStyle = (hideLabels = false) => {
91
+ import { jsx } from "react/jsx-runtime";
92
+ var useIcons = () => {
6
93
  const theme = useTheme();
94
+ const icons = useMemo(() => {
95
+ const iconMap = generateIconMap();
96
+ return Object.entries(CyIconSet).reduce((acc, [name, IconComponent]) => {
97
+ const icon = /* @__PURE__ */ jsx(IconComponent, { fontSize: "small" });
98
+ acc[name] = encodeSvg(icon, theme.palette.getContrastText(theme.palette.text.primary));
99
+ return acc;
100
+ }, iconMap);
101
+ }, [theme.palette]);
102
+ return icons;
103
+ };
104
+
105
+ // src/hooks/cytoscape/useCytoscapeStyle.tsx
106
+ var useCytoscapeStyle = (hideLabels = false) => {
107
+ const theme = useTheme2();
7
108
  const icons = useIcons();
8
- const style = useMemo(
109
+ const style = useMemo2(
9
110
  () => [
10
111
  NodeIdStyles(theme.palette.text.primary, theme.palette.getContrastText(theme.palette.text.primary)),
11
112
  NodeStyled(icons, theme.palette.primary.main, hideLabels),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/hooks/cytoscape/useCytoscapeStyle.tsx"],"sourcesContent":["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"],"mappings":"AAAA,SAAS,gBAAgB;AAEzB,SAAS,eAAe;AAExB,SAAS,YAAY,cAAc,kBAAkB;AACrD,SAAS,gBAAgB;AAElB,MAAM,oBAAoB,CAAC,aAAa,UAAU;AACvD,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,SAAS;AAEvB,QAAM,QAAmC;AAAA,IACvC,MAAM;AAAA,MACJ,aAAa,MAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,KAAK,OAAO,CAAC;AAAA,MAClG,WAAW,OAAO,MAAM,QAAQ,QAAQ,MAAM,UAAU;AAAA,MACxD,WAAW,MAAM,QAAQ,SAAS,MAAM,QAAQ,OAAO;AAAA,IACzD;AAAA,IACA,CAAC,OAAO,YAAY,KAAK;AAAA,EAC3B;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/hooks/cytoscape/useCytoscapeStyle.tsx","../../../../src/Cytoscape/lib/encodeSvg.ts","../../../../src/Cytoscape/lib/iconMap.ts","../../../../src/Cytoscape/CytoscapeIcons.tsx","../../../../src/Cytoscape/CytoscapeStyles.ts","../../../../src/hooks/cytoscape/useIcons.tsx"],"sourcesContent":["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 { 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","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 { 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"],"mappings":"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","names":["useTheme","useMemo","useTheme","useMemo"]}
@@ -1,8 +1,56 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ // src/hooks/cytoscape/useIcons.tsx
2
2
  import { useTheme } from "@mui/material";
3
3
  import { useMemo } from "react";
4
- import { CyIconSet, encodeSvg, generateIconMap } from "../../Cytoscape";
5
- const useIcons = () => {
4
+
5
+ // src/Cytoscape/lib/encodeSvg.ts
6
+ import { renderToStaticMarkup } from "react-dom/server";
7
+ var dataUri = "data:image/svg+xml,";
8
+ var encodeSvg = (reactElement, color) => {
9
+ const svgString = renderToStaticMarkup(reactElement);
10
+ const doc = new DOMParser().parseFromString(svgString, "text/html");
11
+ const svgElement = doc.getElementsByTagName("svg")[0];
12
+ if (svgElement) {
13
+ svgElement.setAttribute("xmlns", "http://www.w3.org/2000/svg");
14
+ svgElement.setAttribute("height", "100");
15
+ svgElement.style.fill = color ?? "black";
16
+ }
17
+ return `${dataUri}${window.encodeURIComponent(svgElement.outerHTML)}`;
18
+ };
19
+
20
+ // src/Cytoscape/lib/iconMap.ts
21
+ var generateIconMap = () => ({
22
+ archivist: "",
23
+ bridge: "",
24
+ diviner: "",
25
+ module: "",
26
+ node: "",
27
+ sentinel: "",
28
+ witness: ""
29
+ });
30
+
31
+ // src/Cytoscape/CytoscapeIcons.tsx
32
+ import {
33
+ BubbleChartRounded as BubbleChartRoundedIcon,
34
+ Hub as HubIcon,
35
+ InsertLinkRounded as InsertLinkRoundedIcon,
36
+ Inventory2Rounded as Inventory2RoundedIcon,
37
+ QuestionMarkRounded as QuestionMarkRoundedIcon,
38
+ TimerRounded as TimerRoundedIcon,
39
+ VisibilityRounded as VisibilityRoundedIcon
40
+ } from "@mui/icons-material";
41
+ var CyIconSet = {
42
+ archivist: Inventory2RoundedIcon,
43
+ bridge: InsertLinkRoundedIcon,
44
+ diviner: BubbleChartRoundedIcon,
45
+ module: QuestionMarkRoundedIcon,
46
+ node: HubIcon,
47
+ sentinel: TimerRoundedIcon,
48
+ witness: VisibilityRoundedIcon
49
+ };
50
+
51
+ // src/hooks/cytoscape/useIcons.tsx
52
+ import { jsx } from "react/jsx-runtime";
53
+ var useIcons = () => {
6
54
  const theme = useTheme();
7
55
  const icons = useMemo(() => {
8
56
  const iconMap = generateIconMap();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/hooks/cytoscape/useIcons.tsx"],"sourcesContent":["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"],"mappings":"AAUmB;AAVnB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,WAA8B,WAAW,uBAAuB;AAElE,MAAM,WAAW,MAAM;AAC5B,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,QAAQ,MAAM;AAC1B,UAAM,UAAU,gBAAgB;AAChC,WAAO,OAAO,QAAQ,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,aAAa,MAAM;AACtE,YAAM,OAAO,oBAAC,iBAAc,UAAS,SAAQ;AAC7C,UAAI,IAAyB,IAAI,UAAU,MAAM,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,KAAK,OAAO,CAAC;AAC1G,aAAO;AAAA,IACT,GAAG,OAAO;AAAA,EACZ,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/hooks/cytoscape/useIcons.tsx","../../../../src/Cytoscape/lib/encodeSvg.ts","../../../../src/Cytoscape/lib/iconMap.ts","../../../../src/Cytoscape/CytoscapeIcons.tsx"],"sourcesContent":["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 { 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","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"],"mappings":";AAAA,SAAS,gBAAgB;AACzB,SAAS,eAAe;;;ACCxB,SAAS,4BAA4B;AAErC,IAAM,UAAU;AAET,IAAM,YAAY,CAAC,cAA4B,UAAmB;AACvE,QAAM,YAAY,qBAAqB,YAAY;AAEnD,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,WAAW,WAAW;AAClE,QAAM,aAAa,IAAI,qBAAqB,KAAK,EAAE,CAAC;AACpD,MAAI,YAAY;AACd,eAAW,aAAa,SAAS,4BAA4B;AAC7D,eAAW,aAAa,UAAU,KAAK;AACvC,eAAW,MAAM,OAAO,SAAS;AAAA,EACnC;AAEA,SAAO,GAAG,OAAO,GAAG,OAAO,mBAAmB,WAAW,SAAS,CAAC;AACrE;;;AChBO,IAAM,kBAA2D,OAAO;AAAA,EAC7E,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;;;ACVA;AAAA,EACE,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,OAChB;AAOA,IAAM,YAAwF;AAAA,EACnG,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;;;AHbmB;AALZ,IAAM,WAAW,MAAM;AAC5B,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,QAAQ,MAAM;AAC1B,UAAM,UAAU,gBAAgB;AAChC,WAAO,OAAO,QAAQ,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,aAAa,MAAM;AACtE,YAAM,OAAO,oBAAC,iBAAc,UAAS,SAAQ;AAC7C,UAAI,IAAyB,IAAI,UAAU,MAAM,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,KAAK,OAAO,CAAC;AAC1G,aAAO;AAAA,IACT,GAAG,OAAO;AAAA,EACZ,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,SAAO;AACT;","names":[]}