minerva-design 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/custom-elements.json +10 -2
  3. package/dist/angular/fesm2022/minerva-angular.mjs +40 -5
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +14 -1
  6. package/dist/charts/react/charts.cjs +1 -1
  7. package/dist/charts/react/charts.cjs.map +1 -1
  8. package/dist/charts/react/charts.js +120 -97
  9. package/dist/charts/react/charts.js.map +1 -1
  10. package/dist/charts/react/types.d.cts +8 -0
  11. package/dist/charts/react/types.d.ts +8 -0
  12. package/dist/core/contracts.cjs +1 -1
  13. package/dist/core/contracts.cjs.map +1 -1
  14. package/dist/core/contracts.js +1 -1
  15. package/dist/core/contracts.js.map +1 -1
  16. package/dist/vue/components/Chart/QuadrantChart.vue.d.ts +4 -0
  17. package/dist/vue/components/Chart/QuadrantChart.vue.js.map +1 -1
  18. package/dist/vue/components/Chart/QuadrantChart.vue_vue_type_script_setup_true_lang.js +48 -37
  19. package/dist/vue/components/Chart/QuadrantChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  20. package/dist/vue/components/Chart/cartesian.d.ts +1 -0
  21. package/dist/vue/components/Chart/cartesian.js +1 -0
  22. package/dist/vue/components/Chart/cartesian.js.map +1 -1
  23. package/dist/web-components/components/chart/chart.d.ts +1 -0
  24. package/dist/web-components/components/chart/chart.js +1 -0
  25. package/dist/web-components/components/chart/chart.js.map +1 -1
  26. package/dist/web-components/components/chart/charts.d.ts +6 -1
  27. package/dist/web-components/components/chart/charts.js +31 -15
  28. package/dist/web-components/components/chart/charts.js.map +1 -1
  29. package/dist/web-components/html-custom-data.json +2 -2
  30. package/dist/web-components/types/react.d.ts +2 -0
  31. package/dist/web-components/types/solid.d.ts +2 -0
  32. package/dist/web-components/types/svelte.d.ts +2 -0
  33. package/dist/web-components/types/vue.d.ts +2 -0
  34. package/package.json +1 -1
@@ -2,10 +2,10 @@
2
2
  import { resolveLocale as e } from "../engine/locale.js";
3
3
  import { Chart as t, ChartBase as n, engineOptions as r } from "./Chart.js";
4
4
  import { areaSeries as i, barSeries as a, boxplotData as o, boxplotSeries as s, bubbleSeries as c, candlestickSeries as l, ganttSeries as u, heatmapChartOptions as d, histogramSeries as f, lineSeries as p, presetLabels as m, quadrantChartOptions as h, quadrantOf as g, rangeAreaSeries as _, scatterSeries as v, sparklineOptions as y, waterfallSeries as b } from "../engine/presets.js";
5
- import { useMemo as x, useState as S } from "react";
6
- import { jsx as C } from "react/jsx-runtime";
5
+ import { useEffect as x, useMemo as S, useRef as C, useState as w } from "react";
6
+ import { jsx as T } from "react/jsx-runtime";
7
7
  //#region src/react/charts.tsx
