@vielzeug/prism 2.2.5 → 2.2.6

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 (40) hide show
  1. package/dist/charts/area/area-chart.cjs +1 -1
  2. package/dist/charts/area/area-chart.cjs.map +1 -1
  3. package/dist/charts/area/area-chart.d.ts.map +1 -1
  4. package/dist/charts/area/area-chart.js +47 -43
  5. package/dist/charts/area/area-chart.js.map +1 -1
  6. package/dist/charts/bar/bar-chart.cjs +1 -1
  7. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  8. package/dist/charts/bar/bar-chart.d.ts.map +1 -1
  9. package/dist/charts/bar/bar-chart.js +145 -140
  10. package/dist/charts/bar/bar-chart.js.map +1 -1
  11. package/dist/charts/line/line-chart.cjs +1 -1
  12. package/dist/charts/line/line-chart.cjs.map +1 -1
  13. package/dist/charts/line/line-chart.d.ts.map +1 -1
  14. package/dist/charts/line/line-chart.js +48 -44
  15. package/dist/charts/line/line-chart.js.map +1 -1
  16. package/dist/charts/pie/pie-chart.cjs +1 -1
  17. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  18. package/dist/charts/pie/pie-chart.d.ts.map +1 -1
  19. package/dist/charts/pie/pie-chart.js +101 -97
  20. package/dist/charts/pie/pie-chart.js.map +1 -1
  21. package/dist/charts/sparkline/sparkline.cjs +1 -1
  22. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  23. package/dist/charts/sparkline/sparkline.d.ts.map +1 -1
  24. package/dist/charts/sparkline/sparkline.js +65 -62
  25. package/dist/charts/sparkline/sparkline.js.map +1 -1
  26. package/dist/core/index.d.ts +1 -0
  27. package/dist/core/index.d.ts.map +1 -1
  28. package/dist/core/resolve.cjs +2 -0
  29. package/dist/core/resolve.cjs.map +1 -0
  30. package/dist/core/resolve.d.ts +9 -0
  31. package/dist/core/resolve.d.ts.map +1 -0
  32. package/dist/core/resolve.js +15 -0
  33. package/dist/core/resolve.js.map +1 -0
  34. package/dist/prism.cjs +1 -1
  35. package/dist/prism.cjs.map +1 -1
  36. package/dist/prism.iife.js +1 -1
  37. package/dist/prism.iife.js.map +1 -1
  38. package/dist/prism.js +1 -1
  39. package/dist/prism.js.map +1 -1
  40. package/package.json +3 -3
@@ -5,13 +5,13 @@ import { renderGrid as r } from "../../axes/grid.js";
5
5
  import { linearScale as i } from "../../scales/linear.js";
6
6
  import { chartArea as a } from "../../core/layout.js";
7
7
  import { clearCartesianDom as o, createChartScaffold as s } from "../../core/chart-scaffold.js";
8
- import { normalizeCartesianSeries as c } from "../../core/cartesian-model.js";
9
- import { getMousePosition as l } from "../../interaction/events.js";
10
- import { seriesColor as u } from "../../theme/index.js";
11
- import { bandScale as d } from "../../scales/band.js";
12
- import { findCatIdx as f, findSeriesIdx as p, isOutsideBars as m } from "./bar-hit-test.js";
13
- import { renderBars as h } from "./bar-renderer.js";
14
- import { isReactive as g } from "@vielzeug/ripple";
8
+ import { resolveMaybeSignal as c } from "../../core/resolve.js";
9
+ import { normalizeCartesianSeries as l } from "../../core/cartesian-model.js";
10
+ import { getMousePosition as u } from "../../interaction/events.js";
11
+ import { seriesColor as d } from "../../theme/index.js";
12
+ import { bandScale as f } from "../../scales/band.js";
13
+ import { findCatIdx as p, findSeriesIdx as m, isOutsideBars as h } from "./bar-hit-test.js";
14
+ import { renderBars as g } from "./bar-renderer.js";
15
15
  //#region src/charts/bar/bar-chart.ts
