@krizaka/charts 0.3.0 → 0.4.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 (172) hide show
  1. package/README.md +1 -1
  2. package/dist/actions-5VG352VZ.js +53 -0
  3. package/dist/actions-5VG352VZ.js.map +1 -0
  4. package/dist/bar.d.ts +3 -3
  5. package/dist/bar.js +7 -6
  6. package/dist/candlestick.d.ts +2 -2
  7. package/dist/candlestick.js +6 -5
  8. package/dist/card.d.ts +52 -0
  9. package/dist/card.js +19 -0
  10. package/dist/card.js.map +1 -0
  11. package/dist/{cartesian-BRhNQ3ib.d.ts → cartesian-CEY_wwe_.d.ts} +12 -2
  12. package/dist/chart.d.ts +2 -2
  13. package/dist/chart.js +5 -4
  14. package/dist/{chunk-BV4DBGN7.js → chunk-7W4T255Q.js} +4 -4
  15. package/dist/{chunk-W5ILLSPK.js → chunk-AGSSNMK5.js} +5 -5
  16. package/dist/{chunk-VKZZY2QD.js → chunk-FE4LUGAE.js} +5 -5
  17. package/dist/{chunk-ARARFMNE.js → chunk-FIQHMJZK.js} +5 -5
  18. package/dist/chunk-FIQHMJZK.js.map +1 -0
  19. package/dist/{chunk-ANUCSRUN.js → chunk-GD7TWEN3.js} +3 -3
  20. package/dist/chunk-GRRFPI27.js +89 -0
  21. package/dist/chunk-GRRFPI27.js.map +1 -0
  22. package/dist/{chunk-SLEJDQ3A.js → chunk-HH65IEUV.js} +3 -3
  23. package/dist/{chunk-OIRHLJBC.js → chunk-IJTI6VJD.js} +3 -3
  24. package/dist/{chunk-WVTIKOII.js → chunk-IURCLBUQ.js} +2 -2
  25. package/dist/{chunk-CVWSMUUB.js → chunk-JST4HJC3.js} +33 -15
  26. package/dist/chunk-JST4HJC3.js.map +1 -0
  27. package/dist/{chunk-IKQV3NSL.js → chunk-KERGFVSN.js} +3 -3
  28. package/dist/{chunk-XDDALY4C.js → chunk-KMQ7RANJ.js} +5 -5
  29. package/dist/{chunk-NCIQMRV3.js → chunk-LLUQEK5J.js} +5 -5
  30. package/dist/{chunk-AA5EWWYV.js → chunk-LZPZWBBY.js} +2 -2
  31. package/dist/{chunk-PBQV3B6O.js → chunk-MK2ZFUWM.js} +31 -16
  32. package/dist/chunk-MK2ZFUWM.js.map +1 -0
  33. package/dist/{chunk-CSSZLFLO.js → chunk-MRGMLDNS.js} +5 -5
  34. package/dist/{chunk-I3D7KUGN.js → chunk-NLTZWJLV.js} +3 -3
  35. package/dist/{chunk-PWMMXRMC.js → chunk-NV52AKHG.js} +3 -3
  36. package/dist/{chunk-MXLITIGU.js → chunk-NWJ5VDN7.js} +5 -5
  37. package/dist/{chunk-3CJHBJXA.js → chunk-OVASCEGF.js} +12 -73
  38. package/dist/chunk-OVASCEGF.js.map +1 -0
  39. package/dist/{chunk-EQLC2QVN.js → chunk-OZOAKP5F.js} +4 -4
  40. package/dist/chunk-OZOAKP5F.js.map +1 -0
  41. package/dist/{chunk-KNDHO67X.js → chunk-P2NK5L3B.js} +3 -3
  42. package/dist/{chunk-JTKR7ZWP.js → chunk-P6RS2L23.js} +140 -36
  43. package/dist/chunk-P6RS2L23.js.map +1 -0
  44. package/dist/{chunk-W5FX4TU3.js → chunk-PGD6SH5I.js} +30 -2
  45. package/dist/chunk-PGD6SH5I.js.map +1 -0
  46. package/dist/{chunk-4LBXEAGC.js → chunk-PWZHIGPO.js} +5 -5
  47. package/dist/{chunk-L2EKYWVI.js → chunk-VEOJNMPF.js} +3 -3
  48. package/dist/chunk-YHQFW2PR.js +71 -0
  49. package/dist/chunk-YHQFW2PR.js.map +1 -0
  50. package/dist/{chunk-C4MFZLJM.js → chunk-Z4T3JFNU.js} +2 -2
  51. package/dist/{chunk-EEP7PS2L.js → chunk-ZF7LVQTR.js} +3 -3
  52. package/dist/{context-BgYUymEO.d.ts → context-DNW7bJYw.d.ts} +19 -0
  53. package/dist/credits.d.ts +1 -1
  54. package/dist/credits.js +7 -6
  55. package/dist/earnings.d.ts +3 -3
  56. package/dist/earnings.js +8 -7
  57. package/dist/{frame-I7_xYGy5.d.ts → frame-B1HDNm7c.d.ts} +9 -5
  58. package/dist/funnel.d.ts +2 -2
  59. package/dist/funnel.js +6 -5
  60. package/dist/gauge.d.ts +2 -2
  61. package/dist/gauge.js +4 -3
  62. package/dist/geo.d.ts +2 -2
  63. package/dist/geo.js +5 -4
  64. package/dist/globe.d.ts +2 -2
  65. package/dist/globe.js +4 -3
  66. package/dist/goal.d.ts +2 -2
  67. package/dist/goal.js +5 -4
  68. package/dist/heatmap.d.ts +2 -2
  69. package/dist/heatmap.js +6 -5
  70. package/dist/index.d.ts +5 -3
  71. package/dist/index.js +45 -37
  72. package/dist/latency.d.ts +3 -3
  73. package/dist/latency.js +8 -7
  74. package/dist/line.d.ts +3 -3
  75. package/dist/line.js +7 -6
  76. package/dist/native.d.ts +19 -0
  77. package/dist/native.js +13 -1
  78. package/dist/native.js.map +1 -1
  79. package/dist/pie.d.ts +2 -2
  80. package/dist/pie.js +6 -5
  81. package/dist/provider.d.ts +2 -2
  82. package/dist/provider.js +4 -2
  83. package/dist/radar.d.ts +2 -2
  84. package/dist/radar.js +6 -5
  85. package/dist/sankey.d.ts +2 -2
  86. package/dist/sankey.js +6 -5
  87. package/dist/scatter.d.ts +2 -2
  88. package/dist/scatter.js +6 -5
  89. package/dist/sparkline.d.ts +2 -2
  90. package/dist/sparkline.js +6 -5
  91. package/dist/table-sheet-CQBIAV5N.js +36 -0
  92. package/dist/table-sheet-CQBIAV5N.js.map +1 -0
  93. package/dist/throughput.d.ts +3 -3
  94. package/dist/throughput.js +8 -7
  95. package/dist/ticker.d.ts +3 -3
  96. package/dist/ticker.js +8 -7
  97. package/dist/treemap.d.ts +2 -2
  98. package/dist/treemap.js +7 -6
  99. package/package.json +295 -53
  100. package/registry/area-chart.json +82 -12
  101. package/registry/bar-chart.json +82 -12
  102. package/registry/calendar-heatmap.json +46 -18
  103. package/registry/candlestick.json +46 -18
  104. package/registry/chart-card.json +235 -0
  105. package/registry/chart.json +40 -12
  106. package/registry/charts-provider.json +2 -2
  107. package/registry/earnings-chart.json +82 -12
  108. package/registry/examples/chart-card/before-after.d.ts +4 -0
  109. package/registry/examples/chart-card/before-after.js +22 -0
  110. package/registry/examples/chart-card/before-after.tsx +22 -0
  111. package/registry/examples/chart-card/jobs-activity.d.ts +4 -0
  112. package/registry/examples/chart-card/jobs-activity.js +20 -0
  113. package/registry/examples/chart-card/jobs-activity.tsx +20 -0
  114. package/registry/examples/chart-card/sparse-and-empty.d.ts +4 -0
  115. package/registry/examples/chart-card/sparse-and-empty.js +16 -0
  116. package/registry/examples/chart-card/sparse-and-empty.tsx +18 -0
  117. package/registry/examples/chart-card/usage-donut.d.ts +4 -0
  118. package/registry/examples/chart-card/usage-donut.js +18 -0
  119. package/registry/examples/chart-card/usage-donut.tsx +18 -0
  120. package/registry/examples/charts-provider/french-orazaka.js +1 -1
  121. package/registry/examples/charts-provider/french-orazaka.tsx +1 -1
  122. package/registry/examples/kpi-stat/dashboard-row.d.ts +4 -0
  123. package/registry/examples/kpi-stat/dashboard-row.js +19 -0
  124. package/registry/examples/kpi-stat/dashboard-row.tsx +17 -0
  125. package/registry/examples/kpi-stat/single.d.ts +4 -0
  126. package/registry/examples/kpi-stat/single.js +11 -0
  127. package/registry/examples/kpi-stat/single.tsx +6 -0
  128. package/registry/funnel.json +46 -18
  129. package/registry/gauge.json +42 -14
  130. package/registry/geo-map.json +46 -18
  131. package/registry/globe.json +40 -12
  132. package/registry/goal-progress.json +36 -8
  133. package/registry/heatmap.json +46 -18
  134. package/registry/index.json +49 -1
  135. package/registry/job-throughput.json +82 -12
  136. package/registry/kpi-stat.json +296 -0
  137. package/registry/latency-chart.json +82 -12
  138. package/registry/line-chart.json +82 -12
  139. package/registry/pie-chart.json +92 -36
  140. package/registry/price-ticker.json +82 -12
  141. package/registry/radar-chart.json +46 -18
  142. package/registry/sankey.json +46 -18
  143. package/registry/scatter-chart.json +46 -18
  144. package/registry/sparkline.json +38 -10
  145. package/registry/treemap.json +40 -12
  146. package/dist/chunk-3CJHBJXA.js.map +0 -1
  147. package/dist/chunk-ARARFMNE.js.map +0 -1
  148. package/dist/chunk-CVWSMUUB.js.map +0 -1
  149. package/dist/chunk-EQLC2QVN.js.map +0 -1
  150. package/dist/chunk-JTKR7ZWP.js.map +0 -1
  151. package/dist/chunk-PBQV3B6O.js.map +0 -1
  152. package/dist/chunk-W5FX4TU3.js.map +0 -1
  153. /package/dist/{chunk-BV4DBGN7.js.map → chunk-7W4T255Q.js.map} +0 -0
  154. /package/dist/{chunk-W5ILLSPK.js.map → chunk-AGSSNMK5.js.map} +0 -0
  155. /package/dist/{chunk-VKZZY2QD.js.map → chunk-FE4LUGAE.js.map} +0 -0
  156. /package/dist/{chunk-ANUCSRUN.js.map → chunk-GD7TWEN3.js.map} +0 -0
  157. /package/dist/{chunk-SLEJDQ3A.js.map → chunk-HH65IEUV.js.map} +0 -0
  158. /package/dist/{chunk-OIRHLJBC.js.map → chunk-IJTI6VJD.js.map} +0 -0
  159. /package/dist/{chunk-WVTIKOII.js.map → chunk-IURCLBUQ.js.map} +0 -0
  160. /package/dist/{chunk-IKQV3NSL.js.map → chunk-KERGFVSN.js.map} +0 -0
  161. /package/dist/{chunk-XDDALY4C.js.map → chunk-KMQ7RANJ.js.map} +0 -0
  162. /package/dist/{chunk-NCIQMRV3.js.map → chunk-LLUQEK5J.js.map} +0 -0
  163. /package/dist/{chunk-AA5EWWYV.js.map → chunk-LZPZWBBY.js.map} +0 -0
  164. /package/dist/{chunk-CSSZLFLO.js.map → chunk-MRGMLDNS.js.map} +0 -0
  165. /package/dist/{chunk-I3D7KUGN.js.map → chunk-NLTZWJLV.js.map} +0 -0
  166. /package/dist/{chunk-PWMMXRMC.js.map → chunk-NV52AKHG.js.map} +0 -0
  167. /package/dist/{chunk-MXLITIGU.js.map → chunk-NWJ5VDN7.js.map} +0 -0
  168. /package/dist/{chunk-KNDHO67X.js.map → chunk-P2NK5L3B.js.map} +0 -0
  169. /package/dist/{chunk-4LBXEAGC.js.map → chunk-PWZHIGPO.js.map} +0 -0
  170. /package/dist/{chunk-L2EKYWVI.js.map → chunk-VEOJNMPF.js.map} +0 -0
  171. /package/dist/{chunk-C4MFZLJM.js.map → chunk-Z4T3JFNU.js.map} +0 -0
  172. /package/dist/{chunk-EEP7PS2L.js.map → chunk-ZF7LVQTR.js.map} +0 -0
