@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.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -1
- package/dist/BarChart.cjs +18 -18
- package/dist/BarChart.js +5 -5
- package/dist/BoxPlotChart.cjs +18 -18
- package/dist/BoxPlotChart.js +5 -5
- package/dist/BumpChart.cjs +6 -6
- package/dist/BumpChart.js +3 -3
- package/dist/CalendarChart.cjs +9 -7
- package/dist/CalendarChart.cjs.map +1 -1
- package/dist/CalendarChart.js +5 -3
- package/dist/CalendarChart.js.map +1 -1
- package/dist/DonutChart.cjs +8 -8
- package/dist/DonutChart.js +3 -3
- package/dist/FunnelChart.cjs +8 -6
- package/dist/FunnelChart.cjs.map +1 -1
- package/dist/FunnelChart.js +4 -2
- package/dist/FunnelChart.js.map +1 -1
- package/dist/GradientRadial.cjs +3 -3
- package/dist/GradientRadial.js +2 -2
- package/dist/HeatmapChart.cjs +8 -6
- package/dist/HeatmapChart.cjs.map +1 -1
- package/dist/HeatmapChart.js +5 -3
- package/dist/HeatmapChart.js.map +1 -1
- package/dist/LineAreaChart.cjs +13 -13
- package/dist/LineAreaChart.js +4 -4
- package/dist/MixedChart.cjs +16 -16
- package/dist/MixedChart.js +5 -5
- package/dist/RadarChart.cjs +9 -9
- package/dist/RadarChart.js +3 -3
- package/dist/RadialBarChart.cjs +3 -3
- package/dist/RadialBarChart.js +1 -1
- package/dist/RangeBarChart.cjs +13 -13
- package/dist/RangeBarChart.js +4 -4
- package/dist/RealtimeChart.cjs +8 -8
- package/dist/RealtimeChart.js +2 -2
- package/dist/ScatterChart.cjs +12 -12
- package/dist/ScatterChart.js +4 -4
- package/dist/SemiCircleGauge.cjs +2 -2
- package/dist/SemiCircleGauge.js +1 -1
- package/dist/Sparkline.cjs +4 -4
- package/dist/Sparkline.js +1 -1
- package/dist/StrokedGauge.cjs +3 -3
- package/dist/StrokedGauge.js +2 -2
- package/dist/TreemapChart.cjs +2 -2
- package/dist/TreemapChart.js +1 -1
- package/dist/WaterfallChart.cjs +12 -12
- package/dist/WaterfallChart.js +3 -3
- package/dist/{chunk-6ALKZLN2.js → chunk-4AKHZNWP.js} +3 -3
- package/dist/{chunk-6ALKZLN2.js.map → chunk-4AKHZNWP.js.map} +1 -1
- package/dist/{chunk-3N43QT36.js → chunk-56WD3OHA.js} +6 -4
- package/dist/chunk-56WD3OHA.js.map +1 -0
- package/dist/{chunk-YWYF5CCJ.js → chunk-6FGJZBTC.js} +3 -3
- package/dist/{chunk-YWYF5CCJ.js.map → chunk-6FGJZBTC.js.map} +1 -1
- package/dist/{chunk-MN4CDVOS.cjs → chunk-CMBNNLIV.cjs} +4 -4
- package/dist/{chunk-MN4CDVOS.cjs.map → chunk-CMBNNLIV.cjs.map} +1 -1
- package/dist/{chunk-RILUG7JB.js → chunk-DI2FBGKM.js} +3 -3
- package/dist/{chunk-RILUG7JB.js.map → chunk-DI2FBGKM.js.map} +1 -1
- package/dist/{chunk-SGG7XKOY.js → chunk-ESVGCUJN.js} +3 -3
- package/dist/{chunk-SGG7XKOY.js.map → chunk-ESVGCUJN.js.map} +1 -1
- package/dist/{chunk-RLHGPHC7.cjs → chunk-G4WOPX4D.cjs} +4 -4
- package/dist/{chunk-RLHGPHC7.cjs.map → chunk-G4WOPX4D.cjs.map} +1 -1
- package/dist/{chunk-GZRMVE4X.cjs → chunk-RCDTBZC2.cjs} +4 -4
- package/dist/{chunk-GZRMVE4X.cjs.map → chunk-RCDTBZC2.cjs.map} +1 -1
- package/dist/{chunk-6NRRABPF.cjs → chunk-SR2ESX3R.cjs} +6 -4
- package/dist/chunk-SR2ESX3R.cjs.map +1 -0
- package/dist/{chunk-ICL5K2CW.js → chunk-UL3SNXQR.js} +3 -3
- package/dist/{chunk-ICL5K2CW.js.map → chunk-UL3SNXQR.js.map} +1 -1
- package/dist/{chunk-6BKLL7LZ.cjs → chunk-XMFBVMW7.cjs} +4 -4
- package/dist/{chunk-6BKLL7LZ.cjs.map → chunk-XMFBVMW7.cjs.map} +1 -1
- package/dist/{chunk-Z4LZFMDH.cjs → chunk-XUGQ6VXO.cjs} +4 -4
- package/dist/{chunk-Z4LZFMDH.cjs.map → chunk-XUGQ6VXO.cjs.map} +1 -1
- package/dist/{chunk-HMH6DI7U.js → chunk-YMRNTIOK.js} +3 -3
- package/dist/{chunk-HMH6DI7U.js.map → chunk-YMRNTIOK.js.map} +1 -1
- package/dist/{chunk-TPH5T3DA.cjs → chunk-ZWHCUYIN.cjs} +4 -4
- package/dist/{chunk-TPH5T3DA.cjs.map → chunk-ZWHCUYIN.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-3N43QT36.js.map +0 -1
- package/dist/chunk-6NRRABPF.cjs.map +0 -1
package/dist/GradientRadial.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { RadialGauge } from './chunk-
|
|
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-
|
|
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';
|
package/dist/HeatmapChart.cjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkZWHCUYIN_cjs = require('./chunk-ZWHCUYIN.cjs');
|
|
5
5
|
require('./chunk-DBZQI4HM.cjs');
|
|
6
|
-
var
|
|
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
|
|
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:
|
|
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(
|
|
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
|
-
|
|
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"]}
|
package/dist/HeatmapChart.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { HeatGrid } from './chunk-
|
|
2
|
+
import { HeatGrid } from './chunk-UL3SNXQR.js';
|
|
3
3
|
import './chunk-BFEDLXVW.js';
|
|
4
|
-
import { TEXT_SIZE } from './chunk-
|
|
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-
|
|
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%",
|
package/dist/HeatmapChart.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/HeatmapChart.tsx"],"names":[],"mappings":";;;;;;;;;;AAqDA,IAAM,UAAA,GAAa,CAAC,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA;AAGhD,IAAM,QAAA,GAAW,CAAC,KAAA,KAA0B;AAC1C,EAAA,MAAM,YAAY,EAAA,IAAM,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,GAAI,SAAA,IAAa,KAAK,CAAA,IAAK,EAAA;AAC/D,EAAA,OAAO,IAAA,GAAO,SAAA;AAChB,CAAA;AAGA,IAAM,QAAQ,CAAC,KAAA,KAAkB,OAAO,KAAA,CAAM,WAAA,CAAY,EAAE,CAAC,CAAA;AAG7D,IAAM,UAAA,GAAa,CAAC,MAAA,EAAkB,MAAA,KAA0C;AAC9E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAC5C,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,IAAK,OAAO,MAAA,KAAW,CAAA,SAAU,EAAC;AACxD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAClD,EAAA,IAAI,IAAA,GAAO,QAAA,CAAA,CAAU,GAAA,GAAM,GAAA,IAAO,MAAA,CAAO,UAAU,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,CAAA;AACrE,EAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAA,GAAI,IAAA;AAErC,EAAA,OAAO,KAAA,GAAQ,IAAA,GAAO,MAAA,CAAO,MAAA,GAAS,GAAA,EAAK;AACzC,IAAA,IAAA,GAAO,QAAA,CAAS,OAAO,KAAK,CAAA;AAC5B,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAA,GAAI,IAAA;AAAA,EACnC;AACA,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,MAAO;AAAA,IAC/B,IAAA,EAAM,KAAA,CAAM,KAAA,GAAQ,IAAA,GAAO,CAAC,CAAA;AAAA,IAC5B,EAAA,EAAI,KAAA,CAAM,KAAA,GAAQ,IAAA,IAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,IAChC;AAAA,GACF,CAAE,CAAA;AACJ,CAAA;AAGA,IAAM,UAAU,CAAC,KAAA,EAAe,WAC9B,CAAC,GAAG,MAAM,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,IAAS,MAAM,IAAA,IAAQ,KAAA,IAAS,MAAM,EAAE,CAAA;AAEhF,IAAM,WAAA,GAAc,CAAC,QAAA,KAAiD;AACpE,EAAA,MAAM,MAAA,GAAS,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA;AACnD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,SAAS,QAAA,GAAW,KAAA;AAAA,IACnC,QAAA,EAAU,MAAA;AAAA,IACV,GAAA,EAAK,SAAS,UAAA,GAAa,cAAA;AAAA,IAC3B,MAAA,EAAQ,CAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,SAAA,EAAW,MAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,KAAA,EAAO;AAAA,GACT;AACF,CAAA;AAEA,IAAM,KAAA,GAAoD;AAAA,EACxD,GAAA,EAAK,EAAE,aAAA,EAAe,QAAA,EAAS;AAAA,EAC/B,MAAA,EAAQ,EAAE,aAAA,EAAe,gBAAA,EAAiB;AAAA,EAC1C,IAAA,EAAM,EAAE,aAAA,EAAe,KAAA,EAAM;AAAA,EAC7B,KAAA,EAAO,EAAE,aAAA,EAAe,aAAA;AAC1B,CAAA;AAEO,IAAM,eAAe,CAAC;AAAA,EAC3B,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc,MAAA;AAAA,EACd,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,IAAA;AAAA,EACb,cAAA,GAAiB,KAAA;AAAA,EACjB,YAAA,GAAe,SAAA;AAAA,EACf,SAAA;AAAA,EACA,MAAA,GAAS,GAAA;AAAA,EACT;AACF,CAAA,KAAyB;AACvB,EAAA,MAAM,IAAA,GAAO,SAAA,IAAa,CAAA,SAAA,EAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAC1E,EAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AACrB,IAAA,2BAAQ,UAAA,EAAA,EAAW,OAAA,EAAS,cAAc,SAAA,EAAW,IAAA,EAAM,QAAgB,KAAA,EAAc,CAAA;AAAA,EAC3F;AACA,EAAA,MAAM,eACJ,MAAA,IACA,UAAA;AAAA,IACE,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,IAC5B,MAAA,IAAU;AAAA,GACZ,EACA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IAChB,GAAG,KAAA;AAAA,IACH,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,CAAA,EAAG,WAAA,CAAY,KAAA,CAAM,IAAI,CAAC,CAAA,QAAA,EAAM,WAAA,CAAY,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,GAC3E,CAAE,CAAA;AACF,EAAA,MAAM,QAAQ,MAAA,CAAO,OAAA;AAAA,IAAQ,CAAC,CAAA,EAAG,GAAA,KAC/B,CAAA,CAAE,IAAA,CAAK,OAAA;AAAA,MAAQ,CAAC,KAAA,EAAO,MAAA,KACrB,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GACjB;AAAA,QACE;AAAA,UACE,GAAA;AAAA,UACA,MAAA;AAAA,UACA,OAAO,OAAA,CAAQ,KAAA,EAAO,WAAW,CAAA,EAAG,KAAA,IAAS,YAAY,GAAG,CAAA;AAAA,UAC5D,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,MAAM,KAAK,MAAM,CAAA;AAAA,UAC1C,OAAO,CAAA,CAAE,IAAA;AAAA,UACT,KAAA,EAAO,YAAY,KAAK,CAAA;AAAA,UACxB,IAAA,EAAM,UAAA,GAAa,WAAA,CAAY,KAAK,CAAA,GAAI;AAAA;AAC1C,UAEF;AAAC;AACP,GACF;AACA,EAAA,MAAM,MAAA,GAAS,UAAA,oBACb,GAAA,CAAC,IAAA,EAAA,EAAG,kBAAA,EAAiB,IAAG,KAAA,EAAO,WAAA,CAAY,cAAc,CAAA,EACtD,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBACvB,IAAA,CAAC,IAAA,EAAA,EAAW,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,UAAA,EAAW,EAC1E,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,UAAA;AAAA,UACP,MAAA,EAAQ,UAAA;AAAA,UACR,YAAA,EAAc,CAAA;AAAA,UACd,YAAY,KAAA,CAAM;AAAA;AACpB;AAAA,KACF;AAAA,IACC,KAAA,CAAM;AAAA,GAAA,EAAA,EAVA,CAWT,CACD,CAAA,EACH,CAAA;AAEF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK,MAAA;AAAA,QACL,OAAO,KAAA,IAAS,MAAA;AAAA,QAChB,MAAA;AAAA,QACA,QAAA,EAAU,MAAA;AAAA,QACV,GAAG,MAAM,cAAc;AAAA,OACzB;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,MAAA;AAAA,wBACD,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,SAAS,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE,EACrD,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,MAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,YAC9B,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AAAA,YAC9B,KAAA;AAAA,YACA,SAAA,EAAW,IAAA;AAAA,YACX,MAAA;AAAA,YACA;AAAA;AAAA,SACF,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","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"]}
|
package/dist/LineAreaChart.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
var
|
|
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
|
|
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
|
|
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 =
|
|
39
|
-
const axis =
|
|
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(
|
|
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
|
-
...
|
|
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, { ...
|
|
57
|
-
/* @__PURE__ */ jsxRuntime.jsx(recharts.XAxis, { dataKey: "category", ...axis, ...
|
|
58
|
-
/* @__PURE__ */ jsxRuntime.jsx(recharts.YAxis, { width: "auto", tickFormatter: formatValue, ...axis, ...
|
|
59
|
-
legendVisible && /* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { ...
|
|
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
|
-
|
|
89
|
+
chunkXUGQ6VXO_cjs.referenceMarks({ referenceLines, referenceBands }),
|
|
90
90
|
children
|
|
91
91
|
]
|
|
92
92
|
}
|
package/dist/LineAreaChart.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { referenceMarks } from './chunk-
|
|
3
|
-
import { useHiddenSeries, legendProps } from './chunk-
|
|
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-
|
|
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-
|
|
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';
|
package/dist/MixedChart.cjs
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunkGVTMZYOM_cjs = require('./chunk-GVTMZYOM.cjs');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
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
|
|
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
|
|
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:
|
|
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 =
|
|
52
|
-
const axis =
|
|
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(
|
|
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
|
-
...
|
|
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, { ...
|
|
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
|
-
...
|
|
104
|
-
...
|
|
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" ?
|
|
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, { ...
|
|
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
|
-
|
|
186
|
+
chunkXUGQ6VXO_cjs.referenceMarks({ referenceLines, referenceBands, axisId: sides[0] }),
|
|
187
187
|
children
|
|
188
188
|
]
|
|
189
189
|
}
|
package/dist/MixedChart.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { roundedBarShape, isOuterInStack } from './chunk-GDZLYYL2.js';
|
|
3
|
-
import { referenceMarks } from './chunk-
|
|
4
|
-
import { categoryAxis } from './chunk-
|
|
5
|
-
import { useHiddenSeries, legendProps } from './chunk-
|
|
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-
|
|
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-
|
|
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';
|
package/dist/RadarChart.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
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
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
-
...
|
|
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:
|
|
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:
|
|
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, { ...
|
|
77
|
+
legendVisible && /* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, { ...chunkRCDTBZC2_cjs.legendProps(legendPosition, hidden) }),
|
|
78
78
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
79
79
|
recharts.Tooltip,
|
|
80
80
|
{
|
package/dist/RadarChart.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useHiddenSeries, legendProps } from './chunk-
|
|
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-
|
|
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-
|
|
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';
|
package/dist/RadialBarChart.cjs
CHANGED
|
@@ -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
|
|
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(
|
|
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
|
-
...
|
|
53
|
+
...chunkSR2ESX3R_cjs.frameProps({ height, width, ariaLabel: name }),
|
|
54
54
|
data: rings,
|
|
55
55
|
startAngle: 90,
|
|
56
56
|
endAngle: -270,
|
package/dist/RadialBarChart.js
CHANGED
|
@@ -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-
|
|
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';
|
package/dist/RangeBarChart.cjs
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunkF2PMFYJ5_cjs = require('./chunk-F2PMFYJ5.cjs');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
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
|
|
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
|
|
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(
|
|
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 =
|
|
93
|
-
const axis =
|
|
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(
|
|
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
|
-
...
|
|
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
|
-
...
|
|
156
|
+
...chunkG4WOPX4D_cjs.xAxisTitle(xTitle)
|
|
157
157
|
}
|
|
158
158
|
),
|
|
159
|
-
/* @__PURE__ */ jsxRuntime.jsx(recharts.YAxis, { type: "category", dataKey: "category", width: "auto", ...axis, ...
|
|
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
|
-
...
|
|
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
|
-
|
|
209
|
+
chunkXUGQ6VXO_cjs.referenceMarks({ referenceLines, referenceBands, axis: "x" }),
|
|
210
210
|
children
|
|
211
211
|
]
|
|
212
212
|
}
|
package/dist/RangeBarChart.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useCategoryKeys } from './chunk-FUZW3H5X.js';
|
|
3
|
-
import { referenceMarks } from './chunk-
|
|
4
|
-
import { useHiddenSeries, legendProps, ChartLegend } from './chunk-
|
|
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-
|
|
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-
|
|
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';
|