@vielzeug/prism 3.0.0 → 26.10.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 (160) hide show
  1. package/dist/_dev.cjs +1 -1
  2. package/dist/_dev.cjs.map +1 -1
  3. package/dist/_dev.js +1 -5
  4. package/dist/_dev.js.map +1 -1
  5. package/dist/animation/easing.cjs +1 -1
  6. package/dist/animation/easing.cjs.map +1 -1
  7. package/dist/animation/easing.js +1 -13
  8. package/dist/animation/easing.js.map +1 -1
  9. package/dist/animation/motion.cjs +1 -1
  10. package/dist/animation/motion.cjs.map +1 -1
  11. package/dist/animation/motion.js +1 -12
  12. package/dist/animation/motion.js.map +1 -1
  13. package/dist/animation/transition.cjs +1 -1
  14. package/dist/animation/transition.cjs.map +1 -1
  15. package/dist/animation/transition.js +1 -28
  16. package/dist/animation/transition.js.map +1 -1
  17. package/dist/animation/tween.cjs +1 -1
  18. package/dist/animation/tween.cjs.map +1 -1
  19. package/dist/animation/tween.js +1 -7
  20. package/dist/animation/tween.js.map +1 -1
  21. package/dist/axes/axis.cjs +1 -1
  22. package/dist/axes/axis.cjs.map +1 -1
  23. package/dist/axes/axis.js +1 -63
  24. package/dist/axes/axis.js.map +1 -1
  25. package/dist/axes/grid.cjs +1 -1
  26. package/dist/axes/grid.cjs.map +1 -1
  27. package/dist/axes/grid.js +1 -29
  28. package/dist/axes/grid.js.map +1 -1
  29. package/dist/axes/scale-utils.cjs +1 -1
  30. package/dist/axes/scale-utils.cjs.map +1 -1
  31. package/dist/axes/scale-utils.js +1 -10
  32. package/dist/axes/scale-utils.js.map +1 -1
  33. package/dist/charts/area/area-chart.cjs +1 -1
  34. package/dist/charts/area/area-chart.cjs.map +1 -1
  35. package/dist/charts/area/area-chart.js +1 -57
  36. package/dist/charts/area/area-chart.js.map +1 -1
  37. package/dist/charts/area/area-renderer.cjs +1 -1
  38. package/dist/charts/area/area-renderer.cjs.map +1 -1
  39. package/dist/charts/area/area-renderer.js +1 -73
  40. package/dist/charts/area/area-renderer.js.map +1 -1
  41. package/dist/charts/bar/bar-chart.cjs +1 -1
  42. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  43. package/dist/charts/bar/bar-chart.js +1 -169
  44. package/dist/charts/bar/bar-chart.js.map +1 -1
  45. package/dist/charts/bar/bar-hit-test.cjs +1 -1
  46. package/dist/charts/bar/bar-hit-test.cjs.map +1 -1
  47. package/dist/charts/bar/bar-hit-test.js +1 -29
  48. package/dist/charts/bar/bar-hit-test.js.map +1 -1
  49. package/dist/charts/bar/bar-renderer.cjs +1 -1
  50. package/dist/charts/bar/bar-renderer.cjs.map +1 -1
  51. package/dist/charts/bar/bar-renderer.js +1 -106
  52. package/dist/charts/bar/bar-renderer.js.map +1 -1
  53. package/dist/charts/line/line-chart.cjs +1 -1
  54. package/dist/charts/line/line-chart.cjs.map +1 -1
  55. package/dist/charts/line/line-chart.js +1 -58
  56. package/dist/charts/line/line-chart.js.map +1 -1
  57. package/dist/charts/line/line-renderer.cjs +1 -1
  58. package/dist/charts/line/line-renderer.cjs.map +1 -1
  59. package/dist/charts/line/line-renderer.js +1 -100
  60. package/dist/charts/line/line-renderer.js.map +1 -1
  61. package/dist/charts/pie/pie-chart.cjs +1 -1
  62. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  63. package/dist/charts/pie/pie-chart.js +1 -165
  64. package/dist/charts/pie/pie-chart.js.map +1 -1
  65. package/dist/charts/pie/pie-renderer.cjs +1 -1
  66. package/dist/charts/pie/pie-renderer.cjs.map +1 -1
  67. package/dist/charts/pie/pie-renderer.js +1 -76
  68. package/dist/charts/pie/pie-renderer.js.map +1 -1
  69. package/dist/charts/sparkline/sparkline.cjs +1 -1
  70. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  71. package/dist/charts/sparkline/sparkline.js +1 -191
  72. package/dist/charts/sparkline/sparkline.js.map +1 -1
  73. package/dist/core/cartesian-model.cjs +1 -1
  74. package/dist/core/cartesian-model.cjs.map +1 -1
  75. package/dist/core/cartesian-model.js +1 -30
  76. package/dist/core/cartesian-model.js.map +1 -1
  77. package/dist/core/cartesian-scales.cjs +1 -1
  78. package/dist/core/cartesian-scales.cjs.map +1 -1
  79. package/dist/core/cartesian-scales.js +1 -37
  80. package/dist/core/cartesian-scales.js.map +1 -1
  81. package/dist/core/chart-base.cjs +1 -1
  82. package/dist/core/chart-base.cjs.map +1 -1
  83. package/dist/core/chart-base.js +1 -53
  84. package/dist/core/chart-base.js.map +1 -1
  85. package/dist/core/chart-scaffold.cjs +1 -1
  86. package/dist/core/chart-scaffold.cjs.map +1 -1
  87. package/dist/core/chart-scaffold.js +1 -89
  88. package/dist/core/chart-scaffold.js.map +1 -1
  89. package/dist/core/layout.cjs +1 -1
  90. package/dist/core/layout.cjs.map +1 -1
  91. package/dist/core/layout.js +1 -22
  92. package/dist/core/layout.js.map +1 -1
  93. package/dist/core/responsive.cjs +1 -1
  94. package/dist/core/responsive.cjs.map +1 -1
  95. package/dist/core/responsive.js +1 -19
  96. package/dist/core/responsive.js.map +1 -1
  97. package/dist/devtools.cjs +1 -1
  98. package/dist/devtools.cjs.map +1 -1
  99. package/dist/devtools.js +1 -18
  100. package/dist/devtools.js.map +1 -1
  101. package/dist/errors.cjs +1 -1
  102. package/dist/errors.cjs.map +1 -1
  103. package/dist/errors.js +1 -9
  104. package/dist/errors.js.map +1 -1
  105. package/dist/index.js +1 -11
  106. package/dist/interaction/crosshair.cjs +1 -1
  107. package/dist/interaction/crosshair.cjs.map +1 -1
  108. package/dist/interaction/crosshair.js +1 -45
  109. package/dist/interaction/crosshair.js.map +1 -1
  110. package/dist/interaction/events.cjs +1 -1
  111. package/dist/interaction/events.cjs.map +1 -1
  112. package/dist/interaction/events.js +1 -11
  113. package/dist/interaction/events.js.map +1 -1
  114. package/dist/interaction/legend.cjs +1 -1
  115. package/dist/interaction/legend.cjs.map +1 -1
  116. package/dist/interaction/legend.js +1 -30
  117. package/dist/interaction/legend.js.map +1 -1
  118. package/dist/interaction/series-interaction.cjs +1 -1
  119. package/dist/interaction/series-interaction.cjs.map +1 -1
  120. package/dist/interaction/series-interaction.js +1 -97
  121. package/dist/interaction/series-interaction.js.map +1 -1
  122. package/dist/interaction/tooltip.cjs +1 -1
  123. package/dist/interaction/tooltip.cjs.map +1 -1
  124. package/dist/interaction/tooltip.js +1 -63
  125. package/dist/interaction/tooltip.js.map +1 -1
  126. package/dist/prism.cjs +1 -1
  127. package/dist/prism.cjs.map +1 -1
  128. package/dist/prism.iife.js +1 -1
  129. package/dist/prism.iife.js.map +1 -1
  130. package/dist/prism.js +1 -1
  131. package/dist/prism.js.map +1 -1
  132. package/dist/scales/band.cjs +1 -1
  133. package/dist/scales/band.cjs.map +1 -1
  134. package/dist/scales/band.js +1 -39
  135. package/dist/scales/band.js.map +1 -1
  136. package/dist/scales/linear.cjs +1 -1
  137. package/dist/scales/linear.cjs.map +1 -1
  138. package/dist/scales/linear.js +1 -43
  139. package/dist/scales/linear.js.map +1 -1
  140. package/dist/scales/time.cjs +1 -1
  141. package/dist/scales/time.cjs.map +1 -1
  142. package/dist/scales/time.js +1 -61
  143. package/dist/scales/time.js.map +1 -1
  144. package/dist/svg/element.cjs +1 -1
  145. package/dist/svg/element.cjs.map +1 -1
  146. package/dist/svg/element.js +1 -22
  147. package/dist/svg/element.js.map +1 -1
  148. package/dist/svg/path.cjs +1 -1
  149. package/dist/svg/path.cjs.map +1 -1
  150. package/dist/svg/path.js +1 -48
  151. package/dist/svg/path.js.map +1 -1
  152. package/dist/svg/text.cjs +1 -1
  153. package/dist/svg/text.cjs.map +1 -1
  154. package/dist/svg/text.js +1 -9
  155. package/dist/svg/text.js.map +1 -1
  156. package/dist/theme/index.cjs +1 -1
  157. package/dist/theme/index.cjs.map +1 -1
  158. package/dist/theme/index.js +1 -19
  159. package/dist/theme/index.js.map +1 -1
  160. package/package.json +5 -5