@@ -8,13 +8,14 @@ import {
8
8
  } from "./chunk-BISL7DYW.js";
9
9
  import {
10
10
  describeSeries
11
- } from "./chunk-ANUCSRUN.js";
11
+ } from "./chunk-GD7TWEN3.js";
12
12
  import {
13
13
  extent,
14
14
  normalizeSeries,
15
15
  stack,
16
- tabulate
17
- } from "./chunk-W5FX4TU3.js";
16
+ tabulate,
17
+ trimToActivity
18
+ } from "./chunk-PGD6SH5I.js";
18
19
  import {
19
20
  areaPath,
20
21
  barPath,
@@ -32,22 +33,27 @@ import {
32
33
  Tooltip,
33
34
  colorOf,
34
35
  cx,
35
- useSettings
36
- } from "./chunk-JTKR7ZWP.js";
36
+ useSettings,
37
+ useToggles
38
+ } from "./chunk-P6RS2L23.js";
37
39
  import {
38
40
  fill
39
- } from "./chunk-3CJHBJXA.js";
41
+ } from "./chunk-GRRFPI27.js";
40
42
 
41
43
  // src/cartesian/cartesian.tsx
42
44
  import { useMemo, useState } from "react";
43
45
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
44
46
  var M = { top: 12, bottom: 26, right: 14 };
