@sckyzo/cosmos-charts 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +91 -0
- package/README.md +107 -22
- package/THIRD_PARTY_NOTICES.md +81 -0
- package/dist/BarChart.cjs +137 -0
- package/dist/BarChart.cjs.map +1 -0
- package/dist/BarChart.js +135 -0
- package/dist/BarChart.js.map +1 -0
- package/dist/BoxPlotChart.cjs +214 -0
- package/dist/BoxPlotChart.cjs.map +1 -0
- package/dist/BoxPlotChart.js +212 -0
- package/dist/BoxPlotChart.js.map +1 -0
- package/dist/BumpChart.cjs +328 -0
- package/dist/BumpChart.cjs.map +1 -0
- package/dist/BumpChart.js +326 -0
- package/dist/BumpChart.js.map +1 -0
- package/dist/CalendarChart.cjs +216 -0
- package/dist/CalendarChart.cjs.map +1 -0
- package/dist/CalendarChart.js +214 -0
- package/dist/CalendarChart.js.map +1 -0
- package/dist/DonutChart.cjs +122 -0
- package/dist/DonutChart.cjs.map +1 -0
- package/dist/DonutChart.js +120 -0
- package/dist/DonutChart.js.map +1 -0
- package/dist/FunnelChart.cjs +422 -0
- package/dist/FunnelChart.cjs.map +1 -0
- package/dist/FunnelChart.js +420 -0
- package/dist/FunnelChart.js.map +1 -0
- package/dist/GradientRadial.cjs +51 -0
- package/dist/GradientRadial.cjs.map +1 -0
- package/dist/GradientRadial.js +49 -0
- package/dist/GradientRadial.js.map +1 -0
- package/dist/HeatmapChart.cjs +146 -0
- package/dist/HeatmapChart.cjs.map +1 -0
- package/dist/HeatmapChart.js +144 -0
- package/dist/HeatmapChart.js.map +1 -0
- package/dist/LineAreaChart.cjs +98 -0
- package/dist/LineAreaChart.cjs.map +1 -0
- package/dist/LineAreaChart.js +96 -0
- package/dist/LineAreaChart.js.map +1 -0
- package/dist/MixedChart.cjs +195 -0
- package/dist/MixedChart.cjs.map +1 -0
- package/dist/MixedChart.js +193 -0
- package/dist/MixedChart.js.map +1 -0
- package/dist/RadarChart.cjs +109 -0
- package/dist/RadarChart.cjs.map +1 -0
- package/dist/RadarChart.js +107 -0
- package/dist/RadarChart.js.map +1 -0
- package/dist/RadialBarChart.cjs +99 -0
- package/dist/RadialBarChart.cjs.map +1 -0
- package/dist/RadialBarChart.js +97 -0
- package/dist/RadialBarChart.js.map +1 -0
- package/dist/RangeBarChart.cjs +218 -0
- package/dist/RangeBarChart.cjs.map +1 -0
- package/dist/RangeBarChart.js +216 -0
- package/dist/RangeBarChart.js.map +1 -0
- package/dist/RealtimeChart.cjs +173 -0
- package/dist/RealtimeChart.cjs.map +1 -0
- package/dist/RealtimeChart.js +171 -0
- package/dist/RealtimeChart.js.map +1 -0
- package/dist/ScatterChart.cjs +134 -0
- package/dist/ScatterChart.cjs.map +1 -0
- package/dist/ScatterChart.js +131 -0
- package/dist/ScatterChart.js.map +1 -0
- package/dist/SemiCircleGauge.cjs +142 -0
- package/dist/SemiCircleGauge.cjs.map +1 -0
- package/dist/SemiCircleGauge.js +140 -0
- package/dist/SemiCircleGauge.js.map +1 -0
- package/dist/Sparkline.cjs +117 -0
- package/dist/Sparkline.cjs.map +1 -0
- package/dist/Sparkline.js +115 -0
- package/dist/Sparkline.js.map +1 -0
- package/dist/StrokedGauge.cjs +94 -0
- package/dist/StrokedGauge.cjs.map +1 -0
- package/dist/StrokedGauge.js +92 -0
- package/dist/StrokedGauge.js.map +1 -0
- package/dist/TreemapChart.cjs +263 -0
- package/dist/TreemapChart.cjs.map +1 -0
- package/dist/TreemapChart.js +261 -0
- package/dist/TreemapChart.js.map +1 -0
- package/dist/WaterfallChart.cjs +235 -0
- package/dist/WaterfallChart.cjs.map +1 -0
- package/dist/WaterfallChart.js +233 -0
- package/dist/WaterfallChart.js.map +1 -0
- package/dist/WorldMap.cjs +2088 -0
- package/dist/WorldMap.cjs.map +1 -0
- package/dist/WorldMap.js +603 -0
- package/dist/WorldMap.js.map +1 -0
- package/dist/chunk-3N43QT36.js +60 -0
- package/dist/chunk-3N43QT36.js.map +1 -0
- package/dist/chunk-5C2RLJYZ.js +11 -0
- package/dist/chunk-5C2RLJYZ.js.map +1 -0
- package/dist/chunk-6ALKZLN2.js +127 -0
- package/dist/chunk-6ALKZLN2.js.map +1 -0
- package/dist/chunk-6BKLL7LZ.cjs +30 -0
- package/dist/chunk-6BKLL7LZ.cjs.map +1 -0
- package/dist/chunk-6NRRABPF.cjs +64 -0
- package/dist/chunk-6NRRABPF.cjs.map +1 -0
- package/dist/chunk-AAYHG7YK.cjs +30 -0
- package/dist/chunk-AAYHG7YK.cjs.map +1 -0
- package/dist/chunk-AOSO5QHL.js +19 -0
- package/dist/chunk-AOSO5QHL.js.map +1 -0
- package/dist/chunk-BFEDLXVW.js +12 -0
- package/dist/chunk-BFEDLXVW.js.map +1 -0
- package/dist/chunk-DBZQI4HM.cjs +14 -0
- package/dist/chunk-DBZQI4HM.cjs.map +1 -0
- package/dist/chunk-F2PMFYJ5.cjs +40 -0
- package/dist/chunk-F2PMFYJ5.cjs.map +1 -0
- package/dist/chunk-FUZW3H5X.js +38 -0
- package/dist/chunk-FUZW3H5X.js.map +1 -0
- package/dist/chunk-GDZLYYL2.js +27 -0
- package/dist/chunk-GDZLYYL2.js.map +1 -0
- package/dist/chunk-GVTMZYOM.cjs +30 -0
- package/dist/chunk-GVTMZYOM.cjs.map +1 -0
- package/dist/chunk-GZRMVE4X.cjs +131 -0
- package/dist/chunk-GZRMVE4X.cjs.map +1 -0
- package/dist/chunk-HMH6DI7U.js +27 -0
- package/dist/chunk-HMH6DI7U.js.map +1 -0
- package/dist/chunk-ICL5K2CW.js +280 -0
- package/dist/chunk-ICL5K2CW.js.map +1 -0
- package/dist/chunk-IW6EWB26.cjs +21 -0
- package/dist/chunk-IW6EWB26.cjs.map +1 -0
- package/dist/chunk-K3R7JGOW.cjs +18 -0
- package/dist/chunk-K3R7JGOW.cjs.map +1 -0
- package/dist/chunk-LT3UC65O.cjs +68 -0
- package/dist/chunk-LT3UC65O.cjs.map +1 -0
- package/dist/chunk-MN4CDVOS.cjs +63 -0
- package/dist/chunk-MN4CDVOS.cjs.map +1 -0
- package/dist/chunk-OCD6JIIX.js +23 -0
- package/dist/chunk-OCD6JIIX.js.map +1 -0
- package/dist/chunk-RILUG7JB.js +44 -0
- package/dist/chunk-RILUG7JB.js.map +1 -0
- package/dist/chunk-RLHGPHC7.cjs +51 -0
- package/dist/chunk-RLHGPHC7.cjs.map +1 -0
- package/dist/chunk-SGG7XKOY.js +58 -0
- package/dist/chunk-SGG7XKOY.js.map +1 -0
- package/dist/chunk-T3K6Q34U.cjs +82 -0
- package/dist/chunk-T3K6Q34U.cjs.map +1 -0
- package/dist/chunk-TPH5T3DA.cjs +282 -0
- package/dist/chunk-TPH5T3DA.cjs.map +1 -0
- package/dist/chunk-TYQWZR3S.cjs +13 -0
- package/dist/chunk-TYQWZR3S.cjs.map +1 -0
- package/dist/chunk-UATB2IRY.js +51 -0
- package/dist/chunk-UATB2IRY.js.map +1 -0
- package/dist/chunk-UJIV5PVI.js +13 -0
- package/dist/chunk-UJIV5PVI.js.map +1 -0
- package/dist/chunk-URNXLVSK.js +44 -0
- package/dist/chunk-URNXLVSK.js.map +1 -0
- package/dist/chunk-VIOSQN4Z.js +79 -0
- package/dist/chunk-VIOSQN4Z.js.map +1 -0
- package/dist/chunk-X3YZP5WF.cjs +46 -0
- package/dist/chunk-X3YZP5WF.cjs.map +1 -0
- package/dist/chunk-YWYF5CCJ.js +61 -0
- package/dist/chunk-YWYF5CCJ.js.map +1 -0
- package/dist/chunk-Z4LZFMDH.cjs +60 -0
- package/dist/chunk-Z4LZFMDH.cjs.map +1 -0
- package/dist/index.cjs +154 -1166
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +470 -80
- package/dist/index.d.ts +470 -80
- package/dist/index.js +23 -1144
- package/dist/index.js.map +1 -1
- package/dist/theme.cjs +88 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.js +84 -0
- package/dist/theme.js.map +1 -0
- package/package.json +23 -12
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useHiddenSeries, legendProps } from './chunk-6ALKZLN2.js';
|
|
3
|
+
import { useElementWidth } from './chunk-AOSO5QHL.js';
|
|
4
|
+
import { ANIMATION } from './chunk-5C2RLJYZ.js';
|
|
5
|
+
import { AXIS, TEXT_SIZE } from './chunk-RILUG7JB.js';
|
|
6
|
+
import { ChartTooltip } from './chunk-VIOSQN4Z.js';
|
|
7
|
+
import { hasNoData, seriesKey, toRows } from './chunk-UJIV5PVI.js';
|
|
8
|
+
import { ChartEmpty, frameProps } from './chunk-3N43QT36.js';
|
|
9
|
+
import { GRID, MUTED, BORDER, seriesColor } from './chunk-UATB2IRY.js';
|
|
10
|
+
import { RadarChart as RadarChart$1, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Legend, Tooltip, Radar } from 'recharts';
|
|
11
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
12
|
+
|
|
13
|
+
// src/radarSize.ts
|
|
14
|
+
var NAME_BAND = 44;
|
|
15
|
+
var NAME_GAP = 14;
|
|
16
|
+
var NAME_CHAR = 6.5;
|
|
17
|
+
var LEGEND_ROW = 40;
|
|
18
|
+
var LEGEND_COLUMN = 120;
|
|
19
|
+
var MIN_SIZE = 40;
|
|
20
|
+
var radarSize = ({ height, width, categories, legend }) => {
|
|
21
|
+
const widest = Math.max(0, ...categories.map((name) => name.length)) * NAME_CHAR;
|
|
22
|
+
const vertical = height - NAME_BAND - (legend === "top" || legend === "bottom" ? LEGEND_ROW : 0);
|
|
23
|
+
const horizontal = width - 2 * (widest + NAME_GAP) - (legend === "left" || legend === "right" ? LEGEND_COLUMN : 0);
|
|
24
|
+
return Math.max(MIN_SIZE, Math.floor(Math.min(vertical, horizontal) / 2));
|
|
25
|
+
};
|
|
26
|
+
var RadarChart = ({
|
|
27
|
+
series,
|
|
28
|
+
categories,
|
|
29
|
+
colors,
|
|
30
|
+
formatValue,
|
|
31
|
+
showLegend,
|
|
32
|
+
legendPosition = "top",
|
|
33
|
+
max,
|
|
34
|
+
showScale = false,
|
|
35
|
+
emptyMessage = "No data",
|
|
36
|
+
ariaLabel,
|
|
37
|
+
children,
|
|
38
|
+
height = 340,
|
|
39
|
+
width
|
|
40
|
+
}) => {
|
|
41
|
+
const hidden = useHiddenSeries();
|
|
42
|
+
const { ref: box, width: boxWidth } = useElementWidth();
|
|
43
|
+
const name = ariaLabel ?? `Radar chart: ${series.map((s) => s.name).join(", ")}`;
|
|
44
|
+
if (hasNoData(series)) {
|
|
45
|
+
return /* @__PURE__ */ jsx(ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
|
|
46
|
+
}
|
|
47
|
+
const legendVisible = showLegend ?? series.length > 1;
|
|
48
|
+
const radius = typeof height === "number" && boxWidth ? radarSize({
|
|
49
|
+
height,
|
|
50
|
+
width: boxWidth,
|
|
51
|
+
categories,
|
|
52
|
+
legend: legendVisible ? legendPosition : void 0
|
|
53
|
+
}) : "70%";
|
|
54
|
+
return /* @__PURE__ */ jsx("div", { ref: box, style: { width: width ?? "100%", maxWidth: "100%" }, children: /* @__PURE__ */ jsxs(
|
|
55
|
+
RadarChart$1,
|
|
56
|
+
{
|
|
57
|
+
...frameProps({ height, width: "100%", ariaLabel: name }),
|
|
58
|
+
data: toRows(categories, series),
|
|
59
|
+
outerRadius: radius,
|
|
60
|
+
margin: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ jsx(PolarGrid, { stroke: GRID }),
|
|
63
|
+
/* @__PURE__ */ jsx(PolarAngleAxis, { dataKey: "category", tick: AXIS.tick, tickLine: false }),
|
|
64
|
+
/* @__PURE__ */ jsx(
|
|
65
|
+
PolarRadiusAxis,
|
|
66
|
+
{
|
|
67
|
+
angle: 90,
|
|
68
|
+
domain: [0, max ?? "auto"],
|
|
69
|
+
tickCount: 6,
|
|
70
|
+
tickFormatter: formatValue,
|
|
71
|
+
tick: showScale ? { fill: MUTED, style: { fontSize: TEXT_SIZE } } : false,
|
|
72
|
+
axisLine: false
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
legendVisible && /* @__PURE__ */ jsx(Legend, { ...legendProps(legendPosition, hidden) }),
|
|
76
|
+
/* @__PURE__ */ jsx(
|
|
77
|
+
Tooltip,
|
|
78
|
+
{
|
|
79
|
+
content: /* @__PURE__ */ jsx(ChartTooltip, { format: formatValue }),
|
|
80
|
+
cursor: { stroke: BORDER, strokeDasharray: "4 4" },
|
|
81
|
+
animationDuration: 150
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
series.map((s, i) => /* @__PURE__ */ jsx(
|
|
85
|
+
Radar,
|
|
86
|
+
{
|
|
87
|
+
name: s.name,
|
|
88
|
+
dataKey: seriesKey(i),
|
|
89
|
+
stroke: seriesColor(i, colors),
|
|
90
|
+
strokeWidth: 2,
|
|
91
|
+
fill: seriesColor(i, colors),
|
|
92
|
+
fillOpacity: 0.15,
|
|
93
|
+
dot: { r: 3, fill: seriesColor(i, colors), fillOpacity: 1, strokeWidth: 0 },
|
|
94
|
+
hide: hidden.hidden.has(seriesKey(i)),
|
|
95
|
+
...ANIMATION
|
|
96
|
+
},
|
|
97
|
+
seriesKey(i)
|
|
98
|
+
)),
|
|
99
|
+
children
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
) });
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export { RadarChart };
|
|
106
|
+
//# sourceMappingURL=RadarChart.js.map
|
|
107
|
+
//# sourceMappingURL=RadarChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/radarSize.ts","../src/RadarChart.tsx"],"names":["RechartsRadarChart"],"mappings":"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","file":"RadarChart.js","sourcesContent":["import type { ChartLegendPosition } from './types';\n\n// Recharts draws the axis names outside the outer polygon and does not make\n// room for them, so the radius is sized from the smaller side of the plot less\n// the room the names need (12px text): above and below the polygons, and beside\n// them.\nconst NAME_BAND = 44;\nconst NAME_GAP = 14;\nconst NAME_CHAR = 6.5;\n// What a legend takes from the plot, on the side it sits on.\nconst LEGEND_ROW = 40;\nconst LEGEND_COLUMN = 120;\nconst MIN_SIZE = 40;\n\ntype RadarSizeParams = {\n /** The height and width of the chart, in pixels. */\n height: number;\n width: number;\n categories: readonly string[];\n /** The side the legend sits on, if it is drawn. */\n legend?: ChartLegendPosition;\n};\n\n/**\n * The radius, in pixels, of the outer polygon of a radar: the largest one that\n * leaves room for the axis names around it in a chart of this size.\n */\nexport const radarSize = ({ height, width, categories, legend }: RadarSizeParams): number => {\n const widest = Math.max(0, ...categories.map((name) => name.length)) * NAME_CHAR;\n const vertical = height - NAME_BAND - (legend === 'top' || legend === 'bottom' ? LEGEND_ROW : 0);\n const horizontal =\n width - 2 * (widest + NAME_GAP) - (legend === 'left' || legend === 'right' ? LEGEND_COLUMN : 0);\n return Math.max(MIN_SIZE, Math.floor(Math.min(vertical, horizontal) / 2));\n};\n","import {\n Legend,\n PolarAngleAxis,\n PolarGrid,\n PolarRadiusAxis,\n Radar,\n RadarChart as RechartsRadarChart,\n Tooltip,\n} from 'recharts';\nimport { ANIMATION } from './core/animation';\nimport { AXIS, TEXT_SIZE } from './core/axes';\nimport { legendProps, useHiddenSeries } from './core/ChartLegend';\nimport { ChartTooltip } from './core/ChartTooltip';\nimport { BORDER, GRID, MUTED, seriesColor } from './core/colors';\nimport { hasNoData, seriesKey, toRows } from './core/data';\nimport { ChartEmpty, frameProps } from './core/frame';\nimport { radarSize } from './radarSize';\nimport { useElementWidth } from './core/useElementWidth';\nimport type { ChartEmptyProps, ChartLegendProps, ChartProps } from './types';\n\nexport type RadarChartProps = ChartProps &\n ChartEmptyProps &\n ChartLegendProps & {\n /** One polygon per series; one value per category, in the same order. */\n series: { name: string; data: number[] }[];\n /** The axes, clockwise from the top. */\n categories: string[];\n /** Override the default Cosmos palette. */\n colors?: string[];\n /** Format the scale labels and the tooltip values. */\n formatValue?: (value: number) => string;\n /** Show the legend (auto-true when 2+ series). */\n showLegend?: boolean;\n /** Top of the scale, e.g. 100 for scores. Default: rounded up from the data. */\n max?: number;\n /**\n * Write the scale on the polygons (0, 20 … 100). Default off: the labels sit on the\n * polygons and the tooltip gives the values. `max` and `formatValue` still apply.\n */\n showScale?: boolean;\n };\n\nexport const RadarChart = ({\n series,\n categories,\n colors,\n formatValue,\n showLegend,\n legendPosition = 'top',\n max,\n showScale = false,\n emptyMessage = 'No data',\n ariaLabel,\n children,\n height = 340,\n width,\n}: RadarChartProps) => {\n const hidden = useHiddenSeries();\n const { ref: box, width: boxWidth } = useElementWidth();\n const name = ariaLabel ?? `Radar chart: ${series.map((s) => s.name).join(', ')}`;\n if (hasNoData(series)) {\n return <ChartEmpty message={emptyMessage} ariaLabel={name} height={height} width={width} />;\n }\n const legendVisible = showLegend ?? series.length > 1;\n // The polygons as large as the box allows, less the room of the axis names\n // and the legend. A height that is not a number of pixels, or a box not\n // measured yet, leaves it to a share of the plot.\n const radius =\n typeof height === 'number' && boxWidth\n ? radarSize({\n height,\n width: boxWidth,\n categories,\n legend: legendVisible ? legendPosition : undefined,\n })\n : '70%';\n return (\n <div ref={box} style={{ width: width ?? '100%', maxWidth: '100%' }}>\n <RechartsRadarChart\n {...frameProps({ height, width: '100%', ariaLabel: name })}\n data={toRows(categories, series)}\n outerRadius={radius}\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n >\n <PolarGrid stroke={GRID} />\n <PolarAngleAxis dataKey=\"category\" tick={AXIS.tick} tickLine={false} />\n <PolarRadiusAxis\n angle={90}\n domain={[0, max ?? 'auto']}\n tickCount={6}\n tickFormatter={formatValue}\n tick={showScale ? { fill: MUTED, style: { fontSize: TEXT_SIZE } } : false}\n axisLine={false}\n />\n {legendVisible && <Legend {...legendProps(legendPosition, hidden)} />}\n <Tooltip\n content={<ChartTooltip format={formatValue} />}\n cursor={{ stroke: BORDER, strokeDasharray: '4 4' }}\n animationDuration={150}\n />\n {series.map((s, i) => (\n <Radar\n key={seriesKey(i)}\n name={s.name}\n dataKey={seriesKey(i)}\n stroke={seriesColor(i, colors)}\n strokeWidth={2}\n fill={seriesColor(i, colors)}\n fillOpacity={0.15}\n dot={{ r: 3, fill: seriesColor(i, colors), fillOpacity: 1, strokeWidth: 0 }}\n hide={hidden.hidden.has(seriesKey(i))}\n {...ANIMATION}\n />\n ))}\n {children}\n </RechartsRadarChart>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkAAYHG7YK_cjs = require('./chunk-AAYHG7YK.cjs');
|
|
5
|
+
var chunkX3YZP5WF_cjs = require('./chunk-X3YZP5WF.cjs');
|
|
6
|
+
var chunkTYQWZR3S_cjs = require('./chunk-TYQWZR3S.cjs');
|
|
7
|
+
var chunkT3K6Q34U_cjs = require('./chunk-T3K6Q34U.cjs');
|
|
8
|
+
var chunk6NRRABPF_cjs = require('./chunk-6NRRABPF.cjs');
|
|
9
|
+
var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
|
|
10
|
+
var react = require('react');
|
|
11
|
+
var recharts = require('recharts');
|
|
12
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
13
|
+
|
|
14
|
+
var RingTooltip = ({
|
|
15
|
+
active,
|
|
16
|
+
payload,
|
|
17
|
+
format
|
|
18
|
+
}) => {
|
|
19
|
+
if (!active || !payload?.length) return null;
|
|
20
|
+
const rows = payload.map((item) => {
|
|
21
|
+
const ring = item.payload;
|
|
22
|
+
return { name: ring.name, value: format(ring.raw), color: ring.fill };
|
|
23
|
+
});
|
|
24
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkT3K6Q34U_cjs.TooltipCard, { rows });
|
|
25
|
+
};
|
|
26
|
+
var RadialBarChart = ({
|
|
27
|
+
series,
|
|
28
|
+
labels,
|
|
29
|
+
colors,
|
|
30
|
+
formatValue = chunkAAYHG7YK_cjs.percent,
|
|
31
|
+
emptyMessage = "No data",
|
|
32
|
+
ariaLabel,
|
|
33
|
+
children,
|
|
34
|
+
height = 320,
|
|
35
|
+
width
|
|
36
|
+
}) => {
|
|
37
|
+
const [active, setActive] = react.useState();
|
|
38
|
+
const name = ariaLabel ?? `Radial bar chart: ${labels.join(", ")}`;
|
|
39
|
+
if (series.length === 0) {
|
|
40
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunk6NRRABPF_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
|
|
41
|
+
}
|
|
42
|
+
const rings = labels.map((label, i) => ({
|
|
43
|
+
name: label,
|
|
44
|
+
value: Math.min(100, Math.max(0, series[i])),
|
|
45
|
+
raw: series[i],
|
|
46
|
+
fill: chunkLT3UC65O_cjs.seriesColor(i, colors)
|
|
47
|
+
}));
|
|
48
|
+
const ring = active === void 0 ? void 0 : rings[active];
|
|
49
|
+
const average = Math.round(series.reduce((a, b) => a + b, 0) / series.length);
|
|
50
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
51
|
+
recharts.RadialBarChart,
|
|
52
|
+
{
|
|
53
|
+
...chunk6NRRABPF_cjs.frameProps({ height, width, ariaLabel: name }),
|
|
54
|
+
data: rings,
|
|
55
|
+
startAngle: 90,
|
|
56
|
+
endAngle: -270,
|
|
57
|
+
innerRadius: "40%",
|
|
58
|
+
outerRadius: "100%",
|
|
59
|
+
barCategoryGap: "12%",
|
|
60
|
+
margin: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx(recharts.PolarAngleAxis, { type: "number", domain: [0, 100], tick: false, axisLine: false }),
|
|
63
|
+
/* @__PURE__ */ jsxRuntime.jsx(recharts.PolarRadiusAxis, { type: "category", dataKey: "name", reversed: true, tick: false, axisLine: false }),
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
65
|
+
recharts.RadialBar,
|
|
66
|
+
{
|
|
67
|
+
dataKey: "value",
|
|
68
|
+
background: { fill: chunkLT3UC65O_cjs.TRACK },
|
|
69
|
+
cornerRadius: 6,
|
|
70
|
+
onMouseEnter: (_, index) => setActive(index),
|
|
71
|
+
onMouseLeave: () => setActive(void 0),
|
|
72
|
+
...chunkTYQWZR3S_cjs.ANIMATION
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
76
|
+
chunkX3YZP5WF_cjs.CenterText,
|
|
77
|
+
{
|
|
78
|
+
value: formatValue(ring ? ring.raw : average),
|
|
79
|
+
label: ring ? ring.name : "Avg",
|
|
80
|
+
valueSize: "var(--text-xl, 1.25rem)"
|
|
81
|
+
}
|
|
82
|
+
),
|
|
83
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
84
|
+
recharts.Tooltip,
|
|
85
|
+
{
|
|
86
|
+
content: /* @__PURE__ */ jsxRuntime.jsx(RingTooltip, { format: formatValue }),
|
|
87
|
+
cursor: false,
|
|
88
|
+
animationDuration: 150
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
children
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
exports.RadialBarChart = RadialBarChart;
|
|
98
|
+
//# sourceMappingURL=RadialBarChart.cjs.map
|
|
99
|
+
//# sourceMappingURL=RadialBarChart.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/RadialBarChart.tsx"],"names":["jsx","TooltipCard","percent","useState","ChartEmpty","seriesColor","jsxs","RechartsRadialBarChart","frameProps","PolarAngleAxis","PolarRadiusAxis","RadialBar","TRACK","ANIMATION","CenterText","Tooltip"],"mappings":"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","file":"RadialBarChart.cjs","sourcesContent":["import { useState } from 'react';\nimport {\n PolarAngleAxis,\n PolarRadiusAxis,\n RadialBar,\n RadialBarChart as RechartsRadialBarChart,\n Tooltip,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { ANIMATION } from './core/animation';\nimport { TooltipCard } from './core/ChartTooltip';\nimport { TRACK, seriesColor } from './core/colors';\nimport { ChartEmpty, frameProps } from './core/frame';\nimport { percent } from './core/gauge';\nimport { CenterText } from './core/radial';\nimport type { ChartEmptyProps, ChartProps } from './types';\n\nexport type RadialBarChartProps = ChartProps &\n ChartEmptyProps & {\n series: number[];\n labels: string[];\n /** Override the default Cosmos palette. */\n colors?: string[];\n /** Format the ring values and their average, on the 0–100 scale of the rings. Default: `78%`. */\n formatValue?: (value: number) => string;\n };\n\ntype Ring = { name: string; value: number; raw: number; fill: string };\n\nconst RingTooltip = ({\n active,\n payload,\n format,\n}: Partial<TooltipContentProps> & { format: (value: number) => string }) => {\n if (!active || !payload?.length) return null;\n const rows = payload.map((item) => {\n const ring = item.payload as Ring;\n return { name: ring.name, value: format(ring.raw), color: ring.fill };\n });\n return <TooltipCard rows={rows} />;\n};\n\nexport const RadialBarChart = ({\n series,\n labels,\n colors,\n formatValue = percent,\n emptyMessage = 'No data',\n ariaLabel,\n children,\n height = 320,\n width,\n}: RadialBarChartProps) => {\n // The ring the pointer is on, shown in the center in place of the average.\n const [active, setActive] = useState<number>();\n const name = ariaLabel ?? `Radial bar chart: ${labels.join(', ')}`;\n if (series.length === 0) {\n return <ChartEmpty message={emptyMessage} ariaLabel={name} height={height} width={width} />;\n }\n // The arcs stop at the ends of the 0–100 scale; the center and the tooltip give the value.\n const rings: Ring[] = labels.map((label, i) => ({\n name: label,\n value: Math.min(100, Math.max(0, series[i])),\n raw: series[i],\n fill: seriesColor(i, colors),\n }));\n const ring = active === undefined ? undefined : rings[active];\n const average = Math.round(series.reduce((a, b) => a + b, 0) / series.length);\n return (\n <RechartsRadialBarChart\n {...frameProps({ height, width, ariaLabel: name })}\n data={rings}\n // From the top, clockwise.\n startAngle={90}\n endAngle={-270}\n innerRadius=\"40%\"\n outerRadius=\"100%\"\n barCategoryGap=\"12%\"\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n >\n <PolarAngleAxis type=\"number\" domain={[0, 100]} tick={false} axisLine={false} />\n {/* The first series is the outer ring. */}\n <PolarRadiusAxis type=\"category\" dataKey=\"name\" reversed tick={false} axisLine={false} />\n <RadialBar\n dataKey=\"value\"\n background={{ fill: TRACK }}\n cornerRadius={6}\n onMouseEnter={(_, index) => setActive(index)}\n onMouseLeave={() => setActive(undefined)}\n {...ANIMATION}\n />\n <CenterText\n value={formatValue(ring ? ring.raw : average)}\n label={ring ? ring.name : 'Avg'}\n valueSize=\"var(--text-xl, 1.25rem)\"\n />\n <Tooltip\n content={<RingTooltip format={formatValue} />}\n cursor={false}\n animationDuration={150}\n />\n {children}\n </RechartsRadialBarChart>\n );\n};\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { percent } from './chunk-OCD6JIIX.js';
|
|
3
|
+
import { CenterText } from './chunk-URNXLVSK.js';
|
|
4
|
+
import { ANIMATION } from './chunk-5C2RLJYZ.js';
|
|
5
|
+
import { TooltipCard } from './chunk-VIOSQN4Z.js';
|
|
6
|
+
import { ChartEmpty, frameProps } from './chunk-3N43QT36.js';
|
|
7
|
+
import { seriesColor, TRACK } from './chunk-UATB2IRY.js';
|
|
8
|
+
import { useState } from 'react';
|
|
9
|
+
import { RadialBarChart as RadialBarChart$1, PolarAngleAxis, PolarRadiusAxis, RadialBar, Tooltip } from 'recharts';
|
|
10
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
11
|
+
|
|
12
|
+
var RingTooltip = ({
|
|
13
|
+
active,
|
|
14
|
+
payload,
|
|
15
|
+
format
|
|
16
|
+
}) => {
|
|
17
|
+
if (!active || !payload?.length) return null;
|
|
18
|
+
const rows = payload.map((item) => {
|
|
19
|
+
const ring = item.payload;
|
|
20
|
+
return { name: ring.name, value: format(ring.raw), color: ring.fill };
|
|
21
|
+
});
|
|
22
|
+
return /* @__PURE__ */ jsx(TooltipCard, { rows });
|
|
23
|
+
};
|
|
24
|
+
var RadialBarChart = ({
|
|
25
|
+
series,
|
|
26
|
+
labels,
|
|
27
|
+
colors,
|
|
28
|
+
formatValue = percent,
|
|
29
|
+
emptyMessage = "No data",
|
|
30
|
+
ariaLabel,
|
|
31
|
+
children,
|
|
32
|
+
height = 320,
|
|
33
|
+
width
|
|
34
|
+
}) => {
|
|
35
|
+
const [active, setActive] = useState();
|
|
36
|
+
const name = ariaLabel ?? `Radial bar chart: ${labels.join(", ")}`;
|
|
37
|
+
if (series.length === 0) {
|
|
38
|
+
return /* @__PURE__ */ jsx(ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
|
|
39
|
+
}
|
|
40
|
+
const rings = labels.map((label, i) => ({
|
|
41
|
+
name: label,
|
|
42
|
+
value: Math.min(100, Math.max(0, series[i])),
|
|
43
|
+
raw: series[i],
|
|
44
|
+
fill: seriesColor(i, colors)
|
|
45
|
+
}));
|
|
46
|
+
const ring = active === void 0 ? void 0 : rings[active];
|
|
47
|
+
const average = Math.round(series.reduce((a, b) => a + b, 0) / series.length);
|
|
48
|
+
return /* @__PURE__ */ jsxs(
|
|
49
|
+
RadialBarChart$1,
|
|
50
|
+
{
|
|
51
|
+
...frameProps({ height, width, ariaLabel: name }),
|
|
52
|
+
data: rings,
|
|
53
|
+
startAngle: 90,
|
|
54
|
+
endAngle: -270,
|
|
55
|
+
innerRadius: "40%",
|
|
56
|
+
outerRadius: "100%",
|
|
57
|
+
barCategoryGap: "12%",
|
|
58
|
+
margin: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
59
|
+
children: [
|
|
60
|
+
/* @__PURE__ */ jsx(PolarAngleAxis, { type: "number", domain: [0, 100], tick: false, axisLine: false }),
|
|
61
|
+
/* @__PURE__ */ jsx(PolarRadiusAxis, { type: "category", dataKey: "name", reversed: true, tick: false, axisLine: false }),
|
|
62
|
+
/* @__PURE__ */ jsx(
|
|
63
|
+
RadialBar,
|
|
64
|
+
{
|
|
65
|
+
dataKey: "value",
|
|
66
|
+
background: { fill: TRACK },
|
|
67
|
+
cornerRadius: 6,
|
|
68
|
+
onMouseEnter: (_, index) => setActive(index),
|
|
69
|
+
onMouseLeave: () => setActive(void 0),
|
|
70
|
+
...ANIMATION
|
|
71
|
+
}
|
|
72
|
+
),
|
|
73
|
+
/* @__PURE__ */ jsx(
|
|
74
|
+
CenterText,
|
|
75
|
+
{
|
|
76
|
+
value: formatValue(ring ? ring.raw : average),
|
|
77
|
+
label: ring ? ring.name : "Avg",
|
|
78
|
+
valueSize: "var(--text-xl, 1.25rem)"
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
/* @__PURE__ */ jsx(
|
|
82
|
+
Tooltip,
|
|
83
|
+
{
|
|
84
|
+
content: /* @__PURE__ */ jsx(RingTooltip, { format: formatValue }),
|
|
85
|
+
cursor: false,
|
|
86
|
+
animationDuration: 150
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
children
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export { RadialBarChart };
|
|
96
|
+
//# sourceMappingURL=RadialBarChart.js.map
|
|
97
|
+
//# sourceMappingURL=RadialBarChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/RadialBarChart.tsx"],"names":["RechartsRadialBarChart"],"mappings":"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","file":"RadialBarChart.js","sourcesContent":["import { useState } from 'react';\nimport {\n PolarAngleAxis,\n PolarRadiusAxis,\n RadialBar,\n RadialBarChart as RechartsRadialBarChart,\n Tooltip,\n} from 'recharts';\nimport type { TooltipContentProps } from 'recharts';\nimport { ANIMATION } from './core/animation';\nimport { TooltipCard } from './core/ChartTooltip';\nimport { TRACK, seriesColor } from './core/colors';\nimport { ChartEmpty, frameProps } from './core/frame';\nimport { percent } from './core/gauge';\nimport { CenterText } from './core/radial';\nimport type { ChartEmptyProps, ChartProps } from './types';\n\nexport type RadialBarChartProps = ChartProps &\n ChartEmptyProps & {\n series: number[];\n labels: string[];\n /** Override the default Cosmos palette. */\n colors?: string[];\n /** Format the ring values and their average, on the 0–100 scale of the rings. Default: `78%`. */\n formatValue?: (value: number) => string;\n };\n\ntype Ring = { name: string; value: number; raw: number; fill: string };\n\nconst RingTooltip = ({\n active,\n payload,\n format,\n}: Partial<TooltipContentProps> & { format: (value: number) => string }) => {\n if (!active || !payload?.length) return null;\n const rows = payload.map((item) => {\n const ring = item.payload as Ring;\n return { name: ring.name, value: format(ring.raw), color: ring.fill };\n });\n return <TooltipCard rows={rows} />;\n};\n\nexport const RadialBarChart = ({\n series,\n labels,\n colors,\n formatValue = percent,\n emptyMessage = 'No data',\n ariaLabel,\n children,\n height = 320,\n width,\n}: RadialBarChartProps) => {\n // The ring the pointer is on, shown in the center in place of the average.\n const [active, setActive] = useState<number>();\n const name = ariaLabel ?? `Radial bar chart: ${labels.join(', ')}`;\n if (series.length === 0) {\n return <ChartEmpty message={emptyMessage} ariaLabel={name} height={height} width={width} />;\n }\n // The arcs stop at the ends of the 0–100 scale; the center and the tooltip give the value.\n const rings: Ring[] = labels.map((label, i) => ({\n name: label,\n value: Math.min(100, Math.max(0, series[i])),\n raw: series[i],\n fill: seriesColor(i, colors),\n }));\n const ring = active === undefined ? undefined : rings[active];\n const average = Math.round(series.reduce((a, b) => a + b, 0) / series.length);\n return (\n <RechartsRadialBarChart\n {...frameProps({ height, width, ariaLabel: name })}\n data={rings}\n // From the top, clockwise.\n startAngle={90}\n endAngle={-270}\n innerRadius=\"40%\"\n outerRadius=\"100%\"\n barCategoryGap=\"12%\"\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n >\n <PolarAngleAxis type=\"number\" domain={[0, 100]} tick={false} axisLine={false} />\n {/* The first series is the outer ring. */}\n <PolarRadiusAxis type=\"category\" dataKey=\"name\" reversed tick={false} axisLine={false} />\n <RadialBar\n dataKey=\"value\"\n background={{ fill: TRACK }}\n cornerRadius={6}\n onMouseEnter={(_, index) => setActive(index)}\n onMouseLeave={() => setActive(undefined)}\n {...ANIMATION}\n />\n <CenterText\n value={formatValue(ring ? ring.raw : average)}\n label={ring ? ring.name : 'Avg'}\n valueSize=\"var(--text-xl, 1.25rem)\"\n />\n <Tooltip\n content={<RingTooltip format={formatValue} />}\n cursor={false}\n animationDuration={150}\n />\n {children}\n </RechartsRadialBarChart>\n );\n};\n"]}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkF2PMFYJ5_cjs = require('./chunk-F2PMFYJ5.cjs');
|
|
5
|
+
var chunkZ4LZFMDH_cjs = require('./chunk-Z4LZFMDH.cjs');
|
|
6
|
+
var chunkGZRMVE4X_cjs = require('./chunk-GZRMVE4X.cjs');
|
|
7
|
+
var chunkTYQWZR3S_cjs = require('./chunk-TYQWZR3S.cjs');
|
|
8
|
+
var chunkRLHGPHC7_cjs = require('./chunk-RLHGPHC7.cjs');
|
|
9
|
+
var chunkT3K6Q34U_cjs = require('./chunk-T3K6Q34U.cjs');
|
|
10
|
+
var chunkK3R7JGOW_cjs = require('./chunk-K3R7JGOW.cjs');
|
|
11
|
+
var chunk6NRRABPF_cjs = require('./chunk-6NRRABPF.cjs');
|
|
12
|
+
var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
|
|
13
|
+
var recharts = require('recharts');
|
|
14
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
15
|
+
|
|
16
|
+
var UTC_DATE_TIME = new Intl.DateTimeFormat("en-GB", {
|
|
17
|
+
day: "2-digit",
|
|
18
|
+
month: "short",
|
|
19
|
+
hour: "2-digit",
|
|
20
|
+
minute: "2-digit",
|
|
21
|
+
hourCycle: "h23",
|
|
22
|
+
timeZone: "UTC"
|
|
23
|
+
});
|
|
24
|
+
var UTC_DAY = new Intl.DateTimeFormat("en-GB", {
|
|
25
|
+
day: "2-digit",
|
|
26
|
+
month: "short",
|
|
27
|
+
timeZone: "UTC"
|
|
28
|
+
});
|
|
29
|
+
var UTC_TIME = new Intl.DateTimeFormat("en-GB", {
|
|
30
|
+
hour: "2-digit",
|
|
31
|
+
minute: "2-digit",
|
|
32
|
+
hourCycle: "h23",
|
|
33
|
+
timeZone: "UTC"
|
|
34
|
+
});
|
|
35
|
+
var defaultFormatDate = (timestamp) => UTC_DATE_TIME.format(timestamp);
|
|
36
|
+
var HOUR = 36e5;
|
|
37
|
+
var DAY = 24 * HOUR;
|
|
38
|
+
var STEPS = [HOUR, 2 * HOUR, 3 * HOUR, 6 * HOUR, 12 * HOUR, DAY, 2 * DAY, 7 * DAY, 30 * DAY];
|
|
39
|
+
var timeTicks = (min, max) => {
|
|
40
|
+
const step = STEPS.find((s) => (max - min) / s <= 8) ?? STEPS[STEPS.length - 1];
|
|
41
|
+
const first = Math.floor(min / step) * step;
|
|
42
|
+
const last = Math.max(Math.ceil(max / step) * step, first + step);
|
|
43
|
+
return Array.from({ length: Math.round((last - first) / step) + 1 }, (_, i) => first + i * step);
|
|
44
|
+
};
|
|
45
|
+
var tickLabel = (timestamp) => timestamp % DAY === 0 ? UTC_DAY.format(timestamp) : UTC_TIME.format(timestamp);
|
|
46
|
+
var GROUP_KEY = "all";
|
|
47
|
+
var rangesShape = (key, colors, visible) => (props) => {
|
|
48
|
+
const { x, y, width, height } = props;
|
|
49
|
+
const row = props.payload;
|
|
50
|
+
const bounds = row[key];
|
|
51
|
+
if (!bounds) return null;
|
|
52
|
+
const [low, high] = bounds;
|
|
53
|
+
const span = high - low || 1;
|
|
54
|
+
const lane = Math.abs(height);
|
|
55
|
+
const top = Math.min(y, y + height);
|
|
56
|
+
return /* @__PURE__ */ jsxRuntime.jsx("g", { children: row.ranges.filter((r) => visible(r.series) && (key === GROUP_KEY || key === chunkK3R7JGOW_cjs.seriesKey(r.series))).map((r, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
57
|
+
"rect",
|
|
58
|
+
{
|
|
59
|
+
x: x + (r.start - low) / span * width,
|
|
60
|
+
y: top,
|
|
61
|
+
width: Math.max((r.end - r.start) / span * width, 2),
|
|
62
|
+
height: lane,
|
|
63
|
+
rx: 3,
|
|
64
|
+
fill: colors(r.series)
|
|
65
|
+
},
|
|
66
|
+
i
|
|
67
|
+
)) });
|
|
68
|
+
};
|
|
69
|
+
var SeriesLegend = ({
|
|
70
|
+
entries,
|
|
71
|
+
hidden,
|
|
72
|
+
onToggle,
|
|
73
|
+
column
|
|
74
|
+
}) => /* @__PURE__ */ jsxRuntime.jsx(chunkGZRMVE4X_cjs.ChartLegend, { payload: entries, hidden, onToggle, column });
|
|
75
|
+
var RangeBarChart = ({
|
|
76
|
+
series,
|
|
77
|
+
groupRows = false,
|
|
78
|
+
colors,
|
|
79
|
+
formatDate = defaultFormatDate,
|
|
80
|
+
xTitle,
|
|
81
|
+
yTitle,
|
|
82
|
+
referenceLines,
|
|
83
|
+
referenceBands,
|
|
84
|
+
showLegend,
|
|
85
|
+
legendPosition = "top",
|
|
86
|
+
emptyMessage = "No data",
|
|
87
|
+
ariaLabel,
|
|
88
|
+
children,
|
|
89
|
+
height = 320,
|
|
90
|
+
width
|
|
91
|
+
}) => {
|
|
92
|
+
const hidden = chunkGZRMVE4X_cjs.useHiddenSeries();
|
|
93
|
+
const axis = chunkRLHGPHC7_cjs.useAxis();
|
|
94
|
+
const categoryKeys = chunkF2PMFYJ5_cjs.useCategoryKeys("vertical");
|
|
95
|
+
const name = ariaLabel ?? `Range chart: ${series.map((s) => s.name).join(", ")}`;
|
|
96
|
+
if (chunkK3R7JGOW_cjs.hasNoData(series)) {
|
|
97
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunk6NRRABPF_cjs.ChartEmpty, { message: emptyMessage, ariaLabel: name, height, width });
|
|
98
|
+
}
|
|
99
|
+
const categories = [...new Set(series.flatMap((s) => s.data.map((p) => p.x)))];
|
|
100
|
+
const all = series.flatMap((s) => s.data.flatMap((p) => p.y));
|
|
101
|
+
const ticks = timeTicks(Math.min(...all), Math.max(...all));
|
|
102
|
+
const color = (index) => chunkLT3UC65O_cjs.seriesColor(index, colors);
|
|
103
|
+
const visible = (index) => !hidden.hidden.has(chunkK3R7JGOW_cjs.seriesKey(index));
|
|
104
|
+
const rows = categories.map((category) => {
|
|
105
|
+
const ranges = series.flatMap(
|
|
106
|
+
(s, index) => s.data.filter((p) => p.x === category).map((p) => ({ series: index, start: p.y[0], end: p.y[1] }))
|
|
107
|
+
);
|
|
108
|
+
const bounds = (of) => of.length > 0 ? [Math.min(...of.map((r) => r.start)), Math.max(...of.map((r) => r.end))] : void 0;
|
|
109
|
+
return {
|
|
110
|
+
category,
|
|
111
|
+
ranges,
|
|
112
|
+
[GROUP_KEY]: bounds(ranges),
|
|
113
|
+
...Object.fromEntries(
|
|
114
|
+
series.map((_, index) => [
|
|
115
|
+
chunkK3R7JGOW_cjs.seriesKey(index),
|
|
116
|
+
bounds(ranges.filter((r) => r.series === index))
|
|
117
|
+
])
|
|
118
|
+
)
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
const tooltip = ({ active, payload, label }) => {
|
|
122
|
+
const row = payload?.[0]?.payload;
|
|
123
|
+
if (!active || !row) return null;
|
|
124
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
125
|
+
chunkT3K6Q34U_cjs.TooltipCard,
|
|
126
|
+
{
|
|
127
|
+
title: label,
|
|
128
|
+
rows: row.ranges.filter((r) => visible(r.series)).map((r) => ({
|
|
129
|
+
name: series[r.series].name,
|
|
130
|
+
value: `${formatDate(r.start)} \u2013 ${formatDate(r.end)}`,
|
|
131
|
+
color: color(r.series)
|
|
132
|
+
}))
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
};
|
|
136
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
137
|
+
recharts.BarChart,
|
|
138
|
+
{
|
|
139
|
+
ref: categoryKeys,
|
|
140
|
+
...chunk6NRRABPF_cjs.frameProps({ height, width, ariaLabel: name }),
|
|
141
|
+
data: rows,
|
|
142
|
+
layout: "vertical",
|
|
143
|
+
margin: { top: 4, right: 16, bottom: 0, left: 0 },
|
|
144
|
+
barGap: 2,
|
|
145
|
+
barCategoryGap: "20%",
|
|
146
|
+
children: [
|
|
147
|
+
/* @__PURE__ */ jsxRuntime.jsx(recharts.CartesianGrid, { stroke: chunkLT3UC65O_cjs.GRID, strokeDasharray: "4 4" }),
|
|
148
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
149
|
+
recharts.XAxis,
|
|
150
|
+
{
|
|
151
|
+
type: "number",
|
|
152
|
+
domain: [ticks[0], ticks[ticks.length - 1]],
|
|
153
|
+
ticks,
|
|
154
|
+
tickFormatter: tickLabel,
|
|
155
|
+
...axis,
|
|
156
|
+
...chunkRLHGPHC7_cjs.xAxisTitle(xTitle)
|
|
157
|
+
}
|
|
158
|
+
),
|
|
159
|
+
/* @__PURE__ */ jsxRuntime.jsx(recharts.YAxis, { type: "category", dataKey: "category", width: "auto", ...axis, ...chunkRLHGPHC7_cjs.yAxisTitle(yTitle) }),
|
|
160
|
+
(showLegend ?? series.length > 1) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
161
|
+
recharts.Legend,
|
|
162
|
+
{
|
|
163
|
+
...chunkGZRMVE4X_cjs.legendProps(legendPosition, hidden),
|
|
164
|
+
content: /* @__PURE__ */ jsxRuntime.jsx(
|
|
165
|
+
SeriesLegend,
|
|
166
|
+
{
|
|
167
|
+
entries: series.map((s, index) => ({
|
|
168
|
+
value: s.name,
|
|
169
|
+
type: "circle",
|
|
170
|
+
color: color(index),
|
|
171
|
+
dataKey: chunkK3R7JGOW_cjs.seriesKey(index)
|
|
172
|
+
})),
|
|
173
|
+
hidden: hidden.hidden,
|
|
174
|
+
onToggle: hidden.toggle,
|
|
175
|
+
column: legendPosition === "left" || legendPosition === "right"
|
|
176
|
+
}
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
),
|
|
180
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
181
|
+
recharts.Tooltip,
|
|
182
|
+
{
|
|
183
|
+
content: tooltip,
|
|
184
|
+
cursor: { fill: chunkLT3UC65O_cjs.BORDER, fillOpacity: 0.35, radius: 8 },
|
|
185
|
+
animationDuration: 150
|
|
186
|
+
}
|
|
187
|
+
),
|
|
188
|
+
groupRows ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
189
|
+
recharts.Bar,
|
|
190
|
+
{
|
|
191
|
+
name: "Ranges",
|
|
192
|
+
dataKey: GROUP_KEY,
|
|
193
|
+
maxBarSize: 32,
|
|
194
|
+
shape: rangesShape(GROUP_KEY, color, visible),
|
|
195
|
+
...chunkTYQWZR3S_cjs.ANIMATION
|
|
196
|
+
}
|
|
197
|
+
) : series.map((s, index) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
198
|
+
recharts.Bar,
|
|
199
|
+
{
|
|
200
|
+
name: s.name,
|
|
201
|
+
dataKey: chunkK3R7JGOW_cjs.seriesKey(index),
|
|
202
|
+
maxBarSize: 28,
|
|
203
|
+
shape: rangesShape(chunkK3R7JGOW_cjs.seriesKey(index), color, visible),
|
|
204
|
+
hide: !visible(index),
|
|
205
|
+
...chunkTYQWZR3S_cjs.ANIMATION
|
|
206
|
+
},
|
|
207
|
+
chunkK3R7JGOW_cjs.seriesKey(index)
|
|
208
|
+
)),
|
|
209
|
+
chunkZ4LZFMDH_cjs.referenceMarks({ referenceLines, referenceBands, axis: "x" }),
|
|
210
|
+
children
|
|
211
|
+
]
|
|
212
|
+
}
|
|
213
|
+
);
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
exports.RangeBarChart = RangeBarChart;
|
|
217
|
+
//# sourceMappingURL=RangeBarChart.cjs.map
|
|
218
|
+
//# sourceMappingURL=RangeBarChart.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/RangeBarChart.tsx"],"names":["jsx","seriesKey","ChartLegend","useHiddenSeries","useAxis","useCategoryKeys","hasNoData","ChartEmpty","seriesColor","TooltipCard","jsxs","BarChart","frameProps","CartesianGrid","GRID","XAxis","xAxisTitle","YAxis","yAxisTitle","Legend","legendProps","Tooltip","BORDER","Bar","ANIMATION","referenceMarks"],"mappings":"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","file":"RangeBarChart.cjs","sourcesContent":["import type { ComponentProps } from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n Tooltip,\n XAxis,\n YAxis,\n type BarShapeProps,\n type LegendPayload,\n type TooltipContentProps,\n} from 'recharts';\nimport { ANIMATION } from './core/animation';\nimport { useAxis, xAxisTitle, yAxisTitle } from './core/axes';\nimport { useCategoryKeys } from './core/categoryKeys';\nimport { TooltipCard } from './core/ChartTooltip';\nimport { ChartLegend, legendProps, useHiddenSeries } from './core/ChartLegend';\nimport { BORDER, GRID, seriesColor } from './core/colors';\nimport { hasNoData, seriesKey } from './core/data';\nimport { ChartEmpty, frameProps } from './core/frame';\nimport { referenceMarks } from './core/reference';\nimport type {\n ChartAxisTitleProps,\n ChartEmptyProps,\n ChartLegendProps,\n ChartProps,\n ChartReferenceProps,\n} from './types';\n\nexport type RangeBarPoint = {\n /** Row label: the service, rack or host the range belongs to. */\n x: string;\n /** Start and end, as timestamps in milliseconds. */\n y: [number, number];\n};\n\nexport type RangeBarChartProps = ChartProps &\n ChartEmptyProps &\n ChartLegendProps &\n ChartAxisTitleProps &\n ChartReferenceProps & {\n /** One series per kind of range (maintenance, deploy, incident…), drawn on a time axis. */\n series: { name: string; data: RangeBarPoint[] }[];\n /** Draw every series of a row on one lane, instead of one lane per series. */\n groupRows?: boolean;\n /** Override the default Cosmos palette. */\n colors?: string[];\n /** Format the start and end times in the tooltip. Default: `14 Oct, 02:00`, in UTC like the axis. */\n formatDate?: (timestamp: number) => string;\n /** Show the legend (auto-true when 2+ series). */\n showLegend?: boolean;\n };\n\n// The axis labels are UTC, so the default tooltip is too.\nconst UTC_DATE_TIME = new Intl.DateTimeFormat('en-GB', {\n day: '2-digit',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n timeZone: 'UTC',\n});\nconst UTC_DAY = new Intl.DateTimeFormat('en-GB', {\n day: '2-digit',\n month: 'short',\n timeZone: 'UTC',\n});\nconst UTC_TIME = new Intl.DateTimeFormat('en-GB', {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n timeZone: 'UTC',\n});\n\nconst defaultFormatDate = (timestamp: number) => UTC_DATE_TIME.format(timestamp);\n\nconst HOUR = 3_600_000;\nconst DAY = 24 * HOUR;\nconst STEPS = [HOUR, 2 * HOUR, 3 * HOUR, 6 * HOUR, 12 * HOUR, DAY, 2 * DAY, 7 * DAY, 30 * DAY];\n\n/** Round UTC ticks that cover `[min, max]`: the first step that leaves at most eight of them. */\nconst timeTicks = (min: number, max: number) => {\n const step = STEPS.find((s) => (max - min) / s <= 8) ?? STEPS[STEPS.length - 1];\n const first = Math.floor(min / step) * step;\n const last = Math.max(Math.ceil(max / step) * step, first + step);\n return Array.from({ length: Math.round((last - first) / step) + 1 }, (_, i) => first + i * step);\n};\n\n/** A tick label: the day at midnight, the time otherwise. */\nconst tickLabel = (timestamp: number) =>\n timestamp % DAY === 0 ? UTC_DAY.format(timestamp) : UTC_TIME.format(timestamp);\n\ntype Range = { series: number; start: number; end: number };\ntype Row = { category: string; ranges: Range[] } & Record<string, unknown>;\n\nconst GROUP_KEY = 'all';\n\n// A bar's value is the span from the first start to the last end of what it\n// draws in a row, so Recharts sizes and places it; the ranges inside are drawn\n// by the shape, at the same scale.\nconst rangesShape =\n (key: string, colors: (series: number) => string, visible: (series: number) => boolean) =>\n (props: BarShapeProps) => {\n const { x, y, width, height } = props;\n const row = props.payload as Row;\n const bounds = row[key] as [number, number] | undefined;\n if (!bounds) return null;\n const [low, high] = bounds;\n const span = high - low || 1;\n const lane = Math.abs(height);\n const top = Math.min(y, y + height);\n return (\n <g>\n {row.ranges\n .filter((r) => visible(r.series) && (key === GROUP_KEY || key === seriesKey(r.series)))\n .map((r, i) => (\n <rect\n key={i}\n x={x + ((r.start - low) / span) * width}\n y={top}\n width={Math.max(((r.end - r.start) / span) * width, 2)}\n height={lane}\n rx={3}\n fill={colors(r.series)}\n />\n ))}\n </g>\n );\n };\n\n// One legend entry per series, whichever way the bars are drawn: Recharts' own\n// entries (one per bar) are left aside.\nconst SeriesLegend = ({\n entries,\n hidden,\n onToggle,\n column,\n}: { entries: LegendPayload[] } & Omit<ComponentProps<typeof ChartLegend>, 'payload'>) => (\n <ChartLegend payload={entries} hidden={hidden} onToggle={onToggle} column={column} />\n);\n\nexport const RangeBarChart = ({\n series,\n groupRows = false,\n colors,\n formatDate = defaultFormatDate,\n xTitle,\n yTitle,\n referenceLines,\n referenceBands,\n showLegend,\n legendPosition = 'top',\n emptyMessage = 'No data',\n ariaLabel,\n children,\n height = 320,\n width,\n}: RangeBarChartProps) => {\n const hidden = useHiddenSeries();\n const axis = useAxis();\n // Recharts names the layout after the axis the categories sit on.\n const categoryKeys = useCategoryKeys('vertical');\n const name = ariaLabel ?? `Range chart: ${series.map((s) => s.name).join(', ')}`;\n if (hasNoData(series)) {\n return <ChartEmpty message={emptyMessage} ariaLabel={name} height={height} width={width} />;\n }\n\n const categories = [...new Set(series.flatMap((s) => s.data.map((p) => p.x)))];\n const all = series.flatMap((s) => s.data.flatMap((p) => p.y));\n const ticks = timeTicks(Math.min(...all), Math.max(...all));\n const color = (index: number) => seriesColor(index, colors);\n const visible = (index: number) => !hidden.hidden.has(seriesKey(index));\n\n const rows: Row[] = categories.map((category) => {\n const ranges = series.flatMap((s, index) =>\n s.data\n .filter((p) => p.x === category)\n .map((p) => ({ series: index, start: p.y[0], end: p.y[1] }))\n );\n const bounds = (of: Range[]) =>\n of.length > 0\n ? ([Math.min(...of.map((r) => r.start)), Math.max(...of.map((r) => r.end))] as const)\n : undefined;\n return {\n category,\n ranges,\n [GROUP_KEY]: bounds(ranges),\n ...Object.fromEntries(\n series.map((_, index) => [\n seriesKey(index),\n bounds(ranges.filter((r) => r.series === index)),\n ])\n ),\n };\n });\n\n const tooltip = ({ active, payload, label }: Partial<TooltipContentProps>) => {\n const row = payload?.[0]?.payload as Row | undefined;\n if (!active || !row) return null;\n return (\n <TooltipCard\n title={label}\n rows={row.ranges\n .filter((r) => visible(r.series))\n .map((r) => ({\n name: series[r.series].name,\n value: `${formatDate(r.start)} – ${formatDate(r.end)}`,\n color: color(r.series),\n }))}\n />\n );\n };\n\n return (\n <BarChart\n ref={categoryKeys}\n {...frameProps({ height, width, ariaLabel: name })}\n data={rows}\n layout=\"vertical\"\n margin={{ top: 4, right: 16, bottom: 0, left: 0 }}\n barGap={2}\n barCategoryGap=\"20%\"\n >\n {/* Time runs left to right: vertical grid lines, plus a line between rows. */}\n <CartesianGrid stroke={GRID} strokeDasharray=\"4 4\" />\n <XAxis\n type=\"number\"\n domain={[ticks[0], ticks[ticks.length - 1]]}\n ticks={ticks}\n tickFormatter={tickLabel}\n {...axis}\n {...xAxisTitle(xTitle)}\n />\n <YAxis type=\"category\" dataKey=\"category\" width=\"auto\" {...axis} {...yAxisTitle(yTitle)} />\n {(showLegend ?? series.length > 1) && (\n <Legend\n {...legendProps(legendPosition, hidden)}\n content={\n <SeriesLegend\n entries={series.map((s, index) => ({\n value: s.name,\n type: 'circle',\n color: color(index),\n dataKey: seriesKey(index),\n }))}\n hidden={hidden.hidden}\n onToggle={hidden.toggle}\n column={legendPosition === 'left' || legendPosition === 'right'}\n />\n }\n />\n )}\n <Tooltip\n content={tooltip}\n cursor={{ fill: BORDER, fillOpacity: 0.35, radius: 8 }}\n animationDuration={150}\n />\n {groupRows ? (\n <Bar\n name=\"Ranges\"\n dataKey={GROUP_KEY}\n maxBarSize={32}\n shape={rangesShape(GROUP_KEY, color, visible)}\n {...ANIMATION}\n />\n ) : (\n series.map((s, index) => (\n <Bar\n key={seriesKey(index)}\n name={s.name}\n dataKey={seriesKey(index)}\n maxBarSize={28}\n shape={rangesShape(seriesKey(index), color, visible)}\n hide={!visible(index)}\n {...ANIMATION}\n />\n ))\n )}\n {referenceMarks({ referenceLines, referenceBands, axis: 'x' })}\n {children}\n </BarChart>\n );\n};\n"]}
|