16
16
  function _(e) {
17
17
  return {
@@ -20,147 +20,152 @@ function _(e) {
20
20
  };
21
21
  }
22
22
  function v(v, y) {
23
- return s(v, y, (s) => {
24
- let { groups: v, legend: b, tooltip: x } = s, S = s.dimensions.value, C = a(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 = c(w, 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
- }
23
+ let b = c(y.series), x;
24
+ try {
25
+ return x = s(v, y, (s) => {
26
+ let { groups: v, legend: x, tooltip: S } = s, C = s.dimensions.value, w = a(C.width, C.height, C.margin), T = b.value, E = T.map((e) => c(e.data).value), D = l(T, E), O = D.domain, k = D.series.map(({ byKey: e }) => O.map((t) => e.get(t))), A = (e) => {
27
+ if (e) return {
28
+ ...e,
29
+ tickFormat: (t) => {
30
+ let n = String(t), r = D.labels.get(n) ?? t;
31
+ return e.tickFormat ? e.tickFormat(r) : String(r);
32
+ }
33
+ };
34
+ };
35
+ if (O.length === 0) {
36
+ o(v, x, S);
37
+ return;
38
+ }
39
+ let { horizontal: j, stacked: M } = _(y.variant ?? "grouped"), N, P;
40
+ if (M) {
41
+ k.some((e) => e.some((e) => (e?.value ?? 0) < 0));
42
+ let e = O.map((e, t) => k.reduce((e, n) => e + Math.max(0, n[t]?.value ?? 0), 0));
43
+ N = Math.max(...e), P = 0;
44
+ } else {
45
+ let e = k.flatMap((e) => e.flatMap((e) => e ? [e.value] : []));
46
+ N = Math.max(...e), P = Math.min(0, ...e);
47
+ }
48
+ let F = f(j ? {
49
+ domain: O,
50
+ range: [0, w.height]
51
+ } : {
52
+ domain: O,
53
+ range: [0, w.width]
54
+ }), I = i(j ? {
55
+ domain: [P, N],
56
+ range: [0, w.width]
57
+ } : {
58
+ domain: [P, N],
59
+ range: [w.height, 0]
60
+ }), L = [], R = Object.create(null);
61
+ for (let e of O) R[e] = 0;
62
+ let z = {
63
+ bandCenter: (e) => F.map(e) + F.bandwidth() / 2,
64
+ bandwidth: F.bandwidth(),
65
+ baselinePx: I.map(0),
66
+ horizontal: j,
67
+ stacked: M,
68
+ stackedTops: L,
69
+ valueScale: I
31
70
  };
32
- };
33
- if (D.length === 0) {
34
- o(v, b, x);
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 = d(A ? {
47
- domain: D,
48
- range: [0, C.height]
49
- } : {
50
- domain: D,
51
- range: [0, C.width]
52
- }), F = i(A ? {
53
- domain: [N, M],
54
- range: [0, C.width]
55
- } : {
56
- domain: [N, M],
57
- range: [C.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 && r(v.grid, F, y.xAxis.grid, C.height, "vertical", n(y.xAxis, C.width, "bottom"));
71
- let e = k(y.yAxis);
72
- e && t(v.yAxis, P, e, C.height, "left"), y.xAxis && (v.xAxis.setAttribute("transform", `translate(0,${C.height})`), t(v.xAxis, F, y.xAxis, C.width, "bottom"));
73
- } else {
74
- y.yAxis?.grid && r(v.grid, F, y.yAxis.grid, C.width, "horizontal", n(y.yAxis, C.height, "left"));
75
- let e = k(y.xAxis);
76
- e && (v.xAxis.setAttribute("transform", `translate(0,${C.height})`), t(v.xAxis, P, e, C.width, "bottom")), y.yAxis && t(v.yAxis, F, y.yAxis, C.height, "left");
77
- }
78
- for (; v.series.children.length > w.length;) {
79
- let e = v.series.lastElementChild;
80
- e && v.series.removeChild(e);
81
- }
82
- for (let t = 0; t < w.length; t++) {
83
- let n = w[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,
71
+ if (j) {
72
+ y.xAxis?.grid && r(v.grid, I, y.xAxis.grid, w.height, "vertical", n(y.xAxis, w.width, "bottom"));
73
+ let e = A(y.yAxis);
74
+ e && t(v.yAxis, F, e, w.height, "left"), y.xAxis && (v.xAxis.setAttribute("transform", `translate(0,${w.height})`), t(v.xAxis, I, y.xAxis, w.width, "bottom"));
75
+ } else {
76
+ y.yAxis?.grid && r(v.grid, I, y.yAxis.grid, w.width, "horizontal", n(y.yAxis, w.height, "left"));
77
+ let e = A(y.xAxis);
78
+ e && (v.xAxis.setAttribute("transform", `translate(0,${w.height})`), t(v.xAxis, F, e, w.width, "bottom")), y.yAxis && t(v.yAxis, I, y.yAxis, w.height, "left");
79
+ }
80
+ for (; v.series.children.length > T.length;) {
81
+ let e = v.series.lastElementChild;
82
+ e && v.series.removeChild(e);
83
+ }
84
+ for (let t = 0; t < T.length; t++) {
85
+ let n = T[t], r = v.series.children[t];
86
+ r || (r = e("g", { class: "prism-bar-series" }), v.series.appendChild(r));
87
+ let i = O.map((e, n) => {
88
+ let r = k[t]?.[n];
89
+ if (M) {
90
+ let t = R[e] ?? 0, n = t + Math.max(0, r?.value ?? 0);
91
+ return R[e] = n, {
92
+ base: t,
93
+ key: e,
94
+ present: r !== void 0,
95
+ y: n
96
+ };
97
+ }
98
+ return {
99
+ base: 0,
91
100
  key: e,
92
101
  present: r !== void 0,
93
- y: n
102
+ y: r?.value ?? 0
94
103
  };
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
- h(r, i, P, F, R.baselinePx, {
106
- baselineYs: a,
107
- borderRadius: n.borderRadius ?? 0,
108
- color: u(t, n.color),
109
- disposalSignal: s.disposalSignal,
110
- horizontal: A,
111
- seriesCount: w.length,
112
- seriesIndex: t,
113
- stacked: j,
114
- transition: y.transition
115
- });
116
- }
117
- return b?.update(w.map((e, t) => ({
118
- color: u(t, e.color),
119
- name: e.name
120
- }))), x?.hide(), {
121
- onClick: (e) => {
122
- if (!y.onClick) return;
123
- let t = s.dimensions.value, n = l(s.svg, e, t.margin.left, t.margin.top), r = a(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, o = f(i, D, R);
126
- if (o === -1) return;
127
- let c = p(n, o, D, R, w.length), u = O[c]?.[o];
128
- u && y.onClick({
129
- datum: u,
130
- originalEvent: e,
131
- series: w[c]
132
104
  });
133
- },
134
- onMouseLeave: () => {
135
- x?.hide(), y.onHover?.(null);
136
- },
137
- onMouseMove: (e) => {
138
- let t = s.dimensions.value, n = l(s.svg, e, t.margin.left, t.margin.top), r = a(t.width, t.height, t.margin);
139
- if (n.x < 0 || n.x > r.width || n.y < 0 || n.y > r.height) {
140
- x?.hide();
141
- return;
142
- }
143
- let i = A ? n.y : n.x, o = f(i, D, R);
144
- if (o === -1) {
145
- x?.hide();
146
- return;
147
- }
148
- if (m(n, o, O, R, w.length)) {
149
- x?.hide();
150
- return;
151
- }
152
- let c = p(n, o, D, R, w.length), u = O[c]?.[o];
153
- if (u) {
154
- let n = R.bandCenter(D[o]), r = j ? I[c]?.[o] ?? u.value : u.value, i = F.map(r), a = A ? i + t.margin.left : n + t.margin.left, s = A ? n + t.margin.top : i + t.margin.top;
155
- x?.show(a, s, u, w[c]), y.onHover?.({
156
- datum: u,
105
+ L[t] = i.map((e) => e.y);
106
+ let a = M ? i.map((e) => I.map(e.base)) : void 0;
107
+ g(r, i, F, I, z.baselinePx, {
108
+ baselineYs: a,
109
+ borderRadius: n.borderRadius ?? 0,
110
+ color: d(t, n.color),
111
+ disposalSignal: s.disposalSignal,
112
+ horizontal: j,
113
+ seriesCount: T.length,
114
+ seriesIndex: t,
115
+ stacked: M,
116
+ transition: y.transition
117
+ });
118
+ }
119
+ return x?.update(T.map((e, t) => ({
120
+ color: d(t, e.color),
121
+ name: e.name
122
+ }))), S?.hide(), {
123
+ onClick: (e) => {
124
+ if (!y.onClick) return;
125
+ let t = s.dimensions.value, n = u(s.svg, e, t.margin.left, t.margin.top), r = a(t.width, t.height, t.margin);
126
+ if (n.x < 0 || n.x > r.width || n.y < 0 || n.y > r.height) return;
127
+ let i = j ? n.y : n.x, o = p(i, O, z);
128
+ if (o === -1) return;
129
+ let c = m(n, o, O, z, T.length), l = k[c]?.[o];
130
+ l && y.onClick({
131
+ datum: l,
157
132
  originalEvent: e,
158
- series: w[c]
133
+ series: T[c]
159
134
  });
135
+ },
136
+ onMouseLeave: () => {
137
+ S?.hide(), y.onHover?.(null);
138
+ },
139
+ onMouseMove: (e) => {
140
+ let t = s.dimensions.value, n = u(s.svg, e, t.margin.left, t.margin.top), r = a(t.width, t.height, t.margin);
141
+ if (n.x < 0 || n.x > r.width || n.y < 0 || n.y > r.height) {
142
+ S?.hide();
143
+ return;
144
+ }
145
+ let i = j ? n.y : n.x, o = p(i, O, z);
146
+ if (o === -1) {
147
+ S?.hide();
148
+ return;
149
+ }
150
+ if (h(n, o, k, z, T.length)) {
151
+ S?.hide();
152
+ return;
153
+ }
154
+ let c = m(n, o, O, z, T.length), l = k[c]?.[o];
155
+ if (l) {
156
+ let n = z.bandCenter(O[o]), r = M ? L[c]?.[o] ?? l.value : l.value, i = I.map(r), a = j ? i + t.margin.left : n + t.margin.left, s = j ? n + t.margin.top : i + t.margin.top;
157
+ S?.show(a, s, l, T[c]), y.onHover?.({
158
+ datum: l,
159
+ originalEvent: e,
160
+ series: T[c]
161
+ });
162
+ }
160
163
  }
161
- }
162
- };
163
- });
164
+ };
165
+ }), x;
166
+ } catch (e) {
167
+ throw x?.dispose(), e;
168
+ }
164
169
  }
165
170
  //#endregion
166
171
  export { v as createBarChart };
@@ -1 +1 @@
1
- {"version":3,"file":"bar-chart.js","names":[],"sources":["../../../src/charts/bar/bar-chart.ts"],"sourcesContent":["import { isReactive } from '@vielzeug/ripple';\nimport { warn } from '../../_dev';\nimport { 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, 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 {\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 sourceData = seriesList.map((series) => (isReactive(series.data) ? series.data.value : 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 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((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) renderAxis(groups.yAxis, catScale, 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 const xAxis = categoryAxis(config.xAxis);\n\n if (xAxis) {\n groups.xAxis.setAttribute('transform', `translate(0,${area.height})`);\n renderAxis(groups.xAxis, catScale, 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 = 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.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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"}
1
+ {"version":3,"file":"bar-chart.js","names":[],"sources":["../../../src/charts/bar/bar-chart.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { 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 { resolveMaybeSignal } from '../../core/resolve';\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, 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 {\n const seriesSignal = resolveMaybeSignal(config.series);\n\n let scaffold: ChartHandle | undefined;\n\n try {\n scaffold = 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 = seriesSignal.value;\n const sourceData = seriesList.map((series) => resolveMaybeSignal(series.data).value);\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 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((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) renderAxis(groups.yAxis, catScale, 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 const xAxis = categoryAxis(config.xAxis);\n\n if (xAxis) {\n groups.xAxis.setAttribute('transform', `translate(0,${area.height})`);\n renderAxis(groups.xAxis, catScale, 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 = 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.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 return scaffold;\n } catch (error) {\n scaffold?.dispose();\n throw error;\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("../../core/cartesian-scales.cjs"),i=require("../../core/layout.cjs"),a=require("../../core/chart-scaffold.cjs"),o=require("../../interaction/crosshair.cjs"),s=require("../../interaction/series-interaction.cjs"),c=require("../../theme/index.cjs"),l=require("./line-renderer.cjs");let u=require("@vielzeug/ripple");function d(d,f){let p=null;return a.createChartScaffold(d,f,d=>{let{groups:m,legend:h,tooltip:g}=d,_=d.dimensions.value,v=i.chartArea(_.width,_.height,_.margin),y=(0,u.isReactive)(f.series)?f.series.value:f.series,b=y.map(e=>(0,u.isReactive)(e.data)?e.data.value:e.data),x=b.flat().map(e=>e.key),S=b.flat().map(e=>e.value);if(x.length===0){a.clearCartesianDom(m,h,g,p);return}f.crosshair&&!p&&(p=o.createCrosshair(d.chartArea,f.crosshair));let C=r.buildXScale(x,v.width),w=r.buildYScale(S,v.height);for(f.yAxis?.grid&&n.renderGrid(m.grid,w,f.yAxis.grid,v.width,`horizontal`,t.resolveTickCount(f.yAxis,v.height,`left`)),f.xAxis?.grid&&n.renderGrid(m.grid,C,f.xAxis.grid,v.height,`vertical`,t.resolveTickCount(f.xAxis,v.width,`bottom`)),f.xAxis&&(m.xAxis.setAttribute(`transform`,`translate(0,${v.height})`),t.renderAxis(m.xAxis,C,f.xAxis,v.width,`bottom`)),f.yAxis&&t.renderAxis(m.yAxis,w,f.yAxis,v.height,`left`);m.series.children.length>y.length;)m.series.removeChild(m.series.lastChild);let T=[];for(let t=0;t<y.length;t++){let n=y[t],r=m.series.children[t];r||(r=e.createSvgElement(`g`,{class:`prism-line-series`}),m.series.appendChild(r));let i=l.computePoints(b[t],C,w);T.push(i),l.renderLine(r,i,{color:c.seriesColor(t,n.color),curve:n.curve??`linear`,disposalSignal:d.disposalSignal,pointRadius:n.pointRadius??3,showPoints:n.showPoints??!1,strokeWidth:n.strokeWidth??2,transition:f.transition})}return h?.update(y.map((e,t)=>({color:c.seriesColor(t,e.color),name:e.name}))),g?.hide(),s.createSeriesInteraction({crosshair:p,dims:()=>d.dimensions.value,getData:()=>b,getPoints:()=>T,getSeriesList:()=>(0,u.isReactive)(f.series)?f.series.value:f.series,onClick:f.onClick,onHover:f.onHover,svg:d.svg,tooltip:g})})}exports.createLineChart=d;
1
+ require("../../_dev.cjs");const e=require("../../svg/element.cjs"),t=require("../../axes/axis.cjs"),n=require("../../axes/grid.cjs"),r=require("../../core/cartesian-scales.cjs"),i=require("../../core/layout.cjs"),a=require("../../core/chart-scaffold.cjs"),o=require("../../core/resolve.cjs"),s=require("../../interaction/crosshair.cjs"),c=require("../../interaction/series-interaction.cjs"),l=require("../../theme/index.cjs"),u=require("./line-renderer.cjs");function d(d,f){let p=null,m=o.resolveMaybeSignal(f.series),h;try{return h=a.createChartScaffold(d,f,d=>{let{groups:h,legend:g,tooltip:_}=d,v=d.dimensions.value,y=i.chartArea(v.width,v.height,v.margin),b=m.value,x=b.map(e=>o.resolveMaybeSignal(e.data)).map(e=>e.value),S=x.flat().map(e=>e.key),C=x.flat().map(e=>e.value);if(S.length===0){a.clearCartesianDom(h,g,_,p);return}f.crosshair&&!p&&(p=s.createCrosshair(d.chartArea,f.crosshair));let w=r.buildXScale(S,y.width),T=r.buildYScale(C,y.height);for(f.yAxis?.grid&&n.renderGrid(h.grid,T,f.yAxis.grid,y.width,`horizontal`,t.resolveTickCount(f.yAxis,y.height,`left`)),f.xAxis?.grid&&n.renderGrid(h.grid,w,f.xAxis.grid,y.height,`vertical`,t.resolveTickCount(f.xAxis,y.width,`bottom`)),f.xAxis&&(h.xAxis.setAttribute(`transform`,`translate(0,${y.height})`),t.renderAxis(h.xAxis,w,f.xAxis,y.width,`bottom`)),f.yAxis&&t.renderAxis(h.yAxis,T,f.yAxis,y.height,`left`);h.series.children.length>b.length;)h.series.removeChild(h.series.lastChild);let E=[];for(let t=0;t<b.length;t++){let n=b[t],r=h.series.children[t];r||(r=e.createSvgElement(`g`,{class:`prism-line-series`}),h.series.appendChild(r));let i=u.computePoints(x[t],w,T);E.push(i),u.renderLine(r,i,{color:l.seriesColor(t,n.color),curve:n.curve??`linear`,disposalSignal:d.disposalSignal,pointRadius:n.pointRadius??3,showPoints:n.showPoints??!1,strokeWidth:n.strokeWidth??2,transition:f.transition})}return g?.update(b.map((e,t)=>({color:l.seriesColor(t,e.color),name:e.name}))),_?.hide(),c.createSeriesInteraction({crosshair:p,dims:()=>d.dimensions.value,getData:()=>x,getPoints:()=>E,getSeriesList:()=>m.value,onClick:f.onClick,onHover:f.onHover,svg:d.svg,tooltip:_})}),h}catch(e){throw h?.dispose(),e}}exports.createLineChart=d;
2
2
  //# sourceMappingURL=line-chart.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"line-chart.cjs","names":[],"sources":["../../../src/charts/line/line-chart.ts"],"sourcesContent":["import { isReactive } from '@vielzeug/ripple';\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 type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, LineChartConfig } from '../../types';\nimport { computePoints, renderLine } from './line-renderer';\n\nexport function createLineChart(container: HTMLElement, config: LineChartConfig): 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('createLineChart: 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\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-line-series' });\n groups.series.appendChild(group);\n }\n\n const points = computePoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderLine(group, points, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n pointRadius: series.pointRadius ?? 3,\n showPoints: series.showPoints ?? false,\n strokeWidth: series.strokeWidth ?? 2,\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":"ycAeA,SAAgB,EAAgB,EAAwB,EAAsC,CAC5F,IAAI,EAAuD,KAE3D,OAAO,EAAA,oBAAoB,EAAW,EAAS,GAAQ,CACrD,GAAM,CAAE,SAAQ,SAAQ,WAAY,EAC9B,EAAO,EAAI,WAAW,MACtB,EAAO,EAAA,UAAU,EAAK,MAAO,EAAK,OAAQ,EAAK,MAAM,EACrD,GAAA,EAAa,EAAA,WAAA,CAAW,EAAO,MAAM,EAAI,EAAO,OAAO,MAAQ,EAAO,OACtE,EAAU,EAAW,IAAK,IAAA,EAAO,EAAA,WAAA,CAAW,EAAE,IAAI,EAAI,EAAE,KAAK,MAAQ,EAAE,IAAK,EAC5E,EAAO,EAAQ,KAAK,CAAC,CAAC,IAAK,GAAM,EAAE,GAAoB,EACvD,EAAO,EAAQ,KAAK,CAAC,CAAC,IAAK,GAAM,EAAE,KAAK,EAE9C,GAAI,EAAK,SAAW,EAAG,CAErB,EAAA,kBAAkB,EAAQ,EAAQ,EAAS,CAAS,EAEpD,MACF,CAEI,EAAO,WAAa,CAAC,IACvB,EAAY,EAAA,gBAAgB,EAAI,UAAW,EAAO,SAAS,GAG7D,IAAM,EAAS,EAAA,YAAY,EAA2B,EAAK,KAAK,EAC1D,EAAS,EAAA,YAAY,EAAM,EAAK,MAAM,EA+B5C,IA7BI,EAAO,OAAO,MAChB,EAAA,WACE,EAAO,KACP,EACA,EAAO,MAAM,KACb,EAAK,MACL,aACA,EAAA,iBAAiB,EAAO,MAAO,EAAK,OAAQ,MAAM,CACpD,EAGE,EAAO,OAAO,MAChB,EAAA,WACE,EAAO,KACP,EACA,EAAO,MAAM,KACb,EAAK,OACL,WACA,EAAA,iBAAiB,EAAO,MAAO,EAAK,MAAO,QAAQ,CACrD,EAGE,EAAO,QACT,EAAO,MAAM,aAAa,YAAa,eAAe,EAAK,OAAO,EAAE,EACpE,EAAA,WAAW,EAAO,MAAO,EAAQ,EAAO,MAAO,EAAK,MAAO,QAAQ,GAGjE,EAAO,OAAO,EAAA,WAAW,EAAO,MAAO,EAAQ,EAAO,MAAO,EAAK,OAAQ,MAAM,EAE7E,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,EAAA,iBAAiB,IAAK,CAAE,MAAO,mBAAoB,CAAC,EAC5D,EAAO,OAAO,YAAY,CAAK,GAGjC,IAAM,EAAS,EAAA,cAAc,EAAQ,GAAI,EAAQ,CAAM,EAEvD,EAAU,KAAK,CAAM,EAErB,EAAA,WAAW,EAAO,EAAQ,CACxB,MAAO,EAAA,YAAY,EAAG,EAAO,KAAK,EAClC,MAAO,EAAO,OAAS,SACvB,eAAgB,EAAI,eACpB,YAAa,EAAO,aAAe,EACnC,WAAY,EAAO,YAAc,GACjC,YAAa,EAAO,aAAe,EACnC,WAAY,EAAO,UACrB,CAAC,CACH,CAKA,OAHA,GAAQ,OAAO,EAAW,KAAK,EAAG,KAAO,CAAE,MAAO,EAAA,YAAY,EAAG,EAAE,KAAK,EAAG,KAAM,EAAE,IAAK,EAAE,CAAC,EAC3F,GAAS,KAAK,EAEP,EAAA,wBAAwB,CAC7B,YACA,SAAY,EAAI,WAAW,MAC3B,YAAe,EACf,cAAiB,EACjB,mBAAA,EAAsB,EAAA,WAAA,CAAW,EAAO,MAAM,EAAI,EAAO,OAAO,MAAQ,EAAO,OAC/E,QAAS,EAAO,QAChB,QAAS,EAAO,QAChB,IAAK,EAAI,IACT,SACF,CAAC,CACH,CAAC,CACH"}
1
+ {"version":3,"file":"line-chart.cjs","names":[],"sources":["../../../src/charts/line/line-chart.ts"],"sourcesContent":["import { 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 { resolveMaybeSignal } from '../../core/resolve';\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 { ChartHandle, LineChartConfig } from '../../types';\nimport { computePoints, renderLine } from './line-renderer';\n\nexport function createLineChart(container: HTMLElement, config: LineChartConfig): ChartHandle {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n const seriesSignal = resolveMaybeSignal(config.series);\n\n let scaffold: ChartHandle | undefined;\n\n try {\n scaffold = 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 = seriesSignal.value;\n const dataSignals = seriesList.map((s) => resolveMaybeSignal(s.data));\n const allData = dataSignals.map((signal) => signal.value);\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('createLineChart: 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\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-line-series' });\n groups.series.appendChild(group);\n }\n\n const points = computePoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderLine(group, points, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n pointRadius: series.pointRadius ?? 3,\n showPoints: series.showPoints ?? false,\n strokeWidth: series.strokeWidth ?? 2,\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: () => seriesSignal.value,\n onClick: config.onClick,\n onHover: config.onHover,\n svg: ctx.svg,\n tooltip,\n });\n });\n\n return scaffold;\n } catch (error) {\n scaffold?.dispose();\n throw error;\n }\n}\n"],"mappings":"2cAeA,SAAgB,EAAgB,EAAwB,EAAsC,CAC5F,IAAI,EAAuD,KACrD,EAAe,EAAA,mBAAmB,EAAO,MAAM,EAEjD,EAEJ,GAAI,CAoGF,MAnGA,GAAW,EAAA,oBAAoB,EAAW,EAAS,GAAQ,CACzD,GAAM,CAAE,SAAQ,SAAQ,WAAY,EAC9B,EAAO,EAAI,WAAW,MACtB,EAAO,EAAA,UAAU,EAAK,MAAO,EAAK,OAAQ,EAAK,MAAM,EACrD,EAAa,EAAa,MAE1B,EADc,EAAW,IAAK,GAAM,EAAA,mBAAmB,EAAE,IAAI,CACnD,CAAA,CAAY,IAAK,GAAW,EAAO,KAAK,EAClD,EAAO,EAAQ,KAAK,CAAC,CAAC,IAAK,GAAM,EAAE,GAAoB,EACvD,EAAO,EAAQ,KAAK,CAAC,CAAC,IAAK,GAAM,EAAE,KAAK,EAE9C,GAAI,EAAK,SAAW,EAAG,CAErB,EAAA,kBAAkB,EAAQ,EAAQ,EAAS,CAAS,EAEpD,MACF,CAEI,EAAO,WAAa,CAAC,IACvB,EAAY,EAAA,gBAAgB,EAAI,UAAW,EAAO,SAAS,GAG7D,IAAM,EAAS,EAAA,YAAY,EAA2B,EAAK,KAAK,EAC1D,EAAS,EAAA,YAAY,EAAM,EAAK,MAAM,EA+B5C,IA7BI,EAAO,OAAO,MAChB,EAAA,WACE,EAAO,KACP,EACA,EAAO,MAAM,KACb,EAAK,MACL,aACA,EAAA,iBAAiB,EAAO,MAAO,EAAK,OAAQ,MAAM,CACpD,EAGE,EAAO,OAAO,MAChB,EAAA,WACE,EAAO,KACP,EACA,EAAO,MAAM,KACb,EAAK,OACL,WACA,EAAA,iBAAiB,EAAO,MAAO,EAAK,MAAO,QAAQ,CACrD,EAGE,EAAO,QACT,EAAO,MAAM,aAAa,YAAa,eAAe,EAAK,OAAO,EAAE,EACpE,EAAA,WAAW,EAAO,MAAO,EAAQ,EAAO,MAAO,EAAK,MAAO,QAAQ,GAGjE,EAAO,OAAO,EAAA,WAAW,EAAO,MAAO,EAAQ,EAAO,MAAO,EAAK,OAAQ,MAAM,EAE7E,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,EAAA,iBAAiB,IAAK,CAAE,MAAO,mBAAoB,CAAC,EAC5D,EAAO,OAAO,YAAY,CAAK,GAGjC,IAAM,EAAS,EAAA,cAAc,EAAQ,GAAI,EAAQ,CAAM,EAEvD,EAAU,KAAK,CAAM,EAErB,EAAA,WAAW,EAAO,EAAQ,CACxB,MAAO,EAAA,YAAY,EAAG,EAAO,KAAK,EAClC,MAAO,EAAO,OAAS,SACvB,eAAgB,EAAI,eACpB,YAAa,EAAO,aAAe,EACnC,WAAY,EAAO,YAAc,GACjC,YAAa,EAAO,aAAe,EACnC,WAAY,EAAO,UACrB,CAAC,CACH,CAKA,OAHA,GAAQ,OAAO,EAAW,KAAK,EAAG,KAAO,CAAE,MAAO,EAAA,YAAY,EAAG,EAAE,KAAK,EAAG,KAAM,EAAE,IAAK,EAAE,CAAC,EAC3F,GAAS,KAAK,EAEP,EAAA,wBAAwB,CAC7B,YACA,SAAY,EAAI,WAAW,MAC3B,YAAe,EACf,cAAiB,EACjB,kBAAqB,EAAa,MAClC,QAAS,EAAO,QAChB,QAAS,EAAO,QAChB,IAAK,EAAI,IACT,SACF,CAAC,CACH,CAAC,EAEM,CACT,OAAS,EAAO,CAEd,MADA,GAAU,QAAQ,EACZ,CACR,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"line-chart.d.ts","sourceRoot":"","sources":["../../../src/charts/line/line-chart.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGhE,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAoG5F"}
1
+ {"version":3,"file":"line-chart.d.ts","sourceRoot":"","sources":["../../../src/charts/line/line-chart.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGhE,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CA+G5F"}
@@ -5,53 +5,57 @@ import { renderGrid as r } from "../../axes/grid.js";
5
5
  import { buildXScale as i, buildYScale as a } from "../../core/cartesian-scales.js";
6
6
  import { chartArea as o } from "../../core/layout.js";
7
7
  import { clearCartesianDom as s, createChartScaffold as c } from "../../core/chart-scaffold.js";
8
- import { createCrosshair as l } from "../../interaction/crosshair.js";
9
- import { createSeriesInteraction as u } from "../../interaction/series-interaction.js";
10
- import { seriesColor as d } from "../../theme/index.js";
11
- import { computePoints as f, renderLine as p } from "./line-renderer.js";
12
- import { isReactive as m } from "@vielzeug/ripple";
8
+ import { resolveMaybeSignal as l } from "../../core/resolve.js";
9
+ import { createCrosshair as u } from "../../interaction/crosshair.js";
10
+ import { createSeriesInteraction as d } from "../../interaction/series-interaction.js";
11
+ import { seriesColor as f } from "../../theme/index.js";
12
+ import { computePoints as p, renderLine as m } from "./line-renderer.js";
13
13
  //#region src/charts/line/line-chart.ts
14
14
  function h(h, g) {
15
- let _ = null;
16
- return c(h, g, (c) => {
17
- let { groups: h, legend: v, tooltip: y } = c, b = c.dimensions.value, x = o(b.width, b.height, b.margin), S = m(g.series) ? g.series.value : g.series, C = S.map((e) => m(e.data) ? e.data.value : e.data), w = C.flat().map((e) => e.key), T = C.flat().map((e) => e.value);
18
- if (w.length === 0) {
19
- s(h, v, y, _);
20
- return;
21
- }
22
- g.crosshair && !_ && (_ = l(c.chartArea, g.crosshair));
23
- let E = i(w, x.width), D = a(T, x.height);
24
- for (g.yAxis?.grid && r(h.grid, D, g.yAxis.grid, x.width, "horizontal", n(g.yAxis, x.height, "left")), g.xAxis?.grid && r(h.grid, E, g.xAxis.grid, x.height, "vertical", n(g.xAxis, x.width, "bottom")), g.xAxis && (h.xAxis.setAttribute("transform", `translate(0,${x.height})`), t(h.xAxis, E, g.xAxis, x.width, "bottom")), g.yAxis && t(h.yAxis, D, g.yAxis, x.height, "left"); h.series.children.length > S.length;) h.series.removeChild(h.series.lastChild);
25
- let O = [];
26
- for (let t = 0; t < S.length; t++) {
27
- let n = S[t], r = h.series.children[t];
28
- r || (r = e("g", { class: "prism-line-series" }), h.series.appendChild(r));
29
- let i = f(C[t], E, D);
30
- O.push(i), p(r, i, {
31
- color: d(t, n.color),
32
- curve: n.curve ?? "linear",
33
- disposalSignal: c.disposalSignal,
34
- pointRadius: n.pointRadius ?? 3,
35
- showPoints: n.showPoints ?? !1,
36
- strokeWidth: n.strokeWidth ?? 2,
37
- transition: g.transition
15
+ let _ = null, v = l(g.series), y;
16
+ try {
17
+ return y = c(h, g, (c) => {
18
+ let { groups: h, legend: y, tooltip: b } = c, x = c.dimensions.value, S = o(x.width, x.height, x.margin), C = v.value, w = C.map((e) => l(e.data)).map((e) => e.value), T = w.flat().map((e) => e.key), E = w.flat().map((e) => e.value);
19
+ if (T.length === 0) {
20
+ s(h, y, b, _);
21
+ return;
22
+ }
23
+ g.crosshair && !_ && (_ = u(c.chartArea, g.crosshair));
24
+ let D = i(T, S.width), O = a(E, S.height);
25
+ for (g.yAxis?.grid && r(h.grid, O, g.yAxis.grid, S.width, "horizontal", n(g.yAxis, S.height, "left")), g.xAxis?.grid && r(h.grid, D, g.xAxis.grid, S.height, "vertical", n(g.xAxis, S.width, "bottom")), g.xAxis && (h.xAxis.setAttribute("transform", `translate(0,${S.height})`), t(h.xAxis, D, g.xAxis, S.width, "bottom")), g.yAxis && t(h.yAxis, O, g.yAxis, S.height, "left"); h.series.children.length > C.length;) h.series.removeChild(h.series.lastChild);
26
+ let k = [];
27
+ for (let t = 0; t < C.length; t++) {
28
+ let n = C[t], r = h.series.children[t];
29
+ r || (r = e("g", { class: "prism-line-series" }), h.series.appendChild(r));
30
+ let i = p(w[t], D, O);
31
+ k.push(i), m(r, i, {
32
+ color: f(t, n.color),
33
+ curve: n.curve ?? "linear",
34
+ disposalSignal: c.disposalSignal,
35
+ pointRadius: n.pointRadius ?? 3,
36
+ showPoints: n.showPoints ?? !1,
37
+ strokeWidth: n.strokeWidth ?? 2,
38
+ transition: g.transition
39
+ });
40
+ }
41
+ return y?.update(C.map((e, t) => ({
42
+ color: f(t, e.color),
43
+ name: e.name
44
+ }))), b?.hide(), d({
45
+ crosshair: _,
46
+ dims: () => c.dimensions.value,
47
+ getData: () => w,
48
+ getPoints: () => k,
49
+ getSeriesList: () => v.value,
50
+ onClick: g.onClick,
51
+ onHover: g.onHover,
52
+ svg: c.svg,
53
+ tooltip: b
38
54
  });
39
- }
40
- return v?.update(S.map((e, t) => ({
41
- color: d(t, e.color),
42
- name: e.name
43
- }))), y?.hide(), u({
44
- crosshair: _,
45
- dims: () => c.dimensions.value,
46
- getData: () => C,
47
- getPoints: () => O,
48
- getSeriesList: () => m(g.series) ? g.series.value : g.series,
49
- onClick: g.onClick,
50
- onHover: g.onHover,
51
- svg: c.svg,
52
- tooltip: y
53
- });
54
- });
55
+ }), y;
56
+ } catch (e) {
57
+ throw y?.dispose(), e;
58
+ }
55
59
  }
56
60
  //#endregion
57
61
  export { h as createLineChart };
@@ -1 +1 @@
1
- {"version":3,"file":"line-chart.js","names":[],"sources":["../../../src/charts/line/line-chart.ts"],"sourcesContent":["import { isReactive } from '@vielzeug/ripple';\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 type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, LineChartConfig } from '../../types';\nimport { computePoints, renderLine } from './line-renderer';\n\nexport function createLineChart(container: HTMLElement, config: LineChartConfig): 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('createLineChart: 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\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-line-series' });\n groups.series.appendChild(group);\n }\n\n const points = computePoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderLine(group, points, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n pointRadius: series.pointRadius ?? 3,\n showPoints: series.showPoints ?? false,\n strokeWidth: series.strokeWidth ?? 2,\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":";;;;;;;;;;;;;AAeA,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,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;EA+B5C,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,EAAc,EAAQ,IAAI,GAAQ,CAAM;GAIvD,AAFA,EAAU,KAAK,CAAM,GAErB,EAAW,GAAO,GAAQ;IACxB,OAAO,EAAY,GAAG,EAAO,KAAK;IAClC,OAAO,EAAO,SAAS;IACvB,gBAAgB,EAAI;IACpB,aAAa,EAAO,eAAe;IACnC,YAAY,EAAO,cAAc;IACjC,aAAa,EAAO,eAAe;IACnC,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"}
1
+ {"version":3,"file":"line-chart.js","names":[],"sources":["../../../src/charts/line/line-chart.ts"],"sourcesContent":["import { 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 { resolveMaybeSignal } from '../../core/resolve';\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 { ChartHandle, LineChartConfig } from '../../types';\nimport { computePoints, renderLine } from './line-renderer';\n\nexport function createLineChart(container: HTMLElement, config: LineChartConfig): ChartHandle {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n const seriesSignal = resolveMaybeSignal(config.series);\n\n let scaffold: ChartHandle | undefined;\n\n try {\n scaffold = 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 = seriesSignal.value;\n const dataSignals = seriesList.map((s) => resolveMaybeSignal(s.data));\n const allData = dataSignals.map((signal) => signal.value);\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('createLineChart: 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\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-line-series' });\n groups.series.appendChild(group);\n }\n\n const points = computePoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderLine(group, points, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n pointRadius: series.pointRadius ?? 3,\n showPoints: series.showPoints ?? false,\n strokeWidth: series.strokeWidth ?? 2,\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: () => seriesSignal.value,\n onClick: config.onClick,\n onHover: config.onHover,\n svg: ctx.svg,\n tooltip,\n });\n });\n\n return scaffold;\n } catch (error) {\n scaffold?.dispose();\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,SAAgB,EAAgB,GAAwB,GAAsC;CAC5F,IAAI,IAAuD,MACrD,IAAe,EAAmB,EAAO,MAAM,GAEjD;CAEJ,IAAI;EAoGF,OAnGA,IAAW,EAAoB,GAAW,IAAS,MAAQ;GACzD,IAAM,EAAE,WAAQ,WAAQ,eAAY,GAC9B,IAAO,EAAI,WAAW,OACtB,IAAO,EAAU,EAAK,OAAO,EAAK,QAAQ,EAAK,MAAM,GACrD,IAAa,EAAa,OAE1B,IADc,EAAW,KAAK,MAAM,EAAmB,EAAE,IAAI,CACnD,CAAA,CAAY,KAAK,MAAW,EAAO,KAAK,GAClD,IAAO,EAAQ,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,GAAoB,GACvD,IAAO,EAAQ,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;GAE9C,IAAI,EAAK,WAAW,GAAG;IAErB,EAAkB,GAAQ,GAAQ,GAAS,CAAS;IAEpD;GACF;GAEA,AAAI,EAAO,aAAa,CAAC,MACvB,IAAY,EAAgB,EAAI,WAAW,EAAO,SAAS;GAG7D,IAAM,IAAS,EAAY,GAA2B,EAAK,KAAK,GAC1D,IAAS,EAAY,GAAM,EAAK,MAAM;GA+B5C,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;GAGpD,IAAM,IAAuB,CAAC;GAE9B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAW,QAAQ,KAAK;IAC1C,IAAM,IAAS,EAAW,IACtB,IAAQ,EAAO,OAAO,SAAS;IAEnC,AAAK,MACH,IAAQ,EAAiB,KAAK,EAAE,OAAO,oBAAoB,CAAC,GAC5D,EAAO,OAAO,YAAY,CAAK;IAGjC,IAAM,IAAS,EAAc,EAAQ,IAAI,GAAQ,CAAM;IAIvD,AAFA,EAAU,KAAK,CAAM,GAErB,EAAW,GAAO,GAAQ;KACxB,OAAO,EAAY,GAAG,EAAO,KAAK;KAClC,OAAO,EAAO,SAAS;KACvB,gBAAgB,EAAI;KACpB,aAAa,EAAO,eAAe;KACnC,YAAY,EAAO,cAAc;KACjC,aAAa,EAAO,eAAe;KACnC,YAAY,EAAO;IACrB,CAAC;GACH;GAKA,OAHA,GAAQ,OAAO,EAAW,KAAK,GAAG,OAAO;IAAE,OAAO,EAAY,GAAG,EAAE,KAAK;IAAG,MAAM,EAAE;GAAK,EAAE,CAAC,GAC3F,GAAS,KAAK,GAEP,EAAwB;IAC7B;IACA,YAAY,EAAI,WAAW;IAC3B,eAAe;IACf,iBAAiB;IACjB,qBAAqB,EAAa;IAClC,SAAS,EAAO;IAChB,SAAS,EAAO;IAChB,KAAK,EAAI;IACT;GACF,CAAC;EACH,CAAC,GAEM;CACT,SAAS,GAAO;EAEd,MADA,GAAU,QAAQ,GACZ;CACR;AACF"}
@@ -1,2 +1,2 @@
1
- const e=require("../../animation/easing.cjs"),t=require("../../animation/motion.cjs"),n=require("../../animation/tween.cjs"),r=require("../../svg/element.cjs"),i=require("../../core/chart-scaffold.cjs"),a=require("../../theme/index.cjs"),o=require("./pie-renderer.cjs");let s=require("@vielzeug/ripple");var c=2*Math.PI,l=-Math.PI/2,u=Math.PI/2;function d(e){return e===`semi`?{end:u,start:l}:{end:c,start:0}}function f(c,l){let u=l.variant??`pie`,f=l.padPixels??(u===`pie`?0:8),m=l.cornerRadius??(u===`pie`?0:8),h=r.createSvgElement(`circle`,{class:`prism-pie-bg`,"pointer-events":`none`}),g=r.createSvgElement(`g`,{class:`prism-pie-slices`,"shape-rendering":`geometricPrecision`}),_=r.createSvgElement(`g`,{class:`prism-pie-labels`,"pointer-events":`none`}),v=[],y=null;function b(e){for(;_.children.length>v.length;)_.removeChild(_.lastChild);for(let t=0;t<v.length;t++){let n=v[t],i=e[t];if(!i?.label)continue;let{x:a,y:s}=o.arcCentroid(n),c=_.children[t];c||(c=r.createSvgElement(`text`,{class:`prism-pie-label`}),_.appendChild(c)),r.setAttributes(c,{"dominant-baseline":`middle`,fill:`var(--prism-pie-label-color, #fff)`,"font-family":`var(--prism-font-family, system-ui)`,"font-size":`var(--prism-pie-label-size, 12px)`,"text-anchor":`middle`,x:a,y:s}),c.textContent=i.label}}let x=i.createRadialScaffold(c,{a11y:l.a11y,legend:l.legend,plugins:l.plugins,tooltip:l.tooltip},i=>{let{legend:x,svg:S,tooltip:C}=i;S.contains(h)||(S.appendChild(h),S.appendChild(g),S.appendChild(_));let{height:w,width:T}=i.dimensions.value,E=u===`semi`,D=T/2,O=E?w*.85:w/2,k=E?Math.min(D,O)-8:Math.min(T,w)/2-8,A=u===`pie`?0:Math.round(k*.55),j=l.innerRadius===void 0?A:l.innerRadius,M=Math.max(j+1,k),N=(0,s.isReactive)(l.data)?l.data.value:l.data,{end:P,start:F}=d(u);for(v=o.computeArcs(N,D,O,M,j,F,P,f,m,e=>a.seriesColor(e),!1),r.setAttributes(h,{cx:D,cy:O,r:j>0?j:0}),h.setAttribute(`style`,`fill:var(--prism-bg,#fff)`);g.children.length>v.length;)g.removeChild(g.lastChild);for(;_.children.length>v.length;)_.removeChild(_.lastChild);let I=t.resolveMotion(l.transition,0),L=I.duration,R=e.resolveEasing(I.easing);for(let e=0;e<v.length;e++){let t=v[e],n=g.children[e];n||(n=r.createSvgElement(`path`,{class:`prism-pie-slice`}),g.appendChild(n)),n.setAttribute(`fill`,t.color),n.setAttribute(`stroke`,`none`),n.style.cursor=l.onClick||l.onHover?`pointer`:``}if(y!==null&&(cancelAnimationFrame(y),y=null),L>0){let e=null,t=i=>{e===null&&(e=i);let a=R(Math.min(1,(i-e)/L)),s=n.tweenNumber(F,P,a);for(let e=0;e<v.length;e++){let t=v[e],n=g.children[e];if(n)if(s<=t.startAngle)r.setAttributes(n,{d:``});else{let e=Math.min(t.endAngle,s);r.setAttributes(n,{d:o.arcPath({...t,endAngle:e})})}}a<1?y=requestAnimationFrame(t):(y=null,b(N))};y=requestAnimationFrame(t)}else{for(let e=0;e<v.length;e++){let t=v[e],n=g.children[e];n&&r.setAttributes(n,{d:o.arcPath(t)})}b(N)}return x?.update(v.map(e=>({color:e.color,name:e.slice.label??``}))),C?.hide(),{onClick:e=>{if(!l.onClick)return;let t=S.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=p(v,n,r,u);i>=0&&l.onClick(v[i].slice,i)},onMouseLeave:()=>{l.onHover?.(null,null),C?.hide()},onMouseMove:e=>{let t=S.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=p(v,n,r,u);if(i>=0){let e=v[i];l.onHover?.(e.slice,i);let{x:n,y:r}=o.arcCentroid(e),a=c.getBoundingClientRect();C?.show(n+(t.left-a.left),r+(t.top-a.top),{key:i,value:e.slice.value},{color:e.color,data:[],name:e.slice.label??``})}else l.onHover?.(null,null),C?.hide()}}});return{get disposalSignal(){return x.disposalSignal},dispose(){y!==null&&(cancelAnimationFrame(y),y=null),x.dispose()},get disposed(){return x.disposed},el:x.el,[Symbol.dispose](){this.dispose()}}}function p(e,t,n,r){for(let i=0;i<e.length;i++){let a=e[i],o=t-a.centerX,s=n-a.centerY,l=Math.sqrt(o*o+s*s);if(l<a.outerRadius&&l>=a.innerRadius){let e=Math.atan2(o,-s);if(r===`semi`){if(e>=a.startAngle-1e-9&&e<=a.endAngle+1e-9)return i}else{let t=e<0?e+c:e;if(t>=a.startAngle-1e-9&&t<=a.endAngle+1e-9)return i}}}return-1}exports.createPieChart=f;
1
+ const e=require("../../animation/easing.cjs"),t=require("../../animation/motion.cjs"),n=require("../../animation/tween.cjs"),r=require("../../svg/element.cjs"),i=require("../../core/chart-scaffold.cjs"),a=require("../../core/resolve.cjs"),o=require("../../theme/index.cjs"),s=require("./pie-renderer.cjs");var c=2*Math.PI,l=-Math.PI/2,u=Math.PI/2;function d(e){return e===`semi`?{end:u,start:l}:{end:c,start:0}}function f(c,l){let u=l.variant??`pie`,f=l.padPixels??(u===`pie`?0:8),m=l.cornerRadius??(u===`pie`?0:8),h=a.resolveMaybeSignal(l.data),g=r.createSvgElement(`circle`,{class:`prism-pie-bg`,"pointer-events":`none`}),_=r.createSvgElement(`g`,{class:`prism-pie-slices`,"shape-rendering":`geometricPrecision`}),v=r.createSvgElement(`g`,{class:`prism-pie-labels`,"pointer-events":`none`}),y=[],b=null;function x(e){for(;v.children.length>y.length;)v.removeChild(v.lastChild);for(let t=0;t<y.length;t++){let n=y[t],i=e[t];if(!i?.label)continue;let{x:a,y:o}=s.arcCentroid(n),c=v.children[t];c||(c=r.createSvgElement(`text`,{class:`prism-pie-label`}),v.appendChild(c)),r.setAttributes(c,{"dominant-baseline":`middle`,fill:`var(--prism-pie-label-color, #fff)`,"font-family":`var(--prism-font-family, system-ui)`,"font-size":`var(--prism-pie-label-size, 12px)`,"text-anchor":`middle`,x:a,y:o}),c.textContent=i.label}}let S;try{return S=i.createRadialScaffold(c,{a11y:l.a11y,legend:l.legend,plugins:l.plugins,tooltip:l.tooltip},i=>{let{legend:a,svg:S,tooltip:C}=i;S.contains(g)||(S.appendChild(g),S.appendChild(_),S.appendChild(v));let{height:w,width:T}=i.dimensions.value,E=u===`semi`,D=T/2,O=E?w*.85:w/2,k=E?Math.min(D,O)-8:Math.min(T,w)/2-8,A=u===`pie`?0:Math.round(k*.55),j=l.innerRadius===void 0?A:l.innerRadius,M=Math.max(j+1,k),N=h.value,{end:P,start:F}=d(u);for(y=s.computeArcs(N,D,O,M,j,F,P,f,m,e=>o.seriesColor(e),!1),r.setAttributes(g,{cx:D,cy:O,r:j>0?j:0}),g.setAttribute(`style`,`fill:var(--prism-bg,#fff)`);_.children.length>y.length;)_.removeChild(_.lastChild);for(;v.children.length>y.length;)v.removeChild(v.lastChild);let I=t.resolveMotion(l.transition,0),L=I.duration,R=e.resolveEasing(I.easing);for(let e=0;e<y.length;e++){let t=y[e],n=_.children[e];n||(n=r.createSvgElement(`path`,{class:`prism-pie-slice`}),_.appendChild(n)),n.setAttribute(`fill`,t.color),n.setAttribute(`stroke`,`none`),n.style.cursor=l.onClick||l.onHover?`pointer`:``}if(b!==null&&(cancelAnimationFrame(b),b=null),L>0){let e=null,t=i=>{e===null&&(e=i);let a=R(Math.min(1,(i-e)/L)),o=n.tweenNumber(F,P,a);for(let e=0;e<y.length;e++){let t=y[e],n=_.children[e];if(n)if(o<=t.startAngle)r.setAttributes(n,{d:``});else{let e=Math.min(t.endAngle,o);r.setAttributes(n,{d:s.arcPath({...t,endAngle:e})})}}a<1?b=requestAnimationFrame(t):(b=null,x(N))};b=requestAnimationFrame(t)}else{for(let e=0;e<y.length;e++){let t=y[e],n=_.children[e];n&&r.setAttributes(n,{d:s.arcPath(t)})}x(N)}return a?.update(y.map(e=>({color:e.color,name:e.slice.label??``}))),C?.hide(),{onClick:e=>{if(!l.onClick)return;let t=S.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=p(y,n,r,u);i>=0&&l.onClick(y[i].slice,i)},onMouseLeave:()=>{l.onHover?.(null,null),C?.hide()},onMouseMove:e=>{let t=S.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=p(y,n,r,u);if(i>=0){let e=y[i];l.onHover?.(e.slice,i);let{x:n,y:r}=s.arcCentroid(e),a=c.getBoundingClientRect();C?.show(n+(t.left-a.left),r+(t.top-a.top),{key:i,value:e.slice.value},{color:e.color,data:[],name:e.slice.label??``})}else l.onHover?.(null,null),C?.hide()}}}),{get disposalSignal(){return S.disposalSignal},dispose(){b!==null&&(cancelAnimationFrame(b),b=null),S.dispose()},get disposed(){return S.disposed},el:S.el,[Symbol.dispose](){this.dispose()}}}catch(e){throw S?.dispose(),e}}function p(e,t,n,r){for(let i=0;i<e.length;i++){let a=e[i],o=t-a.centerX,s=n-a.centerY,l=Math.sqrt(o*o+s*s);if(l<a.outerRadius&&l>=a.innerRadius){let e=Math.atan2(o,-s);if(r===`semi`){if(e>=a.startAngle-1e-9&&e<=a.endAngle+1e-9)return i}else{let t=e<0?e+c:e;if(t>=a.startAngle-1e-9&&t<=a.endAngle+1e-9)return i}}}return-1}exports.createPieChart=f;
2
2
  //# sourceMappingURL=pie-chart.cjs.map