@cocorof/graphier 1.4.3 → 1.4.5

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/types/theme.ts","../src/types/layout.ts","../src/utils/color.ts","../src/themes/celestial.ts","../src/themes/neon.ts","../src/themes/minimal.ts","../src/themes/paper.ts","../src/themes/resolve-theme.ts","../src/layout/layout-config.ts","../src/layout/worker-inline.ts","../node_modules/three/examples/jsm/controls/OrbitControls.js","../node_modules/three/examples/jsm/shaders/CopyShader.js","../node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/three/examples/jsm/postprocessing/ShaderPass.js","../node_modules/three/examples/jsm/postprocessing/MaskPass.js","../node_modules/three/examples/jsm/postprocessing/EffectComposer.js","../node_modules/three/examples/jsm/postprocessing/RenderPass.js","../node_modules/three/examples/jsm/shaders/LuminosityHighPassShader.js","../node_modules/three/examples/jsm/postprocessing/UnrealBloomPass.js","../src/core/effects.ts","../src/core/selection.ts","../src/core/label-system.ts","../src/core/keyboard.ts","../src/core/scene-setup.ts","../src/core/node-mesh.ts","../src/core/edge-mesh.ts","../src/core/camera.ts","../src/core/interaction.ts","../src/core/dispose.ts","../src/core/NetworkGraph3D.tsx","../src/core/Minimap.tsx","../node_modules/d3-force-3d/src/center.js","../node_modules/d3-binarytree/src/add.js","../node_modules/d3-binarytree/src/cover.js","../node_modules/d3-binarytree/src/data.js","../node_modules/d3-binarytree/src/extent.js","../node_modules/d3-binarytree/src/half.js","../node_modules/d3-binarytree/src/find.js","../node_modules/d3-binarytree/src/remove.js","../node_modules/d3-binarytree/src/root.js","../node_modules/d3-binarytree/src/size.js","../node_modules/d3-binarytree/src/visit.js","../node_modules/d3-binarytree/src/visitAfter.js","../node_modules/d3-binarytree/src/x.js","../node_modules/d3-binarytree/src/binarytree.js","../node_modules/d3-quadtree/src/add.js","../node_modules/d3-quadtree/src/cover.js","../node_modules/d3-quadtree/src/data.js","../node_modules/d3-quadtree/src/extent.js","../node_modules/d3-quadtree/src/quad.js","../node_modules/d3-quadtree/src/find.js","../node_modules/d3-quadtree/src/remove.js","../node_modules/d3-quadtree/src/root.js","../node_modules/d3-quadtree/src/size.js","../node_modules/d3-quadtree/src/visit.js","../node_modules/d3-quadtree/src/visitAfter.js","../node_modules/d3-quadtree/src/x.js","../node_modules/d3-quadtree/src/y.js","../node_modules/d3-quadtree/src/quadtree.js","../node_modules/d3-octree/src/add.js","../node_modules/d3-octree/src/cover.js","../node_modules/d3-octree/src/data.js","../node_modules/d3-octree/src/extent.js","../node_modules/d3-octree/src/octant.js","../node_modules/d3-octree/src/find.js","../node_modules/d3-octree/src/findAll.js","../node_modules/d3-octree/src/remove.js","../node_modules/d3-octree/src/root.js","../node_modules/d3-octree/src/size.js","../node_modules/d3-octree/src/visit.js","../node_modules/d3-octree/src/visitAfter.js","../node_modules/d3-octree/src/x.js","../node_modules/d3-octree/src/y.js","../node_modules/d3-octree/src/z.js","../node_modules/d3-octree/src/octree.js","../node_modules/d3-force-3d/src/constant.js","../node_modules/d3-force-3d/src/jiggle.js","../node_modules/d3-force-3d/src/link.js","../node_modules/d3-dispatch/src/dispatch.js","../node_modules/d3-timer/src/timer.js","../node_modules/d3-force-3d/src/lcg.js","../node_modules/d3-force-3d/src/simulation.js","../node_modules/d3-force-3d/src/manyBody.js","../src/subgraph/subgraph-builder.ts","../src/subgraph/SubgraphView2D.tsx","../src/detail/NodeDetailPanel.tsx"],"sourcesContent":["/**\n * Theme configuration — controls all visual appearance.\n */\n\nexport interface ThemeConfig {\n /** Node colors by type string (e.g. { person: \"#58a6ff\", repo: \"#3fb950\" }) */\n nodeColors?: Record<string, string>;\n /** Brighter node colors for highlights (auto-generated if omitted) */\n nodeColorsBright?: Record<string, string>;\n /** Edge colors by type string (e.g. { follows: \"#8b949e\" }) */\n linkColors?: Record<string, string>;\n /** Fallback color for unmapped node types */\n defaultNodeColor?: string;\n /** Fallback color for unmapped link types */\n defaultLinkColor?: string;\n /** Scene background color */\n backgroundColor?: string;\n /** Color palette for auto-assignment when type has no explicit mapping */\n palette?: string[];\n /**\n * Edge blend mode. \"additive\" glows on dark backgrounds; \"normal\" is\n * required for light backgrounds (additive lines vanish on white).\n * Default: \"additive\" on dark backgrounds, \"normal\" on light ones.\n */\n blending?: \"additive\" | \"normal\";\n}\n\nexport interface StyleConfig {\n /** Minimum node sphere radius (default: 1) */\n nodeMinSize?: number;\n /** Maximum node sphere radius (default: 15) */\n nodeMaxSize?: number;\n /** Edge line opacity 0..1 (default: 0.15) */\n edgeOpacity?: number;\n /** Bloom glow strength (default: 0.6) */\n bloomStrength?: number;\n /** Bloom glow radius (default: 0.1) */\n bloomRadius?: number;\n /** Bloom brightness threshold (default: 0.1) */\n bloomThreshold?: number;\n /** Show background star field (default: true) */\n starField?: boolean;\n /** Exponential fog density (default: 0.0006, 0 = disabled) */\n fogDensity?: number;\n /** Auto-orbit camera rotation (default: false) */\n autoOrbit?: boolean;\n /** Label text scale multiplier (default: 1.0) */\n labelScale?: number;\n /** Label visibility distance threshold 0..1 (default: 0.8) */\n labelThreshold?: number;\n /** Show labels at all (default: true) */\n showLabels?: boolean;\n /** Maximum visible labels at once (default: 150) */\n maxLabels?: number;\n /** Edge line width multiplier (default: 1.0). Note: WebGL limits linewidth to 1 on most platforms. */\n edgeWidthScale?: number;\n /**\n * Fly camera thrust speed multiplier (default: 1.0).\n * 0.5 = half speed, 2.0 = double speed.\n */\n flySpeed?: number;\n}\n\nexport const DEFAULT_STYLE: Required<StyleConfig> = {\n nodeMinSize: 1,\n nodeMaxSize: 15,\n edgeOpacity: 0.15,\n bloomStrength: 0.6,\n bloomRadius: 0.1,\n bloomThreshold: 0.1,\n starField: true,\n fogDensity: 0.0006,\n autoOrbit: false,\n labelScale: 1.0,\n labelThreshold: 0.8,\n showLabels: true,\n maxLabels: 150,\n edgeWidthScale: 1.0,\n flySpeed: 1.0,\n};\n","/**\n * Layout engine configuration.\n */\n\nexport interface LayoutConfig {\n /** Layout algorithm (currently only \"force-3d\") */\n type?: \"force-3d\";\n /** Many-body charge strength — \"auto\" adapts to graph size, or provide a number (default: \"auto\") */\n charge?: \"auto\" | number;\n /** Link distance — \"auto\" adapts to graph size, or provide a number (default: \"auto\") */\n linkDistance?: \"auto\" | number;\n /** Alpha decay rate — \"auto\" adapts to graph size (default: \"auto\") */\n alphaDecay?: \"auto\" | number;\n /** Velocity damping 0..1 (default: 0.4) */\n velocityDecay?: number;\n /** Convergence threshold — simulation stops when alpha drops below this (default: 0.005) */\n settledThreshold?: number;\n /**\n * Spread multiplier — scales charge strength and link distance to control\n * how far apart nodes spread. 1.0 = default, 2.0 = twice as spread out.\n * Automatically scaled by node count when set to \"auto\".\n * (default: \"auto\")\n */\n spreadFactor?: \"auto\" | number;\n /**\n * Layout dimensionality (default: 3).\n * 2 = flat Obsidian-style plane: the simulation runs in 2D (z is locked\n * to 0), the camera is locked to pan/zoom (no rotation), and dragging\n * stays on the plane.\n */\n dimensions?: 2 | 3;\n /**\n * Pull nodes that share the same key toward a common centroid so\n * categories form visible clusters (\"type\" reads node.type, \"group\"\n * reads node.group). null/undefined = off (default).\n */\n clusterBy?: \"type\" | \"group\" | null;\n /** Cluster attraction strength 0..1 (default: 0.05). */\n clusterStrength?: number;\n}\n\nexport const DEFAULT_LAYOUT: Required<LayoutConfig> = {\n type: \"force-3d\",\n charge: \"auto\",\n linkDistance: \"auto\",\n alphaDecay: \"auto\",\n velocityDecay: 0.4,\n settledThreshold: 0.005,\n spreadFactor: \"auto\",\n dimensions: 3,\n clusterBy: null,\n clusterStrength: 0.05,\n};\n","/**\n * Color utility functions for theme resolution.\n */\n\n/** Parse hex color to RGB components (0-1 range) */\nexport function hexToRgb(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\");\n const n = parseInt(c, 16);\n return [(n >> 16) / 255, ((n >> 8) & 0xff) / 255, (n & 0xff) / 255];\n}\n\n/** Convert RGB components (0-1 range) to hex string */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.round(Math.max(0, Math.min(1, v)) * 255);\n const hex = (clamp(r) << 16) | (clamp(g) << 8) | clamp(b);\n return \"#\" + hex.toString(16).padStart(6, \"0\");\n}\n\n/** Relative luminance 0..1 of a hex color (for light/dark detection) */\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/** Darken a hex color by a factor (0.7 = 30% darker) */\nexport function darken(hex: string, factor: number): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r * factor, g * factor, b * factor);\n}\n\n/** Brighten a hex color by a factor (1.0 = no change, 1.5 = 50% brighter) */\nexport function brighten(hex: string, factor: number): string {\n const [r, g, b] = hexToRgb(hex);\n // Lerp toward white\n const t = 1 - 1 / factor;\n return rgbToHex(r + (1 - r) * t, g + (1 - g) * t, b + (1 - b) * t);\n}\n\n/** Dim a hex color by a scalar multiplier */\nexport function dim(hex: string, factor: number): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r * factor, g * factor, b * factor);\n}\n\n/**\n * Default palette for auto-assigning colors to unmapped types.\n * Visually distinct, optimized for dark backgrounds.\n */\nexport const DEFAULT_PALETTE: string[] = [\n \"#58a6ff\", // blue\n \"#3fb950\", // green\n \"#d29922\", // orange\n \"#da70d6\", // orchid\n \"#f97583\", // pink-red\n \"#56d4dd\", // cyan\n \"#d2a8ff\", // lavender\n \"#ffa657\", // amber\n \"#7ee89a\", // mint\n \"#ff7b72\", // coral\n \"#79c0ff\", // sky\n \"#e3b341\", // gold\n];\n","/**\n * \"Celestial\" theme — the original GitHub AI Network visual style.\n * Dark space background with glowing nodes and bloom effects.\n */\n\nimport type { ThemeConfig } from \"../types\";\n\nexport const celestial: ThemeConfig = {\n nodeColors: {\n author: \"#58a6ff\",\n repo: \"#3fb950\",\n topic: \"#d29922\",\n },\n nodeColorsBright: {\n author: \"#9dcfff\",\n repo: \"#7ee89a\",\n topic: \"#f0c45a\",\n },\n linkColors: {\n owns: \"#58a6ff\",\n contributes: \"#8b949e\",\n has_topic: \"#d29922\",\n coworker: \"#da70d6\",\n forked_from: \"#8888cc\",\n },\n defaultNodeColor: \"#8b949e\",\n defaultLinkColor: \"#8b949e\",\n backgroundColor: \"#030810\",\n};\n","/**\n * \"Neon\" theme — vibrant neon colors on pure black.\n */\n\nimport type { ThemeConfig } from \"../types\";\n\nexport const neon: ThemeConfig = {\n nodeColors: {\n primary: \"#00ff87\",\n secondary: \"#f72585\",\n tertiary: \"#7209b7\",\n },\n linkColors: {\n default: \"#4cc9f0\",\n strong: \"#f72585\",\n weak: \"#3a0ca3\",\n },\n defaultNodeColor: \"#4cc9f0\",\n defaultLinkColor: \"#4361ee\",\n backgroundColor: \"#000000\",\n};\n","/**\n * \"Minimal\" theme — muted, professional look.\n */\n\nimport type { ThemeConfig } from \"../types\";\n\nexport const minimal: ThemeConfig = {\n nodeColors: {\n primary: \"#6c7a89\",\n secondary: \"#2ecc71\",\n tertiary: \"#e67e22\",\n },\n linkColors: {\n default: \"#555555\",\n },\n defaultNodeColor: \"#6c7a89\",\n defaultLinkColor: \"#444444\",\n backgroundColor: \"#1a1a2e\",\n};\n","/**\n * \"Paper\" theme — light background for embedding in light-mode UIs.\n * Saturated node colors that hold up on white; normal (non-additive)\n * edge blending so lines stay visible. Pair with\n * `style={{ starField: false, bloomStrength: 0, fogDensity: 0 }}`.\n */\n\nimport type { ThemeConfig } from \"../types\";\n\nexport const paper: ThemeConfig = {\n nodeColors: {},\n // Bright (label / highlight) colors are auto-derived: on a light\n // background resolveTheme darkens instead of whitening.\n nodeColorsBright: {},\n linkColors: {},\n defaultNodeColor: \"#64748b\",\n defaultLinkColor: \"#b3bdcc\",\n backgroundColor: \"#f6f7f9\",\n blending: \"normal\",\n palette: [\n \"#2563eb\", // blue\n \"#d97706\", // amber\n \"#7c3aed\", // violet\n \"#db2777\", // pink\n \"#0891b2\", // cyan\n \"#16a34a\", // green\n \"#dc2626\", // red\n \"#475569\", // slate\n ],\n};\n","/**\n * Theme resolution — resolves user theme config into concrete color lookups.\n * Handles auto-assignment from palette for unmapped types.\n */\n\nimport type { ThemeConfig } from \"../types\";\nimport { brighten, darken, luminance, DEFAULT_PALETTE } from \"../utils/color\";\nimport { celestial } from \"./celestial\";\nimport { neon } from \"./neon\";\nimport { minimal } from \"./minimal\";\nimport { paper } from \"./paper\";\n\nexport interface ResolvedTheme {\n nodeColor(type?: string): string;\n nodeColorBright(type?: string): string;\n linkColor(type?: string): string;\n backgroundColor: string;\n /** True when the background is light — flips highlight/dim direction */\n isLight: boolean;\n /** Whether edges should use additive blending (dark backgrounds only) */\n additiveEdges: boolean;\n}\n\nconst PRESETS: Record<string, ThemeConfig> = {\n celestial,\n neon,\n minimal,\n paper,\n};\n\nconst DEFAULT_THEME = {\n nodeColors: celestial.nodeColors ?? {},\n nodeColorsBright: celestial.nodeColorsBright ?? {},\n linkColors: celestial.linkColors ?? {},\n defaultNodeColor: celestial.defaultNodeColor ?? \"#8b949e\",\n defaultLinkColor: celestial.defaultLinkColor ?? \"#8b949e\",\n backgroundColor: celestial.backgroundColor ?? \"#030810\",\n palette: DEFAULT_PALETTE,\n};\n\nexport function resolveTheme(\n theme?: ThemeConfig | string\n): ResolvedTheme {\n let config: ThemeConfig;\n if (typeof theme === \"string\") {\n config = PRESETS[theme] ?? celestial;\n } else {\n config = theme ?? {};\n }\n\n const nodeColors = { ...DEFAULT_THEME.nodeColors, ...config.nodeColors };\n const nodeColorsBright = {\n ...DEFAULT_THEME.nodeColorsBright,\n ...config.nodeColorsBright,\n };\n const linkColors = { ...DEFAULT_THEME.linkColors, ...config.linkColors };\n const defaultNodeColor =\n config.defaultNodeColor ?? DEFAULT_THEME.defaultNodeColor;\n const defaultLinkColor =\n config.defaultLinkColor ?? DEFAULT_THEME.defaultLinkColor;\n const backgroundColor =\n config.backgroundColor ?? DEFAULT_THEME.backgroundColor;\n const palette = config.palette ?? DEFAULT_THEME.palette;\n const isLight = luminance(backgroundColor) > 0.5;\n const additiveEdges = config.blending\n ? config.blending === \"additive\"\n : !isLight;\n\n // Track auto-assigned colors for unmapped types\n const autoAssigned = new Map<string, number>();\n let nextPaletteIdx = 0;\n\n function nodeColor(type?: string): string {\n if (!type) return defaultNodeColor;\n if (nodeColors[type]) return nodeColors[type];\n if (!autoAssigned.has(type)) {\n autoAssigned.set(type, nextPaletteIdx);\n nextPaletteIdx = (nextPaletteIdx + 1) % palette.length;\n }\n return palette[autoAssigned.get(type)!];\n }\n\n // On light backgrounds \"bright\" must darken/saturate — whitened\n // colors wash out against white (labels, hop-1 highlight, ring).\n const emphasize = (c: string) => (isLight ? darken(c, 0.72) : brighten(c, 1.5));\n\n function nodeColorBright(type?: string): string {\n if (!type) return emphasize(defaultNodeColor);\n if (nodeColorsBright[type]) return nodeColorsBright[type];\n return emphasize(nodeColor(type));\n }\n\n function linkColor(type?: string): string {\n if (!type) return defaultLinkColor;\n return linkColors[type] ?? defaultLinkColor;\n }\n\n return {\n nodeColor,\n nodeColorBright,\n linkColor,\n backgroundColor,\n isLight,\n additiveEdges,\n };\n}\n","/**\n * Adaptive layout parameters based on graph size.\n * Larger graphs need weaker forces and less frequent updates.\n */\n\nimport type { LayoutConfig } from \"../types\";\n\nexport interface ResolvedLayoutParams {\n dimensions: 2 | 3;\n clusterStrength: number;\n charge: number;\n distanceMax: number;\n theta: number;\n linkDistance: number;\n alphaDecay: number;\n velocityDecay: number;\n settledThreshold: number;\n postEvery: number;\n initialRadius: number;\n}\n\n/**\n * Compute an automatic spread factor based on node count.\n * More nodes → more spread to prevent overcrowding.\n * < 500: 1.0 (default)\n * 500-2k: 1.0–1.3\n * 2k-10k: 1.3–1.8\n * 10k+: 1.8–2.5\n */\nfunction autoSpreadFactor(n: number): number {\n if (n <= 500) return 1.0;\n if (n <= 2000) return 1.0 + (n - 500) / 1500 * 0.3;\n if (n <= 10000) return 1.3 + (n - 2000) / 8000 * 0.5;\n return Math.min(2.5, 1.8 + (n - 10000) / 40000 * 0.7);\n}\n\nexport function resolveLayoutParams(\n nodeCount: number,\n config?: LayoutConfig\n): ResolvedLayoutParams {\n const n = nodeCount;\n\n // Resolve spread factor\n const spread =\n config?.spreadFactor !== \"auto\" && config?.spreadFactor != null\n ? config.spreadFactor\n : autoSpreadFactor(n);\n\n const baseCharge =\n config?.charge !== \"auto\" && config?.charge != null\n ? config.charge\n : n > 50000\n ? -80\n : n > 10000\n ? -120\n : -200;\n\n // Apply spread: stronger repulsion = more spread\n const charge = baseCharge * spread;\n\n const distanceMax = (n > 50000 ? 1500 : n > 10000 ? 2000 : 3000) * spread;\n const theta = n > 20000 ? 1.5 : n > 5000 ? 1.2 : 0.9;\n\n const baseLinkDistance =\n config?.linkDistance !== \"auto\" && config?.linkDistance != null\n ? config.linkDistance\n : n > 50000\n ? 120\n : n > 10000\n ? 180\n : 250;\n\n // Apply spread: longer links = more spread\n const linkDistance = baseLinkDistance * spread;\n\n const alphaDecay =\n config?.alphaDecay !== \"auto\" && config?.alphaDecay != null\n ? config.alphaDecay\n : n > 50000\n ? 0.04\n : n > 10000\n ? 0.03\n : 0.02;\n\n const velocityDecay = config?.velocityDecay ?? 0.4;\n const settledThreshold = config?.settledThreshold ?? 0.005;\n const postEvery = n > 50000 ? 5 : n > 10000 ? 3 : 2;\n const initialRadius = (500 + Math.min(n, 10000) * 0.1) * spread;\n\n return {\n dimensions: config?.dimensions === 2 ? 2 : 3,\n clusterStrength: config?.clusterStrength ?? 0.05,\n charge,\n distanceMax,\n theta,\n linkDistance,\n alphaDecay,\n velocityDecay,\n settledThreshold,\n postEvery,\n initialRadius,\n };\n}\n","// AUTO-GENERATED — do not edit. Run: node scripts/build-worker.js\nconst WORKER_SOURCE = \"(function(){\\\"use strict\\\";function At(t,n,i){var e,r=1;t==null&&(t=0),n==null&&(n=0),i==null&&(i=0);function s(){var o,u=e.length,h,f=0,l=0,c=0;for(o=0;o<u;++o)h=e[o],f+=h.x||0,l+=h.y||0,c+=h.z||0;for(f=(f/u-t)*r,l=(l/u-n)*r,c=(c/u-i)*r,o=0;o<u;++o)h=e[o],f&&(h.x-=f),l&&(h.y-=l),c&&(h.z-=c)}return s.initialize=function(o){e=o},s.x=function(o){return arguments.length?(t=+o,s):t},s.y=function(o){return arguments.length?(n=+o,s):n},s.z=function(o){return arguments.length?(i=+o,s):i},s.strength=function(o){return arguments.length?(r=+o,s):r},s}function $t(t){const n=+this._x.call(null,t);return et(this.cover(n),n,t)}function et(t,n,i){if(isNaN(n))return t;var e,r=t._root,s={data:i},o=t._x0,u=t._x1,h,f,l,c,v;if(!r)return t._root=s,t;for(;r.length;)if((l=n>=(h=(o+u)/2))?o=h:u=h,e=r,!(r=r[c=+l]))return e[c]=s,t;if(f=+t._x.call(null,r.data),n===f)return s.next=r,e?e[c]=s:t._root=s,t;do e=e?e[c]=new Array(2):t._root=new Array(2),(l=n>=(h=(o+u)/2))?o=h:u=h;while((c=+l)==(v=+(f>=h)));return e[v]=r,e[c]=s,t}function mt(t){Array.isArray(t)||(t=Array.from(t));const n=t.length,i=new Float64Array(n);let e=1/0,r=-1/0;for(let s=0,o;s<n;++s)isNaN(o=+this._x.call(null,t[s]))||(i[s]=o,o<e&&(e=o),o>r&&(r=o));if(e>r)return this;this.cover(e).cover(r);for(let s=0;s<n;++s)et(this,i[s],t[s]);return this}function qt(t){if(isNaN(t=+t))return this;var n=this._x0,i=this._x1;if(isNaN(n))i=(n=Math.floor(t))+1;else{for(var e=i-n||1,r=this._root,s,o;n>t||t>=i;)switch(o=+(t<n),s=new Array(2),s[o]=r,r=s,e*=2,o){case 0:i=n+e;break;case 1:n=i-e;break}this._root&&this._root.length&&(this._root=r)}return this._x0=n,this._x1=i,this}function It(){var t=[];return this.visit(function(n){if(!n.length)do t.push(n.data);while(n=n.next)}),t}function bt(t){return arguments.length?this.cover(+t[0][0]).cover(+t[1][0]):isNaN(this._x0)?void 0:[[this._x0],[this._x1]]}function P(t,n,i){this.node=t,this.x0=n,this.x1=i}function kt(t,n){var i,e=this._x0,r,s,o=this._x1,u=[],h=this._root,f,l;for(h&&u.push(new P(h,e,o)),n==null?n=1/0:(e=t-n,o=t+n);f=u.pop();)if(!(!(h=f.node)||(r=f.x0)>o||(s=f.x1)<e))if(h.length){var c=(r+s)/2;u.push(new P(h[1],c,s),new P(h[0],r,c)),(l=+(t>=c))&&(f=u[u.length-1],u[u.length-1]=u[u.length-1-l],u[u.length-1-l]=f)}else{var v=Math.abs(t-+this._x.call(null,h.data));v<n&&(n=v,e=t-v,o=t+v,i=h.data)}return i}function Dt(t){if(isNaN(h=+this._x.call(null,t)))return this;var n,i=this._root,e,r,s,o=this._x0,u=this._x1,h,f,l,c,v;if(!i)return this;if(i.length)for(;;){if((l=h>=(f=(o+u)/2))?o=f:u=f,n=i,!(i=i[c=+l]))return this;if(!i.length)break;n[c+1&1]&&(e=n,v=c)}for(;i.data!==t;)if(r=i,!(i=i.next))return this;return(s=i.next)&&delete i.next,r?(s?r.next=s:delete r.next,this):n?(s?n[c]=s:delete n[c],(i=n[0]||n[1])&&i===(n[1]||n[0])&&!i.length&&(e?e[v]=i:this._root=i),this):(this._root=s,this)}function Et(t){for(var n=0,i=t.length;n<i;++n)this.remove(t[n]);return this}function Tt(){return this._root}function jt(){var t=0;return this.visit(function(n){if(!n.length)do++t;while(n=n.next)}),t}function Pt(t){var n=[],i,e=this._root,r,s,o;for(e&&n.push(new P(e,this._x0,this._x1));i=n.pop();)if(!t(e=i.node,s=i.x0,o=i.x1)&&e.length){var u=(s+o)/2;(r=e[1])&&n.push(new P(r,u,o)),(r=e[0])&&n.push(new P(r,s,u))}return this}function Ft(t){var n=[],i=[],e;for(this._root&&n.push(new P(this._root,this._x0,this._x1));e=n.pop();){var r=e.node;if(r.length){var s,o=e.x0,u=e.x1,h=(o+u)/2;(s=r[0])&&n.push(new P(s,o,h)),(s=r[1])&&n.push(new P(s,h,u))}i.push(e)}for(;e=i.pop();)t(e.node,e.x0,e.x1);return this}function St(t){return t[0]}function Ot(t){return arguments.length?(this._x=t,this):this._x}function rt(t,n){var i=new G(n??St,NaN,NaN);return t==null?i:i.addAll(t)}function G(t,n,i){this._x=t,this._x0=n,this._x1=i,this._root=void 0}function st(t){for(var n={data:t.data},i=n;t=t.next;)i=i.next={data:t.data};return n}var k=rt.prototype=G.prototype;k.copy=function(){var t=new G(this._x,this._x0,this._x1),n=this._root,i,e;if(!n)return t;if(!n.length)return t._root=st(n),t;for(i=[{source:n,target:t._root=new Array(2)}];n=i.pop();)for(var r=0;r<2;++r)(e=n.source[r])&&(e.length?i.push({source:e,target:n.target[r]=new Array(2)}):n.target[r]=st(e));return t},k.add=$t,k.addAll=mt,k.cover=qt,k.data=It,k.extent=bt,k.find=kt,k.remove=Dt,k.removeAll=Et,k.root=Tt,k.size=jt,k.visit=Pt,k.visitAfter=Ft,k.x=Ot;function Rt(t){const n=+this._x.call(null,t),i=+this._y.call(null,t);return ot(this.cover(n,i),n,i,t)}function ot(t,n,i,e){if(isNaN(n)||isNaN(i))return t;var r,s=t._root,o={data:e},u=t._x0,h=t._y0,f=t._x1,l=t._y1,c,v,y,_,g,x,a,N;if(!s)return t._root=o,t;for(;s.length;)if((g=n>=(c=(u+f)/2))?u=c:f=c,(x=i>=(v=(h+l)/2))?h=v:l=v,r=s,!(s=s[a=x<<1|g]))return r[a]=o,t;if(y=+t._x.call(null,s.data),_=+t._y.call(null,s.data),n===y&&i===_)return o.next=s,r?r[a]=o:t._root=o,t;do r=r?r[a]=new Array(4):t._root=new Array(4),(g=n>=(c=(u+f)/2))?u=c:f=c,(x=i>=(v=(h+l)/2))?h=v:l=v;while((a=x<<1|g)===(N=(_>=v)<<1|y>=c));return r[N]=s,r[a]=o,t}function Xt(t){var n,i,e=t.length,r,s,o=new Array(e),u=new Array(e),h=1/0,f=1/0,l=-1/0,c=-1/0;for(i=0;i<e;++i)isNaN(r=+this._x.call(null,n=t[i]))||isNaN(s=+this._y.call(null,n))||(o[i]=r,u[i]=s,r<h&&(h=r),r>l&&(l=r),s<f&&(f=s),s>c&&(c=s));if(h>l||f>c)return this;for(this.cover(h,f).cover(l,c),i=0;i<e;++i)ot(this,o[i],u[i],t[i]);return this}function Bt(t,n){if(isNaN(t=+t)||isNaN(n=+n))return this;var i=this._x0,e=this._y0,r=this._x1,s=this._y1;if(isNaN(i))r=(i=Math.floor(t))+1,s=(e=Math.floor(n))+1;else{for(var o=r-i||1,u=this._root,h,f;i>t||t>=r||e>n||n>=s;)switch(f=(n<e)<<1|t<i,h=new Array(4),h[f]=u,u=h,o*=2,f){case 0:r=i+o,s=e+o;break;case 1:i=r-o,s=e+o;break;case 2:r=i+o,e=s-o;break;case 3:i=r-o,e=s-o;break}this._root&&this._root.length&&(this._root=u)}return this._x0=i,this._y0=e,this._x1=r,this._y1=s,this}function Ct(){var t=[];return this.visit(function(n){if(!n.length)do t.push(n.data);while(n=n.next)}),t}function Lt(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]}function I(t,n,i,e,r){this.node=t,this.x0=n,this.y0=i,this.x1=e,this.y1=r}function Yt(t,n,i){var e,r=this._x0,s=this._y0,o,u,h,f,l=this._x1,c=this._y1,v=[],y=this._root,_,g;for(y&&v.push(new I(y,r,s,l,c)),i==null?i=1/0:(r=t-i,s=n-i,l=t+i,c=n+i,i*=i);_=v.pop();)if(!(!(y=_.node)||(o=_.x0)>l||(u=_.y0)>c||(h=_.x1)<r||(f=_.y1)<s))if(y.length){var x=(o+h)/2,a=(u+f)/2;v.push(new I(y[3],x,a,h,f),new I(y[2],o,a,x,f),new I(y[1],x,u,h,a),new I(y[0],o,u,x,a)),(g=(n>=a)<<1|t>=x)&&(_=v[v.length-1],v[v.length-1]=v[v.length-1-g],v[v.length-1-g]=_)}else{var N=t-+this._x.call(null,y.data),d=n-+this._y.call(null,y.data),w=N*N+d*d;if(w<i){var p=Math.sqrt(i=w);r=t-p,s=n-p,l=t+p,c=n+p,e=y.data}}return e}function Ht(t){if(isNaN(l=+this._x.call(null,t))||isNaN(c=+this._y.call(null,t)))return this;var n,i=this._root,e,r,s,o=this._x0,u=this._y0,h=this._x1,f=this._y1,l,c,v,y,_,g,x,a;if(!i)return this;if(i.length)for(;;){if((_=l>=(v=(o+h)/2))?o=v:h=v,(g=c>=(y=(u+f)/2))?u=y:f=y,n=i,!(i=i[x=g<<1|_]))return this;if(!i.length)break;(n[x+1&3]||n[x+2&3]||n[x+3&3])&&(e=n,a=x)}for(;i.data!==t;)if(r=i,!(i=i.next))return this;return(s=i.next)&&delete i.next,r?(s?r.next=s:delete r.next,this):n?(s?n[x]=s:delete n[x],(i=n[0]||n[1]||n[2]||n[3])&&i===(n[3]||n[2]||n[1]||n[0])&&!i.length&&(e?e[a]=i:this._root=i),this):(this._root=s,this)}function Qt(t){for(var n=0,i=t.length;n<i;++n)this.remove(t[n]);return this}function Wt(){return this._root}function Zt(){var t=0;return this.visit(function(n){if(!n.length)do++t;while(n=n.next)}),t}function Gt(t){var n=[],i,e=this._root,r,s,o,u,h;for(e&&n.push(new I(e,this._x0,this._y0,this._x1,this._y1));i=n.pop();)if(!t(e=i.node,s=i.x0,o=i.y0,u=i.x1,h=i.y1)&&e.length){var f=(s+u)/2,l=(o+h)/2;(r=e[3])&&n.push(new I(r,f,l,u,h)),(r=e[2])&&n.push(new I(r,s,l,f,h)),(r=e[1])&&n.push(new I(r,f,o,u,l)),(r=e[0])&&n.push(new I(r,s,o,f,l))}return this}function Jt(t){var n=[],i=[],e;for(this._root&&n.push(new I(this._root,this._x0,this._y0,this._x1,this._y1));e=n.pop();){var r=e.node;if(r.length){var s,o=e.x0,u=e.y0,h=e.x1,f=e.y1,l=(o+h)/2,c=(u+f)/2;(s=r[0])&&n.push(new I(s,o,u,l,c)),(s=r[1])&&n.push(new I(s,l,u,h,c)),(s=r[2])&&n.push(new I(s,o,c,l,f)),(s=r[3])&&n.push(new I(s,l,c,h,f))}i.push(e)}for(;e=i.pop();)t(e.node,e.x0,e.y0,e.x1,e.y1);return this}function Kt(t){return t[0]}function Ut(t){return arguments.length?(this._x=t,this):this._x}function Vt(t){return t[1]}function tn(t){return arguments.length?(this._y=t,this):this._y}function ht(t,n,i){var e=new J(n??Kt,i??Vt,NaN,NaN,NaN,NaN);return t==null?e:e.addAll(t)}function J(t,n,i,e,r,s){this._x=t,this._y=n,this._x0=i,this._y0=e,this._x1=r,this._y1=s,this._root=void 0}function at(t){for(var n={data:t.data},i=n;t=t.next;)i=i.next={data:t.data};return n}var b=ht.prototype=J.prototype;b.copy=function(){var t=new J(this._x,this._y,this._x0,this._y0,this._x1,this._y1),n=this._root,i,e;if(!n)return t;if(!n.length)return t._root=at(n),t;for(i=[{source:n,target:t._root=new Array(4)}];n=i.pop();)for(var r=0;r<4;++r)(e=n.source[r])&&(e.length?i.push({source:e,target:n.target[r]=new Array(4)}):n.target[r]=at(e));return t},b.add=Rt,b.addAll=Xt,b.cover=Bt,b.data=Ct,b.extent=Lt,b.find=Yt,b.remove=Ht,b.removeAll=Qt,b.root=Wt,b.size=Zt,b.visit=Gt,b.visitAfter=Jt,b.x=Ut,b.y=tn;function nn(t){const n=+this._x.call(null,t),i=+this._y.call(null,t),e=+this._z.call(null,t);return ft(this.cover(n,i,e),n,i,e,t)}function ft(t,n,i,e,r){if(isNaN(n)||isNaN(i)||isNaN(e))return t;var s,o=t._root,u={data:r},h=t._x0,f=t._y0,l=t._z0,c=t._x1,v=t._y1,y=t._z1,_,g,x,a,N,d,w,p,M,z,A;if(!o)return t._root=u,t;for(;o.length;)if((w=n>=(_=(h+c)/2))?h=_:c=_,(p=i>=(g=(f+v)/2))?f=g:v=g,(M=e>=(x=(l+y)/2))?l=x:y=x,s=o,!(o=o[z=M<<2|p<<1|w]))return s[z]=u,t;if(a=+t._x.call(null,o.data),N=+t._y.call(null,o.data),d=+t._z.call(null,o.data),n===a&&i===N&&e===d)return u.next=o,s?s[z]=u:t._root=u,t;do s=s?s[z]=new Array(8):t._root=new Array(8),(w=n>=(_=(h+c)/2))?h=_:c=_,(p=i>=(g=(f+v)/2))?f=g:v=g,(M=e>=(x=(l+y)/2))?l=x:y=x;while((z=M<<2|p<<1|w)===(A=(d>=x)<<2|(N>=g)<<1|a>=_));return s[A]=o,s[z]=u,t}function en(t){Array.isArray(t)||(t=Array.from(t));const n=t.length,i=new Float64Array(n),e=new Float64Array(n),r=new Float64Array(n);let s=1/0,o=1/0,u=1/0,h=-1/0,f=-1/0,l=-1/0;for(let c=0,v,y,_,g;c<n;++c)isNaN(y=+this._x.call(null,v=t[c]))||isNaN(_=+this._y.call(null,v))||isNaN(g=+this._z.call(null,v))||(i[c]=y,e[c]=_,r[c]=g,y<s&&(s=y),y>h&&(h=y),_<o&&(o=_),_>f&&(f=_),g<u&&(u=g),g>l&&(l=g));if(s>h||o>f||u>l)return this;this.cover(s,o,u).cover(h,f,l);for(let c=0;c<n;++c)ft(this,i[c],e[c],r[c],t[c]);return this}function rn(t,n,i){if(isNaN(t=+t)||isNaN(n=+n)||isNaN(i=+i))return this;var e=this._x0,r=this._y0,s=this._z0,o=this._x1,u=this._y1,h=this._z1;if(isNaN(e))o=(e=Math.floor(t))+1,u=(r=Math.floor(n))+1,h=(s=Math.floor(i))+1;else{for(var f=o-e||1,l=this._root,c,v;e>t||t>=o||r>n||n>=u||s>i||i>=h;)switch(v=(i<s)<<2|(n<r)<<1|t<e,c=new Array(8),c[v]=l,l=c,f*=2,v){case 0:o=e+f,u=r+f,h=s+f;break;case 1:e=o-f,u=r+f,h=s+f;break;case 2:o=e+f,r=u-f,h=s+f;break;case 3:e=o-f,r=u-f,h=s+f;break;case 4:o=e+f,u=r+f,s=h-f;break;case 5:e=o-f,u=r+f,s=h-f;break;case 6:o=e+f,r=u-f,s=h-f;break;case 7:e=o-f,r=u-f,s=h-f;break}this._root&&this._root.length&&(this._root=l)}return this._x0=e,this._y0=r,this._z0=s,this._x1=o,this._y1=u,this._z1=h,this}function sn(){var t=[];return this.visit(function(n){if(!n.length)do t.push(n.data);while(n=n.next)}),t}function on(t){return arguments.length?this.cover(+t[0][0],+t[0][1],+t[0][2]).cover(+t[1][0],+t[1][1],+t[1][2]):isNaN(this._x0)?void 0:[[this._x0,this._y0,this._z0],[this._x1,this._y1,this._z1]]}function $(t,n,i,e,r,s,o){this.node=t,this.x0=n,this.y0=i,this.z0=e,this.x1=r,this.y1=s,this.z1=o}function hn(t,n,i,e){var r,s=this._x0,o=this._y0,u=this._z0,h,f,l,c,v,y,_=this._x1,g=this._y1,x=this._z1,a=[],N=this._root,d,w;for(N&&a.push(new $(N,s,o,u,_,g,x)),e==null?e=1/0:(s=t-e,o=n-e,u=i-e,_=t+e,g=n+e,x=i+e,e*=e);d=a.pop();)if(!(!(N=d.node)||(h=d.x0)>_||(f=d.y0)>g||(l=d.z0)>x||(c=d.x1)<s||(v=d.y1)<o||(y=d.z1)<u))if(N.length){var p=(h+c)/2,M=(f+v)/2,z=(l+y)/2;a.push(new $(N[7],p,M,z,c,v,y),new $(N[6],h,M,z,p,v,y),new $(N[5],p,f,z,c,M,y),new $(N[4],h,f,z,p,M,y),new $(N[3],p,M,l,c,v,z),new $(N[2],h,M,l,p,v,z),new $(N[1],p,f,l,c,M,z),new $(N[0],h,f,l,p,M,z)),(w=(i>=z)<<2|(n>=M)<<1|t>=p)&&(d=a[a.length-1],a[a.length-1]=a[a.length-1-w],a[a.length-1-w]=d)}else{var A=t-+this._x.call(null,N.data),E=n-+this._y.call(null,N.data),T=i-+this._z.call(null,N.data),D=A*A+E*E+T*T;if(D<e){var m=Math.sqrt(e=D);s=t-m,o=n-m,u=i-m,_=t+m,g=n+m,x=i+m,r=N.data}}return r}const an=(t,n,i,e,r,s)=>Math.sqrt((t-e)**2+(n-r)**2+(i-s)**2);function fn(t,n,i,e){const r=[],s=t-e,o=n-e,u=i-e,h=t+e,f=n+e,l=i+e;return this.visit((c,v,y,_,g,x,a)=>{if(!c.length)do{const N=c.data;an(t,n,i,this._x(N),this._y(N),this._z(N))<=e&&r.push(N)}while(c=c.next);return v>h||y>f||_>l||g<s||x<o||a<u}),r}function un(t){if(isNaN(v=+this._x.call(null,t))||isNaN(y=+this._y.call(null,t))||isNaN(_=+this._z.call(null,t)))return this;var n,i=this._root,e,r,s,o=this._x0,u=this._y0,h=this._z0,f=this._x1,l=this._y1,c=this._z1,v,y,_,g,x,a,N,d,w,p,M;if(!i)return this;if(i.length)for(;;){if((N=v>=(g=(o+f)/2))?o=g:f=g,(d=y>=(x=(u+l)/2))?u=x:l=x,(w=_>=(a=(h+c)/2))?h=a:c=a,n=i,!(i=i[p=w<<2|d<<1|N]))return this;if(!i.length)break;(n[p+1&7]||n[p+2&7]||n[p+3&7]||n[p+4&7]||n[p+5&7]||n[p+6&7]||n[p+7&7])&&(e=n,M=p)}for(;i.data!==t;)if(r=i,!(i=i.next))return this;return(s=i.next)&&delete i.next,r?(s?r.next=s:delete r.next,this):n?(s?n[p]=s:delete n[p],(i=n[0]||n[1]||n[2]||n[3]||n[4]||n[5]||n[6]||n[7])&&i===(n[7]||n[6]||n[5]||n[4]||n[3]||n[2]||n[1]||n[0])&&!i.length&&(e?e[M]=i:this._root=i),this):(this._root=s,this)}function ln(t){for(var n=0,i=t.length;n<i;++n)this.remove(t[n]);return this}function cn(){return this._root}function _n(){var t=0;return this.visit(function(n){if(!n.length)do++t;while(n=n.next)}),t}function vn(t){var n=[],i,e=this._root,r,s,o,u,h,f,l;for(e&&n.push(new $(e,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1));i=n.pop();)if(!t(e=i.node,s=i.x0,o=i.y0,u=i.z0,h=i.x1,f=i.y1,l=i.z1)&&e.length){var c=(s+h)/2,v=(o+f)/2,y=(u+l)/2;(r=e[7])&&n.push(new $(r,c,v,y,h,f,l)),(r=e[6])&&n.push(new $(r,s,v,y,c,f,l)),(r=e[5])&&n.push(new $(r,c,o,y,h,v,l)),(r=e[4])&&n.push(new $(r,s,o,y,c,v,l)),(r=e[3])&&n.push(new $(r,c,v,u,h,f,y)),(r=e[2])&&n.push(new $(r,s,v,u,c,f,y)),(r=e[1])&&n.push(new $(r,c,o,u,h,v,y)),(r=e[0])&&n.push(new $(r,s,o,u,c,v,y))}return this}function xn(t){var n=[],i=[],e;for(this._root&&n.push(new $(this._root,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1));e=n.pop();){var r=e.node;if(r.length){var s,o=e.x0,u=e.y0,h=e.z0,f=e.x1,l=e.y1,c=e.z1,v=(o+f)/2,y=(u+l)/2,_=(h+c)/2;(s=r[0])&&n.push(new $(s,o,u,h,v,y,_)),(s=r[1])&&n.push(new $(s,v,u,h,f,y,_)),(s=r[2])&&n.push(new $(s,o,y,h,v,l,_)),(s=r[3])&&n.push(new $(s,v,y,h,f,l,_)),(s=r[4])&&n.push(new $(s,o,u,_,v,y,c)),(s=r[5])&&n.push(new $(s,v,u,_,f,y,c)),(s=r[6])&&n.push(new $(s,o,y,_,v,l,c)),(s=r[7])&&n.push(new $(s,v,y,_,f,l,c))}i.push(e)}for(;e=i.pop();)t(e.node,e.x0,e.y0,e.z0,e.x1,e.y1,e.z1);return this}function yn(t){return t[0]}function pn(t){return arguments.length?(this._x=t,this):this._x}function gn(t){return t[1]}function wn(t){return arguments.length?(this._y=t,this):this._y}function dn(t){return t[2]}function Nn(t){return arguments.length?(this._z=t,this):this._z}function ut(t,n,i,e){var r=new K(n??yn,i??gn,e??dn,NaN,NaN,NaN,NaN,NaN,NaN);return t==null?r:r.addAll(t)}function K(t,n,i,e,r,s,o,u,h){this._x=t,this._y=n,this._z=i,this._x0=e,this._y0=r,this._z0=s,this._x1=o,this._y1=u,this._z1=h,this._root=void 0}function lt(t){for(var n={data:t.data},i=n;t=t.next;)i=i.next={data:t.data};return n}var q=ut.prototype=K.prototype;q.copy=function(){var t=new K(this._x,this._y,this._z,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1),n=this._root,i,e;if(!n)return t;if(!n.length)return t._root=lt(n),t;for(i=[{source:n,target:t._root=new Array(8)}];n=i.pop();)for(var r=0;r<8;++r)(e=n.source[r])&&(e.length?i.push({source:e,target:n.target[r]=new Array(8)}):n.target[r]=lt(e));return t},q.add=nn,q.addAll=en,q.cover=rn,q.data=sn,q.extent=on,q.find=hn,q.findAllWithinRadius=fn,q.remove=un,q.removeAll=ln,q.root=cn,q.size=_n,q.visit=vn,q.visitAfter=xn,q.x=pn,q.y=wn,q.z=Nn;function X(t){return function(){return t}}function F(t){return(t()-.5)*1e-6}function Mn(t){return t.index}function ct(t,n){var i=t.get(n);if(!i)throw new Error(\\\"node not found: \\\"+n);return i}function zn(t){var n=Mn,i=v,e,r=X(30),s,o,u,h,f,l,c=1;t==null&&(t=[]);function v(a){return 1/Math.min(h[a.source.index],h[a.target.index])}function y(a){for(var N=0,d=t.length;N<c;++N)for(var w=0,p,M,z,A=0,E=0,T=0,D,m;w<d;++w)p=t[w],M=p.source,z=p.target,A=z.x+z.vx-M.x-M.vx||F(l),u>1&&(E=z.y+z.vy-M.y-M.vy||F(l)),u>2&&(T=z.z+z.vz-M.z-M.vz||F(l)),D=Math.sqrt(A*A+E*E+T*T),D=(D-s[w])/D*a*e[w],A*=D,E*=D,T*=D,z.vx-=A*(m=f[w]),u>1&&(z.vy-=E*m),u>2&&(z.vz-=T*m),M.vx+=A*(m=1-m),u>1&&(M.vy+=E*m),u>2&&(M.vz+=T*m)}function _(){if(o){var a,N=o.length,d=t.length,w=new Map(o.map((M,z)=>[n(M,z,o),M])),p;for(a=0,h=new Array(N);a<d;++a)p=t[a],p.index=a,typeof p.source!=\\\"object\\\"&&(p.source=ct(w,p.source)),typeof p.target!=\\\"object\\\"&&(p.target=ct(w,p.target)),h[p.source.index]=(h[p.source.index]||0)+1,h[p.target.index]=(h[p.target.index]||0)+1;for(a=0,f=new Array(d);a<d;++a)p=t[a],f[a]=h[p.source.index]/(h[p.source.index]+h[p.target.index]);e=new Array(d),g(),s=new Array(d),x()}}function g(){if(o)for(var a=0,N=t.length;a<N;++a)e[a]=+i(t[a],a,t)}function x(){if(o)for(var a=0,N=t.length;a<N;++a)s[a]=+r(t[a],a,t)}return y.initialize=function(a,...N){o=a,l=N.find(d=>typeof d==\\\"function\\\")||Math.random,u=N.find(d=>[1,2,3].includes(d))||2,_()},y.links=function(a){return arguments.length?(t=a,_(),y):t},y.id=function(a){return arguments.length?(n=a,y):n},y.iterations=function(a){return arguments.length?(c=+a,y):c},y.strength=function(a){return arguments.length?(i=typeof a==\\\"function\\\"?a:X(+a),g(),y):i},y.distance=function(a){return arguments.length?(r=typeof a==\\\"function\\\"?a:X(+a),x(),y):r},y}var An={value:()=>{}};function _t(){for(var t=0,n=arguments.length,i={},e;t<n;++t){if(!(e=arguments[t]+\\\"\\\")||e in i||/[\\\\s.]/.test(e))throw new Error(\\\"illegal type: \\\"+e);i[e]=[]}return new H(i)}function H(t){this._=t}function $n(t,n){return t.trim().split(/^|\\\\s+/).map(function(i){var e=\\\"\\\",r=i.indexOf(\\\".\\\");if(r>=0&&(e=i.slice(r+1),i=i.slice(0,r)),i&&!n.hasOwnProperty(i))throw new Error(\\\"unknown type: \\\"+i);return{type:i,name:e}})}H.prototype=_t.prototype={constructor:H,on:function(t,n){var i=this._,e=$n(t+\\\"\\\",i),r,s=-1,o=e.length;if(arguments.length<2){for(;++s<o;)if((r=(t=e[s]).type)&&(r=mn(i[r],t.name)))return r;return}if(n!=null&&typeof n!=\\\"function\\\")throw new Error(\\\"invalid callback: \\\"+n);for(;++s<o;)if(r=(t=e[s]).type)i[r]=vt(i[r],t.name,n);else if(n==null)for(r in i)i[r]=vt(i[r],t.name,null);return this},copy:function(){var t={},n=this._;for(var i in n)t[i]=n[i].slice();return new H(t)},call:function(t,n){if((r=arguments.length-2)>0)for(var i=new Array(r),e=0,r,s;e<r;++e)i[e]=arguments[e+2];if(!this._.hasOwnProperty(t))throw new Error(\\\"unknown type: \\\"+t);for(s=this._[t],e=0,r=s.length;e<r;++e)s[e].value.apply(n,i)},apply:function(t,n,i){if(!this._.hasOwnProperty(t))throw new Error(\\\"unknown type: \\\"+t);for(var e=this._[t],r=0,s=e.length;r<s;++r)e[r].value.apply(n,i)}};function mn(t,n){for(var i=0,e=t.length,r;i<e;++i)if((r=t[i]).name===n)return r.value}function vt(t,n,i){for(var e=0,r=t.length;e<r;++e)if(t[e].name===n){t[e]=An,t=t.slice(0,e).concat(t.slice(e+1));break}return i!=null&&t.push({name:n,value:i}),t}var R=0,B=0,C=0,xt=1e3,Q,L,W=0,O=0,Z=0,Y=typeof performance==\\\"object\\\"&&performance.now?performance:Date,yt=typeof window==\\\"object\\\"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function pt(){return O||(yt(qn),O=Y.now()+Z)}function qn(){O=0}function U(){this._call=this._time=this._next=null}U.prototype=gt.prototype={constructor:U,restart:function(t,n,i){if(typeof t!=\\\"function\\\")throw new TypeError(\\\"callback is not a function\\\");i=(i==null?pt():+i)+(n==null?0:+n),!this._next&&L!==this&&(L?L._next=this:Q=this,L=this),this._call=t,this._time=i,V()},stop:function(){this._call&&(this._call=null,this._time=1/0,V())}};function gt(t,n,i){var e=new U;return e.restart(t,n,i),e}function In(){pt(),++R;for(var t=Q,n;t;)(n=O-t._time)>=0&&t._call.call(void 0,n),t=t._next;--R}function wt(){O=(W=Y.now())+Z,R=B=0;try{In()}finally{R=0,kn(),O=0}}function bn(){var t=Y.now(),n=t-W;n>xt&&(Z-=n,W=t)}function kn(){for(var t,n=Q,i,e=1/0;n;)n._call?(e>n._time&&(e=n._time),t=n,n=n._next):(i=n._next,n._next=null,n=t?t._next=i:Q=i);L=t,V(e)}function V(t){if(!R){B&&(B=clearTimeout(B));var n=t-O;n>24?(t<1/0&&(B=setTimeout(wt,t-Y.now()-Z)),C&&(C=clearInterval(C))):(C||(W=Y.now(),C=setInterval(bn,xt)),R=1,yt(wt))}}const Dn=1664525,En=1013904223,dt=4294967296;function Tn(){let t=1;return()=>(t=(Dn*t+En)%dt)/dt}var Nt=3;function tt(t){return t.x}function Mt(t){return t.y}function jn(t){return t.z}var Pn=10,Fn=Math.PI*(3-Math.sqrt(5)),Sn=Math.PI*20/(9+Math.sqrt(221));function On(t,n){n=n||2;var i=Math.min(Nt,Math.max(1,Math.round(n))),e,r=1,s=.001,o=1-Math.pow(s,1/300),u=0,h=.6,f=new Map,l=gt(y),c=_t(\\\"tick\\\",\\\"end\\\"),v=Tn();t==null&&(t=[]);function y(){_(),c.call(\\\"tick\\\",e),r<s&&(l.stop(),c.call(\\\"end\\\",e))}function _(a){var N,d=t.length,w;a===void 0&&(a=1);for(var p=0;p<a;++p)for(r+=(u-r)*o,f.forEach(function(M){M(r)}),N=0;N<d;++N)w=t[N],w.fx==null?w.x+=w.vx*=h:(w.x=w.fx,w.vx=0),i>1&&(w.fy==null?w.y+=w.vy*=h:(w.y=w.fy,w.vy=0)),i>2&&(w.fz==null?w.z+=w.vz*=h:(w.z=w.fz,w.vz=0));return e}function g(){for(var a=0,N=t.length,d;a<N;++a){if(d=t[a],d.index=a,d.fx!=null&&(d.x=d.fx),d.fy!=null&&(d.y=d.fy),d.fz!=null&&(d.z=d.fz),isNaN(d.x)||i>1&&isNaN(d.y)||i>2&&isNaN(d.z)){var w=Pn*(i>2?Math.cbrt(.5+a):i>1?Math.sqrt(.5+a):a),p=a*Fn,M=a*Sn;i===1?d.x=w:i===2?(d.x=w*Math.cos(p),d.y=w*Math.sin(p)):(d.x=w*Math.sin(p)*Math.cos(M),d.y=w*Math.cos(p),d.z=w*Math.sin(p)*Math.sin(M))}(isNaN(d.vx)||i>1&&isNaN(d.vy)||i>2&&isNaN(d.vz))&&(d.vx=0,i>1&&(d.vy=0),i>2&&(d.vz=0))}}function x(a){return a.initialize&&a.initialize(t,v,i),a}return g(),e={tick:_,restart:function(){return l.restart(y),e},stop:function(){return l.stop(),e},numDimensions:function(a){return arguments.length?(i=Math.min(Nt,Math.max(1,Math.round(a))),f.forEach(x),e):i},nodes:function(a){return arguments.length?(t=a,g(),f.forEach(x),e):t},alpha:function(a){return arguments.length?(r=+a,e):r},alphaMin:function(a){return arguments.length?(s=+a,e):s},alphaDecay:function(a){return arguments.length?(o=+a,e):+o},alphaTarget:function(a){return arguments.length?(u=+a,e):u},velocityDecay:function(a){return arguments.length?(h=1-a,e):1-h},randomSource:function(a){return arguments.length?(v=a,f.forEach(x),e):v},force:function(a,N){return arguments.length>1?(N==null?f.delete(a):f.set(a,x(N)),e):f.get(a)},find:function(){var a=Array.prototype.slice.call(arguments),N=a.shift()||0,d=(i>1?a.shift():null)||0,w=(i>2?a.shift():null)||0,p=a.shift()||1/0,M=0,z=t.length,A,E,T,D,m,zt;for(p*=p,M=0;M<z;++M)m=t[M],A=N-m.x,E=d-(m.y||0),T=w-(m.z||0),D=A*A+E*E+T*T,D<p&&(zt=m,p=D);return zt},on:function(a,N){return arguments.length>1?(c.on(a,N),e):c.on(a)}}}function Rn(){var t,n,i,e,r,s=X(-30),o,u=1,h=1/0,f=.81;function l(_){var g,x=t.length,a=(n===1?rt(t,tt):n===2?ht(t,tt,Mt):n===3?ut(t,tt,Mt,jn):null).visitAfter(v);for(r=_,g=0;g<x;++g)i=t[g],a.visit(y)}function c(){if(t){var _,g=t.length,x;for(o=new Array(g),_=0;_<g;++_)x=t[_],o[x.index]=+s(x,_,t)}}function v(_){var g=0,x,a,N=0,d,w,p,M,z=_.length;if(z){for(d=w=p=M=0;M<z;++M)(x=_[M])&&(a=Math.abs(x.value))&&(g+=x.value,N+=a,d+=a*(x.x||0),w+=a*(x.y||0),p+=a*(x.z||0));g*=Math.sqrt(4/z),_.x=d/N,n>1&&(_.y=w/N),n>2&&(_.z=p/N)}else{x=_,x.x=x.data.x,n>1&&(x.y=x.data.y),n>2&&(x.z=x.data.z);do g+=o[x.data.index];while(x=x.next)}_.value=g}function y(_,g,x,a,N){if(!_.value)return!0;var d=[x,a,N][n-1],w=_.x-i.x,p=n>1?_.y-i.y:0,M=n>2?_.z-i.z:0,z=d-g,A=w*w+p*p+M*M;if(z*z/f<A)return A<h&&(w===0&&(w=F(e),A+=w*w),n>1&&p===0&&(p=F(e),A+=p*p),n>2&&M===0&&(M=F(e),A+=M*M),A<u&&(A=Math.sqrt(u*A)),i.vx+=w*_.value*r/A,n>1&&(i.vy+=p*_.value*r/A),n>2&&(i.vz+=M*_.value*r/A)),!0;if(_.length||A>=h)return;(_.data!==i||_.next)&&(w===0&&(w=F(e),A+=w*w),n>1&&p===0&&(p=F(e),A+=p*p),n>2&&M===0&&(M=F(e),A+=M*M),A<u&&(A=Math.sqrt(u*A)));do _.data!==i&&(z=o[_.data.index]*r/A,i.vx+=w*z,n>1&&(i.vy+=p*z),n>2&&(i.vz+=M*z));while(_=_.next)}return l.initialize=function(_,...g){t=_,e=g.find(x=>typeof x==\\\"function\\\")||Math.random,n=g.find(x=>[1,2,3].includes(x))||2,c()},l.strength=function(_){return arguments.length?(s=typeof _==\\\"function\\\"?_:X(+_),c(),l):s},l.distanceMin=function(_){return arguments.length?(u=_*_,l):Math.sqrt(u)},l.distanceMax=function(_){return arguments.length?(h=_*_,l):Math.sqrt(h)},l.theta=function(_){return arguments.length?(f=_*_,l):Math.sqrt(f)},l}let S=null,j=[],nt=0,it=!1;self.onmessage=t=>{const n=t.data;if(n.type===\\\"init\\\"){S&&S.stop(),it=!1,nt=0;const i=n.nodes.length,e=n.params,r=n.initialPositions??{},s=e.dimensions===2?2:3;j=n.nodes.map((h,f)=>{const l=r[h.id];if(l)return{id:h.id,index:f,x:l.x,y:l.y,z:s===2?0:l.z};const c=Math.random()*Math.PI*2,v=e.initialRadius*(.5+Math.random()*.5);if(s===2)return{id:h.id,index:f,x:v*Math.cos(c),y:v*Math.sin(c),z:0};const y=Math.acos(2*Math.random()-1);return{id:h.id,index:f,x:v*Math.sin(y)*Math.cos(c),y:v*Math.sin(y)*Math.sin(c),z:v*Math.cos(y)}});const o=n.links.map(h=>({source:h.source,target:h.target}));S=On(j,s).force(\\\"charge\\\",Rn().strength(e.charge).distanceMax(e.distanceMax).theta(e.theta)).force(\\\"link\\\",zn(o).id(h=>h.id).distance(e.linkDistance).strength(.2)).force(\\\"center\\\",At()).alphaDecay(e.alphaDecay).velocityDecay(e.velocityDecay);const u=n.groups;if(u&&u.length===j.length&&e.clusterStrength>0){const h=e.clusterStrength;S.force(\\\"cluster\\\",f=>{const l={},c={},v={},y={};for(let g=0;g<j.length;g++){const x=u[g];x<0||(l[x]=(l[x]??0)+j[g].x,c[x]=(c[x]??0)+j[g].y,v[x]=(v[x]??0)+(j[g].z||0),y[x]=(y[x]??0)+1)}const _=h*f;for(let g=0;g<j.length;g++){const x=u[g];if(x<0||!y[x])continue;const a=j[g];a.vx=(a.vx||0)+(l[x]/y[x]-a.x)*_,a.vy=(a.vy||0)+(c[x]/y[x]-a.y)*_,s===3&&(a.vz=(a.vz||0)+(v[x]/y[x]-a.z)*_)}})}S.on(\\\"tick\\\",()=>{nt++;const h=S.alpha();if(nt%e.postEvery!==0&&h>e.settledThreshold)return;const f=new Float32Array(i*3);for(let l=0;l<i;l++)f[l*3]=j[l].x||0,f[l*3+1]=j[l].y||0,f[l*3+2]=s===2?0:j[l].z||0;self.postMessage({type:\\\"positions\\\",positions:f.buffer,alpha:h},[f.buffer]),!it&&h<e.settledThreshold&&(it=!0,self.postMessage({type:\\\"settled\\\"}))})}n.type===\\\"stop\\\"&&S&&(S.stop(),S=null)}})();\\n\";\n\nexport function createLayoutWorker(): Worker {\n const blob = new Blob([WORKER_SOURCE], { type: \"application/javascript\" });\n const url = URL.createObjectURL(blob);\n const worker = new Worker(url);\n // Clean up the blob URL after the worker starts\n URL.revokeObjectURL(url);\n return worker;\n}\n","import {\n\tControls,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3,\n\tPlane,\n\tRay,\n\tMathUtils\n} from 'three';\n\n// OrbitControls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\nconst _ray = new Ray();\nconst _plane = new Plane();\nconst _TILT_LIMIT = Math.cos( 70 * MathUtils.DEG2RAD );\n\nconst _v = new Vector3();\nconst _twoPI = 2 * Math.PI;\n\nconst _STATE = {\n\tNONE: - 1,\n\tROTATE: 0,\n\tDOLLY: 1,\n\tPAN: 2,\n\tTOUCH_ROTATE: 3,\n\tTOUCH_PAN: 4,\n\tTOUCH_DOLLY_PAN: 5,\n\tTOUCH_DOLLY_ROTATE: 6\n};\nconst _EPS = 0.000001;\n\nclass OrbitControls extends Controls {\n\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper( object, domElement );\n\n\t\tthis.state = _STATE.NONE;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new Vector3();\n\n\t\t// Sets the 3D cursor (similar to Blender), from which the maxTargetRadius takes effect\n\t\tthis.cursor = new Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// Limit camera target within a spherical area around the cursor\n\t\tthis.minTargetRadius = 0;\n\t\tthis.maxTargetRadius = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.05;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.panSpeed = 1.0;\n\t\tthis.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\t\tthis.zoomToCursor = false;\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t\t// Touch fingers\n\t\tthis.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t// internals\n\n\t\tthis._lastPosition = new Vector3();\n\t\tthis._lastQuaternion = new Quaternion();\n\t\tthis._lastTargetPosition = new Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tthis._quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n\t\tthis._quatInverse = this._quat.clone().invert();\n\n\t\t// current position in spherical coordinates\n\t\tthis._spherical = new Spherical();\n\t\tthis._sphericalDelta = new Spherical();\n\n\t\tthis._scale = 1;\n\t\tthis._panOffset = new Vector3();\n\n\t\tthis._rotateStart = new Vector2();\n\t\tthis._rotateEnd = new Vector2();\n\t\tthis._rotateDelta = new Vector2();\n\n\t\tthis._panStart = new Vector2();\n\t\tthis._panEnd = new Vector2();\n\t\tthis._panDelta = new Vector2();\n\n\t\tthis._dollyStart = new Vector2();\n\t\tthis._dollyEnd = new Vector2();\n\t\tthis._dollyDelta = new Vector2();\n\n\t\tthis._dollyDirection = new Vector3();\n\t\tthis._mouse = new Vector2();\n\t\tthis._performCursorZoom = false;\n\n\t\tthis._pointers = [];\n\t\tthis._pointerPositions = {};\n\n\t\tthis._controlActive = false;\n\n\t\t// event listeners\n\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\t\tthis._onMouseWheel = onMouseWheel.bind( this );\n\t\tthis._onKeyDown = onKeyDown.bind( this );\n\n\t\tthis._onTouchStart = onTouchStart.bind( this );\n\t\tthis._onTouchMove = onTouchMove.bind( this );\n\n\t\tthis._onMouseDown = onMouseDown.bind( this );\n\t\tthis._onMouseMove = onMouseMove.bind( this );\n\n\t\tthis._interceptControlDown = interceptControlDown.bind( this );\n\t\tthis._interceptControlUp = interceptControlUp.bind( this );\n\n\t\t//\n\n\t\tif ( this.domElement !== null ) {\n\n\t\t\tthis.connect();\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\tconnect() {\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\t\tthis.domElement.addEventListener( 'wheel', this._onMouseWheel, { passive: false } );\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.addEventListener( 'keydown', this._interceptControlDown, { passive: true, capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.removeEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.removeEventListener( 'wheel', this._onMouseWheel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.stopListenToKeyEvents();\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.removeEventListener( 'keydown', this._interceptControlDown, { capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'auto';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\tgetPolarAngle() {\n\n\t\treturn this._spherical.phi;\n\n\t}\n\n\tgetAzimuthalAngle() {\n\n\t\treturn this._spherical.theta;\n\n\t}\n\n\tgetDistance() {\n\n\t\treturn this.object.position.distanceTo( this.target );\n\n\t}\n\n\tlistenToKeyEvents( domElement ) {\n\n\t\tdomElement.addEventListener( 'keydown', this._onKeyDown );\n\t\tthis._domElementKeyEvents = domElement;\n\n\t}\n\n\tstopListenToKeyEvents() {\n\n\t\tif ( this._domElementKeyEvents !== null ) {\n\n\t\t\tthis._domElementKeyEvents.removeEventListener( 'keydown', this._onKeyDown );\n\t\t\tthis._domElementKeyEvents = null;\n\n\t\t}\n\n\t}\n\n\tsaveState() {\n\n\t\tthis.target0.copy( this.target );\n\t\tthis.position0.copy( this.object.position );\n\t\tthis.zoom0 = this.object.zoom;\n\n\t}\n\n\treset() {\n\n\t\tthis.target.copy( this.target0 );\n\t\tthis.object.position.copy( this.position0 );\n\t\tthis.object.zoom = this.zoom0;\n\n\t\tthis.object.updateProjectionMatrix();\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t\tthis.update();\n\n\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tupdate( deltaTime = null ) {\n\n\t\tconst position = this.object.position;\n\n\t\t_v.copy( position ).sub( this.target );\n\n\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t_v.applyQuaternion( this._quat );\n\n\t\t// angle from z-axis around y-axis\n\t\tthis._spherical.setFromVector3( _v );\n\n\t\tif ( this.autoRotate && this.state === _STATE.NONE ) {\n\n\t\t\tthis._rotateLeft( this._getAutoRotationAngle( deltaTime ) );\n\n\t\t}\n\n\t\tif ( this.enableDamping ) {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta * this.dampingFactor;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi * this.dampingFactor;\n\n\t\t} else {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi;\n\n\t\t}\n\n\t\t// restrict theta to be between desired limits\n\n\t\tlet min = this.minAzimuthAngle;\n\t\tlet max = this.maxAzimuthAngle;\n\n\t\tif ( isFinite( min ) && isFinite( max ) ) {\n\n\t\t\tif ( min < - Math.PI ) min += _twoPI; else if ( min > Math.PI ) min -= _twoPI;\n\n\t\t\tif ( max < - Math.PI ) max += _twoPI; else if ( max > Math.PI ) max -= _twoPI;\n\n\t\t\tif ( min <= max ) {\n\n\t\t\t\tthis._spherical.theta = Math.max( min, Math.min( max, this._spherical.theta ) );\n\n\t\t\t} else {\n\n\t\t\t\tthis._spherical.theta = ( this._spherical.theta > ( min + max ) / 2 ) ?\n\t\t\t\t\tMath.max( min, this._spherical.theta ) :\n\t\t\t\t\tMath.min( max, this._spherical.theta );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restrict phi to be between desired limits\n\t\tthis._spherical.phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, this._spherical.phi ) );\n\n\t\tthis._spherical.makeSafe();\n\n\n\t\t// move target to panned location\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis.target.addScaledVector( this._panOffset, this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis.target.add( this._panOffset );\n\n\t\t}\n\n\t\t// Limit the target distance from the cursor to create a sphere around the center of interest\n\t\tthis.target.sub( this.cursor );\n\t\tthis.target.clampLength( this.minTargetRadius, this.maxTargetRadius );\n\t\tthis.target.add( this.cursor );\n\n\t\tlet zoomChanged = false;\n\t\t// adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n\t\t// we adjust zoom later in these cases\n\t\tif ( this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius );\n\n\t\t} else {\n\n\t\t\tconst prevRadius = this._spherical.radius;\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius * this._scale );\n\t\t\tzoomChanged = prevRadius != this._spherical.radius;\n\n\t\t}\n\n\t\t_v.setFromSpherical( this._spherical );\n\n\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t_v.applyQuaternion( this._quatInverse );\n\n\t\tposition.copy( this.target ).add( _v );\n\n\t\tthis.object.lookAt( this.target );\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis._sphericalDelta.theta *= ( 1 - this.dampingFactor );\n\t\t\tthis._sphericalDelta.phi *= ( 1 - this.dampingFactor );\n\n\t\t\tthis._panOffset.multiplyScalar( 1 - this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis._sphericalDelta.set( 0, 0, 0 );\n\n\t\t\tthis._panOffset.set( 0, 0, 0 );\n\n\t\t}\n\n\t\t// adjust camera position\n\t\tif ( this.zoomToCursor && this._performCursorZoom ) {\n\n\t\t\tlet newRadius = null;\n\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t// move the camera down the pointer ray\n\t\t\t\t// this method avoids floating point error\n\t\t\t\tconst prevRadius = _v.length();\n\t\t\t\tnewRadius = this._clampDistance( prevRadius * this._scale );\n\n\t\t\t\tconst radiusDelta = prevRadius - newRadius;\n\t\t\t\tthis.object.position.addScaledVector( this._dollyDirection, radiusDelta );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tzoomChanged = !! radiusDelta;\n\n\t\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t\t// adjust the ortho camera position based on zoom changes\n\t\t\t\tconst mouseBefore = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseBefore.unproject( this.object );\n\n\t\t\t\tconst prevZoom = this.object.zoom;\n\t\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t\tzoomChanged = prevZoom !== this.object.zoom;\n\n\t\t\t\tconst mouseAfter = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseAfter.unproject( this.object );\n\n\t\t\t\tthis.object.position.sub( mouseAfter ).add( mouseBefore );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tnewRadius = _v.length();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.' );\n\t\t\t\tthis.zoomToCursor = false;\n\n\t\t\t}\n\n\t\t\t// handle the placement of the target\n\t\t\tif ( newRadius !== null ) {\n\n\t\t\t\tif ( this.screenSpacePanning ) {\n\n\t\t\t\t\t// position the orbit target in front of the new camera position\n\t\t\t\t\tthis.target.set( 0, 0, - 1 )\n\t\t\t\t\t\t.transformDirection( this.object.matrix )\n\t\t\t\t\t\t.multiplyScalar( newRadius )\n\t\t\t\t\t\t.add( this.object.position );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// get the ray and translation plane to compute target\n\t\t\t\t\t_ray.origin.copy( this.object.position );\n\t\t\t\t\t_ray.direction.set( 0, 0, - 1 ).transformDirection( this.object.matrix );\n\n\t\t\t\t\t// if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n\t\t\t\t\t// extremely large values\n\t\t\t\t\tif ( Math.abs( this.object.up.dot( _ray.direction ) ) < _TILT_LIMIT ) {\n\n\t\t\t\t\t\tthis.object.lookAt( this.target );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint( this.object.up, this.target );\n\t\t\t\t\t\t_ray.intersectPlane( _plane, this.target );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\tconst prevZoom = this.object.zoom;\n\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\n\t\t\tif ( prevZoom !== this.object.zoom ) {\n\n\t\t\t\tthis.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._scale = 1;\n\t\tthis._performCursorZoom = false;\n\n\t\t// update condition is:\n\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\tif ( zoomChanged ||\n\t\t\tthis._lastPosition.distanceToSquared( this.object.position ) > _EPS ||\n\t\t\t8 * ( 1 - this._lastQuaternion.dot( this.object.quaternion ) ) > _EPS ||\n\t\t\tthis._lastTargetPosition.distanceToSquared( this.target ) > _EPS ) {\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\tthis._lastPosition.copy( this.object.position );\n\t\t\tthis._lastQuaternion.copy( this.object.quaternion );\n\t\t\tthis._lastTargetPosition.copy( this.target );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_getAutoRotationAngle( deltaTime ) {\n\n\t\tif ( deltaTime !== null ) {\n\n\t\t\treturn ( _twoPI / 60 * this.autoRotateSpeed ) * deltaTime;\n\n\t\t} else {\n\n\t\t\treturn _twoPI / 60 / 60 * this.autoRotateSpeed;\n\n\t\t}\n\n\t}\n\n\t_getZoomScale( delta ) {\n\n\t\tconst normalizedDelta = Math.abs( delta * 0.01 );\n\t\treturn Math.pow( 0.95, this.zoomSpeed * normalizedDelta );\n\n\t}\n\n\t_rotateLeft( angle ) {\n\n\t\tthis._sphericalDelta.theta -= angle;\n\n\t}\n\n\t_rotateUp( angle ) {\n\n\t\tthis._sphericalDelta.phi -= angle;\n\n\t}\n\n\t_panLeft( distance, objectMatrix ) {\n\n\t\t_v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t_v.multiplyScalar( - distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t_panUp( distance, objectMatrix ) {\n\n\t\tif ( this.screenSpacePanning === true ) {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t} else {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t_v.crossVectors( this.object.up, _v );\n\n\t\t}\n\n\t\t_v.multiplyScalar( distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\t_pan( deltaX, deltaY ) {\n\n\t\tconst element = this.domElement;\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t// perspective\n\t\t\tconst position = this.object.position;\n\t\t\t_v.copy( position ).sub( this.target );\n\t\t\tlet targetDistance = _v.length();\n\n\t\t\t// half of the fov is center to top of screen\n\t\t\ttargetDistance *= Math.tan( ( this.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\tthis._panLeft( 2 * deltaX * targetDistance / element.clientHeight, this.object.matrix );\n\t\t\tthis._panUp( 2 * deltaY * targetDistance / element.clientHeight, this.object.matrix );\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t// orthographic\n\t\t\tthis._panLeft( deltaX * ( this.object.right - this.object.left ) / this.object.zoom / element.clientWidth, this.object.matrix );\n\t\t\tthis._panUp( deltaY * ( this.object.top - this.object.bottom ) / this.object.zoom / element.clientHeight, this.object.matrix );\n\n\t\t} else {\n\n\t\t\t// camera neither orthographic nor perspective\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\tthis.enablePan = false;\n\n\t\t}\n\n\t}\n\n\t_dollyOut( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale /= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_dollyIn( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale *= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_updateZoomParameters( x, y ) {\n\n\t\tif ( ! this.zoomToCursor ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._performCursorZoom = true;\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\t\tconst dx = x - rect.left;\n\t\tconst dy = y - rect.top;\n\t\tconst w = rect.width;\n\t\tconst h = rect.height;\n\n\t\tthis._mouse.x = ( dx / w ) * 2 - 1;\n\t\tthis._mouse.y = - ( dy / h ) * 2 + 1;\n\n\t\tthis._dollyDirection.set( this._mouse.x, this._mouse.y, 1 ).unproject( this.object ).sub( this.object.position ).normalize();\n\n\t}\n\n\t_clampDistance( dist ) {\n\n\t\treturn Math.max( this.minDistance, Math.min( this.maxDistance, dist ) );\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\t_handleMouseDownRotate( event ) {\n\n\t\tthis._rotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownDolly( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientX );\n\t\tthis._dollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownPan( event ) {\n\n\t\tthis._panStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseMoveRotate( event ) {\n\n\t\tthis._rotateEnd.set( event.clientX, event.clientY );\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMoveDolly( event ) {\n\n\t\tthis._dollyEnd.set( event.clientX, event.clientY );\n\n\t\tthis._dollyDelta.subVectors( this._dollyEnd, this._dollyStart );\n\n\t\tif ( this._dollyDelta.y > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t} else if ( this._dollyDelta.y < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t}\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMovePan( event ) {\n\n\t\tthis._panEnd.set( event.clientX, event.clientY );\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseWheel( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientY );\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( event.deltaY ) );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( event.deltaY ) );\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\t_handleKeyDown( event ) {\n\n\t\tlet needsUpdate = false;\n\n\t\tswitch ( event.code ) {\n\n\t\t\tcase this.keys.UP:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tthis._rotateUp( _twoPI * this.rotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._pan( 0, this.keyPanSpeed );\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.BOTTOM:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tthis._rotateUp( - _twoPI * this.rotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._pan( 0, - this.keyPanSpeed );\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.LEFT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tthis._rotateLeft( _twoPI * this.rotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._pan( this.keyPanSpeed, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.RIGHT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tthis._rotateLeft( - _twoPI * this.rotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._pan( - this.keyPanSpeed, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.update();\n\n\t\t}\n\n\n\t}\n\n\t_handleTouchStartRotate( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._rotateStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartPan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyStart.set( 0, distance );\n\n\t}\n\n\t_handleTouchStartDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchStartPan( event );\n\n\t}\n\n\t_handleTouchStartDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchStartRotate( event );\n\n\t}\n\n\t_handleTouchMoveRotate( event ) {\n\n\t\tif ( this._pointers.length == 1 ) {\n\n\t\t\tthis._rotateEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t}\n\n\t_handleTouchMovePan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t}\n\n\t_handleTouchMoveDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyEnd.set( 0, distance );\n\n\t\tthis._dollyDelta.set( 0, Math.pow( this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed ) );\n\n\t\tthis._dollyOut( this._dollyDelta.y );\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tconst centerX = ( event.pageX + position.x ) * 0.5;\n\t\tconst centerY = ( event.pageY + position.y ) * 0.5;\n\n\t\tthis._updateZoomParameters( centerX, centerY );\n\n\t}\n\n\t_handleTouchMoveDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchMovePan( event );\n\n\t}\n\n\t_handleTouchMoveDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchMoveRotate( event );\n\n\t}\n\n\t// pointers\n\n\t_addPointer( event ) {\n\n\t\tthis._pointers.push( event.pointerId );\n\n\t}\n\n\t_removePointer( event ) {\n\n\t\tdelete this._pointerPositions[ event.pointerId ];\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) {\n\n\t\t\t\tthis._pointers.splice( i, 1 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_isTrackingPointer( event ) {\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_trackPointer( event ) {\n\n\t\tlet position = this._pointerPositions[ event.pointerId ];\n\n\t\tif ( position === undefined ) {\n\n\t\t\tposition = new Vector2();\n\t\t\tthis._pointerPositions[ event.pointerId ] = position;\n\n\t\t}\n\n\t\tposition.set( event.pageX, event.pageY );\n\n\t}\n\n\t_getSecondPointerPosition( event ) {\n\n\t\tconst pointerId = ( event.pointerId === this._pointers[ 0 ] ) ? this._pointers[ 1 ] : this._pointers[ 0 ];\n\n\t\treturn this._pointerPositions[ pointerId ];\n\n\t}\n\n\t//\n\n\t_customWheelEvent( event ) {\n\n\t\tconst mode = event.deltaMode;\n\n\t\t// minimal wheel event altered to meet delta-zoom demand\n\t\tconst newEvent = {\n\t\t\tclientX: event.clientX,\n\t\t\tclientY: event.clientY,\n\t\t\tdeltaY: event.deltaY,\n\t\t};\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 1: // LINE_MODE\n\t\t\t\tnewEvent.deltaY *= 16;\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // PAGE_MODE\n\t\t\t\tnewEvent.deltaY *= 100;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// detect if event was triggered by pinching\n\t\tif ( event.ctrlKey && ! this._controlActive ) {\n\n\t\t\tnewEvent.deltaY *= 10;\n\n\t\t}\n\n\t\treturn newEvent;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this._pointers.length === 0 ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t//\n\n\tif ( this._isTrackingPointer( event ) ) return;\n\n\t//\n\n\tthis._addPointer( event );\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchStart( event );\n\n\t} else {\n\n\t\tthis._onMouseDown( event );\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchMove( event );\n\n\t} else {\n\n\t\tthis._onMouseMove( event );\n\n\t}\n\n}\n\nfunction onPointerUp( event ) {\n\n\tthis._removePointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 0:\n\n\t\t\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\t\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tconst pointerId = this._pointers[ 0 ];\n\t\t\tconst position = this._pointerPositions[ pointerId ];\n\n\t\t\t// minimal placeholder event - allows state correction on pointer-up\n\t\t\tthis._onTouchStart( { pointerId: pointerId, pageX: position.x, pageY: position.y } );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseDown( event ) {\n\n\tlet mouseAction;\n\n\tswitch ( event.button ) {\n\n\t\tcase 0:\n\n\t\t\tmouseAction = this.mouseButtons.LEFT;\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tmouseAction = this.mouseButtons.MIDDLE;\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tmouseAction = this.mouseButtons.RIGHT;\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tmouseAction = - 1;\n\n\t}\n\n\tswitch ( mouseAction ) {\n\n\t\tcase MOUSE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseDownDolly( event );\n\n\t\t\tthis.state = _STATE.DOLLY;\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.ROTATE:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.PAN:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onMouseMove( event ) {\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleMouseMoveRotate( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseMoveDolly( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleMouseMovePan( event );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseWheel( event ) {\n\n\tif ( this.enabled === false || this.enableZoom === false || this.state !== _STATE.NONE ) return;\n\n\tevent.preventDefault();\n\n\tthis.dispatchEvent( _startEvent );\n\n\tthis._handleMouseWheel( this._customWheelEvent( event ) );\n\n\tthis.dispatchEvent( _endEvent );\n\n}\n\nfunction onKeyDown( event ) {\n\n\tif ( this.enabled === false || this.enablePan === false ) return;\n\n\tthis._handleKeyDown( event );\n\n}\n\nfunction onTouchStart( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 1:\n\n\t\t\tswitch ( this.touches.ONE ) {\n\n\t\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.PAN:\n\n\t\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tswitch ( this.touches.TWO ) {\n\n\t\t\t\tcase TOUCH.DOLLY_PAN:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onTouchMove( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.TOUCH_ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMovePan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_PAN:\n\n\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyPan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nfunction interceptControlDown( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = true;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.addEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nfunction interceptControlUp( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = false;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.removeEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nexport { OrbitControls };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tname: 'CopyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\tthis.isPass = true;\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\nclass ShaderPass extends Pass {\n\n\tconstructor( shader, textureID ) {\n\n\t\tsuper();\n\n\t\tthis.textureID = ( textureID !== undefined ) ? textureID : 'tDiffuse';\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import { Pass } from './Pass.js';\n\nclass MaskPass extends Pass {\n\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.clear = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis.inverse = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer and make them writable for subsequent rendering/clearing\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\tstate.buffers.color.setMask( true );\n\t\tstate.buffers.depth.setMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\nclass ClearMaskPass extends Pass {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.needsSwap = false;\n\n\t}\n\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n","import {\n\tClock,\n\tHalfFloatType,\n\tNoBlending,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { MaskPass } from './MaskPass.js';\nimport { ClearMaskPass } from './MaskPass.js';\n\nclass EffectComposer {\n\n\tconstructor( renderer, renderTarget ) {\n\n\t\tthis.renderer = renderer;\n\n\t\tthis._pixelRatio = renderer.getPixelRatio();\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, { type: HalfFloatType } );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tthis.renderToScreen = true;\n\n\t\tthis.passes = [];\n\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\t\tthis.copyPass.material.blending = NoBlending;\n\n\t\tthis.clock = new Clock();\n\n\t}\n\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\n\t\tthis.copyPass.dispose();\n\n\t}\n\n}\n\nexport { EffectComposer };\n","import {\n\tColor\n} from 'three';\nimport { Pass } from './Pass.js';\n\nclass RenderPass extends Pass {\n\n\tconstructor( scene, camera, overrideMaterial = null, clearColor = null, clearAlpha = null ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.overrideMaterial = overrideMaterial;\n\n\t\tthis.clearColor = clearColor;\n\t\tthis.clearAlpha = clearAlpha;\n\n\t\tthis.clear = true;\n\t\tthis.clearDepth = false;\n\t\tthis.needsSwap = false;\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tlet oldClearAlpha, oldOverrideMaterial;\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\toldOverrideMaterial = this.scene.overrideMaterial;\n\n\t\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\trenderer.setClearColor( this.clearColor, renderer.getClearAlpha() );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\t\t\trenderer.setClearAlpha( this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth == true ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\n\t\tif ( this.clear === true ) {\n\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// restore\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.setClearColor( this._oldClearColor );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\trenderer.setClearAlpha( oldClearAlpha );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\tthis.scene.overrideMaterial = oldOverrideMaterial;\n\n\t\t}\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n}\n\nexport { RenderPass };\n","import {\n\tColor\n} from 'three';\n\n/**\n * Luminosity\n * http://en.wikipedia.org/wiki/Luminosity\n */\n\nconst LuminosityHighPassShader = {\n\n\tname: 'LuminosityHighPassShader',\n\n\tshaderID: 'luminosityHighPass',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'luminosityThreshold': { value: 1.0 },\n\t\t'smoothWidth': { value: 1.0 },\n\t\t'defaultColor': { value: new Color( 0x000000 ) },\n\t\t'defaultOpacity': { value: 0.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat v = luminance( texel.xyz );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`\n\n};\n\nexport { LuminosityHighPassShader };\n","import {\n\tAdditiveBlending,\n\tColor,\n\tHalfFloatType,\n\tMeshBasicMaterial,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { LuminosityHighPassShader } from '../shaders/LuminosityHighPassShader.js';\n\n/**\n * UnrealBloomPass is inspired by the bloom pass of Unreal Engine. It creates a\n * mip map chain of bloom textures and blurs them with different radii. Because\n * of the weighted combination of mips, and because larger blurs are done on\n * higher mips, this effect provides good quality and performance.\n *\n * Reference:\n * - https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/\n */\nclass UnrealBloomPass extends Pass {\n\n\tconstructor( resolution, strength, radius, threshold ) {\n\n\t\tsuper();\n\n\t\tthis.strength = ( strength !== undefined ) ? strength : 1;\n\t\tthis.radius = radius;\n\t\tthis.threshold = threshold;\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\t// create color only once here, reuse it later inside the render function\n\t\tthis.clearColor = new Color( 0, 0, 0 );\n\n\t\t// render targets\n\t\tthis.renderTargetsHorizontal = [];\n\t\tthis.renderTargetsVertical = [];\n\t\tthis.nMips = 5;\n\t\tlet resx = Math.round( this.resolution.x / 2 );\n\t\tlet resy = Math.round( this.resolution.y / 2 );\n\n\t\tthis.renderTargetBright = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetBright.texture.name = 'UnrealBloomPass.bright';\n\t\tthis.renderTargetBright.texture.generateMipmaps = false;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tconst renderTargetHorizontal = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\n\t\t\trenderTargetHorizontal.texture.name = 'UnrealBloomPass.h' + i;\n\t\t\trenderTargetHorizontal.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsHorizontal.push( renderTargetHorizontal );\n\n\t\t\tconst renderTargetVertical = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\n\t\t\trenderTargetVertical.texture.name = 'UnrealBloomPass.v' + i;\n\t\t\trenderTargetVertical.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsVertical.push( renderTargetVertical );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// luminosity high pass material\n\n\t\tconst highPassShader = LuminosityHighPassShader;\n\t\tthis.highPassUniforms = UniformsUtils.clone( highPassShader.uniforms );\n\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = threshold;\n\t\tthis.highPassUniforms[ 'smoothWidth' ].value = 0.01;\n\n\t\tthis.materialHighPassFilter = new ShaderMaterial( {\n\t\t\tuniforms: this.highPassUniforms,\n\t\t\tvertexShader: highPassShader.vertexShader,\n\t\t\tfragmentShader: highPassShader.fragmentShader\n\t\t} );\n\n\t\t// gaussian blur materials\n\n\t\tthis.separableBlurMaterials = [];\n\t\tconst kernelSizeArray = [ 3, 5, 7, 9, 11 ];\n\t\tresx = Math.round( this.resolution.x / 2 );\n\t\tresy = Math.round( this.resolution.y / 2 );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials.push( this.getSeperableBlurMaterial( kernelSizeArray[ i ] ) );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'invSize' ].value = new Vector2( 1 / resx, 1 / resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// composite material\n\n\t\tthis.compositeMaterial = this.getCompositeMaterial( this.nMips );\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture1' ].value = this.renderTargetsVertical[ 0 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture2' ].value = this.renderTargetsVertical[ 1 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture3' ].value = this.renderTargetsVertical[ 2 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture4' ].value = this.renderTargetsVertical[ 3 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture5' ].value = this.renderTargetsVertical[ 4 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = 0.1;\n\n\t\tconst bloomFactors = [ 1.0, 0.8, 0.6, 0.4, 0.2 ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomFactors' ].value = bloomFactors;\n\t\tthis.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\t// blend material\n\n\t\tconst copyShader = CopyShader;\n\n\t\tthis.copyUniforms = UniformsUtils.clone( copyShader.uniforms );\n\n\t\tthis.blendMaterial = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: copyShader.vertexShader,\n\t\t\tfragmentShader: copyShader.fragmentShader,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tthis.enabled = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis.oldClearAlpha = 1;\n\n\t\tthis.basic = new MeshBasicMaterial();\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.renderTargetsHorizontal.length; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].dispose();\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.renderTargetsVertical.length; i ++ ) {\n\n\t\t\tthis.renderTargetsVertical[ i ].dispose();\n\n\t\t}\n\n\t\tthis.renderTargetBright.dispose();\n\n\t\t//\n\n\t\tfor ( let i = 0; i < this.separableBlurMaterials.length; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials[ i ].dispose();\n\n\t\t}\n\n\t\tthis.compositeMaterial.dispose();\n\t\tthis.blendMaterial.dispose();\n\t\tthis.basic.dispose();\n\n\t\t//\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tlet resx = Math.round( width / 2 );\n\t\tlet resy = Math.round( height / 2 );\n\n\t\tthis.renderTargetBright.setSize( resx, resy );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].setSize( resx, resy );\n\t\t\tthis.renderTargetsVertical[ i ].setSize( resx, resy );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'invSize' ].value = new Vector2( 1 / resx, 1 / resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.setClearColor( this.clearColor, 0 );\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t// Render input to screen\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.fsQuad.material = this.basic;\n\t\t\tthis.basic.map = readBuffer.texture;\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// 1. Extract Bright Areas\n\n\t\tthis.highPassUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = this.threshold;\n\t\tthis.fsQuad.material = this.materialHighPassFilter;\n\n\t\trenderer.setRenderTarget( this.renderTargetBright );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// 2. Blur All the mips progressively\n\n\t\tlet inputRenderTarget = this.renderTargetBright;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.fsQuad.material = this.separableBlurMaterials[ i ];\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = inputRenderTarget.texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = UnrealBloomPass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = this.renderTargetsHorizontal[ i ].texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = UnrealBloomPass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetsVertical[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tinputRenderTarget = this.renderTargetsVertical[ i ];\n\n\t\t}\n\n\t\t// Composite All the mips\n\n\t\tthis.fsQuad.material = this.compositeMaterial;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = this.strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = this.radius;\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ 0 ] );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// Blend it additively over the input texture\n\n\t\tthis.fsQuad.material = this.blendMaterial;\n\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetsHorizontal[ 0 ].texture;\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// Restore renderer settings\n\n\t\trenderer.setClearColor( this._oldClearColor, this.oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\tgetSeperableBlurMaterial( kernelRadius ) {\n\n\t\tconst coefficients = [];\n\n\t\tfor ( let i = 0; i < kernelRadius; i ++ ) {\n\n\t\t\tcoefficients.push( 0.39894 * Math.exp( - 0.5 * i * i / ( kernelRadius * kernelRadius ) ) / kernelRadius );\n\n\t\t}\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'KERNEL_RADIUS': kernelRadius\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'invSize': { value: new Vector2( 0.5, 0.5 ) }, // inverse texture size\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'gaussianCoefficients': { value: coefficients } // precomputed Gaussian coefficients\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 invSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float gaussianCoefficients[KERNEL_RADIUS];\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat weightSum = gaussianCoefficients[0];\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianCoefficients[i];\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;\n\t\t\t\t\t\tvec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;\n\t\t\t\t\t\tdiffuseSum += (sample1 + sample2) * w;\n\t\t\t\t\t\tweightSum += 2.0 * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4(diffuseSum/weightSum, 1.0);\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetCompositeMaterial( nMips ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'NUM_MIPS': nMips\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'blurTexture1': { value: null },\n\t\t\t\t'blurTexture2': { value: null },\n\t\t\t\t'blurTexture3': { value: null },\n\t\t\t\t'blurTexture4': { value: null },\n\t\t\t\t'blurTexture5': { value: null },\n\t\t\t\t'bloomStrength': { value: 1.0 },\n\t\t\t\t'bloomFactors': { value: null },\n\t\t\t\t'bloomTintColors': { value: null },\n\t\t\t\t'bloomRadius': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n}\n\nUnrealBloomPass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nUnrealBloomPass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { UnrealBloomPass };\n","/**\n * Visual effects: star field, bloom, fog.\n */\nimport * as THREE from \"three\";\n\n/** Create a background star field of random points on a sphere */\nexport function createStarField(count: number, radius: number): THREE.Points {\n const geo = new THREE.BufferGeometry();\n const positions = new Float32Array(count * 3);\n const colors = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const r = radius * (0.4 + Math.random() * 0.6);\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n positions[i * 3] = r * Math.sin(phi) * Math.cos(theta);\n positions[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta);\n positions[i * 3 + 2] = r * Math.cos(phi);\n const b = 0.5 + Math.random() * 0.5;\n colors[i * 3] = b * (0.8 + Math.random() * 0.2);\n colors[i * 3 + 1] = b * (0.85 + Math.random() * 0.15);\n colors[i * 3 + 2] = b;\n }\n geo.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n geo.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n return new THREE.Points(\n geo,\n new THREE.PointsMaterial({\n size: 1.5,\n vertexColors: true,\n transparent: true,\n opacity: 0.7,\n sizeAttenuation: true,\n depthWrite: false,\n })\n );\n}\n\n/** Create exponential fog matching background color */\nexport function createFog(\n backgroundColor: number,\n density: number,\n nodeCount: number\n): THREE.FogExp2 | null {\n if (density <= 0 || nodeCount >= 15000) return null;\n return new THREE.FogExp2(backgroundColor, density * 0.5);\n}\n","/**\n * Node selection and N-hop highlight logic.\n * Performs BFS from selected node to compute highlight gradient.\n */\nimport * as THREE from \"three\";\nimport type { GraphNode, GraphLink } from \"../types\";\nimport type { ResolvedTheme } from \"../themes/resolve-theme\";\n\n/** Build adjacency map from links */\nexport function buildAdjacencyMapFromLinks(\n links: GraphLink[]\n): Map<string, string[]> {\n const adj = new Map<string, string[]>();\n for (const l of links) {\n const s = typeof l.source === \"object\" ? (l.source as any).id : l.source;\n const t = typeof l.target === \"object\" ? (l.target as any).id : l.target;\n if (!adj.has(s)) adj.set(s, []);\n if (!adj.has(t)) adj.set(t, []);\n adj.get(s)!.push(t);\n adj.get(t)!.push(s);\n }\n return adj;\n}\n\n/** BFS to find nodes within N hops of a root node */\nexport function computeHighlightSet(\n rootId: string,\n adjacencyMap: Map<string, string[]>,\n maxHops: number\n): Map<string, number> {\n const visited = new Map<string, number>();\n visited.set(rootId, 0);\n const queue = [rootId];\n while (queue.length > 0) {\n const current = queue.shift()!;\n const dist = visited.get(current)!;\n if (dist >= maxHops) continue;\n for (const nb of adjacencyMap.get(current) ?? []) {\n if (!visited.has(nb)) {\n visited.set(nb, dist + 1);\n queue.push(nb);\n }\n }\n }\n return visited;\n}\n\n/** Apply selection highlight to node colors (dim non-selected, brighten selected) */\nexport function applyNodeHighlight(\n nodesMesh: THREE.InstancedMesh,\n nodes: GraphNode[],\n selectedNodeId: string | null,\n highlightSet: Map<string, number> | null,\n theme: ResolvedTheme\n): void {\n const nc = nodes.length;\n const tmpColor = new THREE.Color();\n const brightTmp = new THREE.Color();\n const bgColor = new THREE.Color(theme.backgroundColor);\n\n for (let i = 0; i < nc; i++) {\n const node = nodes[i];\n const baseColor = theme.nodeColor(node.type);\n const brightColor = theme.nodeColorBright(node.type);\n\n if (!highlightSet) {\n // Normal state\n tmpColor.set(baseColor);\n } else if (node.id === selectedNodeId) {\n if (theme.isLight) {\n // Light background: whitening would erase the node — use the\n // saturated bright variant instead (ring carries the emphasis).\n tmpColor.set(brightColor);\n } else {\n // Selected — near-white HDR glow (exceeds 1.0 for bloom pickup)\n tmpColor.set(brightColor);\n brightTmp.setRGB(1, 1, 1);\n tmpColor.lerp(brightTmp, 0.65);\n tmpColor.multiplyScalar(1.4); // HDR overshoot for bloom magnet\n // Clamp to 2.0 to prevent over-saturation (match original)\n tmpColor.r = Math.min(tmpColor.r, 2.0);\n tmpColor.g = Math.min(tmpColor.g, 2.0);\n tmpColor.b = Math.min(tmpColor.b, 2.0);\n }\n } else if (highlightSet.has(node.id)) {\n const hop = highlightSet.get(node.id)!;\n if (hop === 1) {\n tmpColor.set(brightColor).multiplyScalar(1.2);\n } else if (hop === 2) {\n tmpColor.set(baseColor);\n brightTmp.set(brightColor);\n tmpColor.lerp(brightTmp, 0.5);\n } else {\n tmpColor.set(baseColor).multiplyScalar(0.6);\n }\n } else if (theme.isLight) {\n // Heavily dimmed — fade toward the light background\n tmpColor.set(baseColor).lerp(bgColor, 0.88);\n } else {\n // Heavily dimmed — nearly invisible\n tmpColor.set(baseColor).multiplyScalar(0.04);\n }\n\n nodesMesh.setColorAt(i, tmpColor);\n }\n if (nodesMesh.instanceColor) nodesMesh.instanceColor.needsUpdate = true;\n\n // Boost glow for highlights\n const mat = nodesMesh.material as THREE.ShaderMaterial;\n if (mat.uniforms?.uGlowIntensity) {\n mat.uniforms.uGlowIntensity.value = highlightSet ? 1.5 : 1.0;\n }\n}\n\n/** Apply selection highlight to edge colors */\nexport function applyEdgeHighlight(\n edgesMesh: THREE.LineSegments,\n links: GraphLink[],\n edgeNodeIndices: [number, number][],\n edgeLinkIndices: number[],\n highlightSet: Map<string, number> | null,\n edgeOpacity: number,\n nodeCount: number,\n theme: ResolvedTheme\n): void {\n const colorAttr = edgesMesh.geometry.attributes.color;\n if (!colorAttr) return;\n\n const colorArr = colorAttr.array as Float32Array;\n const validCount = edgeNodeIndices.length;\n const tmpColor = new THREE.Color();\n const bgColor = new THREE.Color(theme.backgroundColor);\n\n for (let i = 0; i < validCount; i++) {\n const origIdx = edgeLinkIndices[i];\n const link = links[origIdx];\n const sId =\n typeof link?.source === \"object\" ? (link.source as any).id : link?.source;\n const tId =\n typeof link?.target === \"object\" ? (link.target as any).id : link?.target;\n\n if (!highlightSet) {\n tmpColor.set(theme.linkColor(link?.type));\n } else if (highlightSet.has(sId) && highlightSet.has(tId)) {\n const maxHopVal = Math.max(highlightSet.get(sId)!, highlightSet.get(tId)!);\n tmpColor.set(theme.linkColor(link?.type));\n if (maxHopVal <= 1) {\n if (theme.isLight) {\n tmpColor.multiplyScalar(0.55);\n } else {\n tmpColor.multiplyScalar(1.8);\n tmpColor.r = Math.min(tmpColor.r, 1);\n tmpColor.g = Math.min(tmpColor.g, 1);\n tmpColor.b = Math.min(tmpColor.b, 1);\n }\n } else if (maxHopVal === 2) {\n tmpColor.multiplyScalar(theme.isLight ? 0.8 : 1.2);\n }\n } else if (theme.isLight) {\n tmpColor.set(theme.linkColor(link?.type)).lerp(bgColor, 0.85);\n } else {\n tmpColor.setRGB(0.01, 0.01, 0.02);\n }\n\n colorArr[i * 6 + 0] = tmpColor.r;\n colorArr[i * 6 + 1] = tmpColor.g;\n colorArr[i * 6 + 2] = tmpColor.b;\n colorArr[i * 6 + 3] = tmpColor.r;\n colorArr[i * 6 + 4] = tmpColor.g;\n colorArr[i * 6 + 5] = tmpColor.b;\n }\n colorAttr.needsUpdate = true;\n\n // Adaptive edge opacity\n (edgesMesh.material as THREE.LineBasicMaterial).opacity = highlightSet\n ? Math.min(edgeOpacity * 1.5, 0.6)\n : nodeCount > 15000\n ? 0.08\n : nodeCount > 5000\n ? 0.12\n : edgeOpacity;\n}\n\n/** Create selection ring (double ring for strong visual) */\nexport function createSelectionRing(): THREE.Group {\n const group = new THREE.Group();\n\n const ringGeo = new THREE.RingGeometry(1.2, 1.5, 48);\n const ringMat = new THREE.MeshBasicMaterial({\n color: 0xffffff,\n transparent: true,\n opacity: 0.9,\n side: THREE.DoubleSide,\n depthWrite: false,\n });\n group.add(new THREE.Mesh(ringGeo, ringMat));\n\n const outerGeo = new THREE.RingGeometry(1.6, 2.2, 48);\n const outerMat = new THREE.MeshBasicMaterial({\n color: 0xffffff,\n transparent: true,\n opacity: 0.3,\n side: THREE.DoubleSide,\n depthWrite: false,\n });\n group.add(new THREE.Mesh(outerGeo, outerMat));\n\n group.visible = false;\n return group;\n}\n\n/** Update selection ring position and color */\nexport function updateSelectionRing(\n ring: THREE.Group,\n selectedNodeId: string | null,\n nodeIdToIndex: Map<string, number>,\n positions: Float32Array | null,\n scales: Float32Array | null,\n theme: ResolvedTheme,\n nodeType?: string\n): void {\n if (!selectedNodeId || !positions) {\n ring.visible = false;\n return;\n }\n\n const idx = nodeIdToIndex.get(selectedNodeId);\n if (idx === undefined || !scales) {\n ring.visible = false;\n return;\n }\n\n ring.position.set(\n positions[idx * 3],\n positions[idx * 3 + 1],\n positions[idx * 3 + 2]\n );\n const sc = scales[idx] * 1.6;\n ring.scale.set(sc, sc, sc);\n ring.visible = true;\n\n const ringColor = theme.nodeColorBright(nodeType);\n ring.children.forEach((child) => {\n (child as THREE.Mesh).material &&\n ((child as THREE.Mesh).material as THREE.MeshBasicMaterial).color.set(\n ringColor\n );\n });\n}\n","/**\n * Sprite-based label system with distance/val priority culling.\n * Uses a fixed pool of sprites to avoid per-frame allocation.\n */\nimport * as THREE from \"three\";\nimport type { GraphNode } from \"../types\";\nimport type { ResolvedTheme } from \"../themes/resolve-theme\";\n\nconst LABEL_UPDATE_MS = 250;\n\nexport interface LabelState {\n group: THREE.Group;\n sprites: THREE.Sprite[];\n textureCache: Map<string, { texture: THREE.CanvasTexture; aspect: number }>;\n lastUpdate: number;\n}\n\n/** Create the label sprite pool */\nexport function createLabelSystem(maxLabels: number): LabelState {\n const group = new THREE.Group();\n group.renderOrder = 999;\n const sprites: THREE.Sprite[] = [];\n\n for (let i = 0; i < maxLabels; i++) {\n const mat = new THREE.SpriteMaterial({\n transparent: true,\n depthWrite: false,\n depthTest: false,\n sizeAttenuation: true,\n opacity: 0,\n });\n const sprite = new THREE.Sprite(mat);\n sprite.visible = false;\n group.add(sprite);\n sprites.push(sprite);\n }\n\n return {\n group,\n sprites,\n textureCache: new Map(),\n lastUpdate: 0,\n };\n}\n\n/** Default label text extraction (matches original getLabelText) */\nfunction defaultLabelText(node: GraphNode): string {\n const label = node.label ?? node.id ?? \"\";\n // For repo-type nodes, extract the last path component (e.g. \"owner/repo\" → \"repo\")\n if (node.type === \"repo\" && label.includes(\"/\")) {\n return label.split(\"/\").pop()!;\n }\n return label.length > 30 ? label.substring(0, 27) + \"\\u2026\" : label;\n}\n\n/** Get or create a cached canvas texture for a label */\nfunction getOrCreateTexture(\n cache: LabelState[\"textureCache\"],\n nodeId: string,\n text: string,\n color: string\n): { texture: THREE.CanvasTexture; aspect: number } {\n if (cache.has(nodeId)) return cache.get(nodeId)!;\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\")!;\n const fontSize = 64;\n ctx.font = `bold ${fontSize}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif`;\n const metrics = ctx.measureText(text);\n const pw = Math.ceil(metrics.width) + 32;\n const ph = fontSize + 24;\n canvas.width = pw;\n canvas.height = ph;\n\n ctx.font = `bold ${fontSize}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.shadowColor = \"rgba(0,0,0,0.95)\";\n ctx.shadowBlur = 8;\n ctx.shadowOffsetY = 2;\n ctx.fillStyle = color;\n ctx.fillText(text, pw / 2, ph / 2);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.minFilter = THREE.LinearFilter;\n const aspect = pw / ph;\n const entry = { texture, aspect };\n cache.set(nodeId, entry);\n\n // Evict old entries if cache is too large\n if (cache.size > 500) {\n const iter = cache.keys();\n for (let i = 0; i < 100; i++) {\n const key = iter.next().value;\n if (key === undefined) break;\n const old = cache.get(key);\n if (old?.texture) old.texture.dispose();\n cache.delete(key);\n }\n }\n return entry;\n}\n\n/** Update visible labels based on camera distance and node priority */\nexport function updateLabels(\n state: LabelState,\n nodes: GraphNode[],\n positions: Float32Array | null,\n scales: Float32Array | null,\n camera: THREE.PerspectiveCamera,\n theme: ResolvedTheme,\n showLabels: boolean,\n labelScale: number,\n labelThreshold: number,\n maxLabels: number,\n labelFormatter?: (node: GraphNode) => string,\n highlightSet?: Map<string, number> | null,\n hidden?: Uint8Array | null\n): void {\n if (\n !positions ||\n nodes.length === 0 ||\n !showLabels\n ) {\n for (const sp of state.sprites) sp.visible = false;\n return;\n }\n\n const now = performance.now();\n if (now - state.lastUpdate < LABEL_UPDATE_MS) return;\n state.lastUpdate = now;\n\n const nc = nodes.length;\n const camPos = camera.position;\n const maxDist = 150 + labelThreshold * 3000;\n const maxDistSq = maxDist * maxDist;\n\n // Find candidate nodes within range\n // When a highlight set is active, only consider highlighted nodes\n const candidates: { idx: number; distSq: number; val: number }[] = [];\n for (let i = 0; i < nc; i++) {\n // Skip hidden (filtered-out) nodes\n if (hidden && hidden[i]) continue;\n // Skip non-highlighted nodes when selection is active\n if (highlightSet && !highlightSet.has(nodes[i].id)) continue;\n\n const dx = positions[i * 3] - camPos.x;\n const dy = positions[i * 3 + 1] - camPos.y;\n const dz = positions[i * 3 + 2] - camPos.z;\n const distSq = dx * dx + dy * dy + dz * dz;\n if (distSq < maxDistSq) {\n candidates.push({ idx: i, distSq, val: nodes[i].val ?? 1 });\n }\n }\n\n // Sort by priority: higher val + closer distance\n candidates.sort((a, b) => b.val / b.distSq - a.val / a.distSq);\n\n const count = Math.min(candidates.length, maxLabels);\n\n for (let i = 0; i < count; i++) {\n const c = candidates[i];\n const node = nodes[c.idx];\n const sprite = state.sprites[i];\n\n const text = labelFormatter ? labelFormatter(node) : defaultLabelText(node);\n const color = theme.nodeColorBright(node.type);\n const entry = getOrCreateTexture(state.textureCache, node.id, text, color);\n\n if (sprite.material.map !== entry.texture) {\n sprite.material.map = entry.texture;\n sprite.material.needsUpdate = true;\n }\n sprite.material.opacity = 0.9;\n\n const nodeScale = scales?.[c.idx] ?? 5;\n sprite.position.set(\n positions[c.idx * 3],\n positions[c.idx * 3 + 1] + nodeScale + 4,\n positions[c.idx * 3 + 2]\n );\n\n const baseH = 5 * labelScale;\n sprite.scale.set(baseH * entry.aspect, baseH, 1);\n sprite.visible = true;\n }\n\n // Hide unused sprites\n for (let i = count; i < state.sprites.length; i++) {\n state.sprites[i].visible = false;\n }\n}\n\n/** Dispose all label resources */\nexport function disposeLabelSystem(state: LabelState): void {\n for (const sp of state.sprites) {\n if (sp.material) (sp.material as THREE.SpriteMaterial).dispose();\n }\n for (const [, entry] of state.textureCache) {\n if (entry.texture) entry.texture.dispose();\n }\n state.textureCache.clear();\n}\n","/**\n * Keyboard-driven camera controls with two modes:\n *\n * **Orbit mode**:\n * z / x → zoom in / out (acceleration toward/away from target)\n * Arrow keys → orbit camera (rotate around target) — full 360°\n * Azimuth auto-corrects when camera is upside down (past 180° pitch).\n *\n * **Fly mode** (default):\n * Z / X → thrust forward / backward\n * A / D / ← / → → yaw (turn left / right)\n * W / S / ↑ / ↓ → pitch (up / down)\n * Inertia-based with friction decay.\n * Yaw direction auto-corrects when camera is upside down.\n *\n * Both modes use quaternion rotation for gimbal-lock-free movement.\n * Scoped to a container element — only responds when focused.\n */\nimport * as THREE from \"three\";\nimport type { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\n\nexport interface KeyboardControlState {\n /**\n * Called each frame. Returns true when keyboard is driving camera,\n * signalling the caller to skip OrbitControls.update().\n */\n update: () => boolean;\n cleanup: () => void;\n /** Update the fly speed multiplier at runtime */\n setFlySpeed: (speed: number) => void;\n /** Enable/disable keyboard camera control (disabled in 2D mode) */\n setEnabled: (enabled: boolean) => void;\n /** Switch control scheme at runtime (\"pan\" is used by 2D mode) */\n setMode: (mode: \"fly\" | \"orbit\" | \"pan\") => void;\n}\n\n/* ── Orbit mode constants (constant speed, no acceleration) ── */\nconst ORBIT_ROTATE_SPEED = 0.058;\nconst ORBIT_ZOOM_FACTOR = 0.015;\n\n/* ── Fly mode constants (constant speed, no acceleration) ── */\nconst FLY_THRUST_SPEED = 0.056;\nconst FLY_TURN_RATE = 0.041;\n\n// Reusable objects (avoid per-frame GC)\nconst _offset = new THREE.Vector3();\nconst _right = new THREE.Vector3();\nconst _q = new THREE.Quaternion();\nconst _dir = new THREE.Vector3();\nconst _worldUp = new THREE.Vector3(0, 1, 0);\n\n/* ── Pan mode constants (2D plane navigation) ── */\nconst PAN_SPEED = 0.02; // fraction of camera-target distance per frame\nconst PAN_ZOOM_FACTOR = 0.02;\n\n/* ── Pan mode: arrows/WASD pan in screen space, z/x dolly (2D mode) ── */\nfunction createPanUpdate(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n keys: Record<string, boolean>\n): () => boolean {\n const _panRight = new THREE.Vector3();\n const _panUp = new THREE.Vector3();\n const _panOffset = new THREE.Vector3();\n\n return function update(): boolean {\n let dx = 0;\n let dy = 0;\n if (keys[\"ArrowLeft\"] || keys[\"a\"] || keys[\"A\"]) dx -= 1;\n if (keys[\"ArrowRight\"] || keys[\"d\"] || keys[\"D\"]) dx += 1;\n if (keys[\"ArrowUp\"] || keys[\"w\"] || keys[\"W\"]) dy += 1;\n if (keys[\"ArrowDown\"] || keys[\"s\"] || keys[\"S\"]) dy -= 1;\n const zoomIn = keys[\"z\"] || keys[\"Z\"] || keys[\"+\"] || keys[\"=\"];\n const zoomOut = keys[\"x\"] || keys[\"X\"] || keys[\"-\"] || keys[\"_\"];\n\n if (!dx && !dy && !zoomIn && !zoomOut) return false;\n\n const target = controls.target as THREE.Vector3;\n const dist = camera.position.distanceTo(target);\n\n if (dx || dy) {\n // Screen-aligned pan: move camera + target along the camera's\n // local right/up axes so it stays intuitive when the plane is tilted\n const step = Math.max(dist, 50) * PAN_SPEED;\n _panRight.setFromMatrixColumn(camera.matrix, 0);\n _panUp.setFromMatrixColumn(camera.matrix, 1);\n _panOffset\n .set(0, 0, 0)\n .addScaledVector(_panRight, dx * step)\n .addScaledVector(_panUp, dy * step);\n camera.position.add(_panOffset);\n target.add(_panOffset);\n }\n\n if (zoomIn || zoomOut) {\n const factor = zoomIn ? -PAN_ZOOM_FACTOR : PAN_ZOOM_FACTOR;\n _panOffset.copy(camera.position).sub(target);\n const newLen = Math.max(\n controls.minDistance,\n Math.min(controls.maxDistance, _panOffset.length() * (1 + factor))\n );\n _panOffset.setLength(newLen);\n camera.position.copy(target).add(_panOffset);\n }\n\n return true;\n };\n}\n\n/* ── Orbit mode (constant speed, no velocity/friction) ── */\nfunction createOrbitUpdate(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n keys: Record<string, boolean>\n): () => boolean {\n return function update(): boolean {\n let zoom = 0;\n let azimuth = 0;\n let polar = 0;\n\n if (keys[\"z\"] || keys[\"Z\"]) zoom -= ORBIT_ROTATE_SPEED;\n if (keys[\"x\"] || keys[\"X\"]) zoom += ORBIT_ROTATE_SPEED;\n if (keys[\"ArrowLeft\"]) azimuth -= ORBIT_ROTATE_SPEED;\n if (keys[\"ArrowRight\"]) azimuth += ORBIT_ROTATE_SPEED;\n if (keys[\"ArrowUp\"]) polar -= ORBIT_ROTATE_SPEED;\n if (keys[\"ArrowDown\"]) polar += ORBIT_ROTATE_SPEED;\n\n const hasMotion = zoom !== 0 || azimuth !== 0 || polar !== 0;\n if (!hasMotion) return false;\n\n const target = controls.target as THREE.Vector3;\n _offset.copy(camera.position).sub(target);\n let radius = _offset.length();\n\n if (zoom !== 0) {\n radius *= (1 + zoom * ORBIT_ZOOM_FACTOR * radius * 0.01);\n radius = Math.max(controls.minDistance, Math.min(controls.maxDistance, radius));\n }\n\n if (azimuth !== 0) {\n // When camera.up is flipped (past 180° pitch), rotating around the flipped\n // axis reverses the azimuth direction on screen — causing left/right inversion.\n // Flip the sign so orbit direction stays consistent regardless of orientation.\n const upDot = camera.up.dot(_worldUp);\n const azSign = upDot < 0 ? -1 : 1;\n _q.setFromAxisAngle(camera.up, -azimuth * azSign);\n _offset.applyQuaternion(_q);\n }\n\n if (polar !== 0) {\n _right.copy(_offset).normalize().cross(camera.up).normalize();\n if (_right.lengthSq() < 0.001) {\n _right.setFromMatrixColumn(camera.matrixWorld, 0);\n }\n _q.setFromAxisAngle(_right, polar);\n _offset.applyQuaternion(_q);\n camera.up.applyQuaternion(_q).normalize();\n }\n\n _offset.normalize().multiplyScalar(radius);\n camera.position.copy(target).add(_offset);\n camera.lookAt(target);\n controls.target.copy(target);\n\n return true;\n };\n}\n\n/* ── Fly mode (constant speed, no velocity/friction) ── */\nfunction createFlyUpdate(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n keys: Record<string, boolean>,\n state: { flySpeed: number }\n): () => boolean {\n return function update(): boolean {\n const speedMul = state.flySpeed;\n\n let thrust = 0;\n let yaw = 0;\n let pitch = 0;\n\n // Thrust (forward / backward along camera direction)\n if (keys[\"z\"] || keys[\"Z\"]) thrust += FLY_THRUST_SPEED * speedMul;\n if (keys[\"x\"] || keys[\"X\"]) thrust -= FLY_THRUST_SPEED * speedMul;\n\n // Yaw (left / right)\n if (keys[\"a\"] || keys[\"A\"] || keys[\"ArrowLeft\"]) yaw += FLY_TURN_RATE;\n if (keys[\"d\"] || keys[\"D\"] || keys[\"ArrowRight\"]) yaw -= FLY_TURN_RATE;\n\n // Pitch (up / down)\n if (keys[\"w\"] || keys[\"W\"] || keys[\"ArrowUp\"]) pitch += FLY_TURN_RATE;\n if (keys[\"s\"] || keys[\"S\"] || keys[\"ArrowDown\"]) pitch -= FLY_TURN_RATE;\n\n const hasMotion = thrust !== 0 || yaw !== 0 || pitch !== 0;\n if (!hasMotion) return false;\n\n // ── Yaw: rotate around world Y axis ──\n // When camera is upside-down (up·worldY < 0), invert yaw\n // so that \"left\" input always moves the view left on screen.\n if (yaw !== 0) {\n const upDot = camera.up.dot(_worldUp);\n const yawSign = upDot < 0 ? -1 : 1;\n _q.setFromAxisAngle(_worldUp, yaw * yawSign);\n camera.quaternion.premultiply(_q);\n camera.up.applyQuaternion(_q).normalize();\n }\n\n // ── Pitch: rotate around camera-local right axis ──\n if (pitch !== 0) {\n _right.setFromMatrixColumn(camera.matrixWorld, 0).normalize();\n _q.setFromAxisAngle(_right, pitch);\n camera.quaternion.premultiply(_q);\n camera.up.applyQuaternion(_q).normalize();\n }\n\n // ── Thrust: move along camera's forward direction ──\n if (thrust !== 0) {\n const lookDist = camera.position.distanceTo(controls.target as THREE.Vector3);\n const distScale = Math.max(0.3, lookDist * 0.003);\n camera.getWorldDirection(_dir);\n _dir.multiplyScalar(thrust * distScale * 100);\n camera.position.add(_dir);\n (controls.target as THREE.Vector3).add(_dir);\n }\n\n return true;\n };\n}\n\nexport function setupKeyboardControls(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n container: HTMLElement,\n mode: \"fly\" | \"orbit\" | \"pan\" = \"fly\",\n flySpeed: number = 1.0\n): KeyboardControlState {\n const keys: Record<string, boolean> = {};\n const state = { flySpeed };\n\n function onKeyDown(e: KeyboardEvent) {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return;\n keys[e.key] = true;\n }\n function onKeyUp(e: KeyboardEvent) {\n keys[e.key] = false;\n }\n function onBlur() {\n for (const k of Object.keys(keys)) keys[k] = false;\n }\n\n container.addEventListener(\"keydown\", onKeyDown);\n container.addEventListener(\"keyup\", onKeyUp);\n container.addEventListener(\"blur\", onBlur);\n\n let enabled = true;\n let currentMode: \"fly\" | \"orbit\" | \"pan\" = mode;\n const updaters: Record<\"fly\" | \"orbit\" | \"pan\", () => boolean> = {\n fly: createFlyUpdate(camera, controls, keys, state),\n orbit: createOrbitUpdate(camera, controls, keys),\n pan: createPanUpdate(camera, controls, keys),\n };\n const updateFn = () => (enabled ? updaters[currentMode]() : false);\n\n function cleanup() {\n container.removeEventListener(\"keydown\", onKeyDown);\n container.removeEventListener(\"keyup\", onKeyUp);\n container.removeEventListener(\"blur\", onBlur);\n }\n\n function setFlySpeed(speed: number) {\n state.flySpeed = speed;\n }\n\n function setEnabled(on: boolean) {\n enabled = on;\n if (!on) for (const k of Object.keys(keys)) keys[k] = false;\n }\n\n function setMode(m: \"fly\" | \"orbit\" | \"pan\") {\n currentMode = m;\n for (const k of Object.keys(keys)) keys[k] = false;\n }\n\n return { update: updateFn, cleanup, setFlySpeed, setEnabled, setMode };\n}\n","/**\n * Three.js scene initialization: scene, camera, renderer, controls, post-processing.\n */\nimport * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/examples/jsm/postprocessing/RenderPass.js\";\nimport { UnrealBloomPass } from \"three/examples/jsm/postprocessing/UnrealBloomPass.js\";\nimport type { NavigationConfig, RendererConfig, StyleConfig } from \"../types\";\nimport { createStarField } from \"./effects\";\nimport { createSelectionRing } from \"./selection\";\nimport {\n createLabelSystem,\n type LabelState,\n} from \"./label-system\";\nimport { setupKeyboardControls, type KeyboardControlState } from \"./keyboard\";\n\nexport interface SceneState {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n renderer: THREE.WebGLRenderer;\n controls: OrbitControls;\n stars: THREE.Points;\n selectionRing: THREE.Group;\n labels: LabelState;\n composer: EffectComposer | null;\n bloomPass: UnrealBloomPass | null;\n keyboard: KeyboardControlState;\n scrollCleanup: () => void;\n /** Mutable runtime flags shared with input handlers */\n flags: { is2D: boolean; keyboardMode3D: \"fly\" | \"orbit\" };\n}\n\nexport function createScene(\n container: HTMLElement,\n backgroundColor: string,\n style: Required<StyleConfig>,\n rendererConfig?: RendererConfig\n): SceneState {\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(backgroundColor);\n\n const w = container.clientWidth || 800;\n const h = container.clientHeight || 600;\n const camera = new THREE.PerspectiveCamera(60, w / h, 1, 50000);\n camera.position.set(0, 0, 800);\n\n const renderer = new THREE.WebGLRenderer({\n antialias: rendererConfig?.antialias ?? false,\n powerPreference: \"high-performance\",\n });\n renderer.setSize(w, h);\n renderer.setPixelRatio(\n Math.min(window.devicePixelRatio, rendererConfig?.pixelRatioMax ?? 1.5)\n );\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 1.2;\n\n const canvas = renderer.domElement;\n canvas.style.setProperty(\"display\", \"block\", \"important\");\n // Block native HTML5 drag / text-selection from hijacking pointer drags\n // (otherwise the browser can flip the cursor to \"no-drop\" mid-drag and\n // swallow the pan/rotate gesture).\n canvas.draggable = false;\n canvas.style.userSelect = \"none\";\n canvas.style.setProperty(\"-webkit-user-drag\", \"none\");\n canvas.style.touchAction = \"none\";\n const onDragStart = (e: DragEvent) => e.preventDefault();\n canvas.addEventListener(\"dragstart\", onDragStart);\n const onSelectStart = (e: Event) => e.preventDefault();\n canvas.addEventListener(\"selectstart\", onSelectStart);\n container.appendChild(canvas);\n\n const controls = new OrbitControls(camera, canvas);\n controls.enableDamping = true;\n controls.dampingFactor = 0.12;\n controls.rotateSpeed = 0.5;\n controls.zoomSpeed = 1.2;\n controls.minDistance = 10;\n controls.maxDistance = 30000;\n\n // Ambient light\n scene.add(new THREE.AmbientLight(0xffffff, 0.8));\n\n // Star field\n const stars = createStarField(4000, 8000);\n stars.visible = style.starField;\n scene.add(stars);\n\n // Selection ring\n const selectionRing = createSelectionRing();\n scene.add(selectionRing);\n\n // Labels\n const labels = createLabelSystem(style.maxLabels);\n scene.add(labels.group);\n\n // Keyboard controls — scoped to container (default: fly mode, matching original)\n const cameraMode = rendererConfig?.cameraMode ?? \"fly\";\n const keyboard = setupKeyboardControls(camera, controls, container, cameraMode, style.flySpeed ?? 1.0);\n\n // Custom scroll handler: linear zoom without acceleration/inertia.\n // Moves camera + target along look direction, proportional to scroll delta.\n // In 2D mode OrbitControls handles wheel + pinch itself (enableZoom).\n controls.enableZoom = false;\n const flags: { is2D: boolean; keyboardMode3D: \"fly\" | \"orbit\" } = {\n is2D: false,\n keyboardMode3D: cameraMode,\n };\n const _wheelDir = new THREE.Vector3();\n const onWheel = (e: WheelEvent) => {\n if (flags.is2D) return;\n e.preventDefault();\n let delta = -e.deltaY;\n if (e.deltaMode === 1) delta *= 40; // line → pixels\n if (e.deltaMode === 2) delta *= 800; // page → pixels\n camera.getWorldDirection(_wheelDir);\n const dist = camera.position.distanceTo(controls.target as THREE.Vector3);\n const moveAmount = delta * 0.002 * Math.max(dist * 0.1, 1);\n camera.position.addScaledVector(_wheelDir, moveAmount);\n (controls.target as THREE.Vector3).addScaledVector(_wheelDir, moveAmount);\n };\n canvas.addEventListener(\"wheel\", onWheel, { passive: false });\n const scrollCleanup = () => {\n canvas.removeEventListener(\"wheel\", onWheel);\n canvas.removeEventListener(\"dragstart\", onDragStart);\n canvas.removeEventListener(\"selectstart\", onSelectStart);\n };\n\n return {\n scene,\n camera,\n renderer,\n controls,\n stars,\n selectionRing,\n labels,\n composer: null,\n bloomPass: null,\n keyboard,\n scrollCleanup,\n flags,\n };\n}\n\nconst MOUSE_ACTION = {\n rotate: THREE.MOUSE.ROTATE,\n pan: THREE.MOUSE.PAN,\n} as const;\n\n/**\n * Apply the navigation scheme for the current layout dimensionality,\n * honouring per-consumer overrides. Defaults — 3D: left=rotate,\n * right=pan, keyboard=cameraMode; 2D: left=pan, right=rotate,\n * keyboard=\"pan\" (and the camera snaps to face the z=0 plane head-on).\n */\nexport function applyNavigationMode(\n state: SceneState,\n is2D: boolean,\n nav?: NavigationConfig\n): void {\n const { controls, camera, keyboard } = state;\n state.flags.is2D = is2D;\n\n const left = nav?.leftButton ?? (is2D ? \"pan\" : \"rotate\");\n const right = nav?.rightButton ?? (is2D ? \"rotate\" : \"pan\");\n controls.mouseButtons = {\n LEFT: MOUSE_ACTION[left],\n MIDDLE: THREE.MOUSE.DOLLY,\n RIGHT: MOUSE_ACTION[right],\n };\n controls.enableRotate = left === \"rotate\" || right === \"rotate\";\n controls.touches =\n left === \"pan\"\n ? { ONE: THREE.TOUCH.PAN, TWO: THREE.TOUCH.DOLLY_PAN }\n : { ONE: THREE.TOUCH.ROTATE, TWO: THREE.TOUCH.DOLLY_PAN };\n // 2D uses OrbitControls dolly (wheel + pinch); 3D keeps the custom\n // linear wheel handler registered in createScene.\n controls.enableZoom = is2D;\n controls.screenSpacePanning = is2D;\n\n const kb = nav?.keyboard ?? (is2D ? \"pan\" : state.flags.keyboardMode3D);\n if (kb === \"off\") {\n keyboard.setEnabled(false);\n } else {\n keyboard.setEnabled(true);\n keyboard.setMode(kb);\n }\n\n if (is2D) {\n // Snap to a head-on view of the plane, keeping the current distance\n const t = controls.target as THREE.Vector3;\n const dist = Math.max(camera.position.distanceTo(t), 50);\n t.z = 0;\n camera.up.set(0, 1, 0);\n camera.position.set(t.x, t.y, dist);\n camera.lookAt(t);\n }\n controls.update();\n}\n\n/** Initialize bloom post-processing */\nexport function initBloom(\n state: SceneState,\n nodeCount: number,\n style: Required<StyleConfig>\n): void {\n if (state.composer) return;\n try {\n const { renderer, scene, camera } = state;\n const composer = new EffectComposer(renderer);\n composer.addPass(new RenderPass(scene, camera));\n const bloomRes = nodeCount > 30000 ? 3 : nodeCount > 10000 ? 2 : 1.5;\n const bloom = new UnrealBloomPass(\n new THREE.Vector2(\n renderer.domElement.width / bloomRes,\n renderer.domElement.height / bloomRes\n ),\n style.bloomStrength,\n style.bloomRadius,\n style.bloomThreshold\n );\n composer.addPass(bloom);\n state.composer = composer;\n state.bloomPass = bloom;\n } catch (_) {\n // Bloom not supported — fallback to regular render\n }\n}\n\n/** Start the animation loop, returns cancel function */\nexport function startAnimationLoop(\n state: SceneState,\n onTick?: () => void\n): () => void {\n let animFrame: number;\n let wasKeyboardActive = false;\n const _syncDir = new THREE.Vector3();\n\n function animate() {\n animFrame = requestAnimationFrame(animate);\n // When keyboard is driving camera, skip OrbitControls.update()\n // to prevent its polar angle clamping from overriding our rotation\n const keyboardActive = state.keyboard.update();\n\n // When keyboard navigation just stopped, sync OrbitControls to\n // current camera state so the view doesn't snap back.\n if (wasKeyboardActive && !keyboardActive) {\n const dist = state.camera.position.distanceTo(\n state.controls.target as THREE.Vector3\n );\n state.camera.getWorldDirection(_syncDir);\n (state.controls.target as THREE.Vector3)\n .copy(state.camera.position)\n .add(_syncDir.multiplyScalar(dist));\n // Reset up to world-Y so OrbitControls works correctly\n state.camera.up.set(0, 1, 0);\n state.camera.lookAt(state.controls.target as THREE.Vector3);\n }\n wasKeyboardActive = keyboardActive;\n\n if (!keyboardActive) state.controls.update();\n\n if (state.selectionRing.visible) {\n state.selectionRing.quaternion.copy(state.camera.quaternion);\n }\n\n onTick?.();\n\n if (state.composer) {\n state.composer.render();\n } else {\n state.renderer.render(state.scene, state.camera);\n }\n }\n animate();\n\n return () => cancelAnimationFrame(animFrame);\n}\n\n/** Set up resize observer for the container */\nexport function setupResize(\n container: HTMLElement,\n state: SceneState\n): ResizeObserver {\n const observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n if (width === 0 || height === 0) return;\n state.camera.aspect = width / height;\n state.camera.updateProjectionMatrix();\n state.renderer.setSize(width, height);\n if (state.composer) state.composer.setSize(width, height);\n });\n observer.observe(container);\n return observer;\n}\n","/**\n * Node rendering: InstancedMesh with custom celestial body shader.\n * All nodes are rendered in a single GPU draw call.\n */\nimport * as THREE from \"three\";\nimport type { GraphNode } from \"../types\";\nimport type { ResolvedTheme } from \"../themes/resolve-theme\";\n\n/** Vertex shader: instance transform + color passthrough */\nconst NODE_VERTEX_SHADER = /* glsl */ `\n varying vec3 vNormal;\n varying vec3 vViewDir;\n varying vec3 vColor;\n\n void main() {\n vColor = vec3(1.0);\n #ifdef USE_INSTANCING_COLOR\n vColor = instanceColor;\n #endif\n\n vec4 localPos = vec4(position, 1.0);\n #ifdef USE_INSTANCING\n localPos = instanceMatrix * localPos;\n #endif\n vec4 mvPosition = modelViewMatrix * localPos;\n\n vec3 n = normal;\n #ifdef USE_INSTANCING\n n = mat3(instanceMatrix) * n;\n #endif\n vNormal = normalize(normalMatrix * n);\n vViewDir = normalize(-mvPosition.xyz);\n\n gl_Position = projectionMatrix * mvPosition;\n }\n`;\n\n/** Fragment shader: Fresnel rim glow + subsurface scatter */\nconst NODE_FRAGMENT_SHADER = /* glsl */ `\n uniform float uGlowIntensity;\n varying vec3 vNormal;\n varying vec3 vViewDir;\n varying vec3 vColor;\n\n void main() {\n vec3 n = normalize(vNormal);\n vec3 v = normalize(vViewDir);\n float NdotV = max(dot(n, v), 0.0);\n\n // Fresnel rim glow\n float fresnel = pow(1.0 - NdotV, 3.0);\n // Core gradient — brighter center\n float core = smoothstep(0.0, 1.0, NdotV);\n // Soft directional light\n vec3 lightDir = normalize(vec3(0.4, 0.8, 0.6));\n float diffuse = max(dot(n, lightDir), 0.0) * 0.25 + 0.75;\n\n // Color composition\n vec3 baseColor = vColor;\n vec3 centerColor = mix(baseColor, vec3(1.0), 0.35);\n vec3 edgeColor = baseColor * 1.3;\n vec3 bodyColor = mix(edgeColor, centerColor, core) * diffuse;\n\n // Rim glow (bloom picks this up for halo)\n vec3 rimColor = (baseColor + vec3(0.25)) * 1.6;\n // Subsurface scatter approximation\n float scatter = pow(NdotV, 0.4) * 0.15;\n\n vec3 color = bodyColor * 0.85;\n color += rimColor * fresnel * 0.7;\n color += baseColor * scatter;\n color *= uGlowIntensity;\n\n gl_FragColor = vec4(color, 1.0);\n }\n`;\n\nexport interface NodeMeshResult {\n mesh: THREE.InstancedMesh;\n material: THREE.ShaderMaterial;\n scales: Float32Array;\n}\n\n/** Compute node scales from val range */\nexport function computeNodeScales(\n nodes: GraphNode[],\n minSize: number,\n maxSize: number\n): Float32Array {\n const nc = nodes.length;\n let vMin = Infinity, vMax = -Infinity;\n for (const n of nodes) {\n const v = n.val ?? 1;\n if (v < vMin) vMin = v;\n if (v > vMax) vMax = v;\n }\n if (!isFinite(vMin)) vMin = 1;\n if (!isFinite(vMax)) vMax = 1;\n\n const scales = new Float32Array(nc);\n for (let i = 0; i < nc; i++) {\n const raw = nodes[i].val ?? 1;\n const t = vMax > vMin ? (raw - vMin) / (vMax - vMin) : 0;\n scales[i] = minSize + t * (maxSize - minSize);\n }\n return scales;\n}\n\n/** Create the InstancedMesh for all nodes */\nexport function createNodeMesh(\n nodes: GraphNode[],\n scales: Float32Array,\n theme: ResolvedTheme\n): NodeMeshResult {\n const nc = nodes.length;\n\n // Adaptive geometry quality\n const segments = nc > 50000 ? 8 : nc > 15000 ? 12 : 16;\n const rings = nc > 50000 ? 6 : nc > 15000 ? 8 : 12;\n const sphereGeo = new THREE.SphereGeometry(1, segments, rings);\n\n const material = new THREE.ShaderMaterial({\n uniforms: { uGlowIntensity: { value: 1.0 } },\n vertexShader: NODE_VERTEX_SHADER,\n fragmentShader: NODE_FRAGMENT_SHADER,\n transparent: false,\n depthWrite: true,\n });\n\n const mesh = new THREE.InstancedMesh(sphereGeo, material, nc);\n mesh.instanceMatrix.setUsage(THREE.DynamicDrawUsage);\n\n // Set initial colors from theme\n const tmpColor = new THREE.Color();\n for (let i = 0; i < nc; i++) {\n tmpColor.set(theme.nodeColor(nodes[i].type));\n mesh.setColorAt(i, tmpColor);\n }\n mesh.instanceColor!.needsUpdate = true;\n\n // Set initial random positions\n const tmpMatrix = new THREE.Matrix4();\n const tmpQuat = new THREE.Quaternion();\n const tmpPos = new THREE.Vector3();\n const tmpScale = new THREE.Vector3();\n for (let i = 0; i < nc; i++) {\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n const r = 100 + Math.random() * 300;\n tmpPos.set(\n r * Math.sin(phi) * Math.cos(theta),\n r * Math.sin(phi) * Math.sin(theta),\n r * Math.cos(phi)\n );\n const sc = scales[i];\n tmpScale.set(sc, sc, sc);\n tmpMatrix.compose(tmpPos, tmpQuat, tmpScale);\n mesh.setMatrixAt(i, tmpMatrix);\n }\n mesh.instanceMatrix.needsUpdate = true;\n mesh.computeBoundingSphere();\n\n return { mesh, material, scales };\n}\n\n/** Update instance matrices from position array */\nexport function updateNodePositions(\n mesh: THREE.InstancedMesh,\n positions: Float32Array,\n scales: Float32Array,\n nodeCount: number,\n hidden?: Uint8Array | null\n): void {\n const pos = new THREE.Vector3();\n const scale = new THREE.Vector3();\n const quat = new THREE.Quaternion();\n const mat = new THREE.Matrix4();\n\n for (let i = 0; i < nodeCount; i++) {\n pos.set(positions[i * 3], positions[i * 3 + 1], positions[i * 3 + 2]);\n // Hidden nodes collapse to near-zero scale: invisible, un-raycastable,\n // but the instance stays allocated so indices never shift and the\n // layout keeps running — showing them again is just a matrix update.\n const sc = hidden && hidden[i] ? 1e-4 : scales[i];\n scale.set(sc, sc, sc);\n mat.compose(pos, quat, scale);\n mesh.setMatrixAt(i, mat);\n }\n mesh.instanceMatrix.needsUpdate = true;\n mesh.computeBoundingSphere();\n}\n","/**\n * Edge rendering: LineSegments with per-edge coloring.\n * All edges rendered in a single GPU draw call.\n */\nimport * as THREE from \"three\";\nimport type { GraphLink } from \"../types\";\nimport type { ResolvedTheme } from \"../themes/resolve-theme\";\n\nexport interface EdgeMeshResult {\n mesh: THREE.LineSegments;\n geometry: THREE.BufferGeometry;\n positionArray: Float32Array;\n colorArray: Float32Array;\n /** Maps valid edge index → [sourceNodeIdx, targetNodeIdx] */\n edgeNodeIndices: [number, number][];\n /** Maps valid edge index → original link index */\n edgeLinkIndices: number[];\n}\n\n/**\n * Build edge index mappings:\n * - edgeNodeIndices: [srcIdx, tgtIdx] for each valid edge\n * - edgeLinkIndices: original link index for each valid edge\n */\nexport function buildEdgeMappings(\n links: GraphLink[],\n nodeIdToIndex: Map<string, number>\n): { edgeNodeIndices: [number, number][]; edgeLinkIndices: number[] } {\n const edgeNodeIndices: [number, number][] = [];\n const edgeLinkIndices: number[] = [];\n\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n const si = nodeIdToIndex.get(\n typeof link.source === \"object\"\n ? (link.source as any).id\n : link.source\n );\n const ti = nodeIdToIndex.get(\n typeof link.target === \"object\"\n ? (link.target as any).id\n : link.target\n );\n if (si !== undefined && ti !== undefined) {\n edgeNodeIndices.push([si, ti]);\n edgeLinkIndices.push(i);\n }\n }\n\n return { edgeNodeIndices, edgeLinkIndices };\n}\n\n/** Create LineSegments mesh for all edges */\nexport function createEdgeMesh(\n links: GraphLink[],\n edgeNodeIndices: [number, number][],\n edgeLinkIndices: number[],\n nodeCount: number,\n edgeOpacity: number,\n theme: ResolvedTheme\n): EdgeMeshResult {\n const validEdgeCount = edgeNodeIndices.length;\n const positionArray = new Float32Array(validEdgeCount * 6);\n const colorArray = new Float32Array(validEdgeCount * 6);\n\n const tmpC = new THREE.Color();\n for (let i = 0; i < validEdgeCount; i++) {\n const origIdx = edgeLinkIndices[i];\n tmpC.set(theme.linkColor(links[origIdx]?.type));\n colorArray[i * 6 + 0] = tmpC.r;\n colorArray[i * 6 + 1] = tmpC.g;\n colorArray[i * 6 + 2] = tmpC.b;\n colorArray[i * 6 + 3] = tmpC.r;\n colorArray[i * 6 + 4] = tmpC.g;\n colorArray[i * 6 + 5] = tmpC.b;\n }\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\n \"position\",\n new THREE.BufferAttribute(positionArray, 3).setUsage(THREE.DynamicDrawUsage)\n );\n geometry.setAttribute(\n \"color\",\n new THREE.BufferAttribute(colorArray, 3).setUsage(THREE.DynamicDrawUsage)\n );\n\n const adaptiveOpacity =\n nodeCount > 15000 ? 0.1 : nodeCount > 5000 ? 0.15 : edgeOpacity;\n\n const material = new THREE.LineBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: adaptiveOpacity,\n depthWrite: false,\n blending: theme.additiveEdges ? THREE.AdditiveBlending : THREE.NormalBlending,\n });\n\n const mesh = new THREE.LineSegments(geometry, material);\n\n return {\n mesh,\n geometry,\n positionArray,\n colorArray,\n edgeNodeIndices,\n edgeLinkIndices,\n };\n}\n\n/** Update edge endpoint positions from node position array */\nexport function updateEdgePositions(\n positionArray: Float32Array,\n nodePositions: Float32Array,\n edgeNodeIndices: [number, number][],\n geometry: THREE.BufferGeometry,\n hiddenEdges?: Uint8Array | null\n): void {\n const count = edgeNodeIndices.length;\n for (let i = 0; i < count; i++) {\n const [si, ti] = edgeNodeIndices[i];\n if (hiddenEdges && hiddenEdges[i]) {\n // Collapse to a zero-length segment at the source node: rasterizes\n // to nothing, keeps the buffer layout stable (no index shifting).\n positionArray[i * 6 + 0] = nodePositions[si * 3];\n positionArray[i * 6 + 1] = nodePositions[si * 3 + 1];\n positionArray[i * 6 + 2] = nodePositions[si * 3 + 2];\n positionArray[i * 6 + 3] = nodePositions[si * 3];\n positionArray[i * 6 + 4] = nodePositions[si * 3 + 1];\n positionArray[i * 6 + 5] = nodePositions[si * 3 + 2];\n continue;\n }\n positionArray[i * 6 + 0] = nodePositions[si * 3];\n positionArray[i * 6 + 1] = nodePositions[si * 3 + 1];\n positionArray[i * 6 + 2] = nodePositions[si * 3 + 2];\n positionArray[i * 6 + 3] = nodePositions[ti * 3];\n positionArray[i * 6 + 4] = nodePositions[ti * 3 + 1];\n positionArray[i * 6 + 5] = nodePositions[ti * 3 + 2];\n }\n geometry.attributes.position.needsUpdate = true;\n geometry.computeBoundingSphere();\n}\n","/**\n * Camera animation and control utilities.\n */\nimport * as THREE from \"three\";\nimport type { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\n\nexport interface CameraTarget {\n x: number;\n y: number;\n z: number;\n}\n\n/** Smoothly animate camera to a new position/target using ease-out */\nexport function animateCamera(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n targetPos: CameraTarget,\n targetLookAt: CameraTarget,\n duration: number\n): void {\n const startPos = camera.position.clone();\n const startTarget = (controls.target as THREE.Vector3).clone();\n const endPos = new THREE.Vector3(targetPos.x, targetPos.y, targetPos.z);\n const endTarget = new THREE.Vector3(\n targetLookAt.x,\n targetLookAt.y,\n targetLookAt.z\n );\n const start = performance.now();\n\n function step() {\n const t = Math.min((performance.now() - start) / duration, 1);\n const ease = t * (2 - t); // ease-out quadratic\n camera.position.lerpVectors(startPos, endPos, ease);\n (controls.target as THREE.Vector3).lerpVectors(startTarget, endTarget, ease);\n controls.update();\n if (t < 1) requestAnimationFrame(step);\n }\n requestAnimationFrame(step);\n}\n\n/** Compute camera position to fit all nodes in view */\nexport function zoomToFitPositions(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n positions: Float32Array,\n duration: number,\n padding: number\n): void {\n const count = positions.length / 3;\n if (count === 0) return;\n\n // Compute centroid\n let cx = 0, cy = 0, cz = 0;\n for (let i = 0; i < count; i++) {\n cx += positions[i * 3];\n cy += positions[i * 3 + 1];\n cz += positions[i * 3 + 2];\n }\n cx /= count;\n cy /= count;\n cz /= count;\n\n // Compute bounding sphere radius from centroid\n let maxR = 0;\n for (let i = 0; i < count; i++) {\n const dx = positions[i * 3] - cx;\n const dy = positions[i * 3 + 1] - cy;\n const dz = positions[i * 3 + 2] - cz;\n const r = dx * dx + dy * dy + dz * dz;\n if (r > maxR) maxR = r;\n }\n maxR = Math.sqrt(maxR);\n\n const fov = (camera.fov * Math.PI) / 180;\n const dist = (maxR + padding) / Math.sin(fov / 2);\n\n animateCamera(\n camera,\n controls,\n { x: cx, y: cy, z: cz + dist },\n { x: cx, y: cy, z: cz },\n duration\n );\n}\n","/**\n * User interaction: raycasting for click/double-click on instanced nodes,\n * context menu, edge hover/click, and node dragging.\n */\nimport * as THREE from \"three\";\nimport type { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\nimport type { GraphNode, GraphLink } from \"../types\";\nimport { animateCamera } from \"./camera\";\n\nexport interface InteractionCallbacks {\n onNodeClick: (node: GraphNode | null) => void;\n onNodeDoubleClick?: (node: GraphNode) => void;\n onNodeHover?: (node: GraphNode | null) => void;\n onContextMenu?: (node: GraphNode, position: { x: number; y: number }) => void;\n onLinkClick?: (link: GraphLink) => void;\n onLinkHover?: (link: GraphLink | null) => void;\n onNodeDrag?: (node: GraphNode, position: { x: number; y: number; z: number }) => void;\n onNodeDragEnd?: (node: GraphNode, position: { x: number; y: number; z: number }) => void;\n}\n\nexport interface InteractionOptions {\n /** When false, single-click selects without flying the camera */\n getClickToFocus?: () => boolean;\n /** 2D mode: click-focus pans in-plane instead of orbit-framing */\n getIs2D?: () => boolean;\n /**\n * When false, pointer-down on a node never starts a node drag, so\n * left-drag always reaches the camera controls (pan/rotate). Essential\n * for dense graphs where nearly every pixel raycasts to a node.\n */\n getNodeDragEnabled?: () => boolean;\n}\n\nexport interface InteractionState {\n cleanup: () => void;\n}\n\n/** Screen-space distance threshold for edge hit testing */\nconst EDGE_HIT_THRESHOLD = 5;\n\n/**\n * Set up click/double-click/context-menu/drag interaction on the graph canvas.\n * The container element receives focus on interaction so that\n * keyboard controls (scoped to the container) work correctly.\n * Returns a cleanup function to remove event listeners.\n */\nexport function setupInteraction(\n canvas: HTMLCanvasElement,\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n getNodesMesh: () => THREE.InstancedMesh | null,\n getNodes: () => GraphNode[],\n callbacks: InteractionCallbacks,\n container?: HTMLElement,\n getEdgeData?: () => {\n links: GraphLink[];\n edgeNodeIndices: [number, number][];\n edgeLinkIndices: number[];\n positions: Float32Array | null;\n } | null,\n options?: InteractionOptions\n): InteractionState {\n const raycaster = new THREE.Raycaster();\n const mouse = new THREE.Vector2();\n let mouseDownPos: { x: number; y: number } | null = null;\n let lastClickTime = 0;\n let lastClickNodeId: string | null = null;\n let singleClickTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Drag state\n let dragNode: GraphNode | null = null;\n let dragNodeIdx = -1;\n let isDragging = false;\n const dragPlane = new THREE.Plane();\n const dragIntersect = new THREE.Vector3();\n\n function onPointerDown(e: PointerEvent) {\n mouseDownPos = { x: e.clientX, y: e.clientY };\n // Focus the container so keyboard controls (scoped to it) become active\n if (container && document.activeElement !== container) {\n container.focus({ preventScroll: true });\n }\n\n // Check for node hit for potential drag\n if (callbacks.onNodeDrag && (options?.getNodeDragEnabled?.() ?? true)) {\n const nodesMesh = getNodesMesh();\n if (nodesMesh) {\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n raycaster.setFromCamera(mouse, camera);\n const hits = raycaster.intersectObject(nodesMesh);\n if (hits.length > 0 && hits[0].instanceId != null) {\n const nodes = getNodes();\n dragNode = nodes[hits[0].instanceId] ?? null;\n dragNodeIdx = hits[0].instanceId;\n }\n }\n }\n }\n\n function onPointerMove(e: PointerEvent) {\n // Node drag handling\n if (dragNode && mouseDownPos && callbacks.onNodeDrag) {\n const dx = Math.abs(e.clientX - mouseDownPos.x);\n const dy = Math.abs(e.clientY - mouseDownPos.y);\n if (dx + dy > 5) {\n isDragging = true;\n controls.enabled = false;\n\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n\n // Project onto plane perpendicular to camera at node position\n const nodePos = new THREE.Vector3(\n (dragNode as any).x ?? 0,\n (dragNode as any).y ?? 0,\n (dragNode as any).z ?? 0\n );\n dragPlane.setFromNormalAndCoplanarPoint(\n camera.getWorldDirection(new THREE.Vector3()).negate(),\n nodePos\n );\n raycaster.setFromCamera(mouse, camera);\n if (raycaster.ray.intersectPlane(dragPlane, dragIntersect)) {\n callbacks.onNodeDrag(dragNode, {\n x: dragIntersect.x,\n y: dragIntersect.y,\n z: dragIntersect.z,\n });\n }\n return;\n }\n }\n\n // Hover raycasting (nodes)\n if (!callbacks.onNodeHover && !callbacks.onLinkHover) return;\n const nodesMesh = getNodesMesh();\n if (!nodesMesh) return;\n\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n raycaster.setFromCamera(mouse, camera);\n\n const hits = raycaster.intersectObject(nodesMesh);\n if (hits.length > 0 && hits[0].instanceId != null) {\n const nodes = getNodes();\n const node = nodes[hits[0].instanceId];\n if (node && node.id !== lastHoveredId) {\n lastHoveredId = node.id;\n lastHoveredLinkIdx = -1;\n canvas.style.cursor = \"pointer\";\n callbacks.onNodeHover?.(node);\n callbacks.onLinkHover?.(null);\n }\n } else {\n if (lastHoveredId !== null) {\n lastHoveredId = null;\n canvas.style.cursor = \"default\";\n callbacks.onNodeHover?.(null);\n }\n\n // Edge hover if no node hit\n if (callbacks.onLinkHover && getEdgeData) {\n const edgeData = getEdgeData();\n if (edgeData?.positions) {\n const hitLink = findNearestEdge(\n e.clientX, e.clientY, rect, camera, edgeData as { links: GraphLink[]; edgeNodeIndices: [number, number][]; edgeLinkIndices: number[]; positions: Float32Array }\n );\n if (hitLink) {\n if (lastHoveredLinkIdx !== hitLink.index) {\n lastHoveredLinkIdx = hitLink.index;\n canvas.style.cursor = \"pointer\";\n callbacks.onLinkHover(hitLink.link);\n }\n } else if (lastHoveredLinkIdx !== -1) {\n lastHoveredLinkIdx = -1;\n canvas.style.cursor = \"default\";\n callbacks.onLinkHover(null);\n }\n }\n }\n }\n }\n\n function onPointerUp(e: PointerEvent) {\n // Handle drag end\n if (isDragging && dragNode && callbacks.onNodeDragEnd) {\n callbacks.onNodeDragEnd(dragNode, {\n x: (dragNode as any).x ?? 0,\n y: (dragNode as any).y ?? 0,\n z: (dragNode as any).z ?? 0,\n });\n }\n if (isDragging) {\n isDragging = false;\n dragNode = null;\n dragNodeIdx = -1;\n controls.enabled = true;\n mouseDownPos = null;\n return;\n }\n dragNode = null;\n dragNodeIdx = -1;\n\n if (!mouseDownPos) return;\n const dx = Math.abs(e.clientX - mouseDownPos.x);\n const dy = Math.abs(e.clientY - mouseDownPos.y);\n mouseDownPos = null;\n if (dx + dy > 5) return; // was a drag\n\n const nodesMesh = getNodesMesh();\n if (!nodesMesh) return;\n\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n raycaster.setFromCamera(mouse, camera);\n\n const hits = raycaster.intersectObject(nodesMesh);\n if (hits.length > 0 && hits[0].instanceId != null) {\n const nodes = getNodes();\n const node = nodes[hits[0].instanceId];\n if (!node) return;\n\n const now = performance.now();\n const isDouble =\n now - lastClickTime < 400 && lastClickNodeId === node.id;\n\n if (isDouble) {\n if (singleClickTimer) clearTimeout(singleClickTimer);\n singleClickTimer = null;\n lastClickTime = 0;\n lastClickNodeId = null;\n callbacks.onNodeDoubleClick?.(node);\n return;\n }\n\n lastClickTime = now;\n lastClickNodeId = node.id;\n\n singleClickTimer = setTimeout(() => {\n singleClickTimer = null;\n const clickToFocus = options?.getClickToFocus?.() ?? true;\n if (clickToFocus) {\n const nx = (node as any).x ?? 0;\n const ny = (node as any).y ?? 0;\n const nz = (node as any).z ?? 0;\n if (options?.getIs2D?.()) {\n // 2D: pan in-plane to the node, keep the current zoom level\n animateCamera(\n camera,\n controls,\n { x: nx, y: ny, z: camera.position.z },\n { x: nx, y: ny, z: 0 },\n 800\n );\n } else {\n const dist = Math.hypot(nx, ny, nz);\n if (dist > 1) {\n const ratio = 1 + 120 / dist;\n animateCamera(\n camera,\n controls,\n { x: nx * ratio, y: ny * ratio, z: nz * ratio },\n { x: nx, y: ny, z: nz },\n 1200\n );\n }\n }\n }\n callbacks.onNodeClick(node);\n }, 250);\n } else {\n // Check edge click before reporting background click\n if (callbacks.onLinkClick && getEdgeData) {\n const edgeData = getEdgeData();\n if (edgeData?.positions) {\n const hitLink = findNearestEdge(\n e.clientX, e.clientY, rect, camera, edgeData as { links: GraphLink[]; edgeNodeIndices: [number, number][]; edgeLinkIndices: number[]; positions: Float32Array }\n );\n if (hitLink) {\n callbacks.onLinkClick(hitLink.link);\n return;\n }\n }\n }\n\n if (singleClickTimer) clearTimeout(singleClickTimer);\n singleClickTimer = null;\n lastClickTime = 0;\n lastClickNodeId = null;\n callbacks.onNodeClick(null);\n }\n }\n\n // Context menu (right-click)\n function onContextMenu(e: MouseEvent) {\n if (!callbacks.onContextMenu) return;\n e.preventDefault();\n\n const nodesMesh = getNodesMesh();\n if (!nodesMesh) return;\n\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n raycaster.setFromCamera(mouse, camera);\n\n const hits = raycaster.intersectObject(nodesMesh);\n if (hits.length > 0 && hits[0].instanceId != null) {\n const nodes = getNodes();\n const node = nodes[hits[0].instanceId];\n if (node) {\n callbacks.onContextMenu(node, { x: e.clientX, y: e.clientY });\n }\n }\n }\n\n // Escape to deselect — scoped to container (or window fallback)\n const keyTarget: EventTarget = container ?? window;\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\") callbacks.onNodeClick(null);\n }\n\n let lastHoveredId: string | null = null;\n let lastHoveredLinkIdx = -1;\n\n canvas.addEventListener(\"pointerdown\", onPointerDown);\n canvas.addEventListener(\"pointerup\", onPointerUp);\n canvas.addEventListener(\"pointermove\", onPointerMove);\n canvas.addEventListener(\"contextmenu\", onContextMenu);\n keyTarget.addEventListener(\"keydown\", onKeyDown as EventListener);\n\n return {\n cleanup: () => {\n if (singleClickTimer) clearTimeout(singleClickTimer);\n canvas.removeEventListener(\"pointerdown\", onPointerDown);\n canvas.removeEventListener(\"pointerup\", onPointerUp);\n canvas.removeEventListener(\"pointermove\", onPointerMove);\n canvas.removeEventListener(\"contextmenu\", onContextMenu);\n keyTarget.removeEventListener(\"keydown\", onKeyDown as EventListener);\n },\n };\n}\n\n/** Find nearest edge to a screen-space point */\nfunction findNearestEdge(\n clientX: number,\n clientY: number,\n rect: DOMRect,\n camera: THREE.PerspectiveCamera,\n edgeData: {\n links: GraphLink[];\n edgeNodeIndices: [number, number][];\n edgeLinkIndices: number[];\n positions: Float32Array;\n }\n): { link: GraphLink; index: number } | null {\n const { links, edgeNodeIndices, edgeLinkIndices, positions } = edgeData;\n const screenX = clientX - rect.left;\n const screenY = clientY - rect.top;\n const w = rect.width;\n const h = rect.height;\n\n let bestDist = EDGE_HIT_THRESHOLD;\n let bestIdx = -1;\n\n const tmpVec = new THREE.Vector3();\n\n for (let i = 0; i < edgeNodeIndices.length; i++) {\n const [si, ti] = edgeNodeIndices[i];\n\n // Project source and target to screen space\n tmpVec.set(positions[si * 3], positions[si * 3 + 1], positions[si * 3 + 2]);\n tmpVec.project(camera);\n const sx1 = (tmpVec.x * 0.5 + 0.5) * w;\n const sy1 = (-tmpVec.y * 0.5 + 0.5) * h;\n\n tmpVec.set(positions[ti * 3], positions[ti * 3 + 1], positions[ti * 3 + 2]);\n tmpVec.project(camera);\n const sx2 = (tmpVec.x * 0.5 + 0.5) * w;\n const sy2 = (-tmpVec.y * 0.5 + 0.5) * h;\n\n // Point-to-line-segment distance in screen space\n const dist = pointToSegmentDist(screenX, screenY, sx1, sy1, sx2, sy2);\n if (dist < bestDist) {\n bestDist = dist;\n bestIdx = i;\n }\n }\n\n if (bestIdx === -1) return null;\n return { link: links[edgeLinkIndices[bestIdx]], index: bestIdx };\n}\n\n/** Point-to-line-segment distance (2D) */\nfunction pointToSegmentDist(\n px: number, py: number,\n ax: number, ay: number,\n bx: number, by: number\n): number {\n const dx = bx - ax;\n const dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n if (lenSq < 0.0001) return Math.hypot(px - ax, py - ay);\n let t = ((px - ax) * dx + (py - ay) * dy) / lenSq;\n t = Math.max(0, Math.min(1, t));\n return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));\n}\n","/**\n * Three.js resource disposal utilities.\n */\nimport * as THREE from \"three\";\n\nexport function disposeObject(obj: THREE.Object3D | null | undefined): void {\n if (!obj) return;\n const mesh = obj as THREE.Mesh;\n if (mesh.geometry) mesh.geometry.dispose();\n if (mesh.material) {\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((m) => m.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n if (obj.children) {\n [...obj.children].forEach(disposeObject);\n }\n}\n","/**\n * NetworkGraph3D — High-performance 3D graph renderer.\n *\n * Architecture:\n * - 1 InstancedMesh (all nodes → 1 draw call)\n * - 1 LineSegments (all edges → 1 draw call)\n * - Web Worker (force layout off main thread)\n * - Post-processing (UnrealBloomPass for glow)\n *\n * Total GPU draw calls: 2\n */\nimport {\n useEffect,\n useRef,\n useMemo,\n useState,\n useImperativeHandle,\n forwardRef,\n type Ref,\n} from \"react\";\nimport * as THREE from \"three\";\n\nimport type {\n GraphData,\n GraphNode,\n GraphLink,\n ThemeConfig,\n StyleConfig,\n LayoutConfig,\n RendererConfig,\n NetworkGraph3DRef,\n NullableNodeEventHandler,\n NullableLinkEventHandler,\n NodeEventHandler,\n LinkEventHandler,\n ContextMenuHandler,\n NodeDragHandler,\n LayoutSettledHandler,\n LayoutTickHandler,\n} from \"../types\";\nimport { DEFAULT_STYLE } from \"../types\";\nimport { resolveTheme, type ResolvedTheme } from \"../themes/resolve-theme\";\nimport { resolveLayoutParams } from \"../layout/layout-config\";\nimport { createLayoutWorker } from \"../layout/worker-source\";\nimport {\n createScene,\n initBloom,\n startAnimationLoop,\n setupResize,\n applyNavigationMode,\n type SceneState,\n} from \"./scene-setup\";\nimport { createNodeMesh, computeNodeScales, updateNodePositions } from \"./node-mesh\";\nimport {\n createEdgeMesh,\n buildEdgeMappings,\n updateEdgePositions,\n} from \"./edge-mesh\";\nimport { updateLabels, disposeLabelSystem } from \"./label-system\";\nimport { animateCamera, zoomToFitPositions } from \"./camera\";\nimport {\n buildAdjacencyMapFromLinks,\n computeHighlightSet,\n applyNodeHighlight,\n applyEdgeHighlight,\n updateSelectionRing,\n} from \"./selection\";\nimport { setupInteraction } from \"./interaction\";\nimport { disposeObject } from \"./dispose\";\n\nexport interface NetworkGraph3DProps {\n /** Graph data: nodes and links */\n data: GraphData;\n /** Single-click on a node (null = background click / deselect) */\n onNodeClick?: NullableNodeEventHandler;\n /** Double-click on a node */\n onNodeDoubleClick?: NodeEventHandler;\n /** Hover on a node (null = hover out) */\n onNodeHover?: NullableNodeEventHandler;\n /** Right-click on a node — receives node + screen position for custom menu */\n onContextMenu?: ContextMenuHandler;\n /** Click on an edge/link */\n onLinkClick?: LinkEventHandler;\n /** Hover on an edge/link (null = hover out) */\n onLinkHover?: NullableLinkEventHandler;\n /** Node drag (fires continuously during drag) */\n onNodeDrag?: NodeDragHandler;\n /** Node drag end */\n onNodeDragEnd?: NodeDragHandler;\n /** Fired when force simulation converges */\n onLayoutSettled?: LayoutSettledHandler;\n /** Fired on each layout tick with current alpha */\n onLayoutTick?: LayoutTickHandler;\n /** Currently selected node ID (controlled mode) */\n selectedNodeId?: string | null;\n /** Number of hops to highlight around selected node (default: 3) */\n highlightHops?: number;\n /** Theme configuration or preset name */\n theme?: ThemeConfig | string;\n /** Visual style overrides */\n style?: StyleConfig;\n /** Force layout configuration */\n layout?: LayoutConfig;\n /** WebGL renderer configuration */\n renderer?: RendererConfig;\n /** Custom label text formatter */\n labelFormatter?: (node: GraphNode) => string;\n /** Custom node size accessor (overrides node.val) */\n nodeValueAccessor?: (node: GraphNode) => number;\n /**\n * Client-side filter: IDs of nodes to keep visible. Hidden nodes (and\n * their edges/labels) vanish WITHOUT re-running the force layout —\n * positions are preserved, so toggling filters never reheats the graph.\n * null/undefined shows everything.\n */\n visibleNodeIds?: ReadonlySet<string> | string[] | null;\n /**\n * Client-side edge filter: return false to hide a link (e.g. by type).\n * Same reheat-free mechanism as visibleNodeIds — collapsed segments,\n * simulation untouched. null/undefined shows all edges.\n */\n linkVisibility?: ((link: GraphLink) => boolean) | null;\n /**\n * Allow dragging individual nodes (default: true). Set false on dense\n * graphs so left-drag always pans/orbits the camera instead of grabbing\n * whichever node happens to be under the pointer.\n */\n enableNodeDrag?: boolean;\n /** Fly the camera to a node on single-click (default: true) */\n clickToFocus?: boolean;\n /** Highlight a node's neighborhood on hover when nothing is selected (default: false) */\n hoverHighlight?: boolean;\n /** Hops highlighted around the hovered node (default: 1) */\n hoverHighlightHops?: number;\n}\n\n/** Internal data state shared across effects */\ninterface DataState {\n nodes: GraphNode[];\n links: GraphData[\"links\"];\n nodeIdToIndex: Map<string, number>;\n edgeNodeIndices: [number, number][];\n edgeLinkIndices: number[];\n positions: Float32Array | null;\n scales: Float32Array | null;\n settled: boolean;\n}\n\n/** Internal graph objects (meshes + worker) */\ninterface GraphObjects {\n nodesMesh: THREE.InstancedMesh;\n edgesMesh: THREE.LineSegments;\n edgeGeometry: THREE.BufferGeometry;\n edgePositionArray: Float32Array;\n worker: Worker | null;\n}\n\nfunction NetworkGraph3DInner(\n props: NetworkGraph3DProps,\n ref: Ref<NetworkGraph3DRef>\n) {\n const {\n data,\n onNodeClick,\n onNodeDoubleClick,\n onNodeHover,\n onContextMenu,\n onLinkClick,\n onLinkHover,\n onNodeDrag,\n onNodeDragEnd,\n onLayoutSettled,\n onLayoutTick,\n selectedNodeId = null,\n highlightHops = 3,\n theme: themeProp,\n style: styleProp,\n layout: layoutProp,\n renderer: rendererProp,\n labelFormatter,\n nodeValueAccessor,\n visibleNodeIds,\n linkVisibility,\n enableNodeDrag = true,\n clickToFocus = true,\n hoverHighlight = false,\n hoverHighlightHops = 1,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const resolvedStyle = useMemo(\n () => ({ ...DEFAULT_STYLE, ...styleProp }) as Required<StyleConfig>,\n [styleProp]\n );\n const resolvedTheme = useMemo(() => resolveTheme(themeProp), [themeProp]);\n\n // Persistent Three.js state\n const sceneRef = useRef<SceneState | null>(null);\n const graphObjRef = useRef<GraphObjects | null>(null);\n const dataRef = useRef<DataState>({\n nodes: [],\n links: [],\n nodeIdToIndex: new Map(),\n edgeNodeIndices: [],\n edgeLinkIndices: [],\n positions: null,\n scales: null,\n settled: false,\n });\n\n // Preserved positions: nodeId → {x,y,z}\n // Saved before mesh teardown so new worker can seed existing nodes\n const preservedPositionsRef = useRef<Record<string, { x: number; y: number; z: number }>>({});\n\n // Internal data for appendData — merged with external prop\n const [appendedData, setAppendedData] = useState<{\n nodes: GraphNode[];\n links: GraphLink[];\n } | null>(null);\n\n // Stable callback refs\n const onNodeClickRef = useRef(onNodeClick);\n const onNodeDoubleClickRef = useRef(onNodeDoubleClick);\n const onNodeHoverRef = useRef(onNodeHover);\n const onContextMenuRef = useRef(onContextMenu);\n const onLinkClickRef = useRef(onLinkClick);\n const onLinkHoverRef = useRef(onLinkHover);\n const onNodeDragRef = useRef(onNodeDrag);\n const onNodeDragEndRef = useRef(onNodeDragEnd);\n const onLayoutSettledRef = useRef(onLayoutSettled);\n const onLayoutTickRef = useRef(onLayoutTick);\n const styleRef = useRef(resolvedStyle);\n const themeRef = useRef(resolvedTheme);\n const selectedNodeIdRef = useRef(selectedNodeId);\n const labelFormatterRef = useRef(labelFormatter);\n const highlightSetRef = useRef<Map<string, number> | null>(null);\n const clickToFocusRef = useRef(clickToFocus);\n const enableNodeDragRef = useRef(enableNodeDrag);\n const hoverHighlightRef = useRef(hoverHighlight);\n const hoverHighlightHopsRef = useRef(hoverHighlightHops);\n const adjacencyMapRef = useRef<Map<string, string[]>>(new Map());\n const is2DRef = useRef(false);\n const hiddenNodesRef = useRef<Uint8Array | null>(null);\n const hiddenEdgesRef = useRef<Uint8Array | null>(null);\n onNodeClickRef.current = onNodeClick;\n onNodeDoubleClickRef.current = onNodeDoubleClick;\n onNodeHoverRef.current = onNodeHover;\n onContextMenuRef.current = onContextMenu;\n onLinkClickRef.current = onLinkClick;\n onLinkHoverRef.current = onLinkHover;\n onNodeDragRef.current = onNodeDrag;\n onNodeDragEndRef.current = onNodeDragEnd;\n onLayoutSettledRef.current = onLayoutSettled;\n onLayoutTickRef.current = onLayoutTick;\n styleRef.current = resolvedStyle;\n themeRef.current = resolvedTheme;\n selectedNodeIdRef.current = selectedNodeId;\n labelFormatterRef.current = labelFormatter;\n clickToFocusRef.current = clickToFocus;\n enableNodeDragRef.current = enableNodeDrag;\n hoverHighlightRef.current = hoverHighlight;\n hoverHighlightHopsRef.current = hoverHighlightHops;\n\n const is2D = layoutProp?.dimensions === 2;\n is2DRef.current = is2D;\n\n // Value-compare the layout config so an inline `layout={{...}}` object\n // (new identity every render) doesn't tear down meshes + worker each time.\n const layoutKey = JSON.stringify(layoutProp ?? null);\n const layoutRef = useRef(layoutProp);\n layoutRef.current = layoutProp;\n\n /* ── Merge external data with appended data ── */\n const mergedData: GraphData = useMemo(() => {\n if (!appendedData) return data;\n const existingIds = new Set(data.nodes.map((n) => n.id));\n const newNodes = appendedData.nodes.filter((n) => !existingIds.has(n.id));\n const existingEdges = new Set(\n data.links.map((l) => {\n const s = typeof l.source === \"object\" ? (l.source as any).id : l.source;\n const t = typeof l.target === \"object\" ? (l.target as any).id : l.target;\n return `${s}→${t}`;\n })\n );\n const newLinks = appendedData.links.filter((l) => {\n const s = typeof l.source === \"object\" ? (l.source as any).id : l.source;\n const t = typeof l.target === \"object\" ? (l.target as any).id : l.target;\n return !existingEdges.has(`${s}→${t}`);\n });\n if (newNodes.length === 0 && newLinks.length === 0) return data;\n return {\n nodes: [...data.nodes, ...newNodes],\n links: [...data.links, ...newLinks],\n };\n }, [data, appendedData]);\n\n /* ── Adjacency map ── */\n const adjacencyMap = useMemo(\n () => buildAdjacencyMapFromLinks(mergedData.links),\n [mergedData.links]\n );\n adjacencyMapRef.current = adjacencyMap;\n\n /* ── Normalized visibility set (null = all visible) ── */\n const visibleSet = useMemo<ReadonlySet<string> | null>(() => {\n if (visibleNodeIds == null) return null;\n return visibleNodeIds instanceof Set\n ? (visibleNodeIds as ReadonlySet<string>)\n : new Set(visibleNodeIds as string[]);\n }, [visibleNodeIds]);\n\n /* ── Highlight set ── */\n const highlightSet = useMemo(() => {\n if (!selectedNodeId) return null;\n return computeHighlightSet(selectedNodeId, adjacencyMap, highlightHops);\n }, [selectedNodeId, adjacencyMap, highlightHops]);\n\n /* ── Val range for node sizing ── */\n const valRange = useMemo(() => {\n let min = Infinity, max = -Infinity;\n for (const n of mergedData.nodes) {\n const v = nodeValueAccessor ? nodeValueAccessor(n) : (n.val ?? 1);\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return { min: isFinite(min) ? min : 1, max: isFinite(max) ? max : 1 };\n }, [mergedData.nodes, nodeValueAccessor]);\n\n /* ── Hover highlight (imperative — no React re-render per mousemove) ── */\n const applyHoverHighlight = (node: GraphNode | null) => {\n if (!hoverHighlightRef.current) return;\n if (selectedNodeIdRef.current) return; // explicit selection wins\n const gObj = graphObjRef.current;\n if (!gObj) return;\n const d = dataRef.current;\n const set = node\n ? computeHighlightSet(\n node.id,\n adjacencyMapRef.current,\n hoverHighlightHopsRef.current\n )\n : null;\n highlightSetRef.current = set;\n applyNodeHighlight(gObj.nodesMesh, d.nodes, node?.id ?? null, set, themeRef.current);\n applyEdgeHighlight(\n gObj.edgesMesh,\n d.links,\n d.edgeNodeIndices,\n d.edgeLinkIndices,\n set,\n styleRef.current.edgeOpacity,\n d.nodes.length,\n themeRef.current\n );\n };\n const applyHoverHighlightRef = useRef(applyHoverHighlight);\n applyHoverHighlightRef.current = applyHoverHighlight;\n\n /* ── Effect 1: Scene setup (mount once) ── */\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const state = createScene(\n container,\n themeRef.current.backgroundColor,\n styleRef.current,\n rendererProp\n );\n sceneRef.current = state;\n\n // Animation loop with label updates (highlight-aware)\n const cancelAnim = startAnimationLoop(state, () => {\n updateLabels(\n state.labels,\n dataRef.current.nodes,\n dataRef.current.positions,\n dataRef.current.scales,\n state.camera,\n themeRef.current,\n styleRef.current.showLabels,\n styleRef.current.labelScale,\n styleRef.current.labelThreshold,\n styleRef.current.maxLabels,\n labelFormatterRef.current,\n highlightSetRef.current,\n hiddenNodesRef.current\n );\n });\n\n const resizeObserver = setupResize(container, state);\n\n // Interaction (scoped to container for keyboard isolation)\n const interaction = setupInteraction(\n state.renderer.domElement,\n state.camera,\n state.controls,\n () => graphObjRef.current?.nodesMesh ?? null,\n () => dataRef.current.nodes,\n {\n onNodeClick: (node) => onNodeClickRef.current?.(node),\n onNodeDoubleClick: (node) => onNodeDoubleClickRef.current?.(node),\n onNodeHover: (node) => {\n onNodeHoverRef.current?.(node);\n applyHoverHighlightRef.current(node);\n },\n onContextMenu: (node, pos) => onContextMenuRef.current?.(node, pos),\n onLinkClick: (link) => onLinkClickRef.current?.(link),\n onLinkHover: (link) => onLinkHoverRef.current?.(link),\n onNodeDrag: (node, pos) => {\n if (is2DRef.current) pos = { ...pos, z: 0 };\n onNodeDragRef.current?.(node, pos);\n // Update position in data\n const d = dataRef.current;\n const idx = d.nodeIdToIndex.get(node.id);\n if (idx !== undefined && d.positions) {\n d.positions[idx * 3] = pos.x;\n d.positions[idx * 3 + 1] = pos.y;\n d.positions[idx * 3 + 2] = pos.z;\n (node as any).x = pos.x;\n (node as any).y = pos.y;\n (node as any).z = pos.z;\n // Update node mesh position\n const gObj = graphObjRef.current;\n if (gObj && d.scales) {\n updateNodePositions(\n gObj.nodesMesh,\n d.positions!,\n d.scales,\n d.nodes.length,\n hiddenNodesRef.current\n );\n }\n }\n },\n onNodeDragEnd: (node, pos) => onNodeDragEndRef.current?.(node, pos),\n },\n container,\n () => {\n const d = dataRef.current;\n return {\n links: d.links as GraphLink[],\n edgeNodeIndices: d.edgeNodeIndices,\n edgeLinkIndices: d.edgeLinkIndices,\n positions: d.positions,\n };\n },\n {\n getClickToFocus: () => clickToFocusRef.current,\n getIs2D: () => is2DRef.current,\n getNodeDragEnabled: () => enableNodeDragRef.current,\n }\n );\n\n return () => {\n cancelAnim();\n resizeObserver.disconnect();\n interaction.cleanup();\n state.keyboard.cleanup();\n state.scrollCleanup();\n state.controls.dispose();\n disposeObject(state.stars);\n disposeObject(state.selectionRing);\n state.selectionRing.children.forEach((c) => disposeObject(c));\n disposeLabelSystem(state.labels);\n disposeObject(state.labels.group);\n if (state.bloomPass) state.bloomPass.dispose();\n if (state.composer) {\n state.composer.passes.forEach((p) => (p as any).dispose?.());\n }\n state.renderer.dispose();\n const canvas = state.renderer.domElement;\n if (container.contains(canvas)) container.removeChild(canvas);\n sceneRef.current = null;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* ── Effect 2: Graph data → meshes + worker ── */\n useEffect(() => {\n const sceneState = sceneRef.current;\n if (!sceneState) return;\n const { scene, camera, controls, renderer } = sceneState;\n const nc = mergedData.nodes.length;\n if (nc === 0) return;\n\n const theme = themeRef.current;\n const style = styleRef.current;\n\n // Preserve positions from previous data before teardown\n const prevData = dataRef.current;\n if (prevData.positions && prevData.nodes.length > 0) {\n const saved: Record<string, { x: number; y: number; z: number }> = {};\n for (let i = 0; i < prevData.nodes.length; i++) {\n saved[prevData.nodes[i].id] = {\n x: prevData.positions[i * 3],\n y: prevData.positions[i * 3 + 1],\n z: prevData.positions[i * 3 + 2],\n };\n }\n preservedPositionsRef.current = saved;\n }\n\n // Cleanup previous\n const prev = graphObjRef.current;\n if (prev) {\n scene.remove(prev.nodesMesh);\n scene.remove(prev.edgesMesh);\n disposeObject(prev.nodesMesh);\n disposeObject(prev.edgesMesh);\n if (prev.worker) {\n prev.worker.postMessage({ type: \"stop\" });\n prev.worker.terminate();\n }\n }\n\n // Init bloom\n initBloom(sceneState, nc, style);\n\n // Fog\n if (nc < 15000 && style.fogDensity > 0) {\n scene.fog = new THREE.FogExp2(\n new THREE.Color(theme.backgroundColor).getHex(),\n style.fogDensity * 0.5\n );\n } else {\n scene.fog = null;\n }\n\n // Preprocess nodes: apply nodeValueAccessor\n const nodes = nodeValueAccessor\n ? mergedData.nodes.map((n) => ({ ...n, val: nodeValueAccessor(n) }))\n : mergedData.nodes;\n const links = mergedData.links;\n\n // Build index\n const nodeIdToIndex = new Map<string, number>();\n for (let i = 0; i < nc; i++) nodeIdToIndex.set(nodes[i].id, i);\n\n // Edge mappings\n const { edgeNodeIndices, edgeLinkIndices } = buildEdgeMappings(\n links,\n nodeIdToIndex\n );\n\n // Node scales\n const scales = computeNodeScales(nodes, style.nodeMinSize, style.nodeMaxSize);\n\n // Create meshes\n const { mesh: nodesMesh, material: nodeMat } = createNodeMesh(\n nodes,\n scales,\n theme\n );\n scene.add(nodesMesh);\n\n const edgeResult = createEdgeMesh(\n links,\n edgeNodeIndices,\n edgeLinkIndices,\n nc,\n style.edgeOpacity,\n theme\n );\n // Apply edge width scale\n (edgeResult.mesh.material as THREE.LineBasicMaterial).linewidth = style.edgeWidthScale;\n scene.add(edgeResult.mesh);\n\n // Update data ref\n dataRef.current = {\n nodes,\n links,\n nodeIdToIndex,\n edgeNodeIndices,\n edgeLinkIndices,\n positions: null,\n scales,\n settled: false,\n };\n\n graphObjRef.current = {\n nodesMesh,\n edgesMesh: edgeResult.mesh,\n edgeGeometry: edgeResult.geometry,\n edgePositionArray: edgeResult.positionArray,\n worker: null,\n };\n\n // Clear label cache on data change\n const lt = sceneState.labels.textureCache;\n for (const [, entry] of lt) {\n if (entry.texture) entry.texture.dispose();\n }\n lt.clear();\n\n /* ── Start Web Worker ── */\n let worker: Worker;\n try {\n worker = createLayoutWorker();\n } catch (err) {\n console.error(\"Graphier: Failed to create layout worker:\", err);\n // Fallback: keep random positions\n const initPos = new Float32Array(nc * 3);\n const tmpMat = new THREE.Matrix4();\n const tmpVec = new THREE.Vector3();\n for (let i = 0; i < nc; i++) {\n nodesMesh.getMatrixAt(i, tmpMat);\n tmpVec.setFromMatrixPosition(tmpMat);\n initPos[i * 3] = tmpVec.x;\n initPos[i * 3 + 1] = tmpVec.y;\n initPos[i * 3 + 2] = tmpVec.z;\n (nodes[i] as any).x = tmpVec.x;\n (nodes[i] as any).y = tmpVec.y;\n (nodes[i] as any).z = tmpVec.z;\n }\n dataRef.current.positions = initPos;\n setTimeout(() => zoomToFitPositions(camera, controls, initPos, 800, 100), 300);\n return;\n }\n graphObjRef.current.worker = worker;\n\n worker.onerror = (err) => {\n console.error(\"Graphier: Layout worker error:\", err);\n };\n\n worker.onmessage = (e) => {\n const msg = e.data;\n\n if (msg.type === \"positions\") {\n const positions = new Float32Array(msg.positions);\n dataRef.current.positions = positions;\n\n // Update node positions (respecting any active visibility filter)\n const hn = hiddenNodesRef.current;\n updateNodePositions(\n nodesMesh,\n positions,\n scales,\n nc,\n hn && hn.length === nc ? hn : null\n );\n\n // Mutate node objects for focusNode compatibility\n for (let i = 0; i < nc; i++) {\n (nodes[i] as any).x = positions[i * 3];\n (nodes[i] as any).y = positions[i * 3 + 1];\n (nodes[i] as any).z = positions[i * 3 + 2];\n }\n\n // Update edges (respecting any active visibility filter)\n const he = hiddenEdgesRef.current;\n updateEdgePositions(\n edgeResult.positionArray,\n positions,\n edgeNodeIndices,\n edgeResult.geometry,\n he && he.length === edgeNodeIndices.length ? he : null\n );\n\n // Keep selection ring synced during layout\n const selId = selectedNodeIdRef.current;\n if (selId && sceneState.selectionRing.visible) {\n const si = nodeIdToIndex.get(selId);\n if (si !== undefined) {\n sceneState.selectionRing.position.set(\n positions[si * 3],\n positions[si * 3 + 1],\n positions[si * 3 + 2]\n );\n }\n }\n\n // Layout tick callback\n onLayoutTickRef.current?.(msg.alpha);\n }\n\n if (msg.type === \"settled\") {\n dataRef.current.settled = true;\n onLayoutSettledRef.current?.();\n }\n };\n\n // Send layout params with preserved positions for existing nodes\n const layoutConfig = layoutRef.current;\n const layoutParams = resolveLayoutParams(nc, layoutConfig);\n\n // Optional cluster force: map each node's cluster key to a group index\n let groups: number[] | undefined;\n if (layoutConfig?.clusterBy) {\n const keyOf = (n: GraphNode) =>\n layoutConfig.clusterBy === \"type\" ? n.type : (n as any).group;\n const keyToIdx = new Map<string, number>();\n groups = nodes.map((n) => {\n const k = keyOf(n);\n if (k == null) return -1;\n const ks = String(k);\n if (!keyToIdx.has(ks)) keyToIdx.set(ks, keyToIdx.size);\n return keyToIdx.get(ks)!;\n });\n }\n\n worker.postMessage({\n type: \"init\",\n nodes: nodes.map((n) => ({ id: n.id })),\n links: links.map((l) => ({\n source: typeof l.source === \"object\" ? (l.source as any).id : l.source,\n target: typeof l.target === \"object\" ? (l.target as any).id : l.target,\n })),\n params: layoutParams,\n initialPositions: preservedPositionsRef.current,\n groups,\n });\n\n return () => {\n // Save positions before teardown for next init\n const d = dataRef.current;\n if (d.positions && d.nodes.length > 0) {\n const saved: Record<string, { x: number; y: number; z: number }> = {};\n for (let i = 0; i < d.nodes.length; i++) {\n saved[d.nodes[i].id] = {\n x: d.positions[i * 3],\n y: d.positions[i * 3 + 1],\n z: d.positions[i * 3 + 2],\n };\n }\n preservedPositionsRef.current = saved;\n }\n\n if (worker) {\n worker.postMessage({ type: \"stop\" });\n worker.terminate();\n }\n scene.remove(nodesMesh);\n scene.remove(edgeResult.mesh);\n disposeObject(nodesMesh);\n disposeObject(edgeResult.mesh);\n graphObjRef.current = null;\n };\n }, [mergedData, valRange, nodeValueAccessor, layoutKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* ── Effect 2b: Visibility filter (never reheats the layout) ── */\n useEffect(() => {\n const d = dataRef.current;\n const gObj = graphObjRef.current;\n if (!visibleSet && !linkVisibility) {\n hiddenNodesRef.current = null;\n hiddenEdgesRef.current = null;\n } else {\n const nc = d.nodes.length;\n const hn = new Uint8Array(nc);\n if (visibleSet) {\n for (let i = 0; i < nc; i++) {\n if (!visibleSet.has(d.nodes[i].id)) hn[i] = 1;\n }\n }\n const ec = d.edgeNodeIndices.length;\n const he = new Uint8Array(ec);\n for (let i = 0; i < ec; i++) {\n const [si, ti] = d.edgeNodeIndices[i];\n if (hn[si] || hn[ti]) {\n he[i] = 1;\n } else if (linkVisibility) {\n const link = d.links[d.edgeLinkIndices[i]];\n if (link && !linkVisibility(link as GraphLink)) he[i] = 1;\n }\n }\n hiddenNodesRef.current = visibleSet ? hn : null;\n hiddenEdgesRef.current = he;\n }\n // Apply immediately when positions exist; otherwise the first worker\n // tick picks the masks up. Pure matrix/buffer writes — no simulation.\n if (gObj && d.positions && d.scales) {\n updateNodePositions(\n gObj.nodesMesh,\n d.positions,\n d.scales,\n d.nodes.length,\n hiddenNodesRef.current\n );\n updateEdgePositions(\n gObj.edgePositionArray,\n d.positions,\n d.edgeNodeIndices,\n gObj.edgeGeometry,\n hiddenEdgesRef.current\n );\n }\n }, [visibleSet, linkVisibility, mergedData]);\n\n /* ── Effect 2c: navigation scheme (2D/3D + overrides) ── */\n const navKey = JSON.stringify(rendererProp?.navigation ?? null);\n useEffect(() => {\n const s = sceneRef.current;\n if (s) applyNavigationMode(s, is2D, rendererProp?.navigation);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [is2D, navKey]);\n\n /* ── Effect 3: Selection visual update ── */\n useEffect(() => {\n const gObj = graphObjRef.current;\n const sceneState = sceneRef.current;\n if (!gObj?.nodesMesh || !sceneState) return;\n\n const d = dataRef.current;\n const theme = themeRef.current;\n const style = styleRef.current;\n\n // Store highlight set for label system access\n highlightSetRef.current = highlightSet;\n\n applyNodeHighlight(\n gObj.nodesMesh,\n d.nodes,\n selectedNodeId,\n highlightSet,\n theme\n );\n\n applyEdgeHighlight(\n gObj.edgesMesh,\n d.links,\n d.edgeNodeIndices,\n d.edgeLinkIndices,\n highlightSet,\n style.edgeOpacity,\n d.nodes.length,\n theme\n );\n\n // Dynamic bloom boost during selection (match original behavior)\n if (sceneState.bloomPass) {\n const style = styleRef.current;\n if (highlightSet) {\n sceneState.bloomPass.strength = style.bloomStrength * 1.8;\n sceneState.bloomPass.radius = style.bloomRadius * 1.4;\n sceneState.bloomPass.threshold = 0.25;\n } else {\n sceneState.bloomPass.strength = style.bloomStrength;\n sceneState.bloomPass.radius = style.bloomRadius;\n sceneState.bloomPass.threshold = style.bloomThreshold;\n }\n }\n\n const selectedNode = selectedNodeId\n ? d.nodes.find((n) => n.id === selectedNodeId)\n : null;\n\n updateSelectionRing(\n sceneState.selectionRing,\n selectedNodeId,\n d.nodeIdToIndex,\n d.positions,\n d.scales,\n theme,\n selectedNode?.type\n );\n }, [selectedNodeId, highlightSet, mergedData]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* ── Effect 4: Live style updates ── */\n useEffect(() => {\n const s = sceneRef.current;\n if (!s?.bloomPass) return;\n s.bloomPass.strength = resolvedStyle.bloomStrength;\n s.bloomPass.radius = resolvedStyle.bloomRadius;\n s.bloomPass.threshold = resolvedStyle.bloomThreshold;\n }, [resolvedStyle.bloomStrength, resolvedStyle.bloomRadius, resolvedStyle.bloomThreshold]);\n\n // Node size live update\n useEffect(() => {\n const gObj = graphObjRef.current;\n if (!gObj?.nodesMesh) return;\n const { nodes, positions } = dataRef.current;\n if (!positions) return;\n const nc = nodes.length;\n\n const newScales = computeNodeScales(\n nodes,\n resolvedStyle.nodeMinSize,\n resolvedStyle.nodeMaxSize\n );\n dataRef.current.scales = newScales;\n updateNodePositions(gObj.nodesMesh, positions, newScales, nc, hiddenNodesRef.current);\n }, [resolvedStyle.nodeMinSize, resolvedStyle.nodeMaxSize, valRange]);\n\n // Edge opacity & width live update\n useEffect(() => {\n const gObj = graphObjRef.current;\n if (!gObj?.edgesMesh) return;\n const mat = gObj.edgesMesh.material as THREE.LineBasicMaterial;\n mat.opacity = resolvedStyle.edgeOpacity;\n mat.linewidth = resolvedStyle.edgeWidthScale;\n }, [resolvedStyle.edgeOpacity, resolvedStyle.edgeWidthScale]);\n\n // Fog live update\n useEffect(() => {\n const s = sceneRef.current;\n if (!s) return;\n if (resolvedStyle.fogDensity > 0) {\n s.scene.fog = new THREE.FogExp2(\n new THREE.Color(themeRef.current.backgroundColor).getHex(),\n resolvedStyle.fogDensity * 0.5\n );\n } else {\n s.scene.fog = null;\n }\n }, [resolvedStyle.fogDensity]);\n\n // Star field toggle\n useEffect(() => {\n const s = sceneRef.current;\n if (!s?.stars) return;\n s.stars.visible = resolvedStyle.starField;\n }, [resolvedStyle.starField]);\n\n // Auto orbit\n useEffect(() => {\n const s = sceneRef.current;\n if (!s || !resolvedStyle.autoOrbit) return;\n\n let angle = 0;\n const id = setInterval(() => {\n if (!sceneRef.current) return;\n const cam = sceneRef.current.camera;\n const ctrl = sceneRef.current.controls;\n const dist = cam.position.length() || 800;\n angle += 0.003;\n cam.position.set(\n dist * Math.sin(angle),\n cam.position.y,\n dist * Math.cos(angle)\n );\n ctrl.update();\n }, 30);\n\n return () => clearInterval(id);\n }, [resolvedStyle.autoOrbit]);\n\n // Fly speed live update\n useEffect(() => {\n const s = sceneRef.current;\n if (!s) return;\n s.keyboard.setFlySpeed(resolvedStyle.flySpeed);\n }, [resolvedStyle.flySpeed]);\n\n /* ── Imperative API via ref ── */\n useImperativeHandle(ref, () => ({\n cameraPosition(pos, lookAt, duration = 1000) {\n const s = sceneRef.current;\n if (!s) return;\n animateCamera(s.camera, s.controls, pos, lookAt, duration);\n },\n zoomToFit(duration = 800, padding = 100) {\n const s = sceneRef.current;\n const p = dataRef.current.positions;\n if (!s || !p) return;\n zoomToFitPositions(s.camera, s.controls, p, duration, padding);\n },\n zoomIn() {\n const s = sceneRef.current;\n if (!s) return;\n const { camera, controls } = s;\n const dir = camera.position.clone().sub(controls.target as THREE.Vector3);\n dir.multiplyScalar(0.65);\n const dest = (controls.target as THREE.Vector3).clone().add(dir);\n animateCamera(camera, controls, dest, controls.target as THREE.Vector3, 400);\n },\n zoomOut() {\n const s = sceneRef.current;\n if (!s) return;\n const { camera, controls } = s;\n const dir = camera.position.clone().sub(controls.target as THREE.Vector3);\n dir.multiplyScalar(1.5);\n const dest = (controls.target as THREE.Vector3).clone().add(dir);\n animateCamera(camera, controls, dest, controls.target as THREE.Vector3, 400);\n },\n focusNode(nodeId: string, duration = 1200) {\n const s = sceneRef.current;\n if (!s) return;\n const d = dataRef.current;\n const idx = d.nodeIdToIndex.get(nodeId);\n if (idx === undefined || !d.positions) return;\n const nx = d.positions[idx * 3];\n const ny = d.positions[idx * 3 + 1];\n const nz = d.positions[idx * 3 + 2];\n if (is2DRef.current) {\n // Pan to the node, zooming to a readable level\n const z = Math.max(120, Math.min(Math.abs(s.camera.position.z), 500));\n animateCamera(\n s.camera,\n s.controls,\n { x: nx, y: ny, z },\n { x: nx, y: ny, z: 0 },\n duration\n );\n return;\n }\n const dist = Math.hypot(nx, ny, nz);\n if (dist < 1) return;\n const ratio = 1 + 120 / dist;\n animateCamera(\n s.camera,\n s.controls,\n { x: nx * ratio, y: ny * ratio, z: nz * ratio },\n { x: nx, y: ny, z: nz },\n duration\n );\n },\n panTo(x: number, y: number, duration = 600) {\n const s = sceneRef.current;\n if (!s) return;\n const t = s.controls.target as THREE.Vector3;\n if (is2DRef.current) {\n animateCamera(\n s.camera,\n s.controls,\n { x, y, z: s.camera.position.z },\n { x, y, z: 0 },\n duration\n );\n } else {\n const dx = x - t.x;\n const dy = y - t.y;\n animateCamera(\n s.camera,\n s.controls,\n {\n x: s.camera.position.x + dx,\n y: s.camera.position.y + dy,\n z: s.camera.position.z,\n },\n { x, y, z: t.z },\n duration\n );\n }\n },\n appendData(newNodes: GraphNode[], newLinks: GraphLink[]) {\n if (newNodes.length === 0 && newLinks.length === 0) return 0;\n\n // Deduplicate against current data\n const existingIds = new Set(dataRef.current.nodes.map((n) => n.id));\n const uniqueNodes = newNodes.filter((n) => !existingIds.has(n.id));\n\n // Trigger re-render with merged data (positions preserved via ref)\n setAppendedData((prev) => ({\n nodes: [...(prev?.nodes ?? []), ...uniqueNodes],\n links: [...(prev?.links ?? []), ...newLinks],\n }));\n\n return uniqueNodes.length;\n },\n getScene() {\n return sceneRef.current?.scene ?? null;\n },\n getRenderer() {\n return sceneRef.current?.renderer ?? null;\n },\n getCamera() {\n return sceneRef.current?.camera ?? null;\n },\n captureScreenshot() {\n const s = sceneRef.current;\n if (!s) return null;\n s.renderer.render(s.scene, s.camera);\n return s.renderer.domElement.toDataURL(\"image/png\");\n },\n getGraphSnapshot() {\n const gObj = graphObjRef.current;\n const d = dataRef.current;\n if (!gObj || !d.positions) return null;\n return {\n positions: d.positions,\n count: d.nodes.length,\n colors: (gObj.nodesMesh.instanceColor?.array as Float32Array) ?? null,\n hidden: hiddenNodesRef.current,\n selectedIndex: selectedNodeIdRef.current\n ? d.nodeIdToIndex.get(selectedNodeIdRef.current) ?? -1\n : -1,\n };\n },\n getViewportRect() {\n const s = sceneRef.current;\n if (!s) return null;\n const cam = s.camera;\n const t = s.controls.target as THREE.Vector3;\n // Frustum footprint around the orbit target (exact for the\n // axis-aligned 2D camera; a serviceable approximation when the\n // 3D camera is rotated — sized by camera→target distance).\n const dist = Math.max(cam.position.distanceTo(t), 1);\n const halfH = Math.tan((cam.fov * Math.PI) / 360) * dist;\n return {\n cx: t.x,\n cy: t.y,\n halfW: halfH * cam.aspect,\n halfH,\n };\n },\n reheatLayout() {\n // Force re-run of layout by resetting settled state\n // The worker will be restarted on the next data change cycle\n const gObj = graphObjRef.current;\n if (gObj?.worker) {\n gObj.worker.postMessage({ type: \"stop\" });\n gObj.worker.terminate();\n gObj.worker = null;\n }\n dataRef.current.settled = false;\n // Trigger re-render by toggling appended data\n setAppendedData((prev) => prev ? { ...prev } : { nodes: [], links: [] });\n },\n }));\n\n return (\n <div\n ref={containerRef}\n tabIndex={-1}\n style={{\n width: \"100%\",\n height: \"100%\",\n outline: \"none\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n }}\n onDragStart={(e) => e.preventDefault()}\n />\n );\n}\n\nexport const NetworkGraph3D = forwardRef(NetworkGraph3DInner);\n","/**\n * GraphMinimap — lightweight 2D-canvas overview of a NetworkGraph3D.\n *\n * Reads node buffers via ref.getGraphSnapshot() on a throttled rAF loop\n * (no second WebGL context, no React re-renders per frame), draws dots +\n * the camera's viewport rectangle, and pans the main camera on\n * click/drag. Designed for 2D layout mode; in 3D the viewport rectangle\n * is an approximation of the camera footprint on the z=0 plane.\n */\nimport { useEffect, useRef, type RefObject, type CSSProperties } from \"react\";\nimport type { NetworkGraph3DRef } from \"../types\";\n\nexport interface GraphMinimapProps {\n /** Ref to the NetworkGraph3D instance to mirror */\n graphRef: RefObject<NetworkGraph3DRef | null>;\n /** Canvas CSS width in px (default: 200) */\n width?: number;\n /** Canvas CSS height in px (default: 140) */\n height?: number;\n /** Background fill (default: transparent) */\n backgroundColor?: string;\n /** Viewport rectangle stroke color (default: \"#94a3b8\") */\n viewportColor?: string;\n /** Dot radius in px (default: 1.5) */\n dotRadius?: number;\n /** Redraw rate in frames per second (default: 15) */\n fps?: number;\n /** Fraction of canvas kept as padding around the graph (default: 0.08) */\n padding?: number;\n className?: string;\n style?: CSSProperties;\n}\n\ninterface FitTransform {\n scale: number;\n offsetX: number;\n offsetY: number;\n}\n\nexport function GraphMinimap({\n graphRef,\n width = 200,\n height = 140,\n backgroundColor,\n viewportColor = \"#94a3b8\",\n dotRadius = 1.5,\n fps = 15,\n padding = 0.08,\n className,\n style,\n}: GraphMinimapProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n // World→canvas transform of the last drawn frame, for pointer mapping\n const fitRef = useRef<FitTransform | null>(null);\n const draggingRef = useRef(false);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n\n let raf = 0;\n let last = 0;\n const interval = 1000 / fps;\n\n const draw = (now: number) => {\n raf = requestAnimationFrame(draw);\n if (now - last < interval) return;\n last = now;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, width, height);\n }\n\n const snap = graphRef.current?.getGraphSnapshot();\n if (!snap || snap.count === 0) {\n fitRef.current = null;\n return;\n }\n const { positions, count, colors, hidden, selectedIndex } = snap;\n\n // Bounds over visible nodes (XY plane)\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < count; i++) {\n if (hidden && hidden[i]) continue;\n const x = positions[i * 3];\n const y = positions[i * 3 + 1];\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n if (!isFinite(minX)) {\n fitRef.current = null;\n return;\n }\n\n const spanX = Math.max(maxX - minX, 1);\n const spanY = Math.max(maxY - minY, 1);\n const pad = Math.min(width, height) * padding;\n const scale = Math.min(\n (width - pad * 2) / spanX,\n (height - pad * 2) / spanY\n );\n // World y is up; canvas y is down → flip\n const offsetX = width / 2 - ((minX + maxX) / 2) * scale;\n const offsetY = height / 2 + ((minY + maxY) / 2) * scale;\n fitRef.current = { scale, offsetX, offsetY };\n\n // Nodes\n const r = dotRadius;\n for (let i = 0; i < count; i++) {\n if (hidden && hidden[i]) continue;\n const cx = positions[i * 3] * scale + offsetX;\n const cy = -positions[i * 3 + 1] * scale + offsetY;\n if (colors) {\n const cr = Math.min(255, Math.round(colors[i * 3] * 255));\n const cg = Math.min(255, Math.round(colors[i * 3 + 1] * 255));\n const cb = Math.min(255, Math.round(colors[i * 3 + 2] * 255));\n ctx.fillStyle = `rgb(${cr},${cg},${cb})`;\n } else {\n ctx.fillStyle = viewportColor;\n }\n const rad = i === selectedIndex ? r * 2 : r;\n ctx.beginPath();\n ctx.arc(cx, cy, rad, 0, Math.PI * 2);\n ctx.fill();\n }\n\n // Viewport rectangle\n const vp = graphRef.current?.getViewportRect();\n if (vp) {\n const x = (vp.cx - vp.halfW) * scale + offsetX;\n const y = -(vp.cy + vp.halfH) * scale + offsetY;\n const w = vp.halfW * 2 * scale;\n const h = vp.halfH * 2 * scale;\n ctx.strokeStyle = viewportColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(x, y, w, h);\n ctx.fillStyle = viewportColor + \"1a\"; // ~10% alpha\n ctx.fillRect(x, y, w, h);\n }\n };\n raf = requestAnimationFrame(draw);\n return () => cancelAnimationFrame(raf);\n }, [graphRef, width, height, backgroundColor, viewportColor, dotRadius, fps, padding]);\n\n const panToPointer = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const fit = fitRef.current;\n const canvas = canvasRef.current;\n if (!fit || !canvas) return;\n const rect = canvas.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n const wx = (px - fit.offsetX) / fit.scale;\n const wy = -(py - fit.offsetY) / fit.scale;\n graphRef.current?.panTo(wx, wy, draggingRef.current ? 0 : 300);\n };\n\n return (\n <canvas\n ref={canvasRef}\n className={className}\n style={{\n width,\n height,\n cursor: \"pointer\",\n touchAction: \"none\",\n display: \"block\",\n ...style,\n }}\n onPointerDown={(e) => {\n draggingRef.current = true;\n e.currentTarget.setPointerCapture(e.pointerId);\n panToPointer(e);\n }}\n onPointerMove={(e) => {\n if (draggingRef.current) panToPointer(e);\n }}\n onPointerUp={(e) => {\n draggingRef.current = false;\n e.currentTarget.releasePointerCapture(e.pointerId);\n }}\n onPointerCancel={() => {\n draggingRef.current = false;\n }}\n />\n );\n}\n","export default function(x, y, z) {\n var nodes, strength = 1;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n if (z == null) z = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0,\n sz = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x || 0, sy += node.y || 0, sz += node.z || 0;\n }\n\n for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, sz = (sz / n - z) * strength, i = 0; i < n; ++i) {\n node = nodes[i];\n if (sx) { node.x -= sx }\n if (sy) { node.y -= sy; }\n if (sz) { node.z -= sz; }\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n force.z = function(_) {\n return arguments.length ? (z = +_, force) : z;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n return force;\n}\n","export default function(d) {\n const x = +this._x.call(null, d);\n return add(this.cover(x), x, d);\n}\n\nfunction add(tree, x, d) {\n if (isNaN(x)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n x1 = tree._x1,\n xm,\n xp,\n right,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (parent = node, !(node = node[i = +right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n if (x === xp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(2) : tree._root = new Array(2);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n } while ((i = +right) === (j = +(xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n if (!Array.isArray(data)) data = Array.from(data);\n const n = data.length;\n const xz = new Float64Array(n);\n let x0 = Infinity,\n x1 = -Infinity;\n\n // Compute the points and their extent.\n for (let i = 0, x; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, data[i]))) continue;\n xz[i] = x;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0).cover(x1);\n\n // Add the new points.\n for (let i = 0; i < n; ++i) {\n add(this, xz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x) {\n if (isNaN(x = +x)) return this; // ignore invalid points\n\n var x0 = this._x0,\n x1 = this._x1;\n\n // If the binarytree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing half boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1) {\n i = +(x < x0);\n parent = new Array(2), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z; break;\n case 1: x0 = x1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._x1 = x1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0]).cover(+_[1][0])\n : isNaN(this._x0) ? undefined : [[this._x0], [this._x1]];\n}\n","export default function(node, x0, x1) {\n this.node = node;\n this.x0 = x0;\n this.x1 = x1;\n}\n","import Half from \"./half.js\";\n\nexport default function(x, radius) {\n var data,\n x0 = this._x0,\n x1,\n x2,\n x3 = this._x1,\n halves = [],\n node = this._root,\n q,\n i;\n\n if (node) halves.push(new Half(node, x0, x3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius;\n x3 = x + radius;\n }\n\n while (q = halves.pop()) {\n\n // Stop searching if this half can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (x2 = q.x1) < x0) continue;\n\n // Bisect the current half.\n if (node.length) {\n var xm = (x1 + x2) / 2;\n\n halves.push(\n new Half(node[1], xm, x2),\n new Half(node[0], x1, xm)\n );\n\n // Visit the closest half first.\n if (i = +(x >= xm)) {\n q = halves[halves.length - 1];\n halves[halves.length - 1] = halves[halves.length - 1 - i];\n halves[halves.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var d = Math.abs(x - +this._x.call(null, node.data));\n if (d < radius) {\n radius = d;\n x0 = x - d;\n x3 = x + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n x1 = this._x1,\n x,\n xm,\n right,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (!(parent = node, node = node[i = +right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 1]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1])\n && node === (parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Half from \"./half.js\";\n\nexport default function(callback) {\n var halves = [], q, node = this._root, child, x0, x1;\n if (node) halves.push(new Half(node, this._x0, this._x1));\n while (q = halves.pop()) {\n if (!callback(node = q.node, x0 = q.x0, x1 = q.x1) && node.length) {\n var xm = (x0 + x1) / 2;\n if (child = node[1]) halves.push(new Half(child, xm, x1));\n if (child = node[0]) halves.push(new Half(child, x0, xm));\n }\n }\n return this;\n}\n","import Half from \"./half.js\";\n\nexport default function(callback) {\n var halves = [], next = [], q;\n if (this._root) halves.push(new Half(this._root, this._x0, this._x1));\n while (q = halves.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, x1 = q.x1, xm = (x0 + x1) / 2;\n if (child = node[0]) halves.push(new Half(child, x0, xm));\n if (child = node[1]) halves.push(new Half(child, xm, x1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.x1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\n\nexport default function binarytree(nodes, x) {\n var tree = new Binarytree(x == null ? defaultX : x, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Binarytree(x, x0, x1) {\n this._x = x;\n this._x0 = x0;\n this._x1 = x1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = binarytree.prototype = Binarytree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Binarytree(this._x, this._x0, this._x1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(2)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 2; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(2)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;","export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n i = (y < y0) << 1 | (x < x0);\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z, y1 = y0 + z; break;\n case 1: x0 = x1 - z, y1 = y0 + z; break;\n case 2: x1 = x0 + z, y0 = y1 - z; break;\n case 3: x0 = x1 - z, y0 = y1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n","export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n","export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d),\n z = +this._z.call(null, d);\n return add(this.cover(x, y, z), x, y, z, d);\n}\n\nfunction add(tree, x, y, z, d) {\n if (isNaN(x) || isNaN(y) || isNaN(z)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n z0 = tree._z0,\n x1 = tree._x1,\n y1 = tree._y1,\n z1 = tree._z1,\n xm,\n ym,\n zm,\n xp,\n yp,\n zp,\n right,\n bottom,\n deep,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n if (parent = node, !(node = node[i = deep << 2 | bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n zp = +tree._z.call(null, node.data);\n if (x === xp && y === yp && z === zp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(8) : tree._root = new Array(8);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n } while ((i = deep << 2 | bottom << 1 | right) === (j = (zp >= zm) << 2 | (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n if (!Array.isArray(data)) data = Array.from(data);\n const n = data.length;\n const xz = new Float64Array(n);\n const yz = new Float64Array(n);\n const zz = new Float64Array(n);\n let x0 = Infinity,\n y0 = Infinity,\n z0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity,\n z1 = -Infinity;\n\n // Compute the points and their extent.\n for (let i = 0, d, x, y, z; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d)) || isNaN(z = +this._z.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n zz[i] = z;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n if (z < z0) z0 = z;\n if (z > z1) z1 = z;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1 || z0 > z1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0, z0).cover(x1, y1, z1);\n\n // Add the new points.\n for (let i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], zz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y, z) {\n if (isNaN(x = +x) || isNaN(y = +y) || isNaN(z = +z)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1 = this._x1,\n y1 = this._y1,\n z1 = this._z1;\n\n // If the octree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing octant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n z1 = (z0 = Math.floor(z)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var t = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1 || z0 > z || z >= z1) {\n i = (z < z0) << 2 | (y < y0) << 1 | (x < x0);\n parent = new Array(8), parent[i] = node, node = parent, t *= 2;\n switch (i) {\n case 0: x1 = x0 + t, y1 = y0 + t, z1 = z0 + t; break;\n case 1: x0 = x1 - t, y1 = y0 + t, z1 = z0 + t; break;\n case 2: x1 = x0 + t, y0 = y1 - t, z1 = z0 + t; break;\n case 3: x0 = x1 - t, y0 = y1 - t, z1 = z0 + t; break;\n case 4: x1 = x0 + t, y1 = y0 + t, z0 = z1 - t; break;\n case 5: x0 = x1 - t, y1 = y0 + t, z0 = z1 - t; break;\n case 6: x1 = x0 + t, y0 = y1 - t, z0 = z1 - t; break;\n case 7: x0 = x1 - t, y0 = y1 - t, z0 = z1 - t; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._z0 = z0;\n this._x1 = x1;\n this._y1 = y1;\n this._z1 = z1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1], +_[0][2]).cover(+_[1][0], +_[1][1], +_[1][2])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0, this._z0], [this._x1, this._y1, this._z1]];\n}\n","export default function(node, x0, y0, z0, x1, y1, z1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.z0 = z0;\n this.x1 = x1;\n this.y1 = y1;\n this.z1 = z1;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(x, y, z, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1,\n y1,\n z1,\n x2,\n y2,\n z2,\n x3 = this._x1,\n y3 = this._y1,\n z3 = this._z1,\n octs = [],\n node = this._root,\n q,\n i;\n\n if (node) octs.push(new Octant(node, x0, y0, z0, x3, y3, z3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius, z0 = z - radius;\n x3 = x + radius, y3 = y + radius, z3 = z + radius;\n radius *= radius;\n }\n\n while (q = octs.pop()) {\n\n // Stop searching if this octant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (z1 = q.z0) > z3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0\n || (z2 = q.z1) < z0) continue;\n\n // Bisect the current octant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2,\n zm = (z1 + z2) / 2;\n\n octs.push(\n new Octant(node[7], xm, ym, zm, x2, y2, z2),\n new Octant(node[6], x1, ym, zm, xm, y2, z2),\n new Octant(node[5], xm, y1, zm, x2, ym, z2),\n new Octant(node[4], x1, y1, zm, xm, ym, z2),\n new Octant(node[3], xm, ym, z1, x2, y2, zm),\n new Octant(node[2], x1, ym, z1, xm, y2, zm),\n new Octant(node[1], xm, y1, z1, x2, ym, zm),\n new Octant(node[0], x1, y1, z1, xm, ym, zm)\n );\n\n // Visit the closest octant first.\n if (i = (z >= zm) << 2 | (y >= ym) << 1 | (x >= xm)) {\n q = octs[octs.length - 1];\n octs[octs.length - 1] = octs[octs.length - 1 - i];\n octs[octs.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n dz = z - +this._z.call(null, node.data),\n d2 = dx * dx + dy * dy + dz * dz;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d, z0 = z - d;\n x3 = x + d, y3 = y + d, z3 = z + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","const distance = (x1, y1, z1, x2, y2, z2) => Math.sqrt((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2);\n\nexport function findAllWithinRadius(x, y, z, radius) {\n const result = [];\n\n const xMin = x - radius;\n const yMin = y - radius;\n const zMin = z - radius;\n const xMax = x + radius;\n const yMax = y + radius;\n const zMax = z + radius;\n\n this.visit((node, x1, y1, z1, x2, y2, z2) => {\n if (!node.length) {\n do {\n const d = node.data;\n if (distance(x, y, z, this._x(d), this._y(d), this._z(d)) <= radius) {\n result.push(d);\n }\n } while (node = node.next);\n }\n return x1 > xMax || y1 > yMax || z1 > zMax || x2 < xMin || y2 < yMin || z2 < zMin;\n });\n\n return result;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d)) || isNaN(z = +this._z.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1 = this._x1,\n y1 = this._y1,\n z1 = this._z1,\n x,\n y,\n z,\n xm,\n ym,\n zm,\n right,\n bottom,\n deep,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n if (!(parent = node, node = node[i = deep << 2 | bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 7] || parent[(i + 2) & 7] || parent[(i + 3) & 7] || parent[(i + 4) & 7] || parent[(i + 5) & 7] || parent[(i + 6) & 7] || parent[(i + 7) & 7]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3] || parent[4] || parent[5] || parent[6] || parent[7])\n && node === (parent[7] || parent[6] || parent[5] || parent[4] || parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(callback) {\n var octs = [], q, node = this._root, child, x0, y0, z0, x1, y1, z1;\n if (node) octs.push(new Octant(node, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1));\n while (q = octs.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, z0 = q.z0, x1 = q.x1, y1 = q.y1, z1 = q.z1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2, zm = (z0 + z1) / 2;\n if (child = node[7]) octs.push(new Octant(child, xm, ym, zm, x1, y1, z1));\n if (child = node[6]) octs.push(new Octant(child, x0, ym, zm, xm, y1, z1));\n if (child = node[5]) octs.push(new Octant(child, xm, y0, zm, x1, ym, z1));\n if (child = node[4]) octs.push(new Octant(child, x0, y0, zm, xm, ym, z1));\n if (child = node[3]) octs.push(new Octant(child, xm, ym, z0, x1, y1, zm));\n if (child = node[2]) octs.push(new Octant(child, x0, ym, z0, xm, y1, zm));\n if (child = node[1]) octs.push(new Octant(child, xm, y0, z0, x1, ym, zm));\n if (child = node[0]) octs.push(new Octant(child, x0, y0, z0, xm, ym, zm));\n }\n }\n return this;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(callback) {\n var octs = [], next = [], q;\n if (this._root) octs.push(new Octant(this._root, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1));\n while (q = octs.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, z0 = q.z0, x1 = q.x1, y1 = q.y1, z1 = q.z1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2, zm = (z0 + z1) / 2;\n if (child = node[0]) octs.push(new Octant(child, x0, y0, z0, xm, ym, zm));\n if (child = node[1]) octs.push(new Octant(child, xm, y0, z0, x1, ym, zm));\n if (child = node[2]) octs.push(new Octant(child, x0, ym, z0, xm, y1, zm));\n if (child = node[3]) octs.push(new Octant(child, xm, ym, z0, x1, y1, zm));\n if (child = node[4]) octs.push(new Octant(child, x0, y0, zm, xm, ym, z1));\n if (child = node[5]) octs.push(new Octant(child, xm, y0, zm, x1, ym, z1));\n if (child = node[6]) octs.push(new Octant(child, x0, ym, zm, xm, y1, z1));\n if (child = node[7]) octs.push(new Octant(child, xm, ym, zm, x1, y1, z1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.z0, q.x1, q.y1, q.z1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","export function defaultZ(d) {\n return d[2];\n}\n\nexport default function(_) {\n return arguments.length ? (this._z = _, this) : this._z;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport { findAllWithinRadius as tree_findAllWithinRadius } from \"./findAll.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\nimport tree_z, {defaultZ} from \"./z.js\";\n\nexport default function octree(nodes, x, y, z) {\n var tree = new Octree(x == null ? defaultX : x, y == null ? defaultY : y, z == null ? defaultZ : z, NaN, NaN, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Octree(x, y, z, x0, y0, z0, x1, y1, z1) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._x0 = x0;\n this._y0 = y0;\n this._z0 = z0;\n this._x1 = x1;\n this._y1 = y1;\n this._z1 = z1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = octree.prototype = Octree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Octree(this._x, this._y, this._z, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(8)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 8; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(8)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.findAllWithinRadius = tree_findAllWithinRadius;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\ntreeProto.z = tree_z;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(random) {\n return (random() - 0.5) * 1e-6;\n}\n","import constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\n\nfunction index(d) {\n return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"node not found: \" + nodeId);\n return node;\n}\n\nexport default function(links) {\n var id = index,\n strength = defaultStrength,\n strengths,\n distance = constant(30),\n distances,\n nodes,\n nDim,\n count,\n bias,\n random,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x = 0, y = 0, z = 0, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle(random);\n if (nDim > 1) { y = target.y + target.vy - source.y - source.vy || jiggle(random); }\n if (nDim > 2) { z = target.z + target.vz - source.z - source.vz || jiggle(random); }\n l = Math.sqrt(x * x + y * y + z * z);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l, z *= l;\n\n target.vx -= x * (b = bias[i]);\n if (nDim > 1) { target.vy -= y * b; }\n if (nDim > 2) { target.vz -= z * b; }\n\n source.vx += x * (b = 1 - b);\n if (nDim > 1) { source.vy += y * b; }\n if (nDim > 2) { source.vz += z * b; }\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_nodes, ...args) {\n nodes = _nodes;\n random = args.find(arg => typeof arg === 'function') || Math.random;\n nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n}\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\n\nexport default function() {\n let s = 1;\n return () => (s = (a * s + c) % m) / m;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer} from \"d3-timer\";\nimport lcg from \"./lcg.js\";\n\nvar MAX_DIMENSIONS = 3;\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nexport function z(d) {\n return d.z;\n}\n\nvar initialRadius = 10,\n initialAngleRoll = Math.PI * (3 - Math.sqrt(5)), // Golden ratio angle\n initialAngleYaw = Math.PI * 20 / (9 + Math.sqrt(221)); // Markov irrational number\n\nexport default function(nodes, numDimensions) {\n numDimensions = numDimensions || 2;\n\n var nDim = Math.min(MAX_DIMENSIONS, Math.max(1, Math.round(numDimensions))),\n simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = new Map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\"),\n random = lcg();\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick(iterations) {\n var i, n = nodes.length, node;\n\n if (iterations === undefined) iterations = 1;\n\n for (var k = 0; k < iterations; ++k) {\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.forEach(function (force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (nDim > 1) {\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n if (nDim > 2) {\n if (node.fz == null) node.z += node.vz *= velocityDecay;\n else node.z = node.fz, node.vz = 0;\n }\n }\n }\n\n return simulation;\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (node.fx != null) node.x = node.fx;\n if (node.fy != null) node.y = node.fy;\n if (node.fz != null) node.z = node.fz;\n if (isNaN(node.x) || (nDim > 1 && isNaN(node.y)) || (nDim > 2 && isNaN(node.z))) {\n var radius = initialRadius * (nDim > 2 ? Math.cbrt(0.5 + i) : (nDim > 1 ? Math.sqrt(0.5 + i) : i)),\n rollAngle = i * initialAngleRoll,\n yawAngle = i * initialAngleYaw;\n\n if (nDim === 1) {\n node.x = radius;\n } else if (nDim === 2) {\n node.x = radius * Math.cos(rollAngle);\n node.y = radius * Math.sin(rollAngle);\n } else { // 3 dimensions: use spherical distribution along 2 irrational number angles\n node.x = radius * Math.sin(rollAngle) * Math.cos(yawAngle);\n node.y = radius * Math.cos(rollAngle);\n node.z = radius * Math.sin(rollAngle) * Math.sin(yawAngle);\n }\n }\n if (isNaN(node.vx) || (nDim > 1 && isNaN(node.vy)) || (nDim > 2 && isNaN(node.vz))) {\n node.vx = 0;\n if (nDim > 1) { node.vy = 0; }\n if (nDim > 2) { node.vz = 0; }\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes, random, nDim);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n numDimensions: function(_) {\n return arguments.length\n ? (nDim = Math.min(MAX_DIMENSIONS, Math.max(1, Math.round(_))), forces.forEach(initializeForce), simulation)\n : nDim;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n randomSource: function(_) {\n return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function() {\n var args = Array.prototype.slice.call(arguments);\n var x = args.shift() || 0,\n y = (nDim > 1 ? args.shift() : null) || 0,\n z = (nDim > 2 ? args.shift() : null) || 0,\n radius = args.shift() || Infinity;\n\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n dz,\n d2,\n node,\n closest;\n\n radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - (node.y || 0);\n dz = z - (node.z ||0);\n d2 = dx * dx + dy * dy + dz * dz;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n","import {binarytree} from \"d3-binarytree\";\nimport {quadtree} from \"d3-quadtree\";\nimport {octree} from \"d3-octree\";\nimport constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\nimport {x, y, z} from \"./simulation.js\";\n\nexport default function() {\n var nodes,\n nDim,\n node,\n random,\n alpha,\n strength = constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i,\n n = nodes.length,\n tree =\n (nDim === 1 ? binarytree(nodes, x)\n :(nDim === 2 ? quadtree(nodes, x, y)\n :(nDim === 3 ? octree(nodes, x, y, z)\n :null\n ))).visitAfter(accumulate);\n\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(treeNode) {\n var strength = 0, q, c, weight = 0, x, y, z, i;\n var numChildren = treeNode.length;\n\n // For internal nodes, accumulate forces from children.\n if (numChildren) {\n for (x = y = z = i = 0; i < numChildren; ++i) {\n if ((q = treeNode[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * (q.x || 0), y += c * (q.y || 0), z += c * (q.z || 0);\n }\n }\n strength *= Math.sqrt(4 / numChildren); // scale accumulated strength according to number of dimensions\n\n treeNode.x = x / weight;\n if (nDim > 1) { treeNode.y = y / weight; }\n if (nDim > 2) { treeNode.z = z / weight; }\n }\n\n // For leaf nodes, accumulate forces from coincident nodes.\n else {\n q = treeNode;\n q.x = q.data.x;\n if (nDim > 1) { q.y = q.data.y; }\n if (nDim > 2) { q.z = q.data.z; }\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n treeNode.value = strength;\n }\n\n function apply(treeNode, x1, arg1, arg2, arg3) {\n if (!treeNode.value) return true;\n var x2 = [arg1, arg2, arg3][nDim-1];\n\n var x = treeNode.x - node.x,\n y = (nDim > 1 ? treeNode.y - node.y : 0),\n z = (nDim > 2 ? treeNode.z - node.z : 0),\n w = x2 - x1,\n l = x * x + y * y + z * z;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (nDim > 1 && y === 0) y = jiggle(random), l += y * y;\n if (nDim > 2 && z === 0) z = jiggle(random), l += z * z;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * treeNode.value * alpha / l;\n if (nDim > 1) { node.vy += y * treeNode.value * alpha / l; }\n if (nDim > 2) { node.vz += z * treeNode.value * alpha / l; }\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (treeNode.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (treeNode.data !== node || treeNode.next) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (nDim > 1 && y === 0) y = jiggle(random), l += y * y;\n if (nDim > 2 && z === 0) z = jiggle(random), l += z * z;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (treeNode.data !== node) {\n w = strengths[treeNode.data.index] * alpha / l;\n node.vx += x * w;\n if (nDim > 1) { node.vy += y * w; }\n if (nDim > 2) { node.vz += z * w; }\n } while (treeNode = treeNode.next);\n }\n\n force.initialize = function(_nodes, ...args) {\n nodes = _nodes;\n random = args.find(arg => typeof arg === 'function') || Math.random;\n nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n}\n","/**\n * Subgraph extraction via BFS with budget-based node pruning.\n */\nimport type { GraphData, GraphNode, GraphLink } from \"../types\";\n\nexport interface SubgraphResult {\n nodes: GraphNode[];\n links: GraphLink[];\n /** Map of node ID → hop distance from center */\n hops: Map<string, number>;\n}\n\nexport interface SubgraphOptions {\n maxHops?: number;\n maxNodes?: number;\n}\n\n/**\n * Build a subgraph of N-hop neighborhood around a center node.\n * Uses budget-based pruning: all hop 0-1 nodes are kept,\n * then top nodes by `val` for remaining hops.\n */\nexport function buildSubgraph(\n data: GraphData,\n centerNodeId: string,\n adjacencyMap: Map<string, string[]>,\n options?: SubgraphOptions\n): SubgraphResult {\n const maxHops = options?.maxHops ?? 3;\n const maxNodes = options?.maxNodes ?? 250;\n\n // BFS\n const visited = new Map<string, number>();\n visited.set(centerNodeId, 0);\n const queue = [centerNodeId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const dist = visited.get(current)!;\n if (dist >= maxHops) continue;\n for (const nb of adjacencyMap.get(current) ?? []) {\n if (!visited.has(nb)) {\n visited.set(nb, dist + 1);\n queue.push(nb);\n }\n }\n }\n\n // Budget-based pruning\n if (visited.size > maxNodes) {\n const nodeMap = new Map<string, GraphNode>();\n for (const n of data.nodes) {\n if (visited.has(n.id)) nodeMap.set(n.id, n);\n }\n\n const kept = new Map<string, number>();\n for (const [id, hop] of visited) {\n if (hop <= 1) kept.set(id, hop);\n }\n\n const rest: { id: string; hop: number; val: number }[] = [];\n for (const [id, hop] of visited) {\n if (hop > 1) rest.push({ id, hop, val: nodeMap.get(id)?.val ?? 0 });\n }\n rest.sort((a, b) => b.val - a.val);\n\n const budget = maxNodes - kept.size;\n for (let i = 0; i < Math.min(budget, rest.length); i++) {\n kept.set(rest[i].id, rest[i].hop);\n }\n\n visited.clear();\n for (const [id, hop] of kept) visited.set(id, hop);\n }\n\n const subNodes = data.nodes.filter((n) => visited.has(n.id));\n const subLinks = data.links.filter((l) => {\n const s = typeof l.source === \"object\" ? (l.source as any).id : l.source;\n const t = typeof l.target === \"object\" ? (l.target as any).id : l.target;\n return visited.has(s) && visited.has(t);\n });\n\n return { nodes: subNodes, links: subLinks, hops: visited };\n}\n","/**\n * SubgraphView2D — 2D Canvas force-directed subgraph renderer.\n * Renders a mini neighborhood graph centered on a specific node.\n */\nimport {\n useEffect,\n useRef,\n useCallback,\n useMemo,\n useState,\n type CSSProperties,\n} from \"react\";\nimport {\n forceSimulation,\n forceManyBody,\n forceLink,\n forceCenter,\n} from \"d3-force-3d\";\nimport type { GraphData, GraphNode, ThemeConfig } from \"../types\";\nimport { resolveTheme, type ResolvedTheme } from \"../themes/resolve-theme\";\nimport { buildAdjacencyMapFromLinks } from \"../core/selection\";\nimport { buildSubgraph, type SubgraphOptions } from \"./subgraph-builder\";\n\nexport interface SubgraphView2DProps {\n /** Full graph data */\n data: GraphData;\n /** Center node ID to build subgraph around */\n centerNodeId: string;\n /** Max hops from center (default: 3) */\n maxHops?: number;\n /** Max nodes in subgraph (default: 250) */\n maxNodes?: number;\n /** Theme config or preset name */\n theme?: ThemeConfig | string;\n /** Click on a node */\n onNodeClick?: (node: GraphNode) => void;\n /** Hover on a node */\n onNodeHover?: (node: GraphNode | null) => void;\n /** Custom label formatter */\n labelFormatter?: (node: GraphNode) => string;\n /** Container style overrides */\n style?: CSSProperties;\n /** Container class name */\n className?: string;\n}\n\ninterface SimNode {\n id: string;\n label: string;\n type?: string;\n val: number;\n hop: number;\n x: number;\n y: number;\n fx?: number | null;\n fy?: number | null;\n _radius?: number;\n}\n\nfunction defaultLabelText(node: GraphNode): string {\n const label = node.label ?? node.id ?? \"\";\n return label.length > 25 ? label.substring(0, 22) + \"\\u2026\" : label;\n}\n\nexport function SubgraphView2D(props: SubgraphView2DProps) {\n const {\n data,\n centerNodeId,\n maxHops = 3,\n maxNodes = 250,\n theme: themeProp,\n onNodeClick,\n onNodeHover,\n labelFormatter,\n style: styleProp,\n className,\n } = props;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const simNodesRef = useRef<SimNode[]>([]);\n const [hoveredNode, setHoveredNode] = useState<SimNode | null>(null);\n\n const resolvedTheme = useMemo(() => resolveTheme(themeProp), [themeProp]);\n\n const adjacencyMap = useMemo(\n () => buildAdjacencyMapFromLinks(data.links),\n [data.links]\n );\n\n const subgraph = useMemo(\n () =>\n buildSubgraph(data, centerNodeId, adjacencyMap, { maxHops, maxNodes }),\n [data, centerNodeId, adjacencyMap, maxHops, maxNodes]\n );\n\n /* ── 2D Force simulation + Canvas render ── */\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || subgraph.nodes.length === 0) return;\n\n const container = canvas.parentElement;\n if (!container) return;\n const width = container.clientWidth;\n const height = container.clientHeight;\n if (width === 0 || height === 0) return;\n\n const dpr = Math.min(window.devicePixelRatio, 2);\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.style.width = width + \"px\";\n canvas.style.height = height + \"px\";\n const ctx = canvas.getContext(\"2d\")!;\n ctx.scale(dpr, dpr);\n\n const theme = resolvedTheme;\n const linkColors: Record<string, string> = {};\n\n // Build sim nodes\n const simNodes: SimNode[] = subgraph.nodes.map((n) => {\n const hop = subgraph.hops.get(n.id) ?? 3;\n return {\n id: n.id,\n label: n.label ?? n.id,\n type: n.type,\n val: n.val ?? 1,\n hop,\n x: (Math.random() - 0.5) * width * 0.3,\n y: (Math.random() - 0.5) * height * 0.3,\n };\n });\n\n // Fix center node at origin\n const centerNode = simNodes.find((n) => n.id === centerNodeId);\n if (centerNode) {\n centerNode.fx = 0;\n centerNode.fy = 0;\n }\n simNodesRef.current = simNodes;\n\n const simLinks = subgraph.links.map((l) => ({\n source: typeof l.source === \"object\" ? (l.source as any).id : l.source,\n target: typeof l.target === \"object\" ? (l.target as any).id : l.target,\n type: l.type,\n }));\n\n const nc = simNodes.length;\n const sim = forceSimulation(simNodes, 2)\n .force(\n \"charge\",\n forceManyBody()\n .strength(nc > 200 ? -40 : nc > 80 ? -70 : -120)\n .distanceMax(nc > 200 ? 200 : 300)\n )\n .force(\n \"link\",\n forceLink(simLinks)\n .id((d: any) => d.id)\n .distance(nc > 200 ? 25 : nc > 80 ? 40 : 60)\n .strength(0.3)\n )\n .force(\"center\", forceCenter())\n .alphaDecay(0.04)\n .velocityDecay(0.4);\n\n let animFrame: number;\n\n function render() {\n ctx.clearRect(0, 0, width, height);\n ctx.save();\n ctx.translate(width / 2, height / 2);\n\n // ── Edges ──\n for (const link of simLinks) {\n const s = link.source as any;\n const t = link.target as any;\n if (typeof s !== \"object\" || typeof t !== \"object\") continue;\n const maxHop = Math.max(s.hop ?? 3, t.hop ?? 3);\n ctx.beginPath();\n ctx.moveTo(s.x, s.y);\n ctx.lineTo(t.x, t.y);\n ctx.strokeStyle = theme.linkColor(link.type);\n ctx.globalAlpha = maxHop <= 1 ? 0.4 : maxHop <= 2 ? 0.18 : 0.07;\n ctx.lineWidth = maxHop <= 1 ? 1.5 : 1;\n ctx.stroke();\n }\n\n // ── Nodes ──\n for (const n of simNodes) {\n const isCenter = n.id === centerNodeId;\n const baseR = Math.max(\n 3,\n 3 + (Math.log(n.val + 1) / Math.log(100)) * 6\n );\n const radius = isCenter ? 14 : Math.max(3, baseR - n.hop * 0.8);\n const alpha =\n n.hop === 0 ? 1 : n.hop === 1 ? 0.9 : n.hop === 2 ? 0.55 : 0.3;\n\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.arc(n.x, n.y, radius, 0, Math.PI * 2);\n ctx.fillStyle = theme.nodeColor(n.type);\n ctx.fill();\n\n if (isCenter) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = \"#ffffff\";\n ctx.lineWidth = 2.5;\n ctx.stroke();\n // Glow\n ctx.save();\n ctx.shadowColor = theme.nodeColor(n.type);\n ctx.shadowBlur = 15;\n ctx.beginPath();\n ctx.arc(n.x, n.y, radius + 3, 0, Math.PI * 2);\n ctx.strokeStyle = theme.nodeColor(n.type);\n ctx.lineWidth = 1.5;\n ctx.globalAlpha = 0.6;\n ctx.stroke();\n ctx.restore();\n }\n\n n._radius = radius;\n }\n\n // ── Labels ──\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"bottom\";\n for (const n of simNodes) {\n if (n.hop > 1 && n.val < 50) continue;\n const isCenter = n.id === centerNodeId;\n const fontSize = isCenter ? 13 : n.hop <= 1 ? 11 : 9;\n ctx.font = `bold ${fontSize}px -apple-system, \"Segoe UI\", sans-serif`;\n ctx.globalAlpha = isCenter ? 1 : n.hop <= 1 ? 0.8 : 0.4;\n\n const label = labelFormatter\n ? labelFormatter(\n subgraph.nodes.find((sn) => sn.id === n.id) ?? {\n id: n.id,\n label: n.label,\n }\n )\n : defaultLabelText({ id: n.id, label: n.label });\n const yOff = (n._radius ?? 5) + 4;\n\n // Shadow\n ctx.fillStyle = \"rgba(0,0,0,0.85)\";\n ctx.fillText(label, n.x + 1, n.y - yOff + 1);\n // Text\n ctx.fillStyle = isCenter\n ? \"#ffffff\"\n : theme.nodeColorBright(n.type);\n ctx.fillText(label, n.x, n.y - yOff);\n }\n\n ctx.restore();\n }\n\n sim.on(\"tick\", () => {\n cancelAnimationFrame(animFrame);\n animFrame = requestAnimationFrame(render);\n });\n\n return () => {\n sim.stop();\n cancelAnimationFrame(animFrame);\n };\n }, [subgraph, centerNodeId, resolvedTheme, labelFormatter]);\n\n /* ── Hit testing ── */\n const hitTest = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>): SimNode | null => {\n const canvas = canvasRef.current;\n if (!canvas) return null;\n const rect = canvas.getBoundingClientRect();\n const mx = e.clientX - rect.left - rect.width / 2;\n const my = e.clientY - rect.top - rect.height / 2;\n for (const n of simNodesRef.current) {\n const dx = n.x - mx;\n const dy = n.y - my;\n const r = (n._radius ?? 5) + 5;\n if (dx * dx + dy * dy < r * r) return n;\n }\n return null;\n },\n []\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n const hit = hitTest(e);\n setHoveredNode(hit);\n if (onNodeHover) {\n if (hit) {\n const node = subgraph.nodes.find((n) => n.id === hit.id);\n onNodeHover(node ?? null);\n } else {\n onNodeHover(null);\n }\n }\n },\n [hitTest, onNodeHover, subgraph.nodes]\n );\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n const hit = hitTest(e);\n if (hit && hit.id !== centerNodeId && onNodeClick) {\n const node = subgraph.nodes.find((n) => n.id === hit.id);\n if (node) onNodeClick(node);\n }\n },\n [hitTest, centerNodeId, onNodeClick, subgraph.nodes]\n );\n\n const containerStyle: CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n ...styleProp,\n };\n\n return (\n <div className={className} style={containerStyle}>\n <canvas\n ref={canvasRef}\n onMouseMove={handleMouseMove}\n onClick={handleClick}\n style={{\n width: \"100%\",\n height: \"100%\",\n cursor: hoveredNode ? \"pointer\" : \"default\",\n }}\n />\n </div>\n );\n}\n","/**\n * NodeDetailPanel — Full-featured node detail modal/panel.\n *\n * Uses the SAME NetworkGraph3D (Three.js 3D renderer) for the\n * neighborhood subgraph — identical rendering quality as the main graph.\n *\n * Features:\n * - Node overview with custom metadata via renderNodeMeta\n * - Direct connections grouped by type (expand/collapse)\n * - 3-hop neighborhood rendered in full 3D (NetworkGraph3D)\n * - Keyboard: Escape to close (capture phase)\n * - Overlay click to close\n * - Navigation between nodes via connections or subgraph clicks\n */\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n type CSSProperties,\n} from \"react\";\nimport type { GraphData, GraphNode, GraphLink, ThemeConfig, NetworkGraph3DRef } from \"../types\";\nimport { resolveTheme } from \"../themes/resolve-theme\";\nimport { buildAdjacencyMapFromLinks } from \"../core/selection\";\nimport { buildSubgraph } from \"../subgraph/subgraph-builder\";\nimport { NetworkGraph3D } from \"../core/NetworkGraph3D\";\n\n/* ── Types ── */\n\nexport interface ConnectionGroup {\n title: string;\n type: string;\n nodes: GraphNode[];\n}\n\nexport interface NodeDetailPanelProps {\n node: GraphNode;\n data: GraphData;\n adjacencyMap?: Map<string, string[]>;\n onClose: () => void;\n onNodeNavigate: (node: GraphNode) => void;\n theme?: ThemeConfig | string;\n labelFormatter?: (node: GraphNode) => string;\n maxHops?: number;\n maxNodes?: number;\n renderNodeMeta?: (node: GraphNode) => ReactNode;\n groupConnections?: (directNeighbors: GraphNode[], links: GraphLink[]) => ConnectionGroup[];\n connectionLabel?: (node: GraphNode) => string;\n connectionSecondary?: (node: GraphNode) => ReactNode;\n modal?: boolean;\n className?: string;\n style?: CSSProperties;\n}\n\n/* ── Default grouping: by node.type ── */\nfunction defaultGroupConnections(neighbors: GraphNode[]): ConnectionGroup[] {\n const byType = new Map<string, GraphNode[]>();\n for (const n of neighbors) {\n const t = n.type ?? \"unknown\";\n let group = byType.get(t);\n if (!group) { group = []; byType.set(t, group); }\n group.push(n);\n }\n const groups: ConnectionGroup[] = [];\n for (const [type, nodes] of byType) {\n nodes.sort((a, b) => (b.val ?? 0) - (a.val ?? 0));\n groups.push({ title: type.charAt(0).toUpperCase() + type.slice(1) + \"s\", type, nodes });\n }\n return groups;\n}\n\n/* ── Get direct (hop-1) connections ── */\nfunction getDirectConnections(\n nodeId: string,\n subgraphNodes: GraphNode[],\n subgraphLinks: GraphLink[],\n hops: Map<string, number>\n): GraphNode[] {\n const neighborIds = new Set<string>();\n for (const link of subgraphLinks) {\n const s = typeof link.source === \"object\" ? (link.source as any).id : link.source;\n const t = typeof link.target === \"object\" ? (link.target as any).id : link.target;\n const otherId = s === nodeId ? t : t === nodeId ? s : null;\n if (otherId && hops.get(otherId) === 1) neighborIds.add(otherId);\n }\n return subgraphNodes.filter((n) => neighborIds.has(n.id));\n}\n\n/* ── Expandable connection group ── */\nfunction ConnectionGroupView({\n group, onNodeClick, connectionLabel, connectionSecondary, theme,\n}: {\n group: ConnectionGroup;\n onNodeClick: (node: GraphNode) => void;\n connectionLabel?: (node: GraphNode) => string;\n connectionSecondary?: (node: GraphNode) => ReactNode;\n theme: ReturnType<typeof resolveTheme>;\n}) {\n const [expanded, setExpanded] = useState(group.nodes.length <= 8);\n const shown = expanded ? group.nodes : group.nodes.slice(0, 5);\n\n return (\n <div style={{ marginBottom: 12 }}>\n <div\n onClick={() => setExpanded((v) => !v)}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8, cursor: \"pointer\", fontSize: 13, fontWeight: 600, color: \"#c9d1d9\", padding: \"4px 0\" }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: theme.nodeColor(group.type), flexShrink: 0 }} />\n {group.title}\n <span style={{ fontSize: 11, color: \"#8b949e\", background: \"#21262d\", borderRadius: 10, padding: \"1px 7px\", marginLeft: 4 }}>\n {group.nodes.length}\n </span>\n <span style={{ marginLeft: \"auto\", color: \"#8b949e\", fontSize: 11 }}>\n {expanded ? \"\\u25BE\" : \"\\u25B8\"}\n </span>\n </div>\n <div style={{ paddingLeft: 16 }}>\n {shown.map((n) => (\n <div\n key={n.id}\n onClick={() => onNodeClick(n)}\n style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", padding: \"4px 8px\", fontSize: 13, color: \"#c9d1d9\", cursor: \"pointer\", borderRadius: 4 }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.background = \"#161b22\"; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.background = \"transparent\"; }}\n >\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {connectionLabel ? connectionLabel(n) : (n.label ?? n.id)}\n </span>\n {connectionSecondary ? (\n <span style={{ fontSize: 12, color: \"#8b949e\", flexShrink: 0, marginLeft: 8 }}>{connectionSecondary(n)}</span>\n ) : (\n n.val != null && n.val > 1 && (\n <span style={{ fontSize: 12, color: \"#8b949e\", flexShrink: 0, marginLeft: 8 }}>{n.val}</span>\n )\n )}\n </div>\n ))}\n {!expanded && group.nodes.length > 5 && (\n <div onClick={() => setExpanded(true)} style={{ fontSize: 12, color: \"#58a6ff\", cursor: \"pointer\", padding: \"4px 8px\" }}>\n +{group.nodes.length - 5} more\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Main Component ── */\nexport function NodeDetailPanel(props: NodeDetailPanelProps) {\n const {\n node, data, adjacencyMap: adjacencyMapProp, onClose, onNodeNavigate,\n theme: themeProp, labelFormatter, maxHops = 3, maxNodes = 250,\n renderNodeMeta, groupConnections, connectionLabel, connectionSecondary,\n modal = true, className, style: styleProp,\n } = props;\n\n const graphRef = useRef<NetworkGraph3DRef>(null);\n const resolvedTheme = useMemo(() => resolveTheme(themeProp), [themeProp]);\n\n /* ── Navigation history ── */\n const [currentNode, setCurrentNode] = useState<GraphNode>(node);\n const [history, setHistory] = useState<GraphNode[]>([]);\n const [forwardStack, setForwardStack] = useState<GraphNode[]>([]);\n\n /** Internal navigation — updates modal state only, does NOT touch main graph */\n function navigateTo(target: GraphNode) {\n setHistory((prev) => [...prev, currentNode]);\n setCurrentNode(target);\n setForwardStack([]);\n }\n\n function navigateBack() {\n if (history.length === 0) return;\n const prev = history[history.length - 1];\n setHistory((h) => h.slice(0, -1));\n setForwardStack((f) => [currentNode, ...f]);\n setCurrentNode(prev);\n }\n\n function navigateForward() {\n if (forwardStack.length === 0) return;\n const next = forwardStack[0];\n setHistory((h) => [...h, currentNode]);\n setForwardStack((f) => f.slice(1));\n setCurrentNode(next);\n }\n\n /** Navigate to node AND notify parent (e.g. close modal + focus main graph) */\n function navigateToMain(target: GraphNode) {\n onNodeNavigate(target);\n }\n\n const adjacencyMap = useMemo(\n () => adjacencyMapProp ?? buildAdjacencyMapFromLinks(data.links),\n [adjacencyMapProp, data.links]\n );\n\n const subgraph = useMemo(\n () => buildSubgraph(data, currentNode.id, adjacencyMap, { maxHops, maxNodes }),\n [data, currentNode.id, adjacencyMap, maxHops, maxNodes]\n );\n\n // Build subgraph GraphData for the 3D renderer\n const subgraphData: GraphData = useMemo(() => ({\n nodes: subgraph.nodes,\n links: subgraph.links,\n }), [subgraph]);\n\n const directNeighbors = useMemo(\n () => getDirectConnections(currentNode.id, subgraph.nodes, subgraph.links, subgraph.hops),\n [currentNode.id, subgraph]\n );\n\n const connGroups = useMemo(\n () => groupConnections ? groupConnections(directNeighbors, subgraph.links) : defaultGroupConnections(directNeighbors),\n [directNeighbors, subgraph.links, groupConnections]\n );\n\n const subStats = useMemo(() => {\n const byType: Record<string, number> = {};\n for (const n of subgraph.nodes) { const t = n.type ?? \"unknown\"; byType[t] = (byType[t] || 0) + 1; }\n return { total: subgraph.nodes.length, edges: subgraph.links.length, byType };\n }, [subgraph]);\n\n const totalConns = directNeighbors.length;\n\n // Escape to close (capture phase — fires before container-scoped graph handlers)\n // Use stopImmediatePropagation to prevent any other window handlers from firing\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopImmediatePropagation();\n onClose();\n }\n };\n window.addEventListener(\"keydown\", handler, true);\n return () => window.removeEventListener(\"keydown\", handler, true);\n }, [onClose]);\n\n // Focus the selected node in subgraph after layout settles\n useEffect(() => {\n const timer = setTimeout(() => {\n graphRef.current?.focusNode(currentNode.id, 800);\n }, 1500);\n return () => clearTimeout(timer);\n }, [currentNode.id]);\n\n /** Single click in subgraph → navigate within modal */\n function handleSubgraphClick(clickedNode: GraphNode | null) {\n if (clickedNode && clickedNode.id !== currentNode.id) {\n navigateTo(clickedNode);\n }\n }\n\n /** Double click in subgraph → close modal and navigate in main graph */\n function handleSubgraphDoubleClick(clickedNode: GraphNode) {\n if (clickedNode.id !== currentNode.id) {\n navigateToMain(clickedNode);\n }\n }\n\n const nodeLabel = currentNode.label ?? currentNode.id;\n\n const content = (\n <div\n style={{\n display: \"flex\", flexDirection: \"column\", width: \"100%\", height: \"100%\",\n background: \"#0d1117\", borderRadius: modal ? 12 : 0, overflow: \"hidden\",\n border: modal ? \"1px solid #30363d\" : \"none\", ...styleProp,\n }}\n className={className}\n onClick={(e) => e.stopPropagation()}\n >\n {/* ── Header ── */}\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"16px 20px\", borderBottom: \"1px solid #21262d\", flexShrink: 0 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, minWidth: 0 }}>\n {/* Back / Forward navigation */}\n <div style={{ display: \"flex\", gap: 2, flexShrink: 0 }}>\n <NavBtn\n disabled={history.length === 0}\n onClick={navigateBack}\n title=\"Back\"\n >\n {\"\\u2190\"}\n </NavBtn>\n <NavBtn\n disabled={forwardStack.length === 0}\n onClick={navigateForward}\n title=\"Forward\"\n >\n {\"\\u2192\"}\n </NavBtn>\n </div>\n {currentNode.type && (\n <span style={{\n fontSize: 11, fontWeight: 600, padding: \"2px 10px\", borderRadius: 12,\n background: resolvedTheme.nodeColor(currentNode.type) + \"22\",\n color: resolvedTheme.nodeColor(currentNode.type),\n textTransform: \"uppercase\", letterSpacing: 0.5, flexShrink: 0,\n }}>\n {currentNode.type}\n </span>\n )}\n <h2 style={{ margin: 0, fontSize: 18, fontWeight: 600, color: \"#f0f6fc\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {nodeLabel}\n </h2>\n {history.length > 0 && (\n <span style={{ fontSize: 11, color: \"#484f58\", flexShrink: 0 }}>\n ({history.length + 1} visited)\n </span>\n )}\n </div>\n <button onClick={onClose} style={{ background: \"none\", border: \"none\", color: \"#8b949e\", fontSize: 20, cursor: \"pointer\", padding: \"4px 8px\", lineHeight: 1, flexShrink: 0 }}>\n {\"\\u2715\"}\n </button>\n </div>\n\n {/* ── Body: two-column layout ── */}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\", minHeight: 0 }}>\n {/* Left: info panel */}\n <div style={{ width: \"38%\", minWidth: 260, maxWidth: 400, overflowY: \"auto\", padding: 20, borderRight: \"1px solid #21262d\" }}>\n {/* Overview */}\n <div style={{ marginBottom: 20 }}>\n <h3 style={{ fontSize: 13, color: \"#8b949e\", margin: \"0 0 12px 0\", fontWeight: 600 }}>OVERVIEW</h3>\n {(currentNode as any).description && (\n <p style={{ fontSize: 13, color: \"#c9d1d9\", margin: \"0 0 12px 0\", lineHeight: 1.5 }}>{(currentNode as any).description}</p>\n )}\n {renderNodeMeta ? renderNodeMeta(currentNode) : (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n {currentNode.val != null && <MetaItem label=\"Weight\" value={String(currentNode.val)} />}\n {currentNode.type && <MetaItem label=\"Type\" value={currentNode.type} />}\n </div>\n )}\n </div>\n\n {/* Direct Connections */}\n <div style={{ marginBottom: 20 }}>\n <h3 style={{ fontSize: 13, color: \"#8b949e\", margin: \"0 0 12px 0\", fontWeight: 600, display: \"flex\", alignItems: \"center\", gap: 8 }}>\n DIRECT CONNECTIONS\n <span style={{ fontSize: 11, background: \"#21262d\", borderRadius: 10, padding: \"1px 8px\", color: \"#c9d1d9\" }}>{totalConns}</span>\n </h3>\n {connGroups.map((group) => (\n <ConnectionGroupView\n key={group.type} group={group} onNodeClick={navigateTo}\n connectionLabel={connectionLabel} connectionSecondary={connectionSecondary} theme={resolvedTheme}\n />\n ))}\n {totalConns === 0 && <p style={{ fontSize: 13, color: \"#484f58\" }}>No direct connections found</p>}\n </div>\n\n {/* Neighborhood summary */}\n <div style={{ padding: \"12px 0\", borderTop: \"1px solid #21262d\", fontSize: 12, color: \"#8b949e\" }}>\n <div>{Object.entries(subStats.byType).map(([type, count]) => `${count} ${type}`).join(\" \\u00B7 \")}</div>\n <div style={{ marginTop: 4, fontSize: 11, color: \"#484f58\" }}>{subStats.edges} edges in {maxHops}-hop neighborhood</div>\n </div>\n </div>\n\n {/* Right: 3D neighborhood graph (same renderer as main) */}\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", minWidth: 0 }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", padding: \"10px 16px\", borderBottom: \"1px solid #21262d\", fontSize: 13, flexShrink: 0 }}>\n <span style={{ color: \"#c9d1d9\", fontWeight: 600 }}>{maxHops}-Hop Neighborhood</span>\n <span style={{ color: \"#8b949e\", fontSize: 12 }}>{subStats.total} nodes · {subStats.edges} edges</span>\n </div>\n <div style={{ flex: 1, position: \"relative\" }}>\n <NetworkGraph3D\n ref={graphRef}\n data={subgraphData}\n theme={themeProp}\n selectedNodeId={currentNode.id}\n highlightHops={maxHops}\n onNodeClick={handleSubgraphClick}\n onNodeDoubleClick={handleSubgraphDoubleClick}\n labelFormatter={labelFormatter}\n style={{\n bloomStrength: 0.6,\n bloomRadius: 0.1,\n bloomThreshold: 0.1,\n fogDensity: 0.0004,\n nodeMinSize: 1,\n nodeMaxSize: 15,\n starField: true,\n }}\n />\n {/* Floating controls */}\n <div style={{ position: \"absolute\", top: 12, right: 12, display: \"flex\", flexDirection: \"column\", gap: 4, zIndex: 50 }}>\n <CtrlBtn title=\"Zoom to Fit\" onClick={() => graphRef.current?.zoomToFit(800, 100)}>&#x2302;</CtrlBtn>\n <CtrlBtn title=\"Zoom In\" onClick={() => graphRef.current?.zoomIn()}>+</CtrlBtn>\n <CtrlBtn title=\"Zoom Out\" onClick={() => graphRef.current?.zoomOut()}>&minus;</CtrlBtn>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n\n if (!modal) return content;\n\n return (\n <div\n onClick={onClose}\n style={{ position: \"fixed\", inset: 0, zIndex: 10000, background: \"rgba(0,0,0,0.65)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: 40 }}\n >\n <div style={{ width: \"92vw\", maxWidth: 1200, height: \"82vh\", maxHeight: 800 }}>\n {content}\n </div>\n </div>\n );\n}\n\n/* ── Helper components ── */\nfunction MetaItem({ label, value }: { label: string; value: string }) {\n return (\n <div style={{ background: \"#161b22\", borderRadius: 6, padding: \"8px 12px\" }}>\n <div style={{ fontSize: 11, color: \"#8b949e\", marginBottom: 2 }}>{label}</div>\n <div style={{ fontSize: 15, fontWeight: 600, color: \"#f0f6fc\" }}>{value}</div>\n </div>\n );\n}\n\nfunction NavBtn({ children, title, onClick, disabled }: { children: ReactNode; title: string; onClick: () => void; disabled: boolean }) {\n return (\n <button\n title={title}\n onClick={onClick}\n disabled={disabled}\n style={{\n width: 28, height: 28, border: \"1px solid #30363d\", borderRadius: 6,\n background: disabled ? \"transparent\" : \"#21262d\",\n color: disabled ? \"#30363d\" : \"#c9d1d9\",\n fontSize: 14, lineHeight: 1, cursor: disabled ? \"default\" : \"pointer\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n opacity: disabled ? 0.5 : 1,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction CtrlBtn({ children, title, onClick }: { children: ReactNode; title: string; onClick: () => void }) {\n return (\n <button\n title={title}\n onClick={onClick}\n style={{\n width: 36, height: 36, border: \"1px solid rgba(255,255,255,0.12)\", borderRadius: 8,\n background: \"rgba(13,17,23,0.7)\", backdropFilter: \"blur(8px)\",\n color: \"#8b949e\", fontSize: 18, lineHeight: 1, cursor: \"pointer\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.background = \"rgba(30,40,60,0.85)\"; (e.currentTarget as HTMLElement).style.color = \"#f0f6fc\"; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.background = \"rgba(13,17,23,0.7)\"; (e.currentTarget as HTMLElement).style.color = \"#8b949e\"; }}\n >\n {children}\n </button>\n );\n}\n"],"names":["c","initialRadius","document","distance","x","y","index","defaultLabelText","now","a","onKeyDown","m","onPointerDown","onPointerMove","rect","onPointerUp","_a","onContextMenu","set","style","z","interval","add","addAll","x2","removeAll","defaultX","leaf_copy","treeProto","tree_add","tree_addAll","tree_cover","tree_data","tree_extent","tree_find","tree_remove","tree_removeAll","tree_root","tree_size","tree_visit","tree_visitAfter","tree_x","y2","defaultY","tree_y","z2","tree_findAllWithinRadius","i","node","strength","timer"],"mappings":"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","x_google_ignoreList":[10,11,12,13,14,15,16,17,18,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82]}
1
+ {"version":3,"file":"index.js","sources":["../src/types/theme.ts","../src/types/layout.ts","../src/utils/color.ts","../src/themes/celestial.ts","../src/themes/neon.ts","../src/themes/minimal.ts","../src/themes/paper.ts","../src/themes/resolve-theme.ts","../src/layout/layout-config.ts","../src/layout/worker-inline.ts","../node_modules/three/examples/jsm/controls/OrbitControls.js","../node_modules/three/examples/jsm/shaders/CopyShader.js","../node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/three/examples/jsm/postprocessing/ShaderPass.js","../node_modules/three/examples/jsm/postprocessing/MaskPass.js","../node_modules/three/examples/jsm/postprocessing/EffectComposer.js","../node_modules/three/examples/jsm/postprocessing/RenderPass.js","../node_modules/three/examples/jsm/shaders/LuminosityHighPassShader.js","../node_modules/three/examples/jsm/postprocessing/UnrealBloomPass.js","../src/core/effects.ts","../src/core/selection.ts","../src/core/label-system.ts","../src/core/keyboard.ts","../src/core/scene-setup.ts","../src/core/node-mesh.ts","../src/core/edge-mesh.ts","../src/core/camera.ts","../src/core/interaction.ts","../src/core/dispose.ts","../src/core/NetworkGraph3D.tsx","../src/core/Minimap.tsx","../node_modules/d3-force-3d/src/center.js","../node_modules/d3-binarytree/src/add.js","../node_modules/d3-binarytree/src/cover.js","../node_modules/d3-binarytree/src/data.js","../node_modules/d3-binarytree/src/extent.js","../node_modules/d3-binarytree/src/half.js","../node_modules/d3-binarytree/src/find.js","../node_modules/d3-binarytree/src/remove.js","../node_modules/d3-binarytree/src/root.js","../node_modules/d3-binarytree/src/size.js","../node_modules/d3-binarytree/src/visit.js","../node_modules/d3-binarytree/src/visitAfter.js","../node_modules/d3-binarytree/src/x.js","../node_modules/d3-binarytree/src/binarytree.js","../node_modules/d3-quadtree/src/add.js","../node_modules/d3-quadtree/src/cover.js","../node_modules/d3-quadtree/src/data.js","../node_modules/d3-quadtree/src/extent.js","../node_modules/d3-quadtree/src/quad.js","../node_modules/d3-quadtree/src/find.js","../node_modules/d3-quadtree/src/remove.js","../node_modules/d3-quadtree/src/root.js","../node_modules/d3-quadtree/src/size.js","../node_modules/d3-quadtree/src/visit.js","../node_modules/d3-quadtree/src/visitAfter.js","../node_modules/d3-quadtree/src/x.js","../node_modules/d3-quadtree/src/y.js","../node_modules/d3-quadtree/src/quadtree.js","../node_modules/d3-octree/src/add.js","../node_modules/d3-octree/src/cover.js","../node_modules/d3-octree/src/data.js","../node_modules/d3-octree/src/extent.js","../node_modules/d3-octree/src/octant.js","../node_modules/d3-octree/src/find.js","../node_modules/d3-octree/src/findAll.js","../node_modules/d3-octree/src/remove.js","../node_modules/d3-octree/src/root.js","../node_modules/d3-octree/src/size.js","../node_modules/d3-octree/src/visit.js","../node_modules/d3-octree/src/visitAfter.js","../node_modules/d3-octree/src/x.js","../node_modules/d3-octree/src/y.js","../node_modules/d3-octree/src/z.js","../node_modules/d3-octree/src/octree.js","../node_modules/d3-force-3d/src/constant.js","../node_modules/d3-force-3d/src/jiggle.js","../node_modules/d3-force-3d/src/link.js","../node_modules/d3-dispatch/src/dispatch.js","../node_modules/d3-timer/src/timer.js","../node_modules/d3-force-3d/src/lcg.js","../node_modules/d3-force-3d/src/simulation.js","../node_modules/d3-force-3d/src/manyBody.js","../src/subgraph/subgraph-builder.ts","../src/subgraph/SubgraphView2D.tsx","../src/detail/NodeDetailPanel.tsx"],"sourcesContent":["/**\n * Theme configuration — controls all visual appearance.\n */\n\nexport interface ThemeConfig {\n /** Node colors by type string (e.g. { person: \"#58a6ff\", repo: \"#3fb950\" }) */\n nodeColors?: Record<string, string>;\n /** Brighter node colors for highlights (auto-generated if omitted) */\n nodeColorsBright?: Record<string, string>;\n /** Edge colors by type string (e.g. { follows: \"#8b949e\" }) */\n linkColors?: Record<string, string>;\n /** Fallback color for unmapped node types */\n defaultNodeColor?: string;\n /** Fallback color for unmapped link types */\n defaultLinkColor?: string;\n /** Scene background color */\n backgroundColor?: string;\n /** Color palette for auto-assignment when type has no explicit mapping */\n palette?: string[];\n /**\n * Edge blend mode. \"additive\" glows on dark backgrounds; \"normal\" is\n * required for light backgrounds (additive lines vanish on white).\n * Default: \"additive\" on dark backgrounds, \"normal\" on light ones.\n */\n blending?: \"additive\" | \"normal\";\n}\n\nexport interface StyleConfig {\n /** Minimum node sphere radius (default: 1) */\n nodeMinSize?: number;\n /** Maximum node sphere radius (default: 15) */\n nodeMaxSize?: number;\n /** Edge line opacity 0..1 (default: 0.15) */\n edgeOpacity?: number;\n /** Bloom glow strength (default: 0.6) */\n bloomStrength?: number;\n /** Bloom glow radius (default: 0.1) */\n bloomRadius?: number;\n /** Bloom brightness threshold (default: 0.1) */\n bloomThreshold?: number;\n /** Show background star field (default: true) */\n starField?: boolean;\n /** Exponential fog density (default: 0.0006, 0 = disabled) */\n fogDensity?: number;\n /** Auto-orbit camera rotation (default: false) */\n autoOrbit?: boolean;\n /** Label text scale multiplier (default: 1.0) */\n labelScale?: number;\n /** Label visibility distance threshold 0..1 (default: 0.8) */\n labelThreshold?: number;\n /** Show labels at all (default: true) */\n showLabels?: boolean;\n /** Maximum visible labels at once (default: 150) */\n maxLabels?: number;\n /** Edge line width multiplier (default: 1.0). Note: WebGL limits linewidth to 1 on most platforms. */\n edgeWidthScale?: number;\n /**\n * Fly camera thrust speed multiplier (default: 1.0).\n * 0.5 = half speed, 2.0 = double speed.\n */\n flySpeed?: number;\n}\n\nexport const DEFAULT_STYLE: Required<StyleConfig> = {\n nodeMinSize: 1,\n nodeMaxSize: 15,\n edgeOpacity: 0.15,\n bloomStrength: 0.6,\n bloomRadius: 0.1,\n bloomThreshold: 0.1,\n starField: true,\n fogDensity: 0.0006,\n autoOrbit: false,\n labelScale: 1.0,\n labelThreshold: 0.8,\n showLabels: true,\n maxLabels: 150,\n edgeWidthScale: 1.0,\n flySpeed: 1.0,\n};\n","/**\n * Layout engine configuration.\n */\n\nexport interface LayoutConfig {\n /** Layout algorithm (currently only \"force-3d\") */\n type?: \"force-3d\";\n /** Many-body charge strength — \"auto\" adapts to graph size, or provide a number (default: \"auto\") */\n charge?: \"auto\" | number;\n /** Link distance — \"auto\" adapts to graph size, or provide a number (default: \"auto\") */\n linkDistance?: \"auto\" | number;\n /** Alpha decay rate — \"auto\" adapts to graph size (default: \"auto\") */\n alphaDecay?: \"auto\" | number;\n /** Velocity damping 0..1 (default: 0.4) */\n velocityDecay?: number;\n /** Convergence threshold — simulation stops when alpha drops below this (default: 0.005) */\n settledThreshold?: number;\n /**\n * Spread multiplier — scales charge strength and link distance to control\n * how far apart nodes spread. 1.0 = default, 2.0 = twice as spread out.\n * Automatically scaled by node count when set to \"auto\".\n * (default: \"auto\")\n */\n spreadFactor?: \"auto\" | number;\n /**\n * Layout dimensionality (default: 3).\n * 2 = flat Obsidian-style plane: the simulation runs in 2D (z is locked\n * to 0), the camera is locked to pan/zoom (no rotation), and dragging\n * stays on the plane.\n */\n dimensions?: 2 | 3;\n /**\n * Pull nodes that share the same key toward a common centroid so\n * categories form visible clusters (\"type\" reads node.type, \"group\"\n * reads node.group). null/undefined = off (default).\n */\n clusterBy?: \"type\" | \"group\" | null;\n /** Cluster attraction strength 0..1 (default: 0.05). */\n clusterStrength?: number;\n}\n\nexport const DEFAULT_LAYOUT: Required<LayoutConfig> = {\n type: \"force-3d\",\n charge: \"auto\",\n linkDistance: \"auto\",\n alphaDecay: \"auto\",\n velocityDecay: 0.4,\n settledThreshold: 0.005,\n spreadFactor: \"auto\",\n dimensions: 3,\n clusterBy: null,\n clusterStrength: 0.05,\n};\n","/**\n * Color utility functions for theme resolution.\n */\n\n/** Parse hex color to RGB components (0-1 range) */\nexport function hexToRgb(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\");\n const n = parseInt(c, 16);\n return [(n >> 16) / 255, ((n >> 8) & 0xff) / 255, (n & 0xff) / 255];\n}\n\n/** Convert RGB components (0-1 range) to hex string */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.round(Math.max(0, Math.min(1, v)) * 255);\n const hex = (clamp(r) << 16) | (clamp(g) << 8) | clamp(b);\n return \"#\" + hex.toString(16).padStart(6, \"0\");\n}\n\n/** Relative luminance 0..1 of a hex color (for light/dark detection) */\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/** Darken a hex color by a factor (0.7 = 30% darker) */\nexport function darken(hex: string, factor: number): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r * factor, g * factor, b * factor);\n}\n\n/** Brighten a hex color by a factor (1.0 = no change, 1.5 = 50% brighter) */\nexport function brighten(hex: string, factor: number): string {\n const [r, g, b] = hexToRgb(hex);\n // Lerp toward white\n const t = 1 - 1 / factor;\n return rgbToHex(r + (1 - r) * t, g + (1 - g) * t, b + (1 - b) * t);\n}\n\n/** Dim a hex color by a scalar multiplier */\nexport function dim(hex: string, factor: number): string {\n const [r, g, b] = hexToRgb(hex);\n return rgbToHex(r * factor, g * factor, b * factor);\n}\n\n/**\n * Default palette for auto-assigning colors to unmapped types.\n * Visually distinct, optimized for dark backgrounds.\n */\nexport const DEFAULT_PALETTE: string[] = [\n \"#58a6ff\", // blue\n \"#3fb950\", // green\n \"#d29922\", // orange\n \"#da70d6\", // orchid\n \"#f97583\", // pink-red\n \"#56d4dd\", // cyan\n \"#d2a8ff\", // lavender\n \"#ffa657\", // amber\n \"#7ee89a\", // mint\n \"#ff7b72\", // coral\n \"#79c0ff\", // sky\n \"#e3b341\", // gold\n];\n","/**\n * \"Celestial\" theme — the original GitHub AI Network visual style.\n * Dark space background with glowing nodes and bloom effects.\n */\n\nimport type { ThemeConfig } from \"../types\";\n\nexport const celestial: ThemeConfig = {\n nodeColors: {\n author: \"#58a6ff\",\n repo: \"#3fb950\",\n topic: \"#d29922\",\n },\n nodeColorsBright: {\n author: \"#9dcfff\",\n repo: \"#7ee89a\",\n topic: \"#f0c45a\",\n },\n linkColors: {\n owns: \"#58a6ff\",\n contributes: \"#8b949e\",\n has_topic: \"#d29922\",\n coworker: \"#da70d6\",\n forked_from: \"#8888cc\",\n },\n defaultNodeColor: \"#8b949e\",\n defaultLinkColor: \"#8b949e\",\n backgroundColor: \"#030810\",\n};\n","/**\n * \"Neon\" theme — vibrant neon colors on pure black.\n */\n\nimport type { ThemeConfig } from \"../types\";\n\nexport const neon: ThemeConfig = {\n nodeColors: {\n primary: \"#00ff87\",\n secondary: \"#f72585\",\n tertiary: \"#7209b7\",\n },\n linkColors: {\n default: \"#4cc9f0\",\n strong: \"#f72585\",\n weak: \"#3a0ca3\",\n },\n defaultNodeColor: \"#4cc9f0\",\n defaultLinkColor: \"#4361ee\",\n backgroundColor: \"#000000\",\n};\n","/**\n * \"Minimal\" theme — muted, professional look.\n */\n\nimport type { ThemeConfig } from \"../types\";\n\nexport const minimal: ThemeConfig = {\n nodeColors: {\n primary: \"#6c7a89\",\n secondary: \"#2ecc71\",\n tertiary: \"#e67e22\",\n },\n linkColors: {\n default: \"#555555\",\n },\n defaultNodeColor: \"#6c7a89\",\n defaultLinkColor: \"#444444\",\n backgroundColor: \"#1a1a2e\",\n};\n","/**\n * \"Paper\" theme — light background for embedding in light-mode UIs.\n * Saturated node colors that hold up on white; normal (non-additive)\n * edge blending so lines stay visible. Pair with\n * `style={{ starField: false, bloomStrength: 0, fogDensity: 0 }}`.\n */\n\nimport type { ThemeConfig } from \"../types\";\n\nexport const paper: ThemeConfig = {\n nodeColors: {},\n // Bright (label / highlight) colors are auto-derived: on a light\n // background resolveTheme darkens instead of whitening.\n nodeColorsBright: {},\n linkColors: {},\n defaultNodeColor: \"#64748b\",\n defaultLinkColor: \"#b3bdcc\",\n backgroundColor: \"#f6f7f9\",\n blending: \"normal\",\n palette: [\n \"#2563eb\", // blue\n \"#d97706\", // amber\n \"#7c3aed\", // violet\n \"#db2777\", // pink\n \"#0891b2\", // cyan\n \"#16a34a\", // green\n \"#dc2626\", // red\n \"#475569\", // slate\n ],\n};\n","/**\n * Theme resolution — resolves user theme config into concrete color lookups.\n * Handles auto-assignment from palette for unmapped types.\n */\n\nimport type { ThemeConfig } from \"../types\";\nimport { brighten, darken, luminance, DEFAULT_PALETTE } from \"../utils/color\";\nimport { celestial } from \"./celestial\";\nimport { neon } from \"./neon\";\nimport { minimal } from \"./minimal\";\nimport { paper } from \"./paper\";\n\nexport interface ResolvedTheme {\n nodeColor(type?: string): string;\n nodeColorBright(type?: string): string;\n linkColor(type?: string): string;\n backgroundColor: string;\n /** True when the background is light — flips highlight/dim direction */\n isLight: boolean;\n /** Whether edges should use additive blending (dark backgrounds only) */\n additiveEdges: boolean;\n}\n\nconst PRESETS: Record<string, ThemeConfig> = {\n celestial,\n neon,\n minimal,\n paper,\n};\n\nconst DEFAULT_THEME = {\n nodeColors: celestial.nodeColors ?? {},\n nodeColorsBright: celestial.nodeColorsBright ?? {},\n linkColors: celestial.linkColors ?? {},\n defaultNodeColor: celestial.defaultNodeColor ?? \"#8b949e\",\n defaultLinkColor: celestial.defaultLinkColor ?? \"#8b949e\",\n backgroundColor: celestial.backgroundColor ?? \"#030810\",\n palette: DEFAULT_PALETTE,\n};\n\nexport function resolveTheme(\n theme?: ThemeConfig | string\n): ResolvedTheme {\n let config: ThemeConfig;\n if (typeof theme === \"string\") {\n config = PRESETS[theme] ?? celestial;\n } else {\n config = theme ?? {};\n }\n\n const nodeColors = { ...DEFAULT_THEME.nodeColors, ...config.nodeColors };\n const nodeColorsBright = {\n ...DEFAULT_THEME.nodeColorsBright,\n ...config.nodeColorsBright,\n };\n const linkColors = { ...DEFAULT_THEME.linkColors, ...config.linkColors };\n const defaultNodeColor =\n config.defaultNodeColor ?? DEFAULT_THEME.defaultNodeColor;\n const defaultLinkColor =\n config.defaultLinkColor ?? DEFAULT_THEME.defaultLinkColor;\n const backgroundColor =\n config.backgroundColor ?? DEFAULT_THEME.backgroundColor;\n const palette = config.palette ?? DEFAULT_THEME.palette;\n const isLight = luminance(backgroundColor) > 0.5;\n const additiveEdges = config.blending\n ? config.blending === \"additive\"\n : !isLight;\n\n // Track auto-assigned colors for unmapped types\n const autoAssigned = new Map<string, number>();\n let nextPaletteIdx = 0;\n\n function nodeColor(type?: string): string {\n if (!type) return defaultNodeColor;\n if (nodeColors[type]) return nodeColors[type];\n if (!autoAssigned.has(type)) {\n autoAssigned.set(type, nextPaletteIdx);\n nextPaletteIdx = (nextPaletteIdx + 1) % palette.length;\n }\n return palette[autoAssigned.get(type)!];\n }\n\n // On light backgrounds \"bright\" must darken/saturate — whitened\n // colors wash out against white (labels, hop-1 highlight, ring).\n const emphasize = (c: string) => (isLight ? darken(c, 0.72) : brighten(c, 1.5));\n\n function nodeColorBright(type?: string): string {\n if (!type) return emphasize(defaultNodeColor);\n if (nodeColorsBright[type]) return nodeColorsBright[type];\n return emphasize(nodeColor(type));\n }\n\n function linkColor(type?: string): string {\n if (!type) return defaultLinkColor;\n return linkColors[type] ?? defaultLinkColor;\n }\n\n return {\n nodeColor,\n nodeColorBright,\n linkColor,\n backgroundColor,\n isLight,\n additiveEdges,\n };\n}\n","/**\n * Adaptive layout parameters based on graph size.\n * Larger graphs need weaker forces and less frequent updates.\n */\n\nimport type { LayoutConfig } from \"../types\";\n\nexport interface ResolvedLayoutParams {\n dimensions: 2 | 3;\n clusterStrength: number;\n charge: number;\n distanceMax: number;\n theta: number;\n linkDistance: number;\n alphaDecay: number;\n velocityDecay: number;\n settledThreshold: number;\n postEvery: number;\n initialRadius: number;\n}\n\n/**\n * Compute an automatic spread factor based on node count.\n * More nodes → more spread to prevent overcrowding.\n * < 500: 1.0 (default)\n * 500-2k: 1.0–1.3\n * 2k-10k: 1.3–1.8\n * 10k+: 1.8–2.5\n */\nfunction autoSpreadFactor(n: number): number {\n if (n <= 500) return 1.0;\n if (n <= 2000) return 1.0 + (n - 500) / 1500 * 0.3;\n if (n <= 10000) return 1.3 + (n - 2000) / 8000 * 0.5;\n return Math.min(2.5, 1.8 + (n - 10000) / 40000 * 0.7);\n}\n\nexport function resolveLayoutParams(\n nodeCount: number,\n config?: LayoutConfig\n): ResolvedLayoutParams {\n const n = nodeCount;\n\n // Resolve spread factor\n const spread =\n config?.spreadFactor !== \"auto\" && config?.spreadFactor != null\n ? config.spreadFactor\n : autoSpreadFactor(n);\n\n const baseCharge =\n config?.charge !== \"auto\" && config?.charge != null\n ? config.charge\n : n > 50000\n ? -80\n : n > 10000\n ? -120\n : -200;\n\n // Apply spread: stronger repulsion = more spread\n const charge = baseCharge * spread;\n\n const distanceMax = (n > 50000 ? 1500 : n > 10000 ? 2000 : 3000) * spread;\n const theta = n > 20000 ? 1.5 : n > 5000 ? 1.2 : 0.9;\n\n const baseLinkDistance =\n config?.linkDistance !== \"auto\" && config?.linkDistance != null\n ? config.linkDistance\n : n > 50000\n ? 120\n : n > 10000\n ? 180\n : 250;\n\n // Apply spread: longer links = more spread\n const linkDistance = baseLinkDistance * spread;\n\n const alphaDecay =\n config?.alphaDecay !== \"auto\" && config?.alphaDecay != null\n ? config.alphaDecay\n : n > 50000\n ? 0.04\n : n > 10000\n ? 0.03\n : 0.02;\n\n const velocityDecay = config?.velocityDecay ?? 0.4;\n const settledThreshold = config?.settledThreshold ?? 0.005;\n const postEvery = n > 50000 ? 5 : n > 10000 ? 3 : 2;\n const initialRadius = (500 + Math.min(n, 10000) * 0.1) * spread;\n\n return {\n dimensions: config?.dimensions === 2 ? 2 : 3,\n clusterStrength: config?.clusterStrength ?? 0.05,\n charge,\n distanceMax,\n theta,\n linkDistance,\n alphaDecay,\n velocityDecay,\n settledThreshold,\n postEvery,\n initialRadius,\n };\n}\n","// AUTO-GENERATED — do not edit. Run: node scripts/build-worker.js\nconst WORKER_SOURCE = \"(function(){\\\"use strict\\\";function At(t,n,i){var e,r=1;t==null&&(t=0),n==null&&(n=0),i==null&&(i=0);function s(){var o,u=e.length,h,f=0,l=0,c=0;for(o=0;o<u;++o)h=e[o],f+=h.x||0,l+=h.y||0,c+=h.z||0;for(f=(f/u-t)*r,l=(l/u-n)*r,c=(c/u-i)*r,o=0;o<u;++o)h=e[o],f&&(h.x-=f),l&&(h.y-=l),c&&(h.z-=c)}return s.initialize=function(o){e=o},s.x=function(o){return arguments.length?(t=+o,s):t},s.y=function(o){return arguments.length?(n=+o,s):n},s.z=function(o){return arguments.length?(i=+o,s):i},s.strength=function(o){return arguments.length?(r=+o,s):r},s}function $t(t){const n=+this._x.call(null,t);return et(this.cover(n),n,t)}function et(t,n,i){if(isNaN(n))return t;var e,r=t._root,s={data:i},o=t._x0,u=t._x1,h,f,l,c,v;if(!r)return t._root=s,t;for(;r.length;)if((l=n>=(h=(o+u)/2))?o=h:u=h,e=r,!(r=r[c=+l]))return e[c]=s,t;if(f=+t._x.call(null,r.data),n===f)return s.next=r,e?e[c]=s:t._root=s,t;do e=e?e[c]=new Array(2):t._root=new Array(2),(l=n>=(h=(o+u)/2))?o=h:u=h;while((c=+l)==(v=+(f>=h)));return e[v]=r,e[c]=s,t}function mt(t){Array.isArray(t)||(t=Array.from(t));const n=t.length,i=new Float64Array(n);let e=1/0,r=-1/0;for(let s=0,o;s<n;++s)isNaN(o=+this._x.call(null,t[s]))||(i[s]=o,o<e&&(e=o),o>r&&(r=o));if(e>r)return this;this.cover(e).cover(r);for(let s=0;s<n;++s)et(this,i[s],t[s]);return this}function qt(t){if(isNaN(t=+t))return this;var n=this._x0,i=this._x1;if(isNaN(n))i=(n=Math.floor(t))+1;else{for(var e=i-n||1,r=this._root,s,o;n>t||t>=i;)switch(o=+(t<n),s=new Array(2),s[o]=r,r=s,e*=2,o){case 0:i=n+e;break;case 1:n=i-e;break}this._root&&this._root.length&&(this._root=r)}return this._x0=n,this._x1=i,this}function It(){var t=[];return this.visit(function(n){if(!n.length)do t.push(n.data);while(n=n.next)}),t}function bt(t){return arguments.length?this.cover(+t[0][0]).cover(+t[1][0]):isNaN(this._x0)?void 0:[[this._x0],[this._x1]]}function P(t,n,i){this.node=t,this.x0=n,this.x1=i}function kt(t,n){var i,e=this._x0,r,s,o=this._x1,u=[],h=this._root,f,l;for(h&&u.push(new P(h,e,o)),n==null?n=1/0:(e=t-n,o=t+n);f=u.pop();)if(!(!(h=f.node)||(r=f.x0)>o||(s=f.x1)<e))if(h.length){var c=(r+s)/2;u.push(new P(h[1],c,s),new P(h[0],r,c)),(l=+(t>=c))&&(f=u[u.length-1],u[u.length-1]=u[u.length-1-l],u[u.length-1-l]=f)}else{var v=Math.abs(t-+this._x.call(null,h.data));v<n&&(n=v,e=t-v,o=t+v,i=h.data)}return i}function Dt(t){if(isNaN(h=+this._x.call(null,t)))return this;var n,i=this._root,e,r,s,o=this._x0,u=this._x1,h,f,l,c,v;if(!i)return this;if(i.length)for(;;){if((l=h>=(f=(o+u)/2))?o=f:u=f,n=i,!(i=i[c=+l]))return this;if(!i.length)break;n[c+1&1]&&(e=n,v=c)}for(;i.data!==t;)if(r=i,!(i=i.next))return this;return(s=i.next)&&delete i.next,r?(s?r.next=s:delete r.next,this):n?(s?n[c]=s:delete n[c],(i=n[0]||n[1])&&i===(n[1]||n[0])&&!i.length&&(e?e[v]=i:this._root=i),this):(this._root=s,this)}function Et(t){for(var n=0,i=t.length;n<i;++n)this.remove(t[n]);return this}function Tt(){return this._root}function jt(){var t=0;return this.visit(function(n){if(!n.length)do++t;while(n=n.next)}),t}function Pt(t){var n=[],i,e=this._root,r,s,o;for(e&&n.push(new P(e,this._x0,this._x1));i=n.pop();)if(!t(e=i.node,s=i.x0,o=i.x1)&&e.length){var u=(s+o)/2;(r=e[1])&&n.push(new P(r,u,o)),(r=e[0])&&n.push(new P(r,s,u))}return this}function Ft(t){var n=[],i=[],e;for(this._root&&n.push(new P(this._root,this._x0,this._x1));e=n.pop();){var r=e.node;if(r.length){var s,o=e.x0,u=e.x1,h=(o+u)/2;(s=r[0])&&n.push(new P(s,o,h)),(s=r[1])&&n.push(new P(s,h,u))}i.push(e)}for(;e=i.pop();)t(e.node,e.x0,e.x1);return this}function St(t){return t[0]}function Ot(t){return arguments.length?(this._x=t,this):this._x}function rt(t,n){var i=new G(n??St,NaN,NaN);return t==null?i:i.addAll(t)}function G(t,n,i){this._x=t,this._x0=n,this._x1=i,this._root=void 0}function st(t){for(var n={data:t.data},i=n;t=t.next;)i=i.next={data:t.data};return n}var k=rt.prototype=G.prototype;k.copy=function(){var t=new G(this._x,this._x0,this._x1),n=this._root,i,e;if(!n)return t;if(!n.length)return t._root=st(n),t;for(i=[{source:n,target:t._root=new Array(2)}];n=i.pop();)for(var r=0;r<2;++r)(e=n.source[r])&&(e.length?i.push({source:e,target:n.target[r]=new Array(2)}):n.target[r]=st(e));return t},k.add=$t,k.addAll=mt,k.cover=qt,k.data=It,k.extent=bt,k.find=kt,k.remove=Dt,k.removeAll=Et,k.root=Tt,k.size=jt,k.visit=Pt,k.visitAfter=Ft,k.x=Ot;function Rt(t){const n=+this._x.call(null,t),i=+this._y.call(null,t);return ot(this.cover(n,i),n,i,t)}function ot(t,n,i,e){if(isNaN(n)||isNaN(i))return t;var r,s=t._root,o={data:e},u=t._x0,h=t._y0,f=t._x1,l=t._y1,c,v,y,_,g,x,a,N;if(!s)return t._root=o,t;for(;s.length;)if((g=n>=(c=(u+f)/2))?u=c:f=c,(x=i>=(v=(h+l)/2))?h=v:l=v,r=s,!(s=s[a=x<<1|g]))return r[a]=o,t;if(y=+t._x.call(null,s.data),_=+t._y.call(null,s.data),n===y&&i===_)return o.next=s,r?r[a]=o:t._root=o,t;do r=r?r[a]=new Array(4):t._root=new Array(4),(g=n>=(c=(u+f)/2))?u=c:f=c,(x=i>=(v=(h+l)/2))?h=v:l=v;while((a=x<<1|g)===(N=(_>=v)<<1|y>=c));return r[N]=s,r[a]=o,t}function Xt(t){var n,i,e=t.length,r,s,o=new Array(e),u=new Array(e),h=1/0,f=1/0,l=-1/0,c=-1/0;for(i=0;i<e;++i)isNaN(r=+this._x.call(null,n=t[i]))||isNaN(s=+this._y.call(null,n))||(o[i]=r,u[i]=s,r<h&&(h=r),r>l&&(l=r),s<f&&(f=s),s>c&&(c=s));if(h>l||f>c)return this;for(this.cover(h,f).cover(l,c),i=0;i<e;++i)ot(this,o[i],u[i],t[i]);return this}function Bt(t,n){if(isNaN(t=+t)||isNaN(n=+n))return this;var i=this._x0,e=this._y0,r=this._x1,s=this._y1;if(isNaN(i))r=(i=Math.floor(t))+1,s=(e=Math.floor(n))+1;else{for(var o=r-i||1,u=this._root,h,f;i>t||t>=r||e>n||n>=s;)switch(f=(n<e)<<1|t<i,h=new Array(4),h[f]=u,u=h,o*=2,f){case 0:r=i+o,s=e+o;break;case 1:i=r-o,s=e+o;break;case 2:r=i+o,e=s-o;break;case 3:i=r-o,e=s-o;break}this._root&&this._root.length&&(this._root=u)}return this._x0=i,this._y0=e,this._x1=r,this._y1=s,this}function Ct(){var t=[];return this.visit(function(n){if(!n.length)do t.push(n.data);while(n=n.next)}),t}function Lt(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]}function I(t,n,i,e,r){this.node=t,this.x0=n,this.y0=i,this.x1=e,this.y1=r}function Yt(t,n,i){var e,r=this._x0,s=this._y0,o,u,h,f,l=this._x1,c=this._y1,v=[],y=this._root,_,g;for(y&&v.push(new I(y,r,s,l,c)),i==null?i=1/0:(r=t-i,s=n-i,l=t+i,c=n+i,i*=i);_=v.pop();)if(!(!(y=_.node)||(o=_.x0)>l||(u=_.y0)>c||(h=_.x1)<r||(f=_.y1)<s))if(y.length){var x=(o+h)/2,a=(u+f)/2;v.push(new I(y[3],x,a,h,f),new I(y[2],o,a,x,f),new I(y[1],x,u,h,a),new I(y[0],o,u,x,a)),(g=(n>=a)<<1|t>=x)&&(_=v[v.length-1],v[v.length-1]=v[v.length-1-g],v[v.length-1-g]=_)}else{var N=t-+this._x.call(null,y.data),d=n-+this._y.call(null,y.data),w=N*N+d*d;if(w<i){var p=Math.sqrt(i=w);r=t-p,s=n-p,l=t+p,c=n+p,e=y.data}}return e}function Ht(t){if(isNaN(l=+this._x.call(null,t))||isNaN(c=+this._y.call(null,t)))return this;var n,i=this._root,e,r,s,o=this._x0,u=this._y0,h=this._x1,f=this._y1,l,c,v,y,_,g,x,a;if(!i)return this;if(i.length)for(;;){if((_=l>=(v=(o+h)/2))?o=v:h=v,(g=c>=(y=(u+f)/2))?u=y:f=y,n=i,!(i=i[x=g<<1|_]))return this;if(!i.length)break;(n[x+1&3]||n[x+2&3]||n[x+3&3])&&(e=n,a=x)}for(;i.data!==t;)if(r=i,!(i=i.next))return this;return(s=i.next)&&delete i.next,r?(s?r.next=s:delete r.next,this):n?(s?n[x]=s:delete n[x],(i=n[0]||n[1]||n[2]||n[3])&&i===(n[3]||n[2]||n[1]||n[0])&&!i.length&&(e?e[a]=i:this._root=i),this):(this._root=s,this)}function Qt(t){for(var n=0,i=t.length;n<i;++n)this.remove(t[n]);return this}function Wt(){return this._root}function Zt(){var t=0;return this.visit(function(n){if(!n.length)do++t;while(n=n.next)}),t}function Gt(t){var n=[],i,e=this._root,r,s,o,u,h;for(e&&n.push(new I(e,this._x0,this._y0,this._x1,this._y1));i=n.pop();)if(!t(e=i.node,s=i.x0,o=i.y0,u=i.x1,h=i.y1)&&e.length){var f=(s+u)/2,l=(o+h)/2;(r=e[3])&&n.push(new I(r,f,l,u,h)),(r=e[2])&&n.push(new I(r,s,l,f,h)),(r=e[1])&&n.push(new I(r,f,o,u,l)),(r=e[0])&&n.push(new I(r,s,o,f,l))}return this}function Jt(t){var n=[],i=[],e;for(this._root&&n.push(new I(this._root,this._x0,this._y0,this._x1,this._y1));e=n.pop();){var r=e.node;if(r.length){var s,o=e.x0,u=e.y0,h=e.x1,f=e.y1,l=(o+h)/2,c=(u+f)/2;(s=r[0])&&n.push(new I(s,o,u,l,c)),(s=r[1])&&n.push(new I(s,l,u,h,c)),(s=r[2])&&n.push(new I(s,o,c,l,f)),(s=r[3])&&n.push(new I(s,l,c,h,f))}i.push(e)}for(;e=i.pop();)t(e.node,e.x0,e.y0,e.x1,e.y1);return this}function Kt(t){return t[0]}function Ut(t){return arguments.length?(this._x=t,this):this._x}function Vt(t){return t[1]}function tn(t){return arguments.length?(this._y=t,this):this._y}function ht(t,n,i){var e=new J(n??Kt,i??Vt,NaN,NaN,NaN,NaN);return t==null?e:e.addAll(t)}function J(t,n,i,e,r,s){this._x=t,this._y=n,this._x0=i,this._y0=e,this._x1=r,this._y1=s,this._root=void 0}function at(t){for(var n={data:t.data},i=n;t=t.next;)i=i.next={data:t.data};return n}var b=ht.prototype=J.prototype;b.copy=function(){var t=new J(this._x,this._y,this._x0,this._y0,this._x1,this._y1),n=this._root,i,e;if(!n)return t;if(!n.length)return t._root=at(n),t;for(i=[{source:n,target:t._root=new Array(4)}];n=i.pop();)for(var r=0;r<4;++r)(e=n.source[r])&&(e.length?i.push({source:e,target:n.target[r]=new Array(4)}):n.target[r]=at(e));return t},b.add=Rt,b.addAll=Xt,b.cover=Bt,b.data=Ct,b.extent=Lt,b.find=Yt,b.remove=Ht,b.removeAll=Qt,b.root=Wt,b.size=Zt,b.visit=Gt,b.visitAfter=Jt,b.x=Ut,b.y=tn;function nn(t){const n=+this._x.call(null,t),i=+this._y.call(null,t),e=+this._z.call(null,t);return ft(this.cover(n,i,e),n,i,e,t)}function ft(t,n,i,e,r){if(isNaN(n)||isNaN(i)||isNaN(e))return t;var s,o=t._root,u={data:r},h=t._x0,f=t._y0,l=t._z0,c=t._x1,v=t._y1,y=t._z1,_,g,x,a,N,d,w,p,M,z,A;if(!o)return t._root=u,t;for(;o.length;)if((w=n>=(_=(h+c)/2))?h=_:c=_,(p=i>=(g=(f+v)/2))?f=g:v=g,(M=e>=(x=(l+y)/2))?l=x:y=x,s=o,!(o=o[z=M<<2|p<<1|w]))return s[z]=u,t;if(a=+t._x.call(null,o.data),N=+t._y.call(null,o.data),d=+t._z.call(null,o.data),n===a&&i===N&&e===d)return u.next=o,s?s[z]=u:t._root=u,t;do s=s?s[z]=new Array(8):t._root=new Array(8),(w=n>=(_=(h+c)/2))?h=_:c=_,(p=i>=(g=(f+v)/2))?f=g:v=g,(M=e>=(x=(l+y)/2))?l=x:y=x;while((z=M<<2|p<<1|w)===(A=(d>=x)<<2|(N>=g)<<1|a>=_));return s[A]=o,s[z]=u,t}function en(t){Array.isArray(t)||(t=Array.from(t));const n=t.length,i=new Float64Array(n),e=new Float64Array(n),r=new Float64Array(n);let s=1/0,o=1/0,u=1/0,h=-1/0,f=-1/0,l=-1/0;for(let c=0,v,y,_,g;c<n;++c)isNaN(y=+this._x.call(null,v=t[c]))||isNaN(_=+this._y.call(null,v))||isNaN(g=+this._z.call(null,v))||(i[c]=y,e[c]=_,r[c]=g,y<s&&(s=y),y>h&&(h=y),_<o&&(o=_),_>f&&(f=_),g<u&&(u=g),g>l&&(l=g));if(s>h||o>f||u>l)return this;this.cover(s,o,u).cover(h,f,l);for(let c=0;c<n;++c)ft(this,i[c],e[c],r[c],t[c]);return this}function rn(t,n,i){if(isNaN(t=+t)||isNaN(n=+n)||isNaN(i=+i))return this;var e=this._x0,r=this._y0,s=this._z0,o=this._x1,u=this._y1,h=this._z1;if(isNaN(e))o=(e=Math.floor(t))+1,u=(r=Math.floor(n))+1,h=(s=Math.floor(i))+1;else{for(var f=o-e||1,l=this._root,c,v;e>t||t>=o||r>n||n>=u||s>i||i>=h;)switch(v=(i<s)<<2|(n<r)<<1|t<e,c=new Array(8),c[v]=l,l=c,f*=2,v){case 0:o=e+f,u=r+f,h=s+f;break;case 1:e=o-f,u=r+f,h=s+f;break;case 2:o=e+f,r=u-f,h=s+f;break;case 3:e=o-f,r=u-f,h=s+f;break;case 4:o=e+f,u=r+f,s=h-f;break;case 5:e=o-f,u=r+f,s=h-f;break;case 6:o=e+f,r=u-f,s=h-f;break;case 7:e=o-f,r=u-f,s=h-f;break}this._root&&this._root.length&&(this._root=l)}return this._x0=e,this._y0=r,this._z0=s,this._x1=o,this._y1=u,this._z1=h,this}function sn(){var t=[];return this.visit(function(n){if(!n.length)do t.push(n.data);while(n=n.next)}),t}function on(t){return arguments.length?this.cover(+t[0][0],+t[0][1],+t[0][2]).cover(+t[1][0],+t[1][1],+t[1][2]):isNaN(this._x0)?void 0:[[this._x0,this._y0,this._z0],[this._x1,this._y1,this._z1]]}function $(t,n,i,e,r,s,o){this.node=t,this.x0=n,this.y0=i,this.z0=e,this.x1=r,this.y1=s,this.z1=o}function hn(t,n,i,e){var r,s=this._x0,o=this._y0,u=this._z0,h,f,l,c,v,y,_=this._x1,g=this._y1,x=this._z1,a=[],N=this._root,d,w;for(N&&a.push(new $(N,s,o,u,_,g,x)),e==null?e=1/0:(s=t-e,o=n-e,u=i-e,_=t+e,g=n+e,x=i+e,e*=e);d=a.pop();)if(!(!(N=d.node)||(h=d.x0)>_||(f=d.y0)>g||(l=d.z0)>x||(c=d.x1)<s||(v=d.y1)<o||(y=d.z1)<u))if(N.length){var p=(h+c)/2,M=(f+v)/2,z=(l+y)/2;a.push(new $(N[7],p,M,z,c,v,y),new $(N[6],h,M,z,p,v,y),new $(N[5],p,f,z,c,M,y),new $(N[4],h,f,z,p,M,y),new $(N[3],p,M,l,c,v,z),new $(N[2],h,M,l,p,v,z),new $(N[1],p,f,l,c,M,z),new $(N[0],h,f,l,p,M,z)),(w=(i>=z)<<2|(n>=M)<<1|t>=p)&&(d=a[a.length-1],a[a.length-1]=a[a.length-1-w],a[a.length-1-w]=d)}else{var A=t-+this._x.call(null,N.data),E=n-+this._y.call(null,N.data),T=i-+this._z.call(null,N.data),D=A*A+E*E+T*T;if(D<e){var m=Math.sqrt(e=D);s=t-m,o=n-m,u=i-m,_=t+m,g=n+m,x=i+m,r=N.data}}return r}const an=(t,n,i,e,r,s)=>Math.sqrt((t-e)**2+(n-r)**2+(i-s)**2);function fn(t,n,i,e){const r=[],s=t-e,o=n-e,u=i-e,h=t+e,f=n+e,l=i+e;return this.visit((c,v,y,_,g,x,a)=>{if(!c.length)do{const N=c.data;an(t,n,i,this._x(N),this._y(N),this._z(N))<=e&&r.push(N)}while(c=c.next);return v>h||y>f||_>l||g<s||x<o||a<u}),r}function un(t){if(isNaN(v=+this._x.call(null,t))||isNaN(y=+this._y.call(null,t))||isNaN(_=+this._z.call(null,t)))return this;var n,i=this._root,e,r,s,o=this._x0,u=this._y0,h=this._z0,f=this._x1,l=this._y1,c=this._z1,v,y,_,g,x,a,N,d,w,p,M;if(!i)return this;if(i.length)for(;;){if((N=v>=(g=(o+f)/2))?o=g:f=g,(d=y>=(x=(u+l)/2))?u=x:l=x,(w=_>=(a=(h+c)/2))?h=a:c=a,n=i,!(i=i[p=w<<2|d<<1|N]))return this;if(!i.length)break;(n[p+1&7]||n[p+2&7]||n[p+3&7]||n[p+4&7]||n[p+5&7]||n[p+6&7]||n[p+7&7])&&(e=n,M=p)}for(;i.data!==t;)if(r=i,!(i=i.next))return this;return(s=i.next)&&delete i.next,r?(s?r.next=s:delete r.next,this):n?(s?n[p]=s:delete n[p],(i=n[0]||n[1]||n[2]||n[3]||n[4]||n[5]||n[6]||n[7])&&i===(n[7]||n[6]||n[5]||n[4]||n[3]||n[2]||n[1]||n[0])&&!i.length&&(e?e[M]=i:this._root=i),this):(this._root=s,this)}function ln(t){for(var n=0,i=t.length;n<i;++n)this.remove(t[n]);return this}function cn(){return this._root}function _n(){var t=0;return this.visit(function(n){if(!n.length)do++t;while(n=n.next)}),t}function vn(t){var n=[],i,e=this._root,r,s,o,u,h,f,l;for(e&&n.push(new $(e,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1));i=n.pop();)if(!t(e=i.node,s=i.x0,o=i.y0,u=i.z0,h=i.x1,f=i.y1,l=i.z1)&&e.length){var c=(s+h)/2,v=(o+f)/2,y=(u+l)/2;(r=e[7])&&n.push(new $(r,c,v,y,h,f,l)),(r=e[6])&&n.push(new $(r,s,v,y,c,f,l)),(r=e[5])&&n.push(new $(r,c,o,y,h,v,l)),(r=e[4])&&n.push(new $(r,s,o,y,c,v,l)),(r=e[3])&&n.push(new $(r,c,v,u,h,f,y)),(r=e[2])&&n.push(new $(r,s,v,u,c,f,y)),(r=e[1])&&n.push(new $(r,c,o,u,h,v,y)),(r=e[0])&&n.push(new $(r,s,o,u,c,v,y))}return this}function xn(t){var n=[],i=[],e;for(this._root&&n.push(new $(this._root,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1));e=n.pop();){var r=e.node;if(r.length){var s,o=e.x0,u=e.y0,h=e.z0,f=e.x1,l=e.y1,c=e.z1,v=(o+f)/2,y=(u+l)/2,_=(h+c)/2;(s=r[0])&&n.push(new $(s,o,u,h,v,y,_)),(s=r[1])&&n.push(new $(s,v,u,h,f,y,_)),(s=r[2])&&n.push(new $(s,o,y,h,v,l,_)),(s=r[3])&&n.push(new $(s,v,y,h,f,l,_)),(s=r[4])&&n.push(new $(s,o,u,_,v,y,c)),(s=r[5])&&n.push(new $(s,v,u,_,f,y,c)),(s=r[6])&&n.push(new $(s,o,y,_,v,l,c)),(s=r[7])&&n.push(new $(s,v,y,_,f,l,c))}i.push(e)}for(;e=i.pop();)t(e.node,e.x0,e.y0,e.z0,e.x1,e.y1,e.z1);return this}function yn(t){return t[0]}function pn(t){return arguments.length?(this._x=t,this):this._x}function gn(t){return t[1]}function wn(t){return arguments.length?(this._y=t,this):this._y}function dn(t){return t[2]}function Nn(t){return arguments.length?(this._z=t,this):this._z}function ut(t,n,i,e){var r=new K(n??yn,i??gn,e??dn,NaN,NaN,NaN,NaN,NaN,NaN);return t==null?r:r.addAll(t)}function K(t,n,i,e,r,s,o,u,h){this._x=t,this._y=n,this._z=i,this._x0=e,this._y0=r,this._z0=s,this._x1=o,this._y1=u,this._z1=h,this._root=void 0}function lt(t){for(var n={data:t.data},i=n;t=t.next;)i=i.next={data:t.data};return n}var q=ut.prototype=K.prototype;q.copy=function(){var t=new K(this._x,this._y,this._z,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1),n=this._root,i,e;if(!n)return t;if(!n.length)return t._root=lt(n),t;for(i=[{source:n,target:t._root=new Array(8)}];n=i.pop();)for(var r=0;r<8;++r)(e=n.source[r])&&(e.length?i.push({source:e,target:n.target[r]=new Array(8)}):n.target[r]=lt(e));return t},q.add=nn,q.addAll=en,q.cover=rn,q.data=sn,q.extent=on,q.find=hn,q.findAllWithinRadius=fn,q.remove=un,q.removeAll=ln,q.root=cn,q.size=_n,q.visit=vn,q.visitAfter=xn,q.x=pn,q.y=wn,q.z=Nn;function X(t){return function(){return t}}function F(t){return(t()-.5)*1e-6}function Mn(t){return t.index}function ct(t,n){var i=t.get(n);if(!i)throw new Error(\\\"node not found: \\\"+n);return i}function zn(t){var n=Mn,i=v,e,r=X(30),s,o,u,h,f,l,c=1;t==null&&(t=[]);function v(a){return 1/Math.min(h[a.source.index],h[a.target.index])}function y(a){for(var N=0,d=t.length;N<c;++N)for(var w=0,p,M,z,A=0,E=0,T=0,D,m;w<d;++w)p=t[w],M=p.source,z=p.target,A=z.x+z.vx-M.x-M.vx||F(l),u>1&&(E=z.y+z.vy-M.y-M.vy||F(l)),u>2&&(T=z.z+z.vz-M.z-M.vz||F(l)),D=Math.sqrt(A*A+E*E+T*T),D=(D-s[w])/D*a*e[w],A*=D,E*=D,T*=D,z.vx-=A*(m=f[w]),u>1&&(z.vy-=E*m),u>2&&(z.vz-=T*m),M.vx+=A*(m=1-m),u>1&&(M.vy+=E*m),u>2&&(M.vz+=T*m)}function _(){if(o){var a,N=o.length,d=t.length,w=new Map(o.map((M,z)=>[n(M,z,o),M])),p;for(a=0,h=new Array(N);a<d;++a)p=t[a],p.index=a,typeof p.source!=\\\"object\\\"&&(p.source=ct(w,p.source)),typeof p.target!=\\\"object\\\"&&(p.target=ct(w,p.target)),h[p.source.index]=(h[p.source.index]||0)+1,h[p.target.index]=(h[p.target.index]||0)+1;for(a=0,f=new Array(d);a<d;++a)p=t[a],f[a]=h[p.source.index]/(h[p.source.index]+h[p.target.index]);e=new Array(d),g(),s=new Array(d),x()}}function g(){if(o)for(var a=0,N=t.length;a<N;++a)e[a]=+i(t[a],a,t)}function x(){if(o)for(var a=0,N=t.length;a<N;++a)s[a]=+r(t[a],a,t)}return y.initialize=function(a,...N){o=a,l=N.find(d=>typeof d==\\\"function\\\")||Math.random,u=N.find(d=>[1,2,3].includes(d))||2,_()},y.links=function(a){return arguments.length?(t=a,_(),y):t},y.id=function(a){return arguments.length?(n=a,y):n},y.iterations=function(a){return arguments.length?(c=+a,y):c},y.strength=function(a){return arguments.length?(i=typeof a==\\\"function\\\"?a:X(+a),g(),y):i},y.distance=function(a){return arguments.length?(r=typeof a==\\\"function\\\"?a:X(+a),x(),y):r},y}var An={value:()=>{}};function _t(){for(var t=0,n=arguments.length,i={},e;t<n;++t){if(!(e=arguments[t]+\\\"\\\")||e in i||/[\\\\s.]/.test(e))throw new Error(\\\"illegal type: \\\"+e);i[e]=[]}return new H(i)}function H(t){this._=t}function $n(t,n){return t.trim().split(/^|\\\\s+/).map(function(i){var e=\\\"\\\",r=i.indexOf(\\\".\\\");if(r>=0&&(e=i.slice(r+1),i=i.slice(0,r)),i&&!n.hasOwnProperty(i))throw new Error(\\\"unknown type: \\\"+i);return{type:i,name:e}})}H.prototype=_t.prototype={constructor:H,on:function(t,n){var i=this._,e=$n(t+\\\"\\\",i),r,s=-1,o=e.length;if(arguments.length<2){for(;++s<o;)if((r=(t=e[s]).type)&&(r=mn(i[r],t.name)))return r;return}if(n!=null&&typeof n!=\\\"function\\\")throw new Error(\\\"invalid callback: \\\"+n);for(;++s<o;)if(r=(t=e[s]).type)i[r]=vt(i[r],t.name,n);else if(n==null)for(r in i)i[r]=vt(i[r],t.name,null);return this},copy:function(){var t={},n=this._;for(var i in n)t[i]=n[i].slice();return new H(t)},call:function(t,n){if((r=arguments.length-2)>0)for(var i=new Array(r),e=0,r,s;e<r;++e)i[e]=arguments[e+2];if(!this._.hasOwnProperty(t))throw new Error(\\\"unknown type: \\\"+t);for(s=this._[t],e=0,r=s.length;e<r;++e)s[e].value.apply(n,i)},apply:function(t,n,i){if(!this._.hasOwnProperty(t))throw new Error(\\\"unknown type: \\\"+t);for(var e=this._[t],r=0,s=e.length;r<s;++r)e[r].value.apply(n,i)}};function mn(t,n){for(var i=0,e=t.length,r;i<e;++i)if((r=t[i]).name===n)return r.value}function vt(t,n,i){for(var e=0,r=t.length;e<r;++e)if(t[e].name===n){t[e]=An,t=t.slice(0,e).concat(t.slice(e+1));break}return i!=null&&t.push({name:n,value:i}),t}var R=0,B=0,C=0,xt=1e3,Q,L,W=0,O=0,Z=0,Y=typeof performance==\\\"object\\\"&&performance.now?performance:Date,yt=typeof window==\\\"object\\\"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function pt(){return O||(yt(qn),O=Y.now()+Z)}function qn(){O=0}function U(){this._call=this._time=this._next=null}U.prototype=gt.prototype={constructor:U,restart:function(t,n,i){if(typeof t!=\\\"function\\\")throw new TypeError(\\\"callback is not a function\\\");i=(i==null?pt():+i)+(n==null?0:+n),!this._next&&L!==this&&(L?L._next=this:Q=this,L=this),this._call=t,this._time=i,V()},stop:function(){this._call&&(this._call=null,this._time=1/0,V())}};function gt(t,n,i){var e=new U;return e.restart(t,n,i),e}function In(){pt(),++R;for(var t=Q,n;t;)(n=O-t._time)>=0&&t._call.call(void 0,n),t=t._next;--R}function wt(){O=(W=Y.now())+Z,R=B=0;try{In()}finally{R=0,kn(),O=0}}function bn(){var t=Y.now(),n=t-W;n>xt&&(Z-=n,W=t)}function kn(){for(var t,n=Q,i,e=1/0;n;)n._call?(e>n._time&&(e=n._time),t=n,n=n._next):(i=n._next,n._next=null,n=t?t._next=i:Q=i);L=t,V(e)}function V(t){if(!R){B&&(B=clearTimeout(B));var n=t-O;n>24?(t<1/0&&(B=setTimeout(wt,t-Y.now()-Z)),C&&(C=clearInterval(C))):(C||(W=Y.now(),C=setInterval(bn,xt)),R=1,yt(wt))}}const Dn=1664525,En=1013904223,dt=4294967296;function Tn(){let t=1;return()=>(t=(Dn*t+En)%dt)/dt}var Nt=3;function tt(t){return t.x}function Mt(t){return t.y}function jn(t){return t.z}var Pn=10,Fn=Math.PI*(3-Math.sqrt(5)),Sn=Math.PI*20/(9+Math.sqrt(221));function On(t,n){n=n||2;var i=Math.min(Nt,Math.max(1,Math.round(n))),e,r=1,s=.001,o=1-Math.pow(s,1/300),u=0,h=.6,f=new Map,l=gt(y),c=_t(\\\"tick\\\",\\\"end\\\"),v=Tn();t==null&&(t=[]);function y(){_(),c.call(\\\"tick\\\",e),r<s&&(l.stop(),c.call(\\\"end\\\",e))}function _(a){var N,d=t.length,w;a===void 0&&(a=1);for(var p=0;p<a;++p)for(r+=(u-r)*o,f.forEach(function(M){M(r)}),N=0;N<d;++N)w=t[N],w.fx==null?w.x+=w.vx*=h:(w.x=w.fx,w.vx=0),i>1&&(w.fy==null?w.y+=w.vy*=h:(w.y=w.fy,w.vy=0)),i>2&&(w.fz==null?w.z+=w.vz*=h:(w.z=w.fz,w.vz=0));return e}function g(){for(var a=0,N=t.length,d;a<N;++a){if(d=t[a],d.index=a,d.fx!=null&&(d.x=d.fx),d.fy!=null&&(d.y=d.fy),d.fz!=null&&(d.z=d.fz),isNaN(d.x)||i>1&&isNaN(d.y)||i>2&&isNaN(d.z)){var w=Pn*(i>2?Math.cbrt(.5+a):i>1?Math.sqrt(.5+a):a),p=a*Fn,M=a*Sn;i===1?d.x=w:i===2?(d.x=w*Math.cos(p),d.y=w*Math.sin(p)):(d.x=w*Math.sin(p)*Math.cos(M),d.y=w*Math.cos(p),d.z=w*Math.sin(p)*Math.sin(M))}(isNaN(d.vx)||i>1&&isNaN(d.vy)||i>2&&isNaN(d.vz))&&(d.vx=0,i>1&&(d.vy=0),i>2&&(d.vz=0))}}function x(a){return a.initialize&&a.initialize(t,v,i),a}return g(),e={tick:_,restart:function(){return l.restart(y),e},stop:function(){return l.stop(),e},numDimensions:function(a){return arguments.length?(i=Math.min(Nt,Math.max(1,Math.round(a))),f.forEach(x),e):i},nodes:function(a){return arguments.length?(t=a,g(),f.forEach(x),e):t},alpha:function(a){return arguments.length?(r=+a,e):r},alphaMin:function(a){return arguments.length?(s=+a,e):s},alphaDecay:function(a){return arguments.length?(o=+a,e):+o},alphaTarget:function(a){return arguments.length?(u=+a,e):u},velocityDecay:function(a){return arguments.length?(h=1-a,e):1-h},randomSource:function(a){return arguments.length?(v=a,f.forEach(x),e):v},force:function(a,N){return arguments.length>1?(N==null?f.delete(a):f.set(a,x(N)),e):f.get(a)},find:function(){var a=Array.prototype.slice.call(arguments),N=a.shift()||0,d=(i>1?a.shift():null)||0,w=(i>2?a.shift():null)||0,p=a.shift()||1/0,M=0,z=t.length,A,E,T,D,m,zt;for(p*=p,M=0;M<z;++M)m=t[M],A=N-m.x,E=d-(m.y||0),T=w-(m.z||0),D=A*A+E*E+T*T,D<p&&(zt=m,p=D);return zt},on:function(a,N){return arguments.length>1?(c.on(a,N),e):c.on(a)}}}function Rn(){var t,n,i,e,r,s=X(-30),o,u=1,h=1/0,f=.81;function l(_){var g,x=t.length,a=(n===1?rt(t,tt):n===2?ht(t,tt,Mt):n===3?ut(t,tt,Mt,jn):null).visitAfter(v);for(r=_,g=0;g<x;++g)i=t[g],a.visit(y)}function c(){if(t){var _,g=t.length,x;for(o=new Array(g),_=0;_<g;++_)x=t[_],o[x.index]=+s(x,_,t)}}function v(_){var g=0,x,a,N=0,d,w,p,M,z=_.length;if(z){for(d=w=p=M=0;M<z;++M)(x=_[M])&&(a=Math.abs(x.value))&&(g+=x.value,N+=a,d+=a*(x.x||0),w+=a*(x.y||0),p+=a*(x.z||0));g*=Math.sqrt(4/z),_.x=d/N,n>1&&(_.y=w/N),n>2&&(_.z=p/N)}else{x=_,x.x=x.data.x,n>1&&(x.y=x.data.y),n>2&&(x.z=x.data.z);do g+=o[x.data.index];while(x=x.next)}_.value=g}function y(_,g,x,a,N){if(!_.value)return!0;var d=[x,a,N][n-1],w=_.x-i.x,p=n>1?_.y-i.y:0,M=n>2?_.z-i.z:0,z=d-g,A=w*w+p*p+M*M;if(z*z/f<A)return A<h&&(w===0&&(w=F(e),A+=w*w),n>1&&p===0&&(p=F(e),A+=p*p),n>2&&M===0&&(M=F(e),A+=M*M),A<u&&(A=Math.sqrt(u*A)),i.vx+=w*_.value*r/A,n>1&&(i.vy+=p*_.value*r/A),n>2&&(i.vz+=M*_.value*r/A)),!0;if(_.length||A>=h)return;(_.data!==i||_.next)&&(w===0&&(w=F(e),A+=w*w),n>1&&p===0&&(p=F(e),A+=p*p),n>2&&M===0&&(M=F(e),A+=M*M),A<u&&(A=Math.sqrt(u*A)));do _.data!==i&&(z=o[_.data.index]*r/A,i.vx+=w*z,n>1&&(i.vy+=p*z),n>2&&(i.vz+=M*z));while(_=_.next)}return l.initialize=function(_,...g){t=_,e=g.find(x=>typeof x==\\\"function\\\")||Math.random,n=g.find(x=>[1,2,3].includes(x))||2,c()},l.strength=function(_){return arguments.length?(s=typeof _==\\\"function\\\"?_:X(+_),c(),l):s},l.distanceMin=function(_){return arguments.length?(u=_*_,l):Math.sqrt(u)},l.distanceMax=function(_){return arguments.length?(h=_*_,l):Math.sqrt(h)},l.theta=function(_){return arguments.length?(f=_*_,l):Math.sqrt(f)},l}let S=null,j=[],nt=0,it=!1;self.onmessage=t=>{const n=t.data;if(n.type===\\\"init\\\"){S&&S.stop(),it=!1,nt=0;const i=n.nodes.length,e=n.params,r=n.initialPositions??{},s=e.dimensions===2?2:3;j=n.nodes.map((h,f)=>{const l=r[h.id];if(l)return{id:h.id,index:f,x:l.x,y:l.y,z:s===2?0:l.z};const c=Math.random()*Math.PI*2,v=e.initialRadius*(.5+Math.random()*.5);if(s===2)return{id:h.id,index:f,x:v*Math.cos(c),y:v*Math.sin(c),z:0};const y=Math.acos(2*Math.random()-1);return{id:h.id,index:f,x:v*Math.sin(y)*Math.cos(c),y:v*Math.sin(y)*Math.sin(c),z:v*Math.cos(y)}});const o=n.links.map(h=>({source:h.source,target:h.target}));S=On(j,s).force(\\\"charge\\\",Rn().strength(e.charge).distanceMax(e.distanceMax).theta(e.theta)).force(\\\"link\\\",zn(o).id(h=>h.id).distance(e.linkDistance).strength(.2)).force(\\\"center\\\",At()).alphaDecay(e.alphaDecay).velocityDecay(e.velocityDecay);const u=n.groups;if(u&&u.length===j.length&&e.clusterStrength>0){const h=e.clusterStrength;S.force(\\\"cluster\\\",f=>{const l={},c={},v={},y={};for(let g=0;g<j.length;g++){const x=u[g];x<0||(l[x]=(l[x]??0)+j[g].x,c[x]=(c[x]??0)+j[g].y,v[x]=(v[x]??0)+(j[g].z||0),y[x]=(y[x]??0)+1)}const _=h*f;for(let g=0;g<j.length;g++){const x=u[g];if(x<0||!y[x])continue;const a=j[g];a.vx=(a.vx||0)+(l[x]/y[x]-a.x)*_,a.vy=(a.vy||0)+(c[x]/y[x]-a.y)*_,s===3&&(a.vz=(a.vz||0)+(v[x]/y[x]-a.z)*_)}})}S.on(\\\"tick\\\",()=>{nt++;const h=S.alpha();if(nt%e.postEvery!==0&&h>e.settledThreshold)return;const f=new Float32Array(i*3);for(let l=0;l<i;l++)f[l*3]=j[l].x||0,f[l*3+1]=j[l].y||0,f[l*3+2]=s===2?0:j[l].z||0;self.postMessage({type:\\\"positions\\\",positions:f.buffer,alpha:h},[f.buffer]),!it&&h<e.settledThreshold&&(it=!0,self.postMessage({type:\\\"settled\\\"}))})}n.type===\\\"stop\\\"&&S&&(S.stop(),S=null)}})();\\n\";\n\nexport function createLayoutWorker(): Worker {\n const blob = new Blob([WORKER_SOURCE], { type: \"application/javascript\" });\n const url = URL.createObjectURL(blob);\n const worker = new Worker(url);\n // Clean up the blob URL after the worker starts\n URL.revokeObjectURL(url);\n return worker;\n}\n","import {\n\tControls,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3,\n\tPlane,\n\tRay,\n\tMathUtils\n} from 'three';\n\n// OrbitControls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\nconst _ray = new Ray();\nconst _plane = new Plane();\nconst _TILT_LIMIT = Math.cos( 70 * MathUtils.DEG2RAD );\n\nconst _v = new Vector3();\nconst _twoPI = 2 * Math.PI;\n\nconst _STATE = {\n\tNONE: - 1,\n\tROTATE: 0,\n\tDOLLY: 1,\n\tPAN: 2,\n\tTOUCH_ROTATE: 3,\n\tTOUCH_PAN: 4,\n\tTOUCH_DOLLY_PAN: 5,\n\tTOUCH_DOLLY_ROTATE: 6\n};\nconst _EPS = 0.000001;\n\nclass OrbitControls extends Controls {\n\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper( object, domElement );\n\n\t\tthis.state = _STATE.NONE;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new Vector3();\n\n\t\t// Sets the 3D cursor (similar to Blender), from which the maxTargetRadius takes effect\n\t\tthis.cursor = new Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// Limit camera target within a spherical area around the cursor\n\t\tthis.minTargetRadius = 0;\n\t\tthis.maxTargetRadius = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.05;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.panSpeed = 1.0;\n\t\tthis.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\t\tthis.zoomToCursor = false;\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t\t// Touch fingers\n\t\tthis.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t// internals\n\n\t\tthis._lastPosition = new Vector3();\n\t\tthis._lastQuaternion = new Quaternion();\n\t\tthis._lastTargetPosition = new Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tthis._quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n\t\tthis._quatInverse = this._quat.clone().invert();\n\n\t\t// current position in spherical coordinates\n\t\tthis._spherical = new Spherical();\n\t\tthis._sphericalDelta = new Spherical();\n\n\t\tthis._scale = 1;\n\t\tthis._panOffset = new Vector3();\n\n\t\tthis._rotateStart = new Vector2();\n\t\tthis._rotateEnd = new Vector2();\n\t\tthis._rotateDelta = new Vector2();\n\n\t\tthis._panStart = new Vector2();\n\t\tthis._panEnd = new Vector2();\n\t\tthis._panDelta = new Vector2();\n\n\t\tthis._dollyStart = new Vector2();\n\t\tthis._dollyEnd = new Vector2();\n\t\tthis._dollyDelta = new Vector2();\n\n\t\tthis._dollyDirection = new Vector3();\n\t\tthis._mouse = new Vector2();\n\t\tthis._performCursorZoom = false;\n\n\t\tthis._pointers = [];\n\t\tthis._pointerPositions = {};\n\n\t\tthis._controlActive = false;\n\n\t\t// event listeners\n\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\t\tthis._onMouseWheel = onMouseWheel.bind( this );\n\t\tthis._onKeyDown = onKeyDown.bind( this );\n\n\t\tthis._onTouchStart = onTouchStart.bind( this );\n\t\tthis._onTouchMove = onTouchMove.bind( this );\n\n\t\tthis._onMouseDown = onMouseDown.bind( this );\n\t\tthis._onMouseMove = onMouseMove.bind( this );\n\n\t\tthis._interceptControlDown = interceptControlDown.bind( this );\n\t\tthis._interceptControlUp = interceptControlUp.bind( this );\n\n\t\t//\n\n\t\tif ( this.domElement !== null ) {\n\n\t\t\tthis.connect();\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\tconnect() {\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\t\tthis.domElement.addEventListener( 'wheel', this._onMouseWheel, { passive: false } );\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.addEventListener( 'keydown', this._interceptControlDown, { passive: true, capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.removeEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.removeEventListener( 'wheel', this._onMouseWheel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.stopListenToKeyEvents();\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.removeEventListener( 'keydown', this._interceptControlDown, { capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'auto';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\tgetPolarAngle() {\n\n\t\treturn this._spherical.phi;\n\n\t}\n\n\tgetAzimuthalAngle() {\n\n\t\treturn this._spherical.theta;\n\n\t}\n\n\tgetDistance() {\n\n\t\treturn this.object.position.distanceTo( this.target );\n\n\t}\n\n\tlistenToKeyEvents( domElement ) {\n\n\t\tdomElement.addEventListener( 'keydown', this._onKeyDown );\n\t\tthis._domElementKeyEvents = domElement;\n\n\t}\n\n\tstopListenToKeyEvents() {\n\n\t\tif ( this._domElementKeyEvents !== null ) {\n\n\t\t\tthis._domElementKeyEvents.removeEventListener( 'keydown', this._onKeyDown );\n\t\t\tthis._domElementKeyEvents = null;\n\n\t\t}\n\n\t}\n\n\tsaveState() {\n\n\t\tthis.target0.copy( this.target );\n\t\tthis.position0.copy( this.object.position );\n\t\tthis.zoom0 = this.object.zoom;\n\n\t}\n\n\treset() {\n\n\t\tthis.target.copy( this.target0 );\n\t\tthis.object.position.copy( this.position0 );\n\t\tthis.object.zoom = this.zoom0;\n\n\t\tthis.object.updateProjectionMatrix();\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t\tthis.update();\n\n\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tupdate( deltaTime = null ) {\n\n\t\tconst position = this.object.position;\n\n\t\t_v.copy( position ).sub( this.target );\n\n\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t_v.applyQuaternion( this._quat );\n\n\t\t// angle from z-axis around y-axis\n\t\tthis._spherical.setFromVector3( _v );\n\n\t\tif ( this.autoRotate && this.state === _STATE.NONE ) {\n\n\t\t\tthis._rotateLeft( this._getAutoRotationAngle( deltaTime ) );\n\n\t\t}\n\n\t\tif ( this.enableDamping ) {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta * this.dampingFactor;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi * this.dampingFactor;\n\n\t\t} else {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi;\n\n\t\t}\n\n\t\t// restrict theta to be between desired limits\n\n\t\tlet min = this.minAzimuthAngle;\n\t\tlet max = this.maxAzimuthAngle;\n\n\t\tif ( isFinite( min ) && isFinite( max ) ) {\n\n\t\t\tif ( min < - Math.PI ) min += _twoPI; else if ( min > Math.PI ) min -= _twoPI;\n\n\t\t\tif ( max < - Math.PI ) max += _twoPI; else if ( max > Math.PI ) max -= _twoPI;\n\n\t\t\tif ( min <= max ) {\n\n\t\t\t\tthis._spherical.theta = Math.max( min, Math.min( max, this._spherical.theta ) );\n\n\t\t\t} else {\n\n\t\t\t\tthis._spherical.theta = ( this._spherical.theta > ( min + max ) / 2 ) ?\n\t\t\t\t\tMath.max( min, this._spherical.theta ) :\n\t\t\t\t\tMath.min( max, this._spherical.theta );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restrict phi to be between desired limits\n\t\tthis._spherical.phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, this._spherical.phi ) );\n\n\t\tthis._spherical.makeSafe();\n\n\n\t\t// move target to panned location\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis.target.addScaledVector( this._panOffset, this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis.target.add( this._panOffset );\n\n\t\t}\n\n\t\t// Limit the target distance from the cursor to create a sphere around the center of interest\n\t\tthis.target.sub( this.cursor );\n\t\tthis.target.clampLength( this.minTargetRadius, this.maxTargetRadius );\n\t\tthis.target.add( this.cursor );\n\n\t\tlet zoomChanged = false;\n\t\t// adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n\t\t// we adjust zoom later in these cases\n\t\tif ( this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius );\n\n\t\t} else {\n\n\t\t\tconst prevRadius = this._spherical.radius;\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius * this._scale );\n\t\t\tzoomChanged = prevRadius != this._spherical.radius;\n\n\t\t}\n\n\t\t_v.setFromSpherical( this._spherical );\n\n\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t_v.applyQuaternion( this._quatInverse );\n\n\t\tposition.copy( this.target ).add( _v );\n\n\t\tthis.object.lookAt( this.target );\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis._sphericalDelta.theta *= ( 1 - this.dampingFactor );\n\t\t\tthis._sphericalDelta.phi *= ( 1 - this.dampingFactor );\n\n\t\t\tthis._panOffset.multiplyScalar( 1 - this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis._sphericalDelta.set( 0, 0, 0 );\n\n\t\t\tthis._panOffset.set( 0, 0, 0 );\n\n\t\t}\n\n\t\t// adjust camera position\n\t\tif ( this.zoomToCursor && this._performCursorZoom ) {\n\n\t\t\tlet newRadius = null;\n\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t// move the camera down the pointer ray\n\t\t\t\t// this method avoids floating point error\n\t\t\t\tconst prevRadius = _v.length();\n\t\t\t\tnewRadius = this._clampDistance( prevRadius * this._scale );\n\n\t\t\t\tconst radiusDelta = prevRadius - newRadius;\n\t\t\t\tthis.object.position.addScaledVector( this._dollyDirection, radiusDelta );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tzoomChanged = !! radiusDelta;\n\n\t\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t\t// adjust the ortho camera position based on zoom changes\n\t\t\t\tconst mouseBefore = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseBefore.unproject( this.object );\n\n\t\t\t\tconst prevZoom = this.object.zoom;\n\t\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t\tzoomChanged = prevZoom !== this.object.zoom;\n\n\t\t\t\tconst mouseAfter = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseAfter.unproject( this.object );\n\n\t\t\t\tthis.object.position.sub( mouseAfter ).add( mouseBefore );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tnewRadius = _v.length();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.' );\n\t\t\t\tthis.zoomToCursor = false;\n\n\t\t\t}\n\n\t\t\t// handle the placement of the target\n\t\t\tif ( newRadius !== null ) {\n\n\t\t\t\tif ( this.screenSpacePanning ) {\n\n\t\t\t\t\t// position the orbit target in front of the new camera position\n\t\t\t\t\tthis.target.set( 0, 0, - 1 )\n\t\t\t\t\t\t.transformDirection( this.object.matrix )\n\t\t\t\t\t\t.multiplyScalar( newRadius )\n\t\t\t\t\t\t.add( this.object.position );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// get the ray and translation plane to compute target\n\t\t\t\t\t_ray.origin.copy( this.object.position );\n\t\t\t\t\t_ray.direction.set( 0, 0, - 1 ).transformDirection( this.object.matrix );\n\n\t\t\t\t\t// if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n\t\t\t\t\t// extremely large values\n\t\t\t\t\tif ( Math.abs( this.object.up.dot( _ray.direction ) ) < _TILT_LIMIT ) {\n\n\t\t\t\t\t\tthis.object.lookAt( this.target );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint( this.object.up, this.target );\n\t\t\t\t\t\t_ray.intersectPlane( _plane, this.target );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\tconst prevZoom = this.object.zoom;\n\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\n\t\t\tif ( prevZoom !== this.object.zoom ) {\n\n\t\t\t\tthis.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._scale = 1;\n\t\tthis._performCursorZoom = false;\n\n\t\t// update condition is:\n\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\tif ( zoomChanged ||\n\t\t\tthis._lastPosition.distanceToSquared( this.object.position ) > _EPS ||\n\t\t\t8 * ( 1 - this._lastQuaternion.dot( this.object.quaternion ) ) > _EPS ||\n\t\t\tthis._lastTargetPosition.distanceToSquared( this.target ) > _EPS ) {\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\tthis._lastPosition.copy( this.object.position );\n\t\t\tthis._lastQuaternion.copy( this.object.quaternion );\n\t\t\tthis._lastTargetPosition.copy( this.target );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_getAutoRotationAngle( deltaTime ) {\n\n\t\tif ( deltaTime !== null ) {\n\n\t\t\treturn ( _twoPI / 60 * this.autoRotateSpeed ) * deltaTime;\n\n\t\t} else {\n\n\t\t\treturn _twoPI / 60 / 60 * this.autoRotateSpeed;\n\n\t\t}\n\n\t}\n\n\t_getZoomScale( delta ) {\n\n\t\tconst normalizedDelta = Math.abs( delta * 0.01 );\n\t\treturn Math.pow( 0.95, this.zoomSpeed * normalizedDelta );\n\n\t}\n\n\t_rotateLeft( angle ) {\n\n\t\tthis._sphericalDelta.theta -= angle;\n\n\t}\n\n\t_rotateUp( angle ) {\n\n\t\tthis._sphericalDelta.phi -= angle;\n\n\t}\n\n\t_panLeft( distance, objectMatrix ) {\n\n\t\t_v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t_v.multiplyScalar( - distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t_panUp( distance, objectMatrix ) {\n\n\t\tif ( this.screenSpacePanning === true ) {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t} else {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t_v.crossVectors( this.object.up, _v );\n\n\t\t}\n\n\t\t_v.multiplyScalar( distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\t_pan( deltaX, deltaY ) {\n\n\t\tconst element = this.domElement;\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t// perspective\n\t\t\tconst position = this.object.position;\n\t\t\t_v.copy( position ).sub( this.target );\n\t\t\tlet targetDistance = _v.length();\n\n\t\t\t// half of the fov is center to top of screen\n\t\t\ttargetDistance *= Math.tan( ( this.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\tthis._panLeft( 2 * deltaX * targetDistance / element.clientHeight, this.object.matrix );\n\t\t\tthis._panUp( 2 * deltaY * targetDistance / element.clientHeight, this.object.matrix );\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t// orthographic\n\t\t\tthis._panLeft( deltaX * ( this.object.right - this.object.left ) / this.object.zoom / element.clientWidth, this.object.matrix );\n\t\t\tthis._panUp( deltaY * ( this.object.top - this.object.bottom ) / this.object.zoom / element.clientHeight, this.object.matrix );\n\n\t\t} else {\n\n\t\t\t// camera neither orthographic nor perspective\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\tthis.enablePan = false;\n\n\t\t}\n\n\t}\n\n\t_dollyOut( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale /= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_dollyIn( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale *= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_updateZoomParameters( x, y ) {\n\n\t\tif ( ! this.zoomToCursor ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._performCursorZoom = true;\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\t\tconst dx = x - rect.left;\n\t\tconst dy = y - rect.top;\n\t\tconst w = rect.width;\n\t\tconst h = rect.height;\n\n\t\tthis._mouse.x = ( dx / w ) * 2 - 1;\n\t\tthis._mouse.y = - ( dy / h ) * 2 + 1;\n\n\t\tthis._dollyDirection.set( this._mouse.x, this._mouse.y, 1 ).unproject( this.object ).sub( this.object.position ).normalize();\n\n\t}\n\n\t_clampDistance( dist ) {\n\n\t\treturn Math.max( this.minDistance, Math.min( this.maxDistance, dist ) );\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\t_handleMouseDownRotate( event ) {\n\n\t\tthis._rotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownDolly( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientX );\n\t\tthis._dollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownPan( event ) {\n\n\t\tthis._panStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseMoveRotate( event ) {\n\n\t\tthis._rotateEnd.set( event.clientX, event.clientY );\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMoveDolly( event ) {\n\n\t\tthis._dollyEnd.set( event.clientX, event.clientY );\n\n\t\tthis._dollyDelta.subVectors( this._dollyEnd, this._dollyStart );\n\n\t\tif ( this._dollyDelta.y > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t} else if ( this._dollyDelta.y < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t}\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMovePan( event ) {\n\n\t\tthis._panEnd.set( event.clientX, event.clientY );\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseWheel( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientY );\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( event.deltaY ) );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( event.deltaY ) );\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\t_handleKeyDown( event ) {\n\n\t\tlet needsUpdate = false;\n\n\t\tswitch ( event.code ) {\n\n\t\t\tcase this.keys.UP:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tthis._rotateUp( _twoPI * this.rotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._pan( 0, this.keyPanSpeed );\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.BOTTOM:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tthis._rotateUp( - _twoPI * this.rotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._pan( 0, - this.keyPanSpeed );\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.LEFT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tthis._rotateLeft( _twoPI * this.rotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._pan( this.keyPanSpeed, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.RIGHT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tthis._rotateLeft( - _twoPI * this.rotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._pan( - this.keyPanSpeed, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.update();\n\n\t\t}\n\n\n\t}\n\n\t_handleTouchStartRotate( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._rotateStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartPan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyStart.set( 0, distance );\n\n\t}\n\n\t_handleTouchStartDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchStartPan( event );\n\n\t}\n\n\t_handleTouchStartDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchStartRotate( event );\n\n\t}\n\n\t_handleTouchMoveRotate( event ) {\n\n\t\tif ( this._pointers.length == 1 ) {\n\n\t\t\tthis._rotateEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t}\n\n\t_handleTouchMovePan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t}\n\n\t_handleTouchMoveDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyEnd.set( 0, distance );\n\n\t\tthis._dollyDelta.set( 0, Math.pow( this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed ) );\n\n\t\tthis._dollyOut( this._dollyDelta.y );\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tconst centerX = ( event.pageX + position.x ) * 0.5;\n\t\tconst centerY = ( event.pageY + position.y ) * 0.5;\n\n\t\tthis._updateZoomParameters( centerX, centerY );\n\n\t}\n\n\t_handleTouchMoveDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchMovePan( event );\n\n\t}\n\n\t_handleTouchMoveDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchMoveRotate( event );\n\n\t}\n\n\t// pointers\n\n\t_addPointer( event ) {\n\n\t\tthis._pointers.push( event.pointerId );\n\n\t}\n\n\t_removePointer( event ) {\n\n\t\tdelete this._pointerPositions[ event.pointerId ];\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) {\n\n\t\t\t\tthis._pointers.splice( i, 1 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_isTrackingPointer( event ) {\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_trackPointer( event ) {\n\n\t\tlet position = this._pointerPositions[ event.pointerId ];\n\n\t\tif ( position === undefined ) {\n\n\t\t\tposition = new Vector2();\n\t\t\tthis._pointerPositions[ event.pointerId ] = position;\n\n\t\t}\n\n\t\tposition.set( event.pageX, event.pageY );\n\n\t}\n\n\t_getSecondPointerPosition( event ) {\n\n\t\tconst pointerId = ( event.pointerId === this._pointers[ 0 ] ) ? this._pointers[ 1 ] : this._pointers[ 0 ];\n\n\t\treturn this._pointerPositions[ pointerId ];\n\n\t}\n\n\t//\n\n\t_customWheelEvent( event ) {\n\n\t\tconst mode = event.deltaMode;\n\n\t\t// minimal wheel event altered to meet delta-zoom demand\n\t\tconst newEvent = {\n\t\t\tclientX: event.clientX,\n\t\t\tclientY: event.clientY,\n\t\t\tdeltaY: event.deltaY,\n\t\t};\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 1: // LINE_MODE\n\t\t\t\tnewEvent.deltaY *= 16;\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // PAGE_MODE\n\t\t\t\tnewEvent.deltaY *= 100;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// detect if event was triggered by pinching\n\t\tif ( event.ctrlKey && ! this._controlActive ) {\n\n\t\t\tnewEvent.deltaY *= 10;\n\n\t\t}\n\n\t\treturn newEvent;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this._pointers.length === 0 ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t//\n\n\tif ( this._isTrackingPointer( event ) ) return;\n\n\t//\n\n\tthis._addPointer( event );\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchStart( event );\n\n\t} else {\n\n\t\tthis._onMouseDown( event );\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchMove( event );\n\n\t} else {\n\n\t\tthis._onMouseMove( event );\n\n\t}\n\n}\n\nfunction onPointerUp( event ) {\n\n\tthis._removePointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 0:\n\n\t\t\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\t\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tconst pointerId = this._pointers[ 0 ];\n\t\t\tconst position = this._pointerPositions[ pointerId ];\n\n\t\t\t// minimal placeholder event - allows state correction on pointer-up\n\t\t\tthis._onTouchStart( { pointerId: pointerId, pageX: position.x, pageY: position.y } );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseDown( event ) {\n\n\tlet mouseAction;\n\n\tswitch ( event.button ) {\n\n\t\tcase 0:\n\n\t\t\tmouseAction = this.mouseButtons.LEFT;\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tmouseAction = this.mouseButtons.MIDDLE;\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tmouseAction = this.mouseButtons.RIGHT;\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tmouseAction = - 1;\n\n\t}\n\n\tswitch ( mouseAction ) {\n\n\t\tcase MOUSE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseDownDolly( event );\n\n\t\t\tthis.state = _STATE.DOLLY;\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.ROTATE:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.PAN:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onMouseMove( event ) {\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleMouseMoveRotate( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseMoveDolly( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleMouseMovePan( event );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseWheel( event ) {\n\n\tif ( this.enabled === false || this.enableZoom === false || this.state !== _STATE.NONE ) return;\n\n\tevent.preventDefault();\n\n\tthis.dispatchEvent( _startEvent );\n\n\tthis._handleMouseWheel( this._customWheelEvent( event ) );\n\n\tthis.dispatchEvent( _endEvent );\n\n}\n\nfunction onKeyDown( event ) {\n\n\tif ( this.enabled === false || this.enablePan === false ) return;\n\n\tthis._handleKeyDown( event );\n\n}\n\nfunction onTouchStart( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 1:\n\n\t\t\tswitch ( this.touches.ONE ) {\n\n\t\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.PAN:\n\n\t\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tswitch ( this.touches.TWO ) {\n\n\t\t\t\tcase TOUCH.DOLLY_PAN:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onTouchMove( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.TOUCH_ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMovePan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_PAN:\n\n\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyPan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nfunction interceptControlDown( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = true;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.addEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nfunction interceptControlUp( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = false;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.removeEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nexport { OrbitControls };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tname: 'CopyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\tthis.isPass = true;\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\nclass ShaderPass extends Pass {\n\n\tconstructor( shader, textureID ) {\n\n\t\tsuper();\n\n\t\tthis.textureID = ( textureID !== undefined ) ? textureID : 'tDiffuse';\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import { Pass } from './Pass.js';\n\nclass MaskPass extends Pass {\n\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.clear = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis.inverse = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer and make them writable for subsequent rendering/clearing\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\tstate.buffers.color.setMask( true );\n\t\tstate.buffers.depth.setMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\nclass ClearMaskPass extends Pass {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.needsSwap = false;\n\n\t}\n\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n","import {\n\tClock,\n\tHalfFloatType,\n\tNoBlending,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { MaskPass } from './MaskPass.js';\nimport { ClearMaskPass } from './MaskPass.js';\n\nclass EffectComposer {\n\n\tconstructor( renderer, renderTarget ) {\n\n\t\tthis.renderer = renderer;\n\n\t\tthis._pixelRatio = renderer.getPixelRatio();\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, { type: HalfFloatType } );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tthis.renderToScreen = true;\n\n\t\tthis.passes = [];\n\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\t\tthis.copyPass.material.blending = NoBlending;\n\n\t\tthis.clock = new Clock();\n\n\t}\n\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\n\t\tthis.copyPass.dispose();\n\n\t}\n\n}\n\nexport { EffectComposer };\n","import {\n\tColor\n} from 'three';\nimport { Pass } from './Pass.js';\n\nclass RenderPass extends Pass {\n\n\tconstructor( scene, camera, overrideMaterial = null, clearColor = null, clearAlpha = null ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.overrideMaterial = overrideMaterial;\n\n\t\tthis.clearColor = clearColor;\n\t\tthis.clearAlpha = clearAlpha;\n\n\t\tthis.clear = true;\n\t\tthis.clearDepth = false;\n\t\tthis.needsSwap = false;\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tlet oldClearAlpha, oldOverrideMaterial;\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\toldOverrideMaterial = this.scene.overrideMaterial;\n\n\t\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\trenderer.setClearColor( this.clearColor, renderer.getClearAlpha() );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\t\t\trenderer.setClearAlpha( this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth == true ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\n\t\tif ( this.clear === true ) {\n\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// restore\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.setClearColor( this._oldClearColor );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\trenderer.setClearAlpha( oldClearAlpha );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\tthis.scene.overrideMaterial = oldOverrideMaterial;\n\n\t\t}\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n}\n\nexport { RenderPass };\n","import {\n\tColor\n} from 'three';\n\n/**\n * Luminosity\n * http://en.wikipedia.org/wiki/Luminosity\n */\n\nconst LuminosityHighPassShader = {\n\n\tname: 'LuminosityHighPassShader',\n\n\tshaderID: 'luminosityHighPass',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'luminosityThreshold': { value: 1.0 },\n\t\t'smoothWidth': { value: 1.0 },\n\t\t'defaultColor': { value: new Color( 0x000000 ) },\n\t\t'defaultOpacity': { value: 0.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat v = luminance( texel.xyz );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`\n\n};\n\nexport { LuminosityHighPassShader };\n","import {\n\tAdditiveBlending,\n\tColor,\n\tHalfFloatType,\n\tMeshBasicMaterial,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { LuminosityHighPassShader } from '../shaders/LuminosityHighPassShader.js';\n\n/**\n * UnrealBloomPass is inspired by the bloom pass of Unreal Engine. It creates a\n * mip map chain of bloom textures and blurs them with different radii. Because\n * of the weighted combination of mips, and because larger blurs are done on\n * higher mips, this effect provides good quality and performance.\n *\n * Reference:\n * - https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/\n */\nclass UnrealBloomPass extends Pass {\n\n\tconstructor( resolution, strength, radius, threshold ) {\n\n\t\tsuper();\n\n\t\tthis.strength = ( strength !== undefined ) ? strength : 1;\n\t\tthis.radius = radius;\n\t\tthis.threshold = threshold;\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\t// create color only once here, reuse it later inside the render function\n\t\tthis.clearColor = new Color( 0, 0, 0 );\n\n\t\t// render targets\n\t\tthis.renderTargetsHorizontal = [];\n\t\tthis.renderTargetsVertical = [];\n\t\tthis.nMips = 5;\n\t\tlet resx = Math.round( this.resolution.x / 2 );\n\t\tlet resy = Math.round( this.resolution.y / 2 );\n\n\t\tthis.renderTargetBright = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetBright.texture.name = 'UnrealBloomPass.bright';\n\t\tthis.renderTargetBright.texture.generateMipmaps = false;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tconst renderTargetHorizontal = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\n\t\t\trenderTargetHorizontal.texture.name = 'UnrealBloomPass.h' + i;\n\t\t\trenderTargetHorizontal.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsHorizontal.push( renderTargetHorizontal );\n\n\t\t\tconst renderTargetVertical = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\n\t\t\trenderTargetVertical.texture.name = 'UnrealBloomPass.v' + i;\n\t\t\trenderTargetVertical.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsVertical.push( renderTargetVertical );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// luminosity high pass material\n\n\t\tconst highPassShader = LuminosityHighPassShader;\n\t\tthis.highPassUniforms = UniformsUtils.clone( highPassShader.uniforms );\n\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = threshold;\n\t\tthis.highPassUniforms[ 'smoothWidth' ].value = 0.01;\n\n\t\tthis.materialHighPassFilter = new ShaderMaterial( {\n\t\t\tuniforms: this.highPassUniforms,\n\t\t\tvertexShader: highPassShader.vertexShader,\n\t\t\tfragmentShader: highPassShader.fragmentShader\n\t\t} );\n\n\t\t// gaussian blur materials\n\n\t\tthis.separableBlurMaterials = [];\n\t\tconst kernelSizeArray = [ 3, 5, 7, 9, 11 ];\n\t\tresx = Math.round( this.resolution.x / 2 );\n\t\tresy = Math.round( this.resolution.y / 2 );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials.push( this.getSeperableBlurMaterial( kernelSizeArray[ i ] ) );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'invSize' ].value = new Vector2( 1 / resx, 1 / resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// composite material\n\n\t\tthis.compositeMaterial = this.getCompositeMaterial( this.nMips );\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture1' ].value = this.renderTargetsVertical[ 0 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture2' ].value = this.renderTargetsVertical[ 1 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture3' ].value = this.renderTargetsVertical[ 2 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture4' ].value = this.renderTargetsVertical[ 3 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture5' ].value = this.renderTargetsVertical[ 4 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = 0.1;\n\n\t\tconst bloomFactors = [ 1.0, 0.8, 0.6, 0.4, 0.2 ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomFactors' ].value = bloomFactors;\n\t\tthis.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\t// blend material\n\n\t\tconst copyShader = CopyShader;\n\n\t\tthis.copyUniforms = UniformsUtils.clone( copyShader.uniforms );\n\n\t\tthis.blendMaterial = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: copyShader.vertexShader,\n\t\t\tfragmentShader: copyShader.fragmentShader,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tthis.enabled = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis.oldClearAlpha = 1;\n\n\t\tthis.basic = new MeshBasicMaterial();\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.renderTargetsHorizontal.length; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].dispose();\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.renderTargetsVertical.length; i ++ ) {\n\n\t\t\tthis.renderTargetsVertical[ i ].dispose();\n\n\t\t}\n\n\t\tthis.renderTargetBright.dispose();\n\n\t\t//\n\n\t\tfor ( let i = 0; i < this.separableBlurMaterials.length; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials[ i ].dispose();\n\n\t\t}\n\n\t\tthis.compositeMaterial.dispose();\n\t\tthis.blendMaterial.dispose();\n\t\tthis.basic.dispose();\n\n\t\t//\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tlet resx = Math.round( width / 2 );\n\t\tlet resy = Math.round( height / 2 );\n\n\t\tthis.renderTargetBright.setSize( resx, resy );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].setSize( resx, resy );\n\t\t\tthis.renderTargetsVertical[ i ].setSize( resx, resy );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'invSize' ].value = new Vector2( 1 / resx, 1 / resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.setClearColor( this.clearColor, 0 );\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t// Render input to screen\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.fsQuad.material = this.basic;\n\t\t\tthis.basic.map = readBuffer.texture;\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// 1. Extract Bright Areas\n\n\t\tthis.highPassUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = this.threshold;\n\t\tthis.fsQuad.material = this.materialHighPassFilter;\n\n\t\trenderer.setRenderTarget( this.renderTargetBright );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// 2. Blur All the mips progressively\n\n\t\tlet inputRenderTarget = this.renderTargetBright;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.fsQuad.material = this.separableBlurMaterials[ i ];\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = inputRenderTarget.texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = UnrealBloomPass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = this.renderTargetsHorizontal[ i ].texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = UnrealBloomPass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetsVertical[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tinputRenderTarget = this.renderTargetsVertical[ i ];\n\n\t\t}\n\n\t\t// Composite All the mips\n\n\t\tthis.fsQuad.material = this.compositeMaterial;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = this.strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = this.radius;\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ 0 ] );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// Blend it additively over the input texture\n\n\t\tthis.fsQuad.material = this.blendMaterial;\n\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetsHorizontal[ 0 ].texture;\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// Restore renderer settings\n\n\t\trenderer.setClearColor( this._oldClearColor, this.oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\tgetSeperableBlurMaterial( kernelRadius ) {\n\n\t\tconst coefficients = [];\n\n\t\tfor ( let i = 0; i < kernelRadius; i ++ ) {\n\n\t\t\tcoefficients.push( 0.39894 * Math.exp( - 0.5 * i * i / ( kernelRadius * kernelRadius ) ) / kernelRadius );\n\n\t\t}\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'KERNEL_RADIUS': kernelRadius\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'invSize': { value: new Vector2( 0.5, 0.5 ) }, // inverse texture size\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'gaussianCoefficients': { value: coefficients } // precomputed Gaussian coefficients\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 invSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float gaussianCoefficients[KERNEL_RADIUS];\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat weightSum = gaussianCoefficients[0];\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianCoefficients[i];\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;\n\t\t\t\t\t\tvec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;\n\t\t\t\t\t\tdiffuseSum += (sample1 + sample2) * w;\n\t\t\t\t\t\tweightSum += 2.0 * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4(diffuseSum/weightSum, 1.0);\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetCompositeMaterial( nMips ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'NUM_MIPS': nMips\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'blurTexture1': { value: null },\n\t\t\t\t'blurTexture2': { value: null },\n\t\t\t\t'blurTexture3': { value: null },\n\t\t\t\t'blurTexture4': { value: null },\n\t\t\t\t'blurTexture5': { value: null },\n\t\t\t\t'bloomStrength': { value: 1.0 },\n\t\t\t\t'bloomFactors': { value: null },\n\t\t\t\t'bloomTintColors': { value: null },\n\t\t\t\t'bloomRadius': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n}\n\nUnrealBloomPass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nUnrealBloomPass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { UnrealBloomPass };\n","/**\n * Visual effects: star field, bloom, fog.\n */\nimport * as THREE from \"three\";\n\n/** Create a background star field of random points on a sphere */\nexport function createStarField(count: number, radius: number): THREE.Points {\n const geo = new THREE.BufferGeometry();\n const positions = new Float32Array(count * 3);\n const colors = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const r = radius * (0.4 + Math.random() * 0.6);\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n positions[i * 3] = r * Math.sin(phi) * Math.cos(theta);\n positions[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta);\n positions[i * 3 + 2] = r * Math.cos(phi);\n const b = 0.5 + Math.random() * 0.5;\n colors[i * 3] = b * (0.8 + Math.random() * 0.2);\n colors[i * 3 + 1] = b * (0.85 + Math.random() * 0.15);\n colors[i * 3 + 2] = b;\n }\n geo.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n geo.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n return new THREE.Points(\n geo,\n new THREE.PointsMaterial({\n size: 1.5,\n vertexColors: true,\n transparent: true,\n opacity: 0.7,\n sizeAttenuation: true,\n depthWrite: false,\n })\n );\n}\n\n/** Create exponential fog matching background color */\nexport function createFog(\n backgroundColor: number,\n density: number,\n nodeCount: number\n): THREE.FogExp2 | null {\n if (density <= 0 || nodeCount >= 15000) return null;\n return new THREE.FogExp2(backgroundColor, density * 0.5);\n}\n","/**\n * Node selection and N-hop highlight logic.\n * Performs BFS from selected node to compute highlight gradient.\n */\nimport * as THREE from \"three\";\nimport type { GraphNode, GraphLink } from \"../types\";\nimport type { ResolvedTheme } from \"../themes/resolve-theme\";\n\n/** Build adjacency map from links */\nexport function buildAdjacencyMapFromLinks(\n links: GraphLink[]\n): Map<string, string[]> {\n const adj = new Map<string, string[]>();\n for (const l of links) {\n const s = typeof l.source === \"object\" ? (l.source as any).id : l.source;\n const t = typeof l.target === \"object\" ? (l.target as any).id : l.target;\n if (!adj.has(s)) adj.set(s, []);\n if (!adj.has(t)) adj.set(t, []);\n adj.get(s)!.push(t);\n adj.get(t)!.push(s);\n }\n return adj;\n}\n\n/** BFS to find nodes within N hops of a root node */\nexport function computeHighlightSet(\n rootId: string,\n adjacencyMap: Map<string, string[]>,\n maxHops: number\n): Map<string, number> {\n const visited = new Map<string, number>();\n visited.set(rootId, 0);\n const queue = [rootId];\n while (queue.length > 0) {\n const current = queue.shift()!;\n const dist = visited.get(current)!;\n if (dist >= maxHops) continue;\n for (const nb of adjacencyMap.get(current) ?? []) {\n if (!visited.has(nb)) {\n visited.set(nb, dist + 1);\n queue.push(nb);\n }\n }\n }\n return visited;\n}\n\n/** Apply selection highlight to node colors (dim non-selected, brighten selected) */\nexport function applyNodeHighlight(\n nodesMesh: THREE.InstancedMesh,\n nodes: GraphNode[],\n selectedNodeId: string | null,\n highlightSet: Map<string, number> | null,\n theme: ResolvedTheme\n): void {\n const nc = nodes.length;\n const tmpColor = new THREE.Color();\n const brightTmp = new THREE.Color();\n const bgColor = new THREE.Color(theme.backgroundColor);\n\n for (let i = 0; i < nc; i++) {\n const node = nodes[i];\n const baseColor = theme.nodeColor(node.type);\n const brightColor = theme.nodeColorBright(node.type);\n\n if (!highlightSet) {\n // Normal state\n tmpColor.set(baseColor);\n } else if (node.id === selectedNodeId) {\n if (theme.isLight) {\n // Light background: whitening would erase the node — use the\n // saturated bright variant instead (ring carries the emphasis).\n tmpColor.set(brightColor);\n } else {\n // Selected — near-white HDR glow (exceeds 1.0 for bloom pickup)\n tmpColor.set(brightColor);\n brightTmp.setRGB(1, 1, 1);\n tmpColor.lerp(brightTmp, 0.65);\n tmpColor.multiplyScalar(1.4); // HDR overshoot for bloom magnet\n // Clamp to 2.0 to prevent over-saturation (match original)\n tmpColor.r = Math.min(tmpColor.r, 2.0);\n tmpColor.g = Math.min(tmpColor.g, 2.0);\n tmpColor.b = Math.min(tmpColor.b, 2.0);\n }\n } else if (highlightSet.has(node.id)) {\n const hop = highlightSet.get(node.id)!;\n if (hop === 1) {\n tmpColor.set(brightColor).multiplyScalar(1.2);\n } else if (hop === 2) {\n tmpColor.set(baseColor);\n brightTmp.set(brightColor);\n tmpColor.lerp(brightTmp, 0.5);\n } else {\n tmpColor.set(baseColor).multiplyScalar(0.6);\n }\n } else if (theme.isLight) {\n // Heavily dimmed — fade toward the light background\n tmpColor.set(baseColor).lerp(bgColor, 0.88);\n } else {\n // Heavily dimmed — nearly invisible\n tmpColor.set(baseColor).multiplyScalar(0.04);\n }\n\n nodesMesh.setColorAt(i, tmpColor);\n }\n if (nodesMesh.instanceColor) nodesMesh.instanceColor.needsUpdate = true;\n\n // Boost glow for highlights\n const mat = nodesMesh.material as THREE.ShaderMaterial;\n if (mat.uniforms?.uGlowIntensity) {\n mat.uniforms.uGlowIntensity.value = highlightSet ? 1.5 : 1.0;\n }\n}\n\n/** Apply selection highlight to edge colors */\nexport function applyEdgeHighlight(\n edgesMesh: THREE.LineSegments,\n links: GraphLink[],\n edgeNodeIndices: [number, number][],\n edgeLinkIndices: number[],\n highlightSet: Map<string, number> | null,\n edgeOpacity: number,\n nodeCount: number,\n theme: ResolvedTheme\n): void {\n const colorAttr = edgesMesh.geometry.attributes.color;\n if (!colorAttr) return;\n\n const colorArr = colorAttr.array as Float32Array;\n const validCount = edgeNodeIndices.length;\n const tmpColor = new THREE.Color();\n const bgColor = new THREE.Color(theme.backgroundColor);\n\n for (let i = 0; i < validCount; i++) {\n const origIdx = edgeLinkIndices[i];\n const link = links[origIdx];\n const sId =\n typeof link?.source === \"object\" ? (link.source as any).id : link?.source;\n const tId =\n typeof link?.target === \"object\" ? (link.target as any).id : link?.target;\n\n if (!highlightSet) {\n tmpColor.set(theme.linkColor(link?.type));\n } else if (highlightSet.has(sId) && highlightSet.has(tId)) {\n const maxHopVal = Math.max(highlightSet.get(sId)!, highlightSet.get(tId)!);\n tmpColor.set(theme.linkColor(link?.type));\n if (maxHopVal <= 1) {\n if (theme.isLight) {\n tmpColor.multiplyScalar(0.55);\n } else {\n tmpColor.multiplyScalar(1.8);\n tmpColor.r = Math.min(tmpColor.r, 1);\n tmpColor.g = Math.min(tmpColor.g, 1);\n tmpColor.b = Math.min(tmpColor.b, 1);\n }\n } else if (maxHopVal === 2) {\n tmpColor.multiplyScalar(theme.isLight ? 0.8 : 1.2);\n }\n } else if (theme.isLight) {\n tmpColor.set(theme.linkColor(link?.type)).lerp(bgColor, 0.85);\n } else {\n tmpColor.setRGB(0.01, 0.01, 0.02);\n }\n\n colorArr[i * 6 + 0] = tmpColor.r;\n colorArr[i * 6 + 1] = tmpColor.g;\n colorArr[i * 6 + 2] = tmpColor.b;\n colorArr[i * 6 + 3] = tmpColor.r;\n colorArr[i * 6 + 4] = tmpColor.g;\n colorArr[i * 6 + 5] = tmpColor.b;\n }\n colorAttr.needsUpdate = true;\n\n // Adaptive edge opacity\n (edgesMesh.material as THREE.LineBasicMaterial).opacity = highlightSet\n ? Math.min(edgeOpacity * 1.5, 0.6)\n : nodeCount > 15000\n ? 0.08\n : nodeCount > 5000\n ? 0.12\n : edgeOpacity;\n}\n\n/** Create selection ring (double ring for strong visual) */\nexport function createSelectionRing(): THREE.Group {\n const group = new THREE.Group();\n\n const ringGeo = new THREE.RingGeometry(1.2, 1.5, 48);\n const ringMat = new THREE.MeshBasicMaterial({\n color: 0xffffff,\n transparent: true,\n opacity: 0.9,\n side: THREE.DoubleSide,\n depthWrite: false,\n });\n group.add(new THREE.Mesh(ringGeo, ringMat));\n\n const outerGeo = new THREE.RingGeometry(1.6, 2.2, 48);\n const outerMat = new THREE.MeshBasicMaterial({\n color: 0xffffff,\n transparent: true,\n opacity: 0.3,\n side: THREE.DoubleSide,\n depthWrite: false,\n });\n group.add(new THREE.Mesh(outerGeo, outerMat));\n\n group.visible = false;\n return group;\n}\n\n/** Update selection ring position and color */\nexport function updateSelectionRing(\n ring: THREE.Group,\n selectedNodeId: string | null,\n nodeIdToIndex: Map<string, number>,\n positions: Float32Array | null,\n scales: Float32Array | null,\n theme: ResolvedTheme,\n nodeType?: string\n): void {\n if (!selectedNodeId || !positions) {\n ring.visible = false;\n return;\n }\n\n const idx = nodeIdToIndex.get(selectedNodeId);\n if (idx === undefined || !scales) {\n ring.visible = false;\n return;\n }\n\n ring.position.set(\n positions[idx * 3],\n positions[idx * 3 + 1],\n positions[idx * 3 + 2]\n );\n const sc = scales[idx] * 1.6;\n ring.scale.set(sc, sc, sc);\n ring.visible = true;\n\n const ringColor = theme.nodeColorBright(nodeType);\n ring.children.forEach((child) => {\n (child as THREE.Mesh).material &&\n ((child as THREE.Mesh).material as THREE.MeshBasicMaterial).color.set(\n ringColor\n );\n });\n}\n","/**\n * Sprite-based label system with distance/val priority culling.\n * Uses a fixed pool of sprites to avoid per-frame allocation.\n */\nimport * as THREE from \"three\";\nimport type { GraphNode } from \"../types\";\nimport type { ResolvedTheme } from \"../themes/resolve-theme\";\n\nconst LABEL_UPDATE_MS = 250;\n\nexport interface LabelState {\n group: THREE.Group;\n sprites: THREE.Sprite[];\n textureCache: Map<string, { texture: THREE.CanvasTexture; aspect: number }>;\n lastUpdate: number;\n}\n\n/** Create the label sprite pool */\nexport function createLabelSystem(maxLabels: number): LabelState {\n const group = new THREE.Group();\n group.renderOrder = 999;\n const sprites: THREE.Sprite[] = [];\n\n for (let i = 0; i < maxLabels; i++) {\n const mat = new THREE.SpriteMaterial({\n transparent: true,\n depthWrite: false,\n depthTest: false,\n sizeAttenuation: true,\n opacity: 0,\n });\n const sprite = new THREE.Sprite(mat);\n sprite.visible = false;\n group.add(sprite);\n sprites.push(sprite);\n }\n\n return {\n group,\n sprites,\n textureCache: new Map(),\n lastUpdate: 0,\n };\n}\n\n/** Default label text extraction (matches original getLabelText) */\nfunction defaultLabelText(node: GraphNode): string {\n const label = node.label ?? node.id ?? \"\";\n // For repo-type nodes, extract the last path component (e.g. \"owner/repo\" → \"repo\")\n if (node.type === \"repo\" && label.includes(\"/\")) {\n return label.split(\"/\").pop()!;\n }\n return label.length > 30 ? label.substring(0, 27) + \"\\u2026\" : label;\n}\n\n/** Get or create a cached canvas texture for a label */\nfunction getOrCreateTexture(\n cache: LabelState[\"textureCache\"],\n nodeId: string,\n text: string,\n color: string\n): { texture: THREE.CanvasTexture; aspect: number } {\n if (cache.has(nodeId)) return cache.get(nodeId)!;\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\")!;\n const fontSize = 64;\n ctx.font = `bold ${fontSize}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif`;\n const metrics = ctx.measureText(text);\n const pw = Math.ceil(metrics.width) + 32;\n const ph = fontSize + 24;\n canvas.width = pw;\n canvas.height = ph;\n\n ctx.font = `bold ${fontSize}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.shadowColor = \"rgba(0,0,0,0.95)\";\n ctx.shadowBlur = 8;\n ctx.shadowOffsetY = 2;\n ctx.fillStyle = color;\n ctx.fillText(text, pw / 2, ph / 2);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.minFilter = THREE.LinearFilter;\n const aspect = pw / ph;\n const entry = { texture, aspect };\n cache.set(nodeId, entry);\n\n // Evict old entries if cache is too large\n if (cache.size > 500) {\n const iter = cache.keys();\n for (let i = 0; i < 100; i++) {\n const key = iter.next().value;\n if (key === undefined) break;\n const old = cache.get(key);\n if (old?.texture) old.texture.dispose();\n cache.delete(key);\n }\n }\n return entry;\n}\n\n/** Update visible labels based on camera distance and node priority */\nexport function updateLabels(\n state: LabelState,\n nodes: GraphNode[],\n positions: Float32Array | null,\n scales: Float32Array | null,\n camera: THREE.PerspectiveCamera,\n theme: ResolvedTheme,\n showLabels: boolean,\n labelScale: number,\n labelThreshold: number,\n maxLabels: number,\n labelFormatter?: (node: GraphNode) => string,\n highlightSet?: Map<string, number> | null,\n hidden?: Uint8Array | null\n): void {\n if (\n !positions ||\n nodes.length === 0 ||\n !showLabels\n ) {\n for (const sp of state.sprites) sp.visible = false;\n return;\n }\n\n const now = performance.now();\n if (now - state.lastUpdate < LABEL_UPDATE_MS) return;\n state.lastUpdate = now;\n\n const nc = nodes.length;\n const camPos = camera.position;\n const maxDist = 150 + labelThreshold * 3000;\n const maxDistSq = maxDist * maxDist;\n\n // Find candidate nodes within range\n // When a highlight set is active, only consider highlighted nodes\n const candidates: { idx: number; distSq: number; val: number }[] = [];\n for (let i = 0; i < nc; i++) {\n // Skip hidden (filtered-out) nodes\n if (hidden && hidden[i]) continue;\n // Skip non-highlighted nodes when selection is active\n if (highlightSet && !highlightSet.has(nodes[i].id)) continue;\n\n const dx = positions[i * 3] - camPos.x;\n const dy = positions[i * 3 + 1] - camPos.y;\n const dz = positions[i * 3 + 2] - camPos.z;\n const distSq = dx * dx + dy * dy + dz * dz;\n if (distSq < maxDistSq) {\n candidates.push({ idx: i, distSq, val: nodes[i].val ?? 1 });\n }\n }\n\n // Sort by priority: higher val + closer distance\n candidates.sort((a, b) => b.val / b.distSq - a.val / a.distSq);\n\n const count = Math.min(candidates.length, maxLabels);\n\n for (let i = 0; i < count; i++) {\n const c = candidates[i];\n const node = nodes[c.idx];\n const sprite = state.sprites[i];\n\n const text = labelFormatter ? labelFormatter(node) : defaultLabelText(node);\n const color = theme.nodeColorBright(node.type);\n const entry = getOrCreateTexture(state.textureCache, node.id, text, color);\n\n if (sprite.material.map !== entry.texture) {\n sprite.material.map = entry.texture;\n sprite.material.needsUpdate = true;\n }\n sprite.material.opacity = 0.9;\n\n const nodeScale = scales?.[c.idx] ?? 5;\n sprite.position.set(\n positions[c.idx * 3],\n positions[c.idx * 3 + 1] + nodeScale + 4,\n positions[c.idx * 3 + 2]\n );\n\n const baseH = 5 * labelScale;\n sprite.scale.set(baseH * entry.aspect, baseH, 1);\n sprite.visible = true;\n }\n\n // Hide unused sprites\n for (let i = count; i < state.sprites.length; i++) {\n state.sprites[i].visible = false;\n }\n}\n\n/** Dispose all label resources */\nexport function disposeLabelSystem(state: LabelState): void {\n for (const sp of state.sprites) {\n if (sp.material) (sp.material as THREE.SpriteMaterial).dispose();\n }\n for (const [, entry] of state.textureCache) {\n if (entry.texture) entry.texture.dispose();\n }\n state.textureCache.clear();\n}\n","/**\n * Keyboard-driven camera controls with two modes:\n *\n * **Orbit mode**:\n * z / x → zoom in / out (acceleration toward/away from target)\n * Arrow keys → orbit camera (rotate around target) — full 360°\n * Azimuth auto-corrects when camera is upside down (past 180° pitch).\n *\n * **Fly mode** (default):\n * Z / X → thrust forward / backward\n * A / D / ← / → → yaw (turn left / right)\n * W / S / ↑ / ↓ → pitch (up / down)\n * Inertia-based with friction decay.\n * Yaw direction auto-corrects when camera is upside down.\n *\n * Both modes use quaternion rotation for gimbal-lock-free movement.\n * Scoped to a container element — only responds when focused.\n */\nimport * as THREE from \"three\";\nimport type { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\n\nexport interface KeyboardControlState {\n /**\n * Called each frame. Returns true when keyboard is driving camera,\n * signalling the caller to skip OrbitControls.update().\n */\n update: () => boolean;\n cleanup: () => void;\n /** Update the fly speed multiplier at runtime */\n setFlySpeed: (speed: number) => void;\n /** Enable/disable keyboard camera control (disabled in 2D mode) */\n setEnabled: (enabled: boolean) => void;\n /** Switch control scheme at runtime (\"pan\" is used by 2D mode) */\n setMode: (mode: \"fly\" | \"orbit\" | \"pan\") => void;\n}\n\n/* ── Orbit mode constants (constant speed, no acceleration) ── */\nconst ORBIT_ROTATE_SPEED = 0.058;\nconst ORBIT_ZOOM_FACTOR = 0.015;\n\n/* ── Fly mode constants (constant speed, no acceleration) ── */\nconst FLY_THRUST_SPEED = 0.056;\nconst FLY_TURN_RATE = 0.041;\n\n// Reusable objects (avoid per-frame GC)\nconst _offset = new THREE.Vector3();\nconst _right = new THREE.Vector3();\nconst _q = new THREE.Quaternion();\nconst _dir = new THREE.Vector3();\nconst _worldUp = new THREE.Vector3(0, 1, 0);\n\n/* ── Pan mode constants (2D plane navigation) ── */\nconst PAN_SPEED = 0.02; // fraction of camera-target distance per frame\nconst PAN_ZOOM_FACTOR = 0.02;\n\n/* ── Pan mode: arrows/WASD pan in screen space, z/x dolly (2D mode) ── */\nfunction createPanUpdate(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n keys: Record<string, boolean>\n): () => boolean {\n const _panRight = new THREE.Vector3();\n const _panUp = new THREE.Vector3();\n const _panOffset = new THREE.Vector3();\n\n return function update(): boolean {\n let dx = 0;\n let dy = 0;\n if (keys[\"ArrowLeft\"] || keys[\"a\"] || keys[\"A\"]) dx -= 1;\n if (keys[\"ArrowRight\"] || keys[\"d\"] || keys[\"D\"]) dx += 1;\n if (keys[\"ArrowUp\"] || keys[\"w\"] || keys[\"W\"]) dy += 1;\n if (keys[\"ArrowDown\"] || keys[\"s\"] || keys[\"S\"]) dy -= 1;\n const zoomIn = keys[\"z\"] || keys[\"Z\"] || keys[\"+\"] || keys[\"=\"];\n const zoomOut = keys[\"x\"] || keys[\"X\"] || keys[\"-\"] || keys[\"_\"];\n\n if (!dx && !dy && !zoomIn && !zoomOut) return false;\n\n const target = controls.target as THREE.Vector3;\n const dist = camera.position.distanceTo(target);\n\n if (dx || dy) {\n // Screen-aligned pan: move camera + target along the camera's\n // local right/up axes so it stays intuitive when the plane is tilted.\n // controls.panSpeed carries the zoom-adaptive boost.\n const step = Math.max(dist, 50) * PAN_SPEED * (controls.panSpeed || 1);\n _panRight.setFromMatrixColumn(camera.matrix, 0);\n _panUp.setFromMatrixColumn(camera.matrix, 1);\n _panOffset\n .set(0, 0, 0)\n .addScaledVector(_panRight, dx * step)\n .addScaledVector(_panUp, dy * step);\n camera.position.add(_panOffset);\n target.add(_panOffset);\n }\n\n if (zoomIn || zoomOut) {\n const factor = zoomIn ? -PAN_ZOOM_FACTOR : PAN_ZOOM_FACTOR;\n _panOffset.copy(camera.position).sub(target);\n const newLen = Math.max(\n controls.minDistance,\n Math.min(controls.maxDistance, _panOffset.length() * (1 + factor))\n );\n _panOffset.setLength(newLen);\n camera.position.copy(target).add(_panOffset);\n }\n\n return true;\n };\n}\n\n/* ── Orbit mode (constant speed, no velocity/friction) ── */\nfunction createOrbitUpdate(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n keys: Record<string, boolean>\n): () => boolean {\n return function update(): boolean {\n let zoom = 0;\n let azimuth = 0;\n let polar = 0;\n\n if (keys[\"z\"] || keys[\"Z\"]) zoom -= ORBIT_ROTATE_SPEED;\n if (keys[\"x\"] || keys[\"X\"]) zoom += ORBIT_ROTATE_SPEED;\n if (keys[\"ArrowLeft\"]) azimuth -= ORBIT_ROTATE_SPEED;\n if (keys[\"ArrowRight\"]) azimuth += ORBIT_ROTATE_SPEED;\n if (keys[\"ArrowUp\"]) polar -= ORBIT_ROTATE_SPEED;\n if (keys[\"ArrowDown\"]) polar += ORBIT_ROTATE_SPEED;\n\n const hasMotion = zoom !== 0 || azimuth !== 0 || polar !== 0;\n if (!hasMotion) return false;\n\n const target = controls.target as THREE.Vector3;\n _offset.copy(camera.position).sub(target);\n let radius = _offset.length();\n\n if (zoom !== 0) {\n radius *= (1 + zoom * ORBIT_ZOOM_FACTOR * radius * 0.01);\n radius = Math.max(controls.minDistance, Math.min(controls.maxDistance, radius));\n }\n\n if (azimuth !== 0) {\n // When camera.up is flipped (past 180° pitch), rotating around the flipped\n // axis reverses the azimuth direction on screen — causing left/right inversion.\n // Flip the sign so orbit direction stays consistent regardless of orientation.\n const upDot = camera.up.dot(_worldUp);\n const azSign = upDot < 0 ? -1 : 1;\n _q.setFromAxisAngle(camera.up, -azimuth * azSign);\n _offset.applyQuaternion(_q);\n }\n\n if (polar !== 0) {\n _right.copy(_offset).normalize().cross(camera.up).normalize();\n if (_right.lengthSq() < 0.001) {\n _right.setFromMatrixColumn(camera.matrixWorld, 0);\n }\n _q.setFromAxisAngle(_right, polar);\n _offset.applyQuaternion(_q);\n camera.up.applyQuaternion(_q).normalize();\n }\n\n _offset.normalize().multiplyScalar(radius);\n camera.position.copy(target).add(_offset);\n camera.lookAt(target);\n controls.target.copy(target);\n\n return true;\n };\n}\n\n/* ── Fly mode (constant speed, no velocity/friction) ── */\nfunction createFlyUpdate(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n keys: Record<string, boolean>,\n state: { flySpeed: number }\n): () => boolean {\n return function update(): boolean {\n const speedMul = state.flySpeed;\n\n let thrust = 0;\n let yaw = 0;\n let pitch = 0;\n\n // Thrust (forward / backward along camera direction)\n if (keys[\"z\"] || keys[\"Z\"]) thrust += FLY_THRUST_SPEED * speedMul;\n if (keys[\"x\"] || keys[\"X\"]) thrust -= FLY_THRUST_SPEED * speedMul;\n\n // Yaw (left / right)\n if (keys[\"a\"] || keys[\"A\"] || keys[\"ArrowLeft\"]) yaw += FLY_TURN_RATE;\n if (keys[\"d\"] || keys[\"D\"] || keys[\"ArrowRight\"]) yaw -= FLY_TURN_RATE;\n\n // Pitch (up / down)\n if (keys[\"w\"] || keys[\"W\"] || keys[\"ArrowUp\"]) pitch += FLY_TURN_RATE;\n if (keys[\"s\"] || keys[\"S\"] || keys[\"ArrowDown\"]) pitch -= FLY_TURN_RATE;\n\n const hasMotion = thrust !== 0 || yaw !== 0 || pitch !== 0;\n if (!hasMotion) return false;\n\n // ── Yaw: rotate around world Y axis ──\n // When camera is upside-down (up·worldY < 0), invert yaw\n // so that \"left\" input always moves the view left on screen.\n if (yaw !== 0) {\n const upDot = camera.up.dot(_worldUp);\n const yawSign = upDot < 0 ? -1 : 1;\n _q.setFromAxisAngle(_worldUp, yaw * yawSign);\n camera.quaternion.premultiply(_q);\n camera.up.applyQuaternion(_q).normalize();\n }\n\n // ── Pitch: rotate around camera-local right axis ──\n if (pitch !== 0) {\n _right.setFromMatrixColumn(camera.matrixWorld, 0).normalize();\n _q.setFromAxisAngle(_right, pitch);\n camera.quaternion.premultiply(_q);\n camera.up.applyQuaternion(_q).normalize();\n }\n\n // ── Thrust: move along camera's forward direction ──\n if (thrust !== 0) {\n const lookDist = camera.position.distanceTo(controls.target as THREE.Vector3);\n const distScale = Math.max(0.3, lookDist * 0.003);\n camera.getWorldDirection(_dir);\n _dir.multiplyScalar(thrust * distScale * 100);\n camera.position.add(_dir);\n (controls.target as THREE.Vector3).add(_dir);\n }\n\n return true;\n };\n}\n\nexport function setupKeyboardControls(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n container: HTMLElement,\n mode: \"fly\" | \"orbit\" | \"pan\" = \"fly\",\n flySpeed: number = 1.0\n): KeyboardControlState {\n const keys: Record<string, boolean> = {};\n const state = { flySpeed };\n\n function onKeyDown(e: KeyboardEvent) {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return;\n keys[e.key] = true;\n }\n function onKeyUp(e: KeyboardEvent) {\n keys[e.key] = false;\n }\n function onBlur() {\n for (const k of Object.keys(keys)) keys[k] = false;\n }\n\n container.addEventListener(\"keydown\", onKeyDown);\n container.addEventListener(\"keyup\", onKeyUp);\n container.addEventListener(\"blur\", onBlur);\n\n let enabled = true;\n let currentMode: \"fly\" | \"orbit\" | \"pan\" = mode;\n const updaters: Record<\"fly\" | \"orbit\" | \"pan\", () => boolean> = {\n fly: createFlyUpdate(camera, controls, keys, state),\n orbit: createOrbitUpdate(camera, controls, keys),\n pan: createPanUpdate(camera, controls, keys),\n };\n const updateFn = () => (enabled ? updaters[currentMode]() : false);\n\n function cleanup() {\n container.removeEventListener(\"keydown\", onKeyDown);\n container.removeEventListener(\"keyup\", onKeyUp);\n container.removeEventListener(\"blur\", onBlur);\n }\n\n function setFlySpeed(speed: number) {\n state.flySpeed = speed;\n }\n\n function setEnabled(on: boolean) {\n enabled = on;\n if (!on) for (const k of Object.keys(keys)) keys[k] = false;\n }\n\n function setMode(m: \"fly\" | \"orbit\" | \"pan\") {\n currentMode = m;\n for (const k of Object.keys(keys)) keys[k] = false;\n }\n\n return { update: updateFn, cleanup, setFlySpeed, setEnabled, setMode };\n}\n","/**\n * Three.js scene initialization: scene, camera, renderer, controls, post-processing.\n */\nimport * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/examples/jsm/postprocessing/RenderPass.js\";\nimport { UnrealBloomPass } from \"three/examples/jsm/postprocessing/UnrealBloomPass.js\";\nimport type { NavigationConfig, RendererConfig, StyleConfig } from \"../types\";\nimport { createStarField } from \"./effects\";\nimport { createSelectionRing } from \"./selection\";\nimport {\n createLabelSystem,\n type LabelState,\n} from \"./label-system\";\nimport { setupKeyboardControls, type KeyboardControlState } from \"./keyboard\";\n\nexport interface SceneState {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n renderer: THREE.WebGLRenderer;\n controls: OrbitControls;\n stars: THREE.Points;\n selectionRing: THREE.Group;\n labels: LabelState;\n composer: EffectComposer | null;\n bloomPass: UnrealBloomPass | null;\n keyboard: KeyboardControlState;\n scrollCleanup: () => void;\n /** Mutable runtime flags shared with input handlers */\n flags: {\n is2D: boolean;\n keyboardMode3D: \"fly\" | \"orbit\";\n /** Pointer button that rotates via the trackball handler (null = off) */\n rotateButton: number | null;\n /** Base pan-speed multiplier (zoom-adaptive boost applies on top) */\n panSpeedBase: number;\n };\n}\n\nexport function createScene(\n container: HTMLElement,\n backgroundColor: string,\n style: Required<StyleConfig>,\n rendererConfig?: RendererConfig\n): SceneState {\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(backgroundColor);\n\n const w = container.clientWidth || 800;\n const h = container.clientHeight || 600;\n const camera = new THREE.PerspectiveCamera(60, w / h, 1, 50000);\n camera.position.set(0, 0, 800);\n\n const renderer = new THREE.WebGLRenderer({\n antialias: rendererConfig?.antialias ?? false,\n powerPreference: \"high-performance\",\n });\n renderer.setSize(w, h);\n renderer.setPixelRatio(\n Math.min(window.devicePixelRatio, rendererConfig?.pixelRatioMax ?? 1.5)\n );\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 1.2;\n\n const canvas = renderer.domElement;\n canvas.style.setProperty(\"display\", \"block\", \"important\");\n // Block native HTML5 drag / text-selection from hijacking pointer drags\n // (otherwise the browser can flip the cursor to \"no-drop\" mid-drag and\n // swallow the pan/rotate gesture).\n canvas.draggable = false;\n canvas.style.userSelect = \"none\";\n canvas.style.setProperty(\"-webkit-user-drag\", \"none\");\n canvas.style.touchAction = \"none\";\n const onDragStart = (e: DragEvent) => e.preventDefault();\n canvas.addEventListener(\"dragstart\", onDragStart);\n const onSelectStart = (e: Event) => e.preventDefault();\n canvas.addEventListener(\"selectstart\", onSelectStart);\n container.appendChild(canvas);\n\n const controls = new OrbitControls(camera, canvas);\n controls.enableDamping = true;\n controls.dampingFactor = 0.12;\n controls.rotateSpeed = 0.5;\n controls.zoomSpeed = 1.2;\n controls.minDistance = 10;\n controls.maxDistance = 30000;\n // Pan always follows the screen axes — with world-plane panning a\n // vertical drag on a head-on camera degenerates into a dolly (reads\n // as an unwanted zoom).\n controls.screenSpacePanning = true;\n\n // Ambient light\n scene.add(new THREE.AmbientLight(0xffffff, 0.8));\n\n // Star field\n const stars = createStarField(4000, 8000);\n stars.visible = style.starField;\n scene.add(stars);\n\n // Selection ring\n const selectionRing = createSelectionRing();\n scene.add(selectionRing);\n\n // Labels\n const labels = createLabelSystem(style.maxLabels);\n scene.add(labels.group);\n\n // Keyboard controls — scoped to container (default: fly mode, matching original)\n const cameraMode = rendererConfig?.cameraMode ?? \"fly\";\n const keyboard = setupKeyboardControls(camera, controls, container, cameraMode, style.flySpeed ?? 1.0);\n\n // Custom scroll handler: linear zoom without acceleration/inertia.\n // Moves camera + target along look direction, proportional to scroll delta.\n // In 2D mode OrbitControls handles wheel + pinch itself (enableZoom).\n controls.enableZoom = false;\n const flags: SceneState[\"flags\"] = {\n is2D: false,\n keyboardMode3D: cameraMode,\n rotateButton: null,\n panSpeedBase: 1,\n };\n const _wheelOffset = new THREE.Vector3();\n const onWheel = (e: WheelEvent) => {\n if (flags.is2D) return;\n e.preventDefault();\n let delta = -e.deltaY;\n if (e.deltaMode === 1) delta *= 40; // line → pixels\n if (e.deltaMode === 2) delta *= 800; // page → pixels\n // Dolly toward the orbit target WITHOUT moving it — the target is the\n // rotation pivot and must stay on what the user is looking at\n // (dragging it through the scene made later rotations swing wildly).\n const target = controls.target as THREE.Vector3;\n _wheelOffset.copy(camera.position).sub(target);\n const dist = _wheelOffset.length();\n const moveAmount = delta * 0.002 * Math.max(dist * 0.1, 1);\n const newDist = Math.min(\n Math.max(dist - moveAmount, controls.minDistance),\n controls.maxDistance\n );\n _wheelOffset.setLength(newDist);\n camera.position.copy(target).add(_wheelOffset);\n };\n canvas.addEventListener(\"wheel\", onWheel, { passive: false });\n\n // Trackball rotation: screen-relative axes through the orbit target.\n // OrbitControls always yaws around world-Y, which feels wrong once the\n // view is tilted — the rotation axes must come from the CURRENT view.\n const trackballCleanup = setupTrackballRotation(canvas, camera, controls, flags);\n const scrollCleanup = () => {\n canvas.removeEventListener(\"wheel\", onWheel);\n canvas.removeEventListener(\"dragstart\", onDragStart);\n canvas.removeEventListener(\"selectstart\", onSelectStart);\n trackballCleanup();\n };\n\n return {\n scene,\n camera,\n renderer,\n controls,\n stars,\n selectionRing,\n labels,\n composer: null,\n bloomPass: null,\n keyboard,\n scrollCleanup,\n flags,\n };\n}\n\n/** Radians of rotation per pixel of pointer travel */\nconst TRACKBALL_SPEED = 0.004;\n\n/**\n * Screen-relative (trackball) rotation around the orbit target.\n * Horizontal drag spins around the camera's up axis, vertical drag\n * around its right axis — the axes are rebuilt from the current view\n * every move, so rotation always matches what the user sees.\n */\nfunction setupTrackballRotation(\n canvas: HTMLCanvasElement,\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n flags: SceneState[\"flags\"]\n): () => void {\n let rotating = false;\n let lastX = 0;\n let lastY = 0;\n const _offset = new THREE.Vector3();\n const _right = new THREE.Vector3();\n const _upAxis = new THREE.Vector3();\n const _q = new THREE.Quaternion();\n const _qPitch = new THREE.Quaternion();\n\n function onDown(e: PointerEvent) {\n if (flags.rotateButton == null || e.button !== flags.rotateButton) return;\n rotating = true;\n lastX = e.clientX;\n lastY = e.clientY;\n try {\n canvas.setPointerCapture(e.pointerId);\n } catch {\n /* capture unsupported */\n }\n }\n\n function onMove(e: PointerEvent) {\n if (!rotating) return;\n const dx = e.clientX - lastX;\n const dy = e.clientY - lastY;\n lastX = e.clientX;\n lastY = e.clientY;\n if (!dx && !dy) return;\n\n const target = controls.target as THREE.Vector3;\n _offset.copy(camera.position).sub(target);\n _right.setFromMatrixColumn(camera.matrix, 0);\n _upAxis.setFromMatrixColumn(camera.matrix, 1);\n _q.setFromAxisAngle(_upAxis, -dx * TRACKBALL_SPEED);\n _qPitch.setFromAxisAngle(_right, -dy * TRACKBALL_SPEED);\n _q.multiply(_qPitch);\n _offset.applyQuaternion(_q);\n camera.up.applyQuaternion(_q).normalize();\n camera.position.copy(target).add(_offset);\n camera.lookAt(target);\n }\n\n function onUp(e: PointerEvent) {\n if (!rotating) return;\n rotating = false;\n try {\n canvas.releasePointerCapture(e.pointerId);\n } catch {\n /* not captured */\n }\n }\n\n canvas.addEventListener(\"pointerdown\", onDown);\n canvas.addEventListener(\"pointermove\", onMove);\n canvas.addEventListener(\"pointerup\", onUp);\n canvas.addEventListener(\"pointercancel\", onUp);\n return () => {\n canvas.removeEventListener(\"pointerdown\", onDown);\n canvas.removeEventListener(\"pointermove\", onMove);\n canvas.removeEventListener(\"pointerup\", onUp);\n canvas.removeEventListener(\"pointercancel\", onUp);\n };\n}\n\n/**\n * Apply the navigation scheme for the current layout dimensionality,\n * honouring per-consumer overrides. Defaults — 3D: left=rotate,\n * right=pan, keyboard=cameraMode; 2D: left=pan, right=rotate,\n * keyboard=\"pan\" (and the camera snaps to face the z=0 plane head-on).\n */\nexport function applyNavigationMode(\n state: SceneState,\n is2D: boolean,\n nav?: NavigationConfig\n): void {\n const { controls, camera, keyboard } = state;\n state.flags.is2D = is2D;\n\n const left = nav?.leftButton ?? (is2D ? \"pan\" : \"rotate\");\n const right = nav?.rightButton ?? (is2D ? \"rotate\" : \"pan\");\n // Rotation is handled by the screen-relative trackball handler — the\n // rotate button maps to NONE in OrbitControls so only pan/dolly remain.\n const NONE = -1 as unknown as THREE.MOUSE;\n controls.mouseButtons = {\n LEFT: left === \"pan\" ? THREE.MOUSE.PAN : NONE,\n MIDDLE: THREE.MOUSE.DOLLY,\n RIGHT: right === \"pan\" ? THREE.MOUSE.PAN : NONE,\n };\n controls.enableRotate = false;\n state.flags.rotateButton =\n left === \"rotate\" ? 0 : right === \"rotate\" ? 2 : null;\n controls.touches =\n left === \"pan\"\n ? { ONE: THREE.TOUCH.PAN, TWO: THREE.TOUCH.DOLLY_PAN }\n : { ONE: THREE.TOUCH.ROTATE, TWO: THREE.TOUCH.DOLLY_PAN };\n // 2D uses OrbitControls dolly (wheel + pinch); 3D keeps the custom\n // linear wheel handler registered in createScene.\n controls.enableZoom = is2D;\n controls.screenSpacePanning = true;\n\n state.flags.panSpeedBase = nav?.panSpeed ?? 1;\n controls.panSpeed = state.flags.panSpeedBase;\n\n const kb = nav?.keyboard ?? (is2D ? \"pan\" : state.flags.keyboardMode3D);\n if (kb === \"off\") {\n keyboard.setEnabled(false);\n } else {\n keyboard.setEnabled(true);\n keyboard.setMode(kb);\n }\n\n if (is2D) {\n // Snap to a head-on view of the plane, keeping the current distance\n const t = controls.target as THREE.Vector3;\n const dist = Math.max(camera.position.distanceTo(t), 50);\n t.z = 0;\n camera.up.set(0, 1, 0);\n camera.position.set(t.x, t.y, dist);\n camera.lookAt(t);\n }\n controls.update();\n}\n\n/** Initialize bloom post-processing */\nexport function initBloom(\n state: SceneState,\n nodeCount: number,\n style: Required<StyleConfig>\n): void {\n if (state.composer) return;\n try {\n const { renderer, scene, camera } = state;\n const composer = new EffectComposer(renderer);\n composer.addPass(new RenderPass(scene, camera));\n const bloomRes = nodeCount > 30000 ? 3 : nodeCount > 10000 ? 2 : 1.5;\n const bloom = new UnrealBloomPass(\n new THREE.Vector2(\n renderer.domElement.width / bloomRes,\n renderer.domElement.height / bloomRes\n ),\n style.bloomStrength,\n style.bloomRadius,\n style.bloomThreshold\n );\n composer.addPass(bloom);\n state.composer = composer;\n state.bloomPass = bloom;\n } catch (_) {\n // Bloom not supported — fallback to regular render\n }\n}\n\n/** Start the animation loop, returns cancel function */\nexport function startAnimationLoop(\n state: SceneState,\n onTick?: () => void\n): () => void {\n let animFrame: number;\n let wasKeyboardActive = false;\n const _syncDir = new THREE.Vector3();\n\n function animate() {\n animFrame = requestAnimationFrame(animate);\n // When keyboard is driving camera, skip OrbitControls.update()\n // to prevent its polar angle clamping from overriding our rotation\n const keyboardActive = state.keyboard.update();\n\n // When keyboard navigation just stopped, sync OrbitControls to\n // current camera state so the view doesn't snap back.\n if (wasKeyboardActive && !keyboardActive) {\n const dist = state.camera.position.distanceTo(\n state.controls.target as THREE.Vector3\n );\n state.camera.getWorldDirection(_syncDir);\n (state.controls.target as THREE.Vector3)\n .copy(state.camera.position)\n .add(_syncDir.multiplyScalar(dist));\n // Reset up to world-Y so OrbitControls works correctly\n state.camera.up.set(0, 1, 0);\n state.camera.lookAt(state.controls.target as THREE.Vector3);\n }\n wasKeyboardActive = keyboardActive;\n\n if (!keyboardActive) state.controls.update();\n\n if (state.selectionRing.visible) {\n state.selectionRing.quaternion.copy(state.camera.quaternion);\n }\n\n onTick?.();\n\n if (state.composer) {\n state.composer.render();\n } else {\n state.renderer.render(state.scene, state.camera);\n }\n }\n animate();\n\n return () => cancelAnimationFrame(animFrame);\n}\n\n/** Set up resize observer for the container */\nexport function setupResize(\n container: HTMLElement,\n state: SceneState\n): ResizeObserver {\n const observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n if (width === 0 || height === 0) return;\n state.camera.aspect = width / height;\n state.camera.updateProjectionMatrix();\n state.renderer.setSize(width, height);\n if (state.composer) state.composer.setSize(width, height);\n });\n observer.observe(container);\n return observer;\n}\n","/**\n * Node rendering: InstancedMesh with custom celestial body shader.\n * All nodes are rendered in a single GPU draw call.\n */\nimport * as THREE from \"three\";\nimport type { GraphNode } from \"../types\";\nimport type { ResolvedTheme } from \"../themes/resolve-theme\";\n\n/** Vertex shader: instance transform + color passthrough */\nconst NODE_VERTEX_SHADER = /* glsl */ `\n varying vec3 vNormal;\n varying vec3 vViewDir;\n varying vec3 vColor;\n\n void main() {\n vColor = vec3(1.0);\n #ifdef USE_INSTANCING_COLOR\n vColor = instanceColor;\n #endif\n\n vec4 localPos = vec4(position, 1.0);\n #ifdef USE_INSTANCING\n localPos = instanceMatrix * localPos;\n #endif\n vec4 mvPosition = modelViewMatrix * localPos;\n\n vec3 n = normal;\n #ifdef USE_INSTANCING\n n = mat3(instanceMatrix) * n;\n #endif\n vNormal = normalize(normalMatrix * n);\n vViewDir = normalize(-mvPosition.xyz);\n\n gl_Position = projectionMatrix * mvPosition;\n }\n`;\n\n/** Fragment shader: Fresnel rim glow + subsurface scatter */\nconst NODE_FRAGMENT_SHADER = /* glsl */ `\n uniform float uGlowIntensity;\n varying vec3 vNormal;\n varying vec3 vViewDir;\n varying vec3 vColor;\n\n void main() {\n vec3 n = normalize(vNormal);\n vec3 v = normalize(vViewDir);\n float NdotV = max(dot(n, v), 0.0);\n\n // Fresnel rim glow\n float fresnel = pow(1.0 - NdotV, 3.0);\n // Core gradient — brighter center\n float core = smoothstep(0.0, 1.0, NdotV);\n // Soft directional light\n vec3 lightDir = normalize(vec3(0.4, 0.8, 0.6));\n float diffuse = max(dot(n, lightDir), 0.0) * 0.25 + 0.75;\n\n // Color composition\n vec3 baseColor = vColor;\n vec3 centerColor = mix(baseColor, vec3(1.0), 0.35);\n vec3 edgeColor = baseColor * 1.3;\n vec3 bodyColor = mix(edgeColor, centerColor, core) * diffuse;\n\n // Rim glow (bloom picks this up for halo)\n vec3 rimColor = (baseColor + vec3(0.25)) * 1.6;\n // Subsurface scatter approximation\n float scatter = pow(NdotV, 0.4) * 0.15;\n\n vec3 color = bodyColor * 0.85;\n color += rimColor * fresnel * 0.7;\n color += baseColor * scatter;\n color *= uGlowIntensity;\n\n gl_FragColor = vec4(color, 1.0);\n }\n`;\n\nexport interface NodeMeshResult {\n mesh: THREE.InstancedMesh;\n material: THREE.ShaderMaterial;\n scales: Float32Array;\n}\n\n/** Compute node scales from val range */\nexport function computeNodeScales(\n nodes: GraphNode[],\n minSize: number,\n maxSize: number\n): Float32Array {\n const nc = nodes.length;\n let vMin = Infinity, vMax = -Infinity;\n for (const n of nodes) {\n const v = n.val ?? 1;\n if (v < vMin) vMin = v;\n if (v > vMax) vMax = v;\n }\n if (!isFinite(vMin)) vMin = 1;\n if (!isFinite(vMax)) vMax = 1;\n\n const scales = new Float32Array(nc);\n for (let i = 0; i < nc; i++) {\n const raw = nodes[i].val ?? 1;\n const t = vMax > vMin ? (raw - vMin) / (vMax - vMin) : 0;\n scales[i] = minSize + t * (maxSize - minSize);\n }\n return scales;\n}\n\n/** Create the InstancedMesh for all nodes */\nexport function createNodeMesh(\n nodes: GraphNode[],\n scales: Float32Array,\n theme: ResolvedTheme\n): NodeMeshResult {\n const nc = nodes.length;\n\n // Adaptive geometry quality\n const segments = nc > 50000 ? 8 : nc > 15000 ? 12 : 16;\n const rings = nc > 50000 ? 6 : nc > 15000 ? 8 : 12;\n const sphereGeo = new THREE.SphereGeometry(1, segments, rings);\n\n const material = new THREE.ShaderMaterial({\n uniforms: { uGlowIntensity: { value: 1.0 } },\n vertexShader: NODE_VERTEX_SHADER,\n fragmentShader: NODE_FRAGMENT_SHADER,\n transparent: false,\n depthWrite: true,\n });\n\n const mesh = new THREE.InstancedMesh(sphereGeo, material, nc);\n mesh.instanceMatrix.setUsage(THREE.DynamicDrawUsage);\n\n // Set initial colors from theme\n const tmpColor = new THREE.Color();\n for (let i = 0; i < nc; i++) {\n tmpColor.set(theme.nodeColor(nodes[i].type));\n mesh.setColorAt(i, tmpColor);\n }\n mesh.instanceColor!.needsUpdate = true;\n\n // Set initial random positions\n const tmpMatrix = new THREE.Matrix4();\n const tmpQuat = new THREE.Quaternion();\n const tmpPos = new THREE.Vector3();\n const tmpScale = new THREE.Vector3();\n for (let i = 0; i < nc; i++) {\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n const r = 100 + Math.random() * 300;\n tmpPos.set(\n r * Math.sin(phi) * Math.cos(theta),\n r * Math.sin(phi) * Math.sin(theta),\n r * Math.cos(phi)\n );\n const sc = scales[i];\n tmpScale.set(sc, sc, sc);\n tmpMatrix.compose(tmpPos, tmpQuat, tmpScale);\n mesh.setMatrixAt(i, tmpMatrix);\n }\n mesh.instanceMatrix.needsUpdate = true;\n mesh.computeBoundingSphere();\n\n return { mesh, material, scales };\n}\n\n/** Update instance matrices from position array */\nexport function updateNodePositions(\n mesh: THREE.InstancedMesh,\n positions: Float32Array,\n scales: Float32Array,\n nodeCount: number,\n hidden?: Uint8Array | null\n): void {\n const pos = new THREE.Vector3();\n const scale = new THREE.Vector3();\n const quat = new THREE.Quaternion();\n const mat = new THREE.Matrix4();\n\n for (let i = 0; i < nodeCount; i++) {\n pos.set(positions[i * 3], positions[i * 3 + 1], positions[i * 3 + 2]);\n // Hidden nodes collapse to near-zero scale: invisible, un-raycastable,\n // but the instance stays allocated so indices never shift and the\n // layout keeps running — showing them again is just a matrix update.\n const sc = hidden && hidden[i] ? 1e-4 : scales[i];\n scale.set(sc, sc, sc);\n mat.compose(pos, quat, scale);\n mesh.setMatrixAt(i, mat);\n }\n mesh.instanceMatrix.needsUpdate = true;\n mesh.computeBoundingSphere();\n}\n","/**\n * Edge rendering: LineSegments with per-edge coloring.\n * All edges rendered in a single GPU draw call.\n */\nimport * as THREE from \"three\";\nimport type { GraphLink } from \"../types\";\nimport type { ResolvedTheme } from \"../themes/resolve-theme\";\n\nexport interface EdgeMeshResult {\n mesh: THREE.LineSegments;\n geometry: THREE.BufferGeometry;\n positionArray: Float32Array;\n colorArray: Float32Array;\n /** Maps valid edge index → [sourceNodeIdx, targetNodeIdx] */\n edgeNodeIndices: [number, number][];\n /** Maps valid edge index → original link index */\n edgeLinkIndices: number[];\n}\n\n/**\n * Build edge index mappings:\n * - edgeNodeIndices: [srcIdx, tgtIdx] for each valid edge\n * - edgeLinkIndices: original link index for each valid edge\n */\nexport function buildEdgeMappings(\n links: GraphLink[],\n nodeIdToIndex: Map<string, number>\n): { edgeNodeIndices: [number, number][]; edgeLinkIndices: number[] } {\n const edgeNodeIndices: [number, number][] = [];\n const edgeLinkIndices: number[] = [];\n\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n const si = nodeIdToIndex.get(\n typeof link.source === \"object\"\n ? (link.source as any).id\n : link.source\n );\n const ti = nodeIdToIndex.get(\n typeof link.target === \"object\"\n ? (link.target as any).id\n : link.target\n );\n if (si !== undefined && ti !== undefined) {\n edgeNodeIndices.push([si, ti]);\n edgeLinkIndices.push(i);\n }\n }\n\n return { edgeNodeIndices, edgeLinkIndices };\n}\n\n/** Create LineSegments mesh for all edges */\nexport function createEdgeMesh(\n links: GraphLink[],\n edgeNodeIndices: [number, number][],\n edgeLinkIndices: number[],\n nodeCount: number,\n edgeOpacity: number,\n theme: ResolvedTheme\n): EdgeMeshResult {\n const validEdgeCount = edgeNodeIndices.length;\n const positionArray = new Float32Array(validEdgeCount * 6);\n const colorArray = new Float32Array(validEdgeCount * 6);\n\n const tmpC = new THREE.Color();\n for (let i = 0; i < validEdgeCount; i++) {\n const origIdx = edgeLinkIndices[i];\n tmpC.set(theme.linkColor(links[origIdx]?.type));\n colorArray[i * 6 + 0] = tmpC.r;\n colorArray[i * 6 + 1] = tmpC.g;\n colorArray[i * 6 + 2] = tmpC.b;\n colorArray[i * 6 + 3] = tmpC.r;\n colorArray[i * 6 + 4] = tmpC.g;\n colorArray[i * 6 + 5] = tmpC.b;\n }\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\n \"position\",\n new THREE.BufferAttribute(positionArray, 3).setUsage(THREE.DynamicDrawUsage)\n );\n geometry.setAttribute(\n \"color\",\n new THREE.BufferAttribute(colorArray, 3).setUsage(THREE.DynamicDrawUsage)\n );\n\n const adaptiveOpacity =\n nodeCount > 15000 ? 0.1 : nodeCount > 5000 ? 0.15 : edgeOpacity;\n\n const material = new THREE.LineBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: adaptiveOpacity,\n depthWrite: false,\n blending: theme.additiveEdges ? THREE.AdditiveBlending : THREE.NormalBlending,\n });\n\n const mesh = new THREE.LineSegments(geometry, material);\n\n return {\n mesh,\n geometry,\n positionArray,\n colorArray,\n edgeNodeIndices,\n edgeLinkIndices,\n };\n}\n\n/** Update edge endpoint positions from node position array */\nexport function updateEdgePositions(\n positionArray: Float32Array,\n nodePositions: Float32Array,\n edgeNodeIndices: [number, number][],\n geometry: THREE.BufferGeometry,\n hiddenEdges?: Uint8Array | null\n): void {\n const count = edgeNodeIndices.length;\n for (let i = 0; i < count; i++) {\n const [si, ti] = edgeNodeIndices[i];\n if (hiddenEdges && hiddenEdges[i]) {\n // Collapse to a zero-length segment at the source node: rasterizes\n // to nothing, keeps the buffer layout stable (no index shifting).\n positionArray[i * 6 + 0] = nodePositions[si * 3];\n positionArray[i * 6 + 1] = nodePositions[si * 3 + 1];\n positionArray[i * 6 + 2] = nodePositions[si * 3 + 2];\n positionArray[i * 6 + 3] = nodePositions[si * 3];\n positionArray[i * 6 + 4] = nodePositions[si * 3 + 1];\n positionArray[i * 6 + 5] = nodePositions[si * 3 + 2];\n continue;\n }\n positionArray[i * 6 + 0] = nodePositions[si * 3];\n positionArray[i * 6 + 1] = nodePositions[si * 3 + 1];\n positionArray[i * 6 + 2] = nodePositions[si * 3 + 2];\n positionArray[i * 6 + 3] = nodePositions[ti * 3];\n positionArray[i * 6 + 4] = nodePositions[ti * 3 + 1];\n positionArray[i * 6 + 5] = nodePositions[ti * 3 + 2];\n }\n geometry.attributes.position.needsUpdate = true;\n geometry.computeBoundingSphere();\n}\n","/**\n * Camera animation and control utilities.\n */\nimport * as THREE from \"three\";\nimport type { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\n\nexport interface CameraTarget {\n x: number;\n y: number;\n z: number;\n}\n\n/** Smoothly animate camera to a new position/target using ease-out */\nexport function animateCamera(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n targetPos: CameraTarget,\n targetLookAt: CameraTarget,\n duration: number\n): void {\n const startPos = camera.position.clone();\n const startTarget = (controls.target as THREE.Vector3).clone();\n const endPos = new THREE.Vector3(targetPos.x, targetPos.y, targetPos.z);\n const endTarget = new THREE.Vector3(\n targetLookAt.x,\n targetLookAt.y,\n targetLookAt.z\n );\n const start = performance.now();\n\n function step() {\n const t = Math.min((performance.now() - start) / duration, 1);\n const ease = t * (2 - t); // ease-out quadratic\n camera.position.lerpVectors(startPos, endPos, ease);\n (controls.target as THREE.Vector3).lerpVectors(startTarget, endTarget, ease);\n controls.update();\n if (t < 1) requestAnimationFrame(step);\n }\n requestAnimationFrame(step);\n}\n\n/** Compute camera position to fit all nodes in view */\nexport function zoomToFitPositions(\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n positions: Float32Array,\n duration: number,\n padding: number\n): void {\n const count = positions.length / 3;\n if (count === 0) return;\n\n // Fit doubles as \"reset view\": level the horizon (trackball roll)\n camera.up.set(0, 1, 0);\n\n // Compute centroid\n let cx = 0, cy = 0, cz = 0;\n for (let i = 0; i < count; i++) {\n cx += positions[i * 3];\n cy += positions[i * 3 + 1];\n cz += positions[i * 3 + 2];\n }\n cx /= count;\n cy /= count;\n cz /= count;\n\n // Compute bounding sphere radius from centroid\n let maxR = 0;\n for (let i = 0; i < count; i++) {\n const dx = positions[i * 3] - cx;\n const dy = positions[i * 3 + 1] - cy;\n const dz = positions[i * 3 + 2] - cz;\n const r = dx * dx + dy * dy + dz * dz;\n if (r > maxR) maxR = r;\n }\n maxR = Math.sqrt(maxR);\n\n const fov = (camera.fov * Math.PI) / 180;\n const dist = (maxR + padding) / Math.sin(fov / 2);\n\n animateCamera(\n camera,\n controls,\n { x: cx, y: cy, z: cz + dist },\n { x: cx, y: cy, z: cz },\n duration\n );\n}\n","/**\n * User interaction: raycasting for click/double-click on instanced nodes,\n * context menu, edge hover/click, and node dragging.\n */\nimport * as THREE from \"three\";\nimport type { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\nimport type { GraphNode, GraphLink } from \"../types\";\nimport { animateCamera } from \"./camera\";\n\nexport interface InteractionCallbacks {\n onNodeClick: (node: GraphNode | null) => void;\n onNodeDoubleClick?: (node: GraphNode) => void;\n onNodeHover?: (node: GraphNode | null) => void;\n onContextMenu?: (node: GraphNode, position: { x: number; y: number }) => void;\n onLinkClick?: (link: GraphLink) => void;\n onLinkHover?: (link: GraphLink | null) => void;\n onNodeDrag?: (node: GraphNode, position: { x: number; y: number; z: number }) => void;\n onNodeDragEnd?: (node: GraphNode, position: { x: number; y: number; z: number }) => void;\n}\n\nexport interface InteractionOptions {\n /** When false, single-click selects without flying the camera */\n getClickToFocus?: () => boolean;\n /** 2D mode: click-focus pans in-plane instead of orbit-framing */\n getIs2D?: () => boolean;\n /**\n * When false, pointer-down on a node never starts a node drag, so\n * left-drag always reaches the camera controls (pan/rotate). Essential\n * for dense graphs where nearly every pixel raycasts to a node.\n */\n getNodeDragEnabled?: () => boolean;\n}\n\nexport interface InteractionState {\n cleanup: () => void;\n}\n\n/** Screen-space distance threshold for edge hit testing */\nconst EDGE_HIT_THRESHOLD = 5;\n\n/**\n * Set up click/double-click/context-menu/drag interaction on the graph canvas.\n * The container element receives focus on interaction so that\n * keyboard controls (scoped to the container) work correctly.\n * Returns a cleanup function to remove event listeners.\n */\nexport function setupInteraction(\n canvas: HTMLCanvasElement,\n camera: THREE.PerspectiveCamera,\n controls: OrbitControls,\n getNodesMesh: () => THREE.InstancedMesh | null,\n getNodes: () => GraphNode[],\n callbacks: InteractionCallbacks,\n container?: HTMLElement,\n getEdgeData?: () => {\n links: GraphLink[];\n edgeNodeIndices: [number, number][];\n edgeLinkIndices: number[];\n positions: Float32Array | null;\n } | null,\n options?: InteractionOptions\n): InteractionState {\n const raycaster = new THREE.Raycaster();\n const mouse = new THREE.Vector2();\n let mouseDownPos: { x: number; y: number } | null = null;\n let lastClickTime = 0;\n let lastClickNodeId: string | null = null;\n let singleClickTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Drag state\n let dragNode: GraphNode | null = null;\n let dragNodeIdx = -1;\n let isDragging = false;\n const dragPlane = new THREE.Plane();\n const dragIntersect = new THREE.Vector3();\n\n function onPointerDown(e: PointerEvent) {\n mouseDownPos = { x: e.clientX, y: e.clientY };\n // Focus the container so keyboard controls (scoped to it) become active\n if (container && document.activeElement !== container) {\n container.focus({ preventScroll: true });\n }\n\n // Check for node hit for potential drag\n if (callbacks.onNodeDrag && (options?.getNodeDragEnabled?.() ?? true)) {\n const nodesMesh = getNodesMesh();\n if (nodesMesh) {\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n raycaster.setFromCamera(mouse, camera);\n const hits = raycaster.intersectObject(nodesMesh);\n if (hits.length > 0 && hits[0].instanceId != null) {\n const nodes = getNodes();\n dragNode = nodes[hits[0].instanceId] ?? null;\n dragNodeIdx = hits[0].instanceId;\n }\n }\n }\n }\n\n function onPointerMove(e: PointerEvent) {\n // Node drag handling\n if (dragNode && mouseDownPos && callbacks.onNodeDrag) {\n const dx = Math.abs(e.clientX - mouseDownPos.x);\n const dy = Math.abs(e.clientY - mouseDownPos.y);\n if (dx + dy > 5) {\n isDragging = true;\n controls.enabled = false;\n\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n\n // Project onto plane perpendicular to camera at node position\n const nodePos = new THREE.Vector3(\n (dragNode as any).x ?? 0,\n (dragNode as any).y ?? 0,\n (dragNode as any).z ?? 0\n );\n dragPlane.setFromNormalAndCoplanarPoint(\n camera.getWorldDirection(new THREE.Vector3()).negate(),\n nodePos\n );\n raycaster.setFromCamera(mouse, camera);\n if (raycaster.ray.intersectPlane(dragPlane, dragIntersect)) {\n callbacks.onNodeDrag(dragNode, {\n x: dragIntersect.x,\n y: dragIntersect.y,\n z: dragIntersect.z,\n });\n }\n return;\n }\n }\n\n // Hover raycasting (nodes)\n if (!callbacks.onNodeHover && !callbacks.onLinkHover) return;\n const nodesMesh = getNodesMesh();\n if (!nodesMesh) return;\n\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n raycaster.setFromCamera(mouse, camera);\n\n const hits = raycaster.intersectObject(nodesMesh);\n if (hits.length > 0 && hits[0].instanceId != null) {\n const nodes = getNodes();\n const node = nodes[hits[0].instanceId];\n if (node && node.id !== lastHoveredId) {\n lastHoveredId = node.id;\n lastHoveredLinkIdx = -1;\n canvas.style.cursor = \"pointer\";\n callbacks.onNodeHover?.(node);\n callbacks.onLinkHover?.(null);\n }\n } else {\n if (lastHoveredId !== null) {\n lastHoveredId = null;\n canvas.style.cursor = \"default\";\n callbacks.onNodeHover?.(null);\n }\n\n // Edge hover if no node hit\n if (callbacks.onLinkHover && getEdgeData) {\n const edgeData = getEdgeData();\n if (edgeData?.positions) {\n const hitLink = findNearestEdge(\n e.clientX, e.clientY, rect, camera, edgeData as { links: GraphLink[]; edgeNodeIndices: [number, number][]; edgeLinkIndices: number[]; positions: Float32Array }\n );\n if (hitLink) {\n if (lastHoveredLinkIdx !== hitLink.index) {\n lastHoveredLinkIdx = hitLink.index;\n canvas.style.cursor = \"pointer\";\n callbacks.onLinkHover(hitLink.link);\n }\n } else if (lastHoveredLinkIdx !== -1) {\n lastHoveredLinkIdx = -1;\n canvas.style.cursor = \"default\";\n callbacks.onLinkHover(null);\n }\n }\n }\n }\n }\n\n function onPointerUp(e: PointerEvent) {\n // Handle drag end\n if (isDragging && dragNode && callbacks.onNodeDragEnd) {\n callbacks.onNodeDragEnd(dragNode, {\n x: (dragNode as any).x ?? 0,\n y: (dragNode as any).y ?? 0,\n z: (dragNode as any).z ?? 0,\n });\n }\n if (isDragging) {\n isDragging = false;\n dragNode = null;\n dragNodeIdx = -1;\n controls.enabled = true;\n mouseDownPos = null;\n return;\n }\n dragNode = null;\n dragNodeIdx = -1;\n\n if (!mouseDownPos) return;\n const dx = Math.abs(e.clientX - mouseDownPos.x);\n const dy = Math.abs(e.clientY - mouseDownPos.y);\n mouseDownPos = null;\n if (dx + dy > 5) return; // was a drag\n\n const nodesMesh = getNodesMesh();\n if (!nodesMesh) return;\n\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n raycaster.setFromCamera(mouse, camera);\n\n const hits = raycaster.intersectObject(nodesMesh);\n if (hits.length > 0 && hits[0].instanceId != null) {\n const nodes = getNodes();\n const node = nodes[hits[0].instanceId];\n if (!node) return;\n\n const now = performance.now();\n const isDouble =\n now - lastClickTime < 400 && lastClickNodeId === node.id;\n\n if (isDouble) {\n if (singleClickTimer) clearTimeout(singleClickTimer);\n singleClickTimer = null;\n lastClickTime = 0;\n lastClickNodeId = null;\n callbacks.onNodeDoubleClick?.(node);\n return;\n }\n\n lastClickTime = now;\n lastClickNodeId = node.id;\n\n singleClickTimer = setTimeout(() => {\n singleClickTimer = null;\n const clickToFocus = options?.getClickToFocus?.() ?? true;\n if (clickToFocus) {\n const nx = (node as any).x ?? 0;\n const ny = (node as any).y ?? 0;\n const nz = (node as any).z ?? 0;\n if (options?.getIs2D?.()) {\n // 2D: pan in-plane to the node, keep the current zoom level\n animateCamera(\n camera,\n controls,\n { x: nx, y: ny, z: camera.position.z },\n { x: nx, y: ny, z: 0 },\n 800\n );\n } else {\n const dist = Math.hypot(nx, ny, nz);\n if (dist > 1) {\n const ratio = 1 + 120 / dist;\n animateCamera(\n camera,\n controls,\n { x: nx * ratio, y: ny * ratio, z: nz * ratio },\n { x: nx, y: ny, z: nz },\n 1200\n );\n }\n }\n }\n callbacks.onNodeClick(node);\n }, 250);\n } else {\n // Check edge click before reporting background click\n if (callbacks.onLinkClick && getEdgeData) {\n const edgeData = getEdgeData();\n if (edgeData?.positions) {\n const hitLink = findNearestEdge(\n e.clientX, e.clientY, rect, camera, edgeData as { links: GraphLink[]; edgeNodeIndices: [number, number][]; edgeLinkIndices: number[]; positions: Float32Array }\n );\n if (hitLink) {\n callbacks.onLinkClick(hitLink.link);\n return;\n }\n }\n }\n\n if (singleClickTimer) clearTimeout(singleClickTimer);\n singleClickTimer = null;\n lastClickTime = 0;\n lastClickNodeId = null;\n callbacks.onNodeClick(null);\n }\n }\n\n // Context menu (right-click)\n function onContextMenu(e: MouseEvent) {\n // Always suppress the native menu — right-drag is a camera gesture\n e.preventDefault();\n if (!callbacks.onContextMenu) return;\n\n const nodesMesh = getNodesMesh();\n if (!nodesMesh) return;\n\n const rect = canvas.getBoundingClientRect();\n mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;\n mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;\n raycaster.setFromCamera(mouse, camera);\n\n const hits = raycaster.intersectObject(nodesMesh);\n if (hits.length > 0 && hits[0].instanceId != null) {\n const nodes = getNodes();\n const node = nodes[hits[0].instanceId];\n if (node) {\n callbacks.onContextMenu(node, { x: e.clientX, y: e.clientY });\n }\n }\n }\n\n // Escape to deselect — scoped to container (or window fallback)\n const keyTarget: EventTarget = container ?? window;\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\") callbacks.onNodeClick(null);\n }\n\n let lastHoveredId: string | null = null;\n let lastHoveredLinkIdx = -1;\n\n canvas.addEventListener(\"pointerdown\", onPointerDown);\n canvas.addEventListener(\"pointerup\", onPointerUp);\n canvas.addEventListener(\"pointermove\", onPointerMove);\n canvas.addEventListener(\"contextmenu\", onContextMenu);\n keyTarget.addEventListener(\"keydown\", onKeyDown as EventListener);\n\n return {\n cleanup: () => {\n if (singleClickTimer) clearTimeout(singleClickTimer);\n canvas.removeEventListener(\"pointerdown\", onPointerDown);\n canvas.removeEventListener(\"pointerup\", onPointerUp);\n canvas.removeEventListener(\"pointermove\", onPointerMove);\n canvas.removeEventListener(\"contextmenu\", onContextMenu);\n keyTarget.removeEventListener(\"keydown\", onKeyDown as EventListener);\n },\n };\n}\n\n/** Find nearest edge to a screen-space point */\nfunction findNearestEdge(\n clientX: number,\n clientY: number,\n rect: DOMRect,\n camera: THREE.PerspectiveCamera,\n edgeData: {\n links: GraphLink[];\n edgeNodeIndices: [number, number][];\n edgeLinkIndices: number[];\n positions: Float32Array;\n }\n): { link: GraphLink; index: number } | null {\n const { links, edgeNodeIndices, edgeLinkIndices, positions } = edgeData;\n const screenX = clientX - rect.left;\n const screenY = clientY - rect.top;\n const w = rect.width;\n const h = rect.height;\n\n let bestDist = EDGE_HIT_THRESHOLD;\n let bestIdx = -1;\n\n const tmpVec = new THREE.Vector3();\n\n for (let i = 0; i < edgeNodeIndices.length; i++) {\n const [si, ti] = edgeNodeIndices[i];\n\n // Project source and target to screen space\n tmpVec.set(positions[si * 3], positions[si * 3 + 1], positions[si * 3 + 2]);\n tmpVec.project(camera);\n const sx1 = (tmpVec.x * 0.5 + 0.5) * w;\n const sy1 = (-tmpVec.y * 0.5 + 0.5) * h;\n\n tmpVec.set(positions[ti * 3], positions[ti * 3 + 1], positions[ti * 3 + 2]);\n tmpVec.project(camera);\n const sx2 = (tmpVec.x * 0.5 + 0.5) * w;\n const sy2 = (-tmpVec.y * 0.5 + 0.5) * h;\n\n // Point-to-line-segment distance in screen space\n const dist = pointToSegmentDist(screenX, screenY, sx1, sy1, sx2, sy2);\n if (dist < bestDist) {\n bestDist = dist;\n bestIdx = i;\n }\n }\n\n if (bestIdx === -1) return null;\n return { link: links[edgeLinkIndices[bestIdx]], index: bestIdx };\n}\n\n/** Point-to-line-segment distance (2D) */\nfunction pointToSegmentDist(\n px: number, py: number,\n ax: number, ay: number,\n bx: number, by: number\n): number {\n const dx = bx - ax;\n const dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n if (lenSq < 0.0001) return Math.hypot(px - ax, py - ay);\n let t = ((px - ax) * dx + (py - ay) * dy) / lenSq;\n t = Math.max(0, Math.min(1, t));\n return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));\n}\n","/**\n * Three.js resource disposal utilities.\n */\nimport * as THREE from \"three\";\n\nexport function disposeObject(obj: THREE.Object3D | null | undefined): void {\n if (!obj) return;\n const mesh = obj as THREE.Mesh;\n if (mesh.geometry) mesh.geometry.dispose();\n if (mesh.material) {\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((m) => m.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n if (obj.children) {\n [...obj.children].forEach(disposeObject);\n }\n}\n","/**\n * NetworkGraph3D — High-performance 3D graph renderer.\n *\n * Architecture:\n * - 1 InstancedMesh (all nodes → 1 draw call)\n * - 1 LineSegments (all edges → 1 draw call)\n * - Web Worker (force layout off main thread)\n * - Post-processing (UnrealBloomPass for glow)\n *\n * Total GPU draw calls: 2\n */\nimport {\n useEffect,\n useRef,\n useMemo,\n useState,\n useImperativeHandle,\n forwardRef,\n type Ref,\n} from \"react\";\nimport * as THREE from \"three\";\n\nimport type {\n GraphData,\n GraphNode,\n GraphLink,\n ThemeConfig,\n StyleConfig,\n LayoutConfig,\n RendererConfig,\n NetworkGraph3DRef,\n NullableNodeEventHandler,\n NullableLinkEventHandler,\n NodeEventHandler,\n LinkEventHandler,\n ContextMenuHandler,\n NodeDragHandler,\n LayoutSettledHandler,\n LayoutTickHandler,\n} from \"../types\";\nimport { DEFAULT_STYLE } from \"../types\";\nimport { resolveTheme, type ResolvedTheme } from \"../themes/resolve-theme\";\nimport { resolveLayoutParams } from \"../layout/layout-config\";\nimport { createLayoutWorker } from \"../layout/worker-source\";\nimport {\n createScene,\n initBloom,\n startAnimationLoop,\n setupResize,\n applyNavigationMode,\n type SceneState,\n} from \"./scene-setup\";\nimport { createNodeMesh, computeNodeScales, updateNodePositions } from \"./node-mesh\";\nimport {\n createEdgeMesh,\n buildEdgeMappings,\n updateEdgePositions,\n} from \"./edge-mesh\";\nimport { updateLabels, disposeLabelSystem } from \"./label-system\";\nimport { animateCamera, zoomToFitPositions } from \"./camera\";\nimport {\n buildAdjacencyMapFromLinks,\n computeHighlightSet,\n applyNodeHighlight,\n applyEdgeHighlight,\n updateSelectionRing,\n} from \"./selection\";\nimport { setupInteraction } from \"./interaction\";\nimport { disposeObject } from \"./dispose\";\n\nexport interface NetworkGraph3DProps {\n /** Graph data: nodes and links */\n data: GraphData;\n /** Single-click on a node (null = background click / deselect) */\n onNodeClick?: NullableNodeEventHandler;\n /** Double-click on a node */\n onNodeDoubleClick?: NodeEventHandler;\n /** Hover on a node (null = hover out) */\n onNodeHover?: NullableNodeEventHandler;\n /** Right-click on a node — receives node + screen position for custom menu */\n onContextMenu?: ContextMenuHandler;\n /** Click on an edge/link */\n onLinkClick?: LinkEventHandler;\n /** Hover on an edge/link (null = hover out) */\n onLinkHover?: NullableLinkEventHandler;\n /** Node drag (fires continuously during drag) */\n onNodeDrag?: NodeDragHandler;\n /** Node drag end */\n onNodeDragEnd?: NodeDragHandler;\n /** Fired when force simulation converges */\n onLayoutSettled?: LayoutSettledHandler;\n /** Fired on each layout tick with current alpha */\n onLayoutTick?: LayoutTickHandler;\n /** Currently selected node ID (controlled mode) */\n selectedNodeId?: string | null;\n /** Number of hops to highlight around selected node (default: 3) */\n highlightHops?: number;\n /** Theme configuration or preset name */\n theme?: ThemeConfig | string;\n /** Visual style overrides */\n style?: StyleConfig;\n /** Force layout configuration */\n layout?: LayoutConfig;\n /** WebGL renderer configuration */\n renderer?: RendererConfig;\n /** Custom label text formatter */\n labelFormatter?: (node: GraphNode) => string;\n /** Custom node size accessor (overrides node.val) */\n nodeValueAccessor?: (node: GraphNode) => number;\n /**\n * Client-side filter: IDs of nodes to keep visible. Hidden nodes (and\n * their edges/labels) vanish WITHOUT re-running the force layout —\n * positions are preserved, so toggling filters never reheats the graph.\n * null/undefined shows everything.\n */\n visibleNodeIds?: ReadonlySet<string> | string[] | null;\n /**\n * Client-side edge filter: return false to hide a link (e.g. by type).\n * Same reheat-free mechanism as visibleNodeIds — collapsed segments,\n * simulation untouched. null/undefined shows all edges.\n */\n linkVisibility?: ((link: GraphLink) => boolean) | null;\n /**\n * Allow dragging individual nodes (default: true). Set false on dense\n * graphs so left-drag always pans/orbits the camera instead of grabbing\n * whichever node happens to be under the pointer.\n */\n enableNodeDrag?: boolean;\n /** Fly the camera to a node on single-click (default: true) */\n clickToFocus?: boolean;\n /** Highlight a node's neighborhood on hover when nothing is selected (default: false) */\n hoverHighlight?: boolean;\n /** Hops highlighted around the hovered node (default: 1) */\n hoverHighlightHops?: number;\n}\n\n/** Internal data state shared across effects */\ninterface DataState {\n nodes: GraphNode[];\n links: GraphData[\"links\"];\n nodeIdToIndex: Map<string, number>;\n edgeNodeIndices: [number, number][];\n edgeLinkIndices: number[];\n positions: Float32Array | null;\n scales: Float32Array | null;\n settled: boolean;\n}\n\n/** Internal graph objects (meshes + worker) */\ninterface GraphObjects {\n nodesMesh: THREE.InstancedMesh;\n edgesMesh: THREE.LineSegments;\n edgeGeometry: THREE.BufferGeometry;\n edgePositionArray: Float32Array;\n worker: Worker | null;\n}\n\nfunction NetworkGraph3DInner(\n props: NetworkGraph3DProps,\n ref: Ref<NetworkGraph3DRef>\n) {\n const {\n data,\n onNodeClick,\n onNodeDoubleClick,\n onNodeHover,\n onContextMenu,\n onLinkClick,\n onLinkHover,\n onNodeDrag,\n onNodeDragEnd,\n onLayoutSettled,\n onLayoutTick,\n selectedNodeId = null,\n highlightHops = 3,\n theme: themeProp,\n style: styleProp,\n layout: layoutProp,\n renderer: rendererProp,\n labelFormatter,\n nodeValueAccessor,\n visibleNodeIds,\n linkVisibility,\n enableNodeDrag = true,\n clickToFocus = true,\n hoverHighlight = false,\n hoverHighlightHops = 1,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const resolvedStyle = useMemo(\n () => ({ ...DEFAULT_STYLE, ...styleProp }) as Required<StyleConfig>,\n [styleProp]\n );\n const resolvedTheme = useMemo(() => resolveTheme(themeProp), [themeProp]);\n\n // Persistent Three.js state\n const sceneRef = useRef<SceneState | null>(null);\n const graphObjRef = useRef<GraphObjects | null>(null);\n const dataRef = useRef<DataState>({\n nodes: [],\n links: [],\n nodeIdToIndex: new Map(),\n edgeNodeIndices: [],\n edgeLinkIndices: [],\n positions: null,\n scales: null,\n settled: false,\n });\n\n // Preserved positions: nodeId → {x,y,z}\n // Saved before mesh teardown so new worker can seed existing nodes\n const preservedPositionsRef = useRef<Record<string, { x: number; y: number; z: number }>>({});\n\n // Internal data for appendData — merged with external prop\n const [appendedData, setAppendedData] = useState<{\n nodes: GraphNode[];\n links: GraphLink[];\n } | null>(null);\n\n // Stable callback refs\n const onNodeClickRef = useRef(onNodeClick);\n const onNodeDoubleClickRef = useRef(onNodeDoubleClick);\n const onNodeHoverRef = useRef(onNodeHover);\n const onContextMenuRef = useRef(onContextMenu);\n const onLinkClickRef = useRef(onLinkClick);\n const onLinkHoverRef = useRef(onLinkHover);\n const onNodeDragRef = useRef(onNodeDrag);\n const onNodeDragEndRef = useRef(onNodeDragEnd);\n const onLayoutSettledRef = useRef(onLayoutSettled);\n const onLayoutTickRef = useRef(onLayoutTick);\n const styleRef = useRef(resolvedStyle);\n const themeRef = useRef(resolvedTheme);\n const selectedNodeIdRef = useRef(selectedNodeId);\n const labelFormatterRef = useRef(labelFormatter);\n const highlightSetRef = useRef<Map<string, number> | null>(null);\n const clickToFocusRef = useRef(clickToFocus);\n const enableNodeDragRef = useRef(enableNodeDrag);\n const hoverHighlightRef = useRef(hoverHighlight);\n const hoverHighlightHopsRef = useRef(hoverHighlightHops);\n const adjacencyMapRef = useRef<Map<string, string[]>>(new Map());\n const is2DRef = useRef(false);\n const hiddenNodesRef = useRef<Uint8Array | null>(null);\n const hiddenEdgesRef = useRef<Uint8Array | null>(null);\n onNodeClickRef.current = onNodeClick;\n onNodeDoubleClickRef.current = onNodeDoubleClick;\n onNodeHoverRef.current = onNodeHover;\n onContextMenuRef.current = onContextMenu;\n onLinkClickRef.current = onLinkClick;\n onLinkHoverRef.current = onLinkHover;\n onNodeDragRef.current = onNodeDrag;\n onNodeDragEndRef.current = onNodeDragEnd;\n onLayoutSettledRef.current = onLayoutSettled;\n onLayoutTickRef.current = onLayoutTick;\n styleRef.current = resolvedStyle;\n themeRef.current = resolvedTheme;\n selectedNodeIdRef.current = selectedNodeId;\n labelFormatterRef.current = labelFormatter;\n clickToFocusRef.current = clickToFocus;\n enableNodeDragRef.current = enableNodeDrag;\n hoverHighlightRef.current = hoverHighlight;\n hoverHighlightHopsRef.current = hoverHighlightHops;\n\n const is2D = layoutProp?.dimensions === 2;\n is2DRef.current = is2D;\n\n // Value-compare the layout config so an inline `layout={{...}}` object\n // (new identity every render) doesn't tear down meshes + worker each time.\n const layoutKey = JSON.stringify(layoutProp ?? null);\n const layoutRef = useRef(layoutProp);\n layoutRef.current = layoutProp;\n\n /* ── Merge external data with appended data ── */\n const mergedData: GraphData = useMemo(() => {\n if (!appendedData) return data;\n const existingIds = new Set(data.nodes.map((n) => n.id));\n const newNodes = appendedData.nodes.filter((n) => !existingIds.has(n.id));\n const existingEdges = new Set(\n data.links.map((l) => {\n const s = typeof l.source === \"object\" ? (l.source as any).id : l.source;\n const t = typeof l.target === \"object\" ? (l.target as any).id : l.target;\n return `${s}→${t}`;\n })\n );\n const newLinks = appendedData.links.filter((l) => {\n const s = typeof l.source === \"object\" ? (l.source as any).id : l.source;\n const t = typeof l.target === \"object\" ? (l.target as any).id : l.target;\n return !existingEdges.has(`${s}→${t}`);\n });\n if (newNodes.length === 0 && newLinks.length === 0) return data;\n return {\n nodes: [...data.nodes, ...newNodes],\n links: [...data.links, ...newLinks],\n };\n }, [data, appendedData]);\n\n /* ── Adjacency map ── */\n const adjacencyMap = useMemo(\n () => buildAdjacencyMapFromLinks(mergedData.links),\n [mergedData.links]\n );\n adjacencyMapRef.current = adjacencyMap;\n\n /* ── Normalized visibility set (null = all visible) ── */\n const visibleSet = useMemo<ReadonlySet<string> | null>(() => {\n if (visibleNodeIds == null) return null;\n return visibleNodeIds instanceof Set\n ? (visibleNodeIds as ReadonlySet<string>)\n : new Set(visibleNodeIds as string[]);\n }, [visibleNodeIds]);\n\n /* ── Highlight set ── */\n const highlightSet = useMemo(() => {\n if (!selectedNodeId) return null;\n return computeHighlightSet(selectedNodeId, adjacencyMap, highlightHops);\n }, [selectedNodeId, adjacencyMap, highlightHops]);\n\n /* ── Val range for node sizing ── */\n const valRange = useMemo(() => {\n let min = Infinity, max = -Infinity;\n for (const n of mergedData.nodes) {\n const v = nodeValueAccessor ? nodeValueAccessor(n) : (n.val ?? 1);\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return { min: isFinite(min) ? min : 1, max: isFinite(max) ? max : 1 };\n }, [mergedData.nodes, nodeValueAccessor]);\n\n /* ── Hover highlight (imperative — no React re-render per mousemove) ── */\n const applyHoverHighlight = (node: GraphNode | null) => {\n if (!hoverHighlightRef.current) return;\n if (selectedNodeIdRef.current) return; // explicit selection wins\n const gObj = graphObjRef.current;\n if (!gObj) return;\n const d = dataRef.current;\n const set = node\n ? computeHighlightSet(\n node.id,\n adjacencyMapRef.current,\n hoverHighlightHopsRef.current\n )\n : null;\n highlightSetRef.current = set;\n applyNodeHighlight(gObj.nodesMesh, d.nodes, node?.id ?? null, set, themeRef.current);\n applyEdgeHighlight(\n gObj.edgesMesh,\n d.links,\n d.edgeNodeIndices,\n d.edgeLinkIndices,\n set,\n styleRef.current.edgeOpacity,\n d.nodes.length,\n themeRef.current\n );\n };\n const applyHoverHighlightRef = useRef(applyHoverHighlight);\n applyHoverHighlightRef.current = applyHoverHighlight;\n\n /* ── Effect 1: Scene setup (mount once) ── */\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const state = createScene(\n container,\n themeRef.current.backgroundColor,\n styleRef.current,\n rendererProp\n );\n sceneRef.current = state;\n\n // Animation loop with label updates (highlight-aware)\n let panBoostAt = 0;\n let graphRadius = 0;\n const cancelAnim = startAnimationLoop(state, () => {\n // Zoom-adaptive pan boost: cursor-accurate (1:1) while the whole\n // graph is in view, accelerating up to 3x when zoomed deep in so\n // large graphs stay traversable. Throttled — O(n) radius scan.\n const nowMs = performance.now();\n if (nowMs - panBoostAt > 400) {\n panBoostAt = nowMs;\n const pos = dataRef.current.positions;\n if (pos) {\n let maxSq = 0;\n for (let i = 0; i < pos.length; i += 3) {\n const sq =\n pos[i] * pos[i] + pos[i + 1] * pos[i + 1] + pos[i + 2] * pos[i + 2];\n if (sq > maxSq) maxSq = sq;\n }\n graphRadius = Math.sqrt(maxSq);\n }\n if (graphRadius > 0) {\n const dist = state.camera.position.distanceTo(\n state.controls.target as THREE.Vector3\n );\n const boost = Math.min(3, Math.max(1, graphRadius / (3 * dist)));\n state.controls.panSpeed = state.flags.panSpeedBase * boost;\n }\n }\n\n updateLabels(\n state.labels,\n dataRef.current.nodes,\n dataRef.current.positions,\n dataRef.current.scales,\n state.camera,\n themeRef.current,\n styleRef.current.showLabels,\n styleRef.current.labelScale,\n styleRef.current.labelThreshold,\n styleRef.current.maxLabels,\n labelFormatterRef.current,\n highlightSetRef.current,\n hiddenNodesRef.current\n );\n });\n\n const resizeObserver = setupResize(container, state);\n\n // Interaction (scoped to container for keyboard isolation)\n const interaction = setupInteraction(\n state.renderer.domElement,\n state.camera,\n state.controls,\n () => graphObjRef.current?.nodesMesh ?? null,\n () => dataRef.current.nodes,\n {\n onNodeClick: (node) => onNodeClickRef.current?.(node),\n onNodeDoubleClick: (node) => onNodeDoubleClickRef.current?.(node),\n onNodeHover: (node) => {\n onNodeHoverRef.current?.(node);\n applyHoverHighlightRef.current(node);\n },\n onContextMenu: (node, pos) => onContextMenuRef.current?.(node, pos),\n onLinkClick: (link) => onLinkClickRef.current?.(link),\n onLinkHover: (link) => onLinkHoverRef.current?.(link),\n onNodeDrag: (node, pos) => {\n if (is2DRef.current) pos = { ...pos, z: 0 };\n onNodeDragRef.current?.(node, pos);\n // Update position in data\n const d = dataRef.current;\n const idx = d.nodeIdToIndex.get(node.id);\n if (idx !== undefined && d.positions) {\n d.positions[idx * 3] = pos.x;\n d.positions[idx * 3 + 1] = pos.y;\n d.positions[idx * 3 + 2] = pos.z;\n (node as any).x = pos.x;\n (node as any).y = pos.y;\n (node as any).z = pos.z;\n // Update node mesh position\n const gObj = graphObjRef.current;\n if (gObj && d.scales) {\n updateNodePositions(\n gObj.nodesMesh,\n d.positions!,\n d.scales,\n d.nodes.length,\n hiddenNodesRef.current\n );\n }\n }\n },\n onNodeDragEnd: (node, pos) => onNodeDragEndRef.current?.(node, pos),\n },\n container,\n () => {\n const d = dataRef.current;\n return {\n links: d.links as GraphLink[],\n edgeNodeIndices: d.edgeNodeIndices,\n edgeLinkIndices: d.edgeLinkIndices,\n positions: d.positions,\n };\n },\n {\n getClickToFocus: () => clickToFocusRef.current,\n getIs2D: () => is2DRef.current,\n getNodeDragEnabled: () => enableNodeDragRef.current,\n }\n );\n\n return () => {\n cancelAnim();\n resizeObserver.disconnect();\n interaction.cleanup();\n state.keyboard.cleanup();\n state.scrollCleanup();\n state.controls.dispose();\n disposeObject(state.stars);\n disposeObject(state.selectionRing);\n state.selectionRing.children.forEach((c) => disposeObject(c));\n disposeLabelSystem(state.labels);\n disposeObject(state.labels.group);\n if (state.bloomPass) state.bloomPass.dispose();\n if (state.composer) {\n state.composer.passes.forEach((p) => (p as any).dispose?.());\n }\n state.renderer.dispose();\n const canvas = state.renderer.domElement;\n if (container.contains(canvas)) container.removeChild(canvas);\n sceneRef.current = null;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* ── Effect 2: Graph data → meshes + worker ── */\n useEffect(() => {\n const sceneState = sceneRef.current;\n if (!sceneState) return;\n const { scene, camera, controls, renderer } = sceneState;\n const nc = mergedData.nodes.length;\n if (nc === 0) return;\n\n const theme = themeRef.current;\n const style = styleRef.current;\n\n // Preserve positions from previous data before teardown\n const prevData = dataRef.current;\n if (prevData.positions && prevData.nodes.length > 0) {\n const saved: Record<string, { x: number; y: number; z: number }> = {};\n for (let i = 0; i < prevData.nodes.length; i++) {\n saved[prevData.nodes[i].id] = {\n x: prevData.positions[i * 3],\n y: prevData.positions[i * 3 + 1],\n z: prevData.positions[i * 3 + 2],\n };\n }\n preservedPositionsRef.current = saved;\n }\n\n // Cleanup previous\n const prev = graphObjRef.current;\n if (prev) {\n scene.remove(prev.nodesMesh);\n scene.remove(prev.edgesMesh);\n disposeObject(prev.nodesMesh);\n disposeObject(prev.edgesMesh);\n if (prev.worker) {\n prev.worker.postMessage({ type: \"stop\" });\n prev.worker.terminate();\n }\n }\n\n // Init bloom\n initBloom(sceneState, nc, style);\n\n // Fog\n if (nc < 15000 && style.fogDensity > 0) {\n scene.fog = new THREE.FogExp2(\n new THREE.Color(theme.backgroundColor).getHex(),\n style.fogDensity * 0.5\n );\n } else {\n scene.fog = null;\n }\n\n // Preprocess nodes: apply nodeValueAccessor\n const nodes = nodeValueAccessor\n ? mergedData.nodes.map((n) => ({ ...n, val: nodeValueAccessor(n) }))\n : mergedData.nodes;\n const links = mergedData.links;\n\n // Build index\n const nodeIdToIndex = new Map<string, number>();\n for (let i = 0; i < nc; i++) nodeIdToIndex.set(nodes[i].id, i);\n\n // Edge mappings\n const { edgeNodeIndices, edgeLinkIndices } = buildEdgeMappings(\n links,\n nodeIdToIndex\n );\n\n // Node scales\n const scales = computeNodeScales(nodes, style.nodeMinSize, style.nodeMaxSize);\n\n // Create meshes\n const { mesh: nodesMesh, material: nodeMat } = createNodeMesh(\n nodes,\n scales,\n theme\n );\n scene.add(nodesMesh);\n\n const edgeResult = createEdgeMesh(\n links,\n edgeNodeIndices,\n edgeLinkIndices,\n nc,\n style.edgeOpacity,\n theme\n );\n // Apply edge width scale\n (edgeResult.mesh.material as THREE.LineBasicMaterial).linewidth = style.edgeWidthScale;\n scene.add(edgeResult.mesh);\n\n // Update data ref\n dataRef.current = {\n nodes,\n links,\n nodeIdToIndex,\n edgeNodeIndices,\n edgeLinkIndices,\n positions: null,\n scales,\n settled: false,\n };\n\n graphObjRef.current = {\n nodesMesh,\n edgesMesh: edgeResult.mesh,\n edgeGeometry: edgeResult.geometry,\n edgePositionArray: edgeResult.positionArray,\n worker: null,\n };\n\n // Clear label cache on data change\n const lt = sceneState.labels.textureCache;\n for (const [, entry] of lt) {\n if (entry.texture) entry.texture.dispose();\n }\n lt.clear();\n\n /* ── Start Web Worker ── */\n let worker: Worker;\n try {\n worker = createLayoutWorker();\n } catch (err) {\n console.error(\"Graphier: Failed to create layout worker:\", err);\n // Fallback: keep random positions\n const initPos = new Float32Array(nc * 3);\n const tmpMat = new THREE.Matrix4();\n const tmpVec = new THREE.Vector3();\n for (let i = 0; i < nc; i++) {\n nodesMesh.getMatrixAt(i, tmpMat);\n tmpVec.setFromMatrixPosition(tmpMat);\n initPos[i * 3] = tmpVec.x;\n initPos[i * 3 + 1] = tmpVec.y;\n initPos[i * 3 + 2] = tmpVec.z;\n (nodes[i] as any).x = tmpVec.x;\n (nodes[i] as any).y = tmpVec.y;\n (nodes[i] as any).z = tmpVec.z;\n }\n dataRef.current.positions = initPos;\n setTimeout(() => zoomToFitPositions(camera, controls, initPos, 800, 100), 300);\n return;\n }\n graphObjRef.current.worker = worker;\n\n worker.onerror = (err) => {\n console.error(\"Graphier: Layout worker error:\", err);\n };\n\n worker.onmessage = (e) => {\n const msg = e.data;\n\n if (msg.type === \"positions\") {\n const positions = new Float32Array(msg.positions);\n dataRef.current.positions = positions;\n\n // Update node positions (respecting any active visibility filter)\n const hn = hiddenNodesRef.current;\n updateNodePositions(\n nodesMesh,\n positions,\n scales,\n nc,\n hn && hn.length === nc ? hn : null\n );\n\n // Mutate node objects for focusNode compatibility\n for (let i = 0; i < nc; i++) {\n (nodes[i] as any).x = positions[i * 3];\n (nodes[i] as any).y = positions[i * 3 + 1];\n (nodes[i] as any).z = positions[i * 3 + 2];\n }\n\n // Update edges (respecting any active visibility filter)\n const he = hiddenEdgesRef.current;\n updateEdgePositions(\n edgeResult.positionArray,\n positions,\n edgeNodeIndices,\n edgeResult.geometry,\n he && he.length === edgeNodeIndices.length ? he : null\n );\n\n // Keep selection ring synced during layout\n const selId = selectedNodeIdRef.current;\n if (selId && sceneState.selectionRing.visible) {\n const si = nodeIdToIndex.get(selId);\n if (si !== undefined) {\n sceneState.selectionRing.position.set(\n positions[si * 3],\n positions[si * 3 + 1],\n positions[si * 3 + 2]\n );\n }\n }\n\n // Layout tick callback\n onLayoutTickRef.current?.(msg.alpha);\n }\n\n if (msg.type === \"settled\") {\n dataRef.current.settled = true;\n onLayoutSettledRef.current?.();\n }\n };\n\n // Send layout params with preserved positions for existing nodes\n const layoutConfig = layoutRef.current;\n const layoutParams = resolveLayoutParams(nc, layoutConfig);\n\n // Optional cluster force: map each node's cluster key to a group index\n let groups: number[] | undefined;\n if (layoutConfig?.clusterBy) {\n const keyOf = (n: GraphNode) =>\n layoutConfig.clusterBy === \"type\" ? n.type : (n as any).group;\n const keyToIdx = new Map<string, number>();\n groups = nodes.map((n) => {\n const k = keyOf(n);\n if (k == null) return -1;\n const ks = String(k);\n if (!keyToIdx.has(ks)) keyToIdx.set(ks, keyToIdx.size);\n return keyToIdx.get(ks)!;\n });\n }\n\n worker.postMessage({\n type: \"init\",\n nodes: nodes.map((n) => ({ id: n.id })),\n links: links.map((l) => ({\n source: typeof l.source === \"object\" ? (l.source as any).id : l.source,\n target: typeof l.target === \"object\" ? (l.target as any).id : l.target,\n })),\n params: layoutParams,\n initialPositions: preservedPositionsRef.current,\n groups,\n });\n\n return () => {\n // Save positions before teardown for next init\n const d = dataRef.current;\n if (d.positions && d.nodes.length > 0) {\n const saved: Record<string, { x: number; y: number; z: number }> = {};\n for (let i = 0; i < d.nodes.length; i++) {\n saved[d.nodes[i].id] = {\n x: d.positions[i * 3],\n y: d.positions[i * 3 + 1],\n z: d.positions[i * 3 + 2],\n };\n }\n preservedPositionsRef.current = saved;\n }\n\n if (worker) {\n worker.postMessage({ type: \"stop\" });\n worker.terminate();\n }\n scene.remove(nodesMesh);\n scene.remove(edgeResult.mesh);\n disposeObject(nodesMesh);\n disposeObject(edgeResult.mesh);\n graphObjRef.current = null;\n };\n }, [mergedData, valRange, nodeValueAccessor, layoutKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* ── Effect 2b: Visibility filter (never reheats the layout) ── */\n useEffect(() => {\n const d = dataRef.current;\n const gObj = graphObjRef.current;\n if (!visibleSet && !linkVisibility) {\n hiddenNodesRef.current = null;\n hiddenEdgesRef.current = null;\n } else {\n const nc = d.nodes.length;\n const hn = new Uint8Array(nc);\n if (visibleSet) {\n for (let i = 0; i < nc; i++) {\n if (!visibleSet.has(d.nodes[i].id)) hn[i] = 1;\n }\n }\n const ec = d.edgeNodeIndices.length;\n const he = new Uint8Array(ec);\n for (let i = 0; i < ec; i++) {\n const [si, ti] = d.edgeNodeIndices[i];\n if (hn[si] || hn[ti]) {\n he[i] = 1;\n } else if (linkVisibility) {\n const link = d.links[d.edgeLinkIndices[i]];\n if (link && !linkVisibility(link as GraphLink)) he[i] = 1;\n }\n }\n hiddenNodesRef.current = visibleSet ? hn : null;\n hiddenEdgesRef.current = he;\n }\n // Apply immediately when positions exist; otherwise the first worker\n // tick picks the masks up. Pure matrix/buffer writes — no simulation.\n if (gObj && d.positions && d.scales) {\n updateNodePositions(\n gObj.nodesMesh,\n d.positions,\n d.scales,\n d.nodes.length,\n hiddenNodesRef.current\n );\n updateEdgePositions(\n gObj.edgePositionArray,\n d.positions,\n d.edgeNodeIndices,\n gObj.edgeGeometry,\n hiddenEdgesRef.current\n );\n }\n }, [visibleSet, linkVisibility, mergedData]);\n\n /* ── Effect 2c: navigation scheme (2D/3D + overrides) ── */\n const navKey = JSON.stringify(rendererProp?.navigation ?? null);\n useEffect(() => {\n const s = sceneRef.current;\n if (s) applyNavigationMode(s, is2D, rendererProp?.navigation);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [is2D, navKey]);\n\n /* ── Effect 3: Selection visual update ── */\n useEffect(() => {\n const gObj = graphObjRef.current;\n const sceneState = sceneRef.current;\n if (!gObj?.nodesMesh || !sceneState) return;\n\n const d = dataRef.current;\n const theme = themeRef.current;\n const style = styleRef.current;\n\n // Store highlight set for label system access\n highlightSetRef.current = highlightSet;\n\n applyNodeHighlight(\n gObj.nodesMesh,\n d.nodes,\n selectedNodeId,\n highlightSet,\n theme\n );\n\n applyEdgeHighlight(\n gObj.edgesMesh,\n d.links,\n d.edgeNodeIndices,\n d.edgeLinkIndices,\n highlightSet,\n style.edgeOpacity,\n d.nodes.length,\n theme\n );\n\n // Dynamic bloom boost during selection (match original behavior)\n if (sceneState.bloomPass) {\n const style = styleRef.current;\n if (highlightSet) {\n sceneState.bloomPass.strength = style.bloomStrength * 1.8;\n sceneState.bloomPass.radius = style.bloomRadius * 1.4;\n sceneState.bloomPass.threshold = 0.25;\n } else {\n sceneState.bloomPass.strength = style.bloomStrength;\n sceneState.bloomPass.radius = style.bloomRadius;\n sceneState.bloomPass.threshold = style.bloomThreshold;\n }\n }\n\n const selectedNode = selectedNodeId\n ? d.nodes.find((n) => n.id === selectedNodeId)\n : null;\n\n updateSelectionRing(\n sceneState.selectionRing,\n selectedNodeId,\n d.nodeIdToIndex,\n d.positions,\n d.scales,\n theme,\n selectedNode?.type\n );\n }, [selectedNodeId, highlightSet, mergedData]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* ── Effect 4: Live style updates ── */\n useEffect(() => {\n const s = sceneRef.current;\n if (!s?.bloomPass) return;\n s.bloomPass.strength = resolvedStyle.bloomStrength;\n s.bloomPass.radius = resolvedStyle.bloomRadius;\n s.bloomPass.threshold = resolvedStyle.bloomThreshold;\n }, [resolvedStyle.bloomStrength, resolvedStyle.bloomRadius, resolvedStyle.bloomThreshold]);\n\n // Node size live update\n useEffect(() => {\n const gObj = graphObjRef.current;\n if (!gObj?.nodesMesh) return;\n const { nodes, positions } = dataRef.current;\n if (!positions) return;\n const nc = nodes.length;\n\n const newScales = computeNodeScales(\n nodes,\n resolvedStyle.nodeMinSize,\n resolvedStyle.nodeMaxSize\n );\n dataRef.current.scales = newScales;\n updateNodePositions(gObj.nodesMesh, positions, newScales, nc, hiddenNodesRef.current);\n }, [resolvedStyle.nodeMinSize, resolvedStyle.nodeMaxSize, valRange]);\n\n // Edge opacity & width live update\n useEffect(() => {\n const gObj = graphObjRef.current;\n if (!gObj?.edgesMesh) return;\n const mat = gObj.edgesMesh.material as THREE.LineBasicMaterial;\n mat.opacity = resolvedStyle.edgeOpacity;\n mat.linewidth = resolvedStyle.edgeWidthScale;\n }, [resolvedStyle.edgeOpacity, resolvedStyle.edgeWidthScale]);\n\n // Fog live update\n useEffect(() => {\n const s = sceneRef.current;\n if (!s) return;\n if (resolvedStyle.fogDensity > 0) {\n s.scene.fog = new THREE.FogExp2(\n new THREE.Color(themeRef.current.backgroundColor).getHex(),\n resolvedStyle.fogDensity * 0.5\n );\n } else {\n s.scene.fog = null;\n }\n }, [resolvedStyle.fogDensity]);\n\n // Star field toggle\n useEffect(() => {\n const s = sceneRef.current;\n if (!s?.stars) return;\n s.stars.visible = resolvedStyle.starField;\n }, [resolvedStyle.starField]);\n\n // Auto orbit\n useEffect(() => {\n const s = sceneRef.current;\n if (!s || !resolvedStyle.autoOrbit) return;\n\n let angle = 0;\n const id = setInterval(() => {\n if (!sceneRef.current) return;\n const cam = sceneRef.current.camera;\n const ctrl = sceneRef.current.controls;\n const dist = cam.position.length() || 800;\n angle += 0.003;\n cam.position.set(\n dist * Math.sin(angle),\n cam.position.y,\n dist * Math.cos(angle)\n );\n ctrl.update();\n }, 30);\n\n return () => clearInterval(id);\n }, [resolvedStyle.autoOrbit]);\n\n // Fly speed live update\n useEffect(() => {\n const s = sceneRef.current;\n if (!s) return;\n s.keyboard.setFlySpeed(resolvedStyle.flySpeed);\n }, [resolvedStyle.flySpeed]);\n\n /* ── Imperative API via ref ── */\n useImperativeHandle(ref, () => ({\n cameraPosition(pos, lookAt, duration = 1000) {\n const s = sceneRef.current;\n if (!s) return;\n animateCamera(s.camera, s.controls, pos, lookAt, duration);\n },\n zoomToFit(duration = 800, padding = 100) {\n const s = sceneRef.current;\n const p = dataRef.current.positions;\n if (!s || !p) return;\n zoomToFitPositions(s.camera, s.controls, p, duration, padding);\n },\n zoomIn() {\n const s = sceneRef.current;\n if (!s) return;\n const { camera, controls } = s;\n const dir = camera.position.clone().sub(controls.target as THREE.Vector3);\n dir.multiplyScalar(0.65);\n const dest = (controls.target as THREE.Vector3).clone().add(dir);\n animateCamera(camera, controls, dest, controls.target as THREE.Vector3, 400);\n },\n zoomOut() {\n const s = sceneRef.current;\n if (!s) return;\n const { camera, controls } = s;\n const dir = camera.position.clone().sub(controls.target as THREE.Vector3);\n dir.multiplyScalar(1.5);\n const dest = (controls.target as THREE.Vector3).clone().add(dir);\n animateCamera(camera, controls, dest, controls.target as THREE.Vector3, 400);\n },\n focusNode(nodeId: string, duration = 1200) {\n const s = sceneRef.current;\n if (!s) return;\n const d = dataRef.current;\n const idx = d.nodeIdToIndex.get(nodeId);\n if (idx === undefined || !d.positions) return;\n const nx = d.positions[idx * 3];\n const ny = d.positions[idx * 3 + 1];\n const nz = d.positions[idx * 3 + 2];\n if (is2DRef.current) {\n // Pan to the node, zooming to a readable level\n const z = Math.max(120, Math.min(Math.abs(s.camera.position.z), 500));\n animateCamera(\n s.camera,\n s.controls,\n { x: nx, y: ny, z },\n { x: nx, y: ny, z: 0 },\n duration\n );\n return;\n }\n const dist = Math.hypot(nx, ny, nz);\n if (dist < 1) return;\n const ratio = 1 + 120 / dist;\n animateCamera(\n s.camera,\n s.controls,\n { x: nx * ratio, y: ny * ratio, z: nz * ratio },\n { x: nx, y: ny, z: nz },\n duration\n );\n },\n panTo(x: number, y: number, duration = 600) {\n const s = sceneRef.current;\n if (!s) return;\n const t = s.controls.target as THREE.Vector3;\n if (is2DRef.current) {\n animateCamera(\n s.camera,\n s.controls,\n { x, y, z: s.camera.position.z },\n { x, y, z: 0 },\n duration\n );\n } else {\n const dx = x - t.x;\n const dy = y - t.y;\n animateCamera(\n s.camera,\n s.controls,\n {\n x: s.camera.position.x + dx,\n y: s.camera.position.y + dy,\n z: s.camera.position.z,\n },\n { x, y, z: t.z },\n duration\n );\n }\n },\n appendData(newNodes: GraphNode[], newLinks: GraphLink[]) {\n if (newNodes.length === 0 && newLinks.length === 0) return 0;\n\n // Deduplicate against current data\n const existingIds = new Set(dataRef.current.nodes.map((n) => n.id));\n const uniqueNodes = newNodes.filter((n) => !existingIds.has(n.id));\n\n // Trigger re-render with merged data (positions preserved via ref)\n setAppendedData((prev) => ({\n nodes: [...(prev?.nodes ?? []), ...uniqueNodes],\n links: [...(prev?.links ?? []), ...newLinks],\n }));\n\n return uniqueNodes.length;\n },\n getScene() {\n return sceneRef.current?.scene ?? null;\n },\n getRenderer() {\n return sceneRef.current?.renderer ?? null;\n },\n getCamera() {\n return sceneRef.current?.camera ?? null;\n },\n captureScreenshot() {\n const s = sceneRef.current;\n if (!s) return null;\n s.renderer.render(s.scene, s.camera);\n return s.renderer.domElement.toDataURL(\"image/png\");\n },\n getGraphSnapshot() {\n const gObj = graphObjRef.current;\n const d = dataRef.current;\n if (!gObj || !d.positions) return null;\n return {\n positions: d.positions,\n count: d.nodes.length,\n colors: (gObj.nodesMesh.instanceColor?.array as Float32Array) ?? null,\n hidden: hiddenNodesRef.current,\n selectedIndex: selectedNodeIdRef.current\n ? d.nodeIdToIndex.get(selectedNodeIdRef.current) ?? -1\n : -1,\n };\n },\n getViewportRect() {\n const s = sceneRef.current;\n if (!s) return null;\n const cam = s.camera;\n const t = s.controls.target as THREE.Vector3;\n // Frustum footprint around the orbit target (exact for the\n // axis-aligned 2D camera; a serviceable approximation when the\n // 3D camera is rotated — sized by camera→target distance).\n const dist = Math.max(cam.position.distanceTo(t), 1);\n const halfH = Math.tan((cam.fov * Math.PI) / 360) * dist;\n return {\n cx: t.x,\n cy: t.y,\n halfW: halfH * cam.aspect,\n halfH,\n };\n },\n reheatLayout() {\n // Force re-run of layout by resetting settled state\n // The worker will be restarted on the next data change cycle\n const gObj = graphObjRef.current;\n if (gObj?.worker) {\n gObj.worker.postMessage({ type: \"stop\" });\n gObj.worker.terminate();\n gObj.worker = null;\n }\n dataRef.current.settled = false;\n // Trigger re-render by toggling appended data\n setAppendedData((prev) => prev ? { ...prev } : { nodes: [], links: [] });\n },\n }));\n\n return (\n <div\n ref={containerRef}\n tabIndex={-1}\n style={{\n width: \"100%\",\n height: \"100%\",\n outline: \"none\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n }}\n onDragStart={(e) => e.preventDefault()}\n />\n );\n}\n\nexport const NetworkGraph3D = forwardRef(NetworkGraph3DInner);\n","/**\n * GraphMinimap — lightweight 2D-canvas overview of a NetworkGraph3D.\n *\n * Reads node buffers via ref.getGraphSnapshot() on a throttled rAF loop\n * (no second WebGL context, no React re-renders per frame), draws dots +\n * the camera's viewport rectangle, and pans the main camera on\n * click/drag. Designed for 2D layout mode; in 3D the viewport rectangle\n * is an approximation of the camera footprint on the z=0 plane.\n */\nimport { useEffect, useRef, type RefObject, type CSSProperties } from \"react\";\nimport type { NetworkGraph3DRef } from \"../types\";\n\nexport interface GraphMinimapProps {\n /** Ref to the NetworkGraph3D instance to mirror */\n graphRef: RefObject<NetworkGraph3DRef | null>;\n /** Canvas CSS width in px (default: 200) */\n width?: number;\n /** Canvas CSS height in px (default: 140) */\n height?: number;\n /** Background fill (default: transparent) */\n backgroundColor?: string;\n /** Viewport rectangle stroke color (default: \"#94a3b8\") */\n viewportColor?: string;\n /** Dot radius in px (default: 1.5) */\n dotRadius?: number;\n /** Redraw rate in frames per second (default: 15) */\n fps?: number;\n /** Fraction of canvas kept as padding around the graph (default: 0.08) */\n padding?: number;\n className?: string;\n style?: CSSProperties;\n}\n\ninterface FitTransform {\n scale: number;\n offsetX: number;\n offsetY: number;\n}\n\nexport function GraphMinimap({\n graphRef,\n width = 200,\n height = 140,\n backgroundColor,\n viewportColor = \"#94a3b8\",\n dotRadius = 1.5,\n fps = 15,\n padding = 0.08,\n className,\n style,\n}: GraphMinimapProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n // World→canvas transform of the last drawn frame, for pointer mapping\n const fitRef = useRef<FitTransform | null>(null);\n const draggingRef = useRef(false);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n\n let raf = 0;\n let last = 0;\n const interval = 1000 / fps;\n\n const draw = (now: number) => {\n raf = requestAnimationFrame(draw);\n if (now - last < interval) return;\n last = now;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, width, height);\n }\n\n const snap = graphRef.current?.getGraphSnapshot();\n if (!snap || snap.count === 0) {\n fitRef.current = null;\n return;\n }\n const { positions, count, colors, hidden, selectedIndex } = snap;\n\n // Bounds over visible nodes (XY plane)\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (let i = 0; i < count; i++) {\n if (hidden && hidden[i]) continue;\n const x = positions[i * 3];\n const y = positions[i * 3 + 1];\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n if (!isFinite(minX)) {\n fitRef.current = null;\n return;\n }\n\n const spanX = Math.max(maxX - minX, 1);\n const spanY = Math.max(maxY - minY, 1);\n const pad = Math.min(width, height) * padding;\n const scale = Math.min(\n (width - pad * 2) / spanX,\n (height - pad * 2) / spanY\n );\n // World y is up; canvas y is down → flip\n const offsetX = width / 2 - ((minX + maxX) / 2) * scale;\n const offsetY = height / 2 + ((minY + maxY) / 2) * scale;\n fitRef.current = { scale, offsetX, offsetY };\n\n // Nodes\n const r = dotRadius;\n for (let i = 0; i < count; i++) {\n if (hidden && hidden[i]) continue;\n const cx = positions[i * 3] * scale + offsetX;\n const cy = -positions[i * 3 + 1] * scale + offsetY;\n if (colors) {\n const cr = Math.min(255, Math.round(colors[i * 3] * 255));\n const cg = Math.min(255, Math.round(colors[i * 3 + 1] * 255));\n const cb = Math.min(255, Math.round(colors[i * 3 + 2] * 255));\n ctx.fillStyle = `rgb(${cr},${cg},${cb})`;\n } else {\n ctx.fillStyle = viewportColor;\n }\n const rad = i === selectedIndex ? r * 2 : r;\n ctx.beginPath();\n ctx.arc(cx, cy, rad, 0, Math.PI * 2);\n ctx.fill();\n }\n\n // Viewport rectangle\n const vp = graphRef.current?.getViewportRect();\n if (vp) {\n const x = (vp.cx - vp.halfW) * scale + offsetX;\n const y = -(vp.cy + vp.halfH) * scale + offsetY;\n const w = vp.halfW * 2 * scale;\n const h = vp.halfH * 2 * scale;\n ctx.strokeStyle = viewportColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(x, y, w, h);\n ctx.fillStyle = viewportColor + \"1a\"; // ~10% alpha\n ctx.fillRect(x, y, w, h);\n }\n };\n raf = requestAnimationFrame(draw);\n return () => cancelAnimationFrame(raf);\n }, [graphRef, width, height, backgroundColor, viewportColor, dotRadius, fps, padding]);\n\n const panToPointer = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const fit = fitRef.current;\n const canvas = canvasRef.current;\n if (!fit || !canvas) return;\n const rect = canvas.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n const wx = (px - fit.offsetX) / fit.scale;\n const wy = -(py - fit.offsetY) / fit.scale;\n graphRef.current?.panTo(wx, wy, draggingRef.current ? 0 : 300);\n };\n\n return (\n <canvas\n ref={canvasRef}\n className={className}\n style={{\n width,\n height,\n cursor: \"pointer\",\n touchAction: \"none\",\n display: \"block\",\n ...style,\n }}\n onPointerDown={(e) => {\n draggingRef.current = true;\n e.currentTarget.setPointerCapture(e.pointerId);\n panToPointer(e);\n }}\n onPointerMove={(e) => {\n if (draggingRef.current) panToPointer(e);\n }}\n onPointerUp={(e) => {\n draggingRef.current = false;\n e.currentTarget.releasePointerCapture(e.pointerId);\n }}\n onPointerCancel={() => {\n draggingRef.current = false;\n }}\n />\n );\n}\n","export default function(x, y, z) {\n var nodes, strength = 1;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n if (z == null) z = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0,\n sz = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x || 0, sy += node.y || 0, sz += node.z || 0;\n }\n\n for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, sz = (sz / n - z) * strength, i = 0; i < n; ++i) {\n node = nodes[i];\n if (sx) { node.x -= sx }\n if (sy) { node.y -= sy; }\n if (sz) { node.z -= sz; }\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n force.z = function(_) {\n return arguments.length ? (z = +_, force) : z;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n return force;\n}\n","export default function(d) {\n const x = +this._x.call(null, d);\n return add(this.cover(x), x, d);\n}\n\nfunction add(tree, x, d) {\n if (isNaN(x)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n x1 = tree._x1,\n xm,\n xp,\n right,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (parent = node, !(node = node[i = +right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n if (x === xp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(2) : tree._root = new Array(2);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n } while ((i = +right) === (j = +(xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n if (!Array.isArray(data)) data = Array.from(data);\n const n = data.length;\n const xz = new Float64Array(n);\n let x0 = Infinity,\n x1 = -Infinity;\n\n // Compute the points and their extent.\n for (let i = 0, x; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, data[i]))) continue;\n xz[i] = x;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0).cover(x1);\n\n // Add the new points.\n for (let i = 0; i < n; ++i) {\n add(this, xz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x) {\n if (isNaN(x = +x)) return this; // ignore invalid points\n\n var x0 = this._x0,\n x1 = this._x1;\n\n // If the binarytree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing half boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1) {\n i = +(x < x0);\n parent = new Array(2), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z; break;\n case 1: x0 = x1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._x1 = x1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0]).cover(+_[1][0])\n : isNaN(this._x0) ? undefined : [[this._x0], [this._x1]];\n}\n","export default function(node, x0, x1) {\n this.node = node;\n this.x0 = x0;\n this.x1 = x1;\n}\n","import Half from \"./half.js\";\n\nexport default function(x, radius) {\n var data,\n x0 = this._x0,\n x1,\n x2,\n x3 = this._x1,\n halves = [],\n node = this._root,\n q,\n i;\n\n if (node) halves.push(new Half(node, x0, x3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius;\n x3 = x + radius;\n }\n\n while (q = halves.pop()) {\n\n // Stop searching if this half can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (x2 = q.x1) < x0) continue;\n\n // Bisect the current half.\n if (node.length) {\n var xm = (x1 + x2) / 2;\n\n halves.push(\n new Half(node[1], xm, x2),\n new Half(node[0], x1, xm)\n );\n\n // Visit the closest half first.\n if (i = +(x >= xm)) {\n q = halves[halves.length - 1];\n halves[halves.length - 1] = halves[halves.length - 1 - i];\n halves[halves.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var d = Math.abs(x - +this._x.call(null, node.data));\n if (d < radius) {\n radius = d;\n x0 = x - d;\n x3 = x + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n x1 = this._x1,\n x,\n xm,\n right,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (!(parent = node, node = node[i = +right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 1]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1])\n && node === (parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Half from \"./half.js\";\n\nexport default function(callback) {\n var halves = [], q, node = this._root, child, x0, x1;\n if (node) halves.push(new Half(node, this._x0, this._x1));\n while (q = halves.pop()) {\n if (!callback(node = q.node, x0 = q.x0, x1 = q.x1) && node.length) {\n var xm = (x0 + x1) / 2;\n if (child = node[1]) halves.push(new Half(child, xm, x1));\n if (child = node[0]) halves.push(new Half(child, x0, xm));\n }\n }\n return this;\n}\n","import Half from \"./half.js\";\n\nexport default function(callback) {\n var halves = [], next = [], q;\n if (this._root) halves.push(new Half(this._root, this._x0, this._x1));\n while (q = halves.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, x1 = q.x1, xm = (x0 + x1) / 2;\n if (child = node[0]) halves.push(new Half(child, x0, xm));\n if (child = node[1]) halves.push(new Half(child, xm, x1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.x1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\n\nexport default function binarytree(nodes, x) {\n var tree = new Binarytree(x == null ? defaultX : x, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Binarytree(x, x0, x1) {\n this._x = x;\n this._x0 = x0;\n this._x1 = x1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = binarytree.prototype = Binarytree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Binarytree(this._x, this._x0, this._x1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(2)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 2; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(2)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;","export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n i = (y < y0) << 1 | (x < x0);\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z, y1 = y0 + z; break;\n case 1: x0 = x1 - z, y1 = y0 + z; break;\n case 2: x1 = x0 + z, y0 = y1 - z; break;\n case 3: x0 = x1 - z, y0 = y1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n","export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n","export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d),\n z = +this._z.call(null, d);\n return add(this.cover(x, y, z), x, y, z, d);\n}\n\nfunction add(tree, x, y, z, d) {\n if (isNaN(x) || isNaN(y) || isNaN(z)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n z0 = tree._z0,\n x1 = tree._x1,\n y1 = tree._y1,\n z1 = tree._z1,\n xm,\n ym,\n zm,\n xp,\n yp,\n zp,\n right,\n bottom,\n deep,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n if (parent = node, !(node = node[i = deep << 2 | bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n zp = +tree._z.call(null, node.data);\n if (x === xp && y === yp && z === zp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(8) : tree._root = new Array(8);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n } while ((i = deep << 2 | bottom << 1 | right) === (j = (zp >= zm) << 2 | (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n if (!Array.isArray(data)) data = Array.from(data);\n const n = data.length;\n const xz = new Float64Array(n);\n const yz = new Float64Array(n);\n const zz = new Float64Array(n);\n let x0 = Infinity,\n y0 = Infinity,\n z0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity,\n z1 = -Infinity;\n\n // Compute the points and their extent.\n for (let i = 0, d, x, y, z; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d)) || isNaN(z = +this._z.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n zz[i] = z;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n if (z < z0) z0 = z;\n if (z > z1) z1 = z;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1 || z0 > z1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0, z0).cover(x1, y1, z1);\n\n // Add the new points.\n for (let i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], zz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y, z) {\n if (isNaN(x = +x) || isNaN(y = +y) || isNaN(z = +z)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1 = this._x1,\n y1 = this._y1,\n z1 = this._z1;\n\n // If the octree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing octant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n z1 = (z0 = Math.floor(z)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var t = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1 || z0 > z || z >= z1) {\n i = (z < z0) << 2 | (y < y0) << 1 | (x < x0);\n parent = new Array(8), parent[i] = node, node = parent, t *= 2;\n switch (i) {\n case 0: x1 = x0 + t, y1 = y0 + t, z1 = z0 + t; break;\n case 1: x0 = x1 - t, y1 = y0 + t, z1 = z0 + t; break;\n case 2: x1 = x0 + t, y0 = y1 - t, z1 = z0 + t; break;\n case 3: x0 = x1 - t, y0 = y1 - t, z1 = z0 + t; break;\n case 4: x1 = x0 + t, y1 = y0 + t, z0 = z1 - t; break;\n case 5: x0 = x1 - t, y1 = y0 + t, z0 = z1 - t; break;\n case 6: x1 = x0 + t, y0 = y1 - t, z0 = z1 - t; break;\n case 7: x0 = x1 - t, y0 = y1 - t, z0 = z1 - t; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._z0 = z0;\n this._x1 = x1;\n this._y1 = y1;\n this._z1 = z1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1], +_[0][2]).cover(+_[1][0], +_[1][1], +_[1][2])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0, this._z0], [this._x1, this._y1, this._z1]];\n}\n","export default function(node, x0, y0, z0, x1, y1, z1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.z0 = z0;\n this.x1 = x1;\n this.y1 = y1;\n this.z1 = z1;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(x, y, z, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1,\n y1,\n z1,\n x2,\n y2,\n z2,\n x3 = this._x1,\n y3 = this._y1,\n z3 = this._z1,\n octs = [],\n node = this._root,\n q,\n i;\n\n if (node) octs.push(new Octant(node, x0, y0, z0, x3, y3, z3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius, z0 = z - radius;\n x3 = x + radius, y3 = y + radius, z3 = z + radius;\n radius *= radius;\n }\n\n while (q = octs.pop()) {\n\n // Stop searching if this octant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (z1 = q.z0) > z3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0\n || (z2 = q.z1) < z0) continue;\n\n // Bisect the current octant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2,\n zm = (z1 + z2) / 2;\n\n octs.push(\n new Octant(node[7], xm, ym, zm, x2, y2, z2),\n new Octant(node[6], x1, ym, zm, xm, y2, z2),\n new Octant(node[5], xm, y1, zm, x2, ym, z2),\n new Octant(node[4], x1, y1, zm, xm, ym, z2),\n new Octant(node[3], xm, ym, z1, x2, y2, zm),\n new Octant(node[2], x1, ym, z1, xm, y2, zm),\n new Octant(node[1], xm, y1, z1, x2, ym, zm),\n new Octant(node[0], x1, y1, z1, xm, ym, zm)\n );\n\n // Visit the closest octant first.\n if (i = (z >= zm) << 2 | (y >= ym) << 1 | (x >= xm)) {\n q = octs[octs.length - 1];\n octs[octs.length - 1] = octs[octs.length - 1 - i];\n octs[octs.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n dz = z - +this._z.call(null, node.data),\n d2 = dx * dx + dy * dy + dz * dz;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d, z0 = z - d;\n x3 = x + d, y3 = y + d, z3 = z + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","const distance = (x1, y1, z1, x2, y2, z2) => Math.sqrt((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2);\n\nexport function findAllWithinRadius(x, y, z, radius) {\n const result = [];\n\n const xMin = x - radius;\n const yMin = y - radius;\n const zMin = z - radius;\n const xMax = x + radius;\n const yMax = y + radius;\n const zMax = z + radius;\n\n this.visit((node, x1, y1, z1, x2, y2, z2) => {\n if (!node.length) {\n do {\n const d = node.data;\n if (distance(x, y, z, this._x(d), this._y(d), this._z(d)) <= radius) {\n result.push(d);\n }\n } while (node = node.next);\n }\n return x1 > xMax || y1 > yMax || z1 > zMax || x2 < xMin || y2 < yMin || z2 < zMin;\n });\n\n return result;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d)) || isNaN(z = +this._z.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1 = this._x1,\n y1 = this._y1,\n z1 = this._z1,\n x,\n y,\n z,\n xm,\n ym,\n zm,\n right,\n bottom,\n deep,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n if (!(parent = node, node = node[i = deep << 2 | bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 7] || parent[(i + 2) & 7] || parent[(i + 3) & 7] || parent[(i + 4) & 7] || parent[(i + 5) & 7] || parent[(i + 6) & 7] || parent[(i + 7) & 7]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3] || parent[4] || parent[5] || parent[6] || parent[7])\n && node === (parent[7] || parent[6] || parent[5] || parent[4] || parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(callback) {\n var octs = [], q, node = this._root, child, x0, y0, z0, x1, y1, z1;\n if (node) octs.push(new Octant(node, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1));\n while (q = octs.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, z0 = q.z0, x1 = q.x1, y1 = q.y1, z1 = q.z1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2, zm = (z0 + z1) / 2;\n if (child = node[7]) octs.push(new Octant(child, xm, ym, zm, x1, y1, z1));\n if (child = node[6]) octs.push(new Octant(child, x0, ym, zm, xm, y1, z1));\n if (child = node[5]) octs.push(new Octant(child, xm, y0, zm, x1, ym, z1));\n if (child = node[4]) octs.push(new Octant(child, x0, y0, zm, xm, ym, z1));\n if (child = node[3]) octs.push(new Octant(child, xm, ym, z0, x1, y1, zm));\n if (child = node[2]) octs.push(new Octant(child, x0, ym, z0, xm, y1, zm));\n if (child = node[1]) octs.push(new Octant(child, xm, y0, z0, x1, ym, zm));\n if (child = node[0]) octs.push(new Octant(child, x0, y0, z0, xm, ym, zm));\n }\n }\n return this;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(callback) {\n var octs = [], next = [], q;\n if (this._root) octs.push(new Octant(this._root, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1));\n while (q = octs.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, z0 = q.z0, x1 = q.x1, y1 = q.y1, z1 = q.z1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2, zm = (z0 + z1) / 2;\n if (child = node[0]) octs.push(new Octant(child, x0, y0, z0, xm, ym, zm));\n if (child = node[1]) octs.push(new Octant(child, xm, y0, z0, x1, ym, zm));\n if (child = node[2]) octs.push(new Octant(child, x0, ym, z0, xm, y1, zm));\n if (child = node[3]) octs.push(new Octant(child, xm, ym, z0, x1, y1, zm));\n if (child = node[4]) octs.push(new Octant(child, x0, y0, zm, xm, ym, z1));\n if (child = node[5]) octs.push(new Octant(child, xm, y0, zm, x1, ym, z1));\n if (child = node[6]) octs.push(new Octant(child, x0, ym, zm, xm, y1, z1));\n if (child = node[7]) octs.push(new Octant(child, xm, ym, zm, x1, y1, z1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.z0, q.x1, q.y1, q.z1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","export function defaultZ(d) {\n return d[2];\n}\n\nexport default function(_) {\n return arguments.length ? (this._z = _, this) : this._z;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport { findAllWithinRadius as tree_findAllWithinRadius } from \"./findAll.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\nimport tree_z, {defaultZ} from \"./z.js\";\n\nexport default function octree(nodes, x, y, z) {\n var tree = new Octree(x == null ? defaultX : x, y == null ? defaultY : y, z == null ? defaultZ : z, NaN, NaN, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Octree(x, y, z, x0, y0, z0, x1, y1, z1) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._x0 = x0;\n this._y0 = y0;\n this._z0 = z0;\n this._x1 = x1;\n this._y1 = y1;\n this._z1 = z1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = octree.prototype = Octree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Octree(this._x, this._y, this._z, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(8)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 8; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(8)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.findAllWithinRadius = tree_findAllWithinRadius;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\ntreeProto.z = tree_z;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(random) {\n return (random() - 0.5) * 1e-6;\n}\n","import constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\n\nfunction index(d) {\n return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"node not found: \" + nodeId);\n return node;\n}\n\nexport default function(links) {\n var id = index,\n strength = defaultStrength,\n strengths,\n distance = constant(30),\n distances,\n nodes,\n nDim,\n count,\n bias,\n random,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x = 0, y = 0, z = 0, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle(random);\n if (nDim > 1) { y = target.y + target.vy - source.y - source.vy || jiggle(random); }\n if (nDim > 2) { z = target.z + target.vz - source.z - source.vz || jiggle(random); }\n l = Math.sqrt(x * x + y * y + z * z);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l, z *= l;\n\n target.vx -= x * (b = bias[i]);\n if (nDim > 1) { target.vy -= y * b; }\n if (nDim > 2) { target.vz -= z * b; }\n\n source.vx += x * (b = 1 - b);\n if (nDim > 1) { source.vy += y * b; }\n if (nDim > 2) { source.vz += z * b; }\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_nodes, ...args) {\n nodes = _nodes;\n random = args.find(arg => typeof arg === 'function') || Math.random;\n nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n}\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\n\nexport default function() {\n let s = 1;\n return () => (s = (a * s + c) % m) / m;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer} from \"d3-timer\";\nimport lcg from \"./lcg.js\";\n\nvar MAX_DIMENSIONS = 3;\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nexport function z(d) {\n return d.z;\n}\n\nvar initialRadius = 10,\n initialAngleRoll = Math.PI * (3 - Math.sqrt(5)), // Golden ratio angle\n initialAngleYaw = Math.PI * 20 / (9 + Math.sqrt(221)); // Markov irrational number\n\nexport default function(nodes, numDimensions) {\n numDimensions = numDimensions || 2;\n\n var nDim = Math.min(MAX_DIMENSIONS, Math.max(1, Math.round(numDimensions))),\n simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = new Map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\"),\n random = lcg();\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick(iterations) {\n var i, n = nodes.length, node;\n\n if (iterations === undefined) iterations = 1;\n\n for (var k = 0; k < iterations; ++k) {\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.forEach(function (force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (nDim > 1) {\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n if (nDim > 2) {\n if (node.fz == null) node.z += node.vz *= velocityDecay;\n else node.z = node.fz, node.vz = 0;\n }\n }\n }\n\n return simulation;\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (node.fx != null) node.x = node.fx;\n if (node.fy != null) node.y = node.fy;\n if (node.fz != null) node.z = node.fz;\n if (isNaN(node.x) || (nDim > 1 && isNaN(node.y)) || (nDim > 2 && isNaN(node.z))) {\n var radius = initialRadius * (nDim > 2 ? Math.cbrt(0.5 + i) : (nDim > 1 ? Math.sqrt(0.5 + i) : i)),\n rollAngle = i * initialAngleRoll,\n yawAngle = i * initialAngleYaw;\n\n if (nDim === 1) {\n node.x = radius;\n } else if (nDim === 2) {\n node.x = radius * Math.cos(rollAngle);\n node.y = radius * Math.sin(rollAngle);\n } else { // 3 dimensions: use spherical distribution along 2 irrational number angles\n node.x = radius * Math.sin(rollAngle) * Math.cos(yawAngle);\n node.y = radius * Math.cos(rollAngle);\n node.z = radius * Math.sin(rollAngle) * Math.sin(yawAngle);\n }\n }\n if (isNaN(node.vx) || (nDim > 1 && isNaN(node.vy)) || (nDim > 2 && isNaN(node.vz))) {\n node.vx = 0;\n if (nDim > 1) { node.vy = 0; }\n if (nDim > 2) { node.vz = 0; }\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes, random, nDim);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n numDimensions: function(_) {\n return arguments.length\n ? (nDim = Math.min(MAX_DIMENSIONS, Math.max(1, Math.round(_))), forces.forEach(initializeForce), simulation)\n : nDim;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n randomSource: function(_) {\n return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function() {\n var args = Array.prototype.slice.call(arguments);\n var x = args.shift() || 0,\n y = (nDim > 1 ? args.shift() : null) || 0,\n z = (nDim > 2 ? args.shift() : null) || 0,\n radius = args.shift() || Infinity;\n\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n dz,\n d2,\n node,\n closest;\n\n radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - (node.y || 0);\n dz = z - (node.z ||0);\n d2 = dx * dx + dy * dy + dz * dz;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n","import {binarytree} from \"d3-binarytree\";\nimport {quadtree} from \"d3-quadtree\";\nimport {octree} from \"d3-octree\";\nimport constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\nimport {x, y, z} from \"./simulation.js\";\n\nexport default function() {\n var nodes,\n nDim,\n node,\n random,\n alpha,\n strength = constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i,\n n = nodes.length,\n tree =\n (nDim === 1 ? binarytree(nodes, x)\n :(nDim === 2 ? quadtree(nodes, x, y)\n :(nDim === 3 ? octree(nodes, x, y, z)\n :null\n ))).visitAfter(accumulate);\n\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(treeNode) {\n var strength = 0, q, c, weight = 0, x, y, z, i;\n var numChildren = treeNode.length;\n\n // For internal nodes, accumulate forces from children.\n if (numChildren) {\n for (x = y = z = i = 0; i < numChildren; ++i) {\n if ((q = treeNode[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * (q.x || 0), y += c * (q.y || 0), z += c * (q.z || 0);\n }\n }\n strength *= Math.sqrt(4 / numChildren); // scale accumulated strength according to number of dimensions\n\n treeNode.x = x / weight;\n if (nDim > 1) { treeNode.y = y / weight; }\n if (nDim > 2) { treeNode.z = z / weight; }\n }\n\n // For leaf nodes, accumulate forces from coincident nodes.\n else {\n q = treeNode;\n q.x = q.data.x;\n if (nDim > 1) { q.y = q.data.y; }\n if (nDim > 2) { q.z = q.data.z; }\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n treeNode.value = strength;\n }\n\n function apply(treeNode, x1, arg1, arg2, arg3) {\n if (!treeNode.value) return true;\n var x2 = [arg1, arg2, arg3][nDim-1];\n\n var x = treeNode.x - node.x,\n y = (nDim > 1 ? treeNode.y - node.y : 0),\n z = (nDim > 2 ? treeNode.z - node.z : 0),\n w = x2 - x1,\n l = x * x + y * y + z * z;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (nDim > 1 && y === 0) y = jiggle(random), l += y * y;\n if (nDim > 2 && z === 0) z = jiggle(random), l += z * z;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * treeNode.value * alpha / l;\n if (nDim > 1) { node.vy += y * treeNode.value * alpha / l; }\n if (nDim > 2) { node.vz += z * treeNode.value * alpha / l; }\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (treeNode.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (treeNode.data !== node || treeNode.next) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (nDim > 1 && y === 0) y = jiggle(random), l += y * y;\n if (nDim > 2 && z === 0) z = jiggle(random), l += z * z;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (treeNode.data !== node) {\n w = strengths[treeNode.data.index] * alpha / l;\n node.vx += x * w;\n if (nDim > 1) { node.vy += y * w; }\n if (nDim > 2) { node.vz += z * w; }\n } while (treeNode = treeNode.next);\n }\n\n force.initialize = function(_nodes, ...args) {\n nodes = _nodes;\n random = args.find(arg => typeof arg === 'function') || Math.random;\n nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n}\n","/**\n * Subgraph extraction via BFS with budget-based node pruning.\n */\nimport type { GraphData, GraphNode, GraphLink } from \"../types\";\n\nexport interface SubgraphResult {\n nodes: GraphNode[];\n links: GraphLink[];\n /** Map of node ID → hop distance from center */\n hops: Map<string, number>;\n}\n\nexport interface SubgraphOptions {\n maxHops?: number;\n maxNodes?: number;\n}\n\n/**\n * Build a subgraph of N-hop neighborhood around a center node.\n * Uses budget-based pruning: all hop 0-1 nodes are kept,\n * then top nodes by `val` for remaining hops.\n */\nexport function buildSubgraph(\n data: GraphData,\n centerNodeId: string,\n adjacencyMap: Map<string, string[]>,\n options?: SubgraphOptions\n): SubgraphResult {\n const maxHops = options?.maxHops ?? 3;\n const maxNodes = options?.maxNodes ?? 250;\n\n // BFS\n const visited = new Map<string, number>();\n visited.set(centerNodeId, 0);\n const queue = [centerNodeId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const dist = visited.get(current)!;\n if (dist >= maxHops) continue;\n for (const nb of adjacencyMap.get(current) ?? []) {\n if (!visited.has(nb)) {\n visited.set(nb, dist + 1);\n queue.push(nb);\n }\n }\n }\n\n // Budget-based pruning\n if (visited.size > maxNodes) {\n const nodeMap = new Map<string, GraphNode>();\n for (const n of data.nodes) {\n if (visited.has(n.id)) nodeMap.set(n.id, n);\n }\n\n const kept = new Map<string, number>();\n for (const [id, hop] of visited) {\n if (hop <= 1) kept.set(id, hop);\n }\n\n const rest: { id: string; hop: number; val: number }[] = [];\n for (const [id, hop] of visited) {\n if (hop > 1) rest.push({ id, hop, val: nodeMap.get(id)?.val ?? 0 });\n }\n rest.sort((a, b) => b.val - a.val);\n\n const budget = maxNodes - kept.size;\n for (let i = 0; i < Math.min(budget, rest.length); i++) {\n kept.set(rest[i].id, rest[i].hop);\n }\n\n visited.clear();\n for (const [id, hop] of kept) visited.set(id, hop);\n }\n\n const subNodes = data.nodes.filter((n) => visited.has(n.id));\n const subLinks = data.links.filter((l) => {\n const s = typeof l.source === \"object\" ? (l.source as any).id : l.source;\n const t = typeof l.target === \"object\" ? (l.target as any).id : l.target;\n return visited.has(s) && visited.has(t);\n });\n\n return { nodes: subNodes, links: subLinks, hops: visited };\n}\n","/**\n * SubgraphView2D — 2D Canvas force-directed subgraph renderer.\n * Renders a mini neighborhood graph centered on a specific node.\n */\nimport {\n useEffect,\n useRef,\n useCallback,\n useMemo,\n useState,\n type CSSProperties,\n} from \"react\";\nimport {\n forceSimulation,\n forceManyBody,\n forceLink,\n forceCenter,\n} from \"d3-force-3d\";\nimport type { GraphData, GraphNode, ThemeConfig } from \"../types\";\nimport { resolveTheme, type ResolvedTheme } from \"../themes/resolve-theme\";\nimport { buildAdjacencyMapFromLinks } from \"../core/selection\";\nimport { buildSubgraph, type SubgraphOptions } from \"./subgraph-builder\";\n\nexport interface SubgraphView2DProps {\n /** Full graph data */\n data: GraphData;\n /** Center node ID to build subgraph around */\n centerNodeId: string;\n /** Max hops from center (default: 3) */\n maxHops?: number;\n /** Max nodes in subgraph (default: 250) */\n maxNodes?: number;\n /** Theme config or preset name */\n theme?: ThemeConfig | string;\n /** Click on a node */\n onNodeClick?: (node: GraphNode) => void;\n /** Hover on a node */\n onNodeHover?: (node: GraphNode | null) => void;\n /** Custom label formatter */\n labelFormatter?: (node: GraphNode) => string;\n /** Container style overrides */\n style?: CSSProperties;\n /** Container class name */\n className?: string;\n}\n\ninterface SimNode {\n id: string;\n label: string;\n type?: string;\n val: number;\n hop: number;\n x: number;\n y: number;\n fx?: number | null;\n fy?: number | null;\n _radius?: number;\n}\n\nfunction defaultLabelText(node: GraphNode): string {\n const label = node.label ?? node.id ?? \"\";\n return label.length > 25 ? label.substring(0, 22) + \"\\u2026\" : label;\n}\n\nexport function SubgraphView2D(props: SubgraphView2DProps) {\n const {\n data,\n centerNodeId,\n maxHops = 3,\n maxNodes = 250,\n theme: themeProp,\n onNodeClick,\n onNodeHover,\n labelFormatter,\n style: styleProp,\n className,\n } = props;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const simNodesRef = useRef<SimNode[]>([]);\n const [hoveredNode, setHoveredNode] = useState<SimNode | null>(null);\n\n const resolvedTheme = useMemo(() => resolveTheme(themeProp), [themeProp]);\n\n const adjacencyMap = useMemo(\n () => buildAdjacencyMapFromLinks(data.links),\n [data.links]\n );\n\n const subgraph = useMemo(\n () =>\n buildSubgraph(data, centerNodeId, adjacencyMap, { maxHops, maxNodes }),\n [data, centerNodeId, adjacencyMap, maxHops, maxNodes]\n );\n\n /* ── 2D Force simulation + Canvas render ── */\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || subgraph.nodes.length === 0) return;\n\n const container = canvas.parentElement;\n if (!container) return;\n const width = container.clientWidth;\n const height = container.clientHeight;\n if (width === 0 || height === 0) return;\n\n const dpr = Math.min(window.devicePixelRatio, 2);\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.style.width = width + \"px\";\n canvas.style.height = height + \"px\";\n const ctx = canvas.getContext(\"2d\")!;\n ctx.scale(dpr, dpr);\n\n const theme = resolvedTheme;\n const linkColors: Record<string, string> = {};\n\n // Build sim nodes\n const simNodes: SimNode[] = subgraph.nodes.map((n) => {\n const hop = subgraph.hops.get(n.id) ?? 3;\n return {\n id: n.id,\n label: n.label ?? n.id,\n type: n.type,\n val: n.val ?? 1,\n hop,\n x: (Math.random() - 0.5) * width * 0.3,\n y: (Math.random() - 0.5) * height * 0.3,\n };\n });\n\n // Fix center node at origin\n const centerNode = simNodes.find((n) => n.id === centerNodeId);\n if (centerNode) {\n centerNode.fx = 0;\n centerNode.fy = 0;\n }\n simNodesRef.current = simNodes;\n\n const simLinks = subgraph.links.map((l) => ({\n source: typeof l.source === \"object\" ? (l.source as any).id : l.source,\n target: typeof l.target === \"object\" ? (l.target as any).id : l.target,\n type: l.type,\n }));\n\n const nc = simNodes.length;\n const sim = forceSimulation(simNodes, 2)\n .force(\n \"charge\",\n forceManyBody()\n .strength(nc > 200 ? -40 : nc > 80 ? -70 : -120)\n .distanceMax(nc > 200 ? 200 : 300)\n )\n .force(\n \"link\",\n forceLink(simLinks)\n .id((d: any) => d.id)\n .distance(nc > 200 ? 25 : nc > 80 ? 40 : 60)\n .strength(0.3)\n )\n .force(\"center\", forceCenter())\n .alphaDecay(0.04)\n .velocityDecay(0.4);\n\n let animFrame: number;\n\n function render() {\n ctx.clearRect(0, 0, width, height);\n ctx.save();\n ctx.translate(width / 2, height / 2);\n\n // ── Edges ──\n for (const link of simLinks) {\n const s = link.source as any;\n const t = link.target as any;\n if (typeof s !== \"object\" || typeof t !== \"object\") continue;\n const maxHop = Math.max(s.hop ?? 3, t.hop ?? 3);\n ctx.beginPath();\n ctx.moveTo(s.x, s.y);\n ctx.lineTo(t.x, t.y);\n ctx.strokeStyle = theme.linkColor(link.type);\n ctx.globalAlpha = maxHop <= 1 ? 0.4 : maxHop <= 2 ? 0.18 : 0.07;\n ctx.lineWidth = maxHop <= 1 ? 1.5 : 1;\n ctx.stroke();\n }\n\n // ── Nodes ──\n for (const n of simNodes) {\n const isCenter = n.id === centerNodeId;\n const baseR = Math.max(\n 3,\n 3 + (Math.log(n.val + 1) / Math.log(100)) * 6\n );\n const radius = isCenter ? 14 : Math.max(3, baseR - n.hop * 0.8);\n const alpha =\n n.hop === 0 ? 1 : n.hop === 1 ? 0.9 : n.hop === 2 ? 0.55 : 0.3;\n\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.arc(n.x, n.y, radius, 0, Math.PI * 2);\n ctx.fillStyle = theme.nodeColor(n.type);\n ctx.fill();\n\n if (isCenter) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = \"#ffffff\";\n ctx.lineWidth = 2.5;\n ctx.stroke();\n // Glow\n ctx.save();\n ctx.shadowColor = theme.nodeColor(n.type);\n ctx.shadowBlur = 15;\n ctx.beginPath();\n ctx.arc(n.x, n.y, radius + 3, 0, Math.PI * 2);\n ctx.strokeStyle = theme.nodeColor(n.type);\n ctx.lineWidth = 1.5;\n ctx.globalAlpha = 0.6;\n ctx.stroke();\n ctx.restore();\n }\n\n n._radius = radius;\n }\n\n // ── Labels ──\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"bottom\";\n for (const n of simNodes) {\n if (n.hop > 1 && n.val < 50) continue;\n const isCenter = n.id === centerNodeId;\n const fontSize = isCenter ? 13 : n.hop <= 1 ? 11 : 9;\n ctx.font = `bold ${fontSize}px -apple-system, \"Segoe UI\", sans-serif`;\n ctx.globalAlpha = isCenter ? 1 : n.hop <= 1 ? 0.8 : 0.4;\n\n const label = labelFormatter\n ? labelFormatter(\n subgraph.nodes.find((sn) => sn.id === n.id) ?? {\n id: n.id,\n label: n.label,\n }\n )\n : defaultLabelText({ id: n.id, label: n.label });\n const yOff = (n._radius ?? 5) + 4;\n\n // Shadow\n ctx.fillStyle = \"rgba(0,0,0,0.85)\";\n ctx.fillText(label, n.x + 1, n.y - yOff + 1);\n // Text\n ctx.fillStyle = isCenter\n ? \"#ffffff\"\n : theme.nodeColorBright(n.type);\n ctx.fillText(label, n.x, n.y - yOff);\n }\n\n ctx.restore();\n }\n\n sim.on(\"tick\", () => {\n cancelAnimationFrame(animFrame);\n animFrame = requestAnimationFrame(render);\n });\n\n return () => {\n sim.stop();\n cancelAnimationFrame(animFrame);\n };\n }, [subgraph, centerNodeId, resolvedTheme, labelFormatter]);\n\n /* ── Hit testing ── */\n const hitTest = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>): SimNode | null => {\n const canvas = canvasRef.current;\n if (!canvas) return null;\n const rect = canvas.getBoundingClientRect();\n const mx = e.clientX - rect.left - rect.width / 2;\n const my = e.clientY - rect.top - rect.height / 2;\n for (const n of simNodesRef.current) {\n const dx = n.x - mx;\n const dy = n.y - my;\n const r = (n._radius ?? 5) + 5;\n if (dx * dx + dy * dy < r * r) return n;\n }\n return null;\n },\n []\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n const hit = hitTest(e);\n setHoveredNode(hit);\n if (onNodeHover) {\n if (hit) {\n const node = subgraph.nodes.find((n) => n.id === hit.id);\n onNodeHover(node ?? null);\n } else {\n onNodeHover(null);\n }\n }\n },\n [hitTest, onNodeHover, subgraph.nodes]\n );\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n const hit = hitTest(e);\n if (hit && hit.id !== centerNodeId && onNodeClick) {\n const node = subgraph.nodes.find((n) => n.id === hit.id);\n if (node) onNodeClick(node);\n }\n },\n [hitTest, centerNodeId, onNodeClick, subgraph.nodes]\n );\n\n const containerStyle: CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n ...styleProp,\n };\n\n return (\n <div className={className} style={containerStyle}>\n <canvas\n ref={canvasRef}\n onMouseMove={handleMouseMove}\n onClick={handleClick}\n style={{\n width: \"100%\",\n height: \"100%\",\n cursor: hoveredNode ? \"pointer\" : \"default\",\n }}\n />\n </div>\n );\n}\n","/**\n * NodeDetailPanel — Full-featured node detail modal/panel.\n *\n * Uses the SAME NetworkGraph3D (Three.js 3D renderer) for the\n * neighborhood subgraph — identical rendering quality as the main graph.\n *\n * Features:\n * - Node overview with custom metadata via renderNodeMeta\n * - Direct connections grouped by type (expand/collapse)\n * - 3-hop neighborhood rendered in full 3D (NetworkGraph3D)\n * - Keyboard: Escape to close (capture phase)\n * - Overlay click to close\n * - Navigation between nodes via connections or subgraph clicks\n */\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n type CSSProperties,\n} from \"react\";\nimport type { GraphData, GraphNode, GraphLink, ThemeConfig, NetworkGraph3DRef } from \"../types\";\nimport { resolveTheme } from \"../themes/resolve-theme\";\nimport { buildAdjacencyMapFromLinks } from \"../core/selection\";\nimport { buildSubgraph } from \"../subgraph/subgraph-builder\";\nimport { NetworkGraph3D } from \"../core/NetworkGraph3D\";\n\n/* ── Types ── */\n\nexport interface ConnectionGroup {\n title: string;\n type: string;\n nodes: GraphNode[];\n}\n\nexport interface NodeDetailPanelProps {\n node: GraphNode;\n data: GraphData;\n adjacencyMap?: Map<string, string[]>;\n onClose: () => void;\n onNodeNavigate: (node: GraphNode) => void;\n theme?: ThemeConfig | string;\n labelFormatter?: (node: GraphNode) => string;\n maxHops?: number;\n maxNodes?: number;\n renderNodeMeta?: (node: GraphNode) => ReactNode;\n groupConnections?: (directNeighbors: GraphNode[], links: GraphLink[]) => ConnectionGroup[];\n connectionLabel?: (node: GraphNode) => string;\n connectionSecondary?: (node: GraphNode) => ReactNode;\n modal?: boolean;\n className?: string;\n style?: CSSProperties;\n}\n\n/* ── Default grouping: by node.type ── */\nfunction defaultGroupConnections(neighbors: GraphNode[]): ConnectionGroup[] {\n const byType = new Map<string, GraphNode[]>();\n for (const n of neighbors) {\n const t = n.type ?? \"unknown\";\n let group = byType.get(t);\n if (!group) { group = []; byType.set(t, group); }\n group.push(n);\n }\n const groups: ConnectionGroup[] = [];\n for (const [type, nodes] of byType) {\n nodes.sort((a, b) => (b.val ?? 0) - (a.val ?? 0));\n groups.push({ title: type.charAt(0).toUpperCase() + type.slice(1) + \"s\", type, nodes });\n }\n return groups;\n}\n\n/* ── Get direct (hop-1) connections ── */\nfunction getDirectConnections(\n nodeId: string,\n subgraphNodes: GraphNode[],\n subgraphLinks: GraphLink[],\n hops: Map<string, number>\n): GraphNode[] {\n const neighborIds = new Set<string>();\n for (const link of subgraphLinks) {\n const s = typeof link.source === \"object\" ? (link.source as any).id : link.source;\n const t = typeof link.target === \"object\" ? (link.target as any).id : link.target;\n const otherId = s === nodeId ? t : t === nodeId ? s : null;\n if (otherId && hops.get(otherId) === 1) neighborIds.add(otherId);\n }\n return subgraphNodes.filter((n) => neighborIds.has(n.id));\n}\n\n/* ── Expandable connection group ── */\nfunction ConnectionGroupView({\n group, onNodeClick, connectionLabel, connectionSecondary, theme,\n}: {\n group: ConnectionGroup;\n onNodeClick: (node: GraphNode) => void;\n connectionLabel?: (node: GraphNode) => string;\n connectionSecondary?: (node: GraphNode) => ReactNode;\n theme: ReturnType<typeof resolveTheme>;\n}) {\n const [expanded, setExpanded] = useState(group.nodes.length <= 8);\n const shown = expanded ? group.nodes : group.nodes.slice(0, 5);\n\n return (\n <div style={{ marginBottom: 12 }}>\n <div\n onClick={() => setExpanded((v) => !v)}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8, cursor: \"pointer\", fontSize: 13, fontWeight: 600, color: \"#c9d1d9\", padding: \"4px 0\" }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: theme.nodeColor(group.type), flexShrink: 0 }} />\n {group.title}\n <span style={{ fontSize: 11, color: \"#8b949e\", background: \"#21262d\", borderRadius: 10, padding: \"1px 7px\", marginLeft: 4 }}>\n {group.nodes.length}\n </span>\n <span style={{ marginLeft: \"auto\", color: \"#8b949e\", fontSize: 11 }}>\n {expanded ? \"\\u25BE\" : \"\\u25B8\"}\n </span>\n </div>\n <div style={{ paddingLeft: 16 }}>\n {shown.map((n) => (\n <div\n key={n.id}\n onClick={() => onNodeClick(n)}\n style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", padding: \"4px 8px\", fontSize: 13, color: \"#c9d1d9\", cursor: \"pointer\", borderRadius: 4 }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.background = \"#161b22\"; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.background = \"transparent\"; }}\n >\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {connectionLabel ? connectionLabel(n) : (n.label ?? n.id)}\n </span>\n {connectionSecondary ? (\n <span style={{ fontSize: 12, color: \"#8b949e\", flexShrink: 0, marginLeft: 8 }}>{connectionSecondary(n)}</span>\n ) : (\n n.val != null && n.val > 1 && (\n <span style={{ fontSize: 12, color: \"#8b949e\", flexShrink: 0, marginLeft: 8 }}>{n.val}</span>\n )\n )}\n </div>\n ))}\n {!expanded && group.nodes.length > 5 && (\n <div onClick={() => setExpanded(true)} style={{ fontSize: 12, color: \"#58a6ff\", cursor: \"pointer\", padding: \"4px 8px\" }}>\n +{group.nodes.length - 5} more\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Main Component ── */\nexport function NodeDetailPanel(props: NodeDetailPanelProps) {\n const {\n node, data, adjacencyMap: adjacencyMapProp, onClose, onNodeNavigate,\n theme: themeProp, labelFormatter, maxHops = 3, maxNodes = 250,\n renderNodeMeta, groupConnections, connectionLabel, connectionSecondary,\n modal = true, className, style: styleProp,\n } = props;\n\n const graphRef = useRef<NetworkGraph3DRef>(null);\n const resolvedTheme = useMemo(() => resolveTheme(themeProp), [themeProp]);\n\n /* ── Navigation history ── */\n const [currentNode, setCurrentNode] = useState<GraphNode>(node);\n const [history, setHistory] = useState<GraphNode[]>([]);\n const [forwardStack, setForwardStack] = useState<GraphNode[]>([]);\n\n /** Internal navigation — updates modal state only, does NOT touch main graph */\n function navigateTo(target: GraphNode) {\n setHistory((prev) => [...prev, currentNode]);\n setCurrentNode(target);\n setForwardStack([]);\n }\n\n function navigateBack() {\n if (history.length === 0) return;\n const prev = history[history.length - 1];\n setHistory((h) => h.slice(0, -1));\n setForwardStack((f) => [currentNode, ...f]);\n setCurrentNode(prev);\n }\n\n function navigateForward() {\n if (forwardStack.length === 0) return;\n const next = forwardStack[0];\n setHistory((h) => [...h, currentNode]);\n setForwardStack((f) => f.slice(1));\n setCurrentNode(next);\n }\n\n /** Navigate to node AND notify parent (e.g. close modal + focus main graph) */\n function navigateToMain(target: GraphNode) {\n onNodeNavigate(target);\n }\n\n const adjacencyMap = useMemo(\n () => adjacencyMapProp ?? buildAdjacencyMapFromLinks(data.links),\n [adjacencyMapProp, data.links]\n );\n\n const subgraph = useMemo(\n () => buildSubgraph(data, currentNode.id, adjacencyMap, { maxHops, maxNodes }),\n [data, currentNode.id, adjacencyMap, maxHops, maxNodes]\n );\n\n // Build subgraph GraphData for the 3D renderer\n const subgraphData: GraphData = useMemo(() => ({\n nodes: subgraph.nodes,\n links: subgraph.links,\n }), [subgraph]);\n\n const directNeighbors = useMemo(\n () => getDirectConnections(currentNode.id, subgraph.nodes, subgraph.links, subgraph.hops),\n [currentNode.id, subgraph]\n );\n\n const connGroups = useMemo(\n () => groupConnections ? groupConnections(directNeighbors, subgraph.links) : defaultGroupConnections(directNeighbors),\n [directNeighbors, subgraph.links, groupConnections]\n );\n\n const subStats = useMemo(() => {\n const byType: Record<string, number> = {};\n for (const n of subgraph.nodes) { const t = n.type ?? \"unknown\"; byType[t] = (byType[t] || 0) + 1; }\n return { total: subgraph.nodes.length, edges: subgraph.links.length, byType };\n }, [subgraph]);\n\n const totalConns = directNeighbors.length;\n\n // Escape to close (capture phase — fires before container-scoped graph handlers)\n // Use stopImmediatePropagation to prevent any other window handlers from firing\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopImmediatePropagation();\n onClose();\n }\n };\n window.addEventListener(\"keydown\", handler, true);\n return () => window.removeEventListener(\"keydown\", handler, true);\n }, [onClose]);\n\n // Focus the selected node in subgraph after layout settles\n useEffect(() => {\n const timer = setTimeout(() => {\n graphRef.current?.focusNode(currentNode.id, 800);\n }, 1500);\n return () => clearTimeout(timer);\n }, [currentNode.id]);\n\n /** Single click in subgraph → navigate within modal */\n function handleSubgraphClick(clickedNode: GraphNode | null) {\n if (clickedNode && clickedNode.id !== currentNode.id) {\n navigateTo(clickedNode);\n }\n }\n\n /** Double click in subgraph → close modal and navigate in main graph */\n function handleSubgraphDoubleClick(clickedNode: GraphNode) {\n if (clickedNode.id !== currentNode.id) {\n navigateToMain(clickedNode);\n }\n }\n\n const nodeLabel = currentNode.label ?? currentNode.id;\n\n const content = (\n <div\n style={{\n display: \"flex\", flexDirection: \"column\", width: \"100%\", height: \"100%\",\n background: \"#0d1117\", borderRadius: modal ? 12 : 0, overflow: \"hidden\",\n border: modal ? \"1px solid #30363d\" : \"none\", ...styleProp,\n }}\n className={className}\n onClick={(e) => e.stopPropagation()}\n >\n {/* ── Header ── */}\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"16px 20px\", borderBottom: \"1px solid #21262d\", flexShrink: 0 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, minWidth: 0 }}>\n {/* Back / Forward navigation */}\n <div style={{ display: \"flex\", gap: 2, flexShrink: 0 }}>\n <NavBtn\n disabled={history.length === 0}\n onClick={navigateBack}\n title=\"Back\"\n >\n {\"\\u2190\"}\n </NavBtn>\n <NavBtn\n disabled={forwardStack.length === 0}\n onClick={navigateForward}\n title=\"Forward\"\n >\n {\"\\u2192\"}\n </NavBtn>\n </div>\n {currentNode.type && (\n <span style={{\n fontSize: 11, fontWeight: 600, padding: \"2px 10px\", borderRadius: 12,\n background: resolvedTheme.nodeColor(currentNode.type) + \"22\",\n color: resolvedTheme.nodeColor(currentNode.type),\n textTransform: \"uppercase\", letterSpacing: 0.5, flexShrink: 0,\n }}>\n {currentNode.type}\n </span>\n )}\n <h2 style={{ margin: 0, fontSize: 18, fontWeight: 600, color: \"#f0f6fc\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {nodeLabel}\n </h2>\n {history.length > 0 && (\n <span style={{ fontSize: 11, color: \"#484f58\", flexShrink: 0 }}>\n ({history.length + 1} visited)\n </span>\n )}\n </div>\n <button onClick={onClose} style={{ background: \"none\", border: \"none\", color: \"#8b949e\", fontSize: 20, cursor: \"pointer\", padding: \"4px 8px\", lineHeight: 1, flexShrink: 0 }}>\n {\"\\u2715\"}\n </button>\n </div>\n\n {/* ── Body: two-column layout ── */}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\", minHeight: 0 }}>\n {/* Left: info panel */}\n <div style={{ width: \"38%\", minWidth: 260, maxWidth: 400, overflowY: \"auto\", padding: 20, borderRight: \"1px solid #21262d\" }}>\n {/* Overview */}\n <div style={{ marginBottom: 20 }}>\n <h3 style={{ fontSize: 13, color: \"#8b949e\", margin: \"0 0 12px 0\", fontWeight: 600 }}>OVERVIEW</h3>\n {(currentNode as any).description && (\n <p style={{ fontSize: 13, color: \"#c9d1d9\", margin: \"0 0 12px 0\", lineHeight: 1.5 }}>{(currentNode as any).description}</p>\n )}\n {renderNodeMeta ? renderNodeMeta(currentNode) : (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n {currentNode.val != null && <MetaItem label=\"Weight\" value={String(currentNode.val)} />}\n {currentNode.type && <MetaItem label=\"Type\" value={currentNode.type} />}\n </div>\n )}\n </div>\n\n {/* Direct Connections */}\n <div style={{ marginBottom: 20 }}>\n <h3 style={{ fontSize: 13, color: \"#8b949e\", margin: \"0 0 12px 0\", fontWeight: 600, display: \"flex\", alignItems: \"center\", gap: 8 }}>\n DIRECT CONNECTIONS\n <span style={{ fontSize: 11, background: \"#21262d\", borderRadius: 10, padding: \"1px 8px\", color: \"#c9d1d9\" }}>{totalConns}</span>\n </h3>\n {connGroups.map((group) => (\n <ConnectionGroupView\n key={group.type} group={group} onNodeClick={navigateTo}\n connectionLabel={connectionLabel} connectionSecondary={connectionSecondary} theme={resolvedTheme}\n />\n ))}\n {totalConns === 0 && <p style={{ fontSize: 13, color: \"#484f58\" }}>No direct connections found</p>}\n </div>\n\n {/* Neighborhood summary */}\n <div style={{ padding: \"12px 0\", borderTop: \"1px solid #21262d\", fontSize: 12, color: \"#8b949e\" }}>\n <div>{Object.entries(subStats.byType).map(([type, count]) => `${count} ${type}`).join(\" \\u00B7 \")}</div>\n <div style={{ marginTop: 4, fontSize: 11, color: \"#484f58\" }}>{subStats.edges} edges in {maxHops}-hop neighborhood</div>\n </div>\n </div>\n\n {/* Right: 3D neighborhood graph (same renderer as main) */}\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", minWidth: 0 }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", padding: \"10px 16px\", borderBottom: \"1px solid #21262d\", fontSize: 13, flexShrink: 0 }}>\n <span style={{ color: \"#c9d1d9\", fontWeight: 600 }}>{maxHops}-Hop Neighborhood</span>\n <span style={{ color: \"#8b949e\", fontSize: 12 }}>{subStats.total} nodes · {subStats.edges} edges</span>\n </div>\n <div style={{ flex: 1, position: \"relative\" }}>\n <NetworkGraph3D\n ref={graphRef}\n data={subgraphData}\n theme={themeProp}\n selectedNodeId={currentNode.id}\n highlightHops={maxHops}\n onNodeClick={handleSubgraphClick}\n onNodeDoubleClick={handleSubgraphDoubleClick}\n labelFormatter={labelFormatter}\n style={{\n bloomStrength: 0.6,\n bloomRadius: 0.1,\n bloomThreshold: 0.1,\n fogDensity: 0.0004,\n nodeMinSize: 1,\n nodeMaxSize: 15,\n starField: true,\n }}\n />\n {/* Floating controls */}\n <div style={{ position: \"absolute\", top: 12, right: 12, display: \"flex\", flexDirection: \"column\", gap: 4, zIndex: 50 }}>\n <CtrlBtn title=\"Zoom to Fit\" onClick={() => graphRef.current?.zoomToFit(800, 100)}>&#x2302;</CtrlBtn>\n <CtrlBtn title=\"Zoom In\" onClick={() => graphRef.current?.zoomIn()}>+</CtrlBtn>\n <CtrlBtn title=\"Zoom Out\" onClick={() => graphRef.current?.zoomOut()}>&minus;</CtrlBtn>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n\n if (!modal) return content;\n\n return (\n <div\n onClick={onClose}\n style={{ position: \"fixed\", inset: 0, zIndex: 10000, background: \"rgba(0,0,0,0.65)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: 40 }}\n >\n <div style={{ width: \"92vw\", maxWidth: 1200, height: \"82vh\", maxHeight: 800 }}>\n {content}\n </div>\n </div>\n );\n}\n\n/* ── Helper components ── */\nfunction MetaItem({ label, value }: { label: string; value: string }) {\n return (\n <div style={{ background: \"#161b22\", borderRadius: 6, padding: \"8px 12px\" }}>\n <div style={{ fontSize: 11, color: \"#8b949e\", marginBottom: 2 }}>{label}</div>\n <div style={{ fontSize: 15, fontWeight: 600, color: \"#f0f6fc\" }}>{value}</div>\n </div>\n );\n}\n\nfunction NavBtn({ children, title, onClick, disabled }: { children: ReactNode; title: string; onClick: () => void; disabled: boolean }) {\n return (\n <button\n title={title}\n onClick={onClick}\n disabled={disabled}\n style={{\n width: 28, height: 28, border: \"1px solid #30363d\", borderRadius: 6,\n background: disabled ? \"transparent\" : \"#21262d\",\n color: disabled ? \"#30363d\" : \"#c9d1d9\",\n fontSize: 14, lineHeight: 1, cursor: disabled ? \"default\" : \"pointer\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n opacity: disabled ? 0.5 : 1,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction CtrlBtn({ children, title, onClick }: { children: ReactNode; title: string; onClick: () => void }) {\n return (\n <button\n title={title}\n onClick={onClick}\n style={{\n width: 36, height: 36, border: \"1px solid rgba(255,255,255,0.12)\", borderRadius: 8,\n background: \"rgba(13,17,23,0.7)\", backdropFilter: \"blur(8px)\",\n color: \"#8b949e\", fontSize: 18, lineHeight: 1, cursor: \"pointer\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n }}\n onMouseEnter={(e) => { (e.currentTarget as HTMLElement).style.background = \"rgba(30,40,60,0.85)\"; (e.currentTarget as HTMLElement).style.color = \"#f0f6fc\"; }}\n onMouseLeave={(e) => { (e.currentTarget as HTMLElement).style.background = \"rgba(13,17,23,0.7)\"; (e.currentTarget as HTMLElement).style.color = \"#8b949e\"; }}\n >\n {children}\n </button>\n );\n}\n"],"names":["c","initialRadius","document","distance","x","y","index","defaultLabelText","now","a","onKeyDown","m","_offset","_right","_q","onPointerDown","onPointerMove","rect","onPointerUp","_a","onContextMenu","set","style","z","interval","add","addAll","x2","removeAll","defaultX","leaf_copy","treeProto","tree_add","tree_addAll","tree_cover","tree_data","tree_extent","tree_find","tree_remove","tree_removeAll","tree_root","tree_size","tree_visit","tree_visitAfter","tree_x","y2","defaultY","tree_y","z2","tree_findAllWithinRadius","i","node","strength","timer"],"mappings":"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","x_google_ignoreList":[10,11,12,13,14,15,16,17,18,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82]}