45
47
  function Cartesian({ props, options }) {
46
- const { data, x, y, yLabel, series: seriesProp, format, xFormat, xLabel, thresholds = [], markers = [], legend = true, zero, onSelect } = props;
48
+ const { data, x, y, yLabel, series: seriesProp, format, xFormat, xLabel, thresholds = [], markers = [], legend = true, zero, onSelect, autoRange = false, minPoints = 7, filterable = true } = props;
47
49
  const { kind, mode, stacked = false, horizontal = false } = options;
48
50
  const { locale, labels } = useSettings(props);
49
51
  const specs = useMemo(() => normalizeSeries(seriesProp, y, yLabel), [seriesProp, y, yLabel]);
50
- const table = useMemo(() => tabulate(data, x, specs), [data, x, specs]);
52
+ const full = useMemo(() => tabulate(data, x, specs), [data, x, specs]);
53
+ const ranged = useMemo(() => autoRange ? trimToActivity(full, minPoints) : { table: full, start: 0, active: 0, total: full.categories.length }, [autoRange, full, minPoints]);
54
+ const table = ranged.table;
55
+ const start = ranged.start;
56
+ const { off, toggle } = useToggles();
51
57
  const fmt = useMemo(() => {
52
58
  const category = categoryFormatter(xFormat, locale);
53
59
  return {
@@ -73,7 +79,18 @@ function Cartesian({ props, options }) {
73
79
  const [pointer, setPointer] = useState(null);
74
80
  const count = table.categories.length;
75
81
  const colors = table.series.map((s) => colorOf(s.color, s.slot));
76
- const legendNode = legend ? /* @__PURE__ */ jsx(Legend, { items: table.series.map((s, i) => ({ label: s.label, color: colors[i], shape: mode === "bar" ? "square" : "line", dashed: s.dashed })) }) : null;
82
+ const legendNode = legend ? /* @__PURE__ */ jsx(
83
+ Legend,
84
+ {
85
+ items: table.series.map((s, i) => ({ label: s.label, color: colors[i], shape: mode === "bar" ? "square" : "line", dashed: s.dashed })),
86
+ off,
87
+ onToggle: filterable && table.series.length > 1 ? toggle : void 0,
88
+ toggleName: (label) => fill(labels.toggleSeries, { label })
89
+ }
90
+ ) : null;
91
+ const plotTable = useMemo(() => ({ categories: table.categories, series: table.series.filter((s) => !off.has(s.label)) }), [table, off]);
92
+ const plotColors = colors.filter((_, i) => !off.has(table.series[i].label));
93
+ const sparse = autoRange && ranged.active > 0 && ranged.active <= Math.max(2, Math.floor(table.categories.length / 4)) && table.categories.length >= 5;
77
94
  const announce = active === null ? "" : `${fmt.category(table.categories[active])}: ${table.series.map((s) => `${s.label} ${fmt.value(s.values[active])}`).join(", ")}`;
78
95
  const onKeyDown = (event) => {
79
96
  if (!count) return;
@@ -88,7 +105,7 @@ function Cartesian({ props, options }) {
88
105
  };
89
106
  if (event.key === "Enter" && active !== null && onSelect) {
90
107
  event.preventDefault();
91
- onSelect(data[active], active);
108
+ onSelect(data[start + active], start + active);
92
109
  return;
93
110
  }
94
111
  const next = keys[event.key];
@@ -106,6 +123,7 @@ function Cartesian({ props, options }) {
106
123
  summary,
107
124
  isEmpty,
108
125
  legend: legendNode,
126
+ note: sparse ? fill(labels.sparse, { count: ranged.active, total: table.categories.length }) : void 0,
109
127
  announcement: announce,
110
128
  active: active !== null,
111
129
  handlers: {
@@ -119,12 +137,12 @@ function Cartesian({ props, options }) {
119
137
  children: (width, height) => /* @__PURE__ */ jsx(
120
138
  Plot,
121
139
  {
122
- table,
140
+ table: plotTable,
123
141
  width,
124
142
  height,
125
143
  options,
126
144
  fmt,
127
- colors,
145
+ colors: plotColors,
128
146
  thresholds,
129
147
  markers,
130
148
  zero: zero ?? (mode !== "line" || stacked),
@@ -137,7 +155,7 @@ function Cartesian({ props, options }) {
137
155
  setActive(index);
138
156
  setPointer(at);
139
157
  },
140
- onSelect: onSelect ? (i) => onSelect(data[i], i) : void 0,
158
+ onSelect: onSelect ? (i) => onSelect(data[start + i], start + i) : void 0,
141
159
  labels: { thresholdTemplate: labels.summaryThreshold, total: labels.total }
142
160
  }
143
161
  )
@@ -230,7 +248,7 @@ function Plot({ table, width, height, options, fmt, colors, thresholds, markers,
230
248
  className: cx("kzc-mark", horizontal ? "kzc-enter-growx" : "kzc-enter-grow"),
231
249
  "data-negative": negative || void 0,
232
250
  "data-dim": active !== null && active !== i ? "" : void 0,
233
- style: { fill: colors[k], cursor: onSelect ? "pointer" : void 0 },
251
+ style: { fill: colors[k], cursor: onSelect ? "pointer" : void 0, ["--kzc-i"]: i },
234
252
  onClick: onSelect ? () => onSelect(i) : void 0
235
253
  },
236
254
  `${k}-${i}`
@@ -375,4 +393,4 @@ function sameCategory(a, b) {
375
393
  export {
376
394
  Cartesian
377
395
  };
378
- //# sourceMappingURL=chunk-CVWSMUUB.js.map
396
+ //# sourceMappingURL=chunk-JST4HJC3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cartesian/cartesian.tsx"],"sourcesContent":["\"use client\";\n// Line, area and bar charts: one cartesian engine in plain SVG (no chart library: a line chart weighs a few kB, not\n// the 180 kB of a general engine), drawn on the --kz-* roles and the palette's CSS variables — a theme switch repaints\n// it with no JavaScript. Thin marks (2 px lines, bars ≤ 24 px with a 4 px rounded data end, a 2 px gap between stacked\n// segments), recessive grid, round ticks, selective direct labels, thresholds and markers, a crosshair tooltip and\n// the keyboard.\nimport { type KeyboardEvent, type PointerEvent, type ReactNode, useMemo, useState } from \"react\";\n\nimport { extent, normalizeSeries, type Series, stack, type Table, tabulate, trimToActivity } from \"../core/data\";\nimport { describeSeries } from \"../core/describe\";\nimport { categoryFormatter, shareFormatter, valueFormatter } from \"../core/format\";\nimport { type ChartKind, fill } from \"../core/labels\";\nimport { bandScale, linearScale, niceDomain, pointScale, thinLabels } from \"../core/scale\";\nimport { areaPath, barPath, type Curve, linePath, type Point, segments } from \"../core/shape\";\nimport type { Accessor, CategoryFormat, Datum, Marker, SeriesSpec, Threshold, ValueFormat } from \"../core/types\";\nimport { ChartFrame, type ChartFrameProps, useSettings } from \"../web/frame\";\nimport { colorOf, cx, Legend, Tooltip, useToggles } from \"../web/parts\";\n\n/** What every cartesian chart takes: rows, the category field, the series, the formats, thresholds and markers. */\nexport interface CartesianProps<T extends Datum> extends ChartFrameProps {\n /** The rows, in the order of the x axis. */\n data: readonly T[];\n /** The field (or function) of the category: a month (`\"2026-04\"`), a day, a label. Default: the row's position. */\n x?: Accessor<T, unknown>;\n /** A single series: its field. Use `series` for several. */\n y?: Accessor<T, number | null | undefined>;\n /** The name of the single `y` series (legend, tooltip, table). Default: the field's name. */\n yLabel?: string;\n /** The series to draw, each with its field and its name; the palette follows their order. */\n series?: readonly SeriesSpec<T>[];\n /** How the values are written (axis, tooltip, table, summary). Default `\"number\"`. */\n format?: ValueFormat;\n /** How the categories are written. Default: dates by their precision (`2026-04` → `Apr 2026`), text as is. */\n xFormat?: CategoryFormat;\n /** The header of the categories in the data table (`Month`). */\n xLabel?: string;\n /** Horizontal lines at a value: a goal, a payout threshold. */\n thresholds?: readonly Threshold[];\n /** Vertical markers at a category: a launch, an incident. */\n markers?: readonly Marker[];\n /** Show the legend (from two series). Default true. */\n legend?: boolean;\n /** Start the value axis at zero. Default: true for bars and areas; for lines, unless the values sit far from zero. */\n zero?: boolean;\n /** Called with the row when a point or a bar is clicked (or Enter is pressed on it). */\n onSelect?: (datum: T, index: number) => void;\n /**\n * Zoom the time axis on the period that has data: the empty days before the first and after the last value are\n * left out (never fewer than `minPoints`), and a sparse period says so under the chart instead of drawing 13 empty\n * days around one bar. Default false.\n */\n autoRange?: boolean;\n /** With `autoRange`, the fewest categories to keep so a short burst still has a time scale. Default 7. */\n minPoints?: number;\n /** The legend chips switch the series on and off. Default true. */\n filterable?: boolean;\n}\n\nexport interface CartesianOptions {\n readonly kind: ChartKind;\n readonly mode: \"line\" | \"area\" | \"bar\";\n readonly curve?: Curve;\n readonly stacked?: boolean;\n readonly horizontal?: boolean;\n readonly dots?: boolean;\n readonly endLabels?: boolean;\n readonly valueLabels?: boolean;\n}\n\nconst M = { top: 12, bottom: 26, right: 14 };\n\nexport function Cartesian<T extends Datum>({ props, options }: { props: CartesianProps<T>; options: CartesianOptions }) {\n const { data, x, y, yLabel, series: seriesProp, format, xFormat, xLabel, thresholds = [], markers = [], legend = true, zero, onSelect, autoRange = false, minPoints = 7, filterable = true } = props;\n const { kind, mode, stacked = false, horizontal = false } = options;\n const { locale, labels } = useSettings(props);\n\n const specs = useMemo(() => normalizeSeries(seriesProp, y, yLabel), [seriesProp, y, yLabel]);\n const full = useMemo(() => tabulate(data, x, specs), [data, x, specs]);\n const ranged = useMemo(() => (autoRange ? trimToActivity(full, minPoints) : { table: full, start: 0, active: 0, total: full.categories.length }), [autoRange, full, minPoints]);\n const table = ranged.table;\n const start = ranged.start;\n const { off, toggle } = useToggles();\n const fmt = useMemo(() => {\n const category = categoryFormatter(xFormat, locale);\n return {\n value: valueFormatter(format, locale, labels.noValue),\n axis: valueFormatter(format, locale, labels.noValue, true),\n category,\n share: shareFormatter(locale),\n };\n }, [format, xFormat, locale, labels.noValue]);\n\n const isEmpty = table.series.length === 0 || table.series.every((s) => s.values.every((v) => v == null));\n const summary = useMemo(\n () => (isEmpty ? labels.empty : describeSeries(table, { kind, labels, value: fmt.value, category: fmt.category, share: fmt.share, thresholds })),\n [isEmpty, table, kind, labels, fmt, thresholds],\n );\n const tableModel = useMemo(\n () => ({\n columns: [xLabel ?? labels.category, ...table.series.map((s) => s.label)],\n rows: table.categories.map((c, i) => [fmt.category(c), ...table.series.map((s) => fmt.value(s.values[i]))]),\n }),\n [table, fmt, xLabel, labels.category],\n );\n\n const [active, setActive] = useState<number | null>(null);\n const [pointer, setPointer] = useState<{ x: number; y: number } | null>(null);\n const count = table.categories.length;\n\n const colors = table.series.map((s) => colorOf(s.color, s.slot));\n const legendNode = legend ? (\n <Legend\n items={table.series.map((s, i) => ({ label: s.label, color: colors[i]!, shape: mode === \"bar\" ? \"square\" : \"line\", dashed: s.dashed }))}\n off={off}\n onToggle={filterable && table.series.length > 1 ? toggle : undefined}\n toggleName={(label) => fill(labels.toggleSeries, { label })}\n />\n ) : null;\n // What is drawn: the series that are on. The summary and the table keep them all.\n const plotTable = useMemo(() => ({ categories: table.categories, series: table.series.filter((s) => !off.has(s.label)) }), [table, off]);\n const plotColors = colors.filter((_, i) => !off.has(table.series[i]!.label));\n const sparse = autoRange && ranged.active > 0 && ranged.active <= Math.max(2, Math.floor(table.categories.length / 4)) && table.categories.length >= 5;\n\n const announce = active === null ? \"\" : `${fmt.category(table.categories[active])}: ${table.series.map((s) => `${s.label} ${fmt.value(s.values[active])}`).join(\", \")}`;\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!count) return;\n const keys: Record<string, () => number | null> = {\n ArrowRight: () => Math.min(count - 1, (active ?? -1) + 1),\n ArrowDown: () => Math.min(count - 1, (active ?? -1) + 1),\n ArrowLeft: () => Math.max(0, (active ?? count) - 1),\n ArrowUp: () => Math.max(0, (active ?? count) - 1),\n Home: () => 0,\n End: () => count - 1,\n Escape: () => null,\n };\n if (event.key === \"Enter\" && active !== null && onSelect) {\n event.preventDefault();\n onSelect(data[start + active]!, start + active);\n return;\n }\n const next = keys[event.key];\n if (!next) return;\n event.preventDefault();\n setPointer(null);\n setActive(next());\n };\n\n return (\n <ChartFrame\n kind={kind}\n frame={props}\n table={tableModel}\n summary={summary}\n isEmpty={isEmpty}\n legend={legendNode}\n note={sparse ? fill(labels.sparse, { count: ranged.active, total: table.categories.length }) : undefined}\n announcement={announce}\n active={active !== null}\n handlers={{\n onKeyDown,\n onBlur: () => setActive(null),\n onPointerLeave: () => {\n setActive(null);\n setPointer(null);\n },\n }}\n >\n {(width, height) => (\n <Plot\n table={plotTable}\n width={width}\n height={height}\n options={options}\n fmt={fmt}\n colors={plotColors}\n thresholds={thresholds}\n markers={markers}\n zero={zero ?? (mode !== \"line\" || stacked)}\n autoZero={zero === undefined && mode === \"line\"}\n stacked={stacked}\n horizontal={horizontal}\n active={active}\n pointer={pointer}\n onPointer={(index, at) => {\n setActive(index);\n setPointer(at);\n }}\n onSelect={onSelect ? (i) => onSelect(data[start + i]!, start + i) : undefined}\n labels={{ thresholdTemplate: labels.summaryThreshold, total: labels.total }}\n />\n )}\n </ChartFrame>\n );\n}\n\ninterface PlotProps {\n table: Table;\n width: number;\n height: number;\n options: CartesianOptions;\n fmt: { value: (v: number | null | undefined) => string; axis: (v: number | null | undefined) => string; category: (c: unknown) => string };\n colors: string[];\n thresholds: readonly Threshold[];\n markers: readonly Marker[];\n zero: boolean;\n autoZero: boolean;\n stacked: boolean;\n horizontal: boolean;\n active: number | null;\n pointer: { x: number; y: number } | null;\n onPointer: (index: number | null, at: { x: number; y: number } | null) => void;\n onSelect?: (index: number) => void;\n labels: { thresholdTemplate: string; total: string };\n}\n\nfunction Plot({ table, width, height, options, fmt, colors, thresholds, markers, zero, autoZero, stacked, horizontal, active, pointer, onPointer, onSelect, labels }: PlotProps) {\n const { mode, curve = \"monotone\", dots, endLabels, valueLabels } = options;\n const series = table.series;\n const count = table.categories.length;\n\n // The value domain: the data, the thresholds, zero when asked (or when the data is near it), round ticks.\n let [lo, hi] = extent(series, stacked);\n for (const t of thresholds) {\n lo = Math.min(lo, t.value);\n hi = Math.max(hi, t.value);\n }\n const keepZero = zero || (autoZero && (lo <= 0 || lo < hi * 0.5));\n if (keepZero) {\n lo = Math.min(0, lo);\n hi = Math.max(0, hi);\n }\n const valueSpan = horizontal ? width : height;\n const nice = niceDomain(lo, hi, Math.max(2, Math.min(6, Math.round(valueSpan / 70))));\n const tickTexts = nice.ticks.map((t) => fmt.axis(t));\n const categoryTexts = table.categories.map((c) => fmt.category(c));\n\n const showEnd = mode !== \"bar\" && endLabels && series.length <= 3 && width >= 360;\n const endWidth = showEnd ? Math.max(...series.map((s) => textWidth(fmt.axis(lastValue(s))))) + 14 : 0;\n\n const left = horizontal ? Math.min(width * 0.35, Math.max(...categoryTexts.map(textWidth)) + 12) : Math.max(...tickTexts.map(textWidth)) + 10;\n const right = Math.max(M.right, endWidth, horizontal ? textWidth(tickTexts[tickTexts.length - 1] ?? \"\") / 2 + 4 : 0);\n const x0 = left;\n const x1 = Math.max(x0 + 10, width - right);\n const y0 = M.top + (markers.length ? 14 : 0);\n const y1 = Math.max(y0 + 10, height - M.bottom);\n\n const value = horizontal ? linearScale(nice.domain, [x0, x1], nice.ticks) : linearScale(nice.domain, [y1, y0], nice.ticks);\n const band = bandScale(count, horizontal ? [y0, y1] : [x0, x1], count > 24 ? 0.15 : 0.3);\n const point = mode === \"bar\" ? (i: number) => band(i) + band.bandwidth / 2 : pointScale(count, [x0, x1]);\n const centerOf = (i: number) => point(i);\n const base = value(Math.max(nice.domain[0], Math.min(nice.domain[1], 0)));\n\n // Which category labels fit: about one every 64 px along x, every 18 px along y.\n const labelIndexes = horizontal ? thinLabels(count, Math.floor((y1 - y0) / 18)) : thinLabels(count, Math.max(2, Math.floor((x1 - x0) / Math.max(64, Math.max(...categoryTexts.map(textWidth)) + 16))));\n\n const stacks = stacked ? stack(series) : null;\n\n const indexAt = (px: number, py: number) => {\n if (!count) return null;\n const along = horizontal ? py : px;\n if (mode === \"bar\") return Math.max(0, Math.min(count - 1, Math.floor((along - (horizontal ? y0 : x0)) / band.step)));\n const step = count > 1 ? (x1 - x0) / (count - 1) : 1;\n return Math.max(0, Math.min(count - 1, Math.round((px - x0) / step)));\n };\n\n const onMove = (event: PointerEvent<SVGSVGElement>) => {\n const box = event.currentTarget.getBoundingClientRect();\n const px = event.clientX - box.left;\n const py = event.clientY - box.top;\n onPointer(indexAt(px, py), { x: px, y: py });\n };\n\n const marks: ReactNode[] = [];\n if (mode === \"bar\") {\n const groups = stacked ? 1 : series.length;\n const thickness = Math.min(24, Math.max(2, (band.bandwidth - (groups - 1) * 2) / groups));\n const groupWidth = thickness * groups + (groups - 1) * 2;\n series.forEach((s, k) => {\n s.values.forEach((v, i) => {\n if (v == null && !stacked) return;\n const seg = stacks?.[k]?.[i];\n const from = seg ? seg.base : 0;\n const to = seg ? seg.top : (v ?? 0);\n if (from === to) return;\n const negative = to < from;\n const isTop = !stacked || series.slice(k + 1).every((other) => {\n const ov = other.values[i] ?? 0;\n return negative ? ov >= 0 : ov <= 0;\n });\n const offset = band(i) + (band.bandwidth - groupWidth) / 2 + (stacked ? 0 : k * (thickness + 2));\n const a = value(from);\n const b = value(to);\n // The 2 px surface gap between stacked segments: each segment gives up 2 px at its far end.\n const gap = stacked && !isTop ? 2 : 0;\n const radius = isTop ? 4 : 0;\n let d: string;\n if (horizontal) {\n const start = Math.min(a, b);\n const size = Math.abs(b - a) - gap;\n d = barPath(negative ? start + gap : start, offset, Math.max(0, size), thickness, radius, true, negative);\n } else {\n const top = Math.min(a, b);\n const size = Math.abs(b - a) - gap;\n d = barPath(offset, negative ? top : top + gap, thickness, Math.max(0, size), radius, false, negative);\n }\n marks.push(\n <path\n key={`${k}-${i}`}\n d={d}\n className={cx(\"kzc-mark\", horizontal ? \"kzc-enter-growx\" : \"kzc-enter-grow\")}\n data-negative={negative || undefined}\n data-dim={active !== null && active !== i ? \"\" : undefined}\n style={{ fill: colors[k], cursor: onSelect ? \"pointer\" : undefined, [\"--kzc-i\" as string]: i }}\n onClick={onSelect ? () => onSelect(i) : undefined}\n />,\n );\n if (valueLabels && series.length === 1 && count <= 16 && v != null) {\n const tip = value(to);\n marks.push(\n horizontal ? (\n <text key={`l-${i}`} x={negative ? tip - 6 : tip + 6} y={offset + thickness / 2} dominantBaseline=\"central\" textAnchor={negative ? \"end\" : \"start\"} className=\"kzc-enter-fade\">\n {fmt.axis(v)}\n </text>\n ) : (\n <text key={`l-${i}`} x={offset + thickness / 2} y={negative ? tip + 14 : tip - 6} textAnchor=\"middle\" className=\"kzc-enter-fade\">\n {fmt.axis(v)}\n </text>\n ),\n );\n }\n });\n });\n } else {\n series.forEach((s, k) => {\n const pts = s.values.map((v, i) => {\n if (v == null) return null;\n const top = stacks ? stacks[k]![i]!.top : v;\n return [centerOf(i), value(top)] as Point;\n });\n for (const seg of segments(pts)) {\n if (mode === \"area\") {\n const baseLine = stacks && k > 0 ? seg.map(([px]) => [px, value(stacks[k]![Math.round(indexAtX(px, x0, x1, count))]!.base)] as Point) : base;\n marks.push(<path key={`a-${k}-${seg[0]![0]}`} d={areaPath(seg, baseLine, curve)} className=\"kzc-area kzc-enter-fade\" style={{ fill: colors[k], opacity: stacked ? 0.5 : undefined }} />);\n }\n marks.push(\n <path\n key={`l-${k}-${seg[0]![0]}`}\n d={linePath(seg, curve)}\n pathLength={s.dashed ? undefined : 1}\n className={cx(\"kzc-line kzc-mark\", s.dashed ? \"kzc-enter-fade\" : \"kzc-enter-line\")}\n strokeDasharray={s.dashed ? \"6 4\" : undefined}\n style={{ stroke: colors[k] }}\n />,\n );\n if (dots || seg.length === 1) {\n for (const [px, py] of seg) marks.push(<circle key={`d-${k}-${px}`} cx={px} cy={py} r={4} className=\"kzc-dot kzc-enter-fade\" style={{ fill: colors[k] }} />);\n }\n }\n if (showEnd) {\n const last = [...pts].reverse().find(Boolean);\n if (last) {\n marks.push(<circle key={`e-${k}`} cx={last[0]} cy={last[1]} r={4} className=\"kzc-dot kzc-enter-fade\" style={{ fill: colors[k] }} />);\n marks.push(\n <text key={`et-${k}`} x={last[0] + 9} y={last[1]} dominantBaseline=\"central\" className=\"kzc-strong kzc-enter-fade\">\n {fmt.axis(lastValue(s))}\n </text>,\n );\n }\n }\n });\n }\n\n // Thresholds: a dashed line in the tone, its label and value on the surface.\n const thresholdMarks = thresholds.map((t, i) => {\n const at = value(t.value);\n const text = fill(labels.thresholdTemplate, { label: t.label, value: fmt.value(t.value) });\n return horizontal ? (\n <g key={`t-${i}`} data-tone={t.tone ?? \"neutral\"}>\n <line x1={at} x2={at} y1={y0} y2={y1} className=\"kzc-threshold\" />\n <text x={at + 4} y={y0 + 10} className=\"kzc-threshold-label\">\n {text}\n </text>\n </g>\n ) : (\n <g key={`t-${i}`} data-tone={t.tone ?? \"neutral\"}>\n <line x1={x0} x2={x1} y1={at} y2={at} className=\"kzc-threshold\" />\n <text x={x1} y={at - 6} textAnchor=\"end\" className=\"kzc-threshold-label\">\n {text}\n </text>\n </g>\n );\n });\n\n const markerMarks = markers.map((m, i) => {\n const index = table.categories.findIndex((c) => sameCategory(c, m.x));\n if (index < 0) return null;\n const at = centerOf(index);\n return horizontal ? null : (\n <g key={`m-${i}`} data-tone={m.tone ?? \"neutral\"}>\n <line x1={at} x2={at} y1={y0 - 4} y2={y1} className=\"kzc-threshold\" />\n <text x={at} y={y0 - 8} textAnchor={at > (x0 + x1) / 2 ? \"end\" : \"start\"} className=\"kzc-threshold-label\">\n {m.label}\n </text>\n </g>\n );\n });\n\n const cursorAt = active !== null ? centerOf(active) : null;\n const tipRows = active !== null ? series.map((s, k) => ({ label: s.label, value: fmt.value(s.values[active]), color: colors[k], shape: mode === \"bar\" ? (\"square\" as const) : (\"line\" as const) })) : [];\n const stackTotal = active !== null && stacked && series.length > 1 ? series.reduce((sum, s) => sum + (s.values[active] ?? 0), 0) : null;\n const anchor =\n active === null\n ? null\n : pointer ?? (horizontal ? { x: value(Math.max(...series.map((s) => s.values[active] ?? 0))), y: cursorAt! } : { x: cursorAt!, y: Math.min(...series.map((s) => (s.values[active] == null ? y1 : value(s.values[active]!)))) });\n\n return (\n <>\n <svg className=\"kzc-svg\" width={width} height={height} viewBox={`0 0 ${width} ${height}`} aria-hidden onPointerMove={onMove}>\n {nice.ticks.map((t, i) =>\n horizontal ? (\n <g key={t}>\n <line x1={value(t)} x2={value(t)} y1={y0} y2={y1} className={t === 0 ? \"kzc-axis\" : \"kzc-grid\"} />\n <text x={value(t)} y={y1 + 16} textAnchor=\"middle\">\n {tickTexts[i]}\n </text>\n </g>\n ) : (\n <g key={t}>\n <line x1={x0} x2={x1} y1={value(t)} y2={value(t)} className={t === 0 ? \"kzc-axis\" : \"kzc-grid\"} />\n <text x={x0 - 8} y={value(t)} textAnchor=\"end\" dominantBaseline=\"central\">\n {tickTexts[i]}\n </text>\n </g>\n ),\n )}\n {labelIndexes.map((i) =>\n horizontal ? (\n <text key={i} x={x0 - 8} y={centerOf(i)} textAnchor=\"end\" dominantBaseline=\"central\">\n {clip(categoryTexts[i]!, left - 12)}\n </text>\n ) : (\n <text key={i} x={centerOf(i)} y={y1 + 17} textAnchor={mode !== \"bar\" && i === 0 ? \"start\" : mode !== \"bar\" && i === count - 1 ? \"end\" : \"middle\"}>\n {categoryTexts[i]}\n </text>\n ),\n )}\n {cursorAt !== null && mode !== \"bar\" && <line x1={cursorAt} x2={cursorAt} y1={y0} y2={y1} className=\"kzc-cursor\" />}\n {cursorAt !== null && mode === \"bar\" && (\n <rect\n x={horizontal ? x0 : band(active!) - (band.step - band.bandwidth) / 2}\n y={horizontal ? band(active!) - (band.step - band.bandwidth) / 2 : y0}\n width={horizontal ? x1 - x0 : band.step}\n height={horizontal ? band.step : y1 - y0}\n style={{ fill: \"var(--kz-surface-2)\", opacity: 0.6 }}\n />\n )}\n <g>{marks}</g>\n {thresholdMarks}\n {markerMarks}\n {active !== null &&\n mode !== \"bar\" &&\n series.map((s, k) => {\n const v = s.values[active];\n if (v == null) return null;\n const top = stacked ? stack(series)[k]![active]!.top : v;\n return <circle key={k} cx={cursorAt!} cy={value(top)} r={5} className=\"kzc-dot\" style={{ fill: colors[k] }} />;\n })}\n </svg>\n {active !== null && anchor && (\n <Tooltip\n x={anchor.x}\n y={anchor.y}\n width={width}\n title={categoryTexts[active]}\n rows={stackTotal !== null ? [...tipRows, { label: labels.total, value: fmt.value(stackTotal) }] : tipRows}\n />\n )}\n </>\n );\n}\n\nconst lastValue = (s: Series) => [...s.values].reverse().find((v) => v != null) ?? null;\n\n/** An estimate of a label's width at 11 px (no layout on the server): the margins are sized from it. */\nexport function textWidth(text: string): number {\n return Math.ceil(text.length * 6.4);\n}\n\nfunction clip(text: string, max: number): string {\n if (textWidth(text) <= max) return text;\n const chars = Math.max(3, Math.floor(max / 6.4) - 1);\n return `${text.slice(0, chars)}…`;\n}\n\nfunction indexAtX(px: number, x0: number, x1: number, count: number): number {\n return count > 1 ? ((px - x0) / (x1 - x0)) * (count - 1) : 0;\n}\n\nfunction sameCategory(a: unknown, b: unknown): boolean {\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n return a === b || String(a) === String(b);\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  BarChart
4
- } from "./chunk-WVTIKOII.js";
4
+ } from "./chunk-IURCLBUQ.js";
5
5
  import {
6
6
  Kpi
7
7
  } from "./chunk-WBHFVBSK.js";
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-WNUFGMS7.js";
14
14
  import {
15
15
  useSettings
16
- } from "./chunk-JTKR7ZWP.js";
16
+ } from "./chunk-P6RS2L23.js";
17
17
 
18
18
  // src/latency/latency-chart.tsx
19
19
  import { useMemo } from "react";
@@ -73,4 +73,4 @@ function LatencyChart({
73
73
  export {
74
74
  LatencyChart
75
75
  };
76
- //# sourceMappingURL=chunk-IKQV3NSL.js.map
76
+ //# sourceMappingURL=chunk-KERGFVSN.js.map
@@ -4,10 +4,10 @@ import {
4
4
  baseOption,
5
5
  categoryAxis,
6
6
  tooltipHtml
7
- } from "./chunk-PWMMXRMC.js";
7
+ } from "./chunk-NV52AKHG.js";
8
8
  import {
9
9
  read
10
- } from "./chunk-W5FX4TU3.js";
10
+ } from "./chunk-PGD6SH5I.js";
11
11
  import {
12
12
  asDate,
13
13
  categoryFormatter,
@@ -16,11 +16,11 @@ import {
16
16
  import {
17
17
  RampLegend,
18
18
  useSettings
19
- } from "./chunk-JTKR7ZWP.js";
19
+ } from "./chunk-P6RS2L23.js";
20
20
  import {
21
21
  capitalize,
22
22
  fill
23
- } from "./chunk-3CJHBJXA.js";
23
+ } from "./chunk-GRRFPI27.js";
24
24
 
25
25
  // src/heatmap/heatmap.tsx
26
26
  import { useCallback, useMemo } from "react";
@@ -163,4 +163,4 @@ export {
163
163
  Heatmap,
164
164
  CalendarHeatmap
165
165
  };
166
- //# sourceMappingURL=chunk-XDDALY4C.js.map
166
+ //# sourceMappingURL=chunk-KMQ7RANJ.js.map
@@ -5,10 +5,10 @@ import {
5
5
  categoryAxis,
6
6
  tooltipHtml,
7
7
  valueAxis
8
- } from "./chunk-PWMMXRMC.js";
8
+ } from "./chunk-NV52AKHG.js";
9
9
  import {
10
10
  read
11
- } from "./chunk-W5FX4TU3.js";
11
+ } from "./chunk-PGD6SH5I.js";
12
12
  import {
13
13
  categoryFormatter,
14
14
  shareFormatter,
@@ -16,11 +16,11 @@ import {
16
16
  } from "./chunk-XLLYNNC6.js";
17
17
  import {
18
18
  useSettings
19
- } from "./chunk-JTKR7ZWP.js";
19
+ } from "./chunk-P6RS2L23.js";
20
20
  import {
21
21
  capitalize,
22
22
  fill
23
- } from "./chunk-3CJHBJXA.js";
23
+ } from "./chunk-GRRFPI27.js";
24
24
 
25
25
  // src/candlestick/candlestick.tsx
26
26
  import { useCallback, useMemo } from "react";
@@ -152,4 +152,4 @@ function Candlestick(props) {
152
152
  export {
153
153
  Candlestick
154
154
  };
155
- //# sourceMappingURL=chunk-NCIQMRV3.js.map
155
+ //# sourceMappingURL=chunk-LLUQEK5J.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  EChartHost,
4
4
  baseOption
5
- } from "./chunk-PWMMXRMC.js";
5
+ } from "./chunk-NV52AKHG.js";
6
6
 
7
7
  // src/chart/chart.tsx
8
8
  import { useCallback } from "react";
@@ -35,4 +35,4 @@ function Chart({ option, modules = fullEngine, summaryText, table, items, onItem
35
35
  export {
36
36
  Chart
37
37
  };
38
- //# sourceMappingURL=chunk-AA5EWWYV.js.map
38
+ //# sourceMappingURL=chunk-LZPZWBBY.js.map
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import {
3
3
  describeParts
4
- } from "./chunk-ANUCSRUN.js";
4
+ } from "./chunk-GD7TWEN3.js";
5
5
  import {
6
6
  read
7
- } from "./chunk-W5FX4TU3.js";
7
+ } from "./chunk-PGD6SH5I.js";
8
8
  import {
9
9
  arcPath,
10
10
  polar
@@ -15,10 +15,15 @@ import {
15
15
  } from "./chunk-XLLYNNC6.js";
16
16
  import {
17
17
  ChartFrame,
18
+ Legend,
18
19
  Tooltip,
19
20
  colorOf,
20
- useSettings
21
- } from "./chunk-JTKR7ZWP.js";
21
+ useSettings,
22
+ useToggles
23
+ } from "./chunk-P6RS2L23.js";
24
+ import {
25
+ fill
26
+ } from "./chunk-GRRFPI27.js";
22
27
 
23
28
  // src/pie/pie-chart.tsx
24
29
  import { useMemo, useState } from "react";
@@ -27,7 +32,7 @@ function PieChart(props) {
27
32
  const { data, label, value, color, format, donut = false, centerLabel, centerValue, maxSlices = 6, otherLabel = "Other", onSelect, labelHeader, valueHeader } = props;
28
33
  const { locale, labels } = useSettings(props);
29
34
  const fmt = useMemo(() => ({ value: valueFormatter(format, locale, labels.noValue), share: shareFormatter(locale) }), [format, locale, labels.noValue]);
30
- const slices = useMemo(() => {
35
+ const allSlices = useMemo(() => {
31
36
  const rows = data.map((datum, index) => ({ datum, index, label: read(label, datum, index), value: Math.max(0, Number(read(value, datum, index)) || 0) })).sort((a, b) => b.value - a.value);
32
37
  const kept = rows.length > maxSlices ? rows.slice(0, maxSlices - 1) : rows;
33
38
  const out = kept.map((row, i) => ({ ...row, color: colorOf(color ? read(color, row.datum, row.index) : void 0, i + 1) }));
@@ -37,16 +42,19 @@ function PieChart(props) {
37
42
  }
38
43
  return out;
39
44
  }, [data, label, value, color, maxSlices, otherLabel]);
45
+ const { off, toggle } = useToggles();
46
+ const allTotal = allSlices.reduce((sum, s) => sum + s.value, 0);
47
+ const slices = useMemo(() => allSlices.filter((s) => !off.has(s.label)), [allSlices, off]);
40
48
  const total = slices.reduce((sum, s) => sum + s.value, 0);
41
- const isEmpty = total <= 0;
49
+ const isEmpty = allTotal <= 0;
42
50
  const kind = donut ? "donut" : "pie";
43
- const summary = useMemo(() => isEmpty ? labels.empty : describeParts(kind, slices, { labels, value: fmt.value, share: fmt.share }), [isEmpty, kind, slices, labels, fmt]);
51
+ const summary = useMemo(() => isEmpty ? labels.empty : describeParts(kind, allSlices, { labels, value: fmt.value, share: fmt.share }), [isEmpty, kind, allSlices, labels, fmt]);
44
52
  const table = useMemo(
45
53
  () => ({
46
54
  columns: [labelHeader ?? labels.category, valueHeader ?? labels.value, "%"],
47
- rows: [...slices.map((s) => [s.label, fmt.value(s.value), fmt.share(total ? s.value / total : 0)]), [labels.total, fmt.value(total), fmt.share(1)]]
55
+ rows: [...allSlices.map((s) => [s.label, fmt.value(s.value), fmt.share(allTotal ? s.value / allTotal : 0)]), [labels.total, fmt.value(allTotal), fmt.share(1)]]
48
56
  }),
49
- [slices, fmt, total, labels, labelHeader, valueHeader]
57
+ [allSlices, fmt, allTotal, labels, labelHeader, valueHeader]
50
58
  );
51
59
  const [active, setActive] = useState(null);
52
60
  const onKeyDown = (event) => {
@@ -71,12 +79,19 @@ function PieChart(props) {
71
79
  setActive(move());
72
80
  };
73
81
  const say = (s) => `${s.label}: ${fmt.value(s.value)} (${fmt.share(total ? s.value / total : 0)})`;
74
- const legend = /* @__PURE__ */ jsx("ul", { className: "kzc-legend", "aria-hidden": true, children: slices.map((s) => /* @__PURE__ */ jsxs("li", { children: [
75
- /* @__PURE__ */ jsx("span", { className: "kzc-key", style: { background: s.color } }),
76
- s.label,
77
- " \xB7 ",
78
- fmt.share(total ? s.value / total : 0)
79
- ] }, s.label)) });
82
+ const legend = /* @__PURE__ */ jsx(
83
+ Legend,
84
+ {
85
+ always: true,
86
+ items: allSlices.map((s) => ({ label: s.label, color: s.color, detail: `${fmt.value(s.value)} \xB7 ${fmt.share(allTotal ? s.value / allTotal : 0)}` })),
87
+ off,
88
+ onToggle: allSlices.length > 1 ? (label2) => {
89
+ setActive(null);
90
+ toggle(label2);
91
+ } : void 0,
92
+ toggleName: (label2) => fill(labels.toggleSeries, { label: label2 })
93
+ }
94
+ );
80
95
  return /* @__PURE__ */ jsx(
81
96
  ChartFrame,
82
97
  {
@@ -142,4 +157,4 @@ export {
142
157
  PieChart,
143
158
  DonutChart
144
159
  };
145
- //# sourceMappingURL=chunk-PBQV3B6O.js.map
160
+ //# sourceMappingURL=chunk-MK2ZFUWM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pie/pie-chart.tsx"],"sourcesContent":["\"use client\";\n// Part of a whole: a pie, or a donut with the total in its hole. Plain SVG. The slices are sorted largest first and\n// folded into “Other” past `maxSlices` (a ninth hue is never invented); a 2 px surface gap separates them; the legend\n// carries each part's value and share, so the colour is never the only way to read it.\nimport { type KeyboardEvent, useMemo, useState } from \"react\";\n\nimport { read } from \"../core/data\";\nimport { describeParts } from \"../core/describe\";\nimport { shareFormatter, valueFormatter } from \"../core/format\";\nimport { fill } from \"../core/labels\";\nimport { arcPath, polar } from \"../core/shape\";\nimport type { Accessor, Datum, SeriesColor, ValueFormat } from \"../core/types\";\nimport { ChartFrame, type ChartFrameProps, useSettings } from \"../web/frame\";\nimport { colorOf, Legend, Tooltip, useToggles } from \"../web/parts\";\n\nexport interface PieChartProps<T extends Datum> extends ChartFrameProps {\n /** One row per part. */\n data: readonly T[];\n /** The field (or function) naming the part. */\n label: Accessor<T, string>;\n /** The field (or function) of its amount (≥ 0). */\n value: Accessor<T, number>;\n /** A part's own colour (a slot, a tone or a CSS colour); default: the palette in order of size. */\n color?: Accessor<T, SeriesColor | undefined>;\n /** How the amounts are written. */\n format?: ValueFormat;\n /** A ring rather than a pie: the total (or `centerValue`) is written in its hole. */\n donut?: boolean;\n /** The words under the number in the hole of a donut (“Total credits”). */\n centerLabel?: string;\n /** The number in the hole, written already. Default: the total. */\n centerValue?: string;\n /** At most this many slices; the rest fold into one, named `otherLabel`. Default 6. */\n maxSlices?: number;\n /** The name of the folded slice. Default “Other”. */\n otherLabel?: string;\n /** Called with the row when a slice is clicked (or Enter is pressed on it). */\n onSelect?: (datum: T, index: number) => void;\n /** The header of the parts in the data table. */\n labelHeader?: string;\n /** The header of the amounts in the data table. */\n valueHeader?: string;\n}\n\ninterface Slice<T> {\n readonly label: string;\n readonly value: number;\n readonly color: string;\n readonly datum?: T;\n readonly index: number;\n}\n\nexport function PieChart<T extends Datum>(props: PieChartProps<T>) {\n const { data, label, value, color, format, donut = false, centerLabel, centerValue, maxSlices = 6, otherLabel = \"Other\", onSelect, labelHeader, valueHeader } = props;\n const { locale, labels } = useSettings(props);\n const fmt = useMemo(() => ({ value: valueFormatter(format, locale, labels.noValue), share: shareFormatter(locale) }), [format, locale, labels.noValue]);\n\n const allSlices = useMemo<Slice<T>[]>(() => {\n const rows = data\n .map((datum, index) => ({ datum, index, label: read(label, datum, index), value: Math.max(0, Number(read(value, datum, index)) || 0) }))\n .sort((a, b) => b.value - a.value);\n const kept = rows.length > maxSlices ? rows.slice(0, maxSlices - 1) : rows;\n const out: Slice<T>[] = kept.map((row, i) => ({ ...row, color: colorOf(color ? read(color, row.datum, row.index) : undefined, i + 1) }));\n if (rows.length > maxSlices) {\n const rest = rows.slice(maxSlices - 1).reduce((sum, row) => sum + row.value, 0);\n out.push({ label: otherLabel, value: rest, color: \"var(--kz-text-muted)\", index: -1 });\n }\n return out;\n }, [data, label, value, color, maxSlices, otherLabel]);\n\n const { off, toggle } = useToggles();\n const allTotal = allSlices.reduce((sum, s) => sum + s.value, 0);\n // What is drawn: the parts that are on. The summary and the table keep them all.\n const slices = useMemo(() => allSlices.filter((s) => !off.has(s.label)), [allSlices, off]);\n const total = slices.reduce((sum, s) => sum + s.value, 0);\n const isEmpty = allTotal <= 0;\n const kind = donut ? \"donut\" : \"pie\";\n const summary = useMemo(() => (isEmpty ? labels.empty : describeParts(kind, allSlices, { labels, value: fmt.value, share: fmt.share })), [isEmpty, kind, allSlices, labels, fmt]);\n const table = useMemo(\n () => ({\n columns: [labelHeader ?? labels.category, valueHeader ?? labels.value, \"%\"],\n rows: [...allSlices.map((s) => [s.label, fmt.value(s.value), fmt.share(allTotal ? s.value / allTotal : 0)]), [labels.total, fmt.value(allTotal), fmt.share(1)]],\n }),\n [allSlices, fmt, allTotal, labels, labelHeader, valueHeader],\n );\n\n const [active, setActive] = useState<number | null>(null);\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const n = slices.length;\n const moves: Record<string, () => number | null> = {\n ArrowRight: () => ((active ?? -1) + 1) % n,\n ArrowDown: () => ((active ?? -1) + 1) % n,\n ArrowLeft: () => ((active ?? 0) - 1 + n) % n,\n ArrowUp: () => ((active ?? 0) - 1 + n) % n,\n Home: () => 0,\n End: () => n - 1,\n Escape: () => null,\n };\n if (event.key === \"Enter\" && active !== null && onSelect) {\n const slice = slices[active]!;\n if (slice.datum) onSelect(slice.datum, slice.index);\n return;\n }\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n setActive(move());\n };\n const say = (s: Slice<T>) => `${s.label}: ${fmt.value(s.value)} (${fmt.share(total ? s.value / total : 0)})`;\n\n const legend = (\n <Legend\n always\n items={allSlices.map((s) => ({ label: s.label, color: s.color, detail: `${fmt.value(s.value)} · ${fmt.share(allTotal ? s.value / allTotal : 0)}` }))}\n off={off}\n onToggle={allSlices.length > 1 ? (label) => { setActive(null); toggle(label); } : undefined}\n toggleName={(label) => fill(labels.toggleSeries, { label })}\n />\n );\n\n return (\n <ChartFrame\n kind={kind}\n frame={props}\n defaultHeight={240}\n table={table}\n summary={summary}\n isEmpty={isEmpty}\n legend={isEmpty ? null : legend}\n announcement={active === null ? \"\" : say(slices[active]!)}\n active={active !== null}\n handlers={{ onKeyDown, onBlur: () => setActive(null), onPointerLeave: () => setActive(null) }}\n >\n {(width, height) => {\n const radius = Math.max(10, Math.min(width, height) / 2 - 6);\n const inner = donut ? radius * 0.64 : 0;\n const cx = width / 2;\n const cy = height / 2;\n let angle = 0;\n const arcs = slices.map((s, i) => {\n const sweep = total ? (s.value / total) * Math.PI * 2 : 0;\n const start = angle;\n angle += sweep;\n return { s, i, start, end: angle };\n });\n const current = active !== null ? arcs[active] : null;\n const mid = current ? (current.start + current.end) / 2 : 0;\n const [tx, ty] = current ? polar(cx, cy, (radius + inner) / 2 + (donut ? 0 : radius * 0.2), mid) : [0, 0];\n return (\n <>\n <svg className=\"kzc-svg\" width={width} height={height} viewBox={`0 0 ${width} ${height}`} aria-hidden>\n <g className=\"kzc-enter-pop\">\n {arcs.map(({ s, i, start, end }) => {\n const lift = active === i ? 4 : 0;\n const [dx, dy] = lift ? polar(0, 0, lift, (start + end) / 2) : [0, 0];\n return (\n <path\n key={s.label}\n d={arcPath(cx + dx, cy + dy, inner, radius, start, end)}\n className=\"kzc-mark\"\n data-dim={active !== null && active !== i ? \"\" : undefined}\n style={{ fill: s.color, stroke: \"var(--kzc-surface)\", strokeWidth: slices.length > 1 ? 2 : 0, strokeLinejoin: \"round\", cursor: onSelect ? \"pointer\" : undefined }}\n onPointerEnter={() => setActive(i)}\n onClick={onSelect && s.datum ? () => onSelect(s.datum!, s.index) : undefined}\n />\n );\n })}\n </g>\n {donut && (\n <g className=\"kzc-enter-fade\">\n <text x={cx} y={cy - (centerLabel ? 6 : 0)} textAnchor=\"middle\" dominantBaseline=\"central\" className=\"kzc-strong\" style={{ fontSize: Math.max(14, Math.min(26, inner / 3)) }}>\n {centerValue ?? fmt.value(total)}\n </text>\n {centerLabel && (\n <text x={cx} y={cy + Math.max(12, Math.min(20, inner / 4))} textAnchor=\"middle\" dominantBaseline=\"central\">\n {centerLabel}\n </text>\n )}\n </g>\n )}\n </svg>\n {current && <Tooltip x={tx} y={ty} width={width} title={current.s.label} rows={[{ label: fmt.share(total ? current.s.value / total : 0), value: fmt.value(current.s.value), color: current.s.color }]} />}\n </>\n );\n }}\n </ChartFrame>\n );\n}\n\n/** A pie with a hole: the total (or `centerValue`) and `centerLabel` in it. */\nexport function DonutChart<T extends Datum>(props: Omit<PieChartProps<T>, \"donut\">) {\n return <PieChart {...props} donut />;\n}\n"],"mappings":"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","names":["label"]}
@@ -3,21 +3,21 @@ import {
3
3
  EChartHost,
4
4
  baseOption,
5
5
  tooltipHtml
6
- } from "./chunk-PWMMXRMC.js";
6
+ } from "./chunk-NV52AKHG.js";
7
7
  import {
8
8
  read
9
- } from "./chunk-W5FX4TU3.js";
9
+ } from "./chunk-PGD6SH5I.js";
10
10
  import {
11
11
  shareFormatter,
12
12
  valueFormatter
13
13
  } from "./chunk-XLLYNNC6.js";
14
14
  import {
15
15
  useSettings
16
- } from "./chunk-JTKR7ZWP.js";
16
+ } from "./chunk-P6RS2L23.js";
17
17
  import {
18
18
  capitalize,
19
19
  fill
20
- } from "./chunk-3CJHBJXA.js";
20
+ } from "./chunk-GRRFPI27.js";
21
21
 
22
22
  // src/funnel/funnel.tsx
23
23
  import { useCallback, useMemo } from "react";
@@ -113,4 +113,4 @@ function Funnel(props) {
113
113
  export {
114
114
  Funnel
115
115
  };
116
- //# sourceMappingURL=chunk-CSSZLFLO.js.map
116
+ //# sourceMappingURL=chunk-MRGMLDNS.js.map
@@ -13,10 +13,10 @@ import {
13
13
  useMounted,
14
14
  useReducedMotion,
15
15
  useSettings
16
- } from "./chunk-JTKR7ZWP.js";
16
+ } from "./chunk-P6RS2L23.js";
17
17
  import {
18
18
  fill
19
- } from "./chunk-3CJHBJXA.js";
19
+ } from "./chunk-GRRFPI27.js";
20
20
 
21
21
  // src/globe/globe.tsx
22
22
  import { geoDistance, geoGraticule10, geoInterpolate, geoOrthographic, geoPath } from "d3-geo";
@@ -202,4 +202,4 @@ function Globe3D(props) {
202
202
  export {
203
203
  Globe3D
204
204
  };
205
- //# sourceMappingURL=chunk-I3D7KUGN.js.map
205
+ //# sourceMappingURL=chunk-NLTZWJLV.js.map
@@ -5,10 +5,10 @@ import {
5
5
  useInView,
6
6
  useReducedMotion,
7
7
  useThemeVersion
8
- } from "./chunk-JTKR7ZWP.js";
8
+ } from "./chunk-P6RS2L23.js";
9
9
  import {
10
10
  sequential
11
- } from "./chunk-3CJHBJXA.js";
11
+ } from "./chunk-OVASCEGF.js";
12
12
 
13
13
  // src/echarts/theme.ts
14
14
  var ROLES = {
@@ -231,4 +231,4 @@ export {
231
231
  tooltipHtml,
232
232
  EChartHost
233
233
  };
234
- //# sourceMappingURL=chunk-PWMMXRMC.js.map
234
+ //# sourceMappingURL=chunk-NV52AKHG.js.map
@@ -3,21 +3,21 @@ import {
3
3
  EChartHost,
4
4
  baseOption,
5
5
  tooltipHtml
6
- } from "./chunk-PWMMXRMC.js";
6
+ } from "./chunk-NV52AKHG.js";
7
7
  import {
8
8
  read
9
- } from "./chunk-W5FX4TU3.js";
9
+ } from "./chunk-PGD6SH5I.js";
10
10
  import {
11
11
  shareFormatter,
12
12
  valueFormatter
13
13
  } from "./chunk-XLLYNNC6.js";
14
14
  import {
15
15
  useSettings
16
- } from "./chunk-JTKR7ZWP.js";
16
+ } from "./chunk-P6RS2L23.js";
17
17
  import {
18
18
  capitalize,
19
19
  fill
20
- } from "./chunk-3CJHBJXA.js";
20
+ } from "./chunk-GRRFPI27.js";
21
21
 
22
22
  // src/sankey/sankey.tsx
23
23
  import { useCallback, useMemo } from "react";
@@ -89,4 +89,4 @@ function Sankey(props) {
89
89
  export {
90
90
  Sankey
91
91
  };
92
- //# sourceMappingURL=chunk-MXLITIGU.js.map
92
+ //# sourceMappingURL=chunk-NWJ5VDN7.js.map