@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 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="640" alt="SimplexViz / svg — @simplex-viz/svg" />
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":"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"}
1
+ {"version":3,"file":"SimplexSvgController.d.ts","sourceRoot":"","sources":["../src/SimplexSvgController.ts"],"names":[],"mappings":"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"}
package/dist/index.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", "#0d1320");
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 ? "#e2e8f0" : visual.colorHex
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", "#f1f5f9");
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", "#94a3b8");
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", "#07090E");
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 ? "#f8fafc" : visual.colorHex
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", "#f8fafc");
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 ? "#f8fafc" : visual.strokeHex ?? "rgba(15, 23, 42, 0.8)"
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" : "#22d3ee");
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", "#07090E");
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 ? "#f8fafc" : visual.accentRingHex ?? "#22d3ee"
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(148, 163, 184, 0.16)");
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
- const activePreset = options.preset ?? "geometric";
956
- const presetViews = createPresetViews(activePreset);
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
- activePreset,
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
- el.style.boxShadow = "0 10px 24px rgba(0, 0, 0, 0.45)";
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
@@ -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,GACjC,cAAc,CACf,KAAK,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,QAAQ,EACR,YAAY,CACb,CA+DA"}
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"}
@@ -10,6 +10,7 @@ export interface BadgeClusterVisual {
10
10
  readonly title: string;
11
11
  readonly metaLine: string;
12
12
  readonly colorHex: string;
13
+ readonly theme?: 'dark' | 'light';
13
14
  }
14
15
  /**
15
16
  * Pluggable SVG cluster view rendering a dynamic pill/rect badge whose width adapts
@@ -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;CAC3B;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,WAAW,CAAC,kBAAkB,CAAC;IACzE,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,eAAe,CAAC,kBAAkB,CAAC,GACzC,IAAI,CAwEN;CACF"}
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;CACzB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,WAAW,CAAC,mBAAmB,CAAC;IAC3E,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAE7D;IAED,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAC1C,IAAI,CAqDN;CACF"}
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;CACzB;AA2GD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,WAAW,CAAC,oBAAoB,CAAC;IAC7E,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAqB9D;IAED,OAAO,CAAC,cAAc;IAoBtB,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAC3C,IAAI,CA6BN;IAED,KAAK,CACH,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,oBAAoB,EAC1B,EAAE,EAAE,oBAAoB,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAC3C,OAAO,CAsBT;CACF"}
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;CACjC;AAyCD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,WAAW,CAAC,sBAAsB,CAAC;IACjF,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,cAAc,CAEhE;IAED,aAAa,CACX,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,eAAe,CAAC,sBAAsB,CAAC,GAC7C,IAAI,CAsDN;CACF"}
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.0",
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.0"
23
+ "@simplex-viz/core": "^0.2.1"
24
24
  },
25
25
  "keywords": [
26
26
  "simplex",