@@ -1,58 +1,2 @@
1
- import { createSvgElement as e } from "../../svg/element.js";
2
- import { positionAxis as t, renderAxis as n, resolveTickCount as r } from "../../axes/axis.js";
3
- import { renderGrid as i } from "../../axes/grid.js";
4
- import { buildXScale as a, buildYScale as o } from "../../core/cartesian-scales.js";
5
- import { chartArea as s } from "../../core/layout.js";
6
- import { clearCartesianDom as c, createChartScaffold as l } from "../../core/chart-scaffold.js";
7
- import { createCrosshair as u } from "../../interaction/crosshair.js";
8
- import { createSeriesInteraction as d } from "../../interaction/series-interaction.js";
9
- import { seriesColor as f } from "../../theme/index.js";
10
- import { computeAreaPoints as p, renderArea as m } from "./area-renderer.js";
11
- //#region src/charts/area/area-chart.ts
12
- function h(h, g) {
13
- let _ = null, v = g.series;
14
- return l(h, g, (l) => {
15
- let { groups: h, legend: y, tooltip: b } = l, x = l.dimensions, S = s(x.width, x.height, x.margin), C = v.map((e) => e.data), w = C.flat().map((e) => e.key), T = C.flat().map((e) => e.value);
16
- if (w.length === 0) {
17
- c(h, y, b, _);
18
- return;
19
- }
20
- g.crosshair && !_ && (_ = u(l.chartArea, g.crosshair));
21
- let E = a(w, S.width), D = o(T, S.height), O = D.map(0);
22
- for (g.yAxis?.grid && i(h.grid, D, g.yAxis.grid, S.width, "horizontal", r(g.yAxis, S.height, "left")), g.xAxis?.grid && i(h.grid, E, g.xAxis.grid, S.height, "vertical", r(g.xAxis, S.width, "bottom")), g.xAxis && (t(h.xAxis, g.xAxis.position ?? "bottom", S.width, S.height), n(h.xAxis, E, g.xAxis, S.width, "bottom")), g.yAxis && (t(h.yAxis, g.yAxis.position ?? "left", S.width, S.height), n(h.yAxis, D, g.yAxis, S.height, "left")); h.series.children.length > v.length;) h.series.removeChild(h.series.lastChild);
23
- let k = [];
24
- for (let t = 0; t < v.length; t++) {
25
- let n = v[t], r = h.series.children[t];
26
- r || (r = e("g", { class: "prism-area-series" }), h.series.appendChild(r));
27
- let i = p(C[t], E, D);
28
- k.push(i), m(r, i, O, {
29
- color: f(t, n.color),
30
- curve: n.curve ?? "linear",
31
- disposalSignal: l.disposalSignal,
32
- fillOpacity: n.fillOpacity ?? .3,
33
- showLine: n.showLine !== !1,
34
- transition: g.transition
35
- });
36
- }
37
- return y?.update(v.map((e, t) => ({
38
- color: f(t, e.color),
39
- name: e.name
40
- }))), b?.hide(), d({
41
- crosshair: _,
42
- dims: () => l.dimensions,
43
- getData: () => C,
44
- getPoints: () => k,
45
- getSeriesList: () => v,
46
- onClick: g.onClick,
47
- onHover: g.onHover,
48
- svg: l.svg,
49
- tooltip: b
50
- });
51
- }, (e) => {
52
- v = e;
53
- });
54
- }
55
- //#endregion
56
- export { h as createAreaChart };
57
-
1
+ import{createSvgElement as e}from"../../svg/element.js";import{positionAxis as t,renderAxis as n,resolveTickCount as r}from"../../axes/axis.js";import{renderGrid as i}from"../../axes/grid.js";import{buildXScale as a,buildYScale as o}from"../../core/cartesian-scales.js";import{chartArea as s}from"../../core/layout.js";import{clearCartesianDom as c,createChartScaffold as l}from"../../core/chart-scaffold.js";import{createCrosshair as u}from"../../interaction/crosshair.js";import{createSeriesInteraction as d}from"../../interaction/series-interaction.js";import{seriesColor as f}from"../../theme/index.js";import{computeAreaPoints as p,renderArea as m}from"./area-renderer.js";function createAreaChart(h,g){let _=null,v=g.series;return l(h,g,l=>{let{groups:h,legend:y,tooltip:b}=l,x=l.dimensions,S=s(x.width,x.height,x.margin),C=v.map(e=>e.data),w=C.flat().map(e=>e.key),T=C.flat().map(e=>e.value);if(w.length===0){c(h,y,b,_);return}g.crosshair&&!_&&(_=u(l.chartArea,g.crosshair));let E=a(w,S.width),D=o(T,S.height),O=D.map(0);for(g.yAxis?.grid&&i(h.grid,D,g.yAxis.grid,S.width,`horizontal`,r(g.yAxis,S.height,`left`)),g.xAxis?.grid&&i(h.grid,E,g.xAxis.grid,S.height,`vertical`,r(g.xAxis,S.width,`bottom`)),g.xAxis&&(t(h.xAxis,g.xAxis.position??`bottom`,S.width,S.height),n(h.xAxis,E,g.xAxis,S.width,`bottom`)),g.yAxis&&(t(h.yAxis,g.yAxis.position??`left`,S.width,S.height),n(h.yAxis,D,g.yAxis,S.height,`left`));h.series.children.length>v.length;)h.series.removeChild(h.series.lastChild);let k=[];for(let t=0;t<v.length;t++){let n=v[t],r=h.series.children[t];r||(r=e(`g`,{class:`prism-area-series`}),h.series.appendChild(r));let i=p(C[t],E,D);k.push(i),m(r,i,O,{color:f(t,n.color),curve:n.curve??`linear`,disposalSignal:l.disposalSignal,fillOpacity:n.fillOpacity??.3,showLine:n.showLine!==!1,transition:g.transition})}return y?.update(v.map((e,t)=>({color:f(t,e.color),name:e.name}))),b?.hide(),d({crosshair:_,dims:()=>l.dimensions,getData:()=>C,getPoints:()=>k,getSeriesList:()=>v,onClick:g.onClick,onHover:g.onHover,svg:l.svg,tooltip:b})},e=>{v=e})}export{createAreaChart};
58
2
  //# sourceMappingURL=area-chart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"area-chart.js","names":[],"sources":["../../../src/charts/area/area-chart.ts"],"sourcesContent":["import { positionAxis, 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 type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { AreaChartConfig, AreaSeriesConfig, ChartHandle } from '../../types';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle<AreaSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\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, 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 positionAxis(groups.xAxis, config.xAxis.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, config.xAxis, area.width, 'bottom');\n }\n\n if (config.yAxis) {\n positionAxis(groups.yAxis, config.yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, yScale, config.yAxis, area.height, 'left');\n }\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,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n onClick: config.onClick,\n onHover: config.onHover,\n svg: ctx.svg,\n tooltip,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":";;;;;;;;;;;AAaA,SAAgB,EAAgB,GAAwB,GAA0D;CAChH,IAAI,IAAuD,MACvD,IAAa,EAAO;CAExB,OAAO,EACL,GACA,IACC,MAAQ;EACP,IAAM,EAAE,WAAQ,WAAQ,eAAY,GAC9B,IAAO,EAAI,YACX,IAAO,EAAU,EAAK,OAAO,EAAK,QAAQ,EAAK,MAAM,GACrD,IAAU,EAAW,KAAK,MAAW,EAAO,IAAI,GAChD,IAAO,EAAQ,KAAK,CAAC,CAAC,KAAK,MAAU,EAAM,GAAG,GAC9C,IAAO,EAAQ,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;EAE9C,IAAI,EAAK,WAAW,GAAG;GACrB,EAAkB,GAAQ,GAAQ,GAAS,CAAS;GAEpD;EACF;EAEA,AAAI,EAAO,aAAa,CAAC,MACvB,IAAY,EAAgB,EAAI,WAAW,EAAO,SAAS;EAG7D,IAAM,IAAS,EAAY,GAAM,EAAK,KAAK,GACrC,IAAS,EAAY,GAAM,EAAK,MAAM,GACtC,IAAY,EAAO,IAAI,CAAC;EAkC9B,KAhCI,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,EAAa,EAAO,OAAO,EAAO,MAAM,YAAY,UAAU,EAAK,OAAO,EAAK,MAAM,GACrF,EAAW,EAAO,OAAO,GAAQ,EAAO,OAAO,EAAK,OAAO,QAAQ,IAGjE,EAAO,UACT,EAAa,EAAO,OAAO,EAAO,MAAM,YAAY,QAAQ,EAAK,OAAO,EAAK,MAAM,GACnF,EAAW,EAAO,OAAO,GAAQ,EAAO,OAAO,EAAK,QAAQ,MAAM,IAG7D,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;GAChB,eAAe;GACf,iBAAiB;GACjB,qBAAqB;GACrB,SAAS,EAAO;GAChB,SAAS,EAAO;GAChB,KAAK,EAAI;GACT;EACF,CAAC;CACH,IACC,MAAS;EACR,IAAa;CACf,CACF;AACF"}
