@vielzeug/prism 26.11.5 → 26.11.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 (105) hide show
  1. package/README.md +25 -10
  2. package/dist/_dev.js +1 -2
  3. package/dist/_tappers.js +1 -2
  4. package/dist/animation/easing.js +1 -2
  5. package/dist/animation/motion.js +0 -1
  6. package/dist/animation/reveal.cjs +1 -1
  7. package/dist/animation/reveal.cjs.map +1 -1
  8. package/dist/animation/reveal.js +29 -30
  9. package/dist/animation/transition.js +1 -2
  10. package/dist/animation/tween.js +1 -2
  11. package/dist/axes/axis.js +1 -2
  12. package/dist/axes/grid.js +1 -2
  13. package/dist/axes/scale-utils.js +1 -2
  14. package/dist/charts/area/area-chart.cjs +1 -1
  15. package/dist/charts/area/area-chart.cjs.map +1 -1
  16. package/dist/charts/area/area-chart.js +34 -35
  17. package/dist/charts/area/area-renderer.cjs +1 -1
  18. package/dist/charts/area/area-renderer.cjs.map +1 -1
  19. package/dist/charts/area/area-renderer.js +56 -57
  20. package/dist/charts/area/area-renderer.js.map +1 -1
  21. package/dist/charts/bar/bar-chart.cjs +1 -1
  22. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  23. package/dist/charts/bar/bar-chart.js +80 -81
  24. package/dist/charts/bar/bar-chart.js.map +1 -1
  25. package/dist/charts/bar/bar-hit-test.js +1 -2
  26. package/dist/charts/bar/bar-renderer.cjs +1 -1
  27. package/dist/charts/bar/bar-renderer.cjs.map +1 -1
  28. package/dist/charts/bar/bar-renderer.js +42 -43
  29. package/dist/charts/bar/bar-value-labels.cjs +1 -1
  30. package/dist/charts/bar/bar-value-labels.cjs.map +1 -1
  31. package/dist/charts/bar/bar-value-labels.js +17 -18
  32. package/dist/charts/heatmap/heatmap-chart.cjs +1 -1
  33. package/dist/charts/heatmap/heatmap-chart.cjs.map +1 -1
  34. package/dist/charts/heatmap/heatmap-chart.js +43 -44
  35. package/dist/charts/heatmap/heatmap-color.js +1 -2
  36. package/dist/charts/line/line-chart.cjs +1 -1
  37. package/dist/charts/line/line-chart.cjs.map +1 -1
  38. package/dist/charts/line/line-chart.js +41 -42
  39. package/dist/charts/line/line-renderer.cjs +1 -1
  40. package/dist/charts/line/line-renderer.cjs.map +1 -1
  41. package/dist/charts/line/line-renderer.js +81 -82
  42. package/dist/charts/line/line-renderer.js.map +1 -1
  43. package/dist/charts/pie/pie-chart.cjs +1 -1
  44. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  45. package/dist/charts/pie/pie-chart.js +69 -70
  46. package/dist/charts/pie/pie-renderer.js +1 -2
  47. package/dist/charts/radar/radar-chart.cjs +1 -1
  48. package/dist/charts/radar/radar-chart.cjs.map +1 -1
  49. package/dist/charts/radar/radar-chart.js +118 -119
  50. package/dist/charts/radar/radar-chart.js.map +1 -1
  51. package/dist/charts/radar/radar-geometry.cjs +1 -1
  52. package/dist/charts/radar/radar-geometry.cjs.map +1 -1
  53. package/dist/charts/radar/radar-geometry.js +15 -16
  54. package/dist/charts/scatter/scatter-chart.cjs +1 -1
  55. package/dist/charts/scatter/scatter-chart.cjs.map +1 -1
  56. package/dist/charts/scatter/scatter-chart.js +33 -34
  57. package/dist/charts/scatter/scatter-renderer.cjs +1 -1
  58. package/dist/charts/scatter/scatter-renderer.cjs.map +1 -1
  59. package/dist/charts/scatter/scatter-renderer.js +22 -23
  60. package/dist/charts/sparkline/sparkline.cjs +1 -1
  61. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  62. package/dist/charts/sparkline/sparkline.js +87 -88
  63. package/dist/charts/sparkline/sparkline.js.map +1 -1
  64. package/dist/core/cartesian-model.js +1 -2
  65. package/dist/core/cartesian-scales.js +1 -2
  66. package/dist/core/chart-base.cjs +1 -1
  67. package/dist/core/chart-base.cjs.map +1 -1
  68. package/dist/core/chart-base.js +13 -14
  69. package/dist/core/chart-scaffold.cjs +1 -1
  70. package/dist/core/chart-scaffold.cjs.map +1 -1
  71. package/dist/core/chart-scaffold.js +33 -34
  72. package/dist/core/datum-style.js +1 -2
  73. package/dist/core/ids.js +1 -2
  74. package/dist/core/layout.js +1 -2
  75. package/dist/core/polar.js +1 -2
  76. package/dist/core/responsive.js +1 -2
  77. package/dist/core/series-id.js +1 -2
  78. package/dist/errors.js +1 -2
  79. package/dist/index.cjs +1 -1
  80. package/dist/index.js +14 -14
  81. package/dist/interaction/announcer.js +1 -2
  82. package/dist/interaction/crosshair.js +1 -2
  83. package/dist/interaction/events.js +1 -2
  84. package/dist/interaction/legend.js +1 -2
  85. package/dist/interaction/scatter-interaction.cjs +1 -1
  86. package/dist/interaction/scatter-interaction.cjs.map +1 -1
  87. package/dist/interaction/scatter-interaction.js +26 -27
  88. package/dist/interaction/series-interaction.cjs +1 -1
  89. package/dist/interaction/series-interaction.cjs.map +1 -1
  90. package/dist/interaction/series-interaction.js +40 -41
  91. package/dist/interaction/tooltip.js +1 -2
  92. package/dist/prism.cjs +1 -1
  93. package/dist/prism.cjs.map +1 -1
  94. package/dist/prism.iife.js +1 -1
  95. package/dist/prism.iife.js.map +1 -1
  96. package/dist/prism.js +52 -103
  97. package/dist/prism.js.map +1 -1
  98. package/dist/scales/band.js +1 -2
  99. package/dist/scales/linear.js +1 -2
  100. package/dist/scales/time.js +1 -2
  101. package/dist/svg/element.js +1 -2
  102. package/dist/svg/path.js +1 -2
  103. package/dist/svg/text.js +1 -2
  104. package/dist/theme/index.js +1 -2
  105. package/package.json +6 -6
@@ -1,11 +1,11 @@
1
1
  import "../../_dev.js";
2
- import { createSvgElement as e, removeChildren as t, setAttributes as n } from "../../svg/element.js";
3
- import { estimateTextWidth as r } from "../../svg/text.js";
4
- import { comparisonContent as i } from "../../interaction/tooltip.js";
5
- import { chartArea as a, resolveMargin as o } from "../../core/layout.js";
6
- import { createRadialScaffold as s } from "../../core/chart-scaffold.js";
2
+ import { createRadialScaffold as e } from "../../core/chart-scaffold.js";
3
+ import { chartArea as t, resolveMargin as n } from "../../core/layout.js";
4
+ import { comparisonContent as r } from "../../interaction/tooltip.js";
5
+ import { createSvgElement as i, removeChildren as a, setAttributes as o } from "../../svg/element.js";
6
+ import { estimateTextWidth as s } from "../../svg/text.js";
7
7
  import { createRamp as c, valueColorFor as l } from "./heatmap-color.js";
