@ggts-sh/svelte 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 (656) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/bin/ggts-codemod.js +47 -0
  4. package/dist/GGPlot.svelte +491 -0
  5. package/dist/GGPlot.svelte.d.ts +67 -0
  6. package/dist/a11y/CanvasA11y.svelte +115 -0
  7. package/dist/a11y/CanvasA11y.svelte.d.ts +15 -0
  8. package/dist/a11y/canvas-a11y.d.ts +1 -0
  9. package/dist/a11y/canvas-a11y.js +2 -0
  10. package/dist/assembly/assemble.d.ts +1 -0
  11. package/dist/assembly/assemble.js +1 -0
  12. package/dist/assembly/labels.d.ts +43 -0
  13. package/dist/assembly/labels.js +126 -0
  14. package/dist/assembly/layout.d.ts +158 -0
  15. package/dist/assembly/layout.js +175 -0
  16. package/dist/chrome/StatusChrome.svelte +125 -0
  17. package/dist/chrome/StatusChrome.svelte.d.ts +16 -0
  18. package/dist/chrome/ToolRail.svelte +293 -0
  19. package/dist/chrome/ToolRail.svelte.d.ts +26 -0
  20. package/dist/chrome/chrome-state.svelte.d.ts +63 -0
  21. package/dist/chrome/chrome-state.svelte.js +158 -0
  22. package/dist/chrome/theme-css.d.ts +16 -0
  23. package/dist/chrome/theme-css.js +16 -0
  24. package/dist/codemod/cli.d.ts +16 -0
  25. package/dist/codemod/cli.js +150 -0
  26. package/dist/codemod/edits.d.ts +28 -0
  27. package/dist/codemod/edits.js +36 -0
  28. package/dist/codemod/index.d.ts +10 -0
  29. package/dist/codemod/index.js +10 -0
  30. package/dist/codemod/migrate-plot-props-rewrite.d.ts +86 -0
  31. package/dist/codemod/migrate-plot-props-rewrite.js +228 -0
  32. package/dist/codemod/migrate-plot-props.d.ts +38 -0
  33. package/dist/codemod/migrate-plot-props.js +159 -0
  34. package/dist/coord/Coord.svelte +21 -0
  35. package/dist/coord/Coord.svelte.d.ts +16 -0
  36. package/dist/coord/CoordCartesian.svelte +11 -0
  37. package/dist/coord/CoordCartesian.svelte.d.ts +18 -0
  38. package/dist/coord/CoordFixed.svelte +17 -0
  39. package/dist/coord/CoordFixed.svelte.d.ts +10 -0
  40. package/dist/coord/CoordFlip.svelte +11 -0
  41. package/dist/coord/CoordFlip.svelte.d.ts +18 -0
  42. package/dist/coord/CoordPolar.svelte +16 -0
  43. package/dist/coord/CoordPolar.svelte.d.ts +9 -0
  44. package/dist/coord/CoordRadial.svelte +16 -0
  45. package/dist/coord/CoordRadial.svelte.d.ts +9 -0
  46. package/dist/coord/CoordSf.svelte +16 -0
  47. package/dist/coord/CoordSf.svelte.d.ts +9 -0
  48. package/dist/coord/CoordTransform.svelte +16 -0
  49. package/dist/coord/CoordTransform.svelte.d.ts +9 -0
  50. package/dist/data/index.d.ts +1 -0
  51. package/dist/data/index.js +2 -0
  52. package/dist/diagnostics/composition.d.ts +112 -0
  53. package/dist/diagnostics/composition.js +203 -0
  54. package/dist/diagnostics/deprecation.d.ts +58 -0
  55. package/dist/diagnostics/deprecation.js +27 -0
  56. package/dist/diagnostics/plot-engine-diagnostics.svelte.d.ts +44 -0
  57. package/dist/diagnostics/plot-engine-diagnostics.svelte.js +193 -0
  58. package/dist/facet/Facet.svelte +23 -0
  59. package/dist/facet/Facet.svelte.d.ts +16 -0
  60. package/dist/facet/FacetGrid.svelte +32 -0
  61. package/dist/facet/FacetGrid.svelte.d.ts +16 -0
  62. package/dist/facet/FacetWrap.svelte +32 -0
  63. package/dist/facet/FacetWrap.svelte.d.ts +16 -0
  64. package/dist/fonts/RobotoCondensed-Bold.ttf +0 -0
  65. package/dist/fonts/RobotoCondensed-Light.ttf +0 -0
  66. package/dist/fonts/RobotoCondensed-Regular.ttf +0 -0
  67. package/dist/fonts/THIRD_PARTY_NOTICES.txt +416 -0
  68. package/dist/geoms/GeomAbline.svelte +25 -0
  69. package/dist/geoms/GeomAbline.svelte.d.ts +7 -0
  70. package/dist/geoms/GeomArea.svelte +12 -0
  71. package/dist/geoms/GeomArea.svelte.d.ts +7 -0
  72. package/dist/geoms/GeomBar.svelte +12 -0
  73. package/dist/geoms/GeomBar.svelte.d.ts +7 -0
  74. package/dist/geoms/GeomBin2d.svelte +21 -0
  75. package/dist/geoms/GeomBin2d.svelte.d.ts +7 -0
  76. package/dist/geoms/GeomBlank.svelte +12 -0
  77. package/dist/geoms/GeomBlank.svelte.d.ts +7 -0
  78. package/dist/geoms/GeomBoxplot.svelte +25 -0
  79. package/dist/geoms/GeomBoxplot.svelte.d.ts +7 -0
  80. package/dist/geoms/GeomCol.svelte +12 -0
  81. package/dist/geoms/GeomCol.svelte.d.ts +7 -0
  82. package/dist/geoms/GeomContour.svelte +25 -0
  83. package/dist/geoms/GeomContour.svelte.d.ts +7 -0
  84. package/dist/geoms/GeomCount.svelte +12 -0
  85. package/dist/geoms/GeomCount.svelte.d.ts +7 -0
  86. package/dist/geoms/GeomCrossbar.svelte +25 -0
  87. package/dist/geoms/GeomCrossbar.svelte.d.ts +7 -0
  88. package/dist/geoms/GeomCurve.svelte +21 -0
  89. package/dist/geoms/GeomCurve.svelte.d.ts +7 -0
  90. package/dist/geoms/GeomDensity.svelte +25 -0
  91. package/dist/geoms/GeomDensity.svelte.d.ts +7 -0
  92. package/dist/geoms/GeomDensity2d.svelte +25 -0
  93. package/dist/geoms/GeomDensity2d.svelte.d.ts +7 -0
  94. package/dist/geoms/GeomDensity2dFilled.svelte +25 -0
  95. package/dist/geoms/GeomDensity2dFilled.svelte.d.ts +7 -0
  96. package/dist/geoms/GeomDotplot.svelte +25 -0
  97. package/dist/geoms/GeomDotplot.svelte.d.ts +7 -0
  98. package/dist/geoms/GeomErrorbar.svelte +25 -0
  99. package/dist/geoms/GeomErrorbar.svelte.d.ts +7 -0
  100. package/dist/geoms/GeomFreqpoly.svelte +25 -0
  101. package/dist/geoms/GeomFreqpoly.svelte.d.ts +7 -0
  102. package/dist/geoms/GeomFunction.svelte +25 -0
  103. package/dist/geoms/GeomFunction.svelte.d.ts +7 -0
  104. package/dist/geoms/GeomHex.svelte +21 -0
  105. package/dist/geoms/GeomHex.svelte.d.ts +7 -0
  106. package/dist/geoms/GeomHistogram.svelte +25 -0
  107. package/dist/geoms/GeomHistogram.svelte.d.ts +7 -0
  108. package/dist/geoms/GeomHline.svelte +12 -0
  109. package/dist/geoms/GeomHline.svelte.d.ts +7 -0
  110. package/dist/geoms/GeomJitter.svelte +35 -0
  111. package/dist/geoms/GeomJitter.svelte.d.ts +13 -0
  112. package/dist/geoms/GeomLabel.svelte +12 -0
  113. package/dist/geoms/GeomLabel.svelte.d.ts +7 -0
  114. package/dist/geoms/GeomLine.svelte +12 -0
  115. package/dist/geoms/GeomLine.svelte.d.ts +7 -0
  116. package/dist/geoms/GeomLinerange.svelte +25 -0
  117. package/dist/geoms/GeomLinerange.svelte.d.ts +7 -0
  118. package/dist/geoms/GeomMap.svelte +21 -0
  119. package/dist/geoms/GeomMap.svelte.d.ts +7 -0
  120. package/dist/geoms/GeomPath.svelte +12 -0
  121. package/dist/geoms/GeomPath.svelte.d.ts +7 -0
  122. package/dist/geoms/GeomPoint.svelte +12 -0
  123. package/dist/geoms/GeomPoint.svelte.d.ts +7 -0
  124. package/dist/geoms/GeomPointrange.svelte +25 -0
  125. package/dist/geoms/GeomPointrange.svelte.d.ts +7 -0
  126. package/dist/geoms/GeomPolygon.svelte +25 -0
  127. package/dist/geoms/GeomPolygon.svelte.d.ts +7 -0
  128. package/dist/geoms/GeomQq.svelte +21 -0
  129. package/dist/geoms/GeomQq.svelte.d.ts +7 -0
  130. package/dist/geoms/GeomQqLine.svelte +25 -0
  131. package/dist/geoms/GeomQqLine.svelte.d.ts +7 -0
  132. package/dist/geoms/GeomQuantile.svelte +25 -0
  133. package/dist/geoms/GeomQuantile.svelte.d.ts +7 -0
  134. package/dist/geoms/GeomRaster.svelte +25 -0
  135. package/dist/geoms/GeomRaster.svelte.d.ts +7 -0
  136. package/dist/geoms/GeomRect.svelte +12 -0
  137. package/dist/geoms/GeomRect.svelte.d.ts +7 -0
  138. package/dist/geoms/GeomRibbon.svelte +16 -0
  139. package/dist/geoms/GeomRibbon.svelte.d.ts +7 -0
  140. package/dist/geoms/GeomRug.svelte +21 -0
  141. package/dist/geoms/GeomRug.svelte.d.ts +7 -0
  142. package/dist/geoms/GeomRule.svelte +12 -0
  143. package/dist/geoms/GeomRule.svelte.d.ts +7 -0
  144. package/dist/geoms/GeomSegment.svelte +16 -0
  145. package/dist/geoms/GeomSegment.svelte.d.ts +7 -0
  146. package/dist/geoms/GeomSf.svelte +21 -0
  147. package/dist/geoms/GeomSf.svelte.d.ts +7 -0
  148. package/dist/geoms/GeomSfLabel.svelte +25 -0
  149. package/dist/geoms/GeomSfLabel.svelte.d.ts +7 -0
  150. package/dist/geoms/GeomSfText.svelte +25 -0
  151. package/dist/geoms/GeomSfText.svelte.d.ts +7 -0
  152. package/dist/geoms/GeomSmooth.svelte +25 -0
  153. package/dist/geoms/GeomSmooth.svelte.d.ts +7 -0
  154. package/dist/geoms/GeomSpoke.svelte +21 -0
  155. package/dist/geoms/GeomSpoke.svelte.d.ts +7 -0
  156. package/dist/geoms/GeomStep.svelte +12 -0
  157. package/dist/geoms/GeomStep.svelte.d.ts +7 -0
  158. package/dist/geoms/GeomText.svelte +12 -0
  159. package/dist/geoms/GeomText.svelte.d.ts +7 -0
  160. package/dist/geoms/GeomTile.svelte +21 -0
  161. package/dist/geoms/GeomTile.svelte.d.ts +7 -0
  162. package/dist/geoms/GeomViolin.svelte +25 -0
  163. package/dist/geoms/GeomViolin.svelte.d.ts +7 -0
  164. package/dist/geoms/GeomVline.svelte +12 -0
  165. package/dist/geoms/GeomVline.svelte.d.ts +7 -0
  166. package/dist/geoms/factory.svelte.d.ts +41 -0
  167. package/dist/geoms/factory.svelte.js +60 -0
  168. package/dist/geoms/registry.svelte.d.ts +71 -0
  169. package/dist/geoms/registry.svelte.js +177 -0
  170. package/dist/guides/GuideAxis.svelte +20 -0
  171. package/dist/guides/GuideAxis.svelte.d.ts +14 -0
  172. package/dist/guides/GuideColorbar.svelte +22 -0
  173. package/dist/guides/GuideColorbar.svelte.d.ts +13 -0
  174. package/dist/guides/GuideColorsteps.svelte +22 -0
  175. package/dist/guides/GuideColorsteps.svelte.d.ts +13 -0
  176. package/dist/guides/GuideLegend.svelte +90 -0
  177. package/dist/guides/GuideLegend.svelte.d.ts +37 -0
  178. package/dist/guides/GuideNone.svelte +19 -0
  179. package/dist/guides/GuideNone.svelte.d.ts +7 -0
  180. package/dist/guides/Guides.svelte +14 -0
  181. package/dist/guides/Guides.svelte.d.ts +13 -0
  182. package/dist/guides/factory.svelte.d.ts +36 -0
  183. package/dist/guides/factory.svelte.js +15 -0
  184. package/dist/index.d.ts +418 -0
  185. package/dist/index.js +376 -0
  186. package/dist/inspection/Inspect.svelte +71 -0
  187. package/dist/inspection/Inspect.svelte.d.ts +36 -0
  188. package/dist/inspection/Tooltip.svelte +439 -0
  189. package/dist/inspection/Tooltip.svelte.d.ts +32 -0
  190. package/dist/inspection/apply.d.ts +120 -0
  191. package/dist/inspection/apply.js +99 -0
  192. package/dist/inspection/coordinator.d.ts +51 -0
  193. package/dist/inspection/coordinator.js +354 -0
  194. package/dist/inspection/display-members.d.ts +1 -0
  195. package/dist/inspection/display-members.js +2 -0
  196. package/dist/inspection/frame.d.ts +90 -0
  197. package/dist/inspection/frame.js +76 -0
  198. package/dist/inspection/group-total.d.ts +1 -0
  199. package/dist/inspection/group-total.js +2 -0
  200. package/dist/inspection/inspect-guide-axes.d.ts +10 -0
  201. package/dist/inspection/inspect-guide-axes.js +24 -0
  202. package/dist/inspection/inspection-reconcile.svelte.d.ts +37 -0
  203. package/dist/inspection/inspection-reconcile.svelte.js +33 -0
  204. package/dist/inspection/inspection-state.svelte.d.ts +86 -0
  205. package/dist/inspection/inspection-state.svelte.js +347 -0
  206. package/dist/inspection/inspection-traversal.svelte.d.ts +29 -0
  207. package/dist/inspection/inspection-traversal.svelte.js +52 -0
  208. package/dist/inspection/pointer-inspect.d.ts +74 -0
  209. package/dist/inspection/pointer-inspect.js +158 -0
  210. package/dist/inspection/resolver.d.ts +3 -0
  211. package/dist/inspection/resolver.js +4 -0
  212. package/dist/inspection/teardown.d.ts +199 -0
  213. package/dist/inspection/teardown.js +181 -0
  214. package/dist/inspection/tooltip-chrome.d.ts +19 -0
  215. package/dist/inspection/tooltip-chrome.js +17 -0
  216. package/dist/inspection/tooltip-motion.d.ts +25 -0
  217. package/dist/inspection/tooltip-motion.js +32 -0
  218. package/dist/inspection/tooltip-presence.svelte.d.ts +49 -0
  219. package/dist/inspection/tooltip-presence.svelte.js +110 -0
  220. package/dist/inspection/tooltip-total.d.ts +1 -0
  221. package/dist/inspection/tooltip-total.js +2 -0
  222. package/dist/interaction/capability-resolution.svelte.d.ts +42 -0
  223. package/dist/interaction/capability-resolution.svelte.js +40 -0
  224. package/dist/interaction/capability.d.ts +129 -0
  225. package/dist/interaction/capability.js +134 -0
  226. package/dist/interaction/controller.svelte.d.ts +4 -0
  227. package/dist/interaction/controller.svelte.js +43 -0
  228. package/dist/interaction/inspect-geom-advisories.d.ts +10 -0
  229. package/dist/interaction/inspect-geom-advisories.js +10 -0
  230. package/dist/interaction/interaction-context.svelte.d.ts +57 -0
  231. package/dist/interaction/interaction-context.svelte.js +4 -0
  232. package/dist/interaction/interaction-diagnostics.d.ts +11 -0
  233. package/dist/interaction/interaction-diagnostics.js +173 -0
  234. package/dist/interaction/interaction-states.svelte.d.ts +84 -0
  235. package/dist/interaction/interaction-states.svelte.js +55 -0
  236. package/dist/interaction/interaction.d.ts +304 -0
  237. package/dist/interaction/interaction.js +7 -0
  238. package/dist/interaction/normalize-interaction-config.d.ts +9 -0
  239. package/dist/interaction/normalize-interaction-config.js +112 -0
  240. package/dist/interaction/reducer.d.ts +97 -0
  241. package/dist/interaction/reducer.js +117 -0
  242. package/dist/interaction/resolve-inspect-capability.d.ts +40 -0
  243. package/dist/interaction/resolve-inspect-capability.js +50 -0
  244. package/dist/interaction/scoped-store.svelte.d.ts +73 -0
  245. package/dist/interaction/scoped-store.svelte.js +93 -0
  246. package/dist/interaction/target.d.ts +91 -0
  247. package/dist/interaction/target.js +68 -0
  248. package/dist/interaction/transition-owner.d.ts +19 -0
  249. package/dist/interaction/transition-owner.js +10 -0
  250. package/dist/interaction/wiring-advisories.d.ts +33 -0
  251. package/dist/interaction/wiring-advisories.js +46 -0
  252. package/dist/interval/BoundsEditor.svelte +332 -0
  253. package/dist/interval/BoundsEditor.svelte.d.ts +10 -0
  254. package/dist/interval/bounds-editor.d.ts +1 -0
  255. package/dist/interval/bounds-editor.js +2 -0
  256. package/dist/interval/consumption.d.ts +1 -0
  257. package/dist/interval/consumption.js +2 -0
  258. package/dist/interval/interval-bounds-state.svelte.d.ts +53 -0
  259. package/dist/interval/interval-bounds-state.svelte.js +117 -0
  260. package/dist/interval/interval-state-helpers.d.ts +10 -0
  261. package/dist/interval/interval-state-helpers.js +34 -0
  262. package/dist/interval/interval-state.svelte.d.ts +60 -0
  263. package/dist/interval/interval-state.svelte.js +360 -0
  264. package/dist/interval/interval.d.ts +1 -0
  265. package/dist/interval/interval.js +2 -0
  266. package/dist/interval/precise-bounds.d.ts +1 -0
  267. package/dist/interval/precise-bounds.js +2 -0
  268. package/dist/interval/query.d.ts +1 -0
  269. package/dist/interval/query.js +2 -0
  270. package/dist/labs/Labs.svelte +29 -0
  271. package/dist/labs/Labs.svelte.d.ts +16 -0
  272. package/dist/layers/fold.d.ts +2 -0
  273. package/dist/layers/fold.js +1 -0
  274. package/dist/layers/grammar-families.d.ts +2 -0
  275. package/dist/layers/grammar-families.js +1 -0
  276. package/dist/layers/plot-layer-contract.d.ts +1 -0
  277. package/dist/layers/plot-layer-contract.js +29 -0
  278. package/dist/layers/plot-layer.svelte.d.ts +42 -0
  279. package/dist/layers/plot-layer.svelte.js +34 -0
  280. package/dist/layers/types.d.ts +2 -0
  281. package/dist/layers/types.js +1 -0
  282. package/dist/legend/Legend.svelte +24 -0
  283. package/dist/legend/Legend.svelte.d.ts +5 -0
  284. package/dist/legend/LegendFilters.svelte +196 -0
  285. package/dist/legend/LegendFilters.svelte.d.ts +8 -0
  286. package/dist/legend/LegendTargets.svelte +393 -0
  287. package/dist/legend/LegendTargets.svelte.d.ts +31 -0
  288. package/dist/legend/entry-key-index.d.ts +1 -0
  289. package/dist/legend/entry-key-index.js +2 -0
  290. package/dist/legend/entry-key-index.svelte.d.ts +34 -0
  291. package/dist/legend/entry-key-index.svelte.js +35 -0
  292. package/dist/legend/filter-state.svelte.d.ts +66 -0
  293. package/dist/legend/filter-state.svelte.js +284 -0
  294. package/dist/legend/filter.d.ts +1 -0
  295. package/dist/legend/filter.js +2 -0
  296. package/dist/legend/focus-emphasis.d.ts +72 -0
  297. package/dist/legend/focus-emphasis.js +91 -0
  298. package/dist/legend/focus-plans.d.ts +89 -0
  299. package/dist/legend/focus-plans.js +72 -0
  300. package/dist/legend/focus-reconcile.svelte.d.ts +53 -0
  301. package/dist/legend/focus-reconcile.svelte.js +113 -0
  302. package/dist/legend/focus-state.svelte.d.ts +73 -0
  303. package/dist/legend/focus-state.svelte.js +338 -0
  304. package/dist/legend/focus.d.ts +1 -0
  305. package/dist/legend/focus.js +2 -0
  306. package/dist/legend/resolve-legend-capability.d.ts +52 -0
  307. package/dist/legend/resolve-legend-capability.js +68 -0
  308. package/dist/legend/resolve-legend-filter.d.ts +65 -0
  309. package/dist/legend/resolve-legend-filter.js +54 -0
  310. package/dist/legend/resolve-legend-focus.d.ts +58 -0
  311. package/dist/legend/resolve-legend-focus.js +36 -0
  312. package/dist/legend/surface.d.ts +190 -0
  313. package/dist/legend/surface.js +158 -0
  314. package/dist/plot-engine-deriveds.svelte.d.ts +75 -0
  315. package/dist/plot-engine-deriveds.svelte.js +166 -0
  316. package/dist/plot-engine.svelte.d.ts +116 -0
  317. package/dist/plot-engine.svelte.js +316 -0
  318. package/dist/plot-props.d.ts +144 -0
  319. package/dist/plot-props.js +81 -0
  320. package/dist/runtime/announcer.svelte.d.ts +17 -0
  321. package/dist/runtime/announcer.svelte.js +28 -0
  322. package/dist/runtime/paint.d.ts +38 -0
  323. package/dist/runtime/paint.js +45 -0
  324. package/dist/runtime/resolve-datum-key.d.ts +53 -0
  325. package/dist/runtime/resolve-datum-key.js +73 -0
  326. package/dist/runtime/runtime.svelte.d.ts +37 -0
  327. package/dist/runtime/runtime.svelte.js +233 -0
  328. package/dist/runtime/semantic-candidate-projection.svelte.d.ts +29 -0
  329. package/dist/runtime/semantic-candidate-projection.svelte.js +137 -0
  330. package/dist/runtime/semantic-data-identity.d.ts +64 -0
  331. package/dist/runtime/semantic-data-identity.js +153 -0
  332. package/dist/runtime/semantic-keys-projection.d.ts +22 -0
  333. package/dist/runtime/semantic-keys-projection.js +40 -0
  334. package/dist/runtime/semantic-keys-resolve.d.ts +69 -0
  335. package/dist/runtime/semantic-keys-resolve.js +122 -0
  336. package/dist/runtime/semantic-keys.svelte.d.ts +30 -0
  337. package/dist/runtime/semantic-keys.svelte.js +69 -0
  338. package/dist/runtime/semantic-source-identity.d.ts +9 -0
  339. package/dist/runtime/semantic-source-identity.js +16 -0
  340. package/dist/scale/Scale.svelte +26 -0
  341. package/dist/scale/Scale.svelte.d.ts +21 -0
  342. package/dist/scale/ScaleAlphaBinned.svelte +14 -0
  343. package/dist/scale/ScaleAlphaBinned.svelte.d.ts +4 -0
  344. package/dist/scale/ScaleAlphaContinuous.svelte +14 -0
  345. package/dist/scale/ScaleAlphaContinuous.svelte.d.ts +4 -0
  346. package/dist/scale/ScaleAlphaDate.svelte +15 -0
  347. package/dist/scale/ScaleAlphaDate.svelte.d.ts +5 -0
  348. package/dist/scale/ScaleAlphaDatetime.svelte +15 -0
  349. package/dist/scale/ScaleAlphaDatetime.svelte.d.ts +5 -0
  350. package/dist/scale/ScaleAlphaDiscrete.svelte +14 -0
  351. package/dist/scale/ScaleAlphaDiscrete.svelte.d.ts +4 -0
  352. package/dist/scale/ScaleAlphaIdentity.svelte +14 -0
  353. package/dist/scale/ScaleAlphaIdentity.svelte.d.ts +4 -0
  354. package/dist/scale/ScaleAlphaManual.svelte +14 -0
  355. package/dist/scale/ScaleAlphaManual.svelte.d.ts +4 -0
  356. package/dist/scale/ScaleColorBinned.svelte +14 -0
  357. package/dist/scale/ScaleColorBinned.svelte.d.ts +3 -0
  358. package/dist/scale/ScaleColorBrewer.svelte +14 -0
  359. package/dist/scale/ScaleColorBrewer.svelte.d.ts +4 -0
  360. package/dist/scale/ScaleColorContinuous.svelte +14 -0
  361. package/dist/scale/ScaleColorContinuous.svelte.d.ts +4 -0
  362. package/dist/scale/ScaleColorDate.svelte +15 -0
  363. package/dist/scale/ScaleColorDate.svelte.d.ts +5 -0
  364. package/dist/scale/ScaleColorDatetime.svelte +15 -0
  365. package/dist/scale/ScaleColorDatetime.svelte.d.ts +5 -0
  366. package/dist/scale/ScaleColorDiscrete.svelte +14 -0
  367. package/dist/scale/ScaleColorDiscrete.svelte.d.ts +4 -0
  368. package/dist/scale/ScaleColorDistiller.svelte +14 -0
  369. package/dist/scale/ScaleColorDistiller.svelte.d.ts +4 -0
  370. package/dist/scale/ScaleColorFermenter.svelte +14 -0
  371. package/dist/scale/ScaleColorFermenter.svelte.d.ts +4 -0
  372. package/dist/scale/ScaleColorGradient.svelte +11 -0
  373. package/dist/scale/ScaleColorGradient.svelte.d.ts +4 -0
  374. package/dist/scale/ScaleColorGradient2.svelte +14 -0
  375. package/dist/scale/ScaleColorGradient2.svelte.d.ts +4 -0
  376. package/dist/scale/ScaleColorGradientn.svelte +14 -0
  377. package/dist/scale/ScaleColorGradientn.svelte.d.ts +4 -0
  378. package/dist/scale/ScaleColorGrey.svelte +11 -0
  379. package/dist/scale/ScaleColorGrey.svelte.d.ts +4 -0
  380. package/dist/scale/ScaleColorHue.svelte +11 -0
  381. package/dist/scale/ScaleColorHue.svelte.d.ts +4 -0
  382. package/dist/scale/ScaleColorIdentity.svelte +14 -0
  383. package/dist/scale/ScaleColorIdentity.svelte.d.ts +4 -0
  384. package/dist/scale/ScaleColorLog10.svelte +14 -0
  385. package/dist/scale/ScaleColorLog10.svelte.d.ts +4 -0
  386. package/dist/scale/ScaleColorManual.svelte +14 -0
  387. package/dist/scale/ScaleColorManual.svelte.d.ts +4 -0
  388. package/dist/scale/ScaleColorOrdinal.svelte +14 -0
  389. package/dist/scale/ScaleColorOrdinal.svelte.d.ts +3 -0
  390. package/dist/scale/ScaleColorSqrt.svelte +14 -0
  391. package/dist/scale/ScaleColorSqrt.svelte.d.ts +4 -0
  392. package/dist/scale/ScaleColorSteps.svelte +11 -0
  393. package/dist/scale/ScaleColorSteps.svelte.d.ts +4 -0
  394. package/dist/scale/ScaleColorSteps2.svelte +11 -0
  395. package/dist/scale/ScaleColorSteps2.svelte.d.ts +4 -0
  396. package/dist/scale/ScaleColorStepsn.svelte +11 -0
  397. package/dist/scale/ScaleColorStepsn.svelte.d.ts +4 -0
  398. package/dist/scale/ScaleColorViridisB.svelte +11 -0
  399. package/dist/scale/ScaleColorViridisB.svelte.d.ts +4 -0
  400. package/dist/scale/ScaleColorViridisC.svelte +11 -0
  401. package/dist/scale/ScaleColorViridisC.svelte.d.ts +4 -0
  402. package/dist/scale/ScaleColorViridisD.svelte +11 -0
  403. package/dist/scale/ScaleColorViridisD.svelte.d.ts +4 -0
  404. package/dist/scale/ScaleFillBinned.svelte +11 -0
  405. package/dist/scale/ScaleFillBinned.svelte.d.ts +3 -0
  406. package/dist/scale/ScaleFillBrewer.svelte +11 -0
  407. package/dist/scale/ScaleFillBrewer.svelte.d.ts +4 -0
  408. package/dist/scale/ScaleFillContinuous.svelte +14 -0
  409. package/dist/scale/ScaleFillContinuous.svelte.d.ts +4 -0
  410. package/dist/scale/ScaleFillDate.svelte +12 -0
  411. package/dist/scale/ScaleFillDate.svelte.d.ts +5 -0
  412. package/dist/scale/ScaleFillDatetime.svelte +15 -0
  413. package/dist/scale/ScaleFillDatetime.svelte.d.ts +5 -0
  414. package/dist/scale/ScaleFillDiscrete.svelte +14 -0
  415. package/dist/scale/ScaleFillDiscrete.svelte.d.ts +4 -0
  416. package/dist/scale/ScaleFillDistiller.svelte +14 -0
  417. package/dist/scale/ScaleFillDistiller.svelte.d.ts +4 -0
  418. package/dist/scale/ScaleFillFermenter.svelte +14 -0
  419. package/dist/scale/ScaleFillFermenter.svelte.d.ts +4 -0
  420. package/dist/scale/ScaleFillGradient.svelte +11 -0
  421. package/dist/scale/ScaleFillGradient.svelte.d.ts +4 -0
  422. package/dist/scale/ScaleFillGradient2.svelte +14 -0
  423. package/dist/scale/ScaleFillGradient2.svelte.d.ts +4 -0
  424. package/dist/scale/ScaleFillGradientn.svelte +14 -0
  425. package/dist/scale/ScaleFillGradientn.svelte.d.ts +4 -0
  426. package/dist/scale/ScaleFillGrey.svelte +11 -0
  427. package/dist/scale/ScaleFillGrey.svelte.d.ts +4 -0
  428. package/dist/scale/ScaleFillHue.svelte +11 -0
  429. package/dist/scale/ScaleFillHue.svelte.d.ts +4 -0
  430. package/dist/scale/ScaleFillIdentity.svelte +14 -0
  431. package/dist/scale/ScaleFillIdentity.svelte.d.ts +4 -0
  432. package/dist/scale/ScaleFillLog10.svelte +14 -0
  433. package/dist/scale/ScaleFillLog10.svelte.d.ts +4 -0
  434. package/dist/scale/ScaleFillManual.svelte +11 -0
  435. package/dist/scale/ScaleFillManual.svelte.d.ts +4 -0
  436. package/dist/scale/ScaleFillOrdinal.svelte +14 -0
  437. package/dist/scale/ScaleFillOrdinal.svelte.d.ts +3 -0
  438. package/dist/scale/ScaleFillSqrt.svelte +14 -0
  439. package/dist/scale/ScaleFillSqrt.svelte.d.ts +4 -0
  440. package/dist/scale/ScaleFillSteps.svelte +11 -0
  441. package/dist/scale/ScaleFillSteps.svelte.d.ts +4 -0
  442. package/dist/scale/ScaleFillSteps2.svelte +11 -0
  443. package/dist/scale/ScaleFillSteps2.svelte.d.ts +4 -0
  444. package/dist/scale/ScaleFillStepsn.svelte +11 -0
  445. package/dist/scale/ScaleFillStepsn.svelte.d.ts +4 -0
  446. package/dist/scale/ScaleFillViridisB.svelte +11 -0
  447. package/dist/scale/ScaleFillViridisB.svelte.d.ts +4 -0
  448. package/dist/scale/ScaleFillViridisC.svelte +11 -0
  449. package/dist/scale/ScaleFillViridisC.svelte.d.ts +4 -0
  450. package/dist/scale/ScaleFillViridisD.svelte +11 -0
  451. package/dist/scale/ScaleFillViridisD.svelte.d.ts +4 -0
  452. package/dist/scale/ScaleLinetypeBinned.svelte +15 -0
  453. package/dist/scale/ScaleLinetypeBinned.svelte.d.ts +4 -0
  454. package/dist/scale/ScaleLinetypeDiscrete.svelte +15 -0
  455. package/dist/scale/ScaleLinetypeDiscrete.svelte.d.ts +4 -0
  456. package/dist/scale/ScaleLinetypeIdentity.svelte +15 -0
  457. package/dist/scale/ScaleLinetypeIdentity.svelte.d.ts +4 -0
  458. package/dist/scale/ScaleLinetypeManual.svelte +15 -0
  459. package/dist/scale/ScaleLinetypeManual.svelte.d.ts +4 -0
  460. package/dist/scale/ScaleLinewidthBinned.svelte +14 -0
  461. package/dist/scale/ScaleLinewidthBinned.svelte.d.ts +4 -0
  462. package/dist/scale/ScaleLinewidthContinuous.svelte +14 -0
  463. package/dist/scale/ScaleLinewidthContinuous.svelte.d.ts +4 -0
  464. package/dist/scale/ScaleLinewidthDate.svelte +15 -0
  465. package/dist/scale/ScaleLinewidthDate.svelte.d.ts +5 -0
  466. package/dist/scale/ScaleLinewidthDatetime.svelte +15 -0
  467. package/dist/scale/ScaleLinewidthDatetime.svelte.d.ts +5 -0
  468. package/dist/scale/ScaleLinewidthDiscrete.svelte +14 -0
  469. package/dist/scale/ScaleLinewidthDiscrete.svelte.d.ts +4 -0
  470. package/dist/scale/ScaleLinewidthIdentity.svelte +14 -0
  471. package/dist/scale/ScaleLinewidthIdentity.svelte.d.ts +4 -0
  472. package/dist/scale/ScaleLinewidthManual.svelte +14 -0
  473. package/dist/scale/ScaleLinewidthManual.svelte.d.ts +4 -0
  474. package/dist/scale/ScaleRadius.svelte +11 -0
  475. package/dist/scale/ScaleRadius.svelte.d.ts +4 -0
  476. package/dist/scale/ScaleShapeBinned.svelte +15 -0
  477. package/dist/scale/ScaleShapeBinned.svelte.d.ts +4 -0
  478. package/dist/scale/ScaleShapeDiscrete.svelte +15 -0
  479. package/dist/scale/ScaleShapeDiscrete.svelte.d.ts +4 -0
  480. package/dist/scale/ScaleShapeIdentity.svelte +15 -0
  481. package/dist/scale/ScaleShapeIdentity.svelte.d.ts +4 -0
  482. package/dist/scale/ScaleShapeManual.svelte +15 -0
  483. package/dist/scale/ScaleShapeManual.svelte.d.ts +4 -0
  484. package/dist/scale/ScaleSizeArea.svelte +11 -0
  485. package/dist/scale/ScaleSizeArea.svelte.d.ts +4 -0
  486. package/dist/scale/ScaleSizeBinned.svelte +14 -0
  487. package/dist/scale/ScaleSizeBinned.svelte.d.ts +4 -0
  488. package/dist/scale/ScaleSizeBinnedArea.svelte +14 -0
  489. package/dist/scale/ScaleSizeBinnedArea.svelte.d.ts +4 -0
  490. package/dist/scale/ScaleSizeContinuous.svelte +14 -0
  491. package/dist/scale/ScaleSizeContinuous.svelte.d.ts +4 -0
  492. package/dist/scale/ScaleSizeDate.svelte +15 -0
  493. package/dist/scale/ScaleSizeDate.svelte.d.ts +5 -0
  494. package/dist/scale/ScaleSizeDatetime.svelte +15 -0
  495. package/dist/scale/ScaleSizeDatetime.svelte.d.ts +5 -0
  496. package/dist/scale/ScaleSizeDiscrete.svelte +14 -0
  497. package/dist/scale/ScaleSizeDiscrete.svelte.d.ts +4 -0
  498. package/dist/scale/ScaleSizeIdentity.svelte +14 -0
  499. package/dist/scale/ScaleSizeIdentity.svelte.d.ts +4 -0
  500. package/dist/scale/ScaleSizeManual.svelte +14 -0
  501. package/dist/scale/ScaleSizeManual.svelte.d.ts +4 -0
  502. package/dist/scale/ScaleXBinned.svelte +14 -0
  503. package/dist/scale/ScaleXBinned.svelte.d.ts +4 -0
  504. package/dist/scale/ScaleXContinuous.svelte +14 -0
  505. package/dist/scale/ScaleXContinuous.svelte.d.ts +4 -0
  506. package/dist/scale/ScaleXDate.svelte +12 -0
  507. package/dist/scale/ScaleXDate.svelte.d.ts +5 -0
  508. package/dist/scale/ScaleXDatetime.svelte +12 -0
  509. package/dist/scale/ScaleXDatetime.svelte.d.ts +5 -0
  510. package/dist/scale/ScaleXDiscrete.svelte +14 -0
  511. package/dist/scale/ScaleXDiscrete.svelte.d.ts +4 -0
  512. package/dist/scale/ScaleXLog10.svelte +14 -0
  513. package/dist/scale/ScaleXLog10.svelte.d.ts +4 -0
  514. package/dist/scale/ScaleXMonthDay.svelte +12 -0
  515. package/dist/scale/ScaleXMonthDay.svelte.d.ts +5 -0
  516. package/dist/scale/ScaleXReverse.svelte +15 -0
  517. package/dist/scale/ScaleXReverse.svelte.d.ts +4 -0
  518. package/dist/scale/ScaleXSqrt.svelte +14 -0
  519. package/dist/scale/ScaleXSqrt.svelte.d.ts +4 -0
  520. package/dist/scale/ScaleXTime.svelte +12 -0
  521. package/dist/scale/ScaleXTime.svelte.d.ts +5 -0
  522. package/dist/scale/ScaleYBinned.svelte +14 -0
  523. package/dist/scale/ScaleYBinned.svelte.d.ts +4 -0
  524. package/dist/scale/ScaleYContinuous.svelte +14 -0
  525. package/dist/scale/ScaleYContinuous.svelte.d.ts +4 -0
  526. package/dist/scale/ScaleYDate.svelte +12 -0
  527. package/dist/scale/ScaleYDate.svelte.d.ts +5 -0
  528. package/dist/scale/ScaleYDatetime.svelte +12 -0
  529. package/dist/scale/ScaleYDatetime.svelte.d.ts +5 -0
  530. package/dist/scale/ScaleYDiscrete.svelte +14 -0
  531. package/dist/scale/ScaleYDiscrete.svelte.d.ts +4 -0
  532. package/dist/scale/ScaleYLog10.svelte +14 -0
  533. package/dist/scale/ScaleYLog10.svelte.d.ts +4 -0
  534. package/dist/scale/ScaleYMonthDay.svelte +12 -0
  535. package/dist/scale/ScaleYMonthDay.svelte.d.ts +5 -0
  536. package/dist/scale/ScaleYReverse.svelte +15 -0
  537. package/dist/scale/ScaleYReverse.svelte.d.ts +4 -0
  538. package/dist/scale/ScaleYSqrt.svelte +14 -0
  539. package/dist/scale/ScaleYSqrt.svelte.d.ts +4 -0
  540. package/dist/scale/ScaleYTime.svelte +12 -0
  541. package/dist/scale/ScaleYTime.svelte.d.ts +5 -0
  542. package/dist/scene/Axis.svelte +159 -0
  543. package/dist/scene/Axis.svelte.d.ts +12 -0
  544. package/dist/scene/Batch.svelte +252 -0
  545. package/dist/scene/Batch.svelte.d.ts +23 -0
  546. package/dist/scene/InteractionOverlay.svelte +402 -0
  547. package/dist/scene/InteractionOverlay.svelte.d.ts +44 -0
  548. package/dist/scene/Legend.svelte +278 -0
  549. package/dist/scene/Legend.svelte.d.ts +8 -0
  550. package/dist/scene/MarkStrata.svelte +129 -0
  551. package/dist/scene/MarkStrata.svelte.d.ts +15 -0
  552. package/dist/scene/SceneOverlays.svelte +118 -0
  553. package/dist/scene/SceneOverlays.svelte.d.ts +49 -0
  554. package/dist/scene/SceneView.svelte +478 -0
  555. package/dist/scene/SceneView.svelte.d.ts +32 -0
  556. package/dist/scene/batch-presentation.svelte.d.ts +111 -0
  557. package/dist/scene/batch-presentation.svelte.js +207 -0
  558. package/dist/scene/geometry.d.ts +2 -0
  559. package/dist/scene/geometry.js +3 -0
  560. package/dist/scene/stratum-paint.d.ts +25 -0
  561. package/dist/scene/stratum-paint.js +40 -0
  562. package/dist/selection/selection-state.svelte.d.ts +23 -0
  563. package/dist/selection/selection-state.svelte.js +73 -0
  564. package/dist/selection/selection.d.ts +1 -0
  565. package/dist/selection/selection.js +2 -0
  566. package/dist/surface/CaptureSurface.svelte +109 -0
  567. package/dist/surface/CaptureSurface.svelte.d.ts +27 -0
  568. package/dist/surface/area-brush.d.ts +48 -0
  569. package/dist/surface/area-brush.js +44 -0
  570. package/dist/surface/brush-finish.d.ts +49 -0
  571. package/dist/surface/brush-finish.js +44 -0
  572. package/dist/surface/keyboard.d.ts +97 -0
  573. package/dist/surface/keyboard.js +105 -0
  574. package/dist/surface/pointer.d.ts +241 -0
  575. package/dist/surface/pointer.js +179 -0
  576. package/dist/surface/surface-description.d.ts +10 -0
  577. package/dist/surface/surface-description.js +11 -0
  578. package/dist/surface/surface-handlers.svelte.d.ts +53 -0
  579. package/dist/surface/surface-handlers.svelte.js +418 -0
  580. package/dist/surface/surface-state.svelte.d.ts +90 -0
  581. package/dist/surface/surface-state.svelte.js +161 -0
  582. package/dist/theme/Theme.svelte +27 -0
  583. package/dist/theme/Theme.svelte.d.ts +23 -0
  584. package/dist/theme/ThemeBase.svelte +13 -0
  585. package/dist/theme/ThemeBase.svelte.d.ts +8 -0
  586. package/dist/theme/ThemeBw.svelte +13 -0
  587. package/dist/theme/ThemeBw.svelte.d.ts +8 -0
  588. package/dist/theme/ThemeClassic.svelte +13 -0
  589. package/dist/theme/ThemeClassic.svelte.d.ts +8 -0
  590. package/dist/theme/ThemeClean.svelte +13 -0
  591. package/dist/theme/ThemeClean.svelte.d.ts +8 -0
  592. package/dist/theme/ThemeDark.svelte +13 -0
  593. package/dist/theme/ThemeDark.svelte.d.ts +8 -0
  594. package/dist/theme/ThemeDefault.svelte +13 -0
  595. package/dist/theme/ThemeDefault.svelte.d.ts +8 -0
  596. package/dist/theme/ThemeEconomist.svelte +13 -0
  597. package/dist/theme/ThemeEconomist.svelte.d.ts +8 -0
  598. package/dist/theme/ThemeEconomistwhite.svelte +13 -0
  599. package/dist/theme/ThemeEconomistwhite.svelte.d.ts +8 -0
  600. package/dist/theme/ThemeFew.svelte +13 -0
  601. package/dist/theme/ThemeFew.svelte.d.ts +8 -0
  602. package/dist/theme/ThemeFivethirtyeight.svelte +14 -0
  603. package/dist/theme/ThemeFivethirtyeight.svelte.d.ts +9 -0
  604. package/dist/theme/ThemeGgplot2.svelte +13 -0
  605. package/dist/theme/ThemeGgplot2.svelte.d.ts +8 -0
  606. package/dist/theme/ThemeGray.svelte +13 -0
  607. package/dist/theme/ThemeGray.svelte.d.ts +8 -0
  608. package/dist/theme/ThemeGrey.svelte +13 -0
  609. package/dist/theme/ThemeGrey.svelte.d.ts +8 -0
  610. package/dist/theme/ThemeHc.svelte +13 -0
  611. package/dist/theme/ThemeHc.svelte.d.ts +8 -0
  612. package/dist/theme/ThemeHcdark.svelte +13 -0
  613. package/dist/theme/ThemeHcdark.svelte.d.ts +8 -0
  614. package/dist/theme/ThemeHrbr.svelte +13 -0
  615. package/dist/theme/ThemeHrbr.svelte.d.ts +8 -0
  616. package/dist/theme/ThemeIgray.svelte +13 -0
  617. package/dist/theme/ThemeIgray.svelte.d.ts +8 -0
  618. package/dist/theme/ThemeLight.svelte +13 -0
  619. package/dist/theme/ThemeLight.svelte.d.ts +8 -0
  620. package/dist/theme/ThemeLinedraw.svelte +13 -0
  621. package/dist/theme/ThemeLinedraw.svelte.d.ts +8 -0
  622. package/dist/theme/ThemeMap.svelte +13 -0
  623. package/dist/theme/ThemeMap.svelte.d.ts +8 -0
  624. package/dist/theme/ThemeMinimal.svelte +13 -0
  625. package/dist/theme/ThemeMinimal.svelte.d.ts +8 -0
  626. package/dist/theme/ThemePander.svelte +13 -0
  627. package/dist/theme/ThemePander.svelte.d.ts +8 -0
  628. package/dist/theme/ThemeSolarized.svelte +13 -0
  629. package/dist/theme/ThemeSolarized.svelte.d.ts +8 -0
  630. package/dist/theme/ThemeSolarized2.svelte +13 -0
  631. package/dist/theme/ThemeSolarized2.svelte.d.ts +8 -0
  632. package/dist/theme/ThemeSolarized2dark.svelte +13 -0
  633. package/dist/theme/ThemeSolarized2dark.svelte.d.ts +8 -0
  634. package/dist/theme/ThemeSolarizeddark.svelte +14 -0
  635. package/dist/theme/ThemeSolarizeddark.svelte.d.ts +9 -0
  636. package/dist/theme/ThemeSolid.svelte +13 -0
  637. package/dist/theme/ThemeSolid.svelte.d.ts +8 -0
  638. package/dist/theme/ThemeStata.svelte +13 -0
  639. package/dist/theme/ThemeStata.svelte.d.ts +8 -0
  640. package/dist/theme/ThemeStatas1color.svelte +13 -0
  641. package/dist/theme/ThemeStatas1color.svelte.d.ts +8 -0
  642. package/dist/theme/ThemeTest.svelte +14 -0
  643. package/dist/theme/ThemeTest.svelte.d.ts +9 -0
  644. package/dist/theme/ThemeTufte.svelte +13 -0
  645. package/dist/theme/ThemeTufte.svelte.d.ts +8 -0
  646. package/dist/theme/ThemeVoid.svelte +14 -0
  647. package/dist/theme/ThemeVoid.svelte.d.ts +9 -0
  648. package/dist/theme/ThemeWsj.svelte +13 -0
  649. package/dist/theme/ThemeWsj.svelte.d.ts +8 -0
  650. package/dist/theme/factory.svelte.d.ts +36 -0
  651. package/dist/theme/factory.svelte.js +100 -0
  652. package/dist/zoom/zoom-state.svelte.d.ts +44 -0
  653. package/dist/zoom/zoom-state.svelte.js +121 -0
  654. package/dist/zoom/zoom.d.ts +1 -0
  655. package/dist/zoom/zoom.js +2 -0
  656. package/package.json +83 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Liam O'Dea
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # @ggts-sh/svelte
2
+
3
+ [![codecov](https://codecov.io/gh/ggts-sh/ggts/branch/main/graph/badge.svg?component=packages-svelte)](https://app.codecov.io/gh/ggts-sh/ggts/tree/main/packages%2Fsvelte)
4
+
5
+ Svelte 5 components for ggts. Re-exports `@ggts-sh/spec` and
6
+ `@ggts-sh/core`. The agent skill ships separately as
7
+ [`@ggts-sh/skill`](https://www.npmjs.com/package/@ggts-sh/skill), and the
8
+ `ggts render` CLI as
9
+ [`@ggts-sh/cli`](https://www.npmjs.com/package/@ggts-sh/cli) — install both in
10
+ every sandbox where an agent authors specs.
11
+
12
+ ```sh
13
+ bun add @ggts-sh/svelte @ggts-sh/core
14
+ # or: npm install @ggts-sh/svelte @ggts-sh/core
15
+ ```
16
+
17
+ Requires Node.js 22+ and Svelte 5.33.1+. The example imports bundled data
18
+ from `@ggts-sh/core/data`, so it installs core as a direct dependency.
19
+ Charts with inline data need only `@ggts-sh/svelte`.
20
+
21
+ ## Example
22
+
23
+ Compose with declaration-only children (theme, scales, labs, geoms). Do not put
24
+ `theme`, `scales`, `labs`, `guides`, `facet`, `coord`, or `legend` on
25
+ `<GGPlot>` — those props were removed in 0.13.0.
26
+
27
+ ```svelte
28
+ <script lang="ts">
29
+ import {
30
+ GeomPoint,
31
+ GeomSmooth,
32
+ GGPlot,
33
+ Labs,
34
+ ThemeMinimal,
35
+ } from "@ggts-sh/svelte";
36
+ import { kyotoSakura } from "@ggts-sh/core/data";
37
+ </script>
38
+
39
+ <GGPlot data={kyotoSakura} aes={{ x: "year", y: "bloomDoy" }}>
40
+ <GeomSmooth method="loess" se={false} />
41
+ <GeomPoint size={2} alpha={0.7} />
42
+ <ThemeMinimal />
43
+ <Labs
44
+ title="Kyoto cherry blossom full-bloom dates, 812–2026"
45
+ subtitle="Full bloom moved about ten days earlier after the industrial era"
46
+ x="Year"
47
+ y="Day of year"
48
+ />
49
+ </GGPlot>
50
+ ```
51
+
52
+ Convention (ggplot2 thinking order): mark layers first, then scales / coords /
53
+ facets, then theme / guides / labs, then host-only `<Inspect>` last. Dense
54
+ points may render on canvas; axes, legends, text, and accessible descriptions
55
+ stay in the DOM. Prefer `<Inspect />` and `<GuideLegend channel focus>` /
56
+ `<GuideLegend channel filter>` for interaction — not plot-level `inspect`,
57
+ `legendFocus`, or `legendFilter`.
58
+
59
+ ## Agent skill
60
+
61
+ Published separately as
62
+ [`@ggts-sh/skill`](https://www.npmjs.com/package/@ggts-sh/skill):
63
+ `node_modules/@ggts-sh/skill/SKILL.md`. Copy it into your agent's skills
64
+ directory as `ggts/` and re-copy on version bumps — dependabot surfaces
65
+ those. (Removed from this package in 0.27.0.)
66
+
67
+ Emit PortableSpec JSON, run `validate()`, apply `fix.example` at `path`,
68
+ re-validate, then render with `<GGPlot spec={…} />`, `renderToSVGString`, or
69
+ `ggts render`. Schema: [schema/v0.json](https://ggts.sh/schema/v0.json).
70
+
71
+ ## Migrating old code
72
+
73
+ If you still have pre-0.13 sources with grammar props on `<GGPlot>`, the
74
+ codemod rewrites them to children:
75
+
76
+ ```sh
77
+ npm exec --package=@ggts-sh/svelte -- ggts-codemod src # show what would change
78
+ npm exec --package=@ggts-sh/svelte -- ggts-codemod --write src # apply
79
+ ```
80
+
81
+ Shapes it will not rewrite mechanically are printed as `manual change
82
+ required` with a link to the [upgrading
83
+ guide](https://ggts.sh/guide/upgrading), never half-migrated.
84
+
85
+ ## Links
86
+
87
+ - [Documentation](https://ggts.sh/)
88
+ - [Getting started](https://ggts.sh/guide/getting-started)
89
+ - [Example gallery](https://ggts.sh/examples)
90
+ - [Interactions](https://ggts.sh/reference/interactions)
91
+ - [Upgrading](https://ggts.sh/guide/upgrading)
92
+ - [CLI (`@ggts-sh/cli`)](https://www.npmjs.com/package/@ggts-sh/cli)
93
+ - [Repository](https://github.com/ggts-sh/ggts)
94
+
95
+ Pre-1.0. Lifecycle and compatibility contracts are on the docs site.
96
+
97
+ [MIT](https://github.com/ggts-sh/ggts/blob/main/LICENSE) © Liam O'Dea
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ // ggts-codemod — migrate deprecated <GGPlot> grammar props to child layers.
3
+ //
4
+ // Thin wrapper: all logic lives in runCodemodCLI (pure entry, tested in
5
+ // tests/codemod/), mirroring @ggts-sh/cli's bin/ggsvelte-render.js. This file only wires the
6
+ // filesystem, process streams, and the exit code.
7
+ //
8
+ // Dry-run by default (ADR 0013) — writes only with --write.
9
+ //
10
+ // Exit codes: 0 ok · 1 a file failed to parse · 2 usage error.
11
+ import { readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ import process from "node:process";
14
+
15
+ import { runCodemodCLI } from "../dist/codemod/index.js";
16
+
17
+ /**
18
+ * @param {string} path
19
+ * @returns {string[]}
20
+ */
21
+ function listSvelteFiles(path) {
22
+ if (!statSync(path).isDirectory()) return [path];
23
+ /** @type {string[]} */
24
+ const found = [];
25
+ for (const entry of readdirSync(path, { withFileTypes: true })) {
26
+ if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
27
+ const child = join(path, entry.name);
28
+ if (entry.isDirectory()) found.push(...listSvelteFiles(child));
29
+ else if (entry.name.endsWith(".svelte")) found.push(child);
30
+ }
31
+ return found;
32
+ }
33
+
34
+ const code = runCodemodCLI(process.argv.slice(2), {
35
+ listSvelteFiles,
36
+ readFile: (path) => readFileSync(path, "utf8"),
37
+ writeFile: (path, content) => {
38
+ writeFileSync(path, content);
39
+ },
40
+ writeOut: (line) => {
41
+ process.stdout.write(line + "\n");
42
+ },
43
+ writeErr: (line) => {
44
+ process.stderr.write(line + "\n");
45
+ },
46
+ });
47
+ process.exit(code);
@@ -0,0 +1,491 @@
1
+ <script
2
+ lang="ts"
3
+ generics="Row extends Record<string, CellValue> = Record<string, CellValue>, Identity extends keyof Row | ((row: Row, index: number) => PropertyKey) = keyof Row"
4
+ >
5
+ /**
6
+ * <GGPlot> — the props-first Svelte adapter (plan: "Svelte adapter").
7
+ *
8
+ * Guaranteed API: `spec={...}` or `data`/`aes`/`layers` props. Declaration-
9
+ * only children (<GeomPoint>/<GeomLine>) are OPTIONAL sugar; explicit
10
+ * `layers` props win over children when both are present.
11
+ *
12
+ * Reactivity: spec assembly is $derived; model production runs in the plot
13
+ * runtime with run-id gating; the committed scale
14
+ * state lives in a NON-reactive box (never read-modify-write shared reactive
15
+ * state across init/teardown — decision 0001, finding 3). That box is what
16
+ * makes discrete colors value-stable across data changes AND across
17
+ * brush-to-zoom respecs.
18
+ *
19
+ * M2 compositing (decision 0006): when any layer resolves to the canvas
20
+ * backend, the plot root becomes an ordered list of full-size sibling
21
+ * strata (SVG chrome-bottom, mark strata in svg/canvas, SVG chrome-top) —
22
+ * document order = paint order, no z-index anywhere. Every stratum is
23
+ * pointer-events: none; ONE transparent capture layer (last child) owns
24
+ * all pointer events and resolves them through the semantic viewport, so
25
+ * hover/tooltip/brush never care which stratum painted a mark. Hover,
26
+ * tooltip, and the transient brush are pure overlays — the pipeline NEVER
27
+ * re-runs for them. Brush-to-zoom is an intentional respec (explicit
28
+ * continuous domains via scale inversion) with prevScales flowing, so
29
+ * color assignments never shift. Double-click resets the zoom;
30
+ * resetScales() (component export) also clears grow-mode scale state.
31
+ *
32
+ * Memory (plan: "Memory ownership"): the previous RenderModel is disposed
33
+ * on commit ($effect cleanup — runs after the DOM has moved to the new
34
+ * model) and the last one on unmount.
35
+ *
36
+ * Controller wiring lives in `plot-engine.svelte.ts` (construction /
37
+ * effect-order contract documented there).
38
+ */
39
+ import type { CellValue } from "@ggts-sh/core";
40
+ import { sceneLabel } from "@ggts-sh/core";
41
+
42
+ import type { ZoomDomains } from "./interaction/interaction.js";
43
+ import { provideRegistry } from "./geoms/registry.svelte.js";
44
+ import { createTooltipPresenceState } from "./inspection/tooltip-presence.svelte.js";
45
+ import { shouldRenderInteractionLiveRegion } from "./legend/surface.js";
46
+ import { resolveInteractionLiveText } from "./assembly/labels.js";
47
+ import {
48
+ isContainerWidthProp,
49
+ isNarrowToolsWidth,
50
+ isTooltipDocked,
51
+ plotTooltipDomId,
52
+ resolveCaptureAriaControls,
53
+ resolveClearControlLayout,
54
+ tooltipViewportSize,
55
+ } from "./assembly/layout.js";
56
+ import BoundsEditor from "./interval/BoundsEditor.svelte";
57
+ import type { EnginePlotProps, GGPlotProps } from "./plot-props.js";
58
+ import { widenPlotProps } from "./plot-props.js";
59
+ import { createPlotEngine } from "./plot-engine.svelte.js";
60
+ import CaptureSurface from "./surface/CaptureSurface.svelte";
61
+ import LegendFilters from "./legend/LegendFilters.svelte";
62
+ import LegendTargets from "./legend/LegendTargets.svelte";
63
+ import MarkStrata from "./scene/MarkStrata.svelte";
64
+ import SceneOverlays from "./scene/SceneOverlays.svelte";
65
+ import StatusChrome from "./chrome/StatusChrome.svelte";
66
+ import Tooltip from "./inspection/Tooltip.svelte";
67
+ import ToolRail from "./chrome/ToolRail.svelte";
68
+
69
+ // Do not destructure $props — later destructure freezes values (#1040 / Claude).
70
+ // Markup reads props.width / props.ariaLabel / props.children; engine gets a
71
+ // lazy widened view (six PublicKey casts live in widenPlotProps).
72
+ const props: GGPlotProps<Row, Identity> = $props();
73
+
74
+ const registry = provideRegistry();
75
+ let root = $state<HTMLDivElement | null>(null);
76
+ let captureSurface = $state<HTMLDivElement | null>(null);
77
+ let a11yTableOpen = $state(false);
78
+ const plotId = $props.id();
79
+
80
+ // Getter so construction does not snapshot $props (state_referenced_locally).
81
+ // The widened proxy is memoized once; field access stays lazy on the source.
82
+ let engineProps: EnginePlotProps | undefined;
83
+ const engine = createPlotEngine({
84
+ registry,
85
+ plotId,
86
+ root: () => root,
87
+ captureSurface: () => captureSurface,
88
+ get props() {
89
+ return (engineProps ??= widenPlotProps(props));
90
+ },
91
+ });
92
+
93
+ const {
94
+ zoomState,
95
+ legendFilterState,
96
+ runtime,
97
+ inspectionState,
98
+ surfaceState,
99
+ selectionState,
100
+ legendFocusState,
101
+ intervalState,
102
+ chromeState,
103
+ announcer,
104
+ } = engine;
105
+
106
+ // Tooltip session/ghost/presence lives in its own factory (live inspection
107
+ // getter; timer/rAF cleanup on unmount; SSR-safe). Call must stay here,
108
+ // during component init, after the engine destructure.
109
+ const presence = createTooltipPresenceState({
110
+ getInspection: () => inspectionState.inspection,
111
+ });
112
+
113
+ /**
114
+ * Clear committed grow-mode scale state and any brush zoom so the next
115
+ * render re-trains scales from the current data. Call after data changes
116
+ * that drop categories whose reserved colors should not persist.
117
+ */
118
+ export function resetScales(): void {
119
+ runtime.resetScales();
120
+ }
121
+
122
+ /** Replace one or both continuous zoom domains without disturbing the
123
+ * other channel. This is the controlled linking/programmatic-zoom path. */
124
+ export function setZoom(domains: Partial<ZoomDomains>): void {
125
+ zoomState.setZoomDomains(domains);
126
+ }
127
+ </script>
128
+
129
+ <!-- Declaration-only children emit no markup. Render them outside and before
130
+ the root so SSR registers every layer before root attributes read derived
131
+ plot state; placing them inside the root is too late in Svelte's one-pass
132
+ server evaluation even when they appear first in source order. -->
133
+ {@render props.children?.()}
134
+
135
+ <!-- The root div is the plot's stable mount point and carries the
136
+ data-gg-ready readiness signal. Compositing (decision 0006): ordered
137
+ full-size sibling strata, document order = paint order, no z-index;
138
+ all strata inert; the capture layer (last child) owns pointer events. -->
139
+ <div
140
+ bind:this={root}
141
+ class="gg-plot-root"
142
+ class:gg-container-width={isContainerWidthProp(props.width)}
143
+ class:gg-with-tool-rail={chromeState.showToolRail}
144
+ class:gg-with-legend-clear={engine.legendClearActive}
145
+ class:gg-with-legend-filters={engine.filterableLegendEntries.length > 0}
146
+ class:gg-narrow-tools={isNarrowToolsWidth(runtime.resolvedWidth)}
147
+ class:gg-with-docked-tooltip={isTooltipDocked({
148
+ inspectionState: inspectionState.inspection?.state,
149
+ widthPx: runtime.resolvedWidth,
150
+ })}
151
+ data-gg-ready={runtime.ready ? "true" : "false"}
152
+ style={chromeState.rootStyle}
153
+ >
154
+ {#if chromeState.showToolRail}
155
+ <ToolRail
156
+ availableTools={chromeState.availableTools}
157
+ activeTool={surfaceState.activeTool}
158
+ ready={runtime.ready}
159
+ emptyPlot={chromeState.emptyPlot}
160
+ narrow={isNarrowToolsWidth(runtime.resolvedWidth)}
161
+ zoomDomains={zoomState.effectiveZoomDomains}
162
+ hasPointSelection={chromeState.hasPointSelection}
163
+ hasIntervalSelection={chromeState.hasIntervalSelection}
164
+ intervalTargetLabel={intervalState.currentIntervalTargetLabel}
165
+ canSetIntervalBounds={!chromeState.emptyPlot &&
166
+ chromeState.preciseIntervalAxes.length > 0 &&
167
+ intervalState.intervalBoundsTargetAvailable}
168
+ canSetZoomBounds={!chromeState.emptyPlot &&
169
+ chromeState.preciseZoomAxes.length > 0}
170
+ intervalAxes={chromeState.preciseIntervalAxes}
171
+ zoomAxes={chromeState.preciseZoomAxes}
172
+ onChooseTool={surfaceState.chooseTool}
173
+ onResetZoom={zoomState.resetZoom}
174
+ onClearPointSelection={selectionState.clearPointSelection}
175
+ onClearIntervalSelection={intervalState.clearIntervalSelection}
176
+ onClearCurrentInterval={intervalState.clearCurrentPanelInterval}
177
+ onEditBounds={intervalState.openBoundsEditor}
178
+ />
179
+ {/if}
180
+ {#if intervalState.boundsEditorInput !== null}
181
+ <div class="gg-precise-bounds">
182
+ <BoundsEditor
183
+ input={intervalState.boundsEditorInput}
184
+ returnFocus={intervalState.boundsReturnFocus}
185
+ onapply={intervalState.applyPreciseBounds}
186
+ oncancel={intervalState.cancelBoundsEditor}
187
+ />
188
+ </div>
189
+ {/if}
190
+ {#if runtime.model !== null}
191
+ {@const currentModel = runtime.model}
192
+ <MarkStrata
193
+ model={currentModel}
194
+ strata={runtime.strata}
195
+ ariaLabel={props.ariaLabel}
196
+ markLabel={chromeState.markLabel}
197
+ interactionMasks={engine.interactionMasks}
198
+ {a11yTableOpen}
199
+ onA11yToggle={() => (a11yTableOpen = !a11yTableOpen)}
200
+ onPainted={runtime.notifyPainted}
201
+ />
202
+ <LegendTargets
203
+ entries={engine.interactiveLegendEntries}
204
+ previewIdentity={legendFocusState.previewIdentity}
205
+ pressedIdentity={engine.effectiveLegendPressed}
206
+ rovingIndex={legendFocusState.rovingIndex}
207
+ sceneWidth={currentModel.scene.width}
208
+ sceneHeight={currentModel.scene.height}
209
+ clearLayout={resolveClearControlLayout({
210
+ legendFocusEnabled: engine.legendFocusEnabled,
211
+ pressedScale: engine.effectiveLegendPressed?.scale ?? null,
212
+ legends: currentModel.scene.legends,
213
+ sceneWidth: currentModel.scene.width,
214
+ sceneHeight: currentModel.scene.height,
215
+ })}
216
+ onPreviewIndex={legendFocusState.onPreviewIndex}
217
+ onPreviewClear={legendFocusState.onPreviewClear}
218
+ onPointerDown={legendFocusState.onLegendPointerDown}
219
+ onPointerUp={legendFocusState.onLegendPointerUp}
220
+ onPointerCancel={legendFocusState.setTouchIndexCleared}
221
+ onFocus={legendFocusState.onLegendFocus}
222
+ onBlur={legendFocusState.onLegendBlur}
223
+ onClick={legendFocusState.onLegendClick}
224
+ onKeyDown={legendFocusState.onLegendKeydown}
225
+ onClearPointerDown={legendFocusState.setClearPointerType}
226
+ onClearPointerCancel={() => legendFocusState.setClearPointerType(null)}
227
+ onClearClick={legendFocusState.clearLegendFromControl}
228
+ />
229
+ <LegendFilters
230
+ controller={legendFilterState}
231
+ entries={engine.filterableLegendEntries}
232
+ />
233
+ <SceneOverlays
234
+ width={currentModel.scene.width}
235
+ height={currentModel.scene.height}
236
+ interactive={engine.interactive}
237
+ surfaceInteractive={engine.surfaceInteractive}
238
+ inspection={inspectionState.inspection}
239
+ inspectionPanel={inspectionState.inspectionPanel}
240
+ coordFlipped={engine.coordFlipped}
241
+ hoverChrome={engine.hoverChrome}
242
+ hoverBoxWidth={engine.hoverBoxWidth}
243
+ hoverBoxHeight={engine.hoverBoxHeight}
244
+ hoverBoxAnchor={engine.hoverBoxAnchor}
245
+ crosshairGapObstacles={engine.crosshairGapObstacles}
246
+ selectedAnchors={engine.selectedAnchors}
247
+ emphasizedAnchors={engine.emphasizedAnchors}
248
+ brushRect={surfaceState.brushRect}
249
+ activeTool={surfaceState.activeTool}
250
+ areaAwaitingSecond={surfaceState.areaAwaitingSecond}
251
+ committedInterval={intervalState.committedInterval}
252
+ />
253
+ {#if engine.surfaceInteractive}
254
+ <!-- Order (document = paint): overlay → capture → Tooltip → status chrome. -->
255
+ <CaptureSurface
256
+ bind:element={captureSurface}
257
+ {plotId}
258
+ activeTool={surfaceState.activeTool}
259
+ ariaLabel={props.ariaLabel ??
260
+ engine.assembled?.labs?.title ??
261
+ sceneLabel(currentModel.scene)}
262
+ ariaControls={resolveCaptureAriaControls({
263
+ inspectionState: inspectionState.inspection?.state,
264
+ contentMode: engine.interactionConfig.inspect?.contentMode,
265
+ plotId,
266
+ })}
267
+ onFocus={() => {
268
+ if (inspectionState.inspection === null) inspectionState.navigate(1);
269
+ presence.queueSync();
270
+ }}
271
+ onBlur={(event) => {
272
+ presence.markExplicitClose();
273
+ surfaceState.onSurfaceBlur(event);
274
+ presence.queueSync();
275
+ }}
276
+ onPointerMove={(event) => {
277
+ presence.setPointerOnCapture(true);
278
+ surfaceState.onPointerMove(event);
279
+ presence.queueSync();
280
+ }}
281
+ onPointerLeave={() => {
282
+ presence.setPointerOnCapture(false);
283
+ surfaceState.onPointerLeave();
284
+ queueMicrotask(presence.queueSync);
285
+ }}
286
+ onPointerDown={(event) => {
287
+ surfaceState.onPointerDown(event);
288
+ presence.queueSync();
289
+ }}
290
+ onPointerUp={(event) => {
291
+ surfaceState.onPointerUp(event);
292
+ presence.queueSync();
293
+ }}
294
+ onPointerCancel={() => {
295
+ surfaceState.onPointerCancel();
296
+ presence.queueSync();
297
+ }}
298
+ onLostPointerCapture={() => {
299
+ surfaceState.onLostPointerCapture();
300
+ presence.queueSync();
301
+ }}
302
+ onClick={(event) => {
303
+ surfaceState.onCaptureClick(event);
304
+ presence.queueSync();
305
+ }}
306
+ onKeyDown={(event) => {
307
+ if (event.key === "Escape") presence.markExplicitClose();
308
+ surfaceState.onSurfaceKeyDown(event);
309
+ presence.queueSync();
310
+ }}
311
+ onDblClick={zoomState.onDblClick}
312
+ />
313
+ {#if inspectionState.inspection !== null}
314
+ {@const currentInspection = inspectionState.inspection}
315
+ {@const tooltipSize = tooltipViewportSize({
316
+ sceneWidth: currentModel.scene.width,
317
+ sceneHeight: currentModel.scene.height,
318
+ clientWidth: root?.clientWidth,
319
+ clientHeight: root?.clientHeight,
320
+ })}
321
+ <Tooltip
322
+ id={plotTooltipDomId(plotId)}
323
+ inspection={currentInspection}
324
+ width={tooltipSize.width}
325
+ height={tooltipSize.height}
326
+ content={engine.interactionConfig.inspect?.content}
327
+ interactive={engine.interactionConfig.inspect?.contentMode ===
328
+ "interactive"}
329
+ docked={isTooltipDocked({
330
+ inspectionState: currentInspection.state,
331
+ widthPx: runtime.resolvedWidth,
332
+ })}
333
+ motion={!presence.sessionActive() && !presence.reducedMotion()
334
+ ? "enter"
335
+ : "none"}
336
+ labs={engine.assembled?.labs ?? null}
337
+ fontSizePx={currentModel.scene.theme.fontSize}
338
+ pin={engine.interactionConfig.inspect?.pin ?? true}
339
+ tooltipBorder={currentModel.scene.theme.tooltipBorder}
340
+ axisFormatters={currentModel.axisFormatters}
341
+ tooltipTotal={engine.interactionConfig.inspect?.tooltipTotal ??
342
+ "auto"}
343
+ onenter={() => (engine.tooltipHovered = true)}
344
+ onleave={() => {
345
+ engine.tooltipHovered = false;
346
+ if (inspectionState.inspection?.state !== "pinned")
347
+ inspectionState.setInspection(null, "pointer");
348
+ presence.queueSync();
349
+ }}
350
+ onclose={(source) => {
351
+ presence.markExplicitClose();
352
+ inspectionState.closeInspection(source, true);
353
+ presence.queueSync();
354
+ }}
355
+ />
356
+ {/if}
357
+ {#if presence.ghost !== null}
358
+ {@const ghostSize = tooltipViewportSize({
359
+ sceneWidth: currentModel.scene.width,
360
+ sceneHeight: currentModel.scene.height,
361
+ clientWidth: root?.clientWidth,
362
+ clientHeight: root?.clientHeight,
363
+ })}
364
+ {@const ghostGenerationAtMount = presence.ghostEpoch}
365
+ <Tooltip
366
+ inspection={presence.ghost}
367
+ width={ghostSize.width}
368
+ height={ghostSize.height}
369
+ content={engine.interactionConfig.inspect?.content}
370
+ docked={isTooltipDocked({
371
+ inspectionState: presence.ghost.state,
372
+ widthPx: runtime.resolvedWidth,
373
+ })}
374
+ motion="exit"
375
+ labs={engine.assembled?.labs ?? null}
376
+ fontSizePx={currentModel.scene.theme.fontSize}
377
+ pin={engine.interactionConfig.inspect?.pin ?? true}
378
+ tooltipBorder={currentModel.scene.theme.tooltipBorder}
379
+ axisFormatters={currentModel.axisFormatters}
380
+ tooltipTotal={engine.interactionConfig.inspect?.tooltipTotal ??
381
+ "auto"}
382
+ onexited={() => presence.clearGhost(ghostGenerationAtMount)}
383
+ />
384
+ {/if}
385
+ {/if}
386
+ <!-- Status chrome after capture/tooltip; ids stay plot-scoped for
387
+ aria-describedby. Parent reduced-motion rule does not match child
388
+ nodes (chrome has no transitions — intentional no-op). -->
389
+ <StatusChrome
390
+ {plotId}
391
+ showInstructions={engine.surfaceInteractive}
392
+ description={surfaceState.surfaceDescription}
393
+ activeDatumLabel={chromeState.datumLabel(
394
+ inspectionState.inspection?.focus.row ?? null,
395
+ )}
396
+ showAreaInstruction={engine.surfaceInteractive &&
397
+ surfaceState.areaAwaitingSecond}
398
+ showLiveRegion={shouldRenderInteractionLiveRegion({
399
+ surfaceInteractive: engine.surfaceInteractive,
400
+ legendFocusEnabled: engine.legendFocusEnabled,
401
+ legendFilterEnabled: legendFilterState.options !== null,
402
+ })}
403
+ liveText={resolveInteractionLiveText({
404
+ announcement: announcer.text,
405
+ model: currentModel,
406
+ inspection: inspectionState.inspection,
407
+ })}
408
+ emptyPlot={chromeState.emptyPlot}
409
+ capabilityStatus={chromeState.capabilityStatus}
410
+ />
411
+ {/if}
412
+ </div>
413
+
414
+ <style>
415
+ .gg-precise-bounds {
416
+ position: absolute;
417
+ /* Above the transparent legend hit targets (z-index 5): the open editor
418
+ must be the top interactive layer or invisible legend buttons
419
+ intercept pointer input meant for its fields. */
420
+ z-index: 6;
421
+ top: 8px;
422
+ left: 8px;
423
+ right: 8px;
424
+ max-width: 560px;
425
+ padding: 8px;
426
+ background: var(--gg-panelBg, var(--gg-theme-panelBg, Canvas));
427
+ box-shadow: 0 2px 12px color-mix(in srgb, currentColor 18%, transparent);
428
+ pointer-events: auto;
429
+ }
430
+
431
+ .gg-plot-root {
432
+ position: relative;
433
+ display: inline-block;
434
+ line-height: 0;
435
+ max-width: 100%;
436
+ container: gg-plot / inline-size;
437
+ }
438
+
439
+ .gg-container-width {
440
+ display: block;
441
+ width: 100%;
442
+ }
443
+
444
+ /* Keep controls in their own row so they never obscure titles, legends,
445
+ marks, or axes. The plot retains its exact scene coordinate system. */
446
+ .gg-with-tool-rail {
447
+ margin-top: 52px;
448
+ }
449
+
450
+ /* Clear sits top-right inside the scene (absolute) — no layout margin.
451
+ Filters still need a bottom row when present. */
452
+ .gg-with-legend-filters {
453
+ margin-bottom: 58px;
454
+ }
455
+
456
+ .gg-with-docked-tooltip {
457
+ margin-bottom: 260px;
458
+ }
459
+
460
+ /* Strata: full-size positioned siblings; document order = paint order
461
+ (no z-index anywhere — decision 0006). All inert; the capture layer
462
+ owns pointer events. Parent-owned so extracted overlay SVGs with
463
+ class gg-stratum stay absolutely positioned. */
464
+ .gg-plot-root :global(.gg-stratum) {
465
+ position: absolute;
466
+ inset: 0;
467
+ pointer-events: none;
468
+ }
469
+
470
+ @container gg-plot (max-width: 559px) {
471
+ .gg-with-tool-rail {
472
+ margin-top: 96px;
473
+ }
474
+ }
475
+
476
+ /* ResizeObserver-backed fallback for engines that do not apply a query to
477
+ descendants of a component-owned named container during hydration. */
478
+ .gg-narrow-tools.gg-with-tool-rail {
479
+ margin-top: 96px;
480
+ }
481
+
482
+ @media (prefers-reduced-motion: reduce) {
483
+ /* :global so the policy reaches extracted child components (mark strata,
484
+ capture surface, status chrome) whose nodes are outside this scope. */
485
+ .gg-plot-root :global(*) {
486
+ scroll-behavior: auto;
487
+ transition: none !important;
488
+ animation: none !important;
489
+ }
490
+ }
491
+ </style>