@simplex-viz/svg 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/SimplexSvgController.d.ts +11 -1
- package/dist/SimplexSvgController.d.ts.map +1 -1
- package/dist/index.js +94 -37
- package/dist/index.js.map +1 -1
- package/dist/presets.d.ts +2 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/views/BadgeClusterSvgView.d.ts +1 -0
- package/dist/views/BadgeClusterSvgView.d.ts.map +1 -1
- package/dist/views/ClusterAnchorSvgView.d.ts +1 -0
- package/dist/views/ClusterAnchorSvgView.d.ts.map +1 -1
- package/dist/views/GeometricShapeSvgView.d.ts +1 -0
- package/dist/views/GeometricShapeSvgView.d.ts.map +1 -1
- package/dist/views/MultiSectorGlyphSvgView.d.ts +1 -0
- package/dist/views/MultiSectorGlyphSvgView.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/ghackenberg/simplex-viz/main/docs/assets/logo-svg.png" width="
|
|
2
|
+
<img src="https://raw.githubusercontent.com/ghackenberg/simplex-viz/main/docs/assets/logo-svg.png" width="525" alt="SimplexViz / svg — @simplex-viz/svg" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
# @simplex-viz/svg
|
|
@@ -1,5 +1,5 @@
|
|
|
1
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';
|
|
2
|
-
import { type DefaultClusterPresetVisual, type DefaultContentPresetVisual, type SimplexVisualPreset } from './presets';
|
|
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: ({
|
|
5
5
|
readonly kind: 'content';
|
|
@@ -14,6 +14,8 @@ export interface SimplexSvgControllerResolvedOptions<TItem = DefaultTaggedItem,
|
|
|
14
14
|
readonly deriveClusterMeta?: (ctx: ClusterDerivationContext<TItem, TTagMeta>) => TClusterMeta;
|
|
15
15
|
/** Built-in visual preset used when `visualResolver` / views are omitted. Default: `'geometric'`. */
|
|
16
16
|
readonly preset?: SimplexVisualPreset;
|
|
17
|
+
/** Visual color theme (`'dark'` or `'light'`) for built-in presets and tooltips. Default: `'dark'`. */
|
|
18
|
+
readonly theme?: SimplexTheme;
|
|
17
19
|
/** Optional custom visual resolver (defaults to the active `preset` resolver). */
|
|
18
20
|
readonly visualResolver?: VisualResolver<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>;
|
|
19
21
|
/** Optional custom content `SvgNodeView` (defaults to the active `preset` view). */
|
|
@@ -58,6 +60,9 @@ export declare class SimplexSvgController<TItem = DefaultTaggedItem, TContentVis
|
|
|
58
60
|
private tooltipOption;
|
|
59
61
|
private tooltipEl;
|
|
60
62
|
private focusedClusterUidState;
|
|
63
|
+
private currentPreset;
|
|
64
|
+
private currentTheme;
|
|
65
|
+
private readonly usesCustomVisualResolver;
|
|
61
66
|
private rafId;
|
|
62
67
|
private lastFrameTs;
|
|
63
68
|
private fpsSamples;
|
|
@@ -72,6 +77,7 @@ export declare class SimplexSvgController<TItem = DefaultTaggedItem, TContentVis
|
|
|
72
77
|
private wrapInteractions;
|
|
73
78
|
private formatContentTooltip;
|
|
74
79
|
private formatClusterTooltip;
|
|
80
|
+
private applyTooltipThemeStyles;
|
|
75
81
|
private ensureTooltipElement;
|
|
76
82
|
private showTooltip;
|
|
77
83
|
private hideTooltip;
|
|
@@ -88,6 +94,10 @@ export declare class SimplexSvgController<TItem = DefaultTaggedItem, TContentVis
|
|
|
88
94
|
* morph/crossfade transitions.
|
|
89
95
|
*/
|
|
90
96
|
setPreset(preset: SimplexVisualPreset, getLabel?: (item: TItem) => string): void;
|
|
97
|
+
/**
|
|
98
|
+
* Switches built-in preset & tooltip theme between `'dark'` and `'light'`.
|
|
99
|
+
*/
|
|
100
|
+
setTheme(theme: SimplexTheme): void;
|
|
91
101
|
setTooltip(tooltip: boolean | SimplexTooltipFormatter<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>): void;
|
|
92
102
|
setVisualResolver(resolver: VisualResolver<TItem, TContentVisual, TClusterVisual, TTagMeta, TClusterMeta>): void;
|
|
93
103
|
setViews(views: Partial<SvgRendererOptions<TContentVisual, TClusterVisual>>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimplexSvgController.d.ts","sourceRoot":"","sources":["../src/SimplexSvgController.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAIL,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGnF,MAAM,MAAM,uBAAuB,CACjC,KAAK,GAAG,iBAAiB,EACzB,cAAc,GAAG,0BAA0B,EAC3C,cAAc,GAAG,0BAA0B,EAC3C,QAAQ,GAAG,SAAS,EACpB,YAAY,GAAG,SAAS,IACtB,CACF,MAAM,EACF,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,iBAAiB,CAC/C,KAAK,EACL,cAAc,EACd,QAAQ,EACR,YAAY,CACb,CAAC,GACF,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,iBAAiB,CAC/C,KAAK,EACL,cAAc,EACd,QAAQ,EACR,YAAY,CACb,CAAC,KACH,MAAM,CAAC;AAEZ,MAAM,WAAW,mCAAmC,CAClD,KAAK,GAAG,iBAAiB,EACzB,cAAc,GAAG,0BAA0B,EAC3C,cAAc,GAAG,0BAA0B,EAC3C,QAAQ,GAAG,SAAS,EACpB,YAAY,GAAG,SAAS;IAExB,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,SAAS,MAAM,EAAE,CAAC;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAC3B,GAAG,EAAE,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,KAC3C,YAAY,CAAC;IAClB,qGAAqG;IACrG,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IACtC,kFAAkF;IAClF,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CACtC,KAAK,EACL,cAAc,EACd,cAAc,EACd,QAAQ,EACR,YAAY,CACb,CAAC;IACF,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC;IACzF,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC;IACzF,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,2GAA2G;IAC3G,QAAQ,CAAC,OAAO,CAAC,EACb,OAAO,GACP,uBAAuB,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC3F,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CACzC,KAAK,EACL,cAAc,EACd,cAAc,EACd,QAAQ,EACR,YAAY,CACb,CAAC;IACF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAC1B,QAAQ,EAAE,SAAS,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,KAClE,IAAI,CAAC;IACV,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,2BAA2B,CACrC,KAAK,GAAG,iBAAiB,EACzB,cAAc,GAAG,0BAA0B,EAC3C,cAAc,GAAG,0BAA0B,EAC3C,QAAQ,GAAG,SAAS,EACpB,YAAY,GAAG,SAAS,IACtB,kBAAkB,CAAC,KAAK,CAAC,GAC3B,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,GAChD,IAAI,CACF,mCAAmC,CACjC,KAAK,EACL,cAAc,EACd,cAAc,EACd,QAAQ,EACR,YAAY,CACb,EACD,OAAO,GAAG,SAAS,GAAG,mBAAmB,CAC1C,CAAC;AAoBJ;;;;;;GAMG;AACH,qBAAa,oBAAoB,CAC/B,KAAK,GAAG,iBAAiB,EACzB,cAAc,GAAG,0BAA0B,EAC3C,cAAc,GAAG,0BAA0B,EAC3C,QAAQ,GAAG,SAAS,EACpB,YAAY,GAAG,SAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqD;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAMrB;IACF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAwB;IACrD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,iBAAiB,CAAC,CAA0B;IACpD,OAAO,CAAC,aAAa,CAEsE;IAC3F,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,sBAAsB,CAAuB;
|
|
1
|
+
{"version":3,"file":"SimplexSvgController.d.ts","sourceRoot":"","sources":["../src/SimplexSvgController.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -98,6 +98,11 @@ var BadgeClusterSvgView = class {
|
|
|
98
98
|
while (groupEl.firstChild) {
|
|
99
99
|
groupEl.removeChild(groupEl.firstChild);
|
|
100
100
|
}
|
|
101
|
+
const isLight = visual.theme === "light";
|
|
102
|
+
const cardFill = isLight ? "#ffffff" : "#0d1320";
|
|
103
|
+
const hoverStroke = isLight ? "#0f172a" : "#e2e8f0";
|
|
104
|
+
const titleFill = isLight ? "#0f172a" : "#f1f5f9";
|
|
105
|
+
const metaFill = isLight ? "#475569" : "#94a3b8";
|
|
101
106
|
const titleLen = visual.title.length;
|
|
102
107
|
const metaLen = visual.metaLine.length;
|
|
103
108
|
const estWidth = Math.max(122, Math.max(titleLen * 6.8 + 44, metaLen * 5.9 + 24));
|
|
@@ -109,11 +114,11 @@ var BadgeClusterSvgView = class {
|
|
|
109
114
|
bg.setAttribute("width", String(estWidth));
|
|
110
115
|
bg.setAttribute("height", String(height));
|
|
111
116
|
bg.setAttribute("rx", "8");
|
|
112
|
-
bg.setAttribute("fill",
|
|
113
|
-
bg.setAttribute("fill-opacity", "0.94");
|
|
117
|
+
bg.setAttribute("fill", cardFill);
|
|
118
|
+
bg.setAttribute("fill-opacity", isLight ? "0.97" : "0.94");
|
|
114
119
|
bg.setAttribute(
|
|
115
120
|
"stroke",
|
|
116
|
-
state.interaction.isPinned ? "#f59e0b" : state.interaction.isHovered || state.interaction.isHighlighted ?
|
|
121
|
+
state.interaction.isPinned ? "#f59e0b" : state.interaction.isHovered || state.interaction.isHighlighted ? hoverStroke : visual.colorHex
|
|
117
122
|
);
|
|
118
123
|
bg.setAttribute(
|
|
119
124
|
"stroke-width",
|
|
@@ -129,7 +134,7 @@ var BadgeClusterSvgView = class {
|
|
|
129
134
|
const codeText = doc.createElementNS(SVG_NS, "text");
|
|
130
135
|
codeText.setAttribute("x", String(-halfW + 22));
|
|
131
136
|
codeText.setAttribute("y", String(-3));
|
|
132
|
-
codeText.setAttribute("fill", visual.colorHex);
|
|
137
|
+
codeText.setAttribute("fill", isLight ? "#0f172a" : visual.colorHex);
|
|
133
138
|
codeText.setAttribute("font-size", "10");
|
|
134
139
|
codeText.setAttribute("font-weight", "600");
|
|
135
140
|
codeText.setAttribute("font-family", "IBM Plex Mono, monospace");
|
|
@@ -138,7 +143,7 @@ var BadgeClusterSvgView = class {
|
|
|
138
143
|
const titleText = doc.createElementNS(SVG_NS, "text");
|
|
139
144
|
titleText.setAttribute("x", String(-halfW + 44));
|
|
140
145
|
titleText.setAttribute("y", String(-3));
|
|
141
|
-
titleText.setAttribute("fill",
|
|
146
|
+
titleText.setAttribute("fill", titleFill);
|
|
142
147
|
titleText.setAttribute("font-size", "11");
|
|
143
148
|
titleText.setAttribute("font-weight", "600");
|
|
144
149
|
titleText.setAttribute("font-family", "Plus Jakarta Sans, sans-serif");
|
|
@@ -148,7 +153,7 @@ var BadgeClusterSvgView = class {
|
|
|
148
153
|
subText.setAttribute("x", "0");
|
|
149
154
|
subText.setAttribute("y", "13");
|
|
150
155
|
subText.setAttribute("text-anchor", "middle");
|
|
151
|
-
subText.setAttribute("fill",
|
|
156
|
+
subText.setAttribute("fill", metaFill);
|
|
152
157
|
subText.setAttribute("font-size", "9.5");
|
|
153
158
|
subText.setAttribute("font-family", "IBM Plex Mono, monospace");
|
|
154
159
|
subText.textContent = visual.metaLine;
|
|
@@ -166,16 +171,20 @@ var ClusterAnchorSvgView = class {
|
|
|
166
171
|
while (groupEl.firstChild) {
|
|
167
172
|
groupEl.removeChild(groupEl.firstChild);
|
|
168
173
|
}
|
|
174
|
+
const isLight = visual.theme === "light";
|
|
175
|
+
const outerFill = isLight ? "#ffffff" : "#07090E";
|
|
176
|
+
const hoverStroke = isLight ? "#0f172a" : "#f8fafc";
|
|
177
|
+
const codeFill = isLight ? "#0f172a" : "#f8fafc";
|
|
169
178
|
const r = visual.radius;
|
|
170
179
|
const outer = doc.createElementNS(SVG_NS, "circle");
|
|
171
180
|
outer.setAttribute("cx", "0");
|
|
172
181
|
outer.setAttribute("cy", "0");
|
|
173
182
|
outer.setAttribute("r", String(r + 3));
|
|
174
|
-
outer.setAttribute("fill",
|
|
175
|
-
outer.setAttribute("fill-opacity", "0.88");
|
|
183
|
+
outer.setAttribute("fill", outerFill);
|
|
184
|
+
outer.setAttribute("fill-opacity", isLight ? "0.96" : "0.88");
|
|
176
185
|
outer.setAttribute(
|
|
177
186
|
"stroke",
|
|
178
|
-
state.interaction.isHovered || state.interaction.isHighlighted ?
|
|
187
|
+
state.interaction.isHovered || state.interaction.isHighlighted ? hoverStroke : visual.colorHex
|
|
179
188
|
);
|
|
180
189
|
outer.setAttribute("stroke-width", state.interaction.isHovered ? "2.4" : "1.6");
|
|
181
190
|
outer.setAttribute("stroke-dasharray", "4 2.5");
|
|
@@ -185,7 +194,7 @@ var ClusterAnchorSvgView = class {
|
|
|
185
194
|
inner.setAttribute("cy", "0");
|
|
186
195
|
inner.setAttribute("r", String(r - 2));
|
|
187
196
|
inner.setAttribute("fill", visual.colorHex);
|
|
188
|
-
inner.setAttribute("fill-opacity", "0.18");
|
|
197
|
+
inner.setAttribute("fill-opacity", isLight ? "0.14" : "0.18");
|
|
189
198
|
inner.setAttribute("stroke", visual.colorHex);
|
|
190
199
|
inner.setAttribute("stroke-width", "1.4");
|
|
191
200
|
groupEl.appendChild(inner);
|
|
@@ -193,7 +202,7 @@ var ClusterAnchorSvgView = class {
|
|
|
193
202
|
codeEl.setAttribute("x", "0");
|
|
194
203
|
codeEl.setAttribute("y", "-2");
|
|
195
204
|
codeEl.setAttribute("text-anchor", "middle");
|
|
196
|
-
codeEl.setAttribute("fill",
|
|
205
|
+
codeEl.setAttribute("fill", codeFill);
|
|
197
206
|
codeEl.setAttribute("font-size", "11");
|
|
198
207
|
codeEl.setAttribute("font-weight", "600");
|
|
199
208
|
codeEl.setAttribute("font-family", "IBM Plex Mono, monospace");
|
|
@@ -203,8 +212,9 @@ var ClusterAnchorSvgView = class {
|
|
|
203
212
|
countEl.setAttribute("x", "0");
|
|
204
213
|
countEl.setAttribute("y", "11");
|
|
205
214
|
countEl.setAttribute("text-anchor", "middle");
|
|
206
|
-
countEl.setAttribute("fill", visual.colorHex);
|
|
215
|
+
countEl.setAttribute("fill", isLight ? "#334155" : visual.colorHex);
|
|
207
216
|
countEl.setAttribute("font-size", "9");
|
|
217
|
+
countEl.setAttribute("font-weight", isLight ? "600" : "400");
|
|
208
218
|
countEl.setAttribute("font-family", "IBM Plex Mono, monospace");
|
|
209
219
|
countEl.textContent = `${visual.memberCount}n`;
|
|
210
220
|
groupEl.appendChild(countEl);
|
|
@@ -342,11 +352,15 @@ var GeometricShapeSvgView = class {
|
|
|
342
352
|
const { pathEl, ringEl } = this.ensureElements(groupEl);
|
|
343
353
|
const pts = sampleShapePerimeter(visual.shape, visual.radius);
|
|
344
354
|
const d = pointsToSvgPath(pts);
|
|
355
|
+
const isLight = visual.theme === "light";
|
|
356
|
+
const defaultStroke = isLight ? "rgba(15, 23, 42, 0.25)" : "rgba(15, 23, 42, 0.8)";
|
|
357
|
+
const hoverStroke = isLight ? "#0f172a" : "#f8fafc";
|
|
358
|
+
const accentRing = isLight ? "#0891b2" : "#22d3ee";
|
|
345
359
|
pathEl.setAttribute("d", d);
|
|
346
360
|
pathEl.setAttribute("fill", visual.fillHex);
|
|
347
361
|
pathEl.setAttribute(
|
|
348
362
|
"stroke",
|
|
349
|
-
state.interaction.isPinned ? "#f59e0b" : state.interaction.isHovered ?
|
|
363
|
+
state.interaction.isPinned ? "#f59e0b" : state.interaction.isHovered ? hoverStroke : visual.strokeHex ?? defaultStroke
|
|
350
364
|
);
|
|
351
365
|
pathEl.setAttribute(
|
|
352
366
|
"stroke-width",
|
|
@@ -355,7 +369,7 @@ var GeometricShapeSvgView = class {
|
|
|
355
369
|
if (state.interaction.isHovered || state.interaction.isPinned || state.interaction.isHighlighted) {
|
|
356
370
|
const outerPts = sampleShapePerimeter(visual.shape, visual.radius + 4.5);
|
|
357
371
|
ringEl.setAttribute("d", pointsToSvgPath(outerPts));
|
|
358
|
-
ringEl.setAttribute("stroke", state.interaction.isPinned ? "#f59e0b" :
|
|
372
|
+
ringEl.setAttribute("stroke", state.interaction.isPinned ? "#f59e0b" : accentRing);
|
|
359
373
|
ringEl.setAttribute("stroke-width", "1.4");
|
|
360
374
|
ringEl.setAttribute("stroke-opacity", "0.9");
|
|
361
375
|
} else {
|
|
@@ -375,11 +389,12 @@ var GeometricShapeSvgView = class {
|
|
|
375
389
|
y: a.y + (b.y - a.y) * progress
|
|
376
390
|
});
|
|
377
391
|
}
|
|
392
|
+
const isLight = to.theme === "light";
|
|
378
393
|
pathEl.setAttribute("d", pointsToSvgPath(morphed));
|
|
379
394
|
pathEl.setAttribute("fill", lerpHex(from.fillHex, to.fillHex, progress));
|
|
380
395
|
pathEl.setAttribute(
|
|
381
396
|
"stroke",
|
|
382
|
-
state.interaction.isHovered ? "#f8fafc" : to.strokeHex ?? "rgba(15, 23, 42, 0.8)"
|
|
397
|
+
state.interaction.isHovered ? isLight ? "#0f172a" : "#f8fafc" : to.strokeHex ?? (isLight ? "rgba(15, 23, 42, 0.25)" : "rgba(15, 23, 42, 0.8)")
|
|
383
398
|
);
|
|
384
399
|
pathEl.setAttribute("stroke-width", String(to.strokeWidth ?? 1.4));
|
|
385
400
|
ringEl.setAttribute("d", "");
|
|
@@ -427,6 +442,10 @@ var MultiSectorGlyphSvgView = class {
|
|
|
427
442
|
while (groupEl.firstChild) {
|
|
428
443
|
groupEl.removeChild(groupEl.firstChild);
|
|
429
444
|
}
|
|
445
|
+
const isLight = visual.theme === "light";
|
|
446
|
+
const dividerStroke = isLight ? "#ffffff" : "#07090E";
|
|
447
|
+
const hoverStroke = isLight ? "#0f172a" : "#f8fafc";
|
|
448
|
+
const defaultAccent = isLight ? "#0891b2" : "#22d3ee";
|
|
430
449
|
const totalWeight = visual.sectors.reduce((s, sec) => s + Math.max(0, sec.weight), 0) || 1;
|
|
431
450
|
let angle = -Math.PI / 2;
|
|
432
451
|
for (const sec of visual.sectors) {
|
|
@@ -439,7 +458,7 @@ var MultiSectorGlyphSvgView = class {
|
|
|
439
458
|
describeDonutSectorPath(visual.innerRadius, visual.outerRadius, angle, nextAngle)
|
|
440
459
|
);
|
|
441
460
|
path.setAttribute("fill", sec.colorHex);
|
|
442
|
-
path.setAttribute("stroke",
|
|
461
|
+
path.setAttribute("stroke", dividerStroke);
|
|
443
462
|
path.setAttribute("stroke-width", visual.sectors.length > 1 ? "1.1" : "0.8");
|
|
444
463
|
groupEl.appendChild(path);
|
|
445
464
|
angle = nextAngle;
|
|
@@ -458,7 +477,7 @@ var MultiSectorGlyphSvgView = class {
|
|
|
458
477
|
ring.setAttribute("fill", "none");
|
|
459
478
|
ring.setAttribute(
|
|
460
479
|
"stroke",
|
|
461
|
-
state.interaction.isPinned ? "#f59e0b" : state.interaction.isHovered ?
|
|
480
|
+
state.interaction.isPinned ? "#f59e0b" : state.interaction.isHovered ? hoverStroke : visual.accentRingHex ?? defaultAccent
|
|
462
481
|
);
|
|
463
482
|
ring.setAttribute("stroke-width", state.interaction.isHovered ? "2" : "1.2");
|
|
464
483
|
groupEl.appendChild(ring);
|
|
@@ -493,7 +512,7 @@ function createPresetViews(preset) {
|
|
|
493
512
|
const clusterView = preset === "badges" ? new BadgeClusterSvgView() : new ClusterAnchorSvgView();
|
|
494
513
|
return { contentView, clusterView };
|
|
495
514
|
}
|
|
496
|
-
function createPresetVisualResolver(preset, getLabel) {
|
|
515
|
+
function createPresetVisualResolver(preset, getLabel, theme = "dark") {
|
|
497
516
|
return {
|
|
498
517
|
resolveContentVisual: (item, ctx) => {
|
|
499
518
|
if (preset === "glyphs") {
|
|
@@ -504,7 +523,8 @@ function createPresetVisualResolver(preset, getLabel) {
|
|
|
504
523
|
colorHex: uc.cluster.colorHex,
|
|
505
524
|
weight: uc.weight
|
|
506
525
|
})),
|
|
507
|
-
centerColorHex: ctx.mixedColorHex
|
|
526
|
+
centerColorHex: ctx.mixedColorHex,
|
|
527
|
+
theme
|
|
508
528
|
};
|
|
509
529
|
}
|
|
510
530
|
const rank = ctx.unitClusters.length;
|
|
@@ -512,9 +532,10 @@ function createPresetVisualResolver(preset, getLabel) {
|
|
|
512
532
|
shape: rank >= 3 ? "star" : rank === 2 ? "diamond" : "circle",
|
|
513
533
|
radius: 9.5,
|
|
514
534
|
fillHex: ctx.mixedColorHex,
|
|
515
|
-
strokeHex: "#07090E",
|
|
535
|
+
strokeHex: theme === "light" ? "#ffffff" : "#07090E",
|
|
516
536
|
strokeWidth: 1.4,
|
|
517
|
-
label: extractDefaultItemLabel(item, ctx.id, getLabel)
|
|
537
|
+
label: extractDefaultItemLabel(item, ctx.id, getLabel),
|
|
538
|
+
theme
|
|
518
539
|
};
|
|
519
540
|
},
|
|
520
541
|
resolveClusterVisual: (cluster) => {
|
|
@@ -524,7 +545,8 @@ function createPresetVisualResolver(preset, getLabel) {
|
|
|
524
545
|
code: cluster.code,
|
|
525
546
|
title: cluster.defaultLabel,
|
|
526
547
|
metaLine: `${count} ${count === 1 ? "item" : "items"}`,
|
|
527
|
-
colorHex: cluster.colorHex
|
|
548
|
+
colorHex: cluster.colorHex,
|
|
549
|
+
theme
|
|
528
550
|
};
|
|
529
551
|
}
|
|
530
552
|
return {
|
|
@@ -532,21 +554,23 @@ function createPresetVisualResolver(preset, getLabel) {
|
|
|
532
554
|
label: cluster.defaultLabel,
|
|
533
555
|
memberCount: cluster.members.length,
|
|
534
556
|
colorHex: cluster.colorHex,
|
|
535
|
-
radius: 22
|
|
557
|
+
radius: 22,
|
|
558
|
+
theme
|
|
536
559
|
};
|
|
537
560
|
},
|
|
538
561
|
getVisualCacheKey: (visual) => {
|
|
562
|
+
const t = visual.theme ?? "dark";
|
|
539
563
|
if ("sectors" in visual) {
|
|
540
564
|
const secKey = visual.sectors.map((s) => `${s.colorHex}:${s.weight.toFixed(2)}`).join("|");
|
|
541
|
-
return `glyph:${visual.outerRadius}:${visual.centerColorHex}:${secKey}`;
|
|
565
|
+
return `glyph:${t}:${visual.outerRadius}:${visual.centerColorHex}:${secKey}`;
|
|
542
566
|
}
|
|
543
567
|
if ("shape" in visual) {
|
|
544
|
-
return `geom:${visual.shape}:${visual.radius}:${visual.fillHex}`;
|
|
568
|
+
return `geom:${t}:${visual.shape}:${visual.radius}:${visual.fillHex}`;
|
|
545
569
|
}
|
|
546
570
|
if ("metaLine" in visual) {
|
|
547
|
-
return `badge:${visual.code}:${visual.title}:${visual.metaLine}:${visual.colorHex}`;
|
|
571
|
+
return `badge:${t}:${visual.code}:${visual.title}:${visual.metaLine}:${visual.colorHex}`;
|
|
548
572
|
}
|
|
549
|
-
return `anchor:${visual.code}:${visual.memberCount}:${visual.colorHex}`;
|
|
573
|
+
return `anchor:${t}:${visual.code}:${visual.memberCount}:${visual.colorHex}`;
|
|
550
574
|
}
|
|
551
575
|
};
|
|
552
576
|
}
|
|
@@ -672,7 +696,7 @@ var SvgRendererAdapter = class {
|
|
|
672
696
|
}
|
|
673
697
|
while (this.edgeLines.length < snapshot.edges.length) {
|
|
674
698
|
const line = this.doc.createElementNS(SVG_NS, "line");
|
|
675
|
-
line.setAttribute("stroke", "rgba(
|
|
699
|
+
line.setAttribute("stroke", "rgba(100, 116, 139, 0.26)");
|
|
676
700
|
line.setAttribute("stroke-width", "1");
|
|
677
701
|
line.setAttribute("stroke-dasharray", "3 4");
|
|
678
702
|
this.edgesGroup.appendChild(line);
|
|
@@ -935,6 +959,9 @@ var SimplexSvgController = class _SimplexSvgController {
|
|
|
935
959
|
tooltipOption;
|
|
936
960
|
tooltipEl = null;
|
|
937
961
|
focusedClusterUidState = null;
|
|
962
|
+
currentPreset;
|
|
963
|
+
currentTheme;
|
|
964
|
+
usesCustomVisualResolver;
|
|
938
965
|
rafId = null;
|
|
939
966
|
lastFrameTs = 0;
|
|
940
967
|
fpsSamples = 0;
|
|
@@ -952,13 +979,16 @@ var SimplexSvgController = class _SimplexSvgController {
|
|
|
952
979
|
this.getLabelExtractor = options.getLabel;
|
|
953
980
|
this.tooltipOption = options.tooltip ?? false;
|
|
954
981
|
this.getIdExtractor = options.getId ?? ((item) => typeof item === "object" && item !== null && "id" in item ? String(item.id) : "");
|
|
955
|
-
|
|
956
|
-
|
|
982
|
+
this.currentPreset = options.preset ?? "geometric";
|
|
983
|
+
this.currentTheme = options.theme ?? "dark";
|
|
984
|
+
this.usesCustomVisualResolver = options.visualResolver !== void 0;
|
|
985
|
+
const presetViews = createPresetViews(this.currentPreset);
|
|
957
986
|
const contentView = options.contentView ?? presetViews.contentView;
|
|
958
987
|
const clusterView = options.clusterView ?? presetViews.clusterView;
|
|
959
988
|
const visualResolver = options.visualResolver ?? createPresetVisualResolver(
|
|
960
|
-
|
|
961
|
-
this.getLabelExtractor
|
|
989
|
+
this.currentPreset,
|
|
990
|
+
this.getLabelExtractor,
|
|
991
|
+
this.currentTheme
|
|
962
992
|
);
|
|
963
993
|
const doc = this.containerEl.ownerDocument;
|
|
964
994
|
this.svgEl = doc.createElementNS(SVG_NS, "svg");
|
|
@@ -1076,6 +1106,13 @@ ${tagList}` : label;
|
|
|
1076
1106
|
return `${ev.cluster.code} \xB7 ${ev.cluster.defaultLabel}
|
|
1077
1107
|
${count} ${count === 1 ? "item" : "items"}`;
|
|
1078
1108
|
}
|
|
1109
|
+
applyTooltipThemeStyles(el) {
|
|
1110
|
+
const isLight = this.currentTheme === "light";
|
|
1111
|
+
el.style.background = isLight ? "rgba(255, 255, 255, 0.96)" : "rgba(9, 13, 22, 0.94)";
|
|
1112
|
+
el.style.border = isLight ? "1px solid rgba(203, 213, 225, 0.95)" : "1px solid rgba(51, 65, 85, 0.85)";
|
|
1113
|
+
el.style.color = isLight ? "#0f172a" : "#f1f5f9";
|
|
1114
|
+
el.style.boxShadow = isLight ? "0 10px 24px rgba(15, 23, 42, 0.12)" : "0 10px 24px rgba(0, 0, 0, 0.45)";
|
|
1115
|
+
}
|
|
1079
1116
|
ensureTooltipElement() {
|
|
1080
1117
|
if (!this.tooltipOption) return null;
|
|
1081
1118
|
if (this.tooltipEl) return this.tooltipEl;
|
|
@@ -1093,14 +1130,11 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1093
1130
|
el.style.maxWidth = "240px";
|
|
1094
1131
|
el.style.padding = "7px 10px";
|
|
1095
1132
|
el.style.borderRadius = "8px";
|
|
1096
|
-
el.style.background = "rgba(9, 13, 22, 0.94)";
|
|
1097
|
-
el.style.border = "1px solid rgba(51, 65, 85, 0.85)";
|
|
1098
|
-
el.style.color = "#f1f5f9";
|
|
1099
1133
|
el.style.fontFamily = "Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif";
|
|
1100
1134
|
el.style.fontSize = "12px";
|
|
1101
1135
|
el.style.lineHeight = "1.4";
|
|
1102
1136
|
el.style.whiteSpace = "pre-line";
|
|
1103
|
-
|
|
1137
|
+
this.applyTooltipThemeStyles(el);
|
|
1104
1138
|
this.containerEl.appendChild(el);
|
|
1105
1139
|
this.tooltipEl = el;
|
|
1106
1140
|
return el;
|
|
@@ -1152,13 +1186,15 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1152
1186
|
* morph/crossfade transitions.
|
|
1153
1187
|
*/
|
|
1154
1188
|
setPreset(preset, getLabel) {
|
|
1189
|
+
this.currentPreset = preset;
|
|
1155
1190
|
if (getLabel !== void 0) {
|
|
1156
1191
|
this.getLabelExtractor = getLabel;
|
|
1157
1192
|
}
|
|
1158
1193
|
const views = createPresetViews(preset);
|
|
1159
1194
|
const resolver = createPresetVisualResolver(
|
|
1160
1195
|
preset,
|
|
1161
|
-
this.getLabelExtractor
|
|
1196
|
+
this.getLabelExtractor,
|
|
1197
|
+
this.currentTheme
|
|
1162
1198
|
);
|
|
1163
1199
|
this.adapter.setViews({
|
|
1164
1200
|
contentView: views.contentView,
|
|
@@ -1169,6 +1205,27 @@ ${count} ${count === 1 ? "item" : "items"}`;
|
|
|
1169
1205
|
);
|
|
1170
1206
|
this.ensureLoopRunning();
|
|
1171
1207
|
}
|
|
1208
|
+
/**
|
|
1209
|
+
* Switches built-in preset & tooltip theme between `'dark'` and `'light'`.
|
|
1210
|
+
*/
|
|
1211
|
+
setTheme(theme) {
|
|
1212
|
+
if (this.currentTheme === theme) return;
|
|
1213
|
+
this.currentTheme = theme;
|
|
1214
|
+
if (this.tooltipEl) {
|
|
1215
|
+
this.applyTooltipThemeStyles(this.tooltipEl);
|
|
1216
|
+
}
|
|
1217
|
+
if (!this.usesCustomVisualResolver) {
|
|
1218
|
+
const resolver = createPresetVisualResolver(
|
|
1219
|
+
this.currentPreset,
|
|
1220
|
+
this.getLabelExtractor,
|
|
1221
|
+
theme
|
|
1222
|
+
);
|
|
1223
|
+
this.engine.setVisualResolver(
|
|
1224
|
+
resolver
|
|
1225
|
+
);
|
|
1226
|
+
this.ensureLoopRunning();
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1172
1229
|
setTooltip(tooltip) {
|
|
1173
1230
|
this.tooltipOption = tooltip;
|
|
1174
1231
|
if (!tooltip) {
|
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}\n\n/**\n * Pluggable SVG cluster view rendering a dynamic pill/rect badge whose width adapts\n * to its title and metadata, automatically measured via `getBBox()` for overlap-free layout.\n */\nexport class BadgeClusterSvgView implements SvgNodeView<BadgeClusterVisual> {\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: BadgeClusterVisual,\n state: NodeRenderState<BadgeClusterVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const titleLen = visual.title.length;\n const metaLen = visual.metaLine.length;\n const estWidth = Math.max(122, Math.max(titleLen * 6.8 + 44, metaLen * 5.9 + 24));\n const height = 42;\n const halfW = estWidth / 2;\n const halfH = height / 2;\n\n const bg = doc.createElementNS(SVG_NS, 'rect');\n bg.setAttribute('x', String(-halfW));\n bg.setAttribute('y', String(-halfH));\n bg.setAttribute('width', String(estWidth));\n bg.setAttribute('height', String(height));\n bg.setAttribute('rx', '8');\n bg.setAttribute('fill', '#0d1320');\n bg.setAttribute('fill-opacity', '0.94');\n bg.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered || state.interaction.isHighlighted\n ? '#e2e8f0'\n : visual.colorHex,\n );\n bg.setAttribute(\n 'stroke-width',\n state.interaction.isHovered || state.interaction.isHighlighted ? '2.2' : '1.4',\n );\n groupEl.appendChild(bg);\n\n // Subtle top accent dot inside badge\n const swatch = doc.createElementNS(SVG_NS, 'circle');\n swatch.setAttribute('cx', String(-halfW + 13));\n swatch.setAttribute('cy', String(-7));\n swatch.setAttribute('r', '4');\n swatch.setAttribute('fill', visual.colorHex);\n groupEl.appendChild(swatch);\n\n const codeText = doc.createElementNS(SVG_NS, 'text');\n codeText.setAttribute('x', String(-halfW + 22));\n codeText.setAttribute('y', String(-3));\n codeText.setAttribute('fill', visual.colorHex);\n codeText.setAttribute('font-size', '10');\n codeText.setAttribute('font-weight', '600');\n codeText.setAttribute('font-family', 'IBM Plex Mono, monospace');\n codeText.textContent = visual.code;\n groupEl.appendChild(codeText);\n\n const titleText = doc.createElementNS(SVG_NS, 'text');\n titleText.setAttribute('x', String(-halfW + 44));\n titleText.setAttribute('y', String(-3));\n titleText.setAttribute('fill', '#f1f5f9');\n titleText.setAttribute('font-size', '11');\n titleText.setAttribute('font-weight', '600');\n titleText.setAttribute('font-family', 'Plus Jakarta Sans, sans-serif');\n titleText.textContent = visual.title;\n groupEl.appendChild(titleText);\n\n const subText = doc.createElementNS(SVG_NS, 'text');\n subText.setAttribute('x', '0');\n subText.setAttribute('y', '13');\n subText.setAttribute('text-anchor', 'middle');\n subText.setAttribute('fill', '#94a3b8');\n subText.setAttribute('font-size', '9.5');\n subText.setAttribute('font-family', 'IBM Plex Mono, monospace');\n subText.textContent = visual.metaLine;\n groupEl.appendChild(subText);\n }\n}\n","import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\n/**\n * Pure visual descriptor for `ClusterAnchorSvgView`.\n */\nexport interface ClusterAnchorVisual {\n readonly code: string;\n readonly label: string;\n readonly memberCount: number;\n readonly colorHex: string;\n readonly radius: number;\n}\n\n/**\n * Pluggable SVG cluster view rendering a calibrated double-ring geometric vertex anchor\n * displaying the cluster code and member count.\n */\nexport class ClusterAnchorSvgView implements SvgNodeView<ClusterAnchorVisual> {\n measureConvexHull(visual: ClusterAnchorVisual): ConvexGeometry {\n return { kind: 'circle', radius: visual.radius + 5 };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: ClusterAnchorVisual,\n state: NodeRenderState<ClusterAnchorVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const r = visual.radius;\n const outer = doc.createElementNS(SVG_NS, 'circle');\n outer.setAttribute('cx', '0');\n outer.setAttribute('cy', '0');\n outer.setAttribute('r', String(r + 3));\n outer.setAttribute('fill', '#07090E');\n outer.setAttribute('fill-opacity', '0.88');\n outer.setAttribute(\n 'stroke',\n state.interaction.isHovered || state.interaction.isHighlighted\n ? '#f8fafc'\n : visual.colorHex,\n );\n outer.setAttribute('stroke-width', state.interaction.isHovered ? '2.4' : '1.6');\n outer.setAttribute('stroke-dasharray', '4 2.5');\n groupEl.appendChild(outer);\n\n const inner = doc.createElementNS(SVG_NS, 'circle');\n inner.setAttribute('cx', '0');\n inner.setAttribute('cy', '0');\n inner.setAttribute('r', String(r - 2));\n inner.setAttribute('fill', visual.colorHex);\n inner.setAttribute('fill-opacity', '0.18');\n inner.setAttribute('stroke', visual.colorHex);\n inner.setAttribute('stroke-width', '1.4');\n groupEl.appendChild(inner);\n\n const codeEl = doc.createElementNS(SVG_NS, 'text');\n codeEl.setAttribute('x', '0');\n codeEl.setAttribute('y', '-2');\n codeEl.setAttribute('text-anchor', 'middle');\n codeEl.setAttribute('fill', '#f8fafc');\n codeEl.setAttribute('font-size', '11');\n codeEl.setAttribute('font-weight', '600');\n codeEl.setAttribute('font-family', 'IBM Plex Mono, monospace');\n codeEl.textContent = visual.code;\n groupEl.appendChild(codeEl);\n\n const countEl = doc.createElementNS(SVG_NS, 'text');\n countEl.setAttribute('x', '0');\n countEl.setAttribute('y', '11');\n countEl.setAttribute('text-anchor', 'middle');\n countEl.setAttribute('fill', visual.colorHex);\n countEl.setAttribute('font-size', '9');\n countEl.setAttribute('font-family', 'IBM Plex Mono, monospace');\n countEl.textContent = `${visual.memberCount}n`;\n groupEl.appendChild(countEl);\n }\n}\n","import {\n computeConvexHull,\n regularPolygon,\n starConvexHull,\n type ConvexGeometry,\n type NodeRenderState,\n type Point2D,\n} from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\nexport type GeometricShapeKind = 'circle' | 'diamond' | 'star' | 'hexagon';\n\n/**\n * Pure visual descriptor for `GeometricShapeSvgView`.\n */\nexport interface GeometricShapeVisual {\n readonly shape: GeometricShapeKind;\n readonly radius: number;\n readonly fillHex: string;\n readonly strokeHex?: string;\n readonly strokeWidth?: number;\n readonly label?: string;\n}\n\nconst MORPH_SAMPLES = 64;\n\nfunction sampleShapePerimeter(\n shape: GeometricShapeKind,\n radius: number,\n): readonly Point2D[] {\n const r = Math.max(3, radius);\n const pts: Point2D[] = [];\n\n if (shape === 'circle') {\n for (let i = 0; i < MORPH_SAMPLES; i++) {\n const a = (i / MORPH_SAMPLES) * Math.PI * 2 - Math.PI / 2;\n pts.push({ x: Math.cos(a) * r, y: Math.sin(a) * r });\n }\n return pts;\n }\n\n // Construct polygon vertices then resample evenly along edges\n const polyVerts: Point2D[] = [];\n if (shape === 'diamond') {\n const d = r * 1.12;\n polyVerts.push(\n { x: 0, y: -d },\n { x: d * 0.88, y: 0 },\n { x: 0, y: d },\n { x: -d * 0.88, y: 0 },\n );\n } else if (shape === 'hexagon') {\n for (let i = 0; i < 6; i++) {\n const a = -Math.PI / 2 + (i * Math.PI * 2) / 6;\n polyVerts.push({ x: Math.cos(a) * r * 1.05, y: Math.sin(a) * r * 1.05 });\n }\n } else {\n // 5-point star (10 vertices alternating outer & inner)\n const outer = r * 1.24;\n const inner = r * 0.56;\n for (let i = 0; i < 10; i++) {\n const a = -Math.PI / 2 + (i * Math.PI) / 5;\n const rad = i % 2 === 0 ? outer : inner;\n polyVerts.push({ x: Math.cos(a) * rad, y: Math.sin(a) * rad });\n }\n }\n\n // Compute cumulative perimeter lengths\n const edgeLens: number[] = [];\n let totalLen = 0;\n for (let i = 0; i < polyVerts.length; i++) {\n const a = polyVerts[i]!;\n const b = polyVerts[(i + 1) % polyVerts.length]!;\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n edgeLens.push(len);\n totalLen += len;\n }\n\n for (let s = 0; s < MORPH_SAMPLES; s++) {\n const targetDist = (s / MORPH_SAMPLES) * totalLen;\n let accum = 0;\n for (let i = 0; i < polyVerts.length; i++) {\n const len = edgeLens[i]!;\n if (accum + len >= targetDist || i === polyVerts.length - 1) {\n const localT = len > 1e-6 ? (targetDist - accum) / len : 0;\n const a = polyVerts[i]!;\n const b = polyVerts[(i + 1) % polyVerts.length]!;\n pts.push({\n x: a.x + (b.x - a.x) * localT,\n y: a.y + (b.y - a.y) * localT,\n });\n break;\n }\n accum += len;\n }\n }\n\n return pts;\n}\n\nfunction pointsToSvgPath(pts: readonly Point2D[]): string {\n if (pts.length === 0) return '';\n let d = `M ${pts[0]!.x.toFixed(2)} ${pts[0]!.y.toFixed(2)}`;\n for (let i = 1; i < pts.length; i++) {\n const p = pts[i]!;\n d += ` L ${p.x.toFixed(2)} ${p.y.toFixed(2)}`;\n }\n return `${d} Z`;\n}\n\nfunction parseHexRgb(hex: string): readonly [number, number, number] {\n const clean = hex.startsWith('#') ? hex.slice(1) : hex;\n if (clean.length < 6) return [148, 163, 184];\n return [\n parseInt(clean.slice(0, 2), 16) || 0,\n parseInt(clean.slice(2, 4), 16) || 0,\n parseInt(clean.slice(4, 6), 16) || 0,\n ];\n}\n\nfunction lerpHex(fromHex: string, toHex: string, t: number): string {\n const a = parseHexRgb(fromHex);\n const b = parseHexRgb(toHex);\n const r = Math.round(a[0] + (b[0] - a[0]) * t);\n const g = Math.round(a[1] + (b[1] - a[1]) * t);\n const bl = Math.round(a[2] + (b[2] - a[2]) * t);\n return `rgb(${r}, ${g}, ${bl})`;\n}\n\n/**\n * Pluggable SVG node view rendering geometric shapes (`circle`, `diamond`, `star`, `hexagon`)\n * with analytical convex hulls and 64-point parametric SVG path morphing!\n */\nexport class GeometricShapeSvgView implements SvgNodeView<GeometricShapeVisual> {\n measureConvexHull(visual: GeometricShapeVisual): ConvexGeometry {\n const r = visual.radius + (visual.strokeWidth ?? 1.5);\n if (visual.shape === 'circle') {\n return { kind: 'circle', radius: r };\n }\n if (visual.shape === 'diamond') {\n const d = r * 1.12;\n return {\n kind: 'polygon',\n vertices: computeConvexHull([\n { x: 0, y: -d },\n { x: d * 0.88, y: 0 },\n { x: 0, y: d },\n { x: -d * 0.88, y: 0 },\n ]),\n };\n }\n if (visual.shape === 'hexagon') {\n return regularPolygon(6, r * 1.05);\n }\n return starConvexHull(5, r * 1.24);\n }\n\n private ensureElements(groupEl: SVGGElement): {\n pathEl: SVGPathElement;\n ringEl: SVGPathElement;\n } {\n let pathEl = groupEl.querySelector<SVGPathElement>('path.sv-geom-shape');\n let ringEl = groupEl.querySelector<SVGPathElement>('path.sv-geom-ring');\n if (!pathEl || !ringEl) {\n while (groupEl.firstChild) groupEl.removeChild(groupEl.firstChild);\n const doc = groupEl.ownerDocument;\n ringEl = doc.createElementNS(SVG_NS, 'path');\n ringEl.setAttribute('class', 'sv-geom-ring');\n ringEl.setAttribute('fill', 'none');\n pathEl = doc.createElementNS(SVG_NS, 'path');\n pathEl.setAttribute('class', 'sv-geom-shape');\n groupEl.appendChild(ringEl);\n groupEl.appendChild(pathEl);\n }\n return { pathEl, ringEl };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: GeometricShapeVisual,\n state: NodeRenderState<GeometricShapeVisual>,\n ): void {\n const { pathEl, ringEl } = this.ensureElements(groupEl);\n const pts = sampleShapePerimeter(visual.shape, visual.radius);\n const d = pointsToSvgPath(pts);\n\n pathEl.setAttribute('d', d);\n pathEl.setAttribute('fill', visual.fillHex);\n pathEl.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered\n ? '#f8fafc'\n : (visual.strokeHex ?? 'rgba(15, 23, 42, 0.8)'),\n );\n pathEl.setAttribute(\n 'stroke-width',\n String(state.interaction.isHovered || state.interaction.isPinned ? 2.2 : (visual.strokeWidth ?? 1.4)),\n );\n\n if (state.interaction.isHovered || state.interaction.isPinned || state.interaction.isHighlighted) {\n const outerPts = sampleShapePerimeter(visual.shape, visual.radius + 4.5);\n ringEl.setAttribute('d', pointsToSvgPath(outerPts));\n ringEl.setAttribute('stroke', state.interaction.isPinned ? '#f59e0b' : '#22d3ee');\n ringEl.setAttribute('stroke-width', '1.4');\n ringEl.setAttribute('stroke-opacity', '0.9');\n } else {\n ringEl.setAttribute('d', '');\n }\n }\n\n morph(\n groupEl: SVGGElement,\n from: GeometricShapeVisual,\n to: GeometricShapeVisual,\n progress: number,\n state: NodeRenderState<GeometricShapeVisual>,\n ): boolean {\n const { pathEl, ringEl } = this.ensureElements(groupEl);\n const ptsA = sampleShapePerimeter(from.shape, from.radius);\n const ptsB = sampleShapePerimeter(to.shape, to.radius);\n const morphed: Point2D[] = [];\n for (let i = 0; i < MORPH_SAMPLES; i++) {\n const a = ptsA[i]!;\n const b = ptsB[i]!;\n morphed.push({\n x: a.x + (b.x - a.x) * progress,\n y: a.y + (b.y - a.y) * progress,\n });\n }\n pathEl.setAttribute('d', pointsToSvgPath(morphed));\n pathEl.setAttribute('fill', lerpHex(from.fillHex, to.fillHex, progress));\n pathEl.setAttribute(\n 'stroke',\n state.interaction.isHovered ? '#f8fafc' : (to.strokeHex ?? 'rgba(15, 23, 42, 0.8)'),\n );\n pathEl.setAttribute('stroke-width', String(to.strokeWidth ?? 1.4));\n ringEl.setAttribute('d', '');\n return true;\n }\n}\n","import type { ConvexGeometry, NodeRenderState } from '@simplex-viz/core';\nimport { SVG_NS } from '../hullMeasure';\nimport type { SvgNodeView } from '../types';\n\nexport interface TopicSectorSlice {\n readonly colorHex: string;\n readonly weight: number;\n}\n\n/**\n * Pure visual descriptor for `MultiSectorGlyphSvgView`.\n */\nexport interface MultiSectorGlyphVisual {\n readonly outerRadius: number;\n readonly innerRadius: number;\n readonly sectors: readonly TopicSectorSlice[];\n readonly centerColorHex: string;\n readonly accentRingHex?: string;\n}\n\nfunction describeDonutSectorPath(\n innerR: number,\n outerR: number,\n startAngle: number,\n endAngle: number,\n): string {\n const sweep = endAngle - startAngle;\n if (sweep >= Math.PI * 2 - 1e-4) {\n // Full ring via two half-arcs\n return [\n `M ${outerR} 0`,\n `A ${outerR} ${outerR} 0 1 0 ${-outerR} 0`,\n `A ${outerR} ${outerR} 0 1 0 ${outerR} 0`,\n `M ${innerR} 0`,\n `A ${innerR} ${innerR} 0 1 1 ${-innerR} 0`,\n `A ${innerR} ${innerR} 0 1 1 ${innerR} 0`,\n 'Z',\n ].join(' ');\n }\n const largeArc = sweep > Math.PI ? 1 : 0;\n const x1o = Math.cos(startAngle) * outerR;\n const y1o = Math.sin(startAngle) * outerR;\n const x2o = Math.cos(endAngle) * outerR;\n const y2o = Math.sin(endAngle) * outerR;\n\n const x1i = Math.cos(endAngle) * innerR;\n const y1i = Math.sin(endAngle) * innerR;\n const x2i = Math.cos(startAngle) * innerR;\n const y2i = Math.sin(startAngle) * innerR;\n\n return [\n `M ${x1o.toFixed(2)} ${y1o.toFixed(2)}`,\n `A ${outerR.toFixed(2)} ${outerR.toFixed(2)} 0 ${largeArc} 1 ${x2o.toFixed(2)} ${y2o.toFixed(2)}`,\n `L ${x1i.toFixed(2)} ${y1i.toFixed(2)}`,\n `A ${innerR.toFixed(2)} ${innerR.toFixed(2)} 0 ${largeArc} 0 ${x2i.toFixed(2)} ${y2i.toFixed(2)}`,\n 'Z',\n ].join(' ');\n}\n\n/**\n * Pluggable SVG node view rendering multi-color topic-weight donut sectors\n * representing each item's exact barycentric weights `\\tilde{w}_{ik}`.\n */\nexport class MultiSectorGlyphSvgView implements SvgNodeView<MultiSectorGlyphVisual> {\n measureConvexHull(visual: MultiSectorGlyphVisual): ConvexGeometry {\n return { kind: 'circle', radius: visual.outerRadius + 2 };\n }\n\n mountOrUpdate(\n groupEl: SVGGElement,\n visual: MultiSectorGlyphVisual,\n state: NodeRenderState<MultiSectorGlyphVisual>,\n ): void {\n const doc = groupEl.ownerDocument;\n while (groupEl.firstChild) {\n groupEl.removeChild(groupEl.firstChild);\n }\n\n const totalWeight = visual.sectors.reduce((s, sec) => s + Math.max(0, sec.weight), 0) || 1;\n let angle = -Math.PI / 2;\n\n for (const sec of visual.sectors) {\n const frac = Math.max(0, sec.weight) / totalWeight;\n if (frac <= 0.005) continue;\n const nextAngle = angle + frac * Math.PI * 2;\n const path = doc.createElementNS(SVG_NS, 'path');\n path.setAttribute(\n 'd',\n describeDonutSectorPath(visual.innerRadius, visual.outerRadius, angle, nextAngle),\n );\n path.setAttribute('fill', sec.colorHex);\n path.setAttribute('stroke', '#07090E');\n path.setAttribute('stroke-width', visual.sectors.length > 1 ? '1.1' : '0.8');\n groupEl.appendChild(path);\n angle = nextAngle;\n }\n\n const core = doc.createElementNS(SVG_NS, 'circle');\n core.setAttribute('cx', '0');\n core.setAttribute('cy', '0');\n core.setAttribute('r', String(Math.max(2, visual.innerRadius - 1)));\n core.setAttribute('fill', visual.centerColorHex);\n groupEl.appendChild(core);\n\n if (\n visual.accentRingHex ||\n state.interaction.isHovered ||\n state.interaction.isPinned ||\n state.interaction.isHighlighted\n ) {\n const ring = doc.createElementNS(SVG_NS, 'circle');\n ring.setAttribute('cx', '0');\n ring.setAttribute('cy', '0');\n ring.setAttribute('r', String(visual.outerRadius + 3));\n ring.setAttribute('fill', 'none');\n ring.setAttribute(\n 'stroke',\n state.interaction.isPinned\n ? '#f59e0b'\n : state.interaction.isHovered\n ? '#f8fafc'\n : (visual.accentRingHex ?? '#22d3ee'),\n );\n ring.setAttribute('stroke-width', state.interaction.isHovered ? '2' : '1.2');\n groupEl.appendChild(ring);\n }\n }\n}\n","import type {\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\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): 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 };\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: '#07090E',\n strokeWidth: 1.4,\n label: extractDefaultItemLabel(item, ctx.id, getLabel),\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 };\n }\n return {\n code: cluster.code,\n label: cluster.defaultLabel,\n memberCount: cluster.members.length,\n colorHex: cluster.colorHex,\n radius: 22,\n };\n },\n getVisualCacheKey: (\n visual: DefaultContentPresetVisual | DefaultClusterPresetVisual,\n ): string => {\n if ('sectors' in visual) {\n const secKey = visual.sectors.map((s) => `${s.colorHex}:${s.weight.toFixed(2)}`).join('|');\n return `glyph:${visual.outerRadius}:${visual.centerColorHex}:${secKey}`;\n }\n if ('shape' in visual) {\n return `geom:${visual.shape}:${visual.radius}:${visual.fillHex}`;\n }\n if ('metaLine' in visual) {\n return `badge:${visual.code}:${visual.title}:${visual.metaLine}:${visual.colorHex}`;\n }\n return `anchor:${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(148, 163, 184, 0.16)');\n line.setAttribute('stroke-width', '1');\n line.setAttribute('stroke-dasharray', '3 4');\n this.edgesGroup.appendChild(line);\n this.edgeLines.push(line);\n }\n while (this.edgeLines.length > snapshot.edges.length) {\n const line = this.edgeLines.pop();\n line?.remove();\n }\n for (let i = 0; i < snapshot.edges.length; i++) {\n const edge = snapshot.edges[i]!;\n const line = this.edgeLines[i]!;\n line.setAttribute('x1', edge.a.x.toFixed(1));\n line.setAttribute('y1', edge.a.y.toFixed(1));\n line.setAttribute('x2', edge.b.x.toFixed(1));\n line.setAttribute('y2', edge.b.y.toFixed(1));\n }\n\n // 3. Reconcile Clusters & Content Items\n this.reconcileNodes(\n snapshot.clusters,\n this.clustersGroup,\n this.clusterDomMap,\n this.clusterView,\n this.clusterViewByKey,\n 'cluster',\n );\n this.reconcileNodes(\n snapshot.items,\n this.itemsGroup,\n this.itemDomMap,\n this.contentView,\n this.contentViewByKey,\n 'item',\n );\n\n // 4. Optional Convex Hull Debug Overlay\n this.renderHullOverlay(snapshot);\n }\n\n private reconcileNodes<TVisual>(\n nodes: readonly NodeRenderState<TVisual>[],\n parentGroup: SVGGElement,\n domMap: Map<string, TrackedNodeDom<TVisual>>,\n activeView: SvgNodeView<TVisual>,\n viewByKey: Map<string, SvgNodeView<TVisual>>,\n kind: 'cluster' | 'item',\n ): void {\n const aliveIds = new Set<string>();\n\n for (const node of nodes) {\n aliveIds.add(node.id);\n let tracked = domMap.get(node.id);\n if (!tracked) {\n const rootGroup = this.doc.createElementNS(SVG_NS, 'g');\n rootGroup.setAttribute('class', `sv-node sv-node-${kind}`);\n rootGroup.setAttribute('data-node-id', node.id);\n parentGroup.appendChild(rootGroup);\n tracked = {\n rootGroup,\n mainLayer: null,\n fromLayer: null,\n toLayer: null,\n lastMainKey: null,\n lastFromKey: null,\n lastToKey: null,\n lastInteractionSig: null,\n lastMorphUsed: false,\n };\n domMap.set(node.id, tracked);\n }\n\n const effectiveOpacity = node.interaction.isDimmed\n ? node.opacity * 0.24\n : node.opacity;\n tracked.rootGroup.setAttribute(\n 'transform',\n `translate(${node.x.toFixed(2)}, ${node.y.toFixed(2)}) scale(${node.scale.toFixed(4)})`,\n );\n tracked.rootGroup.setAttribute('opacity', effectiveOpacity.toFixed(3));\n\n const interSig = interactionSignature(node);\n const interactionChanged = tracked.lastInteractionSig !== interSig;\n\n if (node.transition) {\n const tr = node.transition;\n const fromView = viewByKey.get(tr.fromCacheKey) ?? tracked.lastView ?? activeView;\n const toView = viewByKey.get(tr.toCacheKey) ?? activeView;\n\n // Specialized parametric morph if both endpoints belong to the same morph-capable view\n if (fromView === toView && toView.morph) {\n if (!tracked.mainLayer) {\n tracked.mainLayer = this.createGroup('sv-layer-main');\n tracked.rootGroup.appendChild(tracked.mainLayer);\n }\n if (tracked.fromLayer) {\n tracked.fromLayer.remove();\n tracked.fromLayer = null;\n }\n if (tracked.toLayer) {\n tracked.toLayer.remove();\n tracked.toLayer = null;\n }\n const handled = toView.morph(\n tracked.mainLayer,\n tr.from,\n tr.to,\n tr.progress,\n node,\n );\n if (handled) {\n tracked.lastMorphUsed = true;\n tracked.lastMainKey = null;\n tracked.lastInteractionSig = interSig;\n tracked.lastView = toView;\n continue;\n }\n }\n\n // Universal Dual-Layer Crossfade (max 2 child layers: layer-from + layer-to)\n tracked.lastMorphUsed = false;\n if (tracked.mainLayer) {\n tracked.mainLayer.remove();\n tracked.mainLayer = null;\n tracked.lastMainKey = null;\n }\n\n if (!tracked.fromLayer) {\n tracked.fromLayer = this.createGroup('sv-layer-from');\n tracked.rootGroup.appendChild(tracked.fromLayer);\n }\n if (!tracked.toLayer) {\n tracked.toLayer = this.createGroup('sv-layer-to');\n tracked.rootGroup.appendChild(tracked.toLayer);\n }\n\n if (tracked.lastFromKey !== tr.fromCacheKey || interactionChanged) {\n fromView.mountOrUpdate(tracked.fromLayer, tr.from, {\n ...node,\n visual: tr.from,\n hull: tr.fromHull,\n cacheKey: tr.fromCacheKey,\n });\n tracked.lastFromKey = tr.fromCacheKey;\n }\n\n if (tracked.lastToKey !== tr.toCacheKey || interactionChanged) {\n toView.mountOrUpdate(tracked.toLayer, tr.to, {\n ...node,\n visual: tr.to,\n hull: tr.toHull,\n cacheKey: tr.toCacheKey,\n });\n tracked.lastToKey = tr.toCacheKey;\n }\n\n // Proportional radius alignment during crossfade between disparate hull sizes\n const rFrom = Math.max(1, getHullBoundingRadius(tr.fromHull));\n const rTo = Math.max(1, getHullBoundingRadius(tr.toHull));\n const currentR = rFrom + (rTo - rFrom) * tr.progress;\n const fromSubScale = Math.max(0.4, Math.min(1.6, currentR / rFrom));\n const toSubScale = Math.max(0.4, Math.min(1.6, currentR / rTo));\n\n tracked.fromLayer.setAttribute('opacity', (1 - tr.progress).toFixed(3));\n tracked.fromLayer.setAttribute('transform', `scale(${fromSubScale.toFixed(4)})`);\n tracked.toLayer.setAttribute('opacity', tr.progress.toFixed(3));\n tracked.toLayer.setAttribute('transform', `scale(${toSubScale.toFixed(4)})`);\n\n tracked.lastInteractionSig = interSig;\n tracked.lastView = toView;\n } else {\n // Steady state (no active transition)\n if (tracked.fromLayer) {\n tracked.fromLayer.remove();\n tracked.fromLayer = null;\n tracked.lastFromKey = null;\n }\n if (tracked.toLayer) {\n // Promote toLayer directly into mainLayer without recreating DOM nodes\n if (tracked.mainLayer) tracked.mainLayer.remove();\n tracked.mainLayer = tracked.toLayer;\n tracked.mainLayer.setAttribute('class', 'sv-layer-main');\n tracked.mainLayer.removeAttribute('opacity');\n tracked.mainLayer.removeAttribute('transform');\n tracked.toLayer = null;\n tracked.lastMainKey = tracked.lastToKey;\n tracked.lastToKey = null;\n }\n if (!tracked.mainLayer) {\n tracked.mainLayer = this.createGroup('sv-layer-main');\n tracked.rootGroup.appendChild(tracked.mainLayer);\n }\n\n const viewToUse = viewByKey.get(node.cacheKey) ?? activeView;\n if (\n tracked.lastMainKey !== node.cacheKey ||\n interactionChanged ||\n tracked.lastMorphUsed ||\n tracked.lastView !== viewToUse\n ) {\n viewToUse.mountOrUpdate(tracked.mainLayer, node.visual, node);\n tracked.lastMainKey = node.cacheKey;\n tracked.lastInteractionSig = interSig;\n tracked.lastMorphUsed = false;\n tracked.lastView = viewToUse;\n }\n }\n }\n\n // Remove exited nodes\n for (const [id, tracked] of domMap) {\n if (!aliveIds.has(id)) {\n tracked.rootGroup.remove();\n domMap.delete(id);\n }\n }\n }\n\n private renderHullOverlay(\n snapshot: SceneFrameSnapshot<TContentVisual, TClusterVisual>,\n ): void {\n while (this.hullsGroup.firstChild) {\n this.hullsGroup.removeChild(this.hullsGroup.firstChild);\n }\n if (!snapshot.showHulls) return;\n\n const drawHull = <TVisual>(\n node: NodeRenderState<TVisual>,\n strokeColor: string,\n ) => {\n if (node.opacity < 0.05) return;\n const hull = node.hull;\n if (hull.kind === 'circle') {\n const circle = this.doc.createElementNS(SVG_NS, 'circle');\n circle.setAttribute('cx', node.x.toFixed(2));\n circle.setAttribute('cy', node.y.toFixed(2));\n circle.setAttribute('r', (hull.radius * node.scale).toFixed(2));\n circle.setAttribute('fill', strokeColor);\n circle.setAttribute('fill-opacity', '0.07');\n circle.setAttribute('stroke', strokeColor);\n circle.setAttribute('stroke-width', '1');\n circle.setAttribute('stroke-dasharray', '3 2');\n this.hullsGroup.appendChild(circle);\n } else if (hull.vertices.length >= 3) {\n const poly = this.doc.createElementNS(SVG_NS, 'polygon');\n poly.setAttribute(\n 'points',\n hull.vertices\n .map(\n (v) =>\n `${(node.x + v.x * node.scale).toFixed(2)},${(node.y + v.y * node.scale).toFixed(2)}`,\n )\n .join(' '),\n );\n poly.setAttribute('fill', strokeColor);\n poly.setAttribute('fill-opacity', '0.07');\n poly.setAttribute('stroke', strokeColor);\n poly.setAttribute('stroke-width', '1');\n poly.setAttribute('stroke-dasharray', '3 2');\n this.hullsGroup.appendChild(poly);\n }\n };\n\n for (const c of snapshot.clusters) {\n drawHull(c, '#f59e0b');\n }\n for (const it of snapshot.items) {\n drawHull(it, '#22d3ee');\n }\n }\n\n destroy(): void {\n this.clusterDomMap.clear();\n this.itemDomMap.clear();\n this.contentHullCache.clear();\n this.clusterHullCache.clear();\n this.contentViewByKey.clear();\n this.clusterViewByKey.clear();\n while (this.svgEl.firstChild) {\n this.svgEl.removeChild(this.svgEl.firstChild);\n }\n }\n}\n","import {\n SimplexGraphEngine,\n type CameraController,\n type ClusterDerivationContext,\n type ClusterDescriptor,\n type 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 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 /** 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\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 const activePreset: SimplexVisualPreset = options.preset ?? 'geometric';\n const presetViews = createPresetViews(activePreset);\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 activePreset,\n this.getLabelExtractor,\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 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.background = 'rgba(9, 13, 22, 0.94)';\n el.style.border = '1px solid rgba(51, 65, 85, 0.85)';\n el.style.color = '#f1f5f9';\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 el.style.boxShadow = '0 10px 24px rgba(0, 0, 0, 0.45)';\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 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 );\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 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 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"]}
|
package/dist/presets.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { type MultiSectorGlyphVisual } from './views/MultiSectorGlyphSvgView';
|
|
|
12
12
|
* - `'badges'`: OKLab geometric shapes + adaptive `BadgeClusterSvgView` cards auto-measured via `getBBox()`.
|
|
13
13
|
*/
|
|
14
14
|
export type SimplexVisualPreset = 'geometric' | 'glyphs' | 'badges';
|
|
15
|
+
export type SimplexTheme = 'dark' | 'light';
|
|
15
16
|
/**
|
|
16
17
|
* Union of built-in content visual descriptors used by presets.
|
|
17
18
|
*/
|
|
@@ -34,5 +35,5 @@ export declare function createPresetViews(preset: SimplexVisualPreset): {
|
|
|
34
35
|
/**
|
|
35
36
|
* Creates a default `VisualResolver` matching the selected built-in preset.
|
|
36
37
|
*/
|
|
37
|
-
export declare function createPresetVisualResolver<TItem = DefaultTaggedItem, TTagMeta = undefined, TClusterMeta = undefined>(preset: SimplexVisualPreset, getLabel?: (item: TItem) => string): VisualResolver<TItem, DefaultContentPresetVisual, DefaultClusterPresetVisual, TTagMeta, TClusterMeta>;
|
|
38
|
+
export declare function createPresetVisualResolver<TItem = DefaultTaggedItem, TTagMeta = undefined, TClusterMeta = undefined>(preset: SimplexVisualPreset, getLabel?: (item: TItem) => string, theme?: SimplexTheme): VisualResolver<TItem, DefaultContentPresetVisual, DefaultClusterPresetVisual, TTagMeta, TClusterMeta>;
|
|
38
39
|
//# sourceMappingURL=presets.d.ts.map
|
package/dist/presets.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAEvF;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAElF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAC3C,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GACjC,MAAM,CAoBR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG;IAC9D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAC9D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;CAC/D,CAcA;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,GAAG,iBAAiB,EACzB,QAAQ,GAAG,SAAS,EACpB,YAAY,GAAG,SAAS,EAExB,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAEvF;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAElF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAC3C,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GACjC,MAAM,CAoBR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG;IAC9D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAC9D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;CAC/D,CAcA;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,GAAG,iBAAiB,EACzB,QAAQ,GAAG,SAAS,EACpB,YAAY,GAAG,SAAS,EAExB,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,EAClC,KAAK,GAAE,YAAqB,GAC3B,cAAc,CACf,KAAK,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,QAAQ,EACR,YAAY,CACb,CAoEA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BadgeClusterSvgView.d.ts","sourceRoot":"","sources":["../../src/views/BadgeClusterSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"BadgeClusterSvgView.d.ts","sourceRoot":"","sources":["../../src/views/BadgeClusterSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,WAAW,CAAC,kBAAkB,CAAC;IACzE,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,eAAe,CAAC,kBAAkB,CAAC,GACzC,IAAI,CA8EN;CACF"}
|
|
@@ -9,6 +9,7 @@ export interface ClusterAnchorVisual {
|
|
|
9
9
|
readonly memberCount: number;
|
|
10
10
|
readonly colorHex: string;
|
|
11
11
|
readonly radius: number;
|
|
12
|
+
readonly theme?: 'dark' | 'light';
|
|
12
13
|
}
|
|
13
14
|
/**
|
|
14
15
|
* Pluggable SVG cluster view rendering a calibrated double-ring geometric vertex anchor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClusterAnchorSvgView.d.ts","sourceRoot":"","sources":["../../src/views/ClusterAnchorSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ClusterAnchorSvgView.d.ts","sourceRoot":"","sources":["../../src/views/ClusterAnchorSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,WAAW,CAAC,mBAAmB,CAAC;IAC3E,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAE7D;IAED,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAC1C,IAAI,CA2DN;CACF"}
|
|
@@ -11,6 +11,7 @@ export interface GeometricShapeVisual {
|
|
|
11
11
|
readonly strokeHex?: string;
|
|
12
12
|
readonly strokeWidth?: number;
|
|
13
13
|
readonly label?: string;
|
|
14
|
+
readonly theme?: 'dark' | 'light';
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Pluggable SVG node view rendering geometric shapes (`circle`, `diamond`, `star`, `hexagon`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeometricShapeSvgView.d.ts","sourceRoot":"","sources":["../../src/views/GeometricShapeSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"GeometricShapeSvgView.d.ts","sourceRoot":"","sources":["../../src/views/GeometricShapeSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AA2GD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,WAAW,CAAC,oBAAoB,CAAC;IAC7E,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAqB9D;IAED,OAAO,CAAC,cAAc;IAoBtB,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAC3C,IAAI,CAiCN;IAED,KAAK,CACH,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,oBAAoB,EAC1B,EAAE,EAAE,oBAAoB,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAC3C,OAAO,CAyBT;CACF"}
|
|
@@ -13,6 +13,7 @@ export interface MultiSectorGlyphVisual {
|
|
|
13
13
|
readonly sectors: readonly TopicSectorSlice[];
|
|
14
14
|
readonly centerColorHex: string;
|
|
15
15
|
readonly accentRingHex?: string;
|
|
16
|
+
readonly theme?: 'dark' | 'light';
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
18
19
|
* Pluggable SVG node view rendering multi-color topic-weight donut sectors
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSectorGlyphSvgView.d.ts","sourceRoot":"","sources":["../../src/views/MultiSectorGlyphSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"MultiSectorGlyphSvgView.d.ts","sourceRoot":"","sources":["../../src/views/MultiSectorGlyphSvgView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAyCD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,WAAW,CAAC,sBAAsB,CAAC;IACjF,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,cAAc,CAEhE;IAED,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,eAAe,CAAC,sBAAsB,CAAC,GAC7C,IAAI,CA2DN;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplex-viz/svg",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
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.2.
|
|
23
|
+
"@simplex-viz/core": "^0.2.1"
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
|
26
26
|
"simplex",
|