@sckyzo/cosmos-charts 0.3.0 → 0.3.1

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 (79) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1 -1
  3. package/dist/BarChart.cjs +18 -18
  4. package/dist/BarChart.js +5 -5
  5. package/dist/BoxPlotChart.cjs +18 -18
  6. package/dist/BoxPlotChart.js +5 -5
  7. package/dist/BumpChart.cjs +6 -6
  8. package/dist/BumpChart.js +3 -3
  9. package/dist/CalendarChart.cjs +9 -7
  10. package/dist/CalendarChart.cjs.map +1 -1
  11. package/dist/CalendarChart.js +5 -3
  12. package/dist/CalendarChart.js.map +1 -1
  13. package/dist/DonutChart.cjs +8 -8
  14. package/dist/DonutChart.js +3 -3
  15. package/dist/FunnelChart.cjs +8 -6
  16. package/dist/FunnelChart.cjs.map +1 -1
  17. package/dist/FunnelChart.js +4 -2
  18. package/dist/FunnelChart.js.map +1 -1
  19. package/dist/GradientRadial.cjs +3 -3
  20. package/dist/GradientRadial.js +2 -2
  21. package/dist/HeatmapChart.cjs +8 -6
  22. package/dist/HeatmapChart.cjs.map +1 -1
  23. package/dist/HeatmapChart.js +5 -3
  24. package/dist/HeatmapChart.js.map +1 -1
  25. package/dist/LineAreaChart.cjs +13 -13
  26. package/dist/LineAreaChart.js +4 -4
  27. package/dist/MixedChart.cjs +16 -16
  28. package/dist/MixedChart.js +5 -5
  29. package/dist/RadarChart.cjs +9 -9
  30. package/dist/RadarChart.js +3 -3
  31. package/dist/RadialBarChart.cjs +3 -3
  32. package/dist/RadialBarChart.js +1 -1
  33. package/dist/RangeBarChart.cjs +13 -13
  34. package/dist/RangeBarChart.js +4 -4
  35. package/dist/RealtimeChart.cjs +8 -8
  36. package/dist/RealtimeChart.js +2 -2
  37. package/dist/ScatterChart.cjs +12 -12
  38. package/dist/ScatterChart.js +4 -4
  39. package/dist/SemiCircleGauge.cjs +2 -2
  40. package/dist/SemiCircleGauge.js +1 -1
  41. package/dist/Sparkline.cjs +4 -4
  42. package/dist/Sparkline.js +1 -1
  43. package/dist/StrokedGauge.cjs +3 -3
  44. package/dist/StrokedGauge.js +2 -2
  45. package/dist/TreemapChart.cjs +2 -2
  46. package/dist/TreemapChart.js +1 -1
  47. package/dist/WaterfallChart.cjs +12 -12
  48. package/dist/WaterfallChart.js +3 -3
  49. package/dist/{chunk-6ALKZLN2.js → chunk-4AKHZNWP.js} +3 -3
  50. package/dist/{chunk-6ALKZLN2.js.map → chunk-4AKHZNWP.js.map} +1 -1
  51. package/dist/{chunk-3N43QT36.js → chunk-56WD3OHA.js} +6 -4
  52. package/dist/chunk-56WD3OHA.js.map +1 -0
  53. package/dist/{chunk-YWYF5CCJ.js → chunk-6FGJZBTC.js} +3 -3
  54. package/dist/{chunk-YWYF5CCJ.js.map → chunk-6FGJZBTC.js.map} +1 -1
  55. package/dist/{chunk-MN4CDVOS.cjs → chunk-CMBNNLIV.cjs} +4 -4
  56. package/dist/{chunk-MN4CDVOS.cjs.map → chunk-CMBNNLIV.cjs.map} +1 -1
  57. package/dist/{chunk-RILUG7JB.js → chunk-DI2FBGKM.js} +3 -3
  58. package/dist/{chunk-RILUG7JB.js.map → chunk-DI2FBGKM.js.map} +1 -1
  59. package/dist/{chunk-SGG7XKOY.js → chunk-ESVGCUJN.js} +3 -3
  60. package/dist/{chunk-SGG7XKOY.js.map → chunk-ESVGCUJN.js.map} +1 -1
  61. package/dist/{chunk-RLHGPHC7.cjs → chunk-G4WOPX4D.cjs} +4 -4
  62. package/dist/{chunk-RLHGPHC7.cjs.map → chunk-G4WOPX4D.cjs.map} +1 -1
  63. package/dist/{chunk-GZRMVE4X.cjs → chunk-RCDTBZC2.cjs} +4 -4
  64. package/dist/{chunk-GZRMVE4X.cjs.map → chunk-RCDTBZC2.cjs.map} +1 -1
  65. package/dist/{chunk-6NRRABPF.cjs → chunk-SR2ESX3R.cjs} +6 -4
  66. package/dist/chunk-SR2ESX3R.cjs.map +1 -0
  67. package/dist/{chunk-ICL5K2CW.js → chunk-UL3SNXQR.js} +3 -3
  68. package/dist/{chunk-ICL5K2CW.js.map → chunk-UL3SNXQR.js.map} +1 -1
  69. package/dist/{chunk-6BKLL7LZ.cjs → chunk-XMFBVMW7.cjs} +4 -4
  70. package/dist/{chunk-6BKLL7LZ.cjs.map → chunk-XMFBVMW7.cjs.map} +1 -1
  71. package/dist/{chunk-Z4LZFMDH.cjs → chunk-XUGQ6VXO.cjs} +4 -4
  72. package/dist/{chunk-Z4LZFMDH.cjs.map → chunk-XUGQ6VXO.cjs.map} +1 -1
  73. package/dist/{chunk-HMH6DI7U.js → chunk-YMRNTIOK.js} +3 -3
  74. package/dist/{chunk-HMH6DI7U.js.map → chunk-YMRNTIOK.js.map} +1 -1
  75. package/dist/{chunk-TPH5T3DA.cjs → chunk-ZWHCUYIN.cjs} +4 -4
  76. package/dist/{chunk-TPH5T3DA.cjs.map → chunk-ZWHCUYIN.cjs.map} +1 -1
  77. package/package.json +1 -1
  78. package/dist/chunk-3N43QT36.js.map +0 -1
  79. package/dist/chunk-6NRRABPF.cjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import { RadialGauge } from './chunk-YWYF5CCJ.js';
2
+ import { RadialGauge } from './chunk-6FGJZBTC.js';
3
3
  import { percent } from './chunk-OCD6JIIX.js';
4
4
  import './chunk-URNXLVSK.js';
5
5
  import './chunk-5C2RLJYZ.js';
6
6
  import { safeId } from './chunk-UJIV5PVI.js';
7
- import './chunk-3N43QT36.js';
7
+ import './chunk-56WD3OHA.js';
8
8
  import { SERIES, SUCCESS } from './chunk-UATB2IRY.js';
9
9
  import { useId } from 'react';
10
10
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkTPH5T3DA_cjs = require('./chunk-TPH5T3DA.cjs');
4
+ var chunkZWHCUYIN_cjs = require('./chunk-ZWHCUYIN.cjs');
5
5
  require('./chunk-DBZQI4HM.cjs');
6
- var chunkRLHGPHC7_cjs = require('./chunk-RLHGPHC7.cjs');
6
+ var chunkG4WOPX4D_cjs = require('./chunk-G4WOPX4D.cjs');
7
7
  require('./chunk-T3K6Q34U.cjs');
8
8
  var chunkK3R7JGOW_cjs = require('./chunk-K3R7JGOW.cjs');
9
- var chunk6NRRABPF_cjs = require('./chunk-6NRRABPF.cjs');
9
+ var chunkSR2ESX3R_cjs = require('./chunk-SR2ESX3R.cjs');
10
10
  var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
11
11
  var jsxRuntime = require('react/jsx-runtime');
12
12
 
@@ -45,7 +45,7 @@ var legendStyle = (position) => {
45
45
  margin: 0,
46
46
  padding: 0,
47
47
  listStyle: "none",
48
- fontSize: chunkRLHGPHC7_cjs.TEXT_SIZE,
48
+ fontSize: chunkG4WOPX4D_cjs.TEXT_SIZE,
49
49
  color: chunkLT3UC65O_cjs.MUTED
50
50
  };
51
51
  };
