@omiron33/omi-neuron-web 0.2.21 → 0.2.22
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/README.md +157 -1
- package/dist/{NeuronWebExplorer-lBM0Jcf9.d.ts → NeuronWebExplorer-CB7Vkkce.d.cts} +5 -1
- package/dist/{NeuronWebExplorer-7sRtXdqa.d.cts → NeuronWebExplorer-DFyhvtXO.d.ts} +5 -1
- package/dist/api/index.d.cts +3 -3
- package/dist/api/index.d.ts +3 -3
- package/dist/{chunk-XSDOIONK.js → chunk-E4TZDZ5U.js} +353 -7
- package/dist/chunk-E4TZDZ5U.js.map +1 -0
- package/dist/{chunk-5SZ37JXQ.cjs → chunk-HOW2F2KP.cjs} +353 -6
- package/dist/chunk-HOW2F2KP.cjs.map +1 -0
- package/dist/{edge-U2Qgwg-K.d.cts → cluster-CU_pBUcK.d.cts} +123 -1
- package/dist/{edge-U2Qgwg-K.d.ts → cluster-CU_pBUcK.d.ts} +123 -1
- package/dist/index.cjs +655 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +66 -7
- package/dist/index.d.ts +66 -7
- package/dist/index.js +641 -4
- package/dist/index.js.map +1 -1
- package/dist/{query-helpers-DMnkjfO0.d.cts → query-helpers-CA23s1ct.d.cts} +2 -102
- package/dist/{query-helpers-BpVwXZJk.d.ts → query-helpers-CdDGFiK3.d.ts} +2 -102
- package/dist/visualization/index.cjs +18 -14
- package/dist/visualization/index.d.cts +9 -5
- package/dist/visualization/index.d.ts +9 -5
- package/dist/visualization/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-5SZ37JXQ.cjs.map +0 -1
- package/dist/chunk-XSDOIONK.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/visualization/constants.ts","../src/visualization/scene/scene-manager.ts","../src/visualization/hooks/useSceneManager.ts","../src/visualization/density/resolve-density.ts","../src/visualization/performance/auto-performance-mode.ts","../src/visualization/animations/ambient-motion.ts","../src/visualization/scene/node-renderer.ts","../src/visualization/scene/edge-renderer.ts","../src/visualization/scene/cluster-renderer.ts","../src/visualization/layouts/fuzzy-layout.ts","../src/visualization/interactions/interaction-manager.ts","../src/visualization/animations/animation-controller.ts","../src/visualization/animations/selection-ripple.ts","../src/visualization/NeuronWeb.tsx","../src/react/context.ts","../src/react/hooks/useNeuronContext.ts","../src/react/hooks/useNeuronGraph.ts","../src/visualization/explorer/explorer-filters.ts","../src/visualization/explorer/NeuronWebExplorer.tsx","../src/visualization/themes/theme-engine.ts","../src/visualization/story/index.ts"],"names":["THREE","THREE2","seen","hitScale","labelObject","material","fresh","THREE4","CSS2DObject","baseRadius","THREE5","THREE6","useState","useEffect","THREE7","useCallback","jsx","useMemo","jsxs"],"mappings":"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","file":"chunk-E4TZDZ5U.js","sourcesContent":["import type { NodeStatus } from '../core/types';\nimport type { NeuronWebTheme, RenderingOptions } from './types';\n\n/**\n * Default status colors for workflow visualization\n */\nexport const DEFAULT_STATUS_COLORS: Record<NodeStatus, string> = {\n default: '#c0c5ff', // Same as defaultDomainColor (lavender)\n draft: '#9ca3af', // Gray\n active: '#4ade80', // Green\n complete: '#60a5fa', // Blue\n blocked: '#f87171', // Red\n archived: '#6b7280', // Dark gray\n};\n\nexport const DEFAULT_THEME: NeuronWebTheme = {\n colors: {\n background: '#020314',\n domainColors: {},\n defaultDomainColor: '#c0c5ff',\n statusColors: DEFAULT_STATUS_COLORS,\n edgeDefault: '#4d4d55',\n edgeActive: '#c6d4ff',\n edgeSelected: '#ffffff',\n labelText: '#ffffff',\n labelBackground: 'rgba(5, 6, 31, 0.8)',\n },\n typography: {\n labelFontFamily: 'system-ui, sans-serif',\n labelFontSize: 12,\n labelFontWeight: '500',\n },\n effects: {\n starfieldEnabled: true,\n starfieldColor: '#ffffff',\n glowEnabled: true,\n glowIntensity: 0.6,\n ambientMotionEnabled: true,\n ambientMotionSpeed: 0.6,\n ambientMotionAmplitude: 0.25,\n edgeFlowEnabled: true,\n edgeFlowSpeed: 1.2,\n autoRotateEnabled: false,\n autoRotateSpeed: 0.25,\n postprocessingEnabled: true,\n bloomEnabled: false,\n bloomStrength: 0.6,\n bloomRadius: 0.35,\n bloomThreshold: 0.2,\n vignetteEnabled: false,\n vignetteDarkness: 0.6,\n vignetteOffset: 0.25,\n colorGradeEnabled: false,\n colorGradeIntensity: 0.2,\n backgroundIntensity: 0.9,\n fogEnabled: true,\n fogColor: '#020314',\n fogNear: 24,\n fogFar: 160,\n },\n animation: {\n focusDuration: 800,\n transitionDuration: 650,\n easing: 'easeInOut',\n hoverScale: 1.12,\n selectedScale: 1.4,\n selectionPulseScale: 0.35,\n selectionPulseDuration: 520,\n hoverCardFadeDuration: 160,\n hoverCardSlideDistance: 6,\n enableCameraTween: true,\n enableHoverScale: true,\n enableSelectionPulse: true,\n enableSelectionRipple: true,\n },\n};\n\nexport const DEFAULT_RENDERING_OPTIONS: RenderingOptions = {\n preset: 'subtle',\n nodes: {\n mode: 'sprite',\n },\n edges: {\n mode: 'straight',\n },\n labels: {\n visibility: 'auto',\n transitions: {\n enabled: false,\n durationMs: 0,\n },\n },\n animations: {\n profile: 'subtle',\n },\n performance: {\n normalMaxNodes: 180,\n degradedMaxNodes: 360,\n },\n};\n","import * as THREE from 'three';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer.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 { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';\nimport { GammaCorrectionShader } from 'three/examples/jsm/shaders/GammaCorrectionShader.js';\n\nexport interface SceneConfig {\n backgroundColor: string;\n cameraFov?: number;\n cameraPosition: [number, number, number];\n cameraTarget: [number, number, number];\n minZoom: number;\n maxZoom: number;\n autoRotateEnabled?: boolean;\n autoRotateSpeed?: number;\n enableStarfield: boolean;\n starfieldCount: number;\n starfieldColor: string;\n pixelRatioCap: number;\n backgroundIntensity?: number;\n postprocessingEnabled?: boolean;\n bloomEnabled?: boolean;\n bloomStrength?: number;\n bloomRadius?: number;\n bloomThreshold?: number;\n vignetteEnabled?: boolean;\n vignetteDarkness?: number;\n vignetteOffset?: number;\n colorGradeEnabled?: boolean;\n colorGradeIntensity?: number;\n ambientLightIntensity?: number;\n keyLightIntensity?: number;\n fillLightIntensity?: number;\n fogEnabled?: boolean;\n fogColor?: string;\n fogNear?: number;\n fogFar?: number;\n}\n\nconst VIGNETTE_SHADER = {\n uniforms: {\n tDiffuse: { value: null },\n offset: { value: 0.35 },\n darkness: { value: 0.6 },\n gradeIntensity: { value: 0.2 },\n gradeColor: { value: new THREE.Color('#9fb0ff') },\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform float offset;\n uniform float darkness;\n uniform float gradeIntensity;\n uniform vec3 gradeColor;\n varying vec2 vUv;\n void main() {\n vec4 texel = texture2D(tDiffuse, vUv);\n float dist = distance(vUv, vec2(0.5, 0.5));\n float vignette = smoothstep(offset, offset + 0.5, dist);\n vec3 color = texel.rgb * mix(1.0, 1.0 - darkness, vignette);\n color = mix(color, color * gradeColor, gradeIntensity);\n gl_FragColor = vec4(color, texel.a);\n }\n `,\n};\n\nexport class SceneManager {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n renderer: THREE.WebGLRenderer;\n labelRenderer: CSS2DRenderer;\n controls: OrbitControls;\n private animationId: number | null = null;\n private lastFrameTime = 0;\n private elapsedTime = 0;\n private frameListeners = new Set<(delta: number, elapsed: number) => void>();\n private starfield: THREE.Points | null = null;\n private ambientLight: THREE.AmbientLight | null = null;\n private keyLight: THREE.DirectionalLight | null = null;\n private fillLight: THREE.PointLight | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private composer: EffectComposer | null = null;\n private vignettePass: ShaderPass | null = null;\n\n constructor(private container: HTMLElement, private config: SceneConfig) {\n this.scene = new THREE.Scene();\n this.camera = new THREE.PerspectiveCamera(config.cameraFov ?? 52, 1, 0.1, 220);\n this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n this.labelRenderer = new CSS2DRenderer();\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n }\n\n initialize(): void {\n const { cameraPosition, cameraTarget, backgroundColor } = this.config;\n this.scene.background = new THREE.Color(backgroundColor);\n if (this.config.fogEnabled) {\n const fogColor = this.config.fogColor ?? backgroundColor;\n this.scene.fog = new THREE.Fog(fogColor, this.config.fogNear ?? 32, this.config.fogFar ?? 200);\n }\n this.camera.position.set(...cameraPosition);\n this.controls.target.set(...cameraTarget);\n this.controls.minDistance = this.config.minZoom;\n this.controls.maxDistance = this.config.maxZoom;\n this.controls.enableDamping = true;\n this.controls.dampingFactor = 0.08;\n this.controls.autoRotate = Boolean(this.config.autoRotateEnabled);\n if (this.config.autoRotateSpeed !== undefined) {\n this.controls.autoRotateSpeed = this.config.autoRotateSpeed;\n }\n this.controls.update();\n\n this.renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, this.config.pixelRatioCap));\n this.renderer.outputColorSpace = THREE.SRGBColorSpace;\n this.renderer.toneMapping = THREE.NoToneMapping;\n this.renderer.toneMappingExposure = 1;\n this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);\n this.renderer.domElement.style.position = 'absolute';\n this.renderer.domElement.style.top = '0';\n this.renderer.domElement.style.left = '0';\n this.renderer.domElement.style.width = '100%';\n this.renderer.domElement.style.height = '100%';\n this.labelRenderer.setSize(this.container.clientWidth, this.container.clientHeight);\n this.labelRenderer.domElement.style.position = 'absolute';\n this.labelRenderer.domElement.style.top = '0';\n this.labelRenderer.domElement.style.left = '0';\n this.labelRenderer.domElement.style.pointerEvents = 'none';\n this.labelRenderer.domElement.style.width = '100%';\n this.labelRenderer.domElement.style.height = '100%';\n\n this.container.appendChild(this.renderer.domElement);\n this.container.appendChild(this.labelRenderer.domElement);\n\n this.initLights();\n if (this.config.enableStarfield) {\n this.initStarfield();\n }\n if (this.config.postprocessingEnabled) {\n this.initPostprocessing();\n }\n\n window.addEventListener('resize', this.resize);\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(this.container);\n }\n this.startAnimationLoop();\n }\n\n dispose(): void {\n this.stopAnimationLoop();\n window.removeEventListener('resize', this.resize);\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.renderer.dispose();\n this.scene.clear();\n this.container.innerHTML = '';\n this.frameListeners.clear();\n this.starfield = null;\n this.ambientLight = null;\n this.keyLight = null;\n this.fillLight = null;\n this.composer = null;\n this.vignettePass = null;\n }\n\n startAnimationLoop(): void {\n const loop = (time = performance.now()) => {\n if (!this.lastFrameTime) {\n this.lastFrameTime = time;\n }\n const delta = (time - this.lastFrameTime) / 1000;\n this.lastFrameTime = time;\n this.elapsedTime += delta;\n this.frameListeners.forEach((listener) => listener(delta, this.elapsedTime));\n this.render();\n this.animationId = requestAnimationFrame(loop);\n };\n loop();\n }\n\n stopAnimationLoop(): void {\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n }\n\n render(): void {\n this.controls.update();\n if (this.composer) {\n this.composer.render();\n } else {\n this.renderer.render(this.scene, this.camera);\n }\n this.labelRenderer.render(this.scene, this.camera);\n }\n\n resize = (): void => {\n const width = this.container.clientWidth;\n const height = this.container.clientHeight;\n if (!width || !height) return;\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(width, height);\n this.labelRenderer.setSize(width, height);\n if (this.composer) {\n this.composer.setSize(width, height);\n }\n };\n\n updateBackground(color: string): void {\n this.scene.background = new THREE.Color(color);\n if (this.scene.fog && this.config.fogEnabled) {\n this.scene.fog.color = new THREE.Color(this.config.fogColor ?? color);\n }\n if (this.starfield) {\n (this.starfield.material as THREE.PointsMaterial).color = new THREE.Color(\n this.config.starfieldColor\n );\n }\n }\n\n updateCamera(position: [number, number, number]): void {\n this.camera.position.set(...position);\n }\n\n addFrameListener(listener: (delta: number, elapsed: number) => void): () => void {\n this.frameListeners.add(listener);\n return () => this.frameListeners.delete(listener);\n }\n\n getWorldPosition(screenX: number, screenY: number): THREE.Vector3 {\n return this.screenToWorld(screenX, screenY);\n }\n\n screenToWorld(x: number, y: number): THREE.Vector3 {\n const rect = this.container.getBoundingClientRect();\n const ndc = new THREE.Vector3(\n ((x - rect.left) / rect.width) * 2 - 1,\n -((y - rect.top) / rect.height) * 2 + 1,\n 0.5\n );\n ndc.unproject(this.camera);\n return ndc;\n }\n\n worldToScreen(position: THREE.Vector3): { x: number; y: number } {\n const vector = position.clone().project(this.camera);\n const rect = this.container.getBoundingClientRect();\n return {\n x: (vector.x * 0.5 + 0.5) * rect.width + rect.left,\n y: (-vector.y * 0.5 + 0.5) * rect.height + rect.top,\n };\n }\n\n onContextLost = () => {};\n onContextRestored = () => {};\n\n private initStarfield(): void {\n const count = Math.max(0, this.config.starfieldCount);\n if (!count) return;\n const intensity = this.config.backgroundIntensity ?? 1;\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(count * 3);\n for (let i = 0; i < count; i += 1) {\n positions[i * 3] = THREE.MathUtils.randFloatSpread(70);\n positions[i * 3 + 1] = THREE.MathUtils.randFloatSpread(70);\n positions[i * 3 + 2] = THREE.MathUtils.randFloatSpread(70);\n }\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n const material = new THREE.PointsMaterial({\n color: this.config.starfieldColor,\n size: 0.22,\n sizeAttenuation: true,\n transparent: true,\n opacity: 0.5 * intensity,\n depthWrite: false,\n });\n this.starfield = new THREE.Points(geometry, material);\n this.starfield.name = 'neuron-starfield';\n this.scene.add(this.starfield);\n }\n\n private initLights(): void {\n const intensityScale = this.config.backgroundIntensity ?? 1;\n const ambientIntensity = (this.config.ambientLightIntensity ?? 0.65) * intensityScale;\n const keyIntensity = (this.config.keyLightIntensity ?? 1.0) * intensityScale;\n const fillIntensity = (this.config.fillLightIntensity ?? 0.45) * intensityScale;\n\n this.ambientLight = new THREE.AmbientLight('#ffffff', ambientIntensity);\n this.keyLight = new THREE.DirectionalLight('#b6c6ff', keyIntensity);\n this.keyLight.position.set(12, 18, 16);\n this.fillLight = new THREE.PointLight('#5c7aff', fillIntensity, 120, 2.2);\n this.fillLight.position.set(-18, -6, 10);\n\n this.scene.add(this.ambientLight, this.keyLight, this.fillLight);\n }\n\n private initPostprocessing(): void {\n const width = this.container.clientWidth;\n const height = this.container.clientHeight;\n this.composer = new EffectComposer(this.renderer);\n this.composer.setSize(width, height);\n this.composer.addPass(new RenderPass(this.scene, this.camera));\n\n if (this.config.bloomEnabled) {\n const bloom = new UnrealBloomPass(\n new THREE.Vector2(width, height),\n this.config.bloomStrength ?? 0.6,\n this.config.bloomRadius ?? 0.35,\n this.config.bloomThreshold ?? 0.2\n );\n this.composer.addPass(bloom);\n }\n\n if (this.config.vignetteEnabled || this.config.colorGradeEnabled) {\n this.vignettePass = new ShaderPass(VIGNETTE_SHADER);\n this.vignettePass.uniforms.offset.value = this.config.vignetteOffset ?? 0.35;\n this.vignettePass.uniforms.darkness.value = this.config.vignetteDarkness ?? 0.6;\n this.vignettePass.uniforms.gradeIntensity.value = this.config.colorGradeEnabled\n ? this.config.colorGradeIntensity ?? 0.2\n : 0;\n this.composer.addPass(this.vignettePass);\n }\n\n this.composer.addPass(new ShaderPass(GammaCorrectionShader));\n }\n}\n","import { useEffect, useState } from 'react';\nimport type { RefObject } from 'react';\nimport { SceneManager, type SceneConfig } from '../scene/scene-manager';\n\nexport function useSceneManager(\n containerRef: RefObject<HTMLElement | null>,\n config: SceneConfig\n): SceneManager | null {\n const [manager, setManager] = useState<SceneManager | null>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const sceneManager = new SceneManager(container, config);\n sceneManager.initialize();\n setManager(sceneManager);\n return () => {\n sceneManager.dispose();\n setManager(null);\n };\n }, [\n containerRef,\n config.backgroundColor,\n config.autoRotateEnabled,\n config.autoRotateSpeed,\n config.enableStarfield,\n config.starfieldCount,\n config.postprocessingEnabled,\n config.bloomEnabled,\n config.vignetteEnabled,\n config.colorGradeEnabled,\n config.fogEnabled,\n ]);\n\n return manager;\n}\n","import type { DensityMode, DensityOptions } from '../types';\n\nexport type ResolvedDensityOptions = {\n mode: DensityMode;\n spread: number;\n edgeFade: number;\n minEdgeStrength: number;\n focusExpansion: number;\n labelMaxCount?: number;\n labelDistance?: number;\n labelVisibility: NonNullable<DensityOptions['labelVisibility']>;\n};\n\nexport function resolveDensityOptions(\n density: DensityOptions | undefined,\n performanceMode: 'normal' | 'degraded' | 'fallback'\n): ResolvedDensityOptions {\n const clamp01 = (value: number) => Math.min(1, Math.max(0, value));\n const presets: Record<DensityMode, Omit<ResolvedDensityOptions, 'mode' | 'labelMaxCount' | 'labelDistance' | 'labelVisibility'>> = {\n relaxed: { spread: 1.2, edgeFade: 0.2, focusExpansion: 0.18, minEdgeStrength: 0 },\n balanced: { spread: 1.0, edgeFade: 0.35, focusExpansion: 0.12, minEdgeStrength: 0.05 },\n compact: { spread: 0.9, edgeFade: 0.5, focusExpansion: 0.08, minEdgeStrength: 0.15 },\n };\n\n const defaultMode: DensityMode =\n density?.mode ??\n (performanceMode === 'normal' ? 'balanced' : performanceMode === 'degraded' ? 'compact' : 'compact');\n const base = presets[defaultMode];\n\n const edgeFade = clamp01(density?.edgeFade ?? base.edgeFade);\n const minEdgeStrength = clamp01(density?.minEdgeStrength ?? base.minEdgeStrength);\n\n return {\n mode: defaultMode,\n spread: density?.spread ?? base.spread,\n edgeFade,\n minEdgeStrength,\n focusExpansion: density?.focusExpansion ?? base.focusExpansion,\n labelMaxCount: density?.labelMaxCount,\n labelDistance: density?.labelDistance,\n labelVisibility:\n density?.labelVisibility ??\n (performanceMode === 'normal' ? 'auto' : performanceMode === 'degraded' ? 'interaction' : 'none'),\n };\n}\n\n","export type AutoPerformanceMode = 'normal' | 'degraded' | 'fallback';\n\nexport interface AutoPerformanceModeOptions {\n nodeCount: number;\n pixelRatio?: number;\n pixelRatioCap?: number;\n normalMaxNodes?: number;\n degradedMaxNodes?: number;\n}\n\nexport function getAutoPerformanceMode(options: AutoPerformanceModeOptions): AutoPerformanceMode {\n const nodeCountRaw = typeof options.nodeCount === 'number' && Number.isFinite(options.nodeCount) ? options.nodeCount : 0;\n const nodeCount = Math.max(0, Math.floor(nodeCountRaw));\n\n const pixelRatioRaw =\n typeof options.pixelRatio === 'number' && Number.isFinite(options.pixelRatio) ? options.pixelRatio : 1;\n const pixelRatioCapRaw =\n typeof options.pixelRatioCap === 'number' && Number.isFinite(options.pixelRatioCap) ? options.pixelRatioCap : 2;\n const pixelRatioCap = Math.max(0, pixelRatioCapRaw);\n const pixelRatio = Math.min(Math.max(0, pixelRatioRaw), pixelRatioCap || pixelRatioRaw);\n\n const normalMaxRaw =\n typeof options.normalMaxNodes === 'number' && Number.isFinite(options.normalMaxNodes)\n ? options.normalMaxNodes\n : 180;\n const degradedMaxRaw =\n typeof options.degradedMaxNodes === 'number' && Number.isFinite(options.degradedMaxNodes)\n ? options.degradedMaxNodes\n : 360;\n\n let normalMaxNodes = Math.max(1, Math.floor(normalMaxRaw));\n let degradedMaxNodes = Math.max(normalMaxNodes + 1, Math.floor(degradedMaxRaw));\n\n // Guard against weird inversions from custom config.\n if (degradedMaxNodes <= normalMaxNodes) {\n degradedMaxNodes = normalMaxNodes + 1;\n }\n\n const effectiveCount = nodeCount * Math.sqrt(pixelRatio || 1);\n\n if (effectiveCount > degradedMaxNodes) return 'fallback';\n if (effectiveCount > normalMaxNodes) return 'degraded';\n return 'normal';\n}\n\n","export function computeAmbientDrift(\n elapsed: number,\n phase: number,\n speed: number,\n amplitude: number\n): { x: number; y: number; z: number } {\n const drift = Math.sin(elapsed * speed + phase) * amplitude;\n const driftX = Math.cos(elapsed * speed * 0.6 + phase) * amplitude * 0.45;\n const driftZ = Math.sin(elapsed * speed * 0.4 + phase) * amplitude * 0.35;\n return { x: driftX, y: drift, z: driftZ };\n}\n","import * as THREE from 'three';\nimport { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\nimport type { NeuronVisualNode, NodeTier } from '../../core/types';\nimport { computeAmbientDrift } from '../animations/ambient-motion';\nimport type {\n LabelTierRules,\n NodeNumberMappingRule,\n NodeRenderMode,\n NodeStyle,\n NodeStyleResolver,\n} from '../types';\n\nexport interface NodeRenderConfig {\n domainColors: Record<string, string>;\n /** Status-based colors for workflow visualization (takes priority over domain) */\n statusColors?: Record<string, string>;\n defaultColor: string;\n baseScale: number;\n tierScales: Record<NodeTier, number>;\n glowIntensity: number;\n labelDistance: number;\n maxVisibleLabels: number;\n labelVisibility?: 'auto' | 'interaction' | 'none';\n labelTierRules?: LabelTierRules;\n labelTransitionsEnabled?: boolean;\n labelTransitionDurationMs?: number;\n transitionsEnabled?: boolean;\n transitionDurationMs?: number;\n hitTargetScale?: number;\n labelOffset?: [number, number, number];\n labelFontFamily: string;\n labelFontSize: number;\n labelFontWeight: string;\n labelTextColor: string;\n labelBackground: string;\n ambientMotionEnabled: boolean;\n ambientMotionAmplitude: number;\n ambientMotionSpeed: number;\n hoverScale: number;\n selectedScale: number;\n pulseScale: number;\n pulseDuration: number;\n enableHoverScale: boolean;\n enableSelectionPulse: boolean;\n mode?: NodeRenderMode;\n sizeRule?: NodeNumberMappingRule;\n opacityRule?: NodeNumberMappingRule;\n getNodeStyle?: NodeStyleResolver;\n selectionHighlightColor?: string;\n}\n\ninterface NodeRenderState {\n id: string;\n slug: string;\n object: THREE.Object3D;\n material: THREE.Material;\n hitMesh: THREE.Mesh | null;\n label: CSS2DObject | null;\n labelInner: HTMLDivElement | null;\n labelTargetVisible: boolean;\n labelHideAt: number | null;\n labelShowRaf: number | null;\n tier: NodeTier;\n transitionPhase: 'entering' | 'alive' | 'exiting';\n transitionStartMs: number;\n transitionDurationMs: number;\n positionTween:\n | { from: THREE.Vector3; to: THREE.Vector3; startMs: number; durationMs: number }\n | null;\n basePosition: THREE.Vector3;\n baseScale: number;\n baseOpacity: number;\n phase: number;\n baseColor: THREE.Color;\n hovered: boolean;\n selected: boolean;\n pulseStart: number | null;\n style: NodeStyle;\n}\n\nexport class NodeRenderer {\n private group = new THREE.Group();\n private nodeStates = new Map<string, NodeRenderState>();\n private hoveredNodeId: string | null = null;\n private selectedNodeId: string | null = null;\n private glowTexture: THREE.Texture | null = null;\n private meshGeometry: THREE.SphereGeometry | null = null;\n private hitGeometry: THREE.SphereGeometry | null = null;\n private labelOffset = new THREE.Vector3(0, 0.65, 0);\n private selectionHighlightColor: THREE.Color;\n private renderMode: NodeRenderMode;\n\n constructor(private scene: THREE.Scene, private config: NodeRenderConfig) {\n this.scene.add(this.group);\n this.renderMode = config.mode ?? 'sprite';\n this.selectionHighlightColor = new THREE.Color(config.selectionHighlightColor ?? '#ffffff');\n this.glowTexture = this.createGlowTexture();\n if (this.renderMode === 'mesh') {\n this.meshGeometry = new THREE.SphereGeometry(0.55, 18, 18);\n }\n this.hitGeometry = new THREE.SphereGeometry(0.5, 14, 12);\n if (config.labelOffset) {\n this.labelOffset.set(...config.labelOffset);\n }\n }\n\n renderNodes(nodes: NeuronVisualNode[]): void {\n const nowMs = performance.now();\n const transitionsEnabled =\n Boolean(this.config.transitionsEnabled) && Math.max(0, this.config.transitionDurationMs ?? 0) > 0;\n const transitionDurationMs = Math.max(0, this.config.transitionDurationMs ?? 0);\n const labelVisibility = this.config.labelVisibility ?? 'auto';\n const labelTransitionsEnabled = Boolean(this.config.labelTransitionsEnabled);\n const labelTransitionDurationMs = Math.max(0, this.config.labelTransitionDurationMs ?? 160);\n const shouldRenderLabels =\n labelVisibility !== 'none' &&\n (labelVisibility === 'interaction' ||\n (this.config.maxVisibleLabels > 0 && this.config.labelDistance > 0));\n\n const resolveNode = (node: NeuronVisualNode) => {\n const tier = node.tier ?? 'tertiary';\n // Status color takes priority over domain color for workflow visualization\n let baseColor: THREE.Color;\n if (node.status && this.config.statusColors?.[node.status]) {\n baseColor = new THREE.Color(this.config.statusColors[node.status]);\n } else {\n baseColor = new THREE.Color(\n this.config.domainColors[node.domain] ?? this.config.defaultColor\n );\n }\n const position = new THREE.Vector3();\n if (node.position) {\n position.set(...node.position);\n }\n const tierScale = this.config.tierScales[tier] ?? 1;\n const baseScaleRaw = this.config.baseScale * tierScale;\n const staticStyle: NodeStyle = {};\n const mappedScale = this.resolveNodeMapping(node, this.config.sizeRule);\n if (mappedScale !== undefined) staticStyle.scale = mappedScale;\n const mappedOpacity = this.resolveNodeMapping(node, this.config.opacityRule);\n if (mappedOpacity !== undefined) staticStyle.opacity = mappedOpacity;\n const resolverStyle = this.config.getNodeStyle ? this.config.getNodeStyle(node) : undefined;\n const resolvedStyle: NodeStyle = { ...staticStyle, ...(resolverStyle ?? {}) };\n const resolvedColor = this.resolveStyleColor(baseColor, resolvedStyle.color);\n const baseScale = baseScaleRaw * (resolvedStyle.scale ?? 1);\n const baseOpacity = this.clamp01(0.78 * (resolvedStyle.opacity ?? 1));\n return { tier, position, baseScale, baseOpacity, resolvedColor, resolvedStyle };\n };\n\n if (!transitionsEnabled) {\n this.clear();\n const seen = new Set<string>();\n nodes.forEach((node) => {\n if (seen.has(node.id)) return;\n seen.add(node.id);\n const resolved = resolveNode(node);\n\n const { object, material } = this.createNodeObject(resolved.resolvedColor, resolved.baseOpacity);\n object.position.copy(resolved.position);\n object.scale.setScalar(resolved.baseScale);\n object.userData = { nodeId: node.id, nodeSlug: node.slug };\n this.group.add(object);\n\n let hitMesh: THREE.Mesh | null = null;\n const hitScale = this.config.hitTargetScale ?? 1.8;\n if (this.hitGeometry && hitScale > 0) {\n const hitMaterial = new THREE.MeshBasicMaterial({\n transparent: true,\n opacity: 0,\n depthWrite: false,\n });\n hitMesh = new THREE.Mesh(this.hitGeometry, hitMaterial);\n hitMesh.position.copy(resolved.position);\n hitMesh.scale.setScalar(resolved.baseScale * hitScale);\n hitMesh.userData = { nodeId: node.id, nodeSlug: node.slug };\n this.group.add(hitMesh);\n }\n\n let labelObject: CSS2DObject | null = null;\n let labelInner: HTMLDivElement | null = null;\n if (shouldRenderLabels) {\n const { wrapper, inner } = this.createLabelElements(node, resolved.resolvedColor);\n labelInner = inner;\n if (labelTransitionsEnabled && labelTransitionDurationMs > 0) {\n inner.style.transition = `opacity ${labelTransitionDurationMs}ms ease, transform ${labelTransitionDurationMs}ms ease`;\n inner.style.willChange = 'opacity, transform';\n } else {\n inner.style.transition = '';\n inner.style.willChange = '';\n }\n inner.style.opacity = '0';\n inner.style.transform = 'scale(0.96)';\n\n labelObject = new CSS2DObject(wrapper);\n labelObject.position.copy(object.position).add(this.labelOffset);\n this.scene.add(labelObject);\n labelObject.visible = false;\n }\n\n this.nodeStates.set(node.id, {\n id: node.id,\n slug: node.slug,\n object,\n material,\n hitMesh,\n label: labelObject,\n labelInner,\n labelTargetVisible: false,\n labelHideAt: null,\n labelShowRaf: null,\n tier: resolved.tier,\n transitionPhase: 'alive',\n transitionStartMs: nowMs,\n transitionDurationMs: 0,\n positionTween: null,\n basePosition: resolved.position.clone(),\n baseScale: resolved.baseScale,\n baseOpacity: resolved.baseOpacity,\n phase: Math.random() * Math.PI * 2,\n baseColor: resolved.resolvedColor,\n hovered: false,\n selected: false,\n pulseStart: null,\n style: resolved.resolvedStyle,\n });\n });\n return;\n }\n\n if (!shouldRenderLabels) {\n this.nodeStates.forEach((state) => {\n if (state.labelShowRaf !== null) {\n window.cancelAnimationFrame(state.labelShowRaf);\n state.labelShowRaf = null;\n }\n this.removeLabel(state.label);\n state.label = null;\n state.labelInner = null;\n state.labelTargetVisible = false;\n state.labelHideAt = null;\n });\n }\n\n const nextIds = new Set<string>();\n const seen = new Set<string>();\n\n nodes.forEach((node) => {\n if (seen.has(node.id)) return;\n seen.add(node.id);\n nextIds.add(node.id);\n\n const resolved = resolveNode(node);\n const existing = this.nodeStates.get(node.id);\n if (existing) {\n existing.slug = node.slug;\n existing.tier = resolved.tier;\n existing.style = resolved.resolvedStyle;\n existing.baseScale = resolved.baseScale;\n existing.baseOpacity = resolved.baseOpacity;\n existing.baseColor = resolved.resolvedColor;\n this.setMaterialColor(existing.material, resolved.resolvedColor);\n this.setMaterialOpacity(existing.material, resolved.baseOpacity);\n\n if (existing.hitMesh) {\n const hitScale = this.config.hitTargetScale ?? 1.8;\n existing.hitMesh.scale.setScalar(resolved.baseScale * hitScale);\n }\n\n if (shouldRenderLabels && !existing.label) {\n const { wrapper, inner } = this.createLabelElements(node, resolved.resolvedColor);\n if (labelTransitionsEnabled && labelTransitionDurationMs > 0) {\n inner.style.transition = `opacity ${labelTransitionDurationMs}ms ease, transform ${labelTransitionDurationMs}ms ease`;\n inner.style.willChange = 'opacity, transform';\n }\n inner.style.opacity = '0';\n inner.style.transform = 'scale(0.96)';\n const labelObject = new CSS2DObject(wrapper);\n labelObject.position.copy(existing.object.position).add(this.labelOffset);\n this.scene.add(labelObject);\n labelObject.visible = false;\n existing.label = labelObject;\n existing.labelInner = inner;\n existing.labelTargetVisible = false;\n existing.labelHideAt = null;\n }\n\n const distance = existing.basePosition.distanceTo(resolved.position);\n if (distance > 0.001) {\n existing.positionTween = {\n from: existing.basePosition.clone(),\n to: resolved.position.clone(),\n startMs: nowMs,\n durationMs: transitionDurationMs,\n };\n } else {\n existing.basePosition.copy(resolved.position);\n existing.positionTween = null;\n }\n\n if (existing.transitionPhase === 'exiting') {\n existing.transitionPhase = 'entering';\n existing.transitionStartMs = nowMs;\n existing.transitionDurationMs = transitionDurationMs;\n }\n return;\n }\n\n const { object, material } = this.createNodeObject(resolved.resolvedColor, resolved.baseOpacity);\n object.position.copy(resolved.position);\n object.scale.setScalar(Math.max(0.001, resolved.baseScale * 0.01));\n object.userData = { nodeId: node.id, nodeSlug: node.slug };\n this.group.add(object);\n\n let hitMesh: THREE.Mesh | null = null;\n const hitScale = this.config.hitTargetScale ?? 1.8;\n if (this.hitGeometry && hitScale > 0) {\n const hitMaterial = new THREE.MeshBasicMaterial({\n transparent: true,\n opacity: 0,\n depthWrite: false,\n });\n hitMesh = new THREE.Mesh(this.hitGeometry, hitMaterial);\n hitMesh.position.copy(resolved.position);\n hitMesh.scale.setScalar(Math.max(0.001, resolved.baseScale * hitScale * 0.01));\n hitMesh.userData = { nodeId: node.id, nodeSlug: node.slug };\n this.group.add(hitMesh);\n }\n\n let labelObject: CSS2DObject | null = null;\n let labelInner: HTMLDivElement | null = null;\n if (shouldRenderLabels) {\n const { wrapper, inner } = this.createLabelElements(node, resolved.resolvedColor);\n labelInner = inner;\n if (labelTransitionsEnabled && labelTransitionDurationMs > 0) {\n inner.style.transition = `opacity ${labelTransitionDurationMs}ms ease, transform ${labelTransitionDurationMs}ms ease`;\n inner.style.willChange = 'opacity, transform';\n } else {\n inner.style.transition = '';\n inner.style.willChange = '';\n }\n inner.style.opacity = '0';\n inner.style.transform = 'scale(0.96)';\n labelObject = new CSS2DObject(wrapper);\n labelObject.position.copy(object.position).add(this.labelOffset);\n this.scene.add(labelObject);\n labelObject.visible = false;\n }\n\n this.setMaterialOpacity(material, 0);\n\n this.nodeStates.set(node.id, {\n id: node.id,\n slug: node.slug,\n object,\n material,\n hitMesh,\n label: labelObject,\n labelInner,\n labelTargetVisible: false,\n labelHideAt: null,\n labelShowRaf: null,\n tier: resolved.tier,\n transitionPhase: 'entering',\n transitionStartMs: nowMs,\n transitionDurationMs,\n positionTween: null,\n basePosition: resolved.position.clone(),\n baseScale: resolved.baseScale,\n baseOpacity: resolved.baseOpacity,\n phase: Math.random() * Math.PI * 2,\n baseColor: resolved.resolvedColor,\n hovered: false,\n selected: false,\n pulseStart: null,\n style: resolved.resolvedStyle,\n });\n });\n\n this.nodeStates.forEach((state, id) => {\n if (nextIds.has(id)) return;\n if (state.transitionPhase === 'exiting') return;\n state.transitionPhase = 'exiting';\n state.transitionStartMs = nowMs;\n state.transitionDurationMs = transitionDurationMs;\n state.hovered = false;\n state.selected = false;\n state.pulseStart = null;\n this.setLabelTargetVisible(state, false, nowMs, labelTransitionsEnabled, labelTransitionDurationMs);\n });\n }\n\n updateNode(nodeId: string, updates: Partial<NeuronVisualNode>): void {\n const state = this.nodeStates.get(nodeId);\n if (!state) return;\n if (updates.position) {\n const next = new THREE.Vector3(...updates.position);\n const transitionsEnabled =\n Boolean(this.config.transitionsEnabled) && Math.max(0, this.config.transitionDurationMs ?? 0) > 0;\n if (transitionsEnabled) {\n const nowMs = performance.now();\n state.positionTween = {\n from: state.basePosition.clone(),\n to: next,\n startMs: nowMs,\n durationMs: Math.max(0, this.config.transitionDurationMs ?? 0),\n };\n } else {\n state.basePosition.copy(next);\n state.object.position.copy(next);\n if (state.hitMesh) {\n state.hitMesh.position.copy(next);\n }\n }\n }\n if (updates.tier) {\n state.tier = updates.tier;\n const tierScale = this.config.tierScales[updates.tier] ?? 1;\n state.baseScale = this.config.baseScale * tierScale * (state.style.scale ?? 1);\n if (state.hitMesh) {\n const hitScale = this.config.hitTargetScale ?? 1.8;\n state.hitMesh.scale.setScalar(state.baseScale * hitScale);\n }\n }\n if (updates.domain) {\n const color = new THREE.Color(\n this.config.domainColors[updates.domain] ?? this.config.defaultColor\n );\n state.baseColor = color;\n this.setMaterialColor(state.material, color);\n }\n }\n\n removeNode(nodeId: string): void {\n const state = this.nodeStates.get(nodeId);\n if (!state) return;\n if (this.hoveredNodeId === nodeId) {\n this.hoveredNodeId = null;\n }\n if (this.selectedNodeId === nodeId) {\n this.selectedNodeId = null;\n }\n if (state.labelShowRaf !== null) {\n window.cancelAnimationFrame(state.labelShowRaf);\n state.labelShowRaf = null;\n }\n this.removeLabel(state.label);\n this.group.remove(state.object);\n if (state.hitMesh) {\n this.group.remove(state.hitMesh);\n }\n this.nodeStates.delete(nodeId);\n }\n\n clear(): void {\n this.nodeStates.forEach((state) => {\n if (state.labelShowRaf !== null) {\n window.cancelAnimationFrame(state.labelShowRaf);\n state.labelShowRaf = null;\n }\n this.removeLabel(state.label);\n if (state.hitMesh) {\n this.group.remove(state.hitMesh);\n }\n });\n this.group.clear();\n this.nodeStates.clear();\n this.hoveredNodeId = null;\n this.selectedNodeId = null;\n }\n\n showNodes(nodeIds: string[]): void {\n nodeIds.forEach((id) => {\n const state = this.nodeStates.get(id);\n if (state) {\n state.object.visible = true;\n if (state.hitMesh) state.hitMesh.visible = true;\n }\n });\n }\n\n hideNodes(nodeIds: string[]): void {\n nodeIds.forEach((id) => {\n const state = this.nodeStates.get(id);\n if (state) {\n state.object.visible = false;\n if (state.hitMesh) state.hitMesh.visible = false;\n }\n });\n }\n\n setVisibleNodes(nodeIds: string[] | null): void {\n if (!nodeIds) {\n this.nodeStates.forEach((state) => {\n state.object.visible = true;\n });\n return;\n }\n const visibleSet = new Set(nodeIds);\n this.nodeStates.forEach((state, id) => {\n const visible = visibleSet.has(id);\n state.object.visible = visible;\n if (state.hitMesh) state.hitMesh.visible = visible;\n });\n }\n\n updateLabelVisibility(camera: THREE.PerspectiveCamera): void {\n const labelVisibility = this.config.labelVisibility ?? 'auto';\n const nowMs = performance.now();\n const transitionsEnabled = Boolean(this.config.labelTransitionsEnabled);\n const transitionDurationMs = Math.max(0, this.config.labelTransitionDurationMs ?? 160);\n\n this.nodeStates.forEach((state) => {\n if (!state.label) return;\n if (state.labelHideAt !== null && nowMs >= state.labelHideAt) {\n state.label.visible = false;\n state.labelHideAt = null;\n }\n if (!state.object.visible) {\n this.setLabelTargetVisible(state, false, nowMs, transitionsEnabled, transitionDurationMs);\n }\n });\n\n if (labelVisibility === 'none') {\n this.nodeStates.forEach((state) => {\n if (!state.label) return;\n this.setLabelTargetVisible(state, false, nowMs, transitionsEnabled, transitionDurationMs);\n });\n return;\n }\n if (labelVisibility === 'interaction') {\n this.nodeStates.forEach((state) => {\n if (!state.label) return;\n const visible = state.hovered || state.selected;\n this.setLabelTargetVisible(state, visible, nowMs, transitionsEnabled, transitionDurationMs);\n });\n return;\n }\n if (this.config.maxVisibleLabels <= 0 || this.config.labelDistance <= 0) {\n this.nodeStates.forEach((state) => {\n if (!state.label) return;\n this.setLabelTargetVisible(state, false, nowMs, transitionsEnabled, transitionDurationMs);\n });\n return;\n }\n\n const maxCount = Math.max(0, this.config.maxVisibleLabels);\n const maxDistance = Math.max(0, this.config.labelDistance);\n const hysteresisMultiplier = 1.08;\n\n const candidates: Array<{ id: string; state: NodeRenderState; distance: number; priority: number }> = [];\n this.nodeStates.forEach((state, id) => {\n if (!state.label) return;\n const distance = camera.position.distanceTo(state.object.position);\n const tierRule = this.config.labelTierRules?.[state.tier] ?? 'auto';\n const isInteracting = state.hovered || state.selected;\n if (!isInteracting && tierRule === 'none') return;\n\n const threshold = state.labelTargetVisible ? maxDistance * hysteresisMultiplier : maxDistance;\n if (!isInteracting && distance > threshold) return;\n\n const priority = isInteracting ? 0 : tierRule === 'always' ? 1 : 2;\n candidates.push({ id, state, distance, priority });\n });\n\n candidates.sort((a, b) => (a.priority - b.priority ? a.priority - b.priority : a.distance - b.distance));\n\n const visibleIds = new Set<string>();\n candidates.forEach((entry) => {\n if (entry.priority === 0) {\n visibleIds.add(entry.id);\n }\n });\n\n const remaining = Math.max(0, maxCount - visibleIds.size);\n let added = 0;\n for (const entry of candidates) {\n if (visibleIds.has(entry.id)) continue;\n if (added >= remaining) break;\n visibleIds.add(entry.id);\n added += 1;\n }\n\n this.nodeStates.forEach((state, id) => {\n if (!state.label) return;\n this.setLabelTargetVisible(\n state,\n visibleIds.has(id),\n nowMs,\n transitionsEnabled,\n transitionDurationMs\n );\n });\n }\n\n private createLabelElements(\n node: NeuronVisualNode,\n accent: THREE.Color\n ): { wrapper: HTMLDivElement; inner: HTMLDivElement } {\n const wrapper = document.createElement('div');\n wrapper.style.pointerEvents = 'none';\n\n const inner = document.createElement('div');\n inner.style.borderRadius = '10px';\n inner.style.border = '1px solid rgba(255, 255, 255, 0.12)';\n inner.style.background = this.config.labelBackground;\n inner.style.color = this.config.labelTextColor;\n inner.style.fontFamily = this.config.labelFontFamily;\n inner.style.fontSize = `${this.config.labelFontSize}px`;\n inner.style.fontWeight = this.config.labelFontWeight;\n inner.style.padding = '6px 8px';\n inner.style.boxShadow = '0 10px 30px rgba(5, 10, 20, 0.35)';\n inner.style.backdropFilter = 'blur(10px)';\n inner.style.maxWidth = '220px';\n\n const isInsight = node.tier === 'insight' || node.domain === 'insight';\n if (isInsight) {\n const accentBright = accent.clone().lerp(new THREE.Color('#ffffff'), 0.35);\n inner.style.border = `1px solid ${this.toRgba(accentBright, 0.6)}`;\n inner.style.background = this.toRgba(accent, 0.2);\n inner.style.color = this.toRgba(accentBright, 0.95);\n }\n\n const badgeRow = document.createElement('div');\n badgeRow.style.display = 'flex';\n badgeRow.style.flexWrap = 'wrap';\n badgeRow.style.gap = '4px';\n badgeRow.style.marginBottom = '4px';\n\n const makeBadge = (text: string, tone: 'accent' | 'muted') => {\n const badge = document.createElement('span');\n badge.textContent = text;\n badge.style.display = 'inline-flex';\n badge.style.alignItems = 'center';\n badge.style.gap = '4px';\n badge.style.borderRadius = '999px';\n badge.style.padding = '2px 6px';\n badge.style.fontSize = '0.6rem';\n badge.style.fontWeight = '600';\n badge.style.textTransform = 'uppercase';\n badge.style.letterSpacing = '0.2em';\n if (tone === 'accent') {\n badge.style.border = `1px solid ${this.toRgba(accent, 0.6)}`;\n badge.style.background = this.toRgba(accent, 0.4);\n badge.style.color = '#f5f7ff';\n } else {\n badge.style.border = '1px solid rgba(255, 255, 255, 0.2)';\n badge.style.background = 'rgba(255, 255, 255, 0.08)';\n badge.style.color = 'rgba(255, 255, 255, 0.8)';\n }\n return badge;\n };\n\n if (isInsight) {\n badgeRow.appendChild(makeBadge('Insight', 'accent'));\n const statusRaw =\n (node.metadata?.status as string | undefined) ??\n (node.metadata?.draftNodeStatus as string | undefined) ??\n (node.metadata?.studyPathStatus as string | undefined);\n if (statusRaw) {\n const formatted = statusRaw\n .replace(/[_-]/g, ' ')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n badgeRow.appendChild(makeBadge(formatted, 'muted'));\n }\n }\n\n const tagList = Array.isArray(node.metadata?.tags)\n ? (node.metadata?.tags as string[])\n : Array.isArray(node.metadata?.keywords)\n ? (node.metadata?.keywords as string[])\n : [];\n tagList.slice(0, 2).forEach((tag) => {\n if (typeof tag === 'string' && tag.trim()) {\n badgeRow.appendChild(makeBadge(tag.trim(), 'muted'));\n }\n });\n\n if (badgeRow.childElementCount > 0) {\n inner.appendChild(badgeRow);\n }\n\n const title = document.createElement('div');\n title.textContent = node.label;\n title.style.fontSize = '0.8rem';\n title.style.fontWeight = '600';\n inner.appendChild(title);\n\n if (node.ref) {\n const reference = document.createElement('div');\n reference.textContent = node.ref;\n reference.style.fontSize = '0.65rem';\n reference.style.opacity = '0.7';\n inner.appendChild(reference);\n }\n\n wrapper.appendChild(inner);\n return { wrapper, inner };\n }\n\n private toRgba(color: THREE.Color, alpha: number): string {\n const r = Math.round(color.r * 255);\n const g = Math.round(color.g * 255);\n const b = Math.round(color.b * 255);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n\n private setLabelTargetVisible(\n state: NodeRenderState,\n visible: boolean,\n nowMs: number,\n transitionsEnabled: boolean,\n durationMs: number\n ): void {\n if (!state.label || !state.labelInner) return;\n if (state.labelTargetVisible === visible) return;\n state.labelTargetVisible = visible;\n\n if (state.labelShowRaf !== null) {\n window.cancelAnimationFrame(state.labelShowRaf);\n state.labelShowRaf = null;\n }\n state.labelHideAt = null;\n\n if (!transitionsEnabled || durationMs <= 0) {\n state.label.visible = visible;\n state.labelInner.style.opacity = visible ? '1' : '0';\n state.labelInner.style.transform = visible ? 'scale(1)' : 'scale(0.96)';\n return;\n }\n\n if (visible) {\n state.label.visible = true;\n state.labelInner.style.opacity = '0';\n state.labelInner.style.transform = 'scale(0.96)';\n state.labelShowRaf = window.requestAnimationFrame(() => {\n state.labelShowRaf = null;\n if (!state.label || !state.labelInner) return;\n if (!state.labelTargetVisible) return;\n state.labelInner.style.opacity = '1';\n state.labelInner.style.transform = 'scale(1)';\n });\n return;\n }\n\n state.labelInner.style.opacity = '0';\n state.labelInner.style.transform = 'scale(0.96)';\n state.labelHideAt = nowMs + durationMs;\n }\n\n highlightNode(nodeId: string): void {\n this.setHoveredNode(nodeId);\n }\n\n unhighlightNode(nodeId: string): void {\n if (this.hoveredNodeId === nodeId) {\n this.setHoveredNode(null);\n }\n }\n\n clearHighlights(): void {\n this.setHoveredNode(null);\n }\n\n getNodePosition(nodeId: string): THREE.Vector3 | null {\n const state = this.nodeStates.get(nodeId);\n return state ? state.object.position.clone() : null;\n }\n\n getNodeObject(nodeId: string): THREE.Object3D | null {\n const state = this.nodeStates.get(nodeId);\n return state?.object ?? null;\n }\n\n getNodeObjects(): THREE.Object3D[] {\n return Array.from(this.nodeStates.values()).map((state) => state.hitMesh ?? state.object);\n }\n\n hasDynamicPositions(): boolean {\n if (this.config.ambientMotionEnabled) return true;\n return this.hasActiveTransitions();\n }\n\n hasActiveTransitions(): boolean {\n const transitionsEnabled =\n Boolean(this.config.transitionsEnabled) && Math.max(0, this.config.transitionDurationMs ?? 0) > 0;\n if (!transitionsEnabled) return false;\n for (const state of this.nodeStates.values()) {\n if (state.transitionPhase !== 'alive') return true;\n if (state.positionTween) return true;\n }\n return false;\n }\n\n getNodePositionsBySlug(target?: Map<string, THREE.Vector3>): Map<string, THREE.Vector3> {\n const out = target ?? new Map<string, THREE.Vector3>();\n out.clear();\n this.nodeStates.forEach((state) => {\n out.set(state.slug, state.object.position);\n });\n return out;\n }\n\n setHoveredNode(nodeId: string | null): void {\n if (this.hoveredNodeId === nodeId) return;\n if (this.hoveredNodeId) {\n const prev = this.nodeStates.get(this.hoveredNodeId);\n if (prev) prev.hovered = false;\n }\n this.hoveredNodeId = nodeId;\n if (nodeId) {\n const next = this.nodeStates.get(nodeId);\n if (next) next.hovered = true;\n }\n }\n\n setSelectedNode(nodeId: string | null): void {\n if (this.selectedNodeId === nodeId) return;\n if (this.selectedNodeId) {\n const prev = this.nodeStates.get(this.selectedNodeId);\n if (prev) prev.selected = false;\n }\n this.selectedNodeId = nodeId;\n if (nodeId) {\n const next = this.nodeStates.get(nodeId);\n if (next) next.selected = true;\n }\n }\n\n pulseNode(nodeId: string): void {\n const state = this.nodeStates.get(nodeId);\n if (!state) return;\n state.pulseStart = performance.now() / 1000;\n }\n\n update(_: number, elapsed: number): void {\n const nowSeconds = performance.now() / 1000;\n const nowMs = nowSeconds * 1000;\n const transitionsEnabled =\n Boolean(this.config.transitionsEnabled) && Math.max(0, this.config.transitionDurationMs ?? 0) > 0;\n const toRemove: string[] = [];\n\n this.nodeStates.forEach((state, id) => {\n if (transitionsEnabled && state.positionTween) {\n const duration = Math.max(1, state.positionTween.durationMs);\n const t = Math.min(1, (nowMs - state.positionTween.startMs) / duration);\n const eased = this.easeInOut(t);\n state.basePosition.lerpVectors(state.positionTween.from, state.positionTween.to, eased);\n if (t >= 1) {\n state.basePosition.copy(state.positionTween.to);\n state.positionTween = null;\n }\n }\n\n let lifecycle = 1;\n if (transitionsEnabled && state.transitionPhase !== 'alive') {\n const duration = Math.max(1, state.transitionDurationMs);\n const t = Math.min(1, (nowMs - state.transitionStartMs) / duration);\n const eased = this.easeInOut(t);\n if (state.transitionPhase === 'entering') {\n lifecycle = eased;\n if (t >= 1) {\n state.transitionPhase = 'alive';\n }\n } else {\n lifecycle = 1 - eased;\n if (t >= 1) {\n toRemove.push(id);\n return;\n }\n }\n }\n\n if (this.config.ambientMotionEnabled) {\n const { x: driftX, y: drift, z: driftZ } = computeAmbientDrift(\n elapsed,\n state.phase,\n this.config.ambientMotionSpeed,\n this.config.ambientMotionAmplitude\n );\n state.object.position.set(\n state.basePosition.x + driftX,\n state.basePosition.y + drift,\n state.basePosition.z + driftZ\n );\n } else {\n state.object.position.copy(state.basePosition);\n }\n\n if (state.label) {\n state.label.position.copy(state.object.position).add(this.labelOffset);\n }\n if (state.hitMesh) {\n const hitScale = this.config.hitTargetScale ?? 1.8;\n state.hitMesh.position.copy(state.object.position);\n state.hitMesh.scale.setScalar(state.baseScale * hitScale);\n }\n\n const hoverScale =\n state.hovered && this.config.enableHoverScale ? this.config.hoverScale : 1;\n const selectedScale = state.selected ? this.config.selectedScale : 1;\n let pulseScale = 0;\n if (state.pulseStart !== null && this.config.enableSelectionPulse) {\n const progress = (nowSeconds - state.pulseStart) / this.config.pulseDuration;\n if (progress >= 1) {\n state.pulseStart = null;\n } else {\n pulseScale = Math.sin(progress * Math.PI) * this.config.pulseScale;\n }\n }\n const targetScale = state.baseScale * hoverScale * selectedScale * (1 + pulseScale) * Math.max(0.001, lifecycle);\n const currentScale = state.object.scale.x;\n const nextScale = currentScale + (targetScale - currentScale) * 0.18;\n state.object.scale.setScalar(nextScale);\n\n const baseOpacity = state.baseOpacity;\n const hoverOpacity = Math.min(0.95, baseOpacity + 0.12);\n const selectedOpacity = 1;\n const opacity = state.selected\n ? selectedOpacity\n : state.hovered\n ? hoverOpacity\n : baseOpacity;\n this.setMaterialOpacity(state.material, opacity * Math.max(0, Math.min(1, lifecycle)));\n const materialColor = this.getMaterialColor(state.material);\n if (materialColor) {\n materialColor.copy(state.baseColor);\n if (state.selected) {\n materialColor.lerp(this.selectionHighlightColor, 0.25);\n }\n }\n });\n\n toRemove.forEach((nodeId) => this.removeNode(nodeId));\n }\n\n dispose(): void {\n this.clear();\n this.scene.remove(this.group);\n this.glowTexture?.dispose();\n this.glowTexture = null;\n this.meshGeometry?.dispose();\n this.meshGeometry = null;\n }\n\n private removeLabel(label: CSS2DObject | null): void {\n if (!label) return;\n label.removeFromParent();\n label.element?.remove();\n }\n\n private clamp01(value: number): number {\n return Math.min(1, Math.max(0, value));\n }\n\n private applyCurve(value01: number, curve: 'linear' | 'sqrt' | 'log' = 'linear'): number {\n const clamped = Math.min(1, Math.max(0, value01));\n if (curve === 'sqrt') {\n return Math.sqrt(clamped);\n }\n if (curve === 'log') {\n // Maps 0..1 → 0..1 with a log-like curve.\n return Math.log10(1 + 9 * clamped);\n }\n return clamped;\n }\n\n private easeInOut(value01: number): number {\n const value = Math.min(1, Math.max(0, value01));\n return value < 0.5 ? 2 * value * value : 1 - Math.pow(-2 * value + 2, 2) / 2;\n }\n\n private resolveNodeMapping(node: NeuronVisualNode, rule?: NodeNumberMappingRule): number | undefined {\n if (!rule) return undefined;\n if (typeof rule.value === 'number' && Number.isFinite(rule.value)) {\n return rule.value;\n }\n if (rule.fromField !== 'connectionCount') return undefined;\n\n const outMin = rule.outputMin;\n const outMax = rule.outputMax;\n if (typeof outMin !== 'number' || typeof outMax !== 'number') return undefined;\n\n const inputMin = rule.inputMin ?? 0;\n const inputMax = rule.inputMax ?? 24;\n const denom = inputMax - inputMin;\n if (!Number.isFinite(denom) || denom <= 0) return undefined;\n\n const clamp = rule.clamp ?? true;\n let t = (node.connectionCount - inputMin) / denom;\n if (clamp) {\n t = Math.min(1, Math.max(0, t));\n }\n t = this.applyCurve(t, rule.curve ?? 'linear');\n\n const value = outMin + (outMax - outMin) * t;\n if (!clamp) return value;\n const lo = Math.min(outMin, outMax);\n const hi = Math.max(outMin, outMax);\n return Math.min(hi, Math.max(lo, value));\n }\n\n private resolveStyleColor(base: THREE.Color, override?: string): THREE.Color {\n if (!override) return base;\n return new THREE.Color(override);\n }\n\n private createNodeObject(\n color: THREE.Color,\n opacity: number\n ): { object: THREE.Object3D; material: THREE.Material } {\n if (this.renderMode === 'mesh' && this.meshGeometry) {\n const emissiveIntensity = Math.min(1, Math.max(0, this.config.glowIntensity)) * 0.7;\n const material = new THREE.MeshStandardMaterial({\n color,\n transparent: true,\n opacity,\n depthWrite: false,\n roughness: 0.6,\n metalness: 0.08,\n emissive: color.clone(),\n emissiveIntensity,\n });\n const mesh = new THREE.Mesh(this.meshGeometry, material);\n return { object: mesh, material };\n }\n\n const material = new THREE.SpriteMaterial({\n map: this.glowTexture ?? undefined,\n color,\n transparent: true,\n opacity,\n depthWrite: false,\n });\n const sprite = new THREE.Sprite(material);\n return { object: sprite, material };\n }\n\n private getMaterialColor(material: THREE.Material): THREE.Color | null {\n const maybeColor = (material as { color?: unknown }).color;\n return maybeColor instanceof THREE.Color ? maybeColor : null;\n }\n\n private setMaterialColor(material: THREE.Material, color: THREE.Color): void {\n const materialColor = this.getMaterialColor(material);\n if (materialColor) {\n materialColor.copy(color);\n }\n }\n\n private setMaterialOpacity(material: THREE.Material, opacity: number): void {\n const maybeOpacity = (material as { opacity?: unknown }).opacity;\n if (typeof maybeOpacity !== 'number') return;\n const cast = material as unknown as { opacity: number; transparent: boolean };\n cast.opacity = this.clamp01(opacity);\n cast.transparent = true;\n }\n\n private createGlowTexture(): THREE.Texture | null {\n const size = 256;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n const gradient = ctx.createRadialGradient(size / 2, size / 2, 0, size / 2, size / 2, size / 2);\n gradient.addColorStop(0, 'rgba(255,255,255,0.95)');\n gradient.addColorStop(0.4, 'rgba(255,255,255,0.45)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n return texture;\n }\n}\n","import * as THREE from 'three';\nimport type { NeuronVisualEdge } from '../../core/types';\nimport type { EdgeNumberMappingRule, EdgeRenderMode, EdgeStyle, EdgeStyleResolver } from '../types';\n\nexport interface EdgeRenderConfig {\n defaultColor: string;\n activeColor: string;\n selectedColor: string;\n baseOpacity: number;\n strengthOpacityScale: boolean;\n edgeFlowEnabled: boolean;\n edgeFlowSpeed: number;\n focusFadeOpacity: number;\n minStrength: number;\n transitionsEnabled?: boolean;\n transitionDurationMs?: number;\n mode?: EdgeRenderMode;\n opacityRule?: EdgeNumberMappingRule;\n widthRule?: EdgeNumberMappingRule;\n arrowsEnabled?: boolean;\n arrowScale?: number;\n curveTension?: number;\n curveSegments?: number;\n flowMode?: 'pulse' | 'dash';\n flowDashSize?: number;\n flowGapSize?: number;\n getEdgeStyle?: EdgeStyleResolver;\n}\n\ninterface EdgeRenderState {\n id: string;\n fromSlug: string;\n toSlug: string;\n mode: EdgeRenderMode;\n curveSign: number;\n usesDashedMaterial: boolean;\n group: THREE.Group;\n line: THREE.Line;\n arrowhead: THREE.Mesh<THREE.ConeGeometry, THREE.MeshBasicMaterial> | null;\n material: THREE.LineBasicMaterial | THREE.LineDashedMaterial;\n baseColor: THREE.Color;\n baseOpacity: number;\n baseWidth: number;\n phase: number;\n lineDistanceAttribute: THREE.BufferAttribute | null;\n lineDistanceBase: Float32Array | null;\n transitionPhase: 'entering' | 'alive' | 'exiting';\n transitionStartMs: number;\n transitionDurationMs: number;\n}\n\nexport class EdgeRenderer {\n private group = new THREE.Group();\n private edgeStates = new Map<string, EdgeRenderState>();\n private focusEdges = new Set<string>();\n private defaultColor: THREE.Color;\n private activeColor: THREE.Color;\n private selectedColor: THREE.Color;\n private arrowGeometry: THREE.ConeGeometry;\n private up = new THREE.Vector3(0, 1, 0);\n private tempDirection = new THREE.Vector3();\n\n constructor(private scene: THREE.Scene, private config: EdgeRenderConfig) {\n this.defaultColor = new THREE.Color(config.defaultColor);\n this.activeColor = new THREE.Color(config.activeColor);\n this.selectedColor = new THREE.Color(config.selectedColor);\n this.arrowGeometry = new THREE.ConeGeometry(0.14, 0.44, 10);\n this.scene.add(this.group);\n }\n\n renderEdges(edges: NeuronVisualEdge[], nodePositions: Map<string, THREE.Vector3>): void {\n const nowMs = performance.now();\n const transitionsEnabled =\n Boolean(this.config.transitionsEnabled) && Math.max(0, this.config.transitionDurationMs ?? 0) > 0;\n const transitionDurationMs = Math.max(0, this.config.transitionDurationMs ?? 0);\n\n const directedKeys = new Set<string>();\n edges.forEach((edge) => directedKeys.add(`${edge.from}→${edge.to}`));\n\n if (!transitionsEnabled) {\n this.clear();\n edges.forEach((edge) => {\n if (this.config.minStrength > 0 && edge.strength < this.config.minStrength) return;\n const from = nodePositions.get(edge.from);\n const to = nodePositions.get(edge.to);\n if (!from || !to) return;\n const hasReverse = directedKeys.has(`${edge.to}→${edge.from}`);\n const state = this.createEdgeState(edge, from, to, hasReverse, nowMs, false, 0);\n this.edgeStates.set(edge.id, state);\n });\n return;\n }\n\n const nextIds = new Set<string>();\n\n edges.forEach((edge) => {\n if (this.config.minStrength > 0 && edge.strength < this.config.minStrength) return;\n const from = nodePositions.get(edge.from);\n const to = nodePositions.get(edge.to);\n if (!from || !to) return;\n nextIds.add(edge.id);\n\n const hasReverse = directedKeys.has(`${edge.to}→${edge.from}`);\n const existing = this.edgeStates.get(edge.id);\n if (existing) {\n const updated = this.updateExistingEdgeState(existing, edge, from, to, hasReverse);\n if (!updated) {\n this.removeEdge(edge.id);\n const fresh = this.createEdgeState(edge, from, to, hasReverse, nowMs, true, transitionDurationMs);\n this.edgeStates.set(edge.id, fresh);\n return;\n }\n existing.fromSlug = edge.from;\n existing.toSlug = edge.to;\n if (existing.transitionPhase === 'exiting') {\n existing.transitionPhase = 'entering';\n existing.transitionStartMs = nowMs;\n existing.transitionDurationMs = transitionDurationMs;\n }\n return;\n }\n\n const fresh = this.createEdgeState(edge, from, to, hasReverse, nowMs, true, transitionDurationMs);\n this.edgeStates.set(edge.id, fresh);\n });\n\n this.edgeStates.forEach((state, id) => {\n if (nextIds.has(id)) return;\n if (state.transitionPhase === 'exiting') return;\n state.transitionPhase = 'exiting';\n state.transitionStartMs = nowMs;\n state.transitionDurationMs = transitionDurationMs;\n this.focusEdges.delete(id);\n });\n }\n\n updateEdge(edgeId: string, updates: Partial<NeuronVisualEdge>): void {\n const state = this.edgeStates.get(edgeId);\n if (!state) return;\n if (updates.strength !== undefined) {\n const opacity = this.resolveOpacity({ ...updates, id: edgeId } as NeuronVisualEdge, {});\n state.baseOpacity = opacity;\n state.material.opacity = opacity;\n if (state.arrowhead) {\n state.arrowhead.material.opacity = opacity;\n }\n }\n }\n\n removeEdge(edgeId: string): void {\n const state = this.edgeStates.get(edgeId);\n if (!state) return;\n this.group.remove(state.group);\n this.edgeStates.delete(edgeId);\n this.focusEdges.delete(edgeId);\n }\n\n clear(): void {\n this.group.clear();\n this.edgeStates.clear();\n this.focusEdges.clear();\n }\n\n filterByStrength(minStrength: number): void {\n this.edgeStates.forEach((state) => {\n state.line.visible = (state.line.material as THREE.LineBasicMaterial).opacity >= minStrength;\n });\n }\n\n filterByType(): void {\n // Not implemented in stub.\n }\n\n highlightEdge(edgeId: string): void {\n this.setFocusEdges([edgeId]);\n }\n\n highlightEdgesForNode(): void {\n // Not implemented in stub.\n }\n\n unhighlightEdge(edgeId: string): void {\n if (this.focusEdges.has(edgeId)) {\n this.focusEdges.delete(edgeId);\n }\n }\n\n clearHighlights(): void {\n this.focusEdges.clear();\n }\n\n showEdges(edgeIds: string[]): void {\n edgeIds.forEach((id) => {\n const state = this.edgeStates.get(id);\n if (state) state.line.visible = true;\n });\n }\n\n hideEdges(edgeIds: string[]): void {\n edgeIds.forEach((id) => {\n const state = this.edgeStates.get(id);\n if (state) state.line.visible = false;\n });\n }\n\n setFocusEdges(edgeIds: string[] | null): void {\n this.focusEdges = new Set(edgeIds ?? []);\n }\n\n getEdgeObjects(): THREE.Object3D[] {\n return Array.from(this.edgeStates.values()).map((state) => state.group);\n }\n\n updatePositions(nodePositions: Map<string, THREE.Vector3>): void {\n this.edgeStates.forEach((state) => {\n const from = nodePositions.get(state.fromSlug);\n const to = nodePositions.get(state.toSlug);\n if (!from || !to) return;\n\n const geometry = state.line.geometry as THREE.BufferGeometry;\n const positionAttribute = geometry.getAttribute('position') as THREE.BufferAttribute | undefined;\n if (!positionAttribute) return;\n const positionArray = positionAttribute.array;\n if (!(positionArray instanceof Float32Array)) return;\n\n if (state.mode === 'curved') {\n const segments = Math.max(1, positionAttribute.count - 1);\n this.writeQuadraticCurve(positionArray, from, to, state.curveSign, segments);\n } else {\n this.writeLinear(positionArray, from, to, positionAttribute.count);\n }\n positionAttribute.needsUpdate = true;\n\n if (state.lineDistanceAttribute && state.lineDistanceBase) {\n this.updateLineDistances(\n positionArray,\n positionAttribute.count,\n state.lineDistanceAttribute,\n state.lineDistanceBase\n );\n }\n\n if (state.arrowhead) {\n this.positionArrowheadFromPositions(state.arrowhead, from, to, positionArray, positionAttribute.count);\n }\n });\n }\n\n update(_: number, elapsed: number): void {\n const nowMs = performance.now();\n const transitionsEnabled =\n Boolean(this.config.transitionsEnabled) && Math.max(0, this.config.transitionDurationMs ?? 0) > 0;\n const toRemove: string[] = [];\n const hasFocus = this.focusEdges.size > 0;\n this.edgeStates.forEach((state, id) => {\n let lifecycle = 1;\n if (transitionsEnabled && state.transitionPhase !== 'alive') {\n const duration = Math.max(1, state.transitionDurationMs);\n const t = Math.min(1, (nowMs - state.transitionStartMs) / duration);\n const eased = this.easeInOut(t);\n if (state.transitionPhase === 'entering') {\n lifecycle = eased;\n if (t >= 1) {\n state.transitionPhase = 'alive';\n }\n } else {\n lifecycle = 1 - eased;\n if (t >= 1) {\n toRemove.push(id);\n return;\n }\n }\n }\n\n const material = state.material;\n const isFocused = this.focusEdges.has(id);\n let opacity = state.baseOpacity;\n let dashOffset = 0;\n const flowMode = this.config.flowMode ?? 'pulse';\n if (hasFocus) {\n if (isFocused) {\n if (this.config.edgeFlowEnabled && flowMode === 'pulse') {\n const pulse = Math.sin(elapsed * this.config.edgeFlowSpeed + state.phase) * 0.25 + 0.75;\n opacity = Math.min(1, state.baseOpacity + pulse * 0.4);\n } else {\n opacity = Math.min(1, state.baseOpacity + 0.2);\n }\n if (this.config.edgeFlowEnabled && flowMode === 'dash') {\n dashOffset = elapsed * this.config.edgeFlowSpeed + state.phase;\n }\n material.color.copy(this.activeColor);\n } else {\n opacity = Math.max(0.05, state.baseOpacity * this.config.focusFadeOpacity);\n material.color.copy(state.baseColor);\n }\n } else {\n if (this.config.edgeFlowEnabled) {\n if (flowMode === 'pulse') {\n const pulse = Math.sin(elapsed * this.config.edgeFlowSpeed + state.phase) * 0.15 + 0.85;\n opacity = Math.min(1, state.baseOpacity * pulse);\n } else if (flowMode === 'dash') {\n dashOffset = elapsed * this.config.edgeFlowSpeed + state.phase;\n }\n }\n material.color.copy(state.baseColor);\n }\n material.opacity = opacity * Math.max(0, Math.min(1, lifecycle));\n if (state.arrowhead) {\n state.arrowhead.material.opacity = material.opacity;\n state.arrowhead.material.color.copy(material.color);\n }\n if (dashOffset && state.lineDistanceAttribute && state.lineDistanceBase) {\n const array = state.lineDistanceAttribute.array;\n if (array instanceof Float32Array) {\n for (let i = 0; i < array.length && i < state.lineDistanceBase.length; i += 1) {\n array[i] = state.lineDistanceBase[i] + dashOffset;\n }\n state.lineDistanceAttribute.needsUpdate = true;\n }\n }\n });\n\n toRemove.forEach((edgeId) => this.removeEdge(edgeId));\n }\n\n dispose(): void {\n this.clear();\n this.scene.remove(this.group);\n this.arrowGeometry.dispose();\n }\n\n private clamp01(value: number): number {\n return Math.min(1, Math.max(0, value));\n }\n\n private easeInOut(value01: number): number {\n const value = Math.min(1, Math.max(0, value01));\n return value < 0.5 ? 2 * value * value : 1 - Math.pow(-2 * value + 2, 2) / 2;\n }\n\n private createEdgeState(\n edge: NeuronVisualEdge,\n from: THREE.Vector3,\n to: THREE.Vector3,\n hasReverse: boolean,\n nowMs: number,\n entering: boolean,\n transitionDurationMs: number\n ): EdgeRenderState {\n const style = this.config.getEdgeStyle?.(edge) ?? {};\n const opacity = this.resolveOpacity(edge, style);\n const width = this.resolveWidth(edge, style);\n const dashed = Boolean(style.dashed);\n const flowMode = this.config.flowMode ?? 'pulse';\n const usesDashedMaterial = dashed || (this.config.edgeFlowEnabled && flowMode === 'dash');\n const baseColor = style.color ? new THREE.Color(style.color) : this.defaultColor.clone();\n const mode: EdgeRenderMode = this.config.mode ?? 'straight';\n const curveSign = mode === 'curved' ? (hasReverse ? (edge.from < edge.to ? 1 : -1) : this.stableHashToSign(edge.id)) : 1;\n\n const curvePoints = mode === 'curved' ? this.sampleCurve(from, to, edge, hasReverse) : [from, to];\n const geometry = new THREE.BufferGeometry().setFromPoints(curvePoints);\n\n const material = usesDashedMaterial\n ? new THREE.LineDashedMaterial({\n color: baseColor,\n transparent: true,\n opacity: entering ? 0 : opacity,\n depthWrite: false,\n dashSize: this.config.flowDashSize ?? 0.65,\n gapSize: this.config.flowGapSize ?? 0.45,\n scale: 1,\n })\n : new THREE.LineBasicMaterial({\n color: baseColor,\n transparent: true,\n opacity: entering ? 0 : opacity,\n depthWrite: false,\n });\n\n this.applyLineWidth(material, width);\n\n const line = new THREE.Line(geometry, material);\n line.userData = { edgeId: edge.id };\n line.frustumCulled = false;\n\n let lineDistanceAttribute: THREE.BufferAttribute | null = null;\n let lineDistanceBase: Float32Array | null = null;\n if (usesDashedMaterial) {\n line.computeLineDistances();\n const attribute = geometry.getAttribute('lineDistance') as THREE.BufferAttribute | undefined;\n if (attribute && attribute.array instanceof Float32Array) {\n lineDistanceAttribute = attribute;\n lineDistanceBase = attribute.array.slice() as Float32Array;\n }\n }\n\n const group = new THREE.Group();\n group.userData = { edgeId: edge.id };\n group.add(line);\n\n const arrowhead = this.config.arrowsEnabled\n ? this.createArrowhead(edge.id, baseColor, entering ? 0 : opacity, width)\n : null;\n if (arrowhead) {\n arrowhead.frustumCulled = false;\n this.positionArrowhead(arrowhead, from, to, curvePoints);\n group.add(arrowhead);\n }\n\n this.group.add(group);\n\n return {\n id: edge.id,\n fromSlug: edge.from,\n toSlug: edge.to,\n mode,\n curveSign,\n usesDashedMaterial,\n group,\n line,\n arrowhead,\n material,\n baseColor,\n baseOpacity: opacity,\n baseWidth: width,\n phase: Math.random() * Math.PI * 2,\n lineDistanceAttribute,\n lineDistanceBase,\n transitionPhase: entering ? 'entering' : 'alive',\n transitionStartMs: nowMs,\n transitionDurationMs: entering ? transitionDurationMs : 0,\n };\n }\n\n private updateExistingEdgeState(\n existing: EdgeRenderState,\n edge: NeuronVisualEdge,\n from: THREE.Vector3,\n to: THREE.Vector3,\n hasReverse: boolean\n ): boolean {\n const style = this.config.getEdgeStyle?.(edge) ?? {};\n const opacity = this.resolveOpacity(edge, style);\n const width = this.resolveWidth(edge, style);\n const dashed = Boolean(style.dashed);\n const flowMode = this.config.flowMode ?? 'pulse';\n const usesDashedMaterial = dashed || (this.config.edgeFlowEnabled && flowMode === 'dash');\n if (existing.usesDashedMaterial !== usesDashedMaterial) return false;\n if (existing.mode !== (this.config.mode ?? 'straight')) return false;\n\n existing.baseOpacity = opacity;\n existing.baseWidth = width;\n existing.baseColor.copy(style.color ? new THREE.Color(style.color) : this.defaultColor);\n\n existing.material.color.copy(existing.baseColor);\n existing.material.opacity = opacity;\n this.applyLineWidth(existing.material, width);\n\n if (existing.arrowhead) {\n const arrowScale = Math.min(4, Math.max(0.35, (this.config.arrowScale ?? 1) * Math.max(1, width)));\n existing.arrowhead.scale.setScalar(arrowScale);\n existing.arrowhead.material.opacity = existing.material.opacity;\n existing.arrowhead.material.color.copy(existing.material.color);\n }\n\n if (existing.mode === 'curved') {\n existing.curveSign = hasReverse\n ? edge.from < edge.to\n ? 1\n : -1\n : this.stableHashToSign(edge.id);\n const geometry = existing.line.geometry as THREE.BufferGeometry;\n const positionAttribute = geometry.getAttribute('position') as THREE.BufferAttribute | undefined;\n const positionArray = positionAttribute?.array;\n if (positionAttribute && positionArray instanceof Float32Array) {\n const segments = Math.max(1, positionAttribute.count - 1);\n this.writeQuadraticCurve(positionArray, from, to, existing.curveSign, segments);\n positionAttribute.needsUpdate = true;\n if (existing.lineDistanceAttribute && existing.lineDistanceBase) {\n this.updateLineDistances(\n positionArray,\n positionAttribute.count,\n existing.lineDistanceAttribute,\n existing.lineDistanceBase\n );\n }\n if (existing.arrowhead) {\n this.positionArrowheadFromPositions(existing.arrowhead, from, to, positionArray, positionAttribute.count);\n }\n }\n }\n\n return true;\n }\n\n private writeLinear(array: Float32Array, from: THREE.Vector3, to: THREE.Vector3, points: number): void {\n const count = Math.max(2, points);\n for (let i = 0; i < count; i += 1) {\n const t = count <= 1 ? 1 : i / (count - 1);\n const idx = i * 3;\n if (idx + 2 >= array.length) break;\n array[idx] = from.x + (to.x - from.x) * t;\n array[idx + 1] = from.y + (to.y - from.y) * t;\n array[idx + 2] = from.z + (to.z - from.z) * t;\n }\n }\n\n private writeQuadraticCurve(\n array: Float32Array,\n from: THREE.Vector3,\n to: THREE.Vector3,\n sign: number,\n segments: number\n ): void {\n const points = Math.max(2, segments + 1);\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const dz = to.z - from.z;\n const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n if (!Number.isFinite(distance) || distance <= 0.0001 || !Number.isFinite(sign)) {\n this.writeLinear(array, from, to, points);\n return;\n }\n\n const invDistance = 1 / distance;\n const dirX = dx * invDistance;\n const dirY = dy * invDistance;\n const dirZ = dz * invDistance;\n\n // perp = dir x up(0,1,0) => (-dirZ, 0, dirX)\n let perpX = -dirZ;\n let perpY = 0;\n let perpZ = dirX;\n let perpLen = Math.sqrt(perpX * perpX + perpY * perpY + perpZ * perpZ);\n if (perpLen < 1e-6) {\n // dir x (1,0,0) => (0, dirZ, -dirY)\n perpX = 0;\n perpY = dirZ;\n perpZ = -dirY;\n perpLen = Math.sqrt(perpX * perpX + perpY * perpY + perpZ * perpZ);\n }\n if (perpLen < 1e-6) {\n this.writeLinear(array, from, to, points);\n return;\n }\n perpX /= perpLen;\n perpY /= perpLen;\n perpZ /= perpLen;\n\n const tension = Math.min(0.9, Math.max(0, this.config.curveTension ?? 0.18));\n const scale = distance * tension * sign;\n\n const midX = (from.x + to.x) * 0.5;\n const midY = (from.y + to.y) * 0.5;\n const midZ = (from.z + to.z) * 0.5;\n\n const ctrlX = midX + perpX * scale;\n const ctrlY = midY + perpY * scale;\n const ctrlZ = midZ + perpZ * scale;\n\n const seg = Math.max(1, segments);\n for (let i = 0; i <= seg; i += 1) {\n const t = i / seg;\n const inv = 1 - t;\n const inv2 = inv * inv;\n const t2 = t * t;\n const k = 2 * inv * t;\n const x = inv2 * from.x + k * ctrlX + t2 * to.x;\n const y = inv2 * from.y + k * ctrlY + t2 * to.y;\n const z = inv2 * from.z + k * ctrlZ + t2 * to.z;\n const idx = i * 3;\n if (idx + 2 >= array.length) break;\n array[idx] = x;\n array[idx + 1] = y;\n array[idx + 2] = z;\n }\n }\n\n private updateLineDistances(\n positionArray: Float32Array,\n pointCount: number,\n attribute: THREE.BufferAttribute,\n base: Float32Array\n ): void {\n const array = attribute.array;\n if (!(array instanceof Float32Array)) return;\n const count = Math.min(pointCount, attribute.count, base.length, array.length);\n if (count <= 0) return;\n let cumulative = 0;\n base[0] = 0;\n array[0] = 0;\n let prevX = positionArray[0] ?? 0;\n let prevY = positionArray[1] ?? 0;\n let prevZ = positionArray[2] ?? 0;\n for (let i = 1; i < count; i += 1) {\n const idx = i * 3;\n const x = positionArray[idx] ?? prevX;\n const y = positionArray[idx + 1] ?? prevY;\n const z = positionArray[idx + 2] ?? prevZ;\n const dx = x - prevX;\n const dy = y - prevY;\n const dz = z - prevZ;\n cumulative += Math.sqrt(dx * dx + dy * dy + dz * dz);\n base[i] = cumulative;\n array[i] = cumulative;\n prevX = x;\n prevY = y;\n prevZ = z;\n }\n attribute.needsUpdate = true;\n }\n\n private positionArrowheadFromPositions(\n arrow: THREE.Mesh<THREE.ConeGeometry, THREE.MeshBasicMaterial>,\n from: THREE.Vector3,\n to: THREE.Vector3,\n positionArray: Float32Array,\n pointCount: number\n ): void {\n let dirX = to.x - from.x;\n let dirY = to.y - from.y;\n let dirZ = to.z - from.z;\n if (pointCount >= 2) {\n const prevIndex = (pointCount - 2) * 3;\n const prevX = positionArray[prevIndex] ?? from.x;\n const prevY = positionArray[prevIndex + 1] ?? from.y;\n const prevZ = positionArray[prevIndex + 2] ?? from.z;\n dirX = to.x - prevX;\n dirY = to.y - prevY;\n dirZ = to.z - prevZ;\n }\n const len = Math.sqrt(dirX * dirX + dirY * dirY + dirZ * dirZ);\n if (len < 1e-6) {\n this.tempDirection.set(0, 1, 0);\n } else {\n this.tempDirection.set(dirX / len, dirY / len, dirZ / len);\n }\n\n const baseClearance = 0.8;\n const arrowLength = 0.44 * arrow.scale.y;\n const tipX = to.x - this.tempDirection.x * baseClearance;\n const tipY = to.y - this.tempDirection.y * baseClearance;\n const tipZ = to.z - this.tempDirection.z * baseClearance;\n const originX = tipX - this.tempDirection.x * (arrowLength * 0.5);\n const originY = tipY - this.tempDirection.y * (arrowLength * 0.5);\n const originZ = tipZ - this.tempDirection.z * (arrowLength * 0.5);\n arrow.position.set(originX, originY, originZ);\n arrow.quaternion.setFromUnitVectors(this.up, this.tempDirection);\n }\n\n private applyCurve(value01: number, curve: 'linear' | 'sqrt' | 'log' = 'linear'): number {\n const clamped = Math.min(1, Math.max(0, value01));\n if (curve === 'sqrt') {\n return Math.sqrt(clamped);\n }\n if (curve === 'log') {\n return Math.log10(1 + 9 * clamped);\n }\n return clamped;\n }\n\n private resolveEdgeMapping(strength: number, rule?: EdgeNumberMappingRule): number | undefined {\n if (!rule) return undefined;\n if (typeof rule.value === 'number' && Number.isFinite(rule.value)) {\n return rule.value;\n }\n if (rule.fromField !== 'strength') return undefined;\n const outMin = rule.outputMin;\n const outMax = rule.outputMax;\n if (typeof outMin !== 'number' || typeof outMax !== 'number') return undefined;\n\n const inputMin = rule.inputMin ?? 0;\n const inputMax = rule.inputMax ?? 1;\n const denom = inputMax - inputMin;\n if (!Number.isFinite(denom) || denom <= 0) return undefined;\n\n const clamp = rule.clamp ?? true;\n let t = (strength - inputMin) / denom;\n if (clamp) {\n t = Math.min(1, Math.max(0, t));\n }\n t = this.applyCurve(t, rule.curve ?? 'linear');\n\n const value = outMin + (outMax - outMin) * t;\n if (!clamp) return value;\n const lo = Math.min(outMin, outMax);\n const hi = Math.max(outMin, outMax);\n return Math.min(hi, Math.max(lo, value));\n }\n\n private resolveOpacity(edge: NeuronVisualEdge, style: EdgeStyle): number {\n if (typeof style.opacity === 'number' && Number.isFinite(style.opacity)) {\n return this.clamp01(style.opacity);\n }\n const mapped = this.resolveEdgeMapping(edge.strength, this.config.opacityRule);\n if (typeof mapped === 'number' && Number.isFinite(mapped)) {\n return this.clamp01(mapped);\n }\n if (this.config.strengthOpacityScale) {\n return this.clamp01(edge.strength);\n }\n return this.clamp01(this.config.baseOpacity);\n }\n\n private resolveWidth(edge: NeuronVisualEdge, style: EdgeStyle): number {\n if (typeof style.width === 'number' && Number.isFinite(style.width)) {\n return Math.max(0.1, style.width);\n }\n const mapped = this.resolveEdgeMapping(edge.strength, this.config.widthRule);\n if (typeof mapped === 'number' && Number.isFinite(mapped)) {\n return Math.max(0.1, mapped);\n }\n return 1;\n }\n\n private applyLineWidth(material: THREE.LineBasicMaterial | THREE.LineDashedMaterial, width: number): void {\n const cast = material as unknown as { linewidth?: number };\n if (typeof cast.linewidth === 'number') {\n cast.linewidth = width;\n }\n }\n\n private stableHashToSign(value: string): number {\n let hash = 0;\n for (let i = 0; i < value.length; i += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(i);\n hash |= 0;\n }\n return hash % 2 === 0 ? 1 : -1;\n }\n\n private sampleCurve(\n from: THREE.Vector3,\n to: THREE.Vector3,\n edge: NeuronVisualEdge,\n hasReverse: boolean\n ): THREE.Vector3[] {\n const dir = new THREE.Vector3().subVectors(to, from);\n const distance = dir.length();\n if (!Number.isFinite(distance) || distance <= 0.0001) return [from, to];\n\n dir.normalize();\n const up = new THREE.Vector3(0, 1, 0);\n let perp = new THREE.Vector3().crossVectors(dir, up);\n if (perp.lengthSq() < 1e-6) {\n perp = new THREE.Vector3().crossVectors(dir, new THREE.Vector3(1, 0, 0));\n }\n perp.normalize();\n\n const midpoint = new THREE.Vector3().addVectors(from, to).multiplyScalar(0.5);\n const tension = Math.min(0.9, Math.max(0, this.config.curveTension ?? 0.18));\n const sign = hasReverse ? (edge.from < edge.to ? 1 : -1) : this.stableHashToSign(edge.id);\n const control = midpoint.add(perp.multiplyScalar(distance * tension * sign));\n\n const segments = Math.min(64, Math.max(4, Math.round(this.config.curveSegments ?? 16)));\n const curve = new THREE.QuadraticBezierCurve3(from, control, to);\n return curve.getPoints(segments);\n }\n\n private createArrowhead(\n edgeId: string,\n color: THREE.Color,\n opacity: number,\n width: number\n ): THREE.Mesh<THREE.ConeGeometry, THREE.MeshBasicMaterial> {\n const arrowScale = Math.min(4, Math.max(0.35, (this.config.arrowScale ?? 1) * Math.max(1, width)));\n const material = new THREE.MeshBasicMaterial({\n color,\n transparent: true,\n opacity,\n depthWrite: false,\n });\n const mesh = new THREE.Mesh(this.arrowGeometry, material);\n mesh.userData = { edgeId };\n mesh.scale.setScalar(arrowScale);\n return mesh;\n }\n\n private positionArrowhead(\n arrow: THREE.Mesh<THREE.ConeGeometry, THREE.MeshBasicMaterial>,\n from: THREE.Vector3,\n to: THREE.Vector3,\n points: THREE.Vector3[]\n ): void {\n const direction = new THREE.Vector3();\n if (points.length > 2) {\n const a = points[Math.max(0, points.length - 2)];\n direction.subVectors(to, a);\n } else {\n direction.subVectors(to, from);\n }\n if (direction.lengthSq() < 1e-6) {\n direction.set(0, 1, 0);\n } else {\n direction.normalize();\n }\n\n const baseClearance = 0.8;\n const arrowLength = 0.44 * arrow.scale.y;\n const tipPosition = new THREE.Vector3().copy(to).sub(direction.clone().multiplyScalar(baseClearance));\n const origin = tipPosition.sub(direction.clone().multiplyScalar(arrowLength * 0.5));\n arrow.position.copy(origin);\n arrow.quaternion.setFromUnitVectors(new THREE.Vector3(0, 1, 0), direction);\n }\n}\n","/**\n * ClusterRenderer - Renders convex hull boundaries around static clusters\n *\n * Visualizes cluster groupings with semi-transparent boundaries and labels.\n * Used for static/authored clusters with explicit node membership.\n */\n\nimport * as THREE from 'three';\nimport { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\nimport type { NeuronVisualCluster } from '../../core/types';\n\nexport interface ClusterRenderConfig {\n /** Default cluster color if not specified per-cluster */\n defaultColor: string;\n /** Fill opacity for cluster boundary (0-1) */\n fillOpacity: number;\n /** Stroke/border opacity for cluster boundary (0-1) */\n strokeOpacity: number;\n /** Stroke width for cluster boundary */\n strokeWidth: number;\n /** Font family for cluster labels */\n labelFontFamily: string;\n /** Font size for cluster labels */\n labelFontSize: number;\n /** Text color for cluster labels */\n labelTextColor: string;\n /** Background color for cluster labels */\n labelBackground: string;\n /** Enable/disable transitions */\n transitionsEnabled?: boolean;\n /** Transition duration in ms */\n transitionDurationMs?: number;\n /** Vertical offset for cluster plane (to render behind nodes) */\n zOffset?: number;\n /** Padding around convex hull points */\n hullPadding?: number;\n}\n\ninterface ClusterRenderState {\n id: string;\n mesh: THREE.Mesh | null;\n outline: THREE.Line | null;\n label: CSS2DObject | null;\n labelElement: HTMLDivElement | null;\n color: THREE.Color;\n centroid: THREE.Vector3;\n lastNodePositions: Map<string, THREE.Vector3>;\n}\n\n/**\n * Compute 2D convex hull using Graham scan algorithm\n * Projects 3D points to XY plane for hull computation\n */\nfunction computeConvexHull2D(points: THREE.Vector3[]): THREE.Vector2[] {\n if (points.length < 3) {\n return points.map((p) => new THREE.Vector2(p.x, p.y));\n }\n\n // Project to 2D\n const points2D = points.map((p) => new THREE.Vector2(p.x, p.y));\n\n // Find the bottom-most point (lowest y, then leftmost x)\n let minIdx = 0;\n for (let i = 1; i < points2D.length; i++) {\n if (\n points2D[i].y < points2D[minIdx].y ||\n (points2D[i].y === points2D[minIdx].y && points2D[i].x < points2D[minIdx].x)\n ) {\n minIdx = i;\n }\n }\n\n // Swap min point to first position\n [points2D[0], points2D[minIdx]] = [points2D[minIdx], points2D[0]];\n const pivot = points2D[0];\n\n // Sort by polar angle with respect to pivot\n const rest = points2D.slice(1).sort((a, b) => {\n const angleA = Math.atan2(a.y - pivot.y, a.x - pivot.x);\n const angleB = Math.atan2(b.y - pivot.y, b.x - pivot.x);\n if (angleA !== angleB) return angleA - angleB;\n // If same angle, closer point comes first\n return a.distanceTo(pivot) - b.distanceTo(pivot);\n });\n\n // Graham scan\n const hull: THREE.Vector2[] = [pivot];\n\n for (const point of rest) {\n // Remove points that make clockwise turn\n while (hull.length > 1) {\n const top = hull[hull.length - 1];\n const nextToTop = hull[hull.length - 2];\n const cross =\n (top.x - nextToTop.x) * (point.y - nextToTop.y) -\n (top.y - nextToTop.y) * (point.x - nextToTop.x);\n if (cross <= 0) {\n hull.pop();\n } else {\n break;\n }\n }\n hull.push(point);\n }\n\n return hull;\n}\n\n/**\n * Expand hull points outward by padding amount\n */\nfunction expandHull(hull: THREE.Vector2[], padding: number): THREE.Vector2[] {\n if (hull.length < 3 || padding <= 0) return hull;\n\n // Compute centroid\n const centroid = new THREE.Vector2(0, 0);\n for (const p of hull) {\n centroid.add(p);\n }\n centroid.divideScalar(hull.length);\n\n // Expand each point outward from centroid\n return hull.map((p) => {\n const dir = new THREE.Vector2().subVectors(p, centroid).normalize();\n return new THREE.Vector2(p.x + dir.x * padding, p.y + dir.y * padding);\n });\n}\n\nexport class ClusterRenderer {\n private group = new THREE.Group();\n private clusterStates = new Map<string, ClusterRenderState>();\n private config: ClusterRenderConfig;\n\n constructor(private scene: THREE.Scene, config: Partial<ClusterRenderConfig> = {}) {\n this.config = {\n defaultColor: config.defaultColor ?? '#4a5568',\n fillOpacity: config.fillOpacity ?? 0.08,\n strokeOpacity: config.strokeOpacity ?? 0.25,\n strokeWidth: config.strokeWidth ?? 1.5,\n labelFontFamily: config.labelFontFamily ?? 'system-ui, sans-serif',\n labelFontSize: config.labelFontSize ?? 11,\n labelTextColor: config.labelTextColor ?? '#ffffff',\n labelBackground: config.labelBackground ?? 'rgba(0, 0, 0, 0.6)',\n transitionsEnabled: config.transitionsEnabled ?? true,\n transitionDurationMs: config.transitionDurationMs ?? 300,\n zOffset: config.zOffset ?? -0.5,\n hullPadding: config.hullPadding ?? 1.2,\n };\n\n this.scene.add(this.group);\n }\n\n /**\n * Render clusters with convex hull boundaries\n */\n renderClusters(\n clusters: NeuronVisualCluster[],\n nodePositions: Map<string, THREE.Vector3>\n ): void {\n const currentIds = new Set(clusters.map((c) => c.id));\n\n // Remove clusters that no longer exist\n for (const [id, state] of this.clusterStates) {\n if (!currentIds.has(id)) {\n this.removeClusterState(state);\n this.clusterStates.delete(id);\n }\n }\n\n // Update or create clusters\n for (const cluster of clusters) {\n const memberPositions = this.getMemberPositions(cluster.nodeIds, nodePositions);\n\n if (memberPositions.length < 1) {\n // No valid positions, skip this cluster\n continue;\n }\n\n let state = this.clusterStates.get(cluster.id);\n\n if (!state) {\n state = this.createClusterState(cluster);\n this.clusterStates.set(cluster.id, state);\n }\n\n this.updateClusterGeometry(state, cluster, memberPositions);\n }\n }\n\n /**\n * Update cluster positions when nodes move (e.g., ambient motion)\n */\n updatePositions(nodePositions: Map<string, THREE.Vector3>): void {\n for (const [clusterId, state] of this.clusterStates) {\n // Check if any node positions have changed\n let hasChanged = false;\n for (const [nodeId, lastPos] of state.lastNodePositions) {\n const currentPos = nodePositions.get(nodeId);\n if (currentPos && !currentPos.equals(lastPos)) {\n hasChanged = true;\n break;\n }\n }\n\n if (hasChanged) {\n // Find the cluster data (we need nodeIds)\n // Since we don't store the full cluster, we use the lastNodePositions keys\n const nodeIds = Array.from(state.lastNodePositions.keys());\n const memberPositions = this.getMemberPositions(nodeIds, nodePositions);\n if (memberPositions.length > 0) {\n this.updateClusterGeometry(state, { id: clusterId, label: '', nodeIds }, memberPositions);\n }\n }\n }\n }\n\n /**\n * Update method called each frame\n */\n update(_delta: number, _elapsed: number): void {\n // Future: Add animations, pulsing effects, etc.\n }\n\n /**\n * Clear all clusters\n */\n clear(): void {\n for (const state of this.clusterStates.values()) {\n this.removeClusterState(state);\n }\n this.clusterStates.clear();\n }\n\n /**\n * Dispose of all resources\n */\n dispose(): void {\n this.clear();\n this.scene.remove(this.group);\n }\n\n private getMemberPositions(\n nodeIds: string[],\n nodePositions: Map<string, THREE.Vector3>\n ): THREE.Vector3[] {\n const positions: THREE.Vector3[] = [];\n for (const nodeId of nodeIds) {\n const pos = nodePositions.get(nodeId);\n if (pos) {\n positions.push(pos.clone());\n }\n }\n return positions;\n }\n\n private createClusterState(cluster: NeuronVisualCluster): ClusterRenderState {\n const color = new THREE.Color(cluster.color ?? this.config.defaultColor);\n\n // Create label\n const labelElement = document.createElement('div');\n labelElement.className = 'neuron-cluster-label';\n labelElement.style.cssText = `\n font-family: ${this.config.labelFontFamily};\n font-size: ${this.config.labelFontSize}px;\n font-weight: 500;\n color: ${this.config.labelTextColor};\n background: ${this.config.labelBackground};\n padding: 4px 10px;\n border-radius: 12px;\n white-space: nowrap;\n pointer-events: none;\n user-select: none;\n opacity: 0.85;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n `;\n labelElement.textContent = cluster.label;\n\n const label = new CSS2DObject(labelElement);\n label.position.set(0, 0, 0);\n this.group.add(label);\n\n return {\n id: cluster.id,\n mesh: null,\n outline: null,\n label,\n labelElement,\n color,\n centroid: new THREE.Vector3(),\n lastNodePositions: new Map(),\n };\n }\n\n private updateClusterGeometry(\n state: ClusterRenderState,\n cluster: NeuronVisualCluster,\n memberPositions: THREE.Vector3[]\n ): void {\n // Update color if changed\n if (cluster.color) {\n state.color.set(cluster.color);\n }\n\n // Update label text if changed\n if (state.labelElement && cluster.label) {\n state.labelElement.textContent = cluster.label;\n }\n\n // Store current node positions for change detection\n state.lastNodePositions.clear();\n for (let i = 0; i < cluster.nodeIds.length; i++) {\n if (memberPositions[i]) {\n state.lastNodePositions.set(cluster.nodeIds[i], memberPositions[i].clone());\n }\n }\n\n // Compute centroid\n state.centroid.set(0, 0, 0);\n for (const pos of memberPositions) {\n state.centroid.add(pos);\n }\n state.centroid.divideScalar(memberPositions.length);\n\n // Use fixed position if provided\n if (cluster.position) {\n state.centroid.set(cluster.position.x, cluster.position.y, cluster.position.z);\n }\n\n // Update label position (slightly above centroid)\n if (state.label) {\n state.label.position.copy(state.centroid);\n state.label.position.y += 1.5;\n }\n\n // Handle single node case - just show label, no hull\n if (memberPositions.length < 3) {\n this.removeClusterMesh(state);\n return;\n }\n\n // Compute convex hull\n const hull2D = computeConvexHull2D(memberPositions);\n const expandedHull = expandHull(hull2D, this.config.hullPadding ?? 1.2);\n\n if (expandedHull.length < 3) {\n this.removeClusterMesh(state);\n return;\n }\n\n // Create or update fill mesh\n const shape = new THREE.Shape(expandedHull);\n const geometry = new THREE.ShapeGeometry(shape);\n\n // Position the geometry at the average Z (with offset to render behind nodes)\n const avgZ =\n memberPositions.reduce((sum, p) => sum + p.z, 0) / memberPositions.length +\n (this.config.zOffset ?? -0.5);\n\n if (state.mesh) {\n state.mesh.geometry.dispose();\n state.mesh.geometry = geometry;\n state.mesh.position.z = avgZ;\n (state.mesh.material as THREE.MeshBasicMaterial).color.copy(state.color);\n } else {\n const material = new THREE.MeshBasicMaterial({\n color: state.color,\n transparent: true,\n opacity: this.config.fillOpacity,\n side: THREE.DoubleSide,\n depthWrite: false,\n });\n state.mesh = new THREE.Mesh(geometry, material);\n state.mesh.position.z = avgZ;\n state.mesh.renderOrder = -1; // Render before nodes\n this.group.add(state.mesh);\n }\n\n // Create or update outline\n const outlinePoints = [...expandedHull, expandedHull[0]].map(\n (p) => new THREE.Vector3(p.x, p.y, avgZ + 0.01)\n );\n\n if (state.outline) {\n state.outline.geometry.dispose();\n state.outline.geometry = new THREE.BufferGeometry().setFromPoints(outlinePoints);\n (state.outline.material as THREE.LineBasicMaterial).color.copy(state.color);\n } else {\n const outlineGeometry = new THREE.BufferGeometry().setFromPoints(outlinePoints);\n const outlineMaterial = new THREE.LineBasicMaterial({\n color: state.color,\n transparent: true,\n opacity: this.config.strokeOpacity,\n linewidth: this.config.strokeWidth,\n });\n state.outline = new THREE.Line(outlineGeometry, outlineMaterial);\n state.outline.renderOrder = -1;\n this.group.add(state.outline);\n }\n }\n\n private removeClusterMesh(state: ClusterRenderState): void {\n if (state.mesh) {\n state.mesh.geometry.dispose();\n (state.mesh.material as THREE.Material).dispose();\n this.group.remove(state.mesh);\n state.mesh = null;\n }\n if (state.outline) {\n state.outline.geometry.dispose();\n (state.outline.material as THREE.Material).dispose();\n this.group.remove(state.outline);\n state.outline = null;\n }\n }\n\n private removeClusterState(state: ClusterRenderState): void {\n this.removeClusterMesh(state);\n if (state.label) {\n if (state.labelElement?.parentNode) {\n state.labelElement.parentNode.removeChild(state.labelElement);\n }\n this.group.remove(state.label);\n }\n }\n\n /**\n * Get cluster visibility state for external use\n */\n getClusterIds(): string[] {\n return Array.from(this.clusterStates.keys());\n }\n\n /**\n * Get centroid position for a cluster\n */\n getClusterCentroid(clusterId: string): THREE.Vector3 | null {\n const state = this.clusterStates.get(clusterId);\n return state ? state.centroid.clone() : null;\n }\n}\n","import type { NeuronVisualNode } from '../../core/types';\nimport type { NeuronLayoutOptions } from '../types';\n\nconst GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));\nconst ATLAS_POSITION_OVERRIDES: Record<string, [number, number, number]> = {\n uap: [6, 2, 2],\n ez1: [2, 4, 0],\n neph: [-3, 3, 2],\n jude6: [-1, 1.5, 2.5],\n '2p24': [1.2, 0.3, 2.6],\n aiimg: [4.6, -1.6, 1.8],\n rev13: [2.7, -2.8, 0.6],\n xhuman: [0.4, -3.4, -1.8],\n dan243: [-1.6, -2.1, -2.9],\n llm: [3.4, 0.3, -2.4],\n babel: [0.9, 1.4, -3.4],\n warfare: [-4.6, 0.4, -1.5],\n eph612: [-5.5, -1.7, 0.5],\n berea: [-0.2, 4.6, -1.3],\n pharm: [-3.1, -2.4, 1.2],\n testsp: [5.4, 3.2, 1.6],\n};\n\nfunction generateSpherePosition(index: number, total: number, radius: number): [number, number, number] {\n if (total <= 1) {\n return [0, 0, 0];\n }\n const offset = 2 / total;\n const increment = Math.PI * (3 - Math.sqrt(5));\n const y = 1 - index * offset;\n const r = Math.sqrt(Math.max(0, 1 - y * y));\n const phi = index * increment;\n return [Math.cos(phi) * r * radius, y * radius, Math.sin(phi) * r * radius];\n}\n\nfunction hashString(input: string): number {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nfunction mulberry32(seed: number): () => number {\n let t = seed;\n return () => {\n t += 0x6d2b79f5;\n let r = Math.imul(t ^ (t >>> 15), t | 1);\n r ^= r + Math.imul(r ^ (r >>> 7), r | 61);\n return ((r ^ (r >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction buildSeed(baseSeed: string, nodeKey: string): () => number {\n return mulberry32(hashString(`${baseSeed}:${nodeKey}`));\n}\n\nexport function applyFuzzyLayout(\n nodes: NeuronVisualNode[],\n options: NeuronLayoutOptions = {}\n): NeuronVisualNode[] {\n const mode = options.mode ?? 'atlas';\n if (mode === 'positioned') {\n return nodes;\n }\n\n const needsLayout = nodes.some((node) => !node.position);\n if (mode === 'auto' && !needsLayout) {\n return nodes;\n }\n\n const spread = options.spread ?? 1;\n const overrides = { ...ATLAS_POSITION_OVERRIDES, ...(options.overrides ?? {}) };\n\n if (mode === 'atlas' || mode === 'auto') {\n const baseRadius = (options.radius ?? 12) * spread;\n const insightRadius = (options.insightRadius ?? Math.max(5, baseRadius * 0.4)) * spread;\n const canonicalNodes = nodes.filter(\n (node) => node.tier !== 'insight' && node.domain !== 'insight'\n );\n const insightNodes = nodes.filter(\n (node) => node.tier === 'insight' || node.domain === 'insight'\n );\n const canonicalPositions = new Map<string, [number, number, number]>();\n const insightPositions = new Map<string, [number, number, number]>();\n canonicalNodes.forEach((node, index) => {\n canonicalPositions.set(\n node.id,\n generateSpherePosition(index, canonicalNodes.length, baseRadius)\n );\n });\n insightNodes.forEach((node, index) => {\n insightPositions.set(\n node.id,\n generateSpherePosition(index, insightNodes.length || 1, insightRadius)\n );\n });\n\n return nodes.map((node) => {\n const override = overrides[node.id] ?? overrides[node.slug];\n if (node.position && !override) {\n return node;\n }\n if (override) {\n return { ...node, position: [...override] as [number, number, number] };\n }\n const fallback =\n (node.tier === 'insight' || node.domain === 'insight'\n ? insightPositions.get(node.id)\n : canonicalPositions.get(node.id)) ?? [0, 0, 0];\n return { ...node, position: fallback };\n });\n }\n\n const baseSeed = options.seed ?? 'omi-neuron-web';\n const count = Math.max(nodes.length, 1);\n const baseRadius = (options.radius ?? Math.max(4, Math.sqrt(count) * 2.4)) * spread;\n const jitter = (options.jitter ?? baseRadius * 0.12) * spread;\n const zSpread = (options.zSpread ?? baseRadius * 0.6) * spread;\n\n return nodes.map((node, index) => {\n const shouldApply = mode === 'fuzzy' || !node.position;\n if (!shouldApply) {\n return node;\n }\n\n const nodeKey = node.slug || node.id || String(index);\n const rand = buildSeed(baseSeed, nodeKey);\n const angle = rand() * Math.PI * 2 + index * GOLDEN_ANGLE * 0.05;\n const radius = baseRadius * Math.sqrt(rand());\n const jitterOffset = (rand() - 0.5) * jitter;\n const r = Math.max(0.6, radius + jitterOffset);\n const x = Math.cos(angle) * r;\n const y = Math.sin(angle) * r;\n const z = (rand() - 0.5) * zSpread;\n\n return { ...node, position: [x, y, z] };\n });\n}\n","import * as THREE from 'three';\nimport type { NeuronVisualEdge, NeuronVisualNode } from '../../core/types';\n\nexport interface InteractionConfig {\n enableHover: boolean;\n enableClick: boolean;\n enableDoubleClick: boolean;\n hoverDelay: number;\n doubleClickDelay: number;\n}\n\nexport class InteractionManager {\n private raycaster = new THREE.Raycaster();\n private pointer = new THREE.Vector2();\n private nodeObjects: THREE.Object3D[] = [];\n private edgeObjects: THREE.Object3D[] = [];\n private nodeLookup = new Map<string, NeuronVisualNode>();\n private edgeLookup = new Map<string, NeuronVisualEdge>();\n private hoverTimeout: number | null = null;\n private lastHoverId: string | null = null;\n private lastClickTime = 0;\n private lastClickId: string | null = null;\n\n onNodeHover: (node: NeuronVisualNode | null) => void = () => {};\n onNodeClick: (node: NeuronVisualNode) => void = () => {};\n onNodeDoubleClick: (node: NeuronVisualNode) => void = () => {};\n onEdgeClick: (edge: NeuronVisualEdge) => void = () => {};\n onBackgroundClick: () => void = () => {};\n\n constructor(\n private scene: THREE.Scene,\n private camera: THREE.Camera,\n private renderer: THREE.WebGLRenderer,\n private config: InteractionConfig\n ) {\n this.raycaster.params.Line = { threshold: 0.25 };\n }\n\n onPointerMove(event: PointerEvent): void {\n if (!this.config.enableHover) return;\n this.updatePointer(event);\n const node = this.getIntersectedNode(this.pointer);\n if (this.hoverTimeout) {\n window.clearTimeout(this.hoverTimeout);\n }\n this.hoverTimeout = window.setTimeout(() => {\n if (node?.id !== this.lastHoverId) {\n this.lastHoverId = node?.id ?? null;\n this.onNodeHover(node);\n }\n }, this.config.hoverDelay);\n }\n\n onPointerDown(): void {}\n\n onPointerUp(event: PointerEvent): void {\n if (!this.config.enableClick) return;\n this.updatePointer(event);\n const node = this.getIntersectedNode(this.pointer);\n if (node) {\n const now = performance.now();\n const isDouble =\n this.config.enableDoubleClick &&\n now - this.lastClickTime < this.config.doubleClickDelay &&\n this.lastClickId === node.id;\n if (\n !this.config.enableDoubleClick &&\n now - this.lastClickTime < this.config.doubleClickDelay &&\n this.lastClickId === node.id\n ) {\n this.lastClickTime = now;\n this.lastClickId = node.id;\n return;\n }\n this.lastClickTime = now;\n this.lastClickId = node.id;\n if (isDouble) {\n this.onNodeDoubleClick(node);\n } else {\n this.onNodeClick(node);\n }\n } else {\n const edge = this.getIntersectedEdge(this.pointer);\n if (edge) {\n this.onEdgeClick(edge);\n } else {\n this.onBackgroundClick();\n }\n }\n }\n\n onKeyDown(): void {}\n\n onPointerLeave(): void {\n if (!this.config.enableHover) return;\n if (this.hoverTimeout) {\n window.clearTimeout(this.hoverTimeout);\n }\n this.hoverTimeout = window.setTimeout(() => {\n if (this.lastHoverId !== null) {\n this.lastHoverId = null;\n this.onNodeHover(null);\n }\n }, Math.max(0, this.config.hoverDelay));\n }\n\n getIntersectedNode(point: THREE.Vector2): NeuronVisualNode | null {\n this.raycaster.setFromCamera(point, this.camera);\n const intersects = this.raycaster.intersectObjects(this.nodeObjects, true);\n if (!intersects.length) return null;\n const hit = intersects[0].object;\n if (!hit.userData?.nodeId) return null;\n return this.nodeLookup.get(hit.userData.nodeId) ?? null;\n }\n\n getIntersectedEdge(point: THREE.Vector2): NeuronVisualEdge | null {\n this.raycaster.setFromCamera(point, this.camera);\n const intersects = this.raycaster.intersectObjects(this.edgeObjects, true);\n if (!intersects.length) return null;\n let hit: THREE.Object3D | null = intersects[0].object;\n while (hit && !hit.userData?.edgeId) {\n hit = hit.parent;\n }\n if (!hit?.userData?.edgeId) return null;\n return this.edgeLookup.get(hit.userData.edgeId) ?? null;\n }\n\n dispose(): void {\n if (this.hoverTimeout) {\n window.clearTimeout(this.hoverTimeout);\n this.hoverTimeout = null;\n }\n }\n\n setTargets(\n nodeObjects: THREE.Object3D[],\n nodeLookup: Map<string, NeuronVisualNode>,\n edgeObjects?: THREE.Object3D[],\n edgeLookup?: Map<string, NeuronVisualEdge>\n ): void {\n this.nodeObjects = nodeObjects;\n this.nodeLookup = nodeLookup;\n this.edgeObjects = edgeObjects ?? [];\n this.edgeLookup = edgeLookup ?? new Map();\n }\n\n private updatePointer(event: PointerEvent): void {\n const rect = this.renderer.domElement.getBoundingClientRect();\n this.pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n this.pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;\n }\n}\n","import * as THREE from 'three';\nimport type { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\n\nexport interface AnimationConfig {\n focusDuration: number;\n transitionDuration: number;\n easing: 'linear' | 'easeInOut' | 'easeOut';\n}\n\ninterface CameraTween {\n startTime: number;\n duration: number;\n startPosition: THREE.Vector3;\n startTarget: THREE.Vector3;\n endPosition: THREE.Vector3;\n endTarget: THREE.Vector3;\n onComplete?: () => void;\n}\n\nexport class AnimationController {\n private focusTween: CameraTween | null = null;\n\n constructor(\n private camera: THREE.Camera,\n private controls: OrbitControls,\n private config: AnimationConfig\n ) {}\n\n focusOnNode(position: THREE.Vector3, callback?: () => void): void {\n const direction = this.camera.position.clone().sub(this.controls.target).normalize();\n const distance = this.camera.position.distanceTo(this.controls.target);\n const targetPosition = position.clone().add(direction.multiplyScalar(distance));\n this.focusOnPosition(targetPosition, position, callback);\n }\n\n focusOnPosition(position: THREE.Vector3, target: THREE.Vector3, callback?: () => void): void {\n const duration = Math.max(0, this.config.focusDuration);\n if (duration <= 0) {\n this.focusTween = null;\n this.camera.position.copy(position);\n this.controls.target.copy(target);\n this.controls.update();\n if (callback) callback();\n return;\n }\n const now = performance.now();\n this.focusTween = {\n startTime: now,\n duration,\n startPosition: this.camera.position.clone(),\n startTarget: this.controls.target.clone(),\n endPosition: position.clone(),\n endTarget: target.clone(),\n onComplete: callback,\n };\n }\n\n resetCamera(): void {\n this.controls.reset();\n }\n\n cancelFocus(): void {\n this.focusTween = null;\n }\n\n animateNodeAppear(): void {}\n\n animateNodeDisappear(): void {}\n\n animateNodesFilter(): void {}\n\n animatePath(): void {}\n\n stopPathAnimation(): void {}\n\n pause(): void {}\n\n resume(): void {}\n\n update(): void {\n if (!this.focusTween) return;\n const now = performance.now();\n if (this.focusTween.duration <= 0) {\n const completion = this.focusTween.onComplete;\n this.focusTween = null;\n if (completion) completion();\n return;\n }\n const elapsed = Math.min(1, (now - this.focusTween.startTime) / this.focusTween.duration);\n const eased = this.applyEasing(elapsed);\n this.camera.position.lerpVectors(\n this.focusTween.startPosition,\n this.focusTween.endPosition,\n eased\n );\n this.controls.target.lerpVectors(\n this.focusTween.startTarget,\n this.focusTween.endTarget,\n eased\n );\n this.controls.update();\n if (elapsed >= 1) {\n const completion = this.focusTween.onComplete;\n this.focusTween = null;\n if (completion) completion();\n }\n }\n\n dispose(): void {}\n\n private applyEasing(value: number): number {\n if (this.config.easing === 'linear') return value;\n if (this.config.easing === 'easeOut') return 1 - Math.pow(1 - value, 2);\n // easeInOut\n return value < 0.5 ? 2 * value * value : 1 - Math.pow(-2 * value + 2, 2) / 2;\n }\n}\n","import * as THREE from 'three';\n\nexport interface SelectionRippleConfig {\n color: string;\n duration: number;\n maxScale: number;\n opacity: number;\n}\n\nexport class SelectionRipple {\n private mesh: THREE.Mesh;\n private material: THREE.MeshBasicMaterial;\n private startTime: number | null = null;\n private baseScale = 1;\n\n constructor(private scene: THREE.Scene, private config: SelectionRippleConfig) {\n const geometry = new THREE.RingGeometry(0.75, 0.92, 48);\n this.material = new THREE.MeshBasicMaterial({\n color: new THREE.Color(config.color),\n transparent: true,\n opacity: config.opacity,\n depthWrite: false,\n side: THREE.DoubleSide,\n });\n this.mesh = new THREE.Mesh(geometry, this.material);\n this.mesh.visible = false;\n this.scene.add(this.mesh);\n }\n\n trigger(position: THREE.Vector3, baseScale = 1): void {\n this.baseScale = Math.max(0.1, baseScale);\n this.mesh.position.copy(position);\n this.mesh.scale.setScalar(this.baseScale);\n this.mesh.visible = true;\n this.startTime = null;\n }\n\n update(elapsed: number, camera?: THREE.Camera): void {\n if (!this.mesh.visible) return;\n if (this.startTime === null) {\n this.startTime = elapsed;\n }\n const progress = (elapsed - this.startTime) / this.config.duration;\n if (progress >= 1) {\n this.mesh.visible = false;\n this.startTime = null;\n return;\n }\n if (camera) {\n this.mesh.quaternion.copy(camera.quaternion);\n }\n const eased = 1 - Math.pow(1 - progress, 2);\n const scale = this.baseScale * (1 + eased * this.config.maxScale);\n this.mesh.scale.setScalar(scale);\n this.material.opacity = this.config.opacity * (1 - eased);\n }\n\n dispose(): void {\n this.scene.remove(this.mesh);\n this.mesh.geometry.dispose();\n this.material.dispose();\n }\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport * as THREE from 'three';\nimport type { AnimationProfile, NeuronStoryBeat, NeuronWebProps, StudyPathStep } from './types';\nimport type { NeuronEdge, NeuronNode } from '../core/types';\nimport { DEFAULT_THEME } from './constants';\nimport { useSceneManager } from './hooks/useSceneManager';\nimport { resolveDensityOptions } from './density/resolve-density';\nimport { getAutoPerformanceMode } from './performance/auto-performance-mode';\nimport { NodeRenderer } from './scene/node-renderer';\nimport { EdgeRenderer } from './scene/edge-renderer';\nimport { ClusterRenderer } from './scene/cluster-renderer';\nimport { applyFuzzyLayout } from './layouts/fuzzy-layout';\nimport { InteractionManager } from './interactions/interaction-manager';\nimport { AnimationController } from './animations/animation-controller';\nimport { SelectionRipple } from './animations/selection-ripple';\n\ntype StudyPathPlayer = {\n steps: StudyPathStep[];\n index: number;\n playing: boolean;\n stepDurationMs: number;\n};\n\nexport function NeuronWeb({\n graphData,\n className,\n style,\n fullHeight,\n isFullScreen,\n isLoading,\n error,\n selectedNode,\n focusNodeSlug,\n onFocusConsumed,\n visibleNodeSlugs,\n renderEmptyState,\n renderLoadingState,\n ariaLabel,\n theme,\n domainColors,\n layout,\n cameraFit,\n cardsMode,\n clickCard,\n clickZoom,\n studyPathRequest,\n onStudyPathComplete,\n renderNodeHover,\n renderNodeDetail,\n hoverCard,\n hoverCardSlots,\n onNodeHover,\n onNodeClick,\n onNodeDoubleClick,\n onNodeFocused,\n onEdgeClick,\n onBackgroundClick,\n onCameraChange,\n performanceMode,\n density,\n rendering,\n activeStoryBeatId,\n storyBeatStepDurationMs,\n onStoryBeatComplete,\n}: NeuronWebProps): React.ReactElement {\n const containerRef = useRef<HTMLDivElement>(null);\n const hoverCardRef = useRef<HTMLDivElement>(null);\n const clickCardRef = useRef<HTMLDivElement>(null);\n const [hoveredNodeId, setHoveredNodeId] = useState<string | null>(null);\n const [hoverCardNodeId, setHoverCardNodeId] = useState<string | null>(null);\n const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);\n const [studyPathPlayer, setStudyPathPlayer] = useState<StudyPathPlayer | null>(null);\n const fitStateRef = useRef<{ hasFit: boolean; signature: string }>({ hasFit: false, signature: '' });\n const firstFilterChangeRef = useRef(true);\n const [filterTransitioning, setFilterTransitioning] = useState(false);\n const pathEdgeIdsRef = useRef<string[]>([]);\n const focusEdgesRef = useRef<string[] | null>(null);\n const hoverCardHideTimeout = useRef<number | null>(null);\n const hoverCardPositionRef = useRef<{ x: number; y: number } | null>(null);\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n const activeStoryBeatRef = useRef<NeuronStoryBeat | null>(null);\n\n const filteredGraphData = useMemo(() => {\n if (visibleNodeSlugs === null || visibleNodeSlugs === undefined) {\n return graphData;\n }\n const allowed = new Set(visibleNodeSlugs);\n const filteredNodes = graphData.nodes.filter(\n (node) => allowed.has(node.slug) || allowed.has(node.id)\n );\n const filteredEdges = graphData.edges.filter(\n (edge) => allowed.has(edge.from) && allowed.has(edge.to)\n );\n const filteredStoryBeats = graphData.storyBeats\n ?.map((beat) => ({\n ...beat,\n nodeIds: beat.nodeIds.filter((id) => allowed.has(id)),\n }))\n .filter((beat) => beat.nodeIds.length >= 2);\n return {\n ...graphData,\n nodes: filteredNodes,\n edges: filteredEdges,\n storyBeats: filteredStoryBeats,\n };\n }, [graphData, visibleNodeSlugs]);\n\n const resolvedTheme = useMemo(\n () => ({\n ...DEFAULT_THEME,\n colors: {\n ...DEFAULT_THEME.colors,\n ...(theme?.colors ?? {}),\n domainColors: {\n ...DEFAULT_THEME.colors.domainColors,\n ...(theme?.colors?.domainColors ?? {}),\n ...(domainColors ?? {}),\n },\n },\n typography: { ...DEFAULT_THEME.typography, ...(theme?.typography ?? {}) },\n effects: { ...DEFAULT_THEME.effects, ...(theme?.effects ?? {}) },\n animation: { ...DEFAULT_THEME.animation, ...(theme?.animation ?? {}) },\n }),\n [theme, domainColors]\n );\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const media = window.matchMedia('(prefers-reduced-motion: reduce)');\n const update = () => setPrefersReducedMotion(media.matches);\n update();\n if (media.addEventListener) {\n media.addEventListener('change', update);\n return () => media.removeEventListener('change', update);\n }\n media.addListener(update);\n return () => media.removeListener(update);\n }, []);\n\n const filterSignature = useMemo(() => {\n if (visibleNodeSlugs === null || visibleNodeSlugs === undefined) return 'all';\n return visibleNodeSlugs.length ? visibleNodeSlugs.join('|') : 'none';\n }, [visibleNodeSlugs]);\n\n const workingGraph = filteredGraphData;\n\n const resolvedPerformanceMode = useMemo(() => {\n if (performanceMode && performanceMode !== 'auto') return performanceMode;\n const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n return getAutoPerformanceMode({\n nodeCount: workingGraph.nodes.length,\n pixelRatio,\n pixelRatioCap: 2,\n normalMaxNodes: rendering?.performance?.normalMaxNodes,\n degradedMaxNodes: rendering?.performance?.degradedMaxNodes,\n });\n }, [\n performanceMode,\n workingGraph.nodes.length,\n rendering?.performance?.normalMaxNodes,\n rendering?.performance?.degradedMaxNodes,\n ]);\n\n const resolvedDensity = useMemo(() => {\n return resolveDensityOptions(density, resolvedPerformanceMode);\n }, [density, resolvedPerformanceMode]);\n\n const resolvedAnimationProfile = useMemo<AnimationProfile>(() => {\n const preset = rendering?.preset;\n const presetProfile: AnimationProfile | undefined =\n preset === 'minimal' ? 'minimal' : preset === 'cinematic' ? 'cinematic' : preset ? 'subtle' : undefined;\n const requested = rendering?.animations?.profile ?? presetProfile ?? 'subtle';\n let profile: AnimationProfile = requested;\n\n if (resolvedPerformanceMode === 'degraded' && profile === 'cinematic') {\n profile = 'subtle';\n } else if (\n resolvedPerformanceMode === 'fallback' &&\n (profile === 'subtle' || profile === 'cinematic')\n ) {\n profile = 'minimal';\n }\n\n if (prefersReducedMotion) {\n profile = profile === 'off' ? 'off' : 'minimal';\n }\n\n return profile;\n }, [rendering?.preset, rendering?.animations?.profile, resolvedPerformanceMode, prefersReducedMotion]);\n\n const resolvedAnimationConfig = useMemo(() => {\n const profile = resolvedAnimationProfile;\n\n const easingRaw = resolvedTheme.animation.easing;\n const baseEasing: 'linear' | 'easeInOut' | 'easeOut' =\n easingRaw === 'linear' || easingRaw === 'easeInOut' || easingRaw === 'easeOut'\n ? easingRaw\n : 'easeInOut';\n\n const hoverScaleBase = rendering?.nodes?.hover?.scale ?? resolvedTheme.animation.hoverScale;\n const selectedScaleBase = rendering?.nodes?.selection?.scale ?? resolvedTheme.animation.selectedScale;\n\n let hoverScale = hoverScaleBase;\n let selectedScale = selectedScaleBase;\n let pulseScale = resolvedTheme.animation.selectionPulseScale;\n let pulseDurationMs = resolvedTheme.animation.selectionPulseDuration;\n let focusDurationMs = resolvedTheme.animation.focusDuration;\n let transitionDurationMs = resolvedTheme.animation.transitionDuration;\n let easing = baseEasing;\n\n let enableHoverScale = resolvedTheme.animation.enableHoverScale;\n let enableSelectionPulse = resolvedTheme.animation.enableSelectionPulse;\n let enableSelectionRipple = resolvedTheme.animation.enableSelectionRipple;\n let enableCameraTween = resolvedTheme.animation.enableCameraTween;\n\n if (profile === 'off') {\n enableHoverScale = false;\n enableSelectionPulse = false;\n enableSelectionRipple = false;\n enableCameraTween = false;\n hoverScale = 1;\n selectedScale = 1;\n pulseScale = 0;\n pulseDurationMs = 0;\n focusDurationMs = 0;\n transitionDurationMs = 0;\n easing = 'linear';\n } else if (profile === 'minimal') {\n hoverScale = Math.min(hoverScale, 1.08);\n selectedScale = Math.min(selectedScale, 1.25);\n pulseScale = Math.min(pulseScale, 0.24);\n pulseDurationMs = Math.min(pulseDurationMs, 450);\n focusDurationMs = Math.min(focusDurationMs, 450);\n transitionDurationMs = Math.min(transitionDurationMs, 450);\n easing = 'easeOut';\n } else if (profile === 'cinematic') {\n hoverScale = Math.max(hoverScale, 1.12);\n selectedScale = Math.max(selectedScale, 1.4);\n pulseScale = Math.max(pulseScale, 0.35);\n pulseDurationMs = Math.max(pulseDurationMs, 520);\n focusDurationMs = Math.max(focusDurationMs, 800);\n transitionDurationMs = Math.max(transitionDurationMs, 650);\n easing = 'easeInOut';\n }\n\n const overrides = rendering?.animations;\n if (overrides) {\n if (overrides.enableCameraTween !== undefined) {\n enableCameraTween = overrides.enableCameraTween;\n }\n if (typeof overrides.focusDurationMs === 'number' && Number.isFinite(overrides.focusDurationMs)) {\n focusDurationMs = Math.max(0, overrides.focusDurationMs);\n }\n if (\n typeof overrides.transitionDurationMs === 'number' &&\n Number.isFinite(overrides.transitionDurationMs)\n ) {\n transitionDurationMs = Math.max(0, overrides.transitionDurationMs);\n }\n if (overrides.easing) {\n easing = overrides.easing;\n }\n }\n\n if (profile === 'off') {\n enableHoverScale = false;\n enableSelectionPulse = false;\n enableSelectionRipple = false;\n enableCameraTween = false;\n hoverScale = 1;\n selectedScale = 1;\n pulseScale = 0;\n pulseDurationMs = 0;\n focusDurationMs = 0;\n transitionDurationMs = 0;\n easing = 'linear';\n }\n\n if (prefersReducedMotion) {\n enableHoverScale = false;\n enableSelectionPulse = false;\n enableSelectionRipple = false;\n enableCameraTween = false;\n hoverScale = 1;\n pulseScale = 0;\n }\n\n return {\n profile,\n hoverScale,\n selectedScale,\n pulseScale,\n pulseDurationMs,\n focusDurationMs,\n transitionDurationMs,\n easing,\n enableHoverScale,\n enableSelectionPulse,\n enableSelectionRipple,\n enableCameraTween,\n };\n }, [resolvedTheme, rendering, resolvedAnimationProfile, prefersReducedMotion]);\n\n useEffect(() => {\n if (firstFilterChangeRef.current) {\n firstFilterChangeRef.current = false;\n return;\n }\n setFilterTransitioning(true);\n const timer = setTimeout(\n () => setFilterTransitioning(false),\n resolvedAnimationConfig.transitionDurationMs\n );\n return () => clearTimeout(timer);\n }, [filterSignature, resolvedAnimationConfig.transitionDurationMs]);\n\n const sceneManager = useSceneManager(containerRef, {\n backgroundColor: resolvedTheme.colors.background,\n cameraFov: 52,\n cameraPosition: [4, 8, 20],\n cameraTarget: [0, 0, 0],\n minZoom: 4,\n maxZoom: 42,\n autoRotateEnabled: resolvedTheme.effects.autoRotateEnabled,\n autoRotateSpeed: resolvedTheme.effects.autoRotateSpeed,\n enableStarfield: resolvedTheme.effects.starfieldEnabled,\n starfieldCount:\n resolvedPerformanceMode === 'normal'\n ? 1200\n : resolvedPerformanceMode === 'degraded'\n ? 700\n : 0,\n starfieldColor: resolvedTheme.effects.starfieldColor,\n pixelRatioCap: 2,\n ambientLightIntensity: 0.9,\n keyLightIntensity: 0.6,\n fillLightIntensity: 0.4,\n backgroundIntensity: resolvedTheme.effects.backgroundIntensity,\n postprocessingEnabled:\n resolvedTheme.effects.postprocessingEnabled && resolvedPerformanceMode === 'normal',\n bloomEnabled: resolvedTheme.effects.bloomEnabled,\n bloomStrength: resolvedTheme.effects.bloomStrength,\n bloomRadius: resolvedTheme.effects.bloomRadius,\n bloomThreshold: resolvedTheme.effects.bloomThreshold,\n vignetteEnabled: resolvedTheme.effects.vignetteEnabled,\n vignetteDarkness: resolvedTheme.effects.vignetteDarkness,\n vignetteOffset: resolvedTheme.effects.vignetteOffset,\n colorGradeEnabled: resolvedTheme.effects.colorGradeEnabled,\n colorGradeIntensity: resolvedTheme.effects.colorGradeIntensity,\n fogEnabled: resolvedTheme.effects.fogEnabled,\n fogColor: resolvedTheme.effects.fogColor,\n fogNear: resolvedTheme.effects.fogNear,\n fogFar: resolvedTheme.effects.fogFar,\n });\n\n const nodeRenderer = useMemo(() => {\n if (!sceneManager) return null;\n const defaultLabelDistance = resolvedPerformanceMode === 'normal' ? 26 : 0;\n const defaultLabelMax = resolvedPerformanceMode === 'normal' ? 80 : 0;\n let labelDistance = resolvedDensity.labelDistance ?? defaultLabelDistance;\n let labelMax = resolvedDensity.labelMaxCount ?? defaultLabelMax;\n let labelVisibility = resolvedDensity.labelVisibility;\n const defaultTierRules =\n resolvedPerformanceMode === 'normal'\n ? ({ primary: 'always', insight: 'always', secondary: 'auto', tertiary: 'auto' } as const)\n : undefined;\n let labelTierRules = rendering?.labels?.tiers ?? defaultTierRules;\n let labelTransitionsEnabled = false;\n let labelTransitionDurationMs = 0;\n\n if (rendering?.labels) {\n if (rendering.labels.visibility) {\n labelVisibility = rendering.labels.visibility;\n }\n if (typeof rendering.labels.distance === 'number') {\n labelDistance = rendering.labels.distance;\n }\n if (typeof rendering.labels.maxCount === 'number') {\n labelMax = rendering.labels.maxCount;\n }\n if (rendering.labels.tiers) {\n labelTierRules = rendering.labels.tiers;\n }\n labelTransitionsEnabled = Boolean(rendering.labels.transitions?.enabled);\n labelTransitionDurationMs = Math.max(0, rendering.labels.transitions?.durationMs ?? 160);\n\n if (resolvedPerformanceMode === 'fallback') {\n labelDistance = 0;\n labelMax = 0;\n labelTransitionsEnabled = false;\n } else if (resolvedPerformanceMode !== 'normal') {\n labelTransitionsEnabled = false;\n }\n }\n\n if (prefersReducedMotion) {\n labelTransitionsEnabled = false;\n }\n const requestedMode = rendering?.nodes?.mode ?? 'sprite';\n const resolvedNodeMode =\n requestedMode === 'mesh' && resolvedPerformanceMode !== 'normal' ? 'sprite' : requestedMode;\n const hoverScale = resolvedAnimationConfig.hoverScale;\n const selectedScale = resolvedAnimationConfig.selectedScale;\n const profileAllowsContinuous =\n resolvedAnimationConfig.profile === 'subtle' || resolvedAnimationConfig.profile === 'cinematic';\n const transitionsEnabled =\n resolvedPerformanceMode === 'normal' &&\n !prefersReducedMotion &&\n profileAllowsContinuous &&\n resolvedAnimationConfig.transitionDurationMs > 0;\n return new NodeRenderer(sceneManager.scene, {\n domainColors: resolvedTheme.colors.domainColors,\n statusColors: resolvedTheme.colors.statusColors,\n defaultColor: resolvedTheme.colors.defaultDomainColor,\n baseScale: 1.15,\n tierScales: {\n primary: 1.25,\n secondary: 1.1,\n tertiary: 0.95,\n insight: 1.05,\n },\n glowIntensity: resolvedTheme.effects.glowEnabled ? resolvedTheme.effects.glowIntensity : 0,\n labelDistance,\n maxVisibleLabels: labelMax,\n labelVisibility,\n labelTierRules,\n labelTransitionsEnabled,\n labelTransitionDurationMs,\n transitionsEnabled,\n transitionDurationMs: resolvedAnimationConfig.transitionDurationMs,\n hitTargetScale: 2.2,\n labelOffset: [0, 0.65, 0],\n labelFontFamily: resolvedTheme.typography.labelFontFamily,\n labelFontSize: resolvedTheme.typography.labelFontSize,\n labelFontWeight: resolvedTheme.typography.labelFontWeight,\n labelTextColor: resolvedTheme.colors.labelText,\n labelBackground: resolvedTheme.colors.labelBackground,\n mode: resolvedNodeMode,\n sizeRule: rendering?.nodes?.size,\n opacityRule: rendering?.nodes?.opacity,\n getNodeStyle: rendering?.resolvers?.getNodeStyle,\n selectionHighlightColor: rendering?.nodes?.selection?.highlightColor,\n ambientMotionEnabled:\n resolvedTheme.effects.ambientMotionEnabled &&\n resolvedPerformanceMode === 'normal' &&\n !prefersReducedMotion &&\n profileAllowsContinuous,\n ambientMotionAmplitude: resolvedTheme.effects.ambientMotionAmplitude,\n ambientMotionSpeed: resolvedTheme.effects.ambientMotionSpeed,\n hoverScale,\n selectedScale,\n pulseScale: resolvedAnimationConfig.pulseScale,\n pulseDuration: resolvedAnimationConfig.pulseDurationMs / 1000,\n enableHoverScale: resolvedAnimationConfig.enableHoverScale,\n enableSelectionPulse: resolvedAnimationConfig.enableSelectionPulse,\n });\n }, [\n sceneManager,\n resolvedTheme,\n resolvedPerformanceMode,\n resolvedDensity,\n prefersReducedMotion,\n rendering,\n resolvedAnimationConfig,\n ]);\n\n const edgeRenderer = useMemo(() => {\n if (!sceneManager) return null;\n const requestedMode = rendering?.edges?.mode ?? 'straight';\n const resolvedEdgeMode =\n requestedMode === 'curved' && resolvedPerformanceMode !== 'normal' ? 'straight' : requestedMode;\n const profileAllowsFlow =\n resolvedAnimationConfig.profile === 'subtle' || resolvedAnimationConfig.profile === 'cinematic';\n const transitionsEnabled =\n resolvedPerformanceMode === 'normal' &&\n !prefersReducedMotion &&\n profileAllowsFlow &&\n resolvedAnimationConfig.transitionDurationMs > 0;\n const requestedFlowEnabled = profileAllowsFlow\n ? (rendering?.edges?.flow?.enabled ?? resolvedTheme.effects.edgeFlowEnabled)\n : false;\n const resolvedFlowEnabled =\n requestedFlowEnabled && resolvedPerformanceMode === 'normal' && !prefersReducedMotion;\n const flowMode = rendering?.edges?.flow?.mode ?? 'pulse';\n const arrowsRequested = rendering?.edges?.arrows?.enabled ?? false;\n const arrowsEnabled = arrowsRequested && resolvedPerformanceMode === 'normal';\n const curveTension = rendering?.edges?.curve?.tension;\n const curveSegments = rendering?.edges?.curve?.segments;\n return new EdgeRenderer(sceneManager.scene, {\n defaultColor: resolvedTheme.colors.edgeDefault,\n activeColor: resolvedTheme.colors.edgeActive,\n selectedColor: resolvedTheme.colors.edgeSelected,\n baseOpacity: 0.45,\n strengthOpacityScale: true,\n edgeFlowEnabled: resolvedFlowEnabled,\n edgeFlowSpeed: rendering?.edges?.flow?.speed ?? resolvedTheme.effects.edgeFlowSpeed,\n focusFadeOpacity: resolvedDensity.edgeFade,\n minStrength: resolvedDensity.minEdgeStrength,\n transitionsEnabled,\n transitionDurationMs: resolvedAnimationConfig.transitionDurationMs,\n mode: resolvedEdgeMode,\n opacityRule: rendering?.edges?.opacity,\n widthRule: rendering?.edges?.width,\n arrowsEnabled,\n arrowScale: rendering?.edges?.arrows?.scale,\n curveTension,\n curveSegments,\n flowMode,\n flowDashSize: rendering?.edges?.flow?.dashSize,\n flowGapSize: rendering?.edges?.flow?.gapSize,\n getEdgeStyle: rendering?.resolvers?.getEdgeStyle,\n });\n }, [\n sceneManager,\n resolvedTheme,\n resolvedPerformanceMode,\n resolvedDensity,\n prefersReducedMotion,\n rendering,\n resolvedAnimationConfig,\n ]);\n\n useEffect(() => {\n return () => {\n nodeRenderer?.dispose();\n };\n }, [nodeRenderer]);\n\n useEffect(() => {\n return () => {\n edgeRenderer?.dispose();\n };\n }, [edgeRenderer]);\n\n // Cluster renderer for static cluster visualization\n const clusterRenderer = useMemo(() => {\n if (!sceneManager) return null;\n // Only create if clusters are provided\n if (!graphData.clusters?.length) return null;\n\n return new ClusterRenderer(sceneManager.scene, {\n defaultColor: resolvedTheme.colors.defaultDomainColor,\n fillOpacity: 0.08,\n strokeOpacity: 0.25,\n strokeWidth: 1.5,\n labelFontFamily: resolvedTheme.typography.labelFontFamily,\n labelFontSize: resolvedTheme.typography.labelFontSize - 1,\n labelTextColor: resolvedTheme.colors.labelText,\n labelBackground: resolvedTheme.colors.labelBackground,\n zOffset: -0.5,\n hullPadding: 1.2,\n });\n }, [sceneManager, graphData.clusters?.length, resolvedTheme]);\n\n useEffect(() => {\n return () => {\n clusterRenderer?.dispose();\n };\n }, [clusterRenderer]);\n\n const doubleClickEnabled = false;\n\n const interactionManager = useMemo(() => {\n if (!sceneManager) return null;\n return new InteractionManager(sceneManager.scene, sceneManager.camera, sceneManager.renderer, {\n enableHover: true,\n enableClick: true,\n enableDoubleClick: doubleClickEnabled,\n hoverDelay: Math.max(40, resolvedTheme.animation.hoverCardFadeDuration * 0.6),\n doubleClickDelay: 280,\n });\n }, [sceneManager, resolvedTheme.animation.hoverCardFadeDuration, doubleClickEnabled]);\n\n const animationController = useMemo(() => {\n if (!sceneManager) return null;\n return new AnimationController(sceneManager.camera, sceneManager.controls, {\n focusDuration: resolvedAnimationConfig.focusDurationMs,\n transitionDuration: resolvedAnimationConfig.transitionDurationMs,\n easing: resolvedAnimationConfig.easing,\n });\n }, [sceneManager, resolvedAnimationConfig]);\n\n const rippleEnabled =\n resolvedAnimationConfig.enableSelectionRipple && resolvedPerformanceMode !== 'fallback';\n\n const selectionRipple = useMemo(() => {\n if (!sceneManager || !rippleEnabled) return null;\n return new SelectionRipple(sceneManager.scene, {\n color: resolvedTheme.colors.edgeSelected,\n duration: Math.max(0.2, resolvedAnimationConfig.pulseDurationMs / 1000),\n maxScale: 1.4,\n opacity: 0.6,\n });\n }, [sceneManager, resolvedTheme.colors.edgeSelected, rippleEnabled, resolvedAnimationConfig.pulseDurationMs]);\n\n useEffect(() => {\n return () => {\n selectionRipple?.dispose();\n };\n }, [selectionRipple]);\n\n const layoutOptions = useMemo(\n () => ({\n ...layout,\n spread: layout?.spread ?? resolvedDensity.spread,\n }),\n [layout, resolvedDensity.spread]\n );\n\n const resolvedNodes = useMemo(\n () => applyFuzzyLayout(workingGraph.nodes, layoutOptions),\n [workingGraph.nodes, layoutOptions]\n );\n\n const displayNodes = useMemo(() => {\n if (!selectedNodeId || !resolvedDensity.focusExpansion) return resolvedNodes;\n const selected = resolvedNodes.find((node) => node.id === selectedNodeId);\n if (!selected?.position) return resolvedNodes;\n const anchor = new THREE.Vector3(...selected.position);\n const expansion = 1 + resolvedDensity.focusExpansion;\n return resolvedNodes.map((node) => {\n if (!node.position || node.id === selectedNodeId) return node;\n const position = new THREE.Vector3(...node.position)\n .sub(anchor)\n .multiplyScalar(expansion)\n .add(anchor);\n return { ...node, position: [position.x, position.y, position.z] as [number, number, number] };\n });\n }, [resolvedNodes, selectedNodeId, resolvedDensity.focusExpansion]);\n\n const resolvedCameraFit = useMemo(() => {\n const enabled = cameraFit?.enabled ?? Boolean(isFullScreen);\n return {\n enabled,\n mode: cameraFit?.mode ?? 'once',\n viewportFraction: cameraFit?.viewportFraction ?? 0.33,\n padding: cameraFit?.padding ?? 0.15,\n };\n }, [cameraFit, isFullScreen]);\n\n const fitSignature = useMemo(\n () =>\n resolvedNodes\n .map((node) => `${node.id}:${node.position ? node.position.map((v) => v.toFixed(3)).join(',') : ''}`)\n .join('|'),\n [resolvedNodes]\n );\n\n const nodeMap = useMemo(\n () => new Map(resolvedNodes.map((node) => [node.id, node])),\n [resolvedNodes]\n );\n\n const edgeMap = useMemo(\n () => new Map(workingGraph.edges.map((edge) => [edge.id, edge])),\n [workingGraph.edges]\n );\n\n const nodeSlugById = useMemo(() => {\n const map = new Map<string, string>();\n resolvedNodes.forEach((node) => map.set(node.id, node.slug));\n return map;\n }, [resolvedNodes]);\n\n const edgesBySlug = useMemo(() => {\n const map = new Map<string, string[]>();\n workingGraph.edges.forEach((edge) => {\n const add = (slug: string) => {\n const list = map.get(slug);\n if (list) list.push(edge.id);\n else map.set(slug, [edge.id]);\n };\n add(edge.from);\n add(edge.to);\n });\n return map;\n }, [workingGraph.edges]);\n\n const applyFocusEdges = useCallback(\n (edgeIds: string[] | null) => {\n if (!edgeRenderer) return;\n focusEdgesRef.current = edgeIds;\n const merged = new Set(edgeIds ?? []);\n pathEdgeIdsRef.current.forEach((id) => merged.add(id));\n edgeRenderer.setFocusEdges(merged.size ? Array.from(merged) : null);\n },\n [edgeRenderer]\n );\n\n const resolvedStudyPathSteps = useMemo<StudyPathStep[] | null>(() => {\n if (!studyPathRequest) return null;\n if (studyPathRequest.steps && studyPathRequest.steps.length) {\n return studyPathRequest.steps;\n }\n if (studyPathRequest.fromNodeId && studyPathRequest.toNodeId) {\n return [\n { nodeId: studyPathRequest.fromNodeId },\n { nodeId: studyPathRequest.toNodeId },\n ];\n }\n return null;\n }, [studyPathRequest]);\n\n const activeStoryBeat = useMemo(() => {\n if (!activeStoryBeatId || !workingGraph.storyBeats) return null;\n return workingGraph.storyBeats.find((beat) => beat.id === activeStoryBeatId) ?? null;\n }, [activeStoryBeatId, workingGraph.storyBeats]);\n\n const resolvedBeatSteps = useMemo<StudyPathStep[] | null>(() => {\n if (!activeStoryBeat) return null;\n if (!activeStoryBeat.nodeIds || activeStoryBeat.nodeIds.length === 0) return null;\n return activeStoryBeat.nodeIds.map((nodeId) => ({ nodeId }));\n }, [activeStoryBeat]);\n\n useEffect(() => {\n const steps = resolvedStudyPathSteps ?? resolvedBeatSteps;\n if (!steps || steps.length === 0) {\n setStudyPathPlayer(null);\n pathEdgeIdsRef.current = [];\n applyFocusEdges(focusEdgesRef.current);\n activeStoryBeatRef.current = null;\n return;\n }\n activeStoryBeatRef.current = resolvedBeatSteps ? activeStoryBeat : null;\n setStudyPathPlayer({\n steps,\n index: 0,\n playing: true,\n stepDurationMs:\n resolvedBeatSteps && storyBeatStepDurationMs\n ? storyBeatStepDurationMs\n : studyPathRequest?.stepDurationMs ?? 4200,\n });\n }, [\n resolvedStudyPathSteps,\n resolvedBeatSteps,\n studyPathRequest?.stepDurationMs,\n storyBeatStepDurationMs,\n activeStoryBeat,\n applyFocusEdges,\n ]);\n\n const nodeByIdentifier = useMemo(() => {\n const map = new Map<string, typeof resolvedNodes[number]>();\n resolvedNodes.forEach((node) => {\n map.set(node.slug, node);\n map.set(node.id, node);\n });\n return map;\n }, [resolvedNodes]);\n\n const selectionControlled = selectedNode !== undefined;\n\n const keyboardNodeIds = useMemo(\n () =>\n resolvedNodes\n .map((node) => node.id)\n .slice()\n .sort((a, b) => a.localeCompare(b)),\n [resolvedNodes]\n );\n\n const hoverCardEnabled =\n (cardsMode ? (cardsMode === 'hover' || cardsMode === 'both') : (hoverCard?.enabled ?? true)) &&\n resolvedPerformanceMode !== 'fallback';\n const hoverCardOffset = hoverCard?.offset ?? [18, 18];\n const hoverCardWidth = hoverCard?.width ?? 240;\n const hoverCardVisible = hoverCardEnabled && Boolean(hoverCardNodeId);\n const hoverCardActive =\n hoverCardEnabled && Boolean(hoveredNodeId && hoverCardNodeId === hoveredNodeId);\n const hoverCardSlideDistance =\n prefersReducedMotion ||\n resolvedAnimationConfig.profile === 'off' ||\n resolvedAnimationConfig.profile === 'minimal'\n ? 0\n : resolvedTheme.animation.hoverCardSlideDistance;\n const hoverCardNode = hoverCardNodeId ? nodeMap.get(hoverCardNodeId) ?? null : null;\n const hoverSummaryMax = hoverCard?.maxSummaryLength ?? 140;\n const showHoverTags = hoverCard?.showTags ?? true;\n const showHoverMetrics = hoverCard?.showMetrics ?? true;\n const clickCardEnabled =\n (cardsMode ? (cardsMode === 'click' || cardsMode === 'both') : (clickCard?.enabled ?? false)) &&\n resolvedPerformanceMode !== 'fallback';\n const clickCardOffset = clickCard?.offset ?? [24, 24];\n const clickCardWidth = clickCard?.width ?? 320;\n const clickZoomEnabled = clickZoom?.enabled ?? true;\n const clickZoomDistance = clickZoom?.distance;\n const clickZoomOffset = clickZoom?.offset;\n const cameraTweenEnabled = resolvedAnimationConfig.enableCameraTween;\n\n const truncateText = useCallback((value: string, maxLength: number) => {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, Math.max(0, maxLength - 1))}…`;\n }, []);\n\n useEffect(() => {\n if (!hoverCardEnabled) {\n setHoverCardNodeId(null);\n return;\n }\n if (hoveredNodeId) {\n if (hoverCardHideTimeout.current) {\n window.clearTimeout(hoverCardHideTimeout.current);\n hoverCardHideTimeout.current = null;\n }\n setHoverCardNodeId(hoveredNodeId);\n return;\n }\n if (hoverCardNodeId) {\n if (hoverCardHideTimeout.current) {\n window.clearTimeout(hoverCardHideTimeout.current);\n }\n hoverCardHideTimeout.current = window.setTimeout(() => {\n setHoverCardNodeId(null);\n hoverCardHideTimeout.current = null;\n }, Math.max(80, resolvedTheme.animation.hoverCardFadeDuration));\n }\n }, [\n hoveredNodeId,\n hoverCardEnabled,\n hoverCardNodeId,\n resolvedTheme.animation.hoverCardFadeDuration,\n ]);\n\n useEffect(() => {\n hoverCardPositionRef.current = null;\n }, [hoverCardNodeId]);\n\n const hoverCardTags = useMemo(() => {\n if (!hoverCardNode) return [];\n const rawTags =\n (Array.isArray(hoverCardNode.metadata?.tags)\n ? hoverCardNode.metadata?.tags\n : Array.isArray(hoverCardNode.metadata?.keywords)\n ? hoverCardNode.metadata?.keywords\n : []) as string[];\n return rawTags.map((tag) => String(tag)).filter(Boolean).slice(0, 4);\n }, [hoverCardNode]);\n\n const hoverCardMetrics = useMemo(() => {\n if (!hoverCardNode) return [];\n const metrics: Array<{ label: string; value: string | number }> = [];\n metrics.push({ label: 'Connections', value: hoverCardNode.connectionCount ?? 0 });\n const cluster = hoverCardNode.metadata?.clusterSimilarity as number | undefined;\n if (typeof cluster === 'number') {\n metrics.push({ label: 'Cluster', value: cluster.toFixed(2) });\n }\n return metrics.slice(0, 3);\n }, [hoverCardNode]);\n\n const focusOnNodePosition = useCallback(\n (nodePosition: THREE.Vector3, callback?: () => void) => {\n if (!animationController && !sceneManager) return;\n if (Array.isArray(clickZoomOffset) && clickZoomOffset.length === 3) {\n const offset = new THREE.Vector3(...clickZoomOffset);\n const targetPosition = nodePosition.clone().add(offset);\n if (cameraTweenEnabled && animationController) {\n animationController.focusOnPosition(targetPosition, nodePosition, callback);\n } else if (sceneManager) {\n sceneManager.camera.position.copy(targetPosition);\n sceneManager.controls.target.copy(nodePosition);\n sceneManager.controls.update();\n if (callback) callback();\n }\n return;\n }\n if (typeof clickZoomDistance === 'number' && Number.isFinite(clickZoomDistance)) {\n if (!sceneManager) {\n if (cameraTweenEnabled && animationController) {\n animationController.focusOnNode(nodePosition, callback);\n }\n return;\n }\n const direction = sceneManager.camera.position.clone().sub(sceneManager.controls.target);\n if (direction.lengthSq() < 0.0001) {\n direction.set(0, 0, 1);\n }\n direction.normalize();\n const targetPosition = nodePosition.clone().add(direction.multiplyScalar(clickZoomDistance));\n if (cameraTweenEnabled && animationController) {\n animationController.focusOnPosition(targetPosition, nodePosition, callback);\n } else {\n sceneManager.camera.position.copy(targetPosition);\n sceneManager.controls.target.copy(nodePosition);\n sceneManager.controls.update();\n if (callback) callback();\n }\n return;\n }\n if (cameraTweenEnabled && animationController) {\n animationController.focusOnNode(nodePosition, callback);\n } else if (sceneManager) {\n const direction = sceneManager.camera.position.clone().sub(sceneManager.controls.target);\n if (direction.lengthSq() < 0.0001) {\n direction.set(0, 0, 1);\n }\n direction.normalize();\n const distance = sceneManager.camera.position.distanceTo(sceneManager.controls.target);\n const targetPosition = nodePosition.clone().add(direction.multiplyScalar(distance));\n sceneManager.camera.position.copy(targetPosition);\n sceneManager.controls.target.copy(nodePosition);\n sceneManager.controls.update();\n if (callback) callback();\n }\n },\n [animationController, clickZoomOffset, clickZoomDistance, sceneManager, cameraTweenEnabled]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!nodeRenderer) return;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n setStudyPathPlayer(null);\n pathEdgeIdsRef.current = [];\n if (!selectionControlled) {\n setSelectedNodeId(null);\n nodeRenderer.setSelectedNode(null);\n applyFocusEdges(null);\n } else {\n applyFocusEdges(focusEdgesRef.current);\n }\n if (onBackgroundClick) onBackgroundClick();\n return;\n }\n\n if ((event.key === 'Enter' || event.key === ' ') && selectedNodeId) {\n event.preventDefault();\n const position = nodeRenderer.getNodePosition(selectedNodeId);\n if (position && clickZoomEnabled) {\n focusOnNodePosition(position, () => {\n const node = nodeMap.get(selectedNodeId) ?? null;\n if (node && onNodeFocused) onNodeFocused(node as unknown as NeuronNode);\n });\n }\n return;\n }\n\n if (selectionControlled) return;\n const direction =\n event.key === 'ArrowRight' || event.key === 'ArrowDown'\n ? 1\n : event.key === 'ArrowLeft' || event.key === 'ArrowUp'\n ? -1\n : 0;\n if (!direction) return;\n if (!keyboardNodeIds.length) return;\n\n event.preventDefault();\n const currentIndex = selectedNodeId ? keyboardNodeIds.indexOf(selectedNodeId) : -1;\n const nextIndex =\n currentIndex === -1\n ? 0\n : (currentIndex + direction + keyboardNodeIds.length) % keyboardNodeIds.length;\n const nextId = keyboardNodeIds[nextIndex];\n setSelectedNodeId(nextId);\n nodeRenderer.setSelectedNode(nextId);\n const slug = nodeSlugById.get(nextId);\n applyFocusEdges(slug ? edgesBySlug.get(slug) ?? [] : []);\n },\n [\n nodeRenderer,\n selectionControlled,\n selectedNodeId,\n clickZoomEnabled,\n focusOnNodePosition,\n keyboardNodeIds,\n nodeSlugById,\n edgesBySlug,\n applyFocusEdges,\n nodeMap,\n onNodeFocused,\n onBackgroundClick,\n ]\n );\n\n useEffect(() => {\n if (!studyPathPlayer) return;\n const step = studyPathPlayer.steps[studyPathPlayer.index];\n const stepKey = step?.nodeSlug ?? step?.nodeId ?? null;\n const node = stepKey ? nodeByIdentifier.get(stepKey) ?? null : null;\n\n if (node && nodeRenderer && edgeRenderer) {\n setSelectedNodeId(node.id);\n nodeRenderer.setSelectedNode(node.id);\n nodeRenderer.pulseNode(node.id);\n if (selectionRipple) {\n const nodePosition = nodeRenderer.getNodePosition(node.id);\n if (nodePosition) {\n const nodeObject = nodeRenderer.getNodeObject(node.id);\n selectionRipple.trigger(nodePosition, nodeObject?.scale.x ?? 1);\n }\n }\n if (clickZoomEnabled) {\n const nodePosition = nodeRenderer.getNodePosition(node.id);\n if (nodePosition) {\n focusOnNodePosition(nodePosition, () => {\n if (onNodeFocused) onNodeFocused(node as unknown as NeuronNode);\n });\n }\n }\n const slug = node.slug;\n applyFocusEdges(slug ? edgesBySlug.get(slug) ?? [] : []);\n }\n\n const nextStep =\n studyPathPlayer.index < studyPathPlayer.steps.length - 1\n ? studyPathPlayer.steps[studyPathPlayer.index + 1]\n : null;\n const currentSlug = node?.slug ?? (step?.nodeSlug ?? null);\n const nextKey = nextStep?.nodeSlug ?? nextStep?.nodeId ?? null;\n const nextNode = nextKey ? nodeByIdentifier.get(nextKey) ?? null : null;\n const nextSlug = nextNode?.slug ?? (nextStep?.nodeSlug ?? null);\n\n if (currentSlug && nextSlug) {\n pathEdgeIdsRef.current = workingGraph.edges\n .filter(\n (edge) =>\n (edge.from === currentSlug && edge.to === nextSlug) ||\n (edge.to === currentSlug && edge.from === nextSlug)\n )\n .map((edge) => edge.id);\n } else {\n pathEdgeIdsRef.current = [];\n }\n\n applyFocusEdges(focusEdgesRef.current);\n }, [\n studyPathPlayer,\n nodeByIdentifier,\n nodeRenderer,\n edgeRenderer,\n selectionRipple,\n edgesBySlug,\n workingGraph.edges,\n animationController,\n clickZoomEnabled,\n onNodeFocused,\n applyFocusEdges,\n ]);\n\n useEffect(() => {\n if (!studyPathPlayer || !studyPathPlayer.playing) return;\n const timer = window.setTimeout(() => {\n setStudyPathPlayer((prev) => {\n if (!prev) return prev;\n if (prev.index >= prev.steps.length - 1) {\n if (activeStoryBeatRef.current && onStoryBeatComplete) {\n onStoryBeatComplete(activeStoryBeatRef.current);\n }\n if (onStudyPathComplete) onStudyPathComplete();\n return { ...prev, playing: false };\n }\n return { ...prev, index: prev.index + 1 };\n });\n }, studyPathPlayer.stepDurationMs);\n return () => window.clearTimeout(timer);\n }, [studyPathPlayer, onStudyPathComplete, onStoryBeatComplete]);\n\n useEffect(() => {\n if (!studyPathPlayer || studyPathPlayer.playing) return;\n pathEdgeIdsRef.current = [];\n applyFocusEdges(focusEdgesRef.current);\n }, [studyPathPlayer, applyFocusEdges]);\n\n useEffect(() => {\n if (!sceneManager || !nodeRenderer || !edgeRenderer) return;\n nodeRenderer.renderNodes(displayNodes);\n const positions = nodeRenderer.getNodePositionsBySlug(new Map<string, THREE.Vector3>());\n edgeRenderer.renderEdges(workingGraph.edges, positions);\n\n // Render clusters if available\n if (clusterRenderer && graphData.clusters?.length) {\n // Build node position map by ID for cluster rendering\n const nodePositionsById = new Map<string, THREE.Vector3>();\n for (const node of displayNodes) {\n const pos = nodeRenderer.getNodePosition(node.id);\n if (pos) {\n nodePositionsById.set(node.id, pos);\n // Also map by slug for flexibility\n nodePositionsById.set(node.slug, pos);\n }\n }\n clusterRenderer.renderClusters(graphData.clusters, nodePositionsById);\n }\n }, [displayNodes, workingGraph.edges, graphData.clusters, sceneManager, nodeRenderer, edgeRenderer, clusterRenderer]);\n\n useEffect(() => {\n if (!sceneManager) return;\n sceneManager.updateBackground(resolvedTheme.colors.background);\n }, [sceneManager, resolvedTheme.colors.background]);\n\n useEffect(() => {\n if (!sceneManager || !nodeRenderer) return;\n\n const raycaster = new THREE.Raycaster();\n const pointer = new THREE.Vector2();\n const tempDir = new THREE.Vector3();\n const plane = new THREE.Plane();\n const intersection = new THREE.Vector3();\n\n const updatePointer = (event: PointerEvent) => {\n const rect = sceneManager.renderer.domElement.getBoundingClientRect();\n pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;\n };\n\n const onPointerDown = (event: PointerEvent) => {\n updatePointer(event);\n raycaster.setFromCamera(pointer, sceneManager.camera);\n\n const nodes = nodeRenderer.getNodeObjects();\n if (nodes.length) {\n const intersects = raycaster.intersectObjects(nodes, true);\n if (intersects.length) {\n const hit = intersects[0].object;\n const nodeId = hit.userData?.nodeId as string | undefined;\n if (nodeId) {\n const nodePosition = nodeRenderer.getNodePosition(nodeId);\n if (nodePosition) {\n if (!clickZoomEnabled) {\n sceneManager.controls.target.copy(nodePosition);\n sceneManager.controls.update();\n return;\n }\n }\n }\n if (intersects[0].point) {\n sceneManager.controls.target.copy(intersects[0].point);\n sceneManager.controls.update();\n return;\n }\n }\n }\n\n sceneManager.camera.getWorldDirection(tempDir).normalize();\n plane.setFromNormalAndCoplanarPoint(tempDir, sceneManager.controls.target.clone());\n if (raycaster.ray.intersectPlane(plane, intersection)) {\n sceneManager.controls.target.copy(intersection);\n sceneManager.controls.update();\n }\n };\n\n const dom = sceneManager.renderer.domElement;\n dom.addEventListener('pointerdown', onPointerDown);\n return () => {\n dom.removeEventListener('pointerdown', onPointerDown);\n };\n }, [sceneManager, nodeRenderer, clickZoomEnabled]);\n\n const cameraFitSuspended = Boolean(selectedNodeId || focusNodeSlug);\n\n useEffect(() => {\n if (!sceneManager || !animationController || !resolvedCameraFit.enabled) return;\n if (cameraFitSuspended) return;\n\n const mode = resolvedCameraFit.mode;\n if (mode === 'once' && fitStateRef.current.hasFit) return;\n if (mode === 'onChange' && fitStateRef.current.signature === fitSignature) return;\n\n const positions = displayNodes\n .map((node) => node.position)\n .filter((pos): pos is [number, number, number] => Array.isArray(pos));\n if (!positions.length) return;\n\n const points = positions.map((pos) => new THREE.Vector3(...pos));\n const bounds = new THREE.Box3().setFromPoints(points);\n const sphere = new THREE.Sphere();\n bounds.getBoundingSphere(sphere);\n\n const radius = Math.max(sphere.radius, 0.001);\n const padding = resolvedCameraFit.padding;\n const viewportFraction = Math.min(Math.max(resolvedCameraFit.viewportFraction, 0.05), 1);\n\n const camera = sceneManager.camera as THREE.PerspectiveCamera;\n const vFov = THREE.MathUtils.degToRad(camera.fov);\n const aspect = camera.aspect || 1;\n const hFov = 2 * Math.atan(Math.tan(vFov / 2) * aspect);\n const targetFov = Math.min(vFov, hFov);\n const distance = (radius * (1 + padding)) / Math.tan((targetFov * viewportFraction) / 2);\n\n const direction = camera.position.clone().sub(sceneManager.controls.target);\n if (direction.lengthSq() < 0.0001) {\n direction.set(0, 0, 1);\n }\n direction.normalize();\n\n const targetPosition = sphere.center.clone().add(direction.multiplyScalar(distance));\n if (cameraTweenEnabled) {\n animationController.focusOnPosition(targetPosition, sphere.center.clone());\n } else {\n sceneManager.camera.position.copy(targetPosition);\n sceneManager.controls.target.copy(sphere.center);\n sceneManager.controls.update();\n }\n\n fitStateRef.current = { hasFit: true, signature: fitSignature };\n }, [\n sceneManager,\n animationController,\n resolvedCameraFit,\n displayNodes,\n fitSignature,\n cameraFitSuspended,\n cameraTweenEnabled,\n ]);\n\n useEffect(() => {\n if (!sceneManager) return;\n sceneManager.controls.enableDamping = true;\n sceneManager.controls.dampingFactor = 0.08;\n }, [sceneManager]);\n\n useEffect(() => {\n if (!sceneManager || !onCameraChange) return;\n let frame: number | null = null;\n const handler = () => {\n if (frame !== null) return;\n frame = window.requestAnimationFrame(() => {\n frame = null;\n const pos = sceneManager.camera.position;\n onCameraChange([pos.x, pos.y, pos.z]);\n });\n };\n sceneManager.controls.addEventListener('change', handler);\n handler();\n return () => {\n sceneManager.controls.removeEventListener('change', handler);\n if (frame !== null) {\n window.cancelAnimationFrame(frame);\n }\n };\n }, [sceneManager, onCameraChange]);\n\n useEffect(() => {\n if (!sceneManager) return;\n sceneManager.renderer.domElement.style.cursor = hoveredNodeId ? 'pointer' : 'grab';\n }, [sceneManager, hoveredNodeId]);\n\n useEffect(() => {\n if (!sceneManager || !nodeRenderer || !edgeRenderer) return;\n const positionsBySlug = new Map<string, THREE.Vector3>();\n return sceneManager.addFrameListener((delta, elapsed) => {\n nodeRenderer.update(delta, elapsed);\n nodeRenderer.updateLabelVisibility(sceneManager.camera);\n if (nodeRenderer.hasDynamicPositions()) {\n nodeRenderer.getNodePositionsBySlug(positionsBySlug);\n edgeRenderer.updatePositions(positionsBySlug);\n }\n edgeRenderer.update(delta, elapsed);\n animationController?.update();\n selectionRipple?.update(elapsed, sceneManager.camera);\n if (hoverCardRef.current && hoverCardVisible && hoverCardNodeId) {\n const position = nodeRenderer.getNodePosition(hoverCardNodeId);\n const rect = containerRef.current?.getBoundingClientRect();\n if (position && rect) {\n const screen = sceneManager.worldToScreen(position);\n const cardWidth = hoverCardRef.current.offsetWidth;\n const cardHeight = hoverCardRef.current.offsetHeight;\n const rawX = screen.x - rect.left + hoverCardOffset[0];\n const rawY = screen.y - rect.top + hoverCardOffset[1];\n const maxX = Math.max(8, rect.width - cardWidth - 8);\n const maxY = Math.max(8, rect.height - cardHeight - 8);\n const x = Math.min(Math.max(rawX, 8), maxX);\n const y = Math.min(Math.max(rawY, 8), maxY);\n // Snap hover card to node position to avoid slide-in motion.\n const nextX = x;\n const nextY = y;\n hoverCardPositionRef.current = { x: nextX, y: nextY };\n const slide = hoverCardActive ? 0 : hoverCardSlideDistance;\n hoverCardRef.current.style.transform = `translate(${nextX}px, ${nextY}px) translateY(${slide}px)`;\n }\n }\n if (clickCardRef.current && selectedNodeId) {\n const position = nodeRenderer.getNodePosition(selectedNodeId);\n const rect = containerRef.current?.getBoundingClientRect();\n if (position && rect) {\n const screen = sceneManager.worldToScreen(position);\n const cardWidth = clickCardRef.current.offsetWidth;\n const cardHeight = clickCardRef.current.offsetHeight;\n const rawX = screen.x - rect.left + clickCardOffset[0];\n const rawY = screen.y - rect.top + clickCardOffset[1];\n const maxX = Math.max(8, rect.width - cardWidth - 8);\n const maxY = Math.max(8, rect.height - cardHeight - 8);\n const x = Math.min(Math.max(rawX, 8), maxX);\n const y = Math.min(Math.max(rawY, 8), maxY);\n clickCardRef.current.style.transform = `translate(${x}px, ${y}px)`;\n }\n }\n });\n }, [\n sceneManager,\n nodeRenderer,\n edgeRenderer,\n animationController,\n hoverCardVisible,\n hoverCardNodeId,\n hoverCardActive,\n hoverCardOffset,\n selectedNodeId,\n clickCardOffset,\n hoverCardSlideDistance,\n selectionRipple,\n ]);\n\n useEffect(() => {\n if (!interactionManager || !nodeRenderer) return;\n const edgeObjects = edgeRenderer ? edgeRenderer.getEdgeObjects() : [];\n interactionManager.setTargets(nodeRenderer.getNodeObjects(), nodeMap, edgeObjects, edgeMap);\n }, [interactionManager, nodeRenderer, edgeRenderer, nodeMap, edgeMap]);\n\n useEffect(() => {\n if (!nodeRenderer) return;\n if (hoveredNodeId && !nodeMap.has(hoveredNodeId)) {\n setHoveredNodeId(null);\n nodeRenderer.setHoveredNode(null);\n }\n }, [hoveredNodeId, nodeMap, nodeRenderer]);\n\n useEffect(() => {\n if (!nodeRenderer || !edgeRenderer) return;\n if (selectedNodeId && !nodeMap.has(selectedNodeId)) {\n setSelectedNodeId(null);\n nodeRenderer.setSelectedNode(null);\n applyFocusEdges(null);\n }\n }, [selectedNodeId, nodeMap, nodeRenderer, edgeRenderer, applyFocusEdges]);\n\n useEffect(() => {\n if (!selectionControlled || !nodeRenderer || !edgeRenderer) return;\n if (!selectedNode) {\n setSelectedNodeId(null);\n nodeRenderer.setSelectedNode(null);\n applyFocusEdges(null);\n return;\n }\n const key = selectedNode.slug ?? selectedNode.id;\n const next = nodeByIdentifier.get(key) ?? null;\n if (!next) {\n setSelectedNodeId(null);\n nodeRenderer.setSelectedNode(null);\n applyFocusEdges(null);\n return;\n }\n setSelectedNodeId(next.id);\n nodeRenderer.setSelectedNode(next.id);\n applyFocusEdges(next.slug ? edgesBySlug.get(next.slug) ?? [] : []);\n }, [\n selectionControlled,\n selectedNode,\n nodeByIdentifier,\n nodeRenderer,\n edgeRenderer,\n edgesBySlug,\n applyFocusEdges,\n ]);\n\n useEffect(() => {\n if (!focusNodeSlug || !nodeRenderer || !edgeRenderer) return;\n const node = nodeByIdentifier.get(focusNodeSlug);\n if (!node) {\n onFocusConsumed?.();\n return;\n }\n setSelectedNodeId(node.id);\n nodeRenderer.setSelectedNode(node.id);\n nodeRenderer.pulseNode(node.id);\n if (selectionRipple) {\n const nodePosition = nodeRenderer.getNodePosition(node.id);\n if (nodePosition) {\n const nodeObject = nodeRenderer.getNodeObject(node.id);\n selectionRipple.trigger(nodePosition, nodeObject?.scale.x ?? 1);\n }\n }\n applyFocusEdges(node.slug ? edgesBySlug.get(node.slug) ?? [] : []);\n if (clickZoomEnabled) {\n const nodePosition = nodeRenderer.getNodePosition(node.id);\n if (nodePosition) {\n focusOnNodePosition(nodePosition, () => {\n if (onNodeFocused) onNodeFocused(node as unknown as NeuronNode);\n });\n } else if (onNodeFocused) {\n onNodeFocused(node as unknown as NeuronNode);\n }\n } else if (onNodeFocused) {\n onNodeFocused(node as unknown as NeuronNode);\n }\n onFocusConsumed?.();\n }, [\n focusNodeSlug,\n nodeByIdentifier,\n nodeRenderer,\n edgeRenderer,\n edgesBySlug,\n clickZoomEnabled,\n animationController,\n onNodeFocused,\n onFocusConsumed,\n applyFocusEdges,\n selectionRipple,\n ]);\n\n useEffect(() => {\n if (!interactionManager || !nodeRenderer || !edgeRenderer) return;\n interactionManager.onNodeHover = (node) => {\n const nodeId = node?.id ?? null;\n setHoveredNodeId(nodeId);\n nodeRenderer.setHoveredNode(nodeId);\n if (nodeId) {\n const slug = nodeSlugById.get(nodeId);\n applyFocusEdges(slug ? edgesBySlug.get(slug) ?? [] : []);\n } else {\n const selectedSlug = selectedNodeId ? nodeSlugById.get(selectedNodeId) : null;\n if (selectedSlug) {\n applyFocusEdges(edgesBySlug.get(selectedSlug) ?? []);\n } else {\n applyFocusEdges(null);\n }\n }\n if (onNodeHover) {\n onNodeHover(node ? (node as unknown as NeuronNode) : null);\n }\n };\n interactionManager.onNodeClick = (node) => {\n if (!selectionControlled) {\n setSelectedNodeId(node.id);\n nodeRenderer.setSelectedNode(node.id);\n }\n nodeRenderer.pulseNode(node.id);\n if (selectionRipple) {\n const nodePosition = nodeRenderer.getNodePosition(node.id);\n if (nodePosition) {\n const nodeObject = nodeRenderer.getNodeObject(node.id);\n selectionRipple.trigger(nodePosition, nodeObject?.scale.x ?? 1);\n }\n }\n if (clickZoomEnabled) {\n const nodePosition = nodeRenderer.getNodePosition(node.id);\n if (nodePosition) {\n focusOnNodePosition(nodePosition, () => {\n if (onNodeFocused) onNodeFocused(node as unknown as NeuronNode);\n });\n }\n }\n const slug = nodeSlugById.get(node.id);\n applyFocusEdges(slug ? edgesBySlug.get(slug) ?? [] : []);\n if (onNodeClick) {\n onNodeClick(node as unknown as NeuronNode);\n }\n };\n if (doubleClickEnabled) {\n interactionManager.onNodeDoubleClick = (node) => {\n const nodePosition = nodeRenderer.getNodePosition(node.id);\n if (nodePosition) {\n focusOnNodePosition(nodePosition, () => {\n if (onNodeFocused) onNodeFocused(node as unknown as NeuronNode);\n });\n }\n if (onNodeDoubleClick) {\n onNodeDoubleClick(node as unknown as NeuronNode);\n }\n };\n } else {\n interactionManager.onNodeDoubleClick = () => {};\n }\n interactionManager.onBackgroundClick = () => {\n if (!selectionControlled) {\n setSelectedNodeId(null);\n nodeRenderer.setSelectedNode(null);\n }\n if (!hoveredNodeId) {\n applyFocusEdges(null);\n }\n if (onBackgroundClick) onBackgroundClick();\n };\n interactionManager.onEdgeClick = (edge) => {\n if (onEdgeClick) {\n onEdgeClick(edge as unknown as NeuronEdge);\n }\n };\n }, [\n interactionManager,\n nodeRenderer,\n edgeRenderer,\n nodeSlugById,\n edgesBySlug,\n animationController,\n hoveredNodeId,\n selectedNodeId,\n clickZoomEnabled,\n onNodeHover,\n onNodeClick,\n onNodeDoubleClick,\n onNodeFocused,\n onEdgeClick,\n onBackgroundClick,\n applyFocusEdges,\n selectionRipple,\n selectionControlled,\n doubleClickEnabled,\n ]);\n\n useEffect(() => {\n if (!sceneManager || !interactionManager) return;\n const element = sceneManager.renderer.domElement;\n const handleMove = (event: PointerEvent) => interactionManager.onPointerMove(event);\n const handleUp = (event: PointerEvent) => interactionManager.onPointerUp(event);\n const handleLeave = () => interactionManager.onPointerLeave();\n element.addEventListener('pointermove', handleMove);\n element.addEventListener('pointerup', handleUp);\n element.addEventListener('pointerleave', handleLeave);\n return () => {\n element.removeEventListener('pointermove', handleMove);\n element.removeEventListener('pointerup', handleUp);\n element.removeEventListener('pointerleave', handleLeave);\n };\n }, [sceneManager, interactionManager]);\n\n if (isLoading) {\n return (\n <div className={className} style={style} aria-label={ariaLabel}>\n {renderLoadingState ? renderLoadingState() : <div>Loading…</div>}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className} style={style} aria-label={ariaLabel}>\n {renderEmptyState ? renderEmptyState() : <div>{error}</div>}\n </div>\n );\n }\n\n if (!resolvedNodes.length) {\n return (\n <div className={className} style={style} aria-label={ariaLabel}>\n {renderEmptyState ? renderEmptyState() : <div>No data</div>}\n </div>\n );\n }\n\n const sceneTransitionStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n transition: prefersReducedMotion\n ? `opacity ${resolvedAnimationConfig.transitionDurationMs}ms ease`\n : `opacity ${resolvedAnimationConfig.transitionDurationMs}ms ease, transform ${resolvedAnimationConfig.transitionDurationMs}ms ease, filter ${resolvedAnimationConfig.transitionDurationMs}ms ease`,\n opacity: filterTransitioning ? 0.85 : 1,\n transform: prefersReducedMotion ? 'scale(1)' : filterTransitioning ? 'scale(0.985)' : 'scale(1)',\n filter: prefersReducedMotion ? 'blur(0px)' : filterTransitioning ? 'blur(1px)' : 'blur(0px)',\n transformOrigin: 'center',\n willChange: prefersReducedMotion ? 'opacity' : 'transform, filter, opacity',\n };\n\n const filterOverlayStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n background: 'radial-gradient(circle at 50% 35%, rgba(255,255,255,0.35), transparent 60%)',\n opacity: filterTransitioning ? 1 : 0,\n transition: `opacity ${resolvedAnimationConfig.transitionDurationMs}ms ease`,\n zIndex: 2,\n };\n\n const resolvedStyle: React.CSSProperties = {\n position: isFullScreen ? 'fixed' : 'relative',\n inset: isFullScreen ? 0 : undefined,\n width: isFullScreen ? '100vw' : '100%',\n height: isFullScreen ? '100vh' : '100%',\n minHeight: !isFullScreen && fullHeight ? '100vh' : undefined,\n overflow: 'hidden',\n background: resolvedTheme.colors.background,\n ...style,\n };\n\n return (\n <div\n className={className}\n style={resolvedStyle}\n aria-label={ariaLabel}\n role=\"region\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n <div\n ref={containerRef}\n style={sceneTransitionStyle}\n />\n <div style={filterOverlayStyle} />\n {hoverCardVisible && hoverCardNode && (\n <div\n ref={hoverCardRef}\n style={{\n position: 'absolute',\n width: hoverCardWidth,\n pointerEvents: 'none',\n padding: '12px 14px',\n borderRadius: 12,\n background:\n 'linear-gradient(135deg, rgba(11, 15, 35, 0.95) 0%, rgba(20, 24, 52, 0.9) 100%)',\n border: '1px solid rgba(120, 140, 255, 0.35)',\n boxShadow: '0 18px 45px rgba(5, 10, 30, 0.55)',\n color: resolvedTheme.colors.labelText,\n fontFamily: resolvedTheme.typography.labelFontFamily,\n fontSize: 12,\n zIndex: 4,\n opacity: hoverCardActive ? 0.98 : 0,\n transition: `opacity ${resolvedTheme.animation.hoverCardFadeDuration}ms ease`,\n transform: `translate(${hoverCardOffset[0]}px, ${hoverCardOffset[1]}px) translateY(${hoverCardActive ? 0 : hoverCardSlideDistance}px)`,\n }}\n >\n {renderNodeHover ? (\n renderNodeHover(hoverCardNode)\n ) : (\n <div>\n {hoverCardSlots?.header ? (\n hoverCardSlots.header(hoverCardNode)\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, marginBottom: 6 }}>\n <div style={{ fontSize: 13, fontWeight: 600 }}>\n {truncateText(hoverCardNode.label, 48)}\n </div>\n <div style={{ fontSize: 11, opacity: 0.7, letterSpacing: '0.08em' }}>\n {truncateText(hoverCardNode.domain?.toUpperCase?.() ?? 'NODE', 24)}\n </div>\n </div>\n )}\n {hoverCardSlots?.summary ? (\n hoverCardSlots.summary(hoverCardNode)\n ) : (\n <div style={{ opacity: 0.75, marginBottom: 8 }}>\n {truncateText(\n typeof hoverCardNode.metadata?.summary === 'string'\n ? hoverCardNode.metadata.summary\n : 'Click to focus this node and explore connections.',\n hoverSummaryMax\n )}\n </div>\n )}\n {showHoverTags && (hoverCardSlots?.tags || hoverCardTags.length > 0) && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, marginBottom: 8 }}>\n {hoverCardSlots?.tags\n ? hoverCardSlots.tags(hoverCardNode)\n : hoverCardTags.map((tag) => (\n <span\n key={tag}\n style={{\n fontSize: 10,\n padding: '3px 6px',\n borderRadius: 8,\n background: 'rgba(120, 140, 255, 0.2)',\n border: '1px solid rgba(120, 140, 255, 0.35)',\n }}\n >\n {truncateText(tag, 16)}\n </span>\n ))}\n </div>\n )}\n {showHoverMetrics && (hoverCardSlots?.metrics || hoverCardMetrics.length > 0) && (\n <div style={{ display: 'flex', gap: 12, fontSize: 11, opacity: 0.8 }}>\n {hoverCardSlots?.metrics\n ? hoverCardSlots.metrics(hoverCardNode)\n : hoverCardMetrics.map((metric) => (\n <div key={metric.label}>\n <div style={{ opacity: 0.6 }}>{metric.label}</div>\n <div style={{ fontWeight: 600 }}>{metric.value}</div>\n </div>\n ))}\n </div>\n )}\n {hoverCardSlots?.footer && hoverCardSlots.footer(hoverCardNode)}\n </div>\n )}\n </div>\n )}\n {clickCardEnabled && selectedNodeId && (\n <div\n ref={clickCardRef}\n style={{\n position: 'absolute',\n width: clickCardWidth,\n pointerEvents: 'auto',\n padding: '14px 16px',\n borderRadius: 14,\n background:\n 'linear-gradient(140deg, rgba(10, 14, 32, 0.98) 0%, rgba(20, 26, 58, 0.94) 100%)',\n border: '1px solid rgba(140, 170, 255, 0.4)',\n boxShadow: '0 22px 60px rgba(5, 10, 30, 0.6)',\n color: resolvedTheme.colors.labelText,\n fontFamily: resolvedTheme.typography.labelFontFamily,\n fontSize: 13,\n zIndex: 5,\n opacity: 0.98,\n transition: `opacity ${resolvedTheme.animation.hoverCardFadeDuration}ms ease`,\n transform: `translate(${clickCardOffset[0]}px, ${clickCardOffset[1]}px)`,\n }}\n >\n {renderNodeDetail ? (\n renderNodeDetail(nodeMap.get(selectedNodeId) as unknown as NeuronNode)\n ) : (\n <div>\n <div style={{ fontSize: 14, fontWeight: 600, marginBottom: 8 }}>\n {nodeMap.get(selectedNodeId)?.label ?? 'Selected node'}\n </div>\n <div style={{ opacity: 0.75 }}>\n {typeof nodeMap.get(selectedNodeId)?.metadata?.summary === 'string'\n ? (nodeMap.get(selectedNodeId)?.metadata?.summary as string)\n : 'Click another node to explore more details.'}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { createContext } from 'react';\nimport type { NeuronSettings, NeuronConfig } from '../core/types/settings';\nimport type { NeuronEvent } from '../core/types/events';\nimport type { EventBus } from '../core/events/event-bus';\nimport type { NeuronApiClient } from './api-client';\n\nexport interface ErrorContext {\n message: string;\n}\n\nexport interface NeuronContextValue {\n config: NeuronConfig;\n settings: NeuronSettings;\n api: NeuronApiClient;\n events: EventBus;\n isInitialized: boolean;\n /** True when using StaticDataProvider (no API/database) */\n isStaticMode?: boolean;\n error: Error | null;\n updateSettings: (settings: Partial<NeuronSettings>) => Promise<void>;\n resetSettings: () => Promise<void>;\n onEvent?: (event: NeuronEvent) => void;\n onError?: (error: Error, context: ErrorContext) => void;\n}\n\nexport const NeuronContext = createContext<NeuronContextValue | null>(null);\n","import { useContext } from 'react';\nimport { NeuronContext } from '../context';\n\nexport function useNeuronContext() {\n const context = useContext(NeuronContext);\n if (!context) {\n throw new Error('useNeuronContext must be used within NeuronWebProvider');\n }\n return context;\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type {\n GraphFilters,\n NeuronVisualCluster,\n NeuronVisualEdge,\n NeuronVisualNode,\n} from '../../core/types';\nimport type { GetGraphParams, FindPathResponse } from '../../core/types/api';\nimport { useNeuronContext } from './useNeuronContext';\n\nexport interface UseNeuronGraphOptions {\n domains?: string[];\n nodeTypes?: string[];\n minEdgeStrength?: number;\n autoRefresh?: boolean;\n refreshInterval?: number;\n}\n\nexport function useNeuronGraph(options?: UseNeuronGraphOptions) {\n const { api } = useNeuronContext();\n const [nodes, setNodes] = useState<NeuronVisualNode[]>([]);\n const [edges, setEdges] = useState<NeuronVisualEdge[]>([]);\n const [clusters, setClusters] = useState<NeuronVisualCluster[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [filters, setFilters] = useState<GraphFilters>({});\n const [selectedNode, setSelectedNode] = useState<string | null>(null);\n\n const fetchGraph = useCallback(async () => {\n setIsLoading(true);\n try {\n const params: GetGraphParams = {\n domains: options?.domains,\n nodeTypes: options?.nodeTypes,\n minEdgeStrength: options?.minEdgeStrength,\n };\n const response = await api.graph.get(params);\n setNodes(response.nodes);\n setEdges(response.edges);\n setClusters(response.clusters ?? []);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [api, options]);\n\n useEffect(() => {\n void fetchGraph();\n }, [fetchGraph]);\n\n const expandFromNode = async (nodeId: string, depth = 1) => {\n const response = await api.graph.expand({ fromNodeIds: [nodeId], depth, direction: 'both' });\n setNodes(response.nodes);\n setEdges(response.edges);\n };\n\n const findPath = async (fromId: string, toId: string): Promise<FindPathResponse['paths'][number]> => {\n const response = await api.graph.findPath({ fromNodeId: fromId, toNodeId: toId });\n return response.paths[0];\n };\n\n return {\n nodes,\n edges,\n clusters,\n isLoading,\n error,\n filters,\n setFilters: (next: Partial<GraphFilters>) => setFilters((prev) => ({ ...prev, ...next })),\n clearFilters: () => setFilters({}),\n selectedNode: selectedNode ? nodes.find((node) => node.id === selectedNode) ?? null : null,\n selectNode: (nodeId: string | null) => setSelectedNode(nodeId),\n clearSelection: () => setSelectedNode(null),\n refetch: fetchGraph,\n expandFromNode,\n findPath,\n };\n}\n","import type {\n NeuronWebExplorerFilters,\n NeuronWebExplorerResolvedFilters,\n NeuronWebProps,\n} from '../types';\n\nexport type ExplorerGraphData = NeuronWebProps['graphData'];\n\nexport function normalizeExplorerFilters(filters?: NeuronWebExplorerFilters): NeuronWebExplorerResolvedFilters {\n return {\n domains: filters?.domains ?? [],\n nodeTypes: filters?.nodeTypes ?? [],\n relationshipTypes: filters?.relationshipTypes ?? [],\n minEdgeStrength: typeof filters?.minEdgeStrength === 'number' ? filters.minEdgeStrength : undefined,\n };\n}\n\nexport function applyExplorerFilters(\n graphData: ExplorerGraphData,\n filters: NeuronWebExplorerResolvedFilters,\n query: string\n): ExplorerGraphData {\n const normalizedQuery = query.trim().toLowerCase();\n const domainSet = new Set(filters.domains);\n const relTypeSet = new Set(filters.relationshipTypes);\n\n let nodes = graphData.nodes;\n let edges = graphData.edges;\n let storyBeats = graphData.storyBeats;\n\n if (domainSet.size) {\n nodes = nodes.filter((node) => domainSet.has(node.domain));\n }\n\n if (relTypeSet.size) {\n edges = edges.filter((edge) => relTypeSet.has(edge.relationshipType));\n }\n\n const minEdgeStrength = filters.minEdgeStrength;\n if (typeof minEdgeStrength === 'number') {\n edges = edges.filter((edge) => edge.strength >= minEdgeStrength);\n }\n\n if (normalizedQuery.length) {\n nodes = nodes.filter((node) => {\n const label = node.label.toLowerCase();\n const slug = node.slug.toLowerCase();\n return label.includes(normalizedQuery) || slug.includes(normalizedQuery);\n });\n }\n\n const nodeSlugSet = new Set(nodes.map((node) => node.slug));\n edges = edges.filter((edge) => nodeSlugSet.has(edge.from) && nodeSlugSet.has(edge.to));\n\n if (storyBeats?.length) {\n const nodeIdSet = new Set(nodes.map((node) => node.id));\n storyBeats = storyBeats\n .map((beat) => ({ ...beat, nodeIds: beat.nodeIds.filter((id) => nodeIdSet.has(id)) }))\n .filter((beat) => beat.nodeIds.length >= 2);\n }\n\n return { ...graphData, nodes, edges, storyBeats };\n}\n\n","'use client';\n\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { NeuronWeb } from '../NeuronWeb';\nimport type {\n NeuronWebExplorerFilters,\n NeuronWebExplorerProps,\n NeuronWebExplorerResolvedFilters,\n} from '../types';\nimport { useNeuronGraph } from '../../react/hooks/useNeuronGraph';\nimport type { NeuronNode } from '../../core/types';\nimport { applyExplorerFilters, normalizeExplorerFilters } from './explorer-filters';\n\ntype ExplorerGraphData = NonNullable<NeuronWebExplorerProps['graphData']>;\ntype ExplorerFilters = NeuronWebExplorerResolvedFilters;\n\nconst DefaultToolbar = ({\n query,\n setQuery,\n}: {\n query: string;\n setQuery: (next: string) => void;\n}) => {\n return (\n <div className=\"neuron-explorer__toolbar\" style={{ display: 'flex', gap: 12, alignItems: 'center' }}>\n <input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search nodes…\"\n style={{\n flex: 1,\n minWidth: 220,\n padding: '10px 12px',\n borderRadius: 10,\n border: '1px solid rgba(255,255,255,0.14)',\n background: 'rgba(255,255,255,0.06)',\n color: 'inherit',\n }}\n />\n </div>\n );\n};\n\nconst ExplorerBase = ({\n graphData,\n isLoading,\n error,\n className,\n style,\n initialFilters,\n filters: controlledFilters,\n onFiltersChange,\n selectedNodeId: controlledSelectedNodeId,\n onSelectedNodeIdChange,\n renderToolbar,\n renderLegend,\n renderSelectionPanel,\n renderEmptyState,\n renderLoadingState,\n neuronWebProps,\n}: {\n graphData: ExplorerGraphData;\n isLoading?: boolean;\n error?: Error | string | null;\n} & Omit<NeuronWebExplorerProps, 'graphData'>) => {\n const [query, setQuery] = useState('');\n const [uncontrolledFilters, setUncontrolledFilters] = useState<ExplorerFilters>(() =>\n normalizeExplorerFilters(initialFilters)\n );\n const [uncontrolledSelectedNodeId, setUncontrolledSelectedNodeId] = useState<string | null>(null);\n const [focusNodeSlug, setFocusNodeSlug] = useState<string | null>(null);\n\n const filters = useMemo(\n () => normalizeExplorerFilters(controlledFilters ?? uncontrolledFilters),\n [controlledFilters, uncontrolledFilters]\n );\n\n const setFilters = useCallback(\n (next: NeuronWebExplorerFilters) => {\n if (onFiltersChange) onFiltersChange(next);\n if (!controlledFilters) setUncontrolledFilters(normalizeExplorerFilters(next));\n },\n [controlledFilters, onFiltersChange]\n );\n\n const selectedNodeId = controlledSelectedNodeId ?? uncontrolledSelectedNodeId;\n const setSelectedNodeId = useCallback(\n (next: string | null) => {\n if (onSelectedNodeIdChange) onSelectedNodeIdChange(next);\n if (!controlledSelectedNodeId) setUncontrolledSelectedNodeId(next);\n },\n [controlledSelectedNodeId, onSelectedNodeIdChange]\n );\n\n const filteredGraph = useMemo(\n () => applyExplorerFilters(graphData, filters, query),\n [graphData, filters, query]\n );\n\n const selectedNode = useMemo(\n () => (selectedNodeId ? filteredGraph.nodes.find((node) => node.id === selectedNodeId) ?? null : null),\n [filteredGraph.nodes, selectedNodeId]\n );\n\n const handleNodeClick = useCallback(\n (node: NeuronNode) => {\n setSelectedNodeId(node.id);\n neuronWebProps?.onNodeClick?.(node);\n },\n [setSelectedNodeId, neuronWebProps]\n );\n\n const handleFocusConsumed = useCallback(() => {\n setFocusNodeSlug(null);\n neuronWebProps?.onFocusConsumed?.();\n }, [neuronWebProps]);\n\n const toolbar = renderToolbar\n ? renderToolbar({\n query,\n setQuery,\n filters,\n setFilters,\n isSearching: false,\n selectedNodeId,\n setSelectedNodeId,\n selectedNode,\n focusNodeSlug,\n setFocusNodeSlug,\n })\n : <DefaultToolbar query={query} setQuery={setQuery} />;\n const legend = renderLegend ? renderLegend({ filters }) : null;\n const selectionPanel = renderSelectionPanel ? renderSelectionPanel({ selectedNode }) : null;\n\n const resolvedLoading = Boolean(isLoading ?? neuronWebProps?.isLoading);\n const resolvedError = error ?? neuronWebProps?.error ?? null;\n\n if (resolvedLoading && renderLoadingState) {\n return <>{renderLoadingState()}</>;\n }\n if (resolvedError && renderEmptyState) {\n return <>{renderEmptyState()}</>;\n }\n\n return (\n <div className={['neuron-explorer', className].filter(Boolean).join(' ')} style={style}>\n {toolbar}\n <div style={{ display: 'grid', gridTemplateColumns: selectionPanel || legend ? '1fr 320px' : '1fr', gap: 12 }}>\n <div className=\"neuron-explorer__canvas\" style={{ minHeight: 420 }}>\n <NeuronWeb\n {...neuronWebProps}\n graphData={filteredGraph}\n selectedNode={selectedNode as unknown as NeuronNode}\n focusNodeSlug={focusNodeSlug}\n onFocusConsumed={handleFocusConsumed}\n onNodeClick={handleNodeClick}\n />\n </div>\n {(legend || selectionPanel) && (\n <div className=\"neuron-explorer__sidebar\" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {legend ? <div className=\"neuron-explorer__legend\">{legend}</div> : null}\n {selectionPanel ? <div className=\"neuron-explorer__selection\">{selectionPanel}</div> : null}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nconst NeuronWebExplorerWithHooks = (props: Omit<NeuronWebExplorerProps, 'graphData'>) => {\n const [filters, setFilters] = useState<ExplorerFilters>(() => normalizeExplorerFilters(props.initialFilters));\n\n const graphOptions = useMemo(\n () => ({\n domains: filters.domains?.length ? filters.domains : undefined,\n nodeTypes: filters.nodeTypes?.length ? filters.nodeTypes : undefined,\n minEdgeStrength: filters.minEdgeStrength,\n }),\n [filters.domains, filters.nodeTypes, filters.minEdgeStrength]\n );\n\n const graph = useNeuronGraph(graphOptions);\n\n return (\n <ExplorerBase\n {...props}\n graphData={{ nodes: graph.nodes, edges: graph.edges }}\n isLoading={graph.isLoading}\n error={graph.error}\n filters={filters}\n onFiltersChange={(next) => setFilters(normalizeExplorerFilters(next))}\n />\n );\n};\n\nexport function NeuronWebExplorer(props: NeuronWebExplorerProps): React.ReactElement {\n if (props.graphData) {\n return <ExplorerBase {...props} graphData={props.graphData} />;\n }\n return <NeuronWebExplorerWithHooks {...props} />;\n}\n","import { DEFAULT_THEME } from '../constants';\nimport type { NeuronWebTheme, NeuronWebThemeOverride } from '../types';\n\nexport class ThemeEngine {\n private theme: NeuronWebTheme;\n onThemeChange: (theme: NeuronWebTheme) => void = () => {};\n\n constructor(initialTheme?: NeuronWebThemeOverride) {\n this.theme = this.mergeTheme(DEFAULT_THEME, initialTheme);\n }\n\n getTheme(): NeuronWebTheme {\n return this.theme;\n }\n\n setTheme(theme: NeuronWebThemeOverride): void {\n this.theme = this.mergeTheme(this.theme, theme);\n this.onThemeChange(this.theme);\n }\n\n resetTheme(): void {\n this.theme = { ...DEFAULT_THEME };\n this.onThemeChange(this.theme);\n }\n\n setDomainColor(domain: string, color: string): void {\n this.theme.colors.domainColors[domain] = color;\n this.onThemeChange(this.theme);\n }\n\n setBackground(color: string): void {\n this.theme.colors.background = color;\n this.onThemeChange(this.theme);\n }\n\n setLabelStyle(style: Partial<NeuronWebTheme['typography']>): void {\n this.theme.typography = { ...this.theme.typography, ...style };\n this.onThemeChange(this.theme);\n }\n\n applyPreset(preset: 'dark' | 'light' | 'custom'): void {\n if (preset === 'light') {\n this.theme = this.mergeTheme(DEFAULT_THEME, {\n colors: { background: '#f7f7fb', labelText: '#111' },\n });\n } else if (preset === 'dark') {\n this.theme = { ...DEFAULT_THEME };\n }\n this.onThemeChange(this.theme);\n }\n\n saveToStorage(): void {\n if (typeof window === 'undefined') return;\n window.localStorage.setItem('omi-neuron-theme', JSON.stringify(this.theme));\n }\n\n loadFromStorage(): void {\n if (typeof window === 'undefined') return;\n const stored = window.localStorage.getItem('omi-neuron-theme');\n if (stored) {\n this.theme = this.mergeTheme(this.theme, JSON.parse(stored) as NeuronWebTheme);\n }\n }\n\n private mergeTheme(base: NeuronWebTheme, next?: NeuronWebThemeOverride): NeuronWebTheme {\n if (!next) return { ...base };\n return {\n ...base,\n ...next,\n colors: { ...base.colors, ...(next.colors ?? {}) },\n typography: { ...base.typography, ...(next.typography ?? {}) },\n effects: { ...base.effects, ...(next.effects ?? {}) },\n animation: { ...base.animation, ...(next.animation ?? {}) },\n } as NeuronWebTheme;\n }\n}\n","import type { NeuronStoryBeat, StudyPathRequest } from '../types';\n\nexport function validateStoryBeat(\n beat: NeuronStoryBeat\n): { ok: true } | { ok: false; error: string } {\n if (!beat) return { ok: false, error: 'Story beat is required.' };\n if (!beat.id || !beat.id.trim()) return { ok: false, error: 'Story beat id is required.' };\n if (!beat.label || !beat.label.trim()) return { ok: false, error: 'Story beat label is required.' };\n if (!Array.isArray(beat.nodeIds)) return { ok: false, error: 'Story beat nodeIds must be an array.' };\n const normalized = normalizeStoryBeat(beat);\n if (normalized.nodeIds.length < 2) {\n return { ok: false, error: 'Story beat must include at least 2 node ids.' };\n }\n return { ok: true };\n}\n\nexport function normalizeStoryBeat(beat: NeuronStoryBeat): NeuronStoryBeat {\n const deduped = dedupePreserveOrder(\n Array.isArray(beat.nodeIds) ? beat.nodeIds : []\n ).filter((value) => typeof value === 'string' && value.trim().length > 0);\n\n return {\n ...beat,\n id: beat.id.trim(),\n label: beat.label.trim(),\n nodeIds: deduped,\n };\n}\n\nexport function createStoryBeat(input: {\n id?: string;\n label: string;\n nodeIds: string[];\n}): NeuronStoryBeat {\n const beat: NeuronStoryBeat = {\n id: input.id?.trim() ? input.id.trim() : crypto.randomUUID(),\n label: input.label,\n nodeIds: input.nodeIds,\n };\n\n return normalizeStoryBeat(beat);\n}\n\nexport function createStudyPathFromNodeIds(\n nodeIds: string[],\n options?: { label?: string; stepDurationMs?: number }\n): StudyPathRequest {\n const deduped = dedupePreserveOrder(nodeIds).filter(\n (value) => typeof value === 'string' && value.trim().length > 0\n );\n\n return {\n label: options?.label,\n stepDurationMs: options?.stepDurationMs,\n steps: deduped.map((nodeId) => ({ nodeId })),\n };\n}\n\nexport function createStudyPathFromBeat(\n beat: NeuronStoryBeat,\n options?: { stepDurationMs?: number }\n): StudyPathRequest {\n const normalized = normalizeStoryBeat(beat);\n return createStudyPathFromNodeIds(normalized.nodeIds, {\n label: normalized.label,\n stepDurationMs: options?.stepDurationMs,\n });\n}\n\nfunction dedupePreserveOrder<T>(values: T[]): T[] {\n const seen = new Set<T>();\n const result: T[] = [];\n values.forEach((value) => {\n if (seen.has(value)) return;\n seen.add(value);\n result.push(value);\n });\n return result;\n}\n\n"]}
|