1
+ {"version":3,"file":"area-chart.js","names":[],"sources":["../../../src/charts/area/area-chart.ts"],"sourcesContent":["import { positionAxis, 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 type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { AreaChartConfig, AreaSeriesConfig, ChartHandle } from '../../types';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle<AreaSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\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, 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 positionAxis(groups.xAxis, config.xAxis.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, config.xAxis, area.width, 'bottom');\n }\n\n if (config.yAxis) {\n positionAxis(groups.yAxis, config.yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, yScale, config.yAxis, area.height, 'left');\n }\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,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n onClick: config.onClick,\n onHover: config.onHover,\n svg: ctx.svg,\n tooltip,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"sqBAaA,SAAgB,gBAAgB,EAAwB,EAA0D,CAChH,IAAI,EAAuD,KACvD,EAAa,EAAO,OAExB,OAAO,EACL,EACA,EACC,GAAQ,CACP,GAAM,CAAE,SAAQ,SAAQ,WAAY,EAC9B,EAAO,EAAI,WACX,EAAO,EAAU,EAAK,MAAO,EAAK,OAAQ,EAAK,MAAM,EACrD,EAAU,EAAW,IAAK,GAAW,EAAO,IAAI,EAChD,EAAO,EAAQ,KAAK,CAAC,CAAC,IAAK,GAAU,EAAM,GAAG,EAC9C,EAAO,EAAQ,KAAK,CAAC,CAAC,IAAK,GAAM,EAAE,KAAK,EAE9C,GAAI,EAAK,SAAW,EAAG,CACrB,EAAkB,EAAQ,EAAQ,EAAS,CAAS,EAEpD,MACF,CAEI,EAAO,WAAa,CAAC,IACvB,EAAY,EAAgB,EAAI,UAAW,EAAO,SAAS,GAG7D,IAAM,EAAS,EAAY,EAAM,EAAK,KAAK,EACrC,EAAS,EAAY,EAAM,EAAK,MAAM,EACtC,EAAY,EAAO,IAAI,CAAC,EAkC9B,IAhCI,EAAO,OAAO,MAChB,EACE,EAAO,KACP,EACA,EAAO,MAAM,KACb,EAAK,MACL,aACA,EAAiB,EAAO,MAAO,EAAK,OAAQ,MAAM,CACpD,EAGE,EAAO,OAAO,MAChB,EACE,EAAO,KACP,EACA,EAAO,MAAM,KACb,EAAK,OACL,WACA,EAAiB,EAAO,MAAO,EAAK,MAAO,QAAQ,CACrD,EAGE,EAAO,QACT,EAAa,EAAO,MAAO,EAAO,MAAM,UAAY,SAAU,EAAK,MAAO,EAAK,MAAM,EACrF,EAAW,EAAO,MAAO,EAAQ,EAAO,MAAO,EAAK,MAAO,QAAQ,GAGjE,EAAO,QACT,EAAa,EAAO,MAAO,EAAO,MAAM,UAAY,OAAQ,EAAK,MAAO,EAAK,MAAM,EACnF,EAAW,EAAO,MAAO,EAAQ,EAAO,MAAO,EAAK,OAAQ,MAAM,GAG7D,EAAO,OAAO,SAAS,OAAS,EAAW,QAChD,EAAO,OAAO,YAAY,EAAO,OAAO,SAAU,EAGpD,IAAM,EAAuB,CAAC,EAE9B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,IAAK,CAC1C,IAAM,EAAS,EAAW,GACtB,EAAQ,EAAO,OAAO,SAAS,GAE9B,IACH,EAAQ,EAAiB,IAAK,CAAE,MAAO,mBAAoB,CAAC,EAC5D,EAAO,OAAO,YAAY,CAAK,GAGjC,IAAM,EAAS,EAAkB,EAAQ,GAAI,EAAQ,CAAM,EAE3D,EAAU,KAAK,CAAM,EAErB,EAAW,EAAO,EAAQ,EAAW,CACnC,MAAO,EAAY,EAAG,EAAO,KAAK,EAClC,MAAO,EAAO,OAAS,SACvB,eAAgB,EAAI,eACpB,YAAa,EAAO,aAAe,GACnC,SAAU,EAAO,WAAa,GAC9B,WAAY,EAAO,UACrB,CAAC,CACH,CAKA,OAHA,GAAQ,OAAO,EAAW,KAAK,EAAG,KAAO,CAAE,MAAO,EAAY,EAAG,EAAE,KAAK,EAAG,KAAM,EAAE,IAAK,EAAE,CAAC,EAC3F,GAAS,KAAK,EAEP,EAAwB,CAC7B,YACA,SAAY,EAAI,WAChB,YAAe,EACf,cAAiB,EACjB,kBAAqB,EACrB,QAAS,EAAO,QAChB,QAAS,EAAO,QAChB,IAAK,EAAI,IACT,SACF,CAAC,CACH,EACC,GAAS,CACR,EAAa,CACf,CACF,CACF"}
@@ -1,2 +1,2 @@
1
- require("../../_dev.cjs");const e=require("../../svg/element.cjs"),t=require("../../animation/easing.cjs"),n=require("../../animation/motion.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(c,l,u,d){let f=n.resolveMotion(d.transition,0),p=f.duration,m=t.resolveEasing(f.easing),h=c.querySelector(`.prism-area-fill`);h||(h=e.createSvgElement(`path`,{class:`prism-area-fill`}),c.appendChild(h)),e.setAttributes(h,{fill:d.color,"fill-opacity":d.fillOpacity,stroke:`none`});let g=null;if(d.showLine?(g=c.querySelector(`.prism-area-line`),g||(g=e.createSvgElement(`path`,{class:`prism-area-line`,fill:`none`}),c.appendChild(g)),e.setAttributes(g,{stroke:d.color,"stroke-width":2})):c.querySelector(`.prism-area-line`)?.remove(),p===0){let t=l.map(e=>({x:e.x,y:u}));e.setAttributes(h,{d:i.areaPath(l,t,d.curve)}),g&&e.setAttributes(g,{d:s(l,d.curve)});return}if(a.get(c)?.(),!h.hasAttribute(`d`)){let t=l.map(e=>({x:e.x,y:u}));e.setAttributes(h,{d:i.areaPath(l,t,d.curve)}),g&&e.setAttributes(g,{d:s(l,d.curve)}),o.set(c,l);return}let _=o.get(c)??l,v=l.map((e,t)=>_[t]??_[_.length-1]??l[t]),y=null;function b(t){if(d.disposalSignal?.aborted){a.delete(c);return}y===null&&(y=t);let n=Math.min(1,(t-y)/p),f=m(n),_=l.map((e,t)=>({x:r.tweenNumber(v[t].x,e.x,f),y:r.tweenNumber(v[t].y,e.y,f)})),x=_.map(e=>({x:e.x,y:u}));if(e.setAttributes(h,{d:i.areaPath(_,x,d.curve)}),g&&e.setAttributes(g,{d:s(_,d.curve)}),n<1){let e=requestAnimationFrame(b);a.set(c,()=>cancelAnimationFrame(e))}else a.delete(c),o.set(c,l)}o.set(c,v);let x=requestAnimationFrame(b);a.set(c,()=>cancelAnimationFrame(x))}function l(e,t,n){return e.some(e=>e.key==null)||e.some(e=>typeof e.key==`string`),e.map(e=>({x:t.map(e.key),y:n.map(e.value)}))}exports.computeAreaPoints=l,exports.renderArea=c;
1
+ require("../../_dev.cjs");const e=require("../../svg/element.cjs"),t=require("../../animation/easing.cjs"),n=require("../../animation/motion.cjs"),r=require("../../animation/tween.cjs"),i=require("../../svg/path.cjs");var a=new WeakMap,o=new WeakMap;function buildLinePath(e,t){return t===`monotone`?i.monotonePath(e):t===`step`?i.stepPath(e):i.linePath(e)}function renderArea(s,c,l,u){let d=n.resolveMotion(u.transition,0),f=d.duration,p=t.resolveEasing(d.easing),m=s.querySelector(`.prism-area-fill`);m||(m=e.createSvgElement(`path`,{class:`prism-area-fill`}),s.appendChild(m)),e.setAttributes(m,{fill:u.color,"fill-opacity":u.fillOpacity,stroke:`none`});let h=null;if(u.showLine?(h=s.querySelector(`.prism-area-line`),h||(h=e.createSvgElement(`path`,{class:`prism-area-line`,fill:`none`}),s.appendChild(h)),e.setAttributes(h,{stroke:u.color,"stroke-width":2})):s.querySelector(`.prism-area-line`)?.remove(),f===0){let t=c.map(e=>({x:e.x,y:l}));e.setAttributes(m,{d:i.areaPath(c,t,u.curve)}),h&&e.setAttributes(h,{d:buildLinePath(c,u.curve)});return}if(a.get(s)?.(),!m.hasAttribute(`d`)){let t=c.map(e=>({x:e.x,y:l}));e.setAttributes(m,{d:i.areaPath(c,t,u.curve)}),h&&e.setAttributes(h,{d:buildLinePath(c,u.curve)}),o.set(s,c);return}let g=o.get(s)??c,_=c.map((e,t)=>g[t]??g[g.length-1]??c[t]),v=null;function frame(t){if(u.disposalSignal?.aborted){a.delete(s);return}v===null&&(v=t);let n=Math.min(1,(t-v)/f),d=p(n),g=c.map((e,t)=>({x:r.tweenNumber(_[t].x,e.x,d),y:r.tweenNumber(_[t].y,e.y,d)})),y=g.map(e=>({x:e.x,y:l}));if(e.setAttributes(m,{d:i.areaPath(g,y,u.curve)}),h&&e.setAttributes(h,{d:buildLinePath(g,u.curve)}),n<1){let e=requestAnimationFrame(frame);a.set(s,()=>cancelAnimationFrame(e))}else a.delete(s),o.set(s,c)}o.set(s,_);let y=requestAnimationFrame(frame);a.set(s,()=>cancelAnimationFrame(y))}function computeAreaPoints(e,t,n){return e.some(e=>e.key==null)||e.some(e=>typeof e.key==`string`),e.map(e=>({x:t.map(e.key),y:n.map(e.value)}))}exports.computeAreaPoints=computeAreaPoints,exports.renderArea=renderArea;
2
2
  //# sourceMappingURL=area-renderer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"area-renderer.cjs","names":[],"sources":["../../../src/charts/area/area-renderer.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { tweenNumber } from '../../animation/tween';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionConfig } from '../../types';\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 motion = resolveMotion(options.transition, 0);\n const dur = motion.duration;\n const easing = resolveEasing(motion.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(\n data: ContinuousDatum[],\n xScale: Scale<Date | number>,\n yScale: Scale<number>,\n): 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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"}
1
+ {"version":3,"file":"area-renderer.cjs","names":[],"sources":["../../../src/charts/area/area-renderer.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { tweenNumber } from '../../animation/tween';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionConfig } from '../../types';\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 motion = resolveMotion(options.transition, 0);\n const dur = motion.duration;\n const easing = resolveEasing(motion.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(\n data: ContinuousDatum[],\n xScale: Scale<Date | number>,\n yScale: Scale<number>,\n): 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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"}
@@ -1,74 +1,2 @@
1
- import "../../_dev.js";
2
- import { createSvgElement as e, setAttributes as t } from "../../svg/element.js";
3
- import { resolveEasing as n } from "../../animation/easing.js";
4
- import { resolveMotion as r } from "../../animation/motion.js";
5
- import { tweenNumber as i } from "../../animation/tween.js";
6
- import { areaPath as a, linePath as o, monotonePath as s, stepPath as c } from "../../svg/path.js";
7
- //#region src/charts/area/area-renderer.ts
8
- var l = /* @__PURE__ */ new WeakMap(), u = /* @__PURE__ */ new WeakMap();
9
- function d(e, t) {
10
- return t === "monotone" ? s(e) : t === "step" ? c(e) : o(e);
11
- }
12
- function f(o, s, c, f) {
13
- let p = r(f.transition, 0), m = p.duration, h = n(p.easing), g = o.querySelector(".prism-area-fill");
14
- g || (g = e("path", { class: "prism-area-fill" }), o.appendChild(g)), t(g, {
15
- fill: f.color,
16
- "fill-opacity": f.fillOpacity,
17
- stroke: "none"
18
- });
19
- let _ = null;
20
- if (f.showLine ? (_ = o.querySelector(".prism-area-line"), _ || (_ = e("path", {
21
- class: "prism-area-line",
22
- fill: "none"
23
- }), o.appendChild(_)), t(_, {
24
- stroke: f.color,
25
- "stroke-width": 2
26
- })) : o.querySelector(".prism-area-line")?.remove(), m === 0) {
27
- let e = s.map((e) => ({
28
- x: e.x,
29
- y: c
30
- }));
31
- t(g, { d: a(s, e, f.curve) }), _ && t(_, { d: d(s, f.curve) });
32
- return;
33
- }
34
- if (l.get(o)?.(), !g.hasAttribute("d")) {
35
- let e = s.map((e) => ({
36
- x: e.x,
37
- y: c
38
- }));
39
- t(g, { d: a(s, e, f.curve) }), _ && t(_, { d: d(s, f.curve) }), u.set(o, s);
40
- return;
41
- }
42
- let v = u.get(o) ?? s, y = s.map((e, t) => v[t] ?? v[v.length - 1] ?? s[t]), b = null;
43
- function x(e) {
44
- if (f.disposalSignal?.aborted) {
45
- l.delete(o);
46
- return;
47
- }
48
- b === null && (b = e);
49
- let n = Math.min(1, (e - b) / m), r = h(n), p = s.map((e, t) => ({
50
- x: i(y[t].x, e.x, r),
51
- y: i(y[t].y, e.y, r)
52
- })), v = p.map((e) => ({
53
- x: e.x,
54
- y: c
55
- }));
56
- if (t(g, { d: a(p, v, f.curve) }), _ && t(_, { d: d(p, f.curve) }), n < 1) {
57
- let e = requestAnimationFrame(x);
58
- l.set(o, () => cancelAnimationFrame(e));
59
- } else l.delete(o), u.set(o, s);
60
- }
61
- u.set(o, y);
62
- let S = requestAnimationFrame(x);
63
- l.set(o, () => cancelAnimationFrame(S));
64
- }
65
- function p(e, t, n) {
66
- return e.some((e) => e.key == null) || e.some((e) => typeof e.key == "string"), e.map((e) => ({
67
- x: t.map(e.key),
68
- y: n.map(e.value)
69
- }));
70
- }
71
- //#endregion
72
- export { p as computeAreaPoints, f as renderArea };
73
-
1
+ import"../../_dev.js";import{createSvgElement as e,setAttributes as t}from"../../svg/element.js";import{resolveEasing as n}from"../../animation/easing.js";import{resolveMotion as r}from"../../animation/motion.js";import{tweenNumber as i}from"../../animation/tween.js";import{areaPath as a,linePath as o,monotonePath as s,stepPath as c}from"../../svg/path.js";var l=new WeakMap,u=new WeakMap;function buildLinePath(e,t){return t===`monotone`?s(e):t===`step`?c(e):o(e)}function renderArea(o,s,c,d){let f=r(d.transition,0),p=f.duration,m=n(f.easing),h=o.querySelector(`.prism-area-fill`);h||(h=e(`path`,{class:`prism-area-fill`}),o.appendChild(h)),t(h,{fill:d.color,"fill-opacity":d.fillOpacity,stroke:`none`});let g=null;if(d.showLine?(g=o.querySelector(`.prism-area-line`),g||(g=e(`path`,{class:`prism-area-line`,fill:`none`}),o.appendChild(g)),t(g,{stroke:d.color,"stroke-width":2})):o.querySelector(`.prism-area-line`)?.remove(),p===0){let e=s.map(e=>({x:e.x,y:c}));t(h,{d:a(s,e,d.curve)}),g&&t(g,{d:buildLinePath(s,d.curve)});return}if(l.get(o)?.(),!h.hasAttribute(`d`)){let e=s.map(e=>({x:e.x,y:c}));t(h,{d:a(s,e,d.curve)}),g&&t(g,{d:buildLinePath(s,d.curve)}),u.set(o,s);return}let _=u.get(o)??s,v=s.map((e,t)=>_[t]??_[_.length-1]??s[t]),y=null;function frame(e){if(d.disposalSignal?.aborted){l.delete(o);return}y===null&&(y=e);let n=Math.min(1,(e-y)/p),r=m(n),f=s.map((e,t)=>({x:i(v[t].x,e.x,r),y:i(v[t].y,e.y,r)})),_=f.map(e=>({x:e.x,y:c}));if(t(h,{d:a(f,_,d.curve)}),g&&t(g,{d:buildLinePath(f,d.curve)}),n<1){let e=requestAnimationFrame(frame);l.set(o,()=>cancelAnimationFrame(e))}else l.delete(o),u.set(o,s)}u.set(o,v);let b=requestAnimationFrame(frame);l.set(o,()=>cancelAnimationFrame(b))}function computeAreaPoints(e,t,n){return e.some(e=>e.key==null)||e.some(e=>typeof e.key==`string`),e.map(e=>({x:t.map(e.key),y:n.map(e.value)}))}export{computeAreaPoints,renderArea};
74
2
  //# sourceMappingURL=area-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"area-renderer.js","names":[],"sources":["../../../src/charts/area/area-renderer.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { tweenNumber } from '../../animation/tween';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionConfig } from '../../types';\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 motion = resolveMotion(options.transition, 0);\n const dur = motion.duration;\n const easing = resolveEasing(motion.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(\n data: ContinuousDatum[],\n xScale: Scale<Date | number>,\n yScale: Scale<number>,\n): 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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"}
1
+ {"version":3,"file":"area-renderer.js","names":[],"sources":["../../../src/charts/area/area-renderer.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { tweenNumber } from '../../animation/tween';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { areaPath, linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionConfig } from '../../types';\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 motion = resolveMotion(options.transition, 0);\n const dur = motion.duration;\n const easing = resolveEasing(motion.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(\n data: ContinuousDatum[],\n xScale: Scale<Date | number>,\n yScale: Scale<number>,\n): 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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"}
@@ -1,2 +1,2 @@
1
- require("../../_dev.cjs");const e=require("../../svg/element.cjs"),t=require("../../axes/axis.cjs"),n=require("../../axes/grid.cjs"),r=require("../../scales/linear.cjs"),i=require("../../core/layout.cjs"),a=require("../../core/chart-scaffold.cjs"),o=require("../../core/cartesian-model.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");function f(e){return{horizontal:e===`grouped-horizontal`||e===`stacked-horizontal`,stacked:e===`stacked`||e===`stacked-horizontal`}}function p(p,m){let h=m.series;return a.createChartScaffold(p,m,p=>{let{groups:g,legend:_,tooltip:v}=p,y=p.dimensions,b=i.chartArea(y.width,y.height,y.margin),x=h.map(e=>e.data),S=o.normalizeCartesianSeries(h,x),C=S.domain,w=S.series.map(({byKey:e})=>C.map(t=>e.get(t))),T=e=>{if(e)return{...e,tickFormat:t=>{let n=String(t),r=S.labels.get(n)??t;return e.tickFormat?e.tickFormat(r):String(r)}}};if(C.length===0){a.clearCartesianDom(g,_,v);return}let{horizontal:E,stacked:D}=f(m.variant??`grouped`),O,k;if(D){w.some(e=>e.some(e=>(e?.value??0)<0));let e=C.map((e,t)=>w.reduce((e,n)=>e+Math.max(0,n[t]?.value??0),0));O=Math.max(...e),k=0}else{let e=w.flatMap(e=>e.flatMap(e=>e?[e.value]:[]));O=Math.max(...e),k=Math.min(0,...e)}let A=E?l.bandScale({domain:C,range:[0,b.height]}):l.bandScale({domain:C,range:[0,b.width]}),j=E?r.linearScale({domain:[k,O],range:[0,b.width]}):r.linearScale({domain:[k,O],range:[b.height,0]}),M=[],N=Object.create(null);for(let e of C)N[e]=0;let P={bandCenter:e=>A.map(e)+A.bandwidth()/2,bandwidth:A.bandwidth(),baselinePx:j.map(0),horizontal:E,stacked:D,stackedTops:M,valueScale:j};if(E){m.xAxis?.grid&&n.renderGrid(g.grid,j,m.xAxis.grid,b.height,`vertical`,t.resolveTickCount(m.xAxis,b.width,`bottom`));let e=T(m.yAxis);e&&(t.positionAxis(g.yAxis,e.position??`left`,b.width,b.height),t.renderAxis(g.yAxis,A,e,b.height,`left`)),m.xAxis&&(t.positionAxis(g.xAxis,m.xAxis.position??`bottom`,b.width,b.height),t.renderAxis(g.xAxis,j,m.xAxis,b.width,`bottom`))}else{m.yAxis?.grid&&n.renderGrid(g.grid,j,m.yAxis.grid,b.width,`horizontal`,t.resolveTickCount(m.yAxis,b.height,`left`));let e=T(m.xAxis);e&&(t.positionAxis(g.xAxis,e.position??`bottom`,b.width,b.height),t.renderAxis(g.xAxis,A,e,b.width,`bottom`)),m.yAxis&&(t.positionAxis(g.yAxis,m.yAxis.position??`left`,b.width,b.height),t.renderAxis(g.yAxis,j,m.yAxis,b.height,`left`))}for(;g.series.children.length>h.length;){let e=g.series.lastElementChild;e&&g.series.removeChild(e)}for(let t=0;t<h.length;t++){let n=h[t],r=g.series.children[t];r||(r=e.createSvgElement(`g`,{class:`prism-bar-series`}),g.series.appendChild(r));let i=C.map((e,n)=>{let r=w[t]?.[n];if(D){let t=N[e]??0,n=t+Math.max(0,r?.value??0);return N[e]=n,{base:t,key:e,present:r!==void 0,y:n}}return{base:0,key:e,present:r!==void 0,y:r?.value??0}});M[t]=i.map(e=>e.y);let a=D?i.map(e=>j.map(e.base)):void 0;d.renderBars(r,i,A,j,P.baselinePx,{baselineYs:a,borderRadius:n.borderRadius??0,color:c.seriesColor(t,n.color),disposalSignal:p.disposalSignal,horizontal:E,seriesCount:h.length,seriesIndex:t,stacked:D,transition:m.transition})}return _?.update(h.map((e,t)=>({color:c.seriesColor(t,e.color),name:e.name}))),v?.hide(),{onClick:e=>{if(!m.onClick)return;let t=p.dimensions,n=s.getMousePosition(p.svg,e,t.margin.left,t.margin.top),r=i.chartArea(t.width,t.height,t.margin);if(n.x<0||n.x>r.width||n.y<0||n.y>r.height)return;let a=E?n.y:n.x,o=u.findCatIdx(a,C,P);if(o===-1)return;let c=u.findSeriesIdx(n,o,C,P,h.length),l=w[c]?.[o];l&&m.onClick({datum:l,originalEvent:e,series:h[c]})},onMouseLeave:()=>{v?.hide(),m.onHover?.(null)},onMouseMove:e=>{let t=p.dimensions,n=s.getMousePosition(p.svg,e,t.margin.left,t.margin.top),r=i.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 a=E?n.y:n.x,o=u.findCatIdx(a,C,P);if(o===-1){v?.hide();return}if(u.isOutsideBars(n,o,w,P,h.length)){v?.hide();return}let c=u.findSeriesIdx(n,o,C,P,h.length),l=w[c]?.[o];if(l){let n=P.bandCenter(C[o]),r=D?M[c]?.[o]??l.value:l.value,i=j.map(r),a=E?i+t.margin.left:n+t.margin.left,s=E?n+t.margin.top:i+t.margin.top;v?.show(a,s,l,h[c]),m.onHover?.({datum:l,originalEvent:e,series:h[c]})}}}},e=>{h=e})}exports.createBarChart=p;
1
+ require("../../_dev.cjs");const e=require("../../svg/element.cjs"),t=require("../../axes/axis.cjs"),n=require("../../axes/grid.cjs"),r=require("../../scales/linear.cjs"),i=require("../../core/layout.cjs"),a=require("../../core/chart-scaffold.cjs"),o=require("../../core/cartesian-model.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");function variantFlags(e){return{horizontal:e===`grouped-horizontal`||e===`stacked-horizontal`,stacked:e===`stacked`||e===`stacked-horizontal`}}function createBarChart(f,p){let m=p.series;return a.createChartScaffold(f,p,f=>{let{groups:h,legend:g,tooltip:_}=f,v=f.dimensions,y=i.chartArea(v.width,v.height,v.margin),b=m.map(e=>e.data),x=o.normalizeCartesianSeries(m,b),S=x.domain,C=x.series.map(({byKey:e})=>S.map(t=>e.get(t))),categoryAxis=e=>{if(e)return{...e,tickFormat:t=>{let n=String(t),r=x.labels.get(n)??t;return e.tickFormat?e.tickFormat(r):String(r)}}};if(S.length===0){a.clearCartesianDom(h,g,_);return}let{horizontal:w,stacked:T}=variantFlags(p.variant??`grouped`),E,D;if(T){C.some(e=>e.some(e=>(e?.value??0)<0));let e=S.map((e,t)=>C.reduce((e,n)=>e+Math.max(0,n[t]?.value??0),0));E=Math.max(...e),D=0}else{let e=C.flatMap(e=>e.flatMap(e=>e?[e.value]:[]));E=Math.max(...e),D=Math.min(0,...e)}let O=w?l.bandScale({domain:S,range:[0,y.height]}):l.bandScale({domain:S,range:[0,y.width]}),k=w?r.linearScale({domain:[D,E],range:[0,y.width]}):r.linearScale({domain:[D,E],range:[y.height,0]}),A=[],j=Object.create(null);for(let e of S)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};if(w){p.xAxis?.grid&&n.renderGrid(h.grid,k,p.xAxis.grid,y.height,`vertical`,t.resolveTickCount(p.xAxis,y.width,`bottom`));let e=categoryAxis(p.yAxis);e&&(t.positionAxis(h.yAxis,e.position??`left`,y.width,y.height),t.renderAxis(h.yAxis,O,e,y.height,`left`)),p.xAxis&&(t.positionAxis(h.xAxis,p.xAxis.position??`bottom`,y.width,y.height),t.renderAxis(h.xAxis,k,p.xAxis,y.width,`bottom`))}else{p.yAxis?.grid&&n.renderGrid(h.grid,k,p.yAxis.grid,y.width,`horizontal`,t.resolveTickCount(p.yAxis,y.height,`left`));let e=categoryAxis(p.xAxis);e&&(t.positionAxis(h.xAxis,e.position??`bottom`,y.width,y.height),t.renderAxis(h.xAxis,O,e,y.width,`bottom`)),p.yAxis&&(t.positionAxis(h.yAxis,p.yAxis.position??`left`,y.width,y.height),t.renderAxis(h.yAxis,k,p.yAxis,y.height,`left`))}for(;h.series.children.length>m.length;){let e=h.series.lastElementChild;e&&h.series.removeChild(e)}for(let t=0;t<m.length;t++){let n=m[t],r=h.series.children[t];r||(r=e.createSvgElement(`g`,{class:`prism-bar-series`}),h.series.appendChild(r));let i=S.map((e,n)=>{let r=C[t]?.[n];if(T){let t=j[e]??0,n=t+Math.max(0,r?.value??0);return j[e]=n,{base:t,key:e,present:r!==void 0,y:n}}return{base:0,key:e,present:r!==void 0,y:r?.value??0}});A[t]=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(t,n.color),disposalSignal:f.disposalSignal,horizontal:w,seriesCount:m.length,seriesIndex:t,stacked:T,transition:p.transition})}g?.update(m.map((e,t)=>({color:c.seriesColor(t,e.color),name:e.name}))),_?.hide();let onMouseMove=e=>{let t=f.dimensions,n=s.getMousePosition(f.svg,e,t.margin.left,t.margin.top),r=i.chartArea(t.width,t.height,t.margin);if(n.x<0||n.x>r.width||n.y<0||n.y>r.height){_?.hide();return}let a=w?n.y:n.x,o=u.findCatIdx(a,S,M);if(o===-1){_?.hide();return}if(u.isOutsideBars(n,o,C,M,m.length)){_?.hide();return}let c=u.findSeriesIdx(n,o,S,M,m.length),l=C[c]?.[o];if(l){let n=M.bandCenter(S[o]),r=T?A[c]?.[o]??l.value:l.value,i=k.map(r),a=w?i+t.margin.left:n+t.margin.left,s=w?n+t.margin.top:i+t.margin.top;_?.show(a,s,l,m[c]),p.onHover?.({datum:l,originalEvent:e,series:m[c]})}},onMouseLeave=()=>{_?.hide(),p.onHover?.(null)},onClick=e=>{if(!p.onClick)return;let t=f.dimensions,n=s.getMousePosition(f.svg,e,t.margin.left,t.margin.top),r=i.chartArea(t.width,t.height,t.margin);if(n.x<0||n.x>r.width||n.y<0||n.y>r.height)return;let a=w?n.y:n.x,o=u.findCatIdx(a,S,M);if(o===-1)return;let c=u.findSeriesIdx(n,o,S,M,m.length),l=C[c]?.[o];l&&p.onClick({datum:l,originalEvent:e,series:m[c]})};return{onClick,onMouseLeave,onMouseMove}},e=>{m=e})}exports.createBarChart=createBarChart;
2
2
  //# sourceMappingURL=bar-chart.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bar-chart.cjs","names":[],"sources":["../../../src/charts/bar/bar-chart.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { positionAxis, renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { normalizeCartesianSeries } from '../../core/cartesian-model';\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 type { BarChartConfig, BarSeriesConfig, BarVariant, ChartHandle } from '../../types';\nimport { findCatIdx, findSeriesIdx, isOutsideBars } from './bar-hit-test';\nimport { renderBars } from './bar-renderer';\nimport type { BarScaleContext } from './bar-scale-context';\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<BarSeriesConfig[]> {\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const sourceData = seriesList.map((series) => series.data);\n const model = normalizeCartesianSeries(seriesList, sourceData);\n const categories = model.domain;\n const allData = model.series.map(({ byKey }) => categories.map((key) => byKey.get(key)));\n const categoryAxis = (axis: BarChartConfig['xAxis'] | BarChartConfig['yAxis']) => {\n if (!axis) return undefined;\n\n return {\n ...axis,\n tickFormat: (value: Date | number | string) => {\n const key = String(value);\n const label = model.labels.get(key) ?? value;\n\n return axis.tickFormat ? axis.tickFormat(label) : String(label);\n },\n };\n };\n\n if (categories.length === 0) {\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((seriesData) => seriesData.some((datum) => (datum?.value ?? 0) < 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((_, categoryIndex) =>\n allData.reduce((sum, seriesData) => sum + Math.max(0, seriesData[categoryIndex]?.value ?? 0), 0),\n );\n\n vMax = Math.max(...sums);\n vMin = 0;\n } else {\n const allY = allData.flatMap((seriesData) => seriesData.flatMap((datum) => (datum ? [datum.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 const yAxis = categoryAxis(config.yAxis);\n\n if (yAxis) {\n positionAxis(groups.yAxis, yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, catScale, yAxis, area.height, 'left');\n }\n\n if (config.xAxis) {\n positionAxis(groups.xAxis, config.xAxis.position ?? 'bottom', area.width, 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 const xAxis = categoryAxis(config.xAxis);\n\n if (xAxis) {\n positionAxis(groups.xAxis, xAxis.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, catScale, xAxis, area.width, 'bottom');\n }\n\n if (config.yAxis) {\n positionAxis(groups.yAxis, config.yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, valScale, config.yAxis, area.height, 'left');\n }\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 = categories.map((key, categoryIndex) => {\n const datum = allData[i]?.[categoryIndex];\n\n if (stacked) {\n const base = stackTops[key] ?? 0;\n const top = base + Math.max(0, datum?.value ?? 0);\n\n stackTops[key] = top;\n\n return { base, key, present: datum !== undefined, y: top };\n }\n\n return { base: 0, key, present: datum !== undefined, y: datum?.value ?? 0 };\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;\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;\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 (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bar-chart.cjs","names":[],"sources":["../../../src/charts/bar/bar-chart.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { positionAxis, renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { normalizeCartesianSeries } from '../../core/cartesian-model';\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 type { BarChartConfig, BarSeriesConfig, BarVariant, ChartHandle } from '../../types';\nimport { findCatIdx, findSeriesIdx, isOutsideBars } from './bar-hit-test';\nimport { renderBars } from './bar-renderer';\nimport type { BarScaleContext } from './bar-scale-context';\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<BarSeriesConfig[]> {\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const sourceData = seriesList.map((series) => series.data);\n const model = normalizeCartesianSeries(seriesList, sourceData);\n const categories = model.domain;\n const allData = model.series.map(({ byKey }) => categories.map((key) => byKey.get(key)));\n const categoryAxis = (axis: BarChartConfig['xAxis'] | BarChartConfig['yAxis']) => {\n if (!axis) return undefined;\n\n return {\n ...axis,\n tickFormat: (value: Date | number | string) => {\n const key = String(value);\n const label = model.labels.get(key) ?? value;\n\n return axis.tickFormat ? axis.tickFormat(label) : String(label);\n },\n };\n };\n\n if (categories.length === 0) {\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((seriesData) => seriesData.some((datum) => (datum?.value ?? 0) < 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((_, categoryIndex) =>\n allData.reduce((sum, seriesData) => sum + Math.max(0, seriesData[categoryIndex]?.value ?? 0), 0),\n );\n\n vMax = Math.max(...sums);\n vMin = 0;\n } else {\n const allY = allData.flatMap((seriesData) => seriesData.flatMap((datum) => (datum ? [datum.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 const yAxis = categoryAxis(config.yAxis);\n\n if (yAxis) {\n positionAxis(groups.yAxis, yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, catScale, yAxis, area.height, 'left');\n }\n\n if (config.xAxis) {\n positionAxis(groups.xAxis, config.xAxis.position ?? 'bottom', area.width, 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 const xAxis = categoryAxis(config.xAxis);\n\n if (xAxis) {\n positionAxis(groups.xAxis, xAxis.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, catScale, xAxis, area.width, 'bottom');\n }\n\n if (config.yAxis) {\n positionAxis(groups.yAxis, config.yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, valScale, config.yAxis, area.height, 'left');\n }\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 = categories.map((key, categoryIndex) => {\n const datum = allData[i]?.[categoryIndex];\n\n if (stacked) {\n const base = stackTops[key] ?? 0;\n const top = base + Math.max(0, datum?.value ?? 0);\n\n stackTops[key] = top;\n\n return { base, key, present: datum !== undefined, y: top };\n }\n\n return { base: 0, key, present: datum !== undefined, y: datum?.value ?? 0 };\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;\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;\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 (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"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"}
@@ -1,170 +1,2 @@
1
- import "../../_dev.js";
2
- import { createSvgElement as e } from "../../svg/element.js";
3
- import { positionAxis as t, 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 { normalizeCartesianSeries as l } from "../../core/cartesian-model.js";
9
- import { getMousePosition as u } from "../../interaction/events.js";
10
- import { seriesColor as d } from "../../theme/index.js";
11
- import { bandScale as f } from "../../scales/band.js";
12
- import { findCatIdx as p, findSeriesIdx as m, isOutsideBars as h } from "./bar-hit-test.js";
13
- import { renderBars as g } from "./bar-renderer.js";
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
- let b = y.series;
23
- return c(v, y, (c) => {
24
- let { groups: v, legend: x, tooltip: S } = c, C = c.dimensions, w = o(C.width, C.height, C.margin), T = b.map((e) => e.data), E = l(b, T), D = E.domain, O = E.series.map(({ byKey: e }) => D.map((t) => e.get(t))), k = (e) => {
25
- if (e) return {
26
- ...e,
27
- tickFormat: (t) => {
28
- let n = String(t), r = E.labels.get(n) ?? t;
29
- return e.tickFormat ? e.tickFormat(r) : String(r);
30
- }
31
- };
32
- };
33
- if (D.length === 0) {
34
- s(v, x, S);
35
- return;
36
- }
37
- let { horizontal: A, stacked: j } = _(y.variant ?? "grouped"), M, N;
38
- if (j) {
39
- O.some((e) => e.some((e) => (e?.value ?? 0) < 0));
40
- let e = D.map((e, t) => O.reduce((e, n) => e + Math.max(0, n[t]?.value ?? 0), 0));
41
- M = Math.max(...e), N = 0;
42
- } else {
43
- let e = O.flatMap((e) => e.flatMap((e) => e ? [e.value] : []));
44
- M = Math.max(...e), N = Math.min(0, ...e);
45
- }
46
- let P = f(A ? {
47
- domain: D,
48
- range: [0, w.height]
49
- } : {
50
- domain: D,
51
- range: [0, w.width]
52
- }), F = a(A ? {
53
- domain: [N, M],
54
- range: [0, w.width]
55
- } : {
56
- domain: [N, M],
57
- range: [w.height, 0]
58
- }), I = [], L = Object.create(null);
59
- for (let e of D) L[e] = 0;
60
- let R = {
61
- bandCenter: (e) => P.map(e) + P.bandwidth() / 2,
62
- bandwidth: P.bandwidth(),
63
- baselinePx: F.map(0),
64
- horizontal: A,
65
- stacked: j,
66
- stackedTops: I,
67
- valueScale: F
68
- };
69
- if (A) {
70
- y.xAxis?.grid && i(v.grid, F, y.xAxis.grid, w.height, "vertical", r(y.xAxis, w.width, "bottom"));
71
- let e = k(y.yAxis);
72
- e && (t(v.yAxis, e.position ?? "left", w.width, w.height), n(v.yAxis, P, e, w.height, "left")), y.xAxis && (t(v.xAxis, y.xAxis.position ?? "bottom", w.width, w.height), n(v.xAxis, F, y.xAxis, w.width, "bottom"));
73
- } else {
74
- y.yAxis?.grid && i(v.grid, F, y.yAxis.grid, w.width, "horizontal", r(y.yAxis, w.height, "left"));
75
- let e = k(y.xAxis);
76
- e && (t(v.xAxis, e.position ?? "bottom", w.width, w.height), n(v.xAxis, P, e, w.width, "bottom")), y.yAxis && (t(v.yAxis, y.yAxis.position ?? "left", w.width, w.height), n(v.yAxis, F, y.yAxis, w.height, "left"));
77
- }
78
- for (; v.series.children.length > b.length;) {
79
- let e = v.series.lastElementChild;
80
- e && v.series.removeChild(e);
81
- }
82
- for (let t = 0; t < b.length; t++) {
83
- let n = b[t], r = v.series.children[t];
84
- r || (r = e("g", { class: "prism-bar-series" }), v.series.appendChild(r));
85
- let i = D.map((e, n) => {
86
- let r = O[t]?.[n];
87
- if (j) {
88
- let t = L[e] ?? 0, n = t + Math.max(0, r?.value ?? 0);
89
- return L[e] = n, {
90
- base: t,
91
- key: e,
92
- present: r !== void 0,
93
- y: n
94
- };
95
- }
96
- return {
97
- base: 0,
98
- key: e,
99
- present: r !== void 0,
100
- y: r?.value ?? 0
101
- };
102
- });
103
- I[t] = i.map((e) => e.y);
104
- let a = j ? i.map((e) => F.map(e.base)) : void 0;
105
- g(r, i, P, F, R.baselinePx, {
106
- baselineYs: a,
107
- borderRadius: n.borderRadius ?? 0,
108
- color: d(t, n.color),
109
- disposalSignal: c.disposalSignal,
110
- horizontal: A,
111
- seriesCount: b.length,
112
- seriesIndex: t,
113
- stacked: j,
114
- transition: y.transition
115
- });
116
- }
117
- return x?.update(b.map((e, t) => ({
118
- color: d(t, e.color),
119
- name: e.name
120
- }))), S?.hide(), {
121
- onClick: (e) => {
122
- if (!y.onClick) return;
123
- let t = c.dimensions, n = u(c.svg, e, t.margin.left, t.margin.top), r = o(t.width, t.height, t.margin);
124
- if (n.x < 0 || n.x > r.width || n.y < 0 || n.y > r.height) return;
125
- let i = A ? n.y : n.x, a = p(i, D, R);
126
- if (a === -1) return;
127
- let s = m(n, a, D, R, b.length), l = O[s]?.[a];
128
- l && y.onClick({
129
- datum: l,
130
- originalEvent: e,
131
- series: b[s]
132
- });
133
- },
134
- onMouseLeave: () => {
135
- S?.hide(), y.onHover?.(null);
136
- },
137
- onMouseMove: (e) => {
138
- let t = c.dimensions, n = u(c.svg, e, t.margin.left, t.margin.top), r = o(t.width, t.height, t.margin);
139
- if (n.x < 0 || n.x > r.width || n.y < 0 || n.y > r.height) {
140
- S?.hide();
141
- return;
142
- }
143
- let i = A ? n.y : n.x, a = p(i, D, R);
144
- if (a === -1) {
145
- S?.hide();
146
- return;
147
- }
148
- if (h(n, a, O, R, b.length)) {
149
- S?.hide();
150
- return;
151
- }
152
- let s = m(n, a, D, R, b.length), l = O[s]?.[a];
153
- if (l) {
154
- let n = R.bandCenter(D[a]), r = j ? I[s]?.[a] ?? l.value : l.value, i = F.map(r), o = A ? i + t.margin.left : n + t.margin.left, c = A ? n + t.margin.top : i + t.margin.top;
155
- S?.show(o, c, l, b[s]), y.onHover?.({
156
- datum: l,
157
- originalEvent: e,
158
- series: b[s]
159
- });
160
- }
161
- }
162
- };
163
- }, (e) => {
164
- b = e;
165
- });
166
- }
167
- //#endregion
168
- export { v as createBarChart };
169
-
1
+ import"../../_dev.js";import{createSvgElement as e}from"../../svg/element.js";import{positionAxis as t,renderAxis as n,resolveTickCount as r}from"../../axes/axis.js";import{renderGrid as i}from"../../axes/grid.js";import{linearScale as a}from"../../scales/linear.js";import{chartArea as o}from"../../core/layout.js";import{clearCartesianDom as s,createChartScaffold as c}from"../../core/chart-scaffold.js";import{normalizeCartesianSeries as l}from"../../core/cartesian-model.js";import{getMousePosition as u}from"../../interaction/events.js";import{seriesColor as d}from"../../theme/index.js";import{bandScale as f}from"../../scales/band.js";import{findCatIdx as p,findSeriesIdx as m,isOutsideBars as h}from"./bar-hit-test.js";import{renderBars as g}from"./bar-renderer.js";function variantFlags(e){return{horizontal:e===`grouped-horizontal`||e===`stacked-horizontal`,stacked:e===`stacked`||e===`stacked-horizontal`}}function createBarChart(_,v){let y=v.series;return c(_,v,c=>{let{groups:_,legend:b,tooltip:x}=c,S=c.dimensions,C=o(S.width,S.height,S.margin),w=y.map(e=>e.data),T=l(y,w),E=T.domain,D=T.series.map(({byKey:e})=>E.map(t=>e.get(t))),categoryAxis=e=>{if(e)return{...e,tickFormat:t=>{let n=String(t),r=T.labels.get(n)??t;return e.tickFormat?e.tickFormat(r):String(r)}}};if(E.length===0){s(_,b,x);return}let{horizontal:O,stacked:k}=variantFlags(v.variant??`grouped`),A,j;if(k){D.some(e=>e.some(e=>(e?.value??0)<0));let e=E.map((e,t)=>D.reduce((e,n)=>e+Math.max(0,n[t]?.value??0),0));A=Math.max(...e),j=0}else{let e=D.flatMap(e=>e.flatMap(e=>e?[e.value]:[]));A=Math.max(...e),j=Math.min(0,...e)}let M=f(O?{domain:E,range:[0,C.height]}:{domain:E,range:[0,C.width]}),N=a(O?{domain:[j,A],range:[0,C.width]}:{domain:[j,A],range:[C.height,0]}),P=[],F=Object.create(null);for(let e of E)F[e]=0;let I={bandCenter:e=>M.map(e)+M.bandwidth()/2,bandwidth:M.bandwidth(),baselinePx:N.map(0),horizontal:O,stacked:k,stackedTops:P,valueScale:N};if(O){v.xAxis?.grid&&i(_.grid,N,v.xAxis.grid,C.height,`vertical`,r(v.xAxis,C.width,`bottom`));let e=categoryAxis(v.yAxis);e&&(t(_.yAxis,e.position??`left`,C.width,C.height),n(_.yAxis,M,e,C.height,`left`)),v.xAxis&&(t(_.xAxis,v.xAxis.position??`bottom`,C.width,C.height),n(_.xAxis,N,v.xAxis,C.width,`bottom`))}else{v.yAxis?.grid&&i(_.grid,N,v.yAxis.grid,C.width,`horizontal`,r(v.yAxis,C.height,`left`));let e=categoryAxis(v.xAxis);e&&(t(_.xAxis,e.position??`bottom`,C.width,C.height),n(_.xAxis,M,e,C.width,`bottom`)),v.yAxis&&(t(_.yAxis,v.yAxis.position??`left`,C.width,C.height),n(_.yAxis,N,v.yAxis,C.height,`left`))}for(;_.series.children.length>y.length;){let e=_.series.lastElementChild;e&&_.series.removeChild(e)}for(let t=0;t<y.length;t++){let n=y[t],r=_.series.children[t];r||(r=e(`g`,{class:`prism-bar-series`}),_.series.appendChild(r));let i=E.map((e,n)=>{let r=D[t]?.[n];if(k){let t=F[e]??0,n=t+Math.max(0,r?.value??0);return F[e]=n,{base:t,key:e,present:r!==void 0,y:n}}return{base:0,key:e,present:r!==void 0,y:r?.value??0}});P[t]=i.map(e=>e.y);let a=k?i.map(e=>N.map(e.base)):void 0;g(r,i,M,N,I.baselinePx,{baselineYs:a,borderRadius:n.borderRadius??0,color:d(t,n.color),disposalSignal:c.disposalSignal,horizontal:O,seriesCount:y.length,seriesIndex:t,stacked:k,transition:v.transition})}b?.update(y.map((e,t)=>({color:d(t,e.color),name:e.name}))),x?.hide();let onMouseMove=e=>{let t=c.dimensions,n=u(c.svg,e,t.margin.left,t.margin.top),r=o(t.width,t.height,t.margin);if(n.x<0||n.x>r.width||n.y<0||n.y>r.height){x?.hide();return}let i=O?n.y:n.x,a=p(i,E,I);if(a===-1){x?.hide();return}if(h(n,a,D,I,y.length)){x?.hide();return}let s=m(n,a,E,I,y.length),l=D[s]?.[a];if(l){let n=I.bandCenter(E[a]),r=k?P[s]?.[a]??l.value:l.value,i=N.map(r),o=O?i+t.margin.left:n+t.margin.left,c=O?n+t.margin.top:i+t.margin.top;x?.show(o,c,l,y[s]),v.onHover?.({datum:l,originalEvent:e,series:y[s]})}},onMouseLeave=()=>{x?.hide(),v.onHover?.(null)},onClick=e=>{if(!v.onClick)return;let t=c.dimensions,n=u(c.svg,e,t.margin.left,t.margin.top),r=o(t.width,t.height,t.margin);if(n.x<0||n.x>r.width||n.y<0||n.y>r.height)return;let i=O?n.y:n.x,a=p(i,E,I);if(a===-1)return;let s=m(n,a,E,I,y.length),l=D[s]?.[a];l&&v.onClick({datum:l,originalEvent:e,series:y[s]})};return{onClick,onMouseLeave,onMouseMove}},e=>{y=e})}export{createBarChart};
170
2
  //# sourceMappingURL=bar-chart.js.map