@simplex-viz/svg 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +32 -2
- package/dist/SimplexSvgController.d.ts +78 -0
- package/dist/SimplexSvgController.d.ts.map +1 -0
- package/dist/SvgRendererAdapter.d.ts +48 -0
- package/dist/SvgRendererAdapter.d.ts.map +1 -0
- package/dist/hullMeasure.d.ts +9 -0
- package/dist/hullMeasure.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1121 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/views/BadgeClusterSvgView.d.ts +21 -0
- package/dist/views/BadgeClusterSvgView.d.ts.map +1 -0
- package/dist/views/ClusterAnchorSvgView.d.ts +21 -0
- package/dist/views/ClusterAnchorSvgView.d.ts.map +1 -0
- package/dist/views/GeometricShapeSvgView.d.ts +25 -0
- package/dist/views/GeometricShapeSvgView.d.ts.map +1 -0
- package/dist/views/MultiSectorGlyphSvgView.d.ts +25 -0
- package/dist/views/MultiSectorGlyphSvgView.d.ts.map +1 -0
- package/package.json +39 -3
|
@@ -0,0 +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"]}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';
|
|
2
|
+
/**
|
|
3
|
+
* Pluggable, framework-agnostic SVG node renderer for `@simplex-viz/svg`.
|
|
4
|
+
*
|
|
5
|
+
* Works identically in Vanilla TypeScript, Vue, Angular, Svelte, Web Components, and React.
|
|
6
|
+
*/
|
|
7
|
+
export interface SvgNodeView<TVisual> {
|
|
8
|
+
/**
|
|
9
|
+
* Optional analytical convex hull at scale `1.0` centered around `(0, 0)`.
|
|
10
|
+
*
|
|
11
|
+
* When omitted, `@simplex-viz/svg` automatically mounts the visual inside a hidden
|
|
12
|
+
* measurement group and derives a convex polygon via `getBBox()`.
|
|
13
|
+
*/
|
|
14
|
+
measureConvexHull?(visual: TVisual, measureSvg: SVGSVGElement): ConvexGeometry;
|
|
15
|
+
/**
|
|
16
|
+
* Creates or updates the interior SVG elements of `groupEl` around local origin `(0, 0)`.
|
|
17
|
+
* Outer position `(x, y)`, solver scale `alpha`, and opacity are managed at 60 fps
|
|
18
|
+
* by `SvgRendererAdapter` on the parent `<g>`.
|
|
19
|
+
*/
|
|
20
|
+
mountOrUpdate(groupEl: SVGGElement, visual: TVisual, state: NodeRenderState<TVisual>): void;
|
|
21
|
+
/**
|
|
22
|
+
* Optional specialized parametric morphing between `from` and `to` at `progress \in [0, 1]`.
|
|
23
|
+
* Return `true` if handled; return `false` (or omit) to use the universal Dual-Layer Crossfade.
|
|
24
|
+
*/
|
|
25
|
+
morph?(groupEl: SVGGElement, from: TVisual, to: TVisual, progress: number, state: NodeRenderState<TVisual>): boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;GAIG;AACH,MAAM,WAAW,WAAW,CAAC,OAAO;IAClC;;;;;OAKG;IACH,iBAAiB,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,GAAG,cAAc,CAAC;IAE/E;;;;OAIG;IACH,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAC9B,IAAI,CAAC;IAER;;;OAGG;IACH,KAAK,CAAC,CACJ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,OAAO,EACb,EAAE,EAAE,OAAO,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAC9B,OAAO,CAAC;CACZ"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { NodeRenderState } from '@simplex-viz/core';
|
|
2
|
+
import type { SvgNodeView } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Pure visual descriptor for `BadgeClusterSvgView`.
|
|
5
|
+
* Intentionally omits analytical `measureConvexHull` so `@simplex-viz/svg`
|
|
6
|
+
* exercises automatic offscreen `getBBox()` convex hull computation.
|
|
7
|
+
*/
|
|
8
|
+
export interface BadgeClusterVisual {
|
|
9
|
+
readonly code: string;
|
|
10
|
+
readonly title: string;
|
|
11
|
+
readonly metaLine: string;
|
|
12
|
+
readonly colorHex: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Pluggable SVG cluster view rendering a dynamic pill/rect badge whose width adapts
|
|
16
|
+
* to its title and metadata, automatically measured via `getBBox()` for overlap-free layout.
|
|
17
|
+
*/
|
|
18
|
+
export declare class BadgeClusterSvgView implements SvgNodeView<BadgeClusterVisual> {
|
|
19
|
+
mountOrUpdate(groupEl: SVGGElement, visual: BadgeClusterVisual, state: NodeRenderState<BadgeClusterVisual>): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=BadgeClusterSvgView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BadgeClusterSvgView.d.ts","sourceRoot":"","sources":["../../src/views/BadgeClusterSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,WAAW,CAAC,kBAAkB,CAAC;IACzE,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,eAAe,CAAC,kBAAkB,CAAC,GACzC,IAAI,CAwEN;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';
|
|
2
|
+
import type { SvgNodeView } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Pure visual descriptor for `ClusterAnchorSvgView`.
|
|
5
|
+
*/
|
|
6
|
+
export interface ClusterAnchorVisual {
|
|
7
|
+
readonly code: string;
|
|
8
|
+
readonly label: string;
|
|
9
|
+
readonly memberCount: number;
|
|
10
|
+
readonly colorHex: string;
|
|
11
|
+
readonly radius: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Pluggable SVG cluster view rendering a calibrated double-ring geometric vertex anchor
|
|
15
|
+
* displaying the cluster code and member count.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ClusterAnchorSvgView implements SvgNodeView<ClusterAnchorVisual> {
|
|
18
|
+
measureConvexHull(visual: ClusterAnchorVisual): ConvexGeometry;
|
|
19
|
+
mountOrUpdate(groupEl: SVGGElement, visual: ClusterAnchorVisual, state: NodeRenderState<ClusterAnchorVisual>): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ClusterAnchorSvgView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClusterAnchorSvgView.d.ts","sourceRoot":"","sources":["../../src/views/ClusterAnchorSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,WAAW,CAAC,mBAAmB,CAAC;IAC3E,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAE7D;IAED,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAC1C,IAAI,CAqDN;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ConvexGeometry, type NodeRenderState } from '@simplex-viz/core';
|
|
2
|
+
import type { SvgNodeView } from '../types';
|
|
3
|
+
export type GeometricShapeKind = 'circle' | 'diamond' | 'star' | 'hexagon';
|
|
4
|
+
/**
|
|
5
|
+
* Pure visual descriptor for `GeometricShapeSvgView`.
|
|
6
|
+
*/
|
|
7
|
+
export interface GeometricShapeVisual {
|
|
8
|
+
readonly shape: GeometricShapeKind;
|
|
9
|
+
readonly radius: number;
|
|
10
|
+
readonly fillHex: string;
|
|
11
|
+
readonly strokeHex?: string;
|
|
12
|
+
readonly strokeWidth?: number;
|
|
13
|
+
readonly label?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pluggable SVG node view rendering geometric shapes (`circle`, `diamond`, `star`, `hexagon`)
|
|
17
|
+
* with analytical convex hulls and 64-point parametric SVG path morphing!
|
|
18
|
+
*/
|
|
19
|
+
export declare class GeometricShapeSvgView implements SvgNodeView<GeometricShapeVisual> {
|
|
20
|
+
measureConvexHull(visual: GeometricShapeVisual): ConvexGeometry;
|
|
21
|
+
private ensureElements;
|
|
22
|
+
mountOrUpdate(groupEl: SVGGElement, visual: GeometricShapeVisual, state: NodeRenderState<GeometricShapeVisual>): void;
|
|
23
|
+
morph(groupEl: SVGGElement, from: GeometricShapeVisual, to: GeometricShapeVisual, progress: number, state: NodeRenderState<GeometricShapeVisual>): boolean;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=GeometricShapeSvgView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeometricShapeSvgView.d.ts","sourceRoot":"","sources":["../../src/views/GeometricShapeSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AA2GD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,WAAW,CAAC,oBAAoB,CAAC;IAC7E,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAqB9D;IAED,OAAO,CAAC,cAAc;IAoBtB,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAC3C,IAAI,CA6BN;IAED,KAAK,CACH,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,oBAAoB,EAC1B,EAAE,EAAE,oBAAoB,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAC3C,OAAO,CAsBT;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';
|
|
2
|
+
import type { SvgNodeView } from '../types';
|
|
3
|
+
export interface TopicSectorSlice {
|
|
4
|
+
readonly colorHex: string;
|
|
5
|
+
readonly weight: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Pure visual descriptor for `MultiSectorGlyphSvgView`.
|
|
9
|
+
*/
|
|
10
|
+
export interface MultiSectorGlyphVisual {
|
|
11
|
+
readonly outerRadius: number;
|
|
12
|
+
readonly innerRadius: number;
|
|
13
|
+
readonly sectors: readonly TopicSectorSlice[];
|
|
14
|
+
readonly centerColorHex: string;
|
|
15
|
+
readonly accentRingHex?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Pluggable SVG node view rendering multi-color topic-weight donut sectors
|
|
19
|
+
* representing each item's exact barycentric weights `\tilde{w}_{ik}`.
|
|
20
|
+
*/
|
|
21
|
+
export declare class MultiSectorGlyphSvgView implements SvgNodeView<MultiSectorGlyphVisual> {
|
|
22
|
+
measureConvexHull(visual: MultiSectorGlyphVisual): ConvexGeometry;
|
|
23
|
+
mountOrUpdate(groupEl: SVGGElement, visual: MultiSectorGlyphVisual, state: NodeRenderState<MultiSectorGlyphVisual>): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=MultiSectorGlyphSvgView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiSectorGlyphSvgView.d.ts","sourceRoot":"","sources":["../../src/views/MultiSectorGlyphSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAyCD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,WAAW,CAAC,sBAAsB,CAAC;IACjF,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,cAAc,CAEhE;IAED,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,eAAe,CAAC,sBAAsB,CAAC,GAC7C,IAAI,CAsDN;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplex-viz/svg",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-agnostic SVG rendering engine, offscreen getBBox() hull measurer, and pluggable SvgNodeView system for @simplex-viz/core.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md",
|
|
20
|
+
"LICENSE"
|
|
21
|
+
],
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@simplex-viz/core": "^0.1.0"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"simplex",
|
|
27
|
+
"svg",
|
|
28
|
+
"visualization",
|
|
29
|
+
"dataviz",
|
|
30
|
+
"framework-agnostic",
|
|
31
|
+
"plugins"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/ghackenberg/simplex-viz.git",
|
|
36
|
+
"directory": "packages/svg"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsup && tsc -p tsconfig.build.json --emitDeclarationOnly",
|
|
40
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
41
|
+
}
|
|
6
42
|
}
|