@simplex-viz/svg 0.1.3 → 0.2.1
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 +90 -38
- package/dist/SimplexSvgController.d.ts +69 -11
- package/dist/SimplexSvgController.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +778 -441
- package/dist/index.js.map +1 -1
- package/dist/presets.d.ts +39 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/views/BadgeClusterSvgView.d.ts +1 -0
- package/dist/views/BadgeClusterSvgView.d.ts.map +1 -1
- package/dist/views/ClusterAnchorSvgView.d.ts +1 -0
- package/dist/views/ClusterAnchorSvgView.d.ts.map +1 -1
- package/dist/views/GeometricShapeSvgView.d.ts +1 -0
- package/dist/views/GeometricShapeSvgView.d.ts.map +1 -1
- package/dist/views/MultiSectorGlyphSvgView.d.ts +1 -0
- package/dist/views/MultiSectorGlyphSvgView.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hullMeasure.ts","../src/SvgRendererAdapter.ts","../src/SimplexSvgController.ts","../src/views/GeometricShapeSvgView.ts","../src/views/MultiSectorGlyphSvgView.ts","../src/views/BadgeClusterSvgView.ts","../src/views/ClusterAnchorSvgView.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n rectToConvexPolygon,\n type ConvexGeometry,\n type NodeRenderState,\n} from '@simplex-viz/core';\nimport type { SvgNodeView } from './types';\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction estimateSvgFallbackBBox(group: SVGGElement): { width: number; height: number } {\n // Fallback for headless test environments where SVGElement.getBBox() returns 0x0\n let maxHalfW = 0;\n let maxHalfH = 0;\n const children = group.querySelectorAll('rect, circle, ellipse, text');\n children.forEach((el) => {\n const tag = el.tagName.toLowerCase();\n if (tag === 'rect') {\n const w = parseFloat(el.getAttribute('width') ?? '0');\n const h = parseFloat(el.getAttribute('height') ?? '0');\n const x = parseFloat(el.getAttribute('x') ?? String(-w / 2));\n const y = parseFloat(el.getAttribute('y') ?? String(-h / 2));\n maxHalfW = Math.max(maxHalfW, Math.abs(x), Math.abs(x + w), w / 2);\n maxHalfH = Math.max(maxHalfH, Math.abs(y), Math.abs(y + h), h / 2);\n } else if (tag === 'circle') {\n const r = parseFloat(el.getAttribute('r') ?? '0');\n const cx = parseFloat(el.getAttribute('cx') ?? '0');\n const cy = parseFloat(el.getAttribute('cy') ?? '0');\n maxHalfW = Math.max(maxHalfW, Math.abs(cx) + r);\n maxHalfH = Math.max(maxHalfH, Math.abs(cy) + r);\n } else if (tag === 'text') {\n const len = (el.textContent ?? '').length;\n const fs = parseFloat(el.getAttribute('font-size') ?? '11');\n const estW = Math.max(16, len * fs * 0.58);\n const estH = fs * 1.4;\n maxHalfW = Math.max(maxHalfW, estW / 2);\n maxHalfH = Math.max(maxHalfH, estH / 2);\n }\n });\n return {\n width: Math.max(20, maxHalfW * 2),\n height: Math.max(20, maxHalfH * 2),\n };\n}\n\n/**\n * Measures the unscaled convex collision hull for a visual descriptor using either\n * the view's analytical `measureConvexHull` or automatic offscreen `getBBox()` inspection.\n */\nexport function measureVisualWithSvgView<TVisual>(\n view: SvgNodeView<TVisual>,\n visual: TVisual,\n cacheKey: string,\n rootSvg: SVGSVGElement,\n measureBin: SVGGElement,\n cache: Map<string, ConvexGeometry>,\n): ConvexGeometry {\n const cached = cache.get(cacheKey);\n if (cached) return cached;\n\n let hull: ConvexGeometry;\n if (view.measureConvexHull) {\n hull = view.measureConvexHull(visual, rootSvg);\n } else {\n while (measureBin.firstChild) {\n measureBin.removeChild(measureBin.firstChild);\n }\n const probeGroup = rootSvg.ownerDocument.createElementNS(SVG_NS, 'g');\n measureBin.appendChild(probeGroup);\n\n const dummyHull: ConvexGeometry = { kind: 'circle', radius: 16 };\n const dummyState: NodeRenderState<TVisual> = {\n id: '__measure__',\n x: 0,\n y: 0,\n scale: 1,\n opacity: 1,\n visual,\n hull: dummyHull,\n cacheKey,\n interaction: {\n isHovered: false,\n isPinned: false,\n isDimmed: false,\n isHighlighted: false,\n },\n transition: null,\n };\n\n view.mountOrUpdate(probeGroup, visual, dummyState);\n\n let width = 0;\n let height = 0;\n try {\n if (typeof probeGroup.getBBox === 'function') {\n const bbox = probeGroup.getBBox();\n width = bbox.width;\n height = bbox.height;\n }\n } catch {\n // Ignore getBBox exceptions in detached DOM environments\n }\n\n if (width <= 1 || height <= 1) {\n const fallback = estimateSvgFallbackBBox(probeGroup);\n width = Math.max(width, fallback.width);\n height = Math.max(height, fallback.height);\n }\n\n hull = rectToConvexPolygon(width + 2, height + 2, 6);\n while (measureBin.firstChild) {\n measureBin.removeChild(measureBin.firstChild);\n }\n }\n\n cache.set(cacheKey, hull);\n return hull;\n}\n","import {\n getHullBoundingRadius,\n type ConvexGeometry,\n type NodeRenderState,\n type SceneFrameSnapshot,\n type SimplexRendererAdapter,\n} from '@simplex-viz/core';\nimport { measureVisualWithSvgView, SVG_NS } from './hullMeasure';\nimport type { SvgNodeView } from './types';\n\nexport interface SvgRendererOptions<TContentVisual, TClusterVisual> {\n readonly contentView: SvgNodeView<TContentVisual>;\n readonly clusterView: SvgNodeView<TClusterVisual>;\n}\n\ninterface TrackedNodeDom<TVisual> {\n readonly rootGroup: SVGGElement;\n mainLayer: SVGGElement | null;\n fromLayer: SVGGElement | null;\n toLayer: SVGGElement | null;\n lastMainKey: string | null;\n lastFromKey: string | null;\n lastToKey: string | null;\n lastInteractionSig: string | null;\n lastMorphUsed: boolean;\n /** Keep view reference per cacheKey so cross-preset transitions crossfade smoothly. */\n lastView?: SvgNodeView<TVisual>;\n}\n\nfunction interactionSignature<TVisual>(state: NodeRenderState<TVisual>): string {\n const { isHovered, isPinned, isDimmed, isHighlighted } = state.interaction;\n return `${isHovered ? 1 : 0}${isPinned ? 1 : 0}${isDimmed ? 1 : 0}${isHighlighted ? 1 : 0}`;\n}\n\n/**\n * Framework-agnostic SVG scene-graph renderer implementing `SimplexRendererAdapter`.\n *\n * Performs keyed `<g>` reconciliation, direct 60fps `transform`/`opacity` attribute updates,\n * automatic offscreen `getBBox()` convex hull measurement, and universal Dual-Layer Crossfade\n * (or optional parametric `morph()` when supported by the active `SvgNodeView`).\n */\nexport class SvgRendererAdapter<TContentVisual, TClusterVisual>\n implements SimplexRendererAdapter<TContentVisual, TClusterVisual>\n{\n private readonly svgEl: SVGSVGElement;\n private readonly doc: Document;\n private readonly worldGroup: SVGGElement;\n private readonly trianglesGroup: SVGGElement;\n private readonly edgesGroup: SVGGElement;\n private readonly clustersGroup: SVGGElement;\n private readonly itemsGroup: SVGGElement;\n private readonly hullsGroup: SVGGElement;\n private readonly measureBin: SVGGElement;\n\n private contentView: SvgNodeView<TContentVisual>;\n private clusterView: SvgNodeView<TClusterVisual>;\n\n private readonly contentHullCache = new Map<string, ConvexGeometry>();\n private readonly clusterHullCache = new Map<string, ConvexGeometry>();\n private readonly contentViewByKey = new Map<string, SvgNodeView<TContentVisual>>();\n private readonly clusterViewByKey = new Map<string, SvgNodeView<TClusterVisual>>();\n\n private readonly clusterDomMap = new Map<string, TrackedNodeDom<TClusterVisual>>();\n private readonly itemDomMap = new Map<string, TrackedNodeDom<TContentVisual>>();\n private readonly trianglePolygons: SVGPolygonElement[] = [];\n private readonly edgeLines: SVGLineElement[] = [];\n\n constructor(\n svgEl: SVGSVGElement,\n options: SvgRendererOptions<TContentVisual, TClusterVisual>,\n ) {\n this.svgEl = svgEl;\n this.doc = svgEl.ownerDocument;\n this.contentView = options.contentView;\n this.clusterView = options.clusterView;\n\n while (this.svgEl.firstChild) {\n this.svgEl.removeChild(this.svgEl.firstChild);\n }\n\n this.worldGroup = this.createGroup('sv-world');\n this.trianglesGroup = this.createGroup('sv-mesh-triangles');\n this.edgesGroup = this.createGroup('sv-mesh-edges');\n this.clustersGroup = this.createGroup('sv-clusters');\n this.itemsGroup = this.createGroup('sv-items');\n this.hullsGroup = this.createGroup('sv-hull-overlay');\n this.hullsGroup.setAttribute('pointer-events', 'none');\n\n this.worldGroup.appendChild(this.trianglesGroup);\n this.worldGroup.appendChild(this.edgesGroup);\n this.worldGroup.appendChild(this.clustersGroup);\n this.worldGroup.appendChild(this.itemsGroup);\n this.worldGroup.appendChild(this.hullsGroup);\n\n this.measureBin = this.createGroup('sv-measure-bin');\n this.measureBin.setAttribute('visibility', 'hidden');\n this.measureBin.setAttribute('pointer-events', 'none');\n this.measureBin.setAttribute('transform', 'translate(-99999, -99999)');\n\n this.svgEl.appendChild(this.worldGroup);\n this.svgEl.appendChild(this.measureBin);\n }\n\n private createGroup(className: string): SVGGElement {\n const g = this.doc.createElementNS(SVG_NS, 'g');\n g.setAttribute('class', className);\n return g;\n }\n\n /**\n * Swaps active content and/or cluster `SvgNodeView` plugins at runtime and invalidates\n * hull caches so the engine re-measures and smoothly crossfades into the new views.\n */\n setViews(\n views: Partial<SvgRendererOptions<TContentVisual, TClusterVisual>>,\n ): void {\n if (views.contentView && views.contentView !== this.contentView) {\n this.contentView = views.contentView;\n this.contentHullCache.clear();\n }\n if (views.clusterView && views.clusterView !== this.clusterView) {\n this.clusterView = views.clusterView;\n this.clusterHullCache.clear();\n }\n }\n\n measureContentHull(visual: TContentVisual, cacheKey: string): ConvexGeometry {\n this.contentViewByKey.set(cacheKey, this.contentView);\n return measureVisualWithSvgView(\n this.contentView,\n visual,\n cacheKey,\n this.svgEl,\n this.measureBin,\n this.contentHullCache,\n );\n }\n\n measureClusterHull(visual: TClusterVisual, cacheKey: string): ConvexGeometry {\n this.clusterViewByKey.set(cacheKey, this.clusterView);\n return measureVisualWithSvgView(\n this.clusterView,\n visual,\n cacheKey,\n this.svgEl,\n this.measureBin,\n this.clusterHullCache,\n );\n }\n\n renderFrame(snapshot: SceneFrameSnapshot<TContentVisual, TClusterVisual>): void {\n this.svgEl.setAttribute(\n 'viewBox',\n `0 0 ${snapshot.viewportWidth} ${snapshot.viewportHeight}`,\n );\n this.worldGroup.setAttribute(\n 'transform',\n `translate(${snapshot.camera.panX.toFixed(2)}, ${snapshot.camera.panY.toFixed(2)}) scale(${snapshot.camera.zoom.toFixed(4)})`,\n );\n\n // 1. Mesh triangles\n while (this.trianglePolygons.length < snapshot.triangles.length) {\n const poly = this.doc.createElementNS(SVG_NS, 'polygon');\n this.trianglesGroup.appendChild(poly);\n this.trianglePolygons.push(poly);\n }\n while (this.trianglePolygons.length > snapshot.triangles.length) {\n const poly = this.trianglePolygons.pop();\n poly?.remove();\n }\n for (let i = 0; i < snapshot.triangles.length; i++) {\n const tr = snapshot.triangles[i]!;\n const poly = this.trianglePolygons[i]!;\n poly.setAttribute(\n 'points',\n tr.points.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' '),\n );\n poly.setAttribute('fill', tr.fillHex);\n poly.setAttribute('fill-opacity', String(tr.fillOpacity));\n }\n\n // 2. Mesh edges\n while (this.edgeLines.length < snapshot.edges.length) {\n const line = this.doc.createElementNS(SVG_NS, 'line');\n line.setAttribute('stroke', 'rgba(148, 163, 184, 0.16)');\n line.setAttribute('stroke-width', '1');\n line.setAttribute('stroke-dasharray', '3 4');\n this.edgesGroup.appendChild(line);\n this.edgeLines.push(line);\n }\n while (this.edgeLines.length > snapshot.edges.length) {\n const line = this.edgeLines.pop();\n line?.remove();\n }\n for (let i = 0; i < snapshot.edges.length; i++) {\n const edge = snapshot.edges[i]!;\n const line = this.edgeLines[i]!;\n line.setAttribute('x1', edge.a.x.toFixed(1));\n line.setAttribute('y1', edge.a.y.toFixed(1));\n line.setAttribute('x2', edge.b.x.toFixed(1));\n line.setAttribute('y2', edge.b.y.toFixed(1));\n }\n\n // 3. Reconcile Clusters & Content Items\n this.reconcileNodes(\n snapshot.clusters,\n this.clustersGroup,\n this.clusterDomMap,\n this.clusterView,\n this.clusterViewByKey,\n 'cluster',\n );\n this.reconcileNodes(\n snapshot.items,\n this.itemsGroup,\n this.itemDomMap,\n this.contentView,\n this.contentViewByKey,\n 'item',\n );\n\n // 4. Optional Convex Hull Debug Overlay\n this.renderHullOverlay(snapshot);\n }\n\n private reconcileNodes<TVisual>(\n nodes: readonly NodeRenderState<TVisual>[],\n parentGroup: SVGGElement,\n domMap: Map<string, TrackedNodeDom<TVisual>>,\n activeView: SvgNodeView<TVisual>,\n viewByKey: Map<string, SvgNodeView<TVisual>>,\n kind: 'cluster' | 'item',\n ): void {\n const aliveIds = new Set<string>();\n\n for (const node of nodes) {\n aliveIds.add(node.id);\n let tracked = domMap.get(node.id);\n if (!tracked) {\n const rootGroup = this.doc.createElementNS(SVG_NS, 'g');\n rootGroup.setAttribute('class', `sv-node sv-node-${kind}`);\n rootGroup.setAttribute('data-node-id', node.id);\n parentGroup.appendChild(rootGroup);\n tracked = {\n rootGroup,\n mainLayer: null,\n fromLayer: null,\n toLayer: null,\n lastMainKey: null,\n lastFromKey: null,\n lastToKey: null,\n lastInteractionSig: null,\n lastMorphUsed: false,\n };\n domMap.set(node.id, tracked);\n }\n\n const effectiveOpacity = node.interaction.isDimmed\n ? node.opacity * 0.24\n : node.opacity;\n tracked.rootGroup.setAttribute(\n 'transform',\n `translate(${node.x.toFixed(2)}, ${node.y.toFixed(2)}) scale(${node.scale.toFixed(4)})`,\n );\n tracked.rootGroup.setAttribute('opacity', effectiveOpacity.toFixed(3));\n\n const interSig = interactionSignature(node);\n const interactionChanged = tracked.lastInteractionSig !== interSig;\n\n if (node.transition) {\n const tr = node.transition;\n const fromView = viewByKey.get(tr.fromCacheKey) ?? tracked.lastView ?? activeView;\n const toView = viewByKey.get(tr.toCacheKey) ?? activeView;\n\n // Specialized parametric morph if both endpoints belong to the same morph-capable view\n if (fromView === toView && toView.morph) {\n if (!tracked.mainLayer) {\n tracked.mainLayer = this.createGroup('sv-layer-main');\n tracked.rootGroup.appendChild(tracked.mainLayer);\n }\n if (tracked.fromLayer) {\n tracked.fromLayer.remove();\n tracked.fromLayer = null;\n }\n if (tracked.toLayer) {\n tracked.toLayer.remove();\n tracked.toLayer = null;\n }\n const handled = toView.morph(\n tracked.mainLayer,\n tr.from,\n tr.to,\n tr.progress,\n node,\n );\n if (handled) {\n tracked.lastMorphUsed = true;\n tracked.lastMainKey = null;\n tracked.lastInteractionSig = interSig;\n tracked.lastView = toView;\n continue;\n }\n }\n\n // Universal Dual-Layer Crossfade (max 2 child layers: layer-from + layer-to)\n tracked.lastMorphUsed = false;\n if (tracked.mainLayer) {\n tracked.mainLayer.remove();\n tracked.mainLayer = null;\n tracked.lastMainKey = null;\n }\n\n if (!tracked.fromLayer) {\n tracked.fromLayer = this.createGroup('sv-layer-from');\n tracked.rootGroup.appendChild(tracked.fromLayer);\n }\n if (!tracked.toLayer) {\n tracked.toLayer = this.createGroup('sv-layer-to');\n tracked.rootGroup.appendChild(tracked.toLayer);\n }\n\n if (tracked.lastFromKey !== tr.fromCacheKey || interactionChanged) {\n fromView.mountOrUpdate(tracked.fromLayer, tr.from, {\n ...node,\n visual: tr.from,\n hull: tr.fromHull,\n cacheKey: tr.fromCacheKey,\n });\n tracked.lastFromKey = tr.fromCacheKey;\n }\n\n if (tracked.lastToKey !== tr.toCacheKey || interactionChanged) {\n toView.mountOrUpdate(tracked.toLayer, tr.to, {\n ...node,\n visual: tr.to,\n hull: tr.toHull,\n cacheKey: tr.toCacheKey,\n });\n tracked.lastToKey = tr.toCacheKey;\n }\n\n // Proportional radius alignment during crossfade between disparate hull sizes\n const rFrom = Math.max(1, getHullBoundingRadius(tr.fromHull));\n const rTo = Math.max(1, getHullBoundingRadius(tr.toHull));\n const currentR = rFrom + (rTo - rFrom) * tr.progress;\n const fromSubScale = Math.max(0.4, Math.min(1.6, currentR / rFrom));\n const toSubScale = Math.max(0.4, Math.min(1.6, currentR / rTo));\n\n tracked.fromLayer.setAttribute('opacity', (1 - tr.progress).toFixed(3));\n tracked.fromLayer.setAttribute('transform', `scale(${fromSubScale.toFixed(4)})`);\n tracked.toLayer.setAttribute('opacity', tr.progress.toFixed(3));\n tracked.toLayer.setAttribute('transform', `scale(${toSubScale.toFixed(4)})`);\n\n tracked.lastInteractionSig = interSig;\n tracked.lastView = toView;\n } else {\n // Steady state (no active transition)\n if (tracked.fromLayer) {\n tracked.fromLayer.remove();\n tracked.fromLayer = null;\n tracked.lastFromKey = null;\n }\n if (tracked.toLayer) {\n // Promote toLayer directly into mainLayer without recreating DOM nodes\n if (tracked.mainLayer) tracked.mainLayer.remove();\n tracked.mainLayer = tracked.toLayer;\n tracked.mainLayer.setAttribute('class', 'sv-layer-main');\n tracked.mainLayer.removeAttribute('opacity');\n tracked.mainLayer.removeAttribute('transform');\n tracked.toLayer = null;\n tracked.lastMainKey = tracked.lastToKey;\n tracked.lastToKey = null;\n }\n if (!tracked.mainLayer) {\n tracked.mainLayer = this.createGroup('sv-layer-main');\n tracked.rootGroup.appendChild(tracked.mainLayer);\n }\n\n const viewToUse = viewByKey.get(node.cacheKey) ?? activeView;\n if (\n tracked.lastMainKey !== node.cacheKey ||\n interactionChanged ||\n tracked.lastMorphUsed ||\n tracked.lastView !== viewToUse\n ) {\n viewToUse.mountOrUpdate(tracked.mainLayer, node.visual, node);\n tracked.lastMainKey = node.cacheKey;\n tracked.lastInteractionSig = interSig;\n tracked.lastMorphUsed = false;\n tracked.lastView = viewToUse;\n }\n }\n }\n\n // Remove exited nodes\n for (const [id, tracked] of domMap) {\n if (!aliveIds.has(id)) {\n tracked.rootGroup.remove();\n domMap.delete(id);\n }\n }\n }\n\n private renderHullOverlay(\n snapshot: SceneFrameSnapshot<TContentVisual, TClusterVisual>,\n ): void {\n while (this.hullsGroup.firstChild) {\n this.hullsGroup.removeChild(this.hullsGroup.firstChild);\n }\n if (!snapshot.showHulls) return;\n\n const drawHull = <TVisual>(\n node: NodeRenderState<TVisual>,\n strokeColor: string,\n ) => {\n if (node.opacity < 0.05) return;\n const hull = node.hull;\n if (hull.kind === 'circle') {\n const circle = this.doc.createElementNS(SVG_NS, 'circle');\n circle.setAttribute('cx', node.x.toFixed(2));\n circle.setAttribute('cy', node.y.toFixed(2));\n circle.setAttribute('r', (hull.radius * node.scale).toFixed(2));\n circle.setAttribute('fill', strokeColor);\n circle.setAttribute('fill-opacity', '0.07');\n circle.setAttribute('stroke', strokeColor);\n circle.setAttribute('stroke-width', '1');\n circle.setAttribute('stroke-dasharray', '3 2');\n this.hullsGroup.appendChild(circle);\n } else if (hull.vertices.length >= 3) {\n const poly = this.doc.createElementNS(SVG_NS, 'polygon');\n poly.setAttribute(\n 'points',\n hull.vertices\n .map(\n (v) =>\n `${(node.x + v.x * node.scale).toFixed(2)},${(node.y + v.y * node.scale).toFixed(2)}`,\n )\n .join(' '),\n );\n poly.setAttribute('fill', strokeColor);\n poly.setAttribute('fill-opacity', '0.07');\n poly.setAttribute('stroke', strokeColor);\n poly.setAttribute('stroke-width', '1');\n poly.setAttribute('stroke-dasharray', '3 2');\n this.hullsGroup.appendChild(poly);\n }\n };\n\n for (const c of snapshot.clusters) {\n drawHull(c, '#f59e0b');\n }\n for (const it of snapshot.items) {\n drawHull(it, '#22d3ee');\n }\n }\n\n destroy(): void {\n this.clusterDomMap.clear();\n this.itemDomMap.clear();\n this.contentHullCache.clear();\n this.clusterHullCache.clear();\n this.contentViewByKey.clear();\n this.clusterViewByKey.clear();\n while (this.svgEl.firstChild) {\n this.svgEl.removeChild(this.svgEl.firstChild);\n }\n }\n}\n","import {\n SimplexGraphEngine,\n type CameraController,\n type ClusterDerivationContext,\n type ClusterDescriptor,\n type ClusterMetaConfig,\n type DefaultTaggedItem,\n type InteractionHandlers,\n type ItemIdentityConfig,\n type LayoutMetrics,\n type LayoutSolverOptions,\n type MeshOptions,\n type VisualResolver,\n} from '@simplex-viz/core';\nimport { SVG_NS } from './hullMeasure';\nimport { SvgRendererAdapter, type SvgRendererOptions } from './SvgRendererAdapter';\n\nexport interface SimplexSvgControllerResolvedOptions<\n TItem = DefaultTaggedItem,\n TContentVisual = unknown,\n TClusterVisual = unknown,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n> {\n readonly items: readonly TItem[];\n readonly getId?: (item: TItem) => string;\n readonly getTags?: (item: TItem) => readonly string[];\n readonly deriveClusterMeta?: (\n ctx: ClusterDerivationContext<TItem, TTagMeta>,\n ) => TClusterMeta;\n readonly visualResolver: VisualResolver<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >;\n readonly contentView: SvgRendererOptions<TContentVisual, TClusterVisual>['contentView'];\n readonly clusterView: SvgRendererOptions<TContentVisual, TClusterVisual>['clusterView'];\n readonly normalizeTag?: (rawTag: string) => string;\n readonly resolveTagMeta?: (normalizedTag: string) => TTagMeta | undefined;\n readonly meshOptions?: MeshOptions;\n readonly layoutOptions?: LayoutSolverOptions;\n readonly showHulls?: boolean;\n readonly interactions?: InteractionHandlers<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >;\n readonly onMetricsChange?: (metrics: LayoutMetrics) => void;\n readonly onClustersChange?: (\n clusters: readonly ClusterDescriptor<TItem, TTagMeta, TClusterMeta>[],\n ) => void;\n readonly onFpsUpdate?: (fps: number) => void;\n}\n\nexport type SimplexSvgControllerOptions<\n TItem = DefaultTaggedItem,\n TContentVisual = unknown,\n TClusterVisual = unknown,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n> = ItemIdentityConfig<TItem> &\n ClusterMetaConfig<TItem, TTagMeta, TClusterMeta> &\n Omit<\n SimplexSvgControllerResolvedOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n 'getId' | 'getTags' | 'deriveClusterMeta'\n >;\n\n/**\n * High-level framework-agnostic SVG graph controller for Vanilla TypeScript, Vue, Angular,\n * Svelte, Web Components, and `@simplex-viz/react`.\n *\n * Attaches centralized pointer, click, contextmenu, wheel, and drag-pan handlers solely on the\n * root `<svg>` element and delegates hit-testing to `@simplex-viz/core`'s convex geometry solver.\n */\nexport class SimplexSvgController<\n TItem = DefaultTaggedItem,\n TContentVisual = unknown,\n TClusterVisual = unknown,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n> {\n private readonly containerEl: HTMLElement;\n private readonly svgEl: SVGSVGElement;\n private readonly adapter: SvgRendererAdapter<TContentVisual, TClusterVisual>;\n private readonly engine: SimplexGraphEngine<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >;\n private readonly resizeObserver: ResizeObserver | null = null;\n private readonly onFpsUpdate?: (fps: number) => void;\n\n private rafId: number | null = null;\n private lastFrameTs = 0;\n private fpsSamples = 0;\n private fpsAccumMs = 0;\n private destroyed = false;\n\n // Centralized drag-to-pan state on root <svg>\n private isDraggingPan = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragMoved = false;\n\n constructor(\n containerEl: HTMLElement,\n options: SimplexSvgControllerOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n );\n constructor(\n containerEl: HTMLElement,\n options: SimplexSvgControllerResolvedOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ) {\n this.containerEl = containerEl;\n this.onFpsUpdate = options.onFpsUpdate;\n\n const doc = containerEl.ownerDocument;\n this.svgEl = doc.createElementNS(SVG_NS, 'svg');\n this.svgEl.setAttribute('width', '100%');\n this.svgEl.setAttribute('height', '100%');\n this.svgEl.style.display = 'block';\n this.svgEl.style.touchAction = 'none';\n this.svgEl.style.userSelect = 'none';\n containerEl.appendChild(this.svgEl);\n\n const rect = containerEl.getBoundingClientRect();\n const initialW = rect.width > 40 ? rect.width : 960;\n const initialH = rect.height > 40 ? rect.height : 620;\n\n this.adapter = new SvgRendererAdapter(this.svgEl, {\n contentView: options.contentView,\n clusterView: options.clusterView,\n });\n\n this.engine = SimplexGraphEngine.createFromResolved({\n items: options.items,\n getId: options.getId,\n getTags: options.getTags,\n deriveClusterMeta: options.deriveClusterMeta,\n visualResolver: options.visualResolver,\n renderer: this.adapter,\n viewportWidth: initialW,\n viewportHeight: initialH,\n normalizeTag: options.normalizeTag,\n resolveTagMeta: options.resolveTagMeta,\n meshOptions: options.meshOptions,\n layoutOptions: options.layoutOptions,\n showHulls: options.showHulls,\n interactions: options.interactions,\n onMetricsChange: options.onMetricsChange,\n onClustersChange: options.onClustersChange,\n });\n\n this.attachSvgListeners();\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver((entries) => {\n if (this.destroyed) return;\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n if (width > 60 && height > 60) {\n this.engine.setViewport(width, height);\n this.ensureLoopRunning();\n }\n }\n });\n this.resizeObserver.observe(containerEl);\n }\n\n this.ensureLoopRunning();\n }\n\n static createFromResolved<\n TItem = DefaultTaggedItem,\n TContentVisual = unknown,\n TClusterVisual = unknown,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n >(\n containerEl: HTMLElement,\n options: SimplexSvgControllerResolvedOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ): SimplexSvgController<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n > {\n return new (SimplexSvgController as unknown as new (\n el: HTMLElement,\n opts: SimplexSvgControllerResolvedOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ) => SimplexSvgController<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >)(containerEl, options);\n }\n\n get camera(): CameraController {\n return this.engine.camera;\n }\n\n getSvgElement(): SVGSVGElement {\n return this.svgEl;\n }\n\n getMetrics(): LayoutMetrics {\n return this.engine.getMetrics();\n }\n\n getClusters(): readonly ClusterDescriptor<TItem, TTagMeta, TClusterMeta>[] {\n return this.engine.getClusters();\n }\n\n getItems(): readonly TItem[] {\n return this.engine.getItems();\n }\n\n addItems(items: TItem | readonly TItem[]): void {\n this.engine.addItems(items);\n this.ensureLoopRunning();\n }\n\n removeItems(ids: string | readonly string[]): void {\n this.engine.removeItems(ids);\n this.ensureLoopRunning();\n }\n\n setItems(items: readonly TItem[]): void {\n this.engine.setItems(items);\n this.ensureLoopRunning();\n }\n\n setVisualResolver(\n resolver: VisualResolver<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ): void {\n this.engine.setVisualResolver(resolver);\n this.ensureLoopRunning();\n }\n\n setViews(\n views: Partial<SvgRendererOptions<TContentVisual, TClusterVisual>>,\n ): void {\n this.adapter.setViews(views);\n }\n\n setSizeMultiplier(multiplier: number): void {\n this.engine.setSizeMultiplier(multiplier);\n this.ensureLoopRunning();\n }\n\n setShowHulls(show: boolean): void {\n this.engine.setShowHulls(show);\n this.ensureLoopRunning();\n }\n\n setInteractions(\n interactions: InteractionHandlers<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ): void {\n this.engine.setInteractions(interactions);\n }\n\n setPinnedIds(ids: ReadonlySet<string> | readonly string[]): void {\n this.engine.setPinnedIds(ids);\n this.ensureLoopRunning();\n }\n\n setHighlightedIds(ids: ReadonlySet<string> | readonly string[]): void {\n this.engine.setHighlightedIds(ids);\n this.ensureLoopRunning();\n }\n\n setFocusedClusterUid(clusterUid: string | null): void {\n this.engine.setFocusedClusterUid(clusterUid);\n this.ensureLoopRunning();\n }\n\n /** Deterministically advances simulation time in tests without waiting for rAF. */\n stepForTest(dtMs: number): boolean {\n return this.engine.step(dtMs);\n }\n\n private toLocalCoords(clientX: number, clientY: number): { x: number; y: number } {\n const rect = this.svgEl.getBoundingClientRect();\n return {\n x: clientX - rect.left,\n y: clientY - rect.top,\n };\n }\n\n private readonly onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0) return;\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n const hit = this.engine.hitTest(x, y);\n if (hit.kind === 'background') {\n this.isDraggingPan = true;\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n this.dragMoved = false;\n this.svgEl.style.cursor = 'grabbing';\n } else {\n this.isDraggingPan = false;\n this.dragMoved = false;\n }\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n if (this.isDraggingPan) {\n const dx = e.clientX - this.dragStartX;\n const dy = e.clientY - this.dragStartY;\n if (Math.hypot(dx, dy) > 3) {\n this.dragMoved = true;\n }\n if (this.dragMoved) {\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n this.engine.camera.panBy(dx, dy);\n this.ensureLoopRunning();\n }\n return;\n }\n this.engine.handlePointerMove(x, y);\n const hit = this.engine.hitTest(x, y);\n this.svgEl.style.cursor = hit.kind === 'background' ? 'grab' : 'pointer';\n this.ensureLoopRunning();\n };\n\n private readonly onPointerUp = (): void => {\n if (this.isDraggingPan) {\n this.isDraggingPan = false;\n this.svgEl.style.cursor = 'grab';\n }\n };\n\n private readonly onPointerLeave = (): void => {\n this.isDraggingPan = false;\n this.engine.handlePointerLeave();\n this.ensureLoopRunning();\n };\n\n private readonly onClick = (e: MouseEvent): void => {\n if (this.dragMoved) {\n this.dragMoved = false;\n return;\n }\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n this.engine.handleLeftClick({\n screenX: x,\n screenY: y,\n button: e.button,\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n });\n this.ensureLoopRunning();\n };\n\n private readonly onContextMenu = (e: MouseEvent): void => {\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n const suppress = this.engine.handleRightClick({\n screenX: x,\n screenY: y,\n button: e.button,\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n });\n if (suppress) {\n e.preventDefault();\n }\n this.ensureLoopRunning();\n };\n\n private readonly onWheel = (e: WheelEvent): void => {\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n const handled = this.engine.handleWheel({\n screenX: x,\n screenY: y,\n deltaX: e.deltaX,\n deltaY: e.deltaY,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n });\n if (handled) {\n e.preventDefault();\n this.ensureLoopRunning();\n }\n };\n\n private attachSvgListeners(): void {\n this.svgEl.addEventListener('pointerdown', this.onPointerDown);\n this.svgEl.addEventListener('pointermove', this.onPointerMove);\n this.svgEl.addEventListener('pointerup', this.onPointerUp);\n this.svgEl.addEventListener('pointerleave', this.onPointerLeave);\n this.svgEl.addEventListener('click', this.onClick);\n this.svgEl.addEventListener('contextmenu', this.onContextMenu);\n this.svgEl.addEventListener('wheel', this.onWheel, { passive: false });\n }\n\n private detachSvgListeners(): void {\n this.svgEl.removeEventListener('pointerdown', this.onPointerDown);\n this.svgEl.removeEventListener('pointermove', this.onPointerMove);\n this.svgEl.removeEventListener('pointerup', this.onPointerUp);\n this.svgEl.removeEventListener('pointerleave', this.onPointerLeave);\n this.svgEl.removeEventListener('click', this.onClick);\n this.svgEl.removeEventListener('contextmenu', this.onContextMenu);\n this.svgEl.removeEventListener('wheel', this.onWheel);\n }\n\n private ensureLoopRunning(): void {\n if (this.destroyed || this.rafId !== null) return;\n if (typeof requestAnimationFrame === 'undefined') {\n this.engine.renderNow();\n return;\n }\n this.lastFrameTs = performance.now();\n const tick = (now: number) => {\n if (this.destroyed) return;\n const dtMs = Math.max(1, Math.min(50, now - this.lastFrameTs));\n this.lastFrameTs = now;\n\n this.fpsSamples += 1;\n this.fpsAccumMs += dtMs;\n if (this.fpsAccumMs >= 320) {\n const fps = Math.round((this.fpsSamples * 1000) / this.fpsAccumMs);\n this.onFpsUpdate?.(fps);\n this.fpsSamples = 0;\n this.fpsAccumMs = 0;\n }\n\n const settled = this.engine.step(dtMs);\n if (!settled) {\n this.rafId = requestAnimationFrame(tick);\n } else {\n this.rafId = null;\n }\n };\n this.rafId = requestAnimationFrame(tick);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.rafId !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.resizeObserver?.disconnect();\n this.detachSvgListeners();\n this.engine.destroy();\n if (this.svgEl.parentElement === this.containerEl) {\n this.containerEl.removeChild(this.svgEl);\n }\n }\n}\n","import {\n computeConvexHull,\n regularPolygon,\n starConvexHull,\n type ConvexGeometry,\n type NodeRenderState,\n type Point2D,\n} from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\nexport type GeometricShapeKind = 'circle' | 'diamond' | 'star' | 'hexagon';\n\n/**\n * Pure visual descriptor for `GeometricShapeSvgView`.\n */\nexport interface GeometricShapeVisual {\n readonly shape: GeometricShapeKind;\n readonly radius: number;\n readonly fillHex: string;\n readonly strokeHex?: string;\n readonly strokeWidth?: number;\n readonly label?: string;\n}\n\nconst MORPH_SAMPLES = 64;\n\nfunction sampleShapePerimeter(\n shape: GeometricShapeKind,\n radius: number,\n): readonly Point2D[] {\n const r = Math.max(3, radius);\n const pts: Point2D[] = [];\n\n if (shape === 'circle') {\n for (let i = 0; i < MORPH_SAMPLES; i++) {\n const a = (i / MORPH_SAMPLES) * Math.PI * 2 - Math.PI / 2;\n pts.push({ x: Math.cos(a) * r, y: Math.sin(a) * r });\n }\n return pts;\n }\n\n // Construct polygon vertices then resample evenly along edges\n const polyVerts: Point2D[] = [];\n if (shape === 'diamond') {\n const d = r * 1.12;\n polyVerts.push(\n { x: 0, y: -d },\n { x: d * 0.88, y: 0 },\n { x: 0, y: d },\n { x: -d * 0.88, y: 0 },\n );\n } else if (shape === 'hexagon') {\n for (let i = 0; i < 6; i++) {\n const a = -Math.PI / 2 + (i * Math.PI * 2) / 6;\n polyVerts.push({ x: Math.cos(a) * r * 1.05, y: Math.sin(a) * r * 1.05 });\n }\n } else {\n // 5-point star (10 vertices alternating outer & inner)\n const outer = r * 1.24;\n const inner = r * 0.56;\n for (let i = 0; i < 10; i++) {\n const a = -Math.PI / 2 + (i * Math.PI) / 5;\n const rad = i % 2 === 0 ? outer : inner;\n polyVerts.push({ x: Math.cos(a) * rad, y: Math.sin(a) * rad });\n }\n }\n\n // Compute cumulative perimeter lengths\n const edgeLens: number[] = [];\n let totalLen = 0;\n for (let i = 0; i < polyVerts.length; i++) {\n const a = polyVerts[i]!;\n const b = polyVerts[(i + 1) % polyVerts.length]!;\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n edgeLens.push(len);\n totalLen += len;\n }\n\n for (let s = 0; s < MORPH_SAMPLES; s++) {\n const targetDist = (s / MORPH_SAMPLES) * totalLen;\n let accum = 0;\n for (let i = 0; i < polyVerts.length; i++) {\n const len = edgeLens[i]!;\n if (accum + len >= targetDist || i === polyVerts.length - 1) {\n const localT = len > 1e-6 ? (targetDist - accum) / len : 0;\n const a = polyVerts[i]!;\n const b = polyVerts[(i + 1) % polyVerts.length]!;\n pts.push({\n x: a.x + (b.x - a.x) * localT,\n y: a.y + (b.y - a.y) * localT,\n });\n break;\n }\n accum += len;\n }\n }\n\n return pts;\n}\n\nfunction pointsToSvgPath(pts: readonly Point2D[]): string {\n if (pts.length === 0) return '';\n let d = `M ${pts[0]!.x.toFixed(2)} ${pts[0]!.y.toFixed(2)}`;\n for (let i = 1; i < pts.length; i++) {\n const p = pts[i]!;\n d += ` L ${p.x.toFixed(2)} ${p.y.toFixed(2)}`;\n }\n return `${d} Z`;\n}\n\nfunction parseHexRgb(hex: string): readonly [number, number, number] {\n const clean = hex.startsWith('#') ? hex.slice(1) : hex;\n if (clean.length < 6) return [148, 163, 184];\n return [\n parseInt(clean.slice(0, 2), 16) || 0,\n parseInt(clean.slice(2, 4), 16) || 0,\n parseInt(clean.slice(4, 6), 16) || 0,\n ];\n}\n\nfunction lerpHex(fromHex: string, toHex: string, t: number): string {\n const a = parseHexRgb(fromHex);\n const b = parseHexRgb(toHex);\n const r = Math.round(a[0] + (b[0] - a[0]) * t);\n const g = Math.round(a[1] + (b[1] - a[1]) * t);\n const bl = Math.round(a[2] + (b[2] - a[2]) * t);\n return `rgb(${r}, ${g}, ${bl})`;\n}\n\n/**\n * Pluggable SVG node view rendering geometric shapes (`circle`, `diamond`, `star`, `hexagon`)\n * with analytical convex hulls and 64-point parametric SVG path morphing!\n */\nexport class GeometricShapeSvgView implements SvgNodeView<GeometricShapeVisual> {\n measureConvexHull(visual: GeometricShapeVisual): ConvexGeometry {\n const r = visual.radius + (visual.strokeWidth ?? 1.5);\n if (visual.shape === 'circle') {\n return { kind: 'circle', radius: r };\n }\n if (visual.shape === 'diamond') {\n const d = r * 1.12;\n return {\n kind: 'polygon',\n vertices: computeConvexHull([\n { x: 0, y: -d },\n { x: d * 0.88, y: 0 },\n { x: 0, y: d },\n { x: -d * 0.88, y: 0 },\n ]),\n };\n }\n if (visual.shape === 'hexagon') {\n return regularPolygon(6, r * 1.05);\n }\n return starConvexHull(5, r * 1.24);\n }\n\n private ensureElements(groupEl: SVGGElement): {\n pathEl: SVGPathElement;\n ringEl: SVGPathElement;\n } {\n let pathEl = groupEl.querySelector<SVGPathElement>('path.sv-geom-shape');\n let ringEl = groupEl.querySelector<SVGPathElement>('path.sv-geom-ring');\n if (!pathEl || !ringEl) {\n while (groupEl.firstChild) groupEl.removeChild(groupEl.firstChild);\n const doc = groupEl.ownerDocument;\n ringEl = doc.createElementNS(SVG_NS, 'path');\n ringEl.setAttribute('class', 'sv-geom-ring');\n ringEl.setAttribute('fill', 'none');\n pathEl = doc.createElementNS(SVG_NS, 'path');\n pathEl.setAttribute('class', 'sv-geom-shape');\n groupEl.appendChild(ringEl);\n groupEl.appendChild(pathEl);\n }\n return { pathEl, ringEl };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: GeometricShapeVisual,\n state: NodeRenderState<GeometricShapeVisual>,\n ): void {\n const { pathEl, ringEl } = this.ensureElements(groupEl);\n const pts = sampleShapePerimeter(visual.shape, visual.radius);\n const d = pointsToSvgPath(pts);\n\n pathEl.setAttribute('d', d);\n pathEl.setAttribute('fill', visual.fillHex);\n pathEl.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered\n ? '#f8fafc'\n : (visual.strokeHex ?? 'rgba(15, 23, 42, 0.8)'),\n );\n pathEl.setAttribute(\n 'stroke-width',\n String(state.interaction.isHovered || state.interaction.isPinned ? 2.2 : (visual.strokeWidth ?? 1.4)),\n );\n\n if (state.interaction.isHovered || state.interaction.isPinned || state.interaction.isHighlighted) {\n const outerPts = sampleShapePerimeter(visual.shape, visual.radius + 4.5);\n ringEl.setAttribute('d', pointsToSvgPath(outerPts));\n ringEl.setAttribute('stroke', state.interaction.isPinned ? '#f59e0b' : '#22d3ee');\n ringEl.setAttribute('stroke-width', '1.4');\n ringEl.setAttribute('stroke-opacity', '0.9');\n } else {\n ringEl.setAttribute('d', '');\n }\n }\n\n morph(\n groupEl: SVGGElement,\n from: GeometricShapeVisual,\n to: GeometricShapeVisual,\n progress: number,\n state: NodeRenderState<GeometricShapeVisual>,\n ): boolean {\n const { pathEl, ringEl } = this.ensureElements(groupEl);\n const ptsA = sampleShapePerimeter(from.shape, from.radius);\n const ptsB = sampleShapePerimeter(to.shape, to.radius);\n const morphed: Point2D[] = [];\n for (let i = 0; i < MORPH_SAMPLES; i++) {\n const a = ptsA[i]!;\n const b = ptsB[i]!;\n morphed.push({\n x: a.x + (b.x - a.x) * progress,\n y: a.y + (b.y - a.y) * progress,\n });\n }\n pathEl.setAttribute('d', pointsToSvgPath(morphed));\n pathEl.setAttribute('fill', lerpHex(from.fillHex, to.fillHex, progress));\n pathEl.setAttribute(\n 'stroke',\n state.interaction.isHovered ? '#f8fafc' : (to.strokeHex ?? 'rgba(15, 23, 42, 0.8)'),\n );\n pathEl.setAttribute('stroke-width', String(to.strokeWidth ?? 1.4));\n ringEl.setAttribute('d', '');\n return true;\n }\n}\n","import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\nexport interface TopicSectorSlice {\n readonly colorHex: string;\n readonly weight: number;\n}\n\n/**\n * Pure visual descriptor for `MultiSectorGlyphSvgView`.\n */\nexport interface MultiSectorGlyphVisual {\n readonly outerRadius: number;\n readonly innerRadius: number;\n readonly sectors: readonly TopicSectorSlice[];\n readonly centerColorHex: string;\n readonly accentRingHex?: string;\n}\n\nfunction describeDonutSectorPath(\n innerR: number,\n outerR: number,\n startAngle: number,\n endAngle: number,\n): string {\n const sweep = endAngle - startAngle;\n if (sweep >= Math.PI * 2 - 1e-4) {\n // Full ring via two half-arcs\n return [\n `M ${outerR} 0`,\n `A ${outerR} ${outerR} 0 1 0 ${-outerR} 0`,\n `A ${outerR} ${outerR} 0 1 0 ${outerR} 0`,\n `M ${innerR} 0`,\n `A ${innerR} ${innerR} 0 1 1 ${-innerR} 0`,\n `A ${innerR} ${innerR} 0 1 1 ${innerR} 0`,\n 'Z',\n ].join(' ');\n }\n const largeArc = sweep > Math.PI ? 1 : 0;\n const x1o = Math.cos(startAngle) * outerR;\n const y1o = Math.sin(startAngle) * outerR;\n const x2o = Math.cos(endAngle) * outerR;\n const y2o = Math.sin(endAngle) * outerR;\n\n const x1i = Math.cos(endAngle) * innerR;\n const y1i = Math.sin(endAngle) * innerR;\n const x2i = Math.cos(startAngle) * innerR;\n const y2i = Math.sin(startAngle) * innerR;\n\n return [\n `M ${x1o.toFixed(2)} ${y1o.toFixed(2)}`,\n `A ${outerR.toFixed(2)} ${outerR.toFixed(2)} 0 ${largeArc} 1 ${x2o.toFixed(2)} ${y2o.toFixed(2)}`,\n `L ${x1i.toFixed(2)} ${y1i.toFixed(2)}`,\n `A ${innerR.toFixed(2)} ${innerR.toFixed(2)} 0 ${largeArc} 0 ${x2i.toFixed(2)} ${y2i.toFixed(2)}`,\n 'Z',\n ].join(' ');\n}\n\n/**\n * Pluggable SVG node view rendering multi-color topic-weight donut sectors\n * representing each item's exact barycentric weights `\\tilde{w}_{ik}`.\n */\nexport class MultiSectorGlyphSvgView implements SvgNodeView<MultiSectorGlyphVisual> {\n measureConvexHull(visual: MultiSectorGlyphVisual): ConvexGeometry {\n return { kind: 'circle', radius: visual.outerRadius + 2 };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: MultiSectorGlyphVisual,\n state: NodeRenderState<MultiSectorGlyphVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const totalWeight = visual.sectors.reduce((s, sec) => s + Math.max(0, sec.weight), 0) || 1;\n let angle = -Math.PI / 2;\n\n for (const sec of visual.sectors) {\n const frac = Math.max(0, sec.weight) / totalWeight;\n if (frac <= 0.005) continue;\n const nextAngle = angle + frac * Math.PI * 2;\n const path = doc.createElementNS(SVG_NS, 'path');\n path.setAttribute(\n 'd',\n describeDonutSectorPath(visual.innerRadius, visual.outerRadius, angle, nextAngle),\n );\n path.setAttribute('fill', sec.colorHex);\n path.setAttribute('stroke', '#07090E');\n path.setAttribute('stroke-width', visual.sectors.length > 1 ? '1.1' : '0.8');\n groupEl.appendChild(path);\n angle = nextAngle;\n }\n\n const core = doc.createElementNS(SVG_NS, 'circle');\n core.setAttribute('cx', '0');\n core.setAttribute('cy', '0');\n core.setAttribute('r', String(Math.max(2, visual.innerRadius - 1)));\n core.setAttribute('fill', visual.centerColorHex);\n groupEl.appendChild(core);\n\n if (\n visual.accentRingHex ||\n state.interaction.isHovered ||\n state.interaction.isPinned ||\n state.interaction.isHighlighted\n ) {\n const ring = doc.createElementNS(SVG_NS, 'circle');\n ring.setAttribute('cx', '0');\n ring.setAttribute('cy', '0');\n ring.setAttribute('r', String(visual.outerRadius + 3));\n ring.setAttribute('fill', 'none');\n ring.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered\n ? '#f8fafc'\n : (visual.accentRingHex ?? '#22d3ee'),\n );\n ring.setAttribute('stroke-width', state.interaction.isHovered ? '2' : '1.2');\n groupEl.appendChild(ring);\n }\n }\n}\n","import type { NodeRenderState } from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\n/**\n * Pure visual descriptor for `BadgeClusterSvgView`.\n * Intentionally omits analytical `measureConvexHull` so `@simplex-viz/svg`\n * exercises automatic offscreen `getBBox()` convex hull computation.\n */\nexport interface BadgeClusterVisual {\n readonly code: string;\n readonly title: string;\n readonly metaLine: string;\n readonly colorHex: string;\n}\n\n/**\n * Pluggable SVG cluster view rendering a dynamic pill/rect badge whose width adapts\n * to its title and metadata, automatically measured via `getBBox()` for overlap-free layout.\n */\nexport class BadgeClusterSvgView implements SvgNodeView<BadgeClusterVisual> {\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: BadgeClusterVisual,\n state: NodeRenderState<BadgeClusterVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const titleLen = visual.title.length;\n const metaLen = visual.metaLine.length;\n const estWidth = Math.max(122, Math.max(titleLen * 6.8 + 44, metaLen * 5.9 + 24));\n const height = 42;\n const halfW = estWidth / 2;\n const halfH = height / 2;\n\n const bg = doc.createElementNS(SVG_NS, 'rect');\n bg.setAttribute('x', String(-halfW));\n bg.setAttribute('y', String(-halfH));\n bg.setAttribute('width', String(estWidth));\n bg.setAttribute('height', String(height));\n bg.setAttribute('rx', '8');\n bg.setAttribute('fill', '#0d1320');\n bg.setAttribute('fill-opacity', '0.94');\n bg.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered || state.interaction.isHighlighted\n ? '#e2e8f0'\n : visual.colorHex,\n );\n bg.setAttribute(\n 'stroke-width',\n state.interaction.isHovered || state.interaction.isHighlighted ? '2.2' : '1.4',\n );\n groupEl.appendChild(bg);\n\n // Subtle top accent dot inside badge\n const swatch = doc.createElementNS(SVG_NS, 'circle');\n swatch.setAttribute('cx', String(-halfW + 13));\n swatch.setAttribute('cy', String(-7));\n swatch.setAttribute('r', '4');\n swatch.setAttribute('fill', visual.colorHex);\n groupEl.appendChild(swatch);\n\n const codeText = doc.createElementNS(SVG_NS, 'text');\n codeText.setAttribute('x', String(-halfW + 22));\n codeText.setAttribute('y', String(-3));\n codeText.setAttribute('fill', visual.colorHex);\n codeText.setAttribute('font-size', '10');\n codeText.setAttribute('font-weight', '600');\n codeText.setAttribute('font-family', 'IBM Plex Mono, monospace');\n codeText.textContent = visual.code;\n groupEl.appendChild(codeText);\n\n const titleText = doc.createElementNS(SVG_NS, 'text');\n titleText.setAttribute('x', String(-halfW + 44));\n titleText.setAttribute('y', String(-3));\n titleText.setAttribute('fill', '#f1f5f9');\n titleText.setAttribute('font-size', '11');\n titleText.setAttribute('font-weight', '600');\n titleText.setAttribute('font-family', 'Plus Jakarta Sans, sans-serif');\n titleText.textContent = visual.title;\n groupEl.appendChild(titleText);\n\n const subText = doc.createElementNS(SVG_NS, 'text');\n subText.setAttribute('x', '0');\n subText.setAttribute('y', '13');\n subText.setAttribute('text-anchor', 'middle');\n subText.setAttribute('fill', '#94a3b8');\n subText.setAttribute('font-size', '9.5');\n subText.setAttribute('font-family', 'IBM Plex Mono, monospace');\n subText.textContent = visual.metaLine;\n groupEl.appendChild(subText);\n }\n}\n","import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\n/**\n * Pure visual descriptor for `ClusterAnchorSvgView`.\n */\nexport interface ClusterAnchorVisual {\n readonly code: string;\n readonly label: string;\n readonly memberCount: number;\n readonly colorHex: string;\n readonly radius: number;\n}\n\n/**\n * Pluggable SVG cluster view rendering a calibrated double-ring geometric vertex anchor\n * displaying the cluster code and member count.\n */\nexport class ClusterAnchorSvgView implements SvgNodeView<ClusterAnchorVisual> {\n measureConvexHull(visual: ClusterAnchorVisual): ConvexGeometry {\n return { kind: 'circle', radius: visual.radius + 5 };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: ClusterAnchorVisual,\n state: NodeRenderState<ClusterAnchorVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const r = visual.radius;\n const outer = doc.createElementNS(SVG_NS, 'circle');\n outer.setAttribute('cx', '0');\n outer.setAttribute('cy', '0');\n outer.setAttribute('r', String(r + 3));\n outer.setAttribute('fill', '#07090E');\n outer.setAttribute('fill-opacity', '0.88');\n outer.setAttribute(\n 'stroke',\n state.interaction.isHovered || state.interaction.isHighlighted\n ? '#f8fafc'\n : visual.colorHex,\n );\n outer.setAttribute('stroke-width', state.interaction.isHovered ? '2.4' : '1.6');\n outer.setAttribute('stroke-dasharray', '4 2.5');\n groupEl.appendChild(outer);\n\n const inner = doc.createElementNS(SVG_NS, 'circle');\n inner.setAttribute('cx', '0');\n inner.setAttribute('cy', '0');\n inner.setAttribute('r', String(r - 2));\n inner.setAttribute('fill', visual.colorHex);\n inner.setAttribute('fill-opacity', '0.18');\n inner.setAttribute('stroke', visual.colorHex);\n inner.setAttribute('stroke-width', '1.4');\n groupEl.appendChild(inner);\n\n const codeEl = doc.createElementNS(SVG_NS, 'text');\n codeEl.setAttribute('x', '0');\n codeEl.setAttribute('y', '-2');\n codeEl.setAttribute('text-anchor', 'middle');\n codeEl.setAttribute('fill', '#f8fafc');\n codeEl.setAttribute('font-size', '11');\n codeEl.setAttribute('font-weight', '600');\n codeEl.setAttribute('font-family', 'IBM Plex Mono, monospace');\n codeEl.textContent = visual.code;\n groupEl.appendChild(codeEl);\n\n const countEl = doc.createElementNS(SVG_NS, 'text');\n countEl.setAttribute('x', '0');\n countEl.setAttribute('y', '11');\n countEl.setAttribute('text-anchor', 'middle');\n countEl.setAttribute('fill', visual.colorHex);\n countEl.setAttribute('font-size', '9');\n countEl.setAttribute('font-family', 'IBM Plex Mono, monospace');\n countEl.textContent = `${visual.memberCount}n`;\n groupEl.appendChild(countEl);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hullMeasure.ts","../src/views/BadgeClusterSvgView.ts","../src/views/ClusterAnchorSvgView.ts","../src/views/GeometricShapeSvgView.ts","../src/views/MultiSectorGlyphSvgView.ts","../src/presets.ts","../src/SvgRendererAdapter.ts","../src/SimplexSvgController.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n rectToConvexPolygon,\n type ConvexGeometry,\n type NodeRenderState,\n} from '@simplex-viz/core';\nimport type { SvgNodeView } from './types';\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction estimateSvgFallbackBBox(group: SVGGElement): { width: number; height: number } {\n // Fallback for headless test environments where SVGElement.getBBox() returns 0x0\n let maxHalfW = 0;\n let maxHalfH = 0;\n const children = group.querySelectorAll('rect, circle, ellipse, text');\n children.forEach((el) => {\n const tag = el.tagName.toLowerCase();\n if (tag === 'rect') {\n const w = parseFloat(el.getAttribute('width') ?? '0');\n const h = parseFloat(el.getAttribute('height') ?? '0');\n const x = parseFloat(el.getAttribute('x') ?? String(-w / 2));\n const y = parseFloat(el.getAttribute('y') ?? String(-h / 2));\n maxHalfW = Math.max(maxHalfW, Math.abs(x), Math.abs(x + w), w / 2);\n maxHalfH = Math.max(maxHalfH, Math.abs(y), Math.abs(y + h), h / 2);\n } else if (tag === 'circle') {\n const r = parseFloat(el.getAttribute('r') ?? '0');\n const cx = parseFloat(el.getAttribute('cx') ?? '0');\n const cy = parseFloat(el.getAttribute('cy') ?? '0');\n maxHalfW = Math.max(maxHalfW, Math.abs(cx) + r);\n maxHalfH = Math.max(maxHalfH, Math.abs(cy) + r);\n } else if (tag === 'text') {\n const len = (el.textContent ?? '').length;\n const fs = parseFloat(el.getAttribute('font-size') ?? '11');\n const estW = Math.max(16, len * fs * 0.58);\n const estH = fs * 1.4;\n maxHalfW = Math.max(maxHalfW, estW / 2);\n maxHalfH = Math.max(maxHalfH, estH / 2);\n }\n });\n return {\n width: Math.max(20, maxHalfW * 2),\n height: Math.max(20, maxHalfH * 2),\n };\n}\n\n/**\n * Measures the unscaled convex collision hull for a visual descriptor using either\n * the view's analytical `measureConvexHull` or automatic offscreen `getBBox()` inspection.\n */\nexport function measureVisualWithSvgView<TVisual>(\n view: SvgNodeView<TVisual>,\n visual: TVisual,\n cacheKey: string,\n rootSvg: SVGSVGElement,\n measureBin: SVGGElement,\n cache: Map<string, ConvexGeometry>,\n): ConvexGeometry {\n const cached = cache.get(cacheKey);\n if (cached) return cached;\n\n let hull: ConvexGeometry;\n if (view.measureConvexHull) {\n hull = view.measureConvexHull(visual, rootSvg);\n } else {\n while (measureBin.firstChild) {\n measureBin.removeChild(measureBin.firstChild);\n }\n const probeGroup = rootSvg.ownerDocument.createElementNS(SVG_NS, 'g');\n measureBin.appendChild(probeGroup);\n\n const dummyHull: ConvexGeometry = { kind: 'circle', radius: 16 };\n const dummyState: NodeRenderState<TVisual> = {\n id: '__measure__',\n x: 0,\n y: 0,\n scale: 1,\n opacity: 1,\n visual,\n hull: dummyHull,\n cacheKey,\n interaction: {\n isHovered: false,\n isPinned: false,\n isDimmed: false,\n isHighlighted: false,\n },\n transition: null,\n };\n\n view.mountOrUpdate(probeGroup, visual, dummyState);\n\n let width = 0;\n let height = 0;\n try {\n if (typeof probeGroup.getBBox === 'function') {\n const bbox = probeGroup.getBBox();\n width = bbox.width;\n height = bbox.height;\n }\n } catch {\n // Ignore getBBox exceptions in detached DOM environments\n }\n\n if (width <= 1 || height <= 1) {\n const fallback = estimateSvgFallbackBBox(probeGroup);\n width = Math.max(width, fallback.width);\n height = Math.max(height, fallback.height);\n }\n\n hull = rectToConvexPolygon(width + 2, height + 2, 6);\n while (measureBin.firstChild) {\n measureBin.removeChild(measureBin.firstChild);\n }\n }\n\n cache.set(cacheKey, hull);\n return hull;\n}\n","import type { NodeRenderState } from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\n/**\n * Pure visual descriptor for `BadgeClusterSvgView`.\n * Intentionally omits analytical `measureConvexHull` so `@simplex-viz/svg`\n * exercises automatic offscreen `getBBox()` convex hull computation.\n */\nexport interface BadgeClusterVisual {\n readonly code: string;\n readonly title: string;\n readonly metaLine: string;\n readonly colorHex: string;\n readonly theme?: 'dark' | 'light';\n}\n\n/**\n * Pluggable SVG cluster view rendering a dynamic pill/rect badge whose width adapts\n * to its title and metadata, automatically measured via `getBBox()` for overlap-free layout.\n */\nexport class BadgeClusterSvgView implements SvgNodeView<BadgeClusterVisual> {\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: BadgeClusterVisual,\n state: NodeRenderState<BadgeClusterVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const isLight = visual.theme === 'light';\n const cardFill = isLight ? '#ffffff' : '#0d1320';\n const hoverStroke = isLight ? '#0f172a' : '#e2e8f0';\n const titleFill = isLight ? '#0f172a' : '#f1f5f9';\n const metaFill = isLight ? '#475569' : '#94a3b8';\n\n const titleLen = visual.title.length;\n const metaLen = visual.metaLine.length;\n const estWidth = Math.max(122, Math.max(titleLen * 6.8 + 44, metaLen * 5.9 + 24));\n const height = 42;\n const halfW = estWidth / 2;\n const halfH = height / 2;\n\n const bg = doc.createElementNS(SVG_NS, 'rect');\n bg.setAttribute('x', String(-halfW));\n bg.setAttribute('y', String(-halfH));\n bg.setAttribute('width', String(estWidth));\n bg.setAttribute('height', String(height));\n bg.setAttribute('rx', '8');\n bg.setAttribute('fill', cardFill);\n bg.setAttribute('fill-opacity', isLight ? '0.97' : '0.94');\n bg.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered || state.interaction.isHighlighted\n ? hoverStroke\n : visual.colorHex,\n );\n bg.setAttribute(\n 'stroke-width',\n state.interaction.isHovered || state.interaction.isHighlighted ? '2.2' : '1.4',\n );\n groupEl.appendChild(bg);\n\n // Subtle top accent dot inside badge\n const swatch = doc.createElementNS(SVG_NS, 'circle');\n swatch.setAttribute('cx', String(-halfW + 13));\n swatch.setAttribute('cy', String(-7));\n swatch.setAttribute('r', '4');\n swatch.setAttribute('fill', visual.colorHex);\n groupEl.appendChild(swatch);\n\n const codeText = doc.createElementNS(SVG_NS, 'text');\n codeText.setAttribute('x', String(-halfW + 22));\n codeText.setAttribute('y', String(-3));\n codeText.setAttribute('fill', isLight ? '#0f172a' : visual.colorHex);\n codeText.setAttribute('font-size', '10');\n codeText.setAttribute('font-weight', '600');\n codeText.setAttribute('font-family', 'IBM Plex Mono, monospace');\n codeText.textContent = visual.code;\n groupEl.appendChild(codeText);\n\n const titleText = doc.createElementNS(SVG_NS, 'text');\n titleText.setAttribute('x', String(-halfW + 44));\n titleText.setAttribute('y', String(-3));\n titleText.setAttribute('fill', titleFill);\n titleText.setAttribute('font-size', '11');\n titleText.setAttribute('font-weight', '600');\n titleText.setAttribute('font-family', 'Plus Jakarta Sans, sans-serif');\n titleText.textContent = visual.title;\n groupEl.appendChild(titleText);\n\n const subText = doc.createElementNS(SVG_NS, 'text');\n subText.setAttribute('x', '0');\n subText.setAttribute('y', '13');\n subText.setAttribute('text-anchor', 'middle');\n subText.setAttribute('fill', metaFill);\n subText.setAttribute('font-size', '9.5');\n subText.setAttribute('font-family', 'IBM Plex Mono, monospace');\n subText.textContent = visual.metaLine;\n groupEl.appendChild(subText);\n }\n}\n","import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\n/**\n * Pure visual descriptor for `ClusterAnchorSvgView`.\n */\nexport interface ClusterAnchorVisual {\n readonly code: string;\n readonly label: string;\n readonly memberCount: number;\n readonly colorHex: string;\n readonly radius: number;\n readonly theme?: 'dark' | 'light';\n}\n\n/**\n * Pluggable SVG cluster view rendering a calibrated double-ring geometric vertex anchor\n * displaying the cluster code and member count.\n */\nexport class ClusterAnchorSvgView implements SvgNodeView<ClusterAnchorVisual> {\n measureConvexHull(visual: ClusterAnchorVisual): ConvexGeometry {\n return { kind: 'circle', radius: visual.radius + 5 };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: ClusterAnchorVisual,\n state: NodeRenderState<ClusterAnchorVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const isLight = visual.theme === 'light';\n const outerFill = isLight ? '#ffffff' : '#07090E';\n const hoverStroke = isLight ? '#0f172a' : '#f8fafc';\n const codeFill = isLight ? '#0f172a' : '#f8fafc';\n\n const r = visual.radius;\n const outer = doc.createElementNS(SVG_NS, 'circle');\n outer.setAttribute('cx', '0');\n outer.setAttribute('cy', '0');\n outer.setAttribute('r', String(r + 3));\n outer.setAttribute('fill', outerFill);\n outer.setAttribute('fill-opacity', isLight ? '0.96' : '0.88');\n outer.setAttribute(\n 'stroke',\n state.interaction.isHovered || state.interaction.isHighlighted\n ? hoverStroke\n : visual.colorHex,\n );\n outer.setAttribute('stroke-width', state.interaction.isHovered ? '2.4' : '1.6');\n outer.setAttribute('stroke-dasharray', '4 2.5');\n groupEl.appendChild(outer);\n\n const inner = doc.createElementNS(SVG_NS, 'circle');\n inner.setAttribute('cx', '0');\n inner.setAttribute('cy', '0');\n inner.setAttribute('r', String(r - 2));\n inner.setAttribute('fill', visual.colorHex);\n inner.setAttribute('fill-opacity', isLight ? '0.14' : '0.18');\n inner.setAttribute('stroke', visual.colorHex);\n inner.setAttribute('stroke-width', '1.4');\n groupEl.appendChild(inner);\n\n const codeEl = doc.createElementNS(SVG_NS, 'text');\n codeEl.setAttribute('x', '0');\n codeEl.setAttribute('y', '-2');\n codeEl.setAttribute('text-anchor', 'middle');\n codeEl.setAttribute('fill', codeFill);\n codeEl.setAttribute('font-size', '11');\n codeEl.setAttribute('font-weight', '600');\n codeEl.setAttribute('font-family', 'IBM Plex Mono, monospace');\n codeEl.textContent = visual.code;\n groupEl.appendChild(codeEl);\n\n const countEl = doc.createElementNS(SVG_NS, 'text');\n countEl.setAttribute('x', '0');\n countEl.setAttribute('y', '11');\n countEl.setAttribute('text-anchor', 'middle');\n countEl.setAttribute('fill', isLight ? '#334155' : visual.colorHex);\n countEl.setAttribute('font-size', '9');\n countEl.setAttribute('font-weight', isLight ? '600' : '400');\n countEl.setAttribute('font-family', 'IBM Plex Mono, monospace');\n countEl.textContent = `${visual.memberCount}n`;\n groupEl.appendChild(countEl);\n }\n}\n","import {\n computeConvexHull,\n regularPolygon,\n starConvexHull,\n type ConvexGeometry,\n type NodeRenderState,\n type Point2D,\n} from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\nexport type GeometricShapeKind = 'circle' | 'diamond' | 'star' | 'hexagon';\n\n/**\n * Pure visual descriptor for `GeometricShapeSvgView`.\n */\nexport interface GeometricShapeVisual {\n readonly shape: GeometricShapeKind;\n readonly radius: number;\n readonly fillHex: string;\n readonly strokeHex?: string;\n readonly strokeWidth?: number;\n readonly label?: string;\n readonly theme?: 'dark' | 'light';\n}\n\nconst MORPH_SAMPLES = 64;\n\nfunction sampleShapePerimeter(\n shape: GeometricShapeKind,\n radius: number,\n): readonly Point2D[] {\n const r = Math.max(3, radius);\n const pts: Point2D[] = [];\n\n if (shape === 'circle') {\n for (let i = 0; i < MORPH_SAMPLES; i++) {\n const a = (i / MORPH_SAMPLES) * Math.PI * 2 - Math.PI / 2;\n pts.push({ x: Math.cos(a) * r, y: Math.sin(a) * r });\n }\n return pts;\n }\n\n // Construct polygon vertices then resample evenly along edges\n const polyVerts: Point2D[] = [];\n if (shape === 'diamond') {\n const d = r * 1.12;\n polyVerts.push(\n { x: 0, y: -d },\n { x: d * 0.88, y: 0 },\n { x: 0, y: d },\n { x: -d * 0.88, y: 0 },\n );\n } else if (shape === 'hexagon') {\n for (let i = 0; i < 6; i++) {\n const a = -Math.PI / 2 + (i * Math.PI * 2) / 6;\n polyVerts.push({ x: Math.cos(a) * r * 1.05, y: Math.sin(a) * r * 1.05 });\n }\n } else {\n // 5-point star (10 vertices alternating outer & inner)\n const outer = r * 1.24;\n const inner = r * 0.56;\n for (let i = 0; i < 10; i++) {\n const a = -Math.PI / 2 + (i * Math.PI) / 5;\n const rad = i % 2 === 0 ? outer : inner;\n polyVerts.push({ x: Math.cos(a) * rad, y: Math.sin(a) * rad });\n }\n }\n\n // Compute cumulative perimeter lengths\n const edgeLens: number[] = [];\n let totalLen = 0;\n for (let i = 0; i < polyVerts.length; i++) {\n const a = polyVerts[i]!;\n const b = polyVerts[(i + 1) % polyVerts.length]!;\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n edgeLens.push(len);\n totalLen += len;\n }\n\n for (let s = 0; s < MORPH_SAMPLES; s++) {\n const targetDist = (s / MORPH_SAMPLES) * totalLen;\n let accum = 0;\n for (let i = 0; i < polyVerts.length; i++) {\n const len = edgeLens[i]!;\n if (accum + len >= targetDist || i === polyVerts.length - 1) {\n const localT = len > 1e-6 ? (targetDist - accum) / len : 0;\n const a = polyVerts[i]!;\n const b = polyVerts[(i + 1) % polyVerts.length]!;\n pts.push({\n x: a.x + (b.x - a.x) * localT,\n y: a.y + (b.y - a.y) * localT,\n });\n break;\n }\n accum += len;\n }\n }\n\n return pts;\n}\n\nfunction pointsToSvgPath(pts: readonly Point2D[]): string {\n if (pts.length === 0) return '';\n let d = `M ${pts[0]!.x.toFixed(2)} ${pts[0]!.y.toFixed(2)}`;\n for (let i = 1; i < pts.length; i++) {\n const p = pts[i]!;\n d += ` L ${p.x.toFixed(2)} ${p.y.toFixed(2)}`;\n }\n return `${d} Z`;\n}\n\nfunction parseHexRgb(hex: string): readonly [number, number, number] {\n const clean = hex.startsWith('#') ? hex.slice(1) : hex;\n if (clean.length < 6) return [148, 163, 184];\n return [\n parseInt(clean.slice(0, 2), 16) || 0,\n parseInt(clean.slice(2, 4), 16) || 0,\n parseInt(clean.slice(4, 6), 16) || 0,\n ];\n}\n\nfunction lerpHex(fromHex: string, toHex: string, t: number): string {\n const a = parseHexRgb(fromHex);\n const b = parseHexRgb(toHex);\n const r = Math.round(a[0] + (b[0] - a[0]) * t);\n const g = Math.round(a[1] + (b[1] - a[1]) * t);\n const bl = Math.round(a[2] + (b[2] - a[2]) * t);\n return `rgb(${r}, ${g}, ${bl})`;\n}\n\n/**\n * Pluggable SVG node view rendering geometric shapes (`circle`, `diamond`, `star`, `hexagon`)\n * with analytical convex hulls and 64-point parametric SVG path morphing!\n */\nexport class GeometricShapeSvgView implements SvgNodeView<GeometricShapeVisual> {\n measureConvexHull(visual: GeometricShapeVisual): ConvexGeometry {\n const r = visual.radius + (visual.strokeWidth ?? 1.5);\n if (visual.shape === 'circle') {\n return { kind: 'circle', radius: r };\n }\n if (visual.shape === 'diamond') {\n const d = r * 1.12;\n return {\n kind: 'polygon',\n vertices: computeConvexHull([\n { x: 0, y: -d },\n { x: d * 0.88, y: 0 },\n { x: 0, y: d },\n { x: -d * 0.88, y: 0 },\n ]),\n };\n }\n if (visual.shape === 'hexagon') {\n return regularPolygon(6, r * 1.05);\n }\n return starConvexHull(5, r * 1.24);\n }\n\n private ensureElements(groupEl: SVGGElement): {\n pathEl: SVGPathElement;\n ringEl: SVGPathElement;\n } {\n let pathEl = groupEl.querySelector<SVGPathElement>('path.sv-geom-shape');\n let ringEl = groupEl.querySelector<SVGPathElement>('path.sv-geom-ring');\n if (!pathEl || !ringEl) {\n while (groupEl.firstChild) groupEl.removeChild(groupEl.firstChild);\n const doc = groupEl.ownerDocument;\n ringEl = doc.createElementNS(SVG_NS, 'path');\n ringEl.setAttribute('class', 'sv-geom-ring');\n ringEl.setAttribute('fill', 'none');\n pathEl = doc.createElementNS(SVG_NS, 'path');\n pathEl.setAttribute('class', 'sv-geom-shape');\n groupEl.appendChild(ringEl);\n groupEl.appendChild(pathEl);\n }\n return { pathEl, ringEl };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: GeometricShapeVisual,\n state: NodeRenderState<GeometricShapeVisual>,\n ): void {\n const { pathEl, ringEl } = this.ensureElements(groupEl);\n const pts = sampleShapePerimeter(visual.shape, visual.radius);\n const d = pointsToSvgPath(pts);\n const isLight = visual.theme === 'light';\n const defaultStroke = isLight ? 'rgba(15, 23, 42, 0.25)' : 'rgba(15, 23, 42, 0.8)';\n const hoverStroke = isLight ? '#0f172a' : '#f8fafc';\n const accentRing = isLight ? '#0891b2' : '#22d3ee';\n\n pathEl.setAttribute('d', d);\n pathEl.setAttribute('fill', visual.fillHex);\n pathEl.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered\n ? hoverStroke\n : (visual.strokeHex ?? defaultStroke),\n );\n pathEl.setAttribute(\n 'stroke-width',\n String(state.interaction.isHovered || state.interaction.isPinned ? 2.2 : (visual.strokeWidth ?? 1.4)),\n );\n\n if (state.interaction.isHovered || state.interaction.isPinned || state.interaction.isHighlighted) {\n const outerPts = sampleShapePerimeter(visual.shape, visual.radius + 4.5);\n ringEl.setAttribute('d', pointsToSvgPath(outerPts));\n ringEl.setAttribute('stroke', state.interaction.isPinned ? '#f59e0b' : accentRing);\n ringEl.setAttribute('stroke-width', '1.4');\n ringEl.setAttribute('stroke-opacity', '0.9');\n } else {\n ringEl.setAttribute('d', '');\n }\n }\n\n morph(\n groupEl: SVGGElement,\n from: GeometricShapeVisual,\n to: GeometricShapeVisual,\n progress: number,\n state: NodeRenderState<GeometricShapeVisual>,\n ): boolean {\n const { pathEl, ringEl } = this.ensureElements(groupEl);\n const ptsA = sampleShapePerimeter(from.shape, from.radius);\n const ptsB = sampleShapePerimeter(to.shape, to.radius);\n const morphed: Point2D[] = [];\n for (let i = 0; i < MORPH_SAMPLES; i++) {\n const a = ptsA[i]!;\n const b = ptsB[i]!;\n morphed.push({\n x: a.x + (b.x - a.x) * progress,\n y: a.y + (b.y - a.y) * progress,\n });\n }\n const isLight = to.theme === 'light';\n pathEl.setAttribute('d', pointsToSvgPath(morphed));\n pathEl.setAttribute('fill', lerpHex(from.fillHex, to.fillHex, progress));\n pathEl.setAttribute(\n 'stroke',\n state.interaction.isHovered\n ? (isLight ? '#0f172a' : '#f8fafc')\n : (to.strokeHex ?? (isLight ? 'rgba(15, 23, 42, 0.25)' : 'rgba(15, 23, 42, 0.8)')),\n );\n pathEl.setAttribute('stroke-width', String(to.strokeWidth ?? 1.4));\n ringEl.setAttribute('d', '');\n return true;\n }\n}\n","import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\nexport interface TopicSectorSlice {\n readonly colorHex: string;\n readonly weight: number;\n}\n\n/**\n * Pure visual descriptor for `MultiSectorGlyphSvgView`.\n */\nexport interface MultiSectorGlyphVisual {\n readonly outerRadius: number;\n readonly innerRadius: number;\n readonly sectors: readonly TopicSectorSlice[];\n readonly centerColorHex: string;\n readonly accentRingHex?: string;\n readonly theme?: 'dark' | 'light';\n}\n\nfunction describeDonutSectorPath(\n innerR: number,\n outerR: number,\n startAngle: number,\n endAngle: number,\n): string {\n const sweep = endAngle - startAngle;\n if (sweep >= Math.PI * 2 - 1e-4) {\n // Full ring via two half-arcs\n return [\n `M ${outerR} 0`,\n `A ${outerR} ${outerR} 0 1 0 ${-outerR} 0`,\n `A ${outerR} ${outerR} 0 1 0 ${outerR} 0`,\n `M ${innerR} 0`,\n `A ${innerR} ${innerR} 0 1 1 ${-innerR} 0`,\n `A ${innerR} ${innerR} 0 1 1 ${innerR} 0`,\n 'Z',\n ].join(' ');\n }\n const largeArc = sweep > Math.PI ? 1 : 0;\n const x1o = Math.cos(startAngle) * outerR;\n const y1o = Math.sin(startAngle) * outerR;\n const x2o = Math.cos(endAngle) * outerR;\n const y2o = Math.sin(endAngle) * outerR;\n\n const x1i = Math.cos(endAngle) * innerR;\n const y1i = Math.sin(endAngle) * innerR;\n const x2i = Math.cos(startAngle) * innerR;\n const y2i = Math.sin(startAngle) * innerR;\n\n return [\n `M ${x1o.toFixed(2)} ${y1o.toFixed(2)}`,\n `A ${outerR.toFixed(2)} ${outerR.toFixed(2)} 0 ${largeArc} 1 ${x2o.toFixed(2)} ${y2o.toFixed(2)}`,\n `L ${x1i.toFixed(2)} ${y1i.toFixed(2)}`,\n `A ${innerR.toFixed(2)} ${innerR.toFixed(2)} 0 ${largeArc} 0 ${x2i.toFixed(2)} ${y2i.toFixed(2)}`,\n 'Z',\n ].join(' ');\n}\n\n/**\n * Pluggable SVG node view rendering multi-color topic-weight donut sectors\n * representing each item's exact barycentric weights `\\tilde{w}_{ik}`.\n */\nexport class MultiSectorGlyphSvgView implements SvgNodeView<MultiSectorGlyphVisual> {\n measureConvexHull(visual: MultiSectorGlyphVisual): ConvexGeometry {\n return { kind: 'circle', radius: visual.outerRadius + 2 };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: MultiSectorGlyphVisual,\n state: NodeRenderState<MultiSectorGlyphVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const isLight = visual.theme === 'light';\n const dividerStroke = isLight ? '#ffffff' : '#07090E';\n const hoverStroke = isLight ? '#0f172a' : '#f8fafc';\n const defaultAccent = isLight ? '#0891b2' : '#22d3ee';\n\n const totalWeight = visual.sectors.reduce((s, sec) => s + Math.max(0, sec.weight), 0) || 1;\n let angle = -Math.PI / 2;\n\n for (const sec of visual.sectors) {\n const frac = Math.max(0, sec.weight) / totalWeight;\n if (frac <= 0.005) continue;\n const nextAngle = angle + frac * Math.PI * 2;\n const path = doc.createElementNS(SVG_NS, 'path');\n path.setAttribute(\n 'd',\n describeDonutSectorPath(visual.innerRadius, visual.outerRadius, angle, nextAngle),\n );\n path.setAttribute('fill', sec.colorHex);\n path.setAttribute('stroke', dividerStroke);\n path.setAttribute('stroke-width', visual.sectors.length > 1 ? '1.1' : '0.8');\n groupEl.appendChild(path);\n angle = nextAngle;\n }\n\n const core = doc.createElementNS(SVG_NS, 'circle');\n core.setAttribute('cx', '0');\n core.setAttribute('cy', '0');\n core.setAttribute('r', String(Math.max(2, visual.innerRadius - 1)));\n core.setAttribute('fill', visual.centerColorHex);\n groupEl.appendChild(core);\n\n if (\n visual.accentRingHex ||\n state.interaction.isHovered ||\n state.interaction.isPinned ||\n state.interaction.isHighlighted\n ) {\n const ring = doc.createElementNS(SVG_NS, 'circle');\n ring.setAttribute('cx', '0');\n ring.setAttribute('cy', '0');\n ring.setAttribute('r', String(visual.outerRadius + 3));\n ring.setAttribute('fill', 'none');\n ring.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered\n ? hoverStroke\n : (visual.accentRingHex ?? defaultAccent),\n );\n ring.setAttribute('stroke-width', state.interaction.isHovered ? '2' : '1.2');\n groupEl.appendChild(ring);\n }\n }\n}\n","import type {\n ClusterDescriptor,\n ContentLayoutContext,\n DefaultTaggedItem,\n VisualResolver,\n} from '@simplex-viz/core';\nimport type { SvgNodeView } from './types';\nimport {\n BadgeClusterSvgView,\n type BadgeClusterVisual,\n} from './views/BadgeClusterSvgView';\nimport {\n ClusterAnchorSvgView,\n type ClusterAnchorVisual,\n} from './views/ClusterAnchorSvgView';\nimport {\n GeometricShapeSvgView,\n type GeometricShapeVisual,\n} from './views/GeometricShapeSvgView';\nimport {\n MultiSectorGlyphSvgView,\n type MultiSectorGlyphVisual,\n} from './views/MultiSectorGlyphSvgView';\n\n/**\n * Built-in visual presets for zero-config usage of `@simplex-viz/svg` and `@simplex-viz/react`.\n *\n * - `'geometric'`: OKLab-tinted shapes (`circle` / `diamond` / `star` by simplex rank) + double-ring `ClusterAnchorSvgView`.\n * - `'glyphs'`: Proportional `MultiSectorGlyphSvgView` barycentric donuts + `ClusterAnchorSvgView`.\n * - `'badges'`: OKLab geometric shapes + adaptive `BadgeClusterSvgView` cards auto-measured via `getBBox()`.\n */\nexport type SimplexVisualPreset = 'geometric' | 'glyphs' | 'badges';\n\nexport type SimplexTheme = 'dark' | 'light';\n\n/**\n * Union of built-in content visual descriptors used by presets.\n */\nexport type DefaultContentPresetVisual = GeometricShapeVisual | MultiSectorGlyphVisual;\n\n/**\n * Union of built-in cluster visual descriptors used by presets.\n */\nexport type DefaultClusterPresetVisual = ClusterAnchorVisual | BadgeClusterVisual;\n\n/**\n * Safely extracts a human-readable label from an arbitrary domain item for presets and tooltips.\n */\nexport function extractDefaultItemLabel<TItem>(\n item: TItem,\n fallbackId: string,\n getLabel?: (item: TItem) => string,\n): string {\n if (getLabel) {\n const custom = getLabel(item);\n if (custom.length > 0) return custom;\n }\n if (typeof item === 'object' && item !== null) {\n if ('label' in item && typeof item.label === 'string' && item.label.length > 0) {\n return item.label;\n }\n if ('title' in item && typeof item.title === 'string' && item.title.length > 0) {\n return item.title;\n }\n if ('headline' in item && typeof item.headline === 'string' && item.headline.length > 0) {\n return item.headline;\n }\n if ('name' in item && typeof item.name === 'string' && item.name.length > 0) {\n return item.name;\n }\n }\n return fallbackId;\n}\n\n/**\n * Creates the matching `SvgNodeView` pair for a given built-in preset.\n */\nexport function createPresetViews(preset: SimplexVisualPreset): {\n readonly contentView: SvgNodeView<DefaultContentPresetVisual>;\n readonly clusterView: SvgNodeView<DefaultClusterPresetVisual>;\n} {\n const contentView = (\n preset === 'glyphs'\n ? new MultiSectorGlyphSvgView()\n : new GeometricShapeSvgView()\n ) as unknown as SvgNodeView<DefaultContentPresetVisual>;\n\n const clusterView = (\n preset === 'badges'\n ? new BadgeClusterSvgView()\n : new ClusterAnchorSvgView()\n ) as unknown as SvgNodeView<DefaultClusterPresetVisual>;\n\n return { contentView, clusterView };\n}\n\n/**\n * Creates a default `VisualResolver` matching the selected built-in preset.\n */\nexport function createPresetVisualResolver<\n TItem = DefaultTaggedItem,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n>(\n preset: SimplexVisualPreset,\n getLabel?: (item: TItem) => string,\n theme: SimplexTheme = 'dark',\n): VisualResolver<\n TItem,\n DefaultContentPresetVisual,\n DefaultClusterPresetVisual,\n TTagMeta,\n TClusterMeta\n> {\n return {\n resolveContentVisual: (\n item: TItem,\n ctx: ContentLayoutContext<TItem, TTagMeta, TClusterMeta>,\n ): DefaultContentPresetVisual => {\n if (preset === 'glyphs') {\n return {\n outerRadius: 11.5,\n innerRadius: 4.5,\n sectors: ctx.unitClusters.map((uc) => ({\n colorHex: uc.cluster.colorHex,\n weight: uc.weight,\n })),\n centerColorHex: ctx.mixedColorHex,\n theme,\n };\n }\n const rank = ctx.unitClusters.length;\n return {\n shape: rank >= 3 ? 'star' : rank === 2 ? 'diamond' : 'circle',\n radius: 9.5,\n fillHex: ctx.mixedColorHex,\n strokeHex: theme === 'light' ? '#ffffff' : '#07090E',\n strokeWidth: 1.4,\n label: extractDefaultItemLabel(item, ctx.id, getLabel),\n theme,\n };\n },\n resolveClusterVisual: (\n cluster: ClusterDescriptor<TItem, TTagMeta, TClusterMeta>,\n ): DefaultClusterPresetVisual => {\n if (preset === 'badges') {\n const count = cluster.members.length;\n return {\n code: cluster.code,\n title: cluster.defaultLabel,\n metaLine: `${count} ${count === 1 ? 'item' : 'items'}`,\n colorHex: cluster.colorHex,\n theme,\n };\n }\n return {\n code: cluster.code,\n label: cluster.defaultLabel,\n memberCount: cluster.members.length,\n colorHex: cluster.colorHex,\n radius: 22,\n theme,\n };\n },\n getVisualCacheKey: (\n visual: DefaultContentPresetVisual | DefaultClusterPresetVisual,\n ): string => {\n const t = visual.theme ?? 'dark';\n if ('sectors' in visual) {\n const secKey = visual.sectors.map((s) => `${s.colorHex}:${s.weight.toFixed(2)}`).join('|');\n return `glyph:${t}:${visual.outerRadius}:${visual.centerColorHex}:${secKey}`;\n }\n if ('shape' in visual) {\n return `geom:${t}:${visual.shape}:${visual.radius}:${visual.fillHex}`;\n }\n if ('metaLine' in visual) {\n return `badge:${t}:${visual.code}:${visual.title}:${visual.metaLine}:${visual.colorHex}`;\n }\n return `anchor:${t}:${visual.code}:${visual.memberCount}:${visual.colorHex}`;\n },\n };\n}\n","import {\n getHullBoundingRadius,\n type ConvexGeometry,\n type NodeRenderState,\n type SceneFrameSnapshot,\n type SimplexRendererAdapter,\n} from '@simplex-viz/core';\nimport { measureVisualWithSvgView, SVG_NS } from './hullMeasure';\nimport type { SvgNodeView } from './types';\n\nexport interface SvgRendererOptions<TContentVisual, TClusterVisual> {\n readonly contentView: SvgNodeView<TContentVisual>;\n readonly clusterView: SvgNodeView<TClusterVisual>;\n}\n\ninterface TrackedNodeDom<TVisual> {\n readonly rootGroup: SVGGElement;\n mainLayer: SVGGElement | null;\n fromLayer: SVGGElement | null;\n toLayer: SVGGElement | null;\n lastMainKey: string | null;\n lastFromKey: string | null;\n lastToKey: string | null;\n lastInteractionSig: string | null;\n lastMorphUsed: boolean;\n /** Keep view reference per cacheKey so cross-preset transitions crossfade smoothly. */\n lastView?: SvgNodeView<TVisual>;\n}\n\nfunction interactionSignature<TVisual>(state: NodeRenderState<TVisual>): string {\n const { isHovered, isPinned, isDimmed, isHighlighted } = state.interaction;\n return `${isHovered ? 1 : 0}${isPinned ? 1 : 0}${isDimmed ? 1 : 0}${isHighlighted ? 1 : 0}`;\n}\n\n/**\n * Framework-agnostic SVG scene-graph renderer implementing `SimplexRendererAdapter`.\n *\n * Performs keyed `<g>` reconciliation, direct 60fps `transform`/`opacity` attribute updates,\n * automatic offscreen `getBBox()` convex hull measurement, and universal Dual-Layer Crossfade\n * (or optional parametric `morph()` when supported by the active `SvgNodeView`).\n */\nexport class SvgRendererAdapter<TContentVisual, TClusterVisual>\n implements SimplexRendererAdapter<TContentVisual, TClusterVisual>\n{\n private readonly svgEl: SVGSVGElement;\n private readonly doc: Document;\n private readonly worldGroup: SVGGElement;\n private readonly trianglesGroup: SVGGElement;\n private readonly edgesGroup: SVGGElement;\n private readonly clustersGroup: SVGGElement;\n private readonly itemsGroup: SVGGElement;\n private readonly hullsGroup: SVGGElement;\n private readonly measureBin: SVGGElement;\n\n private contentView: SvgNodeView<TContentVisual>;\n private clusterView: SvgNodeView<TClusterVisual>;\n\n private readonly contentHullCache = new Map<string, ConvexGeometry>();\n private readonly clusterHullCache = new Map<string, ConvexGeometry>();\n private readonly contentViewByKey = new Map<string, SvgNodeView<TContentVisual>>();\n private readonly clusterViewByKey = new Map<string, SvgNodeView<TClusterVisual>>();\n\n private readonly clusterDomMap = new Map<string, TrackedNodeDom<TClusterVisual>>();\n private readonly itemDomMap = new Map<string, TrackedNodeDom<TContentVisual>>();\n private readonly trianglePolygons: SVGPolygonElement[] = [];\n private readonly edgeLines: SVGLineElement[] = [];\n\n constructor(\n svgEl: SVGSVGElement,\n options: SvgRendererOptions<TContentVisual, TClusterVisual>,\n ) {\n this.svgEl = svgEl;\n this.doc = svgEl.ownerDocument;\n this.contentView = options.contentView;\n this.clusterView = options.clusterView;\n\n while (this.svgEl.firstChild) {\n this.svgEl.removeChild(this.svgEl.firstChild);\n }\n\n this.worldGroup = this.createGroup('sv-world');\n this.trianglesGroup = this.createGroup('sv-mesh-triangles');\n this.edgesGroup = this.createGroup('sv-mesh-edges');\n this.clustersGroup = this.createGroup('sv-clusters');\n this.itemsGroup = this.createGroup('sv-items');\n this.hullsGroup = this.createGroup('sv-hull-overlay');\n this.hullsGroup.setAttribute('pointer-events', 'none');\n\n this.worldGroup.appendChild(this.trianglesGroup);\n this.worldGroup.appendChild(this.edgesGroup);\n this.worldGroup.appendChild(this.clustersGroup);\n this.worldGroup.appendChild(this.itemsGroup);\n this.worldGroup.appendChild(this.hullsGroup);\n\n this.measureBin = this.createGroup('sv-measure-bin');\n this.measureBin.setAttribute('visibility', 'hidden');\n this.measureBin.setAttribute('pointer-events', 'none');\n this.measureBin.setAttribute('transform', 'translate(-99999, -99999)');\n\n this.svgEl.appendChild(this.worldGroup);\n this.svgEl.appendChild(this.measureBin);\n }\n\n private createGroup(className: string): SVGGElement {\n const g = this.doc.createElementNS(SVG_NS, 'g');\n g.setAttribute('class', className);\n return g;\n }\n\n /**\n * Swaps active content and/or cluster `SvgNodeView` plugins at runtime and invalidates\n * hull caches so the engine re-measures and smoothly crossfades into the new views.\n */\n setViews(\n views: Partial<SvgRendererOptions<TContentVisual, TClusterVisual>>,\n ): void {\n if (views.contentView && views.contentView !== this.contentView) {\n this.contentView = views.contentView;\n this.contentHullCache.clear();\n }\n if (views.clusterView && views.clusterView !== this.clusterView) {\n this.clusterView = views.clusterView;\n this.clusterHullCache.clear();\n }\n }\n\n measureContentHull(visual: TContentVisual, cacheKey: string): ConvexGeometry {\n this.contentViewByKey.set(cacheKey, this.contentView);\n return measureVisualWithSvgView(\n this.contentView,\n visual,\n cacheKey,\n this.svgEl,\n this.measureBin,\n this.contentHullCache,\n );\n }\n\n measureClusterHull(visual: TClusterVisual, cacheKey: string): ConvexGeometry {\n this.clusterViewByKey.set(cacheKey, this.clusterView);\n return measureVisualWithSvgView(\n this.clusterView,\n visual,\n cacheKey,\n this.svgEl,\n this.measureBin,\n this.clusterHullCache,\n );\n }\n\n renderFrame(snapshot: SceneFrameSnapshot<TContentVisual, TClusterVisual>): void {\n this.svgEl.setAttribute(\n 'viewBox',\n `0 0 ${snapshot.viewportWidth} ${snapshot.viewportHeight}`,\n );\n this.worldGroup.setAttribute(\n 'transform',\n `translate(${snapshot.camera.panX.toFixed(2)}, ${snapshot.camera.panY.toFixed(2)}) scale(${snapshot.camera.zoom.toFixed(4)})`,\n );\n\n // 1. Mesh triangles\n while (this.trianglePolygons.length < snapshot.triangles.length) {\n const poly = this.doc.createElementNS(SVG_NS, 'polygon');\n this.trianglesGroup.appendChild(poly);\n this.trianglePolygons.push(poly);\n }\n while (this.trianglePolygons.length > snapshot.triangles.length) {\n const poly = this.trianglePolygons.pop();\n poly?.remove();\n }\n for (let i = 0; i < snapshot.triangles.length; i++) {\n const tr = snapshot.triangles[i]!;\n const poly = this.trianglePolygons[i]!;\n poly.setAttribute(\n 'points',\n tr.points.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' '),\n );\n poly.setAttribute('fill', tr.fillHex);\n poly.setAttribute('fill-opacity', String(tr.fillOpacity));\n }\n\n // 2. Mesh edges\n while (this.edgeLines.length < snapshot.edges.length) {\n const line = this.doc.createElementNS(SVG_NS, 'line');\n line.setAttribute('stroke', 'rgba(100, 116, 139, 0.26)');\n line.setAttribute('stroke-width', '1');\n line.setAttribute('stroke-dasharray', '3 4');\n this.edgesGroup.appendChild(line);\n this.edgeLines.push(line);\n }\n while (this.edgeLines.length > snapshot.edges.length) {\n const line = this.edgeLines.pop();\n line?.remove();\n }\n for (let i = 0; i < snapshot.edges.length; i++) {\n const edge = snapshot.edges[i]!;\n const line = this.edgeLines[i]!;\n line.setAttribute('x1', edge.a.x.toFixed(1));\n line.setAttribute('y1', edge.a.y.toFixed(1));\n line.setAttribute('x2', edge.b.x.toFixed(1));\n line.setAttribute('y2', edge.b.y.toFixed(1));\n }\n\n // 3. Reconcile Clusters & Content Items\n this.reconcileNodes(\n snapshot.clusters,\n this.clustersGroup,\n this.clusterDomMap,\n this.clusterView,\n this.clusterViewByKey,\n 'cluster',\n );\n this.reconcileNodes(\n snapshot.items,\n this.itemsGroup,\n this.itemDomMap,\n this.contentView,\n this.contentViewByKey,\n 'item',\n );\n\n // 4. Optional Convex Hull Debug Overlay\n this.renderHullOverlay(snapshot);\n }\n\n private reconcileNodes<TVisual>(\n nodes: readonly NodeRenderState<TVisual>[],\n parentGroup: SVGGElement,\n domMap: Map<string, TrackedNodeDom<TVisual>>,\n activeView: SvgNodeView<TVisual>,\n viewByKey: Map<string, SvgNodeView<TVisual>>,\n kind: 'cluster' | 'item',\n ): void {\n const aliveIds = new Set<string>();\n\n for (const node of nodes) {\n aliveIds.add(node.id);\n let tracked = domMap.get(node.id);\n if (!tracked) {\n const rootGroup = this.doc.createElementNS(SVG_NS, 'g');\n rootGroup.setAttribute('class', `sv-node sv-node-${kind}`);\n rootGroup.setAttribute('data-node-id', node.id);\n parentGroup.appendChild(rootGroup);\n tracked = {\n rootGroup,\n mainLayer: null,\n fromLayer: null,\n toLayer: null,\n lastMainKey: null,\n lastFromKey: null,\n lastToKey: null,\n lastInteractionSig: null,\n lastMorphUsed: false,\n };\n domMap.set(node.id, tracked);\n }\n\n const effectiveOpacity = node.interaction.isDimmed\n ? node.opacity * 0.24\n : node.opacity;\n tracked.rootGroup.setAttribute(\n 'transform',\n `translate(${node.x.toFixed(2)}, ${node.y.toFixed(2)}) scale(${node.scale.toFixed(4)})`,\n );\n tracked.rootGroup.setAttribute('opacity', effectiveOpacity.toFixed(3));\n\n const interSig = interactionSignature(node);\n const interactionChanged = tracked.lastInteractionSig !== interSig;\n\n if (node.transition) {\n const tr = node.transition;\n const fromView = viewByKey.get(tr.fromCacheKey) ?? tracked.lastView ?? activeView;\n const toView = viewByKey.get(tr.toCacheKey) ?? activeView;\n\n // Specialized parametric morph if both endpoints belong to the same morph-capable view\n if (fromView === toView && toView.morph) {\n if (!tracked.mainLayer) {\n tracked.mainLayer = this.createGroup('sv-layer-main');\n tracked.rootGroup.appendChild(tracked.mainLayer);\n }\n if (tracked.fromLayer) {\n tracked.fromLayer.remove();\n tracked.fromLayer = null;\n }\n if (tracked.toLayer) {\n tracked.toLayer.remove();\n tracked.toLayer = null;\n }\n const handled = toView.morph(\n tracked.mainLayer,\n tr.from,\n tr.to,\n tr.progress,\n node,\n );\n if (handled) {\n tracked.lastMorphUsed = true;\n tracked.lastMainKey = null;\n tracked.lastInteractionSig = interSig;\n tracked.lastView = toView;\n continue;\n }\n }\n\n // Universal Dual-Layer Crossfade (max 2 child layers: layer-from + layer-to)\n tracked.lastMorphUsed = false;\n if (tracked.mainLayer) {\n tracked.mainLayer.remove();\n tracked.mainLayer = null;\n tracked.lastMainKey = null;\n }\n\n if (!tracked.fromLayer) {\n tracked.fromLayer = this.createGroup('sv-layer-from');\n tracked.rootGroup.appendChild(tracked.fromLayer);\n }\n if (!tracked.toLayer) {\n tracked.toLayer = this.createGroup('sv-layer-to');\n tracked.rootGroup.appendChild(tracked.toLayer);\n }\n\n if (tracked.lastFromKey !== tr.fromCacheKey || interactionChanged) {\n fromView.mountOrUpdate(tracked.fromLayer, tr.from, {\n ...node,\n visual: tr.from,\n hull: tr.fromHull,\n cacheKey: tr.fromCacheKey,\n });\n tracked.lastFromKey = tr.fromCacheKey;\n }\n\n if (tracked.lastToKey !== tr.toCacheKey || interactionChanged) {\n toView.mountOrUpdate(tracked.toLayer, tr.to, {\n ...node,\n visual: tr.to,\n hull: tr.toHull,\n cacheKey: tr.toCacheKey,\n });\n tracked.lastToKey = tr.toCacheKey;\n }\n\n // Proportional radius alignment during crossfade between disparate hull sizes\n const rFrom = Math.max(1, getHullBoundingRadius(tr.fromHull));\n const rTo = Math.max(1, getHullBoundingRadius(tr.toHull));\n const currentR = rFrom + (rTo - rFrom) * tr.progress;\n const fromSubScale = Math.max(0.4, Math.min(1.6, currentR / rFrom));\n const toSubScale = Math.max(0.4, Math.min(1.6, currentR / rTo));\n\n tracked.fromLayer.setAttribute('opacity', (1 - tr.progress).toFixed(3));\n tracked.fromLayer.setAttribute('transform', `scale(${fromSubScale.toFixed(4)})`);\n tracked.toLayer.setAttribute('opacity', tr.progress.toFixed(3));\n tracked.toLayer.setAttribute('transform', `scale(${toSubScale.toFixed(4)})`);\n\n tracked.lastInteractionSig = interSig;\n tracked.lastView = toView;\n } else {\n // Steady state (no active transition)\n if (tracked.fromLayer) {\n tracked.fromLayer.remove();\n tracked.fromLayer = null;\n tracked.lastFromKey = null;\n }\n if (tracked.toLayer) {\n // Promote toLayer directly into mainLayer without recreating DOM nodes\n if (tracked.mainLayer) tracked.mainLayer.remove();\n tracked.mainLayer = tracked.toLayer;\n tracked.mainLayer.setAttribute('class', 'sv-layer-main');\n tracked.mainLayer.removeAttribute('opacity');\n tracked.mainLayer.removeAttribute('transform');\n tracked.toLayer = null;\n tracked.lastMainKey = tracked.lastToKey;\n tracked.lastToKey = null;\n }\n if (!tracked.mainLayer) {\n tracked.mainLayer = this.createGroup('sv-layer-main');\n tracked.rootGroup.appendChild(tracked.mainLayer);\n }\n\n const viewToUse = viewByKey.get(node.cacheKey) ?? activeView;\n if (\n tracked.lastMainKey !== node.cacheKey ||\n interactionChanged ||\n tracked.lastMorphUsed ||\n tracked.lastView !== viewToUse\n ) {\n viewToUse.mountOrUpdate(tracked.mainLayer, node.visual, node);\n tracked.lastMainKey = node.cacheKey;\n tracked.lastInteractionSig = interSig;\n tracked.lastMorphUsed = false;\n tracked.lastView = viewToUse;\n }\n }\n }\n\n // Remove exited nodes\n for (const [id, tracked] of domMap) {\n if (!aliveIds.has(id)) {\n tracked.rootGroup.remove();\n domMap.delete(id);\n }\n }\n }\n\n private renderHullOverlay(\n snapshot: SceneFrameSnapshot<TContentVisual, TClusterVisual>,\n ): void {\n while (this.hullsGroup.firstChild) {\n this.hullsGroup.removeChild(this.hullsGroup.firstChild);\n }\n if (!snapshot.showHulls) return;\n\n const drawHull = <TVisual>(\n node: NodeRenderState<TVisual>,\n strokeColor: string,\n ) => {\n if (node.opacity < 0.05) return;\n const hull = node.hull;\n if (hull.kind === 'circle') {\n const circle = this.doc.createElementNS(SVG_NS, 'circle');\n circle.setAttribute('cx', node.x.toFixed(2));\n circle.setAttribute('cy', node.y.toFixed(2));\n circle.setAttribute('r', (hull.radius * node.scale).toFixed(2));\n circle.setAttribute('fill', strokeColor);\n circle.setAttribute('fill-opacity', '0.07');\n circle.setAttribute('stroke', strokeColor);\n circle.setAttribute('stroke-width', '1');\n circle.setAttribute('stroke-dasharray', '3 2');\n this.hullsGroup.appendChild(circle);\n } else if (hull.vertices.length >= 3) {\n const poly = this.doc.createElementNS(SVG_NS, 'polygon');\n poly.setAttribute(\n 'points',\n hull.vertices\n .map(\n (v) =>\n `${(node.x + v.x * node.scale).toFixed(2)},${(node.y + v.y * node.scale).toFixed(2)}`,\n )\n .join(' '),\n );\n poly.setAttribute('fill', strokeColor);\n poly.setAttribute('fill-opacity', '0.07');\n poly.setAttribute('stroke', strokeColor);\n poly.setAttribute('stroke-width', '1');\n poly.setAttribute('stroke-dasharray', '3 2');\n this.hullsGroup.appendChild(poly);\n }\n };\n\n for (const c of snapshot.clusters) {\n drawHull(c, '#f59e0b');\n }\n for (const it of snapshot.items) {\n drawHull(it, '#22d3ee');\n }\n }\n\n destroy(): void {\n this.clusterDomMap.clear();\n this.itemDomMap.clear();\n this.contentHullCache.clear();\n this.clusterHullCache.clear();\n this.contentViewByKey.clear();\n this.clusterViewByKey.clear();\n while (this.svgEl.firstChild) {\n this.svgEl.removeChild(this.svgEl.firstChild);\n }\n }\n}\n","import {\n SimplexGraphEngine,\n type CameraController,\n type ClusterDerivationContext,\n type ClusterDescriptor,\n type ClusterHoverEvent,\n type ClusterMetaConfig,\n type ContentHoverEvent,\n type DefaultTaggedItem,\n type InteractionHandlers,\n type ItemIdentityConfig,\n type LayoutMetrics,\n type LayoutSolverOptions,\n type MeshOptions,\n type VisualResolver,\n} from '@simplex-viz/core';\nimport { SVG_NS } from './hullMeasure';\nimport {\n createPresetViews,\n createPresetVisualResolver,\n extractDefaultItemLabel,\n type DefaultClusterPresetVisual,\n type DefaultContentPresetVisual,\n type SimplexTheme,\n type SimplexVisualPreset,\n} from './presets';\nimport { SvgRendererAdapter, type SvgRendererOptions } from './SvgRendererAdapter';\nimport type { SvgNodeView } from './types';\n\nexport type SimplexTooltipFormatter<\n TItem = DefaultTaggedItem,\n TContentVisual = DefaultContentPresetVisual,\n TClusterVisual = DefaultClusterPresetVisual,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n> = (\n target:\n | ({ readonly kind: 'content' } & ContentHoverEvent<\n TItem,\n TContentVisual,\n TTagMeta,\n TClusterMeta\n >)\n | ({ readonly kind: 'cluster' } & ClusterHoverEvent<\n TItem,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >),\n) => string;\n\nexport interface SimplexSvgControllerResolvedOptions<\n TItem = DefaultTaggedItem,\n TContentVisual = DefaultContentPresetVisual,\n TClusterVisual = DefaultClusterPresetVisual,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n> {\n readonly items: readonly TItem[];\n readonly getId?: (item: TItem) => string;\n readonly getTags?: (item: TItem) => readonly string[];\n readonly getLabel?: (item: TItem) => string;\n readonly deriveClusterMeta?: (\n ctx: ClusterDerivationContext<TItem, TTagMeta>,\n ) => TClusterMeta;\n /** Built-in visual preset used when `visualResolver` / views are omitted. Default: `'geometric'`. */\n readonly preset?: SimplexVisualPreset;\n /** Visual color theme (`'dark'` or `'light'`) for built-in presets and tooltips. Default: `'dark'`. */\n readonly theme?: SimplexTheme;\n /** Optional custom visual resolver (defaults to the active `preset` resolver). */\n readonly visualResolver?: VisualResolver<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >;\n /** Optional custom content `SvgNodeView` (defaults to the active `preset` view). */\n readonly contentView?: SvgRendererOptions<TContentVisual, TClusterVisual>['contentView'];\n /** Optional custom cluster `SvgNodeView` (defaults to the active `preset` view). */\n readonly clusterView?: SvgRendererOptions<TContentVisual, TClusterVisual>['clusterView'];\n readonly normalizeTag?: (rawTag: string) => string;\n readonly resolveTagMeta?: (normalizedTag: string) => TTagMeta | undefined;\n readonly meshOptions?: MeshOptions;\n readonly layoutOptions?: LayoutSolverOptions;\n readonly showHulls?: boolean;\n /**\n * Automatically toggles cluster focus when clicking a topic cluster (and clears on background click)\n * unless a custom `interactions.onLeftClick` handler is provided. Default: `true`.\n */\n readonly focusOnClusterClick?: boolean;\n /** Enables a built-in floating DOM hover tooltip (or supply a custom text formatter). Default: `false`. */\n readonly tooltip?:\n | boolean\n | SimplexTooltipFormatter<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>;\n readonly interactions?: InteractionHandlers<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >;\n readonly onMetricsChange?: (metrics: LayoutMetrics) => void;\n readonly onClustersChange?: (\n clusters: readonly ClusterDescriptor<TItem, TTagMeta, TClusterMeta>[],\n ) => void;\n readonly onFpsUpdate?: (fps: number) => void;\n}\n\nexport type SimplexSvgControllerOptions<\n TItem = DefaultTaggedItem,\n TContentVisual = DefaultContentPresetVisual,\n TClusterVisual = DefaultClusterPresetVisual,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n> = ItemIdentityConfig<TItem> &\n ClusterMetaConfig<TItem, TTagMeta, TClusterMeta> &\n Omit<\n SimplexSvgControllerResolvedOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n 'getId' | 'getTags' | 'deriveClusterMeta'\n >;\n\nfunction resolveContainerElement(target: HTMLElement | string): HTMLElement {\n if (typeof target !== 'string') {\n return target;\n }\n if (typeof document === 'undefined') {\n throw new Error(\n `SimplexSvgController: cannot resolve selector \"${target}\" outside a DOM environment.`,\n );\n }\n const el = document.querySelector<HTMLElement>(target);\n if (!el) {\n throw new Error(\n `SimplexSvgController: no element matched container selector \"${target}\".`,\n );\n }\n return el;\n}\n\n/**\n * High-level framework-agnostic SVG graph controller for Vanilla TypeScript, Vue, Angular,\n * Svelte, Web Components, and `@simplex-viz/react`.\n *\n * Works zero-config with `{ items }` via built-in presets, default zoom/pan/focus interactions,\n * and optional tooltips, while remaining 100% customizable through `VisualResolver` and `SvgNodeView`.\n */\nexport class SimplexSvgController<\n TItem = DefaultTaggedItem,\n TContentVisual = DefaultContentPresetVisual,\n TClusterVisual = DefaultClusterPresetVisual,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n> {\n private readonly containerEl: HTMLElement;\n private readonly svgEl: SVGSVGElement;\n private readonly adapter: SvgRendererAdapter<TContentVisual, TClusterVisual>;\n private readonly engine: SimplexGraphEngine<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >;\n private readonly resizeObserver: ResizeObserver | null = null;\n private readonly onFpsUpdate?: (fps: number) => void;\n private readonly focusOnClusterClick: boolean;\n private readonly getIdExtractor: (item: TItem) => string;\n private getLabelExtractor?: (item: TItem) => string;\n private tooltipOption:\n | boolean\n | SimplexTooltipFormatter<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>;\n private tooltipEl: HTMLDivElement | null = null;\n private focusedClusterUidState: string | null = null;\n private currentPreset: SimplexVisualPreset;\n private currentTheme: SimplexTheme;\n private readonly usesCustomVisualResolver: boolean;\n\n private rafId: number | null = null;\n private lastFrameTs = 0;\n private fpsSamples = 0;\n private fpsAccumMs = 0;\n private destroyed = false;\n\n // Centralized drag-to-pan state on root <svg>\n private isDraggingPan = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragMoved = false;\n\n constructor(\n containerEl: HTMLElement | string,\n options: SimplexSvgControllerOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n );\n constructor(\n containerEl: HTMLElement | string,\n options: SimplexSvgControllerResolvedOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ) {\n this.containerEl = resolveContainerElement(containerEl);\n this.onFpsUpdate = options.onFpsUpdate;\n this.focusOnClusterClick = options.focusOnClusterClick ?? true;\n this.getLabelExtractor = options.getLabel;\n this.tooltipOption = options.tooltip ?? false;\n this.getIdExtractor =\n options.getId ??\n ((item: TItem) =>\n typeof item === 'object' && item !== null && 'id' in item\n ? String((item as { readonly id: unknown }).id)\n : '');\n\n this.currentPreset = options.preset ?? 'geometric';\n this.currentTheme = options.theme ?? 'dark';\n this.usesCustomVisualResolver = options.visualResolver !== undefined;\n const presetViews = createPresetViews(this.currentPreset);\n const contentView = (options.contentView ??\n presetViews.contentView) as SvgNodeView<TContentVisual>;\n const clusterView = (options.clusterView ??\n presetViews.clusterView) as SvgNodeView<TClusterVisual>;\n const visualResolver = (options.visualResolver ??\n createPresetVisualResolver<TItem, TTagMeta, TClusterMeta>(\n this.currentPreset,\n this.getLabelExtractor,\n this.currentTheme,\n )) as VisualResolver<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >;\n\n const doc = this.containerEl.ownerDocument;\n this.svgEl = doc.createElementNS(SVG_NS, 'svg');\n this.svgEl.setAttribute('width', '100%');\n this.svgEl.setAttribute('height', '100%');\n this.svgEl.style.display = 'block';\n this.svgEl.style.touchAction = 'none';\n this.svgEl.style.userSelect = 'none';\n this.containerEl.appendChild(this.svgEl);\n\n const rect = this.containerEl.getBoundingClientRect();\n const initialW = rect.width > 40 ? rect.width : 960;\n const initialH = rect.height > 40 ? rect.height : 620;\n\n this.adapter = new SvgRendererAdapter(this.svgEl, {\n contentView,\n clusterView,\n });\n\n this.engine = SimplexGraphEngine.createFromResolved({\n items: options.items,\n getId: options.getId,\n getTags: options.getTags,\n deriveClusterMeta: options.deriveClusterMeta,\n visualResolver,\n renderer: this.adapter,\n viewportWidth: initialW,\n viewportHeight: initialH,\n normalizeTag: options.normalizeTag,\n resolveTagMeta: options.resolveTagMeta,\n meshOptions: options.meshOptions,\n layoutOptions: options.layoutOptions,\n showHulls: options.showHulls,\n interactions: this.wrapInteractions(options.interactions),\n onMetricsChange: options.onMetricsChange,\n onClustersChange: options.onClustersChange,\n });\n\n this.attachSvgListeners();\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver((entries) => {\n if (this.destroyed) return;\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n if (width > 60 && height > 60) {\n this.engine.setViewport(width, height);\n this.ensureLoopRunning();\n }\n }\n });\n this.resizeObserver.observe(this.containerEl);\n }\n\n this.ensureLoopRunning();\n }\n\n static createFromResolved<\n TItem = DefaultTaggedItem,\n TContentVisual = DefaultContentPresetVisual,\n TClusterVisual = DefaultClusterPresetVisual,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n >(\n containerEl: HTMLElement | string,\n options: SimplexSvgControllerResolvedOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ): SimplexSvgController<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n > {\n return new (SimplexSvgController as unknown as new (\n el: HTMLElement | string,\n opts: SimplexSvgControllerResolvedOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ) => SimplexSvgController<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >)(containerEl, options);\n }\n\n private wrapInteractions(\n userInteractions?: InteractionHandlers<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ): InteractionHandlers<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n > {\n return {\n onContentHover: (ev) => {\n userInteractions?.onContentHover?.(ev);\n if (ev) {\n this.showTooltip(\n ev.screenPosition.x,\n ev.screenPosition.y,\n this.formatContentTooltip(ev),\n );\n } else {\n this.hideTooltip();\n }\n },\n onClusterHover: (ev) => {\n userInteractions?.onClusterHover?.(ev);\n if (ev) {\n this.showTooltip(\n ev.screenPosition.x,\n ev.screenPosition.y,\n this.formatClusterTooltip(ev),\n );\n } else {\n this.hideTooltip();\n }\n },\n onLeftClick: (target, rawEvent) => {\n if (userInteractions?.onLeftClick) {\n userInteractions.onLeftClick(target, rawEvent);\n return;\n }\n if (!this.focusOnClusterClick) return;\n if (target.kind === 'cluster') {\n const next =\n this.focusedClusterUidState === target.cluster.clusterUid\n ? null\n : target.cluster.clusterUid;\n this.setFocusedClusterUid(next);\n } else if (target.kind === 'background' && this.focusedClusterUidState !== null) {\n this.setFocusedClusterUid(null);\n }\n },\n onRightClick: userInteractions?.onRightClick,\n onWheel: userInteractions?.onWheel ?? 'zoom-to-cursor',\n };\n }\n\n private formatContentTooltip(\n ev: ContentHoverEvent<TItem, TContentVisual, TTagMeta, TClusterMeta>,\n ): string {\n if (typeof this.tooltipOption === 'function') {\n return this.tooltipOption({ kind: 'content', ...ev });\n }\n const label = extractDefaultItemLabel(\n ev.item,\n ev.layoutContext.id,\n this.getLabelExtractor,\n );\n const tagList = ev.layoutContext.tags.map((t) => `#${t.tag}`).slice(0, 5).join(' · ');\n return tagList ? `${label}\\n${tagList}` : label;\n }\n\n private formatClusterTooltip(\n ev: ClusterHoverEvent<TItem, TClusterVisual, TTagMeta, TClusterMeta>,\n ): string {\n if (typeof this.tooltipOption === 'function') {\n return this.tooltipOption({ kind: 'cluster', ...ev });\n }\n const count = ev.cluster.members.length;\n return `${ev.cluster.code} · ${ev.cluster.defaultLabel}\\n${count} ${count === 1 ? 'item' : 'items'}`;\n }\n\n private applyTooltipThemeStyles(el: HTMLDivElement): void {\n const isLight = this.currentTheme === 'light';\n el.style.background = isLight ? 'rgba(255, 255, 255, 0.96)' : 'rgba(9, 13, 22, 0.94)';\n el.style.border = isLight\n ? '1px solid rgba(203, 213, 225, 0.95)'\n : '1px solid rgba(51, 65, 85, 0.85)';\n el.style.color = isLight ? '#0f172a' : '#f1f5f9';\n el.style.boxShadow = isLight\n ? '0 10px 24px rgba(15, 23, 42, 0.12)'\n : '0 10px 24px rgba(0, 0, 0, 0.45)';\n }\n\n private ensureTooltipElement(): HTMLDivElement | null {\n if (!this.tooltipOption) return null;\n if (this.tooltipEl) return this.tooltipEl;\n\n const doc = this.containerEl.ownerDocument;\n const computedPos =\n typeof getComputedStyle !== 'undefined'\n ? getComputedStyle(this.containerEl).position\n : this.containerEl.style.position;\n if (!computedPos || computedPos === 'static') {\n this.containerEl.style.position = 'relative';\n }\n\n const el = doc.createElement('div');\n el.className = 'sv-tooltip';\n el.style.position = 'absolute';\n el.style.pointerEvents = 'none';\n el.style.zIndex = '20';\n el.style.display = 'none';\n el.style.maxWidth = '240px';\n el.style.padding = '7px 10px';\n el.style.borderRadius = '8px';\n el.style.fontFamily = 'Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif';\n el.style.fontSize = '12px';\n el.style.lineHeight = '1.4';\n el.style.whiteSpace = 'pre-line';\n this.applyTooltipThemeStyles(el);\n this.containerEl.appendChild(el);\n this.tooltipEl = el;\n return el;\n }\n\n private showTooltip(screenX: number, screenY: number, text: string): void {\n const el = this.ensureTooltipElement();\n if (!el || !text) return;\n el.textContent = text;\n el.style.display = 'block';\n const maxLeft = Math.max(8, (this.containerEl.clientWidth || 960) - 256);\n const maxTop = Math.max(8, (this.containerEl.clientHeight || 600) - 72);\n el.style.left = `${Math.min(Math.max(8, Math.round(screenX + 14)), maxLeft)}px`;\n el.style.top = `${Math.min(Math.max(8, Math.round(screenY + 14)), maxTop)}px`;\n }\n\n private hideTooltip(): void {\n if (this.tooltipEl) {\n this.tooltipEl.style.display = 'none';\n }\n }\n\n get camera(): CameraController {\n return this.engine.camera;\n }\n\n getSvgElement(): SVGSVGElement {\n return this.svgEl;\n }\n\n getMetrics(): LayoutMetrics {\n return this.engine.getMetrics();\n }\n\n getClusters(): readonly ClusterDescriptor<TItem, TTagMeta, TClusterMeta>[] {\n return this.engine.getClusters();\n }\n\n getItems(): readonly TItem[] {\n return this.engine.getItems();\n }\n\n addItems(items: TItem | readonly TItem[]): void {\n this.engine.addItems(items);\n this.ensureLoopRunning();\n }\n\n removeItems(ids: string | readonly string[]): void {\n this.engine.removeItems(ids);\n this.ensureLoopRunning();\n }\n\n setItems(items: readonly TItem[]): void {\n this.engine.setItems(items);\n this.ensureLoopRunning();\n }\n\n /**\n * Switches between built-in presets (`'geometric'`, `'glyphs'`, `'badges'`) with smooth\n * morph/crossfade transitions.\n */\n setPreset(preset: SimplexVisualPreset, getLabel?: (item: TItem) => string): void {\n this.currentPreset = preset;\n if (getLabel !== undefined) {\n this.getLabelExtractor = getLabel;\n }\n const views = createPresetViews(preset);\n const resolver = createPresetVisualResolver<TItem, TTagMeta, TClusterMeta>(\n preset,\n this.getLabelExtractor,\n this.currentTheme,\n );\n this.adapter.setViews({\n contentView: views.contentView as unknown as SvgNodeView<TContentVisual>,\n clusterView: views.clusterView as unknown as SvgNodeView<TClusterVisual>,\n });\n this.engine.setVisualResolver(\n resolver as unknown as VisualResolver<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n );\n this.ensureLoopRunning();\n }\n\n /**\n * Switches built-in preset & tooltip theme between `'dark'` and `'light'`.\n */\n setTheme(theme: SimplexTheme): void {\n if (this.currentTheme === theme) return;\n this.currentTheme = theme;\n if (this.tooltipEl) {\n this.applyTooltipThemeStyles(this.tooltipEl);\n }\n if (!this.usesCustomVisualResolver) {\n const resolver = createPresetVisualResolver<TItem, TTagMeta, TClusterMeta>(\n this.currentPreset,\n this.getLabelExtractor,\n theme,\n );\n this.engine.setVisualResolver(\n resolver as unknown as VisualResolver<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n );\n this.ensureLoopRunning();\n }\n }\n\n setTooltip(\n tooltip:\n | boolean\n | SimplexTooltipFormatter<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>,\n ): void {\n this.tooltipOption = tooltip;\n if (!tooltip) {\n this.hideTooltip();\n }\n }\n\n setVisualResolver(\n resolver: VisualResolver<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ): void {\n this.engine.setVisualResolver(resolver);\n this.ensureLoopRunning();\n }\n\n setViews(\n views: Partial<SvgRendererOptions<TContentVisual, TClusterVisual>>,\n ): void {\n this.adapter.setViews(views);\n }\n\n setSizeMultiplier(multiplier: number): void {\n this.engine.setSizeMultiplier(multiplier);\n this.ensureLoopRunning();\n }\n\n setShowHulls(show: boolean): void {\n this.engine.setShowHulls(show);\n this.ensureLoopRunning();\n }\n\n setInteractions(\n interactions: InteractionHandlers<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n ): void {\n this.engine.setInteractions(this.wrapInteractions(interactions));\n }\n\n setPinnedIds(ids: ReadonlySet<string> | readonly string[]): void {\n this.engine.setPinnedIds(ids);\n this.ensureLoopRunning();\n }\n\n setHighlightedIds(ids: ReadonlySet<string> | readonly string[]): void {\n this.engine.setHighlightedIds(ids);\n this.ensureLoopRunning();\n }\n\n setFocusedClusterUid(clusterUid: string | null): void {\n this.focusedClusterUidState = clusterUid;\n this.engine.setFocusedClusterUid(clusterUid);\n this.ensureLoopRunning();\n }\n\n /** Deterministically advances simulation time in tests without waiting for rAF. */\n stepForTest(dtMs: number): boolean {\n return this.engine.step(dtMs);\n }\n\n private toLocalCoords(clientX: number, clientY: number): { x: number; y: number } {\n const rect = this.svgEl.getBoundingClientRect();\n return {\n x: clientX - rect.left,\n y: clientY - rect.top,\n };\n }\n\n private readonly onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0) return;\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n const hit = this.engine.hitTest(x, y);\n if (hit.kind === 'background') {\n this.isDraggingPan = true;\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n this.dragMoved = false;\n this.svgEl.style.cursor = 'grabbing';\n } else {\n this.isDraggingPan = false;\n this.dragMoved = false;\n }\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n if (this.isDraggingPan) {\n const dx = e.clientX - this.dragStartX;\n const dy = e.clientY - this.dragStartY;\n if (Math.hypot(dx, dy) > 3) {\n this.dragMoved = true;\n }\n if (this.dragMoved) {\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n this.engine.camera.panBy(dx, dy);\n this.hideTooltip();\n this.ensureLoopRunning();\n }\n return;\n }\n this.engine.handlePointerMove(x, y);\n const hit = this.engine.hitTest(x, y);\n this.svgEl.style.cursor = hit.kind === 'background' ? 'grab' : 'pointer';\n this.ensureLoopRunning();\n };\n\n private readonly onPointerUp = (): void => {\n if (this.isDraggingPan) {\n this.isDraggingPan = false;\n this.svgEl.style.cursor = 'grab';\n }\n };\n\n private readonly onPointerLeave = (): void => {\n this.isDraggingPan = false;\n this.hideTooltip();\n this.engine.handlePointerLeave();\n this.ensureLoopRunning();\n };\n\n private readonly onClick = (e: MouseEvent): void => {\n if (this.dragMoved) {\n this.dragMoved = false;\n return;\n }\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n this.engine.handleLeftClick({\n screenX: x,\n screenY: y,\n button: e.button,\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n });\n this.ensureLoopRunning();\n };\n\n private readonly onContextMenu = (e: MouseEvent): void => {\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n const suppress = this.engine.handleRightClick({\n screenX: x,\n screenY: y,\n button: e.button,\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n });\n if (suppress) {\n e.preventDefault();\n }\n this.ensureLoopRunning();\n };\n\n private readonly onWheel = (e: WheelEvent): void => {\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n const handled = this.engine.handleWheel({\n screenX: x,\n screenY: y,\n deltaX: e.deltaX,\n deltaY: e.deltaY,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n });\n if (handled) {\n e.preventDefault();\n this.ensureLoopRunning();\n }\n };\n\n private attachSvgListeners(): void {\n this.svgEl.addEventListener('pointerdown', this.onPointerDown);\n this.svgEl.addEventListener('pointermove', this.onPointerMove);\n this.svgEl.addEventListener('pointerup', this.onPointerUp);\n this.svgEl.addEventListener('pointerleave', this.onPointerLeave);\n this.svgEl.addEventListener('click', this.onClick);\n this.svgEl.addEventListener('contextmenu', this.onContextMenu);\n this.svgEl.addEventListener('wheel', this.onWheel, { passive: false });\n }\n\n private detachSvgListeners(): void {\n this.svgEl.removeEventListener('pointerdown', this.onPointerDown);\n this.svgEl.removeEventListener('pointermove', this.onPointerMove);\n this.svgEl.removeEventListener('pointerup', this.onPointerUp);\n this.svgEl.removeEventListener('pointerleave', this.onPointerLeave);\n this.svgEl.removeEventListener('click', this.onClick);\n this.svgEl.removeEventListener('contextmenu', this.onContextMenu);\n this.svgEl.removeEventListener('wheel', this.onWheel);\n }\n\n private ensureLoopRunning(): void {\n if (this.destroyed || this.rafId !== null) return;\n if (typeof requestAnimationFrame === 'undefined') {\n this.engine.renderNow();\n return;\n }\n this.lastFrameTs = performance.now();\n const tick = (now: number) => {\n if (this.destroyed) return;\n const dtMs = Math.max(1, Math.min(50, now - this.lastFrameTs));\n this.lastFrameTs = now;\n\n this.fpsSamples += 1;\n this.fpsAccumMs += dtMs;\n if (this.fpsAccumMs >= 320) {\n const fps = Math.round((this.fpsSamples * 1000) / this.fpsAccumMs);\n this.onFpsUpdate?.(fps);\n this.fpsSamples = 0;\n this.fpsAccumMs = 0;\n }\n\n const settled = this.engine.step(dtMs);\n if (!settled) {\n this.rafId = requestAnimationFrame(tick);\n } else {\n this.rafId = null;\n }\n };\n this.rafId = requestAnimationFrame(tick);\n }\n\n /** Helper accessor matching `getId` when external callers inspect items. */\n getItemId(item: TItem): string {\n return this.getIdExtractor(item);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.rafId !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.resizeObserver?.disconnect();\n this.detachSvgListeners();\n this.engine.destroy();\n if (this.tooltipEl && this.tooltipEl.parentElement === this.containerEl) {\n this.containerEl.removeChild(this.tooltipEl);\n this.tooltipEl = null;\n }\n if (this.svgEl.parentElement === this.containerEl) {\n this.containerEl.removeChild(this.svgEl);\n }\n }\n}\n\n/**\n * Convenience one-liner factory for mounting `@simplex-viz/svg` in Vanilla TypeScript,\n * Vue, Angular, Svelte, or Web Components.\n *\n * Accepts either an array of `{ id, tags }` items directly (with built-in presets,\n * cursor zoom, and cluster click-focus enabled) or a full options object.\n */\nexport function createSimplexSvg<TItem extends DefaultTaggedItem = DefaultTaggedItem>(\n target: HTMLElement | string,\n items: readonly TItem[],\n): SimplexSvgController<TItem, DefaultContentPresetVisual, DefaultClusterPresetVisual>;\nexport function createSimplexSvg<\n TItem = DefaultTaggedItem,\n TContentVisual = DefaultContentPresetVisual,\n TClusterVisual = DefaultClusterPresetVisual,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n>(\n target: HTMLElement | string,\n options: SimplexSvgControllerOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n): SimplexSvgController<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>;\nexport function createSimplexSvg<\n TItem = DefaultTaggedItem,\n TContentVisual = DefaultContentPresetVisual,\n TClusterVisual = DefaultClusterPresetVisual,\n TTagMeta = undefined,\n TClusterMeta = undefined,\n>(\n target: HTMLElement | string,\n itemsOrOptions:\n | readonly TItem[]\n | SimplexSvgControllerOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n): SimplexSvgController<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta> {\n if (Array.isArray(itemsOrOptions)) {\n return SimplexSvgController.createFromResolved(target, {\n items: itemsOrOptions,\n tooltip: true,\n });\n }\n return new SimplexSvgController(\n target,\n itemsOrOptions as SimplexSvgControllerOptions<\n TItem,\n TContentVisual,\n TClusterVisual,\n TTagMeta,\n TClusterMeta\n >,\n );\n}\n"]}
|