@vielzeug/prism 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +83 -0
  2. package/dist/_dev.cjs +2 -0
  3. package/dist/_dev.cjs.map +1 -0
  4. package/dist/_dev.d.ts +2 -0
  5. package/dist/_dev.d.ts.map +1 -0
  6. package/dist/_dev.js +12 -0
  7. package/dist/_dev.js.map +1 -0
  8. package/dist/animation/easing.cjs +2 -0
  9. package/dist/animation/easing.cjs.map +1 -0
  10. package/dist/animation/easing.d.ts +4 -0
  11. package/dist/animation/easing.d.ts.map +1 -0
  12. package/dist/animation/easing.js +14 -0
  13. package/dist/animation/easing.js.map +1 -0
  14. package/dist/animation/index.d.ts +6 -0
  15. package/dist/animation/index.d.ts.map +1 -0
  16. package/dist/animation/transition.cjs +2 -0
  17. package/dist/animation/transition.cjs.map +1 -0
  18. package/dist/animation/transition.d.ts +15 -0
  19. package/dist/animation/transition.d.ts.map +1 -0
  20. package/dist/animation/transition.js +28 -0
  21. package/dist/animation/transition.js.map +1 -0
  22. package/dist/animation/tween.cjs +2 -0
  23. package/dist/animation/tween.cjs.map +1 -0
  24. package/dist/animation/tween.d.ts +3 -0
  25. package/dist/animation/tween.d.ts.map +1 -0
  26. package/dist/animation/tween.js +8 -0
  27. package/dist/animation/tween.js.map +1 -0
  28. package/dist/axes/axis.cjs +2 -0
  29. package/dist/axes/axis.cjs.map +1 -0
  30. package/dist/axes/axis.d.ts +15 -0
  31. package/dist/axes/axis.d.ts.map +1 -0
  32. package/dist/axes/axis.js +60 -0
  33. package/dist/axes/axis.js.map +1 -0
  34. package/dist/axes/grid.cjs +2 -0
  35. package/dist/axes/grid.cjs.map +1 -0
  36. package/dist/axes/grid.d.ts +4 -0
  37. package/dist/axes/grid.d.ts.map +1 -0
  38. package/dist/axes/grid.js +30 -0
  39. package/dist/axes/grid.js.map +1 -0
  40. package/dist/axes/index.d.ts +3 -0
  41. package/dist/axes/index.d.ts.map +1 -0
  42. package/dist/axes/scale-utils.cjs +2 -0
  43. package/dist/axes/scale-utils.cjs.map +1 -0
  44. package/dist/axes/scale-utils.d.ts +17 -0
  45. package/dist/axes/scale-utils.d.ts.map +1 -0
  46. package/dist/axes/scale-utils.js +11 -0
  47. package/dist/axes/scale-utils.js.map +1 -0
  48. package/dist/axes/types.d.ts +2 -0
  49. package/dist/axes/types.d.ts.map +1 -0
  50. package/dist/charts/area/area-chart.cjs +2 -0
  51. package/dist/charts/area/area-chart.cjs.map +1 -0
  52. package/dist/charts/area/area-chart.d.ts +3 -0
  53. package/dist/charts/area/area-chart.d.ts.map +1 -0
  54. package/dist/charts/area/area-chart.js +58 -0
  55. package/dist/charts/area/area-chart.js.map +1 -0
  56. package/dist/charts/area/area-renderer.cjs +2 -0
  57. package/dist/charts/area/area-renderer.cjs.map +1 -0
  58. package/dist/charts/area/area-renderer.d.ts +14 -0
  59. package/dist/charts/area/area-renderer.d.ts.map +1 -0
  60. package/dist/charts/area/area-renderer.js +73 -0
  61. package/dist/charts/area/area-renderer.js.map +1 -0
  62. package/dist/charts/area/area-types.d.ts +2 -0
  63. package/dist/charts/area/area-types.d.ts.map +1 -0
  64. package/dist/charts/area/index.d.ts +2 -0
  65. package/dist/charts/area/index.d.ts.map +1 -0
  66. package/dist/charts/bar/bar-chart.cjs +2 -0
  67. package/dist/charts/bar/bar-chart.cjs.map +1 -0
  68. package/dist/charts/bar/bar-chart.d.ts +3 -0
  69. package/dist/charts/bar/bar-chart.d.ts.map +1 -0
  70. package/dist/charts/bar/bar-chart.js +151 -0
  71. package/dist/charts/bar/bar-chart.js.map +1 -0
  72. package/dist/charts/bar/bar-hit-test.cjs +2 -0
  73. package/dist/charts/bar/bar-hit-test.cjs.map +1 -0
  74. package/dist/charts/bar/bar-hit-test.d.ts +12 -0
  75. package/dist/charts/bar/bar-hit-test.d.ts.map +1 -0
  76. package/dist/charts/bar/bar-hit-test.js +29 -0
  77. package/dist/charts/bar/bar-hit-test.js.map +1 -0
  78. package/dist/charts/bar/bar-renderer.cjs +2 -0
  79. package/dist/charts/bar/bar-renderer.cjs.map +1 -0
  80. package/dist/charts/bar/bar-renderer.d.ts +19 -0
  81. package/dist/charts/bar/bar-renderer.d.ts.map +1 -0
  82. package/dist/charts/bar/bar-renderer.js +107 -0
  83. package/dist/charts/bar/bar-renderer.js.map +1 -0
  84. package/dist/charts/bar/bar-scale-context.d.ts +11 -0
  85. package/dist/charts/bar/bar-scale-context.d.ts.map +1 -0
  86. package/dist/charts/bar/bar-types.d.ts +2 -0
  87. package/dist/charts/bar/bar-types.d.ts.map +1 -0
  88. package/dist/charts/bar/index.d.ts +2 -0
  89. package/dist/charts/bar/index.d.ts.map +1 -0
  90. package/dist/charts/index.d.ts +6 -0
  91. package/dist/charts/index.d.ts.map +1 -0
  92. package/dist/charts/line/index.d.ts +2 -0
  93. package/dist/charts/line/index.d.ts.map +1 -0
  94. package/dist/charts/line/line-chart.cjs +2 -0
  95. package/dist/charts/line/line-chart.cjs.map +1 -0
  96. package/dist/charts/line/line-chart.d.ts +3 -0
  97. package/dist/charts/line/line-chart.d.ts.map +1 -0
  98. package/dist/charts/line/line-chart.js +59 -0
  99. package/dist/charts/line/line-chart.js.map +1 -0
  100. package/dist/charts/line/line-renderer.cjs +2 -0
  101. package/dist/charts/line/line-renderer.cjs.map +1 -0
  102. package/dist/charts/line/line-renderer.d.ts +15 -0
  103. package/dist/charts/line/line-renderer.d.ts.map +1 -0
  104. package/dist/charts/line/line-renderer.js +100 -0
  105. package/dist/charts/line/line-renderer.js.map +1 -0
  106. package/dist/charts/line/line-types.d.ts +2 -0
  107. package/dist/charts/line/line-types.d.ts.map +1 -0
  108. package/dist/charts/pie/index.d.ts +2 -0
  109. package/dist/charts/pie/index.d.ts.map +1 -0
  110. package/dist/charts/pie/pie-chart.cjs +2 -0
  111. package/dist/charts/pie/pie-chart.cjs.map +1 -0
  112. package/dist/charts/pie/pie-chart.d.ts +3 -0
  113. package/dist/charts/pie/pie-chart.d.ts.map +1 -0
  114. package/dist/charts/pie/pie-chart.js +156 -0
  115. package/dist/charts/pie/pie-chart.js.map +1 -0
  116. package/dist/charts/pie/pie-renderer.cjs +2 -0
  117. package/dist/charts/pie/pie-renderer.cjs.map +1 -0
  118. package/dist/charts/pie/pie-renderer.d.ts +23 -0
  119. package/dist/charts/pie/pie-renderer.d.ts.map +1 -0
  120. package/dist/charts/pie/pie-renderer.js +77 -0
  121. package/dist/charts/pie/pie-renderer.js.map +1 -0
  122. package/dist/charts/sparkline/index.d.ts +2 -0
  123. package/dist/charts/sparkline/index.d.ts.map +1 -0
  124. package/dist/charts/sparkline/sparkline.cjs +2 -0
  125. package/dist/charts/sparkline/sparkline.cjs.map +1 -0
  126. package/dist/charts/sparkline/sparkline.d.ts +3 -0
  127. package/dist/charts/sparkline/sparkline.d.ts.map +1 -0
  128. package/dist/charts/sparkline/sparkline.js +187 -0
  129. package/dist/charts/sparkline/sparkline.js.map +1 -0
  130. package/dist/core/cartesian-scales.cjs +2 -0
  131. package/dist/core/cartesian-scales.cjs.map +1 -0
  132. package/dist/core/cartesian-scales.d.ts +4 -0
  133. package/dist/core/cartesian-scales.d.ts.map +1 -0
  134. package/dist/core/cartesian-scales.js +54 -0
  135. package/dist/core/cartesian-scales.js.map +1 -0
  136. package/dist/core/chart-base.cjs +2 -0
  137. package/dist/core/chart-base.cjs.map +1 -0
  138. package/dist/core/chart-base.d.ts +14 -0
  139. package/dist/core/chart-base.d.ts.map +1 -0
  140. package/dist/core/chart-base.js +60 -0
  141. package/dist/core/chart-base.js.map +1 -0
  142. package/dist/core/chart-scaffold.cjs +2 -0
  143. package/dist/core/chart-scaffold.cjs.map +1 -0
  144. package/dist/core/chart-scaffold.d.ts +54 -0
  145. package/dist/core/chart-scaffold.d.ts.map +1 -0
  146. package/dist/core/chart-scaffold.js +104 -0
  147. package/dist/core/chart-scaffold.js.map +1 -0
  148. package/dist/core/index.d.ts +7 -0
  149. package/dist/core/index.d.ts.map +1 -0
  150. package/dist/core/layout.cjs +2 -0
  151. package/dist/core/layout.cjs.map +1 -0
  152. package/dist/core/layout.d.ts +7 -0
  153. package/dist/core/layout.d.ts.map +1 -0
  154. package/dist/core/layout.js +23 -0
  155. package/dist/core/layout.js.map +1 -0
  156. package/dist/core/responsive.cjs +2 -0
  157. package/dist/core/responsive.cjs.map +1 -0
  158. package/dist/core/responsive.d.ts +2 -0
  159. package/dist/core/responsive.d.ts.map +1 -0
  160. package/dist/core/responsive.js +20 -0
  161. package/dist/core/responsive.js.map +1 -0
  162. package/dist/devtools/index.d.ts +52 -0
  163. package/dist/devtools/index.d.ts.map +1 -0
  164. package/dist/devtools.cjs +2 -0
  165. package/dist/devtools.cjs.map +1 -0
  166. package/dist/devtools.js +19 -0
  167. package/dist/devtools.js.map +1 -0
  168. package/dist/errors.cjs +2 -0
  169. package/dist/errors.cjs.map +1 -0
  170. package/dist/errors.d.ts +16 -0
  171. package/dist/errors.d.ts.map +1 -0
  172. package/dist/errors.js +13 -0
  173. package/dist/errors.js.map +1 -0
  174. package/dist/index.cjs +1 -0
  175. package/dist/index.d.ts +19 -0
  176. package/dist/index.d.ts.map +1 -0
  177. package/dist/index.js +12 -0
  178. package/dist/interaction/crosshair.cjs +2 -0
  179. package/dist/interaction/crosshair.cjs.map +1 -0
  180. package/dist/interaction/crosshair.d.ts +13 -0
  181. package/dist/interaction/crosshair.d.ts.map +1 -0
  182. package/dist/interaction/crosshair.js +46 -0
  183. package/dist/interaction/crosshair.js.map +1 -0
  184. package/dist/interaction/events.cjs +2 -0
  185. package/dist/interaction/events.cjs.map +1 -0
  186. package/dist/interaction/events.d.ts +3 -0
  187. package/dist/interaction/events.d.ts.map +1 -0
  188. package/dist/interaction/events.js +12 -0
  189. package/dist/interaction/events.js.map +1 -0
  190. package/dist/interaction/hit-test.cjs +2 -0
  191. package/dist/interaction/hit-test.cjs.map +1 -0
  192. package/dist/interaction/hit-test.d.ts +3 -0
  193. package/dist/interaction/hit-test.d.ts.map +1 -0
  194. package/dist/interaction/hit-test.js +14 -0
  195. package/dist/interaction/hit-test.js.map +1 -0
  196. package/dist/interaction/index.d.ts +9 -0
  197. package/dist/interaction/index.d.ts.map +1 -0
  198. package/dist/interaction/legend.cjs +2 -0
  199. package/dist/interaction/legend.cjs.map +1 -0
  200. package/dist/interaction/legend.d.ts +12 -0
  201. package/dist/interaction/legend.d.ts.map +1 -0
  202. package/dist/interaction/legend.js +31 -0
  203. package/dist/interaction/legend.js.map +1 -0
  204. package/dist/interaction/series-interaction.cjs +2 -0
  205. package/dist/interaction/series-interaction.cjs.map +1 -0
  206. package/dist/interaction/series-interaction.d.ts +18 -0
  207. package/dist/interaction/series-interaction.d.ts.map +1 -0
  208. package/dist/interaction/series-interaction.js +58 -0
  209. package/dist/interaction/series-interaction.js.map +1 -0
  210. package/dist/interaction/tooltip.cjs +2 -0
  211. package/dist/interaction/tooltip.cjs.map +1 -0
  212. package/dist/interaction/tooltip.d.ts +10 -0
  213. package/dist/interaction/tooltip.d.ts.map +1 -0
  214. package/dist/interaction/tooltip.js +53 -0
  215. package/dist/interaction/tooltip.js.map +1 -0
  216. package/dist/prism.cjs +2 -0
  217. package/dist/prism.cjs.map +1 -0
  218. package/dist/prism.iife.js +2 -0
  219. package/dist/prism.iife.js.map +1 -0
  220. package/dist/prism.js +2 -0
  221. package/dist/prism.js.map +1 -0
  222. package/dist/scales/band.cjs +2 -0
  223. package/dist/scales/band.cjs.map +1 -0
  224. package/dist/scales/band.d.ts +3 -0
  225. package/dist/scales/band.d.ts.map +1 -0
  226. package/dist/scales/band.js +40 -0
  227. package/dist/scales/band.js.map +1 -0
  228. package/dist/scales/index.d.ts +4 -0
  229. package/dist/scales/index.d.ts.map +1 -0
  230. package/dist/scales/linear.cjs +2 -0
  231. package/dist/scales/linear.cjs.map +1 -0
  232. package/dist/scales/linear.d.ts +4 -0
  233. package/dist/scales/linear.d.ts.map +1 -0
  234. package/dist/scales/linear.js +44 -0
  235. package/dist/scales/linear.js.map +1 -0
  236. package/dist/scales/time.cjs +2 -0
  237. package/dist/scales/time.cjs.map +1 -0
  238. package/dist/scales/time.d.ts +4 -0
  239. package/dist/scales/time.d.ts.map +1 -0
  240. package/dist/scales/time.js +62 -0
  241. package/dist/scales/time.js.map +1 -0
  242. package/dist/scales/types.d.ts +19 -0
  243. package/dist/scales/types.d.ts.map +1 -0
  244. package/dist/svg/element.cjs +2 -0
  245. package/dist/svg/element.cjs.map +1 -0
  246. package/dist/svg/element.d.ts +4 -0
  247. package/dist/svg/element.d.ts.map +1 -0
  248. package/dist/svg/element.js +23 -0
  249. package/dist/svg/element.js.map +1 -0
  250. package/dist/svg/index.d.ts +5 -0
  251. package/dist/svg/index.d.ts.map +1 -0
  252. package/dist/svg/path.cjs +2 -0
  253. package/dist/svg/path.cjs.map +1 -0
  254. package/dist/svg/path.d.ts +9 -0
  255. package/dist/svg/path.d.ts.map +1 -0
  256. package/dist/svg/path.js +49 -0
  257. package/dist/svg/path.js.map +1 -0
  258. package/dist/svg/text.cjs +2 -0
  259. package/dist/svg/text.cjs.map +1 -0
  260. package/dist/svg/text.d.ts +7 -0
  261. package/dist/svg/text.d.ts.map +1 -0
  262. package/dist/svg/text.js +10 -0
  263. package/dist/svg/text.js.map +1 -0
  264. package/dist/theme/index.cjs +2 -0
  265. package/dist/theme/index.cjs.map +1 -0
  266. package/dist/theme/index.d.ts +6 -0
  267. package/dist/theme/index.d.ts.map +1 -0
  268. package/dist/theme/index.js +20 -0
  269. package/dist/theme/index.js.map +1 -0
  270. package/dist/theme/prism.css +342 -0
  271. package/dist/types.d.ts +204 -0
  272. package/dist/types.d.ts.map +1 -0
  273. package/package.json +79 -0
