{"version":3,"file":"GraphNode.DiAjOtaG.mjs","names":["React.useRef","React.useState"],"sources":["https:/framerusercontent.com/modules/ainTOwgJxDywSHLRq6d9/FQcmIymTlcz1D2YzRSmx/GraphNode.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType}from\"framer\";/* ================================\n   CONFIG\n================================ */const EDGE_PADDING=40;const COLLISION_ITERATIONS=4;const COLLISION_STEP=.5;const DRAG_THRESHOLD=3;const MIN_SEPARATION=24;const REPULSION_STRENGTH=.015;/* ================================\n   COMPONENT\n================================ */export default function GraphCanvas(props){const{nodes,backgroundColor,lineColor,lineOpacity,lineWidth,springLength,springStrength,damping,dimOpacity}=props;const nodesArray=nodes??[];const containerRef=React.useRef(null);const nodeRefs=React.useRef([]);const randomSeed=React.useRef(Array.from({length:nodesArray.length},()=>({angle:Math.random()*Math.PI*2,radius:140+Math.random()*140})));const[ready,setReady]=React.useState(false);const[bounds,setBounds]=React.useState({width:0,height:0});const[hovered,setHovered]=React.useState(null);const[state,setState]=React.useState(()=>nodesArray.map((_,i)=>{const seed=randomSeed.current[i];return{x:400+Math.cos(seed.angle)*seed.radius,y:250+Math.sin(seed.angle)*seed.radius,vx:0,vy:0,w:160,h:56};}));const dragging=React.useRef(null);const dragStarted=React.useRef(false);const lastPos=React.useRef({x:0,y:0});const skipFirstTick=React.useRef(true);/* ================================\n       MEASURE CANVAS\n    ================================ */React.useLayoutEffect(()=>{if(!containerRef.current)return;const r=containerRef.current.getBoundingClientRect();setBounds({width:r.width,height:r.height});const cx=r.width/2;const cy=r.height/2;const dx=cx-400;const dy=cy-250;setState(prev=>prev.map(n=>({...n,x:n.x+dx,y:n.y+dy})));setReady(true);},[]);/* ================================\n       MEASURE NODE SIZES\n    ================================ */React.useLayoutEffect(()=>{setState(prev=>prev.map((n,i)=>{const el=nodeRefs.current[i];if(!el)return n;const r=el.getBoundingClientRect();return{...n,w:r.width,h:r.height};}));},[nodesArray.length]);/* ================================\n       PHYSICS LOOP\n    ================================ */React.useEffect(()=>{let frame;function tick(){if(skipFirstTick.current){skipFirstTick.current=false;frame=requestAnimationFrame(tick);return;}setState(prev=>{const next=prev.map(n=>({...n}));/* -------- Springs -------- */for(let i=1;i<next.length;i++){const a=next[0];const b=next[i];const dx=b.x-a.x;const dy=b.y-a.y;const dist=Math.sqrt(dx*dx+dy*dy)||.001;const f=(dist-springLength)*springStrength;const fx=dx/dist*f;const fy=dy/dist*f;if(dragging.current!==0){a.vx+=fx;a.vy+=fy;}if(dragging.current!==i){b.vx-=fx;b.vy-=fy;}}/* -------- Soft Repulsion -------- */for(let i=0;i<next.length;i++){for(let j=i+1;j<next.length;j++){const a=next[i];const b=next[j];const ax=a.x+a.w/2;const ay=a.y+a.h/2;const bx=b.x+b.w/2;const by=b.y+b.h/2;const dx=bx-ax;const dy=by-ay;const dist=Math.sqrt(dx*dx+dy*dy)||.001;const minDist=(a.w+b.w)/2+MIN_SEPARATION;if(dist<minDist){const force=(minDist-dist)*REPULSION_STRENGTH;const fx=dx/dist*force;const fy=dy/dist*force;if(dragging.current!==i){a.vx-=fx;a.vy-=fy;}if(dragging.current!==j){b.vx+=fx;b.vy+=fy;}}}}/* -------- Integrate -------- */next.forEach((n,i)=>{if(dragging.current!==i){n.vx*=damping;n.vy*=damping;n.x+=n.vx;n.y+=n.vy;}});/* -------- Collision (fallback) -------- */for(let k=0;k<COLLISION_ITERATIONS;k++){for(let i=0;i<next.length;i++){for(let j=i+1;j<next.length;j++){const a=next[i];const b=next[j];const dx=a.x+a.w/2-(b.x+b.w/2);const dy=a.y+a.h/2-(b.y+b.h/2);const px=(a.w+b.w)/2-Math.abs(dx);const py=(a.h+b.h)/2-Math.abs(dy);if(px>0&&py>0){if(px<py){const m=Math.min(px/2,COLLISION_STEP)*Math.sign(dx||1);if(dragging.current!==i)a.x+=m;if(dragging.current!==j)b.x-=m;}else{const m=Math.min(py/2,COLLISION_STEP)*Math.sign(dy||1);if(dragging.current!==i)a.y+=m;if(dragging.current!==j)b.y-=m;}}}}}/* -------- Soft Bounds -------- */next.forEach((n,i)=>{if(dragging.current===i)return;const minX=EDGE_PADDING;const maxX=bounds.width-n.w-EDGE_PADDING;const minY=EDGE_PADDING;const maxY=bounds.height-n.h-EDGE_PADDING;const SPRING=.08;const DAMPING=.85;if(n.x<minX){n.vx+=(minX-n.x)*SPRING;n.vx*=DAMPING;}else if(n.x>maxX){n.vx+=(maxX-n.x)*SPRING;n.vx*=DAMPING;}if(n.y<minY){n.vy+=(minY-n.y)*SPRING;n.vy*=DAMPING;}else if(n.y>maxY){n.vy+=(maxY-n.y)*SPRING;n.vy*=DAMPING;}});return next;});frame=requestAnimationFrame(tick);}frame=requestAnimationFrame(tick);return()=>cancelAnimationFrame(frame);},[springLength,springStrength,damping,bounds]);/* ================================\n       POINTER EVENTS\n    ================================ */function onPointerDown(e,i){dragging.current=i;dragStarted.current=false;lastPos.current={x:e.clientX,y:e.clientY};}function onPointerMove(e){if(dragging.current===null)return;const dx=e.clientX-lastPos.current.x;const dy=e.clientY-lastPos.current.y;if(!dragStarted.current){if(Math.hypot(dx,dy)<DRAG_THRESHOLD)return;dragStarted.current=true;e.currentTarget.setPointerCapture(e.pointerId);}lastPos.current={x:e.clientX,y:e.clientY};setState(prev=>prev.map((n,idx)=>idx===dragging.current?{...n,x:n.x+dx,y:n.y+dy,vx:0,vy:0}:n));}function onPointerUp(e){if(dragStarted.current){e.currentTarget.releasePointerCapture(e.pointerId);}dragging.current=null;dragStarted.current=false;}/* ================================\n       RENDER\n    ================================ */return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,onPointerMove:onPointerMove,onPointerUp:onPointerUp,style:{position:\"relative\",width:\"100%\",height:\"100%\",background:backgroundColor,overflow:\"visible\"},children:[/*#__PURE__*/_jsx(\"svg\",{width:\"100%\",height:\"100%\",style:{position:\"absolute\",inset:0,pointerEvents:\"none\",overflow:\"visible\",opacity:ready?1:0,transition:\"opacity 1s ease\"},children:state.slice(1).map((node,i)=>{const a=state[0];const nodeIndex=i+1;const dimmed=hovered!==null&&hovered!==nodeIndex&&hovered!==0;return /*#__PURE__*/_jsx(\"line\",{x1:a.x+a.w/2,y1:a.y+a.h/2,x2:node.x+node.w/2,y2:node.y+node.h/2,stroke:lineColor,strokeOpacity:dimmed?lineOpacity*dimOpacity:lineOpacity,strokeWidth:lineWidth},i);})}),nodesArray.map((child,i)=>{const dimmed=hovered!==null&&i!==0&&hovered!==i;return /*#__PURE__*/_jsx(\"div\",{ref:el=>el&&(nodeRefs.current[i]=el),onPointerDown:e=>onPointerDown(e,i),onPointerEnter:()=>setHovered(i),onPointerLeave:()=>setHovered(null),style:{position:\"absolute\",left:state[i]?.x??0,top:state[i]?.y??0,cursor:\"grab\",touchAction:\"none\",userSelect:\"none\",pointerEvents:\"auto\",opacity:ready?dimmed?dimOpacity:1:0,transition:\"opacity 0.2s ease\",zIndex:i===0||hovered===i?10:1},children:child},i);})]});}/* ================================\n   CONTROLS\n================================ */addPropertyControls(GraphCanvas,{nodes:{type:ControlType.Array,title:\"Nodes\",control:{type:ControlType.ComponentInstance}},backgroundColor:{type:ControlType.Color,defaultValue:\"#F5F6F3\"},lineColor:{type:ControlType.Color,defaultValue:\"#000000\"},lineOpacity:{type:ControlType.Number,defaultValue:1,min:0,max:1},dimOpacity:{type:ControlType.Number,defaultValue:1,min:0,max:1},lineWidth:{type:ControlType.Number,defaultValue:1},springLength:{type:ControlType.Number,defaultValue:300},springStrength:{type:ControlType.Number,defaultValue:.01},damping:{type:ControlType.Number,defaultValue:.6}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"GraphCanvas\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./GraphNode.map"],"mappings":"sMAImC,SAAwB,EAAY,EAAM,CAAC,GAAK,CAAC,QAAM,kBAAgB,YAAU,cAAY,YAAU,eAAa,iBAAe,UAAQ,cAAY,EAAY,EAAW,GAAO,EAAE,CAAO,EAAaA,EAAa,KAAK,CAAO,EAASA,EAAa,EAAE,CAAC,CAAO,EAAWA,EAAa,MAAM,KAAK,CAAC,OAAO,EAAW,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,KAAK,GAAG,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAM,CAAC,EAAM,GAAUC,EAAe,GAAM,CAAM,CAAC,EAAO,GAAWA,EAAe,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAM,CAAC,EAAQ,GAAYA,EAAe,KAAK,CAAM,CAAC,EAAM,GAAUA,MAAmB,EAAW,KAAK,EAAE,IAAI,CAAC,IAAM,EAAK,EAAW,QAAQ,GAAG,MAAM,CAAC,EAAE,IAAI,KAAK,IAAI,EAAK,MAAM,CAAC,EAAK,OAAO,EAAE,IAAI,KAAK,IAAI,EAAK,MAAM,CAAC,EAAK,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAG,CAAC,CAAO,EAASD,EAAa,KAAK,CAAO,EAAYA,EAAa,GAAM,CAAO,EAAQA,EAAa,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAO,EAAcA,EAAa,GAAK,CAE73B,MAA0B,CAAC,GAAG,CAAC,EAAa,QAAQ,OAAO,IAAM,EAAE,EAAa,QAAQ,uBAAuB,CAAC,EAAU,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,CAAC,CAAC,IAAM,EAAG,EAAE,MAAM,EAAQ,EAAG,EAAE,OAAO,EAAQ,EAAG,EAAG,IAAU,EAAG,EAAG,IAAI,EAAS,GAAM,EAAK,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAG,EAAE,EAAE,EAAE,EAAG,EAAE,CAAC,CAAC,EAAS,GAAK,EAAG,EAAE,CAAC,CAE9S,MAA0B,CAAC,EAAS,GAAM,EAAK,KAAK,EAAE,IAAI,CAAC,IAAM,EAAG,EAAS,QAAQ,GAAG,GAAG,CAAC,EAAG,OAAO,EAAE,IAAM,EAAE,EAAG,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAG,CAAC,EAAG,CAAC,EAAW,OAAO,CAAC,CAEvM,MAAoB,CAAC,IAAI,EAAM,SAAS,GAAM,CAAC,GAAG,EAAc,QAAQ,CAAC,EAAc,QAAQ,GAAM,EAAM,sBAAsB,EAAK,CAAC,OAAQ,EAAS,GAAM,CAAC,IAAM,EAAK,EAAK,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAgC,IAAI,IAAI,EAAE,EAAE,EAAE,EAAK,OAAO,IAAI,CAAC,IAAM,EAAE,EAAK,GAAS,EAAE,EAAK,GAAS,EAAG,EAAE,EAAE,EAAE,EAAQ,EAAG,EAAE,EAAE,EAAE,EAAQ,EAAK,KAAK,KAAK,EAAG,EAAG,EAAG,EAAG,EAAE,KAAW,GAAG,EAAK,GAAc,EAAqB,EAAG,EAAG,EAAK,EAAQ,EAAG,EAAG,EAAK,EAAK,EAAS,UAAU,IAAG,EAAE,IAAI,EAAG,EAAE,IAAI,GAAO,EAAS,UAAU,IAAG,EAAE,IAAI,EAAG,EAAE,IAAI,GAA2C,IAAI,IAAI,EAAE,EAAE,EAAE,EAAK,OAAO,IAAK,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAK,OAAO,IAAI,CAAC,IAAM,EAAE,EAAK,GAAS,EAAE,EAAK,GAAS,EAAG,EAAE,EAAE,EAAE,EAAE,EAAQ,EAAG,EAAE,EAAE,EAAE,EAAE,EAAQ,EAAG,EAAE,EAAE,EAAE,EAAE,EAAQ,EAAG,EAAE,EAAE,EAAE,EAAE,EAAQ,EAAG,EAAG,EAAS,EAAG,EAAG,EAAS,EAAK,KAAK,KAAK,EAAG,EAAG,EAAG,EAAG,EAAE,KAAW,GAAS,EAAE,EAAE,EAAE,GAAG,EAAE,EAAe,GAAG,EAAK,EAAQ,CAAC,IAAM,GAAO,EAAQ,GAAM,EAAyB,EAAG,EAAG,EAAK,EAAY,EAAG,EAAG,EAAK,EAAS,EAAS,UAAU,IAAG,EAAE,IAAI,EAAG,EAAE,IAAI,GAAO,EAAS,UAAU,IAAG,EAAE,IAAI,EAAG,EAAE,IAAI,IAAwC,EAAK,SAAS,EAAE,IAAI,CAAI,EAAS,UAAU,IAAG,EAAE,IAAI,EAAQ,EAAE,IAAI,EAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAM,CAA6C,IAAI,IAAI,EAAE,EAAE,EAAE,EAAqB,IAAK,IAAI,IAAI,EAAE,EAAE,EAAE,EAAK,OAAO,IAAK,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAK,OAAO,IAAI,CAAC,IAAM,EAAE,EAAK,GAAS,EAAE,EAAK,GAAS,EAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAS,EAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAS,GAAI,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,IAAI,EAAG,CAAO,GAAI,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,IAAI,EAAG,CAAC,GAAG,EAAG,GAAG,EAAG,EAAG,GAAG,EAAG,EAAG,CAAC,IAAM,EAAE,KAAK,IAAI,EAAG,EAAE,EAAe,CAAC,KAAK,KAAK,GAAI,EAAE,CAAI,EAAS,UAAU,IAAE,EAAE,GAAG,GAAK,EAAS,UAAU,IAAE,EAAE,GAAG,OAAO,CAAC,IAAM,EAAE,KAAK,IAAI,EAAG,EAAE,EAAe,CAAC,KAAK,KAAK,GAAI,EAAE,CAAI,EAAS,UAAU,IAAE,EAAE,GAAG,GAAK,EAAS,UAAU,IAAE,EAAE,GAAG,IAAie,OAAvb,EAAK,SAAS,EAAE,IAAI,CAAC,GAAG,EAAS,UAAU,EAAE,OAAO,IAAM,EAAK,EAAmB,EAAK,EAAO,MAAM,EAAE,EAAE,EAAmB,EAAK,EAAmB,EAAK,EAAO,OAAO,EAAE,EAAE,EAAmB,EAAO,IAAU,EAAQ,IAAO,EAAE,EAAE,GAAM,EAAE,KAAK,EAAK,EAAE,GAAG,EAAO,EAAE,IAAI,GAAiB,EAAE,EAAE,IAAM,EAAE,KAAK,EAAK,EAAE,GAAG,EAAO,EAAE,IAAI,GAAY,EAAE,EAAE,GAAM,EAAE,KAAK,EAAK,EAAE,GAAG,EAAO,EAAE,IAAI,GAAiB,EAAE,EAAE,IAAM,EAAE,KAAK,EAAK,EAAE,GAAG,EAAO,EAAE,IAAI,IAAW,CAAQ,GAAO,CAAC,EAAM,sBAAsB,EAAK,CAAoC,MAAlC,GAAM,sBAAsB,EAAK,KAAW,qBAAqB,EAAM,EAAG,CAAC,EAAa,EAAe,EAAQ,EAAO,CAAC,CAEr2E,SAAS,EAAc,EAAE,EAAE,CAAC,EAAS,QAAQ,EAAE,EAAY,QAAQ,GAAM,EAAQ,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAE,SAAS,EAAc,EAAE,CAAC,GAAG,EAAS,UAAU,KAAK,OAAO,IAAM,EAAG,EAAE,QAAQ,EAAQ,QAAQ,EAAQ,EAAG,EAAE,QAAQ,EAAQ,QAAQ,EAAE,GAAG,CAAC,EAAY,QAAQ,CAAC,GAAG,KAAK,MAAM,EAAG,EAAG,CAAC,EAAe,OAAO,EAAY,QAAQ,GAAK,EAAE,cAAc,kBAAkB,EAAE,UAAU,CAAE,EAAQ,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAS,GAAM,EAAK,KAAK,EAAE,IAAM,IAAM,EAAS,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAG,EAAE,EAAE,EAAE,EAAG,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAE,SAAS,EAAY,EAAE,CAAI,EAAY,SAAS,EAAE,cAAc,sBAAsB,EAAE,UAAU,CAAE,EAAS,QAAQ,KAAK,EAAY,QAAQ,GAE/pB,OAAoB,EAAM,MAAM,CAAC,IAAI,EAA2B,gBAA0B,cAAY,MAAM,CAAC,SAAS,WAAW,MAAM,OAAO,OAAO,OAAO,WAAW,EAAgB,SAAS,UAAU,CAAC,SAAS,CAAc,EAAK,MAAM,CAAC,MAAM,OAAO,OAAO,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,cAAc,OAAO,SAAS,UAAU,QAAQ,EAAM,EAAE,EAAE,WAAW,kBAAkB,CAAC,SAAS,EAAM,MAAM,EAAE,CAAC,KAAK,EAAK,IAAI,CAAC,IAAM,EAAE,EAAM,GAAS,EAAU,EAAE,EAAQ,EAAO,IAAU,MAAM,IAAU,GAAW,IAAU,EAAE,OAAoB,EAAK,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAK,EAAE,EAAK,EAAE,EAAE,GAAG,EAAK,EAAE,EAAK,EAAE,EAAE,OAAO,EAAU,cAAc,EAAO,EAAY,EAAW,EAAY,YAAY,EAAU,CAAC,EAAE,EAAG,CAAC,CAAC,CAAC,EAAW,KAAK,EAAM,IAAI,CAAC,IAAM,EAAO,IAAU,MAAM,IAAI,GAAG,IAAU,EAAE,OAAoB,EAAK,MAAM,CAAC,IAAI,GAAI,IAAK,EAAS,QAAQ,GAAG,GAAI,cAAc,GAAG,EAAc,EAAE,EAAE,CAAC,mBAAmB,EAAW,EAAE,CAAC,mBAAmB,EAAW,KAAK,CAAC,MAAM,CAAC,SAAS,WAAW,KAAK,EAAM,IAAI,GAAG,EAAE,IAAI,EAAM,IAAI,GAAG,EAAE,OAAO,OAAO,YAAY,OAAO,WAAW,OAAO,cAAc,OAAO,QAAQ,EAAM,EAAO,EAAW,EAAE,EAAE,WAAW,oBAAoB,OAAO,IAAI,GAAG,IAAU,EAAE,GAAG,EAAE,CAAC,SAAS,EAAM,CAAC,EAAE,EAAG,CAAC,CAAC,CAAC,8BAdnsC,IAA4B,IAAoD,CAEhG,EAAa,GAAS,EAAqB,EAAQ,EAAe,GAAS,EAAe,EAAQ,EAAe,GAAS,EAAmB,KAcnJ,EAAoB,EAAY,CAAC,MAAM,CAAC,KAAK,EAAY,MAAM,MAAM,QAAQ,QAAQ,CAAC,KAAK,EAAY,kBAAkB,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAY,MAAM,aAAa,UAAU,CAAC,UAAU,CAAC,KAAK,EAAY,MAAM,aAAa,UAAU,CAAC,YAAY,CAAC,KAAK,EAAY,OAAO,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,EAAY,OAAO,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,EAAY,OAAO,aAAa,EAAE,CAAC,aAAa,CAAC,KAAK,EAAY,OAAO,aAAa,IAAI,CAAC,eAAe,CAAC,KAAK,EAAY,OAAO,aAAa,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAY,OAAO,aAAa,GAAG,CAAC,CAAC"}