@simplex-viz/svg 0.2.1 → 0.3.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/README.md +40 -2
- package/dist/SimplexSvgController.d.ts +21 -1
- package/dist/SimplexSvgController.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +149 -11
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ While `@simplex-viz/core` computes pure spatial coordinates, `@simplex-viz/svg`
|
|
|
25
25
|
- **Framework-agnostic SVG scene graph**: Keyed DOM reconciliation for background mesh triangles, highlighted edges, convex hull debug wireframes, cluster nodes, and content nodes.
|
|
26
26
|
- **Automatic offscreen `getBBox()` hull measurement**: Omit `measureConvexHull` on any `SvgNodeView` and `@simplex-viz/svg` automatically renders it in a hidden measurement bin, reads `getBBox()`, and caches a tight convex polygon for overlap-free layout.
|
|
27
27
|
- **Smooth 60 fps transitions**: Critically damped spring motion + specialized parametric `morph()` or automatic dual-layer crossfade when switching visual presets or mutating items.
|
|
28
|
-
- **Centralized root-SVG interactions**: Attaches pointer, click, right-click, wheel, drag-to-pan, and `ResizeObserver` listeners solely on the root `<svg>` element and delegates hit-testing to `@simplex-viz/core`'s exact convex geometry solver.
|
|
28
|
+
- **Centralized root-SVG interactions**: Attaches pointer, two-finger touch pinch-to-zoom/pan, click, right-click, wheel, drag-to-pan, and `ResizeObserver` listeners solely on the root `<svg>` element and delegates hit-testing to `@simplex-viz/core`'s exact convex geometry solver.
|
|
29
29
|
- **Four built-in view plugins**: Ready-to-use views for geometric shape morphing, multi-sector topic glyphs, vertex anchors, and dynamic text badges.
|
|
30
30
|
|
|
31
31
|
## Installation
|
|
@@ -101,6 +101,37 @@ controller.removeItems('old-slug');
|
|
|
101
101
|
controller.camera.reset();
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
+
### Pluggable Core Strategies (Algorithm Swapping at Runtime)
|
|
105
|
+
|
|
106
|
+
`@simplex-viz/svg` re-exports all built-in `@simplex-viz/core` strategy factories (`createAdaptiveHexMeshStrategy`, `createFixedLatticeMeshStrategy`, `createJaccardAnnealingClusteringStrategy`, `createIncrementalAnchorClusteringStrategy`, `createOklabContrastColorStrategy`, `createThemeAdaptiveOklabColorStrategy`, `createPaletteColorStrategy`, `createPbdUniformLayoutStrategy`, `createWarmStartPbdLayoutStrategy`, `createLocalAdaptiveLayoutStrategy`). Combine them freely with any preset or custom `SvgNodeView`:
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import {
|
|
110
|
+
SimplexSvgController,
|
|
111
|
+
createFixedLatticeMeshStrategy,
|
|
112
|
+
createIncrementalAnchorClusteringStrategy,
|
|
113
|
+
createThemeAdaptiveOklabColorStrategy,
|
|
114
|
+
createLocalAdaptiveLayoutStrategy,
|
|
115
|
+
} from '@simplex-viz/svg';
|
|
116
|
+
|
|
117
|
+
const controller = new SimplexSvgController('#graph', {
|
|
118
|
+
items,
|
|
119
|
+
preset: 'glyphs',
|
|
120
|
+
theme: 'light',
|
|
121
|
+
meshStrategy: createFixedLatticeMeshStrategy({ cols: 3, rows: 3 }),
|
|
122
|
+
clusteringStrategy: createIncrementalAnchorClusteringStrategy({
|
|
123
|
+
sharedTagRule: 'planar-hitting-set',
|
|
124
|
+
anchorRule: 'explaining-away',
|
|
125
|
+
}),
|
|
126
|
+
colorStrategy: createThemeAdaptiveOklabColorStrategy(),
|
|
127
|
+
layoutStrategy: createLocalAdaptiveLayoutStrategy({ warmStart: true }),
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Swap any pipeline stage live without resetting camera pan/zoom:
|
|
131
|
+
controller.setColorStrategy(createOklabContrastColorStrategy());
|
|
132
|
+
controller.setLayoutStrategy(createWarmStartPbdLayoutStrategy());
|
|
133
|
+
```
|
|
134
|
+
|
|
104
135
|
## Progressive Customization: Custom `VisualResolver` & `SvgNodeView`
|
|
105
136
|
|
|
106
137
|
Whenever built-in presets are not specific enough, swap in your own `VisualResolver`, view plugins, or root-SVG event handlers without rewriting the container lifecycle.
|
|
@@ -334,6 +365,13 @@ export const CustomCardSvgView: SvgNodeView<CardVisual> = {
|
|
|
334
365
|
| Method / Option | Description |
|
|
335
366
|
| --- | --- |
|
|
336
367
|
| `preset` / `setPreset(preset, getLabel?)` | Switches between `'geometric'`, `'glyphs'`, and `'badges'` with smooth transitions. |
|
|
368
|
+
| `theme` / `setTheme(theme)` | Switches `'dark'` / `'light'` presets and notifies theme-aware color strategies. |
|
|
369
|
+
| `meshStrategy` / `setMeshStrategy(strategy)` | Swaps `SimplexMeshStrategy` (`createAdaptiveHexMeshStrategy`, `createFixedLatticeMeshStrategy`, or custom). |
|
|
370
|
+
| `clusteringStrategy` / `setClusteringStrategy(strategy)` | Swaps `SimplexClusteringStrategy` (`createJaccardAnnealingClusteringStrategy`, `createIncrementalAnchorClusteringStrategy`, or custom). |
|
|
371
|
+
| `colorStrategy` / `setColorStrategy(strategy)` | Swaps `SimplexColorStrategy` (`createOklabContrastColorStrategy`, `createThemeAdaptiveOklabColorStrategy`, `createPaletteColorStrategy`, or custom). |
|
|
372
|
+
| `layoutStrategy` / `setLayoutStrategy(strategy)` | Swaps `SimplexLayoutStrategy` (`createPbdUniformLayoutStrategy`, `createWarmStartPbdLayoutStrategy`, `createLocalAdaptiveLayoutStrategy`, or custom). |
|
|
373
|
+
| `setMeshOptions(opts)` / `setLayoutOptions(opts)` | Updates `MeshOptions` or `LayoutSolverOptions` at runtime. |
|
|
374
|
+
| `getMeshStrategy()` / `getClusteringStrategy()` / `getColorStrategy()` / `getLayoutStrategy()` | Inspects the currently active core strategy instances. |
|
|
337
375
|
| `tooltip` / `setTooltip(tooltip)` | Enables a floating DOM hover tooltip (`boolean` or `(target) => string` formatter). |
|
|
338
376
|
| `focusOnClusterClick` | Option (default `true`): toggles cluster focus on click when no custom `interactions.onLeftClick` is provided. |
|
|
339
377
|
| `addItems(items)` | Appends one or more items and triggers an interruptible transition. |
|
|
@@ -346,7 +384,7 @@ export const CustomCardSvgView: SvgNodeView<CardVisual> = {
|
|
|
346
384
|
| `setPinnedIds(ids)` / `setHighlightedIds(ids)` | Controls pinned and highlighted visual emphasis states. |
|
|
347
385
|
| `setFocusedClusterUid(uid \| null)` | Isolates a cluster and its members, dimming unrelated nodes. |
|
|
348
386
|
| `setInteractions(handlers)` | Replaces pointer, click, and wheel callbacks dynamically (`onWheel` defaults to `'zoom-to-cursor'`). |
|
|
349
|
-
| `camera` | Exposes `CameraController` (`zoomToCursor`, `panBy`, `reset`, `getState`, `setState`). |
|
|
387
|
+
| `camera` | Exposes `CameraController` (`zoomToCursor`, `panBy`, `reset`, `getState`, `setState`) with immediate synchronous `<svg>` transform updates. |
|
|
350
388
|
| `getMetrics()` / `getClusters()` / `getItems()` | Reads live solver telemetry, clusters, and items. |
|
|
351
389
|
| `getSvgElement()` | Returns the managed root `<svg>` element. |
|
|
352
390
|
| `stepForTest(dtMs)` | Deterministically advances simulation time in unit/DOM tests. |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CameraController, type ClusterDerivationContext, type ClusterDescriptor, type ClusterHoverEvent, type ClusterMetaConfig, type ContentHoverEvent, type DefaultTaggedItem, type InteractionHandlers, type ItemIdentityConfig, type LayoutMetrics, type LayoutSolverOptions, type MeshOptions, type VisualResolver } from '@simplex-viz/core';
|
|
1
|
+
import { type CameraController, type ClusterDerivationContext, type ClusterDescriptor, type ClusterHoverEvent, type ClusterMetaConfig, type ContentHoverEvent, type DefaultTaggedItem, type InteractionHandlers, type ItemIdentityConfig, type LayoutMetrics, type LayoutSolverOptions, type MeshOptions, type SimplexClusteringStrategy, type SimplexColorStrategy, type SimplexLayoutStrategy, type SimplexMeshStrategy, type VisualResolver } from '@simplex-viz/core';
|
|
2
2
|
import { type DefaultClusterPresetVisual, type DefaultContentPresetVisual, type SimplexTheme, type SimplexVisualPreset } from './presets';
|
|
3
3
|
import { type SvgRendererOptions } from './SvgRendererAdapter';
|
|
4
4
|
export type SimplexTooltipFormatter<TItem = DefaultTaggedItem, TContentVisual = DefaultContentPresetVisual, TClusterVisual = DefaultClusterPresetVisual, TTagMeta = undefined, TClusterMeta = undefined> = (target: ({
|
|
@@ -26,6 +26,10 @@ export interface SimplexSvgControllerResolvedOptions<TItem = DefaultTaggedItem,
|
|
|
26
26
|
readonly resolveTagMeta?: (normalizedTag: string) => TTagMeta | undefined;
|
|
27
27
|
readonly meshOptions?: MeshOptions;
|
|
28
28
|
readonly layoutOptions?: LayoutSolverOptions;
|
|
29
|
+
readonly meshStrategy?: SimplexMeshStrategy<TItem>;
|
|
30
|
+
readonly clusteringStrategy?: SimplexClusteringStrategy<TItem, TTagMeta>;
|
|
31
|
+
readonly colorStrategy?: SimplexColorStrategy<TItem, TTagMeta>;
|
|
32
|
+
readonly layoutStrategy?: SimplexLayoutStrategy;
|
|
29
33
|
readonly showHulls?: boolean;
|
|
30
34
|
/**
|
|
31
35
|
* Automatically toggles cluster focus when clicking a topic cluster (and clears on background click)
|
|
@@ -63,6 +67,7 @@ export declare class SimplexSvgController<TItem = DefaultTaggedItem, TContentVis
|
|
|
63
67
|
private currentPreset;
|
|
64
68
|
private currentTheme;
|
|
65
69
|
private readonly usesCustomVisualResolver;
|
|
70
|
+
private readonly cameraProxy;
|
|
66
71
|
private rafId;
|
|
67
72
|
private lastFrameTs;
|
|
68
73
|
private fpsSamples;
|
|
@@ -72,6 +77,9 @@ export declare class SimplexSvgController<TItem = DefaultTaggedItem, TContentVis
|
|
|
72
77
|
private dragStartX;
|
|
73
78
|
private dragStartY;
|
|
74
79
|
private dragMoved;
|
|
80
|
+
private readonly activePointers;
|
|
81
|
+
private lastPinchDist;
|
|
82
|
+
private lastPinchMid;
|
|
75
83
|
constructor(containerEl: HTMLElement | string, options: SimplexSvgControllerOptions<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>);
|
|
76
84
|
static createFromResolved<TItem = DefaultTaggedItem, TContentVisual = DefaultContentPresetVisual, TClusterVisual = DefaultClusterPresetVisual, TTagMeta = undefined, TClusterMeta = undefined>(containerEl: HTMLElement | string, options: SimplexSvgControllerResolvedOptions<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>): SimplexSvgController<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>;
|
|
77
85
|
private wrapInteractions;
|
|
@@ -98,6 +106,16 @@ export declare class SimplexSvgController<TItem = DefaultTaggedItem, TContentVis
|
|
|
98
106
|
* Switches built-in preset & tooltip theme between `'dark'` and `'light'`.
|
|
99
107
|
*/
|
|
100
108
|
setTheme(theme: SimplexTheme): void;
|
|
109
|
+
setMeshStrategy(strategy: SimplexMeshStrategy<TItem>): void;
|
|
110
|
+
setClusteringStrategy(strategy: SimplexClusteringStrategy<TItem, TTagMeta>): void;
|
|
111
|
+
setColorStrategy(strategy: SimplexColorStrategy<TItem, TTagMeta>): void;
|
|
112
|
+
setLayoutStrategy(strategy: SimplexLayoutStrategy): void;
|
|
113
|
+
getMeshStrategy(): SimplexMeshStrategy<TItem>;
|
|
114
|
+
getClusteringStrategy(): SimplexClusteringStrategy<TItem, TTagMeta>;
|
|
115
|
+
getColorStrategy(): SimplexColorStrategy<TItem, TTagMeta>;
|
|
116
|
+
getLayoutStrategy(): SimplexLayoutStrategy;
|
|
117
|
+
setMeshOptions(options: MeshOptions): void;
|
|
118
|
+
setLayoutOptions(options: LayoutSolverOptions): void;
|
|
101
119
|
setTooltip(tooltip: boolean | SimplexTooltipFormatter<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>): void;
|
|
102
120
|
setVisualResolver(resolver: VisualResolver<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>): void;
|
|
103
121
|
setViews(views: Partial<SvgRendererOptions<TContentVisual, TClusterVisual>>): void;
|
|
@@ -110,9 +128,11 @@ export declare class SimplexSvgController<TItem = DefaultTaggedItem, TContentVis
|
|
|
110
128
|
/** Deterministically advances simulation time in tests without waiting for rAF. */
|
|
111
129
|
stepForTest(dtMs: number): boolean;
|
|
112
130
|
private toLocalCoords;
|
|
131
|
+
private resetTouchPinchState;
|
|
113
132
|
private readonly onPointerDown;
|
|
114
133
|
private readonly onPointerMove;
|
|
115
134
|
private readonly onPointerUp;
|
|
135
|
+
private readonly onPointerCancel;
|
|
116
136
|
private readonly onPointerLeave;
|
|
117
137
|
private readonly onClick;
|
|
118
138
|
private readonly onContextMenu;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimplexSvgController.d.ts","sourceRoot":"","sources":["../src/SimplexSvgController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SimplexSvgController.d.ts","sourceRoot":"","sources":["../src/SimplexSvgController.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,5 +7,5 @@ export * from './views/GeometricShapeSvgView';
|
|
|
7
7
|
export * from './views/MultiSectorGlyphSvgView';
|
|
8
8
|
export * from './views/BadgeClusterSvgView';
|
|
9
9
|
export * from './views/ClusterAnchorSvgView';
|
|
10
|
-
export { solveSimplexSnapshot, computeConvexHull, rectToConvexPolygon, regularPolygon, starConvexHull, type CameraController, type CameraState, type ClusterDescriptor, type ClusterHoverEvent, type ContentHoverEvent, type ContentLayoutContext, type ConvexGeometry, type DefaultTaggedItem, type HitTarget, type InteractionHandlers, type LayoutMetrics, type LayoutSolverOptions, type MeshOptions, type NodeRenderState, type SimplexLayoutSnapshot, type SimplexSnapshotOptions, type VisualResolver, } from '@simplex-viz/core';
|
|
10
|
+
export { solveSimplexSnapshot, computeConvexHull, rectToConvexPolygon, regularPolygon, starConvexHull, createAdaptiveHexMeshStrategy, createFixedLatticeMeshStrategy, createJaccardAnnealingClusteringStrategy, createIncrementalAnchorClusteringStrategy, createOklabContrastColorStrategy, createThemeAdaptiveOklabColorStrategy, createPaletteColorStrategy, createPbdUniformLayoutStrategy, createWarmStartPbdLayoutStrategy, createLocalAdaptiveLayoutStrategy, type AssignedColor, type CameraController, type CameraState, type ClusterColorInput, type ClusterColorStrategyContext, type ClusterDescriptor, type ClusterHoverEvent, type ClusteringStrategyContext, type ClusteringStrategyOutput, type ComputedItemAnchor, type ComputedTopicCluster, type ContentHoverEvent, type ContentLayoutContext, type ConvexGeometry, type DefaultTaggedItem, type HitTarget, type InteractionHandlers, type ItemColorMixContext, type LayoutMetrics, type LayoutSolverOptions, type LayoutStrategyContext, type MeshOptions, type NodeRenderState, type PipelineUpdateReason, type PreviousNodeLayout, type SharedTagExpansionContext, type SharedTagExpansionFn, type SharedTagRule, type SharedTagRuleKind, type SimplexAnchorRule, type SimplexAnchorRuleKind, type SimplexClusteringStrategy, type SimplexColorStrategy, type SimplexColorTheme, type SimplexItemAnchorContext, type SimplexItemAnchorFn, type SimplexLayoutSnapshot, type SimplexLayoutStrategy, type SimplexMeshContext, type SimplexMeshStrategy, type SimplexSnapshotOptions, type VisualResolver, } from '@simplex-viz/core';
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,6BAA6B,EAC7B,8BAA8B,EAC9B,wCAAwC,EACxC,yCAAyC,EACzC,gCAAgC,EAChC,qCAAqC,EACrC,0BAA0B,EAC1B,8BAA8B,EAC9B,gCAAgC,EAChC,iCAAiC,EACjC,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { rectToConvexPolygon, computeConvexHull, regularPolygon, starConvexHull, getHullBoundingRadius, SimplexGraphEngine } from '@simplex-viz/core';
|
|
2
|
-
export { computeConvexHull, rectToConvexPolygon, regularPolygon, solveSimplexSnapshot, starConvexHull } from '@simplex-viz/core';
|
|
2
|
+
export { computeConvexHull, createAdaptiveHexMeshStrategy, createFixedLatticeMeshStrategy, createIncrementalAnchorClusteringStrategy, createJaccardAnnealingClusteringStrategy, createLocalAdaptiveLayoutStrategy, createOklabContrastColorStrategy, createPaletteColorStrategy, createPbdUniformLayoutStrategy, createThemeAdaptiveOklabColorStrategy, createWarmStartPbdLayoutStrategy, rectToConvexPolygon, regularPolygon, solveSimplexSnapshot, starConvexHull } from '@simplex-viz/core';
|
|
3
3
|
|
|
4
4
|
// src/hullMeasure.ts
|
|
5
5
|
var SVG_NS = "http://www.w3.org/2000/svg";
|
|
@@ -962,16 +962,20 @@ var SimplexSvgController = class _SimplexSvgController {
|
|
|
962
962
|
currentPreset;
|
|
963
963
|
currentTheme;
|
|
964
964
|
usesCustomVisualResolver;
|
|
965
|
+
cameraProxy;
|
|
965
966
|
rafId = null;
|
|
966
967
|
lastFrameTs = 0;
|
|
967
968
|
fpsSamples = 0;
|
|
968
969
|
fpsAccumMs = 0;
|
|
969
970
|
destroyed = false;
|
|
970
|
-
// Centralized drag-to-pan state on root <svg>
|
|
971
|
+
// Centralized drag-to-pan and multi-touch pinch-zoom state on root <svg>
|
|
971
972
|
isDraggingPan = false;
|
|
972
973
|
dragStartX = 0;
|
|
973
974
|
dragStartY = 0;
|
|
974
975
|
dragMoved = false;
|
|
976
|
+
activePointers = /* @__PURE__ */ new Map();
|
|
977
|
+
lastPinchDist = null;
|
|
978
|
+
lastPinchMid = null;
|
|
975
979
|
constructor(containerEl, options) {
|
|
976
980
|
this.containerEl = resolveContainerElement(containerEl);
|
|
977
981
|
this.onFpsUpdate = options.onFpsUpdate;
|
|
@@ -1018,11 +1022,42 @@ var SimplexSvgController = class _SimplexSvgController {
|
|
|
1018
1022
|
resolveTagMeta: options.resolveTagMeta,
|
|
1019
1023
|
meshOptions: options.meshOptions,
|
|
1020
1024
|
layoutOptions: options.layoutOptions,
|
|
1025
|
+
meshStrategy: options.meshStrategy,
|
|
1026
|
+
clusteringStrategy: options.clusteringStrategy,
|
|
1027
|
+
colorStrategy: options.colorStrategy,
|
|
1028
|
+
layoutStrategy: options.layoutStrategy,
|
|
1029
|
+
theme: this.currentTheme,
|
|
1021
1030
|
showHulls: options.showHulls,
|
|
1022
1031
|
interactions: this.wrapInteractions(options.interactions),
|
|
1023
1032
|
onMetricsChange: options.onMetricsChange,
|
|
1024
1033
|
onClustersChange: options.onClustersChange
|
|
1025
1034
|
});
|
|
1035
|
+
const baseCamera = this.engine.camera;
|
|
1036
|
+
const syncCameraRender = () => {
|
|
1037
|
+
if (this.destroyed) return;
|
|
1038
|
+
this.engine.renderNow();
|
|
1039
|
+
};
|
|
1040
|
+
this.cameraProxy = {
|
|
1041
|
+
getState: () => baseCamera.getState(),
|
|
1042
|
+
setState: (next) => {
|
|
1043
|
+
baseCamera.setState(next);
|
|
1044
|
+
syncCameraRender();
|
|
1045
|
+
},
|
|
1046
|
+
zoomToCursor: (screenX, screenY, zoomFactor) => {
|
|
1047
|
+
baseCamera.zoomToCursor(screenX, screenY, zoomFactor);
|
|
1048
|
+
syncCameraRender();
|
|
1049
|
+
},
|
|
1050
|
+
panBy: (dx, dy) => {
|
|
1051
|
+
baseCamera.panBy(dx, dy);
|
|
1052
|
+
syncCameraRender();
|
|
1053
|
+
},
|
|
1054
|
+
reset: () => {
|
|
1055
|
+
baseCamera.reset();
|
|
1056
|
+
syncCameraRender();
|
|
1057
|
+
},
|
|
1058
|
+
screenToWorld: (screenX, screenY) => baseCamera.screenToWorld(screenX, screenY),
|
|
1059
|
+
worldToScreen: (worldX, worldY) => baseCamera.worldToScreen(worldX, worldY)
|
|
1060
|
+
};
|
|
1026
1061
|
this.attachSvgListeners();
|
|
1027
1062
|
if (typeof ResizeObserver !== "undefined") {
|
|
1028
1063
|
this.resizeObserver = new ResizeObserver((entries) => {
|
|
@@ -1155,7 +1190,7 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1155
1190
|
}
|
|
1156
1191
|
}
|
|
1157
1192
|
get camera() {
|
|
1158
|
-
return this.
|
|
1193
|
+
return this.cameraProxy;
|
|
1159
1194
|
}
|
|
1160
1195
|
getSvgElement() {
|
|
1161
1196
|
return this.svgEl;
|
|
@@ -1214,6 +1249,7 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1214
1249
|
if (this.tooltipEl) {
|
|
1215
1250
|
this.applyTooltipThemeStyles(this.tooltipEl);
|
|
1216
1251
|
}
|
|
1252
|
+
this.engine.setTheme(theme);
|
|
1217
1253
|
if (!this.usesCustomVisualResolver) {
|
|
1218
1254
|
const resolver = createPresetVisualResolver(
|
|
1219
1255
|
this.currentPreset,
|
|
@@ -1223,8 +1259,44 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1223
1259
|
this.engine.setVisualResolver(
|
|
1224
1260
|
resolver
|
|
1225
1261
|
);
|
|
1226
|
-
this.ensureLoopRunning();
|
|
1227
1262
|
}
|
|
1263
|
+
this.ensureLoopRunning();
|
|
1264
|
+
}
|
|
1265
|
+
setMeshStrategy(strategy) {
|
|
1266
|
+
this.engine.setMeshStrategy(strategy);
|
|
1267
|
+
this.ensureLoopRunning();
|
|
1268
|
+
}
|
|
1269
|
+
setClusteringStrategy(strategy) {
|
|
1270
|
+
this.engine.setClusteringStrategy(strategy);
|
|
1271
|
+
this.ensureLoopRunning();
|
|
1272
|
+
}
|
|
1273
|
+
setColorStrategy(strategy) {
|
|
1274
|
+
this.engine.setColorStrategy(strategy);
|
|
1275
|
+
this.ensureLoopRunning();
|
|
1276
|
+
}
|
|
1277
|
+
setLayoutStrategy(strategy) {
|
|
1278
|
+
this.engine.setLayoutStrategy(strategy);
|
|
1279
|
+
this.ensureLoopRunning();
|
|
1280
|
+
}
|
|
1281
|
+
getMeshStrategy() {
|
|
1282
|
+
return this.engine.getMeshStrategy();
|
|
1283
|
+
}
|
|
1284
|
+
getClusteringStrategy() {
|
|
1285
|
+
return this.engine.getClusteringStrategy();
|
|
1286
|
+
}
|
|
1287
|
+
getColorStrategy() {
|
|
1288
|
+
return this.engine.getColorStrategy();
|
|
1289
|
+
}
|
|
1290
|
+
getLayoutStrategy() {
|
|
1291
|
+
return this.engine.getLayoutStrategy();
|
|
1292
|
+
}
|
|
1293
|
+
setMeshOptions(options) {
|
|
1294
|
+
this.engine.setMeshOptions(options);
|
|
1295
|
+
this.ensureLoopRunning();
|
|
1296
|
+
}
|
|
1297
|
+
setLayoutOptions(options) {
|
|
1298
|
+
this.engine.setLayoutOptions(options);
|
|
1299
|
+
this.ensureLoopRunning();
|
|
1228
1300
|
}
|
|
1229
1301
|
setTooltip(tooltip) {
|
|
1230
1302
|
this.tooltipOption = tooltip;
|
|
@@ -1274,9 +1346,25 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1274
1346
|
y: clientY - rect.top
|
|
1275
1347
|
};
|
|
1276
1348
|
}
|
|
1349
|
+
resetTouchPinchState() {
|
|
1350
|
+
this.lastPinchDist = null;
|
|
1351
|
+
this.lastPinchMid = null;
|
|
1352
|
+
}
|
|
1277
1353
|
onPointerDown = (e) => {
|
|
1278
|
-
if (e.button !== 0) return;
|
|
1354
|
+
if (e.pointerType === "mouse" && e.button !== 0) return;
|
|
1279
1355
|
const { x, y } = this.toLocalCoords(e.clientX, e.clientY);
|
|
1356
|
+
this.activePointers.set(e.pointerId, { x, y });
|
|
1357
|
+
if (this.activePointers.size >= 2) {
|
|
1358
|
+
this.isDraggingPan = false;
|
|
1359
|
+
this.dragMoved = true;
|
|
1360
|
+
const pts = [...this.activePointers.values()];
|
|
1361
|
+
const p0 = pts[0];
|
|
1362
|
+
const p1 = pts[1];
|
|
1363
|
+
this.lastPinchDist = Math.hypot(p1.x - p0.x, p1.y - p0.y);
|
|
1364
|
+
this.lastPinchMid = { x: (p0.x + p1.x) * 0.5, y: (p0.y + p1.y) * 0.5 };
|
|
1365
|
+
this.hideTooltip();
|
|
1366
|
+
return;
|
|
1367
|
+
}
|
|
1280
1368
|
const hit = this.engine.hitTest(x, y);
|
|
1281
1369
|
if (hit.kind === "background") {
|
|
1282
1370
|
this.isDraggingPan = true;
|
|
@@ -1291,10 +1379,34 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1291
1379
|
};
|
|
1292
1380
|
onPointerMove = (e) => {
|
|
1293
1381
|
const { x, y } = this.toLocalCoords(e.clientX, e.clientY);
|
|
1382
|
+
if (this.activePointers.has(e.pointerId)) {
|
|
1383
|
+
this.activePointers.set(e.pointerId, { x, y });
|
|
1384
|
+
}
|
|
1385
|
+
if (this.activePointers.size >= 2) {
|
|
1386
|
+
const pts = [...this.activePointers.values()];
|
|
1387
|
+
const p0 = pts[0];
|
|
1388
|
+
const p1 = pts[1];
|
|
1389
|
+
const dist = Math.hypot(p1.x - p0.x, p1.y - p0.y);
|
|
1390
|
+
const mid = { x: (p0.x + p1.x) * 0.5, y: (p0.y + p1.y) * 0.5 };
|
|
1391
|
+
if (this.lastPinchDist !== null && this.lastPinchMid !== null && this.lastPinchDist > 8 && dist > 8) {
|
|
1392
|
+
const dx = mid.x - this.lastPinchMid.x;
|
|
1393
|
+
const dy = mid.y - this.lastPinchMid.y;
|
|
1394
|
+
const zoomFactor = dist / this.lastPinchDist;
|
|
1395
|
+
this.engine.camera.panBy(dx, dy);
|
|
1396
|
+
this.engine.camera.zoomToCursor(mid.x, mid.y, zoomFactor);
|
|
1397
|
+
this.dragMoved = true;
|
|
1398
|
+
this.hideTooltip();
|
|
1399
|
+
this.engine.renderNow();
|
|
1400
|
+
}
|
|
1401
|
+
this.lastPinchDist = dist;
|
|
1402
|
+
this.lastPinchMid = mid;
|
|
1403
|
+
return;
|
|
1404
|
+
}
|
|
1294
1405
|
if (this.isDraggingPan) {
|
|
1295
1406
|
const dx = e.clientX - this.dragStartX;
|
|
1296
1407
|
const dy = e.clientY - this.dragStartY;
|
|
1297
|
-
|
|
1408
|
+
const dragThreshold = e.pointerType === "touch" ? 6 : 3;
|
|
1409
|
+
if (Math.hypot(dx, dy) > dragThreshold) {
|
|
1298
1410
|
this.dragMoved = true;
|
|
1299
1411
|
}
|
|
1300
1412
|
if (this.dragMoved) {
|
|
@@ -1302,23 +1414,47 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1302
1414
|
this.dragStartY = e.clientY;
|
|
1303
1415
|
this.engine.camera.panBy(dx, dy);
|
|
1304
1416
|
this.hideTooltip();
|
|
1305
|
-
this.
|
|
1417
|
+
this.engine.renderNow();
|
|
1306
1418
|
}
|
|
1307
1419
|
return;
|
|
1308
1420
|
}
|
|
1421
|
+
if (e.pointerType === "touch") {
|
|
1422
|
+
return;
|
|
1423
|
+
}
|
|
1309
1424
|
this.engine.handlePointerMove(x, y);
|
|
1310
1425
|
const hit = this.engine.hitTest(x, y);
|
|
1311
1426
|
this.svgEl.style.cursor = hit.kind === "background" ? "grab" : "pointer";
|
|
1312
1427
|
this.ensureLoopRunning();
|
|
1313
1428
|
};
|
|
1314
|
-
onPointerUp = () => {
|
|
1315
|
-
|
|
1429
|
+
onPointerUp = (e) => {
|
|
1430
|
+
this.activePointers.delete(e.pointerId);
|
|
1431
|
+
if (this.activePointers.size < 2) {
|
|
1432
|
+
this.resetTouchPinchState();
|
|
1433
|
+
}
|
|
1434
|
+
if (this.activePointers.size === 0 && this.isDraggingPan) {
|
|
1435
|
+
this.isDraggingPan = false;
|
|
1436
|
+
this.svgEl.style.cursor = "grab";
|
|
1437
|
+
}
|
|
1438
|
+
};
|
|
1439
|
+
onPointerCancel = (e) => {
|
|
1440
|
+
this.activePointers.delete(e.pointerId);
|
|
1441
|
+
if (this.activePointers.size < 2) {
|
|
1442
|
+
this.resetTouchPinchState();
|
|
1443
|
+
}
|
|
1444
|
+
if (this.activePointers.size === 0) {
|
|
1316
1445
|
this.isDraggingPan = false;
|
|
1446
|
+
this.dragMoved = false;
|
|
1317
1447
|
this.svgEl.style.cursor = "grab";
|
|
1318
1448
|
}
|
|
1319
1449
|
};
|
|
1320
|
-
onPointerLeave = () => {
|
|
1321
|
-
this.
|
|
1450
|
+
onPointerLeave = (e) => {
|
|
1451
|
+
this.activePointers.delete(e.pointerId);
|
|
1452
|
+
if (this.activePointers.size < 2) {
|
|
1453
|
+
this.resetTouchPinchState();
|
|
1454
|
+
}
|
|
1455
|
+
if (this.activePointers.size === 0) {
|
|
1456
|
+
this.isDraggingPan = false;
|
|
1457
|
+
}
|
|
1322
1458
|
this.hideTooltip();
|
|
1323
1459
|
this.engine.handlePointerLeave();
|
|
1324
1460
|
this.ensureLoopRunning();
|
|
@@ -1375,6 +1511,7 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1375
1511
|
this.svgEl.addEventListener("pointerdown", this.onPointerDown);
|
|
1376
1512
|
this.svgEl.addEventListener("pointermove", this.onPointerMove);
|
|
1377
1513
|
this.svgEl.addEventListener("pointerup", this.onPointerUp);
|
|
1514
|
+
this.svgEl.addEventListener("pointercancel", this.onPointerCancel);
|
|
1378
1515
|
this.svgEl.addEventListener("pointerleave", this.onPointerLeave);
|
|
1379
1516
|
this.svgEl.addEventListener("click", this.onClick);
|
|
1380
1517
|
this.svgEl.addEventListener("contextmenu", this.onContextMenu);
|
|
@@ -1384,6 +1521,7 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1384
1521
|
this.svgEl.removeEventListener("pointerdown", this.onPointerDown);
|
|
1385
1522
|
this.svgEl.removeEventListener("pointermove", this.onPointerMove);
|
|
1386
1523
|
this.svgEl.removeEventListener("pointerup", this.onPointerUp);
|
|
1524
|
+
this.svgEl.removeEventListener("pointercancel", this.onPointerCancel);
|
|
1387
1525
|
this.svgEl.removeEventListener("pointerleave", this.onPointerLeave);
|
|
1388
1526
|
this.svgEl.removeEventListener("click", this.onClick);
|
|
1389
1527
|
this.svgEl.removeEventListener("contextmenu", this.onContextMenu);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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 SimplexClusteringStrategy,\n type SimplexColorStrategy,\n type SimplexLayoutStrategy,\n type SimplexMeshStrategy,\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 meshStrategy?: SimplexMeshStrategy<TItem>;\n readonly clusteringStrategy?: SimplexClusteringStrategy<TItem, TTagMeta>;\n readonly colorStrategy?: SimplexColorStrategy<TItem, TTagMeta>;\n readonly layoutStrategy?: SimplexLayoutStrategy;\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 private readonly cameraProxy: CameraController;\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 and multi-touch pinch-zoom state on root <svg>\n private isDraggingPan = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragMoved = false;\n private readonly activePointers = new Map<number, { x: number; y: number }>();\n private lastPinchDist: number | null = null;\n private lastPinchMid: { x: number; y: number } | null = null;\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 meshStrategy: options.meshStrategy,\n clusteringStrategy: options.clusteringStrategy,\n colorStrategy: options.colorStrategy,\n layoutStrategy: options.layoutStrategy,\n theme: this.currentTheme,\n showHulls: options.showHulls,\n interactions: this.wrapInteractions(options.interactions),\n onMetricsChange: options.onMetricsChange,\n onClustersChange: options.onClustersChange,\n });\n\n const baseCamera = this.engine.camera;\n const syncCameraRender = (): void => {\n if (this.destroyed) return;\n this.engine.renderNow();\n };\n this.cameraProxy = {\n getState: () => baseCamera.getState(),\n setState: (next) => {\n baseCamera.setState(next);\n syncCameraRender();\n },\n zoomToCursor: (screenX, screenY, zoomFactor) => {\n baseCamera.zoomToCursor(screenX, screenY, zoomFactor);\n syncCameraRender();\n },\n panBy: (dx, dy) => {\n baseCamera.panBy(dx, dy);\n syncCameraRender();\n },\n reset: () => {\n baseCamera.reset();\n syncCameraRender();\n },\n screenToWorld: (screenX, screenY) => baseCamera.screenToWorld(screenX, screenY),\n worldToScreen: (worldX, worldY) => baseCamera.worldToScreen(worldX, worldY),\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.cameraProxy;\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 this.engine.setTheme(theme);\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 }\n this.ensureLoopRunning();\n }\n\n setMeshStrategy(strategy: SimplexMeshStrategy<TItem>): void {\n this.engine.setMeshStrategy(strategy);\n this.ensureLoopRunning();\n }\n\n setClusteringStrategy(strategy: SimplexClusteringStrategy<TItem, TTagMeta>): void {\n this.engine.setClusteringStrategy(strategy);\n this.ensureLoopRunning();\n }\n\n setColorStrategy(strategy: SimplexColorStrategy<TItem, TTagMeta>): void {\n this.engine.setColorStrategy(strategy);\n this.ensureLoopRunning();\n }\n\n setLayoutStrategy(strategy: SimplexLayoutStrategy): void {\n this.engine.setLayoutStrategy(strategy);\n this.ensureLoopRunning();\n }\n\n getMeshStrategy(): SimplexMeshStrategy<TItem> {\n return this.engine.getMeshStrategy();\n }\n\n getClusteringStrategy(): SimplexClusteringStrategy<TItem, TTagMeta> {\n return this.engine.getClusteringStrategy();\n }\n\n getColorStrategy(): SimplexColorStrategy<TItem, TTagMeta> {\n return this.engine.getColorStrategy();\n }\n\n getLayoutStrategy(): SimplexLayoutStrategy {\n return this.engine.getLayoutStrategy();\n }\n\n setMeshOptions(options: MeshOptions): void {\n this.engine.setMeshOptions(options);\n this.ensureLoopRunning();\n }\n\n setLayoutOptions(options: LayoutSolverOptions): void {\n this.engine.setLayoutOptions(options);\n this.ensureLoopRunning();\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 resetTouchPinchState(): void {\n this.lastPinchDist = null;\n this.lastPinchMid = null;\n }\n\n private readonly onPointerDown = (e: PointerEvent): void => {\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n const { x, y } = this.toLocalCoords(e.clientX, e.clientY);\n this.activePointers.set(e.pointerId, { x, y });\n\n if (this.activePointers.size >= 2) {\n this.isDraggingPan = false;\n this.dragMoved = true;\n const pts = [...this.activePointers.values()];\n const p0 = pts[0]!;\n const p1 = pts[1]!;\n this.lastPinchDist = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n this.lastPinchMid = { x: (p0.x + p1.x) * 0.5, y: (p0.y + p1.y) * 0.5 };\n this.hideTooltip();\n return;\n }\n\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.activePointers.has(e.pointerId)) {\n this.activePointers.set(e.pointerId, { x, y });\n }\n\n if (this.activePointers.size >= 2) {\n const pts = [...this.activePointers.values()];\n const p0 = pts[0]!;\n const p1 = pts[1]!;\n const dist = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n const mid = { x: (p0.x + p1.x) * 0.5, y: (p0.y + p1.y) * 0.5 };\n\n if (this.lastPinchDist !== null && this.lastPinchMid !== null && this.lastPinchDist > 8 && dist > 8) {\n const dx = mid.x - this.lastPinchMid.x;\n const dy = mid.y - this.lastPinchMid.y;\n const zoomFactor = dist / this.lastPinchDist;\n this.engine.camera.panBy(dx, dy);\n this.engine.camera.zoomToCursor(mid.x, mid.y, zoomFactor);\n this.dragMoved = true;\n this.hideTooltip();\n this.engine.renderNow();\n }\n this.lastPinchDist = dist;\n this.lastPinchMid = mid;\n return;\n }\n\n if (this.isDraggingPan) {\n const dx = e.clientX - this.dragStartX;\n const dy = e.clientY - this.dragStartY;\n const dragThreshold = e.pointerType === 'touch' ? 6 : 3;\n if (Math.hypot(dx, dy) > dragThreshold) {\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.engine.renderNow();\n }\n return;\n }\n\n if (e.pointerType === 'touch') {\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 = (e: PointerEvent): void => {\n this.activePointers.delete(e.pointerId);\n if (this.activePointers.size < 2) {\n this.resetTouchPinchState();\n }\n if (this.activePointers.size === 0 && this.isDraggingPan) {\n this.isDraggingPan = false;\n this.svgEl.style.cursor = 'grab';\n }\n };\n\n private readonly onPointerCancel = (e: PointerEvent): void => {\n this.activePointers.delete(e.pointerId);\n if (this.activePointers.size < 2) {\n this.resetTouchPinchState();\n }\n if (this.activePointers.size === 0) {\n this.isDraggingPan = false;\n this.dragMoved = false;\n this.svgEl.style.cursor = 'grab';\n }\n };\n\n private readonly onPointerLeave = (e: PointerEvent): void => {\n this.activePointers.delete(e.pointerId);\n if (this.activePointers.size < 2) {\n this.resetTouchPinchState();\n }\n if (this.activePointers.size === 0) {\n this.isDraggingPan = false;\n }\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('pointercancel', this.onPointerCancel);\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('pointercancel', this.onPointerCancel);\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplex-viz/svg",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Framework-agnostic SVG rendering engine, offscreen getBBox() hull measurer, and pluggable SvgNodeView system for @simplex-viz/core.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"LICENSE"
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@simplex-viz/core": "^0.
|
|
23
|
+
"@simplex-viz/core": "^0.3.0"
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
|
26
26
|
"simplex",
|