@voila.dev/chart 4.0.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 (377) hide show
  1. package/README.md +85 -0
  2. package/dist/brush/brush-layer.d.ts +16 -0
  3. package/dist/brush/brush-layer.d.ts.map +1 -0
  4. package/dist/brush/brush-layer.js +137 -0
  5. package/dist/brush/brush-layer.js.map +7 -0
  6. package/dist/brush/index.d.ts +10 -0
  7. package/dist/brush/index.d.ts.map +1 -0
  8. package/dist/brush/index.js +8 -0
  9. package/dist/brush/index.js.map +7 -0
  10. package/dist/canvas/canvas-renderer.d.ts +11 -0
  11. package/dist/canvas/canvas-renderer.d.ts.map +1 -0
  12. package/dist/canvas/canvas-renderer.js +49 -0
  13. package/dist/canvas/canvas-renderer.js.map +7 -0
  14. package/dist/canvas/index.d.ts +2 -0
  15. package/dist/canvas/index.d.ts.map +1 -0
  16. package/dist/canvas/index.js +5 -0
  17. package/dist/canvas/index.js.map +7 -0
  18. package/dist/canvas/paint-scene.d.ts +4 -0
  19. package/dist/canvas/paint-scene.d.ts.map +1 -0
  20. package/dist/canvas/paint-scene.js +130 -0
  21. package/dist/canvas/paint-scene.js.map +7 -0
  22. package/dist/canvas/resolve-color.d.ts +18 -0
  23. package/dist/canvas/resolve-color.d.ts.map +1 -0
  24. package/dist/canvas/resolve-color.js +52 -0
  25. package/dist/canvas/resolve-color.js.map +7 -0
  26. package/dist/contour/density.d.ts +20 -0
  27. package/dist/contour/density.d.ts.map +1 -0
  28. package/dist/contour/density.js +59 -0
  29. package/dist/contour/density.js.map +7 -0
  30. package/dist/contour/index.d.ts +2 -0
  31. package/dist/contour/index.d.ts.map +1 -0
  32. package/dist/contour/index.js +5 -0
  33. package/dist/contour/index.js.map +7 -0
  34. package/dist/core/channel.d.ts +11 -0
  35. package/dist/core/channel.d.ts.map +1 -0
  36. package/dist/core/channel.js +44 -0
  37. package/dist/core/channel.js.map +7 -0
  38. package/dist/core/compile.d.ts +22 -0
  39. package/dist/core/compile.d.ts.map +1 -0
  40. package/dist/core/compile.js +295 -0
  41. package/dist/core/compile.js.map +7 -0
  42. package/dist/core/define-chart.d.ts +96 -0
  43. package/dist/core/define-chart.d.ts.map +1 -0
  44. package/dist/core/define-chart.js +7 -0
  45. package/dist/core/define-chart.js.map +7 -0
  46. package/dist/core/facet.d.ts +7 -0
  47. package/dist/core/facet.d.ts.map +1 -0
  48. package/dist/core/facet.js +134 -0
  49. package/dist/core/facet.js.map +7 -0
  50. package/dist/core/format.d.ts +37 -0
  51. package/dist/core/format.d.ts.map +1 -0
  52. package/dist/core/format.js +108 -0
  53. package/dist/core/format.js.map +7 -0
  54. package/dist/core/guides/axes.d.ts +25 -0
  55. package/dist/core/guides/axes.d.ts.map +1 -0
  56. package/dist/core/guides/axes.js +204 -0
  57. package/dist/core/guides/axes.js.map +7 -0
  58. package/dist/core/marks/area.d.ts +23 -0
  59. package/dist/core/marks/area.d.ts.map +1 -0
  60. package/dist/core/marks/area.js +187 -0
  61. package/dist/core/marks/area.js.map +7 -0
  62. package/dist/core/marks/bar.d.ts +26 -0
  63. package/dist/core/marks/bar.d.ts.map +1 -0
  64. package/dist/core/marks/bar.js +200 -0
  65. package/dist/core/marks/bar.js.map +7 -0
  66. package/dist/core/marks/cell.d.ts +16 -0
  67. package/dist/core/marks/cell.d.ts.map +1 -0
  68. package/dist/core/marks/cell.js +98 -0
  69. package/dist/core/marks/cell.js.map +7 -0
  70. package/dist/core/marks/dot.d.ts +17 -0
  71. package/dist/core/marks/dot.d.ts.map +1 -0
  72. package/dist/core/marks/dot.js +125 -0
  73. package/dist/core/marks/dot.js.map +7 -0
  74. package/dist/core/marks/funnel-layout.d.ts +37 -0
  75. package/dist/core/marks/funnel-layout.d.ts.map +1 -0
  76. package/dist/core/marks/funnel-layout.js +61 -0
  77. package/dist/core/marks/funnel-layout.js.map +7 -0
  78. package/dist/core/marks/funnel.d.ts +19 -0
  79. package/dist/core/marks/funnel.d.ts.map +1 -0
  80. package/dist/core/marks/funnel.js +143 -0
  81. package/dist/core/marks/funnel.js.map +7 -0
  82. package/dist/core/marks/line.d.ts +17 -0
  83. package/dist/core/marks/line.d.ts.map +1 -0
  84. package/dist/core/marks/line.js +150 -0
  85. package/dist/core/marks/line.js.map +7 -0
  86. package/dist/core/marks/polar.d.ts +61 -0
  87. package/dist/core/marks/polar.d.ts.map +1 -0
  88. package/dist/core/marks/polar.js +436 -0
  89. package/dist/core/marks/polar.js.map +7 -0
  90. package/dist/core/marks/rect.d.ts +22 -0
  91. package/dist/core/marks/rect.d.ts.map +1 -0
  92. package/dist/core/marks/rect.js +119 -0
  93. package/dist/core/marks/rect.js.map +7 -0
  94. package/dist/core/marks/rule.d.ts +17 -0
  95. package/dist/core/marks/rule.d.ts.map +1 -0
  96. package/dist/core/marks/rule.js +73 -0
  97. package/dist/core/marks/rule.js.map +7 -0
  98. package/dist/core/marks/shared.d.ts +41 -0
  99. package/dist/core/marks/shared.d.ts.map +1 -0
  100. package/dist/core/marks/shared.js +74 -0
  101. package/dist/core/marks/shared.js.map +7 -0
  102. package/dist/core/marks/stack.d.ts +13 -0
  103. package/dist/core/marks/stack.d.ts.map +1 -0
  104. package/dist/core/marks/stack.js +28 -0
  105. package/dist/core/marks/stack.js.map +7 -0
  106. package/dist/core/marks/stats/difference.d.ts +20 -0
  107. package/dist/core/marks/stats/difference.d.ts.map +1 -0
  108. package/dist/core/marks/stats/difference.js +168 -0
  109. package/dist/core/marks/stats/difference.js.map +7 -0
  110. package/dist/core/marks/stats/distribution.d.ts +41 -0
  111. package/dist/core/marks/stats/distribution.d.ts.map +1 -0
  112. package/dist/core/marks/stats/distribution.js +354 -0
  113. package/dist/core/marks/stats/distribution.js.map +7 -0
  114. package/dist/core/marks/stats/dodge.d.ts +16 -0
  115. package/dist/core/marks/stats/dodge.d.ts.map +1 -0
  116. package/dist/core/marks/stats/dodge.js +104 -0
  117. package/dist/core/marks/stats/dodge.js.map +7 -0
  118. package/dist/core/marks/stats/hexbin.d.ts +26 -0
  119. package/dist/core/marks/stats/hexbin.d.ts.map +1 -0
  120. package/dist/core/marks/stats/hexbin.js +113 -0
  121. package/dist/core/marks/stats/hexbin.js.map +7 -0
  122. package/dist/core/marks/stats/histogram.d.ts +27 -0
  123. package/dist/core/marks/stats/histogram.d.ts.map +1 -0
  124. package/dist/core/marks/stats/histogram.js +70 -0
  125. package/dist/core/marks/stats/histogram.js.map +7 -0
  126. package/dist/core/marks/stats/regression.d.ts +13 -0
  127. package/dist/core/marks/stats/regression.d.ts.map +1 -0
  128. package/dist/core/marks/stats/regression.js +80 -0
  129. package/dist/core/marks/stats/regression.js.map +7 -0
  130. package/dist/core/marks/stats/statistics.d.ts +34 -0
  131. package/dist/core/marks/stats/statistics.d.ts.map +1 -0
  132. package/dist/core/marks/stats/statistics.js +111 -0
  133. package/dist/core/marks/stats/statistics.js.map +7 -0
  134. package/dist/core/marks/stats/waffle.d.ts +18 -0
  135. package/dist/core/marks/stats/waffle.d.ts.map +1 -0
  136. package/dist/core/marks/stats/waffle.js +117 -0
  137. package/dist/core/marks/stats/waffle.js.map +7 -0
  138. package/dist/core/marks/text.d.ts +19 -0
  139. package/dist/core/marks/text.d.ts.map +1 -0
  140. package/dist/core/marks/text.js +60 -0
  141. package/dist/core/marks/text.js.map +7 -0
  142. package/dist/core/motion/tween.d.ts +6 -0
  143. package/dist/core/motion/tween.d.ts.map +1 -0
  144. package/dist/core/motion/tween.js +98 -0
  145. package/dist/core/motion/tween.js.map +7 -0
  146. package/dist/core/nearest.d.ts +25 -0
  147. package/dist/core/nearest.d.ts.map +1 -0
  148. package/dist/core/nearest.js +151 -0
  149. package/dist/core/nearest.js.map +7 -0
  150. package/dist/core/paths.d.ts +65 -0
  151. package/dist/core/paths.d.ts.map +1 -0
  152. package/dist/core/paths.js +192 -0
  153. package/dist/core/paths.js.map +7 -0
  154. package/dist/core/scales/color.d.ts +11 -0
  155. package/dist/core/scales/color.d.ts.map +1 -0
  156. package/dist/core/scales/color.js +35 -0
  157. package/dist/core/scales/color.js.map +7 -0
  158. package/dist/core/scales/continuous.d.ts +18 -0
  159. package/dist/core/scales/continuous.d.ts.map +1 -0
  160. package/dist/core/scales/continuous.js +82 -0
  161. package/dist/core/scales/continuous.js.map +7 -0
  162. package/dist/core/scales/discrete.d.ts +22 -0
  163. package/dist/core/scales/discrete.d.ts.map +1 -0
  164. package/dist/core/scales/discrete.js +103 -0
  165. package/dist/core/scales/discrete.js.map +7 -0
  166. package/dist/core/scales/resolve.d.ts +18 -0
  167. package/dist/core/scales/resolve.d.ts.map +1 -0
  168. package/dist/core/scales/resolve.js +112 -0
  169. package/dist/core/scales/resolve.js.map +7 -0
  170. package/dist/core/scales/time.d.ts +4 -0
  171. package/dist/core/scales/time.d.ts.map +1 -0
  172. package/dist/core/scales/time.js +140 -0
  173. package/dist/core/scales/time.js.map +7 -0
  174. package/dist/core/text.d.ts +3 -0
  175. package/dist/core/text.d.ts.map +1 -0
  176. package/dist/core/text.js +29 -0
  177. package/dist/core/text.js.map +7 -0
  178. package/dist/core/theme.d.ts +8 -0
  179. package/dist/core/theme.d.ts.map +1 -0
  180. package/dist/core/theme.js +21 -0
  181. package/dist/core/theme.js.map +7 -0
  182. package/dist/core/ticks.d.ts +27 -0
  183. package/dist/core/ticks.d.ts.map +1 -0
  184. package/dist/core/ticks.js +76 -0
  185. package/dist/core/ticks.js.map +7 -0
  186. package/dist/core/types.d.ts +305 -0
  187. package/dist/core/types.d.ts.map +1 -0
  188. package/dist/core/types.js +1 -0
  189. package/dist/core/types.js.map +7 -0
  190. package/dist/force/force.d.ts +30 -0
  191. package/dist/force/force.d.ts.map +1 -0
  192. package/dist/force/force.js +143 -0
  193. package/dist/force/force.js.map +7 -0
  194. package/dist/force/index.d.ts +2 -0
  195. package/dist/force/index.d.ts.map +1 -0
  196. package/dist/force/index.js +7 -0
  197. package/dist/force/index.js.map +7 -0
  198. package/dist/geo/geo.d.ts +59 -0
  199. package/dist/geo/geo.d.ts.map +1 -0
  200. package/dist/geo/geo.js +231 -0
  201. package/dist/geo/geo.js.map +7 -0
  202. package/dist/geo/index.d.ts +2 -0
  203. package/dist/geo/index.d.ts.map +1 -0
  204. package/dist/geo/index.js +13 -0
  205. package/dist/geo/index.js.map +7 -0
  206. package/dist/hierarchy/hierarchy.d.ts +24 -0
  207. package/dist/hierarchy/hierarchy.d.ts.map +1 -0
  208. package/dist/hierarchy/hierarchy.js +279 -0
  209. package/dist/hierarchy/hierarchy.js.map +7 -0
  210. package/dist/hierarchy/index.d.ts +2 -0
  211. package/dist/hierarchy/index.d.ts.map +1 -0
  212. package/dist/hierarchy/index.js +11 -0
  213. package/dist/hierarchy/index.js.map +7 -0
  214. package/dist/index.d.ts +29 -0
  215. package/dist/index.d.ts.map +1 -0
  216. package/dist/index.js +96 -0
  217. package/dist/index.js.map +7 -0
  218. package/dist/react/brush-contract.d.ts +23 -0
  219. package/dist/react/brush-contract.d.ts.map +1 -0
  220. package/dist/react/brush-contract.js +7 -0
  221. package/dist/react/brush-contract.js.map +7 -0
  222. package/dist/react/chart-data-table.d.ts +18 -0
  223. package/dist/react/chart-data-table.d.ts.map +1 -0
  224. package/dist/react/chart-data-table.js +55 -0
  225. package/dist/react/chart-data-table.js.map +7 -0
  226. package/dist/react/chart-legend.d.ts +17 -0
  227. package/dist/react/chart-legend.d.ts.map +1 -0
  228. package/dist/react/chart-legend.js +126 -0
  229. package/dist/react/chart-legend.js.map +7 -0
  230. package/dist/react/chart-tooltip.d.ts +18 -0
  231. package/dist/react/chart-tooltip.d.ts.map +1 -0
  232. package/dist/react/chart-tooltip.js +95 -0
  233. package/dist/react/chart-tooltip.js.map +7 -0
  234. package/dist/react/chart.d.ts +45 -0
  235. package/dist/react/chart.d.ts.map +1 -0
  236. package/dist/react/chart.js +383 -0
  237. package/dist/react/chart.js.map +7 -0
  238. package/dist/react/focus-overlay.d.ts +14 -0
  239. package/dist/react/focus-overlay.d.ts.map +1 -0
  240. package/dist/react/focus-overlay.js +147 -0
  241. package/dist/react/focus-overlay.js.map +7 -0
  242. package/dist/react/index.d.ts +7 -0
  243. package/dist/react/index.d.ts.map +1 -0
  244. package/dist/react/index.js +11 -0
  245. package/dist/react/index.js.map +7 -0
  246. package/dist/react/messages.d.ts +16 -0
  247. package/dist/react/messages.d.ts.map +1 -0
  248. package/dist/react/messages.js +33 -0
  249. package/dist/react/messages.js.map +7 -0
  250. package/dist/react/renderer.d.ts +14 -0
  251. package/dist/react/renderer.d.ts.map +1 -0
  252. package/dist/react/renderer.js +1 -0
  253. package/dist/react/renderer.js.map +7 -0
  254. package/dist/react/sr-only.d.ts +4 -0
  255. package/dist/react/sr-only.d.ts.map +1 -0
  256. package/dist/react/sr-only.js +15 -0
  257. package/dist/react/sr-only.js.map +7 -0
  258. package/dist/react/svg-renderer.d.ts +4 -0
  259. package/dist/react/svg-renderer.d.ts.map +1 -0
  260. package/dist/react/svg-renderer.js +20 -0
  261. package/dist/react/svg-renderer.js.map +7 -0
  262. package/dist/react/svg-scene.d.ts +8 -0
  263. package/dist/react/svg-scene.d.ts.map +1 -0
  264. package/dist/react/svg-scene.js +121 -0
  265. package/dist/react/svg-scene.js.map +7 -0
  266. package/dist/react/use-animated-scene.d.ts +10 -0
  267. package/dist/react/use-animated-scene.d.ts.map +1 -0
  268. package/dist/react/use-animated-scene.js +41 -0
  269. package/dist/react/use-animated-scene.js.map +7 -0
  270. package/dist/react/use-chart-focus.d.ts +29 -0
  271. package/dist/react/use-chart-focus.d.ts.map +1 -0
  272. package/dist/react/use-chart-focus.js +180 -0
  273. package/dist/react/use-chart-focus.js.map +7 -0
  274. package/dist/react/use-chart-width.d.ts +12 -0
  275. package/dist/react/use-chart-width.d.ts.map +1 -0
  276. package/dist/react/use-chart-width.js +23 -0
  277. package/dist/react/use-chart-width.js.map +7 -0
  278. package/dist/react/use-chart-zoom.d.ts +13 -0
  279. package/dist/react/use-chart-zoom.d.ts.map +1 -0
  280. package/dist/react/use-chart-zoom.js +52 -0
  281. package/dist/react/use-chart-zoom.js.map +7 -0
  282. package/dist/react/use-text-measurer.d.ts +8 -0
  283. package/dist/react/use-text-measurer.d.ts.map +1 -0
  284. package/dist/react/use-text-measurer.js +44 -0
  285. package/dist/react/use-text-measurer.js.map +7 -0
  286. package/dist/sankey/index.d.ts +2 -0
  287. package/dist/sankey/index.d.ts.map +1 -0
  288. package/dist/sankey/index.js +7 -0
  289. package/dist/sankey/index.js.map +7 -0
  290. package/dist/sankey/sankey.d.ts +29 -0
  291. package/dist/sankey/sankey.d.ts.map +1 -0
  292. package/dist/sankey/sankey.js +127 -0
  293. package/dist/sankey/sankey.js.map +7 -0
  294. package/dist/voronoi/index.d.ts +2 -0
  295. package/dist/voronoi/index.d.ts.map +1 -0
  296. package/dist/voronoi/index.js +5 -0
  297. package/dist/voronoi/index.js.map +7 -0
  298. package/dist/voronoi/voronoi.d.ts +16 -0
  299. package/dist/voronoi/voronoi.d.ts.map +1 -0
  300. package/dist/voronoi/voronoi.js +62 -0
  301. package/dist/voronoi/voronoi.js.map +7 -0
  302. package/package.json +74 -0
  303. package/src/brush/brush-layer.tsx +174 -0
  304. package/src/brush/index.ts +14 -0
  305. package/src/canvas/canvas-renderer.tsx +56 -0
  306. package/src/canvas/index.ts +1 -0
  307. package/src/canvas/paint-scene.ts +152 -0
  308. package/src/canvas/resolve-color.ts +65 -0
  309. package/src/contour/density.ts +90 -0
  310. package/src/contour/index.ts +1 -0
  311. package/src/core/channel.ts +53 -0
  312. package/src/core/compile.ts +436 -0
  313. package/src/core/define-chart.ts +128 -0
  314. package/src/core/facet.ts +189 -0
  315. package/src/core/format.ts +163 -0
  316. package/src/core/guides/axes.ts +283 -0
  317. package/src/core/marks/area.ts +238 -0
  318. package/src/core/marks/bar.ts +278 -0
  319. package/src/core/marks/cell.ts +123 -0
  320. package/src/core/marks/dot.ts +157 -0
  321. package/src/core/marks/funnel-layout.ts +113 -0
  322. package/src/core/marks/funnel.ts +172 -0
  323. package/src/core/marks/line.ts +206 -0
  324. package/src/core/marks/polar.ts +568 -0
  325. package/src/core/marks/rect.ts +156 -0
  326. package/src/core/marks/rule.ts +104 -0
  327. package/src/core/marks/shared.ts +134 -0
  328. package/src/core/marks/stack.ts +42 -0
  329. package/src/core/marks/stats/difference.ts +205 -0
  330. package/src/core/marks/stats/distribution.ts +425 -0
  331. package/src/core/marks/stats/dodge.ts +136 -0
  332. package/src/core/marks/stats/hexbin.ts +152 -0
  333. package/src/core/marks/stats/histogram.ts +108 -0
  334. package/src/core/marks/stats/regression.ts +108 -0
  335. package/src/core/marks/stats/statistics.ts +153 -0
  336. package/src/core/marks/stats/waffle.ts +141 -0
  337. package/src/core/marks/text.ts +97 -0
  338. package/src/core/motion/tween.ts +131 -0
  339. package/src/core/nearest.ts +223 -0
  340. package/src/core/paths.ts +323 -0
  341. package/src/core/scales/color.ts +51 -0
  342. package/src/core/scales/continuous.ts +111 -0
  343. package/src/core/scales/discrete.ts +156 -0
  344. package/src/core/scales/resolve.ts +158 -0
  345. package/src/core/scales/time.ts +180 -0
  346. package/src/core/text.ts +42 -0
  347. package/src/core/theme.ts +26 -0
  348. package/src/core/ticks.ts +118 -0
  349. package/src/core/types.ts +358 -0
  350. package/src/force/force.ts +200 -0
  351. package/src/force/index.ts +6 -0
  352. package/src/geo/geo.ts +346 -0
  353. package/src/geo/index.ts +10 -0
  354. package/src/hierarchy/hierarchy.ts +377 -0
  355. package/src/hierarchy/index.ts +6 -0
  356. package/src/index.ts +70 -0
  357. package/src/react/brush-contract.ts +35 -0
  358. package/src/react/chart-data-table.tsx +98 -0
  359. package/src/react/chart-legend.tsx +130 -0
  360. package/src/react/chart-tooltip.tsx +111 -0
  361. package/src/react/chart.tsx +489 -0
  362. package/src/react/focus-overlay.tsx +164 -0
  363. package/src/react/index.ts +9 -0
  364. package/src/react/messages.ts +49 -0
  365. package/src/react/renderer.ts +15 -0
  366. package/src/react/sr-only.ts +14 -0
  367. package/src/react/svg-renderer.tsx +18 -0
  368. package/src/react/svg-scene.tsx +146 -0
  369. package/src/react/use-animated-scene.ts +57 -0
  370. package/src/react/use-chart-focus.ts +245 -0
  371. package/src/react/use-chart-width.ts +27 -0
  372. package/src/react/use-chart-zoom.ts +67 -0
  373. package/src/react/use-text-measurer.ts +49 -0
  374. package/src/sankey/index.ts +6 -0
  375. package/src/sankey/sankey.ts +179 -0
  376. package/src/voronoi/index.ts +1 -0
  377. package/src/voronoi/voronoi.ts +84 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/focus-overlay.tsx"],
