vizcraft 1.14.0 → 1.16.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # vizcraft
2
2
 
3
+ ## 1.16.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#142](https://github.com/ChipiKaf/vizcraft/pull/142) [`63cd51a`](https://github.com/ChipiKaf/vizcraft/commit/63cd51a67991c48bc93512d2d4ef22d82c167595) Thanks [@ChipiKaf](https://github.com/ChipiKaf)! - Add `initialPan` mount option and `getState()` method to `PanZoomController` for persisting viewport state across scene rebuilds.
8
+
9
+ **New API:**
10
+ - `initialPan: Vec2` — set starting pan offset when `initialZoom` is a number
11
+ - `controller.getState()` — returns a `{ zoom, pan }` snapshot of the current viewport
12
+
13
+ This enables seamless viewport persistence by capturing `getState()` before destroy and passing the values as `initialZoom` / `initialPan` when remounting.
14
+
15
+ - [`24e7158`](https://github.com/ChipiKaf/vizcraft/commit/24e715809152bf7a405fe70be444d239c26610ce) Thanks [@ChipiKaf](https://github.com/ChipiKaf)! - Add `color` and `glowColor` options to `SignalOverlayParams` for per-signal ball color overrides.
16
+
17
+ **New fields in `SignalOverlayBaseParams`:**
18
+ - `color?: string` — CSS color applied as an inline fill on the signal ball, overriding the CSS class default (`#3b82f6`). Works on both single-hop and chain signals.
19
+ - `glowColor?: string` — CSS color applied as a `drop-shadow` filter on the signal shape for a halo effect. Defaults to `color` when omitted.
20
+
21
+ When neither field is set, rendering is identical to before (full back-compat).
22
+
23
+ **Example:**
24
+
25
+ ```ts
26
+ // Green ball — majority committed
27
+ overlays.add('signal', {
28
+ from: 'primary',
29
+ to: 'reader',
30
+ edgeId: 'primary-reader',
31
+ progress: 0.6,
32
+ magnitude: 0.85,
33
+ color: '#22c55e',
34
+ });
35
+
36
+ // Amber ball — stale snapshot
37
+ overlays.add('signal', {
38
+ from: 'primary',
39
+ to: 'reader',
40
+ edgeId: 'primary-reader',
41
+ progress: 0.6,
42
+ magnitude: 0.85,
43
+ color: '#f59e0b',
44
+ });
45
+ ```
46
+
47
+ ## 1.15.0
48
+
49
+ ### Minor Changes
50
+
51
+ - [#140](https://github.com/ChipiKaf/vizcraft/pull/140) [`0032b78`](https://github.com/ChipiKaf/vizcraft/commit/0032b788e17258591e4ddc690ce7727f1a1d5afa) Thanks [@ChipiKaf](https://github.com/ChipiKaf)! - Add `initialPan` mount option and `getState()` method to `PanZoomController` for persisting viewport state across scene rebuilds.
52
+
53
+ **New API:**
54
+ - `initialPan: Vec2` — set starting pan offset when `initialZoom` is a number
55
+ - `controller.getState()` — returns a `{ zoom, pan }` snapshot of the current viewport
56
+
57
+ This enables seamless viewport persistence by capturing `getState()` before destroy and passing the values as `initialZoom` / `initialPan` when remounting.
58
+
3
59
  ## 1.14.0
4
60
 
5
61
  ### Minor Changes
package/README.md CHANGED
@@ -793,6 +793,40 @@ builder.overlay(
793
793
  );
794
794
  ```
795
795
 
796
+ ## Per-signal color override
797
+
798
+ Set `color` to override the default blue fill on individual signals. An optional `glowColor` adds a drop-shadow halo (defaults to `color`).
799
+
800
+ ```ts
801
+ // Green ball — majority committed
802
+ builder.overlay(
803
+ 'signal',
804
+ {
805
+ from: 'primary',
806
+ to: 'reader',
807
+ edgeId: 'primary-reader',
808
+ progress: 0.6,
809
+ magnitude: 0.85,
810
+ color: '#22c55e',
811
+ },
812
+ 'committed'
813
+ );
814
+
815
+ // Amber ball — stale snapshot
816
+ builder.overlay(
817
+ 'signal',
818
+ {
819
+ from: 'primary',
820
+ to: 'reader',
821
+ edgeId: 'primary-reader',
822
+ progress: 0.6,
823
+ magnitude: 0.85,
824
+ color: '#f59e0b',
825
+ },
826
+ 'stale'
827
+ );
828
+ ```
829
+
796
830
  ## 🤝 Contributing
797
831
 
798
832
  Contributions are welcome! This is a monorepo managed with Turbo.
@@ -1 +1 @@
1
- export { az as AnimProperty, aF as AnimatableProps, aG as AnimationBuilder, aQ as AnimationHostAdapter, aC as AnimationSpec, ax as AnimationTarget, ay as CoreAnimProperty, aE as CoreAnimatableProps, aA as Ease, aI as ExtendAdapter, aJ as PlaybackController, aP as PropHandlers, aN as PropReader, aO as PropWriter, aR as RegistrableAdapter, aD as TweenOptions, aB as TweenSpec, aH as buildAnimationSpec, aL as createBuilderPlayback, aK as createScenePlayback, aM as playAnimationSpec } from './index-CvNQ2zQt.mjs';
1
+ export { az as AnimProperty, aF as AnimatableProps, aG as AnimationBuilder, aQ as AnimationHostAdapter, aC as AnimationSpec, ax as AnimationTarget, ay as CoreAnimProperty, aE as CoreAnimatableProps, aA as Ease, aI as ExtendAdapter, aJ as PlaybackController, aP as PropHandlers, aN as PropReader, aO as PropWriter, aR as RegistrableAdapter, aD as TweenOptions, aB as TweenSpec, aH as buildAnimationSpec, aL as createBuilderPlayback, aK as createScenePlayback, aM as playAnimationSpec } from './index-n9JLZMa1.mjs';
@@ -1 +1 @@
1
- export { az as AnimProperty, aF as AnimatableProps, aG as AnimationBuilder, aQ as AnimationHostAdapter, aC as AnimationSpec, ax as AnimationTarget, ay as CoreAnimProperty, aE as CoreAnimatableProps, aA as Ease, aI as ExtendAdapter, aJ as PlaybackController, aP as PropHandlers, aN as PropReader, aO as PropWriter, aR as RegistrableAdapter, aD as TweenOptions, aB as TweenSpec, aH as buildAnimationSpec, aL as createBuilderPlayback, aK as createScenePlayback, aM as playAnimationSpec } from './index-CvNQ2zQt.js';
1
+ export { az as AnimProperty, aF as AnimatableProps, aG as AnimationBuilder, aQ as AnimationHostAdapter, aC as AnimationSpec, ax as AnimationTarget, ay as CoreAnimProperty, aE as CoreAnimatableProps, aA as Ease, aI as ExtendAdapter, aJ as PlaybackController, aP as PropHandlers, aN as PropReader, aO as PropWriter, aR as RegistrableAdapter, aD as TweenOptions, aB as TweenSpec, aH as buildAnimationSpec, aL as createBuilderPlayback, aK as createScenePlayback, aM as playAnimationSpec } from './index-n9JLZMa1.js';
package/dist/animation.js CHANGED
@@ -1 +1 @@
1
- 'use strict';var chunkAE7VTFYG_js=require('./chunk-AE7VTFYG.js');Object.defineProperty(exports,"AnimationBuilder",{enumerable:true,get:function(){return chunkAE7VTFYG_js.c}});Object.defineProperty(exports,"buildAnimationSpec",{enumerable:true,get:function(){return chunkAE7VTFYG_js.d}});Object.defineProperty(exports,"createBuilderPlayback",{enumerable:true,get:function(){return chunkAE7VTFYG_js.f}});Object.defineProperty(exports,"createScenePlayback",{enumerable:true,get:function(){return chunkAE7VTFYG_js.e}});Object.defineProperty(exports,"playAnimationSpec",{enumerable:true,get:function(){return chunkAE7VTFYG_js.g}});
1
+ 'use strict';var chunkC27QMQJJ_js=require('./chunk-C27QMQJJ.js');Object.defineProperty(exports,"AnimationBuilder",{enumerable:true,get:function(){return chunkC27QMQJJ_js.c}});Object.defineProperty(exports,"buildAnimationSpec",{enumerable:true,get:function(){return chunkC27QMQJJ_js.d}});Object.defineProperty(exports,"createBuilderPlayback",{enumerable:true,get:function(){return chunkC27QMQJJ_js.f}});Object.defineProperty(exports,"createScenePlayback",{enumerable:true,get:function(){return chunkC27QMQJJ_js.e}});Object.defineProperty(exports,"playAnimationSpec",{enumerable:true,get:function(){return chunkC27QMQJJ_js.g}});
@@ -1 +1 @@
1
- export{c as AnimationBuilder,d as buildAnimationSpec,f as createBuilderPlayback,e as createScenePlayback,g as playAnimationSpec}from'./chunk-EGTVJ43E.mjs';
1
+ export{c as AnimationBuilder,d as buildAnimationSpec,f as createBuilderPlayback,e as createScenePlayback,g as playAnimationSpec}from'./chunk-LQJHDSRP.mjs';
@@ -1 +1 @@
1
- 'use strict';var E=Symbol("vizcraft.overlay.runtimeDirty");var k=Symbol("vizcraft.adapterExtensions");function V(r){let i=r[k];return Array.isArray(i)?i:[]}function T(r){return typeof r=="number"&&Number.isFinite(r)}function z(r,i){return `${r}:${i}`}var S=class{cursorMs=0;currentTarget=null;tweens=[];adapterExtensions=[];extendAdapter(i){return this.adapterExtensions.push(i),this}node(i){return this.currentTarget=z("node",i),this}overlay(i){return this.currentTarget=z("overlay",i),this}edge(i,g,b){let l=g===void 0?i:b??`${i}->${g}`;return this.currentTarget=z("edge",l),this}at(i){return this.cursorMs=Math.max(0,i),this}wait(i){return this.cursorMs=Math.max(0,this.cursorMs+Math.max(0,i)),this}to(i,g){if(!this.currentTarget)throw new Error("AnimationBuilder.to(): no target selected (call node(...), edge(...), or overlay(...))");let b=Math.max(0,g.duration),l=g.easing,u=g.from;for(let[m,y]of Object.entries(i)){if(!T(y))continue;let h={kind:"tween",target:this.currentTarget,property:m,to:y,duration:b,delay:this.cursorMs,easing:l},x=u?.[m];T(x)&&(h.from=x),this.tweens.push(h);}return this.cursorMs+=b,this}build(){let i={version:"viz-anim/1",tweens:[...this.tweens]};return this.adapterExtensions.length>0&&(i[k]=[...this.adapterExtensions]),i}};function D(r){let i=new S;return r(i),i.build()}function R(r,i=0,g=1){return Math.max(i,Math.min(g,r))}var L={linear:r=>r,easeIn:r=>r*r,easeOut:r=>1-(1-r)*(1-r),easeInOut:r=>r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2};function P(r){let i=null,g=[],b=0,l=0,u=false,m=null,y=0,h=false;function x(o){let e=o.tweens.map((s,f)=>{let d=s.delay??0,w=d+s.duration;return Object.assign({},s,{start:d,end:w,_from:s.from??0,_i:f})}),t=new Map;for(let s of e){let f=`${String(s.target)}|${String(s.property)}`,d=t.get(f);d||(d={key:f,target:s.target,property:s.property,base:0,tweens:[]},t.set(f,d)),d.tweens.push(s);}let n=Array.from(t.values());for(let s of n)s.tweens.sort((f,d)=>f.start!==d.start?f.start-d.start:f._i-d._i);let c=e.reduce((s,f)=>Math.max(s,f.end),0);return {tracks:n,dur:c}}function A(){if(!(h||!i)){for(let o of g){let e=r.get(o.target,o.property);o.base=typeof e=="number"?e:0;let t=null;for(let n of o.tweens)n.from!==void 0?n._from=n.from:t&&t.end<=n.start?n._from=t.to:n._from=o.base,t=n;}h=true;}}function v(o){for(let e of g){let t=e.tweens,n=0,c=t.length-1,s=-1;for(;n<=c;){let d=n+c>>1;t[d].start<=o?(s=d,n=d+1):c=d-1;}let f;if(s===-1)f=e.base;else {let d=t[s],w=o-d.start;if(w<=0)f=d._from;else if(d.duration<=0)f=d.to;else if(w>=d.duration)f=d.to;else {let O=R(w/d.duration,0,1),M=L[d.easing??"linear"],I=M(O);f=d._from+(d.to-d._from)*I;}}r.set(e.target,e.property,f);}r.flush?.();}function a(o){if(!u)return;let e=o-y;if(y=o,l=Math.min(b,l+e),v(l),l>=b){u=false,m=null;return}m=globalThis.requestAnimationFrame(a);}let p={load(o){i=o;let e=x(o);return g=e.tracks,b=e.dur,l=0,h=false,m!=null&&(globalThis.cancelAnimationFrame(m),m=null),u=false,A(),v(0),p},play(){i&&(A(),!u&&(u=true,y=performance.now(),m=globalThis.requestAnimationFrame(a)));},pause(){u&&(u=false,m!=null&&(globalThis.cancelAnimationFrame(m),m=null));},seek(o){i&&(A(),l=R(o,0,b),v(l));},stop(){i&&(m!=null&&(globalThis.cancelAnimationFrame(m),m=null),u=false,l=0,A(),v(0));},isPlaying(){return u},time(){return l},duration(){return b}};return p}function C(r){let{flush:i}=r,g={},b={},l={},u={};function m(a,p){g[a]=p;}function y(a,p,o){o.get&&(l[a]=l[a]??{},l[a][p]=o.get),o.set&&(u[a]=u[a]??{},u[a][p]=o.set);}function h(a,p){let o=g[a];if(o){if(p&&p!==o)throw new Error(`Animation adapter: kind "${a}" already registered with a different resolver`);if(b[a])return b[a];let t={prop(n,c){return y(a,n,c),t}};return b[a]=t,t}if(!p)throw new Error(`Animation adapter: kind "${a}" is not registered yet`);m(a,p);let e={prop(t,n){return y(a,t,n),e}};return b[a]=e,e}function x(a){let p=String(a).indexOf(":");if(p===-1)return;let o=String(a).slice(0,p),e=String(a).slice(p+1),t=g[o];if(!t)return;let n=t(e);if(n!==void 0)return {kind:o,el:n}}function A(a,p){let o=x(a);if(!o)return;let{kind:e,el:t}=o,c=(l[e]??{})[String(p)];if(c)return c(t)}function v(a,p,o){let e=x(a);if(!e)return;let{kind:t,el:n}=e,s=(u[t]??{})[String(p)];s&&s(n,o);}return {get:A,set:v,flush:i,kind:h,register:y}}function N(r,i){let g=new Map(r.nodes.map(e=>[e.id,e])),b=new Map(r.edges.map(e=>[e.id,e])),l=r.overlays??[],u=new Map;for(let e of l){let t=e.key??e.id;u.set(t,e);}let m=C({flush:i}),y=m.kind("node",e=>g.get(e)),h=m.kind("edge",e=>b.get(e)),x=m.kind("overlay",e=>u.get(e));y.prop("x",{get:e=>{let t=e;return t.runtime?.x??t.pos.x},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.x=t;}}).prop("y",{get:e=>{let t=e;return t.runtime?.y??t.pos.y},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.y=t;}}).prop("opacity",{get:e=>{let t=e;return t.runtime?.opacity??t.style?.opacity??1},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.opacity=t;}}).prop("scale",{get:e=>e.runtime?.scale??1,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.scale=t;}}).prop("rotation",{get:e=>e.runtime?.rotation,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.rotation=t;}}),h.prop("opacity",{get:e=>e.runtime?.opacity??1,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.opacity=t;}}).prop("strokeDashoffset",{get:e=>e.runtime?.strokeDashoffset,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.strokeDashoffset=t;}});let A=(e,t)=>{let s=e.params?.[t];return typeof s=="number"&&Number.isFinite(s)?s:void 0},v=(e,t,n)=>{let c=e,s=c.params,f=s&&typeof s=="object"&&!Array.isArray(s)?s:{};f[t]=n,c.params=f,c[E]=true;},a=e=>{let t=String(e);if(!t.startsWith("overlay:"))return;let n=t.slice(8);return u.get(n)};x.prop("progress",{get:e=>A(e,"progress"),set:(e,t)=>v(e,"progress",t)});let p=m.get,o=m.set;return {...m,get(e,t){let n=p(e,t);if(n!==void 0)return n;let c=a(e);if(c)return A(c,String(t))},set(e,t,n){o(e,t,n);let c=a(e);c&&v(c,String(t),n);}}}function W(r){let i=N(r.scene,r.requestRender);return r.extendAdapter?.(i),P(i)}function H(r){let i=r.builder.build();return W({scene:i,requestRender:()=>r.builder.patchRuntime(r.container),extendAdapter:r.extendAdapter})}function Q(r){let i=V(r.spec),g=i.length>0||r.extendAdapter?l=>{for(let u of i)u(l);r.extendAdapter?.(l);}:void 0,b=H({builder:r.builder,container:r.container,extendAdapter:g});return b.load(r.spec),r.autoPlay!==false&&b.play(),b}exports.a=E;exports.b=V;exports.c=S;exports.d=D;exports.e=W;exports.f=H;exports.g=Q;
1
+ 'use strict';var E=Symbol("vizcraft.overlay.runtimeDirty");var k=Symbol("vizcraft.adapterExtensions");function V(r){let i=r[k];return Array.isArray(i)?i:[]}function T(r){return typeof r=="number"&&Number.isFinite(r)}function z(r,i){return `${r}:${i}`}var S=class{cursorMs=0;currentTarget=null;tweens=[];adapterExtensions=[];extendAdapter(i){return this.adapterExtensions.push(i),this}node(i){return this.currentTarget=z("node",i),this}overlay(i){return this.currentTarget=z("overlay",i),this}edge(i,g,b){let l=g===void 0?i:b??`${i}->${g}`;return this.currentTarget=z("edge",l),this}at(i){return this.cursorMs=Math.max(0,i),this}wait(i){return this.cursorMs=Math.max(0,this.cursorMs+Math.max(0,i)),this}to(i,g){if(!this.currentTarget)throw new Error("AnimationBuilder.to(): no target selected (call node(...), edge(...), or overlay(...))");let b=Math.max(0,g.duration),l=g.easing,u=g.from;for(let[m,y]of Object.entries(i)){if(!T(y))continue;let h={kind:"tween",target:this.currentTarget,property:m,to:y,duration:b,delay:this.cursorMs,easing:l},x=u?.[m];T(x)&&(h.from=x),this.tweens.push(h);}return this.cursorMs+=b,this}build(){let i={version:"viz-anim/1",tweens:[...this.tweens]};return this.adapterExtensions.length>0&&(i[k]=[...this.adapterExtensions]),i}};function D(r){let i=new S;return r(i),i.build()}function P(r,i=0,g=1){return Math.max(i,Math.min(g,r))}var L={linear:r=>r,easeIn:r=>r*r,easeOut:r=>1-(1-r)*(1-r),easeInOut:r=>r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2};function R(r){let i=null,g=[],b=0,l=0,u=false,m=null,y=0,h=false;function x(o){let e=o.tweens.map((s,f)=>{let d=s.delay??0,w=d+s.duration;return Object.assign({},s,{start:d,end:w,_from:s.from??0,_i:f})}),t=new Map;for(let s of e){let f=`${String(s.target)}|${String(s.property)}`,d=t.get(f);d||(d={key:f,target:s.target,property:s.property,base:0,tweens:[]},t.set(f,d)),d.tweens.push(s);}let n=Array.from(t.values());for(let s of n)s.tweens.sort((f,d)=>f.start!==d.start?f.start-d.start:f._i-d._i);let c=e.reduce((s,f)=>Math.max(s,f.end),0);return {tracks:n,dur:c}}function A(){if(!(h||!i)){for(let o of g){let e=r.get(o.target,o.property);o.base=typeof e=="number"?e:0;let t=null;for(let n of o.tweens)n.from!==void 0?n._from=n.from:t&&t.end<=n.start?n._from=t.to:n._from=o.base,t=n;}h=true;}}function v(o){for(let e of g){let t=e.tweens,n=0,c=t.length-1,s=-1;for(;n<=c;){let d=n+c>>1;t[d].start<=o?(s=d,n=d+1):c=d-1;}let f;if(s===-1)f=e.base;else {let d=t[s],w=o-d.start;if(w<=0)f=d._from;else if(d.duration<=0)f=d.to;else if(w>=d.duration)f=d.to;else {let O=P(w/d.duration,0,1),M=L[d.easing??"linear"],I=M(O);f=d._from+(d.to-d._from)*I;}}r.set(e.target,e.property,f);}r.flush?.();}function a(o){if(!u)return;let e=o-y;if(y=o,l=Math.min(b,l+e),v(l),l>=b){u=false,m=null;return}m=globalThis.requestAnimationFrame(a);}let p={load(o){i=o;let e=x(o);return g=e.tracks,b=e.dur,l=0,h=false,m!=null&&(globalThis.cancelAnimationFrame(m),m=null),u=false,A(),v(0),p},play(){i&&(A(),!u&&(u=true,y=performance.now(),m=globalThis.requestAnimationFrame(a)));},pause(){u&&(u=false,m!=null&&(globalThis.cancelAnimationFrame(m),m=null));},seek(o){i&&(A(),l=P(o,0,b),v(l));},stop(){i&&(m!=null&&(globalThis.cancelAnimationFrame(m),m=null),u=false,l=0,A(),v(0));},isPlaying(){return u},time(){return l},duration(){return b}};return p}function C(r){let{flush:i}=r,g={},b={},l={},u={};function m(a,p){g[a]=p;}function y(a,p,o){o.get&&(l[a]=l[a]??{},l[a][p]=o.get),o.set&&(u[a]=u[a]??{},u[a][p]=o.set);}function h(a,p){let o=g[a];if(o){if(p&&p!==o)throw new Error(`Animation adapter: kind "${a}" already registered with a different resolver`);if(b[a])return b[a];let t={prop(n,c){return y(a,n,c),t}};return b[a]=t,t}if(!p)throw new Error(`Animation adapter: kind "${a}" is not registered yet`);m(a,p);let e={prop(t,n){return y(a,t,n),e}};return b[a]=e,e}function x(a){let p=String(a).indexOf(":");if(p===-1)return;let o=String(a).slice(0,p),e=String(a).slice(p+1),t=g[o];if(!t)return;let n=t(e);if(n!==void 0)return {kind:o,el:n}}function A(a,p){let o=x(a);if(!o)return;let{kind:e,el:t}=o,c=(l[e]??{})[String(p)];if(c)return c(t)}function v(a,p,o){let e=x(a);if(!e)return;let{kind:t,el:n}=e,s=(u[t]??{})[String(p)];s&&s(n,o);}return {get:A,set:v,flush:i,kind:h,register:y}}function N(r,i){let g=new Map(r.nodes.map(e=>[e.id,e])),b=new Map(r.edges.map(e=>[e.id,e])),l=r.overlays??[],u=new Map;for(let e of l){let t=e.key??e.id;u.set(t,e);}let m=C({flush:i}),y=m.kind("node",e=>g.get(e)),h=m.kind("edge",e=>b.get(e)),x=m.kind("overlay",e=>u.get(e));y.prop("x",{get:e=>{let t=e;return t.runtime?.x??t.pos.x},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.x=t;}}).prop("y",{get:e=>{let t=e;return t.runtime?.y??t.pos.y},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.y=t;}}).prop("opacity",{get:e=>{let t=e;return t.runtime?.opacity??t.style?.opacity??1},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.opacity=t;}}).prop("scale",{get:e=>e.runtime?.scale??1,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.scale=t;}}).prop("rotation",{get:e=>e.runtime?.rotation,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.rotation=t;}}),h.prop("opacity",{get:e=>e.runtime?.opacity??1,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.opacity=t;}}).prop("strokeDashoffset",{get:e=>e.runtime?.strokeDashoffset,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.strokeDashoffset=t;}});let A=(e,t)=>{let s=e.params?.[t];return typeof s=="number"&&Number.isFinite(s)?s:void 0},v=(e,t,n)=>{let c=e,s=c.params,f=s&&typeof s=="object"&&!Array.isArray(s)?s:{};f[t]=n,c.params=f,c[E]=true;},a=e=>{let t=String(e);if(!t.startsWith("overlay:"))return;let n=t.slice(8);return u.get(n)};x.prop("progress",{get:e=>A(e,"progress"),set:(e,t)=>v(e,"progress",t)});let p=m.get,o=m.set;return {...m,get(e,t){let n=p(e,t);if(n!==void 0)return n;let c=a(e);if(c)return A(c,String(t))},set(e,t,n){o(e,t,n);let c=a(e);c&&v(c,String(t),n);}}}function W(r){let i=N(r.scene,r.requestRender);return r.extendAdapter?.(i),R(i)}function H(r){let i=r.builder.build();return W({scene:i,requestRender:()=>r.builder.patchRuntime(r.container),extendAdapter:r.extendAdapter})}function Q(r){let i=V(r.spec),g=i.length>0||r.extendAdapter?l=>{for(let u of i)u(l);r.extendAdapter?.(l);}:void 0,b=H({builder:r.builder,container:r.container,extendAdapter:g});return b.load(r.spec),r.autoPlay!==false&&b.play(),b}exports.a=E;exports.b=V;exports.c=S;exports.d=D;exports.e=W;exports.f=H;exports.g=Q;
@@ -1,4 +1,4 @@
1
- import {d,o,e,j as j$1,n,i}from'./chunk-I5FQBS5N.mjs';function vt(t,e,o,n={}){let r=n.minZoom??.1,i=n.maxZoom??5,l=n.zoomOnWheel??true,s=n.panOnDrag??true,c=1,u={x:0,y:0},a=false,y={x:0,y:0},v=[],E=()=>{v.forEach(d=>d({zoom:c,pan:u}));},b=()=>{e.setAttribute("transform",`translate(${u.x}, ${u.y}) scale(${c})`),E();},x=(d,m)=>{let P=Math.max(r,Math.min(i,d));if(P!==c){if(m){let w=P/c;u.x=m.x-(m.x-u.x)*w,u.y=m.y-(m.y-u.y)*w;}c=P,b();}},p=d=>{u={...d},b();},g=(d=20)=>{if(!o.viewBox)return null;let m=t.getBoundingClientRect();if(m.width===0||m.height===0)return null;let P=m.width-d*2,w=m.height-d*2,C=P/o.viewBox.w,N=w/o.viewBox.h,A=Math.min(C,N);A=Math.max(r,Math.min(i,A));let H=o.viewBox.w*A,tt=o.viewBox.h*A,et={x:(m.width-H)/2,y:(m.height-tt)/2};return {zoom:A,pan:et}},h=(d=20)=>{let m=g(d);m&&(c=m.zoom,u=m.pan,b());},V=()=>{n.initialZoom==="fit"||n.initialZoom===void 0?h():(x(n.initialZoom),p({x:0,y:0}));},z=d=>{let m=o.nodes.find(A=>A.id===d);if(!m)return;let P=t.getBoundingClientRect();if(P.width===0||P.height===0)return;let w=Math.max(r,Math.min(i,2)),C=P.width/2-m.pos.x*w,N=P.height/2-m.pos.y*w;c=w,u={x:C,y:N},b();},T=d=>{if(!l)return;d.preventDefault();let m=.002,P=-d.deltaY;d.deltaMode===1&&(P*=15);let w=Math.exp(P*m),C=c*w,N=t.getBoundingClientRect(),A={x:d.clientX-N.left,y:d.clientY-N.top};x(C,A);},S=d=>{if(!s)return;let m=d.target;(m.closest("[data-viz-role]")||m.closest(".viz-node")||m.closest(".viz-edge"))&&m!==t&&m!==e||(d.preventDefault(),a=true,y={x:d.clientX,y:d.clientY},t.setPointerCapture(d.pointerId),t.style.cursor="grabbing");},R=d=>{if(!a||!s)return;d.preventDefault();let m=d.clientX-y.x,P=d.clientY-y.y;u.x+=m,u.y+=P,y={x:d.clientX,y:d.clientY},b();},$=d=>{!a||!s||(a=false,t.releasePointerCapture(d.pointerId),t.style.cursor="");},f=d=>{let m=d.target;m.closest("[data-viz-role]")||m.closest(".viz-node")||m.closest(".viz-edge")||h();},L={passive:false};t.addEventListener("wheel",T,L),t.addEventListener("pointerdown",S),t.addEventListener("pointermove",R),t.addEventListener("pointerup",$),t.addEventListener("pointercancel",$),t.addEventListener("dblclick",f);let M=()=>{t.removeEventListener("wheel",T),t.removeEventListener("pointerdown",S),t.removeEventListener("pointermove",R),t.removeEventListener("pointerup",$),t.removeEventListener("pointercancel",$),t.removeEventListener("dblclick",f),v.length=0;};return requestAnimationFrame(()=>{V();}),{get zoom(){return c},get pan(){return {...u}},setZoom:x,setPan:p,fitToContent:h,zoomToNode:z,reset:V,onChange(d){return v.push(d),()=>{let m=v.indexOf(d);m!==-1&&v.splice(m,1);}},destroy:M}}var nt=`
1
+ import {d,o,e,j as j$1,n,i}from'./chunk-I5FQBS5N.mjs';function vt(t,e,o,n={}){let r=n.minZoom??.1,i=n.maxZoom??5,l=n.zoomOnWheel??true,s=n.panOnDrag??true,c=1,u={x:0,y:0},a=false,y={x:0,y:0},v=[],E=()=>{v.forEach(d=>d({zoom:c,pan:u}));},b=()=>{e.setAttribute("transform",`translate(${u.x}, ${u.y}) scale(${c})`),E();},x=(d,m)=>{let P=Math.max(r,Math.min(i,d));if(P!==c){if(m){let w=P/c;u.x=m.x-(m.x-u.x)*w,u.y=m.y-(m.y-u.y)*w;}c=P,b();}},p=d=>{u={...d},b();},g=(d=20)=>{if(!o.viewBox)return null;let m=t.getBoundingClientRect();if(m.width===0||m.height===0)return null;let P=m.width-d*2,w=m.height-d*2,C=P/o.viewBox.w,N=w/o.viewBox.h,A=Math.min(C,N);A=Math.max(r,Math.min(i,A));let H=o.viewBox.w*A,tt=o.viewBox.h*A,et={x:(m.width-H)/2,y:(m.height-tt)/2};return {zoom:A,pan:et}},h=(d=20)=>{let m=g(d);m&&(c=m.zoom,u=m.pan,b());},V=()=>{n.initialZoom==="fit"||n.initialZoom===void 0?h():(x(n.initialZoom),p(n.initialPan??{x:0,y:0}));},z=d=>{let m=o.nodes.find(A=>A.id===d);if(!m)return;let P=t.getBoundingClientRect();if(P.width===0||P.height===0)return;let w=Math.max(r,Math.min(i,2)),C=P.width/2-m.pos.x*w,N=P.height/2-m.pos.y*w;c=w,u={x:C,y:N},b();},T=d=>{if(!l)return;d.preventDefault();let m=.002,P=-d.deltaY;d.deltaMode===1&&(P*=15);let w=Math.exp(P*m),C=c*w,N=t.getBoundingClientRect(),A={x:d.clientX-N.left,y:d.clientY-N.top};x(C,A);},S=d=>{if(!s)return;let m=d.target;(m.closest("[data-viz-role]")||m.closest(".viz-node")||m.closest(".viz-edge"))&&m!==t&&m!==e||(d.preventDefault(),a=true,y={x:d.clientX,y:d.clientY},t.setPointerCapture(d.pointerId),t.style.cursor="grabbing");},R=d=>{if(!a||!s)return;d.preventDefault();let m=d.clientX-y.x,P=d.clientY-y.y;u.x+=m,u.y+=P,y={x:d.clientX,y:d.clientY},b();},$=d=>{!a||!s||(a=false,t.releasePointerCapture(d.pointerId),t.style.cursor="");},f=d=>{let m=d.target;m.closest("[data-viz-role]")||m.closest(".viz-node")||m.closest(".viz-edge")||h();},L={passive:false};t.addEventListener("wheel",T,L),t.addEventListener("pointerdown",S),t.addEventListener("pointermove",R),t.addEventListener("pointerup",$),t.addEventListener("pointercancel",$),t.addEventListener("dblclick",f);let M=()=>{t.removeEventListener("wheel",T),t.removeEventListener("pointerdown",S),t.removeEventListener("pointermove",R),t.removeEventListener("pointerup",$),t.removeEventListener("pointercancel",$),t.removeEventListener("dblclick",f),v.length=0;};return requestAnimationFrame(()=>{V();}),{get zoom(){return c},get pan(){return {...u}},setZoom:x,setPan:p,fitToContent:h,zoomToNode:z,reset:V,getState(){return {zoom:c,pan:{...u}}},onChange(d){return v.push(d),()=>{let m=v.indexOf(d);m!==-1&&v.splice(m,1);}},destroy:M}}var nt=`
2
2
  .viz-tooltip {
3
3
  position: absolute;
4
4
  pointer-events: none;
@@ -1 +1 @@
1
- var E=Symbol("vizcraft.overlay.runtimeDirty");var k=Symbol("vizcraft.adapterExtensions");function V(r){let i=r[k];return Array.isArray(i)?i:[]}function T(r){return typeof r=="number"&&Number.isFinite(r)}function z(r,i){return `${r}:${i}`}var S=class{cursorMs=0;currentTarget=null;tweens=[];adapterExtensions=[];extendAdapter(i){return this.adapterExtensions.push(i),this}node(i){return this.currentTarget=z("node",i),this}overlay(i){return this.currentTarget=z("overlay",i),this}edge(i,g,b){let l=g===void 0?i:b??`${i}->${g}`;return this.currentTarget=z("edge",l),this}at(i){return this.cursorMs=Math.max(0,i),this}wait(i){return this.cursorMs=Math.max(0,this.cursorMs+Math.max(0,i)),this}to(i,g){if(!this.currentTarget)throw new Error("AnimationBuilder.to(): no target selected (call node(...), edge(...), or overlay(...))");let b=Math.max(0,g.duration),l=g.easing,u=g.from;for(let[m,y]of Object.entries(i)){if(!T(y))continue;let h={kind:"tween",target:this.currentTarget,property:m,to:y,duration:b,delay:this.cursorMs,easing:l},x=u?.[m];T(x)&&(h.from=x),this.tweens.push(h);}return this.cursorMs+=b,this}build(){let i={version:"viz-anim/1",tweens:[...this.tweens]};return this.adapterExtensions.length>0&&(i[k]=[...this.adapterExtensions]),i}};function D(r){let i=new S;return r(i),i.build()}function R(r,i=0,g=1){return Math.max(i,Math.min(g,r))}var L={linear:r=>r,easeIn:r=>r*r,easeOut:r=>1-(1-r)*(1-r),easeInOut:r=>r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2};function P(r){let i=null,g=[],b=0,l=0,u=false,m=null,y=0,h=false;function x(o){let e=o.tweens.map((s,f)=>{let d=s.delay??0,w=d+s.duration;return Object.assign({},s,{start:d,end:w,_from:s.from??0,_i:f})}),t=new Map;for(let s of e){let f=`${String(s.target)}|${String(s.property)}`,d=t.get(f);d||(d={key:f,target:s.target,property:s.property,base:0,tweens:[]},t.set(f,d)),d.tweens.push(s);}let n=Array.from(t.values());for(let s of n)s.tweens.sort((f,d)=>f.start!==d.start?f.start-d.start:f._i-d._i);let c=e.reduce((s,f)=>Math.max(s,f.end),0);return {tracks:n,dur:c}}function A(){if(!(h||!i)){for(let o of g){let e=r.get(o.target,o.property);o.base=typeof e=="number"?e:0;let t=null;for(let n of o.tweens)n.from!==void 0?n._from=n.from:t&&t.end<=n.start?n._from=t.to:n._from=o.base,t=n;}h=true;}}function v(o){for(let e of g){let t=e.tweens,n=0,c=t.length-1,s=-1;for(;n<=c;){let d=n+c>>1;t[d].start<=o?(s=d,n=d+1):c=d-1;}let f;if(s===-1)f=e.base;else {let d=t[s],w=o-d.start;if(w<=0)f=d._from;else if(d.duration<=0)f=d.to;else if(w>=d.duration)f=d.to;else {let O=R(w/d.duration,0,1),M=L[d.easing??"linear"],I=M(O);f=d._from+(d.to-d._from)*I;}}r.set(e.target,e.property,f);}r.flush?.();}function a(o){if(!u)return;let e=o-y;if(y=o,l=Math.min(b,l+e),v(l),l>=b){u=false,m=null;return}m=globalThis.requestAnimationFrame(a);}let p={load(o){i=o;let e=x(o);return g=e.tracks,b=e.dur,l=0,h=false,m!=null&&(globalThis.cancelAnimationFrame(m),m=null),u=false,A(),v(0),p},play(){i&&(A(),!u&&(u=true,y=performance.now(),m=globalThis.requestAnimationFrame(a)));},pause(){u&&(u=false,m!=null&&(globalThis.cancelAnimationFrame(m),m=null));},seek(o){i&&(A(),l=R(o,0,b),v(l));},stop(){i&&(m!=null&&(globalThis.cancelAnimationFrame(m),m=null),u=false,l=0,A(),v(0));},isPlaying(){return u},time(){return l},duration(){return b}};return p}function C(r){let{flush:i}=r,g={},b={},l={},u={};function m(a,p){g[a]=p;}function y(a,p,o){o.get&&(l[a]=l[a]??{},l[a][p]=o.get),o.set&&(u[a]=u[a]??{},u[a][p]=o.set);}function h(a,p){let o=g[a];if(o){if(p&&p!==o)throw new Error(`Animation adapter: kind "${a}" already registered with a different resolver`);if(b[a])return b[a];let t={prop(n,c){return y(a,n,c),t}};return b[a]=t,t}if(!p)throw new Error(`Animation adapter: kind "${a}" is not registered yet`);m(a,p);let e={prop(t,n){return y(a,t,n),e}};return b[a]=e,e}function x(a){let p=String(a).indexOf(":");if(p===-1)return;let o=String(a).slice(0,p),e=String(a).slice(p+1),t=g[o];if(!t)return;let n=t(e);if(n!==void 0)return {kind:o,el:n}}function A(a,p){let o=x(a);if(!o)return;let{kind:e,el:t}=o,c=(l[e]??{})[String(p)];if(c)return c(t)}function v(a,p,o){let e=x(a);if(!e)return;let{kind:t,el:n}=e,s=(u[t]??{})[String(p)];s&&s(n,o);}return {get:A,set:v,flush:i,kind:h,register:y}}function N(r,i){let g=new Map(r.nodes.map(e=>[e.id,e])),b=new Map(r.edges.map(e=>[e.id,e])),l=r.overlays??[],u=new Map;for(let e of l){let t=e.key??e.id;u.set(t,e);}let m=C({flush:i}),y=m.kind("node",e=>g.get(e)),h=m.kind("edge",e=>b.get(e)),x=m.kind("overlay",e=>u.get(e));y.prop("x",{get:e=>{let t=e;return t.runtime?.x??t.pos.x},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.x=t;}}).prop("y",{get:e=>{let t=e;return t.runtime?.y??t.pos.y},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.y=t;}}).prop("opacity",{get:e=>{let t=e;return t.runtime?.opacity??t.style?.opacity??1},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.opacity=t;}}).prop("scale",{get:e=>e.runtime?.scale??1,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.scale=t;}}).prop("rotation",{get:e=>e.runtime?.rotation,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.rotation=t;}}),h.prop("opacity",{get:e=>e.runtime?.opacity??1,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.opacity=t;}}).prop("strokeDashoffset",{get:e=>e.runtime?.strokeDashoffset,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.strokeDashoffset=t;}});let A=(e,t)=>{let s=e.params?.[t];return typeof s=="number"&&Number.isFinite(s)?s:void 0},v=(e,t,n)=>{let c=e,s=c.params,f=s&&typeof s=="object"&&!Array.isArray(s)?s:{};f[t]=n,c.params=f,c[E]=true;},a=e=>{let t=String(e);if(!t.startsWith("overlay:"))return;let n=t.slice(8);return u.get(n)};x.prop("progress",{get:e=>A(e,"progress"),set:(e,t)=>v(e,"progress",t)});let p=m.get,o=m.set;return {...m,get(e,t){let n=p(e,t);if(n!==void 0)return n;let c=a(e);if(c)return A(c,String(t))},set(e,t,n){o(e,t,n);let c=a(e);c&&v(c,String(t),n);}}}function W(r){let i=N(r.scene,r.requestRender);return r.extendAdapter?.(i),P(i)}function H(r){let i=r.builder.build();return W({scene:i,requestRender:()=>r.builder.patchRuntime(r.container),extendAdapter:r.extendAdapter})}function Q(r){let i=V(r.spec),g=i.length>0||r.extendAdapter?l=>{for(let u of i)u(l);r.extendAdapter?.(l);}:void 0,b=H({builder:r.builder,container:r.container,extendAdapter:g});return b.load(r.spec),r.autoPlay!==false&&b.play(),b}export{E as a,V as b,S as c,D as d,W as e,H as f,Q as g};
1
+ var E=Symbol("vizcraft.overlay.runtimeDirty");var k=Symbol("vizcraft.adapterExtensions");function V(r){let i=r[k];return Array.isArray(i)?i:[]}function T(r){return typeof r=="number"&&Number.isFinite(r)}function z(r,i){return `${r}:${i}`}var S=class{cursorMs=0;currentTarget=null;tweens=[];adapterExtensions=[];extendAdapter(i){return this.adapterExtensions.push(i),this}node(i){return this.currentTarget=z("node",i),this}overlay(i){return this.currentTarget=z("overlay",i),this}edge(i,g,b){let l=g===void 0?i:b??`${i}->${g}`;return this.currentTarget=z("edge",l),this}at(i){return this.cursorMs=Math.max(0,i),this}wait(i){return this.cursorMs=Math.max(0,this.cursorMs+Math.max(0,i)),this}to(i,g){if(!this.currentTarget)throw new Error("AnimationBuilder.to(): no target selected (call node(...), edge(...), or overlay(...))");let b=Math.max(0,g.duration),l=g.easing,u=g.from;for(let[m,y]of Object.entries(i)){if(!T(y))continue;let h={kind:"tween",target:this.currentTarget,property:m,to:y,duration:b,delay:this.cursorMs,easing:l},x=u?.[m];T(x)&&(h.from=x),this.tweens.push(h);}return this.cursorMs+=b,this}build(){let i={version:"viz-anim/1",tweens:[...this.tweens]};return this.adapterExtensions.length>0&&(i[k]=[...this.adapterExtensions]),i}};function D(r){let i=new S;return r(i),i.build()}function P(r,i=0,g=1){return Math.max(i,Math.min(g,r))}var L={linear:r=>r,easeIn:r=>r*r,easeOut:r=>1-(1-r)*(1-r),easeInOut:r=>r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2};function R(r){let i=null,g=[],b=0,l=0,u=false,m=null,y=0,h=false;function x(o){let e=o.tweens.map((s,f)=>{let d=s.delay??0,w=d+s.duration;return Object.assign({},s,{start:d,end:w,_from:s.from??0,_i:f})}),t=new Map;for(let s of e){let f=`${String(s.target)}|${String(s.property)}`,d=t.get(f);d||(d={key:f,target:s.target,property:s.property,base:0,tweens:[]},t.set(f,d)),d.tweens.push(s);}let n=Array.from(t.values());for(let s of n)s.tweens.sort((f,d)=>f.start!==d.start?f.start-d.start:f._i-d._i);let c=e.reduce((s,f)=>Math.max(s,f.end),0);return {tracks:n,dur:c}}function A(){if(!(h||!i)){for(let o of g){let e=r.get(o.target,o.property);o.base=typeof e=="number"?e:0;let t=null;for(let n of o.tweens)n.from!==void 0?n._from=n.from:t&&t.end<=n.start?n._from=t.to:n._from=o.base,t=n;}h=true;}}function v(o){for(let e of g){let t=e.tweens,n=0,c=t.length-1,s=-1;for(;n<=c;){let d=n+c>>1;t[d].start<=o?(s=d,n=d+1):c=d-1;}let f;if(s===-1)f=e.base;else {let d=t[s],w=o-d.start;if(w<=0)f=d._from;else if(d.duration<=0)f=d.to;else if(w>=d.duration)f=d.to;else {let O=P(w/d.duration,0,1),M=L[d.easing??"linear"],I=M(O);f=d._from+(d.to-d._from)*I;}}r.set(e.target,e.property,f);}r.flush?.();}function a(o){if(!u)return;let e=o-y;if(y=o,l=Math.min(b,l+e),v(l),l>=b){u=false,m=null;return}m=globalThis.requestAnimationFrame(a);}let p={load(o){i=o;let e=x(o);return g=e.tracks,b=e.dur,l=0,h=false,m!=null&&(globalThis.cancelAnimationFrame(m),m=null),u=false,A(),v(0),p},play(){i&&(A(),!u&&(u=true,y=performance.now(),m=globalThis.requestAnimationFrame(a)));},pause(){u&&(u=false,m!=null&&(globalThis.cancelAnimationFrame(m),m=null));},seek(o){i&&(A(),l=P(o,0,b),v(l));},stop(){i&&(m!=null&&(globalThis.cancelAnimationFrame(m),m=null),u=false,l=0,A(),v(0));},isPlaying(){return u},time(){return l},duration(){return b}};return p}function C(r){let{flush:i}=r,g={},b={},l={},u={};function m(a,p){g[a]=p;}function y(a,p,o){o.get&&(l[a]=l[a]??{},l[a][p]=o.get),o.set&&(u[a]=u[a]??{},u[a][p]=o.set);}function h(a,p){let o=g[a];if(o){if(p&&p!==o)throw new Error(`Animation adapter: kind "${a}" already registered with a different resolver`);if(b[a])return b[a];let t={prop(n,c){return y(a,n,c),t}};return b[a]=t,t}if(!p)throw new Error(`Animation adapter: kind "${a}" is not registered yet`);m(a,p);let e={prop(t,n){return y(a,t,n),e}};return b[a]=e,e}function x(a){let p=String(a).indexOf(":");if(p===-1)return;let o=String(a).slice(0,p),e=String(a).slice(p+1),t=g[o];if(!t)return;let n=t(e);if(n!==void 0)return {kind:o,el:n}}function A(a,p){let o=x(a);if(!o)return;let{kind:e,el:t}=o,c=(l[e]??{})[String(p)];if(c)return c(t)}function v(a,p,o){let e=x(a);if(!e)return;let{kind:t,el:n}=e,s=(u[t]??{})[String(p)];s&&s(n,o);}return {get:A,set:v,flush:i,kind:h,register:y}}function N(r,i){let g=new Map(r.nodes.map(e=>[e.id,e])),b=new Map(r.edges.map(e=>[e.id,e])),l=r.overlays??[],u=new Map;for(let e of l){let t=e.key??e.id;u.set(t,e);}let m=C({flush:i}),y=m.kind("node",e=>g.get(e)),h=m.kind("edge",e=>b.get(e)),x=m.kind("overlay",e=>u.get(e));y.prop("x",{get:e=>{let t=e;return t.runtime?.x??t.pos.x},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.x=t;}}).prop("y",{get:e=>{let t=e;return t.runtime?.y??t.pos.y},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.y=t;}}).prop("opacity",{get:e=>{let t=e;return t.runtime?.opacity??t.style?.opacity??1},set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.opacity=t;}}).prop("scale",{get:e=>e.runtime?.scale??1,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.scale=t;}}).prop("rotation",{get:e=>e.runtime?.rotation,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.rotation=t;}}),h.prop("opacity",{get:e=>e.runtime?.opacity??1,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.opacity=t;}}).prop("strokeDashoffset",{get:e=>e.runtime?.strokeDashoffset,set:(e,t)=>{let n=e;n.runtime=n.runtime??{},n.runtime.strokeDashoffset=t;}});let A=(e,t)=>{let s=e.params?.[t];return typeof s=="number"&&Number.isFinite(s)?s:void 0},v=(e,t,n)=>{let c=e,s=c.params,f=s&&typeof s=="object"&&!Array.isArray(s)?s:{};f[t]=n,c.params=f,c[E]=true;},a=e=>{let t=String(e);if(!t.startsWith("overlay:"))return;let n=t.slice(8);return u.get(n)};x.prop("progress",{get:e=>A(e,"progress"),set:(e,t)=>v(e,"progress",t)});let p=m.get,o=m.set;return {...m,get(e,t){let n=p(e,t);if(n!==void 0)return n;let c=a(e);if(c)return A(c,String(t))},set(e,t,n){o(e,t,n);let c=a(e);c&&v(c,String(t),n);}}}function W(r){let i=N(r.scene,r.requestRender);return r.extendAdapter?.(i),R(i)}function H(r){let i=r.builder.build();return W({scene:i,requestRender:()=>r.builder.patchRuntime(r.container),extendAdapter:r.extendAdapter})}function Q(r){let i=V(r.spec),g=i.length>0||r.extendAdapter?l=>{for(let u of i)u(l);r.extendAdapter?.(l);}:void 0,b=H({builder:r.builder,container:r.container,extendAdapter:g});return b.load(r.spec),r.autoPlay!==false&&b.play(),b}export{E as a,V as b,S as c,D as d,W as e,H as f,Q as g};
@@ -1,4 +1,4 @@
1
- 'use strict';var chunkOZAFCKI7_js=require('./chunk-OZAFCKI7.js');function vt(t,e,o,n={}){let r=n.minZoom??.1,i=n.maxZoom??5,l=n.zoomOnWheel??true,s=n.panOnDrag??true,c=1,u={x:0,y:0},a=false,y={x:0,y:0},v=[],E=()=>{v.forEach(d=>d({zoom:c,pan:u}));},b=()=>{e.setAttribute("transform",`translate(${u.x}, ${u.y}) scale(${c})`),E();},x=(d,m)=>{let P=Math.max(r,Math.min(i,d));if(P!==c){if(m){let w=P/c;u.x=m.x-(m.x-u.x)*w,u.y=m.y-(m.y-u.y)*w;}c=P,b();}},p=d=>{u={...d},b();},g=(d=20)=>{if(!o.viewBox)return null;let m=t.getBoundingClientRect();if(m.width===0||m.height===0)return null;let P=m.width-d*2,w=m.height-d*2,C=P/o.viewBox.w,N=w/o.viewBox.h,A=Math.min(C,N);A=Math.max(r,Math.min(i,A));let H=o.viewBox.w*A,tt=o.viewBox.h*A,et={x:(m.width-H)/2,y:(m.height-tt)/2};return {zoom:A,pan:et}},h=(d=20)=>{let m=g(d);m&&(c=m.zoom,u=m.pan,b());},V=()=>{n.initialZoom==="fit"||n.initialZoom===void 0?h():(x(n.initialZoom),p({x:0,y:0}));},z=d=>{let m=o.nodes.find(A=>A.id===d);if(!m)return;let P=t.getBoundingClientRect();if(P.width===0||P.height===0)return;let w=Math.max(r,Math.min(i,2)),C=P.width/2-m.pos.x*w,N=P.height/2-m.pos.y*w;c=w,u={x:C,y:N},b();},T=d=>{if(!l)return;d.preventDefault();let m=.002,P=-d.deltaY;d.deltaMode===1&&(P*=15);let w=Math.exp(P*m),C=c*w,N=t.getBoundingClientRect(),A={x:d.clientX-N.left,y:d.clientY-N.top};x(C,A);},S=d=>{if(!s)return;let m=d.target;(m.closest("[data-viz-role]")||m.closest(".viz-node")||m.closest(".viz-edge"))&&m!==t&&m!==e||(d.preventDefault(),a=true,y={x:d.clientX,y:d.clientY},t.setPointerCapture(d.pointerId),t.style.cursor="grabbing");},R=d=>{if(!a||!s)return;d.preventDefault();let m=d.clientX-y.x,P=d.clientY-y.y;u.x+=m,u.y+=P,y={x:d.clientX,y:d.clientY},b();},$=d=>{!a||!s||(a=false,t.releasePointerCapture(d.pointerId),t.style.cursor="");},f=d=>{let m=d.target;m.closest("[data-viz-role]")||m.closest(".viz-node")||m.closest(".viz-edge")||h();},L={passive:false};t.addEventListener("wheel",T,L),t.addEventListener("pointerdown",S),t.addEventListener("pointermove",R),t.addEventListener("pointerup",$),t.addEventListener("pointercancel",$),t.addEventListener("dblclick",f);let M=()=>{t.removeEventListener("wheel",T),t.removeEventListener("pointerdown",S),t.removeEventListener("pointermove",R),t.removeEventListener("pointerup",$),t.removeEventListener("pointercancel",$),t.removeEventListener("dblclick",f),v.length=0;};return requestAnimationFrame(()=>{V();}),{get zoom(){return c},get pan(){return {...u}},setZoom:x,setPan:p,fitToContent:h,zoomToNode:z,reset:V,onChange(d){return v.push(d),()=>{let m=v.indexOf(d);m!==-1&&v.splice(m,1);}},destroy:M}}var nt=`
1
+ 'use strict';var chunkOZAFCKI7_js=require('./chunk-OZAFCKI7.js');function vt(t,e,o,n={}){let r=n.minZoom??.1,i=n.maxZoom??5,l=n.zoomOnWheel??true,s=n.panOnDrag??true,c=1,u={x:0,y:0},a=false,y={x:0,y:0},v=[],E=()=>{v.forEach(d=>d({zoom:c,pan:u}));},b=()=>{e.setAttribute("transform",`translate(${u.x}, ${u.y}) scale(${c})`),E();},x=(d,m)=>{let P=Math.max(r,Math.min(i,d));if(P!==c){if(m){let w=P/c;u.x=m.x-(m.x-u.x)*w,u.y=m.y-(m.y-u.y)*w;}c=P,b();}},p=d=>{u={...d},b();},g=(d=20)=>{if(!o.viewBox)return null;let m=t.getBoundingClientRect();if(m.width===0||m.height===0)return null;let P=m.width-d*2,w=m.height-d*2,C=P/o.viewBox.w,N=w/o.viewBox.h,A=Math.min(C,N);A=Math.max(r,Math.min(i,A));let H=o.viewBox.w*A,tt=o.viewBox.h*A,et={x:(m.width-H)/2,y:(m.height-tt)/2};return {zoom:A,pan:et}},h=(d=20)=>{let m=g(d);m&&(c=m.zoom,u=m.pan,b());},V=()=>{n.initialZoom==="fit"||n.initialZoom===void 0?h():(x(n.initialZoom),p(n.initialPan??{x:0,y:0}));},z=d=>{let m=o.nodes.find(A=>A.id===d);if(!m)return;let P=t.getBoundingClientRect();if(P.width===0||P.height===0)return;let w=Math.max(r,Math.min(i,2)),C=P.width/2-m.pos.x*w,N=P.height/2-m.pos.y*w;c=w,u={x:C,y:N},b();},T=d=>{if(!l)return;d.preventDefault();let m=.002,P=-d.deltaY;d.deltaMode===1&&(P*=15);let w=Math.exp(P*m),C=c*w,N=t.getBoundingClientRect(),A={x:d.clientX-N.left,y:d.clientY-N.top};x(C,A);},S=d=>{if(!s)return;let m=d.target;(m.closest("[data-viz-role]")||m.closest(".viz-node")||m.closest(".viz-edge"))&&m!==t&&m!==e||(d.preventDefault(),a=true,y={x:d.clientX,y:d.clientY},t.setPointerCapture(d.pointerId),t.style.cursor="grabbing");},R=d=>{if(!a||!s)return;d.preventDefault();let m=d.clientX-y.x,P=d.clientY-y.y;u.x+=m,u.y+=P,y={x:d.clientX,y:d.clientY},b();},$=d=>{!a||!s||(a=false,t.releasePointerCapture(d.pointerId),t.style.cursor="");},f=d=>{let m=d.target;m.closest("[data-viz-role]")||m.closest(".viz-node")||m.closest(".viz-edge")||h();},L={passive:false};t.addEventListener("wheel",T,L),t.addEventListener("pointerdown",S),t.addEventListener("pointermove",R),t.addEventListener("pointerup",$),t.addEventListener("pointercancel",$),t.addEventListener("dblclick",f);let M=()=>{t.removeEventListener("wheel",T),t.removeEventListener("pointerdown",S),t.removeEventListener("pointermove",R),t.removeEventListener("pointerup",$),t.removeEventListener("pointercancel",$),t.removeEventListener("dblclick",f),v.length=0;};return requestAnimationFrame(()=>{V();}),{get zoom(){return c},get pan(){return {...u}},setZoom:x,setPan:p,fitToContent:h,zoomToNode:z,reset:V,getState(){return {zoom:c,pan:{...u}}},onChange(d){return v.push(d),()=>{let m=v.indexOf(d);m!==-1&&v.splice(m,1);}},destroy:M}}var nt=`
2
2
  .viz-tooltip {
3
3
  position: absolute;
4
4
  pointer-events: none;
@@ -1,4 +1,4 @@
1
- import { b as VizScene, P as PanZoomOptions, c as PanZoomController, d as Vec2, V as VizNode } from './index-CvNQ2zQt.js';
1
+ import { b as VizScene, P as PanZoomOptions, c as PanZoomController, d as Vec2, V as VizNode } from './index-n9JLZMa1.js';
2
2
 
3
3
  declare function setupPanZoom(svg: SVGSVGElement, viewport: SVGGElement, scene: VizScene, options?: PanZoomOptions): PanZoomController;
4
4
 
@@ -1,4 +1,4 @@
1
- import { b as VizScene, P as PanZoomOptions, c as PanZoomController, d as Vec2, V as VizNode } from './index-CvNQ2zQt.mjs';
1
+ import { b as VizScene, P as PanZoomOptions, c as PanZoomController, d as Vec2, V as VizNode } from './index-n9JLZMa1.mjs';
2
2
 
3
3
  declare function setupPanZoom(svg: SVGSVGElement, viewport: SVGGElement, scene: VizScene, options?: PanZoomOptions): PanZoomController;
4
4
 
@@ -26,6 +26,8 @@ type SignalOverlayHop = {
26
26
  type SignalOverlayBaseParams = {
27
27
  progress: number;
28
28
  magnitude?: number;
29
+ color?: string;
30
+ glowColor?: string;
29
31
  resting?: boolean;
30
32
  parkAt?: string;
31
33
  parkOffsetX?: number;
@@ -1915,6 +1917,12 @@ interface PanZoomOptions {
1915
1917
  maxZoom?: number;
1916
1918
  /** Initial zoom level ('fit' or number, default: 'fit') */
1917
1919
  initialZoom?: 'fit' | number;
1920
+ /**
1921
+ * Initial pan offset applied after mount.
1922
+ * Only used when `initialZoom` is a number (ignored when `'fit'`).
1923
+ * Useful for restoring viewport state across scene rebuilds.
1924
+ */
1925
+ initialPan?: Vec2;
1918
1926
  /** Whether scroll wheel zooms (default: true) */
1919
1927
  zoomOnWheel?: boolean;
1920
1928
  /** Whether drag on empty space pans (default: true) */
@@ -1935,6 +1943,11 @@ interface PanZoomController {
1935
1943
  zoomToNode(nodeId: string, padding?: number): void;
1936
1944
  /** Reset pan and zoom to initial state */
1937
1945
  reset(): void;
1946
+ /** Return a snapshot of the current viewport state (zoom + pan). */
1947
+ getState(): {
1948
+ zoom: number;
1949
+ pan: Vec2;
1950
+ };
1938
1951
  /** Listen for viewport changes */
1939
1952
  onChange(cb: (state: {
1940
1953
  zoom: number;
@@ -26,6 +26,8 @@ type SignalOverlayHop = {
26
26
  type SignalOverlayBaseParams = {
27
27
  progress: number;
28
28
  magnitude?: number;
29
+ color?: string;
30
+ glowColor?: string;
29
31
  resting?: boolean;
30
32
  parkAt?: string;
31
33
  parkOffsetX?: number;
@@ -1915,6 +1917,12 @@ interface PanZoomOptions {
1915
1917
  maxZoom?: number;
1916
1918
  /** Initial zoom level ('fit' or number, default: 'fit') */
1917
1919
  initialZoom?: 'fit' | number;
1920
+ /**
1921
+ * Initial pan offset applied after mount.
1922
+ * Only used when `initialZoom` is a number (ignored when `'fit'`).
1923
+ * Useful for restoring viewport state across scene rebuilds.
1924
+ */
1925
+ initialPan?: Vec2;
1918
1926
  /** Whether scroll wheel zooms (default: true) */
1919
1927
  zoomOnWheel?: boolean;
1920
1928
  /** Whether drag on empty space pans (default: true) */
@@ -1935,6 +1943,11 @@ interface PanZoomController {
1935
1943
  zoomToNode(nodeId: string, padding?: number): void;
1936
1944
  /** Reset pan and zoom to initial state */
1937
1945
  reset(): void;
1946
+ /** Return a snapshot of the current viewport state (zoom + pan). */
1947
+ getState(): {
1948
+ zoom: number;
1949
+ pan: Vec2;
1950
+ };
1938
1951
  /** Listen for viewport changes */
1939
1952
  onChange(cb: (state: {
1940
1953
  zoom: number;
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { e as VizAnimSpec, V as VizNode, a as VizEdge, d as Vec2, E as EdgeRouting, f as EdgeLabel, b as VizScene, N as NodeShape, g as NodePort } from './index-CvNQ2zQt.mjs';
2
- export { az as AnimProperty, aF as AnimatableProps, aG as AnimationBuilder, p as AnimationConfig, A as AnimationDuration, aQ as AnimationHostAdapter, aC as AnimationSpec, ax as AnimationTarget, B as BadgePosition, ag as CircleOverlayParams, t as CollapseAnchor, u as CollapseIndicatorOptions, a5 as CompartmentBuilder, v as CompartmentClickContext, w as CompartmentEntry, C as ContainerConfig, ay as CoreAnimProperty, aE as CoreAnimatableProps, al as CoreOverlayRegistry, aj as CoreOverlayRenderContext, ak as CoreOverlayRenderer, ad as DataPoint, ae as DataPointsOverlayParams, aA as Ease, a7 as EdgeBuilder, F as EdgeMarkerType, H as EdgeOptions, I as EdgePathResolver, y as EntryOptions, x as EntryStyle, aI as ExtendAdapter, ac as GridLabelsOverlayParams, ai as GroupOverlayParams, K as KnownOverlayId, a2 as LayoutAlgorithm, $ as LayoutGraph, a0 as LayoutResult, a6 as NodeBuilder, o as NodeLabel, j as NodeMediaPosition, G as NodeOptions, J as OVERLAY_RUNTIME_DIRTY, au as OverlayAddOptions, av as OverlayBuilder, L as OverlayId, O as OverlayKindRegistry, M as OverlayParams, c as PanZoomController, P as PanZoomOptions, aJ as PlaybackController, aP as PropHandlers, aN as PropReader, aO as PropWriter, af as RectOverlayParams, aR as RegistrableAdapter, a4 as RichLabelBuilder, a8 as RichLabelBuilderImpl, n as RichText, R as RichTextToken, z as SceneChanges, aa as SignalOverlayHop, ab as SignalOverlayParams, S as SvgExportOptions, a1 as SyncLayoutAlgorithm, ah as TextOverlayParams, h as TooltipContent, T as TooltipSection, aD as TweenOptions, aB as TweenSpec, Q as TypedVizOverlaySpec, Y as VizBuildEvent, a3 as VizBuilder, _ as VizEventMap, W as VizGridConfig, Z as VizMountEvent, i as VizNodeBadge, s as VizNodeCompartment, l as VizNodeIcon, k as VizNodeImage, m as VizNodeSvgContent, U as VizOverlaySpec, X as VizPlugin, r as VizRuntimeEdgeProps, q as VizRuntimeNodeProps, D as VizSceneMutator, aH as buildAnimationSpec, aw as buildOverlaySpecs, aq as coreCircleOverlay, ao as coreDataPointOverlay, an as coreGridLabelsOverlay, as as coreGroupOverlay, ap as coreRectOverlay, am as coreSignalOverlay, ar as coreTextOverlay, aL as createBuilderPlayback, aK as createScenePlayback, at as defaultCoreOverlayRegistry, aM as playAnimationSpec, a9 as viz } from './index-CvNQ2zQt.mjs';
3
- export { H as HitResult, a as HitTestOptions, d as distanceSquare, e as edgeDistance, g as getEffectiveNodeBounds, h as hitTest, b as hitTestRect, n as nearestPort, p as pointInRect, s as setupPanZoom } from './hitTest-DRlIew9n.mjs';
1
+ import { e as VizAnimSpec, V as VizNode, a as VizEdge, d as Vec2, E as EdgeRouting, f as EdgeLabel, b as VizScene, N as NodeShape, g as NodePort } from './index-n9JLZMa1.mjs';
2
+ export { az as AnimProperty, aF as AnimatableProps, aG as AnimationBuilder, p as AnimationConfig, A as AnimationDuration, aQ as AnimationHostAdapter, aC as AnimationSpec, ax as AnimationTarget, B as BadgePosition, ag as CircleOverlayParams, t as CollapseAnchor, u as CollapseIndicatorOptions, a5 as CompartmentBuilder, v as CompartmentClickContext, w as CompartmentEntry, C as ContainerConfig, ay as CoreAnimProperty, aE as CoreAnimatableProps, al as CoreOverlayRegistry, aj as CoreOverlayRenderContext, ak as CoreOverlayRenderer, ad as DataPoint, ae as DataPointsOverlayParams, aA as Ease, a7 as EdgeBuilder, F as EdgeMarkerType, H as EdgeOptions, I as EdgePathResolver, y as EntryOptions, x as EntryStyle, aI as ExtendAdapter, ac as GridLabelsOverlayParams, ai as GroupOverlayParams, K as KnownOverlayId, a2 as LayoutAlgorithm, $ as LayoutGraph, a0 as LayoutResult, a6 as NodeBuilder, o as NodeLabel, j as NodeMediaPosition, G as NodeOptions, J as OVERLAY_RUNTIME_DIRTY, au as OverlayAddOptions, av as OverlayBuilder, L as OverlayId, O as OverlayKindRegistry, M as OverlayParams, c as PanZoomController, P as PanZoomOptions, aJ as PlaybackController, aP as PropHandlers, aN as PropReader, aO as PropWriter, af as RectOverlayParams, aR as RegistrableAdapter, a4 as RichLabelBuilder, a8 as RichLabelBuilderImpl, n as RichText, R as RichTextToken, z as SceneChanges, aa as SignalOverlayHop, ab as SignalOverlayParams, S as SvgExportOptions, a1 as SyncLayoutAlgorithm, ah as TextOverlayParams, h as TooltipContent, T as TooltipSection, aD as TweenOptions, aB as TweenSpec, Q as TypedVizOverlaySpec, Y as VizBuildEvent, a3 as VizBuilder, _ as VizEventMap, W as VizGridConfig, Z as VizMountEvent, i as VizNodeBadge, s as VizNodeCompartment, l as VizNodeIcon, k as VizNodeImage, m as VizNodeSvgContent, U as VizOverlaySpec, X as VizPlugin, r as VizRuntimeEdgeProps, q as VizRuntimeNodeProps, D as VizSceneMutator, aH as buildAnimationSpec, aw as buildOverlaySpecs, aq as coreCircleOverlay, ao as coreDataPointOverlay, an as coreGridLabelsOverlay, as as coreGroupOverlay, ap as coreRectOverlay, am as coreSignalOverlay, ar as coreTextOverlay, aL as createBuilderPlayback, aK as createScenePlayback, at as defaultCoreOverlayRegistry, aM as playAnimationSpec, a9 as viz } from './index-n9JLZMa1.mjs';
3
+ export { H as HitResult, a as HitTestOptions, d as distanceSquare, e as edgeDistance, g as getEffectiveNodeBounds, h as hitTest, b as hitTestRect, n as nearestPort, p as pointInRect, s as setupPanZoom } from './hitTest-DtkjchpB.mjs';
4
4
  export { SerializedScene, deserializeScene, serializeScene } from './serialization.mjs';
5
5
  export { CircularLayoutOptions, GridLayoutOptions, circularLayout, gridLayout } from './layout.mjs';
6
6
  export { EquidistantPort, PerimeterStrategy, findPortNearest, getEquidistantPorts, registerPerimeterStrategy, toNodePorts } from './ports.mjs';
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { e as VizAnimSpec, V as VizNode, a as VizEdge, d as Vec2, E as EdgeRouting, f as EdgeLabel, b as VizScene, N as NodeShape, g as NodePort } from './index-CvNQ2zQt.js';
2
- export { az as AnimProperty, aF as AnimatableProps, aG as AnimationBuilder, p as AnimationConfig, A as AnimationDuration, aQ as AnimationHostAdapter, aC as AnimationSpec, ax as AnimationTarget, B as BadgePosition, ag as CircleOverlayParams, t as CollapseAnchor, u as CollapseIndicatorOptions, a5 as CompartmentBuilder, v as CompartmentClickContext, w as CompartmentEntry, C as ContainerConfig, ay as CoreAnimProperty, aE as CoreAnimatableProps, al as CoreOverlayRegistry, aj as CoreOverlayRenderContext, ak as CoreOverlayRenderer, ad as DataPoint, ae as DataPointsOverlayParams, aA as Ease, a7 as EdgeBuilder, F as EdgeMarkerType, H as EdgeOptions, I as EdgePathResolver, y as EntryOptions, x as EntryStyle, aI as ExtendAdapter, ac as GridLabelsOverlayParams, ai as GroupOverlayParams, K as KnownOverlayId, a2 as LayoutAlgorithm, $ as LayoutGraph, a0 as LayoutResult, a6 as NodeBuilder, o as NodeLabel, j as NodeMediaPosition, G as NodeOptions, J as OVERLAY_RUNTIME_DIRTY, au as OverlayAddOptions, av as OverlayBuilder, L as OverlayId, O as OverlayKindRegistry, M as OverlayParams, c as PanZoomController, P as PanZoomOptions, aJ as PlaybackController, aP as PropHandlers, aN as PropReader, aO as PropWriter, af as RectOverlayParams, aR as RegistrableAdapter, a4 as RichLabelBuilder, a8 as RichLabelBuilderImpl, n as RichText, R as RichTextToken, z as SceneChanges, aa as SignalOverlayHop, ab as SignalOverlayParams, S as SvgExportOptions, a1 as SyncLayoutAlgorithm, ah as TextOverlayParams, h as TooltipContent, T as TooltipSection, aD as TweenOptions, aB as TweenSpec, Q as TypedVizOverlaySpec, Y as VizBuildEvent, a3 as VizBuilder, _ as VizEventMap, W as VizGridConfig, Z as VizMountEvent, i as VizNodeBadge, s as VizNodeCompartment, l as VizNodeIcon, k as VizNodeImage, m as VizNodeSvgContent, U as VizOverlaySpec, X as VizPlugin, r as VizRuntimeEdgeProps, q as VizRuntimeNodeProps, D as VizSceneMutator, aH as buildAnimationSpec, aw as buildOverlaySpecs, aq as coreCircleOverlay, ao as coreDataPointOverlay, an as coreGridLabelsOverlay, as as coreGroupOverlay, ap as coreRectOverlay, am as coreSignalOverlay, ar as coreTextOverlay, aL as createBuilderPlayback, aK as createScenePlayback, at as defaultCoreOverlayRegistry, aM as playAnimationSpec, a9 as viz } from './index-CvNQ2zQt.js';
3
- export { H as HitResult, a as HitTestOptions, d as distanceSquare, e as edgeDistance, g as getEffectiveNodeBounds, h as hitTest, b as hitTestRect, n as nearestPort, p as pointInRect, s as setupPanZoom } from './hitTest-B_G0nzwf.js';
1
+ import { e as VizAnimSpec, V as VizNode, a as VizEdge, d as Vec2, E as EdgeRouting, f as EdgeLabel, b as VizScene, N as NodeShape, g as NodePort } from './index-n9JLZMa1.js';
2
+ export { az as AnimProperty, aF as AnimatableProps, aG as AnimationBuilder, p as AnimationConfig, A as AnimationDuration, aQ as AnimationHostAdapter, aC as AnimationSpec, ax as AnimationTarget, B as BadgePosition, ag as CircleOverlayParams, t as CollapseAnchor, u as CollapseIndicatorOptions, a5 as CompartmentBuilder, v as CompartmentClickContext, w as CompartmentEntry, C as ContainerConfig, ay as CoreAnimProperty, aE as CoreAnimatableProps, al as CoreOverlayRegistry, aj as CoreOverlayRenderContext, ak as CoreOverlayRenderer, ad as DataPoint, ae as DataPointsOverlayParams, aA as Ease, a7 as EdgeBuilder, F as EdgeMarkerType, H as EdgeOptions, I as EdgePathResolver, y as EntryOptions, x as EntryStyle, aI as ExtendAdapter, ac as GridLabelsOverlayParams, ai as GroupOverlayParams, K as KnownOverlayId, a2 as LayoutAlgorithm, $ as LayoutGraph, a0 as LayoutResult, a6 as NodeBuilder, o as NodeLabel, j as NodeMediaPosition, G as NodeOptions, J as OVERLAY_RUNTIME_DIRTY, au as OverlayAddOptions, av as OverlayBuilder, L as OverlayId, O as OverlayKindRegistry, M as OverlayParams, c as PanZoomController, P as PanZoomOptions, aJ as PlaybackController, aP as PropHandlers, aN as PropReader, aO as PropWriter, af as RectOverlayParams, aR as RegistrableAdapter, a4 as RichLabelBuilder, a8 as RichLabelBuilderImpl, n as RichText, R as RichTextToken, z as SceneChanges, aa as SignalOverlayHop, ab as SignalOverlayParams, S as SvgExportOptions, a1 as SyncLayoutAlgorithm, ah as TextOverlayParams, h as TooltipContent, T as TooltipSection, aD as TweenOptions, aB as TweenSpec, Q as TypedVizOverlaySpec, Y as VizBuildEvent, a3 as VizBuilder, _ as VizEventMap, W as VizGridConfig, Z as VizMountEvent, i as VizNodeBadge, s as VizNodeCompartment, l as VizNodeIcon, k as VizNodeImage, m as VizNodeSvgContent, U as VizOverlaySpec, X as VizPlugin, r as VizRuntimeEdgeProps, q as VizRuntimeNodeProps, D as VizSceneMutator, aH as buildAnimationSpec, aw as buildOverlaySpecs, aq as coreCircleOverlay, ao as coreDataPointOverlay, an as coreGridLabelsOverlay, as as coreGroupOverlay, ap as coreRectOverlay, am as coreSignalOverlay, ar as coreTextOverlay, aL as createBuilderPlayback, aK as createScenePlayback, at as defaultCoreOverlayRegistry, aM as playAnimationSpec, a9 as viz } from './index-n9JLZMa1.js';
3
+ export { H as HitResult, a as HitTestOptions, d as distanceSquare, e as edgeDistance, g as getEffectiveNodeBounds, h as hitTest, b as hitTestRect, n as nearestPort, p as pointInRect, s as setupPanZoom } from './hitTest-5nKDL0YT.js';
4
4
  export { SerializedScene, deserializeScene, serializeScene } from './serialization.js';
5
5
  export { CircularLayoutOptions, GridLayoutOptions, circularLayout, gridLayout } from './layout.js';
6
6
  export { EquidistantPort, PerimeterStrategy, findPortNearest, getEquidistantPorts, registerPerimeterStrategy, toNodePorts } from './ports.js';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var chunkAE7VTFYG_js=require('./chunk-AE7VTFYG.js'),chunkTVRPABD2_js=require('./chunk-TVRPABD2.js'),chunkNHGHIK6R_js=require('./chunk-NHGHIK6R.js'),chunkE3Z7QMXI_js=require('./chunk-E3Z7QMXI.js'),chunkT5O2PDL6_js=require('./chunk-T5O2PDL6.js'),chunkOZAFCKI7_js=require('./chunk-OZAFCKI7.js');var at=`
1
+ 'use strict';var chunkC27QMQJJ_js=require('./chunk-C27QMQJJ.js'),chunkM3ZDZ24B_js=require('./chunk-M3ZDZ24B.js'),chunkNHGHIK6R_js=require('./chunk-NHGHIK6R.js'),chunkE3Z7QMXI_js=require('./chunk-E3Z7QMXI.js'),chunkT5O2PDL6_js=require('./chunk-T5O2PDL6.js'),chunkOZAFCKI7_js=require('./chunk-OZAFCKI7.js');var at=`
2
2
  .viz-canvas {
3
3
  width: 100%;
4
4
  height: 100%;
@@ -103,16 +103,16 @@
103
103
  stroke-linejoin: round;
104
104
  stroke-width: 2;
105
105
  }
106
- `;var dt=class{nodeAnims=new Map;edgeAnims=new Map;constructor(){}registerNode(e,t){return this.nodeAnims.set(e,t),this}registerEdge(e,t){return this.edgeAnims.set(e,t),this}getNodeRenderer(e){return this.nodeAnims.get(e)}getEdgeRenderer(e){return this.edgeAnims.get(e)}},nr={getClass:()=>"viz-anim-flow",getStyle:({spec:r})=>({"--viz-anim-duration":r.params?.duration??"2s"})},Te=new dt().registerEdge("flow",nr);function xi(r,e){let t=r.edges.find(n=>n.id===e);if(!t)return null;let i=new Map(r.nodes.map(n=>[n.id,n]));return ct(t,i)}function ct(r,e){let t=r.from?e.get(r.from)??null:null,i=r.to?e.get(r.to)??null:null;if(r.from&&!t||r.to&&!i||!t&&!r.fromAt&&!i&&!r.toAt)return null;let n=!!(t&&i&&t===i),a,d,c;if(n){let o=chunkTVRPABD2_js.g(t,r);a=o,d=o.exitPoint,c=o.entryPoint;}else {let o=chunkTVRPABD2_js.e(t,i,r);a=chunkTVRPABD2_js.f(o.start,o.end,r.routing,r.waypoints),d=o.start,c=o.end;}return {...a,startAnchor:d,endAnchor:c,startLabel:a.start,endLabel:a.end,waypoints:r.waypoints??[],isSelfLoop:n}}var or=/[MLQC]|-?(?:\d*\.\d+|\d+)(?:e[-+]?\d+)?/gi,_t=24;function Dt(r,e,t){let i=ct(r,e);return i?sr(i.d,t):null}function sr(r,e){let t=ar(r);if(t.length===0)return null;let i=t.filter(o=>o.type!=="M").map(o=>dr(o));if(i.length===0)return t.find(u=>u.type==="M")?.to??null;let n=i.reduce((o,u)=>o+u.length,0);if(n===0)return i[0]?.samples[0]?.point??null;let a=lr(e),d=n*a,c=0;for(let o of i){if(c+o.length>=d)return cr(o,d-c);c+=o.length;}return i[i.length-1]?.samples.at(-1)?.point??null}function lr(r){return !Number.isFinite(r)||r<=0?0:r>=1?1:r}function ar(r){let e=r.match(or);if(!e||e.length===0)return [];let t=[],i=null,n=0;for(;n<e.length;){let a=e[n++];if(!a)return [];switch(a){case "M":{let d=Ne(e,n);if(!d)return [];n+=2,i=d,t.push({type:"M",to:d});break}case "L":{if(!i)return [];let d=Ne(e,n);if(!d)return [];n+=2,t.push({type:"L",from:i,to:d}),i=d;break}case "Q":{if(!i)return [];let d=Ne(e,n),c=Ne(e,n+2);if(!d||!c)return [];n+=4,t.push({type:"Q",from:i,control:d,to:c}),i=c;break}case "C":{if(!i)return [];let d=Ne(e,n),c=Ne(e,n+2),o=Ne(e,n+4);if(!d||!c||!o)return [];n+=6,t.push({type:"C",from:i,control1:d,control2:c,to:o}),i=o;break}default:return []}}return t}function Ne(r,e){let t=Number(r[e]),i=Number(r[e+1]);return !Number.isFinite(t)||!Number.isFinite(i)?null:{x:t,y:i}}function dr(r){switch(r.type){case "L":return Mt([r.from,r.to]);case "Q":return Gt(_t,e=>ur(r.from,r.control,r.to,e));case "C":return Gt(_t,e=>gr(r.from,r.control1,r.control2,r.to,e))}}function Gt(r,e){let t=[];for(let i=0;i<=r;i++)t.push(e(i/r));return Mt(t)}function Mt(r){if(r.length===0)return {length:0,samples:[]};let e=[{distance:0,point:r[0]}],t=0;for(let i=1;i<r.length;i++)t+=mr(r[i-1],r[i]),e.push({distance:t,point:r[i]});return {length:t,samples:e}}function cr(r,e){let t=r.samples[0],i=r.samples.at(-1);if(!t)return {x:0,y:0};if(!i||e<=0)return t.point;if(e>=r.length)return i.point;for(let n=1;n<r.samples.length;n++){let a=r.samples[n-1],d=r.samples[n];if(d.distance>=e){let c=d.distance-a.distance,o=c===0?0:(e-a.distance)/c;return fr(a.point,d.point,o)}}return i.point}function ur(r,e,t,i){let n=1-i;return {x:n*n*r.x+2*n*i*e.x+i*i*t.x,y:n*n*r.y+2*n*i*e.y+i*i*t.y}}function gr(r,e,t,i,n){let a=1-n;return {x:a*a*a*r.x+3*a*a*n*e.x+3*a*n*n*t.x+n*n*n*i.x,y:a*a*a*r.y+3*a*a*n*e.y+3*a*n*n*t.y+n*n*n*i.y}}function mr(r,e){let t=e.x-r.x,i=e.y-r.y;return Math.sqrt(t*t+i*i)}function fr(r,e,t){return {x:r.x+(e.x-r.x)*t,y:r.y+(e.y-r.y)*t}}var ut=class{overlays=new Map;register(e,t){return this.overlays.set(e,t),this}get(e){return this.overlays.get(e)}};function hr(r,e,t){if(r.edgeId)return e.get(r.edgeId)??null;if(!r.followEdge)return null;let i=t.edges.filter(n=>n.from===r.from&&n.to===r.to);return i.length===1?i[0]:null}function pr(r){return Array.isArray(r.chain)}function yr(r){if(pr(r)){let e=r.chain.at(-1);if(!e)return null;let t=Number.isNaN(r.progress)?0:r.progress;if(t>=r.chain.length)return {hop:e,progress:1,parkedNodeId:r.parkAt??e.to,fallbackParkedNodeId:e.to,shouldPark:true};let i=!Number.isFinite(t)||t<=0?0:t,n=Math.min(Math.floor(i),r.chain.length-1),a=r.chain[n];return a?{hop:a,progress:i-n,parkedNodeId:r.parkAt??e.to,fallbackParkedNodeId:e.to,shouldPark:false}:null}return {hop:{from:r.from,to:r.to,followEdge:r.followEdge,edgeId:r.edgeId},progress:r.progress,parkedNodeId:r.parkAt??r.to,fallbackParkedNodeId:r.to,shouldPark:Number.isFinite(r.progress)&&r.progress>=1&&(r.resting===true||r.parkAt!==void 0)}}function br(r,e,t,i){let n=i.get(r)??i.get(e);if(!n)return null;let a=chunkOZAFCKI7_js.d(n);return {x:a.x+(t.parkOffsetX??0),y:a.y+(t.parkOffsetY??0)}}function vr(r,e,t,i){let n=yr(r);if(!n)return null;if(n.shouldPark)return br(n.parkedNodeId,n.fallbackParkedNodeId,r,e);let a=e.get(n.hop.from),d=e.get(n.hop.to);if(!a||!d)return null;let c=hr(n.hop,t,i);if(c){let g=Dt(c,e,n.progress);if(g)return g}let o=chunkOZAFCKI7_js.d(a),u=chunkOZAFCKI7_js.d(d);return {x:o.x+(u.x-o.x)*n.progress,y:o.y+(u.y-o.y)*n.progress}}var xr={render:({spec:r,nodesById:e,edgesById:t,scene:i})=>{let n=vr(r.params,e,t,i);if(!n)return "";let a=Math.abs(r.params.magnitude??1);a>1&&(a=1);let d=2+a*4,c=r.className??"viz-signal";return `
106
+ `;var dt=class{nodeAnims=new Map;edgeAnims=new Map;constructor(){}registerNode(e,t){return this.nodeAnims.set(e,t),this}registerEdge(e,t){return this.edgeAnims.set(e,t),this}getNodeRenderer(e){return this.nodeAnims.get(e)}getEdgeRenderer(e){return this.edgeAnims.get(e)}},nr={getClass:()=>"viz-anim-flow",getStyle:({spec:r})=>({"--viz-anim-duration":r.params?.duration??"2s"})},Te=new dt().registerEdge("flow",nr);function xi(r,e){let t=r.edges.find(n=>n.id===e);if(!t)return null;let i=new Map(r.nodes.map(n=>[n.id,n]));return ct(t,i)}function ct(r,e){let t=r.from?e.get(r.from)??null:null,i=r.to?e.get(r.to)??null:null;if(r.from&&!t||r.to&&!i||!t&&!r.fromAt&&!i&&!r.toAt)return null;let n=!!(t&&i&&t===i),a,d,c;if(n){let o=chunkM3ZDZ24B_js.g(t,r);a=o,d=o.exitPoint,c=o.entryPoint;}else {let o=chunkM3ZDZ24B_js.e(t,i,r);a=chunkM3ZDZ24B_js.f(o.start,o.end,r.routing,r.waypoints),d=o.start,c=o.end;}return {...a,startAnchor:d,endAnchor:c,startLabel:a.start,endLabel:a.end,waypoints:r.waypoints??[],isSelfLoop:n}}var or=/[MLQC]|-?(?:\d*\.\d+|\d+)(?:e[-+]?\d+)?/gi,_t=24;function Dt(r,e,t){let i=ct(r,e);return i?sr(i.d,t):null}function sr(r,e){let t=ar(r);if(t.length===0)return null;let i=t.filter(o=>o.type!=="M").map(o=>dr(o));if(i.length===0)return t.find(u=>u.type==="M")?.to??null;let n=i.reduce((o,u)=>o+u.length,0);if(n===0)return i[0]?.samples[0]?.point??null;let a=lr(e),d=n*a,c=0;for(let o of i){if(c+o.length>=d)return cr(o,d-c);c+=o.length;}return i[i.length-1]?.samples.at(-1)?.point??null}function lr(r){return !Number.isFinite(r)||r<=0?0:r>=1?1:r}function ar(r){let e=r.match(or);if(!e||e.length===0)return [];let t=[],i=null,n=0;for(;n<e.length;){let a=e[n++];if(!a)return [];switch(a){case "M":{let d=Ne(e,n);if(!d)return [];n+=2,i=d,t.push({type:"M",to:d});break}case "L":{if(!i)return [];let d=Ne(e,n);if(!d)return [];n+=2,t.push({type:"L",from:i,to:d}),i=d;break}case "Q":{if(!i)return [];let d=Ne(e,n),c=Ne(e,n+2);if(!d||!c)return [];n+=4,t.push({type:"Q",from:i,control:d,to:c}),i=c;break}case "C":{if(!i)return [];let d=Ne(e,n),c=Ne(e,n+2),o=Ne(e,n+4);if(!d||!c||!o)return [];n+=6,t.push({type:"C",from:i,control1:d,control2:c,to:o}),i=o;break}default:return []}}return t}function Ne(r,e){let t=Number(r[e]),i=Number(r[e+1]);return !Number.isFinite(t)||!Number.isFinite(i)?null:{x:t,y:i}}function dr(r){switch(r.type){case "L":return Mt([r.from,r.to]);case "Q":return Gt(_t,e=>ur(r.from,r.control,r.to,e));case "C":return Gt(_t,e=>gr(r.from,r.control1,r.control2,r.to,e))}}function Gt(r,e){let t=[];for(let i=0;i<=r;i++)t.push(e(i/r));return Mt(t)}function Mt(r){if(r.length===0)return {length:0,samples:[]};let e=[{distance:0,point:r[0]}],t=0;for(let i=1;i<r.length;i++)t+=mr(r[i-1],r[i]),e.push({distance:t,point:r[i]});return {length:t,samples:e}}function cr(r,e){let t=r.samples[0],i=r.samples.at(-1);if(!t)return {x:0,y:0};if(!i||e<=0)return t.point;if(e>=r.length)return i.point;for(let n=1;n<r.samples.length;n++){let a=r.samples[n-1],d=r.samples[n];if(d.distance>=e){let c=d.distance-a.distance,o=c===0?0:(e-a.distance)/c;return fr(a.point,d.point,o)}}return i.point}function ur(r,e,t,i){let n=1-i;return {x:n*n*r.x+2*n*i*e.x+i*i*t.x,y:n*n*r.y+2*n*i*e.y+i*i*t.y}}function gr(r,e,t,i,n){let a=1-n;return {x:a*a*a*r.x+3*a*a*n*e.x+3*a*n*n*t.x+n*n*n*i.x,y:a*a*a*r.y+3*a*a*n*e.y+3*a*n*n*t.y+n*n*n*i.y}}function mr(r,e){let t=e.x-r.x,i=e.y-r.y;return Math.sqrt(t*t+i*i)}function fr(r,e,t){return {x:r.x+(e.x-r.x)*t,y:r.y+(e.y-r.y)*t}}var ut=class{overlays=new Map;register(e,t){return this.overlays.set(e,t),this}get(e){return this.overlays.get(e)}};function hr(r,e,t){if(r.edgeId)return e.get(r.edgeId)??null;if(!r.followEdge)return null;let i=t.edges.filter(n=>n.from===r.from&&n.to===r.to);return i.length===1?i[0]:null}function pr(r){return Array.isArray(r.chain)}function yr(r){if(pr(r)){let e=r.chain.at(-1);if(!e)return null;let t=Number.isNaN(r.progress)?0:r.progress;if(t>=r.chain.length)return {hop:e,progress:1,parkedNodeId:r.parkAt??e.to,fallbackParkedNodeId:e.to,shouldPark:true};let i=!Number.isFinite(t)||t<=0?0:t,n=Math.min(Math.floor(i),r.chain.length-1),a=r.chain[n];return a?{hop:a,progress:i-n,parkedNodeId:r.parkAt??e.to,fallbackParkedNodeId:e.to,shouldPark:false}:null}return {hop:{from:r.from,to:r.to,followEdge:r.followEdge,edgeId:r.edgeId},progress:r.progress,parkedNodeId:r.parkAt??r.to,fallbackParkedNodeId:r.to,shouldPark:Number.isFinite(r.progress)&&r.progress>=1&&(r.resting===true||r.parkAt!==void 0)}}function br(r,e,t,i){let n=i.get(r)??i.get(e);if(!n)return null;let a=chunkOZAFCKI7_js.d(n);return {x:a.x+(t.parkOffsetX??0),y:a.y+(t.parkOffsetY??0)}}function vr(r,e,t,i){let n=yr(r);if(!n)return null;if(n.shouldPark)return br(n.parkedNodeId,n.fallbackParkedNodeId,r,e);let a=e.get(n.hop.from),d=e.get(n.hop.to);if(!a||!d)return null;let c=hr(n.hop,t,i);if(c){let g=Dt(c,e,n.progress);if(g)return g}let o=chunkOZAFCKI7_js.d(a),u=chunkOZAFCKI7_js.d(d);return {x:o.x+(u.x-o.x)*n.progress,y:o.y+(u.y-o.y)*n.progress}}var xr={render:({spec:r,nodesById:e,edgesById:t,scene:i})=>{let n=vr(r.params,e,t,i);if(!n)return "";let a=Math.abs(r.params.magnitude??1);a>1&&(a=1);let d=2+a*4,c=r.className??"viz-signal",o=r.params.color,u=r.params.glowColor??o,g=o?` style="fill: ${o}"`:"",m=u?` filter="drop-shadow(0 0 3px ${u})"`:"";return `
107
107
  <g transform="translate(${n.x}, ${n.y})">
108
- <g class="${c}">
108
+ <g class="${c}"${g}>
109
109
  <circle r="10" fill="transparent" stroke="none" />
110
- <circle r="${d}" class="viz-signal-shape" />
110
+ <circle r="${d}" class="viz-signal-shape"${m} />
111
111
  </g>
112
112
  </g>
113
- `}},Sr={render:({spec:r,scene:e})=>{let t=e.grid;if(!t)return "";let{w:i,h:n}=e.viewBox,{colLabels:a,rowLabels:d,yOffset:c=20,xOffset:o=20}=r.params,u=(i-t.padding.x*2)/t.cols,g=(n-t.padding.y*2)/t.rows,m="";return a&&Object.entries(a).forEach(([y,h])=>{let f=parseInt(y,10),E=t.padding.x+f*u+u/2,B=r.className||"viz-grid-label";m+=`<text x="${E}" y="${c}" class="${B}" text-anchor="middle">${h}</text>`;}),d&&Object.entries(d).forEach(([y,h])=>{let f=parseInt(y,10),E=t.padding.y+f*g+g/2,B=r.className||"viz-grid-label";m+=`<text x="${o}" y="${E}" dy=".35em" class="${B}" text-anchor="middle">${h}</text>`;}),m}},Ar={render:({spec:r,nodesById:e})=>{let{points:t}=r.params,i="";return t.forEach(n=>{let a=e.get(n.currentNodeId);if(!a)return;let d=parseInt(n.id.split("-")[1]||"0",10),c=(d%5-2)*10,o=(d%3-1)*10,u=a.pos.x+c,g=a.pos.y+o,m=r.className??"viz-data-point";i+=`<circle data-id="${n.id}" cx="${u}" cy="${g}" r="6" class="${m}" />`;}),i},update:({spec:r,nodesById:e},t)=>{let{points:i}=r.params,n="http://www.w3.org/2000/svg",a=new Map;Array.from(t.children).forEach(c=>{if(c.tagName==="circle"){let o=c.getAttribute("data-id");o&&a.set(o,c);}});let d=new Set;i.forEach(c=>{let o=e.get(c.currentNodeId);if(!o)return;d.add(c.id);let u=parseInt(c.id.split("-")[1]||"0",10),g=(u%5-2)*10,m=(u%3-1)*10,y=o.pos.x+g,h=o.pos.y+m,f=a.get(c.id);f||(f=document.createElementNS(n,"circle"),f.setAttribute("data-id",c.id),f.setAttribute("r","6"),t.appendChild(f)),f.setAttribute("cx",String(y)),f.setAttribute("cy",String(h));let E=r.className??"viz-data-point";f.getAttribute("class")!==E&&f.setAttribute("class",E);}),a.forEach((c,o)=>{d.has(o)||c.remove();});}},kr={render:({spec:r,nodesById:e})=>{let t=Wt(r.params,e);if(!t)return "";let{w:i,h:n,rx:a,ry:d,opacity:c,fill:o,stroke:u,strokeWidth:g}=r.params,m=r.className??"viz-overlay-rect",y=a!==void 0?` rx="${a}"`:"",h=d!==void 0?` ry="${d}"`:"",f=c!==void 0?` opacity="${c}"`:"",E=o===void 0,B=u===void 0,b=o??"#3b82f6",z=u??"#3b82f6",R=g??3,w=E?' fill-opacity="0.12"':"",s=B?' stroke-opacity="0.9"':"";return `<rect x="${t.x}" y="${t.y}" width="${i}" height="${n}" fill="${b}"${w} stroke="${z}"${s} stroke-width="${R}"${y}${h}${f} class="${m}" />`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Wt(r.params,e),{w:a,h:d,rx:c,ry:o,opacity:u,fill:g,stroke:m,strokeWidth:y}=r.params,h=r.className??"viz-overlay-rect",f=t.querySelector("rect");if(!n){f?.remove();return}f||(f=document.createElementNS(i,"rect"),t.appendChild(f)),f.setAttribute("x",String(n.x)),f.setAttribute("y",String(n.y)),f.setAttribute("width",String(a)),f.setAttribute("height",String(d)),g===void 0?(f.setAttribute("fill","#3b82f6"),f.setAttribute("fill-opacity","0.12")):(f.setAttribute("fill",g),f.removeAttribute("fill-opacity")),m===void 0?(f.setAttribute("stroke","#3b82f6"),f.setAttribute("stroke-opacity","0.9")):(f.setAttribute("stroke",m),f.removeAttribute("stroke-opacity")),f.setAttribute("stroke-width",String(y??3)),c!==void 0?f.setAttribute("rx",String(c)):f.removeAttribute("rx"),o!==void 0?f.setAttribute("ry",String(o)):f.removeAttribute("ry"),u!==void 0?f.setAttribute("opacity",String(u)):f.removeAttribute("opacity"),f.setAttribute("class",h);}},Er={render:({spec:r,nodesById:e})=>{let t=Xe(r.params,e);if(!t)return "";let{r:i,opacity:n,fill:a,stroke:d,strokeWidth:c}=r.params,o=r.className??"viz-overlay-circle",u=n!==void 0?` opacity="${n}"`:"",g=a===void 0,m=d===void 0,y=a??"#3b82f6",h=d??"#3b82f6",f=c??3,E=g?' fill-opacity="0.12"':"",B=m?' stroke-opacity="0.9"':"";return `<circle cx="${t.x}" cy="${t.y}" r="${i}" fill="${y}"${E} stroke="${h}"${B} stroke-width="${f}"${u} class="${o}" />`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Xe(r.params,e),{r:a,opacity:d,fill:c,stroke:o,strokeWidth:u}=r.params,g=r.className??"viz-overlay-circle",m=t.querySelector("circle");if(!n){m?.remove();return}m||(m=document.createElementNS(i,"circle"),t.appendChild(m)),m.setAttribute("cx",String(n.x)),m.setAttribute("cy",String(n.y)),m.setAttribute("r",String(a)),c===void 0?(m.setAttribute("fill","#3b82f6"),m.setAttribute("fill-opacity","0.12")):(m.setAttribute("fill",c),m.removeAttribute("fill-opacity")),o===void 0?(m.setAttribute("stroke","#3b82f6"),m.setAttribute("stroke-opacity","0.9")):(m.setAttribute("stroke",o),m.removeAttribute("stroke-opacity")),m.setAttribute("stroke-width",String(u??3)),d!==void 0?m.setAttribute("opacity",String(d)):m.removeAttribute("opacity"),m.setAttribute("class",g);}},zr={render:({spec:r,nodesById:e})=>{let t=Xe(r.params,e);if(!t)return "";let{text:i,opacity:n,fill:a,fontSize:d,fontWeight:c,textAnchor:o,dominantBaseline:u}=r.params,g=r.className??"viz-overlay-text",m=n!==void 0?` opacity="${n}"`:"",y=d!==void 0?` font-size="${d}"`:"",h=c!==void 0?` font-weight="${c}"`:"",f=o!==void 0?` text-anchor="${o}"`:"",E=u!==void 0?` dominant-baseline="${u}"`:"",B=a??"#111";return `<text x="${t.x}" y="${t.y}" fill="${B}"${m}${y}${h}${f}${E} class="${g}">${i}</text>`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Xe(r.params,e),{text:a,opacity:d,fill:c,fontSize:o,fontWeight:u,textAnchor:g,dominantBaseline:m}=r.params,y=r.className??"viz-overlay-text",h=t.querySelector("text");if(!n){h?.remove();return}h||(h=document.createElementNS(i,"text"),t.appendChild(h)),h.setAttribute("x",String(n.x)),h.setAttribute("y",String(n.y)),h.setAttribute("fill",c??"#111"),d!==void 0?h.setAttribute("opacity",String(d)):h.removeAttribute("opacity"),o!==void 0?h.setAttribute("font-size",String(o)):h.removeAttribute("font-size"),u!==void 0?h.setAttribute("font-weight",String(u)):h.removeAttribute("font-weight"),g!==void 0?h.setAttribute("text-anchor",g):h.removeAttribute("text-anchor"),m!==void 0?h.setAttribute("dominant-baseline",m):h.removeAttribute("dominant-baseline"),h.setAttribute("class",y),h.textContent=a;}};function It(r){let e=r.x??0,t=r.y??0,i=r.scale??1,n=r.rotation??0,a=[`translate(${e}, ${t})`];return n&&a.push(`rotate(${n})`),i!==1&&a.push(`scale(${i})`),a.join(" ")}function Ht(r){return r<0?0:r>1?1:r}function gt(r){return typeof r.nodeId=="string"&&r.nodeId.length>0}function mt(r,e){let t=e.get(r.nodeId);if(!t)return null;let i=chunkOZAFCKI7_js.d(t);return {x:i.x+(r.offsetX??0),y:i.y+(r.offsetY??0)}}function Xe(r,e){return gt(r)?mt(r,e):{x:r.x,y:r.y}}function Wt(r,e){if(gt(r)){let t=mt(r,e);return t?{x:t.x-r.w/2,y:t.y-r.h/2}:null}return {x:r.x,y:r.y}}function qt(r,e){let t=r.x??0,i=r.y??0,n=t,a=i;if(r.from&&r.to){let g=e.get(r.from),m=e.get(r.to);if(g&&m){let y=Ht(r.progress??0),h=chunkOZAFCKI7_js.d(g),f=chunkOZAFCKI7_js.d(m);n=h.x+(f.x-h.x)*y+t,a=h.y+(f.y-h.y)*y+i;}}else if(gt(r)){let g=mt(r,e);if(!g)return null;n=g.x+t,a=g.y+i;}let d=r.scale??1,c=r.magnitude,o=c===void 0?1:.85+.3*Ht(Math.abs(c)),u=d*o;return {x:n,y:a,scale:u,rotation:r.rotation??0}}var wr={render:({spec:r,nodesById:e,edgesById:t,scene:i,registry:n})=>{let{children:a,opacity:d}=r.params,c=qt(r.params,e);if(!c)return "";let o=It(c),u=d!==void 0?` opacity="${d}"`:"",g=n;if(!g)return `<g transform="${o}"${u}></g>`;let m=`<g transform="${o}"${u}>`;return a.forEach((y,h)=>{let f=g.get(y.id);if(!f)return;let E={spec:y,nodesById:e,edgesById:t,scene:i,registry:g},B=y.key?`key:${y.key}`:`idx:${h}:${y.id}`;m+=`<g data-viz-role="overlay-child" data-overlay-child-id="${B}">`,m+=f.render(E),m+="</g>";}),m+="</g>",m},update:({spec:r,nodesById:e,edgesById:t,scene:i,registry:n},a)=>{let d=n;if(!d)return;let{children:c,opacity:o}=r.params,u=qt(r.params,e);if(!u){a.removeAttribute("transform"),a.removeAttribute("opacity"),a.innerHTML="";return}a.setAttribute("transform",It(u)),o!==void 0?a.setAttribute("opacity",String(o)):a.removeAttribute("opacity");let g="http://www.w3.org/2000/svg",m=new Map;Array.from(a.children).forEach(h=>{if(h instanceof SVGGElement){let f=h.getAttribute("data-overlay-child-id");f&&m.set(f,h);}});let y=new Set;c.forEach((h,f)=>{let E=d.get(h.id);if(!E)return;let B=h.key?`key:${h.key}`:`idx:${f}:${h.id}`;y.add(B);let b=m.get(B);b||(b=document.createElementNS(g,"g"),b.setAttribute("data-viz-role","overlay-child"),b.setAttribute("data-overlay-child-id",B),a.appendChild(b));let z={spec:h,nodesById:e,edgesById:t,scene:i,registry:d};E.update?E.update(z,b):b.innerHTML=E.render(z);}),m.forEach((h,f)=>{y.has(f)||h.remove();});}},Ve=new ut().register("signal",xr).register("grid-labels",Sr).register("data-points",Ar).register("rect",kr).register("circle",Er).register("text",zr).register("group",wr);var _e=class r{specs=[];keyCounters=new Map;add(e,t,i){let n=i?.className,a=i?.key;if(!a&&this.specs.some(c=>c.id===e&&(c.key===void 0||c.key===""))){let c=(this.keyCounters.get(e)??0)+1;this.keyCounters.set(e,c),a=`${e}#${c}`;}return this.specs.push({id:e,params:t,key:a,className:n}),this}remove(e){for(let t=this.specs.length-1;t>=0;t--){let i=this.specs[t];if(!i)continue;let n=i.key===e,a=!i.key&&i.id===e;(n||a)&&this.specs.splice(t,1);}return this}clear(){return this.specs.length=0,this.keyCounters.clear(),this}build(){return [...this.specs]}rect(e,t){return this.add("rect",e,t)}circle(e,t){return this.add("circle",e,t)}text(e,t){return this.add("text",e,t)}group(e,t,i){let n=new r;t(n);let a=n.build();return this.add("group",{...e,children:a},i)}};function Bi(r){let e=new _e;return r(e),e.build()}var Br={solid:"",dashed:"8, 4",dotted:"2, 4","dash-dot":"8, 4, 2, 4"};function $e(r){return !r||r==="solid"?"":Br[r]??r}function Ge(r,e){let t=r.position==="start"?e.start:r.position==="end"?e.end:e.mid;return {x:t.x+(r.dx||0),y:t.y+(r.dy||0)}}function De(r){return r.labels&&r.labels.length>0?r.labels:r.label?[r.label]:[]}var Q="http://www.w3.org/2000/svg",Qe={dx:2,dy:2,blur:4,color:"rgba(0,0,0,0.2)"};function Cr(r){return {dx:r.dx??Qe.dx,dy:r.dy??Qe.dy,blur:r.blur??Qe.blur,color:r.color??Qe.color}}function Nr(r){let e=r.color.replace(/[^a-zA-Z0-9]/g,"_");return `viz-shadow-${r.dx}-${r.dy}-${r.blur}-${e}`}function Vr(r,e){let t=Cr(e),i=Nr(t);if(!r.querySelector(`#${CSS.escape(i)}`)){let n=r.querySelector("defs");if(n){let a=document.createElementNS(Q,"filter");a.setAttribute("id",i),a.setAttribute("x","-50%"),a.setAttribute("y","-50%"),a.setAttribute("width","200%"),a.setAttribute("height","200%");let d=document.createElementNS(Q,"feDropShadow");d.setAttribute("dx",String(t.dx)),d.setAttribute("dy",String(t.dy)),d.setAttribute("stdDeviation",String(t.blur)),d.setAttribute("flood-color",t.color),d.setAttribute("flood-opacity","1"),a.appendChild(d),n.appendChild(a);}}return i}function $r(r){return `viz-sketch-${r}`}function Pr(r,e){let t=(r^e*2654435761)>>>0|1;return t^=t<<13,t^=t>>>17,t^=t<<5,(t>>>0)/4294967296}function Me(r,e,t,i){return t+Pr(r,e)*(i-t)}function Ft(r,e){let t=$r(e);if(!r.querySelector(`#${CSS.escape(t)}`)){let i=r.querySelector("defs");if(i){let n=document.createElementNS(Q,"filter");n.setAttribute("id",t),n.setAttribute("filterUnits","userSpaceOnUse"),n.setAttribute("x","-10000"),n.setAttribute("y","-10000"),n.setAttribute("width","20000"),n.setAttribute("height","20000");let a=e+37,d=Me(e,1,.009,.015).toFixed(4),c=Me(e,2,2.5,4).toFixed(1),o=Me(e,3,3,5).toFixed(1),u=Me(e,4,.3,1.6).toFixed(2),g=Me(e,5,.2,1.3).toFixed(2),m=document.createElementNS(Q,"feTurbulence");m.setAttribute("type","fractalNoise"),m.setAttribute("baseFrequency","0.008"),m.setAttribute("numOctaves","2"),m.setAttribute("seed",String(e)),m.setAttribute("result","n1"),n.appendChild(m);let y=document.createElementNS(Q,"feTurbulence");y.setAttribute("type","fractalNoise"),y.setAttribute("baseFrequency",d),y.setAttribute("numOctaves","2"),y.setAttribute("seed",String(a)),y.setAttribute("result","n2"),n.appendChild(y);let h=document.createElementNS(Q,"feDisplacementMap");h.setAttribute("in","SourceGraphic"),h.setAttribute("in2","n1"),h.setAttribute("scale",c),h.setAttribute("xChannelSelector","R"),h.setAttribute("yChannelSelector","G"),h.setAttribute("result","s1"),n.appendChild(h);let f=document.createElementNS(Q,"feDisplacementMap");f.setAttribute("in","SourceGraphic"),f.setAttribute("in2","n2"),f.setAttribute("scale",o),f.setAttribute("xChannelSelector","G"),f.setAttribute("yChannelSelector","R"),f.setAttribute("result","s2"),n.appendChild(f);let E=document.createElementNS(Q,"feOffset");E.setAttribute("in","s2"),E.setAttribute("dx",u),E.setAttribute("dy",g),E.setAttribute("result","s2off"),n.appendChild(E);let B=document.createElementNS(Q,"feComposite");B.setAttribute("in","s1"),B.setAttribute("in2","s2off"),B.setAttribute("operator","over"),n.appendChild(B),i.appendChild(n);}}return t}function Or(r,e){if(r?.sketchSeed!==void 0)return r.sketchSeed;let t=0;for(let i=0;i<e.length;i++)t=Math.imul(31,t)+e.charCodeAt(i)|0;return Math.abs(t)}function Lr(r){return r.replace(/[^a-zA-Z0-9]/g,"_")}function ht(r,e,t="end"){if(r==="none")return "";let i=`viz-${r}`,n=t==="start"?"-start":"";return e?`${i}${n}-${Lr(e)}`:`${i}${n}`}function Rr(r,e){switch(r){case "arrow":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,2 10,5 0,8"),t.setAttribute("fill",e),t}case "arrowOpen":{let t=document.createElementNS(Q,"polyline");return t.setAttribute("points","0,2 10,5 0,8"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t.setAttribute("stroke-linejoin","miter"),t}case "diamond":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,5 5,2 10,5 5,8"),t.setAttribute("fill",e),t}case "diamondOpen":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,5 5,2 10,5 5,8"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t}case "circle":{let t=document.createElementNS(Q,"circle");return t.setAttribute("cx","5"),t.setAttribute("cy","5"),t.setAttribute("r","3"),t.setAttribute("fill",e),t}case "circleOpen":{let t=document.createElementNS(Q,"circle");return t.setAttribute("cx","5"),t.setAttribute("cy","5"),t.setAttribute("r","3"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t}case "square":{let t=document.createElementNS(Q,"rect");return t.setAttribute("x","2"),t.setAttribute("y","2"),t.setAttribute("width","6"),t.setAttribute("height","6"),t.setAttribute("fill",e),t}case "bar":{let t=document.createElementNS(Q,"line");return t.setAttribute("x1","5"),t.setAttribute("y1","1"),t.setAttribute("x2","5"),t.setAttribute("y2","9"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","2"),t.setAttribute("stroke-linecap","round"),t}case "halfArrow":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,2 10,5 0,5"),t.setAttribute("fill",e),t}default:return null}}function jt(r,e,t="arrow",i="end"){let n=ht(t,e,i);if(!n)return "";if(!r.querySelector(`#${CSS.escape(n)}`)){let a=r.querySelector("defs");if(a){let d=document.createElementNS(Q,"marker");d.setAttribute("id",n),d.setAttribute("viewBox","0 0 10 10"),d.setAttribute("markerWidth","10"),d.setAttribute("markerHeight","10"),d.setAttribute("refX","9"),d.setAttribute("refY","5"),d.setAttribute("orient",i==="start"?"auto-start-reverse":"auto");let c=Rr(t,e);c&&d.appendChild(c),a.appendChild(d);}}return n}function Ie(r,e){let t=new Map,i=new Map,n=new Map,a=new Map,d=new Map,c=new Map,o=new Map,u=new Map,g=new Map,m=new Map,y=r.querySelector('[data-viz-layer="nodes"]')||r.querySelector(".viz-layer-nodes");if(y){let f=Array.from(y.querySelectorAll("g[data-id]"));for(let E of f){let B=E.getAttribute("data-id");if(!B)continue;t.set(B,E);let b=E.querySelector('[data-viz-role="node-shape"]')||E.querySelector(".viz-node-shape");b&&i.set(B,b);let z=E.querySelector('[data-viz-role="node-label"]')||E.querySelector(".viz-node-label");z&&n.set(B,z);let R=E.querySelector('[data-viz-role="node-image"]')||E.querySelector(".viz-node-image");R&&a.set(B,R);let w=E.querySelector('[data-viz-role="node-icon"]')||E.querySelector(".viz-node-icon");w&&d.set(B,w);let s=E.querySelector('[data-viz-role="node-svg"]')||E.querySelector(".viz-node-svg");s&&c.set(B,s);}}let h=r.querySelector('[data-viz-layer="edges"]')||r.querySelector(".viz-layer-edges");if(h){let f=Array.from(h.querySelectorAll("g[data-id]"));for(let E of f){let B=E.getAttribute("data-id");if(!B)continue;o.set(B,E);let b=E.querySelector('[data-viz-role="edge-line"]')||E.querySelector(".viz-edge");b&&u.set(B,b);let z=E.querySelector('[data-viz-role="edge-hit"]')||E.querySelector(".viz-edge-hit");z&&g.set(B,z);let R=Array.from(E.querySelectorAll('[data-viz-role="edge-label"],.viz-edge-label'));R.length>0&&m.set(B,R);}}return {svg:r,edgePathResolver:e?.edgePathResolver??null,nodeGroupsById:t,nodeShapesById:i,nodeLabelsById:n,nodeImagesById:a,nodeIconsById:d,nodeSvgsById:c,edgeGroupsById:o,edgeLinesById:u,edgeHitsById:g,edgeLabelsById:m}}function Tr(r){let e=0,t=0;if(r&&typeof r=="object"){let i=r;typeof i.w=="number"?e=i.w:typeof i.r=="number"?e=i.r*2:typeof i.rx=="number"&&typeof i.ry=="number"?(e=i.rx*2,t=i.ry*2):typeof i.size=="number"?e=i.size:typeof i.outerR=="number"&&(e=i.outerR*2),typeof i.h=="number"?t=i.h:t===0&&(t=e);}return {w:e,h:t}}function ft(r,e,t,i,n,a,d){let c=d?.position??"center",o=d?.dx??0,u=d?.dy??0,g=0,m=0;switch(c){case "above":m=-i/2-a/2;break;case "below":m=i/2+a/2;break;case "left":g=-t/2-n/2;break;case "right":g=t/2+n/2;break;}return {x:r+g-n/2+o,y:e+m-a/2+u}}function pt(r,e){let t=new Map(r.nodes.map(o=>[o.id,o])),i=new Map;for(let o of r.nodes)if(o.container){let u=(o.runtime?.x??o.pos.x)-o.pos.x,g=(o.runtime?.y??o.pos.y)-o.pos.y;(u!==0||g!==0)&&i.set(o.id,{dx:u,dy:g});}for(let o of r.nodes){let u=e.nodeGroupsById.get(o.id),g=e.nodeShapesById.get(o.id);if(!u||!g)continue;let{x:m,y}=chunkOZAFCKI7_js.d(o);if(o.parentId){let w=i.get(o.parentId);w&&(m+=w.dx,y+=w.dy);}let h=chunkOZAFCKI7_js.e(o);chunkOZAFCKI7_js.g(g,h,{x:m,y});let{w:f,h:E}=Tr(h);if(f>0&&E>0){let w=e.nodeImagesById.get(o.id);if(w&&o.image){let A=ft(m,y,f,E,o.image.width,o.image.height,{position:o.image.position,dx:o.image.dx,dy:o.image.dy});w.setAttribute("x",String(A.x)),w.setAttribute("y",String(A.y));}let s=e.nodeIconsById.get(o.id);if(s&&o.icon){let A=ft(m,y,f,E,o.icon.size,o.icon.size,{position:o.icon.position,dx:o.icon.dx,dy:o.icon.dy});s.setAttribute("transform",`translate(${A.x} ${A.y})`);}let v=e.nodeSvgsById.get(o.id);if(v&&o.svgContent){let A=ft(m,y,f,E,o.svgContent.width,o.svgContent.height,{position:o.svgContent.position,dx:o.svgContent.dx,dy:o.svgContent.dy});v.setAttribute("transform",`translate(${A.x} ${A.y})`);}}if(o.container?.headerHeight&&"w"in h&&"h"in h){let w=u.querySelector('[data-viz-role="container-header"]');if(w){let s=h.w,v=h.h,A=y-v/2+o.container.headerHeight;w.setAttribute("x1",String(m-s/2)),w.setAttribute("y1",String(A)),w.setAttribute("x2",String(m+s/2)),w.setAttribute("y2",String(A));}}let B=e.nodeLabelsById.get(o.id);if(B&&o.label){let w=m+(o.label.dx||0),s=y+(o.label.dy||0);if(o.container?.headerHeight&&"h"in h&&!o.label.dy){let A=h.h;s=y-A/2+o.container.headerHeight/2,w=m+(o.label.dx||0);}B.setAttribute("x",String(w)),B.setAttribute("y",String(s));let v=B.querySelectorAll('tspan[data-viz-role="text-line"]');for(let A=0;A<v.length;A++)v[A]?.setAttribute("x",String(w));}if(o.runtime?.opacity!==void 0?(u.style.opacity=String(o.runtime.opacity),g.removeAttribute("opacity")):(u.style.removeProperty("opacity"),o.style?.opacity!==void 0?g.setAttribute("opacity",String(o.style.opacity)):g.removeAttribute("opacity")),o.style?.shadow){let w=Vr(e.svg,o.style.shadow);g.setAttribute("filter",`url(#${w})`);}else g.removeAttribute("filter");if(o.style?.sketch||r.sketch?.enabled){let w=Or(o.style,o.id),s=Ft(e.svg,w);u.setAttribute("filter",`url(#${s})`),u.classList.contains("viz-sketch")||u.classList.add("viz-sketch");}else {u.classList.contains("viz-sketch")&&u.classList.remove("viz-sketch");let w=u.getAttribute("filter");w&&w.startsWith("url(#viz-sketch-")&&u.removeAttribute("filter");}let z=o.runtime?.scale,R=o.runtime?.rotation;if(z!==void 0||R!==void 0){let w=z??1,s=R??0;u.setAttribute("transform",`translate(${m} ${y}) rotate(${s}) scale(${w}) translate(${-m} ${-y})`);}else u.removeAttribute("transform");o.ports&&u.querySelectorAll('[data-viz-role="port"]').forEach(s=>{let v=s.getAttribute("data-port"),A=o.ports.find(_=>_.id===v);A&&(s.setAttribute("cx",String(m+A.offset.x)),s.setAttribute("cy",String(y+A.offset.y)));});}let n=e.edgePathResolver;for(let o of r.edges){let u=e.edgeGroupsById.get(o.id),g=e.edgeLinesById.get(o.id);if(!u||!g)continue;let m=o.from?t.get(o.from)??null:null,y=o.to?t.get(o.to)??null:null;if(o.from&&!m||o.to&&!y||!m&&!o.fromAt&&!y&&!o.toAt)continue;let h;if(m&&y&&m===y)h=chunkTVRPABD2_js.g(m,o);else {let b=chunkTVRPABD2_js.e(m,y,o);h=chunkTVRPABD2_js.f(b.start,b.end,o.routing,o.waypoints);}if(n){let b=z=>{let R=z.from?t.get(z.from)??null:null,w=z.to?t.get(z.to)??null:null;if(z.from&&!R||z.to&&!w||!R&&!z.fromAt&&!w&&!z.toAt)return "";if(R&&w&&R===w)return chunkTVRPABD2_js.g(R,z).d;let s=chunkTVRPABD2_js.e(R,w,z);return chunkTVRPABD2_js.f(s.start,s.end,z.routing,z.waypoints).d};try{let z=n(o,r,b);typeof z=="string"&&z&&(h.d=z);}catch(z){console.warn(`RuntimePatcher: edge path resolver threw for edge ${o.id}`,z);}}if(g.setAttribute("d",h.d),o.style?.stroke!==void 0&&(g.style.stroke=o.style.stroke),o.style?.strokeWidth!==void 0&&(g.style.strokeWidth=String(o.style.strokeWidth)),o.style?.fill!==void 0&&(g.style.fill=o.style.fill),o.style?.opacity!==void 0&&(g.style.opacity=String(o.style.opacity)),o.style?.strokeDasharray!==void 0&&(g.style.strokeDasharray=$e(o.style.strokeDasharray)),o.markerEnd&&o.markerEnd!=="none"){let b=o.style?.stroke?jt(e.svg,o.style.stroke,o.markerEnd,"end"):ht(o.markerEnd,void 0,"end");g.setAttribute("marker-end",`url(#${b})`);}else g.removeAttribute("marker-end");if(o.markerStart&&o.markerStart!=="none"){let b=o.style?.stroke?jt(e.svg,o.style.stroke,o.markerStart,"start"):ht(o.markerStart,void 0,"start");g.setAttribute("marker-start",`url(#${b})`);}else g.removeAttribute("marker-start");let f=e.edgeHitsById.get(o.id);f&&f.setAttribute("d",h.d);let E=e.edgeLabelsById.get(o.id);if(E){let b=De(o);E.forEach((z,R)=>{let w=b[R];if(!w)return;let s=Ge(w,h);z.setAttribute("x",String(s.x)),z.setAttribute("y",String(s.y));let v=z.querySelectorAll('tspan[data-viz-role="text-line"]');for(let A=0;A<v.length;A++)v[A]?.setAttribute("x",String(s.x));});}if(o.runtime?.opacity!==void 0?u.style.opacity=String(o.runtime.opacity):u.style.removeProperty("opacity"),o.runtime?.strokeDashoffset!==void 0?(g.style.strokeDashoffset=String(o.runtime.strokeDashoffset),g.setAttribute("stroke-dashoffset",String(o.runtime.strokeDashoffset))):(g.style.removeProperty("stroke-dashoffset"),g.removeAttribute("stroke-dashoffset")),o.style?.sketch||r.sketch?.enabled){let b=0;for(let w=0;w<o.id.length;w++)b=Math.imul(31,b)+o.id.charCodeAt(w)|0;let z=Math.abs(b),R=Ft(e.svg,z);g.setAttribute("filter",`url(#${R})`),u.classList.contains("viz-sketch")||u.classList.add("viz-sketch");}else {let b=g.getAttribute("filter");b&&b.startsWith("url(#viz-sketch-")&&g.removeAttribute("filter"),u.classList.contains("viz-sketch")&&u.classList.remove("viz-sketch");}}let a=[],d=new Map;for(let o of r.nodes)if(o.parentId){let u=d.get(o.parentId);u||(u=[],d.set(o.parentId,u)),u.push(o);}else a.push(o);a.sort((o,u)=>(o.zIndex||0)-(u.zIndex||0));let c=e.svg.querySelector('[data-viz-layer="nodes"]')||e.svg.querySelector(".viz-layer-nodes");if(c){let o=c.firstElementChild;for(let u of a){let g=e.nodeGroupsById.get(u.id);g&&(o!==g?c.insertBefore(g,o):o=o.nextElementSibling);}}for(let[o,u]of d.entries()){u.sort((y,h)=>(y.zIndex||0)-(h.zIndex||0));let g=e.nodeGroupsById.get(o);if(!g)continue;let m=g.querySelector(':scope > [data-viz-role="container-children"]');if(m){let y=m.firstElementChild;for(let h of u){let f=e.nodeGroupsById.get(h.id);f&&(y!==f?m.insertBefore(f,y):y=y.nextElementSibling);}}}}function yt(r,e,t=12){let i=r.split(`
114
- `);if(!e)return i;let n=[],a=Math.max(1,Math.floor(e/(t*.6)));for(let d of i){if(d.length<=a){n.push(d);continue}let c=d.split(" "),o="";for(let u of c){let g=o?`${o} ${u}`:u;g.length<=a?o=g:o?(n.push(o),o=u):(n.push(u),o="");}o&&n.push(o);}return n}var _r=1.2;function ye(r,e,t,i={}){let{className:n="",fill:a,fontSize:d,fontWeight:c,fontFamily:o,textAnchor:u="middle",dominantBaseline:g="middle",maxWidth:m,lineHeight:y=_r,verticalAlign:h="middle",overflow:f}=i,E=12;if(typeof d=="number")E=d;else if(typeof d=="string"){let _=parseFloat(d);isNaN(_)||(E=_);}let B=typeof t!="string",b=[],z=[];if(B)z=Gr(t.tokens);else if(b=yt(t,m,E),m&&f&&f!=="visible")if(f==="ellipsis"&&b.length>2){let _=b[1];_&&(b=[b[0],_.substring(0,Math.max(0,_.length-3))+"..."]);}else f==="clip"&&b.length>2&&(b=[b[0],b[1]]);let R=[];a!==void 0&&R.push(`fill="${a}"`),d!==void 0&&R.push(`font-size="${d}"`),c!==void 0&&R.push(`font-weight="${c}"`),o!==void 0&&R.push(`font-family="${He(o)}"`),R.push(`text-anchor="${u}"`),g&&R.push(`dominant-baseline="${g}"`);let w=R.length>0?" "+R.join(" "):"",s=B?z.length:b.length,v=0;h==="middle"?v=-((s-1)*y)/2:h==="bottom"?v=-((s-1)*y):h==="top"&&(v=0);let A=B?z.map((_,l)=>{let N=Kt(l,v,y),k=_.map(q=>Dr(q)).join("");return `<tspan data-viz-role="text-line" x="${r}" dy="${N}">${k}</tspan>`}):b.map((_,l)=>{let N=Kt(l,v,y);return `<tspan data-viz-role="text-line" x="${r}" dy="${N}">${bt(_)}</tspan>`});return `<text x="${r}" y="${e}" class="${n}"${w}>${A.join("")}</text>`}function Kt(r,e,t){return r===0?e===0?"0":`${e}em`:`${t}em`}function Gr(r){let e=[[]];for(let t of r){if(t.kind==="newline"){e.push([]);continue}t.kind==="span"&&e[e.length-1].push(t);}return e.length===0?[[]]:e}function Dr(r){let e=[];r.className&&e.push(`class="${He(r.className)}"`),r.fill!==void 0&&e.push(`fill="${He(r.fill)}"`),r.fontSize!==void 0&&e.push(`font-size="${r.fontSize}"`),r.fontFamily?e.push(`font-family="${He(r.fontFamily)}"`):r.code&&e.push('font-family="monospace"');let t=r.fontWeight??(r.bold?"bold":void 0);t!==void 0&&e.push(`font-weight="${t}"`),r.italic&&e.push('font-style="italic"'),r.underline&&e.push('text-decoration="underline"'),r.baselineShift&&(e.push(`baseline-shift="${r.baselineShift}"`),r.fontSize===void 0&&e.push('font-size="0.8em"'));let n=`<tspan${e.length?" "+e.join(" "):""}>${bt(r.text)}</tspan>`;return r.href?`<a href="${He(r.href)}">${n}</a>`:n}function He(r){return bt(r)}function bt(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function Yt(r,e){if(e.at&&r.at(e.at.x,e.at.y),e.cell&&r.cell(e.cell.col,e.cell.row,e.cell.align),e.circle?r.circle(e.circle.r):e.rect?r.rect(e.rect.w,e.rect.h,e.rect.rx):e.diamond?r.diamond(e.diamond.w,e.diamond.h):e.cylinder?r.cylinder(e.cylinder.w,e.cylinder.h,e.cylinder.arcHeight):e.hexagon?r.hexagon(e.hexagon.r,e.hexagon.orientation):e.ellipse?r.ellipse(e.ellipse.rx,e.ellipse.ry):e.arc?r.arc(e.arc.r,e.arc.startAngle,e.arc.endAngle,e.arc.closed):e.blockArrow?r.blockArrow(e.blockArrow.length,e.blockArrow.bodyWidth,e.blockArrow.headWidth,e.blockArrow.headLength,e.blockArrow.direction):e.callout?r.callout(e.callout.w,e.callout.h,{rx:e.callout.rx,pointerSide:e.callout.pointerSide,pointerHeight:e.callout.pointerHeight,pointerWidth:e.callout.pointerWidth,pointerPosition:e.callout.pointerPosition}):e.cloud?r.cloud(e.cloud.w,e.cloud.h):e.cross?r.cross(e.cross.size,e.cross.barWidth):e.cube?r.cube(e.cube.w,e.cube.h,e.cube.depth):e.path?r.path(e.path.d,e.path.w,e.path.h):e.document?r.document(e.document.w,e.document.h,e.document.waveHeight):e.note?r.note(e.note.w,e.note.h,e.note.foldSize):e.parallelogram?r.parallelogram(e.parallelogram.w,e.parallelogram.h,e.parallelogram.skew):e.star?r.star(e.star.points,e.star.outerR,e.star.innerR):e.trapezoid?r.trapezoid(e.trapezoid.topW,e.trapezoid.bottomW,e.trapezoid.h):e.triangle&&r.triangle(e.triangle.w,e.triangle.h,e.triangle.direction),e.fill&&r.fill(e.fill),e.stroke&&(typeof e.stroke=="string"?r.stroke(e.stroke):r.stroke(e.stroke.color,e.stroke.width)),e.opacity!==void 0&&r.opacity(e.opacity),e.dash&&r.dash(e.dash),e.shadow!==void 0&&e.shadow!==false&&r.shadow(e.shadow===true?{}:e.shadow),e.sketch!==void 0&&e.sketch!==false&&r.sketch(e.sketch===true?{}:e.sketch),e.className&&r.class(e.className),e.zIndex!==void 0&&r.zIndex(e.zIndex),e.label)if(typeof e.label=="string")r.label(e.label);else {let t="text"in e.label&&typeof e.label.text=="string"?e.label.text:"";r.label(t,e.label);}if(e.image&&r.image(e.image.href,e.image.w,e.image.h,{dx:e.image.dx,dy:e.image.dy,position:e.image.position,preserveAspectRatio:e.image.preserveAspectRatio}),e.icon&&r.icon(e.icon.id,{size:e.icon.size,color:e.icon.color,dx:e.icon.dx,dy:e.icon.dy,position:e.icon.position}),e.svgContent&&r.svgContent(e.svgContent.content,e.svgContent.w,e.svgContent.h,{dx:e.svgContent.dx,dy:e.svgContent.dy,position:e.svgContent.position}),e.data!==void 0&&r.data(e.data),e.onClick&&r.onClick(e.onClick),e.tooltip!==void 0&&r.tooltip(e.tooltip),e.badges)for(let t of e.badges)r.badge(t.text,{position:t.position,fill:t.fill,background:t.background,fontSize:t.fontSize});if(e.ports)for(let t of e.ports)r.port(t.id,t.offset,t.direction);if(e.container&&r.container(e.container),e.parent&&r.parent(e.parent),e.compartments)for(let t of e.compartments)r.compartment(t.id,i=>{if(t.label)if(typeof t.label=="string")i.label(t.label);else {let{text:n,...a}=t.label;i.label(n,a);}if(t.entries)for(let n of t.entries)i.entry(n.id,n.text,{onClick:n.onClick,style:n.style,tooltip:n.tooltip,maxWidth:n.maxWidth,overflow:n.overflow,padding:n.padding,className:n.className});t.height!==void 0&&i.height(t.height),t.onClick&&i.onClick(t.onClick);});e.collapsed!==void 0&&r.collapsed(e.collapsed),e.collapseIndicator!==void 0&&r.collapseIndicator(e.collapseIndicator),e.collapseAnchor!==void 0&&r.collapseAnchor(e.collapseAnchor);}var Mr=30,Ut=16,vt=10;function Zt(r){let e=r.label&&typeof r.label.fontSize=="number"?r.label.fontSize:Ut,t=e*(r.label?.lineHeight??1.2),i=yt(r.text,r.label?.maxWidth,e);return t*i.length+r.paddingTop+r.paddingBottom}function Ir(r){if(r.explicitHeight!==void 0)return r.explicitHeight;if(r.entries&&r.entries.length>0){let i=vt*2;for(let n of r.entries)i+=Zt(n);return i}if(!r.label)return Mr;let e=(r.label.text.match(/\n/g)?.length??0)+1,t=typeof r.label.fontSize=="number"?r.label.fontSize:Ut;return e*t*(r.label.lineHeight??1.2)+vt*2}function Hr(r,e){let t=r.filter(d=>d.label||d.explicitHeight!==void 0||d.entries&&d.entries.length>0);if(t.length===0)return [];let i=0,n=t.map(d=>{let c=Ir(d),o={id:d.id,y:i,height:c};if(d.label&&(o.label=d.label),d.onClick&&(o.onClick=d.onClick),d.entries&&d.entries.length>0){let u=vt;o.entries=d.entries.map(g=>{let m=Zt(g),y={id:g.id,y:u,height:m,text:g.text};return g.label&&(y.label=g.label),g.onClick&&(y.onClick=g.onClick),g.tooltip&&(y.tooltip=g.tooltip),g.className&&(y.className=g.className),g.paddingTop&&(y.paddingTop=g.paddingTop),g.paddingBottom&&(y.paddingBottom=g.paddingBottom),u+=m,y});}return i+=c,o}),a=e.collapsed&&n.length>0?n[0].height:i;if(e.shape&&"h"in e.shape){let d=e.shape;(d.h===0||a>d.h||e.collapsed)&&(d.h=a);}return n}function Wr(r){return r===void 0?{top:0,bottom:0}:typeof r=="number"?{top:r,bottom:r}:{top:r.top??0,bottom:r.bottom??0}}var xt=class{_pending;constructor(e){this._pending={id:e};}label(e,t){return this._pending.entries&&this._pending.entries.length>0&&(console.warn(`[vizcraft] Compartment "${this._pending.id}": label() replaces existing entries. Use entry() or label(), not both.`),this._pending.entries=void 0),this._pending.label={text:e,...t,textAnchor:t?.textAnchor??"start"},this}height(e){return this._pending.explicitHeight=e,this}entry(e,t,i){this._pending.label&&(console.warn(`[vizcraft] Compartment "${this._pending.id}": entry() replaces existing label. Use entry() or label(), not both.`),this._pending.label=void 0),this._pending.entries||(this._pending.entries=[]);let n={text:t,textAnchor:"start",...i?.style&&{fill:i.style.fill,fontSize:i.style.fontSize,fontWeight:i.style.fontWeight??i.style.fontStyle,fontFamily:i.style.fontFamily},...i?.maxWidth!==void 0&&{maxWidth:i.maxWidth},...i?.overflow!==void 0&&{overflow:i.overflow}},{top:a,bottom:d}=Wr(i?.padding);return this._pending.entries.push({id:e,text:t,label:n,onClick:i?.onClick,tooltip:i?.tooltip,className:i?.className,paddingTop:a,paddingBottom:d}),this}onClick(e){return this._pending.onClick=e,this}},Je=class{_builder;nodeDef;_pendingCompartments=[];constructor(e,t){this._builder=e,this.nodeDef=t;}at(e,t){return this.nodeDef.pos={x:e,y:t},this}cell(e,t,i="center"){let n=this._builder._getGridConfig();if(!n)return console.warn("VizBuilder: .cell() called but no grid configured. Use .grid() first."),this;let a=this._builder._getViewBox(),d=a.w-n.padding.x*2,c=a.h-n.padding.y*2,o=d/n.cols,u=c/n.rows,g=n.padding.x+e*o,m=n.padding.y+t*u;return i==="center"?(g+=o/2,m+=u/2):i==="end"&&(g+=o,m+=u),this.nodeDef.pos={x:g,y:m},this}circle(e){return this.nodeDef.shape={kind:"circle",r:e},this}rect(e,t,i){return this.nodeDef.shape={kind:"rect",w:e,h:t,rx:i},this}diamond(e,t){return this.nodeDef.shape={kind:"diamond",w:e,h:t},this}cylinder(e,t,i){return this.nodeDef.shape={kind:"cylinder",w:e,h:t,arcHeight:i},this}hexagon(e,t){return this.nodeDef.shape={kind:"hexagon",r:e,orientation:t},this}ellipse(e,t){return this.nodeDef.shape={kind:"ellipse",rx:e,ry:t},this}arc(e,t,i,n){return this.nodeDef.shape={kind:"arc",r:e,startAngle:t,endAngle:i,closed:n},this}blockArrow(e,t,i,n,a){return this.nodeDef.shape={kind:"blockArrow",length:e,bodyWidth:t,headWidth:i,headLength:n,direction:a},this}callout(e,t,i){return this.nodeDef.shape={kind:"callout",w:e,h:t,rx:i?.rx,pointerSide:i?.pointerSide,pointerHeight:i?.pointerHeight,pointerWidth:i?.pointerWidth,pointerPosition:i?.pointerPosition},this}cloud(e,t){return this.nodeDef.shape={kind:"cloud",w:e,h:t},this}cross(e,t){return this.nodeDef.shape={kind:"cross",size:e,barWidth:t},this}cube(e,t,i){return this.nodeDef.shape={kind:"cube",w:e,h:t,depth:i},this}path(e,t,i){return this.nodeDef.shape={kind:"path",d:e,w:t,h:i},this}document(e,t,i){return this.nodeDef.shape={kind:"document",w:e,h:t,waveHeight:i},this}note(e,t,i){return this.nodeDef.shape={kind:"note",w:e,h:t,foldSize:i},this}parallelogram(e,t,i){return this.nodeDef.shape={kind:"parallelogram",w:e,h:t,skew:i},this}star(e,t,i){return this.nodeDef.shape={kind:"star",points:e,outerR:t,innerR:i},this}trapezoid(e,t,i){return this.nodeDef.shape={kind:"trapezoid",topW:e,bottomW:t,h:i},this}triangle(e,t,i){return this.nodeDef.shape={kind:"triangle",w:e,h:t,direction:i},this}image(e,t,i,n){let a=typeof t=="number"?{width:t,height:i??t,dx:n?.dx,dy:n?.dy,position:n?.position,preserveAspectRatio:n?.preserveAspectRatio}:{width:t.w,height:t.h,dx:t.dx,dy:t.dy,position:t.position,preserveAspectRatio:t.preserveAspectRatio},d={href:e,width:a.width,height:a.height};return a.dx!==void 0&&(d.dx=a.dx),a.dy!==void 0&&(d.dy=a.dy),a.position!==void 0&&(d.position=a.position),a.preserveAspectRatio!==void 0&&(d.preserveAspectRatio=a.preserveAspectRatio),this.nodeDef.image=d,this}icon(e,t){let i={id:e,size:t.size};return t.color!==void 0&&(i.color=t.color),t.dx!==void 0&&(i.dx=t.dx),t.dy!==void 0&&(i.dy=t.dy),t.position!==void 0&&(i.position=t.position),this.nodeDef.icon=i,this}svgContent(e,t,i,n){let a=typeof t=="number"?{width:t,height:i??t,dx:n?.dx,dy:n?.dy,position:n?.position}:{width:t.w,height:t.h,dx:t.dx,dy:t.dy,position:t.position},d={content:e,width:a.width,height:a.height};return a.dx!==void 0&&(d.dx=a.dx),a.dy!==void 0&&(d.dy=a.dy),a.position!==void 0&&(d.position=a.position),this.nodeDef.svgContent=d,this}label(e,t){return this.nodeDef.label={text:e,...t},this}richLabel(e,t){let i=new Oe;return e(i),this.nodeDef.label={text:"",...t,rich:i.build()},this}fill(e){return this.nodeDef.style={...this.nodeDef.style||{},fill:e},this}stroke(e,t){return this.nodeDef.style={...this.nodeDef.style||{},stroke:e,strokeWidth:t??this.nodeDef.style?.strokeWidth},this}opacity(e){return this.nodeDef.style={...this.nodeDef.style||{},opacity:e},this}dashed(){return this.nodeDef.style={...this.nodeDef.style||{},strokeDasharray:"dashed"},this}dotted(){return this.nodeDef.style={...this.nodeDef.style||{},strokeDasharray:"dotted"},this}dash(e){return this.nodeDef.style={...this.nodeDef.style||{},strokeDasharray:e},this}shadow(e){return this.nodeDef.style={...this.nodeDef.style||{},shadow:e??{}},this}sketch(e){return this.nodeDef.style={...this.nodeDef.style||{},sketch:true,sketchSeed:e?.seed},this}class(e){return this.nodeDef.className?this.nodeDef.className+=` ${e}`:this.nodeDef.className=e,this}zIndex(e){return this.nodeDef.zIndex=e,this}animate(e,t){if(typeof e=="string")return this.nodeDef.animations||(this.nodeDef.animations=[]),this.nodeDef.animations.push({id:e,params:t}),this;let i=this.nodeDef.id;if(!i)throw new Error("NodeBuilder.animate(cb): node has no id");return this._builder.animate(n=>{n.node(i),e(n);}),this}animateTo(e,t){return this.animate(i=>{i.to(e,t);})}data(e){return this.nodeDef.data=e,this}onClick(e){return this.nodeDef.onClick=e,this}container(e){return this.nodeDef.container=e??{layout:"free"},this}compartment(e,t){let i=new xt(e);return t&&t(i),this._pendingCompartments.push(i._pending),this}collapsed(e){return this.nodeDef.collapsed=e!==false,this}collapseIndicator(e){return this.nodeDef.collapseIndicator=e,this}collapseAnchor(e){return this.nodeDef.collapseAnchor=e,this}port(e,t,i){return this.nodeDef.ports||(this.nodeDef.ports=[]),this.nodeDef.ports.push({id:e,offset:t,direction:i}),this}parent(e){return this.nodeDef.parentId=e,this}tooltip(e){return this.nodeDef.tooltip=e,this}badge(e,t){return this.nodeDef.badges||(this.nodeDef.badges=[]),this.nodeDef.badges.push({text:e,position:t?.position??"top-left",fill:t?.fill,background:t?.background,fontSize:t?.fontSize}),this}_resolveCompartments(){this._pendingCompartments.length!==0&&(this.nodeDef.compartments=Hr(this._pendingCompartments,this.nodeDef));}done(){return this._resolveCompartments(),this._builder}node(e,t){return this._resolveCompartments(),this._builder.node(e,t)}edge(e,t,i){return this._resolveCompartments(),this._builder.edge(e,t,i)}danglingEdge(e,t){return this._resolveCompartments(),this._builder.danglingEdge(e,t)}overlay(e,t,i){return this._resolveCompartments(),typeof e=="function"?this._builder.overlay(e):this._builder.overlay(e,t,i)}build(){return this._resolveCompartments(),this._builder.build()}svg(e){return this._resolveCompartments(),this._builder.svg(e)}};function St(r,e){if(e.from&&r.from(e.from),e.to&&r.to(e.to),e.fromAt&&r.fromAt(e.fromAt),e.toAt&&r.toAt(e.toAt),e.routing&&r.routing(e.routing),e.waypoints)for(let t of e.waypoints)r.via(t.x,t.y);if(e.arrow!==void 0&&r.arrow(e.arrow),e.markerStart&&r.markerStart(e.markerStart),e.markerEnd&&r.markerEnd(e.markerEnd),e.loopSide&&r.loopSide(e.loopSide),e.loopSize&&r.loopSize(e.loopSize),e.stroke&&(typeof e.stroke=="string"?r.stroke(e.stroke):r.stroke(e.stroke.color,e.stroke.width)),e.fill&&r.fill(e.fill),e.opacity!==void 0&&r.opacity(e.opacity),e.dash&&r.dash(e.dash),e.sketch&&r.sketch(),e.className&&r.class(e.className),e.anchor&&r.connect(e.anchor),e.fromPort&&r.fromPort(e.fromPort),e.toPort&&r.toPort(e.toPort),e.fromAngle!==void 0&&r.fromAngle(e.fromAngle),e.toAngle!==void 0&&r.toAngle(e.toAngle),e.straightLine!==void 0&&(e.straightLine===true?r.straightLine():e.straightLine==="from"?r.straightLineFrom():e.straightLine==="to"&&r.straightLineTo()),e.label)if(typeof e.label=="string")r.label(e.label);else if(Array.isArray(e.label))for(let t of e.label){let i=typeof t.text=="string"?t.text:"";r.label(i,t);}else {let t="text"in e.label&&typeof e.label.text=="string"?e.label.text:"";r.label(t,e.label);}e.hitArea!==void 0&&r.hitArea(e.hitArea),e.meta!==void 0&&r.meta(e.meta),e.data!==void 0&&r.data(e.data),e.onClick&&r.onClick(e.onClick),e.tooltip!==void 0&&r.tooltip(e.tooltip);}var We=class{parent;edgeDef;constructor(e,t){this.parent=e,this.edgeDef=t;}straight(){return this.edgeDef.routing="straight",this}curved(){return this.edgeDef.routing="curved",this}orthogonal(){return this.edgeDef.routing="orthogonal",this}routing(e){return this.edgeDef.routing=e,this}via(e,t){return this.edgeDef.waypoints||(this.edgeDef.waypoints=[]),this.edgeDef.waypoints.push({x:e,y:t}),this}from(e){return this.edgeDef.from=e,this}to(e){return this.edgeDef.to=e,this}fromAt(e){return this.edgeDef.fromAt=e,this}toAt(e){return this.edgeDef.toAt=e,this}label(e,t){let i={position:"mid",text:e,dy:-10,...t};return this.edgeDef.labels||(this.edgeDef.labels=[]),this.edgeDef.labels.push(i),i.position==="mid"&&!this.edgeDef.label&&(this.edgeDef.label=i),this}richLabel(e,t){let i=new Oe;e(i);let n={position:"mid",text:"",dy:-10,...t,rich:i.build()};return this.edgeDef.labels||(this.edgeDef.labels=[]),this.edgeDef.labels.push(n),n.position==="mid"&&!this.edgeDef.label&&(this.edgeDef.label=n),this}arrow(e=true){return e==="both"?(this.edgeDef.markerStart="arrow",this.edgeDef.markerEnd="arrow"):e==="start"?this.edgeDef.markerStart="arrow":e==="end"?this.edgeDef.markerEnd="arrow":e===true?this.edgeDef.markerEnd="arrow":this.edgeDef.markerEnd="none",this}markerEnd(e){return this.edgeDef.markerEnd=e,this}markerStart(e){return this.edgeDef.markerStart=e,this}connect(e){return this.edgeDef.anchor=e,this}fromPort(e){return this.edgeDef.fromPort=e,this}toPort(e){return this.edgeDef.toPort=e,this}fromAngle(e){return this.edgeDef.fromAngle=e,this}toAngle(e){return this.edgeDef.toAngle=e,this}straightLine(){return this.edgeDef.straightLine=true,this}straightLineFrom(){return this.edgeDef.straightLine="from",this}straightLineTo(){return this.edgeDef.straightLine="to",this}fill(e){return this.edgeDef.style={...this.edgeDef.style||{},fill:e},this}stroke(e,t){return this.edgeDef.style={...this.edgeDef.style||{},stroke:e,strokeWidth:t??this.edgeDef.style?.strokeWidth},this}opacity(e){return this.edgeDef.style={...this.edgeDef.style||{},opacity:e},this}dashed(){return this.edgeDef.style={...this.edgeDef.style||{},strokeDasharray:"dashed"},this}dotted(){return this.edgeDef.style={...this.edgeDef.style||{},strokeDasharray:"dotted"},this}dash(e){return this.edgeDef.style={...this.edgeDef.style||{},strokeDasharray:e},this}sketch(){return this.edgeDef.style={...this.edgeDef.style||{},sketch:true},this}class(e){return this.edgeDef.className?this.edgeDef.className+=` ${e}`:this.edgeDef.className=e,this}animate(e,t){if(typeof e=="string")return this.edgeDef.animations||(this.edgeDef.animations=[]),this.edgeDef.animations.push({id:e,params:t}),this;let i=this.edgeDef.id||`${this.edgeDef.from}->${this.edgeDef.to}`;if(!i)throw new Error("EdgeBuilder.animate(cb): edge has no id");return this.parent.animate(n=>{n.edge(i),e(n);}),this}animateTo(e,t){return this.animate(i=>{i.to(e,t);})}hitArea(e){return this.edgeDef.hitArea=e,this}meta(e){return this.edgeDef.meta=e,this}data(e){return this.edgeDef.data=e,this}onClick(e){return this.edgeDef.onClick=e,this}loopSide(e){return this.edgeDef.loopSide=e,this}loopSize(e){return this.edgeDef.loopSize=e,this}tooltip(e){return this.edgeDef.tooltip=e,this}done(){return this.parent}node(e,t){return this.parent.node(e,t)}edge(e,t,i){return this.parent.edge(e,t,i)}danglingEdge(e,t){return this.parent.danglingEdge(e,t)}overlay(e,t,i){return typeof e=="function"?this.parent.overlay(e):this.parent.overlay(e,t,i)}build(){return this.parent.build()}svg(e){return this.parent.svg(e)}};var et={dx:2,dy:2,blur:4,color:"rgba(0,0,0,0.2)"};function qe(r){return {dx:r.dx??et.dx,dy:r.dy??et.dy,blur:r.blur??et.blur,color:r.color??et.color}}function Fe(r){let e=r.color.replace(/[^a-zA-Z0-9]/g,"_");return `viz-shadow-${r.dx}-${r.dy}-${r.blur}-${e}`}function qr(r){return r.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function At(r,e){return `<filter id="${r}" x="-50%" y="-50%" width="200%" height="200%"><feDropShadow dx="${e.dx}" dy="${e.dy}" stdDeviation="${e.blur}" flood-color="${qr(e.color)}" flood-opacity="1"/></filter>`}function Pe(r){return `viz-sketch-${r}`}function Fr(r,e){let t=(r^e*2654435761)>>>0|1;return t^=t<<13,t^=t>>>17,t^=t<<5,(t>>>0)/4294967296}function je(r,e,t,i){return t+Fr(r,e)*(i-t)}function kt(r,e){let t=e+37,i=je(e,1,.009,.015).toFixed(4),n=je(e,2,2.5,4).toFixed(1),a=je(e,3,3,5).toFixed(1),d=je(e,4,.3,1.6).toFixed(2),c=je(e,5,.2,1.3).toFixed(2);return `<filter id="${r}" filterUnits="userSpaceOnUse" x="-10000" y="-10000" width="20000" height="20000"><feTurbulence type="fractalNoise" baseFrequency="0.008" numOctaves="2" seed="${e}" result="n1"/><feTurbulence type="fractalNoise" baseFrequency="${i}" numOctaves="2" seed="${t}" result="n2"/><feDisplacementMap in="SourceGraphic" in2="n1" scale="${n}" xChannelSelector="R" yChannelSelector="G" result="s1"/><feDisplacementMap in="SourceGraphic" in2="n2" scale="${a}" xChannelSelector="G" yChannelSelector="R" result="s2"/><feOffset in="s2" dx="${d}" dy="${c}" result="s2off"/><feComposite in="s1" in2="s2off" operator="over"/></filter>`}function Ke(r,e){if(r?.sketchSeed!==void 0)return r.sketchSeed;let t=0;for(let i=0;i<e.length;i++)t=Math.imul(31,t)+e.charCodeAt(i)|0;return Math.abs(t)}function jr(r){return typeof r=="object"&&r!==null&&"then"in r&&typeof r.then=="function"}function Kr(r){return r.replace(/[^a-zA-Z0-9]/g,"_")}function ze(r,e,t="end"){if(r==="none")return "";let i=`viz-${r}`,n=t==="start"?"-start":"";return e?`${i}${n}-${Kr(e)}`:`${i}${n}`}function tt(r,e){let t=r.from?e.get(r.from)??null:null,i=r.to?e.get(r.to)??null:null;return r.from&&!t||r.to&&!i||!t&&!r.fromAt&&!i&&!r.toAt?null:{start:t,end:i}}function we(r){return r.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var Yr={arrow:r=>`<polygon points="0,2 10,5 0,8" fill="${r}" />`,arrowOpen:r=>`<polyline points="0,2 10,5 0,8" fill="white" stroke="${r}" stroke-width="1.5" stroke-linejoin="miter" />`,diamond:r=>`<polygon points="0,5 5,2 10,5 5,8" fill="${r}" />`,diamondOpen:r=>`<polygon points="0,5 5,2 10,5 5,8" fill="white" stroke="${r}" stroke-width="1.5" />`,circle:r=>`<circle cx="5" cy="5" r="3" fill="${r}" />`,circleOpen:r=>`<circle cx="5" cy="5" r="3" fill="white" stroke="${r}" stroke-width="1.5" />`,square:r=>`<rect x="2" y="2" width="6" height="6" fill="${r}" />`,bar:r=>`<line x1="5" y1="1" x2="5" y2="9" stroke="${r}" stroke-width="2" stroke-linecap="round" />`,halfArrow:r=>`<polygon points="0,2 10,5 0,5" fill="${r}" />`};function rt(r,e,t,i="end"){if(r==="none")return "";let n=Yr[r];if(!n)return "";let a=we(e);return `<marker id="${t}" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="10" markerHeight="10" orient="${i==="start"?"auto-start-reverse":"auto"}">${n(a)}</marker>`}function Le(r,e,t,i){let{x:n,y:a}=chunkOZAFCKI7_js.d(r),d=chunkTVRPABD2_js.j(r),c=i?.position??"center",o=i?.dx??0,u=i?.dy??0,g=0,m=0;switch(c){case "above":m=-d.h/2-t/2;break;case "below":m=d.h/2+t/2;break;case "left":g=-d.w/2-e/2;break;case "right":g=d.w/2+e/2;break;}return {x:n+g-e/2+o,y:a+m-t/2+u}}function Et(r,e,t){let i=r.trim();return i.startsWith("<svg")?i.replace(/<svg\b([^>]*)>/,(n,a)=>`<svg${a.replace(/\swidth="[^"]*"/g,"").replace(/\sheight="[^"]*"/g,"")} width="${e}" height="${t}">`):r}function Xt(r,e,t){let i=r.trim();return i.startsWith("<svg")?Et(i,e,t):`<svg width="${e}" height="${t}" viewBox="0 0 ${e} ${t}" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}var Re=new WeakMap,it=new WeakMap;function Ur(r,e){Object.entries(e).forEach(([t,i])=>{i===void 0?r.removeAttribute(t):r.setAttribute(t,String(i));});}function Zr(r){return Object.entries(r).filter(([,e])=>e!==void 0).map(([e,t])=>` ${e}="${String(t)}"`).join("")}function nt(r){return `viz-anim-${r}`}function ot(r){return !r||typeof r!="object"?[]:Object.entries(r).filter(([,e])=>e!==void 0).map(([e,t])=>[`--viz-anim-${e}`,String(t)])}var Oe=class{_tokens=[];text(e,t){return this._tokens.push({kind:"span",text:e,...t??{}}),this}bold(e,t){return this.text(e,{...t??{},bold:true})}italic(e,t){return this.text(e,{...t??{},italic:true})}code(e,t){return this.text(e,{...t??{},code:true})}color(e,t,i){return this.text(e,{...i??{},fill:t})}link(e,t,i){return this.text(e,{...i??{},href:t})}sup(e,t){return this.text(e,{...t??{},baselineShift:"super"})}sub(e,t){return this.text(e,{...t??{},baselineShift:"sub"})}newline(){return this._tokens.push({kind:"newline"}),this}build(){return {kind:"rich",tokens:[...this._tokens]}}},zt=class{_viewBox={w:800,h:600};_nodes=new Map;_edges=new Map;_overlays=[];_nodeOrder=[];_edgeOrder=[];_gridConfig=null;_sketch=null;_animationSpecs=[];_mountedContainer=null;_panZoomController;_tooltipController;_edgePathResolver=null;_changes={added:{nodes:[],edges:[]},removed:{nodes:[],edges:[]},updated:{nodes:[],edges:[]}};_changeListeners=[];_eventListeners={build:[],mount:[]};on(e,t){return this._eventListeners[e]||(this._eventListeners[e]=[]),this._eventListeners[e].push(t),()=>{this._eventListeners[e]=this._eventListeners[e].filter(i=>i!==t);}}_dispatchEvent(e,t){let i=this._eventListeners[e];i&&i.forEach(n=>n(t));}addNode(e){if(this._nodes.has(e.id)){console.warn(`VizBuilder.addNode: Node ${e.id} already exists`);return}this._nodes.set(e.id,{...e}),this._nodeOrder.push(e.id),this._changes.added.nodes.push(e.id);}removeNode(e){if(!this._nodes.has(e))return;this._nodes.delete(e),this._nodeOrder=this._nodeOrder.filter(i=>i!==e),this._changes.removed.nodes.push(e);let t=[];this._edges.forEach(i=>{(i.from===e||i.to===e)&&t.push(i.id);}),t.forEach(i=>this.removeEdge(i));}updateNode(e,t){let i=this._nodes.get(e);if(!i){console.warn(`VizBuilder.updateNode: Node ${e} not found`);return}let n={...i,...t};t.pos&&i.pos&&(n.pos={...i.pos,...t.pos}),t.style&&i.style&&(n.style={...i.style,...t.style}),t.shape&&i.shape&&(n.shape={...i.shape,...t.shape}),this._nodes.set(e,n),this._changes.added.nodes.includes(e)||this._changes.updated.nodes.includes(e)||this._changes.updated.nodes.push(e);}_performCollapseToggle(e,t,i){let n=this._nodes.get(e);if(!n||!n.compartments||n.compartments.length===0||!n.shape||!("h"in n.shape))return;let a=i??n.collapseAnchor??"center",d=!n.collapsed,c=!!n.collapsed,o=t??0,u=n.compartments.reduce((B,b)=>B+b.height,0),g=n.compartments[0].height,m=n.collapsed?g:u,y=d?g:u,h=n.pos?.y??0,f=this._mountedContainer,E={...n.shape,h:m};if(this.updateNode(e,{collapsed:d,shape:E}),o>0&&m!==y&&f){let B=performance.now(),b=z=>{let R=z-B,w=Math.min(R/o,1),s=1-Math.pow(1-w,3),v=m+(y-m)*s,A=this._nodes.get(e);if(!A?.shape||!("h"in A.shape))return;let _=v-m,l=a==="top"?_/2:a==="bottom"?-_/2:0,N={...A.shape,h:v};if(this.updateNode(e,{shape:N,pos:{x:A.pos?.x??0,y:h+l}}),this.commit(f),c){let k=f.querySelector(`[data-id="${e}"]`);if(k)if(w<1){let q=(u-v)/u*100;k.style.clipPath=`inset(0 0 ${q}% 0)`;}else k.style.clipPath="";}w<1&&requestAnimationFrame(b);};requestAnimationFrame(b);}else {let B=y-m,b=a==="top"?B/2:a==="bottom"?-B/2:0,z={...n.shape,h:y};this.updateNode(e,{collapsed:d,shape:z,pos:{x:n.pos?.x??0,y:h+b}}),f&&this.commit(f);}}addEdge(e){if(this._edges.has(e.id)){console.warn(`VizBuilder.addEdge: Edge ${e.id} already exists`);return}this._edges.set(e.id,{...e}),this._edgeOrder.push(e.id),this._changes.added.edges.push(e.id);}removeEdge(e){this._edges.has(e)&&(this._edges.delete(e),this._edgeOrder=this._edgeOrder.filter(t=>t!==e),this._changes.removed.edges.push(e));}updateEdge(e,t){let i=this._edges.get(e);if(!i){console.warn(`VizBuilder.updateEdge: Edge ${e} not found`);return}this._edges.set(e,{...i,...t}),this._changes.added.edges.includes(e)||this._changes.updated.edges.includes(e)||this._changes.updated.edges.push(e);}onChange(e){return this._changeListeners.push(e),()=>{this._changeListeners=this._changeListeners.filter(t=>t!==e);}}commit(e){let t=this._changes;if(this._changeListeners.length>0){let d={added:{nodes:[...t.added.nodes],edges:[...t.added.edges]},removed:{nodes:[...t.removed.nodes],edges:[...t.removed.edges]},updated:{nodes:[...t.updated.nodes],edges:[...t.updated.edges]}};this._changeListeners.forEach(c=>c(d));}if(this._changes={added:{nodes:[],edges:[]},removed:{nodes:[],edges:[]},updated:{nodes:[],edges:[]}},!e)return;let i=e.querySelector("svg");if(!i){console.warn("VizBuilder.commit: No mounted SVG found in container. Need to call .mount() first.");return}let n=this.build();if(this._renderSceneToDOM(n,e),this._tooltipController){let d=new Map(n.nodes.map(o=>[o.id,o])),c=new Map(n.edges.map(o=>[o.id,o]));this._tooltipController.updateData(d,c),this._addTooltipA11y(i,n);}let a=Ie(i,{edgePathResolver:this._edgePathResolver});Re.set(i,a),pt(n,a);}use(e,t){return e(this,t),this}layout(e,t){let i=this.build(),n={nodes:i.nodes,edges:i.edges},a=e(n,t);if(jr(a))throw new Error("VizBuilder.layout: received a Promise from the layout algorithm. Use .layoutAsync() for async layout engines.");return this._applyLayoutResult(a),this}async layoutAsync(e,t){let i=this.build(),n={nodes:i.nodes,edges:i.edges},a=await e(n,t);return this._applyLayoutResult(a),this}_applyLayoutResult(e){for(let[t,i]of Object.entries(e.nodes))this.updateNode(t,{pos:i});if(e.edges)for(let[t,i]of Object.entries(e.edges))i.waypoints!==void 0&&this.updateEdge(t,{waypoints:i.waypoints});}setEdgePathResolver(e){this._edgePathResolver=e;let t=this._mountedContainer;if(t){let i=t.querySelector("svg");if(i){let n=Re.get(i);n?n.edgePathResolver=e:Re.set(i,Ie(i,{edgePathResolver:e}));}}return this}view(e,t){return this._viewBox={w:e,h:t},this}grid(e,t,i={x:20,y:20}){return this._gridConfig={cols:e,rows:t,padding:i},this}sketch(e=true,t){return this._sketch=e?{enabled:true,seed:t}:null,this}overlay(e,t,i){if(typeof e=="function"){let c=new _e;return e(c),this._overlays.push(...c.build()),this}let n=e,a=t,d=i;return this._overlays.push({id:n,params:a,key:d}),this}animate(e){let t=chunkAE7VTFYG_js.d(e);return this._animationSpecs.push(t),t}node(e,t){this._nodes.has(e)||(this._nodes.set(e,{id:e,pos:{x:0,y:0},shape:{kind:"circle",r:10}}),this._nodeOrder.push(e));let i=new Je(this,this._nodes.get(e));return t?(Yt(i,t),i.done(),this):i}edge(e,t,i){let n=i!==void 0&&typeof i!="string",a=n?i.id||`${e}->${t}`:i||`${e}->${t}`;this._edges.has(a)||(this._edges.set(a,{id:a,from:e,to:t}),this._edgeOrder.push(a));let d=new We(this,this._edges.get(a));return n?(St(d,i),this):d}danglingEdge(e,t){if(!this._edges.has(e)){let n={id:e};t?.fromAt&&(n.fromAt=t.fromAt),t?.toAt&&(n.toAt=t.toAt),this._edges.set(e,n),this._edgeOrder.push(e);}let i=new We(this,this._edges.get(e));return t?(St(i,t),this):i}fromScene(e){return e.viewBox&&this.view(e.viewBox.w,e.viewBox.h),e.grid&&this.grid(e.grid.cols,e.grid.rows,e.grid.padding),this._nodes.clear(),this._nodeOrder=[],this._edges.clear(),this._edgeOrder=[],this._overlays=[],this._animationSpecs=[],e.nodes&&e.nodes.forEach(t=>{this._nodes.set(t.id,{...t}),this._nodeOrder.push(t.id);}),e.edges&&e.edges.forEach(t=>{this._edges.set(t.id,{...t}),this._edgeOrder.push(t.id);}),e.overlays&&(this._overlays=[...e.overlays]),e.animationSpecs&&(this._animationSpecs=[...e.animationSpecs]),this._sketch=e.sketch?{...e.sketch,enabled:e.sketch.enabled??true}:null,this}build(){this._edges.forEach(n=>{n.from&&!this._nodes.has(n.from)&&console.warn(`VizBuilder: Edge ${n.id} references missing source node ${n.from}`),n.to&&!this._nodes.has(n.to)&&console.warn(`VizBuilder: Edge ${n.id} references missing target node ${n.to}`);});let e=this._nodeOrder.map(n=>this._nodes.get(n)),t=this._edgeOrder.map(n=>this._edges.get(n)),i={viewBox:this._viewBox,grid:this._gridConfig??void 0,nodes:e,edges:t,overlays:this._overlays,animationSpecs:this._animationSpecs.length>0?[...this._animationSpecs]:void 0,sketch:this._sketch??void 0};return this._dispatchEvent("build",{scene:i}),i}_getGridConfig(){return this._gridConfig}_getViewBox(){return this._viewBox}svg(e){let t=this.build();return this._renderSceneToSvg(t,e)}mount(e,t){let i=this.build();this._renderSceneToDOM(i,e),this._mountedContainer=e;let n=e.querySelector("svg");if(n&&t?.css&&this._injectCssIntoMountedSvg(n,t.css),n&&t?.autoplay&&this.play(e,i.animationSpecs??[]),n&&(i.nodes.some(c=>c.tooltip!=null)||i.edges.some(c=>c.tooltip!=null))){this._tooltipController&&this._tooltipController.destroy();let c=new Map(i.nodes.map(u=>[u.id,u])),o=new Map(i.edges.map(u=>[u.id,u]));this._tooltipController=chunkTVRPABD2_js.c(e,n,c,o),this._addTooltipA11y(n,i);}let a;if(n&&t?.panZoom){let d=n.querySelector(".viz-viewport");d&&(a=chunkTVRPABD2_js.a(n,d,i,t));}return this._panZoomController=a,this._dispatchEvent("mount",{container:e,controller:a}),a}destroy(){if(this._panZoomController&&(this._panZoomController.destroy(),this._panZoomController=void 0),this._tooltipController&&(this._tooltipController.destroy(),this._tooltipController=void 0),this._mountedContainer){let e=it.get(this._mountedContainer);e&&(e.stop(),it.delete(this._mountedContainer));let t=this._mountedContainer.querySelector("svg");t&&t.remove(),this._mountedContainer=null;}}_addTooltipA11y(e,t){let i=e.querySelectorAll('g[data-viz-role="node-group"]'),n=new Set(t.nodes.filter(c=>c.tooltip!=null).map(c=>c.id));i.forEach(c=>{let o=c.getAttribute("data-id");o&&n.has(o)&&!c.hasAttribute("tabindex")&&c.setAttribute("tabindex","0");});let a=e.querySelectorAll('g[data-viz-role="edge-group"]'),d=new Set(t.edges.filter(c=>c.tooltip!=null).map(c=>c.id));a.forEach(c=>{let o=c.getAttribute("data-id");o&&d.has(o)&&!c.hasAttribute("tabindex")&&c.setAttribute("tabindex","0");});}_injectCssIntoMountedSvg(e,t){let i=(Array.isArray(t)?t.join(`
113
+ `}},Sr={render:({spec:r,scene:e})=>{let t=e.grid;if(!t)return "";let{w:i,h:n}=e.viewBox,{colLabels:a,rowLabels:d,yOffset:c=20,xOffset:o=20}=r.params,u=(i-t.padding.x*2)/t.cols,g=(n-t.padding.y*2)/t.rows,m="";return a&&Object.entries(a).forEach(([y,h])=>{let f=parseInt(y,10),E=t.padding.x+f*u+u/2,B=r.className||"viz-grid-label";m+=`<text x="${E}" y="${c}" class="${B}" text-anchor="middle">${h}</text>`;}),d&&Object.entries(d).forEach(([y,h])=>{let f=parseInt(y,10),E=t.padding.y+f*g+g/2,B=r.className||"viz-grid-label";m+=`<text x="${o}" y="${E}" dy=".35em" class="${B}" text-anchor="middle">${h}</text>`;}),m}},Ar={render:({spec:r,nodesById:e})=>{let{points:t}=r.params,i="";return t.forEach(n=>{let a=e.get(n.currentNodeId);if(!a)return;let d=parseInt(n.id.split("-")[1]||"0",10),c=(d%5-2)*10,o=(d%3-1)*10,u=a.pos.x+c,g=a.pos.y+o,m=r.className??"viz-data-point";i+=`<circle data-id="${n.id}" cx="${u}" cy="${g}" r="6" class="${m}" />`;}),i},update:({spec:r,nodesById:e},t)=>{let{points:i}=r.params,n="http://www.w3.org/2000/svg",a=new Map;Array.from(t.children).forEach(c=>{if(c.tagName==="circle"){let o=c.getAttribute("data-id");o&&a.set(o,c);}});let d=new Set;i.forEach(c=>{let o=e.get(c.currentNodeId);if(!o)return;d.add(c.id);let u=parseInt(c.id.split("-")[1]||"0",10),g=(u%5-2)*10,m=(u%3-1)*10,y=o.pos.x+g,h=o.pos.y+m,f=a.get(c.id);f||(f=document.createElementNS(n,"circle"),f.setAttribute("data-id",c.id),f.setAttribute("r","6"),t.appendChild(f)),f.setAttribute("cx",String(y)),f.setAttribute("cy",String(h));let E=r.className??"viz-data-point";f.getAttribute("class")!==E&&f.setAttribute("class",E);}),a.forEach((c,o)=>{d.has(o)||c.remove();});}},kr={render:({spec:r,nodesById:e})=>{let t=Wt(r.params,e);if(!t)return "";let{w:i,h:n,rx:a,ry:d,opacity:c,fill:o,stroke:u,strokeWidth:g}=r.params,m=r.className??"viz-overlay-rect",y=a!==void 0?` rx="${a}"`:"",h=d!==void 0?` ry="${d}"`:"",f=c!==void 0?` opacity="${c}"`:"",E=o===void 0,B=u===void 0,b=o??"#3b82f6",z=u??"#3b82f6",R=g??3,w=E?' fill-opacity="0.12"':"",s=B?' stroke-opacity="0.9"':"";return `<rect x="${t.x}" y="${t.y}" width="${i}" height="${n}" fill="${b}"${w} stroke="${z}"${s} stroke-width="${R}"${y}${h}${f} class="${m}" />`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Wt(r.params,e),{w:a,h:d,rx:c,ry:o,opacity:u,fill:g,stroke:m,strokeWidth:y}=r.params,h=r.className??"viz-overlay-rect",f=t.querySelector("rect");if(!n){f?.remove();return}f||(f=document.createElementNS(i,"rect"),t.appendChild(f)),f.setAttribute("x",String(n.x)),f.setAttribute("y",String(n.y)),f.setAttribute("width",String(a)),f.setAttribute("height",String(d)),g===void 0?(f.setAttribute("fill","#3b82f6"),f.setAttribute("fill-opacity","0.12")):(f.setAttribute("fill",g),f.removeAttribute("fill-opacity")),m===void 0?(f.setAttribute("stroke","#3b82f6"),f.setAttribute("stroke-opacity","0.9")):(f.setAttribute("stroke",m),f.removeAttribute("stroke-opacity")),f.setAttribute("stroke-width",String(y??3)),c!==void 0?f.setAttribute("rx",String(c)):f.removeAttribute("rx"),o!==void 0?f.setAttribute("ry",String(o)):f.removeAttribute("ry"),u!==void 0?f.setAttribute("opacity",String(u)):f.removeAttribute("opacity"),f.setAttribute("class",h);}},Er={render:({spec:r,nodesById:e})=>{let t=Xe(r.params,e);if(!t)return "";let{r:i,opacity:n,fill:a,stroke:d,strokeWidth:c}=r.params,o=r.className??"viz-overlay-circle",u=n!==void 0?` opacity="${n}"`:"",g=a===void 0,m=d===void 0,y=a??"#3b82f6",h=d??"#3b82f6",f=c??3,E=g?' fill-opacity="0.12"':"",B=m?' stroke-opacity="0.9"':"";return `<circle cx="${t.x}" cy="${t.y}" r="${i}" fill="${y}"${E} stroke="${h}"${B} stroke-width="${f}"${u} class="${o}" />`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Xe(r.params,e),{r:a,opacity:d,fill:c,stroke:o,strokeWidth:u}=r.params,g=r.className??"viz-overlay-circle",m=t.querySelector("circle");if(!n){m?.remove();return}m||(m=document.createElementNS(i,"circle"),t.appendChild(m)),m.setAttribute("cx",String(n.x)),m.setAttribute("cy",String(n.y)),m.setAttribute("r",String(a)),c===void 0?(m.setAttribute("fill","#3b82f6"),m.setAttribute("fill-opacity","0.12")):(m.setAttribute("fill",c),m.removeAttribute("fill-opacity")),o===void 0?(m.setAttribute("stroke","#3b82f6"),m.setAttribute("stroke-opacity","0.9")):(m.setAttribute("stroke",o),m.removeAttribute("stroke-opacity")),m.setAttribute("stroke-width",String(u??3)),d!==void 0?m.setAttribute("opacity",String(d)):m.removeAttribute("opacity"),m.setAttribute("class",g);}},zr={render:({spec:r,nodesById:e})=>{let t=Xe(r.params,e);if(!t)return "";let{text:i,opacity:n,fill:a,fontSize:d,fontWeight:c,textAnchor:o,dominantBaseline:u}=r.params,g=r.className??"viz-overlay-text",m=n!==void 0?` opacity="${n}"`:"",y=d!==void 0?` font-size="${d}"`:"",h=c!==void 0?` font-weight="${c}"`:"",f=o!==void 0?` text-anchor="${o}"`:"",E=u!==void 0?` dominant-baseline="${u}"`:"",B=a??"#111";return `<text x="${t.x}" y="${t.y}" fill="${B}"${m}${y}${h}${f}${E} class="${g}">${i}</text>`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Xe(r.params,e),{text:a,opacity:d,fill:c,fontSize:o,fontWeight:u,textAnchor:g,dominantBaseline:m}=r.params,y=r.className??"viz-overlay-text",h=t.querySelector("text");if(!n){h?.remove();return}h||(h=document.createElementNS(i,"text"),t.appendChild(h)),h.setAttribute("x",String(n.x)),h.setAttribute("y",String(n.y)),h.setAttribute("fill",c??"#111"),d!==void 0?h.setAttribute("opacity",String(d)):h.removeAttribute("opacity"),o!==void 0?h.setAttribute("font-size",String(o)):h.removeAttribute("font-size"),u!==void 0?h.setAttribute("font-weight",String(u)):h.removeAttribute("font-weight"),g!==void 0?h.setAttribute("text-anchor",g):h.removeAttribute("text-anchor"),m!==void 0?h.setAttribute("dominant-baseline",m):h.removeAttribute("dominant-baseline"),h.setAttribute("class",y),h.textContent=a;}};function It(r){let e=r.x??0,t=r.y??0,i=r.scale??1,n=r.rotation??0,a=[`translate(${e}, ${t})`];return n&&a.push(`rotate(${n})`),i!==1&&a.push(`scale(${i})`),a.join(" ")}function Ht(r){return r<0?0:r>1?1:r}function gt(r){return typeof r.nodeId=="string"&&r.nodeId.length>0}function mt(r,e){let t=e.get(r.nodeId);if(!t)return null;let i=chunkOZAFCKI7_js.d(t);return {x:i.x+(r.offsetX??0),y:i.y+(r.offsetY??0)}}function Xe(r,e){return gt(r)?mt(r,e):{x:r.x,y:r.y}}function Wt(r,e){if(gt(r)){let t=mt(r,e);return t?{x:t.x-r.w/2,y:t.y-r.h/2}:null}return {x:r.x,y:r.y}}function qt(r,e){let t=r.x??0,i=r.y??0,n=t,a=i;if(r.from&&r.to){let g=e.get(r.from),m=e.get(r.to);if(g&&m){let y=Ht(r.progress??0),h=chunkOZAFCKI7_js.d(g),f=chunkOZAFCKI7_js.d(m);n=h.x+(f.x-h.x)*y+t,a=h.y+(f.y-h.y)*y+i;}}else if(gt(r)){let g=mt(r,e);if(!g)return null;n=g.x+t,a=g.y+i;}let d=r.scale??1,c=r.magnitude,o=c===void 0?1:.85+.3*Ht(Math.abs(c)),u=d*o;return {x:n,y:a,scale:u,rotation:r.rotation??0}}var wr={render:({spec:r,nodesById:e,edgesById:t,scene:i,registry:n})=>{let{children:a,opacity:d}=r.params,c=qt(r.params,e);if(!c)return "";let o=It(c),u=d!==void 0?` opacity="${d}"`:"",g=n;if(!g)return `<g transform="${o}"${u}></g>`;let m=`<g transform="${o}"${u}>`;return a.forEach((y,h)=>{let f=g.get(y.id);if(!f)return;let E={spec:y,nodesById:e,edgesById:t,scene:i,registry:g},B=y.key?`key:${y.key}`:`idx:${h}:${y.id}`;m+=`<g data-viz-role="overlay-child" data-overlay-child-id="${B}">`,m+=f.render(E),m+="</g>";}),m+="</g>",m},update:({spec:r,nodesById:e,edgesById:t,scene:i,registry:n},a)=>{let d=n;if(!d)return;let{children:c,opacity:o}=r.params,u=qt(r.params,e);if(!u){a.removeAttribute("transform"),a.removeAttribute("opacity"),a.innerHTML="";return}a.setAttribute("transform",It(u)),o!==void 0?a.setAttribute("opacity",String(o)):a.removeAttribute("opacity");let g="http://www.w3.org/2000/svg",m=new Map;Array.from(a.children).forEach(h=>{if(h instanceof SVGGElement){let f=h.getAttribute("data-overlay-child-id");f&&m.set(f,h);}});let y=new Set;c.forEach((h,f)=>{let E=d.get(h.id);if(!E)return;let B=h.key?`key:${h.key}`:`idx:${f}:${h.id}`;y.add(B);let b=m.get(B);b||(b=document.createElementNS(g,"g"),b.setAttribute("data-viz-role","overlay-child"),b.setAttribute("data-overlay-child-id",B),a.appendChild(b));let z={spec:h,nodesById:e,edgesById:t,scene:i,registry:d};E.update?E.update(z,b):b.innerHTML=E.render(z);}),m.forEach((h,f)=>{y.has(f)||h.remove();});}},Ve=new ut().register("signal",xr).register("grid-labels",Sr).register("data-points",Ar).register("rect",kr).register("circle",Er).register("text",zr).register("group",wr);var _e=class r{specs=[];keyCounters=new Map;add(e,t,i){let n=i?.className,a=i?.key;if(!a&&this.specs.some(c=>c.id===e&&(c.key===void 0||c.key===""))){let c=(this.keyCounters.get(e)??0)+1;this.keyCounters.set(e,c),a=`${e}#${c}`;}return this.specs.push({id:e,params:t,key:a,className:n}),this}remove(e){for(let t=this.specs.length-1;t>=0;t--){let i=this.specs[t];if(!i)continue;let n=i.key===e,a=!i.key&&i.id===e;(n||a)&&this.specs.splice(t,1);}return this}clear(){return this.specs.length=0,this.keyCounters.clear(),this}build(){return [...this.specs]}rect(e,t){return this.add("rect",e,t)}circle(e,t){return this.add("circle",e,t)}text(e,t){return this.add("text",e,t)}group(e,t,i){let n=new r;t(n);let a=n.build();return this.add("group",{...e,children:a},i)}};function Bi(r){let e=new _e;return r(e),e.build()}var Br={solid:"",dashed:"8, 4",dotted:"2, 4","dash-dot":"8, 4, 2, 4"};function $e(r){return !r||r==="solid"?"":Br[r]??r}function Ge(r,e){let t=r.position==="start"?e.start:r.position==="end"?e.end:e.mid;return {x:t.x+(r.dx||0),y:t.y+(r.dy||0)}}function De(r){return r.labels&&r.labels.length>0?r.labels:r.label?[r.label]:[]}var Q="http://www.w3.org/2000/svg",Qe={dx:2,dy:2,blur:4,color:"rgba(0,0,0,0.2)"};function Cr(r){return {dx:r.dx??Qe.dx,dy:r.dy??Qe.dy,blur:r.blur??Qe.blur,color:r.color??Qe.color}}function Nr(r){let e=r.color.replace(/[^a-zA-Z0-9]/g,"_");return `viz-shadow-${r.dx}-${r.dy}-${r.blur}-${e}`}function Vr(r,e){let t=Cr(e),i=Nr(t);if(!r.querySelector(`#${CSS.escape(i)}`)){let n=r.querySelector("defs");if(n){let a=document.createElementNS(Q,"filter");a.setAttribute("id",i),a.setAttribute("x","-50%"),a.setAttribute("y","-50%"),a.setAttribute("width","200%"),a.setAttribute("height","200%");let d=document.createElementNS(Q,"feDropShadow");d.setAttribute("dx",String(t.dx)),d.setAttribute("dy",String(t.dy)),d.setAttribute("stdDeviation",String(t.blur)),d.setAttribute("flood-color",t.color),d.setAttribute("flood-opacity","1"),a.appendChild(d),n.appendChild(a);}}return i}function $r(r){return `viz-sketch-${r}`}function Pr(r,e){let t=(r^e*2654435761)>>>0|1;return t^=t<<13,t^=t>>>17,t^=t<<5,(t>>>0)/4294967296}function Me(r,e,t,i){return t+Pr(r,e)*(i-t)}function Ft(r,e){let t=$r(e);if(!r.querySelector(`#${CSS.escape(t)}`)){let i=r.querySelector("defs");if(i){let n=document.createElementNS(Q,"filter");n.setAttribute("id",t),n.setAttribute("filterUnits","userSpaceOnUse"),n.setAttribute("x","-10000"),n.setAttribute("y","-10000"),n.setAttribute("width","20000"),n.setAttribute("height","20000");let a=e+37,d=Me(e,1,.009,.015).toFixed(4),c=Me(e,2,2.5,4).toFixed(1),o=Me(e,3,3,5).toFixed(1),u=Me(e,4,.3,1.6).toFixed(2),g=Me(e,5,.2,1.3).toFixed(2),m=document.createElementNS(Q,"feTurbulence");m.setAttribute("type","fractalNoise"),m.setAttribute("baseFrequency","0.008"),m.setAttribute("numOctaves","2"),m.setAttribute("seed",String(e)),m.setAttribute("result","n1"),n.appendChild(m);let y=document.createElementNS(Q,"feTurbulence");y.setAttribute("type","fractalNoise"),y.setAttribute("baseFrequency",d),y.setAttribute("numOctaves","2"),y.setAttribute("seed",String(a)),y.setAttribute("result","n2"),n.appendChild(y);let h=document.createElementNS(Q,"feDisplacementMap");h.setAttribute("in","SourceGraphic"),h.setAttribute("in2","n1"),h.setAttribute("scale",c),h.setAttribute("xChannelSelector","R"),h.setAttribute("yChannelSelector","G"),h.setAttribute("result","s1"),n.appendChild(h);let f=document.createElementNS(Q,"feDisplacementMap");f.setAttribute("in","SourceGraphic"),f.setAttribute("in2","n2"),f.setAttribute("scale",o),f.setAttribute("xChannelSelector","G"),f.setAttribute("yChannelSelector","R"),f.setAttribute("result","s2"),n.appendChild(f);let E=document.createElementNS(Q,"feOffset");E.setAttribute("in","s2"),E.setAttribute("dx",u),E.setAttribute("dy",g),E.setAttribute("result","s2off"),n.appendChild(E);let B=document.createElementNS(Q,"feComposite");B.setAttribute("in","s1"),B.setAttribute("in2","s2off"),B.setAttribute("operator","over"),n.appendChild(B),i.appendChild(n);}}return t}function Or(r,e){if(r?.sketchSeed!==void 0)return r.sketchSeed;let t=0;for(let i=0;i<e.length;i++)t=Math.imul(31,t)+e.charCodeAt(i)|0;return Math.abs(t)}function Lr(r){return r.replace(/[^a-zA-Z0-9]/g,"_")}function ht(r,e,t="end"){if(r==="none")return "";let i=`viz-${r}`,n=t==="start"?"-start":"";return e?`${i}${n}-${Lr(e)}`:`${i}${n}`}function Rr(r,e){switch(r){case "arrow":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,2 10,5 0,8"),t.setAttribute("fill",e),t}case "arrowOpen":{let t=document.createElementNS(Q,"polyline");return t.setAttribute("points","0,2 10,5 0,8"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t.setAttribute("stroke-linejoin","miter"),t}case "diamond":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,5 5,2 10,5 5,8"),t.setAttribute("fill",e),t}case "diamondOpen":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,5 5,2 10,5 5,8"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t}case "circle":{let t=document.createElementNS(Q,"circle");return t.setAttribute("cx","5"),t.setAttribute("cy","5"),t.setAttribute("r","3"),t.setAttribute("fill",e),t}case "circleOpen":{let t=document.createElementNS(Q,"circle");return t.setAttribute("cx","5"),t.setAttribute("cy","5"),t.setAttribute("r","3"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t}case "square":{let t=document.createElementNS(Q,"rect");return t.setAttribute("x","2"),t.setAttribute("y","2"),t.setAttribute("width","6"),t.setAttribute("height","6"),t.setAttribute("fill",e),t}case "bar":{let t=document.createElementNS(Q,"line");return t.setAttribute("x1","5"),t.setAttribute("y1","1"),t.setAttribute("x2","5"),t.setAttribute("y2","9"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","2"),t.setAttribute("stroke-linecap","round"),t}case "halfArrow":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,2 10,5 0,5"),t.setAttribute("fill",e),t}default:return null}}function jt(r,e,t="arrow",i="end"){let n=ht(t,e,i);if(!n)return "";if(!r.querySelector(`#${CSS.escape(n)}`)){let a=r.querySelector("defs");if(a){let d=document.createElementNS(Q,"marker");d.setAttribute("id",n),d.setAttribute("viewBox","0 0 10 10"),d.setAttribute("markerWidth","10"),d.setAttribute("markerHeight","10"),d.setAttribute("refX","9"),d.setAttribute("refY","5"),d.setAttribute("orient",i==="start"?"auto-start-reverse":"auto");let c=Rr(t,e);c&&d.appendChild(c),a.appendChild(d);}}return n}function Ie(r,e){let t=new Map,i=new Map,n=new Map,a=new Map,d=new Map,c=new Map,o=new Map,u=new Map,g=new Map,m=new Map,y=r.querySelector('[data-viz-layer="nodes"]')||r.querySelector(".viz-layer-nodes");if(y){let f=Array.from(y.querySelectorAll("g[data-id]"));for(let E of f){let B=E.getAttribute("data-id");if(!B)continue;t.set(B,E);let b=E.querySelector('[data-viz-role="node-shape"]')||E.querySelector(".viz-node-shape");b&&i.set(B,b);let z=E.querySelector('[data-viz-role="node-label"]')||E.querySelector(".viz-node-label");z&&n.set(B,z);let R=E.querySelector('[data-viz-role="node-image"]')||E.querySelector(".viz-node-image");R&&a.set(B,R);let w=E.querySelector('[data-viz-role="node-icon"]')||E.querySelector(".viz-node-icon");w&&d.set(B,w);let s=E.querySelector('[data-viz-role="node-svg"]')||E.querySelector(".viz-node-svg");s&&c.set(B,s);}}let h=r.querySelector('[data-viz-layer="edges"]')||r.querySelector(".viz-layer-edges");if(h){let f=Array.from(h.querySelectorAll("g[data-id]"));for(let E of f){let B=E.getAttribute("data-id");if(!B)continue;o.set(B,E);let b=E.querySelector('[data-viz-role="edge-line"]')||E.querySelector(".viz-edge");b&&u.set(B,b);let z=E.querySelector('[data-viz-role="edge-hit"]')||E.querySelector(".viz-edge-hit");z&&g.set(B,z);let R=Array.from(E.querySelectorAll('[data-viz-role="edge-label"],.viz-edge-label'));R.length>0&&m.set(B,R);}}return {svg:r,edgePathResolver:e?.edgePathResolver??null,nodeGroupsById:t,nodeShapesById:i,nodeLabelsById:n,nodeImagesById:a,nodeIconsById:d,nodeSvgsById:c,edgeGroupsById:o,edgeLinesById:u,edgeHitsById:g,edgeLabelsById:m}}function Tr(r){let e=0,t=0;if(r&&typeof r=="object"){let i=r;typeof i.w=="number"?e=i.w:typeof i.r=="number"?e=i.r*2:typeof i.rx=="number"&&typeof i.ry=="number"?(e=i.rx*2,t=i.ry*2):typeof i.size=="number"?e=i.size:typeof i.outerR=="number"&&(e=i.outerR*2),typeof i.h=="number"?t=i.h:t===0&&(t=e);}return {w:e,h:t}}function ft(r,e,t,i,n,a,d){let c=d?.position??"center",o=d?.dx??0,u=d?.dy??0,g=0,m=0;switch(c){case "above":m=-i/2-a/2;break;case "below":m=i/2+a/2;break;case "left":g=-t/2-n/2;break;case "right":g=t/2+n/2;break;}return {x:r+g-n/2+o,y:e+m-a/2+u}}function pt(r,e){let t=new Map(r.nodes.map(o=>[o.id,o])),i=new Map;for(let o of r.nodes)if(o.container){let u=(o.runtime?.x??o.pos.x)-o.pos.x,g=(o.runtime?.y??o.pos.y)-o.pos.y;(u!==0||g!==0)&&i.set(o.id,{dx:u,dy:g});}for(let o of r.nodes){let u=e.nodeGroupsById.get(o.id),g=e.nodeShapesById.get(o.id);if(!u||!g)continue;let{x:m,y}=chunkOZAFCKI7_js.d(o);if(o.parentId){let w=i.get(o.parentId);w&&(m+=w.dx,y+=w.dy);}let h=chunkOZAFCKI7_js.e(o);chunkOZAFCKI7_js.g(g,h,{x:m,y});let{w:f,h:E}=Tr(h);if(f>0&&E>0){let w=e.nodeImagesById.get(o.id);if(w&&o.image){let A=ft(m,y,f,E,o.image.width,o.image.height,{position:o.image.position,dx:o.image.dx,dy:o.image.dy});w.setAttribute("x",String(A.x)),w.setAttribute("y",String(A.y));}let s=e.nodeIconsById.get(o.id);if(s&&o.icon){let A=ft(m,y,f,E,o.icon.size,o.icon.size,{position:o.icon.position,dx:o.icon.dx,dy:o.icon.dy});s.setAttribute("transform",`translate(${A.x} ${A.y})`);}let v=e.nodeSvgsById.get(o.id);if(v&&o.svgContent){let A=ft(m,y,f,E,o.svgContent.width,o.svgContent.height,{position:o.svgContent.position,dx:o.svgContent.dx,dy:o.svgContent.dy});v.setAttribute("transform",`translate(${A.x} ${A.y})`);}}if(o.container?.headerHeight&&"w"in h&&"h"in h){let w=u.querySelector('[data-viz-role="container-header"]');if(w){let s=h.w,v=h.h,A=y-v/2+o.container.headerHeight;w.setAttribute("x1",String(m-s/2)),w.setAttribute("y1",String(A)),w.setAttribute("x2",String(m+s/2)),w.setAttribute("y2",String(A));}}let B=e.nodeLabelsById.get(o.id);if(B&&o.label){let w=m+(o.label.dx||0),s=y+(o.label.dy||0);if(o.container?.headerHeight&&"h"in h&&!o.label.dy){let A=h.h;s=y-A/2+o.container.headerHeight/2,w=m+(o.label.dx||0);}B.setAttribute("x",String(w)),B.setAttribute("y",String(s));let v=B.querySelectorAll('tspan[data-viz-role="text-line"]');for(let A=0;A<v.length;A++)v[A]?.setAttribute("x",String(w));}if(o.runtime?.opacity!==void 0?(u.style.opacity=String(o.runtime.opacity),g.removeAttribute("opacity")):(u.style.removeProperty("opacity"),o.style?.opacity!==void 0?g.setAttribute("opacity",String(o.style.opacity)):g.removeAttribute("opacity")),o.style?.shadow){let w=Vr(e.svg,o.style.shadow);g.setAttribute("filter",`url(#${w})`);}else g.removeAttribute("filter");if(o.style?.sketch||r.sketch?.enabled){let w=Or(o.style,o.id),s=Ft(e.svg,w);u.setAttribute("filter",`url(#${s})`),u.classList.contains("viz-sketch")||u.classList.add("viz-sketch");}else {u.classList.contains("viz-sketch")&&u.classList.remove("viz-sketch");let w=u.getAttribute("filter");w&&w.startsWith("url(#viz-sketch-")&&u.removeAttribute("filter");}let z=o.runtime?.scale,R=o.runtime?.rotation;if(z!==void 0||R!==void 0){let w=z??1,s=R??0;u.setAttribute("transform",`translate(${m} ${y}) rotate(${s}) scale(${w}) translate(${-m} ${-y})`);}else u.removeAttribute("transform");o.ports&&u.querySelectorAll('[data-viz-role="port"]').forEach(s=>{let v=s.getAttribute("data-port"),A=o.ports.find(_=>_.id===v);A&&(s.setAttribute("cx",String(m+A.offset.x)),s.setAttribute("cy",String(y+A.offset.y)));});}let n=e.edgePathResolver;for(let o of r.edges){let u=e.edgeGroupsById.get(o.id),g=e.edgeLinesById.get(o.id);if(!u||!g)continue;let m=o.from?t.get(o.from)??null:null,y=o.to?t.get(o.to)??null:null;if(o.from&&!m||o.to&&!y||!m&&!o.fromAt&&!y&&!o.toAt)continue;let h;if(m&&y&&m===y)h=chunkM3ZDZ24B_js.g(m,o);else {let b=chunkM3ZDZ24B_js.e(m,y,o);h=chunkM3ZDZ24B_js.f(b.start,b.end,o.routing,o.waypoints);}if(n){let b=z=>{let R=z.from?t.get(z.from)??null:null,w=z.to?t.get(z.to)??null:null;if(z.from&&!R||z.to&&!w||!R&&!z.fromAt&&!w&&!z.toAt)return "";if(R&&w&&R===w)return chunkM3ZDZ24B_js.g(R,z).d;let s=chunkM3ZDZ24B_js.e(R,w,z);return chunkM3ZDZ24B_js.f(s.start,s.end,z.routing,z.waypoints).d};try{let z=n(o,r,b);typeof z=="string"&&z&&(h.d=z);}catch(z){console.warn(`RuntimePatcher: edge path resolver threw for edge ${o.id}`,z);}}if(g.setAttribute("d",h.d),o.style?.stroke!==void 0&&(g.style.stroke=o.style.stroke),o.style?.strokeWidth!==void 0&&(g.style.strokeWidth=String(o.style.strokeWidth)),o.style?.fill!==void 0&&(g.style.fill=o.style.fill),o.style?.opacity!==void 0&&(g.style.opacity=String(o.style.opacity)),o.style?.strokeDasharray!==void 0&&(g.style.strokeDasharray=$e(o.style.strokeDasharray)),o.markerEnd&&o.markerEnd!=="none"){let b=o.style?.stroke?jt(e.svg,o.style.stroke,o.markerEnd,"end"):ht(o.markerEnd,void 0,"end");g.setAttribute("marker-end",`url(#${b})`);}else g.removeAttribute("marker-end");if(o.markerStart&&o.markerStart!=="none"){let b=o.style?.stroke?jt(e.svg,o.style.stroke,o.markerStart,"start"):ht(o.markerStart,void 0,"start");g.setAttribute("marker-start",`url(#${b})`);}else g.removeAttribute("marker-start");let f=e.edgeHitsById.get(o.id);f&&f.setAttribute("d",h.d);let E=e.edgeLabelsById.get(o.id);if(E){let b=De(o);E.forEach((z,R)=>{let w=b[R];if(!w)return;let s=Ge(w,h);z.setAttribute("x",String(s.x)),z.setAttribute("y",String(s.y));let v=z.querySelectorAll('tspan[data-viz-role="text-line"]');for(let A=0;A<v.length;A++)v[A]?.setAttribute("x",String(s.x));});}if(o.runtime?.opacity!==void 0?u.style.opacity=String(o.runtime.opacity):u.style.removeProperty("opacity"),o.runtime?.strokeDashoffset!==void 0?(g.style.strokeDashoffset=String(o.runtime.strokeDashoffset),g.setAttribute("stroke-dashoffset",String(o.runtime.strokeDashoffset))):(g.style.removeProperty("stroke-dashoffset"),g.removeAttribute("stroke-dashoffset")),o.style?.sketch||r.sketch?.enabled){let b=0;for(let w=0;w<o.id.length;w++)b=Math.imul(31,b)+o.id.charCodeAt(w)|0;let z=Math.abs(b),R=Ft(e.svg,z);g.setAttribute("filter",`url(#${R})`),u.classList.contains("viz-sketch")||u.classList.add("viz-sketch");}else {let b=g.getAttribute("filter");b&&b.startsWith("url(#viz-sketch-")&&g.removeAttribute("filter"),u.classList.contains("viz-sketch")&&u.classList.remove("viz-sketch");}}let a=[],d=new Map;for(let o of r.nodes)if(o.parentId){let u=d.get(o.parentId);u||(u=[],d.set(o.parentId,u)),u.push(o);}else a.push(o);a.sort((o,u)=>(o.zIndex||0)-(u.zIndex||0));let c=e.svg.querySelector('[data-viz-layer="nodes"]')||e.svg.querySelector(".viz-layer-nodes");if(c){let o=c.firstElementChild;for(let u of a){let g=e.nodeGroupsById.get(u.id);g&&(o!==g?c.insertBefore(g,o):o=o.nextElementSibling);}}for(let[o,u]of d.entries()){u.sort((y,h)=>(y.zIndex||0)-(h.zIndex||0));let g=e.nodeGroupsById.get(o);if(!g)continue;let m=g.querySelector(':scope > [data-viz-role="container-children"]');if(m){let y=m.firstElementChild;for(let h of u){let f=e.nodeGroupsById.get(h.id);f&&(y!==f?m.insertBefore(f,y):y=y.nextElementSibling);}}}}function yt(r,e,t=12){let i=r.split(`
114
+ `);if(!e)return i;let n=[],a=Math.max(1,Math.floor(e/(t*.6)));for(let d of i){if(d.length<=a){n.push(d);continue}let c=d.split(" "),o="";for(let u of c){let g=o?`${o} ${u}`:u;g.length<=a?o=g:o?(n.push(o),o=u):(n.push(u),o="");}o&&n.push(o);}return n}var _r=1.2;function ye(r,e,t,i={}){let{className:n="",fill:a,fontSize:d,fontWeight:c,fontFamily:o,textAnchor:u="middle",dominantBaseline:g="middle",maxWidth:m,lineHeight:y=_r,verticalAlign:h="middle",overflow:f}=i,E=12;if(typeof d=="number")E=d;else if(typeof d=="string"){let _=parseFloat(d);isNaN(_)||(E=_);}let B=typeof t!="string",b=[],z=[];if(B)z=Gr(t.tokens);else if(b=yt(t,m,E),m&&f&&f!=="visible")if(f==="ellipsis"&&b.length>2){let _=b[1];_&&(b=[b[0],_.substring(0,Math.max(0,_.length-3))+"..."]);}else f==="clip"&&b.length>2&&(b=[b[0],b[1]]);let R=[];a!==void 0&&R.push(`fill="${a}"`),d!==void 0&&R.push(`font-size="${d}"`),c!==void 0&&R.push(`font-weight="${c}"`),o!==void 0&&R.push(`font-family="${He(o)}"`),R.push(`text-anchor="${u}"`),g&&R.push(`dominant-baseline="${g}"`);let w=R.length>0?" "+R.join(" "):"",s=B?z.length:b.length,v=0;h==="middle"?v=-((s-1)*y)/2:h==="bottom"?v=-((s-1)*y):h==="top"&&(v=0);let A=B?z.map((_,l)=>{let N=Kt(l,v,y),k=_.map(q=>Dr(q)).join("");return `<tspan data-viz-role="text-line" x="${r}" dy="${N}">${k}</tspan>`}):b.map((_,l)=>{let N=Kt(l,v,y);return `<tspan data-viz-role="text-line" x="${r}" dy="${N}">${bt(_)}</tspan>`});return `<text x="${r}" y="${e}" class="${n}"${w}>${A.join("")}</text>`}function Kt(r,e,t){return r===0?e===0?"0":`${e}em`:`${t}em`}function Gr(r){let e=[[]];for(let t of r){if(t.kind==="newline"){e.push([]);continue}t.kind==="span"&&e[e.length-1].push(t);}return e.length===0?[[]]:e}function Dr(r){let e=[];r.className&&e.push(`class="${He(r.className)}"`),r.fill!==void 0&&e.push(`fill="${He(r.fill)}"`),r.fontSize!==void 0&&e.push(`font-size="${r.fontSize}"`),r.fontFamily?e.push(`font-family="${He(r.fontFamily)}"`):r.code&&e.push('font-family="monospace"');let t=r.fontWeight??(r.bold?"bold":void 0);t!==void 0&&e.push(`font-weight="${t}"`),r.italic&&e.push('font-style="italic"'),r.underline&&e.push('text-decoration="underline"'),r.baselineShift&&(e.push(`baseline-shift="${r.baselineShift}"`),r.fontSize===void 0&&e.push('font-size="0.8em"'));let n=`<tspan${e.length?" "+e.join(" "):""}>${bt(r.text)}</tspan>`;return r.href?`<a href="${He(r.href)}">${n}</a>`:n}function He(r){return bt(r)}function bt(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function Yt(r,e){if(e.at&&r.at(e.at.x,e.at.y),e.cell&&r.cell(e.cell.col,e.cell.row,e.cell.align),e.circle?r.circle(e.circle.r):e.rect?r.rect(e.rect.w,e.rect.h,e.rect.rx):e.diamond?r.diamond(e.diamond.w,e.diamond.h):e.cylinder?r.cylinder(e.cylinder.w,e.cylinder.h,e.cylinder.arcHeight):e.hexagon?r.hexagon(e.hexagon.r,e.hexagon.orientation):e.ellipse?r.ellipse(e.ellipse.rx,e.ellipse.ry):e.arc?r.arc(e.arc.r,e.arc.startAngle,e.arc.endAngle,e.arc.closed):e.blockArrow?r.blockArrow(e.blockArrow.length,e.blockArrow.bodyWidth,e.blockArrow.headWidth,e.blockArrow.headLength,e.blockArrow.direction):e.callout?r.callout(e.callout.w,e.callout.h,{rx:e.callout.rx,pointerSide:e.callout.pointerSide,pointerHeight:e.callout.pointerHeight,pointerWidth:e.callout.pointerWidth,pointerPosition:e.callout.pointerPosition}):e.cloud?r.cloud(e.cloud.w,e.cloud.h):e.cross?r.cross(e.cross.size,e.cross.barWidth):e.cube?r.cube(e.cube.w,e.cube.h,e.cube.depth):e.path?r.path(e.path.d,e.path.w,e.path.h):e.document?r.document(e.document.w,e.document.h,e.document.waveHeight):e.note?r.note(e.note.w,e.note.h,e.note.foldSize):e.parallelogram?r.parallelogram(e.parallelogram.w,e.parallelogram.h,e.parallelogram.skew):e.star?r.star(e.star.points,e.star.outerR,e.star.innerR):e.trapezoid?r.trapezoid(e.trapezoid.topW,e.trapezoid.bottomW,e.trapezoid.h):e.triangle&&r.triangle(e.triangle.w,e.triangle.h,e.triangle.direction),e.fill&&r.fill(e.fill),e.stroke&&(typeof e.stroke=="string"?r.stroke(e.stroke):r.stroke(e.stroke.color,e.stroke.width)),e.opacity!==void 0&&r.opacity(e.opacity),e.dash&&r.dash(e.dash),e.shadow!==void 0&&e.shadow!==false&&r.shadow(e.shadow===true?{}:e.shadow),e.sketch!==void 0&&e.sketch!==false&&r.sketch(e.sketch===true?{}:e.sketch),e.className&&r.class(e.className),e.zIndex!==void 0&&r.zIndex(e.zIndex),e.label)if(typeof e.label=="string")r.label(e.label);else {let t="text"in e.label&&typeof e.label.text=="string"?e.label.text:"";r.label(t,e.label);}if(e.image&&r.image(e.image.href,e.image.w,e.image.h,{dx:e.image.dx,dy:e.image.dy,position:e.image.position,preserveAspectRatio:e.image.preserveAspectRatio}),e.icon&&r.icon(e.icon.id,{size:e.icon.size,color:e.icon.color,dx:e.icon.dx,dy:e.icon.dy,position:e.icon.position}),e.svgContent&&r.svgContent(e.svgContent.content,e.svgContent.w,e.svgContent.h,{dx:e.svgContent.dx,dy:e.svgContent.dy,position:e.svgContent.position}),e.data!==void 0&&r.data(e.data),e.onClick&&r.onClick(e.onClick),e.tooltip!==void 0&&r.tooltip(e.tooltip),e.badges)for(let t of e.badges)r.badge(t.text,{position:t.position,fill:t.fill,background:t.background,fontSize:t.fontSize});if(e.ports)for(let t of e.ports)r.port(t.id,t.offset,t.direction);if(e.container&&r.container(e.container),e.parent&&r.parent(e.parent),e.compartments)for(let t of e.compartments)r.compartment(t.id,i=>{if(t.label)if(typeof t.label=="string")i.label(t.label);else {let{text:n,...a}=t.label;i.label(n,a);}if(t.entries)for(let n of t.entries)i.entry(n.id,n.text,{onClick:n.onClick,style:n.style,tooltip:n.tooltip,maxWidth:n.maxWidth,overflow:n.overflow,padding:n.padding,className:n.className});t.height!==void 0&&i.height(t.height),t.onClick&&i.onClick(t.onClick);});e.collapsed!==void 0&&r.collapsed(e.collapsed),e.collapseIndicator!==void 0&&r.collapseIndicator(e.collapseIndicator),e.collapseAnchor!==void 0&&r.collapseAnchor(e.collapseAnchor);}var Mr=30,Ut=16,vt=10;function Zt(r){let e=r.label&&typeof r.label.fontSize=="number"?r.label.fontSize:Ut,t=e*(r.label?.lineHeight??1.2),i=yt(r.text,r.label?.maxWidth,e);return t*i.length+r.paddingTop+r.paddingBottom}function Ir(r){if(r.explicitHeight!==void 0)return r.explicitHeight;if(r.entries&&r.entries.length>0){let i=vt*2;for(let n of r.entries)i+=Zt(n);return i}if(!r.label)return Mr;let e=(r.label.text.match(/\n/g)?.length??0)+1,t=typeof r.label.fontSize=="number"?r.label.fontSize:Ut;return e*t*(r.label.lineHeight??1.2)+vt*2}function Hr(r,e){let t=r.filter(d=>d.label||d.explicitHeight!==void 0||d.entries&&d.entries.length>0);if(t.length===0)return [];let i=0,n=t.map(d=>{let c=Ir(d),o={id:d.id,y:i,height:c};if(d.label&&(o.label=d.label),d.onClick&&(o.onClick=d.onClick),d.entries&&d.entries.length>0){let u=vt;o.entries=d.entries.map(g=>{let m=Zt(g),y={id:g.id,y:u,height:m,text:g.text};return g.label&&(y.label=g.label),g.onClick&&(y.onClick=g.onClick),g.tooltip&&(y.tooltip=g.tooltip),g.className&&(y.className=g.className),g.paddingTop&&(y.paddingTop=g.paddingTop),g.paddingBottom&&(y.paddingBottom=g.paddingBottom),u+=m,y});}return i+=c,o}),a=e.collapsed&&n.length>0?n[0].height:i;if(e.shape&&"h"in e.shape){let d=e.shape;(d.h===0||a>d.h||e.collapsed)&&(d.h=a);}return n}function Wr(r){return r===void 0?{top:0,bottom:0}:typeof r=="number"?{top:r,bottom:r}:{top:r.top??0,bottom:r.bottom??0}}var xt=class{_pending;constructor(e){this._pending={id:e};}label(e,t){return this._pending.entries&&this._pending.entries.length>0&&(console.warn(`[vizcraft] Compartment "${this._pending.id}": label() replaces existing entries. Use entry() or label(), not both.`),this._pending.entries=void 0),this._pending.label={text:e,...t,textAnchor:t?.textAnchor??"start"},this}height(e){return this._pending.explicitHeight=e,this}entry(e,t,i){this._pending.label&&(console.warn(`[vizcraft] Compartment "${this._pending.id}": entry() replaces existing label. Use entry() or label(), not both.`),this._pending.label=void 0),this._pending.entries||(this._pending.entries=[]);let n={text:t,textAnchor:"start",...i?.style&&{fill:i.style.fill,fontSize:i.style.fontSize,fontWeight:i.style.fontWeight??i.style.fontStyle,fontFamily:i.style.fontFamily},...i?.maxWidth!==void 0&&{maxWidth:i.maxWidth},...i?.overflow!==void 0&&{overflow:i.overflow}},{top:a,bottom:d}=Wr(i?.padding);return this._pending.entries.push({id:e,text:t,label:n,onClick:i?.onClick,tooltip:i?.tooltip,className:i?.className,paddingTop:a,paddingBottom:d}),this}onClick(e){return this._pending.onClick=e,this}},Je=class{_builder;nodeDef;_pendingCompartments=[];constructor(e,t){this._builder=e,this.nodeDef=t;}at(e,t){return this.nodeDef.pos={x:e,y:t},this}cell(e,t,i="center"){let n=this._builder._getGridConfig();if(!n)return console.warn("VizBuilder: .cell() called but no grid configured. Use .grid() first."),this;let a=this._builder._getViewBox(),d=a.w-n.padding.x*2,c=a.h-n.padding.y*2,o=d/n.cols,u=c/n.rows,g=n.padding.x+e*o,m=n.padding.y+t*u;return i==="center"?(g+=o/2,m+=u/2):i==="end"&&(g+=o,m+=u),this.nodeDef.pos={x:g,y:m},this}circle(e){return this.nodeDef.shape={kind:"circle",r:e},this}rect(e,t,i){return this.nodeDef.shape={kind:"rect",w:e,h:t,rx:i},this}diamond(e,t){return this.nodeDef.shape={kind:"diamond",w:e,h:t},this}cylinder(e,t,i){return this.nodeDef.shape={kind:"cylinder",w:e,h:t,arcHeight:i},this}hexagon(e,t){return this.nodeDef.shape={kind:"hexagon",r:e,orientation:t},this}ellipse(e,t){return this.nodeDef.shape={kind:"ellipse",rx:e,ry:t},this}arc(e,t,i,n){return this.nodeDef.shape={kind:"arc",r:e,startAngle:t,endAngle:i,closed:n},this}blockArrow(e,t,i,n,a){return this.nodeDef.shape={kind:"blockArrow",length:e,bodyWidth:t,headWidth:i,headLength:n,direction:a},this}callout(e,t,i){return this.nodeDef.shape={kind:"callout",w:e,h:t,rx:i?.rx,pointerSide:i?.pointerSide,pointerHeight:i?.pointerHeight,pointerWidth:i?.pointerWidth,pointerPosition:i?.pointerPosition},this}cloud(e,t){return this.nodeDef.shape={kind:"cloud",w:e,h:t},this}cross(e,t){return this.nodeDef.shape={kind:"cross",size:e,barWidth:t},this}cube(e,t,i){return this.nodeDef.shape={kind:"cube",w:e,h:t,depth:i},this}path(e,t,i){return this.nodeDef.shape={kind:"path",d:e,w:t,h:i},this}document(e,t,i){return this.nodeDef.shape={kind:"document",w:e,h:t,waveHeight:i},this}note(e,t,i){return this.nodeDef.shape={kind:"note",w:e,h:t,foldSize:i},this}parallelogram(e,t,i){return this.nodeDef.shape={kind:"parallelogram",w:e,h:t,skew:i},this}star(e,t,i){return this.nodeDef.shape={kind:"star",points:e,outerR:t,innerR:i},this}trapezoid(e,t,i){return this.nodeDef.shape={kind:"trapezoid",topW:e,bottomW:t,h:i},this}triangle(e,t,i){return this.nodeDef.shape={kind:"triangle",w:e,h:t,direction:i},this}image(e,t,i,n){let a=typeof t=="number"?{width:t,height:i??t,dx:n?.dx,dy:n?.dy,position:n?.position,preserveAspectRatio:n?.preserveAspectRatio}:{width:t.w,height:t.h,dx:t.dx,dy:t.dy,position:t.position,preserveAspectRatio:t.preserveAspectRatio},d={href:e,width:a.width,height:a.height};return a.dx!==void 0&&(d.dx=a.dx),a.dy!==void 0&&(d.dy=a.dy),a.position!==void 0&&(d.position=a.position),a.preserveAspectRatio!==void 0&&(d.preserveAspectRatio=a.preserveAspectRatio),this.nodeDef.image=d,this}icon(e,t){let i={id:e,size:t.size};return t.color!==void 0&&(i.color=t.color),t.dx!==void 0&&(i.dx=t.dx),t.dy!==void 0&&(i.dy=t.dy),t.position!==void 0&&(i.position=t.position),this.nodeDef.icon=i,this}svgContent(e,t,i,n){let a=typeof t=="number"?{width:t,height:i??t,dx:n?.dx,dy:n?.dy,position:n?.position}:{width:t.w,height:t.h,dx:t.dx,dy:t.dy,position:t.position},d={content:e,width:a.width,height:a.height};return a.dx!==void 0&&(d.dx=a.dx),a.dy!==void 0&&(d.dy=a.dy),a.position!==void 0&&(d.position=a.position),this.nodeDef.svgContent=d,this}label(e,t){return this.nodeDef.label={text:e,...t},this}richLabel(e,t){let i=new Oe;return e(i),this.nodeDef.label={text:"",...t,rich:i.build()},this}fill(e){return this.nodeDef.style={...this.nodeDef.style||{},fill:e},this}stroke(e,t){return this.nodeDef.style={...this.nodeDef.style||{},stroke:e,strokeWidth:t??this.nodeDef.style?.strokeWidth},this}opacity(e){return this.nodeDef.style={...this.nodeDef.style||{},opacity:e},this}dashed(){return this.nodeDef.style={...this.nodeDef.style||{},strokeDasharray:"dashed"},this}dotted(){return this.nodeDef.style={...this.nodeDef.style||{},strokeDasharray:"dotted"},this}dash(e){return this.nodeDef.style={...this.nodeDef.style||{},strokeDasharray:e},this}shadow(e){return this.nodeDef.style={...this.nodeDef.style||{},shadow:e??{}},this}sketch(e){return this.nodeDef.style={...this.nodeDef.style||{},sketch:true,sketchSeed:e?.seed},this}class(e){return this.nodeDef.className?this.nodeDef.className+=` ${e}`:this.nodeDef.className=e,this}zIndex(e){return this.nodeDef.zIndex=e,this}animate(e,t){if(typeof e=="string")return this.nodeDef.animations||(this.nodeDef.animations=[]),this.nodeDef.animations.push({id:e,params:t}),this;let i=this.nodeDef.id;if(!i)throw new Error("NodeBuilder.animate(cb): node has no id");return this._builder.animate(n=>{n.node(i),e(n);}),this}animateTo(e,t){return this.animate(i=>{i.to(e,t);})}data(e){return this.nodeDef.data=e,this}onClick(e){return this.nodeDef.onClick=e,this}container(e){return this.nodeDef.container=e??{layout:"free"},this}compartment(e,t){let i=new xt(e);return t&&t(i),this._pendingCompartments.push(i._pending),this}collapsed(e){return this.nodeDef.collapsed=e!==false,this}collapseIndicator(e){return this.nodeDef.collapseIndicator=e,this}collapseAnchor(e){return this.nodeDef.collapseAnchor=e,this}port(e,t,i){return this.nodeDef.ports||(this.nodeDef.ports=[]),this.nodeDef.ports.push({id:e,offset:t,direction:i}),this}parent(e){return this.nodeDef.parentId=e,this}tooltip(e){return this.nodeDef.tooltip=e,this}badge(e,t){return this.nodeDef.badges||(this.nodeDef.badges=[]),this.nodeDef.badges.push({text:e,position:t?.position??"top-left",fill:t?.fill,background:t?.background,fontSize:t?.fontSize}),this}_resolveCompartments(){this._pendingCompartments.length!==0&&(this.nodeDef.compartments=Hr(this._pendingCompartments,this.nodeDef));}done(){return this._resolveCompartments(),this._builder}node(e,t){return this._resolveCompartments(),this._builder.node(e,t)}edge(e,t,i){return this._resolveCompartments(),this._builder.edge(e,t,i)}danglingEdge(e,t){return this._resolveCompartments(),this._builder.danglingEdge(e,t)}overlay(e,t,i){return this._resolveCompartments(),typeof e=="function"?this._builder.overlay(e):this._builder.overlay(e,t,i)}build(){return this._resolveCompartments(),this._builder.build()}svg(e){return this._resolveCompartments(),this._builder.svg(e)}};function St(r,e){if(e.from&&r.from(e.from),e.to&&r.to(e.to),e.fromAt&&r.fromAt(e.fromAt),e.toAt&&r.toAt(e.toAt),e.routing&&r.routing(e.routing),e.waypoints)for(let t of e.waypoints)r.via(t.x,t.y);if(e.arrow!==void 0&&r.arrow(e.arrow),e.markerStart&&r.markerStart(e.markerStart),e.markerEnd&&r.markerEnd(e.markerEnd),e.loopSide&&r.loopSide(e.loopSide),e.loopSize&&r.loopSize(e.loopSize),e.stroke&&(typeof e.stroke=="string"?r.stroke(e.stroke):r.stroke(e.stroke.color,e.stroke.width)),e.fill&&r.fill(e.fill),e.opacity!==void 0&&r.opacity(e.opacity),e.dash&&r.dash(e.dash),e.sketch&&r.sketch(),e.className&&r.class(e.className),e.anchor&&r.connect(e.anchor),e.fromPort&&r.fromPort(e.fromPort),e.toPort&&r.toPort(e.toPort),e.fromAngle!==void 0&&r.fromAngle(e.fromAngle),e.toAngle!==void 0&&r.toAngle(e.toAngle),e.straightLine!==void 0&&(e.straightLine===true?r.straightLine():e.straightLine==="from"?r.straightLineFrom():e.straightLine==="to"&&r.straightLineTo()),e.label)if(typeof e.label=="string")r.label(e.label);else if(Array.isArray(e.label))for(let t of e.label){let i=typeof t.text=="string"?t.text:"";r.label(i,t);}else {let t="text"in e.label&&typeof e.label.text=="string"?e.label.text:"";r.label(t,e.label);}e.hitArea!==void 0&&r.hitArea(e.hitArea),e.meta!==void 0&&r.meta(e.meta),e.data!==void 0&&r.data(e.data),e.onClick&&r.onClick(e.onClick),e.tooltip!==void 0&&r.tooltip(e.tooltip);}var We=class{parent;edgeDef;constructor(e,t){this.parent=e,this.edgeDef=t;}straight(){return this.edgeDef.routing="straight",this}curved(){return this.edgeDef.routing="curved",this}orthogonal(){return this.edgeDef.routing="orthogonal",this}routing(e){return this.edgeDef.routing=e,this}via(e,t){return this.edgeDef.waypoints||(this.edgeDef.waypoints=[]),this.edgeDef.waypoints.push({x:e,y:t}),this}from(e){return this.edgeDef.from=e,this}to(e){return this.edgeDef.to=e,this}fromAt(e){return this.edgeDef.fromAt=e,this}toAt(e){return this.edgeDef.toAt=e,this}label(e,t){let i={position:"mid",text:e,dy:-10,...t};return this.edgeDef.labels||(this.edgeDef.labels=[]),this.edgeDef.labels.push(i),i.position==="mid"&&!this.edgeDef.label&&(this.edgeDef.label=i),this}richLabel(e,t){let i=new Oe;e(i);let n={position:"mid",text:"",dy:-10,...t,rich:i.build()};return this.edgeDef.labels||(this.edgeDef.labels=[]),this.edgeDef.labels.push(n),n.position==="mid"&&!this.edgeDef.label&&(this.edgeDef.label=n),this}arrow(e=true){return e==="both"?(this.edgeDef.markerStart="arrow",this.edgeDef.markerEnd="arrow"):e==="start"?this.edgeDef.markerStart="arrow":e==="end"?this.edgeDef.markerEnd="arrow":e===true?this.edgeDef.markerEnd="arrow":this.edgeDef.markerEnd="none",this}markerEnd(e){return this.edgeDef.markerEnd=e,this}markerStart(e){return this.edgeDef.markerStart=e,this}connect(e){return this.edgeDef.anchor=e,this}fromPort(e){return this.edgeDef.fromPort=e,this}toPort(e){return this.edgeDef.toPort=e,this}fromAngle(e){return this.edgeDef.fromAngle=e,this}toAngle(e){return this.edgeDef.toAngle=e,this}straightLine(){return this.edgeDef.straightLine=true,this}straightLineFrom(){return this.edgeDef.straightLine="from",this}straightLineTo(){return this.edgeDef.straightLine="to",this}fill(e){return this.edgeDef.style={...this.edgeDef.style||{},fill:e},this}stroke(e,t){return this.edgeDef.style={...this.edgeDef.style||{},stroke:e,strokeWidth:t??this.edgeDef.style?.strokeWidth},this}opacity(e){return this.edgeDef.style={...this.edgeDef.style||{},opacity:e},this}dashed(){return this.edgeDef.style={...this.edgeDef.style||{},strokeDasharray:"dashed"},this}dotted(){return this.edgeDef.style={...this.edgeDef.style||{},strokeDasharray:"dotted"},this}dash(e){return this.edgeDef.style={...this.edgeDef.style||{},strokeDasharray:e},this}sketch(){return this.edgeDef.style={...this.edgeDef.style||{},sketch:true},this}class(e){return this.edgeDef.className?this.edgeDef.className+=` ${e}`:this.edgeDef.className=e,this}animate(e,t){if(typeof e=="string")return this.edgeDef.animations||(this.edgeDef.animations=[]),this.edgeDef.animations.push({id:e,params:t}),this;let i=this.edgeDef.id||`${this.edgeDef.from}->${this.edgeDef.to}`;if(!i)throw new Error("EdgeBuilder.animate(cb): edge has no id");return this.parent.animate(n=>{n.edge(i),e(n);}),this}animateTo(e,t){return this.animate(i=>{i.to(e,t);})}hitArea(e){return this.edgeDef.hitArea=e,this}meta(e){return this.edgeDef.meta=e,this}data(e){return this.edgeDef.data=e,this}onClick(e){return this.edgeDef.onClick=e,this}loopSide(e){return this.edgeDef.loopSide=e,this}loopSize(e){return this.edgeDef.loopSize=e,this}tooltip(e){return this.edgeDef.tooltip=e,this}done(){return this.parent}node(e,t){return this.parent.node(e,t)}edge(e,t,i){return this.parent.edge(e,t,i)}danglingEdge(e,t){return this.parent.danglingEdge(e,t)}overlay(e,t,i){return typeof e=="function"?this.parent.overlay(e):this.parent.overlay(e,t,i)}build(){return this.parent.build()}svg(e){return this.parent.svg(e)}};var et={dx:2,dy:2,blur:4,color:"rgba(0,0,0,0.2)"};function qe(r){return {dx:r.dx??et.dx,dy:r.dy??et.dy,blur:r.blur??et.blur,color:r.color??et.color}}function Fe(r){let e=r.color.replace(/[^a-zA-Z0-9]/g,"_");return `viz-shadow-${r.dx}-${r.dy}-${r.blur}-${e}`}function qr(r){return r.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function At(r,e){return `<filter id="${r}" x="-50%" y="-50%" width="200%" height="200%"><feDropShadow dx="${e.dx}" dy="${e.dy}" stdDeviation="${e.blur}" flood-color="${qr(e.color)}" flood-opacity="1"/></filter>`}function Pe(r){return `viz-sketch-${r}`}function Fr(r,e){let t=(r^e*2654435761)>>>0|1;return t^=t<<13,t^=t>>>17,t^=t<<5,(t>>>0)/4294967296}function je(r,e,t,i){return t+Fr(r,e)*(i-t)}function kt(r,e){let t=e+37,i=je(e,1,.009,.015).toFixed(4),n=je(e,2,2.5,4).toFixed(1),a=je(e,3,3,5).toFixed(1),d=je(e,4,.3,1.6).toFixed(2),c=je(e,5,.2,1.3).toFixed(2);return `<filter id="${r}" filterUnits="userSpaceOnUse" x="-10000" y="-10000" width="20000" height="20000"><feTurbulence type="fractalNoise" baseFrequency="0.008" numOctaves="2" seed="${e}" result="n1"/><feTurbulence type="fractalNoise" baseFrequency="${i}" numOctaves="2" seed="${t}" result="n2"/><feDisplacementMap in="SourceGraphic" in2="n1" scale="${n}" xChannelSelector="R" yChannelSelector="G" result="s1"/><feDisplacementMap in="SourceGraphic" in2="n2" scale="${a}" xChannelSelector="G" yChannelSelector="R" result="s2"/><feOffset in="s2" dx="${d}" dy="${c}" result="s2off"/><feComposite in="s1" in2="s2off" operator="over"/></filter>`}function Ke(r,e){if(r?.sketchSeed!==void 0)return r.sketchSeed;let t=0;for(let i=0;i<e.length;i++)t=Math.imul(31,t)+e.charCodeAt(i)|0;return Math.abs(t)}function jr(r){return typeof r=="object"&&r!==null&&"then"in r&&typeof r.then=="function"}function Kr(r){return r.replace(/[^a-zA-Z0-9]/g,"_")}function ze(r,e,t="end"){if(r==="none")return "";let i=`viz-${r}`,n=t==="start"?"-start":"";return e?`${i}${n}-${Kr(e)}`:`${i}${n}`}function tt(r,e){let t=r.from?e.get(r.from)??null:null,i=r.to?e.get(r.to)??null:null;return r.from&&!t||r.to&&!i||!t&&!r.fromAt&&!i&&!r.toAt?null:{start:t,end:i}}function we(r){return r.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var Yr={arrow:r=>`<polygon points="0,2 10,5 0,8" fill="${r}" />`,arrowOpen:r=>`<polyline points="0,2 10,5 0,8" fill="white" stroke="${r}" stroke-width="1.5" stroke-linejoin="miter" />`,diamond:r=>`<polygon points="0,5 5,2 10,5 5,8" fill="${r}" />`,diamondOpen:r=>`<polygon points="0,5 5,2 10,5 5,8" fill="white" stroke="${r}" stroke-width="1.5" />`,circle:r=>`<circle cx="5" cy="5" r="3" fill="${r}" />`,circleOpen:r=>`<circle cx="5" cy="5" r="3" fill="white" stroke="${r}" stroke-width="1.5" />`,square:r=>`<rect x="2" y="2" width="6" height="6" fill="${r}" />`,bar:r=>`<line x1="5" y1="1" x2="5" y2="9" stroke="${r}" stroke-width="2" stroke-linecap="round" />`,halfArrow:r=>`<polygon points="0,2 10,5 0,5" fill="${r}" />`};function rt(r,e,t,i="end"){if(r==="none")return "";let n=Yr[r];if(!n)return "";let a=we(e);return `<marker id="${t}" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="10" markerHeight="10" orient="${i==="start"?"auto-start-reverse":"auto"}">${n(a)}</marker>`}function Le(r,e,t,i){let{x:n,y:a}=chunkOZAFCKI7_js.d(r),d=chunkM3ZDZ24B_js.j(r),c=i?.position??"center",o=i?.dx??0,u=i?.dy??0,g=0,m=0;switch(c){case "above":m=-d.h/2-t/2;break;case "below":m=d.h/2+t/2;break;case "left":g=-d.w/2-e/2;break;case "right":g=d.w/2+e/2;break;}return {x:n+g-e/2+o,y:a+m-t/2+u}}function Et(r,e,t){let i=r.trim();return i.startsWith("<svg")?i.replace(/<svg\b([^>]*)>/,(n,a)=>`<svg${a.replace(/\swidth="[^"]*"/g,"").replace(/\sheight="[^"]*"/g,"")} width="${e}" height="${t}">`):r}function Xt(r,e,t){let i=r.trim();return i.startsWith("<svg")?Et(i,e,t):`<svg width="${e}" height="${t}" viewBox="0 0 ${e} ${t}" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}var Re=new WeakMap,it=new WeakMap;function Ur(r,e){Object.entries(e).forEach(([t,i])=>{i===void 0?r.removeAttribute(t):r.setAttribute(t,String(i));});}function Zr(r){return Object.entries(r).filter(([,e])=>e!==void 0).map(([e,t])=>` ${e}="${String(t)}"`).join("")}function nt(r){return `viz-anim-${r}`}function ot(r){return !r||typeof r!="object"?[]:Object.entries(r).filter(([,e])=>e!==void 0).map(([e,t])=>[`--viz-anim-${e}`,String(t)])}var Oe=class{_tokens=[];text(e,t){return this._tokens.push({kind:"span",text:e,...t??{}}),this}bold(e,t){return this.text(e,{...t??{},bold:true})}italic(e,t){return this.text(e,{...t??{},italic:true})}code(e,t){return this.text(e,{...t??{},code:true})}color(e,t,i){return this.text(e,{...i??{},fill:t})}link(e,t,i){return this.text(e,{...i??{},href:t})}sup(e,t){return this.text(e,{...t??{},baselineShift:"super"})}sub(e,t){return this.text(e,{...t??{},baselineShift:"sub"})}newline(){return this._tokens.push({kind:"newline"}),this}build(){return {kind:"rich",tokens:[...this._tokens]}}},zt=class{_viewBox={w:800,h:600};_nodes=new Map;_edges=new Map;_overlays=[];_nodeOrder=[];_edgeOrder=[];_gridConfig=null;_sketch=null;_animationSpecs=[];_mountedContainer=null;_panZoomController;_tooltipController;_edgePathResolver=null;_changes={added:{nodes:[],edges:[]},removed:{nodes:[],edges:[]},updated:{nodes:[],edges:[]}};_changeListeners=[];_eventListeners={build:[],mount:[]};on(e,t){return this._eventListeners[e]||(this._eventListeners[e]=[]),this._eventListeners[e].push(t),()=>{this._eventListeners[e]=this._eventListeners[e].filter(i=>i!==t);}}_dispatchEvent(e,t){let i=this._eventListeners[e];i&&i.forEach(n=>n(t));}addNode(e){if(this._nodes.has(e.id)){console.warn(`VizBuilder.addNode: Node ${e.id} already exists`);return}this._nodes.set(e.id,{...e}),this._nodeOrder.push(e.id),this._changes.added.nodes.push(e.id);}removeNode(e){if(!this._nodes.has(e))return;this._nodes.delete(e),this._nodeOrder=this._nodeOrder.filter(i=>i!==e),this._changes.removed.nodes.push(e);let t=[];this._edges.forEach(i=>{(i.from===e||i.to===e)&&t.push(i.id);}),t.forEach(i=>this.removeEdge(i));}updateNode(e,t){let i=this._nodes.get(e);if(!i){console.warn(`VizBuilder.updateNode: Node ${e} not found`);return}let n={...i,...t};t.pos&&i.pos&&(n.pos={...i.pos,...t.pos}),t.style&&i.style&&(n.style={...i.style,...t.style}),t.shape&&i.shape&&(n.shape={...i.shape,...t.shape}),this._nodes.set(e,n),this._changes.added.nodes.includes(e)||this._changes.updated.nodes.includes(e)||this._changes.updated.nodes.push(e);}_performCollapseToggle(e,t,i){let n=this._nodes.get(e);if(!n||!n.compartments||n.compartments.length===0||!n.shape||!("h"in n.shape))return;let a=i??n.collapseAnchor??"center",d=!n.collapsed,c=!!n.collapsed,o=t??0,u=n.compartments.reduce((B,b)=>B+b.height,0),g=n.compartments[0].height,m=n.collapsed?g:u,y=d?g:u,h=n.pos?.y??0,f=this._mountedContainer,E={...n.shape,h:m};if(this.updateNode(e,{collapsed:d,shape:E}),o>0&&m!==y&&f){let B=performance.now(),b=z=>{let R=z-B,w=Math.min(R/o,1),s=1-Math.pow(1-w,3),v=m+(y-m)*s,A=this._nodes.get(e);if(!A?.shape||!("h"in A.shape))return;let _=v-m,l=a==="top"?_/2:a==="bottom"?-_/2:0,N={...A.shape,h:v};if(this.updateNode(e,{shape:N,pos:{x:A.pos?.x??0,y:h+l}}),this.commit(f),c){let k=f.querySelector(`[data-id="${e}"]`);if(k)if(w<1){let q=(u-v)/u*100;k.style.clipPath=`inset(0 0 ${q}% 0)`;}else k.style.clipPath="";}w<1&&requestAnimationFrame(b);};requestAnimationFrame(b);}else {let B=y-m,b=a==="top"?B/2:a==="bottom"?-B/2:0,z={...n.shape,h:y};this.updateNode(e,{collapsed:d,shape:z,pos:{x:n.pos?.x??0,y:h+b}}),f&&this.commit(f);}}addEdge(e){if(this._edges.has(e.id)){console.warn(`VizBuilder.addEdge: Edge ${e.id} already exists`);return}this._edges.set(e.id,{...e}),this._edgeOrder.push(e.id),this._changes.added.edges.push(e.id);}removeEdge(e){this._edges.has(e)&&(this._edges.delete(e),this._edgeOrder=this._edgeOrder.filter(t=>t!==e),this._changes.removed.edges.push(e));}updateEdge(e,t){let i=this._edges.get(e);if(!i){console.warn(`VizBuilder.updateEdge: Edge ${e} not found`);return}this._edges.set(e,{...i,...t}),this._changes.added.edges.includes(e)||this._changes.updated.edges.includes(e)||this._changes.updated.edges.push(e);}onChange(e){return this._changeListeners.push(e),()=>{this._changeListeners=this._changeListeners.filter(t=>t!==e);}}commit(e){let t=this._changes;if(this._changeListeners.length>0){let d={added:{nodes:[...t.added.nodes],edges:[...t.added.edges]},removed:{nodes:[...t.removed.nodes],edges:[...t.removed.edges]},updated:{nodes:[...t.updated.nodes],edges:[...t.updated.edges]}};this._changeListeners.forEach(c=>c(d));}if(this._changes={added:{nodes:[],edges:[]},removed:{nodes:[],edges:[]},updated:{nodes:[],edges:[]}},!e)return;let i=e.querySelector("svg");if(!i){console.warn("VizBuilder.commit: No mounted SVG found in container. Need to call .mount() first.");return}let n=this.build();if(this._renderSceneToDOM(n,e),this._tooltipController){let d=new Map(n.nodes.map(o=>[o.id,o])),c=new Map(n.edges.map(o=>[o.id,o]));this._tooltipController.updateData(d,c),this._addTooltipA11y(i,n);}let a=Ie(i,{edgePathResolver:this._edgePathResolver});Re.set(i,a),pt(n,a);}use(e,t){return e(this,t),this}layout(e,t){let i=this.build(),n={nodes:i.nodes,edges:i.edges},a=e(n,t);if(jr(a))throw new Error("VizBuilder.layout: received a Promise from the layout algorithm. Use .layoutAsync() for async layout engines.");return this._applyLayoutResult(a),this}async layoutAsync(e,t){let i=this.build(),n={nodes:i.nodes,edges:i.edges},a=await e(n,t);return this._applyLayoutResult(a),this}_applyLayoutResult(e){for(let[t,i]of Object.entries(e.nodes))this.updateNode(t,{pos:i});if(e.edges)for(let[t,i]of Object.entries(e.edges))i.waypoints!==void 0&&this.updateEdge(t,{waypoints:i.waypoints});}setEdgePathResolver(e){this._edgePathResolver=e;let t=this._mountedContainer;if(t){let i=t.querySelector("svg");if(i){let n=Re.get(i);n?n.edgePathResolver=e:Re.set(i,Ie(i,{edgePathResolver:e}));}}return this}view(e,t){return this._viewBox={w:e,h:t},this}grid(e,t,i={x:20,y:20}){return this._gridConfig={cols:e,rows:t,padding:i},this}sketch(e=true,t){return this._sketch=e?{enabled:true,seed:t}:null,this}overlay(e,t,i){if(typeof e=="function"){let c=new _e;return e(c),this._overlays.push(...c.build()),this}let n=e,a=t,d=i;return this._overlays.push({id:n,params:a,key:d}),this}animate(e){let t=chunkC27QMQJJ_js.d(e);return this._animationSpecs.push(t),t}node(e,t){this._nodes.has(e)||(this._nodes.set(e,{id:e,pos:{x:0,y:0},shape:{kind:"circle",r:10}}),this._nodeOrder.push(e));let i=new Je(this,this._nodes.get(e));return t?(Yt(i,t),i.done(),this):i}edge(e,t,i){let n=i!==void 0&&typeof i!="string",a=n?i.id||`${e}->${t}`:i||`${e}->${t}`;this._edges.has(a)||(this._edges.set(a,{id:a,from:e,to:t}),this._edgeOrder.push(a));let d=new We(this,this._edges.get(a));return n?(St(d,i),this):d}danglingEdge(e,t){if(!this._edges.has(e)){let n={id:e};t?.fromAt&&(n.fromAt=t.fromAt),t?.toAt&&(n.toAt=t.toAt),this._edges.set(e,n),this._edgeOrder.push(e);}let i=new We(this,this._edges.get(e));return t?(St(i,t),this):i}fromScene(e){return e.viewBox&&this.view(e.viewBox.w,e.viewBox.h),e.grid&&this.grid(e.grid.cols,e.grid.rows,e.grid.padding),this._nodes.clear(),this._nodeOrder=[],this._edges.clear(),this._edgeOrder=[],this._overlays=[],this._animationSpecs=[],e.nodes&&e.nodes.forEach(t=>{this._nodes.set(t.id,{...t}),this._nodeOrder.push(t.id);}),e.edges&&e.edges.forEach(t=>{this._edges.set(t.id,{...t}),this._edgeOrder.push(t.id);}),e.overlays&&(this._overlays=[...e.overlays]),e.animationSpecs&&(this._animationSpecs=[...e.animationSpecs]),this._sketch=e.sketch?{...e.sketch,enabled:e.sketch.enabled??true}:null,this}build(){this._edges.forEach(n=>{n.from&&!this._nodes.has(n.from)&&console.warn(`VizBuilder: Edge ${n.id} references missing source node ${n.from}`),n.to&&!this._nodes.has(n.to)&&console.warn(`VizBuilder: Edge ${n.id} references missing target node ${n.to}`);});let e=this._nodeOrder.map(n=>this._nodes.get(n)),t=this._edgeOrder.map(n=>this._edges.get(n)),i={viewBox:this._viewBox,grid:this._gridConfig??void 0,nodes:e,edges:t,overlays:this._overlays,animationSpecs:this._animationSpecs.length>0?[...this._animationSpecs]:void 0,sketch:this._sketch??void 0};return this._dispatchEvent("build",{scene:i}),i}_getGridConfig(){return this._gridConfig}_getViewBox(){return this._viewBox}svg(e){let t=this.build();return this._renderSceneToSvg(t,e)}mount(e,t){let i=this.build();this._renderSceneToDOM(i,e),this._mountedContainer=e;let n=e.querySelector("svg");if(n&&t?.css&&this._injectCssIntoMountedSvg(n,t.css),n&&t?.autoplay&&this.play(e,i.animationSpecs??[]),n&&(i.nodes.some(c=>c.tooltip!=null)||i.edges.some(c=>c.tooltip!=null))){this._tooltipController&&this._tooltipController.destroy();let c=new Map(i.nodes.map(u=>[u.id,u])),o=new Map(i.edges.map(u=>[u.id,u]));this._tooltipController=chunkM3ZDZ24B_js.c(e,n,c,o),this._addTooltipA11y(n,i);}let a;if(n&&t?.panZoom){let d=n.querySelector(".viz-viewport");d&&(a=chunkM3ZDZ24B_js.a(n,d,i,t));}return this._panZoomController=a,this._dispatchEvent("mount",{container:e,controller:a}),a}destroy(){if(this._panZoomController&&(this._panZoomController.destroy(),this._panZoomController=void 0),this._tooltipController&&(this._tooltipController.destroy(),this._tooltipController=void 0),this._mountedContainer){let e=it.get(this._mountedContainer);e&&(e.stop(),it.delete(this._mountedContainer));let t=this._mountedContainer.querySelector("svg");t&&t.remove(),this._mountedContainer=null;}}_addTooltipA11y(e,t){let i=e.querySelectorAll('g[data-viz-role="node-group"]'),n=new Set(t.nodes.filter(c=>c.tooltip!=null).map(c=>c.id));i.forEach(c=>{let o=c.getAttribute("data-id");o&&n.has(o)&&!c.hasAttribute("tabindex")&&c.setAttribute("tabindex","0");});let a=e.querySelectorAll('g[data-viz-role="edge-group"]'),d=new Set(t.edges.filter(c=>c.tooltip!=null).map(c=>c.id));a.forEach(c=>{let o=c.getAttribute("data-id");o&&d.has(o)&&!c.hasAttribute("tabindex")&&c.setAttribute("tabindex","0");});}_injectCssIntoMountedSvg(e,t){let i=(Array.isArray(t)?t.join(`
115
115
  `):t).trim();if(!i)return;let n="data-viz-user-css",a=e.querySelector(`style[${n}="true"]`);if(a){let o=a.textContent??"";if(o.includes(i))return;a.textContent=`${o}
116
- ${i}`.trim();return}let d=document.createElement("style");d.setAttribute(n,"true"),d.setAttribute("type","text/css"),d.textContent=i;let c=e.querySelector("style");c&&c.parentNode===e?e.insertBefore(d,c.nextSibling):e.prepend(d);}play(e,t){if(!e){let i=this._mountedContainer;return !i||!i.querySelector("svg")?(console.warn("VizBuilder: Call mount(container) before play()."),null):this._playImpl(i,void 0,false)}return this._playImpl(e,t,true)}_playImpl(e,t,i){if(!e.querySelector("svg")){if(!i)return null;this.mount(e);}let a=this.build(),d=Array.isArray(t)?t:t?[t]:a.animationSpecs??[];if(!t&&d.length===0)return null;let c=[];for(let g of d)c.push(...chunkAE7VTFYG_js.b(g));it.get(e)?.stop();let o={version:"viz-anim/1",tweens:d.flatMap(g=>g.tweens)},u=chunkAE7VTFYG_js.f({builder:this,container:e,extendAdapter:c.length>0?g=>{for(let m of c)m(g);}:void 0});return u.load(o),o.tweens.length>0&&u.play(),it.set(e,u),u}resizeNode(e,t){let i=this._nodes.get(e);return i?(i.runtime=i.runtime||{},t.w!==void 0&&(i.runtime.width=t.w),t.h!==void 0&&(i.runtime.height=t.h),t.r!==void 0&&(i.runtime.radius=t.r),this):this}patchRuntime(e){let t=this.build(),i=e.querySelector("svg");if(!i){this._renderSceneToDOM(t,e);return}let n=Re.get(i);n||(n=Ie(i,{edgePathResolver:this._edgePathResolver}),Re.set(i,n)),pt(t,n);let a=i.querySelector('[data-viz-layer="overlays"]')||i.querySelector(".viz-layer-overlays");if(a){let d=t.overlays??[],c=new Map(t.nodes.map(b=>[b.id,b])),o=new Map(t.edges.map(b=>[b.id,b])),u="http://www.w3.org/2000/svg",g=Array.from(a.children).filter(b=>b.tagName==="g"),m=new Map;g.forEach(b=>{let z=b.getAttribute("data-overlay-id");z&&m.set(z,b);});let y=d.length===m.size,h=!y,f=[];if(!h)for(let b of d){let z=b.key||b.id;if(!m.has(z)){h=true;break}b[chunkAE7VTFYG_js.a]&&f.push(b);}if(!h&&f.length===0)return;let E=new Set;(h?d:f).forEach(b=>{let z=Ve.get(b.id);if(!z)return;let R=b.key||b.id;E.add(R);let w=m.get(R);w||(w=document.createElementNS(u,"g"),w.setAttribute("data-overlay-id",R),w.setAttribute("data-viz-role","overlay-group"),a.appendChild(w));let s=`viz-overlay-${b.id}${b.className?` ${b.className}`:""}`;w.getAttribute("class")!==s&&w.setAttribute("class",s);let A={spec:b,nodesById:c,edgesById:o,scene:t,registry:Ve};z.update?z.update(A,w):w.innerHTML=z.render(A),delete b[chunkAE7VTFYG_js.a];}),y||g.forEach(b=>{let z=b.getAttribute("data-overlay-id");z&&!E.has(z)&&b.remove();});}}_renderSceneToDOM(e,t){let{viewBox:i,nodes:n,edges:a,overlays:d}=e,c=new Map(n.map(l=>[l.id,l])),o="http://www.w3.org/2000/svg",u=t.querySelector("svg");if(!u){t.innerHTML="",u=document.createElementNS(o,"svg"),u.style.width="100%",u.style.height="100%",u.style.overflow="visible";let l=document.createElement("style");l.textContent=at,u.appendChild(l);let N=document.createElementNS(o,"defs"),k=new Set,q=new Map;a.forEach(x=>{let V=x.style?.stroke;if(x.markerEnd&&x.markerEnd!=="none"){let S=ze(x.markerEnd,V,"end");k.has(S)||(k.add(S),q.set(S,rt(x.markerEnd,V??"currentColor",S,"end")));}if(x.markerStart&&x.markerStart!=="none"){let S=ze(x.markerStart,V,"start");k.has(S)||(k.add(S),q.set(S,rt(x.markerStart,V??"currentColor",S,"start")));}}),k.forEach(x=>{let V=document.createElementNS(o,"marker");V.setAttribute("id",x),V.setAttribute("viewBox","0 0 10 10"),V.setAttribute("markerWidth","10"),V.setAttribute("markerHeight","10"),V.setAttribute("refX","9"),V.setAttribute("refY","5");let S=x.includes("-start");V.setAttribute("orient",S?"auto-start-reverse":"auto");let P=document.createElementNS(o,"svg");P.innerHTML=q.get(x)??"";let H=P.querySelector("marker");if(H)for(;H.firstChild;)V.appendChild(H.firstChild);N.appendChild(V);});let T=new Map;n.forEach(x=>{if(x.style?.shadow){let V=qe(x.style.shadow),S=Fe(V);T.has(S)||T.set(S,V);}}),T.forEach((x,V)=>{let S=document.createElementNS(o,"svg");S.innerHTML=At(V,x);let P=S.querySelector("filter");P&&N.appendChild(P);});let X=new Set,Y=e.sketch?.enabled;n.forEach(x=>{(x.style?.sketch||Y)&&X.add(Ke(x.style,x.id));}),a.forEach(x=>{if(x.style?.sketch||Y){let V=0;for(let S=0;S<x.id.length;S++)V=Math.imul(31,V)+x.id.charCodeAt(S)|0;X.add(Math.abs(V));}}),X.forEach(x=>{let V=Pe(x),S=document.createElementNS(o,"svg");S.innerHTML=kt(V,x);let P=S.querySelector("filter");P&&N.appendChild(P);}),u.appendChild(N);let K=document.createElementNS(o,"g");K.setAttribute("class","viz-viewport"),u.appendChild(K);let L=document.createElementNS(o,"g");L.setAttribute("class","viz-layer-edges"),L.setAttribute("data-viz-layer","edges"),K.appendChild(L);let de=document.createElementNS(o,"g");de.setAttribute("class","viz-layer-nodes"),de.setAttribute("data-viz-layer","nodes"),K.appendChild(de);let ee=document.createElementNS(o,"g");ee.setAttribute("class","viz-layer-overlays"),ee.setAttribute("data-viz-layer","overlays"),K.appendChild(ee),t.appendChild(u);}u.setAttribute("viewBox",`0 0 ${i.w} ${i.h}`);let g=u.querySelector('[data-viz-layer="edges"]')||u.querySelector(".viz-layer-edges"),m=u.querySelector('[data-viz-layer="nodes"]')||u.querySelector(".viz-layer-nodes"),y=u.querySelector('[data-viz-layer="overlays"]')||u.querySelector(".viz-layer-overlays");if(!g||!m||!y){this._renderSceneToDOM(e,t);return}let h=Array.from(g.children).filter(l=>l.tagName==="g"),f=new Map;h.forEach(l=>{let N=l.getAttribute("data-id");N&&f.set(N,l);});let E=new Set;a.forEach(l=>{let N=tt(l,c);if(!N)return;let{start:k,end:q}=N;E.add(l.id);let T=f.get(l.id);if(!T){T=document.createElementNS(o,"g"),T.setAttribute("data-id",l.id),T.setAttribute("data-viz-role","edge-group"),g.appendChild(T);let x=document.createElementNS(o,"path");x.setAttribute("class","viz-edge"),x.setAttribute("data-viz-role","edge-line"),T.appendChild(x);}let X=`viz-edge-group ${l.className||""}`,Y=l.style?.sketch||e.sketch?.enabled;Y&&(X+=" viz-sketch"),T.removeAttribute("style"),l.animations&&l.animations.forEach(x=>{if(x.when===false)return;let V=Te.getEdgeRenderer(x.id);if(V){if(V.getClass&&(X+=` ${V.getClass({spec:x,element:l})}`),V.getStyle){let S=V.getStyle({spec:x,element:l});Object.entries(S).forEach(([P,H])=>{T.style.setProperty(P,String(H));});}}else X+=` ${nt(x.id)}`,ot(x.params).forEach(([S,P])=>{T.style.setProperty(S,P);});}),T.setAttribute("class",X);let K;if(k&&q&&k===q)K=chunkTVRPABD2_js.g(k,l);else {let x=chunkTVRPABD2_js.e(k,q,l);K=chunkTVRPABD2_js.f(x.start,x.end,l.routing,l.waypoints);}if(this._edgePathResolver){let x=V=>{let S=tt(V,c);if(!S)return "";if(S.start&&S.end&&S.start===S.end)return chunkTVRPABD2_js.g(S.start,V).d;let P=chunkTVRPABD2_js.e(S.start,S.end,V);return chunkTVRPABD2_js.f(P.start,P.end,V.routing,V.waypoints).d};try{let V=this._edgePathResolver(l,e,x);typeof V=="string"&&V&&(K.d=V);}catch(V){console.warn(`VizBuilder: edge path resolver threw for edge ${l.id}`,V);}}l.runtime?.opacity!==void 0?T.style.opacity=String(l.runtime.opacity):T.style.removeProperty("opacity");let L=T.querySelector('[data-viz-role="edge-line"]')||T.querySelector(".viz-edge");if(!L)return;if(l.runtime?.strokeDashoffset!==void 0?(L.style.strokeDashoffset=String(l.runtime.strokeDashoffset),L.setAttribute("stroke-dashoffset",String(l.runtime.strokeDashoffset))):(L.style.removeProperty("stroke-dashoffset"),L.removeAttribute("stroke-dashoffset")),L.setAttribute("d",K.d),l.markerEnd&&l.markerEnd!=="none"){let x=ze(l.markerEnd,l.style?.stroke,"end");L.setAttribute("marker-end",`url(#${x})`);}else L.removeAttribute("marker-end");if(l.markerStart&&l.markerStart!=="none"){let x=ze(l.markerStart,l.style?.stroke,"start");L.setAttribute("marker-start",`url(#${x})`);}else L.removeAttribute("marker-start");if(l.style?.stroke!==void 0?L.style.stroke=l.style.stroke:L.style.removeProperty("stroke"),l.style?.strokeWidth!==void 0?L.style.strokeWidth=String(l.style.strokeWidth):L.style.removeProperty("stroke-width"),l.style?.fill!==void 0?L.style.fill=l.style.fill:L.style.removeProperty("fill"),l.style?.opacity!==void 0?L.style.opacity=String(l.style.opacity):L.style.removeProperty("opacity"),l.style?.strokeDasharray!==void 0?L.style.strokeDasharray=$e(l.style.strokeDasharray):L.style.removeProperty("stroke-dasharray"),Y){let x=0;for(let S=0;S<l.id.length;S++)x=Math.imul(31,x)+l.id.charCodeAt(S)|0;let V=Math.abs(x);L.setAttribute("filter",`url(#${Pe(V)})`);}else L.removeAttribute("filter");let de=T.querySelector('[data-viz-role="edge-hit"]')||T.querySelector(".viz-edge-hit");if(de&&de.remove(),l.hitArea||l.onClick){let x=document.createElementNS(o,"path");x.setAttribute("class","viz-edge-hit"),x.setAttribute("data-viz-role","edge-hit"),x.setAttribute("d",K.d),x.setAttribute("stroke","transparent"),x.setAttribute("stroke-width",String(l.hitArea||10)),x.style.cursor=l.onClick?"pointer":"",l.onClick&&x.addEventListener("click",V=>{V.stopPropagation(),l.onClick(l.id,l);}),T.appendChild(x);}T.querySelectorAll('[data-viz-role="edge-label"],.viz-edge-label').forEach(x=>x.remove()),De(l).forEach((x,V)=>{let S=Ge(x,K),P=`viz-edge-label ${x.className||""}`,H=ye(S.x,S.y,x.rich??x.text,{className:P,fill:x.fill,fontSize:x.fontSize,fontWeight:x.fontWeight,fontFamily:x.fontFamily,textAnchor:"middle",dominantBaseline:"middle",maxWidth:x.maxWidth,lineHeight:x.lineHeight,verticalAlign:x.verticalAlign,overflow:x.overflow}).replace("<text ",`<text data-viz-role="edge-label" data-label-index="${V}" data-label-position="${x.position}" `);T.insertAdjacentHTML("beforeend",H);});}),h.forEach(l=>{let N=l.getAttribute("data-id");N&&!E.has(N)&&l.remove();});let B=new Map,b=[];n.forEach(l=>{if(l.parentId){let N=B.get(l.parentId);N||(N=[],B.set(l.parentId,N)),N.push(l);}else b.push(l);}),b.sort((l,N)=>(l.zIndex||0)-(N.zIndex||0)),B.forEach(l=>l.sort((N,k)=>(N.zIndex||0)-(k.zIndex||0)));let z=Array.from(m.querySelectorAll('g[data-viz-role="node-group"]')),R=new Map;z.forEach(l=>{let N=l.getAttribute("data-id");N&&R.set(N,l);});let w=new Set,s=(l,N)=>{w.add(l.id);let k=R.get(l.id);k||(k=document.createElementNS(o,"g"),k.setAttribute("data-id",l.id),k.setAttribute("data-viz-role","node-group")),N.appendChild(k);let q=!!l.container,T=`viz-node-group${q?" viz-container":""} ${l.className||""}`,X=l.style?.sketch||e.sketch?.enabled;X&&(T+=" viz-sketch"),k.removeAttribute("style"),l.animations&&l.animations.forEach(p=>{if(p.when===false)return;let C=Te.getNodeRenderer(p.id);if(C){if(C.getClass&&(T+=` ${C.getClass({spec:p,element:l})}`),C.getStyle){let W=C.getStyle({spec:p,element:l});Object.entries(W).forEach(([D,pe])=>{k.style.setProperty(D,String(pe));});}}else T+=` ${nt(p.id)}`,ot(p.params).forEach(([W,D])=>{k.style.setProperty(W,D);});}),k.setAttribute("class",T),k._clickHandler=l.onClick?p=>{p.stopPropagation(),l.onClick(l.id,l);}:null,k.hasAttribute("data-click-initialized")||(k.addEventListener("click",p=>{k._clickHandler&&k._clickHandler(p);}),k.setAttribute("data-click-initialized","true")),k.style.cursor=l.onClick?"pointer":"";let{x:Y,y:K}=chunkOZAFCKI7_js.d(l),L=k.querySelector('[data-viz-role="node-shape"]')||k.querySelector(".viz-node-shape"),ee=chunkOZAFCKI7_js.f(l.shape).tagName;(!L||L.tagName!==ee)&&(L&&L.remove(),L=document.createElementNS(o,ee),L.setAttribute("class","viz-node-shape"),L.setAttribute("data-viz-role","node-shape"),k.prepend(L)),chunkOZAFCKI7_js.g(L,l.shape,{x:Y,y:K});let x=$e(l.style?.strokeDasharray),V=l.style?.shadow?`url(#${Fe(qe(l.style.shadow))})`:void 0;if(Ur(L,{fill:l.style?.fill??"none",stroke:l.style?.stroke??"#111","stroke-width":l.style?.strokeWidth??2,opacity:l.runtime?.opacity??l.style?.opacity,"stroke-dasharray":x||void 0,filter:V}),X){let p=Ke(l.style,l.id);k.setAttribute("filter",`url(#${Pe(p)})`);}else k.removeAttribute("filter");let S=k.querySelector(':scope > [data-viz-role="node-image"], :scope > .viz-node-image');S&&S.remove();let P=k.querySelector(':scope > [data-viz-role="node-icon"], :scope > .viz-node-icon');P&&P.remove();let H=k.querySelector(':scope > [data-viz-role="node-svg"], :scope > .viz-node-svg');H&&H.remove();let $=L,I=p=>{k.insertBefore(p,$.nextSibling),$=p;};if(l.image){let p=Le(l,l.image.width,l.image.height,{position:l.image.position,dx:l.image.dx,dy:l.image.dy}),C=document.createElementNS(o,"image");C.setAttribute("class","viz-node-image"),C.setAttribute("data-viz-role","node-image"),C.setAttribute("x",String(p.x)),C.setAttribute("y",String(p.y)),C.setAttribute("width",String(l.image.width)),C.setAttribute("height",String(l.image.height)),C.setAttribute("href",l.image.href),l.image.preserveAspectRatio&&C.setAttribute("preserveAspectRatio",l.image.preserveAspectRatio),I(C);}if(l.icon){let p=chunkOZAFCKI7_js.b.get(l.icon.id);if(!p)console.warn(`VizCraft: icon '${l.icon.id}' not found. Use registerIcon().`);else {let C=Le(l,l.icon.size,l.icon.size,{position:l.icon.position,dx:l.icon.dx,dy:l.icon.dy}),W=document.createElementNS(o,"g");W.setAttribute("class","viz-node-icon"),W.setAttribute("data-viz-role","node-icon"),W.setAttribute("transform",`translate(${C.x} ${C.y})`),l.icon.color&&W.setAttribute("style",`color:${l.icon.color}`),W.innerHTML=Et(p,l.icon.size,l.icon.size),I(W);}}if(l.svgContent){let p=Le(l,l.svgContent.width,l.svgContent.height,{position:l.svgContent.position,dx:l.svgContent.dx,dy:l.svgContent.dy}),C=document.createElementNS(o,"g");C.setAttribute("class","viz-node-svg"),C.setAttribute("data-viz-role","node-svg"),C.setAttribute("transform",`translate(${p.x} ${p.y})`),C.innerHTML=Xt(l.svgContent.content,l.svgContent.width,l.svgContent.height),I(C);}if(q&&l.container.headerHeight&&"w"in l.shape&&"h"in l.shape){let p=l.shape.w,C=l.shape.h,W=K-C/2+l.container.headerHeight,D=k.querySelector('[data-viz-role="container-header"]');D||(D=document.createElementNS(o,"line"),D.setAttribute("class","viz-container-header"),D.setAttribute("data-viz-role","container-header"),k.appendChild(D)),D.setAttribute("x1",String(Y-p/2)),D.setAttribute("y1",String(W)),D.setAttribute("x2",String(Y+p/2)),D.setAttribute("y2",String(W)),D.setAttribute("stroke",l.style?.stroke??"#111"),D.setAttribute("stroke-width",String(l.style?.strokeWidth??2));}else {let p=k.querySelector('[data-viz-role="container-header"]');p&&p.remove();}let F=l.compartments&&l.compartments.length>0,j=!!(l.collapsed&&F);if(k.querySelectorAll('[data-viz-role="compartment-divider"],[data-viz-role="compartment-label"],[data-viz-role="compartment-entry"],[data-viz-role="collapse-indicator"],[data-viz-role="collapse-indicator-group"]').forEach(p=>p.remove()),k.classList.toggle("viz-node-collapsed",j),F&&"w"in l.shape){let p=l.shape.w,C=l.shape.h,W=K-C/2,D=8,pe=j?1:l.compartments.length;for(let Z=0;Z<pe;Z++){let O=l.compartments[Z];if(Z>0){let M=W+O.y,U=document.createElementNS(o,"line");U.setAttribute("class","viz-compartment-divider"),U.setAttribute("data-viz-role","compartment-divider"),U.setAttribute("data-compartment",O.id),U.setAttribute("x1",String(Y-p/2)),U.setAttribute("y1",String(M)),U.setAttribute("x2",String(Y+p/2)),U.setAttribute("y2",String(M)),U.setAttribute("stroke",l.style?.stroke??"#111"),U.setAttribute("stroke-width",String(l.style?.strokeWidth??2)),k.appendChild(U);}if(O.entries&&O.entries.length>0)for(let M of O.entries){let U=Y-p/2+D+(M.label?.dx||0),Se=M.paddingTop??0,Ae=M.paddingBottom??0,ce=M.height-Se-Ae,ke=W+O.y+M.y+Se+ce/2+(M.label?.dy||0),le=`viz-compartment-entry ${M.className||""} ${M.label?.className||""}`.trim(),ue=ye(U,ke,M.label?.rich??M.text,{className:le,fill:M.label?.fill,fontSize:M.label?.fontSize,fontWeight:M.label?.fontWeight,fontFamily:M.label?.fontFamily,textAnchor:M.label?.textAnchor||"start",dominantBaseline:M.label?.dominantBaseline||"middle",maxWidth:M.label?.maxWidth??p-D*2,lineHeight:M.label?.lineHeight,verticalAlign:M.label?.verticalAlign,overflow:M.label?.overflow}).replace("<text ",`<text data-viz-role="compartment-entry" data-compartment="${O.id}" data-entry="${M.id}" `);k.insertAdjacentHTML("beforeend",ue);}else if(O.label){let M=Y-p/2+D+(O.label.dx||0),U=W+O.y+O.height/2+(O.label.dy||0),Se=`viz-compartment-label ${O.label.className||""}`,Ae=ye(M,U,O.label.rich??O.label.text,{className:Se,fill:O.label.fill,fontSize:O.label.fontSize,fontWeight:O.label.fontWeight,fontFamily:O.label.fontFamily,textAnchor:O.label.textAnchor||"start",dominantBaseline:O.label.dominantBaseline||"middle",maxWidth:O.label.maxWidth??p-D*2,lineHeight:O.label.lineHeight,verticalAlign:O.label.verticalAlign,overflow:O.label.overflow}).replace("<text ",`<text data-viz-role="compartment-label" data-compartment="${O.id}" `);k.insertAdjacentHTML("beforeend",Ae);}}let Be=j?[l.compartments[0]]:l.compartments;for(let Z of Be)if(Z.entries)for(let O of Z.entries){if(!O.onClick)continue;let M=k.querySelector(`[data-viz-role="compartment-entry"][data-compartment="${Z.id}"][data-entry="${O.id}"]`);M&&(M.addEventListener("click",U=>{U.stopPropagation(),O.onClick();}),M.style.cursor="pointer");}let re=l.compartments[0],te=l.collapseIndicator,ve=te===false||typeof te=="object"&&te.visible===false;if((j||!!re.onClick)&&!ve&&l.compartments.length>1){let O=Y+p/2-D-6,M=l.compartments[0].height,U=W+M/2,Se=(typeof te=="object"?te.color:void 0)??l.style?.stroke??"#111",Ae=typeof te=="object"?te.render:void 0,ce;if(Ae){let ae=Ae(j),Ee=document.createElementNS(o,"g");Ee.innerHTML=ae,ce=Ee.firstElementChild??Ee,ce===Ee&&Ee.childNodes.length>0&&(ce=Ee),ce.setAttribute("data-viz-role","collapse-indicator");}else {let ae=document.createElementNS(o,"polygon");ae.setAttribute("data-viz-role","collapse-indicator"),j?ae.setAttribute("points",`${O},${U-6} ${O+6},${U} ${O},${U+6}`):ae.setAttribute("points",`${O},${U-6/2} ${O+12},${U-6/2} ${O+6},${U+6/2}`),ae.setAttribute("fill",Se),ae.setAttribute("class","viz-collapse-indicator"),ce=ae;}let ke=10,le=document.createElementNS(o,"rect");le.setAttribute("x",String(O-ke)),le.setAttribute("y",String(U-6-ke)),le.setAttribute("width",String(12+ke*2)),le.setAttribute("height",String(12+ke*2)),le.setAttribute("fill","transparent"),le.style.cursor="pointer";let ue=document.createElementNS(o,"g");if(ue.setAttribute("data-viz-role","collapse-indicator-group"),ue.style.cursor="pointer",ue.appendChild(le),ue.appendChild(ce),re.onClick){let ae=l.id,Ee=re.id,wt=this;ue.addEventListener("click",Qt=>{Qt.stopPropagation();let Bt=wt._nodes.get(ae);re.onClick({nodeId:ae,compartmentId:Ee,collapsed:!!Bt?.collapsed,collapseAnchor:Bt?.collapseAnchor??"center",toggle:Ct=>wt._performCollapseToggle(ae,Ct?.animate,Ct?.anchor)});});}k.appendChild(ue);}let xe=this;for(let Z of Be){if(!Z.onClick)continue;let O=k.querySelectorAll(`[data-viz-role="compartment-label"][data-compartment="${Z.id}"]`),M=l.id,U=Z.id,Se=Z.onClick,Ae=ce=>{ce.addEventListener("click",ke=>{ke.stopPropagation();let le=xe._nodes.get(M);Se({nodeId:M,compartmentId:U,collapsed:!!le?.collapsed,collapseAnchor:le?.collapseAnchor??"center",toggle:ue=>xe._performCollapseToggle(M,ue?.animate,ue?.anchor)});}),ce.style.cursor="pointer";};O.forEach(Ae);}}let se=Y+(l.label?.dx||0),he=K+(l.label?.dy||0),J=!!l.label&&!F;if(l.label&&q&&l.container.headerHeight&&"h"in l.shape&&!l.label.dy){let p=l.shape.h;he=K-p/2+l.container.headerHeight/2,se=Y+(l.label.dx||0);}let ie=k.querySelector('[data-viz-role="node-label"]')||k.querySelector(".viz-node-label");if(ie&&(ie.remove(),ie=null),l.label&&J){let p=`viz-node-label ${l.label.className||""}`,C=ye(se,he,l.label.rich??l.label.text,{className:p,fill:l.label.fill,fontSize:l.label.fontSize,fontWeight:l.label.fontWeight,fontFamily:l.label.fontFamily,textAnchor:l.label.textAnchor||"middle",dominantBaseline:l.label.dominantBaseline||"middle",maxWidth:l.label.maxWidth,lineHeight:l.label.lineHeight,verticalAlign:l.label.verticalAlign,overflow:l.label.overflow}).replace("<text ",'<text data-viz-role="node-label" ');k.insertAdjacentHTML("beforeend",C),ie=k.querySelector('[data-viz-role="node-label"]');}if(k.querySelectorAll('[data-viz-role="badge"]').forEach(p=>p.remove()),l.badges&&l.badges.length>0){let p=chunkOZAFCKI7_js.o(l.shape),C=p.width/2,W=p.height/2;for(let D of l.badges){let pe=D.fontSize??10,Be=3,re=pe+Be*2,te=Math.max(pe*D.text.length*.7+Be*2,re),ve,Ce;D.position==="top-left"?(ve=Y-C-te/4,Ce=K-W-re/4):D.position==="top-right"?(ve=Y+C-te*3/4,Ce=K-W-re/4):D.position==="bottom-left"?(ve=Y-C-te/4,Ce=K+W-re*3/4):(ve=Y+C-te*3/4,Ce=K+W-re*3/4);let xe=document.createElementNS(o,"g");if(xe.setAttribute("class","viz-badge"),xe.setAttribute("data-viz-role","badge"),D.background){let O=document.createElementNS(o,"rect");O.setAttribute("x",String(ve)),O.setAttribute("y",String(Ce)),O.setAttribute("width",String(te)),O.setAttribute("height",String(re)),O.setAttribute("rx",String(re/2)),O.setAttribute("fill",D.background),xe.appendChild(O);}let Z=document.createElementNS(o,"text");Z.setAttribute("x",String(ve+te/2)),Z.setAttribute("y",String(Ce+re/2)),Z.setAttribute("text-anchor","middle"),Z.setAttribute("dominant-baseline","central"),Z.setAttribute("font-size",String(pe)),D.fill&&Z.setAttribute("fill",D.fill),Z.textContent=D.text,xe.appendChild(Z),k.appendChild(xe);}}k.querySelectorAll('[data-viz-role="port"]').forEach(p=>p.remove()),l.ports&&l.ports.length>0&&l.ports.forEach(p=>{let C=document.createElementNS(o,"circle");C.setAttribute("cx",String(Y+p.offset.x)),C.setAttribute("cy",String(K+p.offset.y)),C.setAttribute("r","4"),C.setAttribute("class","viz-port"),C.setAttribute("data-viz-role","port"),C.setAttribute("data-node",l.id),C.setAttribute("data-port",p.id),k.appendChild(C);});let G=B.get(l.id);if(G&&G.length>0){let p=k.querySelector(':scope > [data-viz-role="container-children"]');p||(p=document.createElementNS(o,"g"),p.setAttribute("class","viz-container-children"),p.setAttribute("data-viz-role","container-children"),k.appendChild(p)),G.forEach(C=>s(C,p));}else {let p=k.querySelector(':scope > [data-viz-role="container-children"]');p&&p.remove();}};b.forEach(l=>s(l,m)),z.forEach(l=>{let N=l.getAttribute("data-id");N&&!w.has(N)&&l.remove();});let v=Array.from(y.children).filter(l=>l.tagName==="g"),A=new Map;v.forEach(l=>{let N=l.getAttribute("data-overlay-id");N&&A.set(N,l);});let _=new Set;d&&d.length>0&&d.forEach(l=>{let N=Ve.get(l.id);if(N){let k=l.key||l.id;_.add(k);let q=A.get(k);q||(q=document.createElementNS(o,"g"),q.setAttribute("data-overlay-id",k),q.setAttribute("data-viz-role","overlay-group"),y.appendChild(q)),q.setAttribute("class",`viz-overlay-${l.id}${l.className?` ${l.className}`:""}`);let T={spec:l,nodesById:c,edgesById:new Map(a.map(X=>[X.id,X])),scene:e,registry:Ve};N.update?N.update(T,q):q.innerHTML=N.render(T);}}),v.forEach(l=>{let N=l.getAttribute("data-overlay-id");N&&!_.has(N)&&l.remove();}),Re.set(u,Ie(u,{edgePathResolver:this._edgePathResolver}));}_renderSceneToSvg(e,t){let i=t?.includeRuntime===true,{viewBox:n,nodes:a,edges:d,overlays:c}=e,o=new Map;if(i)for(let s of a){if(!s.container)continue;let v=(s.runtime?.x??s.pos.x)-s.pos.x,A=(s.runtime?.y??s.pos.y)-s.pos.y;(v!==0||A!==0)&&o.set(s.id,{dx:v,dy:A});}let u=a.map(s=>{if(!i)return {...s,runtime:void 0};let v=s.runtime?{...s.runtime}:{},A=v.x??s.pos.x,_=v.y??s.pos.y;if(s.parentId){let k=o.get(s.parentId);k&&(A+=k.dx,_+=k.dy);}(v.x!==void 0||v.y!==void 0||A!==s.pos.x||_!==s.pos.y)&&(v.x=A,v.y=_);let N=Object.keys(v).length>0?v:void 0;return {...s,runtime:N}}),g=d.map(s=>i?s:{...s,runtime:void 0}),m={...e,nodes:u,edges:g},y=new Map(u.map(s=>[s.id,s])),h=new Map(g.map(s=>[s.id,s])),f=`<svg viewBox="0 0 ${n.w} ${n.h}" xmlns="http://www.w3.org/2000/svg">`;f+=`<style>${at}</style>`,f+=`
116
+ ${i}`.trim();return}let d=document.createElement("style");d.setAttribute(n,"true"),d.setAttribute("type","text/css"),d.textContent=i;let c=e.querySelector("style");c&&c.parentNode===e?e.insertBefore(d,c.nextSibling):e.prepend(d);}play(e,t){if(!e){let i=this._mountedContainer;return !i||!i.querySelector("svg")?(console.warn("VizBuilder: Call mount(container) before play()."),null):this._playImpl(i,void 0,false)}return this._playImpl(e,t,true)}_playImpl(e,t,i){if(!e.querySelector("svg")){if(!i)return null;this.mount(e);}let a=this.build(),d=Array.isArray(t)?t:t?[t]:a.animationSpecs??[];if(!t&&d.length===0)return null;let c=[];for(let g of d)c.push(...chunkC27QMQJJ_js.b(g));it.get(e)?.stop();let o={version:"viz-anim/1",tweens:d.flatMap(g=>g.tweens)},u=chunkC27QMQJJ_js.f({builder:this,container:e,extendAdapter:c.length>0?g=>{for(let m of c)m(g);}:void 0});return u.load(o),o.tweens.length>0&&u.play(),it.set(e,u),u}resizeNode(e,t){let i=this._nodes.get(e);return i?(i.runtime=i.runtime||{},t.w!==void 0&&(i.runtime.width=t.w),t.h!==void 0&&(i.runtime.height=t.h),t.r!==void 0&&(i.runtime.radius=t.r),this):this}patchRuntime(e){let t=this.build(),i=e.querySelector("svg");if(!i){this._renderSceneToDOM(t,e);return}let n=Re.get(i);n||(n=Ie(i,{edgePathResolver:this._edgePathResolver}),Re.set(i,n)),pt(t,n);let a=i.querySelector('[data-viz-layer="overlays"]')||i.querySelector(".viz-layer-overlays");if(a){let d=t.overlays??[],c=new Map(t.nodes.map(b=>[b.id,b])),o=new Map(t.edges.map(b=>[b.id,b])),u="http://www.w3.org/2000/svg",g=Array.from(a.children).filter(b=>b.tagName==="g"),m=new Map;g.forEach(b=>{let z=b.getAttribute("data-overlay-id");z&&m.set(z,b);});let y=d.length===m.size,h=!y,f=[];if(!h)for(let b of d){let z=b.key||b.id;if(!m.has(z)){h=true;break}b[chunkC27QMQJJ_js.a]&&f.push(b);}if(!h&&f.length===0)return;let E=new Set;(h?d:f).forEach(b=>{let z=Ve.get(b.id);if(!z)return;let R=b.key||b.id;E.add(R);let w=m.get(R);w||(w=document.createElementNS(u,"g"),w.setAttribute("data-overlay-id",R),w.setAttribute("data-viz-role","overlay-group"),a.appendChild(w));let s=`viz-overlay-${b.id}${b.className?` ${b.className}`:""}`;w.getAttribute("class")!==s&&w.setAttribute("class",s);let A={spec:b,nodesById:c,edgesById:o,scene:t,registry:Ve};z.update?z.update(A,w):w.innerHTML=z.render(A),delete b[chunkC27QMQJJ_js.a];}),y||g.forEach(b=>{let z=b.getAttribute("data-overlay-id");z&&!E.has(z)&&b.remove();});}}_renderSceneToDOM(e,t){let{viewBox:i,nodes:n,edges:a,overlays:d}=e,c=new Map(n.map(l=>[l.id,l])),o="http://www.w3.org/2000/svg",u=t.querySelector("svg");if(!u){t.innerHTML="",u=document.createElementNS(o,"svg"),u.style.width="100%",u.style.height="100%",u.style.overflow="visible";let l=document.createElement("style");l.textContent=at,u.appendChild(l);let N=document.createElementNS(o,"defs"),k=new Set,q=new Map;a.forEach(x=>{let V=x.style?.stroke;if(x.markerEnd&&x.markerEnd!=="none"){let S=ze(x.markerEnd,V,"end");k.has(S)||(k.add(S),q.set(S,rt(x.markerEnd,V??"currentColor",S,"end")));}if(x.markerStart&&x.markerStart!=="none"){let S=ze(x.markerStart,V,"start");k.has(S)||(k.add(S),q.set(S,rt(x.markerStart,V??"currentColor",S,"start")));}}),k.forEach(x=>{let V=document.createElementNS(o,"marker");V.setAttribute("id",x),V.setAttribute("viewBox","0 0 10 10"),V.setAttribute("markerWidth","10"),V.setAttribute("markerHeight","10"),V.setAttribute("refX","9"),V.setAttribute("refY","5");let S=x.includes("-start");V.setAttribute("orient",S?"auto-start-reverse":"auto");let P=document.createElementNS(o,"svg");P.innerHTML=q.get(x)??"";let H=P.querySelector("marker");if(H)for(;H.firstChild;)V.appendChild(H.firstChild);N.appendChild(V);});let T=new Map;n.forEach(x=>{if(x.style?.shadow){let V=qe(x.style.shadow),S=Fe(V);T.has(S)||T.set(S,V);}}),T.forEach((x,V)=>{let S=document.createElementNS(o,"svg");S.innerHTML=At(V,x);let P=S.querySelector("filter");P&&N.appendChild(P);});let X=new Set,Y=e.sketch?.enabled;n.forEach(x=>{(x.style?.sketch||Y)&&X.add(Ke(x.style,x.id));}),a.forEach(x=>{if(x.style?.sketch||Y){let V=0;for(let S=0;S<x.id.length;S++)V=Math.imul(31,V)+x.id.charCodeAt(S)|0;X.add(Math.abs(V));}}),X.forEach(x=>{let V=Pe(x),S=document.createElementNS(o,"svg");S.innerHTML=kt(V,x);let P=S.querySelector("filter");P&&N.appendChild(P);}),u.appendChild(N);let K=document.createElementNS(o,"g");K.setAttribute("class","viz-viewport"),u.appendChild(K);let L=document.createElementNS(o,"g");L.setAttribute("class","viz-layer-edges"),L.setAttribute("data-viz-layer","edges"),K.appendChild(L);let de=document.createElementNS(o,"g");de.setAttribute("class","viz-layer-nodes"),de.setAttribute("data-viz-layer","nodes"),K.appendChild(de);let ee=document.createElementNS(o,"g");ee.setAttribute("class","viz-layer-overlays"),ee.setAttribute("data-viz-layer","overlays"),K.appendChild(ee),t.appendChild(u);}u.setAttribute("viewBox",`0 0 ${i.w} ${i.h}`);let g=u.querySelector('[data-viz-layer="edges"]')||u.querySelector(".viz-layer-edges"),m=u.querySelector('[data-viz-layer="nodes"]')||u.querySelector(".viz-layer-nodes"),y=u.querySelector('[data-viz-layer="overlays"]')||u.querySelector(".viz-layer-overlays");if(!g||!m||!y){this._renderSceneToDOM(e,t);return}let h=Array.from(g.children).filter(l=>l.tagName==="g"),f=new Map;h.forEach(l=>{let N=l.getAttribute("data-id");N&&f.set(N,l);});let E=new Set;a.forEach(l=>{let N=tt(l,c);if(!N)return;let{start:k,end:q}=N;E.add(l.id);let T=f.get(l.id);if(!T){T=document.createElementNS(o,"g"),T.setAttribute("data-id",l.id),T.setAttribute("data-viz-role","edge-group"),g.appendChild(T);let x=document.createElementNS(o,"path");x.setAttribute("class","viz-edge"),x.setAttribute("data-viz-role","edge-line"),T.appendChild(x);}let X=`viz-edge-group ${l.className||""}`,Y=l.style?.sketch||e.sketch?.enabled;Y&&(X+=" viz-sketch"),T.removeAttribute("style"),l.animations&&l.animations.forEach(x=>{if(x.when===false)return;let V=Te.getEdgeRenderer(x.id);if(V){if(V.getClass&&(X+=` ${V.getClass({spec:x,element:l})}`),V.getStyle){let S=V.getStyle({spec:x,element:l});Object.entries(S).forEach(([P,H])=>{T.style.setProperty(P,String(H));});}}else X+=` ${nt(x.id)}`,ot(x.params).forEach(([S,P])=>{T.style.setProperty(S,P);});}),T.setAttribute("class",X);let K;if(k&&q&&k===q)K=chunkM3ZDZ24B_js.g(k,l);else {let x=chunkM3ZDZ24B_js.e(k,q,l);K=chunkM3ZDZ24B_js.f(x.start,x.end,l.routing,l.waypoints);}if(this._edgePathResolver){let x=V=>{let S=tt(V,c);if(!S)return "";if(S.start&&S.end&&S.start===S.end)return chunkM3ZDZ24B_js.g(S.start,V).d;let P=chunkM3ZDZ24B_js.e(S.start,S.end,V);return chunkM3ZDZ24B_js.f(P.start,P.end,V.routing,V.waypoints).d};try{let V=this._edgePathResolver(l,e,x);typeof V=="string"&&V&&(K.d=V);}catch(V){console.warn(`VizBuilder: edge path resolver threw for edge ${l.id}`,V);}}l.runtime?.opacity!==void 0?T.style.opacity=String(l.runtime.opacity):T.style.removeProperty("opacity");let L=T.querySelector('[data-viz-role="edge-line"]')||T.querySelector(".viz-edge");if(!L)return;if(l.runtime?.strokeDashoffset!==void 0?(L.style.strokeDashoffset=String(l.runtime.strokeDashoffset),L.setAttribute("stroke-dashoffset",String(l.runtime.strokeDashoffset))):(L.style.removeProperty("stroke-dashoffset"),L.removeAttribute("stroke-dashoffset")),L.setAttribute("d",K.d),l.markerEnd&&l.markerEnd!=="none"){let x=ze(l.markerEnd,l.style?.stroke,"end");L.setAttribute("marker-end",`url(#${x})`);}else L.removeAttribute("marker-end");if(l.markerStart&&l.markerStart!=="none"){let x=ze(l.markerStart,l.style?.stroke,"start");L.setAttribute("marker-start",`url(#${x})`);}else L.removeAttribute("marker-start");if(l.style?.stroke!==void 0?L.style.stroke=l.style.stroke:L.style.removeProperty("stroke"),l.style?.strokeWidth!==void 0?L.style.strokeWidth=String(l.style.strokeWidth):L.style.removeProperty("stroke-width"),l.style?.fill!==void 0?L.style.fill=l.style.fill:L.style.removeProperty("fill"),l.style?.opacity!==void 0?L.style.opacity=String(l.style.opacity):L.style.removeProperty("opacity"),l.style?.strokeDasharray!==void 0?L.style.strokeDasharray=$e(l.style.strokeDasharray):L.style.removeProperty("stroke-dasharray"),Y){let x=0;for(let S=0;S<l.id.length;S++)x=Math.imul(31,x)+l.id.charCodeAt(S)|0;let V=Math.abs(x);L.setAttribute("filter",`url(#${Pe(V)})`);}else L.removeAttribute("filter");let de=T.querySelector('[data-viz-role="edge-hit"]')||T.querySelector(".viz-edge-hit");if(de&&de.remove(),l.hitArea||l.onClick){let x=document.createElementNS(o,"path");x.setAttribute("class","viz-edge-hit"),x.setAttribute("data-viz-role","edge-hit"),x.setAttribute("d",K.d),x.setAttribute("stroke","transparent"),x.setAttribute("stroke-width",String(l.hitArea||10)),x.style.cursor=l.onClick?"pointer":"",l.onClick&&x.addEventListener("click",V=>{V.stopPropagation(),l.onClick(l.id,l);}),T.appendChild(x);}T.querySelectorAll('[data-viz-role="edge-label"],.viz-edge-label').forEach(x=>x.remove()),De(l).forEach((x,V)=>{let S=Ge(x,K),P=`viz-edge-label ${x.className||""}`,H=ye(S.x,S.y,x.rich??x.text,{className:P,fill:x.fill,fontSize:x.fontSize,fontWeight:x.fontWeight,fontFamily:x.fontFamily,textAnchor:"middle",dominantBaseline:"middle",maxWidth:x.maxWidth,lineHeight:x.lineHeight,verticalAlign:x.verticalAlign,overflow:x.overflow}).replace("<text ",`<text data-viz-role="edge-label" data-label-index="${V}" data-label-position="${x.position}" `);T.insertAdjacentHTML("beforeend",H);});}),h.forEach(l=>{let N=l.getAttribute("data-id");N&&!E.has(N)&&l.remove();});let B=new Map,b=[];n.forEach(l=>{if(l.parentId){let N=B.get(l.parentId);N||(N=[],B.set(l.parentId,N)),N.push(l);}else b.push(l);}),b.sort((l,N)=>(l.zIndex||0)-(N.zIndex||0)),B.forEach(l=>l.sort((N,k)=>(N.zIndex||0)-(k.zIndex||0)));let z=Array.from(m.querySelectorAll('g[data-viz-role="node-group"]')),R=new Map;z.forEach(l=>{let N=l.getAttribute("data-id");N&&R.set(N,l);});let w=new Set,s=(l,N)=>{w.add(l.id);let k=R.get(l.id);k||(k=document.createElementNS(o,"g"),k.setAttribute("data-id",l.id),k.setAttribute("data-viz-role","node-group")),N.appendChild(k);let q=!!l.container,T=`viz-node-group${q?" viz-container":""} ${l.className||""}`,X=l.style?.sketch||e.sketch?.enabled;X&&(T+=" viz-sketch"),k.removeAttribute("style"),l.animations&&l.animations.forEach(p=>{if(p.when===false)return;let C=Te.getNodeRenderer(p.id);if(C){if(C.getClass&&(T+=` ${C.getClass({spec:p,element:l})}`),C.getStyle){let W=C.getStyle({spec:p,element:l});Object.entries(W).forEach(([D,pe])=>{k.style.setProperty(D,String(pe));});}}else T+=` ${nt(p.id)}`,ot(p.params).forEach(([W,D])=>{k.style.setProperty(W,D);});}),k.setAttribute("class",T),k._clickHandler=l.onClick?p=>{p.stopPropagation(),l.onClick(l.id,l);}:null,k.hasAttribute("data-click-initialized")||(k.addEventListener("click",p=>{k._clickHandler&&k._clickHandler(p);}),k.setAttribute("data-click-initialized","true")),k.style.cursor=l.onClick?"pointer":"";let{x:Y,y:K}=chunkOZAFCKI7_js.d(l),L=k.querySelector('[data-viz-role="node-shape"]')||k.querySelector(".viz-node-shape"),ee=chunkOZAFCKI7_js.f(l.shape).tagName;(!L||L.tagName!==ee)&&(L&&L.remove(),L=document.createElementNS(o,ee),L.setAttribute("class","viz-node-shape"),L.setAttribute("data-viz-role","node-shape"),k.prepend(L)),chunkOZAFCKI7_js.g(L,l.shape,{x:Y,y:K});let x=$e(l.style?.strokeDasharray),V=l.style?.shadow?`url(#${Fe(qe(l.style.shadow))})`:void 0;if(Ur(L,{fill:l.style?.fill??"none",stroke:l.style?.stroke??"#111","stroke-width":l.style?.strokeWidth??2,opacity:l.runtime?.opacity??l.style?.opacity,"stroke-dasharray":x||void 0,filter:V}),X){let p=Ke(l.style,l.id);k.setAttribute("filter",`url(#${Pe(p)})`);}else k.removeAttribute("filter");let S=k.querySelector(':scope > [data-viz-role="node-image"], :scope > .viz-node-image');S&&S.remove();let P=k.querySelector(':scope > [data-viz-role="node-icon"], :scope > .viz-node-icon');P&&P.remove();let H=k.querySelector(':scope > [data-viz-role="node-svg"], :scope > .viz-node-svg');H&&H.remove();let $=L,I=p=>{k.insertBefore(p,$.nextSibling),$=p;};if(l.image){let p=Le(l,l.image.width,l.image.height,{position:l.image.position,dx:l.image.dx,dy:l.image.dy}),C=document.createElementNS(o,"image");C.setAttribute("class","viz-node-image"),C.setAttribute("data-viz-role","node-image"),C.setAttribute("x",String(p.x)),C.setAttribute("y",String(p.y)),C.setAttribute("width",String(l.image.width)),C.setAttribute("height",String(l.image.height)),C.setAttribute("href",l.image.href),l.image.preserveAspectRatio&&C.setAttribute("preserveAspectRatio",l.image.preserveAspectRatio),I(C);}if(l.icon){let p=chunkOZAFCKI7_js.b.get(l.icon.id);if(!p)console.warn(`VizCraft: icon '${l.icon.id}' not found. Use registerIcon().`);else {let C=Le(l,l.icon.size,l.icon.size,{position:l.icon.position,dx:l.icon.dx,dy:l.icon.dy}),W=document.createElementNS(o,"g");W.setAttribute("class","viz-node-icon"),W.setAttribute("data-viz-role","node-icon"),W.setAttribute("transform",`translate(${C.x} ${C.y})`),l.icon.color&&W.setAttribute("style",`color:${l.icon.color}`),W.innerHTML=Et(p,l.icon.size,l.icon.size),I(W);}}if(l.svgContent){let p=Le(l,l.svgContent.width,l.svgContent.height,{position:l.svgContent.position,dx:l.svgContent.dx,dy:l.svgContent.dy}),C=document.createElementNS(o,"g");C.setAttribute("class","viz-node-svg"),C.setAttribute("data-viz-role","node-svg"),C.setAttribute("transform",`translate(${p.x} ${p.y})`),C.innerHTML=Xt(l.svgContent.content,l.svgContent.width,l.svgContent.height),I(C);}if(q&&l.container.headerHeight&&"w"in l.shape&&"h"in l.shape){let p=l.shape.w,C=l.shape.h,W=K-C/2+l.container.headerHeight,D=k.querySelector('[data-viz-role="container-header"]');D||(D=document.createElementNS(o,"line"),D.setAttribute("class","viz-container-header"),D.setAttribute("data-viz-role","container-header"),k.appendChild(D)),D.setAttribute("x1",String(Y-p/2)),D.setAttribute("y1",String(W)),D.setAttribute("x2",String(Y+p/2)),D.setAttribute("y2",String(W)),D.setAttribute("stroke",l.style?.stroke??"#111"),D.setAttribute("stroke-width",String(l.style?.strokeWidth??2));}else {let p=k.querySelector('[data-viz-role="container-header"]');p&&p.remove();}let F=l.compartments&&l.compartments.length>0,j=!!(l.collapsed&&F);if(k.querySelectorAll('[data-viz-role="compartment-divider"],[data-viz-role="compartment-label"],[data-viz-role="compartment-entry"],[data-viz-role="collapse-indicator"],[data-viz-role="collapse-indicator-group"]').forEach(p=>p.remove()),k.classList.toggle("viz-node-collapsed",j),F&&"w"in l.shape){let p=l.shape.w,C=l.shape.h,W=K-C/2,D=8,pe=j?1:l.compartments.length;for(let Z=0;Z<pe;Z++){let O=l.compartments[Z];if(Z>0){let M=W+O.y,U=document.createElementNS(o,"line");U.setAttribute("class","viz-compartment-divider"),U.setAttribute("data-viz-role","compartment-divider"),U.setAttribute("data-compartment",O.id),U.setAttribute("x1",String(Y-p/2)),U.setAttribute("y1",String(M)),U.setAttribute("x2",String(Y+p/2)),U.setAttribute("y2",String(M)),U.setAttribute("stroke",l.style?.stroke??"#111"),U.setAttribute("stroke-width",String(l.style?.strokeWidth??2)),k.appendChild(U);}if(O.entries&&O.entries.length>0)for(let M of O.entries){let U=Y-p/2+D+(M.label?.dx||0),Se=M.paddingTop??0,Ae=M.paddingBottom??0,ce=M.height-Se-Ae,ke=W+O.y+M.y+Se+ce/2+(M.label?.dy||0),le=`viz-compartment-entry ${M.className||""} ${M.label?.className||""}`.trim(),ue=ye(U,ke,M.label?.rich??M.text,{className:le,fill:M.label?.fill,fontSize:M.label?.fontSize,fontWeight:M.label?.fontWeight,fontFamily:M.label?.fontFamily,textAnchor:M.label?.textAnchor||"start",dominantBaseline:M.label?.dominantBaseline||"middle",maxWidth:M.label?.maxWidth??p-D*2,lineHeight:M.label?.lineHeight,verticalAlign:M.label?.verticalAlign,overflow:M.label?.overflow}).replace("<text ",`<text data-viz-role="compartment-entry" data-compartment="${O.id}" data-entry="${M.id}" `);k.insertAdjacentHTML("beforeend",ue);}else if(O.label){let M=Y-p/2+D+(O.label.dx||0),U=W+O.y+O.height/2+(O.label.dy||0),Se=`viz-compartment-label ${O.label.className||""}`,Ae=ye(M,U,O.label.rich??O.label.text,{className:Se,fill:O.label.fill,fontSize:O.label.fontSize,fontWeight:O.label.fontWeight,fontFamily:O.label.fontFamily,textAnchor:O.label.textAnchor||"start",dominantBaseline:O.label.dominantBaseline||"middle",maxWidth:O.label.maxWidth??p-D*2,lineHeight:O.label.lineHeight,verticalAlign:O.label.verticalAlign,overflow:O.label.overflow}).replace("<text ",`<text data-viz-role="compartment-label" data-compartment="${O.id}" `);k.insertAdjacentHTML("beforeend",Ae);}}let Be=j?[l.compartments[0]]:l.compartments;for(let Z of Be)if(Z.entries)for(let O of Z.entries){if(!O.onClick)continue;let M=k.querySelector(`[data-viz-role="compartment-entry"][data-compartment="${Z.id}"][data-entry="${O.id}"]`);M&&(M.addEventListener("click",U=>{U.stopPropagation(),O.onClick();}),M.style.cursor="pointer");}let re=l.compartments[0],te=l.collapseIndicator,ve=te===false||typeof te=="object"&&te.visible===false;if((j||!!re.onClick)&&!ve&&l.compartments.length>1){let O=Y+p/2-D-6,M=l.compartments[0].height,U=W+M/2,Se=(typeof te=="object"?te.color:void 0)??l.style?.stroke??"#111",Ae=typeof te=="object"?te.render:void 0,ce;if(Ae){let ae=Ae(j),Ee=document.createElementNS(o,"g");Ee.innerHTML=ae,ce=Ee.firstElementChild??Ee,ce===Ee&&Ee.childNodes.length>0&&(ce=Ee),ce.setAttribute("data-viz-role","collapse-indicator");}else {let ae=document.createElementNS(o,"polygon");ae.setAttribute("data-viz-role","collapse-indicator"),j?ae.setAttribute("points",`${O},${U-6} ${O+6},${U} ${O},${U+6}`):ae.setAttribute("points",`${O},${U-6/2} ${O+12},${U-6/2} ${O+6},${U+6/2}`),ae.setAttribute("fill",Se),ae.setAttribute("class","viz-collapse-indicator"),ce=ae;}let ke=10,le=document.createElementNS(o,"rect");le.setAttribute("x",String(O-ke)),le.setAttribute("y",String(U-6-ke)),le.setAttribute("width",String(12+ke*2)),le.setAttribute("height",String(12+ke*2)),le.setAttribute("fill","transparent"),le.style.cursor="pointer";let ue=document.createElementNS(o,"g");if(ue.setAttribute("data-viz-role","collapse-indicator-group"),ue.style.cursor="pointer",ue.appendChild(le),ue.appendChild(ce),re.onClick){let ae=l.id,Ee=re.id,wt=this;ue.addEventListener("click",Qt=>{Qt.stopPropagation();let Bt=wt._nodes.get(ae);re.onClick({nodeId:ae,compartmentId:Ee,collapsed:!!Bt?.collapsed,collapseAnchor:Bt?.collapseAnchor??"center",toggle:Ct=>wt._performCollapseToggle(ae,Ct?.animate,Ct?.anchor)});});}k.appendChild(ue);}let xe=this;for(let Z of Be){if(!Z.onClick)continue;let O=k.querySelectorAll(`[data-viz-role="compartment-label"][data-compartment="${Z.id}"]`),M=l.id,U=Z.id,Se=Z.onClick,Ae=ce=>{ce.addEventListener("click",ke=>{ke.stopPropagation();let le=xe._nodes.get(M);Se({nodeId:M,compartmentId:U,collapsed:!!le?.collapsed,collapseAnchor:le?.collapseAnchor??"center",toggle:ue=>xe._performCollapseToggle(M,ue?.animate,ue?.anchor)});}),ce.style.cursor="pointer";};O.forEach(Ae);}}let se=Y+(l.label?.dx||0),he=K+(l.label?.dy||0),J=!!l.label&&!F;if(l.label&&q&&l.container.headerHeight&&"h"in l.shape&&!l.label.dy){let p=l.shape.h;he=K-p/2+l.container.headerHeight/2,se=Y+(l.label.dx||0);}let ie=k.querySelector('[data-viz-role="node-label"]')||k.querySelector(".viz-node-label");if(ie&&(ie.remove(),ie=null),l.label&&J){let p=`viz-node-label ${l.label.className||""}`,C=ye(se,he,l.label.rich??l.label.text,{className:p,fill:l.label.fill,fontSize:l.label.fontSize,fontWeight:l.label.fontWeight,fontFamily:l.label.fontFamily,textAnchor:l.label.textAnchor||"middle",dominantBaseline:l.label.dominantBaseline||"middle",maxWidth:l.label.maxWidth,lineHeight:l.label.lineHeight,verticalAlign:l.label.verticalAlign,overflow:l.label.overflow}).replace("<text ",'<text data-viz-role="node-label" ');k.insertAdjacentHTML("beforeend",C),ie=k.querySelector('[data-viz-role="node-label"]');}if(k.querySelectorAll('[data-viz-role="badge"]').forEach(p=>p.remove()),l.badges&&l.badges.length>0){let p=chunkOZAFCKI7_js.o(l.shape),C=p.width/2,W=p.height/2;for(let D of l.badges){let pe=D.fontSize??10,Be=3,re=pe+Be*2,te=Math.max(pe*D.text.length*.7+Be*2,re),ve,Ce;D.position==="top-left"?(ve=Y-C-te/4,Ce=K-W-re/4):D.position==="top-right"?(ve=Y+C-te*3/4,Ce=K-W-re/4):D.position==="bottom-left"?(ve=Y-C-te/4,Ce=K+W-re*3/4):(ve=Y+C-te*3/4,Ce=K+W-re*3/4);let xe=document.createElementNS(o,"g");if(xe.setAttribute("class","viz-badge"),xe.setAttribute("data-viz-role","badge"),D.background){let O=document.createElementNS(o,"rect");O.setAttribute("x",String(ve)),O.setAttribute("y",String(Ce)),O.setAttribute("width",String(te)),O.setAttribute("height",String(re)),O.setAttribute("rx",String(re/2)),O.setAttribute("fill",D.background),xe.appendChild(O);}let Z=document.createElementNS(o,"text");Z.setAttribute("x",String(ve+te/2)),Z.setAttribute("y",String(Ce+re/2)),Z.setAttribute("text-anchor","middle"),Z.setAttribute("dominant-baseline","central"),Z.setAttribute("font-size",String(pe)),D.fill&&Z.setAttribute("fill",D.fill),Z.textContent=D.text,xe.appendChild(Z),k.appendChild(xe);}}k.querySelectorAll('[data-viz-role="port"]').forEach(p=>p.remove()),l.ports&&l.ports.length>0&&l.ports.forEach(p=>{let C=document.createElementNS(o,"circle");C.setAttribute("cx",String(Y+p.offset.x)),C.setAttribute("cy",String(K+p.offset.y)),C.setAttribute("r","4"),C.setAttribute("class","viz-port"),C.setAttribute("data-viz-role","port"),C.setAttribute("data-node",l.id),C.setAttribute("data-port",p.id),k.appendChild(C);});let G=B.get(l.id);if(G&&G.length>0){let p=k.querySelector(':scope > [data-viz-role="container-children"]');p||(p=document.createElementNS(o,"g"),p.setAttribute("class","viz-container-children"),p.setAttribute("data-viz-role","container-children"),k.appendChild(p)),G.forEach(C=>s(C,p));}else {let p=k.querySelector(':scope > [data-viz-role="container-children"]');p&&p.remove();}};b.forEach(l=>s(l,m)),z.forEach(l=>{let N=l.getAttribute("data-id");N&&!w.has(N)&&l.remove();});let v=Array.from(y.children).filter(l=>l.tagName==="g"),A=new Map;v.forEach(l=>{let N=l.getAttribute("data-overlay-id");N&&A.set(N,l);});let _=new Set;d&&d.length>0&&d.forEach(l=>{let N=Ve.get(l.id);if(N){let k=l.key||l.id;_.add(k);let q=A.get(k);q||(q=document.createElementNS(o,"g"),q.setAttribute("data-overlay-id",k),q.setAttribute("data-viz-role","overlay-group"),y.appendChild(q)),q.setAttribute("class",`viz-overlay-${l.id}${l.className?` ${l.className}`:""}`);let T={spec:l,nodesById:c,edgesById:new Map(a.map(X=>[X.id,X])),scene:e,registry:Ve};N.update?N.update(T,q):q.innerHTML=N.render(T);}}),v.forEach(l=>{let N=l.getAttribute("data-overlay-id");N&&!_.has(N)&&l.remove();}),Re.set(u,Ie(u,{edgePathResolver:this._edgePathResolver}));}_renderSceneToSvg(e,t){let i=t?.includeRuntime===true,{viewBox:n,nodes:a,edges:d,overlays:c}=e,o=new Map;if(i)for(let s of a){if(!s.container)continue;let v=(s.runtime?.x??s.pos.x)-s.pos.x,A=(s.runtime?.y??s.pos.y)-s.pos.y;(v!==0||A!==0)&&o.set(s.id,{dx:v,dy:A});}let u=a.map(s=>{if(!i)return {...s,runtime:void 0};let v=s.runtime?{...s.runtime}:{},A=v.x??s.pos.x,_=v.y??s.pos.y;if(s.parentId){let k=o.get(s.parentId);k&&(A+=k.dx,_+=k.dy);}(v.x!==void 0||v.y!==void 0||A!==s.pos.x||_!==s.pos.y)&&(v.x=A,v.y=_);let N=Object.keys(v).length>0?v:void 0;return {...s,runtime:N}}),g=d.map(s=>i?s:{...s,runtime:void 0}),m={...e,nodes:u,edges:g},y=new Map(u.map(s=>[s.id,s])),h=new Map(g.map(s=>[s.id,s])),f=`<svg viewBox="0 0 ${n.w} ${n.h}" xmlns="http://www.w3.org/2000/svg">`;f+=`<style>${at}</style>`,f+=`
117
117
  <defs>`;let E=new Set;d.forEach(s=>{let v=s.style?.stroke;if(s.markerEnd&&s.markerEnd!=="none"){let A=ze(s.markerEnd,v,"end");E.has(A)||(E.add(A),f+=rt(s.markerEnd,v??"currentColor",A,"end"));}if(s.markerStart&&s.markerStart!=="none"){let A=ze(s.markerStart,v,"start");E.has(A)||(E.add(A),f+=rt(s.markerStart,v??"currentColor",A,"start"));}});let B=new Map;u.forEach(s=>{if(s.style?.shadow){let v=qe(s.style.shadow),A=Fe(v);B.has(A)||B.set(A,v);}}),B.forEach((s,v)=>{f+=At(v,s);});let b=new Set,z=m.sketch?.enabled;u.forEach(s=>{(s.style?.sketch||z)&&b.add(Ke(s.style,s.id));}),g.forEach(s=>{if(s.style?.sketch||z){let v=0;for(let A=0;A<s.id.length;A++)v=Math.imul(31,v)+s.id.charCodeAt(A)|0;b.add(Math.abs(v));}}),b.forEach(s=>{f+=kt(Pe(s),s);}),f+=`
118
- </defs>`,f+='<g class="viz-layer-edges" data-viz-layer="edges">',g.forEach(s=>{let v=tt(s,y);if(!v)return;let{start:A,end:_}=v,l="",N="";s.animations&&s.animations.forEach(S=>{if(S.when===false)return;let P=Te.getEdgeRenderer(S.id);if(P){if(P.getClass&&(l+=` ${P.getClass({spec:S,element:s})}`),P.getStyle){let H=P.getStyle({spec:S,element:s});Object.entries(H).forEach(([$,I])=>{N+=`${$}: ${I}; `;});}}else l+=` ${nt(S.id)}`,ot(S.params).forEach(([H,$])=>{N+=`${H}: ${$}; `;});});let k=s.markerEnd&&s.markerEnd!=="none"?`marker-end="url(#${ze(s.markerEnd,s.style?.stroke,"end")})"`:"",q=s.markerStart&&s.markerStart!=="none"?`marker-start="url(#${ze(s.markerStart,s.style?.stroke,"start")})"`:"",T;if(A&&_&&A===_)T=chunkTVRPABD2_js.g(A,s);else {let S=chunkTVRPABD2_js.e(A,_,s);T=chunkTVRPABD2_js.f(S.start,S.end,s.routing,s.waypoints);}if(this._edgePathResolver){let S=P=>{let H=tt(P,y);if(!H)return "";if(H.start&&H.end&&H.start===H.end)return chunkTVRPABD2_js.g(H.start,P).d;let $=chunkTVRPABD2_js.e(H.start,H.end,P);return chunkTVRPABD2_js.f($.start,$.end,P.routing,P.waypoints).d};try{let P=this._edgePathResolver(s,m,H=>S(H));typeof P=="string"&&P&&(T.d=P);}catch(P){console.warn(`VizBuilder: edge path resolver threw for edge ${s.id}`,P);}}let X="";s.runtime?.opacity!==void 0&&(X+=`opacity: ${s.runtime.opacity}; `);let Y="",K="";s.runtime?.strokeDashoffset!==void 0&&(Y+=`stroke-dashoffset: ${s.runtime.strokeDashoffset}; `,K+=` stroke-dashoffset="${s.runtime.strokeDashoffset}"`);let L=s.style?.sketch||z,de=L?" viz-sketch":"";f+=`<g data-id="${s.id}" data-viz-role="edge-group" class="viz-edge-group${de} ${s.className||""} ${l}" style="${N}${X}">`;let ee=Y;if(s.style?.stroke!==void 0&&(ee+=`stroke: ${s.style.stroke}; `),s.style?.strokeWidth!==void 0&&(ee+=`stroke-width: ${s.style.strokeWidth}; `),s.style?.fill!==void 0&&(ee+=`fill: ${s.style.fill}; `),s.style?.opacity!==void 0&&s.runtime?.opacity===void 0&&(ee+=`opacity: ${s.style.opacity}; `),s.style?.strokeDasharray!==void 0){let S=$e(s.style.strokeDasharray);S&&(ee+=`stroke-dasharray: ${S}; `);}let x="";if(L){let S=0;for(let P=0;P<s.id.length;P++)S=Math.imul(31,S)+s.id.charCodeAt(P)|0;x=` filter="url(#${Pe(Math.abs(S))})"`;}f+=`<path d="${T.d}" class="viz-edge" data-viz-role="edge-line" ${k} ${q} style="${ee}"${K}${x} />`,De(s).forEach((S,P)=>{let H=Ge(S,T),$=`viz-edge-label ${S.className||""}`,F=ye(H.x,H.y,S.rich??S.text,{className:$,fill:S.fill,fontSize:S.fontSize,fontWeight:S.fontWeight,fontFamily:S.fontFamily,textAnchor:"middle",dominantBaseline:"middle",maxWidth:S.maxWidth,lineHeight:S.lineHeight,verticalAlign:S.verticalAlign,overflow:S.overflow}).replace("<text ",`<text data-viz-role="edge-label" data-label-index="${P}" data-label-position="${S.position}" `);f+=F;}),f+="</g>";}),f+="</g>";let R=new Map;u.forEach(s=>{if(s.parentId){let v=R.get(s.parentId);v||(v=[],R.set(s.parentId,v)),v.push(s);}});let w=s=>{let v="",{x:A,y:_}=chunkOZAFCKI7_js.d(s),l=chunkOZAFCKI7_js.e(s),N="",k="";s.runtime?.opacity!==void 0&&(k+=`opacity: ${s.runtime.opacity}; `),s.animations&&s.animations.forEach($=>{if($.when===false)return;let I=Te.getNodeRenderer($.id);if(I){if(I.getClass&&(N+=` ${I.getClass({spec:$,element:s})}`),I.getStyle){let F=I.getStyle({spec:$,element:s});Object.entries(F).forEach(([j,se])=>{k+=`${j}: ${se}; `;});}}else N+=` ${nt($.id)}`,ot($.params).forEach(([F,j])=>{k+=`${F}: ${j}; `;});});let q=!!s.container,T=s.style?.sketch||z,X=`viz-node-group${q?" viz-container":""}${T?" viz-sketch":""}${s.collapsed&&s.compartments&&s.compartments.length>0?" viz-node-collapsed":""} ${s.className||""} ${N}`,Y=s.runtime?.scale,K=s.runtime?.rotation,L="";if(T){let $=Ke(s.style,s.id);L=` filter="url(#${Pe($)})"`;}let de=Y!==void 0||K!==void 0?` transform="translate(${A} ${_}) rotate(${K??0}) scale(${Y??1}) translate(${-A} ${-_})"`:"";v+=`<g data-id="${s.id}" data-viz-role="node-group" class="${X}" style="${k}"${de}${L}>`;let ee=$e(s.style?.strokeDasharray),x=s.style?.shadow?`url(#${Fe(qe(s.style.shadow))})`:void 0,V=Zr({fill:s.style?.fill??"none",stroke:s.style?.stroke??"#111","stroke-width":s.style?.strokeWidth??2,opacity:s.runtime?.opacity!==void 0?void 0:s.style?.opacity,"stroke-dasharray":ee||void 0,filter:x});if(v+=chunkOZAFCKI7_js.h(l,{x:A,y:_},V),s.image){let $=Le(s,s.image.width,s.image.height,{position:s.image.position,dx:s.image.dx,dy:s.image.dy}),I=s.image.preserveAspectRatio?` preserveAspectRatio="${we(s.image.preserveAspectRatio)}"`:"",F=we(s.image.href);v+=`<image x="${$.x}" y="${$.y}" width="${s.image.width}" height="${s.image.height}" href="${F}"${I} class="viz-node-image" data-viz-role="node-image" />`;}if(s.icon){let $=chunkOZAFCKI7_js.b.get(s.icon.id);if(!$)console.warn(`VizCraft: icon '${s.icon.id}' not found. Use registerIcon().`);else {let I=Le(s,s.icon.size,s.icon.size,{position:s.icon.position,dx:s.icon.dx,dy:s.icon.dy}),F=s.icon.color?` style="color:${we(s.icon.color)}"`:"",j=Et($,s.icon.size,s.icon.size);v+=`<g transform="translate(${I.x} ${I.y})" class="viz-node-icon" data-viz-role="node-icon"${F}>${j}</g>`;}}if(s.svgContent){let $=Le(s,s.svgContent.width,s.svgContent.height,{position:s.svgContent.position,dx:s.svgContent.dx,dy:s.svgContent.dy}),I=Xt(s.svgContent.content,s.svgContent.width,s.svgContent.height);v+=`<g transform="translate(${$.x} ${$.y})" class="viz-node-svg" data-viz-role="node-svg">${I}</g>`;}if(q&&s.container.headerHeight&&"w"in l&&"h"in l){let $=l.w,I=l.h,F=_-I/2+s.container.headerHeight;v+=`<line x1="${A-$/2}" y1="${F}" x2="${A+$/2}" y2="${F}" stroke="${s.style?.stroke??"#111"}" stroke-width="${s.style?.strokeWidth??2}" class="viz-container-header" data-viz-role="container-header" />`;}let S=s.compartments&&s.compartments.length>0,P=!!(s.collapsed&&S);if(S&&"w"in l){let $=l.w,I=l.h,F=_-I/2,j=8,se=P?1:s.compartments.length;for(let ne=0;ne<se;ne++){let G=s.compartments[ne];if(ne>0){let p=F+G.y;v+=`<line x1="${A-$/2}" y1="${p}" x2="${A+$/2}" y2="${p}" stroke="${s.style?.stroke??"#111"}" stroke-width="${s.style?.strokeWidth??2}" class="viz-compartment-divider" data-viz-role="compartment-divider" data-compartment="${G.id}" />`;}if(G.entries&&G.entries.length>0)for(let p of G.entries){let C=A-$/2+j+(p.label?.dx||0),W=p.paddingTop??0,D=p.paddingBottom??0,pe=p.height-W-D,Be=F+G.y+p.y+W+pe/2+(p.label?.dy||0),re=`viz-compartment-entry ${p.className||""} ${p.label?.className||""}`.trim(),te=ye(C,Be,p.label?.rich??p.text,{className:re,fill:p.label?.fill,fontSize:p.label?.fontSize,fontWeight:p.label?.fontWeight,fontFamily:p.label?.fontFamily,textAnchor:p.label?.textAnchor||"start",dominantBaseline:p.label?.dominantBaseline||"middle",maxWidth:p.label?.maxWidth??$-j*2,lineHeight:p.label?.lineHeight,verticalAlign:p.label?.verticalAlign,overflow:p.label?.overflow}).replace("<text ",`<text data-viz-role="compartment-entry" data-compartment="${we(G.id)}" data-entry="${we(p.id)}" `);v+=te;}else if(G.label){let p=A-$/2+j+(G.label.dx||0),C=F+G.y+G.height/2+(G.label.dy||0),W=`viz-compartment-label ${G.label.className||""}`,D=ye(p,C,G.label.rich??G.label.text,{className:W,fill:G.label.fill,fontSize:G.label.fontSize,fontWeight:G.label.fontWeight,fontFamily:G.label.fontFamily,textAnchor:G.label.textAnchor||"start",dominantBaseline:G.label.dominantBaseline||"middle",maxWidth:G.label.maxWidth??$-j*2,lineHeight:G.label.lineHeight,verticalAlign:G.label.verticalAlign,overflow:G.label.overflow}).replace("<text ",`<text data-viz-role="compartment-label" data-compartment="${G.id}" `);v+=D;}}let he=s.compartments[0],J=s.collapseIndicator,ie=J===false||typeof J=="object"&&J.visible===false;if((P||!!he.onClick)&&!ie&&s.compartments.length>1){let G=A+$/2-j-6,p=s.compartments[0].height,C=F+p/2,W=(typeof J=="object"?J.color:void 0)??s.style?.stroke??"#111",D=typeof J=="object"?J.render:void 0;D?v+=D(P):P?v+=`<polygon data-viz-role="collapse-indicator" class="viz-collapse-indicator" points="${G},${C-6} ${G+6},${C} ${G},${C+6}" fill="${W}" />`:v+=`<polygon data-viz-role="collapse-indicator" class="viz-collapse-indicator" points="${G},${C-6/2} ${G+12},${C-6/2} ${G+6},${C+6/2}" fill="${W}" />`;}}if(s.label&&!S){let $=A+(s.label.dx||0),I=_+(s.label.dy||0);if(q&&s.container.headerHeight&&"h"in l&&!s.label.dy){let he=l.h;I=_-he/2+s.container.headerHeight/2,$=A+(s.label.dx||0);}let F=`viz-node-label ${s.label.className||""}`,se=ye($,I,s.label.rich??s.label.text,{className:F,fill:s.label.fill,fontSize:s.label.fontSize,fontWeight:s.label.fontWeight,fontFamily:s.label.fontFamily,textAnchor:s.label.textAnchor||"middle",dominantBaseline:s.label.dominantBaseline||"middle",maxWidth:s.label.maxWidth,lineHeight:s.label.lineHeight,verticalAlign:s.label.verticalAlign,overflow:s.label.overflow}).replace("<text ",'<text data-viz-role="node-label" ');v+=se;}if(s.badges&&s.badges.length>0){let $=chunkOZAFCKI7_js.o(l),I=$.width/2,F=$.height/2;for(let j of s.badges){let se=j.fontSize??10,he=3,J=se+he*2,ie=Math.max(se*j.text.length*.7+he*2,J),be,ne;if(j.position==="top-left"?(be=A-I-ie/4,ne=_-F-J/4):j.position==="top-right"?(be=A+I-ie*3/4,ne=_-F-J/4):j.position==="bottom-left"?(be=A-I-ie/4,ne=_+F-J*3/4):(be=A+I-ie*3/4,ne=_+F-J*3/4),v+='<g class="viz-badge" data-viz-role="badge">',j.background){let C=we(j.background);v+=`<rect x="${be}" y="${ne}" width="${ie}" height="${J}" rx="${J/2}" fill="${C}" />`;}let G=j.fill?` fill="${we(j.fill)}"`:"",p=j.text.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");v+=`<text x="${be+ie/2}" y="${ne+J/2}" text-anchor="middle" dominant-baseline="central" font-size="${se}"${G}>${p}</text>`,v+="</g>";}}s.ports&&s.ports.length>0&&s.ports.forEach($=>{let I=A+$.offset.x,F=_+$.offset.y;v+=`<circle cx="${I}" cy="${F}" r="4" class="viz-port" data-viz-role="port" data-node="${s.id}" data-port="${$.id}" />`;});let H=R.get(s.id);return H&&H.length>0&&(v+='<g class="viz-container-children" data-viz-role="container-children">',H.forEach($=>{v+=w($);}),v+="</g>"),v+="</g>",v};return f+='<g class="viz-layer-nodes" data-viz-layer="nodes">',u.forEach(s=>{s.parentId||(f+=w(s));}),f+="</g>",c&&c.length>0&&(f+='<g class="viz-layer-overlays" data-viz-layer="overlays">',c.forEach(s=>{let v=Ve.get(s.id);v&&(f+=v.render({spec:s,nodesById:y,edgesById:h,scene:m,registry:Ve}));}),f+="</g>"),f+="</svg>",f}};function mn(){return new zt}Object.defineProperty(exports,"AnimationBuilder",{enumerable:true,get:function(){return chunkAE7VTFYG_js.c}});Object.defineProperty(exports,"OVERLAY_RUNTIME_DIRTY",{enumerable:true,get:function(){return chunkAE7VTFYG_js.a}});Object.defineProperty(exports,"buildAnimationSpec",{enumerable:true,get:function(){return chunkAE7VTFYG_js.d}});Object.defineProperty(exports,"createBuilderPlayback",{enumerable:true,get:function(){return chunkAE7VTFYG_js.f}});Object.defineProperty(exports,"createScenePlayback",{enumerable:true,get:function(){return chunkAE7VTFYG_js.e}});Object.defineProperty(exports,"playAnimationSpec",{enumerable:true,get:function(){return chunkAE7VTFYG_js.g}});Object.defineProperty(exports,"angleBetween",{enumerable:true,get:function(){return chunkTVRPABD2_js.d}});Object.defineProperty(exports,"computeEdgeEndpoints",{enumerable:true,get:function(){return chunkTVRPABD2_js.e}});Object.defineProperty(exports,"computeEdgePath",{enumerable:true,get:function(){return chunkTVRPABD2_js.f}});Object.defineProperty(exports,"computeSelfLoop",{enumerable:true,get:function(){return chunkTVRPABD2_js.g}});Object.defineProperty(exports,"distanceSquare",{enumerable:true,get:function(){return chunkTVRPABD2_js.i}});Object.defineProperty(exports,"edgeDistance",{enumerable:true,get:function(){return chunkTVRPABD2_js.n}});Object.defineProperty(exports,"getEffectiveNodeBounds",{enumerable:true,get:function(){return chunkTVRPABD2_js.j}});Object.defineProperty(exports,"hitTest",{enumerable:true,get:function(){return chunkTVRPABD2_js.k}});Object.defineProperty(exports,"hitTestRect",{enumerable:true,get:function(){return chunkTVRPABD2_js.l}});Object.defineProperty(exports,"nearestPort",{enumerable:true,get:function(){return chunkTVRPABD2_js.m}});Object.defineProperty(exports,"pointInRect",{enumerable:true,get:function(){return chunkTVRPABD2_js.h}});Object.defineProperty(exports,"setupPanZoom",{enumerable:true,get:function(){return chunkTVRPABD2_js.a}});Object.defineProperty(exports,"circularLayout",{enumerable:true,get:function(){return chunkNHGHIK6R_js.a}});Object.defineProperty(exports,"gridLayout",{enumerable:true,get:function(){return chunkNHGHIK6R_js.b}});Object.defineProperty(exports,"deserializeScene",{enumerable:true,get:function(){return chunkE3Z7QMXI_js.b}});Object.defineProperty(exports,"serializeScene",{enumerable:true,get:function(){return chunkE3Z7QMXI_js.a}});Object.defineProperty(exports,"findPortNearest",{enumerable:true,get:function(){return chunkT5O2PDL6_js.d}});Object.defineProperty(exports,"getEquidistantPorts",{enumerable:true,get:function(){return chunkT5O2PDL6_js.b}});Object.defineProperty(exports,"registerPerimeterStrategy",{enumerable:true,get:function(){return chunkT5O2PDL6_js.a}});Object.defineProperty(exports,"toNodePorts",{enumerable:true,get:function(){return chunkT5O2PDL6_js.c}});Object.defineProperty(exports,"CoreIconRegistry",{enumerable:true,get:function(){return chunkOZAFCKI7_js.a}});Object.defineProperty(exports,"computeNodeAnchorAtAngle",{enumerable:true,get:function(){return chunkOZAFCKI7_js.j}});Object.defineProperty(exports,"defaultCoreIconRegistry",{enumerable:true,get:function(){return chunkOZAFCKI7_js.b}});Object.defineProperty(exports,"findPort",{enumerable:true,get:function(){return chunkOZAFCKI7_js.m}});Object.defineProperty(exports,"getDefaultPorts",{enumerable:true,get:function(){return chunkOZAFCKI7_js.k}});Object.defineProperty(exports,"getNodeBoundingBox",{enumerable:true,get:function(){return chunkOZAFCKI7_js.o}});Object.defineProperty(exports,"getNodePorts",{enumerable:true,get:function(){return chunkOZAFCKI7_js.l}});Object.defineProperty(exports,"registerIcon",{enumerable:true,get:function(){return chunkOZAFCKI7_js.c}});Object.defineProperty(exports,"resolvePortPosition",{enumerable:true,get:function(){return chunkOZAFCKI7_js.n}});exports.CoreAnimationRegistry=dt;exports.CoreOverlayRegistry=ut;exports.DEFAULT_VIZ_CSS=at;exports.OverlayBuilder=_e;exports.RichLabelBuilderImpl=Oe;exports.buildOverlaySpecs=Bi;exports.collectEdgeLabels=De;exports.coreCircleOverlay=Er;exports.coreDataPointOverlay=Ar;exports.coreFlowAnimation=nr;exports.coreGridLabelsOverlay=Sr;exports.coreGroupOverlay=wr;exports.coreRectOverlay=kr;exports.coreSignalOverlay=xr;exports.coreTextOverlay=zr;exports.defaultCoreAnimationRegistry=Te;exports.defaultCoreOverlayRegistry=Ve;exports.resolveDasharray=$e;exports.resolveEdgeGeometry=xi;exports.resolveEdgeGeometryFromData=ct;exports.resolveEdgeLabelPosition=Ge;exports.viz=mn;
118
+ </defs>`,f+='<g class="viz-layer-edges" data-viz-layer="edges">',g.forEach(s=>{let v=tt(s,y);if(!v)return;let{start:A,end:_}=v,l="",N="";s.animations&&s.animations.forEach(S=>{if(S.when===false)return;let P=Te.getEdgeRenderer(S.id);if(P){if(P.getClass&&(l+=` ${P.getClass({spec:S,element:s})}`),P.getStyle){let H=P.getStyle({spec:S,element:s});Object.entries(H).forEach(([$,I])=>{N+=`${$}: ${I}; `;});}}else l+=` ${nt(S.id)}`,ot(S.params).forEach(([H,$])=>{N+=`${H}: ${$}; `;});});let k=s.markerEnd&&s.markerEnd!=="none"?`marker-end="url(#${ze(s.markerEnd,s.style?.stroke,"end")})"`:"",q=s.markerStart&&s.markerStart!=="none"?`marker-start="url(#${ze(s.markerStart,s.style?.stroke,"start")})"`:"",T;if(A&&_&&A===_)T=chunkM3ZDZ24B_js.g(A,s);else {let S=chunkM3ZDZ24B_js.e(A,_,s);T=chunkM3ZDZ24B_js.f(S.start,S.end,s.routing,s.waypoints);}if(this._edgePathResolver){let S=P=>{let H=tt(P,y);if(!H)return "";if(H.start&&H.end&&H.start===H.end)return chunkM3ZDZ24B_js.g(H.start,P).d;let $=chunkM3ZDZ24B_js.e(H.start,H.end,P);return chunkM3ZDZ24B_js.f($.start,$.end,P.routing,P.waypoints).d};try{let P=this._edgePathResolver(s,m,H=>S(H));typeof P=="string"&&P&&(T.d=P);}catch(P){console.warn(`VizBuilder: edge path resolver threw for edge ${s.id}`,P);}}let X="";s.runtime?.opacity!==void 0&&(X+=`opacity: ${s.runtime.opacity}; `);let Y="",K="";s.runtime?.strokeDashoffset!==void 0&&(Y+=`stroke-dashoffset: ${s.runtime.strokeDashoffset}; `,K+=` stroke-dashoffset="${s.runtime.strokeDashoffset}"`);let L=s.style?.sketch||z,de=L?" viz-sketch":"";f+=`<g data-id="${s.id}" data-viz-role="edge-group" class="viz-edge-group${de} ${s.className||""} ${l}" style="${N}${X}">`;let ee=Y;if(s.style?.stroke!==void 0&&(ee+=`stroke: ${s.style.stroke}; `),s.style?.strokeWidth!==void 0&&(ee+=`stroke-width: ${s.style.strokeWidth}; `),s.style?.fill!==void 0&&(ee+=`fill: ${s.style.fill}; `),s.style?.opacity!==void 0&&s.runtime?.opacity===void 0&&(ee+=`opacity: ${s.style.opacity}; `),s.style?.strokeDasharray!==void 0){let S=$e(s.style.strokeDasharray);S&&(ee+=`stroke-dasharray: ${S}; `);}let x="";if(L){let S=0;for(let P=0;P<s.id.length;P++)S=Math.imul(31,S)+s.id.charCodeAt(P)|0;x=` filter="url(#${Pe(Math.abs(S))})"`;}f+=`<path d="${T.d}" class="viz-edge" data-viz-role="edge-line" ${k} ${q} style="${ee}"${K}${x} />`,De(s).forEach((S,P)=>{let H=Ge(S,T),$=`viz-edge-label ${S.className||""}`,F=ye(H.x,H.y,S.rich??S.text,{className:$,fill:S.fill,fontSize:S.fontSize,fontWeight:S.fontWeight,fontFamily:S.fontFamily,textAnchor:"middle",dominantBaseline:"middle",maxWidth:S.maxWidth,lineHeight:S.lineHeight,verticalAlign:S.verticalAlign,overflow:S.overflow}).replace("<text ",`<text data-viz-role="edge-label" data-label-index="${P}" data-label-position="${S.position}" `);f+=F;}),f+="</g>";}),f+="</g>";let R=new Map;u.forEach(s=>{if(s.parentId){let v=R.get(s.parentId);v||(v=[],R.set(s.parentId,v)),v.push(s);}});let w=s=>{let v="",{x:A,y:_}=chunkOZAFCKI7_js.d(s),l=chunkOZAFCKI7_js.e(s),N="",k="";s.runtime?.opacity!==void 0&&(k+=`opacity: ${s.runtime.opacity}; `),s.animations&&s.animations.forEach($=>{if($.when===false)return;let I=Te.getNodeRenderer($.id);if(I){if(I.getClass&&(N+=` ${I.getClass({spec:$,element:s})}`),I.getStyle){let F=I.getStyle({spec:$,element:s});Object.entries(F).forEach(([j,se])=>{k+=`${j}: ${se}; `;});}}else N+=` ${nt($.id)}`,ot($.params).forEach(([F,j])=>{k+=`${F}: ${j}; `;});});let q=!!s.container,T=s.style?.sketch||z,X=`viz-node-group${q?" viz-container":""}${T?" viz-sketch":""}${s.collapsed&&s.compartments&&s.compartments.length>0?" viz-node-collapsed":""} ${s.className||""} ${N}`,Y=s.runtime?.scale,K=s.runtime?.rotation,L="";if(T){let $=Ke(s.style,s.id);L=` filter="url(#${Pe($)})"`;}let de=Y!==void 0||K!==void 0?` transform="translate(${A} ${_}) rotate(${K??0}) scale(${Y??1}) translate(${-A} ${-_})"`:"";v+=`<g data-id="${s.id}" data-viz-role="node-group" class="${X}" style="${k}"${de}${L}>`;let ee=$e(s.style?.strokeDasharray),x=s.style?.shadow?`url(#${Fe(qe(s.style.shadow))})`:void 0,V=Zr({fill:s.style?.fill??"none",stroke:s.style?.stroke??"#111","stroke-width":s.style?.strokeWidth??2,opacity:s.runtime?.opacity!==void 0?void 0:s.style?.opacity,"stroke-dasharray":ee||void 0,filter:x});if(v+=chunkOZAFCKI7_js.h(l,{x:A,y:_},V),s.image){let $=Le(s,s.image.width,s.image.height,{position:s.image.position,dx:s.image.dx,dy:s.image.dy}),I=s.image.preserveAspectRatio?` preserveAspectRatio="${we(s.image.preserveAspectRatio)}"`:"",F=we(s.image.href);v+=`<image x="${$.x}" y="${$.y}" width="${s.image.width}" height="${s.image.height}" href="${F}"${I} class="viz-node-image" data-viz-role="node-image" />`;}if(s.icon){let $=chunkOZAFCKI7_js.b.get(s.icon.id);if(!$)console.warn(`VizCraft: icon '${s.icon.id}' not found. Use registerIcon().`);else {let I=Le(s,s.icon.size,s.icon.size,{position:s.icon.position,dx:s.icon.dx,dy:s.icon.dy}),F=s.icon.color?` style="color:${we(s.icon.color)}"`:"",j=Et($,s.icon.size,s.icon.size);v+=`<g transform="translate(${I.x} ${I.y})" class="viz-node-icon" data-viz-role="node-icon"${F}>${j}</g>`;}}if(s.svgContent){let $=Le(s,s.svgContent.width,s.svgContent.height,{position:s.svgContent.position,dx:s.svgContent.dx,dy:s.svgContent.dy}),I=Xt(s.svgContent.content,s.svgContent.width,s.svgContent.height);v+=`<g transform="translate(${$.x} ${$.y})" class="viz-node-svg" data-viz-role="node-svg">${I}</g>`;}if(q&&s.container.headerHeight&&"w"in l&&"h"in l){let $=l.w,I=l.h,F=_-I/2+s.container.headerHeight;v+=`<line x1="${A-$/2}" y1="${F}" x2="${A+$/2}" y2="${F}" stroke="${s.style?.stroke??"#111"}" stroke-width="${s.style?.strokeWidth??2}" class="viz-container-header" data-viz-role="container-header" />`;}let S=s.compartments&&s.compartments.length>0,P=!!(s.collapsed&&S);if(S&&"w"in l){let $=l.w,I=l.h,F=_-I/2,j=8,se=P?1:s.compartments.length;for(let ne=0;ne<se;ne++){let G=s.compartments[ne];if(ne>0){let p=F+G.y;v+=`<line x1="${A-$/2}" y1="${p}" x2="${A+$/2}" y2="${p}" stroke="${s.style?.stroke??"#111"}" stroke-width="${s.style?.strokeWidth??2}" class="viz-compartment-divider" data-viz-role="compartment-divider" data-compartment="${G.id}" />`;}if(G.entries&&G.entries.length>0)for(let p of G.entries){let C=A-$/2+j+(p.label?.dx||0),W=p.paddingTop??0,D=p.paddingBottom??0,pe=p.height-W-D,Be=F+G.y+p.y+W+pe/2+(p.label?.dy||0),re=`viz-compartment-entry ${p.className||""} ${p.label?.className||""}`.trim(),te=ye(C,Be,p.label?.rich??p.text,{className:re,fill:p.label?.fill,fontSize:p.label?.fontSize,fontWeight:p.label?.fontWeight,fontFamily:p.label?.fontFamily,textAnchor:p.label?.textAnchor||"start",dominantBaseline:p.label?.dominantBaseline||"middle",maxWidth:p.label?.maxWidth??$-j*2,lineHeight:p.label?.lineHeight,verticalAlign:p.label?.verticalAlign,overflow:p.label?.overflow}).replace("<text ",`<text data-viz-role="compartment-entry" data-compartment="${we(G.id)}" data-entry="${we(p.id)}" `);v+=te;}else if(G.label){let p=A-$/2+j+(G.label.dx||0),C=F+G.y+G.height/2+(G.label.dy||0),W=`viz-compartment-label ${G.label.className||""}`,D=ye(p,C,G.label.rich??G.label.text,{className:W,fill:G.label.fill,fontSize:G.label.fontSize,fontWeight:G.label.fontWeight,fontFamily:G.label.fontFamily,textAnchor:G.label.textAnchor||"start",dominantBaseline:G.label.dominantBaseline||"middle",maxWidth:G.label.maxWidth??$-j*2,lineHeight:G.label.lineHeight,verticalAlign:G.label.verticalAlign,overflow:G.label.overflow}).replace("<text ",`<text data-viz-role="compartment-label" data-compartment="${G.id}" `);v+=D;}}let he=s.compartments[0],J=s.collapseIndicator,ie=J===false||typeof J=="object"&&J.visible===false;if((P||!!he.onClick)&&!ie&&s.compartments.length>1){let G=A+$/2-j-6,p=s.compartments[0].height,C=F+p/2,W=(typeof J=="object"?J.color:void 0)??s.style?.stroke??"#111",D=typeof J=="object"?J.render:void 0;D?v+=D(P):P?v+=`<polygon data-viz-role="collapse-indicator" class="viz-collapse-indicator" points="${G},${C-6} ${G+6},${C} ${G},${C+6}" fill="${W}" />`:v+=`<polygon data-viz-role="collapse-indicator" class="viz-collapse-indicator" points="${G},${C-6/2} ${G+12},${C-6/2} ${G+6},${C+6/2}" fill="${W}" />`;}}if(s.label&&!S){let $=A+(s.label.dx||0),I=_+(s.label.dy||0);if(q&&s.container.headerHeight&&"h"in l&&!s.label.dy){let he=l.h;I=_-he/2+s.container.headerHeight/2,$=A+(s.label.dx||0);}let F=`viz-node-label ${s.label.className||""}`,se=ye($,I,s.label.rich??s.label.text,{className:F,fill:s.label.fill,fontSize:s.label.fontSize,fontWeight:s.label.fontWeight,fontFamily:s.label.fontFamily,textAnchor:s.label.textAnchor||"middle",dominantBaseline:s.label.dominantBaseline||"middle",maxWidth:s.label.maxWidth,lineHeight:s.label.lineHeight,verticalAlign:s.label.verticalAlign,overflow:s.label.overflow}).replace("<text ",'<text data-viz-role="node-label" ');v+=se;}if(s.badges&&s.badges.length>0){let $=chunkOZAFCKI7_js.o(l),I=$.width/2,F=$.height/2;for(let j of s.badges){let se=j.fontSize??10,he=3,J=se+he*2,ie=Math.max(se*j.text.length*.7+he*2,J),be,ne;if(j.position==="top-left"?(be=A-I-ie/4,ne=_-F-J/4):j.position==="top-right"?(be=A+I-ie*3/4,ne=_-F-J/4):j.position==="bottom-left"?(be=A-I-ie/4,ne=_+F-J*3/4):(be=A+I-ie*3/4,ne=_+F-J*3/4),v+='<g class="viz-badge" data-viz-role="badge">',j.background){let C=we(j.background);v+=`<rect x="${be}" y="${ne}" width="${ie}" height="${J}" rx="${J/2}" fill="${C}" />`;}let G=j.fill?` fill="${we(j.fill)}"`:"",p=j.text.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");v+=`<text x="${be+ie/2}" y="${ne+J/2}" text-anchor="middle" dominant-baseline="central" font-size="${se}"${G}>${p}</text>`,v+="</g>";}}s.ports&&s.ports.length>0&&s.ports.forEach($=>{let I=A+$.offset.x,F=_+$.offset.y;v+=`<circle cx="${I}" cy="${F}" r="4" class="viz-port" data-viz-role="port" data-node="${s.id}" data-port="${$.id}" />`;});let H=R.get(s.id);return H&&H.length>0&&(v+='<g class="viz-container-children" data-viz-role="container-children">',H.forEach($=>{v+=w($);}),v+="</g>"),v+="</g>",v};return f+='<g class="viz-layer-nodes" data-viz-layer="nodes">',u.forEach(s=>{s.parentId||(f+=w(s));}),f+="</g>",c&&c.length>0&&(f+='<g class="viz-layer-overlays" data-viz-layer="overlays">',c.forEach(s=>{let v=Ve.get(s.id);v&&(f+=v.render({spec:s,nodesById:y,edgesById:h,scene:m,registry:Ve}));}),f+="</g>"),f+="</svg>",f}};function mn(){return new zt}Object.defineProperty(exports,"AnimationBuilder",{enumerable:true,get:function(){return chunkC27QMQJJ_js.c}});Object.defineProperty(exports,"OVERLAY_RUNTIME_DIRTY",{enumerable:true,get:function(){return chunkC27QMQJJ_js.a}});Object.defineProperty(exports,"buildAnimationSpec",{enumerable:true,get:function(){return chunkC27QMQJJ_js.d}});Object.defineProperty(exports,"createBuilderPlayback",{enumerable:true,get:function(){return chunkC27QMQJJ_js.f}});Object.defineProperty(exports,"createScenePlayback",{enumerable:true,get:function(){return chunkC27QMQJJ_js.e}});Object.defineProperty(exports,"playAnimationSpec",{enumerable:true,get:function(){return chunkC27QMQJJ_js.g}});Object.defineProperty(exports,"angleBetween",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.d}});Object.defineProperty(exports,"computeEdgeEndpoints",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.e}});Object.defineProperty(exports,"computeEdgePath",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.f}});Object.defineProperty(exports,"computeSelfLoop",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.g}});Object.defineProperty(exports,"distanceSquare",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.i}});Object.defineProperty(exports,"edgeDistance",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.n}});Object.defineProperty(exports,"getEffectiveNodeBounds",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.j}});Object.defineProperty(exports,"hitTest",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.k}});Object.defineProperty(exports,"hitTestRect",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.l}});Object.defineProperty(exports,"nearestPort",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.m}});Object.defineProperty(exports,"pointInRect",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.h}});Object.defineProperty(exports,"setupPanZoom",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.a}});Object.defineProperty(exports,"circularLayout",{enumerable:true,get:function(){return chunkNHGHIK6R_js.a}});Object.defineProperty(exports,"gridLayout",{enumerable:true,get:function(){return chunkNHGHIK6R_js.b}});Object.defineProperty(exports,"deserializeScene",{enumerable:true,get:function(){return chunkE3Z7QMXI_js.b}});Object.defineProperty(exports,"serializeScene",{enumerable:true,get:function(){return chunkE3Z7QMXI_js.a}});Object.defineProperty(exports,"findPortNearest",{enumerable:true,get:function(){return chunkT5O2PDL6_js.d}});Object.defineProperty(exports,"getEquidistantPorts",{enumerable:true,get:function(){return chunkT5O2PDL6_js.b}});Object.defineProperty(exports,"registerPerimeterStrategy",{enumerable:true,get:function(){return chunkT5O2PDL6_js.a}});Object.defineProperty(exports,"toNodePorts",{enumerable:true,get:function(){return chunkT5O2PDL6_js.c}});Object.defineProperty(exports,"CoreIconRegistry",{enumerable:true,get:function(){return chunkOZAFCKI7_js.a}});Object.defineProperty(exports,"computeNodeAnchorAtAngle",{enumerable:true,get:function(){return chunkOZAFCKI7_js.j}});Object.defineProperty(exports,"defaultCoreIconRegistry",{enumerable:true,get:function(){return chunkOZAFCKI7_js.b}});Object.defineProperty(exports,"findPort",{enumerable:true,get:function(){return chunkOZAFCKI7_js.m}});Object.defineProperty(exports,"getDefaultPorts",{enumerable:true,get:function(){return chunkOZAFCKI7_js.k}});Object.defineProperty(exports,"getNodeBoundingBox",{enumerable:true,get:function(){return chunkOZAFCKI7_js.o}});Object.defineProperty(exports,"getNodePorts",{enumerable:true,get:function(){return chunkOZAFCKI7_js.l}});Object.defineProperty(exports,"registerIcon",{enumerable:true,get:function(){return chunkOZAFCKI7_js.c}});Object.defineProperty(exports,"resolvePortPosition",{enumerable:true,get:function(){return chunkOZAFCKI7_js.n}});exports.CoreAnimationRegistry=dt;exports.CoreOverlayRegistry=ut;exports.DEFAULT_VIZ_CSS=at;exports.OverlayBuilder=_e;exports.RichLabelBuilderImpl=Oe;exports.buildOverlaySpecs=Bi;exports.collectEdgeLabels=De;exports.coreCircleOverlay=Er;exports.coreDataPointOverlay=Ar;exports.coreFlowAnimation=nr;exports.coreGridLabelsOverlay=Sr;exports.coreGroupOverlay=wr;exports.coreRectOverlay=kr;exports.coreSignalOverlay=xr;exports.coreTextOverlay=zr;exports.defaultCoreAnimationRegistry=Te;exports.defaultCoreOverlayRegistry=Ve;exports.resolveDasharray=$e;exports.resolveEdgeGeometry=xi;exports.resolveEdgeGeometryFromData=ct;exports.resolveEdgeLabelPosition=Ge;exports.viz=mn;
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import {d as d$1,b,f as f$1,a as a$1}from'./chunk-EGTVJ43E.mjs';export{c as AnimationBuilder,a as OVERLAY_RUNTIME_DIRTY,d as buildAnimationSpec,f as createBuilderPlayback,e as createScenePlayback,g as playAnimationSpec}from'./chunk-EGTVJ43E.mjs';import {g,e,f,c,a,j}from'./chunk-46IHGFPN.mjs';export{d as angleBetween,e as computeEdgeEndpoints,f as computeEdgePath,g as computeSelfLoop,i as distanceSquare,n as edgeDistance,j as getEffectiveNodeBounds,k as hitTest,l as hitTestRect,m as nearestPort,h as pointInRect,a as setupPanZoom}from'./chunk-46IHGFPN.mjs';export{a as circularLayout,b as gridLayout}from'./chunk-L3BMSH63.mjs';export{b as deserializeScene,a as serializeScene}from'./chunk-FXFCCGJT.mjs';export{d as findPortNearest,b as getEquidistantPorts,a as registerPerimeterStrategy,c as toNodePorts}from'./chunk-5JIM7AZ4.mjs';import {d,f as f$2,g as g$1,b as b$1,o,e as e$1,h}from'./chunk-I5FQBS5N.mjs';export{a as CoreIconRegistry,j as computeNodeAnchorAtAngle,b as defaultCoreIconRegistry,m as findPort,k as getDefaultPorts,o as getNodeBoundingBox,l as getNodePorts,c as registerIcon,n as resolvePortPosition}from'./chunk-I5FQBS5N.mjs';var at=`
1
+ import {d as d$1,b,f as f$1,a as a$1}from'./chunk-LQJHDSRP.mjs';export{c as AnimationBuilder,a as OVERLAY_RUNTIME_DIRTY,d as buildAnimationSpec,f as createBuilderPlayback,e as createScenePlayback,g as playAnimationSpec}from'./chunk-LQJHDSRP.mjs';import {g,e,f,c,a,j}from'./chunk-GY6N3GFA.mjs';export{d as angleBetween,e as computeEdgeEndpoints,f as computeEdgePath,g as computeSelfLoop,i as distanceSquare,n as edgeDistance,j as getEffectiveNodeBounds,k as hitTest,l as hitTestRect,m as nearestPort,h as pointInRect,a as setupPanZoom}from'./chunk-GY6N3GFA.mjs';export{a as circularLayout,b as gridLayout}from'./chunk-L3BMSH63.mjs';export{b as deserializeScene,a as serializeScene}from'./chunk-FXFCCGJT.mjs';export{d as findPortNearest,b as getEquidistantPorts,a as registerPerimeterStrategy,c as toNodePorts}from'./chunk-5JIM7AZ4.mjs';import {d,f as f$2,g as g$1,b as b$1,o,e as e$1,h}from'./chunk-I5FQBS5N.mjs';export{a as CoreIconRegistry,j as computeNodeAnchorAtAngle,b as defaultCoreIconRegistry,m as findPort,k as getDefaultPorts,o as getNodeBoundingBox,l as getNodePorts,c as registerIcon,n as resolvePortPosition}from'./chunk-I5FQBS5N.mjs';var at=`
2
2
  .viz-canvas {
3
3
  width: 100%;
4
4
  height: 100%;
@@ -103,11 +103,11 @@ import {d as d$1,b,f as f$1,a as a$1}from'./chunk-EGTVJ43E.mjs';export{c as Anim
103
103
  stroke-linejoin: round;
104
104
  stroke-width: 2;
105
105
  }
106
- `;var dt=class{nodeAnims=new Map;edgeAnims=new Map;constructor(){}registerNode(e,t){return this.nodeAnims.set(e,t),this}registerEdge(e,t){return this.edgeAnims.set(e,t),this}getNodeRenderer(e){return this.nodeAnims.get(e)}getEdgeRenderer(e){return this.edgeAnims.get(e)}},nr={getClass:()=>"viz-anim-flow",getStyle:({spec:r})=>({"--viz-anim-duration":r.params?.duration??"2s"})},Te=new dt().registerEdge("flow",nr);function xi(r,e){let t=r.edges.find(n=>n.id===e);if(!t)return null;let i=new Map(r.nodes.map(n=>[n.id,n]));return ct(t,i)}function ct(r,e$1){let t=r.from?e$1.get(r.from)??null:null,i=r.to?e$1.get(r.to)??null:null;if(r.from&&!t||r.to&&!i||!t&&!r.fromAt&&!i&&!r.toAt)return null;let n=!!(t&&i&&t===i),a,d,c;if(n){let o=g(t,r);a=o,d=o.exitPoint,c=o.entryPoint;}else {let o=e(t,i,r);a=f(o.start,o.end,r.routing,r.waypoints),d=o.start,c=o.end;}return {...a,startAnchor:d,endAnchor:c,startLabel:a.start,endLabel:a.end,waypoints:r.waypoints??[],isSelfLoop:n}}var or=/[MLQC]|-?(?:\d*\.\d+|\d+)(?:e[-+]?\d+)?/gi,_t=24;function Dt(r,e,t){let i=ct(r,e);return i?sr(i.d,t):null}function sr(r,e){let t=ar(r);if(t.length===0)return null;let i=t.filter(o=>o.type!=="M").map(o=>dr(o));if(i.length===0)return t.find(u=>u.type==="M")?.to??null;let n=i.reduce((o,u)=>o+u.length,0);if(n===0)return i[0]?.samples[0]?.point??null;let a=lr(e),d=n*a,c=0;for(let o of i){if(c+o.length>=d)return cr(o,d-c);c+=o.length;}return i[i.length-1]?.samples.at(-1)?.point??null}function lr(r){return !Number.isFinite(r)||r<=0?0:r>=1?1:r}function ar(r){let e=r.match(or);if(!e||e.length===0)return [];let t=[],i=null,n=0;for(;n<e.length;){let a=e[n++];if(!a)return [];switch(a){case "M":{let d=Ne(e,n);if(!d)return [];n+=2,i=d,t.push({type:"M",to:d});break}case "L":{if(!i)return [];let d=Ne(e,n);if(!d)return [];n+=2,t.push({type:"L",from:i,to:d}),i=d;break}case "Q":{if(!i)return [];let d=Ne(e,n),c=Ne(e,n+2);if(!d||!c)return [];n+=4,t.push({type:"Q",from:i,control:d,to:c}),i=c;break}case "C":{if(!i)return [];let d=Ne(e,n),c=Ne(e,n+2),o=Ne(e,n+4);if(!d||!c||!o)return [];n+=6,t.push({type:"C",from:i,control1:d,control2:c,to:o}),i=o;break}default:return []}}return t}function Ne(r,e){let t=Number(r[e]),i=Number(r[e+1]);return !Number.isFinite(t)||!Number.isFinite(i)?null:{x:t,y:i}}function dr(r){switch(r.type){case "L":return Mt([r.from,r.to]);case "Q":return Gt(_t,e=>ur(r.from,r.control,r.to,e));case "C":return Gt(_t,e=>gr(r.from,r.control1,r.control2,r.to,e))}}function Gt(r,e){let t=[];for(let i=0;i<=r;i++)t.push(e(i/r));return Mt(t)}function Mt(r){if(r.length===0)return {length:0,samples:[]};let e=[{distance:0,point:r[0]}],t=0;for(let i=1;i<r.length;i++)t+=mr(r[i-1],r[i]),e.push({distance:t,point:r[i]});return {length:t,samples:e}}function cr(r,e){let t=r.samples[0],i=r.samples.at(-1);if(!t)return {x:0,y:0};if(!i||e<=0)return t.point;if(e>=r.length)return i.point;for(let n=1;n<r.samples.length;n++){let a=r.samples[n-1],d=r.samples[n];if(d.distance>=e){let c=d.distance-a.distance,o=c===0?0:(e-a.distance)/c;return fr(a.point,d.point,o)}}return i.point}function ur(r,e,t,i){let n=1-i;return {x:n*n*r.x+2*n*i*e.x+i*i*t.x,y:n*n*r.y+2*n*i*e.y+i*i*t.y}}function gr(r,e,t,i,n){let a=1-n;return {x:a*a*a*r.x+3*a*a*n*e.x+3*a*n*n*t.x+n*n*n*i.x,y:a*a*a*r.y+3*a*a*n*e.y+3*a*n*n*t.y+n*n*n*i.y}}function mr(r,e){let t=e.x-r.x,i=e.y-r.y;return Math.sqrt(t*t+i*i)}function fr(r,e,t){return {x:r.x+(e.x-r.x)*t,y:r.y+(e.y-r.y)*t}}var ut=class{overlays=new Map;register(e,t){return this.overlays.set(e,t),this}get(e){return this.overlays.get(e)}};function hr(r,e,t){if(r.edgeId)return e.get(r.edgeId)??null;if(!r.followEdge)return null;let i=t.edges.filter(n=>n.from===r.from&&n.to===r.to);return i.length===1?i[0]:null}function pr(r){return Array.isArray(r.chain)}function yr(r){if(pr(r)){let e=r.chain.at(-1);if(!e)return null;let t=Number.isNaN(r.progress)?0:r.progress;if(t>=r.chain.length)return {hop:e,progress:1,parkedNodeId:r.parkAt??e.to,fallbackParkedNodeId:e.to,shouldPark:true};let i=!Number.isFinite(t)||t<=0?0:t,n=Math.min(Math.floor(i),r.chain.length-1),a=r.chain[n];return a?{hop:a,progress:i-n,parkedNodeId:r.parkAt??e.to,fallbackParkedNodeId:e.to,shouldPark:false}:null}return {hop:{from:r.from,to:r.to,followEdge:r.followEdge,edgeId:r.edgeId},progress:r.progress,parkedNodeId:r.parkAt??r.to,fallbackParkedNodeId:r.to,shouldPark:Number.isFinite(r.progress)&&r.progress>=1&&(r.resting===true||r.parkAt!==void 0)}}function br(r,e,t,i){let n=i.get(r)??i.get(e);if(!n)return null;let a=d(n);return {x:a.x+(t.parkOffsetX??0),y:a.y+(t.parkOffsetY??0)}}function vr(r,e,t,i){let n=yr(r);if(!n)return null;if(n.shouldPark)return br(n.parkedNodeId,n.fallbackParkedNodeId,r,e);let a=e.get(n.hop.from),d$1=e.get(n.hop.to);if(!a||!d$1)return null;let c=hr(n.hop,t,i);if(c){let g=Dt(c,e,n.progress);if(g)return g}let o=d(a),u=d(d$1);return {x:o.x+(u.x-o.x)*n.progress,y:o.y+(u.y-o.y)*n.progress}}var xr={render:({spec:r,nodesById:e,edgesById:t,scene:i})=>{let n=vr(r.params,e,t,i);if(!n)return "";let a=Math.abs(r.params.magnitude??1);a>1&&(a=1);let d=2+a*4,c=r.className??"viz-signal";return `
106
+ `;var dt=class{nodeAnims=new Map;edgeAnims=new Map;constructor(){}registerNode(e,t){return this.nodeAnims.set(e,t),this}registerEdge(e,t){return this.edgeAnims.set(e,t),this}getNodeRenderer(e){return this.nodeAnims.get(e)}getEdgeRenderer(e){return this.edgeAnims.get(e)}},nr={getClass:()=>"viz-anim-flow",getStyle:({spec:r})=>({"--viz-anim-duration":r.params?.duration??"2s"})},Te=new dt().registerEdge("flow",nr);function xi(r,e){let t=r.edges.find(n=>n.id===e);if(!t)return null;let i=new Map(r.nodes.map(n=>[n.id,n]));return ct(t,i)}function ct(r,e$1){let t=r.from?e$1.get(r.from)??null:null,i=r.to?e$1.get(r.to)??null:null;if(r.from&&!t||r.to&&!i||!t&&!r.fromAt&&!i&&!r.toAt)return null;let n=!!(t&&i&&t===i),a,d,c;if(n){let o=g(t,r);a=o,d=o.exitPoint,c=o.entryPoint;}else {let o=e(t,i,r);a=f(o.start,o.end,r.routing,r.waypoints),d=o.start,c=o.end;}return {...a,startAnchor:d,endAnchor:c,startLabel:a.start,endLabel:a.end,waypoints:r.waypoints??[],isSelfLoop:n}}var or=/[MLQC]|-?(?:\d*\.\d+|\d+)(?:e[-+]?\d+)?/gi,_t=24;function Dt(r,e,t){let i=ct(r,e);return i?sr(i.d,t):null}function sr(r,e){let t=ar(r);if(t.length===0)return null;let i=t.filter(o=>o.type!=="M").map(o=>dr(o));if(i.length===0)return t.find(u=>u.type==="M")?.to??null;let n=i.reduce((o,u)=>o+u.length,0);if(n===0)return i[0]?.samples[0]?.point??null;let a=lr(e),d=n*a,c=0;for(let o of i){if(c+o.length>=d)return cr(o,d-c);c+=o.length;}return i[i.length-1]?.samples.at(-1)?.point??null}function lr(r){return !Number.isFinite(r)||r<=0?0:r>=1?1:r}function ar(r){let e=r.match(or);if(!e||e.length===0)return [];let t=[],i=null,n=0;for(;n<e.length;){let a=e[n++];if(!a)return [];switch(a){case "M":{let d=Ne(e,n);if(!d)return [];n+=2,i=d,t.push({type:"M",to:d});break}case "L":{if(!i)return [];let d=Ne(e,n);if(!d)return [];n+=2,t.push({type:"L",from:i,to:d}),i=d;break}case "Q":{if(!i)return [];let d=Ne(e,n),c=Ne(e,n+2);if(!d||!c)return [];n+=4,t.push({type:"Q",from:i,control:d,to:c}),i=c;break}case "C":{if(!i)return [];let d=Ne(e,n),c=Ne(e,n+2),o=Ne(e,n+4);if(!d||!c||!o)return [];n+=6,t.push({type:"C",from:i,control1:d,control2:c,to:o}),i=o;break}default:return []}}return t}function Ne(r,e){let t=Number(r[e]),i=Number(r[e+1]);return !Number.isFinite(t)||!Number.isFinite(i)?null:{x:t,y:i}}function dr(r){switch(r.type){case "L":return Mt([r.from,r.to]);case "Q":return Gt(_t,e=>ur(r.from,r.control,r.to,e));case "C":return Gt(_t,e=>gr(r.from,r.control1,r.control2,r.to,e))}}function Gt(r,e){let t=[];for(let i=0;i<=r;i++)t.push(e(i/r));return Mt(t)}function Mt(r){if(r.length===0)return {length:0,samples:[]};let e=[{distance:0,point:r[0]}],t=0;for(let i=1;i<r.length;i++)t+=mr(r[i-1],r[i]),e.push({distance:t,point:r[i]});return {length:t,samples:e}}function cr(r,e){let t=r.samples[0],i=r.samples.at(-1);if(!t)return {x:0,y:0};if(!i||e<=0)return t.point;if(e>=r.length)return i.point;for(let n=1;n<r.samples.length;n++){let a=r.samples[n-1],d=r.samples[n];if(d.distance>=e){let c=d.distance-a.distance,o=c===0?0:(e-a.distance)/c;return fr(a.point,d.point,o)}}return i.point}function ur(r,e,t,i){let n=1-i;return {x:n*n*r.x+2*n*i*e.x+i*i*t.x,y:n*n*r.y+2*n*i*e.y+i*i*t.y}}function gr(r,e,t,i,n){let a=1-n;return {x:a*a*a*r.x+3*a*a*n*e.x+3*a*n*n*t.x+n*n*n*i.x,y:a*a*a*r.y+3*a*a*n*e.y+3*a*n*n*t.y+n*n*n*i.y}}function mr(r,e){let t=e.x-r.x,i=e.y-r.y;return Math.sqrt(t*t+i*i)}function fr(r,e,t){return {x:r.x+(e.x-r.x)*t,y:r.y+(e.y-r.y)*t}}var ut=class{overlays=new Map;register(e,t){return this.overlays.set(e,t),this}get(e){return this.overlays.get(e)}};function hr(r,e,t){if(r.edgeId)return e.get(r.edgeId)??null;if(!r.followEdge)return null;let i=t.edges.filter(n=>n.from===r.from&&n.to===r.to);return i.length===1?i[0]:null}function pr(r){return Array.isArray(r.chain)}function yr(r){if(pr(r)){let e=r.chain.at(-1);if(!e)return null;let t=Number.isNaN(r.progress)?0:r.progress;if(t>=r.chain.length)return {hop:e,progress:1,parkedNodeId:r.parkAt??e.to,fallbackParkedNodeId:e.to,shouldPark:true};let i=!Number.isFinite(t)||t<=0?0:t,n=Math.min(Math.floor(i),r.chain.length-1),a=r.chain[n];return a?{hop:a,progress:i-n,parkedNodeId:r.parkAt??e.to,fallbackParkedNodeId:e.to,shouldPark:false}:null}return {hop:{from:r.from,to:r.to,followEdge:r.followEdge,edgeId:r.edgeId},progress:r.progress,parkedNodeId:r.parkAt??r.to,fallbackParkedNodeId:r.to,shouldPark:Number.isFinite(r.progress)&&r.progress>=1&&(r.resting===true||r.parkAt!==void 0)}}function br(r,e,t,i){let n=i.get(r)??i.get(e);if(!n)return null;let a=d(n);return {x:a.x+(t.parkOffsetX??0),y:a.y+(t.parkOffsetY??0)}}function vr(r,e,t,i){let n=yr(r);if(!n)return null;if(n.shouldPark)return br(n.parkedNodeId,n.fallbackParkedNodeId,r,e);let a=e.get(n.hop.from),d$1=e.get(n.hop.to);if(!a||!d$1)return null;let c=hr(n.hop,t,i);if(c){let g=Dt(c,e,n.progress);if(g)return g}let o=d(a),u=d(d$1);return {x:o.x+(u.x-o.x)*n.progress,y:o.y+(u.y-o.y)*n.progress}}var xr={render:({spec:r,nodesById:e,edgesById:t,scene:i})=>{let n=vr(r.params,e,t,i);if(!n)return "";let a=Math.abs(r.params.magnitude??1);a>1&&(a=1);let d=2+a*4,c=r.className??"viz-signal",o=r.params.color,u=r.params.glowColor??o,g=o?` style="fill: ${o}"`:"",m=u?` filter="drop-shadow(0 0 3px ${u})"`:"";return `
107
107
  <g transform="translate(${n.x}, ${n.y})">
108
- <g class="${c}">
108
+ <g class="${c}"${g}>
109
109
  <circle r="10" fill="transparent" stroke="none" />
110
- <circle r="${d}" class="viz-signal-shape" />
110
+ <circle r="${d}" class="viz-signal-shape"${m} />
111
111
  </g>
112
112
  </g>
113
113
  `}},Sr={render:({spec:r,scene:e})=>{let t=e.grid;if(!t)return "";let{w:i,h:n}=e.viewBox,{colLabels:a,rowLabels:d,yOffset:c=20,xOffset:o=20}=r.params,u=(i-t.padding.x*2)/t.cols,g=(n-t.padding.y*2)/t.rows,m="";return a&&Object.entries(a).forEach(([y,h])=>{let f=parseInt(y,10),E=t.padding.x+f*u+u/2,B=r.className||"viz-grid-label";m+=`<text x="${E}" y="${c}" class="${B}" text-anchor="middle">${h}</text>`;}),d&&Object.entries(d).forEach(([y,h])=>{let f=parseInt(y,10),E=t.padding.y+f*g+g/2,B=r.className||"viz-grid-label";m+=`<text x="${o}" y="${E}" dy=".35em" class="${B}" text-anchor="middle">${h}</text>`;}),m}},Ar={render:({spec:r,nodesById:e})=>{let{points:t}=r.params,i="";return t.forEach(n=>{let a=e.get(n.currentNodeId);if(!a)return;let d=parseInt(n.id.split("-")[1]||"0",10),c=(d%5-2)*10,o=(d%3-1)*10,u=a.pos.x+c,g=a.pos.y+o,m=r.className??"viz-data-point";i+=`<circle data-id="${n.id}" cx="${u}" cy="${g}" r="6" class="${m}" />`;}),i},update:({spec:r,nodesById:e},t)=>{let{points:i}=r.params,n="http://www.w3.org/2000/svg",a=new Map;Array.from(t.children).forEach(c=>{if(c.tagName==="circle"){let o=c.getAttribute("data-id");o&&a.set(o,c);}});let d=new Set;i.forEach(c=>{let o=e.get(c.currentNodeId);if(!o)return;d.add(c.id);let u=parseInt(c.id.split("-")[1]||"0",10),g=(u%5-2)*10,m=(u%3-1)*10,y=o.pos.x+g,h=o.pos.y+m,f=a.get(c.id);f||(f=document.createElementNS(n,"circle"),f.setAttribute("data-id",c.id),f.setAttribute("r","6"),t.appendChild(f)),f.setAttribute("cx",String(y)),f.setAttribute("cy",String(h));let E=r.className??"viz-data-point";f.getAttribute("class")!==E&&f.setAttribute("class",E);}),a.forEach((c,o)=>{d.has(o)||c.remove();});}},kr={render:({spec:r,nodesById:e})=>{let t=Wt(r.params,e);if(!t)return "";let{w:i,h:n,rx:a,ry:d,opacity:c,fill:o,stroke:u,strokeWidth:g}=r.params,m=r.className??"viz-overlay-rect",y=a!==void 0?` rx="${a}"`:"",h=d!==void 0?` ry="${d}"`:"",f=c!==void 0?` opacity="${c}"`:"",E=o===void 0,B=u===void 0,b=o??"#3b82f6",z=u??"#3b82f6",R=g??3,w=E?' fill-opacity="0.12"':"",s=B?' stroke-opacity="0.9"':"";return `<rect x="${t.x}" y="${t.y}" width="${i}" height="${n}" fill="${b}"${w} stroke="${z}"${s} stroke-width="${R}"${y}${h}${f} class="${m}" />`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Wt(r.params,e),{w:a,h:d,rx:c,ry:o,opacity:u,fill:g,stroke:m,strokeWidth:y}=r.params,h=r.className??"viz-overlay-rect",f=t.querySelector("rect");if(!n){f?.remove();return}f||(f=document.createElementNS(i,"rect"),t.appendChild(f)),f.setAttribute("x",String(n.x)),f.setAttribute("y",String(n.y)),f.setAttribute("width",String(a)),f.setAttribute("height",String(d)),g===void 0?(f.setAttribute("fill","#3b82f6"),f.setAttribute("fill-opacity","0.12")):(f.setAttribute("fill",g),f.removeAttribute("fill-opacity")),m===void 0?(f.setAttribute("stroke","#3b82f6"),f.setAttribute("stroke-opacity","0.9")):(f.setAttribute("stroke",m),f.removeAttribute("stroke-opacity")),f.setAttribute("stroke-width",String(y??3)),c!==void 0?f.setAttribute("rx",String(c)):f.removeAttribute("rx"),o!==void 0?f.setAttribute("ry",String(o)):f.removeAttribute("ry"),u!==void 0?f.setAttribute("opacity",String(u)):f.removeAttribute("opacity"),f.setAttribute("class",h);}},Er={render:({spec:r,nodesById:e})=>{let t=Xe(r.params,e);if(!t)return "";let{r:i,opacity:n,fill:a,stroke:d,strokeWidth:c}=r.params,o=r.className??"viz-overlay-circle",u=n!==void 0?` opacity="${n}"`:"",g=a===void 0,m=d===void 0,y=a??"#3b82f6",h=d??"#3b82f6",f=c??3,E=g?' fill-opacity="0.12"':"",B=m?' stroke-opacity="0.9"':"";return `<circle cx="${t.x}" cy="${t.y}" r="${i}" fill="${y}"${E} stroke="${h}"${B} stroke-width="${f}"${u} class="${o}" />`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Xe(r.params,e),{r:a,opacity:d,fill:c,stroke:o,strokeWidth:u}=r.params,g=r.className??"viz-overlay-circle",m=t.querySelector("circle");if(!n){m?.remove();return}m||(m=document.createElementNS(i,"circle"),t.appendChild(m)),m.setAttribute("cx",String(n.x)),m.setAttribute("cy",String(n.y)),m.setAttribute("r",String(a)),c===void 0?(m.setAttribute("fill","#3b82f6"),m.setAttribute("fill-opacity","0.12")):(m.setAttribute("fill",c),m.removeAttribute("fill-opacity")),o===void 0?(m.setAttribute("stroke","#3b82f6"),m.setAttribute("stroke-opacity","0.9")):(m.setAttribute("stroke",o),m.removeAttribute("stroke-opacity")),m.setAttribute("stroke-width",String(u??3)),d!==void 0?m.setAttribute("opacity",String(d)):m.removeAttribute("opacity"),m.setAttribute("class",g);}},zr={render:({spec:r,nodesById:e})=>{let t=Xe(r.params,e);if(!t)return "";let{text:i,opacity:n,fill:a,fontSize:d,fontWeight:c,textAnchor:o,dominantBaseline:u}=r.params,g=r.className??"viz-overlay-text",m=n!==void 0?` opacity="${n}"`:"",y=d!==void 0?` font-size="${d}"`:"",h=c!==void 0?` font-weight="${c}"`:"",f=o!==void 0?` text-anchor="${o}"`:"",E=u!==void 0?` dominant-baseline="${u}"`:"",B=a??"#111";return `<text x="${t.x}" y="${t.y}" fill="${B}"${m}${y}${h}${f}${E} class="${g}">${i}</text>`},update:({spec:r,nodesById:e},t)=>{let i="http://www.w3.org/2000/svg",n=Xe(r.params,e),{text:a,opacity:d,fill:c,fontSize:o,fontWeight:u,textAnchor:g,dominantBaseline:m}=r.params,y=r.className??"viz-overlay-text",h=t.querySelector("text");if(!n){h?.remove();return}h||(h=document.createElementNS(i,"text"),t.appendChild(h)),h.setAttribute("x",String(n.x)),h.setAttribute("y",String(n.y)),h.setAttribute("fill",c??"#111"),d!==void 0?h.setAttribute("opacity",String(d)):h.removeAttribute("opacity"),o!==void 0?h.setAttribute("font-size",String(o)):h.removeAttribute("font-size"),u!==void 0?h.setAttribute("font-weight",String(u)):h.removeAttribute("font-weight"),g!==void 0?h.setAttribute("text-anchor",g):h.removeAttribute("text-anchor"),m!==void 0?h.setAttribute("dominant-baseline",m):h.removeAttribute("dominant-baseline"),h.setAttribute("class",y),h.textContent=a;}};function It(r){let e=r.x??0,t=r.y??0,i=r.scale??1,n=r.rotation??0,a=[`translate(${e}, ${t})`];return n&&a.push(`rotate(${n})`),i!==1&&a.push(`scale(${i})`),a.join(" ")}function Ht(r){return r<0?0:r>1?1:r}function gt(r){return typeof r.nodeId=="string"&&r.nodeId.length>0}function mt(r,e){let t=e.get(r.nodeId);if(!t)return null;let i=d(t);return {x:i.x+(r.offsetX??0),y:i.y+(r.offsetY??0)}}function Xe(r,e){return gt(r)?mt(r,e):{x:r.x,y:r.y}}function Wt(r,e){if(gt(r)){let t=mt(r,e);return t?{x:t.x-r.w/2,y:t.y-r.h/2}:null}return {x:r.x,y:r.y}}function qt(r,e){let t=r.x??0,i=r.y??0,n=t,a=i;if(r.from&&r.to){let g=e.get(r.from),m=e.get(r.to);if(g&&m){let y=Ht(r.progress??0),h=d(g),f=d(m);n=h.x+(f.x-h.x)*y+t,a=h.y+(f.y-h.y)*y+i;}}else if(gt(r)){let g=mt(r,e);if(!g)return null;n=g.x+t,a=g.y+i;}let d$1=r.scale??1,c=r.magnitude,o=c===void 0?1:.85+.3*Ht(Math.abs(c)),u=d$1*o;return {x:n,y:a,scale:u,rotation:r.rotation??0}}var wr={render:({spec:r,nodesById:e,edgesById:t,scene:i,registry:n})=>{let{children:a,opacity:d}=r.params,c=qt(r.params,e);if(!c)return "";let o=It(c),u=d!==void 0?` opacity="${d}"`:"",g=n;if(!g)return `<g transform="${o}"${u}></g>`;let m=`<g transform="${o}"${u}>`;return a.forEach((y,h)=>{let f=g.get(y.id);if(!f)return;let E={spec:y,nodesById:e,edgesById:t,scene:i,registry:g},B=y.key?`key:${y.key}`:`idx:${h}:${y.id}`;m+=`<g data-viz-role="overlay-child" data-overlay-child-id="${B}">`,m+=f.render(E),m+="</g>";}),m+="</g>",m},update:({spec:r,nodesById:e,edgesById:t,scene:i,registry:n},a)=>{let d=n;if(!d)return;let{children:c,opacity:o}=r.params,u=qt(r.params,e);if(!u){a.removeAttribute("transform"),a.removeAttribute("opacity"),a.innerHTML="";return}a.setAttribute("transform",It(u)),o!==void 0?a.setAttribute("opacity",String(o)):a.removeAttribute("opacity");let g="http://www.w3.org/2000/svg",m=new Map;Array.from(a.children).forEach(h=>{if(h instanceof SVGGElement){let f=h.getAttribute("data-overlay-child-id");f&&m.set(f,h);}});let y=new Set;c.forEach((h,f)=>{let E=d.get(h.id);if(!E)return;let B=h.key?`key:${h.key}`:`idx:${f}:${h.id}`;y.add(B);let b=m.get(B);b||(b=document.createElementNS(g,"g"),b.setAttribute("data-viz-role","overlay-child"),b.setAttribute("data-overlay-child-id",B),a.appendChild(b));let z={spec:h,nodesById:e,edgesById:t,scene:i,registry:d};E.update?E.update(z,b):b.innerHTML=E.render(z);}),m.forEach((h,f)=>{y.has(f)||h.remove();});}},Ve=new ut().register("signal",xr).register("grid-labels",Sr).register("data-points",Ar).register("rect",kr).register("circle",Er).register("text",zr).register("group",wr);var _e=class r{specs=[];keyCounters=new Map;add(e,t,i){let n=i?.className,a=i?.key;if(!a&&this.specs.some(c=>c.id===e&&(c.key===void 0||c.key===""))){let c=(this.keyCounters.get(e)??0)+1;this.keyCounters.set(e,c),a=`${e}#${c}`;}return this.specs.push({id:e,params:t,key:a,className:n}),this}remove(e){for(let t=this.specs.length-1;t>=0;t--){let i=this.specs[t];if(!i)continue;let n=i.key===e,a=!i.key&&i.id===e;(n||a)&&this.specs.splice(t,1);}return this}clear(){return this.specs.length=0,this.keyCounters.clear(),this}build(){return [...this.specs]}rect(e,t){return this.add("rect",e,t)}circle(e,t){return this.add("circle",e,t)}text(e,t){return this.add("text",e,t)}group(e,t,i){let n=new r;t(n);let a=n.build();return this.add("group",{...e,children:a},i)}};function Bi(r){let e=new _e;return r(e),e.build()}var Br={solid:"",dashed:"8, 4",dotted:"2, 4","dash-dot":"8, 4, 2, 4"};function $e(r){return !r||r==="solid"?"":Br[r]??r}function Ge(r,e){let t=r.position==="start"?e.start:r.position==="end"?e.end:e.mid;return {x:t.x+(r.dx||0),y:t.y+(r.dy||0)}}function De(r){return r.labels&&r.labels.length>0?r.labels:r.label?[r.label]:[]}var Q="http://www.w3.org/2000/svg",Qe={dx:2,dy:2,blur:4,color:"rgba(0,0,0,0.2)"};function Cr(r){return {dx:r.dx??Qe.dx,dy:r.dy??Qe.dy,blur:r.blur??Qe.blur,color:r.color??Qe.color}}function Nr(r){let e=r.color.replace(/[^a-zA-Z0-9]/g,"_");return `viz-shadow-${r.dx}-${r.dy}-${r.blur}-${e}`}function Vr(r,e){let t=Cr(e),i=Nr(t);if(!r.querySelector(`#${CSS.escape(i)}`)){let n=r.querySelector("defs");if(n){let a=document.createElementNS(Q,"filter");a.setAttribute("id",i),a.setAttribute("x","-50%"),a.setAttribute("y","-50%"),a.setAttribute("width","200%"),a.setAttribute("height","200%");let d=document.createElementNS(Q,"feDropShadow");d.setAttribute("dx",String(t.dx)),d.setAttribute("dy",String(t.dy)),d.setAttribute("stdDeviation",String(t.blur)),d.setAttribute("flood-color",t.color),d.setAttribute("flood-opacity","1"),a.appendChild(d),n.appendChild(a);}}return i}function $r(r){return `viz-sketch-${r}`}function Pr(r,e){let t=(r^e*2654435761)>>>0|1;return t^=t<<13,t^=t>>>17,t^=t<<5,(t>>>0)/4294967296}function Me(r,e,t,i){return t+Pr(r,e)*(i-t)}function Ft(r,e){let t=$r(e);if(!r.querySelector(`#${CSS.escape(t)}`)){let i=r.querySelector("defs");if(i){let n=document.createElementNS(Q,"filter");n.setAttribute("id",t),n.setAttribute("filterUnits","userSpaceOnUse"),n.setAttribute("x","-10000"),n.setAttribute("y","-10000"),n.setAttribute("width","20000"),n.setAttribute("height","20000");let a=e+37,d=Me(e,1,.009,.015).toFixed(4),c=Me(e,2,2.5,4).toFixed(1),o=Me(e,3,3,5).toFixed(1),u=Me(e,4,.3,1.6).toFixed(2),g=Me(e,5,.2,1.3).toFixed(2),m=document.createElementNS(Q,"feTurbulence");m.setAttribute("type","fractalNoise"),m.setAttribute("baseFrequency","0.008"),m.setAttribute("numOctaves","2"),m.setAttribute("seed",String(e)),m.setAttribute("result","n1"),n.appendChild(m);let y=document.createElementNS(Q,"feTurbulence");y.setAttribute("type","fractalNoise"),y.setAttribute("baseFrequency",d),y.setAttribute("numOctaves","2"),y.setAttribute("seed",String(a)),y.setAttribute("result","n2"),n.appendChild(y);let h=document.createElementNS(Q,"feDisplacementMap");h.setAttribute("in","SourceGraphic"),h.setAttribute("in2","n1"),h.setAttribute("scale",c),h.setAttribute("xChannelSelector","R"),h.setAttribute("yChannelSelector","G"),h.setAttribute("result","s1"),n.appendChild(h);let f=document.createElementNS(Q,"feDisplacementMap");f.setAttribute("in","SourceGraphic"),f.setAttribute("in2","n2"),f.setAttribute("scale",o),f.setAttribute("xChannelSelector","G"),f.setAttribute("yChannelSelector","R"),f.setAttribute("result","s2"),n.appendChild(f);let E=document.createElementNS(Q,"feOffset");E.setAttribute("in","s2"),E.setAttribute("dx",u),E.setAttribute("dy",g),E.setAttribute("result","s2off"),n.appendChild(E);let B=document.createElementNS(Q,"feComposite");B.setAttribute("in","s1"),B.setAttribute("in2","s2off"),B.setAttribute("operator","over"),n.appendChild(B),i.appendChild(n);}}return t}function Or(r,e){if(r?.sketchSeed!==void 0)return r.sketchSeed;let t=0;for(let i=0;i<e.length;i++)t=Math.imul(31,t)+e.charCodeAt(i)|0;return Math.abs(t)}function Lr(r){return r.replace(/[^a-zA-Z0-9]/g,"_")}function ht(r,e,t="end"){if(r==="none")return "";let i=`viz-${r}`,n=t==="start"?"-start":"";return e?`${i}${n}-${Lr(e)}`:`${i}${n}`}function Rr(r,e){switch(r){case "arrow":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,2 10,5 0,8"),t.setAttribute("fill",e),t}case "arrowOpen":{let t=document.createElementNS(Q,"polyline");return t.setAttribute("points","0,2 10,5 0,8"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t.setAttribute("stroke-linejoin","miter"),t}case "diamond":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,5 5,2 10,5 5,8"),t.setAttribute("fill",e),t}case "diamondOpen":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,5 5,2 10,5 5,8"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t}case "circle":{let t=document.createElementNS(Q,"circle");return t.setAttribute("cx","5"),t.setAttribute("cy","5"),t.setAttribute("r","3"),t.setAttribute("fill",e),t}case "circleOpen":{let t=document.createElementNS(Q,"circle");return t.setAttribute("cx","5"),t.setAttribute("cy","5"),t.setAttribute("r","3"),t.setAttribute("fill","white"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","1.5"),t}case "square":{let t=document.createElementNS(Q,"rect");return t.setAttribute("x","2"),t.setAttribute("y","2"),t.setAttribute("width","6"),t.setAttribute("height","6"),t.setAttribute("fill",e),t}case "bar":{let t=document.createElementNS(Q,"line");return t.setAttribute("x1","5"),t.setAttribute("y1","1"),t.setAttribute("x2","5"),t.setAttribute("y2","9"),t.setAttribute("stroke",e),t.setAttribute("stroke-width","2"),t.setAttribute("stroke-linecap","round"),t}case "halfArrow":{let t=document.createElementNS(Q,"polygon");return t.setAttribute("points","0,2 10,5 0,5"),t.setAttribute("fill",e),t}default:return null}}function jt(r,e,t="arrow",i="end"){let n=ht(t,e,i);if(!n)return "";if(!r.querySelector(`#${CSS.escape(n)}`)){let a=r.querySelector("defs");if(a){let d=document.createElementNS(Q,"marker");d.setAttribute("id",n),d.setAttribute("viewBox","0 0 10 10"),d.setAttribute("markerWidth","10"),d.setAttribute("markerHeight","10"),d.setAttribute("refX","9"),d.setAttribute("refY","5"),d.setAttribute("orient",i==="start"?"auto-start-reverse":"auto");let c=Rr(t,e);c&&d.appendChild(c),a.appendChild(d);}}return n}function Ie(r,e){let t=new Map,i=new Map,n=new Map,a=new Map,d=new Map,c=new Map,o=new Map,u=new Map,g=new Map,m=new Map,y=r.querySelector('[data-viz-layer="nodes"]')||r.querySelector(".viz-layer-nodes");if(y){let f=Array.from(y.querySelectorAll("g[data-id]"));for(let E of f){let B=E.getAttribute("data-id");if(!B)continue;t.set(B,E);let b=E.querySelector('[data-viz-role="node-shape"]')||E.querySelector(".viz-node-shape");b&&i.set(B,b);let z=E.querySelector('[data-viz-role="node-label"]')||E.querySelector(".viz-node-label");z&&n.set(B,z);let R=E.querySelector('[data-viz-role="node-image"]')||E.querySelector(".viz-node-image");R&&a.set(B,R);let w=E.querySelector('[data-viz-role="node-icon"]')||E.querySelector(".viz-node-icon");w&&d.set(B,w);let s=E.querySelector('[data-viz-role="node-svg"]')||E.querySelector(".viz-node-svg");s&&c.set(B,s);}}let h=r.querySelector('[data-viz-layer="edges"]')||r.querySelector(".viz-layer-edges");if(h){let f=Array.from(h.querySelectorAll("g[data-id]"));for(let E of f){let B=E.getAttribute("data-id");if(!B)continue;o.set(B,E);let b=E.querySelector('[data-viz-role="edge-line"]')||E.querySelector(".viz-edge");b&&u.set(B,b);let z=E.querySelector('[data-viz-role="edge-hit"]')||E.querySelector(".viz-edge-hit");z&&g.set(B,z);let R=Array.from(E.querySelectorAll('[data-viz-role="edge-label"],.viz-edge-label'));R.length>0&&m.set(B,R);}}return {svg:r,edgePathResolver:e?.edgePathResolver??null,nodeGroupsById:t,nodeShapesById:i,nodeLabelsById:n,nodeImagesById:a,nodeIconsById:d,nodeSvgsById:c,edgeGroupsById:o,edgeLinesById:u,edgeHitsById:g,edgeLabelsById:m}}function Tr(r){let e=0,t=0;if(r&&typeof r=="object"){let i=r;typeof i.w=="number"?e=i.w:typeof i.r=="number"?e=i.r*2:typeof i.rx=="number"&&typeof i.ry=="number"?(e=i.rx*2,t=i.ry*2):typeof i.size=="number"?e=i.size:typeof i.outerR=="number"&&(e=i.outerR*2),typeof i.h=="number"?t=i.h:t===0&&(t=e);}return {w:e,h:t}}function ft(r,e,t,i,n,a,d){let c=d?.position??"center",o=d?.dx??0,u=d?.dy??0,g=0,m=0;switch(c){case "above":m=-i/2-a/2;break;case "below":m=i/2+a/2;break;case "left":g=-t/2-n/2;break;case "right":g=t/2+n/2;break;}return {x:r+g-n/2+o,y:e+m-a/2+u}}function pt(r,e$2){let t=new Map(r.nodes.map(o=>[o.id,o])),i=new Map;for(let o of r.nodes)if(o.container){let u=(o.runtime?.x??o.pos.x)-o.pos.x,g=(o.runtime?.y??o.pos.y)-o.pos.y;(u!==0||g!==0)&&i.set(o.id,{dx:u,dy:g});}for(let o of r.nodes){let u=e$2.nodeGroupsById.get(o.id),g=e$2.nodeShapesById.get(o.id);if(!u||!g)continue;let{x:m,y}=d(o);if(o.parentId){let w=i.get(o.parentId);w&&(m+=w.dx,y+=w.dy);}let h=e$1(o);g$1(g,h,{x:m,y});let{w:f,h:E}=Tr(h);if(f>0&&E>0){let w=e$2.nodeImagesById.get(o.id);if(w&&o.image){let A=ft(m,y,f,E,o.image.width,o.image.height,{position:o.image.position,dx:o.image.dx,dy:o.image.dy});w.setAttribute("x",String(A.x)),w.setAttribute("y",String(A.y));}let s=e$2.nodeIconsById.get(o.id);if(s&&o.icon){let A=ft(m,y,f,E,o.icon.size,o.icon.size,{position:o.icon.position,dx:o.icon.dx,dy:o.icon.dy});s.setAttribute("transform",`translate(${A.x} ${A.y})`);}let v=e$2.nodeSvgsById.get(o.id);if(v&&o.svgContent){let A=ft(m,y,f,E,o.svgContent.width,o.svgContent.height,{position:o.svgContent.position,dx:o.svgContent.dx,dy:o.svgContent.dy});v.setAttribute("transform",`translate(${A.x} ${A.y})`);}}if(o.container?.headerHeight&&"w"in h&&"h"in h){let w=u.querySelector('[data-viz-role="container-header"]');if(w){let s=h.w,v=h.h,A=y-v/2+o.container.headerHeight;w.setAttribute("x1",String(m-s/2)),w.setAttribute("y1",String(A)),w.setAttribute("x2",String(m+s/2)),w.setAttribute("y2",String(A));}}let B=e$2.nodeLabelsById.get(o.id);if(B&&o.label){let w=m+(o.label.dx||0),s=y+(o.label.dy||0);if(o.container?.headerHeight&&"h"in h&&!o.label.dy){let A=h.h;s=y-A/2+o.container.headerHeight/2,w=m+(o.label.dx||0);}B.setAttribute("x",String(w)),B.setAttribute("y",String(s));let v=B.querySelectorAll('tspan[data-viz-role="text-line"]');for(let A=0;A<v.length;A++)v[A]?.setAttribute("x",String(w));}if(o.runtime?.opacity!==void 0?(u.style.opacity=String(o.runtime.opacity),g.removeAttribute("opacity")):(u.style.removeProperty("opacity"),o.style?.opacity!==void 0?g.setAttribute("opacity",String(o.style.opacity)):g.removeAttribute("opacity")),o.style?.shadow){let w=Vr(e$2.svg,o.style.shadow);g.setAttribute("filter",`url(#${w})`);}else g.removeAttribute("filter");if(o.style?.sketch||r.sketch?.enabled){let w=Or(o.style,o.id),s=Ft(e$2.svg,w);u.setAttribute("filter",`url(#${s})`),u.classList.contains("viz-sketch")||u.classList.add("viz-sketch");}else {u.classList.contains("viz-sketch")&&u.classList.remove("viz-sketch");let w=u.getAttribute("filter");w&&w.startsWith("url(#viz-sketch-")&&u.removeAttribute("filter");}let z=o.runtime?.scale,R=o.runtime?.rotation;if(z!==void 0||R!==void 0){let w=z??1,s=R??0;u.setAttribute("transform",`translate(${m} ${y}) rotate(${s}) scale(${w}) translate(${-m} ${-y})`);}else u.removeAttribute("transform");o.ports&&u.querySelectorAll('[data-viz-role="port"]').forEach(s=>{let v=s.getAttribute("data-port"),A=o.ports.find(_=>_.id===v);A&&(s.setAttribute("cx",String(m+A.offset.x)),s.setAttribute("cy",String(y+A.offset.y)));});}let n=e$2.edgePathResolver;for(let o of r.edges){let u=e$2.edgeGroupsById.get(o.id),g$1=e$2.edgeLinesById.get(o.id);if(!u||!g$1)continue;let m=o.from?t.get(o.from)??null:null,y=o.to?t.get(o.to)??null:null;if(o.from&&!m||o.to&&!y||!m&&!o.fromAt&&!y&&!o.toAt)continue;let h;if(m&&y&&m===y)h=g(m,o);else {let b=e(m,y,o);h=f(b.start,b.end,o.routing,o.waypoints);}if(n){let b=z=>{let R=z.from?t.get(z.from)??null:null,w=z.to?t.get(z.to)??null:null;if(z.from&&!R||z.to&&!w||!R&&!z.fromAt&&!w&&!z.toAt)return "";if(R&&w&&R===w)return g(R,z).d;let s=e(R,w,z);return f(s.start,s.end,z.routing,z.waypoints).d};try{let z=n(o,r,b);typeof z=="string"&&z&&(h.d=z);}catch(z){console.warn(`RuntimePatcher: edge path resolver threw for edge ${o.id}`,z);}}if(g$1.setAttribute("d",h.d),o.style?.stroke!==void 0&&(g$1.style.stroke=o.style.stroke),o.style?.strokeWidth!==void 0&&(g$1.style.strokeWidth=String(o.style.strokeWidth)),o.style?.fill!==void 0&&(g$1.style.fill=o.style.fill),o.style?.opacity!==void 0&&(g$1.style.opacity=String(o.style.opacity)),o.style?.strokeDasharray!==void 0&&(g$1.style.strokeDasharray=$e(o.style.strokeDasharray)),o.markerEnd&&o.markerEnd!=="none"){let b=o.style?.stroke?jt(e$2.svg,o.style.stroke,o.markerEnd,"end"):ht(o.markerEnd,void 0,"end");g$1.setAttribute("marker-end",`url(#${b})`);}else g$1.removeAttribute("marker-end");if(o.markerStart&&o.markerStart!=="none"){let b=o.style?.stroke?jt(e$2.svg,o.style.stroke,o.markerStart,"start"):ht(o.markerStart,void 0,"start");g$1.setAttribute("marker-start",`url(#${b})`);}else g$1.removeAttribute("marker-start");let f$1=e$2.edgeHitsById.get(o.id);f$1&&f$1.setAttribute("d",h.d);let E=e$2.edgeLabelsById.get(o.id);if(E){let b=De(o);E.forEach((z,R)=>{let w=b[R];if(!w)return;let s=Ge(w,h);z.setAttribute("x",String(s.x)),z.setAttribute("y",String(s.y));let v=z.querySelectorAll('tspan[data-viz-role="text-line"]');for(let A=0;A<v.length;A++)v[A]?.setAttribute("x",String(s.x));});}if(o.runtime?.opacity!==void 0?u.style.opacity=String(o.runtime.opacity):u.style.removeProperty("opacity"),o.runtime?.strokeDashoffset!==void 0?(g$1.style.strokeDashoffset=String(o.runtime.strokeDashoffset),g$1.setAttribute("stroke-dashoffset",String(o.runtime.strokeDashoffset))):(g$1.style.removeProperty("stroke-dashoffset"),g$1.removeAttribute("stroke-dashoffset")),o.style?.sketch||r.sketch?.enabled){let b=0;for(let w=0;w<o.id.length;w++)b=Math.imul(31,b)+o.id.charCodeAt(w)|0;let z=Math.abs(b),R=Ft(e$2.svg,z);g$1.setAttribute("filter",`url(#${R})`),u.classList.contains("viz-sketch")||u.classList.add("viz-sketch");}else {let b=g$1.getAttribute("filter");b&&b.startsWith("url(#viz-sketch-")&&g$1.removeAttribute("filter"),u.classList.contains("viz-sketch")&&u.classList.remove("viz-sketch");}}let a=[],d$1=new Map;for(let o of r.nodes)if(o.parentId){let u=d$1.get(o.parentId);u||(u=[],d$1.set(o.parentId,u)),u.push(o);}else a.push(o);a.sort((o,u)=>(o.zIndex||0)-(u.zIndex||0));let c=e$2.svg.querySelector('[data-viz-layer="nodes"]')||e$2.svg.querySelector(".viz-layer-nodes");if(c){let o=c.firstElementChild;for(let u of a){let g=e$2.nodeGroupsById.get(u.id);g&&(o!==g?c.insertBefore(g,o):o=o.nextElementSibling);}}for(let[o,u]of d$1.entries()){u.sort((y,h)=>(y.zIndex||0)-(h.zIndex||0));let g=e$2.nodeGroupsById.get(o);if(!g)continue;let m=g.querySelector(':scope > [data-viz-role="container-children"]');if(m){let y=m.firstElementChild;for(let h of u){let f=e$2.nodeGroupsById.get(h.id);f&&(y!==f?m.insertBefore(f,y):y=y.nextElementSibling);}}}}function yt(r,e,t=12){let i=r.split(`
@@ -1,5 +1,5 @@
1
- export { H as HitResult, a as HitTestOptions, d as distanceSquare, e as edgeDistance, g as getEffectiveNodeBounds, h as hitTest, b as hitTestRect, n as nearestPort, p as pointInRect, s as setupPanZoom } from './hitTest-DRlIew9n.mjs';
2
- import { V as VizNode, a as VizEdge } from './index-CvNQ2zQt.mjs';
1
+ export { H as HitResult, a as HitTestOptions, d as distanceSquare, e as edgeDistance, g as getEffectiveNodeBounds, h as hitTest, b as hitTestRect, n as nearestPort, p as pointInRect, s as setupPanZoom } from './hitTest-DtkjchpB.mjs';
2
+ import { V as VizNode, a as VizEdge } from './index-n9JLZMa1.mjs';
3
3
 
4
4
  /** CSS injected into the container for tooltip styling. */
5
5
  declare const TOOLTIP_CSS = "\n.viz-tooltip {\n position: absolute;\n pointer-events: none;\n z-index: 9999;\n max-width: 320px;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 13px;\n line-height: 1.4;\n background: var(--viz-tooltip-bg, #1a1a2e);\n color: var(--viz-tooltip-fg, #e2e8f0);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n white-space: pre-wrap;\n word-break: break-word;\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n.viz-tooltip[data-visible=\"true\"] {\n opacity: 1;\n}\n.viz-tooltip-title {\n font-weight: 600;\n margin-bottom: 4px;\n font-size: 14px;\n}\n.viz-tooltip-section {\n display: flex;\n gap: 6px;\n padding: 2px 0;\n}\n.viz-tooltip-section-label {\n color: var(--viz-tooltip-label, #94a3b8);\n flex-shrink: 0;\n}\n.viz-tooltip-section-label::after {\n content: ':';\n}\n.viz-tooltip-section-value {\n color: var(--viz-tooltip-fg, #e2e8f0);\n}\n";
@@ -1,5 +1,5 @@
1
- export { H as HitResult, a as HitTestOptions, d as distanceSquare, e as edgeDistance, g as getEffectiveNodeBounds, h as hitTest, b as hitTestRect, n as nearestPort, p as pointInRect, s as setupPanZoom } from './hitTest-B_G0nzwf.js';
2
- import { V as VizNode, a as VizEdge } from './index-CvNQ2zQt.js';
1
+ export { H as HitResult, a as HitTestOptions, d as distanceSquare, e as edgeDistance, g as getEffectiveNodeBounds, h as hitTest, b as hitTestRect, n as nearestPort, p as pointInRect, s as setupPanZoom } from './hitTest-5nKDL0YT.js';
2
+ import { V as VizNode, a as VizEdge } from './index-n9JLZMa1.js';
3
3
 
4
4
  /** CSS injected into the container for tooltip styling. */
5
5
  declare const TOOLTIP_CSS = "\n.viz-tooltip {\n position: absolute;\n pointer-events: none;\n z-index: 9999;\n max-width: 320px;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 13px;\n line-height: 1.4;\n background: var(--viz-tooltip-bg, #1a1a2e);\n color: var(--viz-tooltip-fg, #e2e8f0);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n white-space: pre-wrap;\n word-break: break-word;\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n.viz-tooltip[data-visible=\"true\"] {\n opacity: 1;\n}\n.viz-tooltip-title {\n font-weight: 600;\n margin-bottom: 4px;\n font-size: 14px;\n}\n.viz-tooltip-section {\n display: flex;\n gap: 6px;\n padding: 2px 0;\n}\n.viz-tooltip-section-label {\n color: var(--viz-tooltip-label, #94a3b8);\n flex-shrink: 0;\n}\n.viz-tooltip-section-label::after {\n content: ':';\n}\n.viz-tooltip-section-value {\n color: var(--viz-tooltip-fg, #e2e8f0);\n}\n";
@@ -1 +1 @@
1
- 'use strict';var chunkTVRPABD2_js=require('./chunk-TVRPABD2.js');require('./chunk-OZAFCKI7.js');Object.defineProperty(exports,"TOOLTIP_CSS",{enumerable:true,get:function(){return chunkTVRPABD2_js.b}});Object.defineProperty(exports,"distanceSquare",{enumerable:true,get:function(){return chunkTVRPABD2_js.i}});Object.defineProperty(exports,"edgeDistance",{enumerable:true,get:function(){return chunkTVRPABD2_js.n}});Object.defineProperty(exports,"getEffectiveNodeBounds",{enumerable:true,get:function(){return chunkTVRPABD2_js.j}});Object.defineProperty(exports,"hitTest",{enumerable:true,get:function(){return chunkTVRPABD2_js.k}});Object.defineProperty(exports,"hitTestRect",{enumerable:true,get:function(){return chunkTVRPABD2_js.l}});Object.defineProperty(exports,"nearestPort",{enumerable:true,get:function(){return chunkTVRPABD2_js.m}});Object.defineProperty(exports,"pointInRect",{enumerable:true,get:function(){return chunkTVRPABD2_js.h}});Object.defineProperty(exports,"setupPanZoom",{enumerable:true,get:function(){return chunkTVRPABD2_js.a}});Object.defineProperty(exports,"setupTooltip",{enumerable:true,get:function(){return chunkTVRPABD2_js.c}});
1
+ 'use strict';var chunkM3ZDZ24B_js=require('./chunk-M3ZDZ24B.js');require('./chunk-OZAFCKI7.js');Object.defineProperty(exports,"TOOLTIP_CSS",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.b}});Object.defineProperty(exports,"distanceSquare",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.i}});Object.defineProperty(exports,"edgeDistance",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.n}});Object.defineProperty(exports,"getEffectiveNodeBounds",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.j}});Object.defineProperty(exports,"hitTest",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.k}});Object.defineProperty(exports,"hitTestRect",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.l}});Object.defineProperty(exports,"nearestPort",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.m}});Object.defineProperty(exports,"pointInRect",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.h}});Object.defineProperty(exports,"setupPanZoom",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.a}});Object.defineProperty(exports,"setupTooltip",{enumerable:true,get:function(){return chunkM3ZDZ24B_js.c}});
@@ -1 +1 @@
1
- export{b as TOOLTIP_CSS,i as distanceSquare,n as edgeDistance,j as getEffectiveNodeBounds,k as hitTest,l as hitTestRect,m as nearestPort,h as pointInRect,a as setupPanZoom,c as setupTooltip}from'./chunk-46IHGFPN.mjs';import'./chunk-I5FQBS5N.mjs';
1
+ export{b as TOOLTIP_CSS,i as distanceSquare,n as edgeDistance,j as getEffectiveNodeBounds,k as hitTest,l as hitTestRect,m as nearestPort,h as pointInRect,a as setupPanZoom,c as setupTooltip}from'./chunk-GY6N3GFA.mjs';import'./chunk-I5FQBS5N.mjs';
package/dist/layout.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a2 as LayoutAlgorithm } from './index-CvNQ2zQt.mjs';
1
+ import { a2 as LayoutAlgorithm } from './index-n9JLZMa1.mjs';
2
2
 
3
3
  interface CircularLayoutOptions {
4
4
  /** X coordinate of the center (default: 0) */
package/dist/layout.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a2 as LayoutAlgorithm } from './index-CvNQ2zQt.js';
1
+ import { a2 as LayoutAlgorithm } from './index-n9JLZMa1.js';
2
2
 
3
3
  interface CircularLayoutOptions {
4
4
  /** X coordinate of the center (default: 0) */
package/dist/ports.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { N as NodeShape, g as NodePort, V as VizNode } from './index-CvNQ2zQt.mjs';
1
+ import { N as NodeShape, g as NodePort, V as VizNode } from './index-n9JLZMa1.mjs';
2
2
 
3
3
  /**
4
4
  * A port positioned equidistantly along a shape's perimeter.
package/dist/ports.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { N as NodeShape, g as NodePort, V as VizNode } from './index-CvNQ2zQt.js';
1
+ import { N as NodeShape, g as NodePort, V as VizNode } from './index-n9JLZMa1.js';
2
2
 
3
3
  /**
4
4
  * A port positioned equidistantly along a shape's perimeter.
@@ -1,4 +1,4 @@
1
- import { b as VizScene, V as VizNode, a as VizEdge } from './index-CvNQ2zQt.mjs';
1
+ import { b as VizScene, V as VizNode, a as VizEdge } from './index-n9JLZMa1.mjs';
2
2
 
3
3
  /**
4
4
  * Scene data structure that represents a serialised VizScene.
@@ -1,4 +1,4 @@
1
- import { b as VizScene, V as VizNode, a as VizEdge } from './index-CvNQ2zQt.js';
1
+ import { b as VizScene, V as VizNode, a as VizEdge } from './index-n9JLZMa1.js';
2
2
 
3
3
  /**
4
4
  * Scene data structure that represents a serialised VizScene.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vizcraft",
3
- "version": "1.14.0",
3
+ "version": "1.16.0",
4
4
  "description": "A fluent, type-safe SVG scene builder for composing nodes, edges, animations, and overlays with incremental DOM updates and no framework dependency.",
5
5
  "keywords": [
6
6
  "visualization",