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