@@ -73,7 +73,7 @@ var HeatmapChart = ({
73
73
  }) => {
74
74
  const name = ariaLabel ?? `Heatmap: ${series.map((s) => s.name).join(", ")}`;
75
75
  if (chunkK3R7JGOW_cjs.hasNoData(series)) {
76
- return /* @__PURE__ */ jsxRuntime.jsx(chunk6NRRABPF_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
76
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkSR2ESX3R_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
77
77
  }
78
78
  const colorRanges = (ranges ?? evenRanges(
79
79
  series.flatMap((s) => s.data),
@@ -116,6 +116,8 @@ var HeatmapChart = ({
116
116
  "div",
117
117
  {
118
118
  style: {
119
+ // The axes keep their order under `dir="rtl"`, and so do the legend's sides.
120
+ direction: "ltr",
119
121
  display: "flex",
120
122
  gap: "1rem",
121
123
  width: width ?? "100%",
@@ -126,7 +128,7 @@ var HeatmapChart = ({
126
128
  children: [
127
129
  legend,
128
130
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "1 1 0", minWidth: 0, minHeight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx(
129
- chunkTPH5T3DA_cjs.HeatGrid,
131
+ chunkZWHCUYIN_cjs.HeatGrid,
130
132
  {
131
133
  rows: series.map((s) => s.name),
132
134
  columns: categories.map(String),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/HeatmapChart.tsx"],"names":["TEXT_SIZE","MUTED","hasNoData","ChartEmpty","SEQUENTIAL","seriesColor","jsx","jsxs","HeatGrid"],"mappings":"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","file":"HeatmapChart.cjs","sourcesContent":["import type { CSSProperties } from 'react';\nimport { TEXT_SIZE } from './core/axes';\nimport { MUTED, SEQUENTIAL, seriesColor } from './core/colors';\nimport { hasNoData } from './core/data';\nimport { ChartEmpty } from './core/frame';\nimport { HeatGrid, type HeatCell } from './core/HeatGrid';\nimport type {\n ChartAxisTitleProps,\n ChartEmptyProps,\n ChartLegendPosition,\n ChartLegendProps,\n ChartProps,\n} from './types';\n\nexport type HeatmapColorRange = {\n /** Lowest value of the range, inclusive. */\n from: number;\n /** Highest value of the range, inclusive. A value on a shared bound takes the later range. */\n to: number;\n color: string;\n /** Legend label. Default: `from – to`, formatted with `formatValue`. */\n name?: string;\n};\n\nexport type HeatmapChartProps = Omit<ChartProps, 'children'> &\n ChartEmptyProps &\n ChartLegendProps &\n ChartAxisTitleProps & {\n /** One row per series, drawn top to bottom; one value per category. */\n series: { name: string; data: number[] }[];\n categories: (string | number)[];\n /**\n * Color steps, low to high, spread over the data range in buckets with\n * round bounds. Default: five steps of the current accent, mixed over the\n * card.\n */\n colors?: string[];\n /**\n * Explicit color ranges (thresholds such as OK / WARN / CRIT), which take\n * precedence over `colors`. Cover every value: a cell outside all ranges\n * falls back to a series color.\n */\n ranges?: HeatmapColorRange[];\n /** Format the values in the tooltip, the legend and the cells. */\n formatValue?: (value: number) => string;\n /** Print each value inside its cell. */\n showValues?: boolean;\n /** Show the color legend. Default true. */\n showLegend?: boolean;\n };\n\n// Round bucket sizes, × 10^n. Finer than 1-2-5 so that the buckets fit the\n// data instead of leaving the top colors unused.\nconst NICE_STEPS = [1, 2, 2.5, 3, 4, 5, 6, 8, 10];\n\n/** The smallest round bucket size that is at least `value`. */\nconst niceStep = (value: number): number => {\n const magnitude = 10 ** Math.floor(Math.log10(value));\n const step = NICE_STEPS.find((m) => m * magnitude >= value) ?? 10;\n return step * magnitude;\n};\n\n// Drops the float noise of `start + i * step` (0.30000000000000004).\nconst round = (value: number) => Number(value.toPrecision(12));\n\n/** `colors.length` contiguous ranges with round bounds covering every value. */\nconst evenRanges = (values: number[], colors: string[]): HeatmapColorRange[] => {\n const finite = values.filter(Number.isFinite);\n if (finite.length === 0 || colors.length === 0) return [];\n const min = finite.reduce((a, b) => Math.min(a, b));\n const max = finite.reduce((a, b) => Math.max(a, b));\n let step = niceStep((max - min) / colors.length || Math.abs(max) || 1);\n let start = Math.floor(min / step) * step;\n // Flooring the start can leave the top value out: take the next round step.\n while (start + step * colors.length < max) {\n step = niceStep(step * 1.001);\n start = Math.floor(min / step) * step;\n }\n return colors.map((color, i) => ({\n from: round(start + step * i),\n to: round(start + step * (i + 1)),\n color,\n }));\n};\n\n/** The range a value falls in; on a bound shared by two ranges, the later one. */\nconst rangeOf = (value: number, ranges: HeatmapColorRange[]) =>\n [...ranges].reverse().find((range) => value >= range.from && value <= range.to);\n\nconst legendStyle = (position: ChartLegendPosition): CSSProperties => {\n const column = position === 'left' || position === 'right';\n return {\n display: 'flex',\n flexDirection: column ? 'column' : 'row',\n flexWrap: 'wrap',\n gap: column ? '0.375rem' : '0.25rem 1rem',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n fontSize: TEXT_SIZE,\n color: MUTED,\n };\n};\n\nconst SIDES: Record<ChartLegendPosition, CSSProperties> = {\n top: { flexDirection: 'column' },\n bottom: { flexDirection: 'column-reverse' },\n left: { flexDirection: 'row' },\n right: { flexDirection: 'row-reverse' },\n};\n\nexport const HeatmapChart = ({\n series,\n categories,\n colors,\n ranges,\n formatValue = String,\n xTitle,\n yTitle,\n showValues = false,\n showLegend = true,\n legendPosition = 'top',\n emptyMessage = 'No data',\n ariaLabel,\n height = 320,\n width,\n}: HeatmapChartProps) => {\n const name = ariaLabel ?? `Heatmap: ${series.map((s) => s.name).join(', ')}`;\n if (hasNoData(series)) {\n return <ChartEmpty message={emptyMessage} ariaLabel={name} height={height} width={width} />;\n }\n const colorRanges = (\n ranges ??\n evenRanges(\n series.flatMap((s) => s.data),\n colors ?? SEQUENTIAL\n )\n ).map((range) => ({\n ...range,\n name: range.name ?? `${formatValue(range.from)} – ${formatValue(range.to)}`,\n }));\n const cells = series.flatMap((s, row) =>\n s.data.flatMap((value, column): HeatCell[] =>\n Number.isFinite(value)\n ? [\n {\n row,\n column,\n color: rangeOf(value, colorRanges)?.color ?? seriesColor(row),\n title: String(categories[column] ?? column),\n label: s.name,\n value: formatValue(value),\n text: showValues ? formatValue(value) : undefined,\n },\n ]\n : []\n )\n );\n const legend = showLegend && (\n <ul data-heat-legend=\"\" style={legendStyle(legendPosition)}>\n {colorRanges.map((range, i) => (\n <li key={i} style={{ display: 'flex', alignItems: 'center', gap: '0.375rem' }}>\n <span\n aria-hidden\n style={{\n width: '0.625rem',\n height: '0.625rem',\n borderRadius: 3,\n background: range.color,\n }}\n />\n {range.name}\n </li>\n ))}\n </ul>\n );\n return (\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n width: width ?? '100%',\n height,\n maxWidth: '100%',\n ...SIDES[legendPosition],\n }}\n >\n {legend}\n <div style={{ flex: '1 1 0', minWidth: 0, minHeight: 0 }}>\n <HeatGrid\n rows={series.map((s) => s.name)}\n columns={categories.map(String)}\n cells={cells}\n ariaLabel={name}\n xTitle={xTitle}\n yTitle={yTitle}\n />\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/HeatmapChart.tsx"],"names":["TEXT_SIZE","MUTED","hasNoData","ChartEmpty","SEQUENTIAL","seriesColor","jsx","jsxs","HeatGrid"],"mappings":"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","file":"HeatmapChart.cjs","sourcesContent":["import type { CSSProperties } from 'react';\nimport { TEXT_SIZE } from './core/axes';\nimport { MUTED, SEQUENTIAL, seriesColor } from './core/colors';\nimport { hasNoData } from './core/data';\nimport { ChartEmpty } from './core/frame';\nimport { HeatGrid, type HeatCell } from './core/HeatGrid';\nimport type {\n ChartAxisTitleProps,\n ChartEmptyProps,\n ChartLegendPosition,\n ChartLegendProps,\n ChartProps,\n} from './types';\n\nexport type HeatmapColorRange = {\n /** Lowest value of the range, inclusive. */\n from: number;\n /** Highest value of the range, inclusive. A value on a shared bound takes the later range. */\n to: number;\n color: string;\n /** Legend label. Default: `from – to`, formatted with `formatValue`. */\n name?: string;\n};\n\nexport type HeatmapChartProps = Omit<ChartProps, 'children'> &\n ChartEmptyProps &\n ChartLegendProps &\n ChartAxisTitleProps & {\n /** One row per series, drawn top to bottom; one value per category. */\n series: { name: string; data: number[] }[];\n categories: (string | number)[];\n /**\n * Color steps, low to high, spread over the data range in buckets with\n * round bounds. Default: five steps of the current accent, mixed over the\n * card.\n */\n colors?: string[];\n /**\n * Explicit color ranges (thresholds such as OK / WARN / CRIT), which take\n * precedence over `colors`. Cover every value: a cell outside all ranges\n * falls back to a series color.\n */\n ranges?: HeatmapColorRange[];\n /** Format the values in the tooltip, the legend and the cells. */\n formatValue?: (value: number) => string;\n /** Print each value inside its cell. */\n showValues?: boolean;\n /** Show the color legend. Default true. */\n showLegend?: boolean;\n };\n\n// Round bucket sizes, × 10^n. Finer than 1-2-5 so that the buckets fit the\n// data instead of leaving the top colors unused.\nconst NICE_STEPS = [1, 2, 2.5, 3, 4, 5, 6, 8, 10];\n\n/** The smallest round bucket size that is at least `value`. */\nconst niceStep = (value: number): number => {\n const magnitude = 10 ** Math.floor(Math.log10(value));\n const step = NICE_STEPS.find((m) => m * magnitude >= value) ?? 10;\n return step * magnitude;\n};\n\n// Drops the float noise of `start + i * step` (0.30000000000000004).\nconst round = (value: number) => Number(value.toPrecision(12));\n\n/** `colors.length` contiguous ranges with round bounds covering every value. */\nconst evenRanges = (values: number[], colors: string[]): HeatmapColorRange[] => {\n const finite = values.filter(Number.isFinite);\n if (finite.length === 0 || colors.length === 0) return [];\n const min = finite.reduce((a, b) => Math.min(a, b));\n const max = finite.reduce((a, b) => Math.max(a, b));\n let step = niceStep((max - min) / colors.length || Math.abs(max) || 1);\n let start = Math.floor(min / step) * step;\n // Flooring the start can leave the top value out: take the next round step.\n while (start + step * colors.length < max) {\n step = niceStep(step * 1.001);\n start = Math.floor(min / step) * step;\n }\n return colors.map((color, i) => ({\n from: round(start + step * i),\n to: round(start + step * (i + 1)),\n color,\n }));\n};\n\n/** The range a value falls in; on a bound shared by two ranges, the later one. */\nconst rangeOf = (value: number, ranges: HeatmapColorRange[]) =>\n [...ranges].reverse().find((range) => value >= range.from && value <= range.to);\n\nconst legendStyle = (position: ChartLegendPosition): CSSProperties => {\n const column = position === 'left' || position === 'right';\n return {\n display: 'flex',\n flexDirection: column ? 'column' : 'row',\n flexWrap: 'wrap',\n gap: column ? '0.375rem' : '0.25rem 1rem',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n fontSize: TEXT_SIZE,\n color: MUTED,\n };\n};\n\nconst SIDES: Record<ChartLegendPosition, CSSProperties> = {\n top: { flexDirection: 'column' },\n bottom: { flexDirection: 'column-reverse' },\n left: { flexDirection: 'row' },\n right: { flexDirection: 'row-reverse' },\n};\n\nexport const HeatmapChart = ({\n series,\n categories,\n colors,\n ranges,\n formatValue = String,\n xTitle,\n yTitle,\n showValues = false,\n showLegend = true,\n legendPosition = 'top',\n emptyMessage = 'No data',\n ariaLabel,\n height = 320,\n width,\n}: HeatmapChartProps) => {\n const name = ariaLabel ?? `Heatmap: ${series.map((s) => s.name).join(', ')}`;\n if (hasNoData(series)) {\n return <ChartEmpty message={emptyMessage} ariaLabel={name} height={height} width={width} />;\n }\n const colorRanges = (\n ranges ??\n evenRanges(\n series.flatMap((s) => s.data),\n colors ?? SEQUENTIAL\n )\n ).map((range) => ({\n ...range,\n name: range.name ?? `${formatValue(range.from)} – ${formatValue(range.to)}`,\n }));\n const cells = series.flatMap((s, row) =>\n s.data.flatMap((value, column): HeatCell[] =>\n Number.isFinite(value)\n ? [\n {\n row,\n column,\n color: rangeOf(value, colorRanges)?.color ?? seriesColor(row),\n title: String(categories[column] ?? column),\n label: s.name,\n value: formatValue(value),\n text: showValues ? formatValue(value) : undefined,\n },\n ]\n : []\n )\n );\n const legend = showLegend && (\n <ul data-heat-legend=\"\" style={legendStyle(legendPosition)}>\n {colorRanges.map((range, i) => (\n <li key={i} style={{ display: 'flex', alignItems: 'center', gap: '0.375rem' }}>\n <span\n aria-hidden\n style={{\n width: '0.625rem',\n height: '0.625rem',\n borderRadius: 3,\n background: range.color,\n }}\n />\n {range.name}\n </li>\n ))}\n </ul>\n );\n return (\n <div\n style={{\n // The axes keep their order under `dir=\"rtl\"`, and so do the legend's sides.\n direction: 'ltr',\n display: 'flex',\n gap: '1rem',\n width: width ?? '100%',\n height,\n maxWidth: '100%',\n ...SIDES[legendPosition],\n }}\n >\n {legend}\n <div style={{ flex: '1 1 0', minWidth: 0, minHeight: 0 }}>\n <HeatGrid\n rows={series.map((s) => s.name)}\n columns={categories.map(String)}\n cells={cells}\n ariaLabel={name}\n xTitle={xTitle}\n yTitle={yTitle}\n />\n </div>\n </div>\n );\n};\n"]}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import { HeatGrid } from './chunk-ICL5K2CW.js';
2
+ import { HeatGrid } from './chunk-UL3SNXQR.js';
3
3
  import './chunk-BFEDLXVW.js';
4
- import { TEXT_SIZE } from './chunk-RILUG7JB.js';
4
+ import { TEXT_SIZE } from './chunk-DI2FBGKM.js';
5
5
  import './chunk-VIOSQN4Z.js';
6
6
  import { hasNoData } from './chunk-UJIV5PVI.js';
7
- import { ChartEmpty } from './chunk-3N43QT36.js';
7
+ import { ChartEmpty } from './chunk-56WD3OHA.js';
8
8
  import { seriesColor, SEQUENTIAL, MUTED } from './chunk-UATB2IRY.js';
9
9
  import { jsx, jsxs } from 'react/jsx-runtime';
10
10
 
@@ -114,6 +114,8 @@ var HeatmapChart = ({
114
114
  "div",
115
115
  {
116
116
  style: {
117
+ // The axes keep their order under `dir="rtl"`, and so do the legend's sides.
118
+ direction: "ltr",
117
119
  display: "flex",
118
120
  gap: "1rem",
119
121
  width: width ?? "100%",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/HeatmapChart.tsx"],"names":[],"mappings":"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","file":"HeatmapChart.js","sourcesContent":["import type { CSSProperties } from 'react';\nimport { TEXT_SIZE } from './core/axes';\nimport { MUTED, SEQUENTIAL, seriesColor } from './core/colors';\nimport { hasNoData } from './core/data';\nimport { ChartEmpty } from './core/frame';\nimport { HeatGrid, type HeatCell } from './core/HeatGrid';\nimport type {\n ChartAxisTitleProps,\n ChartEmptyProps,\n ChartLegendPosition,\n ChartLegendProps,\n ChartProps,\n} from './types';\n\nexport type HeatmapColorRange = {\n /** Lowest value of the range, inclusive. */\n from: number;\n /** Highest value of the range, inclusive. A value on a shared bound takes the later range. */\n to: number;\n color: string;\n /** Legend label. Default: `from – to`, formatted with `formatValue`. */\n name?: string;\n};\n\nexport type HeatmapChartProps = Omit<ChartProps, 'children'> &\n ChartEmptyProps &\n ChartLegendProps &\n ChartAxisTitleProps & {\n /** One row per series, drawn top to bottom; one value per category. */\n series: { name: string; data: number[] }[];\n categories: (string | number)[];\n /**\n * Color steps, low to high, spread over the data range in buckets with\n * round bounds. Default: five steps of the current accent, mixed over the\n * card.\n */\n colors?: string[];\n /**\n * Explicit color ranges (thresholds such as OK / WARN / CRIT), which take\n * precedence over `colors`. Cover every value: a cell outside all ranges\n * falls back to a series color.\n */\n ranges?: HeatmapColorRange[];\n /** Format the values in the tooltip, the legend and the cells. */\n formatValue?: (value: number) => string;\n /** Print each value inside its cell. */\n showValues?: boolean;\n /** Show the color legend. Default true. */\n showLegend?: boolean;\n };\n\n// Round bucket sizes, × 10^n. Finer than 1-2-5 so that the buckets fit the\n// data instead of leaving the top colors unused.\nconst NICE_STEPS = [1, 2, 2.5, 3, 4, 5, 6, 8, 10];\n\n/** The smallest round bucket size that is at least `value`. */\nconst niceStep = (value: number): number => {\n const magnitude = 10 ** Math.floor(Math.log10(value));\n const step = NICE_STEPS.find((m) => m * magnitude >= value) ?? 10;\n return step * magnitude;\n};\n\n// Drops the float noise of `start + i * step` (0.30000000000000004).\nconst round = (value: number) => Number(value.toPrecision(12));\n\n/** `colors.length` contiguous ranges with round bounds covering every value. */\nconst evenRanges = (values: number[], colors: string[]): HeatmapColorRange[] => {\n const finite = values.filter(Number.isFinite);\n if (finite.length === 0 || colors.length === 0) return [];\n const min = finite.reduce((a, b) => Math.min(a, b));\n const max = finite.reduce((a, b) => Math.max(a, b));\n let step = niceStep((max - min) / colors.length || Math.abs(max) || 1);\n let start = Math.floor(min / step) * step;\n // Flooring the start can leave the top value out: take the next round step.\n while (start + step * colors.length < max) {\n step = niceStep(step * 1.001);\n start = Math.floor(min / step) * step;\n }\n return colors.map((color, i) => ({\n from: round(start + step * i),\n to: round(start + step * (i + 1)),\n color,\n }));\n};\n\n/** The range a value falls in; on a bound shared by two ranges, the later one. */\nconst rangeOf = (value: number, ranges: HeatmapColorRange[]) =>\n [...ranges].reverse().find((range) => value >= range.from && value <= range.to);\n\nconst legendStyle = (position: ChartLegendPosition): CSSProperties => {\n const column = position === 'left' || position === 'right';\n return {\n display: 'flex',\n flexDirection: column ? 'column' : 'row',\n flexWrap: 'wrap',\n gap: column ? '0.375rem' : '0.25rem 1rem',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n fontSize: TEXT_SIZE,\n color: MUTED,\n };\n};\n\nconst SIDES: Record<ChartLegendPosition, CSSProperties> = {\n top: { flexDirection: 'column' },\n bottom: { flexDirection: 'column-reverse' },\n left: { flexDirection: 'row' },\n right: { flexDirection: 'row-reverse' },\n};\n\nexport const HeatmapChart = ({\n series,\n categories,\n colors,\n ranges,\n formatValue = String,\n xTitle,\n yTitle,\n showValues = false,\n showLegend = true,\n legendPosition = 'top',\n emptyMessage = 'No data',\n ariaLabel,\n height = 320,\n width,\n}: HeatmapChartProps) => {\n const name = ariaLabel ?? `Heatmap: ${series.map((s) => s.name).join(', ')}`;\n if (hasNoData(series)) {\n return <ChartEmpty message={emptyMessage} ariaLabel={name} height={height} width={width} />;\n }\n const colorRanges = (\n ranges ??\n evenRanges(\n series.flatMap((s) => s.data),\n colors ?? SEQUENTIAL\n )\n ).map((range) => ({\n ...range,\n name: range.name ?? `${formatValue(range.from)} – ${formatValue(range.to)}`,\n }));\n const cells = series.flatMap((s, row) =>\n s.data.flatMap((value, column): HeatCell[] =>\n Number.isFinite(value)\n ? [\n {\n row,\n column,\n color: rangeOf(value, colorRanges)?.color ?? seriesColor(row),\n title: String(categories[column] ?? column),\n label: s.name,\n value: formatValue(value),\n text: showValues ? formatValue(value) : undefined,\n },\n ]\n : []\n )\n );\n const legend = showLegend && (\n <ul data-heat-legend=\"\" style={legendStyle(legendPosition)}>\n {colorRanges.map((range, i) => (\n <li key={i} style={{ display: 'flex', alignItems: 'center', gap: '0.375rem' }}>\n <span\n aria-hidden\n style={{\n width: '0.625rem',\n height: '0.625rem',\n borderRadius: 3,\n background: range.color,\n }}\n />\n {range.name}\n </li>\n ))}\n </ul>\n );\n return (\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n width: width ?? '100%',\n height,\n maxWidth: '100%',\n ...SIDES[legendPosition],\n }}\n >\n {legend}\n <div style={{ flex: '1 1 0', minWidth: 0, minHeight: 0 }}>\n <HeatGrid\n rows={series.map((s) => s.name)}\n columns={categories.map(String)}\n cells={cells}\n ariaLabel={name}\n xTitle={xTitle}\n yTitle={yTitle}\n />\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/HeatmapChart.tsx"],"names":[],"mappings":"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","file":"HeatmapChart.js","sourcesContent":["import type { CSSProperties } from 'react';\nimport { TEXT_SIZE } from './core/axes';\nimport { MUTED, SEQUENTIAL, seriesColor } from './core/colors';\nimport { hasNoData } from './core/data';\nimport { ChartEmpty } from './core/frame';\nimport { HeatGrid, type HeatCell } from './core/HeatGrid';\nimport type {\n ChartAxisTitleProps,\n ChartEmptyProps,\n ChartLegendPosition,\n ChartLegendProps,\n ChartProps,\n} from './types';\n\nexport type HeatmapColorRange = {\n /** Lowest value of the range, inclusive. */\n from: number;\n /** Highest value of the range, inclusive. A value on a shared bound takes the later range. */\n to: number;\n color: string;\n /** Legend label. Default: `from – to`, formatted with `formatValue`. */\n name?: string;\n};\n\nexport type HeatmapChartProps = Omit<ChartProps, 'children'> &\n ChartEmptyProps &\n ChartLegendProps &\n ChartAxisTitleProps & {\n /** One row per series, drawn top to bottom; one value per category. */\n series: { name: string; data: number[] }[];\n categories: (string | number)[];\n /**\n * Color steps, low to high, spread over the data range in buckets with\n * round bounds. Default: five steps of the current accent, mixed over the\n * card.\n */\n colors?: string[];\n /**\n * Explicit color ranges (thresholds such as OK / WARN / CRIT), which take\n * precedence over `colors`. Cover every value: a cell outside all ranges\n * falls back to a series color.\n */\n ranges?: HeatmapColorRange[];\n /** Format the values in the tooltip, the legend and the cells. */\n formatValue?: (value: number) => string;\n /** Print each value inside its cell. */\n showValues?: boolean;\n /** Show the color legend. Default true. */\n showLegend?: boolean;\n };\n\n// Round bucket sizes, × 10^n. Finer than 1-2-5 so that the buckets fit the\n// data instead of leaving the top colors unused.\nconst NICE_STEPS = [1, 2, 2.5, 3, 4, 5, 6, 8, 10];\n\n/** The smallest round bucket size that is at least `value`. */\nconst niceStep = (value: number): number => {\n const magnitude = 10 ** Math.floor(Math.log10(value));\n const step = NICE_STEPS.find((m) => m * magnitude >= value) ?? 10;\n return step * magnitude;\n};\n\n// Drops the float noise of `start + i * step` (0.30000000000000004).\nconst round = (value: number) => Number(value.toPrecision(12));\n\n/** `colors.length` contiguous ranges with round bounds covering every value. */\nconst evenRanges = (values: number[], colors: string[]): HeatmapColorRange[] => {\n const finite = values.filter(Number.isFinite);\n if (finite.length === 0 || colors.length === 0) return [];\n const min = finite.reduce((a, b) => Math.min(a, b));\n const max = finite.reduce((a, b) => Math.max(a, b));\n let step = niceStep((max - min) / colors.length || Math.abs(max) || 1);\n let start = Math.floor(min / step) * step;\n // Flooring the start can leave the top value out: take the next round step.\n while (start + step * colors.length < max) {\n step = niceStep(step * 1.001);\n start = Math.floor(min / step) * step;\n }\n return colors.map((color, i) => ({\n from: round(start + step * i),\n to: round(start + step * (i + 1)),\n color,\n }));\n};\n\n/** The range a value falls in; on a bound shared by two ranges, the later one. */\nconst rangeOf = (value: number, ranges: HeatmapColorRange[]) =>\n [...ranges].reverse().find((range) => value >= range.from && value <= range.to);\n\nconst legendStyle = (position: ChartLegendPosition): CSSProperties => {\n const column = position === 'left' || position === 'right';\n return {\n display: 'flex',\n flexDirection: column ? 'column' : 'row',\n flexWrap: 'wrap',\n gap: column ? '0.375rem' : '0.25rem 1rem',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n fontSize: TEXT_SIZE,\n color: MUTED,\n };\n};\n\nconst SIDES: Record<ChartLegendPosition, CSSProperties> = {\n top: { flexDirection: 'column' },\n bottom: { flexDirection: 'column-reverse' },\n left: { flexDirection: 'row' },\n right: { flexDirection: 'row-reverse' },\n};\n\nexport const HeatmapChart = ({\n series,\n categories,\n colors,\n ranges,\n formatValue = String,\n xTitle,\n yTitle,\n showValues = false,\n showLegend = true,\n legendPosition = 'top',\n emptyMessage = 'No data',\n ariaLabel,\n height = 320,\n width,\n}: HeatmapChartProps) => {\n const name = ariaLabel ?? `Heatmap: ${series.map((s) => s.name).join(', ')}`;\n if (hasNoData(series)) {\n return <ChartEmpty message={emptyMessage} ariaLabel={name} height={height} width={width} />;\n }\n const colorRanges = (\n ranges ??\n evenRanges(\n series.flatMap((s) => s.data),\n colors ?? SEQUENTIAL\n )\n ).map((range) => ({\n ...range,\n name: range.name ?? `${formatValue(range.from)} – ${formatValue(range.to)}`,\n }));\n const cells = series.flatMap((s, row) =>\n s.data.flatMap((value, column): HeatCell[] =>\n Number.isFinite(value)\n ? [\n {\n row,\n column,\n color: rangeOf(value, colorRanges)?.color ?? seriesColor(row),\n title: String(categories[column] ?? column),\n label: s.name,\n value: formatValue(value),\n text: showValues ? formatValue(value) : undefined,\n },\n ]\n : []\n )\n );\n const legend = showLegend && (\n <ul data-heat-legend=\"\" style={legendStyle(legendPosition)}>\n {colorRanges.map((range, i) => (\n <li key={i} style={{ display: 'flex', alignItems: 'center', gap: '0.375rem' }}>\n <span\n aria-hidden\n style={{\n width: '0.625rem',\n height: '0.625rem',\n borderRadius: 3,\n background: range.color,\n }}\n />\n {range.name}\n </li>\n ))}\n </ul>\n );\n return (\n <div\n style={{\n // The axes keep their order under `dir=\"rtl\"`, and so do the legend's sides.\n direction: 'ltr',\n display: 'flex',\n gap: '1rem',\n width: width ?? '100%',\n height,\n maxWidth: '100%',\n ...SIDES[legendPosition],\n }}\n >\n {legend}\n <div style={{ flex: '1 1 0', minWidth: 0, minHeight: 0 }}>\n <HeatGrid\n rows={series.map((s) => s.name)}\n columns={categories.map(String)}\n cells={cells}\n ariaLabel={name}\n xTitle={xTitle}\n yTitle={yTitle}\n />\n </div>\n </div>\n );\n};\n"]}
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkZ4LZFMDH_cjs = require('./chunk-Z4LZFMDH.cjs');
5
- var chunkGZRMVE4X_cjs = require('./chunk-GZRMVE4X.cjs');
4
+ var chunkXUGQ6VXO_cjs = require('./chunk-XUGQ6VXO.cjs');
5
+ var chunkRCDTBZC2_cjs = require('./chunk-RCDTBZC2.cjs');
6
6
  var chunkTYQWZR3S_cjs = require('./chunk-TYQWZR3S.cjs');
7
- var chunkRLHGPHC7_cjs = require('./chunk-RLHGPHC7.cjs');
7
+ var chunkG4WOPX4D_cjs = require('./chunk-G4WOPX4D.cjs');
8
8
  var chunkT3K6Q34U_cjs = require('./chunk-T3K6Q34U.cjs');
9
9
  var chunkK3R7JGOW_cjs = require('./chunk-K3R7JGOW.cjs');
10
- var chunk6NRRABPF_cjs = require('./chunk-6NRRABPF.cjs');
10
+ var chunkSR2ESX3R_cjs = require('./chunk-SR2ESX3R.cjs');
11
11
  var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
12
12
  var react = require('react');
13
13
  var recharts = require('recharts');
@@ -35,17 +35,17 @@ var LineAreaChart = ({
35
35
  markers = false
36
36
  }) => {
37
37
  const uid = chunkK3R7JGOW_cjs.safeId(react.useId());
38
- const hidden = chunkGZRMVE4X_cjs.useHiddenSeries();
39
- const axis = chunkRLHGPHC7_cjs.useAxis();
38
+ const hidden = chunkRCDTBZC2_cjs.useHiddenSeries();
39
+ const axis = chunkG4WOPX4D_cjs.useAxis();
40
40
  const name = ariaLabel ?? `Area chart: ${series.map((s) => s.name).join(", ")}`;
41
41
  if (chunkK3R7JGOW_cjs.hasNoData(series)) {
42
- return /* @__PURE__ */ jsxRuntime.jsx(chunk6NRRABPF_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
42
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkSR2ESX3R_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
43
43
  }
44
44
  const legendVisible = showLegend ?? series.length > 1;
45
45
  return /* @__PURE__ */ jsxRuntime.jsxs(
46
46
  recharts.AreaChart,
47
47
  {
48
- ...chunk6NRRABPF_cjs.frameProps({ height, width, ariaLabel: name }),
48
+ ...chunkSR2ESX3R_cjs.frameProps({ height, width, ariaLabel: name }),
49
49
  data: chunkK3R7JGOW_cjs.toRows(categories, series),
50
50
  margin: { top: 4, right: 8, bottom: 0, left: 0 },
51
51
  children: [
@@ -53,10 +53,10 @@ var LineAreaChart = ({
53
53
  /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: chunkLT3UC65O_cjs.seriesColor(i, colors), stopOpacity: 0.32 }),
54
54
  /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: chunkLT3UC65O_cjs.seriesColor(i, colors), stopOpacity: 0 })
55
55
  ] }, chunkK3R7JGOW_cjs.seriesKey(i))) }),
56
- /* @__PURE__ */ jsxRuntime.jsx(recharts.CartesianGrid, { ...chunkRLHGPHC7_cjs.GRID_PROPS }),
57
- /* @__PURE__ */ jsxRuntime.jsx(recharts.XAxis, { dataKey: "category", ...axis, ...chunkRLHGPHC7_cjs.xAxisTitle(xTitle) }),
58
- /* @__PURE__ */ jsxRuntime.jsx(recharts.YAxis, { width: "auto", tickFormatter: formatValue, ...axis, ...chunkRLHGPHC7_cjs.yAxisTitle(yTitle) }),
59
- legendVisible && /* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { ...chunkGZRMVE4X_cjs.legendProps(legendPosition, hidden) }),
56
+ /* @__PURE__ */ jsxRuntime.jsx(recharts.CartesianGrid, { ...chunkG4WOPX4D_cjs.GRID_PROPS }),
57
+ /* @__PURE__ */ jsxRuntime.jsx(recharts.XAxis, { dataKey: "category", ...axis, ...chunkG4WOPX4D_cjs.xAxisTitle(xTitle) }),
58
+ /* @__PURE__ */ jsxRuntime.jsx(recharts.YAxis, { width: "auto", tickFormatter: formatValue, ...axis, ...chunkG4WOPX4D_cjs.yAxisTitle(yTitle) }),
59
+ legendVisible && /* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { ...chunkRCDTBZC2_cjs.legendProps(legendPosition, hidden) }),
60
60
  /* @__PURE__ */ jsxRuntime.jsx(
61
61
  recharts.Tooltip,
62
62
  {
@@ -86,7 +86,7 @@ var LineAreaChart = ({
86
86
  chunkK3R7JGOW_cjs.seriesKey(i)
87
87
  );
88
88
  }),
89
- chunkZ4LZFMDH_cjs.referenceMarks({ referenceLines, referenceBands }),
89
+ chunkXUGQ6VXO_cjs.referenceMarks({ referenceLines, referenceBands }),
90
90
  children
91
91
  ]
92
92
  }
@@ -1,11 +1,11 @@
1
1
  "use client";
2
- import { referenceMarks } from './chunk-SGG7XKOY.js';
3
- import { useHiddenSeries, legendProps } from './chunk-6ALKZLN2.js';
2
+ import { referenceMarks } from './chunk-ESVGCUJN.js';
3
+ import { useHiddenSeries, legendProps } from './chunk-4AKHZNWP.js';
4
4
  import { ANIMATION } from './chunk-5C2RLJYZ.js';
5
- import { useAxis, GRID_PROPS, xAxisTitle, yAxisTitle } from './chunk-RILUG7JB.js';
5
+ import { useAxis, GRID_PROPS, xAxisTitle, yAxisTitle } from './chunk-DI2FBGKM.js';
6
6
  import { ChartTooltip } from './chunk-VIOSQN4Z.js';
7
7
  import { safeId, hasNoData, seriesKey, toRows } from './chunk-UJIV5PVI.js';
8
- import { ChartEmpty, frameProps } from './chunk-3N43QT36.js';
8
+ import { ChartEmpty, frameProps } from './chunk-56WD3OHA.js';
9
9
  import { seriesColor, BORDER, PANEL } from './chunk-UATB2IRY.js';
10
10
  import { useId } from 'react';
11
11
  import { AreaChart, CartesianGrid, XAxis, YAxis, Legend, Tooltip, Area } from 'recharts';
@@ -2,14 +2,14 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkGVTMZYOM_cjs = require('./chunk-GVTMZYOM.cjs');
5
- var chunkZ4LZFMDH_cjs = require('./chunk-Z4LZFMDH.cjs');
6
- var chunk6BKLL7LZ_cjs = require('./chunk-6BKLL7LZ.cjs');
7
- var chunkGZRMVE4X_cjs = require('./chunk-GZRMVE4X.cjs');
5
+ var chunkXUGQ6VXO_cjs = require('./chunk-XUGQ6VXO.cjs');
6
+ var chunkXMFBVMW7_cjs = require('./chunk-XMFBVMW7.cjs');
7
+ var chunkRCDTBZC2_cjs = require('./chunk-RCDTBZC2.cjs');
8
8
  var chunkTYQWZR3S_cjs = require('./chunk-TYQWZR3S.cjs');
9
- var chunkRLHGPHC7_cjs = require('./chunk-RLHGPHC7.cjs');
9
+ var chunkG4WOPX4D_cjs = require('./chunk-G4WOPX4D.cjs');
10
10
  var chunkT3K6Q34U_cjs = require('./chunk-T3K6Q34U.cjs');
11
11
  var chunkK3R7JGOW_cjs = require('./chunk-K3R7JGOW.cjs');
12
- var chunk6NRRABPF_cjs = require('./chunk-6NRRABPF.cjs');
12
+ var chunkSR2ESX3R_cjs = require('./chunk-SR2ESX3R.cjs');
13
13
  var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
14
14
  var react = require('react');
15
15
  var recharts = require('recharts');
@@ -24,7 +24,7 @@ var rightAxisTitle = (title) => title ? {
24
24
  position: "insideRight",
25
25
  offset: 4,
26
26
  fill: chunkLT3UC65O_cjs.MUTED,
27
- style: { fill: chunkLT3UC65O_cjs.MUTED, fontSize: chunkRLHGPHC7_cjs.TEXT_SIZE, textAnchor: "middle" }
27
+ style: { fill: chunkLT3UC65O_cjs.MUTED, fontSize: chunkG4WOPX4D_cjs.TEXT_SIZE, textAnchor: "middle" }
28
28
  }
29
29
  } : {};
30
30
  var MixedChart = ({
@@ -48,11 +48,11 @@ var MixedChart = ({
48
48
  width
49
49
  }) => {
50
50
  const uid = chunkK3R7JGOW_cjs.safeId(react.useId());
51
- const hidden = chunkGZRMVE4X_cjs.useHiddenSeries();
52
- const axis = chunkRLHGPHC7_cjs.useAxis();
51
+ const hidden = chunkRCDTBZC2_cjs.useHiddenSeries();
52
+ const axis = chunkG4WOPX4D_cjs.useAxis();
53
53
  const name = ariaLabel ?? `Mixed chart: ${series.map((s) => s.name).join(", ")}`;
54
54
  if (chunkK3R7JGOW_cjs.hasNoData(series)) {
55
- return /* @__PURE__ */ jsxRuntime.jsx(chunk6NRRABPF_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
55
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkSR2ESX3R_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
56
56
  }
57
57
  const formatters = { left: formatValue, right: formatRightValue };
58
58
  const usedSides = SIDES.filter((side) => series.some((s) => axisOf(s) === side));
@@ -81,7 +81,7 @@ var MixedChart = ({
81
81
  return /* @__PURE__ */ jsxRuntime.jsxs(
82
82
  recharts.ComposedChart,
83
83
  {
84
- ...chunk6NRRABPF_cjs.frameProps({ height, width, ariaLabel: name }),
84
+ ...chunkSR2ESX3R_cjs.frameProps({ height, width, ariaLabel: name }),
85
85
  data: chunkK3R7JGOW_cjs.toRows(categories, series),
86
86
  ...stackedColumns ? { stackOffset: "sign" } : {},
87
87
  margin: { top: 4, right: 8, bottom: 0, left: 0 },
@@ -94,14 +94,14 @@ var MixedChart = ({
94
94
  /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: chunkLT3UC65O_cjs.seriesColor(i, colors), stopOpacity: 0 })
95
95
  ] }, chunkK3R7JGOW_cjs.seriesKey(i)) : null
96
96
  ) }),
97
- /* @__PURE__ */ jsxRuntime.jsx(recharts.CartesianGrid, { ...chunkRLHGPHC7_cjs.GRID_PROPS }),
97
+ /* @__PURE__ */ jsxRuntime.jsx(recharts.CartesianGrid, { ...chunkG4WOPX4D_cjs.GRID_PROPS }),
98
98
  /* @__PURE__ */ jsxRuntime.jsx(
99
99
  recharts.XAxis,
100
100
  {
101
101
  dataKey: "category",
102
102
  ...axis,
103
- ...chunkRLHGPHC7_cjs.xAxisTitle(xTitle),
104
- ...chunk6BKLL7LZ_cjs.categoryAxis(categories, xTitle)
103
+ ...chunkG4WOPX4D_cjs.xAxisTitle(xTitle),
104
+ ...chunkXMFBVMW7_cjs.categoryAxis(categories, xTitle)
105
105
  }
106
106
  ),
107
107
  sides.map((side) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -112,11 +112,11 @@ var MixedChart = ({
112
112
  width: "auto",
113
113
  tickFormatter: formatters[side],
114
114
  ...axis,
115
- ...side === "left" ? chunkRLHGPHC7_cjs.yAxisTitle(yTitle) : rightAxisTitle(yRightTitle)
115
+ ...side === "left" ? chunkG4WOPX4D_cjs.yAxisTitle(yTitle) : rightAxisTitle(yRightTitle)
116
116
  },
117
117
  side
118
118
  )),
119
- (showLegend ?? series.length > 1) && /* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { ...chunkGZRMVE4X_cjs.legendProps(legendPosition, hidden) }),
119
+ (showLegend ?? series.length > 1) && /* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { ...chunkRCDTBZC2_cjs.legendProps(legendPosition, hidden) }),
120
120
  /* @__PURE__ */ jsxRuntime.jsx(
121
121
  recharts.Tooltip,
122
122
  {
@@ -183,7 +183,7 @@ var MixedChart = ({
183
183
  key
184
184
  );
185
185
  }),
186
- chunkZ4LZFMDH_cjs.referenceMarks({ referenceLines, referenceBands, axisId: sides[0] }),
186
+ chunkXUGQ6VXO_cjs.referenceMarks({ referenceLines, referenceBands, axisId: sides[0] }),
187
187
  children
188
188
  ]
189
189
  }
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { roundedBarShape, isOuterInStack } from './chunk-GDZLYYL2.js';
3
- import { referenceMarks } from './chunk-SGG7XKOY.js';
4
- import { categoryAxis } from './chunk-HMH6DI7U.js';
5
- import { useHiddenSeries, legendProps } from './chunk-6ALKZLN2.js';
3
+ import { referenceMarks } from './chunk-ESVGCUJN.js';
4
+ import { categoryAxis } from './chunk-YMRNTIOK.js';
5
+ import { useHiddenSeries, legendProps } from './chunk-4AKHZNWP.js';
6
6
  import { ANIMATION } from './chunk-5C2RLJYZ.js';
7
- import { useAxis, GRID_PROPS, xAxisTitle, yAxisTitle, TEXT_SIZE } from './chunk-RILUG7JB.js';
7
+ import { useAxis, GRID_PROPS, xAxisTitle, yAxisTitle, TEXT_SIZE } from './chunk-DI2FBGKM.js';
8
8
  import { TooltipCard } from './chunk-VIOSQN4Z.js';
9
9
  import { safeId, hasNoData, seriesKey, toRows } from './chunk-UJIV5PVI.js';
10
- import { ChartEmpty, frameProps } from './chunk-3N43QT36.js';
10
+ import { ChartEmpty, frameProps } from './chunk-56WD3OHA.js';
11
11
  import { seriesColor, BORDER, PANEL, MUTED } from './chunk-UATB2IRY.js';
12
12
  import { useId } from 'react';
13
13
  import { ComposedChart, CartesianGrid, XAxis, YAxis, Legend, Tooltip, Area, Line, Bar } from 'recharts';
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkGZRMVE4X_cjs = require('./chunk-GZRMVE4X.cjs');
4
+ var chunkRCDTBZC2_cjs = require('./chunk-RCDTBZC2.cjs');
5
5
  var chunkIW6EWB26_cjs = require('./chunk-IW6EWB26.cjs');
6
6
  var chunkTYQWZR3S_cjs = require('./chunk-TYQWZR3S.cjs');
7
- var chunkRLHGPHC7_cjs = require('./chunk-RLHGPHC7.cjs');
7
+ var chunkG4WOPX4D_cjs = require('./chunk-G4WOPX4D.cjs');
8
8
  var chunkT3K6Q34U_cjs = require('./chunk-T3K6Q34U.cjs');
9
9
  var chunkK3R7JGOW_cjs = require('./chunk-K3R7JGOW.cjs');
10
- var chunk6NRRABPF_cjs = require('./chunk-6NRRABPF.cjs');
10
+ var chunkSR2ESX3R_cjs = require('./chunk-SR2ESX3R.cjs');
11
11
  var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
12
12
  var recharts = require('recharts');
13
13
  var jsxRuntime = require('react/jsx-runtime');
@@ -40,11 +40,11 @@ var RadarChart = ({
40
40
  height = 340,
41
41
  width
42
42
  }) => {
43
- const hidden = chunkGZRMVE4X_cjs.useHiddenSeries();
43
+ const hidden = chunkRCDTBZC2_cjs.useHiddenSeries();
44
44
  const { ref: box, width: boxWidth } = chunkIW6EWB26_cjs.useElementWidth();
45
45
  const name = ariaLabel ?? `Radar chart: ${series.map((s) => s.name).join(", ")}`;
46
46
  if (chunkK3R7JGOW_cjs.hasNoData(series)) {
47
- return /* @__PURE__ */ jsxRuntime.jsx(chunk6NRRABPF_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
47
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkSR2ESX3R_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
48
48
  }
49
49
  const legendVisible = showLegend ?? series.length > 1;
50
50
  const radius = typeof height === "number" && boxWidth ? radarSize({
@@ -56,13 +56,13 @@ var RadarChart = ({
56
56
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: box, style: { width: width ?? "100%", maxWidth: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
57
57
  recharts.RadarChart,
58
58
  {
59
- ...chunk6NRRABPF_cjs.frameProps({ height, width: "100%", ariaLabel: name }),
59
+ ...chunkSR2ESX3R_cjs.frameProps({ height, width: "100%", ariaLabel: name }),
60
60
  data: chunkK3R7JGOW_cjs.toRows(categories, series),
61
61
  outerRadius: radius,
62
62
  margin: { top: 0, right: 0, bottom: 0, left: 0 },
63
63
  children: [
64
64
  /* @__PURE__ */ jsxRuntime.jsx(recharts.PolarGrid, { stroke: chunkLT3UC65O_cjs.GRID }),
65
- /* @__PURE__ */ jsxRuntime.jsx(recharts.PolarAngleAxis, { dataKey: "category", tick: chunkRLHGPHC7_cjs.AXIS.tick, tickLine: false }),
65
+ /* @__PURE__ */ jsxRuntime.jsx(recharts.PolarAngleAxis, { dataKey: "category", tick: chunkG4WOPX4D_cjs.AXIS.tick, tickLine: false }),
66
66
  /* @__PURE__ */ jsxRuntime.jsx(
67
67
  recharts.PolarRadiusAxis,
68
68
  {
@@ -70,11 +70,11 @@ var RadarChart = ({
70
70
  domain: [0, max ?? "auto"],
71
71
  tickCount: 6,
72
72
  tickFormatter: formatValue,
73
- tick: showScale ? { fill: chunkLT3UC65O_cjs.MUTED, style: { fontSize: chunkRLHGPHC7_cjs.TEXT_SIZE } } : false,
73
+ tick: showScale ? { fill: chunkLT3UC65O_cjs.MUTED, style: { fontSize: chunkG4WOPX4D_cjs.TEXT_SIZE } } : false,
74
74
  axisLine: false
75
75
  }
76
76
  ),
77
- legendVisible && /* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { ...chunkGZRMVE4X_cjs.legendProps(legendPosition, hidden) }),
77
+ legendVisible && /* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { ...chunkRCDTBZC2_cjs.legendProps(legendPosition, hidden) }),
78
78
  /* @__PURE__ */ jsxRuntime.jsx(
79
79
  recharts.Tooltip,
80
80
  {
@@ -1,11 +1,11 @@
1
1
  "use client";
2
- import { useHiddenSeries, legendProps } from './chunk-6ALKZLN2.js';
2
+ import { useHiddenSeries, legendProps } from './chunk-4AKHZNWP.js';
3
3
  import { useElementWidth } from './chunk-AOSO5QHL.js';
4
4
  import { ANIMATION } from './chunk-5C2RLJYZ.js';
5
- import { AXIS, TEXT_SIZE } from './chunk-RILUG7JB.js';
5
+ import { AXIS, TEXT_SIZE } from './chunk-DI2FBGKM.js';
6
6
  import { ChartTooltip } from './chunk-VIOSQN4Z.js';
7
7
  import { hasNoData, seriesKey, toRows } from './chunk-UJIV5PVI.js';
8
- import { ChartEmpty, frameProps } from './chunk-3N43QT36.js';
8
+ import { ChartEmpty, frameProps } from './chunk-56WD3OHA.js';
9
9
  import { GRID, MUTED, BORDER, seriesColor } from './chunk-UATB2IRY.js';
10
10
  import { RadarChart as RadarChart$1, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Legend, Tooltip, Radar } from 'recharts';
11
11
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -5,7 +5,7 @@ var chunkAAYHG7YK_cjs = require('./chunk-AAYHG7YK.cjs');
5
5
  var chunkX3YZP5WF_cjs = require('./chunk-X3YZP5WF.cjs');
6
6
  var chunkTYQWZR3S_cjs = require('./chunk-TYQWZR3S.cjs');
7
7
  var chunkT3K6Q34U_cjs = require('./chunk-T3K6Q34U.cjs');
8
- var chunk6NRRABPF_cjs = require('./chunk-6NRRABPF.cjs');
8
+ var chunkSR2ESX3R_cjs = require('./chunk-SR2ESX3R.cjs');
9
9
  var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
10
10
  var react = require('react');
11
11
  var recharts = require('recharts');
@@ -37,7 +37,7 @@ var RadialBarChart = ({
37
37
  const [active, setActive] = react.useState();
38
38
  const name = ariaLabel ?? `Radial bar chart: ${labels.join(", ")}`;
39
39
  if (series.length === 0) {
40
- return /* @__PURE__ */ jsxRuntime.jsx(chunk6NRRABPF_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
40
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkSR2ESX3R_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
41
41
  }
42
42
  const rings = labels.map((label, i) => ({
43
43
  name: label,
@@ -50,7 +50,7 @@ var RadialBarChart = ({
50
50
  return /* @__PURE__ */ jsxRuntime.jsxs(
51
51
  recharts.RadialBarChart,
52
52
  {
53
- ...chunk6NRRABPF_cjs.frameProps({ height, width, ariaLabel: name }),
53
+ ...chunkSR2ESX3R_cjs.frameProps({ height, width, ariaLabel: name }),
54
54
  data: rings,
55
55
  startAngle: 90,
56
56
  endAngle: -270,
@@ -3,7 +3,7 @@ import { percent } from './chunk-OCD6JIIX.js';
3
3
  import { CenterText } from './chunk-URNXLVSK.js';
4
4
  import { ANIMATION } from './chunk-5C2RLJYZ.js';
5
5
  import { TooltipCard } from './chunk-VIOSQN4Z.js';
6
- import { ChartEmpty, frameProps } from './chunk-3N43QT36.js';
6
+ import { ChartEmpty, frameProps } from './chunk-56WD3OHA.js';
7
7
  import { seriesColor, TRACK } from './chunk-UATB2IRY.js';
8
8
  import { useState } from 'react';
9
9
  import { RadialBarChart as RadialBarChart$1, PolarAngleAxis, PolarRadiusAxis, RadialBar, Tooltip } from 'recharts';
@@ -2,13 +2,13 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkF2PMFYJ5_cjs = require('./chunk-F2PMFYJ5.cjs');
5
- var chunkZ4LZFMDH_cjs = require('./chunk-Z4LZFMDH.cjs');
6
- var chunkGZRMVE4X_cjs = require('./chunk-GZRMVE4X.cjs');
5
+ var chunkXUGQ6VXO_cjs = require('./chunk-XUGQ6VXO.cjs');
6
+ var chunkRCDTBZC2_cjs = require('./chunk-RCDTBZC2.cjs');
7
7
  var chunkTYQWZR3S_cjs = require('./chunk-TYQWZR3S.cjs');
8
- var chunkRLHGPHC7_cjs = require('./chunk-RLHGPHC7.cjs');
8
+ var chunkG4WOPX4D_cjs = require('./chunk-G4WOPX4D.cjs');
9
9
  var chunkT3K6Q34U_cjs = require('./chunk-T3K6Q34U.cjs');
10
10
  var chunkK3R7JGOW_cjs = require('./chunk-K3R7JGOW.cjs');
11
- var chunk6NRRABPF_cjs = require('./chunk-6NRRABPF.cjs');
11
+ var chunkSR2ESX3R_cjs = require('./chunk-SR2ESX3R.cjs');
12
12
  var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
13
13
  var recharts = require('recharts');
14
14
  var jsxRuntime = require('react/jsx-runtime');
@@ -71,7 +71,7 @@ var SeriesLegend = ({
71
71
  hidden,
72
72
  onToggle,
73
73
  column
74
- }) => /* @__PURE__ */ jsxRuntime.jsx(chunkGZRMVE4X_cjs.ChartLegend, { payload: entries, hidden, onToggle, column });
74
+ }) => /* @__PURE__ */ jsxRuntime.jsx(chunkRCDTBZC2_cjs.ChartLegend, { payload: entries, hidden, onToggle, column });
75
75
  var RangeBarChart = ({
76
76
  series,
77
77
  groupRows = false,
@@ -89,12 +89,12 @@ var RangeBarChart = ({
89
89
  height = 320,
90
90
  width
91
91
  }) => {
92
- const hidden = chunkGZRMVE4X_cjs.useHiddenSeries();
93
- const axis = chunkRLHGPHC7_cjs.useAxis();
92
+ const hidden = chunkRCDTBZC2_cjs.useHiddenSeries();
93
+ const axis = chunkG4WOPX4D_cjs.useAxis();
94
94
  const categoryKeys = chunkF2PMFYJ5_cjs.useCategoryKeys("vertical");
95
95
  const name = ariaLabel ?? `Range chart: ${series.map((s) => s.name).join(", ")}`;
96
96
  if (chunkK3R7JGOW_cjs.hasNoData(series)) {
97
- return /* @__PURE__ */ jsxRuntime.jsx(chunk6NRRABPF_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
97
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkSR2ESX3R_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
98
98
  }
99
99
  const categories = [...new Set(series.flatMap((s) => s.data.map((p) => p.x)))];
100
100
  const all = series.flatMap((s) => s.data.flatMap((p) => p.y));
@@ -137,7 +137,7 @@ var RangeBarChart = ({
137
137
  recharts.BarChart,
138
138
  {
139
139
  ref: categoryKeys,
140
- ...chunk6NRRABPF_cjs.frameProps({ height, width, ariaLabel: name }),
140
+ ...chunkSR2ESX3R_cjs.frameProps({ height, width, ariaLabel: name }),
141
141
  data: rows,
142
142
  layout: "vertical",
143
143
  margin: { top: 4, right: 16, bottom: 0, left: 0 },
@@ -153,14 +153,14 @@ var RangeBarChart = ({
153
153
  ticks,
154
154
  tickFormatter: tickLabel,
155
155
  ...axis,
156
- ...chunkRLHGPHC7_cjs.xAxisTitle(xTitle)
156
+ ...chunkG4WOPX4D_cjs.xAxisTitle(xTitle)
157
157
  }
158
158
  ),
159
- /* @__PURE__ */ jsxRuntime.jsx(recharts.YAxis, { type: "category", dataKey: "category", width: "auto", ...axis, ...chunkRLHGPHC7_cjs.yAxisTitle(yTitle) }),
159
+ /* @__PURE__ */ jsxRuntime.jsx(recharts.YAxis, { type: "category", dataKey: "category", width: "auto", ...axis, ...chunkG4WOPX4D_cjs.yAxisTitle(yTitle) }),
160
160
  (showLegend ?? series.length > 1) && /* @__PURE__ */ jsxRuntime.jsx(
161
161
  recharts.Legend,
162
162
  {
163
- ...chunkGZRMVE4X_cjs.legendProps(legendPosition, hidden),
163
+ ...chunkRCDTBZC2_cjs.legendProps(legendPosition, hidden),
164
164
  content: /* @__PURE__ */ jsxRuntime.jsx(
165
165
  SeriesLegend,
166
166
  {
@@ -206,7 +206,7 @@ var RangeBarChart = ({
206
206
  },
207
207
  chunkK3R7JGOW_cjs.seriesKey(index)
208
208
  )),
209
- chunkZ4LZFMDH_cjs.referenceMarks({ referenceLines, referenceBands, axis: "x" }),
209
+ chunkXUGQ6VXO_cjs.referenceMarks({ referenceLines, referenceBands, axis: "x" }),
210
210
  children
211
211
  ]
212
212
  }
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { useCategoryKeys } from './chunk-FUZW3H5X.js';
3
- import { referenceMarks } from './chunk-SGG7XKOY.js';
4
- import { useHiddenSeries, legendProps, ChartLegend } from './chunk-6ALKZLN2.js';
3
+ import { referenceMarks } from './chunk-ESVGCUJN.js';
4
+ import { useHiddenSeries, legendProps, ChartLegend } from './chunk-4AKHZNWP.js';
5
5
  import { ANIMATION } from './chunk-5C2RLJYZ.js';
6
- import { useAxis, xAxisTitle, yAxisTitle } from './chunk-RILUG7JB.js';
6
+ import { useAxis, xAxisTitle, yAxisTitle } from './chunk-DI2FBGKM.js';
7
7
  import { TooltipCard } from './chunk-VIOSQN4Z.js';
8
8
  import { hasNoData, seriesKey } from './chunk-UJIV5PVI.js';
9
- import { ChartEmpty, frameProps } from './chunk-3N43QT36.js';
9
+ import { ChartEmpty, frameProps } from './chunk-56WD3OHA.js';
10
10
  import { GRID, BORDER, seriesColor } from './chunk-UATB2IRY.js';
11
11
  import { BarChart, CartesianGrid, XAxis, YAxis, Legend, Tooltip, Bar } from 'recharts';
12
12
  import { jsx, jsxs } from 'react/jsx-runtime';