@ggts-sh/react 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/README.md +66 -0
  2. package/dist/GGPlot.d.ts +6 -0
  3. package/dist/GGPlot.d.ts.map +1 -0
  4. package/dist/GGPlot.js +18 -0
  5. package/dist/GGPlot.js.map +1 -0
  6. package/dist/datum-key.d.ts +21 -0
  7. package/dist/datum-key.d.ts.map +1 -0
  8. package/dist/datum-key.js +60 -0
  9. package/dist/datum-key.js.map +1 -0
  10. package/dist/defined-props.d.ts +3 -0
  11. package/dist/defined-props.d.ts.map +1 -0
  12. package/dist/defined-props.js +11 -0
  13. package/dist/defined-props.js.map +1 -0
  14. package/dist/geom-factory.d.ts +17 -0
  15. package/dist/geom-factory.d.ts.map +1 -0
  16. package/dist/geom-factory.js +63 -0
  17. package/dist/geom-factory.js.map +1 -0
  18. package/dist/geoms/GeomAbline.d.ts +8 -0
  19. package/dist/geoms/GeomAbline.d.ts.map +1 -0
  20. package/dist/geoms/GeomAbline.js +8 -0
  21. package/dist/geoms/GeomAbline.js.map +1 -0
  22. package/dist/geoms/GeomArea.d.ts +8 -0
  23. package/dist/geoms/GeomArea.d.ts.map +1 -0
  24. package/dist/geoms/GeomArea.js +6 -0
  25. package/dist/geoms/GeomArea.js.map +1 -0
  26. package/dist/geoms/GeomBar.d.ts +8 -0
  27. package/dist/geoms/GeomBar.d.ts.map +1 -0
  28. package/dist/geoms/GeomBar.js +6 -0
  29. package/dist/geoms/GeomBar.js.map +1 -0
  30. package/dist/geoms/GeomBin2d.d.ts +8 -0
  31. package/dist/geoms/GeomBin2d.d.ts.map +1 -0
  32. package/dist/geoms/GeomBin2d.js +8 -0
  33. package/dist/geoms/GeomBin2d.js.map +1 -0
  34. package/dist/geoms/GeomBlank.d.ts +8 -0
  35. package/dist/geoms/GeomBlank.d.ts.map +1 -0
  36. package/dist/geoms/GeomBlank.js +6 -0
  37. package/dist/geoms/GeomBlank.js.map +1 -0
  38. package/dist/geoms/GeomBoxplot.d.ts +8 -0
  39. package/dist/geoms/GeomBoxplot.d.ts.map +1 -0
  40. package/dist/geoms/GeomBoxplot.js +8 -0
  41. package/dist/geoms/GeomBoxplot.js.map +1 -0
  42. package/dist/geoms/GeomCol.d.ts +8 -0
  43. package/dist/geoms/GeomCol.d.ts.map +1 -0
  44. package/dist/geoms/GeomCol.js +6 -0
  45. package/dist/geoms/GeomCol.js.map +1 -0
  46. package/dist/geoms/GeomContour.d.ts +8 -0
  47. package/dist/geoms/GeomContour.d.ts.map +1 -0
  48. package/dist/geoms/GeomContour.js +8 -0
  49. package/dist/geoms/GeomContour.js.map +1 -0
  50. package/dist/geoms/GeomCount.d.ts +8 -0
  51. package/dist/geoms/GeomCount.d.ts.map +1 -0
  52. package/dist/geoms/GeomCount.js +6 -0
  53. package/dist/geoms/GeomCount.js.map +1 -0
  54. package/dist/geoms/GeomCrossbar.d.ts +8 -0
  55. package/dist/geoms/GeomCrossbar.d.ts.map +1 -0
  56. package/dist/geoms/GeomCrossbar.js +8 -0
  57. package/dist/geoms/GeomCrossbar.js.map +1 -0
  58. package/dist/geoms/GeomCurve.d.ts +8 -0
  59. package/dist/geoms/GeomCurve.d.ts.map +1 -0
  60. package/dist/geoms/GeomCurve.js +8 -0
  61. package/dist/geoms/GeomCurve.js.map +1 -0
  62. package/dist/geoms/GeomDensity.d.ts +8 -0
  63. package/dist/geoms/GeomDensity.d.ts.map +1 -0
  64. package/dist/geoms/GeomDensity.js +8 -0
  65. package/dist/geoms/GeomDensity.js.map +1 -0
  66. package/dist/geoms/GeomDensity2d.d.ts +8 -0
  67. package/dist/geoms/GeomDensity2d.d.ts.map +1 -0
  68. package/dist/geoms/GeomDensity2d.js +8 -0
  69. package/dist/geoms/GeomDensity2d.js.map +1 -0
  70. package/dist/geoms/GeomDensity2dFilled.d.ts +8 -0
  71. package/dist/geoms/GeomDensity2dFilled.d.ts.map +1 -0
  72. package/dist/geoms/GeomDensity2dFilled.js +8 -0
  73. package/dist/geoms/GeomDensity2dFilled.js.map +1 -0
  74. package/dist/geoms/GeomDotplot.d.ts +8 -0
  75. package/dist/geoms/GeomDotplot.d.ts.map +1 -0
  76. package/dist/geoms/GeomDotplot.js +8 -0
  77. package/dist/geoms/GeomDotplot.js.map +1 -0
  78. package/dist/geoms/GeomErrorbar.d.ts +8 -0
  79. package/dist/geoms/GeomErrorbar.d.ts.map +1 -0
  80. package/dist/geoms/GeomErrorbar.js +8 -0
  81. package/dist/geoms/GeomErrorbar.js.map +1 -0
  82. package/dist/geoms/GeomFreqpoly.d.ts +8 -0
  83. package/dist/geoms/GeomFreqpoly.d.ts.map +1 -0
  84. package/dist/geoms/GeomFreqpoly.js +8 -0
  85. package/dist/geoms/GeomFreqpoly.js.map +1 -0
  86. package/dist/geoms/GeomFunction.d.ts +8 -0
  87. package/dist/geoms/GeomFunction.d.ts.map +1 -0
  88. package/dist/geoms/GeomFunction.js +8 -0
  89. package/dist/geoms/GeomFunction.js.map +1 -0
  90. package/dist/geoms/GeomHex.d.ts +8 -0
  91. package/dist/geoms/GeomHex.d.ts.map +1 -0
  92. package/dist/geoms/GeomHex.js +8 -0
  93. package/dist/geoms/GeomHex.js.map +1 -0
  94. package/dist/geoms/GeomHistogram.d.ts +8 -0
  95. package/dist/geoms/GeomHistogram.d.ts.map +1 -0
  96. package/dist/geoms/GeomHistogram.js +8 -0
  97. package/dist/geoms/GeomHistogram.js.map +1 -0
  98. package/dist/geoms/GeomHline.d.ts +8 -0
  99. package/dist/geoms/GeomHline.d.ts.map +1 -0
  100. package/dist/geoms/GeomHline.js +6 -0
  101. package/dist/geoms/GeomHline.js.map +1 -0
  102. package/dist/geoms/GeomJitter.d.ts +11 -0
  103. package/dist/geoms/GeomJitter.d.ts.map +1 -0
  104. package/dist/geoms/GeomJitter.js +15 -0
  105. package/dist/geoms/GeomJitter.js.map +1 -0
  106. package/dist/geoms/GeomLabel.d.ts +8 -0
  107. package/dist/geoms/GeomLabel.d.ts.map +1 -0
  108. package/dist/geoms/GeomLabel.js +6 -0
  109. package/dist/geoms/GeomLabel.js.map +1 -0
  110. package/dist/geoms/GeomLine.d.ts +8 -0
  111. package/dist/geoms/GeomLine.d.ts.map +1 -0
  112. package/dist/geoms/GeomLine.js +6 -0
  113. package/dist/geoms/GeomLine.js.map +1 -0
  114. package/dist/geoms/GeomLinerange.d.ts +8 -0
  115. package/dist/geoms/GeomLinerange.d.ts.map +1 -0
  116. package/dist/geoms/GeomLinerange.js +8 -0
  117. package/dist/geoms/GeomLinerange.js.map +1 -0
  118. package/dist/geoms/GeomMap.d.ts +8 -0
  119. package/dist/geoms/GeomMap.d.ts.map +1 -0
  120. package/dist/geoms/GeomMap.js +8 -0
  121. package/dist/geoms/GeomMap.js.map +1 -0
  122. package/dist/geoms/GeomPath.d.ts +8 -0
  123. package/dist/geoms/GeomPath.d.ts.map +1 -0
  124. package/dist/geoms/GeomPath.js +6 -0
  125. package/dist/geoms/GeomPath.js.map +1 -0
  126. package/dist/geoms/GeomPoint.d.ts +8 -0
  127. package/dist/geoms/GeomPoint.d.ts.map +1 -0
  128. package/dist/geoms/GeomPoint.js +6 -0
  129. package/dist/geoms/GeomPoint.js.map +1 -0
  130. package/dist/geoms/GeomPointrange.d.ts +8 -0
  131. package/dist/geoms/GeomPointrange.d.ts.map +1 -0
  132. package/dist/geoms/GeomPointrange.js +8 -0
  133. package/dist/geoms/GeomPointrange.js.map +1 -0
  134. package/dist/geoms/GeomPolygon.d.ts +8 -0
  135. package/dist/geoms/GeomPolygon.d.ts.map +1 -0
  136. package/dist/geoms/GeomPolygon.js +8 -0
  137. package/dist/geoms/GeomPolygon.js.map +1 -0
  138. package/dist/geoms/GeomQq.d.ts +8 -0
  139. package/dist/geoms/GeomQq.d.ts.map +1 -0
  140. package/dist/geoms/GeomQq.js +8 -0
  141. package/dist/geoms/GeomQq.js.map +1 -0
  142. package/dist/geoms/GeomQqLine.d.ts +8 -0
  143. package/dist/geoms/GeomQqLine.d.ts.map +1 -0
  144. package/dist/geoms/GeomQqLine.js +8 -0
  145. package/dist/geoms/GeomQqLine.js.map +1 -0
  146. package/dist/geoms/GeomQuantile.d.ts +8 -0
  147. package/dist/geoms/GeomQuantile.d.ts.map +1 -0
  148. package/dist/geoms/GeomQuantile.js +8 -0
  149. package/dist/geoms/GeomQuantile.js.map +1 -0
  150. package/dist/geoms/GeomRaster.d.ts +8 -0
  151. package/dist/geoms/GeomRaster.d.ts.map +1 -0
  152. package/dist/geoms/GeomRaster.js +8 -0
  153. package/dist/geoms/GeomRaster.js.map +1 -0
  154. package/dist/geoms/GeomRect.d.ts +8 -0
  155. package/dist/geoms/GeomRect.d.ts.map +1 -0
  156. package/dist/geoms/GeomRect.js +6 -0
  157. package/dist/geoms/GeomRect.js.map +1 -0
  158. package/dist/geoms/GeomRibbon.d.ts +8 -0
  159. package/dist/geoms/GeomRibbon.d.ts.map +1 -0
  160. package/dist/geoms/GeomRibbon.js +6 -0
  161. package/dist/geoms/GeomRibbon.js.map +1 -0
  162. package/dist/geoms/GeomRug.d.ts +8 -0
  163. package/dist/geoms/GeomRug.d.ts.map +1 -0
  164. package/dist/geoms/GeomRug.js +8 -0
  165. package/dist/geoms/GeomRug.js.map +1 -0
  166. package/dist/geoms/GeomRule.d.ts +8 -0
  167. package/dist/geoms/GeomRule.d.ts.map +1 -0
  168. package/dist/geoms/GeomRule.js +6 -0
  169. package/dist/geoms/GeomRule.js.map +1 -0
  170. package/dist/geoms/GeomSegment.d.ts +8 -0
  171. package/dist/geoms/GeomSegment.d.ts.map +1 -0
  172. package/dist/geoms/GeomSegment.js +6 -0
  173. package/dist/geoms/GeomSegment.js.map +1 -0
  174. package/dist/geoms/GeomSf.d.ts +8 -0
  175. package/dist/geoms/GeomSf.d.ts.map +1 -0
  176. package/dist/geoms/GeomSf.js +8 -0
  177. package/dist/geoms/GeomSf.js.map +1 -0
  178. package/dist/geoms/GeomSfLabel.d.ts +8 -0
  179. package/dist/geoms/GeomSfLabel.d.ts.map +1 -0
  180. package/dist/geoms/GeomSfLabel.js +8 -0
  181. package/dist/geoms/GeomSfLabel.js.map +1 -0
  182. package/dist/geoms/GeomSfText.d.ts +8 -0
  183. package/dist/geoms/GeomSfText.d.ts.map +1 -0
  184. package/dist/geoms/GeomSfText.js +8 -0
  185. package/dist/geoms/GeomSfText.js.map +1 -0
  186. package/dist/geoms/GeomSmooth.d.ts +8 -0
  187. package/dist/geoms/GeomSmooth.d.ts.map +1 -0
  188. package/dist/geoms/GeomSmooth.js +8 -0
  189. package/dist/geoms/GeomSmooth.js.map +1 -0
  190. package/dist/geoms/GeomSpoke.d.ts +8 -0
  191. package/dist/geoms/GeomSpoke.d.ts.map +1 -0
  192. package/dist/geoms/GeomSpoke.js +8 -0
  193. package/dist/geoms/GeomSpoke.js.map +1 -0
  194. package/dist/geoms/GeomStep.d.ts +8 -0
  195. package/dist/geoms/GeomStep.d.ts.map +1 -0
  196. package/dist/geoms/GeomStep.js +6 -0
  197. package/dist/geoms/GeomStep.js.map +1 -0
  198. package/dist/geoms/GeomText.d.ts +8 -0
  199. package/dist/geoms/GeomText.d.ts.map +1 -0
  200. package/dist/geoms/GeomText.js +6 -0
  201. package/dist/geoms/GeomText.js.map +1 -0
  202. package/dist/geoms/GeomTile.d.ts +8 -0
  203. package/dist/geoms/GeomTile.d.ts.map +1 -0
  204. package/dist/geoms/GeomTile.js +8 -0
  205. package/dist/geoms/GeomTile.js.map +1 -0
  206. package/dist/geoms/GeomViolin.d.ts +8 -0
  207. package/dist/geoms/GeomViolin.d.ts.map +1 -0
  208. package/dist/geoms/GeomViolin.js +8 -0
  209. package/dist/geoms/GeomViolin.js.map +1 -0
  210. package/dist/geoms/GeomVline.d.ts +8 -0
  211. package/dist/geoms/GeomVline.d.ts.map +1 -0
  212. package/dist/geoms/GeomVline.js +6 -0
  213. package/dist/geoms/GeomVline.js.map +1 -0
  214. package/dist/geoms/index.d.ts +50 -0
  215. package/dist/geoms/index.d.ts.map +1 -0
  216. package/dist/geoms/index.js +51 -0
  217. package/dist/geoms/index.js.map +1 -0
  218. package/dist/grammar.d.ts +59 -0
  219. package/dist/grammar.d.ts.map +1 -0
  220. package/dist/grammar.js +134 -0
  221. package/dist/grammar.js.map +1 -0
  222. package/dist/host-effect.d.ts +3 -0
  223. package/dist/host-effect.d.ts.map +1 -0
  224. package/dist/host-effect.js +3 -0
  225. package/dist/host-effect.js.map +1 -0
  226. package/dist/host-init.d.ts +2 -0
  227. package/dist/host-init.d.ts.map +1 -0
  228. package/dist/host-init.js +4 -0
  229. package/dist/host-init.js.map +1 -0
  230. package/dist/index.d.ts +17 -0
  231. package/dist/index.d.ts.map +1 -0
  232. package/dist/index.js +15 -0
  233. package/dist/index.js.map +1 -0
  234. package/dist/interaction.d.ts +9 -0
  235. package/dist/interaction.d.ts.map +1 -0
  236. package/dist/interaction.js +2 -0
  237. package/dist/interaction.js.map +1 -0
  238. package/dist/plot-accessibility.d.ts +23 -0
  239. package/dist/plot-accessibility.d.ts.map +1 -0
  240. package/dist/plot-accessibility.js +68 -0
  241. package/dist/plot-accessibility.js.map +1 -0
  242. package/dist/plot-assemble.d.ts +5 -0
  243. package/dist/plot-assemble.d.ts.map +1 -0
  244. package/dist/plot-assemble.js +14 -0
  245. package/dist/plot-assemble.js.map +1 -0
  246. package/dist/plot-controls.d.ts +20 -0
  247. package/dist/plot-controls.d.ts.map +1 -0
  248. package/dist/plot-controls.js +119 -0
  249. package/dist/plot-controls.js.map +1 -0
  250. package/dist/plot-gesture.d.ts +15 -0
  251. package/dist/plot-gesture.d.ts.map +1 -0
  252. package/dist/plot-gesture.js +55 -0
  253. package/dist/plot-gesture.js.map +1 -0
  254. package/dist/plot-host-identity.d.ts +5 -0
  255. package/dist/plot-host-identity.d.ts.map +1 -0
  256. package/dist/plot-host-identity.js +30 -0
  257. package/dist/plot-host-identity.js.map +1 -0
  258. package/dist/plot-inputs.d.ts +41 -0
  259. package/dist/plot-inputs.d.ts.map +1 -0
  260. package/dist/plot-inputs.js +147 -0
  261. package/dist/plot-inputs.js.map +1 -0
  262. package/dist/plot-interactions.d.ts +45 -0
  263. package/dist/plot-interactions.d.ts.map +1 -0
  264. package/dist/plot-interactions.js +447 -0
  265. package/dist/plot-interactions.js.map +1 -0
  266. package/dist/plot-legends.d.ts +20 -0
  267. package/dist/plot-legends.d.ts.map +1 -0
  268. package/dist/plot-legends.js +200 -0
  269. package/dist/plot-legends.js.map +1 -0
  270. package/dist/plot-overlay.d.ts +15 -0
  271. package/dist/plot-overlay.d.ts.map +1 -0
  272. package/dist/plot-overlay.js +69 -0
  273. package/dist/plot-overlay.js.map +1 -0
  274. package/dist/plot-props.d.ts +49 -0
  275. package/dist/plot-props.d.ts.map +1 -0
  276. package/dist/plot-props.js +2 -0
  277. package/dist/plot-props.js.map +1 -0
  278. package/dist/plot-runtime.d.ts +15 -0
  279. package/dist/plot-runtime.d.ts.map +1 -0
  280. package/dist/plot-runtime.js +59 -0
  281. package/dist/plot-runtime.js.map +1 -0
  282. package/dist/plot-surface.d.ts +3 -0
  283. package/dist/plot-surface.d.ts.map +1 -0
  284. package/dist/plot-surface.js +285 -0
  285. package/dist/plot-surface.js.map +1 -0
  286. package/dist/registry.d.ts +28 -0
  287. package/dist/registry.d.ts.map +1 -0
  288. package/dist/registry.js +164 -0
  289. package/dist/registry.js.map +1 -0
  290. package/dist/scales.d.ts +132 -0
  291. package/dist/scales.d.ts.map +1 -0
  292. package/dist/scales.js +434 -0
  293. package/dist/scales.js.map +1 -0
  294. package/dist/strata-sync.d.ts +7 -0
  295. package/dist/strata-sync.d.ts.map +1 -0
  296. package/dist/strata-sync.js +158 -0
  297. package/dist/strata-sync.js.map +1 -0
  298. package/dist/themes.d.ts +38 -0
  299. package/dist/themes.d.ts.map +1 -0
  300. package/dist/themes.js +141 -0
  301. package/dist/themes.js.map +1 -0
  302. package/package.json +71 -0