8
- var w = (e) => ({
8
+ var E = (e) => ({
9
9
  height: e.height,
10
10
  width: e.width,
11
11
  className: e.className,
@@ -18,8 +18,8 @@ var w = (e) => ({
18
18
  onRendererChange: e.onRendererChange,
19
19
  renderTooltip: e.renderTooltip
20
20
  });
21
- function T(e) {
22
- let { series: t, area: i = !1, curve: a, stacked: o = !1, percent: s = !1 } = e, c = x(() => p(t, i, {
21
+ function D(e) {
22
+ let { series: t, area: i = !1, curve: a, stacked: o = !1, percent: s = !1 } = e, c = S(() => p(t, i, {
23
23
  curve: a,
24
24
  stacked: o || s
25
25
  }), [
@@ -29,17 +29,17 @@ function T(e) {
29
29
  o,
30
30
  s
31
31
  ]);
32
- return /* @__PURE__ */ C(n, {
32
+ return /* @__PURE__ */ T(n, {
33
33
  options: r({
34
34
  ...e,
35
35
  series: c,
36
36
  stackMode: s ? "percent" : void 0
37
37
  }),
38
- ...w(e)
38
+ ...E(e)
39
39
  });
40
40
  }
41
- function E(e) {
42
- let { series: t, curve: a = "smooth", stacked: o = !1, percent: s = !1 } = e, c = x(() => i(t, {
41
+ function O(e) {
42
+ let { series: t, curve: a = "smooth", stacked: o = !1, percent: s = !1 } = e, c = S(() => i(t, {
43
43
  curve: a,
44
44
  stacked: o || s
45
45
  }), [
@@ -48,44 +48,44 @@ function E(e) {
48
48
  o,
49
49
  s
50
50
  ]);
51
- return /* @__PURE__ */ C(n, {
51
+ return /* @__PURE__ */ T(n, {
52
52
  options: r({
53
53
  ...e,
54
54
  series: c,
55
55
  stackMode: s ? "percent" : void 0
56
56
  }),
57
- ...w(e)
57
+ ...E(e)
58
58
  });
59
59
  }
60
- function D(e) {
61
- let { series: t, stacked: i = !1, percent: o = !1, labels: s = !1 } = e, c = x(() => a(t, i || o, s), [
60
+ function k(e) {
61
+ let { series: t, stacked: i = !1, percent: o = !1, labels: s = !1 } = e, c = S(() => a(t, i || o, s), [
62
62
  t,
63
63
  i,
64
64
  o,
65
65
  s
66
66
  ]);
67
- return /* @__PURE__ */ C(n, {
67
+ return /* @__PURE__ */ T(n, {
68
68
  options: r({
69
69
  ...e,
70
70
  labels: void 0,
71
71
  series: c,
72
72
  stackMode: o ? "percent" : void 0
73
73
  }),
74
- ...w(e)
74
+ ...E(e)
75
75
  });
76
76
  }
77
- function O(e) {
78
- let { series: t } = e, i = x(() => l(t), [t]);
79
- return /* @__PURE__ */ C(n, {
77
+ function A(e) {
78
+ let { series: t } = e, i = S(() => l(t), [t]);
79
+ return /* @__PURE__ */ T(n, {
80
80
  options: r({
81
81
  ...e,
82
82
  series: i
83
83
  }),
84
- ...w(e)
84
+ ...E(e)
85
85
  });
86
86
  }
87
- function k(e) {
88
- let { data: t, xCategories: i, yCategories: a, colorScale: o, valueRange: s, colorMidpoint: c, name: l, radius: u, format: f } = e, p = x(() => d({
87
+ function j(e) {
88
+ let { data: t, xCategories: i, yCategories: a, colorScale: o, valueRange: s, colorMidpoint: c, name: l, radius: u, format: f } = e, p = S(() => d({
89
89
  data: t,
90
90
  xCategories: i,
91
91
  yCategories: a,
@@ -109,7 +109,7 @@ function k(e) {
109
109
  ...e,
110
110
  series: p
111
111
  });
112
- return /* @__PURE__ */ C(n, {
112
+ return /* @__PURE__ */ T(n, {
113
113
  options: {
114
114
  ...d({
115
115
  data: t,
@@ -123,11 +123,11 @@ function k(e) {
123
123
  }),
124
124
  series: p
125
125
  },
126
- ...w(e)
126
+ ...E(e)
127
127
  });
128
128
  }
129
- function A(e) {
130
- let { data: t, type: r, color: i, curve: a, name: o, reference: s, format: c, height: l = 48, width: u, renderer: d, tooltip: f, palette: p, ariaLabel: m, locale: h, labels: g, className: _, style: v, ref: b, onHover: S, renderTooltip: w } = e, T = x(() => y({
129
+ function M(e) {
130
+ let { data: t, type: r, color: i, curve: a, name: o, reference: s, format: c, height: l = 48, width: u, renderer: d, tooltip: f, palette: p, ariaLabel: m, locale: h, labels: g, className: _, style: v, ref: b, onHover: x, renderTooltip: C } = e, w = S(() => y({
131
131
  data: t,
132
132
  type: r,
133
133
  color: i,
@@ -157,33 +157,33 @@ function A(e) {
157
157
  h,
158
158
  g
159
159
  ]);
160
- return /* @__PURE__ */ C(n, {
161
- options: T,
160
+ return /* @__PURE__ */ T(n, {
161
+ options: w,
162
162
  height: l,
163
163
  width: u,
164
164
  className: _,
165
165
  style: v,
166
166
  handleRef: b,
167
- onHover: S,
168
- renderTooltip: w
167
+ onHover: x,
168
+ renderTooltip: C
169
169
  });
170
170
  }
171
- function j(e) {
172
- let { series: t } = e, i = x(() => v(t), [t]);
173
- return /* @__PURE__ */ C(n, {
171
+ function N(e) {
172
+ let { series: t } = e, i = S(() => v(t), [t]);
173
+ return /* @__PURE__ */ T(n, {
174
174
  options: r({
175
175
  ...e,
176
176
  series: i
177
177
  }),
178
- ...w(e)
178
+ ...E(e)
179
179
  });
180
180
  }
181
- var M = [
181
+ var P = [
182
182
  "topLeft",
183
183
  "topRight",
184
184
  "bottomLeft",
185
185
  "bottomRight"
186
- ], N = (e, t, n) => {
186
+ ], F = 400, I = (e, t, n) => {
187
187
  let r = e.endsWith("Left"), i = e.startsWith("top");
188
188
  return {
189
189
  position: "absolute",
@@ -194,14 +194,24 @@ var M = [
194
194
  pointerEvents: "none"
195
195
  };
196
196
  };
197
- function P(e) {
198
- let { points: t, xDomain: i, yDomain: a, xSplit: o, ySplit: s, quadrants: c, xLabel: l, yLabel: u, axisLabels: d, showTicks: f, reverseX: p, showLabels: m, pointSize: _, name: v, draggable: y, onPointClick: b, onPointDrop: x, onQuadrantClick: S, renderTooltip: T, quadrantContent: E } = e, D = {
197
+ function L(e) {
198
+ let { points: t, xDomain: i, yDomain: a, xSplit: o, ySplit: s, quadrants: c, xLabel: l, yLabel: u, axisLabels: d, showTicks: f, reverseX: p, showLabels: m, pointSize: _, name: v, draggable: y, onPointClick: b, onPointDoubleClick: S, onPointDrag: D, onPointDrop: O, onQuadrantClick: k, renderTooltip: A, quadrantContent: j } = e, M = {
199
199
  xDomain: i,
200
200
  yDomain: a,
201
201
  xSplit: o,
202
202
  ySplit: s,
203
203
  reverseX: p
204
- }, O = h({
204
+ }, [N, L] = w(null), R = C(null);
205
+ x(() => {
206
+ if (!N) return;
207
+ let e = () => L(null);
208
+ return window.addEventListener("pointerup", e), () => window.removeEventListener("pointerup", e);
209
+ }, [N]);
210
+ let z = (e) => ({
211
+ x: e.x,
212
+ y: e.y,
213
+ quadrant: g(M, e.x, e.y)
214
+ }), B = h({
205
215
  points: t,
206
216
  xDomain: i,
207
217
  yDomain: a,
@@ -216,69 +226,82 @@ function P(e) {
216
226
  showLabels: m,
217
227
  pointSize: _,
218
228
  name: v,
219
- draggable: y ?? !!x
229
+ draggable: y ?? !!(O || D)
220
230
  }, r({
221
231
  ...e,
222
232
  series: []
223
- })), k = E ? (e) => {
224
- let [t, n] = i ?? [0, 10], [r, c] = a ?? [0, 10], l = o ?? (t + n) / 2, u = s ?? (r + c) / 2, d = (l - t) / (n - t || 1), f = (u - r) / (c - r || 1), m = {
225
- x: e.x + e.width * (p ? 1 - d : d),
226
- y: e.y + e.height * (1 - f)
227
- };
228
- return M.map((t) => E[t] ? /* @__PURE__ */ C("div", {
233
+ })), V = j || N ? (e) => {
234
+ let [t, n] = i ?? [0, 10], [r, l] = a ?? [0, 10], u = o ?? (t + n) / 2, d = s ?? (r + l) / 2, f = (u - t) / (n - t || 1), m = (d - r) / (l - r || 1), h = {
235
+ x: e.x + e.width * (p ? 1 - f : f),
236
+ y: e.y + e.height * (1 - m)
237
+ }, g = N ? c?.[N]?.color ?? "currentColor" : "";
238
+ return [...P.map((t) => j?.[t] ? /* @__PURE__ */ T("div", {
229
239
  className: `minerva-chart-quadrant minerva-chart-quadrant-${t}`,
230
- style: N(t, e, m),
231
- children: E[t]
232
- }, t) : null);
240
+ style: I(t, e, h),
241
+ children: j[t]
242
+ }, t) : null), N ? /* @__PURE__ */ T("div", {
243
+ className: "minerva-chart-quadrant-target",
244
+ style: {
245
+ ...I(N, e, h),
246
+ background: `color-mix(in srgb, ${g} 14%, transparent)`,
247
+ boxShadow: `inset 0 0 0 2px ${g}`
248
+ }
249
+ }, "drop-target") : null];
233
250
  } : void 0;
234
- return /* @__PURE__ */ C(n, {
235
- options: O,
236
- ...w({
251
+ return /* @__PURE__ */ T(n, {
252
+ options: B,
253
+ ...E({
237
254
  ...e,
238
255
  onPointClick: void 0,
239
256
  renderTooltip: void 0
240
257
  }),
241
- overlay: k,
242
- onPointClick: b ? (e) => {
258
+ overlay: V,
259
+ onPointClick: (e) => {
243
260
  let n = e.items[0]?.index;
244
- n !== void 0 && t[n] && b(t[n], n);
245
- } : void 0,
246
- onPlotClick: S ? (e) => S(g(D, e.x, e.y), e) : void 0,
247
- onDrop: x ? (e) => {
261
+ if (n === void 0 || !t[n]) return;
262
+ let r = Date.now(), i = R.current, a = i?.index === n && r - i.time < F;
263
+ R.current = a ? null : {
264
+ index: n,
265
+ time: r
266
+ }, b?.(t[n], n), a && S?.(t[n], n);
267
+ },
268
+ onPlotClick: k ? (e) => k(g(M, e.x, e.y), e) : void 0,
269
+ onDrag: (e) => {
270
+ let n = e.item.index, r = z(e);
271
+ L(r.quadrant), t[n] && D?.(t[n], n, r);
272
+ },
273
+ onDrop: (e) => {
274
+ L(null);
248
275
  let n = e.item.index;
249
- t[n] && x(t[n], n, {
250
- x: e.x,
251
- y: e.y,
252
- quadrant: g(D, e.x, e.y)
253
- });
254
- } : void 0,
255
- renderTooltip: T ? (e) => {
276
+ t[n] && O && O(t[n], n, z(e));
277
+ },
278
+ renderTooltip: A ? (e) => {
256
279
  let n = e.items[0]?.index;
257
- return n !== void 0 && t[n] ? T(t[n], n) : null;
280
+ return n !== void 0 && t[n] ? A(t[n], n) : null;
258
281
  } : void 0
259
282
  });
260
283
  }
261
- function F(e) {
262
- return /* @__PURE__ */ C(D, {
284
+ function R(e) {
285
+ return /* @__PURE__ */ T(k, {
263
286
  ...e,
264
287
  orientation: "horizontal"
265
288
  });
266
289
  }
267
- function I(e) {
268
- let { series: t, curve: i = "smooth" } = e, a = x(() => _(t, i), [t, i]);
269
- return /* @__PURE__ */ C(n, {
290
+ function z(e) {
291
+ let { series: t, curve: i = "smooth" } = e, a = S(() => _(t, i), [t, i]);
292
+ return /* @__PURE__ */ T(n, {
270
293
  options: r({
271
294
  ...e,
272
295
  series: a
273
296
  }),
274
- ...w(e)
297
+ ...E(e)
275
298
  });
276
299
  }
277
- function L(e) {
278
- return /* @__PURE__ */ C(t, { ...e });
300
+ function B(e) {
301
+ return /* @__PURE__ */ T(t, { ...e });
279
302
  }
280
- function R(e) {
281
- let { series: t, minSize: i, maxSize: a, maxValue: o } = e, s = x(() => c(t, {
303
+ function V(e) {
304
+ let { series: t, minSize: i, maxSize: a, maxValue: o } = e, s = S(() => c(t, {
282
305
  minSize: i,
283
306
  maxSize: a,
284
307
  maxValue: o
@@ -288,16 +311,16 @@ function R(e) {
288
311
  a,
289
312
  o
290
313
  ]);
291
- return /* @__PURE__ */ C(n, {
314
+ return /* @__PURE__ */ T(n, {
292
315
  options: r({
293
316
  ...e,
294
317
  series: s
295
318
  }),
296
- ...w(e)
319
+ ...E(e)
297
320
  });
298
321
  }
299
- function z(t) {
300
- let { values: i, bins: a, domain: o, nice: s, name: c, color: l, formatBin: u, series: d, locale: p } = t, m = e(p), h = x(() => [f(i, {
322
+ function H(t) {
323
+ let { values: i, bins: a, domain: o, nice: s, name: c, color: l, formatBin: u, series: d, locale: p } = t, m = e(p), h = S(() => [f(i, {
301
324
  bins: a,
302
325
  domain: o,
303
326
  nice: s,
@@ -316,16 +339,16 @@ function z(t) {
316
339
  d,
317
340
  m
318
341
  ]);
319
- return /* @__PURE__ */ C(n, {
342
+ return /* @__PURE__ */ T(n, {
320
343
  options: r({
321
344
  ...t,
322
345
  series: h
323
346
  }),
324
- ...w(t)
347
+ ...E(t)
325
348
  });
326
349
  }
327
- function B(t) {
328
- let { series: i, groups: a, name: c, whisker: l, orientation: u, locale: d, outlierShape: f, outlierSize: p } = t, h = c ?? m(e(d)).values, g = x(() => s([...a?.length ? [{
350
+ function U(t) {
351
+ let { series: i, groups: a, name: c, whisker: l, orientation: u, locale: d, outlierShape: f, outlierSize: p } = t, h = c ?? m(e(d)).values, g = S(() => s([...a?.length ? [{
329
352
  id: "boxplot",
330
353
  name: h,
331
354
  data: o(a, { whisker: l })
@@ -341,17 +364,17 @@ function B(t) {
341
364
  f,
342
365
  p
343
366
  ]);
344
- return /* @__PURE__ */ C(n, {
367
+ return /* @__PURE__ */ T(n, {
345
368
  options: r({
346
369
  ...t,
347
370
  series: g,
348
371
  orientation: u
349
372
  }),
350
- ...w(t)
373
+ ...E(t)
351
374
  });
352
375
  }
353
- function V(t) {
354
- let { steps: i, name: a, upColor: o, downColor: s, totalColor: c, start: l, labels: u = !0, format: d, connector: f, orientation: p, locale: m } = t, h = e(m), g = x(() => [b(i, {
376
+ function W(t) {
377
+ let { steps: i, name: a, upColor: o, downColor: s, totalColor: c, start: l, labels: u = !0, format: d, connector: f, orientation: p, locale: m } = t, h = e(m), g = S(() => [b(i, {
355
378
  name: a,
356
379
  upColor: o,
357
380
  downColor: s,
@@ -373,18 +396,18 @@ function V(t) {
373
396
  f,
374
397
  h
375
398
  ]);
376
- return /* @__PURE__ */ C(n, {
399
+ return /* @__PURE__ */ T(n, {
377
400
  options: r({
378
401
  ...t,
379
402
  labels: void 0,
380
403
  series: g,
381
404
  orientation: p
382
405
  }),
383
- ...w(t)
406
+ ...E(t)
384
407
  });
385
408
  }
386
- function H(t) {
387
- let { tasks: i, colors: a, taskName: o, progressName: s, milestoneName: c, formatProgress: l, dependenciesName: d, dependencyArrows: f, dependencyColor: p, today: m = !1, todayLabel: h, xAxis: g, yAxis: _, annotations: v, interaction: y, legend: b, locale: T } = t, E = e(T), D = x(() => u(i, {
409
+ function G(t) {
410
+ let { tasks: i, colors: a, taskName: o, progressName: s, milestoneName: c, formatProgress: l, dependenciesName: d, dependencyArrows: f, dependencyColor: p, today: m = !1, todayLabel: h, xAxis: g, yAxis: _, annotations: v, interaction: y, legend: b, locale: x } = t, C = e(x), D = S(() => u(i, {
388
411
  colors: a,
389
412
  taskName: o,
390
413
  progressName: s,
@@ -393,7 +416,7 @@ function H(t) {
393
416
  dependenciesName: d,
394
417
  dependencyArrows: f,
395
418
  dependencyColor: p,
396
- locale: E
419
+ locale: C
397
420
  }), [
398
421
  i,
399
422
  a,
@@ -404,8 +427,8 @@ function H(t) {
404
427
  d,
405
428
  f,
406
429
  p,
407
- E
408
- ]), [O] = S(() => Date.now()), k = m === !1 ? null : m === !0 ? O : m instanceof Date ? m.getTime() : m, A = k === null ? [] : [{
430
+ C
431
+ ]), [O] = w(() => Date.now()), k = m === !1 ? null : m === !0 ? O : m instanceof Date ? m.getTime() : m, A = k === null ? [] : [{
409
432
  type: "line",
410
433
  axis: "y",
411
434
  value: k,
@@ -413,7 +436,7 @@ function H(t) {
413
436
  dash: [4, 3],
414
437
  label: h
415
438
  }];
416
- return /* @__PURE__ */ C(n, {
439
+ return /* @__PURE__ */ T(n, {
417
440
  options: {
418
441
  ...r({
419
442
  ...t,
@@ -436,10 +459,10 @@ function H(t) {
436
459
  interaction: y ?? { zoom: "y" },
437
460
  legend: b ?? D.series.length > 1
438
461
  },
439
- ...w(t)
462
+ ...E(t)
440
463
  });
441
464
  }
442
465
  //#endregion
443
- export { E as AreaChart, D as BarChart, B as BoxPlotChart, R as BubbleChart, O as CandlestickChart, H as GanttChart, k as HeatmapChart, z as HistogramChart, F as HorizontalBarChart, T as LineChart, L as MixedChart, P as QuadrantChart, I as RangeAreaChart, j as ScatterChart, A as Sparkline, V as WaterfallChart };
466
+ export { O as AreaChart, k as BarChart, U as BoxPlotChart, V as BubbleChart, A as CandlestickChart, G as GanttChart, j as HeatmapChart, H as HistogramChart, R as HorizontalBarChart, D as LineChart, B as MixedChart, L as QuadrantChart, z as RangeAreaChart, N as ScatterChart, M as Sparkline, W as WaterfallChart };
444
467
 
445
468
  //# sourceMappingURL=charts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"charts.js","names":["frameProps","props","LineChart","input","series","useMemo","lineSeries","area","stacked","percent","curve","ChartBase","engineOptions","AreaChart","areaSeries","BarChart","barSeries","labels","CandlestickChart","candlestickSeries","HeatmapChart","heatmapChartOptions","data","xCategories","yCategories","colorScale","valueRange","colorMidpoint","name","radius","format","base","Sparkline","options","sparklineOptions","type","color","reference","renderer","tooltip","palette","ariaLabel","locale","ref","ScatterChart","scatterSeries","CORNERS","cornerStyle","left","corner","top","split","plot","QuadrantChart","geometry","quadrantChartOptions","draggable","onPointDrop","overlay","quadrantContent","x0","x1","xDomain","y0","y1","yDomain","xs","xSplit","ys","ySplit","fx","fy","reverseX","onPointClick","index","event","points","onQuadrantClick","quadrantOf","at","renderTooltip","HorizontalBarChart","RangeAreaChart","rangeAreaSeries","MixedChart","Chart","BubbleChart","bubbleSeries","minSize","maxSize","maxValue","HistogramChart","extra","lang","resolveLocale","histogramSeries","values","formatBin","bins","domain","nice","BoxPlotChart","groupName","presetLabels","boxplotSeries","groups","boxplotData","s","outlierShape","outlierSize","whisker","WaterfallChart","waterfallSeries","steps","upColor","downColor","totalColor","start","connector","GanttChart","gantt","ganttSeries","tasks","colors","taskName","progressName","milestoneName","formatProgress","dependenciesName","dependencyArrows","dependencyColor","mountedAt","useState","now","today","lines","todayLabel","xAxis","yAxis","annotations","interaction","legend"],"sources":["../../../../charts/src/react/charts.tsx"],"sourcesContent":["import { useMemo, useState, type CSSProperties } from \"react\";\nimport {\n areaSeries,\n barSeries,\n boxplotData,\n boxplotSeries,\n bubbleSeries,\n candlestickSeries,\n ganttSeries,\n heatmapChartOptions,\n histogramSeries,\n lineSeries,\n presetLabels,\n quadrantChartOptions,\n quadrantOf,\n rangeAreaSeries,\n scatterSeries,\n sparklineOptions,\n waterfallSeries,\n type QuadrantCorner,\n} from \"../engine/presets\";\nimport { resolveLocale } from \"../engine/locale\";\nimport type { ChartAnnotation, ChartRect } from \"../engine/types\";\nimport { Chart, ChartBase, engineOptions } from \"./Chart\";\nimport type {\n AreaChartProps,\n BarChartProps,\n BoxPlotChartProps,\n BubbleChartProps,\n CandlestickChartProps,\n ChartCommonProps,\n GanttChartProps,\n HeatmapChartProps,\n HistogramChartProps,\n HorizontalBarChartProps,\n LineChartProps,\n MixedChartProps,\n QuadrantChartProps,\n RangeAreaChartProps,\n ScatterChartProps,\n SparklineProps,\n WaterfallChartProps,\n} from \"./types\";\n\nconst frameProps = (props: Omit<ChartCommonProps, \"labels\">) => ({\n height: props.height,\n width: props.width,\n className: props.className,\n style: props.style,\n handleRef: props.ref,\n onHover: props.onHover,\n onPointClick: props.onPointClick,\n onPlotClick: props.onPlotClick,\n onZoom: props.onZoom,\n onRendererChange: props.onRendererChange,\n renderTooltip: props.renderTooltip,\n});\n\n/** Line (or area) chart; handles millions of points on the GPU */\nexport function LineChart(props: LineChartProps) {\n const {\n series: input,\n area = false,\n curve,\n stacked = false,\n percent = false,\n } = props;\n const series = useMemo(\n () => lineSeries(input, area, { curve, stacked: stacked || percent }),\n [input, area, curve, stacked, percent],\n );\n return (\n <ChartBase\n options={engineOptions({\n ...props,\n series,\n stackMode: percent ? \"percent\" : undefined,\n })}\n {...frameProps(props)}\n />\n );\n}\n\n/** Area chart: smooth by default, stacked or 100% stacked */\nexport function AreaChart(props: AreaChartProps) {\n const {\n series: input,\n curve = \"smooth\",\n stacked = false,\n percent = false,\n } = props;\n const series = useMemo(\n () => areaSeries(input, { curve, stacked: stacked || percent }),\n [input, curve, stacked, percent],\n );\n return (\n <ChartBase\n options={engineOptions({\n ...props,\n series,\n stackMode: percent ? \"percent\" : undefined,\n })}\n {...frameProps(props)}\n />\n );\n}\n\n/** Bar chart: grouped side by side, stacked or 100% stacked, with optional value labels */\nexport function BarChart(props: BarChartProps) {\n const {\n series: input,\n stacked = false,\n percent = false,\n labels = false,\n } = props;\n const series = useMemo(\n () => barSeries(input, stacked || percent, labels),\n [input, stacked, percent, labels],\n );\n return (\n <ChartBase\n options={engineOptions({\n ...props,\n labels: undefined,\n series,\n stackMode: percent ? \"percent\" : undefined,\n })}\n {...frameProps(props)}\n />\n );\n}\n\n/** Candlestick (OHLC) chart: rising and falling candles, zoomable on the GPU */\nexport function CandlestickChart(props: CandlestickChartProps) {\n const { series: input } = props;\n const series = useMemo(() => candlestickSeries(input), [input]);\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\n/** Heatmap: a grid of cells colored by value (categories or numbers on both axes) */\nexport function HeatmapChart(props: HeatmapChartProps) {\n const {\n data,\n xCategories,\n yCategories,\n colorScale,\n valueRange,\n colorMidpoint,\n name,\n radius,\n format,\n } = props;\n const series = useMemo(\n () =>\n heatmapChartOptions({\n data,\n xCategories,\n yCategories,\n colorScale,\n valueRange,\n colorMidpoint,\n name,\n radius,\n format,\n }).series,\n [\n data,\n xCategories,\n yCategories,\n colorScale,\n valueRange,\n colorMidpoint,\n name,\n radius,\n format,\n ],\n );\n const base = engineOptions({ ...props, series });\n return (\n <ChartBase\n options={{\n ...heatmapChartOptions(\n { data, xCategories, yCategories },\n {\n ...base,\n legend: props.legend,\n interaction: props.interaction,\n tooltip: props.tooltip,\n },\n ),\n series,\n }}\n {...frameProps(props)}\n />\n );\n}\n\n/** Word-sized chart without axes: a trend in a table cell, a KPI card, ... */\nexport function Sparkline(props: SparklineProps) {\n const {\n data,\n type,\n color,\n curve,\n name,\n reference,\n format,\n height = 48,\n width,\n renderer,\n tooltip,\n palette,\n ariaLabel,\n locale,\n labels,\n className,\n style,\n ref,\n onHover,\n renderTooltip,\n } = props;\n const options = useMemo(\n () =>\n sparklineOptions(\n { data, type, color, curve, name, reference, format },\n { renderer, tooltip, palette, ariaLabel, locale, labels },\n ),\n [\n data,\n type,\n color,\n curve,\n name,\n reference,\n format,\n renderer,\n tooltip,\n palette,\n ariaLabel,\n locale,\n labels,\n ],\n );\n return (\n <ChartBase\n options={options}\n height={height}\n width={width}\n className={className}\n style={style}\n handleRef={ref}\n onHover={onHover}\n renderTooltip={renderTooltip}\n />\n );\n}\n\n/** Scatter chart: zooms on both axes, hit testing through a spatial index */\nexport function ScatterChart(props: ScatterChartProps) {\n const { series: input } = props;\n const series = useMemo(() => scatterSeries(input), [input]);\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\nconst CORNERS: QuadrantCorner[] = [\n \"topLeft\",\n \"topRight\",\n \"bottomLeft\",\n \"bottomRight\",\n];\n\nconst cornerStyle = (\n corner: QuadrantCorner,\n plot: ChartRect,\n split: { x: number; y: number },\n): CSSProperties => {\n const left = corner.endsWith(\"Left\");\n const top = corner.startsWith(\"top\");\n return {\n position: \"absolute\",\n left: left ? 0 : split.x - plot.x,\n top: top ? 0 : split.y - plot.y,\n width: left ? split.x - plot.x : plot.x + plot.width - split.x,\n height: top ? split.y - plot.y : plot.y + plot.height - split.y,\n pointerEvents: \"none\",\n };\n};\n\n/**\n * Four-quadrant matrix (priority matrix, Eisenhower, BCG, ...): tinted\n * quadrants with titles, dividers, and labelled dots placed without\n * overlapping labels. Dots can be dragged to another quadrant.\n */\nexport function QuadrantChart(props: QuadrantChartProps) {\n const {\n points,\n xDomain,\n yDomain,\n xSplit,\n ySplit,\n quadrants,\n xLabel,\n yLabel,\n axisLabels,\n showTicks,\n reverseX,\n showLabels,\n pointSize,\n name,\n draggable,\n onPointClick,\n onPointDrop,\n onQuadrantClick,\n renderTooltip,\n quadrantContent,\n } = props;\n const geometry = { xDomain, yDomain, xSplit, ySplit, reverseX };\n\n const options = quadrantChartOptions(\n {\n points,\n xDomain,\n yDomain,\n xSplit,\n ySplit,\n quadrants,\n xLabel,\n yLabel,\n axisLabels,\n showTicks,\n reverseX,\n showLabels,\n pointSize,\n name,\n draggable: draggable ?? !!onPointDrop,\n },\n engineOptions({ ...props, series: [] }),\n );\n\n const overlay = quadrantContent\n ? (plot: ChartRect) => {\n const [x0, x1] = xDomain ?? [0, 10];\n const [y0, y1] = yDomain ?? [0, 10];\n const xs = xSplit ?? (x0 + x1) / 2;\n const ys = ySplit ?? (y0 + y1) / 2;\n const fx = (xs - x0) / (x1 - x0 || 1);\n const fy = (ys - y0) / (y1 - y0 || 1);\n const split = {\n x: plot.x + plot.width * (reverseX ? 1 - fx : fx),\n y: plot.y + plot.height * (1 - fy),\n };\n return CORNERS.map((corner) =>\n quadrantContent[corner] ? (\n <div\n key={corner}\n className={`minerva-chart-quadrant minerva-chart-quadrant-${corner}`}\n style={cornerStyle(corner, plot, split)}\n >\n {quadrantContent[corner]}\n </div>\n ) : null,\n );\n }\n : undefined;\n\n return (\n <ChartBase\n options={options}\n {...frameProps({\n ...props,\n onPointClick: undefined,\n renderTooltip: undefined,\n })}\n overlay={overlay}\n onPointClick={\n onPointClick\n ? (event) => {\n const index = event.items[0]?.index;\n if (index !== undefined && points[index])\n onPointClick(points[index], index);\n }\n : undefined\n }\n onPlotClick={\n onQuadrantClick\n ? (at) => onQuadrantClick(quadrantOf(geometry, at.x, at.y), at)\n : undefined\n }\n onDrop={\n onPointDrop\n ? (event) => {\n const index = event.item.index;\n if (!points[index]) return;\n onPointDrop(points[index], index, {\n x: event.x,\n y: event.y,\n quadrant: quadrantOf(geometry, event.x, event.y),\n });\n }\n : undefined\n }\n renderTooltip={\n renderTooltip\n ? (event) => {\n const index = event.items[0]?.index;\n return index !== undefined && points[index]\n ? renderTooltip(points[index], index)\n : null;\n }\n : undefined\n }\n />\n );\n}\n\n/**\n * Horizontal bar chart: categories down the left side, values from the\n * left (rankings, long names, diverging surveys, stacked progress)\n */\nexport function HorizontalBarChart(props: HorizontalBarChartProps) {\n return <BarChart {...props} orientation=\"horizontal\" />;\n}\n\n/**\n * Range area chart: bands between a lower (`y0`) and an upper edge\n * (confidence intervals, min-max ranges), mixable with lines\n */\nexport function RangeAreaChart(props: RangeAreaChartProps) {\n const { series: input, curve = \"smooth\" } = props;\n const series = useMemo(() => rangeAreaSeries(input, curve), [input, curve]);\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Combination chart: bars, lines and areas on one or two value axes\n * (`yAxis: \"right\"` series use `yAxis2`, aligned on the left grid)\n */\nexport function MixedChart(props: MixedChartProps) {\n return <Chart {...props} />;\n}\n\n/** Bubble chart: x, y and a value sized by area (√value diameters) */\nexport function BubbleChart(props: BubbleChartProps) {\n const { series: input, minSize, maxSize, maxValue } = props;\n const series = useMemo(\n () => bubbleSeries(input, { minSize, maxSize, maxValue }),\n [input, minSize, maxSize, maxValue],\n );\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Histogram: the distribution of raw samples in bins of equal width\n * (Freedman-Diaconis, Sturges or a count); millions of samples are binned\n * in milliseconds\n */\nexport function HistogramChart(props: HistogramChartProps) {\n const {\n values,\n bins,\n domain,\n nice,\n name,\n color,\n formatBin,\n series: extra,\n locale,\n } = props;\n // page language read at every render: a language switch renames the series\n const lang = resolveLocale(locale);\n const series = useMemo(\n () => [\n histogramSeries(values, {\n bins,\n domain,\n nice,\n name,\n color,\n format: formatBin,\n locale: lang,\n }),\n ...(extra ?? []),\n ],\n [values, bins, domain, nice, name, color, formatBin, extra, lang],\n );\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Box plot: medians, quartiles, whiskers and outliers of samples, from raw\n * values (`groups`) or computed statistics (`series`)\n */\nexport function BoxPlotChart(props: BoxPlotChartProps) {\n const {\n series: input,\n groups,\n name,\n whisker,\n orientation,\n locale,\n outlierShape,\n outlierSize,\n } = props;\n const groupName = name ?? presetLabels(resolveLocale(locale)).values;\n const series = useMemo(\n () =>\n boxplotSeries([\n ...(groups?.length\n ? [\n {\n id: \"boxplot\",\n name: groupName,\n data: boxplotData(groups, { whisker }),\n },\n ]\n : []),\n ...(input ?? []),\n ]).map((s) =>\n s.type === \"boxplot\"\n ? {\n ...s,\n outlierShape: s.outlierShape ?? outlierShape,\n outlierSize: s.outlierSize ?? outlierSize,\n }\n : s,\n ),\n [input, groups, groupName, whisker, outlierShape, outlierSize],\n );\n return (\n <ChartBase\n options={engineOptions({ ...props, series, orientation })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Waterfall (bridge) chart: how changes take a value from a start to an\n * end, with subtotals and totals (P&L bridges, budget variances)\n */\nexport function WaterfallChart(props: WaterfallChartProps) {\n const {\n steps,\n name,\n upColor,\n downColor,\n totalColor,\n start,\n labels = true,\n format,\n connector,\n orientation,\n locale,\n } = props;\n const lang = resolveLocale(locale);\n const series = useMemo(\n () => [\n waterfallSeries(steps, {\n name,\n upColor,\n downColor,\n totalColor,\n start,\n labels,\n format,\n connector,\n locale: lang,\n }),\n ],\n [\n steps,\n name,\n upColor,\n downColor,\n totalColor,\n start,\n labels,\n format,\n connector,\n lang,\n ],\n );\n return (\n <ChartBase\n options={engineOptions({\n ...props,\n labels: undefined,\n series,\n orientation,\n })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Gantt chart: tasks as bars on a time axis with their progress, groups,\n * milestones and a today line; zooms and pans along the time\n */\nexport function GanttChart(props: GanttChartProps) {\n const {\n tasks,\n colors,\n taskName,\n progressName,\n milestoneName,\n formatProgress,\n dependenciesName,\n dependencyArrows,\n dependencyColor,\n today = false,\n todayLabel,\n xAxis,\n yAxis,\n annotations,\n interaction,\n legend,\n locale,\n } = props;\n const lang = resolveLocale(locale);\n const gantt = useMemo(\n () =>\n ganttSeries(tasks, {\n colors,\n taskName,\n progressName,\n milestoneName,\n formatProgress,\n dependenciesName,\n dependencyArrows,\n dependencyColor,\n locale: lang,\n }),\n [\n tasks,\n colors,\n taskName,\n progressName,\n milestoneName,\n formatProgress,\n dependenciesName,\n dependencyArrows,\n dependencyColor,\n lang,\n ],\n );\n const [mountedAt] = useState(() => Date.now());\n const now =\n today === false\n ? null\n : today === true\n ? mountedAt\n : today instanceof Date\n ? today.getTime()\n : today;\n const lines: ChartAnnotation[] =\n now === null\n ? []\n : [\n {\n type: \"line\",\n axis: \"y\",\n value: now,\n color: \"var(--danger-color, #dc2626)\",\n dash: [4, 3],\n label: todayLabel,\n },\n ];\n return (\n <ChartBase\n options={{\n ...engineOptions({\n ...props,\n series: gantt.series,\n orientation: \"horizontal\",\n }),\n xAxis: {\n type: \"category\",\n categories: gantt.categories,\n ...xAxis,\n },\n yAxis: {\n type: \"time\",\n min: gantt.domain[0],\n max: gantt.domain[1],\n ...yAxis,\n },\n annotations: [...(annotations ?? []), ...lines],\n dependencies: gantt.dependencies,\n interaction: interaction ?? { zoom: \"y\" },\n legend: legend ?? gantt.series.length > 1,\n }}\n {...frameProps(props)}\n />\n );\n}\n"],"mappings":"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ACxG;EAAOsG;EAAQH;EAAWQ;EAASF;EAAcC;CAAW,CAC/D;CACA,OACE,kBAAClG,GAAD;EACE,SAASC,EAAc;GAAE,GAAGX;GAAO;GAAQ;EAAY,CAAC;EACxD,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAMA,SAAgB8G,EAAe,GAA4B;CACzD,IAAM,EACJ,UACA,SACA,YACA,cACA,eACA,UACA,YAAS,IACT,WACA,cACA,gBACA,cACE9G,GACE4F,IAAOC,EAAcpD,CAAM,GAC3BtC,IAASC,QACP,CACJ2G,EAAgBC,GAAO;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAQpB;CACV,CAAC,CACH,GACA;EACEoB;EACArF;EACAsF;EACAC;EACAC;EACAC;EACApG;EACAa;EACAwF;EACAzB;CACF,CACF;CACA,OACE,kBAAClF,GAAD;EACE,SAASC,EAAc;GACrB,GAAGX;GACH,QAAQ,KAAA;GACR;GACA;EACF,CAAC;EACD,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAMA,SAAgBsH,EAAW,GAAwB;CACjD,IAAM,EACJ,UACA,WACA,aACA,iBACA,kBACA,mBACA,qBACA,qBACA,oBACA,WAAQ,IACR,eACA,UACA,UACA,gBACA,gBACA,WACA,cACEtH,GACE4F,IAAOC,EAAcpD,CAAM,GAC3B8E,IAAQnH,QAEVoH,EAAYC,GAAO;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ7B;CACV,CAAC,GACH;EACE6B;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACArC;CACF,CACF,GACM,CAACsC,KAAaC,QAAe,KAAK,IAAI,CAAC,GACvCC,IACJC,MAAU,KACN,OACAA,MAAU,KACRH,IACAG,aAAiB,OACfA,EAAM,QAAQ,IACdA,GACJC,IACJF,MAAQ,OACJ,CAAC,IACD,CACE;EACE,MAAM;EACN,MAAM;EACN,OAAOA;EACP,OAAO;EACP,MAAM,CAAC,GAAG,CAAC;EACX,OAAOG;CACT,CACF;CACN,OACE,kBAAC7H,GAAD;EACE,SAAS;GACP,GAAGC,EAAc;IACf,GAAGX;IACH,QAAQuH,EAAM;IACd,aAAa;GACf,CAAC;GACD,OAAO;IACL,MAAM;IACN,YAAYA,EAAM;IAClB,GAAGiB;GACL;GACA,OAAO;IACL,MAAM;IACN,KAAKjB,EAAM,OAAO;IAClB,KAAKA,EAAM,OAAO;IAClB,GAAGkB;GACL;GACA,aAAa,CAAC,GAAIC,KAAe,CAAC,GAAI,GAAGJ,CAAK;GAC9C,cAAcf,EAAM;GACpB,aAAaoB,KAAe,EAAE,MAAM,IAAI;GACxC,QAAQC,KAAUrB,EAAM,OAAO,SAAS;EAC1C;EACA,GAAIxH,EAAWC,CAAK;CACrB,CAAA;AAEL"}
1
+ {"version":3,"file":"charts.js","names":["frameProps","props","LineChart","input","series","useMemo","lineSeries","area","stacked","percent","curve","ChartBase","engineOptions","AreaChart","areaSeries","BarChart","barSeries","labels","CandlestickChart","candlestickSeries","HeatmapChart","heatmapChartOptions","data","xCategories","yCategories","colorScale","valueRange","colorMidpoint","name","radius","format","base","Sparkline","options","sparklineOptions","type","color","reference","renderer","tooltip","palette","ariaLabel","locale","ref","ScatterChart","scatterSeries","CORNERS","DOUBLE_CLICK_MS","cornerStyle","left","corner","top","split","plot","QuadrantChart","geometry","dropCorner","setDropCorner","useState","lastClick","useRef","release","dropAt","event","quadrantOf","quadrantChartOptions","draggable","onPointDrop","onPointDrag","overlay","quadrantContent","x0","x1","xDomain","y0","y1","yDomain","xs","xSplit","ys","ySplit","fx","fy","reverseX","tint","quadrants","index","points","now","last","double","onPointClick","onPointDoubleClick","onQuadrantClick","at","target","renderTooltip","HorizontalBarChart","RangeAreaChart","rangeAreaSeries","MixedChart","Chart","BubbleChart","bubbleSeries","minSize","maxSize","maxValue","HistogramChart","extra","lang","resolveLocale","histogramSeries","values","formatBin","bins","domain","nice","BoxPlotChart","groupName","presetLabels","boxplotSeries","groups","boxplotData","s","outlierShape","outlierSize","whisker","WaterfallChart","waterfallSeries","steps","upColor","downColor","totalColor","start","connector","GanttChart","gantt","ganttSeries","tasks","colors","taskName","progressName","milestoneName","formatProgress","dependenciesName","dependencyArrows","dependencyColor","mountedAt","today","lines","todayLabel","xAxis","yAxis","annotations","interaction","legend"],"sources":["../../../../charts/src/react/charts.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport {\n areaSeries,\n barSeries,\n boxplotData,\n boxplotSeries,\n bubbleSeries,\n candlestickSeries,\n ganttSeries,\n heatmapChartOptions,\n histogramSeries,\n lineSeries,\n presetLabels,\n quadrantChartOptions,\n quadrantOf,\n rangeAreaSeries,\n scatterSeries,\n sparklineOptions,\n waterfallSeries,\n type QuadrantCorner,\n} from \"../engine/presets\";\nimport { resolveLocale } from \"../engine/locale\";\nimport type {\n ChartAnnotation,\n ChartDragEvent,\n ChartRect,\n} from \"../engine/types\";\nimport { Chart, ChartBase, engineOptions } from \"./Chart\";\nimport type {\n AreaChartProps,\n BarChartProps,\n BoxPlotChartProps,\n BubbleChartProps,\n CandlestickChartProps,\n ChartCommonProps,\n GanttChartProps,\n HeatmapChartProps,\n HistogramChartProps,\n HorizontalBarChartProps,\n LineChartProps,\n MixedChartProps,\n QuadrantChartProps,\n QuadrantDropTarget,\n RangeAreaChartProps,\n ScatterChartProps,\n SparklineProps,\n WaterfallChartProps,\n} from \"./types\";\n\nconst frameProps = (props: Omit<ChartCommonProps, \"labels\">) => ({\n height: props.height,\n width: props.width,\n className: props.className,\n style: props.style,\n handleRef: props.ref,\n onHover: props.onHover,\n onPointClick: props.onPointClick,\n onPlotClick: props.onPlotClick,\n onZoom: props.onZoom,\n onRendererChange: props.onRendererChange,\n renderTooltip: props.renderTooltip,\n});\n\n/** Line (or area) chart; handles millions of points on the GPU */\nexport function LineChart(props: LineChartProps) {\n const {\n series: input,\n area = false,\n curve,\n stacked = false,\n percent = false,\n } = props;\n const series = useMemo(\n () => lineSeries(input, area, { curve, stacked: stacked || percent }),\n [input, area, curve, stacked, percent],\n );\n return (\n <ChartBase\n options={engineOptions({\n ...props,\n series,\n stackMode: percent ? \"percent\" : undefined,\n })}\n {...frameProps(props)}\n />\n );\n}\n\n/** Area chart: smooth by default, stacked or 100% stacked */\nexport function AreaChart(props: AreaChartProps) {\n const {\n series: input,\n curve = \"smooth\",\n stacked = false,\n percent = false,\n } = props;\n const series = useMemo(\n () => areaSeries(input, { curve, stacked: stacked || percent }),\n [input, curve, stacked, percent],\n );\n return (\n <ChartBase\n options={engineOptions({\n ...props,\n series,\n stackMode: percent ? \"percent\" : undefined,\n })}\n {...frameProps(props)}\n />\n );\n}\n\n/** Bar chart: grouped side by side, stacked or 100% stacked, with optional value labels */\nexport function BarChart(props: BarChartProps) {\n const {\n series: input,\n stacked = false,\n percent = false,\n labels = false,\n } = props;\n const series = useMemo(\n () => barSeries(input, stacked || percent, labels),\n [input, stacked, percent, labels],\n );\n return (\n <ChartBase\n options={engineOptions({\n ...props,\n labels: undefined,\n series,\n stackMode: percent ? \"percent\" : undefined,\n })}\n {...frameProps(props)}\n />\n );\n}\n\n/** Candlestick (OHLC) chart: rising and falling candles, zoomable on the GPU */\nexport function CandlestickChart(props: CandlestickChartProps) {\n const { series: input } = props;\n const series = useMemo(() => candlestickSeries(input), [input]);\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\n/** Heatmap: a grid of cells colored by value (categories or numbers on both axes) */\nexport function HeatmapChart(props: HeatmapChartProps) {\n const {\n data,\n xCategories,\n yCategories,\n colorScale,\n valueRange,\n colorMidpoint,\n name,\n radius,\n format,\n } = props;\n const series = useMemo(\n () =>\n heatmapChartOptions({\n data,\n xCategories,\n yCategories,\n colorScale,\n valueRange,\n colorMidpoint,\n name,\n radius,\n format,\n }).series,\n [\n data,\n xCategories,\n yCategories,\n colorScale,\n valueRange,\n colorMidpoint,\n name,\n radius,\n format,\n ],\n );\n const base = engineOptions({ ...props, series });\n return (\n <ChartBase\n options={{\n ...heatmapChartOptions(\n { data, xCategories, yCategories },\n {\n ...base,\n legend: props.legend,\n interaction: props.interaction,\n tooltip: props.tooltip,\n },\n ),\n series,\n }}\n {...frameProps(props)}\n />\n );\n}\n\n/** Word-sized chart without axes: a trend in a table cell, a KPI card, ... */\nexport function Sparkline(props: SparklineProps) {\n const {\n data,\n type,\n color,\n curve,\n name,\n reference,\n format,\n height = 48,\n width,\n renderer,\n tooltip,\n palette,\n ariaLabel,\n locale,\n labels,\n className,\n style,\n ref,\n onHover,\n renderTooltip,\n } = props;\n const options = useMemo(\n () =>\n sparklineOptions(\n { data, type, color, curve, name, reference, format },\n { renderer, tooltip, palette, ariaLabel, locale, labels },\n ),\n [\n data,\n type,\n color,\n curve,\n name,\n reference,\n format,\n renderer,\n tooltip,\n palette,\n ariaLabel,\n locale,\n labels,\n ],\n );\n return (\n <ChartBase\n options={options}\n height={height}\n width={width}\n className={className}\n style={style}\n handleRef={ref}\n onHover={onHover}\n renderTooltip={renderTooltip}\n />\n );\n}\n\n/** Scatter chart: zooms on both axes, hit testing through a spatial index */\nexport function ScatterChart(props: ScatterChartProps) {\n const { series: input } = props;\n const series = useMemo(() => scatterSeries(input), [input]);\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\nconst CORNERS: QuadrantCorner[] = [\n \"topLeft\",\n \"topRight\",\n \"bottomLeft\",\n \"bottomRight\",\n];\n\n/** Two clicks on the same point within this delay count as a double click */\nconst DOUBLE_CLICK_MS = 400;\n\nconst cornerStyle = (\n corner: QuadrantCorner,\n plot: ChartRect,\n split: { x: number; y: number },\n): CSSProperties => {\n const left = corner.endsWith(\"Left\");\n const top = corner.startsWith(\"top\");\n return {\n position: \"absolute\",\n left: left ? 0 : split.x - plot.x,\n top: top ? 0 : split.y - plot.y,\n width: left ? split.x - plot.x : plot.x + plot.width - split.x,\n height: top ? split.y - plot.y : plot.y + plot.height - split.y,\n pointerEvents: \"none\",\n };\n};\n\n/**\n * Four-quadrant matrix (priority matrix, Eisenhower, BCG, ...): tinted\n * quadrants with titles, dividers, and labelled dots placed without\n * overlapping labels. Dots can be dragged to another quadrant.\n */\nexport function QuadrantChart(props: QuadrantChartProps) {\n const {\n points,\n xDomain,\n yDomain,\n xSplit,\n ySplit,\n quadrants,\n xLabel,\n yLabel,\n axisLabels,\n showTicks,\n reverseX,\n showLabels,\n pointSize,\n name,\n draggable,\n onPointClick,\n onPointDoubleClick,\n onPointDrag,\n onPointDrop,\n onQuadrantClick,\n renderTooltip,\n quadrantContent,\n } = props;\n const geometry = { xDomain, yDomain, xSplit, ySplit, reverseX };\n const [dropCorner, setDropCorner] = useState<QuadrantCorner | null>(null);\n const lastClick = useRef<{ index: number; time: number } | null>(null);\n\n // a release outside the plot ends the drag without a drop event\n useEffect(() => {\n if (!dropCorner) return;\n const release = () => setDropCorner(null);\n window.addEventListener(\"pointerup\", release);\n return () => window.removeEventListener(\"pointerup\", release);\n }, [dropCorner]);\n\n const dropAt = (event: ChartDragEvent): QuadrantDropTarget => ({\n x: event.x,\n y: event.y,\n quadrant: quadrantOf(geometry, event.x, event.y),\n });\n\n const options = quadrantChartOptions(\n {\n points,\n xDomain,\n yDomain,\n xSplit,\n ySplit,\n quadrants,\n xLabel,\n yLabel,\n axisLabels,\n showTicks,\n reverseX,\n showLabels,\n pointSize,\n name,\n draggable: draggable ?? !!(onPointDrop || onPointDrag),\n },\n engineOptions({ ...props, series: [] }),\n );\n\n const overlay =\n quadrantContent || dropCorner\n ? (plot: ChartRect) => {\n const [x0, x1] = xDomain ?? [0, 10];\n const [y0, y1] = yDomain ?? [0, 10];\n const xs = xSplit ?? (x0 + x1) / 2;\n const ys = ySplit ?? (y0 + y1) / 2;\n const fx = (xs - x0) / (x1 - x0 || 1);\n const fy = (ys - y0) / (y1 - y0 || 1);\n const split = {\n x: plot.x + plot.width * (reverseX ? 1 - fx : fx),\n y: plot.y + plot.height * (1 - fy),\n };\n const tint = dropCorner\n ? (quadrants?.[dropCorner]?.color ?? \"currentColor\")\n : \"\";\n return [\n ...CORNERS.map((corner) =>\n quadrantContent?.[corner] ? (\n <div\n key={corner}\n className={`minerva-chart-quadrant minerva-chart-quadrant-${corner}`}\n style={cornerStyle(corner, plot, split)}\n >\n {quadrantContent[corner]}\n </div>\n ) : null,\n ),\n dropCorner ? (\n <div\n key=\"drop-target\"\n className=\"minerva-chart-quadrant-target\"\n style={{\n ...cornerStyle(dropCorner, plot, split),\n background: `color-mix(in srgb, ${tint} 14%, transparent)`,\n boxShadow: `inset 0 0 0 2px ${tint}`,\n }}\n />\n ) : null,\n ];\n }\n : undefined;\n\n return (\n <ChartBase\n options={options}\n {...frameProps({\n ...props,\n onPointClick: undefined,\n renderTooltip: undefined,\n })}\n overlay={overlay}\n onPointClick={(event) => {\n const index = event.items[0]?.index;\n if (index === undefined || !points[index]) return;\n const now = Date.now();\n const last = lastClick.current;\n const double =\n last?.index === index && now - last.time < DOUBLE_CLICK_MS;\n lastClick.current = double ? null : { index, time: now };\n onPointClick?.(points[index], index);\n if (double) onPointDoubleClick?.(points[index], index);\n }}\n onPlotClick={\n onQuadrantClick\n ? (at) => onQuadrantClick(quadrantOf(geometry, at.x, at.y), at)\n : undefined\n }\n onDrag={(event) => {\n const index = event.item.index;\n const target = dropAt(event);\n setDropCorner(target.quadrant);\n if (points[index]) onPointDrag?.(points[index], index, target);\n }}\n onDrop={(event) => {\n setDropCorner(null);\n const index = event.item.index;\n if (points[index] && onPointDrop)\n onPointDrop(points[index], index, dropAt(event));\n }}\n renderTooltip={\n renderTooltip\n ? (event) => {\n const index = event.items[0]?.index;\n return index !== undefined && points[index]\n ? renderTooltip(points[index], index)\n : null;\n }\n : undefined\n }\n />\n );\n}\n\n/**\n * Horizontal bar chart: categories down the left side, values from the\n * left (rankings, long names, diverging surveys, stacked progress)\n */\nexport function HorizontalBarChart(props: HorizontalBarChartProps) {\n return <BarChart {...props} orientation=\"horizontal\" />;\n}\n\n/**\n * Range area chart: bands between a lower (`y0`) and an upper edge\n * (confidence intervals, min-max ranges), mixable with lines\n */\nexport function RangeAreaChart(props: RangeAreaChartProps) {\n const { series: input, curve = \"smooth\" } = props;\n const series = useMemo(() => rangeAreaSeries(input, curve), [input, curve]);\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Combination chart: bars, lines and areas on one or two value axes\n * (`yAxis: \"right\"` series use `yAxis2`, aligned on the left grid)\n */\nexport function MixedChart(props: MixedChartProps) {\n return <Chart {...props} />;\n}\n\n/** Bubble chart: x, y and a value sized by area (√value diameters) */\nexport function BubbleChart(props: BubbleChartProps) {\n const { series: input, minSize, maxSize, maxValue } = props;\n const series = useMemo(\n () => bubbleSeries(input, { minSize, maxSize, maxValue }),\n [input, minSize, maxSize, maxValue],\n );\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Histogram: the distribution of raw samples in bins of equal width\n * (Freedman-Diaconis, Sturges or a count); millions of samples are binned\n * in milliseconds\n */\nexport function HistogramChart(props: HistogramChartProps) {\n const {\n values,\n bins,\n domain,\n nice,\n name,\n color,\n formatBin,\n series: extra,\n locale,\n } = props;\n // page language read at every render: a language switch renames the series\n const lang = resolveLocale(locale);\n const series = useMemo(\n () => [\n histogramSeries(values, {\n bins,\n domain,\n nice,\n name,\n color,\n format: formatBin,\n locale: lang,\n }),\n ...(extra ?? []),\n ],\n [values, bins, domain, nice, name, color, formatBin, extra, lang],\n );\n return (\n <ChartBase\n options={engineOptions({ ...props, series })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Box plot: medians, quartiles, whiskers and outliers of samples, from raw\n * values (`groups`) or computed statistics (`series`)\n */\nexport function BoxPlotChart(props: BoxPlotChartProps) {\n const {\n series: input,\n groups,\n name,\n whisker,\n orientation,\n locale,\n outlierShape,\n outlierSize,\n } = props;\n const groupName = name ?? presetLabels(resolveLocale(locale)).values;\n const series = useMemo(\n () =>\n boxplotSeries([\n ...(groups?.length\n ? [\n {\n id: \"boxplot\",\n name: groupName,\n data: boxplotData(groups, { whisker }),\n },\n ]\n : []),\n ...(input ?? []),\n ]).map((s) =>\n s.type === \"boxplot\"\n ? {\n ...s,\n outlierShape: s.outlierShape ?? outlierShape,\n outlierSize: s.outlierSize ?? outlierSize,\n }\n : s,\n ),\n [input, groups, groupName, whisker, outlierShape, outlierSize],\n );\n return (\n <ChartBase\n options={engineOptions({ ...props, series, orientation })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Waterfall (bridge) chart: how changes take a value from a start to an\n * end, with subtotals and totals (P&L bridges, budget variances)\n */\nexport function WaterfallChart(props: WaterfallChartProps) {\n const {\n steps,\n name,\n upColor,\n downColor,\n totalColor,\n start,\n labels = true,\n format,\n connector,\n orientation,\n locale,\n } = props;\n const lang = resolveLocale(locale);\n const series = useMemo(\n () => [\n waterfallSeries(steps, {\n name,\n upColor,\n downColor,\n totalColor,\n start,\n labels,\n format,\n connector,\n locale: lang,\n }),\n ],\n [\n steps,\n name,\n upColor,\n downColor,\n totalColor,\n start,\n labels,\n format,\n connector,\n lang,\n ],\n );\n return (\n <ChartBase\n options={engineOptions({\n ...props,\n labels: undefined,\n series,\n orientation,\n })}\n {...frameProps(props)}\n />\n );\n}\n\n/**\n * Gantt chart: tasks as bars on a time axis with their progress, groups,\n * milestones and a today line; zooms and pans along the time\n */\nexport function GanttChart(props: GanttChartProps) {\n const {\n tasks,\n colors,\n taskName,\n progressName,\n milestoneName,\n formatProgress,\n dependenciesName,\n dependencyArrows,\n dependencyColor,\n today = false,\n todayLabel,\n xAxis,\n yAxis,\n annotations,\n interaction,\n legend,\n locale,\n } = props;\n const lang = resolveLocale(locale);\n const gantt = useMemo(\n () =>\n ganttSeries(tasks, {\n colors,\n taskName,\n progressName,\n milestoneName,\n formatProgress,\n dependenciesName,\n dependencyArrows,\n dependencyColor,\n locale: lang,\n }),\n [\n tasks,\n colors,\n taskName,\n progressName,\n milestoneName,\n formatProgress,\n dependenciesName,\n dependencyArrows,\n dependencyColor,\n lang,\n ],\n );\n const [mountedAt] = useState(() => Date.now());\n const now =\n today === false\n ? null\n : today === true\n ? mountedAt\n : today instanceof Date\n ? today.getTime()\n : today;\n const lines: ChartAnnotation[] =\n now === null\n ? []\n : [\n {\n type: \"line\",\n axis: \"y\",\n value: now,\n color: \"var(--danger-color, #dc2626)\",\n dash: [4, 3],\n label: todayLabel,\n },\n ];\n return (\n <ChartBase\n options={{\n ...engineOptions({\n ...props,\n series: gantt.series,\n orientation: \"horizontal\",\n }),\n xAxis: {\n type: \"category\",\n categories: gantt.categories,\n ...xAxis,\n },\n yAxis: {\n type: \"time\",\n min: gantt.domain[0],\n max: gantt.domain[1],\n ...yAxis,\n },\n annotations: [...(annotations ?? []), ...lines],\n dependencies: gantt.dependencies,\n interaction: interaction ?? { zoom: \"y\" },\n legend: legend ?? gantt.series.length > 1,\n }}\n {...frameProps(props)}\n />\n );\n}\n"],"mappings":";;;;;;;AAuDA,IAAMA,KAAc,OAA6C;CAC/D,QAAQC,EAAM;CACd,OAAOA,EAAM;CACb,WAAWA,EAAM;CACjB,OAAOA,EAAM;CACb,WAAWA,EAAM;CACjB,SAASA,EAAM;CACf,cAAcA,EAAM;CACpB,aAAaA,EAAM;CACnB,QAAQA,EAAM;CACd,kBAAkBA,EAAM;CACxB,eAAeA,EAAM;AACvB;AAGA,SAAgBC,EAAU,GAAuB;CAC/C,IAAM,EACJ,QAAQC,GACR,UAAO,IACP,UACA,aAAU,IACV,aAAU,OACRF,GACEG,IAASC,QACPC,EAAWH,GAAOI,GAAM;EAAE;EAAO,SAASC,KAAWC;CAAQ,CAAC,GACpE;EAACN;EAAOI;EAAMG;EAAOF;EAASC;CAAO,CACvC;CACA,OACE,kBAACE,GAAD;EACE,SAASC,EAAc;GACrB,GAAGX;GACH;GACA,WAAWQ,IAAU,YAAY,KAAA;EACnC,CAAC;EACD,GAAIT,EAAWC,CAAK;CACrB,CAAA;AAEL;AAGA,SAAgBY,EAAU,GAAuB;CAC/C,IAAM,EACJ,QAAQV,GACR,WAAQ,UACR,aAAU,IACV,aAAU,OACRF,GACEG,IAASC,QACPS,EAAWX,GAAO;EAAE;EAAO,SAASK,KAAWC;CAAQ,CAAC,GAC9D;EAACN;EAAOO;EAAOF;EAASC;CAAO,CACjC;CACA,OACE,kBAACE,GAAD;EACE,SAASC,EAAc;GACrB,GAAGX;GACH;GACA,WAAWQ,IAAU,YAAY,KAAA;EACnC,CAAC;EACD,GAAIT,EAAWC,CAAK;CACrB,CAAA;AAEL;AAGA,SAAgBc,EAAS,GAAsB;CAC7C,IAAM,EACJ,QAAQZ,GACR,aAAU,IACV,aAAU,IACV,YAAS,OACPF,GACEG,IAASC,QACPW,EAAUb,GAAOK,KAAWC,GAASQ,CAAM,GACjD;EAACd;EAAOK;EAASC;EAASQ;CAAM,CAClC;CACA,OACE,kBAACN,GAAD;EACE,SAASC,EAAc;GACrB,GAAGX;GACH,QAAQ,KAAA;GACR;GACA,WAAWQ,IAAU,YAAY,KAAA;EACnC,CAAC;EACD,GAAIT,EAAWC,CAAK;CACrB,CAAA;AAEL;AAGA,SAAgBiB,EAAiB,GAA8B;CAC7D,IAAM,EAAE,QAAQf,MAAUF,GACpBG,IAASC,QAAcc,EAAkBhB,CAAK,GAAG,CAACA,CAAK,CAAC;CAC9D,OACE,kBAACQ,GAAD;EACE,SAASC,EAAc;GAAE,GAAGX;GAAO;EAAO,CAAC;EAC3C,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAGA,SAAgBmB,EAAa,GAA0B;CACrD,IAAM,EACJ,SACA,gBACA,gBACA,eACA,eACA,kBACA,SACA,WACA,cACEnB,GACEG,IAASC,QAEXgB,EAAoB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,CAAC,QACL;EACEC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;CACF,CACF,GACMC,IAAOnB,EAAc;EAAE,GAAGX;EAAO;CAAO,CAAC;CAC/C,OACE,kBAACU,GAAD;EACE,SAAS;GACP,GAAGU,EACD;IAAE;IAAM;IAAa;GAAY,GACjC;IACE,GAAGU;IACH,QAAQ9B,EAAM;IACd,aAAaA,EAAM;IACnB,SAASA,EAAM;GACjB,CACF;GACA;EACF;EACA,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAGA,SAAgB+B,EAAU,GAAuB;CAC/C,IAAM,EACJ,SACA,SACA,UACA,UACA,SACA,cACA,WACA,YAAS,IACT,UACA,aACA,YACA,YACA,cACA,WACA,WACA,cACA,UACA,QACA,YACA,qBACE/B,GACEgC,IAAU5B,QAEZ6B,EACE;EAAE;EAAM;EAAM;EAAO;EAAO;EAAM;EAAW;CAAO,GACpD;EAAE;EAAU;EAAS;EAAS;EAAW;EAAQ;CAAO,CAC1D,GACF;EACEZ;EACAa;EACAC;EACA1B;EACAkB;EACAS;EACAP;EACAQ;EACAC;EACAC;EACAC;EACAC;EACAzB;CACF,CACF;CACA,OACE,kBAACN,GAAD;EACW;EACD;EACD;EACI;EACJ;EACP,WAAWgC;EACF;EACM;CAChB,CAAA;AAEL;AAGA,SAAgBC,EAAa,GAA0B;CACrD,IAAM,EAAE,QAAQzC,MAAUF,GACpBG,IAASC,QAAcwC,EAAc1C,CAAK,GAAG,CAACA,CAAK,CAAC;CAC1D,OACE,kBAACQ,GAAD;EACE,SAASC,EAAc;GAAE,GAAGX;GAAO;EAAO,CAAC;EAC3C,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAEA,IAAM6C,IAA4B;CAChC;CACA;CACA;CACA;AACF,GAGMC,IAAkB,KAElBC,KACJ,GACA,GACA,MACkB;CAClB,IAAMC,IAAOC,EAAO,SAAS,MAAM,GAC7BC,IAAMD,EAAO,WAAW,KAAK;CACnC,OAAO;EACL,UAAU;EACV,MAAMD,IAAO,IAAIG,EAAM,IAAIC,EAAK;EAChC,KAAKF,IAAM,IAAIC,EAAM,IAAIC,EAAK;EAC9B,OAAOJ,IAAOG,EAAM,IAAIC,EAAK,IAAIA,EAAK,IAAIA,EAAK,QAAQD,EAAM;EAC7D,QAAQD,IAAMC,EAAM,IAAIC,EAAK,IAAIA,EAAK,IAAIA,EAAK,SAASD,EAAM;EAC9D,eAAe;CACjB;AACF;AAOA,SAAgBE,EAAc,GAA2B;CACvD,IAAM,EACJ,WACA,YACA,YACA,WACA,WACA,cACA,WACA,WACA,eACA,cACA,aACA,eACA,cACA,SACA,cACA,iBACA,uBACA,gBACA,gBACA,oBACA,kBACA,uBACErD,GACEsD,IAAW;EAAE;EAAS;EAAS;EAAQ;EAAQ;CAAS,GACxD,CAACC,GAAYC,KAAiBC,EAAgC,IAAI,GAClEC,IAAYC,EAA+C,IAAI;CAGrE,QAAgB;EACd,IAAI,CAACJ,GAAY;EACjB,IAAMK,UAAgBJ,EAAc,IAAI;EAExC,OADA,OAAO,iBAAiB,aAAaI,CAAO,SAC/B,OAAO,oBAAoB,aAAaA,CAAO;CAC9D,GAAG,CAACL,CAAU,CAAC;CAEf,IAAMM,KAAU,OAA+C;EAC7D,GAAGC,EAAM;EACT,GAAGA,EAAM;EACT,UAAUC,EAAWT,GAAUQ,EAAM,GAAGA,EAAM,CAAC;CACjD,IAEM9B,IAAUgC,EACd;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAWC,KAAa,CAAC,EAAEC,KAAeC;CAC5C,GACAxD,EAAc;EAAE,GAAGX;EAAO,QAAQ,CAAC;CAAE,CAAC,CACxC,GAEMoE,IACJC,KAAmBd,KACd,MAAoB;EACnB,IAAM,CAACe,GAAIC,KAAMC,KAAW,CAAC,GAAG,EAAE,GAC5B,CAACC,GAAIC,KAAMC,KAAW,CAAC,GAAG,EAAE,GAC5BC,IAAKC,MAAWP,IAAKC,KAAM,GAC3BO,IAAKC,MAAWN,IAAKC,KAAM,GAC3BM,KAAMJ,IAAKN,MAAOC,IAAKD,KAAM,IAC7BW,KAAMH,IAAKL,MAAOC,IAAKD,KAAM,IAC7BtB,IAAQ;GACZ,GAAGC,EAAK,IAAIA,EAAK,SAAS8B,IAAW,IAAIF,IAAKA;GAC9C,GAAG5B,EAAK,IAAIA,EAAK,UAAU,IAAI6B;EACjC,GACME,IAAO5B,IACR6B,IAAY7B,EAAW,EAAE,SAAS,iBACnC;EACJ,OAAO,CACL,GAAGV,EAAQ,KAAK,MACdwB,IAAkBpB,KAChB,kBAAC,OAAD;GAEE,WAAW,iDAAiDA;GAC5D,OAAOF,EAAYE,GAAQG,GAAMD,CAAK;GAErC,UAAAkB,EAAgBpB;EACd,GALEA,CAKF,IACH,IACN,GACAM,IACE,kBAAC,OAAD;GAEE,WAAU;GACV,OAAO;IACL,GAAGR,EAAYQ,GAAYH,GAAMD,CAAK;IACtC,YAAY,sBAAsBgC,EAAK;IACvC,WAAW,mBAAmBA;GAChC;EACD,GAPK,aAOL,IACC,IACN;CACF,IACA,KAAA;CAEN,OACE,kBAACzE,GAAD;EACW;EACT,GAAIX,EAAW;GACb,GAAGC;GACH,cAAc,KAAA;GACd,eAAe,KAAA;EACjB,CAAC;EACQ;EACT,eAAe,MAAU;GACvB,IAAMqF,IAAQvB,EAAM,MAAM,EAAE,EAAE;GAC9B,IAAIuB,MAAU,KAAA,KAAa,CAACC,EAAOD,IAAQ;GAC3C,IAAME,IAAM,KAAK,IAAI,GACfC,IAAO9B,EAAU,SACjB+B,IACJD,GAAM,UAAUH,KAASE,IAAMC,EAAK,OAAO1C;GAG7C,AAFA,EAAU,UAAU2C,IAAS,OAAO;IAAE;IAAO,MAAMF;GAAI,GACvDG,IAAeJ,EAAOD,IAAQA,CAAK,GAC/BI,KAAQE,IAAqBL,EAAOD,IAAQA,CAAK;EACvD;EACA,aACEO,KACK,MAAOA,EAAgB7B,EAAWT,GAAUuC,EAAG,GAAGA,EAAG,CAAC,GAAGA,CAAE,IAC5D,KAAA;EAEN,SAAS,MAAU;GACjB,IAAMR,IAAQvB,EAAM,KAAK,OACnBgC,IAASjC,EAAOC,CAAK;GAE3B,AADAN,EAAcsC,EAAO,QAAQ,GACzBR,EAAOD,MAAQlB,IAAcmB,EAAOD,IAAQA,GAAOS,CAAM;EAC/D;EACA,SAAS,MAAU;GACjB,EAAc,IAAI;GAClB,IAAMT,IAAQvB,EAAM,KAAK;GACzB,AAAIwB,EAAOD,MAAUnB,KACnBA,EAAYoB,EAAOD,IAAQA,GAAOxB,EAAOC,CAAK,CAAC;EACnD;EACA,eACEiC,KACK,MAAU;GACT,IAAMV,IAAQvB,EAAM,MAAM,EAAE,EAAE;GAC9B,OAAOuB,MAAU,KAAA,KAAaC,EAAOD,KACjCU,EAAcT,EAAOD,IAAQA,CAAK,IAClC;EACN,IACA,KAAA;CAEP,CAAA;AAEL;AAMA,SAAgBW,EAAmB,GAAgC;CACjE,OAAO,kBAAClF,GAAD;EAAU,GAAId;EAAO,aAAY;CAAc,CAAA;AACxD;AAMA,SAAgBiG,EAAe,GAA4B;CACzD,IAAM,EAAE,QAAQ/F,GAAO,WAAQ,aAAaF,GACtCG,IAASC,QAAc8F,EAAgBhG,GAAOO,CAAK,GAAG,CAACP,GAAOO,CAAK,CAAC;CAC1E,OACE,kBAACC,GAAD;EACE,SAASC,EAAc;GAAE,GAAGX;GAAO;EAAO,CAAC;EAC3C,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAMA,SAAgBmG,EAAW,GAAwB;CACjD,OAAO,kBAACC,GAAD,EAAO,GAAIpG,EAAQ,CAAA;AAC5B;AAGA,SAAgBqG,EAAY,GAAyB;CACnD,IAAM,EAAE,QAAQnG,GAAO,YAAS,YAAS,gBAAaF,GAChDG,IAASC,QACPkG,EAAapG,GAAO;EAAE;EAAS;EAAS;CAAS,CAAC,GACxD;EAACA;EAAOqG;EAASC;EAASC;CAAQ,CACpC;CACA,OACE,kBAAC/F,GAAD;EACE,SAASC,EAAc;GAAE,GAAGX;GAAO;EAAO,CAAC;EAC3C,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAOA,SAAgB0G,EAAe,GAA4B;CACzD,IAAM,EACJ,WACA,SACA,WACA,SACA,SACA,UACA,cACA,QAAQC,GACR,cACE3G,GAEE4G,IAAOC,EAAcpE,CAAM,GAC3BtC,IAASC,QACP,CACJ0G,EAAgBC,GAAQ;EACtB;EACA;EACA;EACA;EACA;EACA,QAAQC;EACR,QAAQJ;CACV,CAAC,GACD,GAAID,KAAS,CAAC,CAChB,GACA;EAACI;EAAQE;EAAMC;EAAQC;EAAMxF;EAAMQ;EAAO6E;EAAWL;EAAOC;CAAI,CAClE;CACA,OACE,kBAAClG,GAAD;EACE,SAASC,EAAc;GAAE,GAAGX;GAAO;EAAO,CAAC;EAC3C,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAMA,SAAgBoH,EAAa,GAA0B;CACrD,IAAM,EACJ,QAAQlH,GACR,WACA,SACA,YACA,gBACA,WACA,iBACA,mBACEF,GACEqH,IAAY1F,KAAQ2F,EAAaT,EAAcpE,CAAM,CAAC,CAAC,CAAC,QACxDtC,IAASC,QAEXmH,EAAc,CACZ,GAAIC,GAAQ,SACR,CACE;EACE,IAAI;EACJ,MAAMH;EACN,MAAMI,EAAYD,GAAQ,EAAE,WAAQ,CAAC;CACvC,CACF,IACA,CAAC,GACL,GAAItH,KAAS,CAAC,CAChB,CAAC,CAAC,CAAC,KAAK,MACNwH,EAAE,SAAS,YACP;EACE,GAAGA;EACH,cAAcA,EAAE,gBAAgBC;EAChC,aAAaD,EAAE,eAAeE;CAChC,IACAF,CACN,GACF;EAACxH;EAAOsH;EAAQH;EAAWQ;EAASF;EAAcC;CAAW,CAC/D;CACA,OACE,kBAAClH,GAAD;EACE,SAASC,EAAc;GAAE,GAAGX;GAAO;GAAQ;EAAY,CAAC;EACxD,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAMA,SAAgB8H,EAAe,GAA4B;CACzD,IAAM,EACJ,UACA,SACA,YACA,cACA,eACA,UACA,YAAS,IACT,WACA,cACA,gBACA,cACE9H,GACE4G,IAAOC,EAAcpE,CAAM,GAC3BtC,IAASC,QACP,CACJ2H,EAAgBC,GAAO;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAQpB;CACV,CAAC,CACH,GACA;EACEoB;EACArG;EACAsG;EACAC;EACAC;EACAC;EACApH;EACAa;EACAwG;EACAzB;CACF,CACF;CACA,OACE,kBAAClG,GAAD;EACE,SAASC,EAAc;GACrB,GAAGX;GACH,QAAQ,KAAA;GACR;GACA;EACF,CAAC;EACD,GAAID,EAAWC,CAAK;CACrB,CAAA;AAEL;AAMA,SAAgBsI,EAAW,GAAwB;CACjD,IAAM,EACJ,UACA,WACA,aACA,iBACA,kBACA,mBACA,qBACA,qBACA,oBACA,WAAQ,IACR,eACA,UACA,UACA,gBACA,gBACA,WACA,cACEtI,GACE4G,IAAOC,EAAcpE,CAAM,GAC3B8F,IAAQnI,QAEVoI,EAAYC,GAAO;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ7B;CACV,CAAC,GACH;EACE6B;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACArC;CACF,CACF,GACM,CAACsC,KAAazF,QAAe,KAAK,IAAI,CAAC,GACvC8B,IACJ4D,MAAU,KACN,OACAA,MAAU,KACRD,IACAC,aAAiB,OACfA,EAAM,QAAQ,IACdA,GACJC,IACJ7D,MAAQ,OACJ,CAAC,IACD,CACE;EACE,MAAM;EACN,MAAM;EACN,OAAOA;EACP,OAAO;EACP,MAAM,CAAC,GAAG,CAAC;EACX,OAAO8D;CACT,CACF;CACN,OACE,kBAAC3I,GAAD;EACE,SAAS;GACP,GAAGC,EAAc;IACf,GAAGX;IACH,QAAQuI,EAAM;IACd,aAAa;GACf,CAAC;GACD,OAAO;IACL,MAAM;IACN,YAAYA,EAAM;IAClB,GAAGe;GACL;GACA,OAAO;IACL,MAAM;IACN,KAAKf,EAAM,OAAO;IAClB,KAAKA,EAAM,OAAO;IAClB,GAAGgB;GACL;GACA,aAAa,CAAC,GAAIC,KAAe,CAAC,GAAI,GAAGJ,CAAK;GAC9C,cAAcb,EAAM;GACpB,aAAakB,KAAe,EAAE,MAAM,IAAI;GACxC,QAAQC,KAAUnB,EAAM,OAAO,SAAS;EAC1C;EACA,GAAIxI,EAAWC,CAAK;CACrB,CAAA;AAEL"}
@@ -320,6 +320,14 @@ export interface QuadrantDropTarget {
320
320
  export interface QuadrantChartProps extends Omit<ChartCommonProps, "onPointClick" | "onPlotClick" | "renderTooltip" | "xAxis" | "yAxis">, QuadrantConfig {
321
321
  /** Called with the clicked point and its index */
322
322
  onPointClick?: (point: QuadrantPoint, index: number) => void;
323
+ /** Called when the same point is clicked twice in quick succession */
324
+ onPointDoubleClick?: (point: QuadrantPoint, index: number) => void;
325
+ /**
326
+ * Called on every move of a dragged point, with the quadrant under the
327
+ * pointer; the dots stay in place until the drop (update `points` in
328
+ * `onPointDrop`)
329
+ */
330
+ onPointDrag?: (point: QuadrantPoint, index: number, target: QuadrantDropTarget) => void;
323
331
  /** Called when the empty area of a quadrant is clicked */
324
332
  onQuadrantClick?: (quadrant: QuadrantCorner, position: {
325
333
  x: number;
@@ -320,6 +320,14 @@ export interface QuadrantDropTarget {
320
320
  export interface QuadrantChartProps extends Omit<ChartCommonProps, "onPointClick" | "onPlotClick" | "renderTooltip" | "xAxis" | "yAxis">, QuadrantConfig {
321
321
  /** Called with the clicked point and its index */
322
322
  onPointClick?: (point: QuadrantPoint, index: number) => void;
323
+ /** Called when the same point is clicked twice in quick succession */
324
+ onPointDoubleClick?: (point: QuadrantPoint, index: number) => void;
325
+ /**
326
+ * Called on every move of a dragged point, with the quadrant under the
327
+ * pointer; the dots stay in place until the drop (update `points` in
328
+ * `onPointDrop`)
329
+ */
330
+ onPointDrag?: (point: QuadrantPoint, index: number, target: QuadrantDropTarget) => void;
323
331
  /** Called when the empty area of a quadrant is clicked */
324
332
  onQuadrantClick?: (quadrant: QuadrantCorner, position: {
325
333
  x: number;