@xyo-network/react-node-renderer 2.78.0 → 2.78.2

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,877 @@
1
- "use strict";var St=Object.create;var V=Object.defineProperty;var Mt=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var Ft=Object.getPrototypeOf,kt=Object.prototype.hasOwnProperty;var Bt=(e,o)=>{for(var t in o)V(e,t,{get:o[t],enumerable:!0})},Ne=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of wt(o))!kt.call(e,n)&&n!==t&&V(e,n,{get:()=>o[n],enumerable:!(r=Mt(o,n))||r.enumerable});return e};var v=(e,o,t)=>(t=e!=null?St(Ft(e)):{},Ne(o||!e||!e.__esModule?V(t,"default",{value:e,enumerable:!0}):t,e)),Dt=e=>Ne(V({},"__esModule",{value:!0}),e);var Vt={};Bt(Vt,{ColaLayout:()=>ie,ConcentricLayout:()=>W,CyIconSet:()=>le,CytoscapeElements:()=>E,CytoscapeInstanceContext:()=>L,CytoscapeInstanceProvider:()=>re,EdgeStyled:()=>me,ModuleCardParser:()=>Tt,ModuleGraphFlexBox:()=>Rt,ModuleGraphFlexBoxWithProvider:()=>Ut,Node:()=>ce,NodeAsRoot:()=>pe,NodeRelationalGraph:()=>Wt,NodeRelationalGraphFlexBox:()=>B,NodeWithName:()=>de,ProvidedNodeRenderer:()=>Ht,encodeSvg:()=>ne,generateIconMap:()=>se,parseModuleType:()=>ae,useCytoscapeElements:()=>F,useCytoscapeInstance:()=>N,useCytoscapeOptions:()=>H,useElements:()=>ue,useModuleDetails:()=>fe,useRelationalGraphOptions:()=>Ce});module.exports=Dt(Vt);var q=require("@xyo-network/archivist-model"),J=require("@xyo-network/diviner-model"),Ee=require("@xyo-network/react-archivist"),K=require("@xyo-network/react-module"),Q=require("react/jsx-runtime"),Tt=({mod:e})=>{switch(!0){case(0,q.isArchivistInstance)(e):return(0,Q.jsx)(Ee.ArchivistCard,{mod:(0,q.asArchivistInstance)(e)});case(0,J.isDivinerInstance)(e):return(0,Q.jsx)(K.DivinerCard,{mod:(0,J.asDivinerInstance)(e)});default:return(0,Q.jsx)(K.ModuleCard,{mod:e})}};var Et=require("@mui/material"),bt=require("react");var be=require("@xyo-network/react-shared"),L=(0,be.createContextEx)();var X=require("react");var Re=require("react/jsx-runtime"),re=({children:e,defaultInstance:o})=>{let[t,r]=(0,X.useState)(o);return(0,X.useEffect)(()=>{r(o)},[o]),(0,Re.jsx)(L.Provider,{value:{cy:t,provided:!0,setCy:r},children:e})};var Pe=require("@xyo-network/react-shared");var N=(e=!1)=>(0,Pe.useContextEx)(L,"CytoscapeInstance",e);var Ae=require("@xylabs/react-async-effect"),Ge=require("@xyo-network/node-model"),Y=require("react");var Te=require("@xylabs/exists");var Se=require("react-dom/server"),At="data:image/svg+xml,",ne=(e,o)=>{let t=(0,Se.renderToStaticMarkup)(e),n=new DOMParser().parseFromString(t,"text/html").querySelectorAll("svg")[0];return n&&(n.setAttribute("xmlns","http://www.w3.org/2000/svg"),n.setAttribute("height","100"),n.style.fill=o??"black"),`${At}${window.encodeURIComponent(n.outerHTML)}`};var se=()=>({archivist:"",bridge:"",diviner:"",module:"",node:"",sentinel:"",witness:""});var ie={centerGraph:!1,convergenceThreshold:.01,name:"cola"};var W={concentric:function(e){return e.degree(!1)},levelWidth:function(){return 2},minNodeSpacing:75,name:"concentric"};var Me=require("@xyo-network/archivist-model"),we=require("@xyo-network/bridge-model"),Fe=require("@xyo-network/diviner-model"),ke=require("@xyo-network/node-model"),Be=require("@xyo-network/sentinel-model"),De=require("@xyo-network/witness-model"),ae=e=>{let o="module";return e&&((0,Me.isArchivistInstance)(e)?o="archivist":(0,we.isBridgeInstance)(e)?o="bridge":(0,Fe.isDivinerInstance)(e)?o="diviner":(0,ke.isNodeInstance)(e)?o="node":(0,Be.isSentinelInstance)(e)?o="sentinel":(0,De.isWitnessModule)(e)?o="witness":o="module"),o};var E={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 E.recurseNodes(e);return await this.buildElementsFromInfo(o,void 0,["activeNode"])},async buildElementsFromInfo(e,o,t=[]){let r=E.buildNode(e.mod,{childCount:e.children.length,depth:e.depth},t),n=o?E.buildEdge(o,r,{depth:e.depth,siblingCount:e.children.length}):void 0,s=[r];n&&s.push(n);for(let i of e.children)s.push(...await this.buildElementsFromInfo(i,r));return s},buildNode(e,o,t){let{address:r,id:n}=e;return{classes:t,data:{address:r,id:r,name:n,type:ae(e),...o}}},buildRootNode:e=>E.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 r={children:[],depth:t,mod:e};if(o>0){let n=await e.resolve("*",{direction:"down",maxDepth:1});r.children=(await Promise.all(n.map(async s=>{if(s.address!==e.address)return await this.recurseNodes(s,o-1,t+1)}))).filter(Te.exists)}return r}};var C=require("@mui/icons-material"),le={archivist:C.Inventory2Rounded,bridge:C.InsertLinkRounded,diviner:C.BubbleChartRounded,module:C.QuestionMarkRounded,node:C.Hub,sentinel:C.TimerRounded,witness:C.VisibilityRounded};var de=(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"}}),ce=(e,o,t=!1)=>({selector:"node",style:{"background-color":o,"background-height":"75%","background-image":r=>e[r.data("type")],"background-width":"24",label:t?void 0:"data(name)",shape:"round-rectangle"}}),pe=e=>({selector:".activeNode",style:{"background-color":e}}),me=(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 F=e=>{let[o,t]=(0,Y.useState)([]);return(0,Ae.useAsyncEffect)(async()=>{let r=e==null?void 0:e.deref();if(r){let n=await E.buildElements(r)??[];t(n)}},[e]),(0,Y.useEffect)(()=>{let r,n;return e&&(0,Ge.isNodeInstance)(e)&&(r=e.on("moduleAttached",async()=>{let s=await E.buildElements(e)??[];t(s)}),n=e.on("moduleDetached",async()=>{let s=await E.buildElements(e)??[];t(s)})),()=>{r==null||r(),n==null||n()}},[e]),o};var k=require("react");var Le=e=>{let{cy:o}=N(!0),[t,r]=(0,k.useState)(),n=(0,k.useCallback)(s=>{s.on("mouseover tap",()=>{r(s)})},[]);return(0,k.useEffect)(()=>{e&&e.nodes().forEach(n)},[n,e]),(0,k.useEffect)(()=>{var s;(s=o==null?void 0:o.deref())==null||s.ready(()=>{var i;(i=o==null?void 0:o.deref())==null||i.nodes().forEach(n)})},[o,n]),[t,r]};var We=require("@xyo-network/react-node"),He=require("react");var ze=e=>{let o=(0,He.useMemo)(()=>{let{address:n}=(e==null?void 0:e.data())??{};return n},[e]),[t]=(0,We.useWeakModuleFromNode)(o);return F(t)};var Z=require("react");var Oe=(e=[],o)=>{let{cy:t}=N(!0),[r,n]=(0,Z.useState)();return(0,Z.useEffect)(()=>{var s,i;if(e.length>1){let a=(s=t==null?void 0:t.deref())==null?void 0:s.add(e);n(a),(i=t==null?void 0:t.deref())==null||i.layout(ie).run()}},[t,o,e]),r};var $e=require("react");var Ue=()=>{let[e,o]=(0,$e.useState)(),{cy:t}=N(!0),r=s=>{var a;let i=(a=t==null?void 0:t.deref())==null?void 0:a.nodes();i==null||i.toggleClass("activeNode",!1),s.toggleClass("activeNode",!0)};return{selectedElement:e,toggleSelectedElement:s=>{var a,l;let i=(l=(a=t==null?void 0:t.deref())==null?void 0:a.nodes(`[id="${s}"]`))==null?void 0:l[0];i&&(o(i),r(i))}}};var ue=e=>{let{selectedElement:o,toggleSelectedElement:t}=Ue(),r=ze(o),n=Oe(r,e),[s,i]=Le(n);return{hoveredNode:s,setHoveredNode:i,toggleSelectedElement:t}};var Ye=require("react");var Ke=require("@mui/material"),Xe=require("react");var Ve=require("@mui/material"),Qe=require("react");var Je=require("react/jsx-runtime"),qe=()=>{let e=(0,Ve.useTheme)();return(0,Qe.useMemo)(()=>{let t=se();return Object.entries(le).reduce((r,[n,s])=>{let i=(0,Je.jsx)(s,{fontSize:"small"});return r[n]=ne(i,e.palette.getContrastText(e.palette.text.primary)),r},t)},[e.palette])};var _=(e=!1)=>{let o=(0,Ke.useTheme)(),t=qe();return(0,Xe.useMemo)(()=>[ce(t,o.palette.primary.main,e),de(o.palette.text.primary,o.palette.getContrastText(o.palette.text.primary)),pe(o.palette.secondary.main),me(o.palette.divider,o.palette.divider)],[t,e,o])};var H=(e,o,t)=>{let r=_(),n=t??W,s=o??r;return(0,Ye.useMemo)(()=>{if(e&&n&&s)return{elements:e,layout:n,style:s}},[e,t,o])};var Ze=require("@xylabs/react-promise"),z=require("react");var fe=(e,o)=>{let{cy:t}=N(),[r,n]=(0,z.useState)(),[s]=(0,Ze.usePromise)(async()=>{if(r===null)return null;let a=e==null?void 0:e.deref();if(r&&a)return await a.resolve(r)??null},[r,e]);return(0,z.useEffect)(()=>{var I;let a=new ResizeObserver(()=>{var h,f;if(r===null)setTimeout(()=>{var d;(d=t==null?void 0:t.deref())==null||d.center()},100);else if(s&&t){let d=(f=(h=t==null?void 0:t.deref())==null?void 0:h.nodes(`[id="${r}"]`))==null?void 0:f[0];setTimeout(()=>{var y;(y=t==null?void 0:t.deref())==null||y.center(d)},100)}}),l=(I=t==null?void 0:t.deref())==null?void 0:I.container();return l&&a.observe(l),()=>{l&&a.unobserve(l)}},[t,r,s,e]),(0,z.useEffect)(()=>{s&&(o==null||o())},[t,r,s,o]),{mod:s,onModuleDetails:a=>{var d,y,D,T,$;let l=(d=t==null?void 0:t.deref())==null?void 0:d.nodes(`[id="${a}"]`),I=(D=t==null?void 0:t.deref())==null?void 0:D.nodes(`[id="${(y=e==null?void 0:e.deref())==null?void 0:y.address}"]`),h=(T=t==null?void 0:t.deref())==null?void 0:T.nodes(`[id="${s==null?void 0:s.address}"]`),f=($=t==null?void 0:t.deref())==null?void 0:$.nodes(`[id != "${a}"]`);if(a)l==null||l.toggleClass("activeNode",!0),f==null||f.toggleClass("activeNode",!1);else{f==null||f.toggleClass("activeNode",!1);let M=h!=null&&h.length?h:I;M==null||M.toggleClass("activeNode",!0)}n(a)}}};var _e=require("react");var Ce=e=>{let[o,t]=(0,_e.useState)(!0),r=()=>{t(a=>!a)},n=F(e),s=_(o),i=H(n,s,W);return{handleToggleLabels:r,hideLabels:o,options:i}};var O=v(require("cytoscape"),1),je=v(require("cytoscape-cola"),1),et=v(require("cytoscape-cose-bilkent"),1),tt=v(require("cytoscape-dagre"),1),ot=v(require("cytoscape-euler"),1),j=require("react"),ee=require("react/jsx-runtime"),rt=({children:e})=>{let[o,t]=(0,j.useState)(!1);return(0,j.useEffect)(()=>{O.default.use(je.default),O.default.use(tt.default),O.default.use(et.default),O.default.use(ot.default),t(!0)},[]),(0,ee.jsx)(ee.Fragment,{children:o?e:void 0})};var m=require("@mui/material"),ge=require("@xylabs/hex"),b=require("@xylabs/react-flexbox"),st=require("@xylabs/react-identicon"),it=require("@xyo-network/react-node"),A=v(require("cytoscape"),1),at=v(require("cytoscape-cola"),1),lt=v(require("cytoscape-cose-bilkent"),1),dt=v(require("cytoscape-dagre"),1),ct=v(require("cytoscape-euler"),1),g=require("react"),p=require("react/jsx-runtime"),nt=(e,o="cola",t)=>{e==null||e.layout({name:o,...t}).run()},Gt=(e="cola")=>{switch(e){case"dagre":{A.default.use(dt.default);break}case"euler":{A.default.use(ct.default);break}case"cose-bilkent":{A.default.use(lt.default);break}case"cola":{A.default.use(at.default);break}}},Lt=({name:e,address:o,...t})=>(0,p.jsx)(m.Card,{elevation:3,...t,children:(0,p.jsx)(m.CardHeader,{avatar:(0,p.jsx)(m.Paper,{elevation:6,sx:{bgcolor:"#fff",p:1},children:(0,p.jsx)(st.Identicon,{value:o,size:24})}),title:e,subheader:o})}),B=(0,g.forwardRef)(({actions:e,children:o,node:t,layout:r,layoutOptions:n,showDetails:s,detail:i,options:a,onHover:l,...I},h)=>{var ye;let f=(0,m.useTheme)(),[d,y]=(0,g.useState)(),D=(0,g.useRef)(),[T,$]=(0,g.useState)(),[M,he]=(0,g.useState)(),[oe]=(0,it.useWeakModuleFromNode)(M,{node:t});(0,g.useEffect)(()=>{d==null||d.on("mouseover tap",({target:w})=>{var ve,Ie;let x=w,Pt=(ve=x==null?void 0:x.renderedBoundingBox)==null?void 0:ve.call(x);$(Pt);let U=(Ie=x.id)==null?void 0:Ie.call(x);U&&(U.includes("/")?(he(void 0),l==null||l()):(he((0,ge.asAddress)(U)),l==null||l((0,ge.asAddress)(U))))})},[l,d]);let xe=()=>{d==null||d.reset(),nt(d,r??"euler",n)};return(0,g.useEffect)(()=>{let w,x=D.current;return x&&(w=(0,A.default)({container:x,...a}),y(w)),()=>{w==null||w.destroy(),y(void 0)}},[a,D,n]),(0,g.useEffect)(()=>{d&&(Gt(r),nt(d,r??"euler",n))},[d,n,r]),(0,p.jsxs)(b.FlexCol,{id:"relational-graph-wrapper",ref:h,...I,children:[M&&T?(0,p.jsx)(m.Box,{position:"absolute",top:T.y1,left:T.x1,zIndex:100,children:(0,p.jsx)(Lt,{address:M,name:((ye=oe==null?void 0:oe.deref())==null?void 0:ye.id)??"Unknown"})}):null,(0,p.jsx)(b.FlexRow,{justifyContent:"start",width:"100%",children:e===null?null:e?(0,p.jsxs)(m.ButtonGroup,{children:[e,(0,p.jsx)(m.Button,{size:"small",variant:"contained",onClick:xe,children:"Reset View"})]}):(0,p.jsx)(m.Button,{size:"small",variant:"contained",onClick:xe,children:"Reset"})}),(0,p.jsxs)(b.FlexGrowRow,{width:"100%",alignItems:"start",children:[s?(0,p.jsx)(b.FlexCol,{height:"100%",width:"85%",children:i}):null,(0,p.jsxs)(b.FlexCol,{justifyContent:"start",classes:"cytoscape-wrap",width:s?"15%":"100%",height:s?"50%":"100%",border:s?`1px solid ${f.palette.divider}`:void 0,children:[(0,p.jsx)(b.FlexCol,{alignItems:"stretch",position:"absolute",width:"100%",height:"100%",ref:D}),o]})]})]})});B.displayName="NodeRelationalGraph";var Wt=B;var pt=require("@xyo-network/react-node");var mt=require("react/jsx-runtime"),Ht=({node:e,...o})=>{let[t]=(0,pt.useWeakProvidedNode)(),r=F(e??t),n=H(r);return(0,mt.jsx)(B,{alignItems:"stretch",flexGrow:1,height:"100%",options:n,...o})};var ut=require("@mui/icons-material"),ft=require("@mui/material"),te=require("@xylabs/react-flexbox"),G=require("react/jsx-runtime"),Ct=({children:e,onClose:o})=>(0,G.jsxs)(te.FlexGrowCol,{alignItems:"end",justifyContent:"start",id:"module-detail",width:"100%",p:2,gap:2,children:[(0,G.jsx)(te.FlexRow,{justifyContent:"end",children:(0,G.jsx)(ft.IconButton,{onClick:o,size:"small",children:(0,G.jsx)(ut.CancelRounded,{})})}),e]});var ht=require("@mui/material"),xt=require("@xylabs/react-flexbox");var R=require("react"),gt=e=>{let o=(0,R.useRef)(null),[t,r]=(0,R.useState)(null),[n,s]=(0,R.useState)(e==null?void 0:e.renderedBoundingBox());return(0,R.useEffect)(()=>{r(null)},[e]),(0,R.useEffect)(()=>{e&&s(e.renderedBoundingBox());let i=()=>{s(e==null?void 0:e.renderedBoundingBox())};return e==null||e.on("position",i),()=>{e==null||e.off("position",void 0,i)}},[e]),(0,R.useEffect)(()=>{r(o.current)},[n]),{boundingBox:n,currentElement:t,ref:o}};var S=require("react/jsx-runtime"),yt=({children:e,node:o})=>{let{boundingBox:t,ref:r,currentElement:n}=gt(o);return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(zt,{ref:r,left:t==null?void 0:t.x1,height:t==null?void 0:t.h,top:t==null?void 0:t.y1,width:t==null?void 0:t.w}),o?(0,S.jsx)(S.Fragment,{children:e==null?void 0:e(n)}):null]})},zt=(0,ht.styled)(xt.FlexCol,{name:"StyledNodeGhostElementFlexCol"})(()=>({cursor:"pointer",pointerEvents:"none",position:"absolute"}));var vt=require("@mui/icons-material"),c=require("@mui/material"),It=require("@xylabs/react-identicon"),u=require("react/jsx-runtime"),Ot=({anchorEl:e,onClose:o,onModuleDetails:t,onModuleExplore:r,node:n,...s})=>{let{address:i,name:a}=(n==null?void 0:n.data())??{};return(0,u.jsx)(u.Fragment,{children:e?(0,u.jsx)(c.Popper,{anchorEl:e,...s,children:(0,u.jsxs)(c.Card,{elevation:3,children:[(0,u.jsx)(c.CardHeader,{action:o?(0,u.jsx)(c.IconButton,{size:"small",onClick:o,children:(0,u.jsx)(vt.CancelRounded,{})}):null,avatar:(0,u.jsx)(c.Paper,{elevation:6,sx:{bgcolor:"#fff",p:1},children:(0,u.jsx)(It.Identicon,{value:i,size:24})}),title:a,subheader:i}),(0,u.jsxs)($t,{children:[t?(0,u.jsx)(c.Button,{onClick:()=>t==null?void 0:t(i),size:"small",variant:"contained",children:"Details"}):null,r?(0,u.jsx)(c.Button,{onClick:()=>r==null?void 0:r(i),size:"small",variant:"contained",children:"Explore"}):null]})]})}):null})},Nt=(0,c.styled)(Ot,{name:"StyledComponents"})(()=>({zIndex:2})),$t=(0,c.styled)(c.CardActions,{name:"StyledCardActions"})(()=>({display:"flex",justifyContent:"center"}));var P=require("react/jsx-runtime"),Rt=({hideActions:e,rootModule:o,disableModuleDetails:t,...r})=>{let n=(0,bt.useRef)(null),{handleToggleLabels:s,hideLabels:i,options:a}=Ce(o??void 0),{hoveredNode:l,setHoveredNode:I,toggleSelectedElement:h}=ue(i),{mod:f,onModuleDetails:d}=fe(o,()=>I(void 0));return(0,P.jsx)(rt,{children:(0,P.jsx)(B,{actions:f||e?null:(0,P.jsx)(Et.Button,{size:"small",onClick:s,variant:"contained",children:"Toggle Labels"}),showDetails:!!f,detail:(0,P.jsx)(Ct,{onClose:()=>d(null)}),options:a,ref:n,width:"100%",...r,children:(0,P.jsx)(yt,{node:l,children:y=>(0,P.jsx)(Nt,{anchorEl:y,container:n.current,node:l,onClose:()=>I(void 0),onModuleExplore:h,onModuleDetails:t?void 0:d,placement:"top",open:!0})})})})},Ut=e=>(0,P.jsx)(re,{children:(0,P.jsx)(Rt,{...e})});0&&(module.exports={ColaLayout,ConcentricLayout,CyIconSet,CytoscapeElements,CytoscapeInstanceContext,CytoscapeInstanceProvider,EdgeStyled,ModuleCardParser,ModuleGraphFlexBox,ModuleGraphFlexBoxWithProvider,Node,NodeAsRoot,NodeRelationalGraph,NodeRelationalGraphFlexBox,NodeWithName,ProvidedNodeRenderer,encodeSvg,generateIconMap,parseModuleType,useCytoscapeElements,useCytoscapeInstance,useCytoscapeOptions,useElements,useModuleDetails,useRelationalGraphOptions});
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 == null ? void 0 : 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 == null ? void 0 : attachedListener();
339
+ detachedListener == null ? void 0 : 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
+ var _a;
362
+ (_a = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a.ready(() => {
363
+ var _a2;
364
+ (_a2 = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a2.nodes().forEach(nodeListener);
365
+ });
366
+ }, [cy, nodeListener]);
367
+ return [hoveredNode, setHoveredNode];
368
+ };
369
+
370
+ // src/hooks/cytoscape/elements/useNewElements.tsx
371
+ var import_react_node = require("@xyo-network/react-node");
372
+ var import_react4 = require("react");
373
+ var useNewElements = (selectedElement) => {
374
+ const selectedAddress = (0, import_react4.useMemo)(() => {
375
+ const { address: selectedAddress2 } = (selectedElement == null ? void 0 : selectedElement.data()) ?? {};
376
+ return selectedAddress2;
377
+ }, [selectedElement]);
378
+ const [mod] = (0, import_react_node.useWeakModuleFromNode)(selectedAddress);
379
+ const newElements = useCytoscapeElements(mod);
380
+ return newElements;
381
+ };
382
+
383
+ // src/hooks/cytoscape/elements/useRenderNewElements.tsx
384
+ var import_react5 = require("react");
385
+ var useRenderNewElements = (newElements = [], hideLabels) => {
386
+ const { cy } = useCytoscapeInstance(true);
387
+ const [renderedElements, setRenderedElements] = (0, import_react5.useState)();
388
+ (0, import_react5.useEffect)(() => {
389
+ var _a, _b;
390
+ if (newElements.length > 1) {
391
+ const renderedElements2 = (_a = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a.add(newElements);
392
+ setRenderedElements(renderedElements2);
393
+ (_b = cy == null ? void 0 : cy.deref()) == null ? void 0 : _b.layout(ColaLayout).run();
394
+ }
395
+ }, [cy, hideLabels, newElements]);
396
+ return renderedElements;
397
+ };
398
+
399
+ // src/hooks/cytoscape/elements/useSelectedElement.tsx
400
+ var import_react6 = require("react");
401
+ var useSelectedElement = () => {
402
+ const [selectedElement, setSelectedElement] = (0, import_react6.useState)();
403
+ const { cy } = useCytoscapeInstance(true);
404
+ const updateStyles = (element) => {
405
+ var _a;
406
+ const nodes = (_a = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a.nodes();
407
+ nodes == null ? void 0 : nodes.toggleClass("activeNode", false);
408
+ element.toggleClass("activeNode", true);
409
+ };
410
+ const toggleSelectedElement = (address) => {
411
+ var _a, _b;
412
+ const selectedNode = (_b = (_a = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a.nodes(`[id="${address}"]`)) == null ? void 0 : _b[0];
413
+ if (selectedNode) {
414
+ setSelectedElement(selectedNode);
415
+ updateStyles(selectedNode);
416
+ }
417
+ };
418
+ return { selectedElement, toggleSelectedElement };
419
+ };
420
+
421
+ // src/hooks/cytoscape/elements/useElements.tsx
422
+ var useElements = (hideLabels) => {
423
+ const { selectedElement, toggleSelectedElement } = useSelectedElement();
424
+ const newElements = useNewElements(selectedElement);
425
+ const renderedElements = useRenderNewElements(newElements, hideLabels);
426
+ const [hoveredNode, setHoveredNode] = useHoveredNode(renderedElements);
427
+ return { hoveredNode, setHoveredNode, toggleSelectedElement };
428
+ };
429
+
430
+ // src/hooks/cytoscape/useCytoscapeOptions.ts
431
+ var import_react9 = require("react");
432
+
433
+ // src/hooks/cytoscape/useCytoscapeStyle.tsx
434
+ var import_material2 = require("@mui/material");
435
+ var import_react8 = require("react");
436
+
437
+ // src/hooks/cytoscape/useIcons.tsx
438
+ var import_material = require("@mui/material");
439
+ var import_react7 = require("react");
440
+ var import_jsx_runtime3 = require("react/jsx-runtime");
441
+ var useIcons = () => {
442
+ const theme = (0, import_material.useTheme)();
443
+ const icons = (0, import_react7.useMemo)(() => {
444
+ const iconMap = generateIconMap();
445
+ return Object.entries(CyIconSet).reduce((acc, [name, IconComponent]) => {
446
+ const icon = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(IconComponent, { fontSize: "small" });
447
+ acc[name] = encodeSvg(icon, theme.palette.getContrastText(theme.palette.text.primary));
448
+ return acc;
449
+ }, iconMap);
450
+ }, [theme.palette]);
451
+ return icons;
452
+ };
453
+
454
+ // src/hooks/cytoscape/useCytoscapeStyle.tsx
455
+ var useCytoscapeStyle = (hideLabels = false) => {
456
+ const theme = (0, import_material2.useTheme)();
457
+ const icons = useIcons();
458
+ const style = (0, import_react8.useMemo)(
459
+ () => [
460
+ Node(icons, theme.palette.primary.main, hideLabels),
461
+ NodeWithName(theme.palette.text.primary, theme.palette.getContrastText(theme.palette.text.primary)),
462
+ NodeAsRoot(theme.palette.secondary.main),
463
+ EdgeStyled(theme.palette.divider, theme.palette.divider)
464
+ ],
465
+ [icons, hideLabels, theme]
466
+ );
467
+ return style;
468
+ };
469
+
470
+ // src/hooks/cytoscape/useCytoscapeOptions.ts
471
+ var useCytoscapeOptions = (elements, style, layout) => {
472
+ const defaultStyle = useCytoscapeStyle();
473
+ const resolvedLayout = layout ?? ConcentricLayout;
474
+ const resolvedStyle = style ?? defaultStyle;
475
+ const options = (0, import_react9.useMemo)(() => {
476
+ if (elements && resolvedLayout && resolvedStyle) {
477
+ return {
478
+ elements,
479
+ layout: resolvedLayout,
480
+ style: resolvedStyle
481
+ };
482
+ }
483
+ }, [elements, layout, style]);
484
+ return options;
485
+ };
486
+
487
+ // src/hooks/cytoscape/useModuleDetails.tsx
488
+ var import_react_promise = require("@xylabs/react-promise");
489
+ var import_react10 = require("react");
490
+ var useModuleDetails = (rootModule, onFoundModule) => {
491
+ const { cy } = useCytoscapeInstance();
492
+ const [moduleAddress, setModuleAddress] = (0, import_react10.useState)();
493
+ const [foundModule] = (0, import_react_promise.usePromise)(async () => {
494
+ if (moduleAddress === null) return null;
495
+ const rootModuleInstance = rootModule == null ? void 0 : rootModule.deref();
496
+ if (moduleAddress && rootModuleInstance) {
497
+ const foundModule2 = await rootModuleInstance.resolve(moduleAddress);
498
+ return foundModule2 ?? null;
499
+ }
500
+ }, [moduleAddress, rootModule]);
501
+ (0, import_react10.useEffect)(() => {
502
+ var _a;
503
+ const resizeObserver = new ResizeObserver(() => {
504
+ var _a2, _b;
505
+ if (moduleAddress === null) {
506
+ setTimeout(() => {
507
+ var _a3;
508
+ (_a3 = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a3.center();
509
+ }, 100);
510
+ } else if (foundModule && cy) {
511
+ const node = (_b = (_a2 = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a2.nodes(`[id="${moduleAddress}"]`)) == null ? void 0 : _b[0];
512
+ setTimeout(() => {
513
+ var _a3;
514
+ (_a3 = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a3.center(node);
515
+ }, 100);
516
+ }
517
+ });
518
+ const container = (_a = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a.container();
519
+ if (container) {
520
+ resizeObserver.observe(container);
521
+ }
522
+ return () => {
523
+ if (container) resizeObserver.unobserve(container);
524
+ };
525
+ }, [cy, moduleAddress, foundModule, rootModule]);
526
+ (0, import_react10.useEffect)(() => {
527
+ if (foundModule) {
528
+ onFoundModule == null ? void 0 : onFoundModule();
529
+ }
530
+ }, [cy, moduleAddress, foundModule, onFoundModule]);
531
+ const onModuleDetails = (address) => {
532
+ var _a, _b, _c, _d, _e;
533
+ const moduleNode = (_a = cy == null ? void 0 : cy.deref()) == null ? void 0 : _a.nodes(`[id="${address}"]`);
534
+ const rootModuleNode = (_c = cy == null ? void 0 : cy.deref()) == null ? void 0 : _c.nodes(`[id="${(_b = rootModule == null ? void 0 : rootModule.deref()) == null ? void 0 : _b.address}"]`);
535
+ const foundModuleNode = (_d = cy == null ? void 0 : cy.deref()) == null ? void 0 : _d.nodes(`[id="${foundModule == null ? void 0 : foundModule.address}"]`);
536
+ const notModuleNode = (_e = cy == null ? void 0 : cy.deref()) == null ? void 0 : _e.nodes(`[id != "${address}"]`);
537
+ if (address) {
538
+ moduleNode == null ? void 0 : moduleNode.toggleClass("activeNode", true);
539
+ notModuleNode == null ? void 0 : notModuleNode.toggleClass("activeNode", false);
540
+ } else {
541
+ notModuleNode == null ? void 0 : notModuleNode.toggleClass("activeNode", false);
542
+ const activeNode = (foundModuleNode == null ? void 0 : foundModuleNode.length) ? foundModuleNode : rootModuleNode;
543
+ activeNode == null ? void 0 : activeNode.toggleClass("activeNode", true);
544
+ }
545
+ setModuleAddress(address);
546
+ };
547
+ return { mod: foundModule, onModuleDetails };
548
+ };
549
+
550
+ // src/hooks/cytoscape/useRelationalGraphOptions.tsx
551
+ var import_react11 = require("react");
552
+ var useRelationalGraphOptions = (mod) => {
553
+ const [hideLabels, setHideLabels] = (0, import_react11.useState)(true);
554
+ const handleToggleLabels = () => {
555
+ setHideLabels((oldValue) => !oldValue);
556
+ };
557
+ const elements = useCytoscapeElements(mod);
558
+ const style = useCytoscapeStyle(hideLabels);
559
+ const options = useCytoscapeOptions(elements, style, ConcentricLayout);
560
+ return { handleToggleLabels, hideLabels, options };
561
+ };
562
+
563
+ // src/components/cytoscape-extensions/WithExtensions.tsx
564
+ var import_cytoscape = __toESM(require("cytoscape"), 1);
565
+ var import_cytoscape_cola = __toESM(require("cytoscape-cola"), 1);
566
+ var import_cytoscape_cose_bilkent = __toESM(require("cytoscape-cose-bilkent"), 1);
567
+ var import_cytoscape_dagre = __toESM(require("cytoscape-dagre"), 1);
568
+ var import_cytoscape_euler = __toESM(require("cytoscape-euler"), 1);
569
+ var import_react12 = require("react");
570
+ var import_jsx_runtime4 = require("react/jsx-runtime");
571
+ var WithExtensions = ({ children }) => {
572
+ const [initialized, setInitialized] = (0, import_react12.useState)(false);
573
+ (0, import_react12.useEffect)(() => {
574
+ import_cytoscape.default.use(import_cytoscape_cola.default);
575
+ import_cytoscape.default.use(import_cytoscape_dagre.default);
576
+ import_cytoscape.default.use(import_cytoscape_cose_bilkent.default);
577
+ import_cytoscape.default.use(import_cytoscape_euler.default);
578
+ setInitialized(true);
579
+ }, []);
580
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, { children: initialized ? children : void 0 });
581
+ };
582
+
583
+ // src/components/relational/graph/Graph.tsx
584
+ var import_material3 = require("@mui/material");
585
+ var import_hex = require("@xylabs/hex");
586
+ var import_react_flexbox = require("@xylabs/react-flexbox");
587
+ var import_react_identicon = require("@xylabs/react-identicon");
588
+ var import_react_node2 = require("@xyo-network/react-node");
589
+ var import_cytoscape2 = __toESM(require("cytoscape"), 1);
590
+ var import_cytoscape_cola2 = __toESM(require("cytoscape-cola"), 1);
591
+ var import_cytoscape_cose_bilkent2 = __toESM(require("cytoscape-cose-bilkent"), 1);
592
+ var import_cytoscape_dagre2 = __toESM(require("cytoscape-dagre"), 1);
593
+ var import_cytoscape_euler2 = __toESM(require("cytoscape-euler"), 1);
594
+ var import_react13 = require("react");
595
+ var import_jsx_runtime5 = require("react/jsx-runtime");
596
+ var applyLayout = (cy, name = "cola", options) => {
597
+ cy == null ? void 0 : cy.layout({ name, ...options }).run();
598
+ };
599
+ var loadLayout = (layout = "cola") => {
600
+ switch (layout) {
601
+ case "dagre": {
602
+ import_cytoscape2.default.use(import_cytoscape_dagre2.default);
603
+ break;
604
+ }
605
+ case "euler": {
606
+ import_cytoscape2.default.use(import_cytoscape_euler2.default);
607
+ break;
608
+ }
609
+ case "cose-bilkent": {
610
+ import_cytoscape2.default.use(import_cytoscape_cose_bilkent2.default);
611
+ break;
612
+ }
613
+ case "cola": {
614
+ import_cytoscape2.default.use(import_cytoscape_cola2.default);
615
+ break;
616
+ }
617
+ }
618
+ };
619
+ var ModuleHoverDetails = ({ name, address, ...props }) => {
620
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_material3.Card, { elevation: 3, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
621
+ import_material3.CardHeader,
622
+ {
623
+ 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 }) }),
624
+ title: name,
625
+ subheader: address
626
+ }
627
+ ) });
628
+ };
629
+ var NodeRelationalGraphFlexBox = (0, import_react13.forwardRef)(
630
+ ({ actions, children, node, layout, layoutOptions, showDetails, detail, options, onHover, ...props }, ref) => {
631
+ var _a;
632
+ const theme = (0, import_material3.useTheme)();
633
+ const [cy, setCy] = (0, import_react13.useState)();
634
+ const cytoscapeRef = (0, import_react13.useRef)();
635
+ const [hoverPosition, setHoverBoundingBox] = (0, import_react13.useState)();
636
+ const [hoverAddress, setHoverAddress] = (0, import_react13.useState)();
637
+ const [moduleInstance] = (0, import_react_node2.useWeakModuleFromNode)(hoverAddress, { node });
638
+ (0, import_react13.useEffect)(() => {
639
+ cy == null ? void 0 : cy.on("mouseover tap", ({ target }) => {
640
+ var _a2, _b;
641
+ const cyNode = target;
642
+ const bb = (_a2 = cyNode == null ? void 0 : cyNode.renderedBoundingBox) == null ? void 0 : _a2.call(cyNode);
643
+ setHoverBoundingBox(bb);
644
+ const id = (_b = cyNode.id) == null ? void 0 : _b.call(cyNode);
645
+ if (id) {
646
+ if (id.includes("/")) {
647
+ setHoverAddress(void 0);
648
+ onHover == null ? void 0 : onHover();
649
+ } else {
650
+ setHoverAddress((0, import_hex.asAddress)(id));
651
+ onHover == null ? void 0 : onHover((0, import_hex.asAddress)(id));
652
+ }
653
+ }
654
+ });
655
+ }, [onHover, cy]);
656
+ const handleReset = () => {
657
+ cy == null ? void 0 : cy.reset();
658
+ applyLayout(cy, layout ?? "euler", layoutOptions);
659
+ };
660
+ (0, import_react13.useEffect)(() => {
661
+ let newCy;
662
+ const container = cytoscapeRef.current;
663
+ if (container) {
664
+ newCy = (0, import_cytoscape2.default)({
665
+ container,
666
+ ...options
667
+ });
668
+ setCy(newCy);
669
+ }
670
+ return () => {
671
+ newCy == null ? void 0 : newCy.destroy();
672
+ setCy(void 0);
673
+ };
674
+ }, [options, cytoscapeRef, layoutOptions]);
675
+ (0, import_react13.useEffect)(() => {
676
+ if (cy) {
677
+ loadLayout(layout);
678
+ applyLayout(cy, layout ?? "euler", layoutOptions);
679
+ }
680
+ }, [cy, layoutOptions, layout]);
681
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_flexbox.FlexCol, { id: "relational-graph-wrapper", ref, ...props, children: [
682
+ 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: ((_a = moduleInstance == null ? void 0 : moduleInstance.deref()) == null ? void 0 : _a.id) ?? "Unknown" }) }) : null,
683
+ /* @__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: [
684
+ actions,
685
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_material3.Button, { size: "small", variant: "contained", onClick: handleReset, children: "Reset View" })
686
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_material3.Button, { size: "small", variant: "contained", onClick: handleReset, children: "Reset" }) }),
687
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_flexbox.FlexGrowRow, { width: "100%", alignItems: "start", children: [
688
+ showDetails ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_flexbox.FlexCol, { height: "100%", width: "85%", children: detail }) : null,
689
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
690
+ import_react_flexbox.FlexCol,
691
+ {
692
+ justifyContent: "start",
693
+ classes: "cytoscape-wrap",
694
+ width: showDetails ? "15%" : "100%",
695
+ height: showDetails ? "50%" : "100%",
696
+ border: showDetails ? `1px solid ${theme.palette.divider}` : void 0,
697
+ children: [
698
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_flexbox.FlexCol, { alignItems: "stretch", position: "absolute", width: "100%", height: "100%", ref: cytoscapeRef }),
699
+ children
700
+ ]
701
+ }
702
+ )
703
+ ] })
704
+ ] });
705
+ }
706
+ );
707
+ NodeRelationalGraphFlexBox.displayName = "NodeRelationalGraph";
708
+ var NodeRelationalGraph = NodeRelationalGraphFlexBox;
709
+
710
+ // src/components/relational/graph/ProvidedNodeRenderer.tsx
711
+ var import_react_node3 = require("@xyo-network/react-node");
712
+ var import_jsx_runtime6 = require("react/jsx-runtime");
713
+ var ProvidedNodeRenderer = ({ node, ...props }) => {
714
+ const [providedNode] = (0, import_react_node3.useWeakProvidedNode)();
715
+ const elements = useCytoscapeElements(node ?? providedNode);
716
+ const options = useCytoscapeOptions(elements);
717
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(NodeRelationalGraphFlexBox, { alignItems: "stretch", flexGrow: 1, height: "100%", options, ...props });
718
+ };
719
+
720
+ // src/components/module/graph/DetailsFlexbox.tsx
721
+ var import_icons_material2 = require("@mui/icons-material");
722
+ var import_material4 = require("@mui/material");
723
+ var import_react_flexbox2 = require("@xylabs/react-flexbox");
724
+ var import_jsx_runtime7 = require("react/jsx-runtime");
725
+ var DetailsFlexbox = ({ children, onClose }) => {
726
+ 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: [
727
+ /* @__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, {}) }) }),
728
+ children
729
+ ] });
730
+ };
731
+
732
+ // src/components/module/graph/node/Hover.tsx
733
+ var import_material5 = require("@mui/material");
734
+ var import_react_flexbox3 = require("@xylabs/react-flexbox");
735
+
736
+ // src/components/module/graph/node/hooks/useNodeElement.tsx
737
+ var import_react14 = require("react");
738
+ var useNodeElement = (node) => {
739
+ const ref = (0, import_react14.useRef)(null);
740
+ const [currentElement, setCurrentElement] = (0, import_react14.useState)(null);
741
+ const [boundingBox, setBoundingBox] = (0, import_react14.useState)(node == null ? void 0 : node.renderedBoundingBox());
742
+ (0, import_react14.useEffect)(() => {
743
+ setCurrentElement(null);
744
+ }, [node]);
745
+ (0, import_react14.useEffect)(() => {
746
+ if (node) {
747
+ setBoundingBox(node.renderedBoundingBox());
748
+ }
749
+ const listener = () => {
750
+ setBoundingBox(node == null ? void 0 : node.renderedBoundingBox());
751
+ };
752
+ node == null ? void 0 : node.on("position", listener);
753
+ return () => {
754
+ node == null ? void 0 : node.off("position", void 0, listener);
755
+ };
756
+ }, [node]);
757
+ (0, import_react14.useEffect)(() => {
758
+ setCurrentElement(ref.current);
759
+ }, [boundingBox]);
760
+ return { boundingBox, currentElement, ref };
761
+ };
762
+
763
+ // src/components/module/graph/node/Hover.tsx
764
+ var import_jsx_runtime8 = require("react/jsx-runtime");
765
+ var ModuleGraphNodeHover = ({ children, node }) => {
766
+ const { boundingBox, ref, currentElement } = useNodeElement(node);
767
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
768
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StyledNodeGhostElementFlexCol, { ref, left: boundingBox == null ? void 0 : boundingBox.x1, height: boundingBox == null ? void 0 : boundingBox.h, top: boundingBox == null ? void 0 : boundingBox.y1, width: boundingBox == null ? void 0 : boundingBox.w }),
769
+ node ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_jsx_runtime8.Fragment, { children: children == null ? void 0 : children(currentElement) }) : null
770
+ ] });
771
+ };
772
+ var StyledNodeGhostElementFlexCol = (0, import_material5.styled)(import_react_flexbox3.FlexCol, { name: "StyledNodeGhostElementFlexCol" })(() => ({
773
+ // For easier debugging of the 'ghost' element that matches the hovered cytoscape node
774
+ // backgroundColor: '#fff',
775
+ // opacity: 0.25,
776
+ // eslint-disable-next-line sort-keys-fix/sort-keys-fix
777
+ cursor: "pointer",
778
+ pointerEvents: "none",
779
+ position: "absolute"
780
+ }));
781
+
782
+ // src/components/module/graph/Popper.tsx
783
+ var import_icons_material3 = require("@mui/icons-material");
784
+ var import_material6 = require("@mui/material");
785
+ var import_react_identicon2 = require("@xylabs/react-identicon");
786
+ var import_jsx_runtime9 = require("react/jsx-runtime");
787
+ var ModuleHoverPopper = ({ anchorEl, onClose, onModuleDetails, onModuleExplore, node, ...props }) => {
788
+ const { address, name } = (node == null ? void 0 : node.data()) ?? {};
789
+ 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: [
790
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
791
+ import_material6.CardHeader,
792
+ {
793
+ 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,
794
+ 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 }) }),
795
+ title: name,
796
+ subheader: address
797
+ }
798
+ ),
799
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(StyledCardActions, { children: [
800
+ onModuleDetails ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_material6.Button, { onClick: () => onModuleDetails == null ? void 0 : onModuleDetails(address), size: "small", variant: "contained", children: "Details" }) : null,
801
+ onModuleExplore ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_material6.Button, { onClick: () => onModuleExplore == null ? void 0 : onModuleExplore(address), size: "small", variant: "contained", children: "Explore" }) : null
802
+ ] })
803
+ ] }) }) : null });
804
+ };
805
+ var StyledModuleHoverPopper = (0, import_material6.styled)(ModuleHoverPopper, { name: "StyledComponents" })(() => ({
806
+ zIndex: 2
807
+ }));
808
+ var StyledCardActions = (0, import_material6.styled)(import_material6.CardActions, { name: "StyledCardActions" })(() => ({
809
+ display: "flex",
810
+ justifyContent: "center"
811
+ }));
812
+
813
+ // src/components/module/graph/GraphFlexBox.tsx
814
+ var import_jsx_runtime10 = require("react/jsx-runtime");
815
+ var ModuleGraphFlexBox = ({ hideActions, rootModule, disableModuleDetails, ...props }) => {
816
+ const cytoscapeRef = (0, import_react15.useRef)(null);
817
+ const { handleToggleLabels, hideLabels, options } = useRelationalGraphOptions(rootModule ?? void 0);
818
+ const { hoveredNode, setHoveredNode, toggleSelectedElement } = useElements(hideLabels);
819
+ const { mod, onModuleDetails } = useModuleDetails(rootModule, () => setHoveredNode(void 0));
820
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(WithExtensions, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
821
+ NodeRelationalGraphFlexBox,
822
+ {
823
+ actions: mod ? null : hideActions ? null : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_material7.Button, { size: "small", onClick: handleToggleLabels, variant: "contained", children: "Toggle Labels" }),
824
+ showDetails: !!mod,
825
+ detail: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DetailsFlexbox, { onClose: () => onModuleDetails(null) }),
826
+ options,
827
+ ref: cytoscapeRef,
828
+ width: "100%",
829
+ ...props,
830
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ModuleGraphNodeHover, { node: hoveredNode, children: (element) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
831
+ StyledModuleHoverPopper,
832
+ {
833
+ anchorEl: element,
834
+ container: cytoscapeRef.current,
835
+ node: hoveredNode,
836
+ onClose: () => setHoveredNode(void 0),
837
+ onModuleExplore: toggleSelectedElement,
838
+ onModuleDetails: disableModuleDetails ? void 0 : onModuleDetails,
839
+ placement: "top",
840
+ open: true
841
+ }
842
+ ) })
843
+ }
844
+ ) });
845
+ };
846
+ var ModuleGraphFlexBoxWithProvider = (props) => {
847
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CytoscapeInstanceProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ModuleGraphFlexBox, { ...props }) });
848
+ };
849
+ // Annotate the CommonJS export names for ESM import in node:
850
+ 0 && (module.exports = {
851
+ ColaLayout,
852
+ ConcentricLayout,
853
+ CyIconSet,
854
+ CytoscapeElements,
855
+ CytoscapeInstanceContext,
856
+ CytoscapeInstanceProvider,
857
+ EdgeStyled,
858
+ ModuleCardParser,
859
+ ModuleGraphFlexBox,
860
+ ModuleGraphFlexBoxWithProvider,
861
+ Node,
862
+ NodeAsRoot,
863
+ NodeRelationalGraph,
864
+ NodeRelationalGraphFlexBox,
865
+ NodeWithName,
866
+ ProvidedNodeRenderer,
867
+ encodeSvg,
868
+ generateIconMap,
869
+ parseModuleType,
870
+ useCytoscapeElements,
871
+ useCytoscapeInstance,
872
+ useCytoscapeOptions,
873
+ useElements,
874
+ useModuleDetails,
875
+ useRelationalGraphOptions
876
+ });
2
877
  //# sourceMappingURL=index.cjs.map