@@ -0,0 +1,200 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import { encodeKey } from "@ggts-sh/core";
4
+ import { buildInteractiveLegendEntries, buildLegendEntryKeyIndexForPlot, isLegendValueVisible, legendIdentityKey, nextLegendFilterValues, samePropertyKeySet, } from "@ggts-sh/core/interaction";
5
+ const same = (state, entry) => state !== null &&
6
+ state.scale === entry.legend.scale &&
7
+ state.value === encodeKey(entry.entry.value);
8
+ export function usePlotLegends(input) {
9
+ const { model, registry, revision, props, scope, keyForRow, filters } = input;
10
+ const [committed, setCommitted] = useState(null);
11
+ const [preview, setPreview] = useState(null);
12
+ const capability = useMemo(() => {
13
+ const focus = new Map();
14
+ const filter = new Map();
15
+ for (const layer of registry.layers) {
16
+ if (layer.kind === "legendFocus" && layer.value !== null) {
17
+ focus.set(layer.value.channel, layer.value.input === true || layer.value.input.preview !== false);
18
+ }
19
+ if (layer.kind === "legendFilter" && layer.value !== null) {
20
+ const options = layer.value.input === true ? {} : layer.value.input;
21
+ if (options.mode !== undefined && options.mode !== "include" && options.mode !== "exclude")
22
+ throw new TypeError("Legend filter mode must be include or exclude");
23
+ filter.set(layer.value.channel, {
24
+ mode: options.mode ?? "exclude",
25
+ multiple: options.multiple ?? true,
26
+ });
27
+ }
28
+ }
29
+ return { focus, filter };
30
+ }, [registry, revision]);
31
+ const allEntries = useMemo(() => (model === null ? [] : buildInteractiveLegendEntries(model.scene.legends)), [model]);
32
+ const entries = allEntries.filter((entry) => capability.focus.has(entry.legend.scale) ||
33
+ capability.filter.has(entry.legend.scale) ||
34
+ Boolean(props.legendFocus) ||
35
+ Boolean(props.legendFilter));
36
+ const index = useMemo(() => buildLegendEntryKeyIndexForPlot({
37
+ model: entries.length === 0 ? null : model,
38
+ semanticKey: keyForRow,
39
+ }), [model, keyForRow, entries.length]);
40
+ const focusEnabled = capability.focus.size > 0 || Boolean(props.legendFocus);
41
+ const selectedEntry = entries.find((entry) => same(preview, entry));
42
+ const controllerKeys = props.interaction?.emphasized(scope);
43
+ const localKeys = committed?.keys ?? [];
44
+ const previewKeys = selectedEntry === undefined
45
+ ? null
46
+ : (index.get(legendIdentityKey(selectedEntry.identity)) ?? []);
47
+ const emphasis = focusEnabled
48
+ ? (previewKeys ?? controllerKeys ?? localKeys)
49
+ : (controllerKeys ?? []);
50
+ const isPressed = (entry) => {
51
+ const keys = controllerKeys ?? localKeys;
52
+ return (keys.length > 0 &&
53
+ samePropertyKeySet(keys, index.get(legendIdentityKey(entry.identity)) ?? []));
54
+ };
55
+ const emit = (event) => {
56
+ props.onlegendfocus?.(event);
57
+ props.oninteraction?.(event);
58
+ };
59
+ const focusEntry = (entry, source, commit) => {
60
+ if (!capability.focus.has(entry.legend.scale) &&
61
+ (props.legendFocus === undefined || props.legendFocus === false))
62
+ return;
63
+ const previewAllowed = capability.focus.get(entry.legend.scale) ??
64
+ (typeof props.legendFocus === "object" ? (props.legendFocus.preview ?? true) : true);
65
+ if (!commit && !previewAllowed)
66
+ return;
67
+ const clear = commit && isPressed(entry);
68
+ const keys = clear ? [] : (index.get(legendIdentityKey(entry.identity)) ?? []);
69
+ const state = clear
70
+ ? null
71
+ : { scale: entry.legend.scale, value: encodeKey(entry.entry.value), keys };
72
+ if (commit) {
73
+ setCommitted(state);
74
+ setPreview(null);
75
+ }
76
+ else
77
+ setPreview(state);
78
+ if (commit)
79
+ props.interaction?.setEmphasis(keys, { scope, source });
80
+ emit(clear
81
+ ? { type: "legend-focus", phase: "clear", source }
82
+ : {
83
+ type: "legend-focus",
84
+ phase: "change",
85
+ state: commit ? "committed" : "transient",
86
+ source,
87
+ scale: entry.legend.scale,
88
+ value: entry.entry.value,
89
+ label: entry.entry.fullLabel ?? entry.entry.label,
90
+ keys,
91
+ });
92
+ };
93
+ const clearPreview = (source) => {
94
+ if (preview === null)
95
+ return;
96
+ setPreview(null);
97
+ if (committed === null)
98
+ emit({ type: "legend-focus", phase: "clear", source });
99
+ };
100
+ const clearFocus = (source = "programmatic") => {
101
+ setPreview(null);
102
+ setCommitted(null);
103
+ props.interaction?.clearEmphasis({ scope, source });
104
+ emit({ type: "legend-focus", phase: "clear", source });
105
+ };
106
+ const fieldFor = (entry) => model?.layerFields
107
+ .flat()
108
+ .find((field) => field.channel === entry.legend.scale && field.source !== "stat")?.field;
109
+ const filterEntry = (entry, source) => {
110
+ const field = fieldFor(entry);
111
+ if (field === undefined)
112
+ return;
113
+ const options = capability.filter.get(entry.legend.scale) ??
114
+ (typeof props.legendFilter === "object" ? props.legendFilter : {});
115
+ const mode = options.mode ?? "exclude";
116
+ const prior = filters.find((clause) => clause.scale === entry.legend.scale && clause.field === field);
117
+ const catalog = entry.legend.entries.map((value) => value.value);
118
+ const values = nextLegendFilterValues(prior?.values ?? (mode === "include" ? catalog : []), entry.entry.value, catalog, mode, options.multiple ?? true);
119
+ const clause = { scale: entry.legend.scale, field, values, mode };
120
+ input.setFilters([
121
+ ...filters.filter((value) => value.scale !== clause.scale || value.field !== field),
122
+ clause,
123
+ ]);
124
+ const event = { type: "legend-filter", phase: "change", source, clause };
125
+ props.onlegendfilter?.(event);
126
+ props.oninteraction?.(event);
127
+ };
128
+ useEffect(() => {
129
+ if (committed === null)
130
+ return;
131
+ const entry = entries.find((item) => same(committed, item));
132
+ const keys = entry === undefined ? [] : (index.get(legendIdentityKey(entry.identity)) ?? []);
133
+ if (!samePropertyKeySet(keys, committed.keys)) {
134
+ setCommitted(null);
135
+ if (props.interaction === undefined)
136
+ emit({ type: "legend-focus", phase: "clear", source: "programmatic" });
137
+ }
138
+ }, [model, index]);
139
+ useEffect(() => {
140
+ if (focusEnabled)
141
+ return;
142
+ setPreview(null);
143
+ setCommitted(null);
144
+ }, [focusEnabled]);
145
+ useEffect(() => {
146
+ if (filters.every((clause) => capability.filter.has(clause.scale) || Boolean(props.legendFilter)))
147
+ return;
148
+ // Reset atomically, matching the Svelte host: removed controls cannot
149
+ // leave hidden row filters behind, including when another guide remains.
150
+ input.setFilters([]);
151
+ const event = {
152
+ type: "legend-filter",
153
+ phase: "clear",
154
+ source: "programmatic",
155
+ clause: null,
156
+ };
157
+ props.onlegendfilter?.(event);
158
+ props.oninteraction?.(event);
159
+ }, [capability.filter, props.legendFilter, filters]);
160
+ return {
161
+ emphasis,
162
+ entries,
163
+ clearFocus,
164
+ controls: entries.length === 0 ? null : (_jsxs("div", { className: "gg-legend-controls", "aria-label": "Legend controls", style: { display: "flex", flexWrap: "wrap", gap: 8, lineHeight: 1.4 }, children: [entries.map((entry) => {
165
+ const identity = legendIdentityKey(entry.identity);
166
+ const filter = capability.filter.has(entry.legend.scale) || Boolean(props.legendFilter);
167
+ const focus = capability.focus.has(entry.legend.scale) || Boolean(props.legendFocus);
168
+ const field = fieldFor(entry);
169
+ const clause = filters.find((value) => value.scale === entry.legend.scale && value.field === field);
170
+ const visible = clause === undefined ||
171
+ isLegendValueVisible(clause.values, entry.entry.value, clause.mode);
172
+ return (_jsxs("div", { children: [focus && (_jsxs("button", { type: "button", "aria-pressed": isPressed(entry), onPointerEnter: () => {
173
+ focusEntry(entry, "pointer", false);
174
+ }, onPointerLeave: () => {
175
+ clearPreview("pointer");
176
+ }, onFocus: () => {
177
+ focusEntry(entry, "keyboard", false);
178
+ }, onBlur: () => {
179
+ clearPreview("keyboard");
180
+ }, onClick: (event) => {
181
+ focusEntry(entry, event.detail === 0 ? "keyboard" : "pointer", true);
182
+ }, style: { minHeight: 44, minWidth: 44 }, children: ["Focus ", entry.entry.fullLabel ?? entry.entry.label] })), filter && field !== undefined && (_jsxs("label", { style: { display: "inline-flex", alignItems: "center", minHeight: 44, gap: 6 }, children: [_jsx("input", { type: "checkbox", checked: visible, onChange: (event) => {
183
+ filterEntry(entry, event.nativeEvent instanceof PointerEvent ? "pointer" : "keyboard");
184
+ } }), "Show ", entry.entry.fullLabel ?? entry.entry.label] }))] }, identity));
185
+ }), committed !== null && (_jsx("button", { type: "button", onClick: () => {
186
+ clearFocus("pointer");
187
+ }, children: "Clear legend focus" })), filters.length > 0 && (_jsx("button", { type: "button", onClick: () => {
188
+ input.setFilters([]);
189
+ const event = {
190
+ type: "legend-filter",
191
+ phase: "clear",
192
+ source: "pointer",
193
+ clause: null,
194
+ };
195
+ props.onlegendfilter?.(event);
196
+ props.oninteraction?.(event);
197
+ }, children: "Reset legend filters" }))] })),
198
+ };
199
+ }
200
+ //# sourceMappingURL=plot-legends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot-legends.js","sourceRoot":"","sources":["../src/plot-legends.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CandidateFacts, CellValue, PlotRect, RenderModel } from "@ggts-sh/core";
2
+ import type { PlotInspectionChange } from "@ggts-sh/core/interaction";
3
+ export declare function PlotOverlay({ model, inspection, seed, candidates, selected, emphasized, rectangles, flipped, }: {
4
+ model: RenderModel;
5
+ inspection: PlotInspectionChange<Record<string, CellValue>, PropertyKey> | null;
6
+ seed: CandidateFacts | null;
7
+ candidates: readonly (CandidateFacts & {
8
+ keys: readonly PropertyKey[];
9
+ })[];
10
+ selected: readonly PropertyKey[];
11
+ emphasized: readonly PropertyKey[];
12
+ rectangles: readonly PlotRect[];
13
+ flipped: boolean;
14
+ }): import("react").JSX.Element | null;
15
+ //# sourceMappingURL=plot-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot-overlay.d.ts","sourceRoot":"","sources":["../src/plot-overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAYtF,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AA+E1F,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,UAAU,EACV,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,OAAO,GACR,EAAE;IACD,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;IAChF,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,SAAS,CAAC,cAAc,GAAG;QAAE,IAAI,EAAE,SAAS,WAAW,EAAE,CAAA;KAAE,CAAC,EAAE,CAAC;IAC3E,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,UAAU,EAAE,SAAS,WAAW,EAAE,CAAC;IACnC,UAAU,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB,sCAuDA"}
@@ -0,0 +1,69 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { anchorsFromCandidateKeys, applyEmphasisRingDensityGate, crosshairGapForBox, crosshairGlyphObstacles, glyphExtentsFromBatch, gappedCrosshairSegmentsWithObstacles, glyphHoverBox, hoverChromeForKind, HOVER_CROSSHAIR_GAP_RADIUS, } from "@ggts-sh/core/interaction";
3
+ function Anchor({ anchor, className, radius, }) {
4
+ if (anchor.chrome === "none")
5
+ return null;
6
+ if (anchor.chrome === "ring")
7
+ return (_jsx("circle", { className: className, cx: anchor.x, cy: anchor.y, r: radius, fill: "none", stroke: "Highlight", strokeWidth: 2 }));
8
+ const box = glyphHoverBox(anchor, {
9
+ width: anchor.width,
10
+ height: anchor.height,
11
+ textAnchor: anchor.textAnchor,
12
+ });
13
+ return (_jsx("rect", { className: className, ...box, rx: 2, fill: "none", stroke: "Highlight", strokeWidth: 2 }));
14
+ }
15
+ function candidateExtent(model, candidate) {
16
+ const batch = model.scene.batches[candidate.batchIndex];
17
+ return batch?.kind === "glyphs" ? glyphExtentsFromBatch(batch, candidate.primitiveIndex) : null;
18
+ }
19
+ function hoverGuides(model, inspection, seed, flipped) {
20
+ if (inspection === null)
21
+ return { hover: null, lines: [] };
22
+ const focus = inspection.focus;
23
+ const panel = model.viewport.panelAtOrOnly(focus.anchor);
24
+ const chrome = hoverChromeForKind(seed?.kind);
25
+ const dimensions = seed === null ? null : candidateExtent(model, seed);
26
+ const hover = { ...focus.anchor, chrome, ...dimensions };
27
+ if (panel === null)
28
+ return { hover, lines: [] };
29
+ const obstacles = crosshairGlyphObstacles(model.scene.batches, model.scene.panels, panel.id);
30
+ const gap = chrome === "ring"
31
+ ? HOVER_CROSSHAIR_GAP_RADIUS
32
+ : chrome === "box"
33
+ ? crosshairGapForBox(dimensions?.width ?? 12, dimensions?.height ?? 12)
34
+ : 0;
35
+ const mode = inspection.mode;
36
+ const vertical = mode === "xy" || mode === (flipped ? "y" : "x");
37
+ const horizontal = mode === "xy" || mode === (flipped ? "x" : "y");
38
+ const bounds = {
39
+ x: panel.bounds.x0,
40
+ y: panel.bounds.y0,
41
+ width: panel.bounds.x1 - panel.bounds.x0,
42
+ height: panel.bounds.y1 - panel.bounds.y0,
43
+ };
44
+ const lines = [
45
+ ...(vertical
46
+ ? gappedCrosshairSegmentsWithObstacles("vertical", focus.anchor, bounds, gap, obstacles)
47
+ : []),
48
+ ...(horizontal
49
+ ? gappedCrosshairSegmentsWithObstacles("horizontal", focus.anchor, bounds, gap, obstacles)
50
+ : []),
51
+ ];
52
+ return { hover, lines };
53
+ }
54
+ export function PlotOverlay({ model, inspection, seed, candidates, selected, emphasized, rectangles, flipped, }) {
55
+ const presented = candidates.map((candidate) => ({
56
+ ...candidate,
57
+ ...candidateExtent(model, candidate),
58
+ }));
59
+ const anchors = anchorsFromCandidateKeys(presented, selected);
60
+ const emphasis = applyEmphasisRingDensityGate(anchorsFromCandidateKeys(presented, emphasized));
61
+ const { hover, lines } = hoverGuides(model, inspection, seed, flipped);
62
+ if (inspection === null &&
63
+ anchors.length === 0 &&
64
+ emphasis.length === 0 &&
65
+ rectangles.length === 0)
66
+ return null;
67
+ return (_jsxs("svg", { className: "gg-interaction-overlay", "aria-hidden": "true", width: model.scene.width, height: model.scene.height, style: { position: "absolute", inset: 0, pointerEvents: "none" }, children: [lines.map((line, index) => (_jsx("line", { className: "gg-crosshair", ...line, stroke: "currentColor", strokeOpacity: 0.5, strokeDasharray: "3 3" }, index))), hover !== null && _jsx(Anchor, { anchor: hover, className: "gg-hover-ring", radius: 6 }), anchors.map((anchor, index) => (_jsx(Anchor, { anchor: anchor, className: "gg-selected-ring", radius: 8 }, index))), emphasis.map((anchor, index) => (_jsx(Anchor, { anchor: anchor, className: "gg-emphasis-ring", radius: 7 }, index))), rectangles.map((rect, index) => (_jsx("rect", { className: "gg-brush", x: rect.x0, y: rect.y0, width: rect.x1 - rect.x0, height: rect.y1 - rect.y0, fill: "Highlight", fillOpacity: 0.12, stroke: "Highlight" }, index)))] }));
68
+ }
69
+ //# sourceMappingURL=plot-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot-overlay.js","sourceRoot":"","sources":["../src/plot-overlay.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { CompositionDiagnostic } from "@ggts-sh/compose";
2
+ import type { ReactNode } from "react";
3
+ import type { CellValue, RenderModel } from "@ggts-sh/core";
4
+ import type { InteractionDiagnostic, LegendFocusEvent, LegendFocusInput, LegendFilterEvent, LegendFilterInput } from "@ggts-sh/core/interaction";
5
+ import type { A11yMode, AesInput, DataInput, LayerInput, PortableSpec, SpecInput } from "@ggts-sh/spec";
6
+ import type { InspectInput, InteractionTool, PlotInteractionController, PlotInteractionEvent, PlotInteractionScope, PlotSelection, SelectInput, ZoomDomains, ZoomEvent, ZoomInput } from "./interaction.js";
7
+ import type { PlotInspection } from "./interaction.js";
8
+ export interface GGPlotHandle {
9
+ resetScales(): void;
10
+ setZoom(domains: Partial<ZoomDomains>): void;
11
+ }
12
+ export interface GGPlotProps<Row extends Record<string, CellValue> = Record<string, CellValue>> {
13
+ spec?: SpecInput;
14
+ data?: DataInput | readonly Row[];
15
+ aes?: AesInput;
16
+ layers?: LayerInput[];
17
+ a11y?: A11yMode;
18
+ width?: number | "container";
19
+ height?: number;
20
+ /**
21
+ * Durable row identity. Use this in JSX — React does not pass `key` through
22
+ * as a plot prop. Inspect / select / createPlotInteraction identity still win.
23
+ */
24
+ identity?: PropertyKey | ((row: Row, index: number) => PropertyKey);
25
+ /** @deprecated since 0.21.0 — React strips JSX `key`; use `identity`. */
26
+ key?: PropertyKey | ((row: Row, index: number) => PropertyKey);
27
+ inspect?: InspectInput<Row>;
28
+ /** Legacy shorthand; prefer <GuideLegend focus>. */
29
+ legendFocus?: LegendFocusInput;
30
+ /** Legacy shorthand; prefer <GuideLegend filter>. */
31
+ legendFilter?: LegendFilterInput;
32
+ select?: SelectInput;
33
+ zoom?: ZoomInput;
34
+ tool?: InteractionTool;
35
+ interaction?: PlotInteractionController;
36
+ interactionScope?: PlotInteractionScope;
37
+ oninspect?: (inspection: PlotInspection<Row>) => void;
38
+ onselect?: (selection: PlotSelection) => void;
39
+ onzoom?: (event: ZoomEvent) => void;
40
+ oninteraction?: (event: PlotInteractionEvent<Row>) => void;
41
+ onlegendfocus?: (event: LegendFocusEvent) => void;
42
+ onlegendfilter?: (event: LegendFilterEvent) => void;
43
+ ontoolchange?: (tool: InteractionTool) => void;
44
+ ondiagnostic?: (diagnostic: InteractionDiagnostic | CompositionDiagnostic) => void;
45
+ onrender?: (model: RenderModel, spec: PortableSpec) => void;
46
+ ariaLabel?: string;
47
+ children?: ReactNode;
48
+ }
49
+ //# sourceMappingURL=plot-props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot-props.d.ts","sourceRoot":"","sources":["../src/plot-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACV,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,IAAI,CAAC;IACpB,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,WAAW,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;IAC5F,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC;IAClC,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC;IACpE,yEAAyE;IACzE,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC;IAC/D,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAC5B,oDAAoD;IACpD,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,qDAAqD;IACrD,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,qBAAqB,GAAG,qBAAqB,KAAK,IAAI,CAAC;IACnF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plot-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot-props.js","sourceRoot":"","sources":["../src/plot-props.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { RenderModel, RuntimeRowFilterClause } from "@ggts-sh/core";
2
+ import type { PortableSpec } from "@ggts-sh/spec";
3
+ /** The pipeline is memoized by chart inputs, never by transient UI state. */
4
+ export declare function usePlotModel(input: {
5
+ spec: PortableSpec | null;
6
+ baselineSpec: PortableSpec | null;
7
+ width: number;
8
+ height: number;
9
+ rowFilters: readonly RuntimeRowFilterClause[];
10
+ }): {
11
+ model: RenderModel | null;
12
+ strata: import("@ggts-sh/core").Stratum[];
13
+ resetScales(): void;
14
+ };
15
+ //# sourceMappingURL=plot-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot-runtime.d.ts","sourceRoot":"","sources":["../src/plot-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAc,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC/C;;;;EAqDA"}
@@ -0,0 +1,59 @@
1
+ import { useMemo, useRef, useState } from "react";
2
+ import { planStrata, runPipeline } from "@ggts-sh/core";
3
+ import { useHostLayoutEffect } from "./host-effect.js";
4
+ /** The pipeline is memoized by chart inputs, never by transient UI state. */
5
+ export function usePlotModel(input) {
6
+ const scales = useRef(null);
7
+ const [epoch, setEpoch] = useState(0);
8
+ const model = useMemo(() => {
9
+ if (input.spec === null)
10
+ return null;
11
+ let previous = scales.current ?? undefined;
12
+ let baselineDomains;
13
+ if (input.baselineSpec !== null && input.baselineSpec !== input.spec) {
14
+ const baseline = runPipeline(input.baselineSpec, {
15
+ width: input.width,
16
+ height: input.height,
17
+ ...(previous !== undefined && { prevScales: previous }),
18
+ ...(input.rowFilters.length > 0 && { rowFilters: input.rowFilters }),
19
+ });
20
+ baselineDomains = baseline.domains.effective;
21
+ previous = baseline.scales.state;
22
+ baseline.dispose();
23
+ }
24
+ return runPipeline(input.spec, {
25
+ width: input.width,
26
+ height: input.height,
27
+ ...(previous !== undefined && { prevScales: previous }),
28
+ ...(baselineDomains !== undefined && { baselineDomains }),
29
+ ...(input.rowFilters.length > 0 && { rowFilters: input.rowFilters }),
30
+ });
31
+ }, [input.spec, input.baselineSpec, input.width, input.height, input.rowFilters, epoch]);
32
+ const strata = useMemo(() => (model === null ? [] : planStrata(model.scene, model.layerBackends)), [model]);
33
+ const pendingDisposal = useRef(new Set());
34
+ useHostLayoutEffect(() => {
35
+ if (model === null)
36
+ return () => { };
37
+ pendingDisposal.current.delete(model);
38
+ scales.current = model.scales.state;
39
+ return () => {
40
+ const pending = pendingDisposal.current;
41
+ pending.add(model);
42
+ // StrictMode replays effect setup without remounting the memoized model.
43
+ // The second setup cancels disposal; a replaced/unmounted model is released.
44
+ queueMicrotask(() => {
45
+ if (pending.delete(model))
46
+ model.dispose();
47
+ });
48
+ };
49
+ }, [model]);
50
+ return {
51
+ model,
52
+ strata,
53
+ resetScales() {
54
+ scales.current = null;
55
+ setEpoch((value) => value + 1);
56
+ },
57
+ };
58
+ }
59
+ //# sourceMappingURL=plot-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot-runtime.js","sourceRoot":"","sources":["../src/plot-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type SurfaceProps } from "./plot-inputs.js";
2
+ export declare function PlotSurface(props: SurfaceProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=plot-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plot-surface.d.ts","sourceRoot":"","sources":["../src/plot-surface.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAuV1B,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,+BAE9C"}