8
- //#region src/charts/heatmap/heatmap-chart.ts
8
+ // src/charts/heatmap/heatmap-chart.ts
9
9
  var u = {
10
10
  ArrowDown: 1,
11
11
  ArrowLeft: -1,
@@ -19,15 +19,15 @@ var u = {
19
19
  "#082f49"
20
20
  ], f = "var(--prism-grid-color, #e2e8f0)", p = 11, m = 8, h = .4, g = 96, _ = .71;
21
21
  function createHeatmapChart(v, y) {
22
- let b = y.rows, x = y.columns, S = y.cells, C = y.domain, w = y.rowSummary, T = o({
22
+ let b = y.rows, x = y.columns, S = y.cells, C = y.domain, w = y.rowSummary, T = n({
23
23
  bottom: 8,
24
24
  left: 8,
25
25
  right: 8,
26
26
  top: 8,
27
27
  ...y.margin
28
- }), E = Math.max(0, y.gap ?? 2), D = y.showValues ?? !0, O = y.valueFormat ?? String, k = c(y.colorRange ?? d), A = y.emptyColor ?? f, j = buildBinBounds(y.bins), M = j.length, N = /* @__PURE__ */ new Map(), cellKey = (e, t) => `${e}\u0000${t}`, P = null, F = -1, I = null, positionOf = () => .5, L = e("g"), add = (t, n, r) => {
29
- let i = e(t, r);
30
- return n.appendChild(i), i;
28
+ }), E = Math.max(0, y.gap ?? 2), D = y.showValues ?? !0, O = y.valueFormat ?? String, k = c(y.colorRange ?? d), A = y.emptyColor ?? f, j = buildBinBounds(y.bins), M = j.length, N = /* @__PURE__ */ new Map(), cellKey = (e, t) => `${e}\u0000${t}`, P = null, F = -1, I = null, positionOf = () => .5, L = i("g"), add = (e, t, n) => {
29
+ let r = i(e, n);
30
+ return t.appendChild(r), r;
31
31
  };
32
32
  function currentDomain() {
33
33
  if (C) return C;
@@ -52,10 +52,10 @@ function createHeatmapChart(v, y) {
52
52
  };
53
53
  }
54
54
  function render(e) {
55
- let { legend: i, svg: o } = e;
56
- o.contains(L) || o.appendChild(L), t(L), I = null, F = -1, P = null, N.clear();
55
+ let { legend: n, svg: r } = e;
56
+ r.contains(L) || r.appendChild(L), a(L), I = null, F = -1, P = null, N.clear();
57
57
  for (let e of S) N.set(cellKey(e.row, e.column), e);
58
- if (positionOf = computePositionOf(), M > 0 && i) {
58
+ if (positionOf = computePositionOf(), M > 0 && n) {
59
59
  let e = j.map((e, t) => ({
60
60
  color: k(M === 1 ? .5 : t / (M - 1)),
61
61
  name: (y.binLabel ?? defaultBinLabel(O))(e[0], e[1])
@@ -63,18 +63,18 @@ function createHeatmapChart(v, y) {
63
63
  y.emptyLabel && e.push({
64
64
  color: A,
65
65
  name: y.emptyLabel
66
- }), i.update(e);
66
+ }), n.update(e);
67
67
  }
68
68
  if (b.length === 0 || x.length === 0) {
69
- i?.update([]);
69
+ n?.update([]);
70
70
  return;
71
71
  }
72
- let s = a(e.dimensions.width, e.dimensions.height, T), c = w && w.values.length > 0 ? w : null, u = Math.min(Math.max(...b.map((e) => r(e, p))) + 16, s.width * h), d = 0;
72
+ let i = t(e.dimensions.width, e.dimensions.height, T), c = w && w.values.length > 0 ? w : null, u = Math.min(Math.max(...b.map((e) => s(e, p))) + 16, i.width * h), d = 0;
73
73
  if (c) {
74
- let e = c.values.filter((e) => e !== null), t = Math.max(r(c.header ?? "", p), ...e.map((e) => r(e, p)));
75
- d = Math.min(t + 16, s.width * h);
74
+ let e = c.values.filter((e) => e !== null), t = Math.max(s(c.header ?? "", p), ...e.map((e) => s(e, p)));
75
+ d = Math.min(t + 16, i.width * h);
76
76
  }
77
- let f = Math.max(...x.map((e) => r(e, p))), v = f > s.width / x.length - m, C = v ? Math.min(f * _ + m, g) : 19, R = T.left + u, z = T.top + C, B = Math.max(0, s.width - u - d) / x.length, V = Math.max(0, s.height - C) / b.length, H = [];
77
+ let f = Math.max(...x.map((e) => s(e, p))), v = f > i.width / x.length - m, C = v ? Math.min(f * _ + m, g) : 19, R = T.left + u, z = T.top + C, B = Math.max(0, i.width - u - d) / x.length, V = Math.max(0, i.height - C) / b.length, H = [];
78
78
  for (let e = 0; e < b.length; e += 1) for (let t = 0; t < x.length; t += 1) {
79
79
  let n = b[e], r = x[t], i = N.get(cellKey(n, r))?.value ?? null;
80
80
  H.push({
@@ -97,16 +97,16 @@ function createHeatmapChart(v, y) {
97
97
  rowHeight: V
98
98
  };
99
99
  for (let e = 0; e < x.length; e += 1) {
100
- let t = R + e * B + B / 2, r = add("text", L, {
100
+ let t = R + e * B + B / 2, n = add("text", L, {
101
101
  "aria-hidden": "true",
102
102
  class: "prism-heatmap-column-label",
103
103
  x: String(t),
104
104
  y: String(T.top + C - 4)
105
105
  });
106
- r.textContent = x[e], v ? n(r, {
106
+ n.textContent = x[e], v ? o(n, {
107
107
  "text-anchor": "start",
108
108
  transform: `rotate(-45 ${t} ${T.top + C - 4})`
109
- }) : n(r, { "text-anchor": "middle" });
109
+ }) : o(n, { "text-anchor": "middle" });
110
110
  }
111
111
  for (let e = 0; e < b.length; e += 1) {
112
112
  let t = add("text", L, {
@@ -120,7 +120,7 @@ function createHeatmapChart(v, y) {
120
120
  t.textContent = b[e];
121
121
  }
122
122
  if (c) {
123
- let e = T.left + s.width - d / 2;
123
+ let e = T.left + i.width - d / 2;
124
124
  if (c.header) {
125
125
  let t = add("text", L, {
126
126
  "aria-hidden": "true",
@@ -193,43 +193,43 @@ function createHeatmapChart(v, y) {
193
193
  let t = P.cells[e], n = N.get(cellKey(t.row, t.column))?.value ?? null;
194
194
  return `${t.row} \u00b7 ${t.column}: ${n === null ? "—" : O(n)}`;
195
195
  }
196
- function activate(e, t, r) {
196
+ function activate(e, t, n) {
197
197
  if (!P || !I) return;
198
- let a = P.cells[t];
199
- if (!a) return;
198
+ let i = P.cells[t];
199
+ if (!i) return;
200
200
  F = t;
201
- let o = N.get(cellKey(a.row, a.column))?.value ?? null;
202
- n(I, {
203
- height: String(Math.max(0, a.rowHeight - E)),
201
+ let a = N.get(cellKey(i.row, i.column))?.value ?? null;
202
+ o(I, {
203
+ height: String(Math.max(0, i.rowHeight - E)),
204
204
  visibility: "visible",
205
- width: String(Math.max(0, a.columnWidth - E)),
206
- x: String(a.x + E / 2),
207
- y: String(a.y + E / 2)
208
- }), y.onCellHover?.(eventFor(a, r));
205
+ width: String(Math.max(0, i.columnWidth - E)),
206
+ x: String(i.x + E / 2),
207
+ y: String(i.y + E / 2)
208
+ }), y.onCellHover?.(eventFor(i, n));
209
209
  let s = describe(t);
210
210
  if (!e.tooltip) {
211
211
  e.announcer.announce(s);
212
212
  return;
213
213
  }
214
214
  let c = e.svg.getBoundingClientRect(), l = e.container.getBoundingClientRect();
215
- e.tooltip.show(a.x + a.columnWidth / 2 + (c.left - l.left), a.y + (c.top - l.top), {
216
- key: cellKey(a.row, a.column),
215
+ e.tooltip.show(i.x + i.columnWidth / 2 + (c.left - l.left), i.y + (c.top - l.top), {
216
+ key: cellKey(i.row, i.column),
217
217
  meta: { text: s },
218
- value: o ?? 0
218
+ value: a ?? 0
219
219
  }, {
220
- color: a.fill,
220
+ color: i.fill,
221
221
  data: [],
222
- name: `${a.row} \u00b7 ${a.column}`
223
- }, i(e.svg.ownerDocument, `${a.row} \u00b7 ${a.column}`, [{
224
- color: a.fill,
225
- name: a.column,
226
- value: o === null ? "—" : O(o)
222
+ name: `${i.row} \u00b7 ${i.column}`
223
+ }, r(e.svg.ownerDocument, `${i.row} \u00b7 ${i.column}`, [{
224
+ color: i.fill,
225
+ name: i.column,
226
+ value: a === null ? "—" : O(a)
227
227
  }], s));
228
228
  }
229
229
  function deactivate(e) {
230
230
  F !== -1 && (F = -1, I?.setAttribute("visibility", "hidden"), y.onCellHover?.(null), e.tooltip?.hide(), e.announcer.clear());
231
231
  }
232
- return s(v, {
232
+ return e(v, {
233
233
  a11y: y.a11y,
234
234
  legend: M > 0 && y.legend !== !1 && {},
235
235
  margin: y.margin,
@@ -276,7 +276,6 @@ function buildBinBounds(e) {
276
276
  function defaultBinLabel(e) {
277
277
  return (t, n) => t === null && n !== null ? `<${e(n)}` : t !== null && n === null ? `\u2265${e(t)}` : t !== null && n !== null ? `${e(t)}\u2013${e(n)}` : "—";
278
278
  }
279
- //#endregion
280
279
  export { createHeatmapChart };
281
280
 
282
281
  //# sourceMappingURL=heatmap-chart.js.map
@@ -1,4 +1,4 @@
1
- //#region src/charts/heatmap/heatmap-color.ts
1
+ // src/charts/heatmap/heatmap-color.ts
2
2
  var e = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i, t = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i, n = /^rgba?\(\s*(\d{1,3})\s*[,\s]\s*(\d{1,3})\s*[,\s]\s*(\d{1,3})\s*(?:[,\s][\d.]+\s*)?\)$/i;
3
3
  function parseColor(r) {
4
4
  let i = t.exec(r);
@@ -55,7 +55,6 @@ function valueColorFor(e, t) {
55
55
  let n = relativeLuminance(e);
56
56
  return n === null ? t : n > .179 ? "#000" : "#fff";
57
57
  }
58
- //#endregion
59
58
  export { createRamp, mixColors, parseColor, relativeLuminance, toCssColor, valueColorFor };
60
59
 
61
60
  //# sourceMappingURL=heatmap-color.js.map
@@ -1,2 +1,2 @@
1
- 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/series-id.cjs"),s=require("../../interaction/crosshair.cjs"),c=require("../../interaction/series-interaction.cjs"),l=require("../../theme/index.cjs"),u=require("./line-renderer.cjs");function createLineChart(d,f){let p=null,m=null,h=null,g=f.series;return a.createChartScaffold(d,f,(d,_)=>{let{groups:v,legend:y,tooltip:b}=d;y?.update(g.map((e,t)=>({color:l.seriesColor(t,e.color),name:e.name})));let x=d.dimensions,S=g.some(e=>e.yAxis===`right`),C=g.some(e=>e.yAxis!==`right`&&e.data.length>0),w={...i.resolveMargin(f.margin),right:f.margin?.right??(S?f.rightYAxis?.label?72:50:i.resolveMargin(f.margin).right)},T=i.chartArea(x.width,x.height,w),E=g.map(e=>e.data),D=E.flat().map(e=>e.key),O=g.filter(e=>e.yAxis!==`right`).flatMap(e=>e.data.map(e=>e.value)),k=g.filter(e=>e.yAxis===`right`).flatMap(e=>e.data.map(e=>e.value));if(D.length===0){a.clearCartesianDom(v,y,b,p),m?.replaceChildren(),h?.replaceChildren();return}f.crosshair&&!p&&(p=s.createCrosshair(d.chartArea,f.crosshair));let A=r.buildXScale(D,T.width),j=r.buildYScale(O,T.height),M=r.buildYScale(k,T.height),N=f.xAxis===!1?!1:f.xAxis??{},P=f.yAxis!==!1&&{grid:!0,...f.yAxis};if(P&&P.grid&&(!S||C)?n.renderGrid(v.grid,j,P.grid,T.width,`horizontal`,t.resolveTicks(j,P,t.resolveTickCount(P,T.height,`left`))):v.grid.replaceChildren(),N&&N.grid&&n.renderGrid(v.grid,A,N.grid,T.height,`vertical`,t.resolveTicks(A,N,t.resolveTickCount(N,T.width,`bottom`))),N?(t.positionAxis(v.xAxis,N.position??`bottom`,T.width,T.height),t.renderAxis(v.xAxis,A,N,T.width,`bottom`)):v.xAxis.replaceChildren(),P&&(!S||C)){let e={...P,position:S?`left`:P.position??`left`};t.positionAxis(v.yAxis,e.position,T.width,T.height),t.renderAxis(v.yAxis,j,e,T.height,`left`)}else v.yAxis.replaceChildren();if(S){h||(h=e.createSvgElement(`g`,{class:`prism-y-axis-right`}),d.chartArea.appendChild(h));let n={...f.rightYAxis,position:`right`};t.positionAxis(h,`right`,T.width,T.height),t.renderAxis(h,M,n,T.height,`right`)}else h?.replaceChildren();for(;v.series.children.length>g.length;)v.series.removeChild(v.series.lastChild);let F=[];for(let t=0;t<g.length;t++){let n=g[t],r=v.series.children[t];r||(r=e.createSvgElement(`g`,{class:`prism-line-series`}),v.series.appendChild(r)),r.setAttribute(`data-series-id`,o.seriesDomId(n,t));let i=n.yAxis===`right`?M:j,a=u.computePoints(E[t],A,i);F.push(a),u.renderLine(r,a,{bounds:{height:T.height,width:T.width},color:l.seriesColor(t,n.color),curve:n.curve??`linear`,disposalSignal:d.disposalSignal,marks:n.data,pointRadius:n.pointRadius??3,showPoints:n.showPoints??!1,strokeWidth:n.strokeWidth,transition:_!==`resize`&&f.transition})}return b?.hide(),m=c.ensureMarkerGroup(d.chartArea,m),c.createSeriesInteraction({announcer:d.announcer,colors:()=>g.map((e,t)=>l.seriesColor(t,e.color)),crosshair:p,dims:()=>d.dimensions,getData:()=>E,getPoints:()=>F,getSeriesList:()=>g,margin:w,markers:m,onClick:f.onClick,onHover:f.onHover,seriesGroup:v.series,svg:d.svg,tooltip:b,tooltipFormat:typeof f.tooltip==`object`?f.tooltip:void 0})},e=>{g=e})}exports.createLineChart=createLineChart;
1
+ const e=require("../../axes/axis.cjs"),t=require("../../axes/grid.cjs"),n=require("../../core/cartesian-scales.cjs"),r=require("../../core/chart-scaffold.cjs"),i=require("../../core/layout.cjs"),a=require("../../core/series-id.cjs"),o=require("../../interaction/crosshair.cjs"),s=require("../../interaction/series-interaction.cjs"),c=require("../../svg/element.cjs"),l=require("../../theme/index.cjs"),u=require("./line-renderer.cjs");function createLineChart(d,f){let p=null,m=null,h=null,g=f.series;return r.createChartScaffold(d,f,(d,_)=>{let{groups:v,legend:y,tooltip:b}=d;y?.update(g.map((e,t)=>({color:l.seriesColor(t,e.color),name:e.name})));let x=d.dimensions,S=g.some(e=>e.yAxis===`right`),C=g.some(e=>e.yAxis!==`right`&&e.data.length>0),w={...i.resolveMargin(f.margin),right:f.margin?.right??(S?f.rightYAxis?.label?72:50:i.resolveMargin(f.margin).right)},T=i.chartArea(x.width,x.height,w),E=g.map(e=>e.data),D=E.flat().map(e=>e.key),O=g.filter(e=>e.yAxis!==`right`).flatMap(e=>e.data.map(e=>e.value)),k=g.filter(e=>e.yAxis===`right`).flatMap(e=>e.data.map(e=>e.value));if(D.length===0){r.clearCartesianDom(v,y,b,p),m?.replaceChildren(),h?.replaceChildren();return}f.crosshair&&!p&&(p=o.createCrosshair(d.chartArea,f.crosshair));let A=n.buildXScale(D,T.width),j=n.buildYScale(O,T.height),M=n.buildYScale(k,T.height),N=f.xAxis===!1?!1:f.xAxis??{},P=f.yAxis!==!1&&{grid:!0,...f.yAxis};if(P&&P.grid&&(!S||C)?t.renderGrid(v.grid,j,P.grid,T.width,`horizontal`,e.resolveTicks(j,P,e.resolveTickCount(P,T.height,`left`))):v.grid.replaceChildren(),N&&N.grid&&t.renderGrid(v.grid,A,N.grid,T.height,`vertical`,e.resolveTicks(A,N,e.resolveTickCount(N,T.width,`bottom`))),N?(e.positionAxis(v.xAxis,N.position??`bottom`,T.width,T.height),e.renderAxis(v.xAxis,A,N,T.width,`bottom`)):v.xAxis.replaceChildren(),P&&(!S||C)){let t={...P,position:S?`left`:P.position??`left`};e.positionAxis(v.yAxis,t.position,T.width,T.height),e.renderAxis(v.yAxis,j,t,T.height,`left`)}else v.yAxis.replaceChildren();if(S){h||(h=c.createSvgElement(`g`,{class:`prism-y-axis-right`}),d.chartArea.appendChild(h));let t={...f.rightYAxis,position:`right`};e.positionAxis(h,`right`,T.width,T.height),e.renderAxis(h,M,t,T.height,`right`)}else h?.replaceChildren();for(;v.series.children.length>g.length;)v.series.removeChild(v.series.lastChild);let F=[];for(let e=0;e<g.length;e++){let t=g[e],n=v.series.children[e];n||(n=c.createSvgElement(`g`,{class:`prism-line-series`}),v.series.appendChild(n)),n.setAttribute(`data-series-id`,a.seriesDomId(t,e));let r=t.yAxis===`right`?M:j,i=u.computePoints(E[e],A,r);F.push(i),u.renderLine(n,i,{bounds:{height:T.height,width:T.width},color:l.seriesColor(e,t.color),curve:t.curve??`linear`,disposalSignal:d.disposalSignal,marks:t.data,pointRadius:t.pointRadius??3,showPoints:t.showPoints??!1,strokeWidth:t.strokeWidth,transition:_!==`resize`&&f.transition})}return b?.hide(),m=s.ensureMarkerGroup(d.chartArea,m),s.createSeriesInteraction({announcer:d.announcer,colors:()=>g.map((e,t)=>l.seriesColor(t,e.color)),crosshair:p,dims:()=>d.dimensions,getData:()=>E,getPoints:()=>F,getSeriesList:()=>g,margin:w,markers:m,onClick:f.onClick,onHover:f.onHover,seriesGroup:v.series,svg:d.svg,tooltip:b,tooltipFormat:typeof f.tooltip==`object`?f.tooltip:void 0})},e=>{g=e})}exports.createLineChart=createLineChart;
2
2
  //# sourceMappingURL=line-chart.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"line-chart.cjs","names":["createChartScaffold","seriesColor","resolveMargin","chartArea","createCrosshair","buildXScale","buildYScale","resolveTicks","resolveTickCount","createSvgElement","seriesDomId","computePoints","ensureMarkerGroup","createSeriesInteraction","require_element","require_axis","require_grid","require_cartesian_scales","require_layout","require_chart_scaffold","require_series_id","require_crosshair","require_series_interaction","require_index","require_line_renderer","crosshair","markers","rightAxis","seriesList","config","container","ctx","legend","i","s","dims","hasRight","series","hasLeftData","margin","area","allData","allX","datum","leftY","rightY","groups","tooltip","xScale","yScale","rightYScale","xAxisConfig","yAxisConfig","axis","allPoints","group","seriesScale","points","reason","data"],"sources":["../../../src/charts/line/line-chart.ts"],"sourcesContent":["import { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea, resolveMargin } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, LineChartConfig, LineSeriesConfig, XAxisConfig, YAxisConfig } from '../../types';\nimport { computePoints, renderLine } from './line-renderer';\n\nexport function createLineChart(container: HTMLElement, config: LineChartConfig): ChartHandle<LineSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let rightAxis: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const hasRight = seriesList.some((series) => series.yAxis === 'right');\n const hasLeftData = seriesList.some((series) => series.yAxis !== 'right' && series.data.length > 0);\n // The right axis widens the right margin; the effective margin stays local to this\n // render pass (and is handed to the interaction layer) instead of mutating shared dims.\n const margin = {\n ...resolveMargin(config.margin),\n right:\n config.margin?.right ??\n (hasRight ? (config.rightYAxis?.label ? 72 : 50) : resolveMargin(config.margin).right),\n };\n const area = chartArea(dims.width, dims.height, margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const leftY = seriesList\n .filter((series) => series.yAxis !== 'right')\n .flatMap((series) => series.data.map((datum) => datum.value));\n const rightY = seriesList\n .filter((series) => series.yAxis === 'right')\n .flatMap((series) => series.data.map((datum) => datum.value));\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n rightAxis?.replaceChildren();\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(leftY, area.height);\n const rightYScale = buildYScale(rightY, area.height);\n\n // Axes render by default (value axis with gridlines); `false` opts out. The value\n // axis merges over its default so a partial config (e.g. only `tickFormat`) keeps\n // the default gridlines.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : { grid: true, ...config.yAxis };\n\n if (yAxisConfig && yAxisConfig.grid && (!hasRight || hasLeftData)) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(yScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n } else {\n groups.grid.replaceChildren();\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(xScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig && (!hasRight || hasLeftData)) {\n const axis = { ...yAxisConfig, position: hasRight ? ('left' as const) : (yAxisConfig.position ?? 'left') };\n positionAxis(groups.yAxis, axis.position, area.width, area.height);\n renderAxis(groups.yAxis, yScale, axis, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n if (hasRight) {\n if (!rightAxis) {\n rightAxis = createSvgElement('g', { class: 'prism-y-axis-right' });\n ctx.chartArea.appendChild(rightAxis);\n }\n const axis = { ...config.rightYAxis, position: 'right' as const };\n positionAxis(rightAxis, 'right', area.width, area.height);\n renderAxis(rightAxis, rightYScale, axis, area.height, 'right');\n } else {\n rightAxis?.replaceChildren();\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-line-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const seriesScale = series.yAxis === 'right' ? rightYScale : yScale;\n const points = computePoints(allData[i], xScale, seriesScale);\n\n allPoints.push(points);\n\n renderLine(group, points, {\n bounds: { height: area.height, width: area.width },\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n marks: series.data,\n pointRadius: series.pointRadius ?? 3,\n showPoints: series.showPoints ?? false,\n strokeWidth: series.strokeWidth,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createSeriesInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n tooltipFormat: typeof config.tooltip === 'object' ? config.tooltip : undefined,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"line-chart.cjs","names":["createChartScaffold","seriesColor","resolveMargin","chartArea","createCrosshair","buildXScale","buildYScale","resolveTicks","resolveTickCount","createSvgElement","seriesDomId","computePoints","ensureMarkerGroup","createSeriesInteraction","require_axis","require_grid","require_cartesian_scales","require_chart_scaffold","require_layout","require_series_id","require_crosshair","require_series_interaction","require_element","require_index","require_line_renderer","crosshair","markers","rightAxis","seriesList","config","container","ctx","legend","i","s","dims","hasRight","series","hasLeftData","margin","area","allData","allX","datum","leftY","rightY","groups","tooltip","xScale","yScale","rightYScale","xAxisConfig","yAxisConfig","axis","allPoints","group","seriesScale","points","reason","data"],"sources":["../../../src/charts/line/line-chart.ts"],"sourcesContent":["import { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea, resolveMargin } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { ChartHandle, LineChartConfig, LineSeriesConfig, XAxisConfig, YAxisConfig } from '../../types';\nimport { computePoints, renderLine } from './line-renderer';\n\nexport function createLineChart(container: HTMLElement, config: LineChartConfig): ChartHandle<LineSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let rightAxis: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const hasRight = seriesList.some((series) => series.yAxis === 'right');\n const hasLeftData = seriesList.some((series) => series.yAxis !== 'right' && series.data.length > 0);\n // The right axis widens the right margin; the effective margin stays local to this\n // render pass (and is handed to the interaction layer) instead of mutating shared dims.\n const margin = {\n ...resolveMargin(config.margin),\n right:\n config.margin?.right ??\n (hasRight ? (config.rightYAxis?.label ? 72 : 50) : resolveMargin(config.margin).right),\n };\n const area = chartArea(dims.width, dims.height, margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const leftY = seriesList\n .filter((series) => series.yAxis !== 'right')\n .flatMap((series) => series.data.map((datum) => datum.value));\n const rightY = seriesList\n .filter((series) => series.yAxis === 'right')\n .flatMap((series) => series.data.map((datum) => datum.value));\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n rightAxis?.replaceChildren();\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(leftY, area.height);\n const rightYScale = buildYScale(rightY, area.height);\n\n // Axes render by default (value axis with gridlines); `false` opts out. The value\n // axis merges over its default so a partial config (e.g. only `tickFormat`) keeps\n // the default gridlines.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : { grid: true, ...config.yAxis };\n\n if (yAxisConfig && yAxisConfig.grid && (!hasRight || hasLeftData)) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(yScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n } else {\n groups.grid.replaceChildren();\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(xScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig && (!hasRight || hasLeftData)) {\n const axis = { ...yAxisConfig, position: hasRight ? ('left' as const) : (yAxisConfig.position ?? 'left') };\n positionAxis(groups.yAxis, axis.position, area.width, area.height);\n renderAxis(groups.yAxis, yScale, axis, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n if (hasRight) {\n if (!rightAxis) {\n rightAxis = createSvgElement('g', { class: 'prism-y-axis-right' });\n ctx.chartArea.appendChild(rightAxis);\n }\n const axis = { ...config.rightYAxis, position: 'right' as const };\n positionAxis(rightAxis, 'right', area.width, area.height);\n renderAxis(rightAxis, rightYScale, axis, area.height, 'right');\n } else {\n rightAxis?.replaceChildren();\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-line-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const seriesScale = series.yAxis === 'right' ? rightYScale : yScale;\n const points = computePoints(allData[i], xScale, seriesScale);\n\n allPoints.push(points);\n\n renderLine(group, points, {\n bounds: { height: area.height, width: area.width },\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n marks: series.data,\n pointRadius: series.pointRadius ?? 3,\n showPoints: series.showPoints ?? false,\n strokeWidth: series.strokeWidth,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createSeriesInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n tooltipFormat: typeof config.tooltip === 'object' ? config.tooltip : undefined,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"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"}
@@ -1,77 +1,77 @@
1
- import { createSvgElement as e } from "../../svg/element.js";
2
- import { positionAxis as t, renderAxis as n, resolveTickCount as r, resolveTicks as i } from "../../axes/axis.js";
3
- import { renderGrid as a } from "../../axes/grid.js";
4
- import { buildXScale as o, buildYScale as s } from "../../core/cartesian-scales.js";
5
- import { chartArea as c, resolveMargin as l } from "../../core/layout.js";
6
- import { clearCartesianDom as u, createChartScaffold as d } from "../../core/chart-scaffold.js";
7
- import { seriesDomId as f } from "../../core/series-id.js";
8
- import { createCrosshair as p } from "../../interaction/crosshair.js";
9
- import { createSeriesInteraction as m, ensureMarkerGroup as h } from "../../interaction/series-interaction.js";
1
+ import { positionAxis as e, renderAxis as t, resolveTickCount as n, resolveTicks as r } from "../../axes/axis.js";
2
+ import { renderGrid as i } from "../../axes/grid.js";
3
+ import { buildXScale as a, buildYScale as o } from "../../core/cartesian-scales.js";
4
+ import { clearCartesianDom as s, createChartScaffold as c } from "../../core/chart-scaffold.js";
5
+ import { chartArea as l, resolveMargin as u } from "../../core/layout.js";
6
+ import { seriesDomId as d } from "../../core/series-id.js";
7
+ import { createCrosshair as f } from "../../interaction/crosshair.js";
8
+ import { createSeriesInteraction as p, ensureMarkerGroup as m } from "../../interaction/series-interaction.js";
9
+ import { createSvgElement as h } from "../../svg/element.js";
10
10
  import { seriesColor as g } from "../../theme/index.js";
11
11
  import { computePoints as _, renderLine as v } from "./line-renderer.js";
12
- //#region src/charts/line/line-chart.ts
12
+ // src/charts/line/line-chart.ts
13
13
  function createLineChart(y, b) {
14
14
  let x = null, S = null, C = null, w = b.series;
15
- return d(y, b, (d, y) => {
16
- let { groups: T, legend: E, tooltip: D } = d;
15
+ return c(y, b, (c, y) => {
16
+ let { groups: T, legend: E, tooltip: D } = c;
17
17
  E?.update(w.map((e, t) => ({
18
18
  color: g(t, e.color),
19
19
  name: e.name
20
20
  })));
21
- let O = d.dimensions, k = w.some((e) => e.yAxis === "right"), A = w.some((e) => e.yAxis !== "right" && e.data.length > 0), j = {
22
- ...l(b.margin),
23
- right: b.margin?.right ?? (k ? b.rightYAxis?.label ? 72 : 50 : l(b.margin).right)
24
- }, M = c(O.width, O.height, j), N = w.map((e) => e.data), P = N.flat().map((e) => e.key), F = w.filter((e) => e.yAxis !== "right").flatMap((e) => e.data.map((e) => e.value)), I = w.filter((e) => e.yAxis === "right").flatMap((e) => e.data.map((e) => e.value));
21
+ let O = c.dimensions, k = w.some((e) => e.yAxis === "right"), A = w.some((e) => e.yAxis !== "right" && e.data.length > 0), j = {
22
+ ...u(b.margin),
23
+ right: b.margin?.right ?? (k ? b.rightYAxis?.label ? 72 : 50 : u(b.margin).right)
24
+ }, M = l(O.width, O.height, j), N = w.map((e) => e.data), P = N.flat().map((e) => e.key), F = w.filter((e) => e.yAxis !== "right").flatMap((e) => e.data.map((e) => e.value)), I = w.filter((e) => e.yAxis === "right").flatMap((e) => e.data.map((e) => e.value));
25
25
  if (P.length === 0) {
26
- u(T, E, D, x), S?.replaceChildren(), C?.replaceChildren();
26
+ s(T, E, D, x), S?.replaceChildren(), C?.replaceChildren();
27
27
  return;
28
28
  }
29
- b.crosshair && !x && (x = p(d.chartArea, b.crosshair));
30
- let L = o(P, M.width), R = s(F, M.height), z = s(I, M.height), B = b.xAxis === !1 ? !1 : b.xAxis ?? {}, V = b.yAxis !== !1 && {
29
+ b.crosshair && !x && (x = f(c.chartArea, b.crosshair));
30
+ let L = a(P, M.width), R = o(F, M.height), z = o(I, M.height), B = b.xAxis === !1 ? !1 : b.xAxis ?? {}, V = b.yAxis !== !1 && {
31
31
  grid: !0,
32
32
  ...b.yAxis
33
33
  };
34
- if (V && V.grid && (!k || A) ? a(T.grid, R, V.grid, M.width, "horizontal", i(R, V, r(V, M.height, "left"))) : T.grid.replaceChildren(), B && B.grid && a(T.grid, L, B.grid, M.height, "vertical", i(L, B, r(B, M.width, "bottom"))), B ? (t(T.xAxis, B.position ?? "bottom", M.width, M.height), n(T.xAxis, L, B, M.width, "bottom")) : T.xAxis.replaceChildren(), V && (!k || A)) {
35
- let e = {
34
+ if (V && V.grid && (!k || A) ? i(T.grid, R, V.grid, M.width, "horizontal", r(R, V, n(V, M.height, "left"))) : T.grid.replaceChildren(), B && B.grid && i(T.grid, L, B.grid, M.height, "vertical", r(L, B, n(B, M.width, "bottom"))), B ? (e(T.xAxis, B.position ?? "bottom", M.width, M.height), t(T.xAxis, L, B, M.width, "bottom")) : T.xAxis.replaceChildren(), V && (!k || A)) {
35
+ let n = {
36
36
  ...V,
37
37
  position: k ? "left" : V.position ?? "left"
38
38
  };
39
- t(T.yAxis, e.position, M.width, M.height), n(T.yAxis, R, e, M.height, "left");
39
+ e(T.yAxis, n.position, M.width, M.height), t(T.yAxis, R, n, M.height, "left");
40
40
  } else T.yAxis.replaceChildren();
41
41
  if (k) {
42
- C || (C = e("g", { class: "prism-y-axis-right" }), d.chartArea.appendChild(C));
43
- let r = {
42
+ C || (C = h("g", { class: "prism-y-axis-right" }), c.chartArea.appendChild(C));
43
+ let n = {
44
44
  ...b.rightYAxis,
45
45
  position: "right"
46
46
  };
47
- t(C, "right", M.width, M.height), n(C, z, r, M.height, "right");
47
+ e(C, "right", M.width, M.height), t(C, z, n, M.height, "right");
48
48
  } else C?.replaceChildren();
49
49
  for (; T.series.children.length > w.length;) T.series.removeChild(T.series.lastChild);
50
50
  let H = [];
51
- for (let t = 0; t < w.length; t++) {
52
- let n = w[t], r = T.series.children[t];
53
- r || (r = e("g", { class: "prism-line-series" }), T.series.appendChild(r)), r.setAttribute("data-series-id", f(n, t));
54
- let i = n.yAxis === "right" ? z : R, a = _(N[t], L, i);
55
- H.push(a), v(r, a, {
51
+ for (let e = 0; e < w.length; e++) {
52
+ let t = w[e], n = T.series.children[e];
53
+ n || (n = h("g", { class: "prism-line-series" }), T.series.appendChild(n)), n.setAttribute("data-series-id", d(t, e));
54
+ let r = t.yAxis === "right" ? z : R, i = _(N[e], L, r);
55
+ H.push(i), v(n, i, {
56
56
  bounds: {
57
57
  height: M.height,
58
58
  width: M.width
59
59
  },
60
- color: g(t, n.color),
61
- curve: n.curve ?? "linear",
62
- disposalSignal: d.disposalSignal,
63
- marks: n.data,
64
- pointRadius: n.pointRadius ?? 3,
65
- showPoints: n.showPoints ?? !1,
66
- strokeWidth: n.strokeWidth,
60
+ color: g(e, t.color),
61
+ curve: t.curve ?? "linear",
62
+ disposalSignal: c.disposalSignal,
63
+ marks: t.data,
64
+ pointRadius: t.pointRadius ?? 3,
65
+ showPoints: t.showPoints ?? !1,
66
+ strokeWidth: t.strokeWidth,
67
67
  transition: y !== "resize" && b.transition
68
68
  });
69
69
  }
70
- return D?.hide(), S = h(d.chartArea, S), m({
71
- announcer: d.announcer,
70
+ return D?.hide(), S = m(c.chartArea, S), p({
71
+ announcer: c.announcer,
72
72
  colors: () => w.map((e, t) => g(t, e.color)),
73
73
  crosshair: x,
74
- dims: () => d.dimensions,
74
+ dims: () => c.dimensions,
75
75
  getData: () => N,
76
76
  getPoints: () => H,
77
77
  getSeriesList: () => w,
@@ -80,7 +80,7 @@ function createLineChart(y, b) {
80
80
  onClick: b.onClick,
81
81
  onHover: b.onHover,
82
82
  seriesGroup: T.series,
83
- svg: d.svg,
83
+ svg: c.svg,
84
84
  tooltip: D,
85
85
  tooltipFormat: typeof b.tooltip == "object" ? b.tooltip : void 0
86
86
  });
@@ -88,7 +88,6 @@ function createLineChart(y, b) {
88
88
  w = e;
89
89
  });
90
90
  }
91
- //#endregion
92
91
  export { createLineChart };
93
92
 
94
93
  //# sourceMappingURL=line-chart.js.map
@@ -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("../../animation/transition.cjs"),a=require("../../core/datum-style.cjs"),o=require("../../svg/path.cjs"),s=require("../../animation/reveal.cjs");var c=new WeakMap,l=new WeakMap;function buildPath(e,t){return t===`monotone`?o.monotonePath(e):t===`step`?o.stepPath(e):o.linePath(e)}function renderLine(o,u,d){let f=a.hasStyledRuns(d.marks),p=d.marks??[],m=n.resolveMotion(d.transition),h=m.duration,g=t.resolveEasing(m.easing),_=null,v=[],y=[];if(f){v=a.computeStyleRuns(p,u.length);let t=[...o.querySelectorAll(`.prism-line-path`)];for(let e of t.slice(v.length))e.remove();y=v.map((n,r)=>{let i=t[r];if(i)return i;let a=e.createSvgElement(`path`,{class:`prism-line-path`,fill:`none`});return o.appendChild(a),a});for(let[t,n]of v.entries())e.setAttributes(y[t],{opacity:n.opacity,stroke:d.color,"stroke-dasharray":n.dash,"stroke-width":d.strokeWidth??2}),y[t].style.strokeWidth=d.strokeWidth===void 0?``:String(d.strokeWidth)}else{let t=[...o.querySelectorAll(`.prism-line-path`)];_=t[0]??null;for(let e of t.slice(1))e.remove();_||(_=e.createSvgElement(`path`,{class:`prism-line-path`,fill:`none`}),o.appendChild(_)),e.setAttributes(_,{opacity:void 0,stroke:d.color,"stroke-dasharray":void 0,"stroke-width":d.strokeWidth??2}),_.style.strokeWidth=d.strokeWidth===void 0?``:String(d.strokeWidth)}let draw=t=>{if(f)for(let[n,r]of v.entries())e.setAttributes(y[n],{d:buildPath(t.slice(r.start,r.end+1),d.curve)});else e.setAttributes(_,{d:buildPath(t,d.curve)})},b=o.querySelector(`.prism-line-dots`);if(d.showPoints?b||(b=e.createSvgElement(`g`,{class:`prism-line-dots`}),o.appendChild(b)):b&&=(b.remove(),null),h===0){if(c.get(o)?.(),s.cancelReveal(o),draw(u),l.set(o,u),b){for(;b.children.length>u.length;)b.removeChild(b.lastChild);for(let t=0;t<u.length;t++){let n=b.children[t];n||(n=e.createSvgElement(`circle`,{class:`prism-line-dot`}),b.appendChild(n)),e.setAttributes(n,{cx:u[t].x,cy:u[t].y,fill:d.color,opacity:p[t]?.opacity,r:d.pointRadius})}}return}c.get(o)?.(),s.cancelReveal(o);let x=!l.has(o);if(b){for(;b.children.length>u.length;)b.removeChild(b.lastChild);for(let t=b.children.length;t<u.length;t++){let n=e.createSvgElement(`circle`,{class:`prism-line-dot`});e.setAttributes(n,{fill:d.color,opacity:p[t]?.opacity,r:d.pointRadius}),b.appendChild(n)}for(let t=0;t<b.children.length;t++)e.setAttributes(b.children[t],{opacity:p[t]?.opacity})}if(x){if(draw(u),l.set(o,u),b)for(let[t,n]of u.entries()){let r=b.children[t];r&&e.setAttributes(r,{cx:n.x,cy:n.y})}if(u.length>1){let e=_??y[0],t=d.strokeWidth??(Number.parseFloat(getComputedStyle(e).strokeWidth)||2),r=f?v.map((e,t)=>({d:y[t].getAttribute(`d`),end:e.end/(u.length-1),start:e.start/(u.length-1)})):[{d:_.getAttribute(`d`),end:1,start:0}];s.playTraceReveal(o,d.bounds,r,Math.max(t,d.showPoints?d.pointRadius*2:0)+2,n.resolveMotion(d.transition,{defaultDuration:420}),d.disposalSignal)}return}let S=[],C=l.get(o)??u;for(let[e,t]of u.entries())S.push(C[e]??C.at(-1)??t);let paintFrame=t=>{let n=u.map((e,n)=>{let i=S[n]??e;return{x:r.tweenNumber(i.x,e.x,t),y:r.tweenNumber(i.y,e.y,t)}});if(l.set(o,n),draw(n),b)for(let t=0;t<u.length;t++){let r=b.children[t];r&&e.setAttributes(r,{cx:n[t].x,cy:n[t].y})}};paintFrame(0),c.set(o,i.startTween({count:1,duration:h,easing:g,onComplete:()=>{c.delete(o),l.set(o,u)},onFrame:e=>paintFrame(e(0)),signal:d.disposalSignal}))}function computePoints(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.computePoints=computePoints,exports.renderLine=renderLine;
1
+ require("../../_dev.cjs");const e=require("../../animation/easing.cjs"),t=require("../../animation/motion.cjs"),n=require("../../animation/reveal.cjs"),r=require("../../animation/transition.cjs"),i=require("../../animation/tween.cjs"),a=require("../../core/datum-style.cjs"),o=require("../../svg/element.cjs"),s=require("../../svg/path.cjs");var c=new WeakMap,l=new WeakMap;function buildPath(e,t){return t===`monotone`?s.monotonePath(e):t===`step`?s.stepPath(e):s.linePath(e)}function renderLine(s,u,d){let f=a.hasStyledRuns(d.marks),p=d.marks??[],m=t.resolveMotion(d.transition),h=m.duration,g=e.resolveEasing(m.easing),_=null,v=[],y=[];if(f){v=a.computeStyleRuns(p,u.length);let e=[...s.querySelectorAll(`.prism-line-path`)];for(let t of e.slice(v.length))t.remove();y=v.map((t,n)=>{let r=e[n];if(r)return r;let i=o.createSvgElement(`path`,{class:`prism-line-path`,fill:`none`});return s.appendChild(i),i});for(let[e,t]of v.entries())o.setAttributes(y[e],{opacity:t.opacity,stroke:d.color,"stroke-dasharray":t.dash,"stroke-width":d.strokeWidth??2}),y[e].style.strokeWidth=d.strokeWidth===void 0?``:String(d.strokeWidth)}else{let e=[...s.querySelectorAll(`.prism-line-path`)];_=e[0]??null;for(let t of e.slice(1))t.remove();_||(_=o.createSvgElement(`path`,{class:`prism-line-path`,fill:`none`}),s.appendChild(_)),o.setAttributes(_,{opacity:void 0,stroke:d.color,"stroke-dasharray":void 0,"stroke-width":d.strokeWidth??2}),_.style.strokeWidth=d.strokeWidth===void 0?``:String(d.strokeWidth)}let draw=e=>{if(f)for(let[t,n]of v.entries())o.setAttributes(y[t],{d:buildPath(e.slice(n.start,n.end+1),d.curve)});else o.setAttributes(_,{d:buildPath(e,d.curve)})},b=s.querySelector(`.prism-line-dots`);if(d.showPoints?b||(b=o.createSvgElement(`g`,{class:`prism-line-dots`}),s.appendChild(b)):b&&=(b.remove(),null),h===0){if(c.get(s)?.(),n.cancelReveal(s),draw(u),l.set(s,u),b){for(;b.children.length>u.length;)b.removeChild(b.lastChild);for(let e=0;e<u.length;e++){let t=b.children[e];t||(t=o.createSvgElement(`circle`,{class:`prism-line-dot`}),b.appendChild(t)),o.setAttributes(t,{cx:u[e].x,cy:u[e].y,fill:d.color,opacity:p[e]?.opacity,r:d.pointRadius})}}return}c.get(s)?.(),n.cancelReveal(s);let x=!l.has(s);if(b){for(;b.children.length>u.length;)b.removeChild(b.lastChild);for(let e=b.children.length;e<u.length;e++){let t=o.createSvgElement(`circle`,{class:`prism-line-dot`});o.setAttributes(t,{fill:d.color,opacity:p[e]?.opacity,r:d.pointRadius}),b.appendChild(t)}for(let e=0;e<b.children.length;e++)o.setAttributes(b.children[e],{opacity:p[e]?.opacity})}if(x){if(draw(u),l.set(s,u),b)for(let[e,t]of u.entries()){let n=b.children[e];n&&o.setAttributes(n,{cx:t.x,cy:t.y})}if(u.length>1){let e=_??y[0],r=d.strokeWidth??(Number.parseFloat(getComputedStyle(e).strokeWidth)||2),i=f?v.map((e,t)=>({d:y[t].getAttribute(`d`),end:e.end/(u.length-1),start:e.start/(u.length-1)})):[{d:_.getAttribute(`d`),end:1,start:0}];n.playTraceReveal(s,d.bounds,i,Math.max(r,d.showPoints?d.pointRadius*2:0)+2,t.resolveMotion(d.transition,{defaultDuration:420}),d.disposalSignal)}return}let S=[],C=l.get(s)??u;for(let[e,t]of u.entries())S.push(C[e]??C.at(-1)??t);let paintFrame=e=>{let t=u.map((t,n)=>{let r=S[n]??t;return{x:i.tweenNumber(r.x,t.x,e),y:i.tweenNumber(r.y,t.y,e)}});if(l.set(s,t),draw(t),b)for(let e=0;e<u.length;e++){let n=b.children[e];n&&o.setAttributes(n,{cx:t[e].x,cy:t[e].y})}};paintFrame(0),c.set(s,r.startTween({count:1,duration:h,easing:g,onComplete:()=>{c.delete(s),l.set(s,u)},onFrame:e=>paintFrame(e(0)),signal:d.disposalSignal}))}function computePoints(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.computePoints=computePoints,exports.renderLine=renderLine;
2
2
  //# sourceMappingURL=line-renderer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"line-renderer.cjs","names":["monotonePath","stepPath","linePath","hasStyledRuns","resolveMotion","resolveEasing","computeStyleRuns","createSvgElement","tweenNumber","startTween","require_element","require_easing","require_motion","require_tween","require_transition","require_datum_style","require_path","require_reveal","activeAnimations","drawnPoints","curve","pts","styled","options","marks","motion","dur","easing","path","runs","runPaths","points","existing","parent","extra","reuse","created","r","run","stale","dotsGroup","i","c","isMount","point","renderedPath","strokeWidth","traces","fromPts","drawn","to","interpolated","from","e","progress","data","d","xScale","yScale"],"sources":["../../../src/charts/line/line-renderer.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { cancelReveal, playTraceReveal } from '../../animation/reveal';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport { computeStyleRuns, type DatumMark, hasStyledRuns, type StyleRun } from '../../core/datum-style';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionOption } from '../../types';\n\nexport interface LineRenderOptions {\n /** Plot-area size in area-local coordinates: bounds the entrance mask. */\n bounds: { height: number; width: number };\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 /** Per-datum presentation parallel to `points`; styled runs split the line into subpaths. */\n marks?: readonly DatumMark[];\n pointRadius: number;\n showPoints: boolean;\n /** Explicit width beats the `--prism-line-width` theme token. */\n strokeWidth?: number;\n transition?: TransitionOption;\n}\n\nconst activeAnimations = new WeakMap<SVGGElement, () => void>();\n// Geometry currently on screen, so an update interpolates from it even when the\n// series hides its point markers (the dots would otherwise be the only record).\nconst drawnPoints = new WeakMap<SVGGElement, Point[]>();\n\nfunction buildPath(pts: Point[], curve: LineRenderOptions['curve']): string {\n return curve === 'monotone' ? monotonePath(pts) : curve === 'step' ? stepPath(pts) : linePath(pts);\n}\n\nexport function renderLine(parent: SVGGElement, points: Point[], options: LineRenderOptions): void {\n const styled = hasStyledRuns(options.marks);\n const marks = options.marks ?? [];\n const motion = resolveMotion(options.transition);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n let path: SVGPathElement | null = null;\n let runs: readonly StyleRun[] = [];\n let runPaths: SVGPathElement[] = [];\n\n if (styled) {\n runs = computeStyleRuns(marks, points.length);\n\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-line-path')];\n\n for (const extra of existing.slice(runs.length)) extra.remove();\n\n runPaths = runs.map((_, r) => {\n const reuse = existing[r];\n\n if (reuse) return reuse;\n\n const created = createSvgElement('path', { class: 'prism-line-path', fill: 'none' });\n\n parent.appendChild(created);\n\n return created;\n });\n\n for (const [r, run] of runs.entries()) {\n setAttributes(runPaths[r], {\n opacity: run.opacity,\n stroke: options.color,\n 'stroke-dasharray': run.dash,\n 'stroke-width': options.strokeWidth ?? 2,\n });\n runPaths[r].style.strokeWidth = options.strokeWidth === undefined ? '' : String(options.strokeWidth);\n }\n } else {\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-line-path')];\n\n path = existing[0] ?? null;\n\n for (const stale of existing.slice(1)) stale.remove();\n\n if (!path) {\n path = createSvgElement('path', { class: 'prism-line-path', fill: 'none' });\n parent.appendChild(path);\n }\n\n setAttributes(path, {\n opacity: undefined,\n stroke: options.color,\n 'stroke-dasharray': undefined,\n 'stroke-width': options.strokeWidth ?? 2,\n });\n path.style.strokeWidth = options.strokeWidth === undefined ? '' : String(options.strokeWidth);\n }\n\n const draw = (pts: Point[]): void => {\n if (styled) {\n for (const [r, run] of runs.entries()) {\n setAttributes(runPaths[r], { d: buildPath(pts.slice(run.start, run.end + 1), options.curve) });\n }\n } else {\n setAttributes(path!, { d: buildPath(pts, options.curve) });\n }\n };\n\n let dotsGroup = parent.querySelector<SVGGElement>('.prism-line-dots');\n\n if (options.showPoints) {\n if (!dotsGroup) {\n dotsGroup = createSvgElement('g', { class: 'prism-line-dots' });\n parent.appendChild(dotsGroup);\n }\n } else if (dotsGroup) {\n dotsGroup.remove();\n dotsGroup = null;\n }\n\n if (dur === 0) {\n activeAnimations.get(parent)?.();\n cancelReveal(parent);\n draw(points);\n drawnPoints.set(parent, points);\n\n if (dotsGroup) {\n while (dotsGroup.children.length > points.length) dotsGroup.removeChild(dotsGroup.lastChild!);\n\n for (let i = 0; i < points.length; i++) {\n let c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (!c) {\n c = createSvgElement('circle', { class: 'prism-line-dot' });\n dotsGroup.appendChild(c);\n }\n\n setAttributes(c, {\n cx: points[i].x,\n cy: points[i].y,\n fill: options.color,\n opacity: marks[i]?.opacity,\n r: options.pointRadius,\n });\n }\n }\n\n return;\n }\n\n activeAnimations.get(parent)?.();\n cancelReveal(parent);\n\n const isMount = !drawnPoints.has(parent);\n\n if (dotsGroup) {\n while (dotsGroup.children.length > points.length) dotsGroup.removeChild(dotsGroup.lastChild!);\n\n for (let i = dotsGroup.children.length; i < points.length; i++) {\n const c = createSvgElement('circle', { class: 'prism-line-dot' });\n\n setAttributes(c, {\n fill: options.color,\n opacity: marks[i]?.opacity,\n r: options.pointRadius,\n });\n dotsGroup.appendChild(c);\n }\n\n for (let i = 0; i < dotsGroup.children.length; i++) {\n setAttributes(dotsGroup.children[i] as SVGCircleElement, { opacity: marks[i]?.opacity });\n }\n }\n\n if (isMount) {\n draw(points);\n drawnPoints.set(parent, points);\n\n if (dotsGroup) {\n for (const [i, point] of points.entries()) {\n const c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (c) setAttributes(c, { cx: point.x, cy: point.y });\n }\n }\n\n if (points.length > 1) {\n const renderedPath = path ?? runPaths[0];\n const strokeWidth = options.strokeWidth ?? (Number.parseFloat(getComputedStyle(renderedPath).strokeWidth) || 2);\n const traces = styled\n ? runs.map((run, i) => ({\n d: runPaths[i].getAttribute('d')!,\n end: run.end / (points.length - 1),\n start: run.start / (points.length - 1),\n }))\n : [{ d: path!.getAttribute('d')!, end: 1, start: 0 }];\n\n // A wide trace also uncovers markers as it reaches them, without a second timeline.\n playTraceReveal(\n parent,\n options.bounds,\n traces,\n Math.max(strokeWidth, options.showPoints ? options.pointRadius * 2 : 0) + 2,\n resolveMotion(options.transition, { defaultDuration: 420 }),\n options.disposalSignal,\n );\n }\n\n return;\n }\n\n const fromPts: Point[] = [];\n const drawn = drawnPoints.get(parent) ?? points;\n\n for (const [i, to] of points.entries()) {\n fromPts.push(drawn[i] ?? drawn.at(-1) ?? to);\n }\n\n const paintFrame = (e: number): void => {\n const interpolated: Point[] = points.map((to, i) => {\n const from = fromPts[i] ?? to;\n\n return { x: tweenNumber(from.x, to.x, e), y: tweenNumber(from.y, to.y, e) };\n });\n\n drawnPoints.set(parent, interpolated);\n draw(interpolated);\n\n if (dotsGroup) {\n for (let i = 0; i < points.length; i++) {\n const c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (c) setAttributes(c, { cx: interpolated[i].x, cy: interpolated[i].y });\n }\n }\n };\n\n // The starting geometry goes on screen immediately: `startTween` only paints on\n // the first frame callback, which would otherwise leave one blank frame.\n paintFrame(0);\n\n activeAnimations.set(\n parent,\n startTween({\n count: 1,\n duration: dur,\n easing,\n onComplete: () => {\n activeAnimations.delete(parent);\n drawnPoints.set(parent, points);\n },\n onFrame: (progress) => paintFrame(progress(0)),\n signal: options.disposalSignal,\n }),\n );\n}\n\nexport function computePoints(data: ContinuousDatum[], xScale: Scale<Date | number>, yScale: Scale<number>): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computePoints: 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('computePoints: 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":"A,sVA4BA,IAAMkB,EAAmB,IAAI,QAGvBC,EAAc,IAAI,QAExB,SAAS,UAAU,EAAc,EAA2C,CAC1E,OAAOC,IAAU,WAAapB,EAAAA,aAAaqB,CAAG,EAAID,IAAU,OAASnB,EAAAA,SAASoB,CAAG,EAAInB,EAAAA,SAASmB,CAAG,CACnG,CAEA,SAAgB,WAAW,EAAqB,EAAiB,EAAkC,CACjG,IAAMC,EAASnB,EAAAA,cAAcoB,EAAQ,KAAK,EACpCC,EAAQD,EAAQ,OAAS,CAAC,EAC1BE,EAASrB,EAAAA,cAAcmB,EAAQ,UAAU,EACzCG,EAAMD,EAAO,SACbE,EAAStB,EAAAA,cAAcoB,EAAO,MAAM,EAEtCG,EAA8B,KAC9BC,EAA4B,CAAC,EAC7BC,EAA6B,CAAC,EAElC,GAAIR,EAAQ,CACV,EAAOhB,EAAAA,iBAAiBkB,EAAOO,EAAO,MAAM,EAE5C,IAAMC,EAAW,CAAC,GAAGC,EAAO,iBAAiC,kBAAkB,CAAC,EAEhF,IAAK,IAAMC,KAASF,EAAS,MAAMH,EAAK,MAAM,EAAGK,EAAM,OAAO,EAE9D,EAAWL,EAAK,KAAK,EAAG,IAAM,CAC5B,IAAMM,EAAQH,EAAS,GAEvB,GAAIG,EAAO,OAAOA,EAElB,IAAMC,EAAU7B,EAAAA,iBAAiB,OAAQ,CAAE,MAAO,kBAAmB,KAAM,MAAO,CAAC,EAInF,OAFA0B,EAAO,YAAYG,CAAO,EAEnBA,CACT,CAAC,EAED,IAAK,GAAM,CAACC,EAAGC,KAAQT,EAAK,QAAQ,EAClCnB,EAAA,cAAcoB,EAASO,GAAI,CACzB,QAASC,EAAI,QACb,OAAQf,EAAQ,MAChB,mBAAoBe,EAAI,KACxB,eAAgBf,EAAQ,aAAe,CACzC,CAAC,EACD,EAASc,EAAE,CAAC,MAAM,YAAcd,EAAQ,cAAgB,IAAA,GAAY,GAAK,OAAOA,EAAQ,WAAW,CAEvG,KAAO,CACL,IAAMS,EAAW,CAAC,GAAGC,EAAO,iBAAiC,kBAAkB,CAAC,EAEhF,EAAOD,EAAS,IAAM,KAEtB,IAAK,IAAMO,KAASP,EAAS,MAAM,CAAC,EAAGO,EAAM,OAAO,EAE/CX,IACH,EAAOrB,EAAAA,iBAAiB,OAAQ,CAAE,MAAO,kBAAmB,KAAM,MAAO,CAAC,EAC1E0B,EAAO,YAAYL,CAAI,GAGzBlB,EAAA,cAAckB,EAAM,CAClB,QAAS,IAAA,GACT,OAAQL,EAAQ,MAChB,mBAAoB,IAAA,GACpB,eAAgBA,EAAQ,aAAe,CACzC,CAAC,EACD,EAAK,MAAM,YAAcA,EAAQ,cAAgB,IAAA,GAAY,GAAK,OAAOA,EAAQ,WAAW,CAC9F,CAEA,IAAM,KAAQ,GAAuB,CACnC,GAAID,EACF,IAAK,GAAM,CAACe,EAAGC,KAAQT,EAAK,QAAQ,EAClCnB,EAAA,cAAcoB,EAASO,GAAI,CAAE,EAAG,UAAUhB,EAAI,MAAMiB,EAAI,MAAOA,EAAI,IAAM,CAAC,EAAGf,EAAQ,KAAK,CAAE,CAAC,OAG/Fb,EAAA,cAAckB,EAAO,CAAE,EAAG,UAAUP,EAAKE,EAAQ,KAAK,CAAE,CAAC,CAE7D,EAEIiB,EAAYP,EAAO,cAA2B,kBAAkB,EAYpE,GAVIV,EAAQ,WACLiB,IACH,EAAYjC,EAAAA,iBAAiB,IAAK,CAAE,MAAO,iBAAkB,CAAC,EAC9D0B,EAAO,YAAYO,CAAS,GAEzB,AAELA,KADAA,EAAU,OAAO,EACL,MAGVd,IAAQ,EAAG,CAMb,GALAR,EAAiB,IAAIe,CAAM,CAAC,GAAG,EAC/BhB,EAAA,aAAagB,CAAM,EACnB,KAAKF,CAAM,EACXZ,EAAY,IAAIc,EAAQF,CAAM,EAE1BS,EAAW,CACb,KAAOA,EAAU,SAAS,OAAST,EAAO,QAAQS,EAAU,YAAYA,EAAU,SAAU,EAE5F,IAAK,IAAIC,EAAI,EAAGA,EAAIV,EAAO,OAAQ,IAAK,CACtC,IAAIW,EAAIF,EAAU,SAASC,GAEtBC,IACH,EAAInC,EAAAA,iBAAiB,SAAU,CAAE,MAAO,gBAAiB,CAAC,EAC1DiC,EAAU,YAAYE,CAAC,GAGzBhC,EAAA,cAAcgC,EAAG,CACf,GAAIX,EAAOU,EAAE,CAAC,EACd,GAAIV,EAAOU,EAAE,CAAC,EACd,KAAMlB,EAAQ,MACd,QAASC,EAAMiB,EAAE,EAAE,QACnB,EAAGlB,EAAQ,WACb,CAAC,CACH,CACF,CAEA,MACF,CAEAL,EAAiB,IAAIe,CAAM,CAAC,GAAG,EAC/BhB,EAAA,aAAagB,CAAM,EAEnB,IAAMU,EAAU,CAACxB,EAAY,IAAIc,CAAM,EAEvC,GAAIO,EAAW,CACb,KAAOA,EAAU,SAAS,OAAST,EAAO,QAAQS,EAAU,YAAYA,EAAU,SAAU,EAE5F,IAAK,IAAIC,EAAID,EAAU,SAAS,OAAQC,EAAIV,EAAO,OAAQ,IAAK,CAC9D,IAAMW,EAAInC,EAAAA,iBAAiB,SAAU,CAAE,MAAO,gBAAiB,CAAC,EAEhEG,EAAA,cAAcgC,EAAG,CACf,KAAMnB,EAAQ,MACd,QAASC,EAAMiB,EAAE,EAAE,QACnB,EAAGlB,EAAQ,WACb,CAAC,EACDiB,EAAU,YAAYE,CAAC,CACzB,CAEA,IAAK,IAAID,EAAI,EAAGA,EAAID,EAAU,SAAS,OAAQ,IAC7C9B,EAAA,cAAc8B,EAAU,SAASC,GAAwB,CAAE,QAASjB,EAAMiB,EAAE,EAAE,OAAQ,CAAC,CAE3F,CAEA,GAAIE,EAAS,CAIX,GAHA,KAAKZ,CAAM,EACXZ,EAAY,IAAIc,EAAQF,CAAM,EAE1BS,EACF,IAAK,GAAM,CAACC,EAAGG,KAAUb,EAAO,QAAQ,EAAG,CACzC,IAAMW,EAAIF,EAAU,SAASC,GAEzBC,GAAGhC,EAAA,cAAcgC,EAAG,CAAE,GAAIE,EAAM,EAAG,GAAIA,EAAM,CAAE,CAAC,CACtD,CAGF,GAAIb,EAAO,OAAS,EAAG,CACrB,IAAMc,EAAejB,GAAQE,EAAS,GAChCgB,EAAcvB,EAAQ,cAAgB,OAAO,WAAW,iBAAiBsB,CAAY,CAAC,CAAC,WAAW,GAAK,GACvGE,EAASzB,EACXO,EAAK,KAAK,EAAK,KAAO,CACpB,EAAGC,EAASW,EAAE,CAAC,aAAa,GAAG,EAC/B,IAAKH,EAAI,KAAOP,EAAO,OAAS,GAChC,MAAOO,EAAI,OAASP,EAAO,OAAS,EACtC,EAAE,EACF,CAAC,CAAE,EAAGH,EAAM,aAAa,GAAG,EAAI,IAAK,EAAG,MAAO,CAAE,CAAC,EAGtDX,EAAA,gBACEgB,EACAV,EAAQ,OACRwB,EACA,KAAK,IAAID,EAAavB,EAAQ,WAAaA,EAAQ,YAAc,EAAI,CAAC,EAAI,EAC1EnB,EAAAA,cAAcmB,EAAQ,WAAY,CAAE,gBAAiB,GAAI,CAAC,EAC1DA,EAAQ,cACV,CACF,CAEA,MACF,CAEA,IAAMyB,EAAmB,CAAC,EACpBC,EAAQ9B,EAAY,IAAIc,CAAM,GAAKF,EAEzC,IAAK,GAAM,CAACU,EAAGS,KAAOnB,EAAO,QAAQ,EACnCiB,EAAQ,KAAKC,EAAMR,IAAMQ,EAAM,GAAG,EAAE,GAAKC,CAAE,EAG7C,IAAM,WAAc,GAAoB,CACtC,IAAMC,EAAwBpB,EAAO,KAAK,EAAI,IAAM,CAClD,IAAMqB,EAAOJ,EAAQP,IAAMS,EAE3B,MAAO,CAAE,EAAG1C,EAAAA,YAAY4C,EAAK,EAAGF,EAAG,EAAGG,CAAC,EAAG,EAAG7C,EAAAA,YAAY4C,EAAK,EAAGF,EAAG,EAAGG,CAAC,CAAE,CAC5E,CAAC,EAKD,GAHAlC,EAAY,IAAIc,EAAQkB,CAAY,EACpC,KAAKA,CAAY,EAEbX,EACF,IAAK,IAAIC,EAAI,EAAGA,EAAIV,EAAO,OAAQ,IAAK,CACtC,IAAMW,EAAIF,EAAU,SAASC,GAEzBC,GAAGhC,EAAA,cAAcgC,EAAG,CAAE,GAAIS,EAAaV,EAAE,CAAC,EAAG,GAAIU,EAAaV,EAAE,CAAC,CAAE,CAAC,CAC1E,CAEJ,EAIA,WAAW,CAAC,EAEZvB,EAAiB,IACfe,EACAxB,EAAAA,WAAW,CACT,MAAO,EACP,SAAUiB,EACV,SACA,eAAkB,CAChBR,EAAiB,OAAOe,CAAM,EAC9Bd,EAAY,IAAIc,EAAQF,CAAM,CAChC,EACA,QAAU,GAAa,WAAWuB,EAAS,CAAC,CAAC,EAC7C,OAAQ/B,EAAQ,cAClB,CAAC,CACH,CACF,CAEA,SAAgB,cAAc,EAAyB,EAA8B,EAAgC,CASnH,OARIgC,EAAK,KAAM,GAAMC,EAAE,KAAO,IAAI,GAIvBD,EAAK,KAAM,GAAM,OAAOC,EAAE,KAAQ,QAAQ,EAI9CD,EAAK,IAAK,IAAO,CACtB,EAAGE,EAAO,IAAID,EAAE,GAAoB,EACpC,EAAGE,EAAO,IAAIF,EAAE,KAAK,CACvB,EAAE,CACJ,C"}
1
+ {"version":3,"file":"line-renderer.cjs","names":["monotonePath","stepPath","linePath","hasStyledRuns","resolveMotion","resolveEasing","computeStyleRuns","createSvgElement","tweenNumber","startTween","require_easing","require_motion","require_reveal","require_transition","require_tween","require_datum_style","require_element","require_path","activeAnimations","drawnPoints","curve","pts","styled","options","marks","motion","dur","easing","path","runs","runPaths","points","existing","parent","extra","reuse","r","created","run","stale","dotsGroup","i","c","isMount","point","renderedPath","strokeWidth","traces","fromPts","drawn","to","interpolated","from","progress","data","d","xScale","yScale"],"sources":["../../../src/charts/line/line-renderer.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { resolveEasing } from '../../animation/easing';\nimport { resolveMotion } from '../../animation/motion';\nimport { cancelReveal, playTraceReveal } from '../../animation/reveal';\nimport { startTween } from '../../animation/transition';\nimport { tweenNumber } from '../../animation/tween';\nimport { computeStyleRuns, type DatumMark, hasStyledRuns, type StyleRun } from '../../core/datum-style';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { linePath, monotonePath, stepPath } from '../../svg/path';\nimport type { ContinuousDatum, Scale, TransitionOption } from '../../types';\n\nexport interface LineRenderOptions {\n /** Plot-area size in area-local coordinates: bounds the entrance mask. */\n bounds: { height: number; width: number };\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 /** Per-datum presentation parallel to `points`; styled runs split the line into subpaths. */\n marks?: readonly DatumMark[];\n pointRadius: number;\n showPoints: boolean;\n /** Explicit width beats the `--prism-line-width` theme token. */\n strokeWidth?: number;\n transition?: TransitionOption;\n}\n\nconst activeAnimations = new WeakMap<SVGGElement, () => void>();\n// Geometry currently on screen, so an update interpolates from it even when the\n// series hides its point markers (the dots would otherwise be the only record).\nconst drawnPoints = new WeakMap<SVGGElement, Point[]>();\n\nfunction buildPath(pts: Point[], curve: LineRenderOptions['curve']): string {\n return curve === 'monotone' ? monotonePath(pts) : curve === 'step' ? stepPath(pts) : linePath(pts);\n}\n\nexport function renderLine(parent: SVGGElement, points: Point[], options: LineRenderOptions): void {\n const styled = hasStyledRuns(options.marks);\n const marks = options.marks ?? [];\n const motion = resolveMotion(options.transition);\n const dur = motion.duration;\n const easing = resolveEasing(motion.easing);\n\n let path: SVGPathElement | null = null;\n let runs: readonly StyleRun[] = [];\n let runPaths: SVGPathElement[] = [];\n\n if (styled) {\n runs = computeStyleRuns(marks, points.length);\n\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-line-path')];\n\n for (const extra of existing.slice(runs.length)) extra.remove();\n\n runPaths = runs.map((_, r) => {\n const reuse = existing[r];\n\n if (reuse) return reuse;\n\n const created = createSvgElement('path', { class: 'prism-line-path', fill: 'none' });\n\n parent.appendChild(created);\n\n return created;\n });\n\n for (const [r, run] of runs.entries()) {\n setAttributes(runPaths[r], {\n opacity: run.opacity,\n stroke: options.color,\n 'stroke-dasharray': run.dash,\n 'stroke-width': options.strokeWidth ?? 2,\n });\n runPaths[r].style.strokeWidth = options.strokeWidth === undefined ? '' : String(options.strokeWidth);\n }\n } else {\n const existing = [...parent.querySelectorAll<SVGPathElement>('.prism-line-path')];\n\n path = existing[0] ?? null;\n\n for (const stale of existing.slice(1)) stale.remove();\n\n if (!path) {\n path = createSvgElement('path', { class: 'prism-line-path', fill: 'none' });\n parent.appendChild(path);\n }\n\n setAttributes(path, {\n opacity: undefined,\n stroke: options.color,\n 'stroke-dasharray': undefined,\n 'stroke-width': options.strokeWidth ?? 2,\n });\n path.style.strokeWidth = options.strokeWidth === undefined ? '' : String(options.strokeWidth);\n }\n\n const draw = (pts: Point[]): void => {\n if (styled) {\n for (const [r, run] of runs.entries()) {\n setAttributes(runPaths[r], { d: buildPath(pts.slice(run.start, run.end + 1), options.curve) });\n }\n } else {\n setAttributes(path!, { d: buildPath(pts, options.curve) });\n }\n };\n\n let dotsGroup = parent.querySelector<SVGGElement>('.prism-line-dots');\n\n if (options.showPoints) {\n if (!dotsGroup) {\n dotsGroup = createSvgElement('g', { class: 'prism-line-dots' });\n parent.appendChild(dotsGroup);\n }\n } else if (dotsGroup) {\n dotsGroup.remove();\n dotsGroup = null;\n }\n\n if (dur === 0) {\n activeAnimations.get(parent)?.();\n cancelReveal(parent);\n draw(points);\n drawnPoints.set(parent, points);\n\n if (dotsGroup) {\n while (dotsGroup.children.length > points.length) dotsGroup.removeChild(dotsGroup.lastChild!);\n\n for (let i = 0; i < points.length; i++) {\n let c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (!c) {\n c = createSvgElement('circle', { class: 'prism-line-dot' });\n dotsGroup.appendChild(c);\n }\n\n setAttributes(c, {\n cx: points[i].x,\n cy: points[i].y,\n fill: options.color,\n opacity: marks[i]?.opacity,\n r: options.pointRadius,\n });\n }\n }\n\n return;\n }\n\n activeAnimations.get(parent)?.();\n cancelReveal(parent);\n\n const isMount = !drawnPoints.has(parent);\n\n if (dotsGroup) {\n while (dotsGroup.children.length > points.length) dotsGroup.removeChild(dotsGroup.lastChild!);\n\n for (let i = dotsGroup.children.length; i < points.length; i++) {\n const c = createSvgElement('circle', { class: 'prism-line-dot' });\n\n setAttributes(c, {\n fill: options.color,\n opacity: marks[i]?.opacity,\n r: options.pointRadius,\n });\n dotsGroup.appendChild(c);\n }\n\n for (let i = 0; i < dotsGroup.children.length; i++) {\n setAttributes(dotsGroup.children[i] as SVGCircleElement, { opacity: marks[i]?.opacity });\n }\n }\n\n if (isMount) {\n draw(points);\n drawnPoints.set(parent, points);\n\n if (dotsGroup) {\n for (const [i, point] of points.entries()) {\n const c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (c) setAttributes(c, { cx: point.x, cy: point.y });\n }\n }\n\n if (points.length > 1) {\n const renderedPath = path ?? runPaths[0];\n const strokeWidth = options.strokeWidth ?? (Number.parseFloat(getComputedStyle(renderedPath).strokeWidth) || 2);\n const traces = styled\n ? runs.map((run, i) => ({\n d: runPaths[i].getAttribute('d')!,\n end: run.end / (points.length - 1),\n start: run.start / (points.length - 1),\n }))\n : [{ d: path!.getAttribute('d')!, end: 1, start: 0 }];\n\n // A wide trace also uncovers markers as it reaches them, without a second timeline.\n playTraceReveal(\n parent,\n options.bounds,\n traces,\n Math.max(strokeWidth, options.showPoints ? options.pointRadius * 2 : 0) + 2,\n resolveMotion(options.transition, { defaultDuration: 420 }),\n options.disposalSignal,\n );\n }\n\n return;\n }\n\n const fromPts: Point[] = [];\n const drawn = drawnPoints.get(parent) ?? points;\n\n for (const [i, to] of points.entries()) {\n fromPts.push(drawn[i] ?? drawn.at(-1) ?? to);\n }\n\n const paintFrame = (e: number): void => {\n const interpolated: Point[] = points.map((to, i) => {\n const from = fromPts[i] ?? to;\n\n return { x: tweenNumber(from.x, to.x, e), y: tweenNumber(from.y, to.y, e) };\n });\n\n drawnPoints.set(parent, interpolated);\n draw(interpolated);\n\n if (dotsGroup) {\n for (let i = 0; i < points.length; i++) {\n const c = dotsGroup.children[i] as SVGCircleElement | undefined;\n\n if (c) setAttributes(c, { cx: interpolated[i].x, cy: interpolated[i].y });\n }\n }\n };\n\n // The starting geometry goes on screen immediately: `startTween` only paints on\n // the first frame callback, which would otherwise leave one blank frame.\n paintFrame(0);\n\n activeAnimations.set(\n parent,\n startTween({\n count: 1,\n duration: dur,\n easing,\n onComplete: () => {\n activeAnimations.delete(parent);\n drawnPoints.set(parent, points);\n },\n onFrame: (progress) => paintFrame(progress(0)),\n signal: options.disposalSignal,\n }),\n );\n}\n\nexport function computePoints(data: ContinuousDatum[], xScale: Scale<Date | number>, yScale: Scale<number>): Point[] {\n if (data.some((d) => d.key == null)) {\n warn(\n 'computePoints: 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('computePoints: 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":"A,sVA4BA,IAAMkB,EAAmB,IAAI,QAGvBC,EAAc,IAAI,QAExB,SAAS,UAAU,EAAc,EAA2C,CAC1E,OAAOC,IAAU,WAAapB,EAAAA,aAAaqB,CAAG,EAAID,IAAU,OAASnB,EAAAA,SAASoB,CAAG,EAAInB,EAAAA,SAASmB,CAAG,CACnG,CAEA,SAAgB,WAAW,EAAqB,EAAiB,EAAkC,CACjG,IAAMC,EAASnB,EAAAA,cAAcoB,EAAQ,KAAK,EACpCC,EAAQD,EAAQ,OAAS,CAAC,EAC1BE,EAASrB,EAAAA,cAAcmB,EAAQ,UAAU,EACzCG,EAAMD,EAAO,SACbE,EAAStB,EAAAA,cAAcoB,EAAO,MAAM,EAEtCG,EAA8B,KAC9BC,EAA4B,CAAC,EAC7BC,EAA6B,CAAC,EAElC,GAAIR,EAAQ,CACV,EAAOhB,EAAAA,iBAAiBkB,EAAOO,EAAO,MAAM,EAE5C,IAAMC,EAAW,CAAC,GAAGC,EAAO,iBAAiC,kBAAkB,CAAC,EAEhF,IAAK,IAAMC,KAASF,EAAS,MAAMH,EAAK,MAAM,EAAGK,EAAM,OAAO,EAE9D,EAAWL,EAAK,KAAK,EAAG,IAAM,CAC5B,IAAMM,EAAQH,EAASI,GAEvB,GAAID,EAAO,OAAOA,EAElB,IAAME,EAAU9B,EAAAA,iBAAiB,OAAQ,CAAE,MAAO,kBAAmB,KAAM,MAAO,CAAC,EAInF,OAFA0B,EAAO,YAAYI,CAAO,EAEnBA,CACT,CAAC,EAED,IAAK,GAAM,CAACD,EAAGE,KAAQT,EAAK,QAAQ,EAClCb,EAAA,cAAcc,EAASM,GAAI,CACzB,QAASE,EAAI,QACb,OAAQf,EAAQ,MAChB,mBAAoBe,EAAI,KACxB,eAAgBf,EAAQ,aAAe,CACzC,CAAC,EACD,EAASa,EAAE,CAAC,MAAM,YAAcb,EAAQ,cAAgB,IAAA,GAAY,GAAK,OAAOA,EAAQ,WAAW,CAEvG,KAAO,CACL,IAAMS,EAAW,CAAC,GAAGC,EAAO,iBAAiC,kBAAkB,CAAC,EAEhF,EAAOD,EAAS,IAAM,KAEtB,IAAK,IAAMO,KAASP,EAAS,MAAM,CAAC,EAAGO,EAAM,OAAO,EAE/CX,IACH,EAAOrB,EAAAA,iBAAiB,OAAQ,CAAE,MAAO,kBAAmB,KAAM,MAAO,CAAC,EAC1E0B,EAAO,YAAYL,CAAI,GAGzBZ,EAAA,cAAcY,EAAM,CAClB,QAAS,IAAA,GACT,OAAQL,EAAQ,MAChB,mBAAoB,IAAA,GACpB,eAAgBA,EAAQ,aAAe,CACzC,CAAC,EACD,EAAK,MAAM,YAAcA,EAAQ,cAAgB,IAAA,GAAY,GAAK,OAAOA,EAAQ,WAAW,CAC9F,CAEA,IAAM,KAAQ,GAAuB,CACnC,GAAID,EACF,IAAK,GAAM,CAACc,EAAGE,KAAQT,EAAK,QAAQ,EAClCb,EAAA,cAAcc,EAASM,GAAI,CAAE,EAAG,UAAUf,EAAI,MAAMiB,EAAI,MAAOA,EAAI,IAAM,CAAC,EAAGf,EAAQ,KAAK,CAAE,CAAC,OAG/FP,EAAA,cAAcY,EAAO,CAAE,EAAG,UAAUP,EAAKE,EAAQ,KAAK,CAAE,CAAC,CAE7D,EAEIiB,EAAYP,EAAO,cAA2B,kBAAkB,EAYpE,GAVIV,EAAQ,WACLiB,IACH,EAAYjC,EAAAA,iBAAiB,IAAK,CAAE,MAAO,iBAAkB,CAAC,EAC9D0B,EAAO,YAAYO,CAAS,GAEzB,AAELA,KADAA,EAAU,OAAO,EACL,MAGVd,IAAQ,EAAG,CAMb,GALAR,EAAiB,IAAIe,CAAM,CAAC,GAAG,EAC/BrB,EAAA,aAAaqB,CAAM,EACnB,KAAKF,CAAM,EACXZ,EAAY,IAAIc,EAAQF,CAAM,EAE1BS,EAAW,CACb,KAAOA,EAAU,SAAS,OAAST,EAAO,QAAQS,EAAU,YAAYA,EAAU,SAAU,EAE5F,IAAK,IAAIC,EAAI,EAAGA,EAAIV,EAAO,OAAQ,IAAK,CACtC,IAAIW,EAAIF,EAAU,SAASC,GAEtBC,IACH,EAAInC,EAAAA,iBAAiB,SAAU,CAAE,MAAO,gBAAiB,CAAC,EAC1DiC,EAAU,YAAYE,CAAC,GAGzB1B,EAAA,cAAc0B,EAAG,CACf,GAAIX,EAAOU,EAAE,CAAC,EACd,GAAIV,EAAOU,EAAE,CAAC,EACd,KAAMlB,EAAQ,MACd,QAASC,EAAMiB,EAAE,EAAE,QACnB,EAAGlB,EAAQ,WACb,CAAC,CACH,CACF,CAEA,MACF,CAEAL,EAAiB,IAAIe,CAAM,CAAC,GAAG,EAC/BrB,EAAA,aAAaqB,CAAM,EAEnB,IAAMU,EAAU,CAACxB,EAAY,IAAIc,CAAM,EAEvC,GAAIO,EAAW,CACb,KAAOA,EAAU,SAAS,OAAST,EAAO,QAAQS,EAAU,YAAYA,EAAU,SAAU,EAE5F,IAAK,IAAIC,EAAID,EAAU,SAAS,OAAQC,EAAIV,EAAO,OAAQ,IAAK,CAC9D,IAAMW,EAAInC,EAAAA,iBAAiB,SAAU,CAAE,MAAO,gBAAiB,CAAC,EAEhES,EAAA,cAAc0B,EAAG,CACf,KAAMnB,EAAQ,MACd,QAASC,EAAMiB,EAAE,EAAE,QACnB,EAAGlB,EAAQ,WACb,CAAC,EACDiB,EAAU,YAAYE,CAAC,CACzB,CAEA,IAAK,IAAID,EAAI,EAAGA,EAAID,EAAU,SAAS,OAAQ,IAC7CxB,EAAA,cAAcwB,EAAU,SAASC,GAAwB,CAAE,QAASjB,EAAMiB,EAAE,EAAE,OAAQ,CAAC,CAE3F,CAEA,GAAIE,EAAS,CAIX,GAHA,KAAKZ,CAAM,EACXZ,EAAY,IAAIc,EAAQF,CAAM,EAE1BS,EACF,IAAK,GAAM,CAACC,EAAGG,KAAUb,EAAO,QAAQ,EAAG,CACzC,IAAMW,EAAIF,EAAU,SAASC,GAEzBC,GAAG1B,EAAA,cAAc0B,EAAG,CAAE,GAAIE,EAAM,EAAG,GAAIA,EAAM,CAAE,CAAC,CACtD,CAGF,GAAIb,EAAO,OAAS,EAAG,CACrB,IAAMc,EAAejB,GAAQE,EAAS,GAChCgB,EAAcvB,EAAQ,cAAgB,OAAO,WAAW,iBAAiBsB,CAAY,CAAC,CAAC,WAAW,GAAK,GACvGE,EAASzB,EACXO,EAAK,KAAK,EAAK,KAAO,CACpB,EAAGC,EAASW,EAAE,CAAC,aAAa,GAAG,EAC/B,IAAKH,EAAI,KAAOP,EAAO,OAAS,GAChC,MAAOO,EAAI,OAASP,EAAO,OAAS,EACtC,EAAE,EACF,CAAC,CAAE,EAAGH,EAAM,aAAa,GAAG,EAAI,IAAK,EAAG,MAAO,CAAE,CAAC,EAGtDhB,EAAA,gBACEqB,EACAV,EAAQ,OACRwB,EACA,KAAK,IAAID,EAAavB,EAAQ,WAAaA,EAAQ,YAAc,EAAI,CAAC,EAAI,EAC1EnB,EAAAA,cAAcmB,EAAQ,WAAY,CAAE,gBAAiB,GAAI,CAAC,EAC1DA,EAAQ,cACV,CACF,CAEA,MACF,CAEA,IAAMyB,EAAmB,CAAC,EACpBC,EAAQ9B,EAAY,IAAIc,CAAM,GAAKF,EAEzC,IAAK,GAAM,CAACU,EAAGS,KAAOnB,EAAO,QAAQ,EACnCiB,EAAQ,KAAKC,EAAMR,IAAMQ,EAAM,GAAG,EAAE,GAAKC,CAAE,EAG7C,IAAM,WAAc,GAAoB,CACtC,IAAMC,EAAwBpB,EAAO,KAAK,EAAI,IAAM,CAClD,IAAMqB,EAAOJ,EAAQP,IAAMS,EAE3B,MAAO,CAAE,EAAG1C,EAAAA,YAAY4C,EAAK,EAAGF,EAAG,EAAG,CAAC,EAAG,EAAG1C,EAAAA,YAAY4C,EAAK,EAAGF,EAAG,EAAG,CAAC,CAAE,CAC5E,CAAC,EAKD,GAHA/B,EAAY,IAAIc,EAAQkB,CAAY,EACpC,KAAKA,CAAY,EAEbX,EACF,IAAK,IAAIC,EAAI,EAAGA,EAAIV,EAAO,OAAQ,IAAK,CACtC,IAAMW,EAAIF,EAAU,SAASC,GAEzBC,GAAG1B,EAAA,cAAc0B,EAAG,CAAE,GAAIS,EAAaV,EAAE,CAAC,EAAG,GAAIU,EAAaV,EAAE,CAAC,CAAE,CAAC,CAC1E,CAEJ,EAIA,WAAW,CAAC,EAEZvB,EAAiB,IACfe,EACAxB,EAAAA,WAAW,CACT,MAAO,EACP,SAAUiB,EACV,SACA,eAAkB,CAChBR,EAAiB,OAAOe,CAAM,EAC9Bd,EAAY,IAAIc,EAAQF,CAAM,CAChC,EACA,QAAU,GAAa,WAAWsB,EAAS,CAAC,CAAC,EAC7C,OAAQ9B,EAAQ,cAClB,CAAC,CACH,CACF,CAEA,SAAgB,cAAc,EAAyB,EAA8B,EAAgC,CASnH,OARI+B,EAAK,KAAM,GAAMC,EAAE,KAAO,IAAI,GAIvBD,EAAK,KAAM,GAAM,OAAOC,EAAE,KAAQ,QAAQ,EAI9CD,EAAK,IAAK,IAAO,CACtB,EAAGE,EAAO,IAAID,EAAE,GAAoB,EACpC,EAAGE,EAAO,IAAIF,EAAE,KAAK,CACvB,EAAE,CACJ,C"}