4
+ "sourcesContent": ["import type * as React from \"react\";\nimport { arcPath, roundedBarPath } from \"#/core/paths.ts\";\nimport type { ChartPoint, ChartScene, ChartTheme } from \"#/core/types.ts\";\nimport type { ActiveFocus } from \"#/react/use-chart-focus.ts\";\n\nconst RING_RADIUS = 4.5;\nconst RING_OUTSET = 2;\n\nfunction PointRing({\n\tpoint,\n\tkeyboard,\n\ttheme,\n}: {\n\tpoint: ChartPoint;\n\tkeyboard: boolean;\n\ttheme: ChartTheme;\n}) {\n\tconst ring = keyboard ? \"var(--ring, Highlight)\" : theme.background;\n\tif (point.hit?.kind === \"rect\" && point.hit.rect.width > RING_RADIUS * 4) {\n\t\tif (!keyboard) {\n\t\t\treturn null;\n\t\t}\n\t\tconst { rect } = point.hit;\n\t\treturn (\n\t\t\t<path\n\t\t\t\tdata-slot=\"chart-focus-ring\"\n\t\t\t\td={roundedBarPath({\n\t\t\t\t\tx: rect.x - RING_OUTSET,\n\t\t\t\t\ty: rect.y - RING_OUTSET,\n\t\t\t\t\twidth: rect.width + RING_OUTSET * 2,\n\t\t\t\t\theight: rect.height + RING_OUTSET * 2,\n\t\t\t\t\tradius: 4,\n\t\t\t\t})}\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={ring}\n\t\t\t\tstrokeWidth={2}\n\t\t\t/>\n\t\t);\n\t}\n\tif (point.hit?.kind === \"arc\") {\n\t\treturn (\n\t\t\t<path\n\t\t\t\tdata-slot=\"chart-focus-ring\"\n\t\t\t\td={arcPath({\n\t\t\t\t\t...point.hit,\n\t\t\t\t\touterRadius: point.hit.outerRadius + RING_OUTSET,\n\t\t\t\t})}\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={keyboard ? ring : theme.foreground}\n\t\t\t\tstrokeWidth={2}\n\t\t\t/>\n\t\t);\n\t}\n\treturn (\n\t\t<circle\n\t\t\tdata-slot=\"chart-focus-ring\"\n\t\t\tcx={point.x}\n\t\t\tcy={point.y}\n\t\t\tr={RING_RADIUS}\n\t\t\tfill={point.color}\n\t\t\tstroke={ring}\n\t\t\tstrokeWidth={2}\n\t\t/>\n\t);\n}\n\n/**\n * The focus layer, drawn over the marks whichever renderer drew them: the\n * column or row band under the pointer, and a ring on the focused point.\n * Hidden from assistive tech: the live region says what it shows.\n */\nexport function FocusOverlay({\n\tscene,\n\tactive,\n\ttheme,\n}: {\n\tscene: ChartScene;\n\tactive: ActiveFocus | null;\n\ttheme: ChartTheme;\n}) {\n\tif (active === null) {\n\t\treturn null;\n\t}\n\tconst { focusOrder, scales } = scene;\n\t// On a faceted chart the cursor spans the focused point's own cell.\n\tconst plot =\n\t\tscene.cells?.find((cell) => cell.key === active.point.facet)?.plot ??\n\t\tscene.plot;\n\tconst keyboard = active.source === \"keyboard\";\n\tconst along = focusOrder === \"y\" ? scales.y : scales.x;\n\tconst band = along?.kind === \"band\" ? along.bandwidth : 0;\n\tlet cursor: React.ReactNode = null;\n\tif (focusOrder !== \"point\") {\n\t\tcursor =\n\t\t\tband > 0 ? (\n\t\t\t\t<rect\n\t\t\t\t\tdata-slot=\"chart-cursor\"\n\t\t\t\t\t{...(focusOrder === \"y\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: plot.x,\n\t\t\t\t\t\t\t\ty: active.stop.at - band / 2,\n\t\t\t\t\t\t\t\twidth: plot.width,\n\t\t\t\t\t\t\t\theight: band,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: active.stop.at - band / 2,\n\t\t\t\t\t\t\t\ty: plot.y,\n\t\t\t\t\t\t\t\twidth: band,\n\t\t\t\t\t\t\t\theight: plot.height,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\topacity={0.06}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<line\n\t\t\t\t\tdata-slot=\"chart-cursor\"\n\t\t\t\t\t{...(focusOrder === \"y\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx1: plot.x,\n\t\t\t\t\t\t\t\tx2: plot.x + plot.width,\n\t\t\t\t\t\t\t\ty1: active.stop.at,\n\t\t\t\t\t\t\t\ty2: active.stop.at,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx1: active.stop.at,\n\t\t\t\t\t\t\t\tx2: active.stop.at,\n\t\t\t\t\t\t\t\ty1: plot.y,\n\t\t\t\t\t\t\t\ty2: plot.y + plot.height,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\tstroke={theme.muted}\n\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\tstrokeDasharray=\"3 3\"\n\t\t\t\t/>\n\t\t\t);\n\t}\n\tconst ringed =\n\t\tfocusOrder === \"point\" || (keyboard && active.stop.points.length > 1)\n\t\t\t? [active.point]\n\t\t\t: active.stop.points;\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tdata-slot=\"chart-focus\"\n\t\t\twidth={scene.width}\n\t\t\theight={scene.height}\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tinset: 0,\n\t\t\t\toverflow: \"visible\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t}}\n\t\t>\n\t\t\t{cursor}\n\t\t\t{ringed.map((point) => (\n\t\t\t\t<PointRing\n\t\t\t\t\tkey={point.key}\n\t\t\t\t\tpoint={point}\n\t\t\t\t\tkeyboard={keyboard}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</svg>\n\t);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ export type { ChartBrush, ChartBrushRange } from "./brush-contract.js";
2
+ export { Chart } from "./chart.js";
3
+ export { ChartTooltipContent, type ChartTooltipRenderProps, } from "./chart-tooltip.js";
4
+ export type { ChartRenderer, ChartRendererProps } from "./renderer.js";
5
+ export { SvgRenderer } from "./svg-renderer.js";
6
+ export type { ActiveFocus } from "./use-chart-focus.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACN,mBAAmB,EACnB,KAAK,uBAAuB,GAC5B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Chart } from "./chart.js";
2
+ import {
3
+ ChartTooltipContent
4
+ } from "./chart-tooltip.js";
5
+ import { SvgRenderer } from "./svg-renderer.js";
6
+ export {
7
+ Chart,
8
+ ChartTooltipContent,
9
+ SvgRenderer
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/index.ts"],
4
+ "sourcesContent": ["export type { ChartBrush, ChartBrushRange } from \"#/react/brush-contract.ts\";\nexport { Chart } from \"#/react/chart.tsx\";\nexport {\n\tChartTooltipContent,\n\ttype ChartTooltipRenderProps,\n} from \"#/react/chart-tooltip.tsx\";\nexport type { ChartRenderer, ChartRendererProps } from \"#/react/renderer.ts\";\nexport { SvgRenderer } from \"#/react/svg-renderer.tsx\";\nexport type { ActiveFocus } from \"#/react/use-chart-focus.ts\";\n"],
5
+ "mappings": "AACA,SAAS,aAAa;AACtB;AAAA,EACC;AAAA,OAEM;AAEP,SAAS,mBAAmB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ /** The few words the chart says itself. French when the chart's locale is, English otherwise. */
2
+ export interface ChartMessages {
3
+ readonly keyboardHint: string;
4
+ readonly roleDescription: string;
5
+ readonly legend: string;
6
+ readonly series: string;
7
+ readonly resetZoom: string;
8
+ readonly showing: (from: string, to: string) => string;
9
+ readonly zoomHint: string;
10
+ readonly brushStart: string;
11
+ readonly brushEnd: string;
12
+ readonly selected: (from: string, to: string) => string;
13
+ readonly dataTable: (label: string) => string;
14
+ }
15
+ export declare function messagesFor(locale: string): ChartMessages;
16
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/react/messages.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAiCD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAEzD"}
@@ -0,0 +1,33 @@
1
+ const FRENCH = {
2
+ keyboardHint: "Fl\xE8ches pour parcourir les valeurs, Entr\xE9e pour \xE9pingler, \xC9chap pour quitter.",
3
+ roleDescription: "graphique",
4
+ legend: "L\xE9gende",
5
+ series: "S\xE9rie",
6
+ resetZoom: "R\xE9initialiser le zoom",
7
+ showing: (from, to) => `Affich\xE9 : ${from} \u2013 ${to}`,
8
+ zoomHint: " + et \u2212 pour zoomer, Maj et fl\xE8ches pour se d\xE9placer, 0 pour revenir.",
9
+ brushStart: "D\xE9but de la s\xE9lection",
10
+ brushEnd: "Fin de la s\xE9lection",
11
+ selected: (from, to) => `S\xE9lection : ${from} \u2013 ${to}`,
12
+ dataTable: (label) => `Donn\xE9es : ${label}`
13
+ };
14
+ const ENGLISH = {
15
+ keyboardHint: "Arrow keys to move through the values, Enter to pin, Escape to leave.",
16
+ roleDescription: "chart",
17
+ legend: "Legend",
18
+ series: "Series",
19
+ resetZoom: "Reset zoom",
20
+ showing: (from, to) => `Showing ${from} \u2013 ${to}`,
21
+ zoomHint: " + and \u2212 to zoom, Shift and the arrows to pan, 0 to reset.",
22
+ brushStart: "Selection start",
23
+ brushEnd: "Selection end",
24
+ selected: (from, to) => `Selected ${from} \u2013 ${to}`,
25
+ dataTable: (label) => `Data: ${label}`
26
+ };
27
+ function messagesFor(locale) {
28
+ return locale.toLowerCase().startsWith("fr") ? FRENCH : ENGLISH;
29
+ }
30
+ export {
31
+ messagesFor
32
+ };
33
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/messages.ts"],
4
+ "sourcesContent": ["/** The few words the chart says itself. French when the chart's locale is, English otherwise. */\nexport interface ChartMessages {\n\treadonly keyboardHint: string;\n\treadonly roleDescription: string;\n\treadonly legend: string;\n\treadonly series: string;\n\treadonly resetZoom: string;\n\treadonly showing: (from: string, to: string) => string;\n\treadonly zoomHint: string;\n\treadonly brushStart: string;\n\treadonly brushEnd: string;\n\treadonly selected: (from: string, to: string) => string;\n\treadonly dataTable: (label: string) => string;\n}\n\nconst FRENCH: ChartMessages = {\n\tkeyboardHint:\n\t\t\"Fl\u00E8ches pour parcourir les valeurs, Entr\u00E9e pour \u00E9pingler, \u00C9chap pour quitter.\",\n\troleDescription: \"graphique\",\n\tlegend: \"L\u00E9gende\",\n\tseries: \"S\u00E9rie\",\n\tresetZoom: \"R\u00E9initialiser le zoom\",\n\tshowing: (from, to) => `Affich\u00E9 : ${from} \u2013 ${to}`,\n\tzoomHint:\n\t\t\" + et \u2212 pour zoomer, Maj et fl\u00E8ches pour se d\u00E9placer, 0 pour revenir.\",\n\tbrushStart: \"D\u00E9but de la s\u00E9lection\",\n\tbrushEnd: \"Fin de la s\u00E9lection\",\n\tselected: (from, to) => `S\u00E9lection : ${from} \u2013 ${to}`,\n\tdataTable: (label) => `Donn\u00E9es : ${label}`,\n};\n\nconst ENGLISH: ChartMessages = {\n\tkeyboardHint:\n\t\t\"Arrow keys to move through the values, Enter to pin, Escape to leave.\",\n\troleDescription: \"chart\",\n\tlegend: \"Legend\",\n\tseries: \"Series\",\n\tresetZoom: \"Reset zoom\",\n\tshowing: (from, to) => `Showing ${from} \u2013 ${to}`,\n\tzoomHint: \" + and \u2212 to zoom, Shift and the arrows to pan, 0 to reset.\",\n\tbrushStart: \"Selection start\",\n\tbrushEnd: \"Selection end\",\n\tselected: (from, to) => `Selected ${from} \u2013 ${to}`,\n\tdataTable: (label) => `Data: ${label}`,\n};\n\nexport function messagesFor(locale: string): ChartMessages {\n\treturn locale.toLowerCase().startsWith(\"fr\") ? FRENCH : ENGLISH;\n}\n"],
5
+ "mappings": "AAeA,MAAM,SAAwB;AAAA,EAC7B,cACC;AAAA,EACD,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS,CAAC,MAAM,OAAO,gBAAa,IAAI,WAAM,EAAE;AAAA,EAChD,UACC;AAAA,EACD,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU,CAAC,MAAM,OAAO,kBAAe,IAAI,WAAM,EAAE;AAAA,EACnD,WAAW,CAAC,UAAU,gBAAa,KAAK;AACzC;AAEA,MAAM,UAAyB;AAAA,EAC9B,cACC;AAAA,EACD,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS,CAAC,MAAM,OAAO,WAAW,IAAI,WAAM,EAAE;AAAA,EAC9C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU,CAAC,MAAM,OAAO,YAAY,IAAI,WAAM,EAAE;AAAA,EAChD,WAAW,CAAC,UAAU,SAAS,KAAK;AACrC;AAEO,SAAS,YAAY,QAA+B;AAC1D,SAAO,OAAO,YAAY,EAAE,WAAW,IAAI,IAAI,SAAS;AACzD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ import type * as React from "react";
2
+ import type { ChartScene } from "../core/types.js";
3
+ /**
4
+ * What draws the scene. The SVG renderer is the default; `@voila.dev/chart/canvas`
5
+ * exports one that paints the same scene onto a canvas, for thousands of marks.
6
+ * Either way the focus ring, tooltip, legend and data table are the same.
7
+ */
8
+ export interface ChartRendererProps {
9
+ readonly scene: ChartScene;
10
+ /** Unique per chart, for clip-path ids. */
11
+ readonly chartId: string;
12
+ }
13
+ export type ChartRenderer = React.ComponentType<ChartRendererProps>;
14
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/react/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ import type * as React from "react";
2
+ /** Present to assistive tech, invisible on screen, and never wider than one pixel. */
3
+ export declare const SR_ONLY: React.CSSProperties;
4
+ //# sourceMappingURL=sr-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sr-only.d.ts","sourceRoot":"","sources":["../../src/react/sr-only.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,sFAAsF;AACtF,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,aAU3B,CAAC"}
@@ -0,0 +1,15 @@
1
+ const SR_ONLY = {
2
+ position: "absolute",
3
+ width: 1,
4
+ height: 1,
5
+ padding: 0,
6
+ margin: -1,
7
+ overflow: "hidden",
8
+ clip: "rect(0, 0, 0, 0)",
9
+ whiteSpace: "nowrap",
10
+ border: 0
11
+ };
12
+ export {
13
+ SR_ONLY
14
+ };
15
+ //# sourceMappingURL=sr-only.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/sr-only.ts"],
4
+ "sourcesContent": ["import type * as React from \"react\";\n\n/** Present to assistive tech, invisible on screen, and never wider than one pixel. */\nexport const SR_ONLY: React.CSSProperties = {\n\tposition: \"absolute\",\n\twidth: 1,\n\theight: 1,\n\tpadding: 0,\n\tmargin: -1,\n\toverflow: \"hidden\",\n\tclip: \"rect(0, 0, 0, 0)\",\n\twhiteSpace: \"nowrap\",\n\tborder: 0,\n};\n"],
5
+ "mappings": "AAGO,MAAM,UAA+B;AAAA,EAC3C,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ import type { ChartRendererProps } from "./renderer.js";
2
+ /** The default renderer: the scene as inline SVG, server-renderable and crisp at any zoom. */
3
+ export declare function SvgRenderer({ scene, chartId }: ChartRendererProps): import("react").JSX.Element;
4
+ //# sourceMappingURL=svg-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-renderer.d.ts","sourceRoot":"","sources":["../../src/react/svg-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,kBAAkB,+BAajE"}
@@ -0,0 +1,20 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { SvgSceneNodes } from "./svg-scene.js";
3
+ function SvgRenderer({ scene, chartId }) {
4
+ return /* @__PURE__ */ jsx(
5
+ "svg",
6
+ {
7
+ "data-slot": "chart-svg",
8
+ "aria-hidden": "true",
9
+ width: scene.width,
10
+ height: scene.height,
11
+ viewBox: `0 0 ${scene.width} ${scene.height}`,
12
+ style: { position: "absolute", inset: 0, overflow: "visible" },
13
+ children: /* @__PURE__ */ jsx(SvgSceneNodes, { scene, clipPrefix: chartId })
14
+ }
15
+ );
16
+ }
17
+ export {
18
+ SvgRenderer
19
+ };
20
+ //# sourceMappingURL=svg-renderer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/svg-renderer.tsx"],
4
+ "sourcesContent": ["import type { ChartRendererProps } from \"#/react/renderer.ts\";\nimport { SvgSceneNodes } from \"#/react/svg-scene.tsx\";\n\n/** The default renderer: the scene as inline SVG, server-renderable and crisp at any zoom. */\nexport function SvgRenderer({ scene, chartId }: ChartRendererProps) {\n\treturn (\n\t\t<svg\n\t\t\tdata-slot=\"chart-svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\twidth={scene.width}\n\t\t\theight={scene.height}\n\t\t\tviewBox={`0 0 ${scene.width} ${scene.height}`}\n\t\t\tstyle={{ position: \"absolute\", inset: 0, overflow: \"visible\" }}\n\t\t>\n\t\t\t<SvgSceneNodes scene={scene} clipPrefix={chartId} />\n\t\t</svg>\n\t);\n}\n"],
5
+ "mappings": "AAcG;AAbH,SAAS,qBAAqB;AAGvB,SAAS,YAAY,EAAE,OAAO,QAAQ,GAAuB;AACnE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,eAAY;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,SAAS,OAAO,MAAM,KAAK,IAAI,MAAM,MAAM;AAAA,MAC3C,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,UAAU,UAAU;AAAA,MAE7D,8BAAC,iBAAc,OAAc,YAAY,SAAS;AAAA;AAAA,EACnD;AAEF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,8 @@
1
+ import type * as React from "react";
2
+ import type { ChartScene } from "../core/types.js";
3
+ /** The scene's nodes as SVG elements, keyed so React reconciles a data update in place. */
4
+ export declare function SvgSceneNodes({ scene, clipPrefix, }: {
5
+ scene: ChartScene;
6
+ clipPrefix: string;
7
+ }): React.JSX.Element[];
8
+ //# sourceMappingURL=svg-scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-scene.d.ts","sourceRoot":"","sources":["../../src/react/svg-scene.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAEX,UAAU,EAGV,MAAM,iBAAiB,CAAC;AA+HzB,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,UAAU,GACV,EAAE;IACF,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB,uBAIA"}
@@ -0,0 +1,121 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { roundedBarPath } from "../core/paths.js";
3
+ const BASELINE = {
4
+ top: "hanging",
5
+ middle: "central",
6
+ bottom: "text-after-edge",
7
+ alphabetic: "alphabetic"
8
+ };
9
+ function paintProps(paint) {
10
+ return {
11
+ fill: paint.fill ?? "none",
12
+ stroke: paint.stroke,
13
+ strokeWidth: paint.strokeWidth,
14
+ strokeDasharray: paint.strokeDasharray,
15
+ strokeLinecap: paint.strokeLinecap,
16
+ strokeLinejoin: paint.strokeLinejoin,
17
+ opacity: paint.opacity,
18
+ fillOpacity: paint.fillOpacity,
19
+ strokeOpacity: paint.strokeOpacity
20
+ };
21
+ }
22
+ function SceneElement({
23
+ node,
24
+ clipPrefix
25
+ }) {
26
+ const data = { "data-role": node.role, "data-series": node.series };
27
+ switch (node.kind) {
28
+ case "group": {
29
+ const clipId = node.clip ? `${clipPrefix}-${node.key}` : void 0;
30
+ return /* @__PURE__ */ jsxs(
31
+ "g",
32
+ {
33
+ ...data,
34
+ transform: node.translate ? `translate(${node.translate.x} ${node.translate.y})` : void 0,
35
+ clipPath: clipId ? `url(#${clipId})` : void 0,
36
+ children: [
37
+ node.clip && clipId ? /* @__PURE__ */ jsx("clipPath", { id: clipId, children: /* @__PURE__ */ jsx("rect", { ...node.clip }) }) : null,
38
+ node.children.map((child) => /* @__PURE__ */ jsx(
39
+ SceneElement,
40
+ {
41
+ node: child,
42
+ clipPrefix
43
+ },
44
+ child.key
45
+ ))
46
+ ]
47
+ }
48
+ );
49
+ }
50
+ case "rect":
51
+ return node.corners ? /* @__PURE__ */ jsx(
52
+ "path",
53
+ {
54
+ ...data,
55
+ d: roundedBarPath({ ...node, radius: node.corners }),
56
+ ...paintProps(node.paint)
57
+ }
58
+ ) : /* @__PURE__ */ jsx(
59
+ "rect",
60
+ {
61
+ ...data,
62
+ x: node.x,
63
+ y: node.y,
64
+ width: node.width,
65
+ height: node.height,
66
+ ...paintProps(node.paint)
67
+ }
68
+ );
69
+ case "path":
70
+ return /* @__PURE__ */ jsx("path", { ...data, d: node.d, ...paintProps(node.paint) });
71
+ case "circle":
72
+ return /* @__PURE__ */ jsx(
73
+ "circle",
74
+ {
75
+ ...data,
76
+ cx: node.cx,
77
+ cy: node.cy,
78
+ r: node.r,
79
+ ...paintProps(node.paint)
80
+ }
81
+ );
82
+ case "line":
83
+ return /* @__PURE__ */ jsx(
84
+ "line",
85
+ {
86
+ ...data,
87
+ x1: node.x1,
88
+ y1: node.y1,
89
+ x2: node.x2,
90
+ y2: node.y2,
91
+ ...paintProps(node.paint)
92
+ }
93
+ );
94
+ case "text":
95
+ return /* @__PURE__ */ jsx(
96
+ "text",
97
+ {
98
+ ...data,
99
+ x: node.x,
100
+ y: node.y,
101
+ transform: node.rotate ? `rotate(${node.rotate} ${node.x} ${node.y})` : void 0,
102
+ fontSize: node.paint.fontSize,
103
+ fontWeight: node.paint.fontWeight,
104
+ textAnchor: node.paint.textAnchor,
105
+ dominantBaseline: node.paint.baseline ? BASELINE[node.paint.baseline] : void 0,
106
+ ...paintProps(node.paint),
107
+ children: node.text
108
+ }
109
+ );
110
+ }
111
+ }
112
+ function SvgSceneNodes({
113
+ scene,
114
+ clipPrefix
115
+ }) {
116
+ return scene.nodes.map((node) => /* @__PURE__ */ jsx(SceneElement, { node, clipPrefix }, node.key));
117
+ }
118
+ export {
119
+ SvgSceneNodes
120
+ };
121
+ //# sourceMappingURL=svg-scene.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/svg-scene.tsx"],
4
+ "sourcesContent": ["import type * as React from \"react\";\nimport { roundedBarPath } from \"#/core/paths.ts\";\nimport type {\n\tChartPaint,\n\tChartScene,\n\tChartTextPaint,\n\tSceneNode,\n} from \"#/core/types.ts\";\n\nconst BASELINE: Record<\n\tNonNullable<ChartTextPaint[\"baseline\"]>,\n\tReact.SVGAttributes<SVGTextElement>[\"dominantBaseline\"]\n> = {\n\ttop: \"hanging\",\n\tmiddle: \"central\",\n\tbottom: \"text-after-edge\",\n\talphabetic: \"alphabetic\",\n};\n\nfunction paintProps(paint: ChartPaint): React.SVGAttributes<SVGElement> {\n\treturn {\n\t\tfill: paint.fill ?? \"none\",\n\t\tstroke: paint.stroke,\n\t\tstrokeWidth: paint.strokeWidth,\n\t\tstrokeDasharray: paint.strokeDasharray,\n\t\tstrokeLinecap: paint.strokeLinecap,\n\t\tstrokeLinejoin: paint.strokeLinejoin,\n\t\topacity: paint.opacity,\n\t\tfillOpacity: paint.fillOpacity,\n\t\tstrokeOpacity: paint.strokeOpacity,\n\t};\n}\n\nfunction SceneElement({\n\tnode,\n\tclipPrefix,\n}: {\n\tnode: SceneNode;\n\tclipPrefix: string;\n}) {\n\tconst data = { \"data-role\": node.role, \"data-series\": node.series };\n\tswitch (node.kind) {\n\t\tcase \"group\": {\n\t\t\tconst clipId = node.clip ? `${clipPrefix}-${node.key}` : undefined;\n\t\t\treturn (\n\t\t\t\t<g\n\t\t\t\t\t{...data}\n\t\t\t\t\ttransform={\n\t\t\t\t\t\tnode.translate\n\t\t\t\t\t\t\t? `translate(${node.translate.x} ${node.translate.y})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tclipPath={clipId ? `url(#${clipId})` : undefined}\n\t\t\t\t>\n\t\t\t\t\t{node.clip && clipId ? (\n\t\t\t\t\t\t<clipPath id={clipId}>\n\t\t\t\t\t\t\t<rect {...node.clip} />\n\t\t\t\t\t\t</clipPath>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{node.children.map((child) => (\n\t\t\t\t\t\t<SceneElement\n\t\t\t\t\t\t\tkey={child.key}\n\t\t\t\t\t\t\tnode={child}\n\t\t\t\t\t\t\tclipPrefix={clipPrefix}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</g>\n\t\t\t);\n\t\t}\n\t\tcase \"rect\":\n\t\t\treturn node.corners ? (\n\t\t\t\t<path\n\t\t\t\t\t{...data}\n\t\t\t\t\td={roundedBarPath({ ...node, radius: node.corners })}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<rect\n\t\t\t\t\t{...data}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\twidth={node.width}\n\t\t\t\t\theight={node.height}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"path\":\n\t\t\treturn <path {...data} d={node.d} {...paintProps(node.paint)} />;\n\t\tcase \"circle\":\n\t\t\treturn (\n\t\t\t\t<circle\n\t\t\t\t\t{...data}\n\t\t\t\t\tcx={node.cx}\n\t\t\t\t\tcy={node.cy}\n\t\t\t\t\tr={node.r}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"line\":\n\t\t\treturn (\n\t\t\t\t<line\n\t\t\t\t\t{...data}\n\t\t\t\t\tx1={node.x1}\n\t\t\t\t\ty1={node.y1}\n\t\t\t\t\tx2={node.x2}\n\t\t\t\t\ty2={node.y2}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"text\":\n\t\t\treturn (\n\t\t\t\t<text\n\t\t\t\t\t{...data}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\ttransform={\n\t\t\t\t\t\tnode.rotate\n\t\t\t\t\t\t\t? `rotate(${node.rotate} ${node.x} ${node.y})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tfontSize={node.paint.fontSize}\n\t\t\t\t\tfontWeight={node.paint.fontWeight}\n\t\t\t\t\ttextAnchor={node.paint.textAnchor}\n\t\t\t\t\tdominantBaseline={\n\t\t\t\t\t\tnode.paint.baseline ? BASELINE[node.paint.baseline] : undefined\n\t\t\t\t\t}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t>\n\t\t\t\t\t{node.text}\n\t\t\t\t</text>\n\t\t\t);\n\t}\n}\n\n/** The scene's nodes as SVG elements, keyed so React reconciles a data update in place. */\nexport function SvgSceneNodes({\n\tscene,\n\tclipPrefix,\n}: {\n\tscene: ChartScene;\n\tclipPrefix: string;\n}) {\n\treturn scene.nodes.map((node) => (\n\t\t<SceneElement key={node.key} node={node} clipPrefix={clipPrefix} />\n\t));\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,10 @@
1
+ import type { ChartScene } from "../core/types.js";
2
+ /**
3
+ * The scene to draw this frame. A data change (`trigger` changed: a new
4
+ * definition, a series toggled) tweens from what is on screen to the new
5
+ * scene; a resize snaps, since watching bars slide while a window is dragged
6
+ * helps no one. Reduced motion always snaps. An update that lands mid-tween
7
+ * starts from the frame already painted, so nothing jumps.
8
+ */
9
+ export declare function useAnimatedScene(scene: ChartScene, trigger: unknown, duration: number): ChartScene;
10
+ //# sourceMappingURL=use-animated-scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-animated-scene.d.ts","sourceRoot":"","sources":["../../src/react/use-animated-scene.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AASlD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACd,UAAU,CAkCZ"}
@@ -0,0 +1,41 @@
1
+ import * as React from "react";
2
+ import { easeOutCubic, tweenScene } from "../core/motion/tween.js";
3
+ function prefersReducedMotion() {
4
+ return typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches === true;
5
+ }
6
+ function useAnimatedScene(scene, trigger, duration) {
7
+ const [shown, setShown] = React.useState(scene);
8
+ const shownRef = React.useRef(scene);
9
+ const triggerRef = React.useRef(trigger);
10
+ React.useLayoutEffect(() => {
11
+ const changed = triggerRef.current !== trigger;
12
+ triggerRef.current = trigger;
13
+ if (!changed || duration <= 0 || prefersReducedMotion()) {
14
+ shownRef.current = scene;
15
+ setShown(scene);
16
+ return;
17
+ }
18
+ const from = shownRef.current;
19
+ const first = tweenScene(from, scene, 0);
20
+ shownRef.current = first;
21
+ setShown(first);
22
+ const start = performance.now();
23
+ let frame = 0;
24
+ function step(now) {
25
+ const t = Math.min(1, (now - start) / duration);
26
+ const next = tweenScene(from, scene, easeOutCubic(t));
27
+ shownRef.current = next;
28
+ setShown(next);
29
+ if (t < 1) {
30
+ frame = requestAnimationFrame(step);
31
+ }
32
+ }
33
+ frame = requestAnimationFrame(step);
34
+ return () => cancelAnimationFrame(frame);
35
+ }, [scene, trigger, duration]);
36
+ return shown;
37
+ }
38
+ export {
39
+ useAnimatedScene
40
+ };
41
+ //# sourceMappingURL=use-animated-scene.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/use-animated-scene.ts"],
4
+ "sourcesContent": ["import * as React from \"react\";\nimport { easeOutCubic, tweenScene } from \"#/core/motion/tween.ts\";\nimport type { ChartScene } from \"#/core/types.ts\";\n\nfunction prefersReducedMotion(): boolean {\n\treturn (\n\t\ttypeof window !== \"undefined\" &&\n\t\twindow.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches === true\n\t);\n}\n\n/**\n * The scene to draw this frame. A data change (`trigger` changed: a new\n * definition, a series toggled) tweens from what is on screen to the new\n * scene; a resize snaps, since watching bars slide while a window is dragged\n * helps no one. Reduced motion always snaps. An update that lands mid-tween\n * starts from the frame already painted, so nothing jumps.\n */\nexport function useAnimatedScene(\n\tscene: ChartScene,\n\ttrigger: unknown,\n\tduration: number,\n): ChartScene {\n\tconst [shown, setShown] = React.useState(scene);\n\tconst shownRef = React.useRef(scene);\n\tconst triggerRef = React.useRef(trigger);\n\n\tReact.useLayoutEffect(() => {\n\t\tconst changed = triggerRef.current !== trigger;\n\t\ttriggerRef.current = trigger;\n\t\tif (!changed || duration <= 0 || prefersReducedMotion()) {\n\t\t\tshownRef.current = scene;\n\t\t\tsetShown(scene);\n\t\t\treturn;\n\t\t}\n\t\tconst from = shownRef.current;\n\t\t// Frame zero now, before paint: nodes that left are gone at once.\n\t\tconst first = tweenScene(from, scene, 0);\n\t\tshownRef.current = first;\n\t\tsetShown(first);\n\t\tconst start = performance.now();\n\t\tlet frame = 0;\n\t\tfunction step(now: number) {\n\t\t\tconst t = Math.min(1, (now - start) / duration);\n\t\t\tconst next = tweenScene(from, scene, easeOutCubic(t));\n\t\t\tshownRef.current = next;\n\t\t\tsetShown(next);\n\t\t\tif (t < 1) {\n\t\t\t\tframe = requestAnimationFrame(step);\n\t\t\t}\n\t\t}\n\t\tframe = requestAnimationFrame(step);\n\t\treturn () => cancelAnimationFrame(frame);\n\t}, [scene, trigger, duration]);\n\n\treturn shown;\n}\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;AACvB,SAAS,cAAc,kBAAkB;AAGzC,SAAS,uBAAgC;AACxC,SACC,OAAO,WAAW,eAClB,OAAO,aAAa,kCAAkC,EAAE,YAAY;AAEtE;AASO,SAAS,iBACf,OACA,SACA,UACa;AACb,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,KAAK;AAC9C,QAAM,WAAW,MAAM,OAAO,KAAK;AACnC,QAAM,aAAa,MAAM,OAAO,OAAO;AAEvC,QAAM,gBAAgB,MAAM;AAC3B,UAAM,UAAU,WAAW,YAAY;AACvC,eAAW,UAAU;AACrB,QAAI,CAAC,WAAW,YAAY,KAAK,qBAAqB,GAAG;AACxD,eAAS,UAAU;AACnB,eAAS,KAAK;AACd;AAAA,IACD;AACA,UAAM,OAAO,SAAS;AAEtB,UAAM,QAAQ,WAAW,MAAM,OAAO,CAAC;AACvC,aAAS,UAAU;AACnB,aAAS,KAAK;AACd,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI,QAAQ;AACZ,aAAS,KAAK,KAAa;AAC1B,YAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,QAAQ;AAC9C,YAAM,OAAO,WAAW,MAAM,OAAO,aAAa,CAAC,CAAC;AACpD,eAAS,UAAU;AACnB,eAAS,IAAI;AACb,UAAI,IAAI,GAAG;AACV,gBAAQ,sBAAsB,IAAI;AAAA,MACnC;AAAA,IACD;AACA,YAAQ,sBAAsB,IAAI;AAClC,WAAO,MAAM,qBAAqB,KAAK;AAAA,EACxC,GAAG,CAAC,OAAO,SAAS,QAAQ,CAAC;AAE7B,SAAO;AACR;",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
1
+ import * as React from "react";
2
+ import type { ChartFocusStop, findNearest } from "../core/nearest.js";
3
+ import type { ChartFocusOrder, ChartPoint } from "../core/types.js";
4
+ export interface ActiveFocus {
5
+ readonly stop: ChartFocusStop;
6
+ readonly point: ChartPoint;
7
+ readonly source: "pointer" | "keyboard";
8
+ readonly pinned: boolean;
9
+ }
10
+ interface Options {
11
+ readonly stops: ReadonlyArray<ChartFocusStop>;
12
+ readonly order: ChartFocusOrder;
13
+ readonly hitTest: (x: number, y: number) => ReturnType<typeof findNearest>;
14
+ readonly onFocusChange?: (point: ChartPoint | null) => void;
15
+ readonly onSelect?: (point: ChartPoint | null) => void;
16
+ }
17
+ export declare function useChartFocus({ stops, order, hitTest, onFocusChange, onSelect, }: Options): {
18
+ active: ActiveFocus | null;
19
+ handlers: {
20
+ onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void;
21
+ onPointerMove: (event: React.PointerEvent<HTMLElement>) => void;
22
+ onPointerLeave: () => void;
23
+ onClick: (event: React.MouseEvent<HTMLElement>) => void;
24
+ onFocus: (event: React.FocusEvent<HTMLElement>) => void;
25
+ onBlur: () => void;
26
+ };
27
+ };
28
+ export {};
29
+ //# sourceMappingURL=use-chart-focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chart-focus.d.ts","sourceRoot":"","sources":["../../src/react/use-chart-focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAcnE,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,OAAO;IAChB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAC3E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;CACvD;AAiCD,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,OAAO,EACP,aAAa,EACb,QAAQ,GACR,EAAE,OAAO;;;2BAsCiB,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC;+BAqE5B,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC;;yBA4BrC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;yBAoB7B,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;;;EAqBrD"}