@@ -0,0 +1,58 @@
1
+ import { warn as e } from "../../_dev.js";
2
+ import { createSvgElement as t } from "../../svg/element.js";
3
+ import { renderAxis as n, resolveTickCount as r } from "../../axes/axis.js";
4
+ import { renderGrid as i } from "../../axes/grid.js";
5
+ import { buildXScale as a, buildYScale as o } from "../../core/cartesian-scales.js";
6
+ import { chartArea as s } from "../../core/layout.js";
7
+ import { clearCartesianDom as c, createChartScaffold as l } from "../../core/chart-scaffold.js";
8
+ import { createCrosshair as u } from "../../interaction/crosshair.js";
9
+ import { createSeriesInteraction as d } from "../../interaction/series-interaction.js";
10
+ import { seriesColor as f } from "../../theme/index.js";
11
+ import { computeAreaPoints as p, renderArea as m } from "./area-renderer.js";
12
+ import { isReactive as h } from "@vielzeug/ripple";
13
+ //#region src/charts/area/area-chart.ts
14
+ function g(g, _) {
15
+ let v = null;
16
+ return l(g, _, (l) => {
17
+ let { groups: g, legend: y, tooltip: b } = l, x = l.dimensions.value, S = s(x.width, x.height, x.margin), C = h(_.series) ? _.series.value : _.series, w = C.map((e) => h(e.data) ? e.data.value : e.data), T = w.flat().map((e) => e.key), E = w.flat().map((e) => e.value);
18
+ if (T.length === 0) {
19
+ e("createAreaChart: no data"), c(g, y, b, v);
20
+ return;
21
+ }
22
+ _.crosshair && !v && (v = u(l.chartArea, _.crosshair));
23
+ let D = a(T, S.width), O = o(E, S.height), k = O.map(0);
24
+ for (_.yAxis?.grid && i(g.grid, O, _.yAxis.grid, S.width, "horizontal", r(_.yAxis, S.height, "left")), _.xAxis?.grid && i(g.grid, D, _.xAxis.grid, S.height, "vertical", r(_.xAxis, S.width, "bottom")), _.xAxis && (g.xAxis.setAttribute("transform", `translate(0,${S.height})`), n(g.xAxis, D, _.xAxis, S.width, "bottom")), _.yAxis && n(g.yAxis, O, _.yAxis, S.height, "left"); g.series.children.length > C.length;) g.series.removeChild(g.series.lastChild);
25
+ let A = [];
26
+ for (let e = 0; e < C.length; e++) {
27
+ let n = C[e], r = g.series.children[e];
28
+ r || (r = t("g", { class: "prism-area-series" }), g.series.appendChild(r));
29
+ let i = p(w[e], D, O);
30
+ A.push(i), m(r, i, k, {
31
+ color: f(e, n.color),
32
+ curve: n.curve ?? "linear",
33
+ disposalSignal: l.disposalSignal,
34
+ fillOpacity: n.fillOpacity ?? .3,
35
+ showLine: n.showLine !== !1,
36
+ transition: _.transition
37
+ });
38
+ }
39
+ return y?.update(C.map((e, t) => ({
40
+ color: f(t, e.color),
41
+ name: e.name
42
+ }))), b?.hide(), d({
43
+ crosshair: v,
44
+ dims: () => l.dimensions.value,
45
+ getData: () => w,
46
+ getPoints: () => A,
47
+ getSeriesList: () => h(_.series) ? _.series.value : _.series,
48
+ onClick: _.onClick,
49
+ onHover: _.onHover,
50
+ svg: l.svg,
51
+ tooltip: b
52
+ });
53
+ });
54
+ }
55
+ //#endregion
56
+ export { g as createAreaChart };
57
+
58
+ //# sourceMappingURL=area-chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-chart.js","names":[],"sources":["../../../src/charts/area/area-chart.ts"],"sourcesContent":["import { isReactive } from '@vielzeug/ripple';\n\nimport type { Point } from '../../svg/path';\nimport type { AreaChartConfig, ChartHandle } from '../../types';\n\nimport { warn } from '../../_dev';\nimport { renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n\n return createChartScaffold(container, config, (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions.value;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const seriesList = isReactive(config.series) ? config.series.value : config.series;\n const allData = seriesList.map((s) => (isReactive(s.data) ? s.data.value : s.data));\n const allX = allData.flat().map((d) => d.key as Date | number);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\n warn('createAreaChart: no data');\n clearCartesianDom(groups, legend, tooltip, crosshair);\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX as (Date | number)[], area.width);\n const yScale = buildYScale(allY, area.height);\n const baselineY = yScale.map(0);\n\n if (config.yAxis?.grid) {\n renderGrid(\n groups.grid,\n yScale,\n config.yAxis.grid,\n area.width,\n 'horizontal',\n resolveTickCount(config.yAxis, area.height, 'left'),\n );\n }\n\n if (config.xAxis?.grid) {\n renderGrid(\n groups.grid,\n xScale,\n config.xAxis.grid,\n area.height,\n 'vertical',\n resolveTickCount(config.xAxis, area.width, 'bottom'),\n );\n }\n\n if (config.xAxis) {\n groups.xAxis.setAttribute('transform', `translate(0,${area.height})`);\n renderAxis(groups.xAxis, xScale, config.xAxis, area.width, 'bottom');\n }\n\n if (config.yAxis) renderAxis(groups.yAxis, yScale, config.yAxis, area.height, 'left');\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-area-series' });\n groups.series.appendChild(group);\n }\n\n const points = computeAreaPoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderArea(group, points, baselineY, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n fillOpacity: series.fillOpacity ?? 0.3,\n showLine: series.showLine !== false,\n transition: config.transition,\n });\n }\n\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n tooltip?.hide();\n\n return createSeriesInteraction({\n crosshair,\n dims: () => ctx.dimensions.value,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => (isReactive(config.series) ? config.series.value : config.series),\n onClick: config.onClick,\n onHover: config.onHover,\n svg: ctx.svg,\n tooltip,\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAiBA,SAAgB,EAAgB,GAAwB,GAAsC;CAC5F,IAAI,IAAuD;CAE3D,OAAO,EAAoB,GAAW,IAAS,MAAQ;EACrD,IAAM,EAAE,WAAQ,WAAQ,eAAY,GAC9B,IAAO,EAAI,WAAW,OACtB,IAAO,EAAU,EAAK,OAAO,EAAK,QAAQ,EAAK,MAAM,GACrD,IAAa,EAAW,EAAO,MAAM,IAAI,EAAO,OAAO,QAAQ,EAAO,QACtE,IAAU,EAAW,KAAK,MAAO,EAAW,EAAE,IAAI,IAAI,EAAE,KAAK,QAAQ,EAAE,IAAK,GAC5E,IAAO,EAAQ,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,GAAoB,GACvD,IAAO,EAAQ,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;EAE9C,IAAI,EAAK,WAAW,GAAG;GAErB,AADA,EAAK,0BAA0B,GAC/B,EAAkB,GAAQ,GAAQ,GAAS,CAAS;GAEpD;EACF;EAEA,AAAI,EAAO,aAAa,CAAC,MACvB,IAAY,EAAgB,EAAI,WAAW,EAAO,SAAS;EAG7D,IAAM,IAAS,EAAY,GAA2B,EAAK,KAAK,GAC1D,IAAS,EAAY,GAAM,EAAK,MAAM,GACtC,IAAY,EAAO,IAAI,CAAC;EA+B9B,KA7BI,EAAO,OAAO,QAChB,EACE,EAAO,MACP,GACA,EAAO,MAAM,MACb,EAAK,OACL,cACA,EAAiB,EAAO,OAAO,EAAK,QAAQ,MAAM,CACpD,GAGE,EAAO,OAAO,QAChB,EACE,EAAO,MACP,GACA,EAAO,MAAM,MACb,EAAK,QACL,YACA,EAAiB,EAAO,OAAO,EAAK,OAAO,QAAQ,CACrD,GAGE,EAAO,UACT,EAAO,MAAM,aAAa,aAAa,eAAe,EAAK,OAAO,EAAE,GACpE,EAAW,EAAO,OAAO,GAAQ,EAAO,OAAO,EAAK,OAAO,QAAQ,IAGjE,EAAO,SAAO,EAAW,EAAO,OAAO,GAAQ,EAAO,OAAO,EAAK,QAAQ,MAAM,GAE7E,EAAO,OAAO,SAAS,SAAS,EAAW,SAChD,EAAO,OAAO,YAAY,EAAO,OAAO,SAAU;EAGpD,IAAM,IAAuB,CAAC;EAE9B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAW,QAAQ,KAAK;GAC1C,IAAM,IAAS,EAAW,IACtB,IAAQ,EAAO,OAAO,SAAS;GAEnC,AAAK,MACH,IAAQ,EAAiB,KAAK,EAAE,OAAO,oBAAoB,CAAC,GAC5D,EAAO,OAAO,YAAY,CAAK;GAGjC,IAAM,IAAS,EAAkB,EAAQ,IAAI,GAAQ,CAAM;GAI3D,AAFA,EAAU,KAAK,CAAM,GAErB,EAAW,GAAO,GAAQ,GAAW;IACnC,OAAO,EAAY,GAAG,EAAO,KAAK;IAClC,OAAO,EAAO,SAAS;IACvB,gBAAgB,EAAI;IACpB,aAAa,EAAO,eAAe;IACnC,UAAU,EAAO,aAAa;IAC9B,YAAY,EAAO;GACrB,CAAC;EACH;EAKA,OAHA,GAAQ,OAAO,EAAW,KAAK,GAAG,OAAO;GAAE,OAAO,EAAY,GAAG,EAAE,KAAK;GAAG,MAAM,EAAE;EAAK,EAAE,CAAC,GAC3F,GAAS,KAAK,GAEP,EAAwB;GAC7B;GACA,YAAY,EAAI,WAAW;GAC3B,eAAe;GACf,iBAAiB;GACjB,qBAAsB,EAAW,EAAO,MAAM,IAAI,EAAO,OAAO,QAAQ,EAAO;GAC/E,SAAS,EAAO;GAChB,SAAS,EAAO;GAChB,KAAK,EAAI;GACT;EACF,CAAC;CACH,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../_dev.cjs"),t=require("../../svg/element.cjs"),n=require("../../animation/easing.cjs"),r=require("../../animation/tween.cjs"),i=require("../../svg/path.cjs");var a=new WeakMap,o=new WeakMap;function s(e,t){return t===`monotone`?i.monotonePath(e):t===`step`?i.stepPath(e):i.linePath(e)}function c(e,c,l,u){let d=u.transition?.duration??(u.transition?300:0),f=n.resolveEasing(u.transition?.easing),p=e.querySelector(`.prism-area-fill`);p||(p=t.createSvgElement(`path`,{class:`prism-area-fill`}),e.appendChild(p)),t.setAttributes(p,{fill:u.color,"fill-opacity":u.fillOpacity,stroke:`none`});let m=null;if(u.showLine?(m=e.querySelector(`.prism-area-line`),m||(m=t.createSvgElement(`path`,{class:`prism-area-line`,fill:`none`}),e.appendChild(m)),t.setAttributes(m,{stroke:u.color,"stroke-width":2})):e.querySelector(`.prism-area-line`)?.remove(),d===0){let e=c.map(e=>({x:e.x,y:l}));t.setAttributes(p,{d:i.areaPath(c,e,u.curve)}),m&&t.setAttributes(m,{d:s(c,u.curve)});return}if(a.get(e)?.(),!p.hasAttribute(`d`)){let n=c.map(e=>({x:e.x,y:l}));t.setAttributes(p,{d:i.areaPath(c,n,u.curve)}),m&&t.setAttributes(m,{d:s(c,u.curve)}),o.set(e,c);return}let h=o.get(e)??c,g=c.map((e,t)=>h[t]??h[h.length-1]??c[t]),_=null;function v(n){if(u.disposalSignal?.aborted){a.delete(e);return}_===null&&(_=n);let h=Math.min(1,(n-_)/d),y=f(h),b=c.map((e,t)=>({x:r.tweenNumber(g[t].x,e.x,y),y:r.tweenNumber(g[t].y,e.y,y)})),x=b.map(e=>({x:e.x,y:l}));if(t.setAttributes(p,{d:i.areaPath(b,x,u.curve)}),m&&t.setAttributes(m,{d:s(b,u.curve)}),h<1){let t=requestAnimationFrame(v);a.set(e,()=>cancelAnimationFrame(t))}else a.delete(e),o.set(e,c)}o.set(e,g);let y=requestAnimationFrame(v);a.set(e,()=>cancelAnimationFrame(y))}function l(t,n,r){return t.some(e=>e.key==null)?e.warn(`computeAreaPoints: datum.key is null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?`):t.some(e=>typeof e.key==`string`)&&e.warn(`computeAreaPoints: string keys are not supported for line/area charts — use numeric or Date keys.`),t.map(e=>({x:n.map(e.key),y:r.map(e.value)}))}exports.computeAreaPoints=l,exports.renderArea=c;
2
+ //# sourceMappingURL=area-renderer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-renderer.cjs","names":[],"sources":["../../../src/charts/area/area-renderer.ts"],"sourcesContent":["import type { Point } from '../../svg/path';\nimport type { Datum, Scale, TransitionConfig } from '../../types';\n\nimport { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { tweenNumber } from '../../animation/tween';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\n\nexport interface AreaRenderOptions {\n color: string;\n curve: 'linear' | 'monotone' | 'step';\n /** Aborted when the owning chart is disposed — stops the transition's `requestAnimationFrame` loop from rescheduling. */\n disposalSignal?: AbortSignal;\n fillOpacity: number;\n showLine: boolean;\n transition?: TransitionConfig;\n}\n\nconst activeAreaAnimations = new WeakMap<SVGGElement, () => void>();\nconst previousPoints = new WeakMap<SVGGElement, Point[]>();\n\nfunction buildLinePath(pts: Point[], curve: AreaRenderOptions['curve']): string {\n return curve === 'monotone' ? monotonePath(pts) : curve === 'step' ? stepPath(pts) : linePath(pts);\n}\n\nexport function renderArea(parent: SVGGElement, points: Point[], baselineY: number, options: AreaRenderOptions): void {\n const dur = options.transition?.duration ?? (options.transition ? 300 : 0);\n const easing = resolveEasing(options.transition?.easing);\n\n let fill = parent.querySelector<SVGPathElement>('.prism-area-fill');\n\n if (!fill) {\n fill = createSvgElement('path', { class: 'prism-area-fill' });\n parent.appendChild(fill);\n }\n\n setAttributes(fill, { fill: options.color, 'fill-opacity': options.fillOpacity, stroke: 'none' });\n\n let line: SVGPathElement | null = null;\n\n if (options.showLine) {\n line = parent.querySelector<SVGPathElement>('.prism-area-line');\n\n if (!line) {\n line = createSvgElement('path', { class: 'prism-area-line', fill: 'none' });\n parent.appendChild(line);\n }\n\n setAttributes(line, { stroke: options.color, 'stroke-width': 2 });\n } else {\n parent.querySelector('.prism-area-line')?.remove();\n }\n\n if (dur === 0) {\n const bottomPoints = points.map((p) => ({ x: p.x, y: baselineY }));\n\n setAttributes(fill, { d: areaPath(points, bottomPoints, options.curve) });\n\n if (line) setAttributes(line, { d: buildLinePath(points, options.curve) });\n\n return;\n }\n\n activeAreaAnimations.get(parent)?.();\n\n const hasExisting = fill.hasAttribute('d');\n\n if (!hasExisting) {\n const bottomPoints = points.map((p) => ({ x: p.x, y: baselineY }));\n\n setAttributes(fill, { d: areaPath(points, bottomPoints, options.curve) });\n\n if (line) setAttributes(line, { d: buildLinePath(points, options.curve) });\n\n previousPoints.set(parent, points);\n\n return;\n }\n\n const rawFrom = previousPoints.get(parent) ?? points;\n const fromPoints: Point[] = points.map((_, i) => rawFrom[i] ?? rawFrom[rawFrom.length - 1] ?? points[i]);\n\n let startTime: number | null = null;\n\n function frame(ts: number) {\n if (options.disposalSignal?.aborted) {\n activeAreaAnimations.delete(parent);\n\n return;\n }\n\n if (startTime === null) startTime = ts;\n\n const t = Math.min(1, (ts - startTime) / dur);\n const e = easing(t);\n const interpolated: Point[] = points.map((to, i) => ({\n x: tweenNumber(fromPoints[i].x, to.x, e),\n y: tweenNumber(fromPoints[i].y, to.y, e),\n }));\n const interpolatedBottom = interpolated.map((p) => ({ x: p.x, y: baselineY }));\n\n setAttributes(fill!, { d: areaPath(interpolated, interpolatedBottom, options.curve) });\n\n if (line) setAttributes(line, { d: buildLinePath(interpolated, options.curve) });\n\n if (t < 1) {\n const id = requestAnimationFrame(frame);\n\n activeAreaAnimations.set(parent, () => cancelAnimationFrame(id));\n } else {\n activeAreaAnimations.delete(parent);\n previousPoints.set(parent, points);\n }\n }\n\n previousPoints.set(parent, fromPoints);\n\n const id = requestAnimationFrame(frame);\n\n activeAreaAnimations.set(parent, () => cancelAnimationFrame(id));\n}\n\nexport function computeAreaPoints(data: Datum[], xScale: Scale<Date | number>, yScale: Scale<number>): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computeAreaPoints: datum.key is null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n } else if (data.some((d) => typeof d.key === 'string')) {\n warn('computeAreaPoints: string keys are not supported for line/area charts — use numeric or Date keys.');\n }\n\n return data.map((d) => ({\n x: xScale.map(d.key as Date | number),\n y: yScale.map(d.value),\n }));\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Point } from '../../svg/path';
2
+ import type { Datum, Scale, TransitionConfig } from '../../types';
3
+ export interface AreaRenderOptions {
4
+ color: string;
5
+ curve: 'linear' | 'monotone' | 'step';
6
+ /** Aborted when the owning chart is disposed — stops the transition's `requestAnimationFrame` loop from rescheduling. */
7
+ disposalSignal?: AbortSignal;
8
+ fillOpacity: number;
9
+ showLine: boolean;
10
+ transition?: TransitionConfig;
11
+ }
12
+ export declare function renderArea(parent: SVGGElement, points: Point[], baselineY: number, options: AreaRenderOptions): void;
13
+ export declare function computeAreaPoints(data: Datum[], xScale: Scale<Date | number>, yScale: Scale<number>): Point[];
14
+ //# sourceMappingURL=area-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-renderer.d.ts","sourceRoot":"","sources":["../../../src/charts/area/area-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQlE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACtC,yHAAyH;IACzH,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AASD,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CA+FpH;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAa7G"}
@@ -0,0 +1,73 @@
1
+ import { warn as e } from "../../_dev.js";
2
+ import { createSvgElement as t, setAttributes as n } from "../../svg/element.js";
3
+ import { resolveEasing as r } from "../../animation/easing.js";
4
+ import { tweenNumber as i } from "../../animation/tween.js";
5
+ import { areaPath as a, linePath as o, monotonePath as s, stepPath as c } from "../../svg/path.js";
6
+ //#region src/charts/area/area-renderer.ts
7
+ var l = /* @__PURE__ */ new WeakMap(), u = /* @__PURE__ */ new WeakMap();
8
+ function d(e, t) {
9
+ return t === "monotone" ? s(e) : t === "step" ? c(e) : o(e);
10
+ }
11
+ function f(e, o, s, c) {
12
+ let f = c.transition?.duration ?? (c.transition ? 300 : 0), p = r(c.transition?.easing), m = e.querySelector(".prism-area-fill");
13
+ m || (m = t("path", { class: "prism-area-fill" }), e.appendChild(m)), n(m, {
14
+ fill: c.color,
15
+ "fill-opacity": c.fillOpacity,
16
+ stroke: "none"
17
+ });
18
+ let h = null;
19
+ if (c.showLine ? (h = e.querySelector(".prism-area-line"), h || (h = t("path", {
20
+ class: "prism-area-line",
21
+ fill: "none"
22
+ }), e.appendChild(h)), n(h, {
23
+ stroke: c.color,
24
+ "stroke-width": 2
25
+ })) : e.querySelector(".prism-area-line")?.remove(), f === 0) {
26
+ let e = o.map((e) => ({
27
+ x: e.x,
28
+ y: s
29
+ }));
30
+ n(m, { d: a(o, e, c.curve) }), h && n(h, { d: d(o, c.curve) });
31
+ return;
32
+ }
33
+ if (l.get(e)?.(), !m.hasAttribute("d")) {
34
+ let t = o.map((e) => ({
35
+ x: e.x,
36
+ y: s
37
+ }));
38
+ n(m, { d: a(o, t, c.curve) }), h && n(h, { d: d(o, c.curve) }), u.set(e, o);
39
+ return;
40
+ }
41
+ let g = u.get(e) ?? o, _ = o.map((e, t) => g[t] ?? g[g.length - 1] ?? o[t]), v = null;
42
+ function y(t) {
43
+ if (c.disposalSignal?.aborted) {
44
+ l.delete(e);
45
+ return;
46
+ }
47
+ v === null && (v = t);
48
+ let r = Math.min(1, (t - v) / f), g = p(r), b = o.map((e, t) => ({
49
+ x: i(_[t].x, e.x, g),
50
+ y: i(_[t].y, e.y, g)
51
+ })), x = b.map((e) => ({
52
+ x: e.x,
53
+ y: s
54
+ }));
55
+ if (n(m, { d: a(b, x, c.curve) }), h && n(h, { d: d(b, c.curve) }), r < 1) {
56
+ let t = requestAnimationFrame(y);
57
+ l.set(e, () => cancelAnimationFrame(t));
58
+ } else l.delete(e), u.set(e, o);
59
+ }
60
+ u.set(e, _);
61
+ let b = requestAnimationFrame(y);
62
+ l.set(e, () => cancelAnimationFrame(b));
63
+ }
64
+ function p(t, n, r) {
65
+ return t.some((e) => e.key == null) ? e("computeAreaPoints: datum.key is null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?") : t.some((e) => typeof e.key == "string") && e("computeAreaPoints: string keys are not supported for line/area charts — use numeric or Date keys."), t.map((e) => ({
66
+ x: n.map(e.key),
67
+ y: r.map(e.value)
68
+ }));
69
+ }
70
+ //#endregion
71
+ export { p as computeAreaPoints, f as renderArea };
72
+
73
+ //# sourceMappingURL=area-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-renderer.js","names":[],"sources":["../../../src/charts/area/area-renderer.ts"],"sourcesContent":["import type { Point } from '../../svg/path';\nimport type { Datum, Scale, TransitionConfig } from '../../types';\n\nimport { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { tweenNumber } from '../../animation/tween';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\n\nexport interface AreaRenderOptions {\n color: string;\n curve: 'linear' | 'monotone' | 'step';\n /** Aborted when the owning chart is disposed — stops the transition's `requestAnimationFrame` loop from rescheduling. */\n disposalSignal?: AbortSignal;\n fillOpacity: number;\n showLine: boolean;\n transition?: TransitionConfig;\n}\n\nconst activeAreaAnimations = new WeakMap<SVGGElement, () => void>();\nconst previousPoints = new WeakMap<SVGGElement, Point[]>();\n\nfunction buildLinePath(pts: Point[], curve: AreaRenderOptions['curve']): string {\n return curve === 'monotone' ? monotonePath(pts) : curve === 'step' ? stepPath(pts) : linePath(pts);\n}\n\nexport function renderArea(parent: SVGGElement, points: Point[], baselineY: number, options: AreaRenderOptions): void {\n const dur = options.transition?.duration ?? (options.transition ? 300 : 0);\n const easing = resolveEasing(options.transition?.easing);\n\n let fill = parent.querySelector<SVGPathElement>('.prism-area-fill');\n\n if (!fill) {\n fill = createSvgElement('path', { class: 'prism-area-fill' });\n parent.appendChild(fill);\n }\n\n setAttributes(fill, { fill: options.color, 'fill-opacity': options.fillOpacity, stroke: 'none' });\n\n let line: SVGPathElement | null = null;\n\n if (options.showLine) {\n line = parent.querySelector<SVGPathElement>('.prism-area-line');\n\n if (!line) {\n line = createSvgElement('path', { class: 'prism-area-line', fill: 'none' });\n parent.appendChild(line);\n }\n\n setAttributes(line, { stroke: options.color, 'stroke-width': 2 });\n } else {\n parent.querySelector('.prism-area-line')?.remove();\n }\n\n if (dur === 0) {\n const bottomPoints = points.map((p) => ({ x: p.x, y: baselineY }));\n\n setAttributes(fill, { d: areaPath(points, bottomPoints, options.curve) });\n\n if (line) setAttributes(line, { d: buildLinePath(points, options.curve) });\n\n return;\n }\n\n activeAreaAnimations.get(parent)?.();\n\n const hasExisting = fill.hasAttribute('d');\n\n if (!hasExisting) {\n const bottomPoints = points.map((p) => ({ x: p.x, y: baselineY }));\n\n setAttributes(fill, { d: areaPath(points, bottomPoints, options.curve) });\n\n if (line) setAttributes(line, { d: buildLinePath(points, options.curve) });\n\n previousPoints.set(parent, points);\n\n return;\n }\n\n const rawFrom = previousPoints.get(parent) ?? points;\n const fromPoints: Point[] = points.map((_, i) => rawFrom[i] ?? rawFrom[rawFrom.length - 1] ?? points[i]);\n\n let startTime: number | null = null;\n\n function frame(ts: number) {\n if (options.disposalSignal?.aborted) {\n activeAreaAnimations.delete(parent);\n\n return;\n }\n\n if (startTime === null) startTime = ts;\n\n const t = Math.min(1, (ts - startTime) / dur);\n const e = easing(t);\n const interpolated: Point[] = points.map((to, i) => ({\n x: tweenNumber(fromPoints[i].x, to.x, e),\n y: tweenNumber(fromPoints[i].y, to.y, e),\n }));\n const interpolatedBottom = interpolated.map((p) => ({ x: p.x, y: baselineY }));\n\n setAttributes(fill!, { d: areaPath(interpolated, interpolatedBottom, options.curve) });\n\n if (line) setAttributes(line, { d: buildLinePath(interpolated, options.curve) });\n\n if (t < 1) {\n const id = requestAnimationFrame(frame);\n\n activeAreaAnimations.set(parent, () => cancelAnimationFrame(id));\n } else {\n activeAreaAnimations.delete(parent);\n previousPoints.set(parent, points);\n }\n }\n\n previousPoints.set(parent, fromPoints);\n\n const id = requestAnimationFrame(frame);\n\n activeAreaAnimations.set(parent, () => cancelAnimationFrame(id));\n}\n\nexport function computeAreaPoints(data: Datum[], xScale: Scale<Date | number>, yScale: Scale<number>): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computeAreaPoints: datum.key is null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n } else if (data.some((d) => typeof d.key === 'string')) {\n warn('computeAreaPoints: string keys are not supported for line/area charts — use numeric or Date keys.');\n }\n\n return data.map((d) => ({\n x: xScale.map(d.key as Date | number),\n y: yScale.map(d.value),\n }));\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type { AreaChartConfig, AreaSeriesConfig, ChartHandle } from '../../types';
2
+ //# sourceMappingURL=area-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-types.d.ts","sourceRoot":"","sources":["../../../src/charts/area/area-types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createAreaChart } from './area-chart';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/charts/area/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../_dev.cjs"),t=require("../../svg/element.cjs"),n=require("../../axes/axis.cjs"),r=require("../../axes/grid.cjs"),i=require("../../scales/linear.cjs"),a=require("../../core/layout.cjs"),o=require("../../core/chart-scaffold.cjs"),s=require("../../interaction/events.cjs"),c=require("../../theme/index.cjs"),l=require("../../scales/band.cjs"),u=require("./bar-hit-test.cjs"),d=require("./bar-renderer.cjs");let f=require("@vielzeug/ripple");function p(e){return{horizontal:e===`grouped-horizontal`||e===`stacked-horizontal`,stacked:e===`stacked`||e===`stacked-horizontal`}}function m(m,h){return o.createChartScaffold(m,h,m=>{let{groups:g,legend:_,tooltip:v}=m,y=m.dimensions.value,b=a.chartArea(y.width,y.height,y.margin),x=(0,f.isReactive)(h.series)?h.series.value:h.series,S=x.map(e=>(0,f.isReactive)(e.data)?e.data.value:e.data),C=[...new Set(S.flat().map(e=>String(e.key)))];if(C.length===0){e.warn(`createBarChart: no data`),o.clearCartesianDom(g,_,v);return}let{horizontal:w,stacked:T}=p(h.variant??`grouped`),E,D;if(T){S.some(e=>e.some(e=>e.value<0))&&e.warn(`createBarChart: negative values in a stacked/stacked-horizontal series are clamped to 0 — stacking mixed-sign data is not supported.`);let t=C.map(e=>S.reduce((t,n)=>{let r=n.find(t=>String(t.key)===e);return t+(r?Math.max(0,r.value):0)},0));E=Math.max(...t),D=0}else{let e=S.flat().map(e=>e.value);E=Math.max(...e),D=Math.min(0,...e)}let O=w?l.bandScale({domain:C,range:[0,b.height]}):l.bandScale({domain:C,range:[0,b.width]}),k=w?i.linearScale({domain:[D,E],range:[0,b.width]}):i.linearScale({domain:[D,E],range:[b.height,0]}),A=[],j=Object.create(null);for(let e of C)j[e]=0;let M={bandCenter:e=>O.map(e)+O.bandwidth()/2,bandwidth:O.bandwidth(),baselinePx:k.map(0),horizontal:w,stacked:T,stackedTops:A,valueScale:k};for(w?(h.xAxis?.grid&&r.renderGrid(g.grid,k,h.xAxis.grid,b.height,`vertical`,n.resolveTickCount(h.xAxis,b.width,`bottom`)),h.yAxis&&n.renderAxis(g.yAxis,O,h.yAxis,b.height,`left`),h.xAxis&&(g.xAxis.setAttribute(`transform`,`translate(0,${b.height})`),n.renderAxis(g.xAxis,k,h.xAxis,b.width,`bottom`))):(h.yAxis?.grid&&r.renderGrid(g.grid,k,h.yAxis.grid,b.width,`horizontal`,n.resolveTickCount(h.yAxis,b.height,`left`)),h.xAxis&&(g.xAxis.setAttribute(`transform`,`translate(0,${b.height})`),n.renderAxis(g.xAxis,O,h.xAxis,b.width,`bottom`)),h.yAxis&&n.renderAxis(g.yAxis,k,h.yAxis,b.height,`left`));g.series.children.length>x.length;){let e=g.series.lastElementChild;e&&g.series.removeChild(e)}for(let e=0;e<x.length;e++){let n=x[e],r=g.series.children[e];r||(r=t.createSvgElement(`g`,{class:`prism-bar-series`}),g.series.appendChild(r));let i=S[e].map(e=>{let t=String(e.key);if(T){let n=j[t]??0,r=n+Math.max(0,e.value);return j[t]=r,{base:n,key:t,y:r}}return{base:0,key:t,y:e.value}});A[e]=i.map(e=>e.y);let a=T?i.map(e=>k.map(e.base)):void 0;d.renderBars(r,i,O,k,M.baselinePx,{baselineYs:a,borderRadius:n.borderRadius??0,color:c.seriesColor(e,n.color),disposalSignal:m.disposalSignal,horizontal:w,seriesCount:x.length,seriesIndex:e,stacked:T,transition:h.transition})}return _?.update(x.map((e,t)=>({color:c.seriesColor(t,e.color),name:e.name}))),v?.hide(),{onClick:e=>{if(!h.onClick)return;let t=m.dimensions.value,n=s.getMousePosition(m.svg,e,t.margin.left,t.margin.top),r=a.chartArea(t.width,t.height,t.margin);if(n.x<0||n.x>r.width||n.y<0||n.y>r.height)return;let i=u.findCatIdx(w?n.y:n.x,C,M);if(i===-1)return;let o=u.findSeriesIdx(n,i,C,M,x.length),c=S[o]?.[i];c&&h.onClick({datum:c,originalEvent:e,series:x[o]})},onMouseLeave:()=>{v?.hide(),h.onHover?.(null)},onMouseMove:e=>{let t=m.dimensions.value,n=s.getMousePosition(m.svg,e,t.margin.left,t.margin.top),r=a.chartArea(t.width,t.height,t.margin);if(n.x<0||n.x>r.width||n.y<0||n.y>r.height){v?.hide();return}let i=u.findCatIdx(w?n.y:n.x,C,M);if(i===-1){v?.hide();return}if(u.isOutsideBars(n,i,S,M,x.length)){v?.hide();return}let o=u.findSeriesIdx(n,i,C,M,x.length),c=S[o]?.[i];if(c){let n=M.bandCenter(C[i]),r=T?A[o]?.[i]??c.value:c.value,a=k.map(r),s=w?a+t.margin.left:n+t.margin.left,l=w?n+t.margin.top:a+t.margin.top;v?.show(s,l,c,x[o]),h.onHover?.({datum:c,originalEvent:e,series:x[o]})}}}})}exports.createBarChart=m;
2
+ //# sourceMappingURL=bar-chart.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-chart.cjs","names":[],"sources":["../../../src/charts/bar/bar-chart.ts"],"sourcesContent":["import { isReactive } from '@vielzeug/ripple';\n\nimport type { BarChartConfig, BarVariant, ChartHandle } from '../../types';\nimport type { BarScaleContext } from './bar-scale-context';\n\nimport { warn } from '../../_dev';\nimport { renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { getMousePosition } from '../../interaction/events';\nimport { bandScale } from '../../scales/band';\nimport { linearScale } from '../../scales/linear';\nimport { createSvgElement } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport { findCatIdx, findSeriesIdx, isOutsideBars } from './bar-hit-test';\nimport { renderBars } from './bar-renderer';\n\nfunction variantFlags(variant: BarVariant): { horizontal: boolean; stacked: boolean } {\n return {\n horizontal: variant === 'grouped-horizontal' || variant === 'stacked-horizontal',\n stacked: variant === 'stacked' || variant === 'stacked-horizontal',\n };\n}\n\n// ─── Chart ────────────────────────────────────────────────────────────────────\n\nexport function createBarChart(container: HTMLElement, config: BarChartConfig): ChartHandle {\n return createChartScaffold(container, config, (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions.value;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const seriesList = isReactive(config.series) ? config.series.value : config.series;\n const allData = seriesList.map((s) => (isReactive(s.data) ? s.data.value : s.data));\n const categories = [...new Set(allData.flat().map((d) => String(d.key)))];\n\n if (categories.length === 0) {\n warn('createBarChart: no data');\n clearCartesianDom(groups, legend, tooltip);\n\n return;\n }\n\n const { horizontal, stacked } = variantFlags(config.variant ?? 'grouped');\n\n // Value domain\n let vMax: number;\n let vMin: number;\n\n if (stacked) {\n if (allData.some((sd) => sd.some((d) => d.value < 0))) {\n warn(\n 'createBarChart: negative values in a stacked/stacked-horizontal series are clamped to 0 — stacking mixed-sign data is not supported.',\n );\n }\n\n const sums = categories.map((cat) =>\n allData.reduce((sum, sd) => {\n const pt = sd.find((d) => String(d.key) === cat);\n\n return sum + (pt ? Math.max(0, pt.value) : 0);\n }, 0),\n );\n\n vMax = Math.max(...sums);\n vMin = 0;\n } else {\n const allY = allData.flat().map((d) => d.value);\n\n vMax = Math.max(...allY);\n vMin = Math.min(0, ...allY);\n }\n\n // Build uniform scale context\n const catScale = horizontal\n ? bandScale({ domain: categories, range: [0, area.height] })\n : bandScale({ domain: categories, range: [0, area.width] });\n\n const valScale = horizontal\n ? linearScale({ domain: [vMin, vMax], range: [0, area.width] })\n : linearScale({ domain: [vMin, vMax], range: [area.height, 0] });\n\n const stackedTops: number[][] = [];\n const stackTops = Object.create(null) as Record<string, number>;\n\n for (const cat of categories) stackTops[cat] = 0;\n\n const sc: BarScaleContext = {\n bandCenter: (cat) => catScale.map(cat) + catScale.bandwidth() / 2,\n bandwidth: catScale.bandwidth(),\n baselinePx: valScale.map(0),\n horizontal,\n stacked,\n stackedTops,\n valueScale: valScale,\n };\n\n // Axes & grid\n if (horizontal) {\n if (config.xAxis?.grid) {\n renderGrid(\n groups.grid,\n valScale,\n config.xAxis.grid,\n area.height,\n 'vertical',\n resolveTickCount(config.xAxis, area.width, 'bottom'),\n );\n }\n\n if (config.yAxis) renderAxis(groups.yAxis, catScale, config.yAxis, area.height, 'left');\n\n if (config.xAxis) {\n groups.xAxis.setAttribute('transform', `translate(0,${area.height})`);\n renderAxis(groups.xAxis, valScale, config.xAxis, area.width, 'bottom');\n }\n } else {\n if (config.yAxis?.grid) {\n renderGrid(\n groups.grid,\n valScale,\n config.yAxis.grid,\n area.width,\n 'horizontal',\n resolveTickCount(config.yAxis, area.height, 'left'),\n );\n }\n\n if (config.xAxis) {\n groups.xAxis.setAttribute('transform', `translate(0,${area.height})`);\n renderAxis(groups.xAxis, catScale, config.xAxis, area.width, 'bottom');\n }\n\n if (config.yAxis) renderAxis(groups.yAxis, valScale, config.yAxis, area.height, 'left');\n }\n\n // Series groups\n while (groups.series.children.length > seriesList.length) {\n const last = groups.series.lastElementChild;\n\n if (last) groups.series.removeChild(last);\n }\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-bar-series' });\n groups.series.appendChild(group);\n }\n\n const barData = allData[i].map((d) => {\n const key = String(d.key);\n\n if (stacked) {\n const base = stackTops[key] ?? 0;\n const top = base + Math.max(0, d.value);\n\n stackTops[key] = top;\n\n return { base, key, y: top };\n }\n\n return { base: 0, key, y: d.value };\n });\n\n stackedTops[i] = barData.map((d) => d.y);\n\n const baselineYs = stacked ? barData.map((d) => valScale.map(d.base)) : undefined;\n\n renderBars(group, barData, catScale, valScale, sc.baselinePx, {\n baselineYs,\n borderRadius: series.borderRadius ?? 0,\n color: seriesColor(i, series.color),\n disposalSignal: ctx.disposalSignal,\n horizontal,\n seriesCount: seriesList.length,\n seriesIndex: i,\n stacked,\n transition: config.transition,\n });\n }\n\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n tooltip?.hide();\n\n // ─── Event handlers (close over render-derived state) ─────────────────────\n\n const onMouseMove = (event: MouseEvent) => {\n const d = ctx.dimensions.value;\n const pos = getMousePosition(ctx.svg, event, d.margin.left, d.margin.top);\n const a = chartArea(d.width, d.height, d.margin);\n\n if (pos.x < 0 || pos.x > a.width || pos.y < 0 || pos.y > a.height) {\n tooltip?.hide();\n\n return;\n }\n\n const posBand = horizontal ? pos.y : pos.x;\n const catIdx = findCatIdx(posBand, categories, sc);\n\n if (catIdx === -1) {\n tooltip?.hide();\n\n return;\n }\n\n if (isOutsideBars(pos, catIdx, allData, sc, seriesList.length)) {\n tooltip?.hide();\n\n return;\n }\n\n const seriesIdx = findSeriesIdx(pos, catIdx, categories, sc, seriesList.length);\n const point = allData[seriesIdx]?.[catIdx];\n\n if (point) {\n const bandCenterPx = sc.bandCenter(categories[catIdx]);\n const stackedTop = stacked ? (stackedTops[seriesIdx]?.[catIdx] ?? point.value) : point.value;\n const valuePx = valScale.map(stackedTop);\n\n const tooltipX = horizontal ? valuePx + d.margin.left : bandCenterPx + d.margin.left;\n const tooltipY = horizontal ? bandCenterPx + d.margin.top : valuePx + d.margin.top;\n\n tooltip?.show(tooltipX, tooltipY, point, seriesList[seriesIdx]);\n config.onHover?.({ datum: point, originalEvent: event, series: seriesList[seriesIdx] });\n }\n };\n\n const onMouseLeave = () => {\n tooltip?.hide();\n config.onHover?.(null);\n };\n\n const onClick = (event: MouseEvent) => {\n if (!config.onClick) return;\n\n const d = ctx.dimensions.value;\n const pos = getMousePosition(ctx.svg, event, d.margin.left, d.margin.top);\n const a = chartArea(d.width, d.height, d.margin);\n\n if (pos.x < 0 || pos.x > a.width || pos.y < 0 || pos.y > a.height) return;\n\n const posBand = horizontal ? pos.y : pos.x;\n const catIdx = findCatIdx(posBand, categories, sc);\n\n if (catIdx === -1) return;\n\n const seriesIdx = findSeriesIdx(pos, catIdx, categories, sc, seriesList.length);\n const point = allData[seriesIdx]?.[catIdx];\n\n if (point) {\n config.onClick({ datum: point, originalEvent: event, series: seriesList[seriesIdx] });\n }\n };\n\n return { onClick, onMouseLeave, onMouseMove };\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BarChartConfig, ChartHandle } from '../../types';
2
+ export declare function createBarChart(container: HTMLElement, config: BarChartConfig): ChartHandle;
3
+ //# sourceMappingURL=bar-chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-chart.d.ts","sourceRoot":"","sources":["../../../src/charts/bar/bar-chart.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAc,WAAW,EAAE,MAAM,aAAa,CAAC;AAyB3E,wBAAgB,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,GAAG,WAAW,CAyO1F"}
@@ -0,0 +1,151 @@
1
+ import { warn as e } from "../../_dev.js";
2
+ import { createSvgElement as t } from "../../svg/element.js";
3
+ import { renderAxis as n, resolveTickCount as r } from "../../axes/axis.js";
4
+ import { renderGrid as i } from "../../axes/grid.js";
5
+ import { linearScale as a } from "../../scales/linear.js";
6
+ import { chartArea as o } from "../../core/layout.js";
7
+ import { clearCartesianDom as s, createChartScaffold as c } from "../../core/chart-scaffold.js";
8
+ import { getMousePosition as l } from "../../interaction/events.js";
9
+ import { seriesColor as u } from "../../theme/index.js";
10
+ import { bandScale as d } from "../../scales/band.js";
11
+ import { findCatIdx as f, findSeriesIdx as p, isOutsideBars as m } from "./bar-hit-test.js";
12
+ import { renderBars as h } from "./bar-renderer.js";
13
+ import { isReactive as g } from "@vielzeug/ripple";
14
+ //#region src/charts/bar/bar-chart.ts
15
+ function _(e) {
16
+ return {
17
+ horizontal: e === "grouped-horizontal" || e === "stacked-horizontal",
18
+ stacked: e === "stacked" || e === "stacked-horizontal"
19
+ };
20
+ }
21
+ function v(v, y) {
22
+ return c(v, y, (c) => {
23
+ let { groups: v, legend: b, tooltip: x } = c, S = c.dimensions.value, C = o(S.width, S.height, S.margin), w = g(y.series) ? y.series.value : y.series, T = w.map((e) => g(e.data) ? e.data.value : e.data), E = [...new Set(T.flat().map((e) => String(e.key)))];
24
+ if (E.length === 0) {
25
+ e("createBarChart: no data"), s(v, b, x);
26
+ return;
27
+ }
28
+ let { horizontal: D, stacked: O } = _(y.variant ?? "grouped"), k, A;
29
+ if (O) {
30
+ T.some((e) => e.some((e) => e.value < 0)) && e("createBarChart: negative values in a stacked/stacked-horizontal series are clamped to 0 — stacking mixed-sign data is not supported.");
31
+ let t = E.map((e) => T.reduce((t, n) => {
32
+ let r = n.find((t) => String(t.key) === e);
33
+ return t + (r ? Math.max(0, r.value) : 0);
34
+ }, 0));
35
+ k = Math.max(...t), A = 0;
36
+ } else {
37
+ let e = T.flat().map((e) => e.value);
38
+ k = Math.max(...e), A = Math.min(0, ...e);
39
+ }
40
+ let j = d(D ? {
41
+ domain: E,
42
+ range: [0, C.height]
43
+ } : {
44
+ domain: E,
45
+ range: [0, C.width]
46
+ }), M = a(D ? {
47
+ domain: [A, k],
48
+ range: [0, C.width]
49
+ } : {
50
+ domain: [A, k],
51
+ range: [C.height, 0]
52
+ }), N = [], P = Object.create(null);
53
+ for (let e of E) P[e] = 0;
54
+ let F = {
55
+ bandCenter: (e) => j.map(e) + j.bandwidth() / 2,
56
+ bandwidth: j.bandwidth(),
57
+ baselinePx: M.map(0),
58
+ horizontal: D,
59
+ stacked: O,
60
+ stackedTops: N,
61
+ valueScale: M
62
+ };
63
+ for (D ? (y.xAxis?.grid && i(v.grid, M, y.xAxis.grid, C.height, "vertical", r(y.xAxis, C.width, "bottom")), y.yAxis && n(v.yAxis, j, y.yAxis, C.height, "left"), y.xAxis && (v.xAxis.setAttribute("transform", `translate(0,${C.height})`), n(v.xAxis, M, y.xAxis, C.width, "bottom"))) : (y.yAxis?.grid && i(v.grid, M, y.yAxis.grid, C.width, "horizontal", r(y.yAxis, C.height, "left")), y.xAxis && (v.xAxis.setAttribute("transform", `translate(0,${C.height})`), n(v.xAxis, j, y.xAxis, C.width, "bottom")), y.yAxis && n(v.yAxis, M, y.yAxis, C.height, "left")); v.series.children.length > w.length;) {
64
+ let e = v.series.lastElementChild;
65
+ e && v.series.removeChild(e);
66
+ }
67
+ for (let e = 0; e < w.length; e++) {
68
+ let n = w[e], r = v.series.children[e];
69
+ r || (r = t("g", { class: "prism-bar-series" }), v.series.appendChild(r));
70
+ let i = T[e].map((e) => {
71
+ let t = String(e.key);
72
+ if (O) {
73
+ let n = P[t] ?? 0, r = n + Math.max(0, e.value);
74
+ return P[t] = r, {
75
+ base: n,
76
+ key: t,
77
+ y: r
78
+ };
79
+ }
80
+ return {
81
+ base: 0,
82
+ key: t,
83
+ y: e.value
84
+ };
85
+ });
86
+ N[e] = i.map((e) => e.y);
87
+ let a = O ? i.map((e) => M.map(e.base)) : void 0;
88
+ h(r, i, j, M, F.baselinePx, {
89
+ baselineYs: a,
90
+ borderRadius: n.borderRadius ?? 0,
91
+ color: u(e, n.color),
92
+ disposalSignal: c.disposalSignal,
93
+ horizontal: D,
94
+ seriesCount: w.length,
95
+ seriesIndex: e,
96
+ stacked: O,
97
+ transition: y.transition
98
+ });
99
+ }
100
+ return b?.update(w.map((e, t) => ({
101
+ color: u(t, e.color),
102
+ name: e.name
103
+ }))), x?.hide(), {
104
+ onClick: (e) => {
105
+ if (!y.onClick) return;
106
+ let t = c.dimensions.value, n = l(c.svg, e, t.margin.left, t.margin.top), r = o(t.width, t.height, t.margin);
107
+ if (n.x < 0 || n.x > r.width || n.y < 0 || n.y > r.height) return;
108
+ let i = f(D ? n.y : n.x, E, F);
109
+ if (i === -1) return;
110
+ let a = p(n, i, E, F, w.length), s = T[a]?.[i];
111
+ s && y.onClick({
112
+ datum: s,
113
+ originalEvent: e,
114
+ series: w[a]
115
+ });
116
+ },
117
+ onMouseLeave: () => {
118
+ x?.hide(), y.onHover?.(null);
119
+ },
120
+ onMouseMove: (e) => {
121
+ let t = c.dimensions.value, n = l(c.svg, e, t.margin.left, t.margin.top), r = o(t.width, t.height, t.margin);
122
+ if (n.x < 0 || n.x > r.width || n.y < 0 || n.y > r.height) {
123
+ x?.hide();
124
+ return;
125
+ }
126
+ let i = f(D ? n.y : n.x, E, F);
127
+ if (i === -1) {
128
+ x?.hide();
129
+ return;
130
+ }
131
+ if (m(n, i, T, F, w.length)) {
132
+ x?.hide();
133
+ return;
134
+ }
135
+ let a = p(n, i, E, F, w.length), s = T[a]?.[i];
136
+ if (s) {
137
+ let n = F.bandCenter(E[i]), r = O ? N[a]?.[i] ?? s.value : s.value, o = M.map(r), c = D ? o + t.margin.left : n + t.margin.left, l = D ? n + t.margin.top : o + t.margin.top;
138
+ x?.show(c, l, s, w[a]), y.onHover?.({
139
+ datum: s,
140
+ originalEvent: e,
141
+ series: w[a]
142
+ });
143
+ }
144
+ }
145
+ };
146
+ });
147
+ }
148
+ //#endregion
149
+ export { v as createBarChart };
150
+
151
+ //# sourceMappingURL=bar-chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-chart.js","names":[],"sources":["../../../src/charts/bar/bar-chart.ts"],"sourcesContent":["import { isReactive } from '@vielzeug/ripple';\n\nimport type { BarChartConfig, BarVariant, ChartHandle } from '../../types';\nimport type { BarScaleContext } from './bar-scale-context';\n\nimport { warn } from '../../_dev';\nimport { renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { getMousePosition } from '../../interaction/events';\nimport { bandScale } from '../../scales/band';\nimport { linearScale } from '../../scales/linear';\nimport { createSvgElement } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport { findCatIdx, findSeriesIdx, isOutsideBars } from './bar-hit-test';\nimport { renderBars } from './bar-renderer';\n\nfunction variantFlags(variant: BarVariant): { horizontal: boolean; stacked: boolean } {\n return {\n horizontal: variant === 'grouped-horizontal' || variant === 'stacked-horizontal',\n stacked: variant === 'stacked' || variant === 'stacked-horizontal',\n };\n}\n\n// ─── Chart ────────────────────────────────────────────────────────────────────\n\nexport function createBarChart(container: HTMLElement, config: BarChartConfig): ChartHandle {\n return createChartScaffold(container, config, (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions.value;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const seriesList = isReactive(config.series) ? config.series.value : config.series;\n const allData = seriesList.map((s) => (isReactive(s.data) ? s.data.value : s.data));\n const categories = [...new Set(allData.flat().map((d) => String(d.key)))];\n\n if (categories.length === 0) {\n warn('createBarChart: no data');\n clearCartesianDom(groups, legend, tooltip);\n\n return;\n }\n\n const { horizontal, stacked } = variantFlags(config.variant ?? 'grouped');\n\n // Value domain\n let vMax: number;\n let vMin: number;\n\n if (stacked) {\n if (allData.some((sd) => sd.some((d) => d.value < 0))) {\n warn(\n 'createBarChart: negative values in a stacked/stacked-horizontal series are clamped to 0 — stacking mixed-sign data is not supported.',\n );\n }\n\n const sums = categories.map((cat) =>\n allData.reduce((sum, sd) => {\n const pt = sd.find((d) => String(d.key) === cat);\n\n return sum + (pt ? Math.max(0, pt.value) : 0);\n }, 0),\n );\n\n vMax = Math.max(...sums);\n vMin = 0;\n } else {\n const allY = allData.flat().map((d) => d.value);\n\n vMax = Math.max(...allY);\n vMin = Math.min(0, ...allY);\n }\n\n // Build uniform scale context\n const catScale = horizontal\n ? bandScale({ domain: categories, range: [0, area.height] })\n : bandScale({ domain: categories, range: [0, area.width] });\n\n const valScale = horizontal\n ? linearScale({ domain: [vMin, vMax], range: [0, area.width] })\n : linearScale({ domain: [vMin, vMax], range: [area.height, 0] });\n\n const stackedTops: number[][] = [];\n const stackTops = Object.create(null) as Record<string, number>;\n\n for (const cat of categories) stackTops[cat] = 0;\n\n const sc: BarScaleContext = {\n bandCenter: (cat) => catScale.map(cat) + catScale.bandwidth() / 2,\n bandwidth: catScale.bandwidth(),\n baselinePx: valScale.map(0),\n horizontal,\n stacked,\n stackedTops,\n valueScale: valScale,\n };\n\n // Axes & grid\n if (horizontal) {\n if (config.xAxis?.grid) {\n renderGrid(\n groups.grid,\n valScale,\n config.xAxis.grid,\n area.height,\n 'vertical',\n resolveTickCount(config.xAxis, area.width, 'bottom'),\n );\n }\n\n if (config.yAxis) renderAxis(groups.yAxis, catScale, config.yAxis, area.height, 'left');\n\n if (config.xAxis) {\n groups.xAxis.setAttribute('transform', `translate(0,${area.height})`);\n renderAxis(groups.xAxis, valScale, config.xAxis, area.width, 'bottom');\n }\n } else {\n if (config.yAxis?.grid) {\n renderGrid(\n groups.grid,\n valScale,\n config.yAxis.grid,\n area.width,\n 'horizontal',\n resolveTickCount(config.yAxis, area.height, 'left'),\n );\n }\n\n if (config.xAxis) {\n groups.xAxis.setAttribute('transform', `translate(0,${area.height})`);\n renderAxis(groups.xAxis, catScale, config.xAxis, area.width, 'bottom');\n }\n\n if (config.yAxis) renderAxis(groups.yAxis, valScale, config.yAxis, area.height, 'left');\n }\n\n // Series groups\n while (groups.series.children.length > seriesList.length) {\n const last = groups.series.lastElementChild;\n\n if (last) groups.series.removeChild(last);\n }\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-bar-series' });\n groups.series.appendChild(group);\n }\n\n const barData = allData[i].map((d) => {\n const key = String(d.key);\n\n if (stacked) {\n const base = stackTops[key] ?? 0;\n const top = base + Math.max(0, d.value);\n\n stackTops[key] = top;\n\n return { base, key, y: top };\n }\n\n return { base: 0, key, y: d.value };\n });\n\n stackedTops[i] = barData.map((d) => d.y);\n\n const baselineYs = stacked ? barData.map((d) => valScale.map(d.base)) : undefined;\n\n renderBars(group, barData, catScale, valScale, sc.baselinePx, {\n baselineYs,\n borderRadius: series.borderRadius ?? 0,\n color: seriesColor(i, series.color),\n disposalSignal: ctx.disposalSignal,\n horizontal,\n seriesCount: seriesList.length,\n seriesIndex: i,\n stacked,\n transition: config.transition,\n });\n }\n\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n tooltip?.hide();\n\n // ─── Event handlers (close over render-derived state) ─────────────────────\n\n const onMouseMove = (event: MouseEvent) => {\n const d = ctx.dimensions.value;\n const pos = getMousePosition(ctx.svg, event, d.margin.left, d.margin.top);\n const a = chartArea(d.width, d.height, d.margin);\n\n if (pos.x < 0 || pos.x > a.width || pos.y < 0 || pos.y > a.height) {\n tooltip?.hide();\n\n return;\n }\n\n const posBand = horizontal ? pos.y : pos.x;\n const catIdx = findCatIdx(posBand, categories, sc);\n\n if (catIdx === -1) {\n tooltip?.hide();\n\n return;\n }\n\n if (isOutsideBars(pos, catIdx, allData, sc, seriesList.length)) {\n tooltip?.hide();\n\n return;\n }\n\n const seriesIdx = findSeriesIdx(pos, catIdx, categories, sc, seriesList.length);\n const point = allData[seriesIdx]?.[catIdx];\n\n if (point) {\n const bandCenterPx = sc.bandCenter(categories[catIdx]);\n const stackedTop = stacked ? (stackedTops[seriesIdx]?.[catIdx] ?? point.value) : point.value;\n const valuePx = valScale.map(stackedTop);\n\n const tooltipX = horizontal ? valuePx + d.margin.left : bandCenterPx + d.margin.left;\n const tooltipY = horizontal ? bandCenterPx + d.margin.top : valuePx + d.margin.top;\n\n tooltip?.show(tooltipX, tooltipY, point, seriesList[seriesIdx]);\n config.onHover?.({ datum: point, originalEvent: event, series: seriesList[seriesIdx] });\n }\n };\n\n const onMouseLeave = () => {\n tooltip?.hide();\n config.onHover?.(null);\n };\n\n const onClick = (event: MouseEvent) => {\n if (!config.onClick) return;\n\n const d = ctx.dimensions.value;\n const pos = getMousePosition(ctx.svg, event, d.margin.left, d.margin.top);\n const a = chartArea(d.width, d.height, d.margin);\n\n if (pos.x < 0 || pos.x > a.width || pos.y < 0 || pos.y > a.height) return;\n\n const posBand = horizontal ? pos.y : pos.x;\n const catIdx = findCatIdx(posBand, categories, sc);\n\n if (catIdx === -1) return;\n\n const seriesIdx = findSeriesIdx(pos, catIdx, categories, sc, seriesList.length);\n const point = allData[seriesIdx]?.[catIdx];\n\n if (point) {\n config.onClick({ datum: point, originalEvent: event, series: seriesList[seriesIdx] });\n }\n };\n\n return { onClick, onMouseLeave, onMouseMove };\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function e(e,t,n){for(let r=0;r<t.length;r++){let i=n.bandCenter(t[r])-n.bandwidth/2;if(e>=i&&e<i+n.bandwidth)return r}return-1}function t(e,t,n,r,i){if(r.stacked)if(r.horizontal){for(let n=0;n<i;n++)if(r.valueScale.map(r.stackedTops[n]?.[t]??0)>=e.x)return n;return i-1}else{for(let n=0;n<i;n++)if(r.valueScale.map(r.stackedTops[n]?.[t]??0)<=e.y)return n;return i-1}else{let a=r.bandwidth/i,o=r.bandCenter(n[t])-r.bandwidth/2,s=r.horizontal?e.y-o:e.x-o,c=Math.floor(s/a);return Math.max(0,Math.min(i-1,c))}}function n(e,t,n,r,i){let a=i-1,o=r.stacked?r.stackedTops[a]?.[t]??0:Math.max(...Array.from({length:i},(e,r)=>n[r]?.[t]?.value??0)),s=r.valueScale.map(o);return r.horizontal?e.x>s:e.y<s}exports.findCatIdx=e,exports.findSeriesIdx=t,exports.isOutsideBars=n;
2
+ //# sourceMappingURL=bar-hit-test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-hit-test.cjs","names":[],"sources":["../../../src/charts/bar/bar-hit-test.ts"],"sourcesContent":["import type { Datum } from '../../types';\nimport type { BarScaleContext } from './bar-scale-context';\n\nexport function findCatIdx(pos: number, categories: string[], sc: BarScaleContext): number {\n for (let i = 0; i < categories.length; i++) {\n const center = sc.bandCenter(categories[i]);\n const start = center - sc.bandwidth / 2;\n\n if (pos >= start && pos < start + sc.bandwidth) return i;\n }\n\n return -1;\n}\n\nexport function findSeriesIdx(\n pos: { x: number; y: number },\n catIdx: number,\n categories: string[],\n sc: BarScaleContext,\n seriesCount: number,\n): number {\n if (sc.stacked) {\n if (sc.horizontal) {\n for (let si = 0; si < seriesCount; si++) {\n const rightX = sc.valueScale.map(sc.stackedTops[si]?.[catIdx] ?? 0);\n\n if (rightX >= pos.x) return si;\n }\n\n return seriesCount - 1;\n } else {\n for (let si = 0; si < seriesCount; si++) {\n const topY = sc.valueScale.map(sc.stackedTops[si]?.[catIdx] ?? 0);\n\n if (topY <= pos.y) return si;\n }\n\n return seriesCount - 1;\n }\n } else {\n const subSize = sc.bandwidth / seriesCount;\n const bandStart = sc.bandCenter(categories[catIdx]) - sc.bandwidth / 2;\n const offset = sc.horizontal ? pos.y - bandStart : pos.x - bandStart;\n const subIdx = Math.floor(offset / subSize);\n\n return Math.max(0, Math.min(seriesCount - 1, subIdx));\n }\n}\n\nexport function isOutsideBars(\n pos: { x: number; y: number },\n catIdx: number,\n allData: Datum[][],\n sc: BarScaleContext,\n seriesCount: number,\n): boolean {\n const lastSi = seriesCount - 1;\n const maxVal = sc.stacked\n ? (sc.stackedTops[lastSi]?.[catIdx] ?? 0)\n : Math.max(...Array.from({ length: seriesCount }, (_, si) => allData[si]?.[catIdx]?.value ?? 0));\n const maxPx = sc.valueScale.map(maxVal);\n\n return sc.horizontal ? pos.x > maxPx : pos.y < maxPx;\n}\n"],"mappings":"AAGA,SAAgB,EAAW,EAAa,EAAsB,EAA6B,CACzF,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,IAAK,CAE1C,IAAM,EADS,EAAG,WAAW,EAAW,EAC1B,EAAS,EAAG,UAAY,EAEtC,GAAI,GAAO,GAAS,EAAM,EAAQ,EAAG,UAAW,OAAO,CACzD,CAEA,MAAO,EACT,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACA,EACQ,CACR,GAAI,EAAG,QACL,GAAI,EAAG,WAAY,CACjB,IAAK,IAAI,EAAK,EAAG,EAAK,EAAa,IAGjC,GAFe,EAAG,WAAW,IAAI,EAAG,YAAY,EAAG,GAAG,IAAW,CAE7D,GAAU,EAAI,EAAG,OAAO,EAG9B,OAAO,EAAc,CACvB,KAAO,CACL,IAAK,IAAI,EAAK,EAAG,EAAK,EAAa,IAGjC,GAFa,EAAG,WAAW,IAAI,EAAG,YAAY,EAAG,GAAG,IAAW,CAE3D,GAAQ,EAAI,EAAG,OAAO,EAG5B,OAAO,EAAc,CACvB,KACK,CACL,IAAM,EAAU,EAAG,UAAY,EACzB,EAAY,EAAG,WAAW,EAAW,EAAO,EAAI,EAAG,UAAY,EAC/D,EAAS,EAAG,WAAa,EAAI,EAAI,EAAY,EAAI,EAAI,EACrD,EAAS,KAAK,MAAM,EAAS,CAAO,EAE1C,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAc,EAAG,CAAM,CAAC,CACtD,CACF,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACA,EACS,CACT,IAAM,EAAS,EAAc,EACvB,EAAS,EAAG,QACb,EAAG,YAAY,EAAO,GAAG,IAAW,EACrC,KAAK,IAAI,GAAG,MAAM,KAAK,CAAE,OAAQ,CAAY,GAAI,EAAG,IAAO,EAAQ,EAAG,GAAG,EAAO,EAAE,OAAS,CAAC,CAAC,EAC3F,EAAQ,EAAG,WAAW,IAAI,CAAM,EAEtC,OAAO,EAAG,WAAa,EAAI,EAAI,EAAQ,EAAI,EAAI,CACjD"}
@@ -0,0 +1,12 @@
1
+ import type { Datum } from '../../types';
2
+ import type { BarScaleContext } from './bar-scale-context';
3
+ export declare function findCatIdx(pos: number, categories: string[], sc: BarScaleContext): number;
4
+ export declare function findSeriesIdx(pos: {
5
+ x: number;
6
+ y: number;
7
+ }, catIdx: number, categories: string[], sc: BarScaleContext, seriesCount: number): number;
8
+ export declare function isOutsideBars(pos: {
9
+ x: number;
10
+ y: number;
11
+ }, catIdx: number, allData: Datum[][], sc: BarScaleContext, seriesCount: number): boolean;
12
+ //# sourceMappingURL=bar-hit-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-hit-test.d.ts","sourceRoot":"","sources":["../../../src/charts/bar/bar-hit-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,eAAe,GAAG,MAAM,CASzF;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAAE,EACpB,EAAE,EAAE,eAAe,EACnB,WAAW,EAAE,MAAM,GAClB,MAAM,CA2BR;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,KAAK,EAAE,EAAE,EAClB,EAAE,EAAE,eAAe,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAQT"}
@@ -0,0 +1,29 @@
1
+ //#region src/charts/bar/bar-hit-test.ts
2
+ function e(e, t, n) {
3
+ for (let r = 0; r < t.length; r++) {
4
+ let i = n.bandCenter(t[r]) - n.bandwidth / 2;
5
+ if (e >= i && e < i + n.bandwidth) return r;
6
+ }
7
+ return -1;
8
+ }
9
+ function t(e, t, n, r, i) {
10
+ if (r.stacked) if (r.horizontal) {
11
+ for (let n = 0; n < i; n++) if (r.valueScale.map(r.stackedTops[n]?.[t] ?? 0) >= e.x) return n;
12
+ return i - 1;
13
+ } else {
14
+ for (let n = 0; n < i; n++) if (r.valueScale.map(r.stackedTops[n]?.[t] ?? 0) <= e.y) return n;
15
+ return i - 1;
16
+ }
17
+ else {
18
+ let a = r.bandwidth / i, o = r.bandCenter(n[t]) - r.bandwidth / 2, s = r.horizontal ? e.y - o : e.x - o, c = Math.floor(s / a);
19
+ return Math.max(0, Math.min(i - 1, c));
20
+ }
21
+ }
22
+ function n(e, t, n, r, i) {
23
+ let a = i - 1, o = r.stacked ? r.stackedTops[a]?.[t] ?? 0 : Math.max(...Array.from({ length: i }, (e, r) => n[r]?.[t]?.value ?? 0)), s = r.valueScale.map(o);
24
+ return r.horizontal ? e.x > s : e.y < s;
25
+ }
26
+ //#endregion
27
+ export { e as findCatIdx, t as findSeriesIdx, n as isOutsideBars };
28
+
29
+ //# sourceMappingURL=bar-hit-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-hit-test.js","names":[],"sources":["../../../src/charts/bar/bar-hit-test.ts"],"sourcesContent":["import type { Datum } from '../../types';\nimport type { BarScaleContext } from './bar-scale-context';\n\nexport function findCatIdx(pos: number, categories: string[], sc: BarScaleContext): number {\n for (let i = 0; i < categories.length; i++) {\n const center = sc.bandCenter(categories[i]);\n const start = center - sc.bandwidth / 2;\n\n if (pos >= start && pos < start + sc.bandwidth) return i;\n }\n\n return -1;\n}\n\nexport function findSeriesIdx(\n pos: { x: number; y: number },\n catIdx: number,\n categories: string[],\n sc: BarScaleContext,\n seriesCount: number,\n): number {\n if (sc.stacked) {\n if (sc.horizontal) {\n for (let si = 0; si < seriesCount; si++) {\n const rightX = sc.valueScale.map(sc.stackedTops[si]?.[catIdx] ?? 0);\n\n if (rightX >= pos.x) return si;\n }\n\n return seriesCount - 1;\n } else {\n for (let si = 0; si < seriesCount; si++) {\n const topY = sc.valueScale.map(sc.stackedTops[si]?.[catIdx] ?? 0);\n\n if (topY <= pos.y) return si;\n }\n\n return seriesCount - 1;\n }\n } else {\n const subSize = sc.bandwidth / seriesCount;\n const bandStart = sc.bandCenter(categories[catIdx]) - sc.bandwidth / 2;\n const offset = sc.horizontal ? pos.y - bandStart : pos.x - bandStart;\n const subIdx = Math.floor(offset / subSize);\n\n return Math.max(0, Math.min(seriesCount - 1, subIdx));\n }\n}\n\nexport function isOutsideBars(\n pos: { x: number; y: number },\n catIdx: number,\n allData: Datum[][],\n sc: BarScaleContext,\n seriesCount: number,\n): boolean {\n const lastSi = seriesCount - 1;\n const maxVal = sc.stacked\n ? (sc.stackedTops[lastSi]?.[catIdx] ?? 0)\n : Math.max(...Array.from({ length: seriesCount }, (_, si) => allData[si]?.[catIdx]?.value ?? 0));\n const maxPx = sc.valueScale.map(maxVal);\n\n return sc.horizontal ? pos.x > maxPx : pos.y < maxPx;\n}\n"],"mappings":";AAGA,SAAgB,EAAW,GAAa,GAAsB,GAA6B;CACzF,KAAK,IAAI,IAAI,GAAG,IAAI,EAAW,QAAQ,KAAK;EAE1C,IAAM,IADS,EAAG,WAAW,EAAW,EAC1B,IAAS,EAAG,YAAY;EAEtC,IAAI,KAAO,KAAS,IAAM,IAAQ,EAAG,WAAW,OAAO;CACzD;CAEA,OAAO;AACT;AAEA,SAAgB,EACd,GACA,GACA,GACA,GACA,GACQ;CACR,IAAI,EAAG,SACL,IAAI,EAAG,YAAY;EACjB,KAAK,IAAI,IAAK,GAAG,IAAK,GAAa,KAGjC,IAFe,EAAG,WAAW,IAAI,EAAG,YAAY,EAAG,GAAG,MAAW,CAE7D,KAAU,EAAI,GAAG,OAAO;EAG9B,OAAO,IAAc;CACvB,OAAO;EACL,KAAK,IAAI,IAAK,GAAG,IAAK,GAAa,KAGjC,IAFa,EAAG,WAAW,IAAI,EAAG,YAAY,EAAG,GAAG,MAAW,CAE3D,KAAQ,EAAI,GAAG,OAAO;EAG5B,OAAO,IAAc;CACvB;MACK;EACL,IAAM,IAAU,EAAG,YAAY,GACzB,IAAY,EAAG,WAAW,EAAW,EAAO,IAAI,EAAG,YAAY,GAC/D,IAAS,EAAG,aAAa,EAAI,IAAI,IAAY,EAAI,IAAI,GACrD,IAAS,KAAK,MAAM,IAAS,CAAO;EAE1C,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAc,GAAG,CAAM,CAAC;CACtD;AACF;AAEA,SAAgB,EACd,GACA,GACA,GACA,GACA,GACS;CACT,IAAM,IAAS,IAAc,GACvB,IAAS,EAAG,UACb,EAAG,YAAY,EAAO,GAAG,MAAW,IACrC,KAAK,IAAI,GAAG,MAAM,KAAK,EAAE,QAAQ,EAAY,IAAI,GAAG,MAAO,EAAQ,EAAG,GAAG,EAAO,EAAE,SAAS,CAAC,CAAC,GAC3F,IAAQ,EAAG,WAAW,IAAI,CAAM;CAEtC,OAAO,EAAG,aAAa,EAAI,IAAI,IAAQ,EAAI,IAAI;AACjD"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../svg/element.cjs"),t=require("../../animation/transition.cjs");var n=new WeakMap;function r(r,i,a,o,s,c){for(;r.children.length>i.length;){let e=r.lastElementChild;e&&r.removeChild(e)}let l=a.bandwidth(),u=c.stacked?l:l/c.seriesCount,d=c.stacked?0:u*c.seriesIndex,f=c.horizontal??!1,p=[],m=[];for(let t=0;t<i.length;t++){let n=i[t],l=a.map(n.key)+d,h=c.baselineYs?c.baselineYs[t]:s,g=o.map(n.y),_=r.children[t],v=!_;if(_||(_=e.createSvgElement(`rect`,{class:`prism-bar`}),r.appendChild(_)),f){let t=Math.max(0,Math.abs(h-g)),n=Math.min(g,h);e.setAttributes(_,{fill:c.color,height:Math.max(0,u-1),rx:c.borderRadius,ry:c.borderRadius,y:l}),c.transition?v?(e.setAttributes(_,{width:0,x:h}),p.push({attrs:{width:{from:0,to:t},x:{from:h,to:n}},el:_})):m.push({attrs:{width:{from:Number(_.getAttribute(`width`)??t),to:t},x:{from:Number(_.getAttribute(`x`)??n),to:n}},el:_}):e.setAttributes(_,{width:t,x:n})}else{let t=Math.max(0,Math.abs(h-g)),n=Math.min(g,h);e.setAttributes(_,{fill:c.color,rx:c.borderRadius,ry:c.borderRadius,width:Math.max(0,u-1),x:l}),c.transition?v?(e.setAttributes(_,{height:0,y:h}),p.push({attrs:{height:{from:0,to:t},y:{from:h,to:n}},el:_})):m.push({attrs:{height:{from:Number(_.getAttribute(`height`)??t),to:t},y:{from:Number(_.getAttribute(`y`)??n),to:n}},el:_}):e.setAttributes(_,{height:t,y:n})}}if(c.transition){n.get(r)?.();let e=[];p.length>0&&e.push(t.animate(p,c.transition,void 0,c.disposalSignal)),m.length>0&&e.push(t.animate(m,{...c.transition,stagger:0},void 0,c.disposalSignal)),n.set(r,()=>{for(let t of e)t()})}}exports.renderBars=r;
2
+ //# sourceMappingURL=bar-renderer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-renderer.cjs","names":[],"sources":["../../../src/charts/bar/bar-renderer.ts"],"sourcesContent":["import type { AnimationTarget } from '../../animation/transition';\nimport type { BandScale, Scale, TransitionConfig } from '../../types';\n\nimport { animate } from '../../animation/transition';\nimport { createSvgElement, setAttributes } from '../../svg/element';\n\nexport interface BarRenderOptions {\n baselineYs?: number[];\n borderRadius: number;\n color: string;\n /** Aborted when the owning chart is disposed — stops in-flight transitions from rescheduling. */\n disposalSignal?: AbortSignal;\n horizontal?: boolean;\n seriesCount: number;\n seriesIndex: number;\n stacked?: boolean;\n transition?: TransitionConfig;\n}\n\nconst activeBarAnimations = new WeakMap<SVGGElement, () => void>();\n\nexport function renderBars(\n parent: SVGGElement,\n data: { base: number; key: string; y: number }[],\n xScale: BandScale,\n yScale: Scale<number>,\n baselineY: number,\n options: BarRenderOptions,\n): void {\n while (parent.children.length > data.length) {\n const last = parent.lastElementChild;\n\n if (last) parent.removeChild(last);\n }\n\n const bandwidth = xScale.bandwidth();\n const barBand = options.stacked ? bandwidth : bandwidth / options.seriesCount;\n const offset = options.stacked ? 0 : barBand * options.seriesIndex;\n const horizontal = options.horizontal ?? false;\n\n const enterTargets: AnimationTarget[] = [];\n const updateTargets: AnimationTarget[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n const bandPos = xScale.map(d.key) + offset;\n const barBaselineY = options.baselineYs ? options.baselineYs[i] : baselineY;\n const valuePx = yScale.map(d.y);\n\n let rect = parent.children[i] as SVGRectElement | undefined;\n\n const isNew = !rect;\n\n if (!rect) {\n rect = createSvgElement('rect', { class: 'prism-bar' });\n parent.appendChild(rect);\n }\n\n if (horizontal) {\n // Horizontal: category on Y axis, value on X axis\n // baselineY here is actually the baseline X (yScale.map(0) in value-space mapped to screen X)\n const finalWidth = Math.max(0, Math.abs(barBaselineY - valuePx));\n const finalX = Math.min(valuePx, barBaselineY);\n\n setAttributes(rect, {\n fill: options.color,\n height: Math.max(0, barBand - 1),\n rx: options.borderRadius,\n ry: options.borderRadius,\n y: bandPos,\n });\n\n if (options.transition) {\n if (isNew) {\n setAttributes(rect, { width: 0, x: barBaselineY });\n enterTargets.push({\n attrs: { width: { from: 0, to: finalWidth }, x: { from: barBaselineY, to: finalX } },\n el: rect,\n });\n } else {\n updateTargets.push({\n attrs: {\n width: { from: Number(rect.getAttribute('width') ?? finalWidth), to: finalWidth },\n x: { from: Number(rect.getAttribute('x') ?? finalX), to: finalX },\n },\n el: rect,\n });\n }\n } else {\n setAttributes(rect, { width: finalWidth, x: finalX });\n }\n } else {\n // Vertical (default)\n const finalHeight = Math.max(0, Math.abs(barBaselineY - valuePx));\n const finalY = Math.min(valuePx, barBaselineY);\n\n setAttributes(rect, {\n fill: options.color,\n rx: options.borderRadius,\n ry: options.borderRadius,\n width: Math.max(0, barBand - 1),\n x: bandPos,\n });\n\n if (options.transition) {\n if (isNew) {\n setAttributes(rect, { height: 0, y: barBaselineY });\n enterTargets.push({\n attrs: { height: { from: 0, to: finalHeight }, y: { from: barBaselineY, to: finalY } },\n el: rect,\n });\n } else {\n updateTargets.push({\n attrs: {\n height: { from: Number(rect.getAttribute('height') ?? finalHeight), to: finalHeight },\n y: { from: Number(rect.getAttribute('y') ?? finalY), to: finalY },\n },\n el: rect,\n });\n }\n } else {\n setAttributes(rect, { height: finalHeight, y: finalY });\n }\n }\n }\n\n if (options.transition) {\n activeBarAnimations.get(parent)?.();\n\n const cancels: (() => void)[] = [];\n\n if (enterTargets.length > 0) {\n cancels.push(animate(enterTargets, options.transition, undefined, options.disposalSignal));\n }\n\n if (updateTargets.length > 0) {\n cancels.push(animate(updateTargets, { ...options.transition, stagger: 0 }, undefined, options.disposalSignal));\n }\n\n activeBarAnimations.set(parent, () => {\n for (const cancel of cancels) cancel();\n });\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { BandScale, Scale, TransitionConfig } from '../../types';
2
+ export interface BarRenderOptions {
3
+ baselineYs?: number[];
4
+ borderRadius: number;
5
+ color: string;
6
+ /** Aborted when the owning chart is disposed — stops in-flight transitions from rescheduling. */
7
+ disposalSignal?: AbortSignal;
8
+ horizontal?: boolean;
9
+ seriesCount: number;
10
+ seriesIndex: number;
11
+ stacked?: boolean;
12
+ transition?: TransitionConfig;
13
+ }
14
+ export declare function renderBars(parent: SVGGElement, data: {
15
+ base: number;
16
+ key: string;
17
+ y: number;
18
+ }[], xScale: BandScale, yScale: Scale<number>, baselineY: number, options: BarRenderOptions): void;
19
+ //# sourceMappingURL=bar-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-renderer.d.ts","sourceRoot":"","sources":["../../../src/charts/bar/bar-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKtE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAID,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAChD,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAmHN"}