@sentropic/design-system-react 0.11.0 → 0.12.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/dist/ComboChart.d.ts +27 -0
- package/dist/ComboChart.d.ts.map +1 -0
- package/dist/ComboChart.js +189 -0
- package/dist/ComboChart.js.map +1 -0
- package/dist/FunnelChart.d.ts +20 -0
- package/dist/FunnelChart.d.ts.map +1 -0
- package/dist/FunnelChart.js +117 -0
- package/dist/FunnelChart.js.map +1 -0
- package/dist/GaugeChart.d.ts +35 -0
- package/dist/GaugeChart.d.ts.map +1 -0
- package/dist/GaugeChart.js +115 -0
- package/dist/GaugeChart.js.map +1 -0
- package/dist/KpiCard.d.ts +45 -0
- package/dist/KpiCard.d.ts.map +1 -0
- package/dist/KpiCard.js +67 -0
- package/dist/KpiCard.js.map +1 -0
- package/dist/TreemapChart.d.ts +25 -0
- package/dist/TreemapChart.d.ts.map +1 -0
- package/dist/TreemapChart.js +179 -0
- package/dist/TreemapChart.js.map +1 -0
- package/dist/WaterfallChart.d.ts +18 -0
- package/dist/WaterfallChart.d.ts.map +1 -0
- package/dist/WaterfallChart.js +133 -0
- package/dist/WaterfallChart.js.map +1 -0
- package/dist/chartContrast.d.ts +6 -0
- package/dist/chartContrast.d.ts.map +1 -0
- package/dist/chartContrast.js +59 -0
- package/dist/chartContrast.js.map +1 -0
- package/dist/chartScale.d.ts +6 -0
- package/dist/chartScale.d.ts.map +1 -1
- package/dist/chartScale.js +41 -0
- package/dist/chartScale.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +739 -2
- package/package.json +1 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type ComboChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
|
|
3
|
+
export type ComboChartBarSeries = {
|
|
4
|
+
label: string;
|
|
5
|
+
data: number[];
|
|
6
|
+
tone?: ComboChartTone;
|
|
7
|
+
};
|
|
8
|
+
export type ComboChartLineSeries = {
|
|
9
|
+
label: string;
|
|
10
|
+
data: number[];
|
|
11
|
+
tone?: ComboChartTone;
|
|
12
|
+
smooth?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type ComboChartProps = Omit<React.HTMLAttributes<HTMLDivElement>, "className"> & {
|
|
15
|
+
categories: string[];
|
|
16
|
+
bars?: ComboChartBarSeries[];
|
|
17
|
+
lines?: ComboChartLineSeries[];
|
|
18
|
+
leftAxisLabel?: string;
|
|
19
|
+
rightAxisLabel?: string;
|
|
20
|
+
legend?: boolean;
|
|
21
|
+
width?: number;
|
|
22
|
+
height?: number;
|
|
23
|
+
label: string;
|
|
24
|
+
className?: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function ComboChart({ categories, bars, lines, leftAxisLabel, rightAxisLabel, legend, width, height, label, className, ...rest }: ComboChartProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=ComboChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComboChart.d.ts","sourceRoot":"","sources":["../src/ComboChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,GAAG;IACtF,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AASF,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,IAAS,EACT,KAAU,EACV,aAAa,EACb,cAAc,EACd,MAAa,EACb,KAAW,EACX,MAAY,EACZ,KAAK,EACL,SAAS,EACT,GAAG,IAAI,EACR,EAAE,eAAe,2CAyXjB"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { classNames } from "./classNames.js";
|
|
4
|
+
import { buildLinearPath, buildSmoothPath, ChartDataList, formatTick, niceTicks, scaleLinear, } from "./chartScale.js";
|
|
5
|
+
const MARGIN = { top: 12, right: 52, bottom: 32, left: 52 };
|
|
6
|
+
export function ComboChart({ categories, bars = [], lines = [], leftAxisLabel, rightAxisLabel, legend = true, width = 480, height = 240, label, className, ...rest }) {
|
|
7
|
+
const [hovered, setHovered] = React.useState(null);
|
|
8
|
+
const plotWidth = Math.max(width - MARGIN.left - MARGIN.right, 1);
|
|
9
|
+
const plotHeight = Math.max(height - MARGIN.top - MARGIN.bottom, 1);
|
|
10
|
+
// Left axis (bars): include zero in the domain so bars rest on a baseline.
|
|
11
|
+
const leftScale = (() => {
|
|
12
|
+
const values = bars.flatMap((s) => s.data);
|
|
13
|
+
const minRaw = Math.min(0, ...(values.length ? values : [0]));
|
|
14
|
+
const maxRaw = Math.max(0, ...(values.length ? values : [0]));
|
|
15
|
+
const ticks = niceTicks(minRaw, maxRaw, 5);
|
|
16
|
+
return { ticks, domainMin: ticks[0], domainMax: ticks[ticks.length - 1] };
|
|
17
|
+
})();
|
|
18
|
+
// Right axis (lines): padded domain like LineChart.
|
|
19
|
+
const rightScale = (() => {
|
|
20
|
+
const values = lines.flatMap((s) => s.data);
|
|
21
|
+
if (values.length === 0) {
|
|
22
|
+
const ticks = niceTicks(0, 1, 5);
|
|
23
|
+
return { ticks, domainMin: ticks[0], domainMax: ticks[ticks.length - 1] };
|
|
24
|
+
}
|
|
25
|
+
const minRaw = Math.min(...values);
|
|
26
|
+
const maxRaw = Math.max(...values);
|
|
27
|
+
const padded = (maxRaw - minRaw) * 0.08 || Math.max(Math.abs(maxRaw), 1) * 0.1;
|
|
28
|
+
const ticks = niceTicks(minRaw - padded, maxRaw + padded, 5);
|
|
29
|
+
return { ticks, domainMin: ticks[0], domainMax: ticks[ticks.length - 1] };
|
|
30
|
+
})();
|
|
31
|
+
// Categories are ordinal: each gets a band centred at the band midpoint.
|
|
32
|
+
function bandCenter(i) {
|
|
33
|
+
const band = plotWidth / Math.max(categories.length, 1);
|
|
34
|
+
return MARGIN.left + band * (i + 0.5);
|
|
35
|
+
}
|
|
36
|
+
const barGroups = (() => {
|
|
37
|
+
if (categories.length === 0 || bars.length === 0)
|
|
38
|
+
return [];
|
|
39
|
+
const { domainMin, domainMax } = leftScale;
|
|
40
|
+
const band = plotWidth / categories.length;
|
|
41
|
+
const groupWidth = band * 0.62;
|
|
42
|
+
const barWidth = groupWidth / bars.length;
|
|
43
|
+
const zeroY = scaleLinear(0, domainMin, domainMax, plotHeight, 0);
|
|
44
|
+
return categories.map((_, ci) => {
|
|
45
|
+
const groupX = MARGIN.left + band * ci + (band - groupWidth) / 2;
|
|
46
|
+
const segments = bars.flatMap((series, si) => {
|
|
47
|
+
const raw = series.data[ci];
|
|
48
|
+
// Donnée manquante/non finie → pas de barre (jamais une fausse barre à 0).
|
|
49
|
+
if (raw == null || !Number.isFinite(raw))
|
|
50
|
+
return [];
|
|
51
|
+
const value = raw;
|
|
52
|
+
const valueY = scaleLinear(value, domainMin, domainMax, plotHeight, 0);
|
|
53
|
+
const y = Math.min(valueY, zeroY);
|
|
54
|
+
const h = Math.abs(zeroY - valueY);
|
|
55
|
+
return [
|
|
56
|
+
{
|
|
57
|
+
x: groupX + barWidth * si,
|
|
58
|
+
y: MARGIN.top + y,
|
|
59
|
+
width: barWidth,
|
|
60
|
+
height: Math.max(h, 0.5),
|
|
61
|
+
cx: groupX + barWidth * (si + 0.5),
|
|
62
|
+
cy: MARGIN.top + valueY,
|
|
63
|
+
value,
|
|
64
|
+
seriesLabel: series.label,
|
|
65
|
+
category: categories[ci],
|
|
66
|
+
tone: series.tone ?? `category${(si % 8) + 1}`,
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
});
|
|
70
|
+
return segments;
|
|
71
|
+
});
|
|
72
|
+
})();
|
|
73
|
+
const lineSeries = (() => {
|
|
74
|
+
if (categories.length === 0 || lines.length === 0)
|
|
75
|
+
return [];
|
|
76
|
+
const { domainMin, domainMax } = rightScale;
|
|
77
|
+
return lines.map((series, li) => {
|
|
78
|
+
// Seuls les points définis/finis sont tracés ; les manquants créent un
|
|
79
|
+
// trou dans la ligne (pas de chute artificielle vers 0).
|
|
80
|
+
const points = categories.flatMap((_, ci) => {
|
|
81
|
+
const raw = series.data[ci];
|
|
82
|
+
if (raw == null || !Number.isFinite(raw))
|
|
83
|
+
return [];
|
|
84
|
+
return [
|
|
85
|
+
{
|
|
86
|
+
x: bandCenter(ci),
|
|
87
|
+
y: MARGIN.top + scaleLinear(raw, domainMin, domainMax, plotHeight, 0),
|
|
88
|
+
value: raw,
|
|
89
|
+
category: categories[ci],
|
|
90
|
+
index: ci,
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
});
|
|
94
|
+
// Découpe en segments contigus (indices de catégorie consécutifs) pour
|
|
95
|
+
// dessiner des trous là où des points manquent.
|
|
96
|
+
const runs = [];
|
|
97
|
+
let current = [];
|
|
98
|
+
for (const p of points) {
|
|
99
|
+
if (current.length === 0 || p.index === current[current.length - 1].index + 1) {
|
|
100
|
+
current.push(p);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
runs.push(current);
|
|
104
|
+
current = [p];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (current.length > 0)
|
|
108
|
+
runs.push(current);
|
|
109
|
+
const path = runs
|
|
110
|
+
.map((run) => (series.smooth ? buildSmoothPath(run) : buildLinearPath(run)))
|
|
111
|
+
.join(" ");
|
|
112
|
+
return {
|
|
113
|
+
path,
|
|
114
|
+
points,
|
|
115
|
+
seriesLabel: series.label,
|
|
116
|
+
tone: series.tone ?? `category${((bars.length + li) % 8) + 1}`,
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
})();
|
|
120
|
+
const leftGridLines = leftScale.ticks.map((tick) => ({
|
|
121
|
+
value: tick,
|
|
122
|
+
y: MARGIN.top + scaleLinear(tick, leftScale.domainMin, leftScale.domainMax, plotHeight, 0),
|
|
123
|
+
}));
|
|
124
|
+
const rightTickEntries = lines.length === 0
|
|
125
|
+
? []
|
|
126
|
+
: rightScale.ticks.map((tick) => ({
|
|
127
|
+
value: tick,
|
|
128
|
+
y: MARGIN.top + scaleLinear(tick, rightScale.domainMin, rightScale.domainMax, plotHeight, 0),
|
|
129
|
+
}));
|
|
130
|
+
const legendItems = [
|
|
131
|
+
...bars.map((s, i) => ({
|
|
132
|
+
key: `bar-${i}`,
|
|
133
|
+
label: s.label,
|
|
134
|
+
tone: s.tone ?? `category${(i % 8) + 1}`,
|
|
135
|
+
kind: "bar",
|
|
136
|
+
})),
|
|
137
|
+
...lines.map((s, i) => ({
|
|
138
|
+
key: `line-${i}`,
|
|
139
|
+
label: s.label,
|
|
140
|
+
tone: s.tone ?? `category${((bars.length + i) % 8) + 1}`,
|
|
141
|
+
kind: "line",
|
|
142
|
+
})),
|
|
143
|
+
];
|
|
144
|
+
// Les valeurs manquantes/non finies sont omises (cohérent avec les trous visuels).
|
|
145
|
+
const seriesItems = (s) => categories.flatMap((c, ci) => {
|
|
146
|
+
const raw = s.data[ci];
|
|
147
|
+
return raw == null || !Number.isFinite(raw) ? [] : [`${s.label}, ${c}: ${raw}`];
|
|
148
|
+
});
|
|
149
|
+
const dataValueItems = [...bars.flatMap(seriesItems), ...lines.flatMap(seriesItems)];
|
|
150
|
+
function handleLeave() {
|
|
151
|
+
setHovered(null);
|
|
152
|
+
}
|
|
153
|
+
function handleVisualPointerMove(event) {
|
|
154
|
+
const target = event.target;
|
|
155
|
+
if (!(target instanceof Element)) {
|
|
156
|
+
setHovered(null);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const kind = target.getAttribute("data-chart-kind");
|
|
160
|
+
const a = Number(target.getAttribute("data-chart-a"));
|
|
161
|
+
const b = Number(target.getAttribute("data-chart-b"));
|
|
162
|
+
if (kind === "bar" && Number.isInteger(a) && Number.isInteger(b)) {
|
|
163
|
+
setHovered({ kind: "bar", gi: a, si: b });
|
|
164
|
+
}
|
|
165
|
+
else if (kind === "line" && Number.isInteger(a) && Number.isInteger(b)) {
|
|
166
|
+
setHovered({ kind: "line", li: a, pi: b });
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
setHovered(null);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const tooltip = (() => {
|
|
173
|
+
if (!hovered)
|
|
174
|
+
return null;
|
|
175
|
+
if (hovered.kind === "bar") {
|
|
176
|
+
const seg = barGroups[hovered.gi]?.[hovered.si];
|
|
177
|
+
if (!seg)
|
|
178
|
+
return null;
|
|
179
|
+
return { cx: seg.cx, cy: seg.cy, label: `${seg.seriesLabel} · ${seg.category}`, value: seg.value };
|
|
180
|
+
}
|
|
181
|
+
const series = lineSeries[hovered.li];
|
|
182
|
+
const p = series?.points[hovered.pi];
|
|
183
|
+
if (!series || !p)
|
|
184
|
+
return null;
|
|
185
|
+
return { cx: p.x, cy: p.y, label: `${series.seriesLabel} · ${p.category}`, value: p.value };
|
|
186
|
+
})();
|
|
187
|
+
return (_jsxs("div", { ...rest, className: classNames("st-comboChart", className), children: [_jsx("div", { className: "st-comboChart__visual", role: "img", "aria-label": label, onPointerMove: handleVisualPointerMove, onPointerLeave: handleLeave, children: _jsxs("svg", { viewBox: `0 0 ${width} ${height}`, preserveAspectRatio: "xMidYMid meet", width: "100%", height: "100%", focusable: "false", "aria-hidden": "true", children: [leftGridLines.map((g) => (_jsxs(React.Fragment, { children: [_jsx("line", { className: "st-comboChart__grid", x1: MARGIN.left, x2: MARGIN.left + plotWidth, y1: g.y, y2: g.y }), _jsx("text", { className: "st-comboChart__tickLabel", x: MARGIN.left - 6, y: g.y, textAnchor: "end", dominantBaseline: "middle", children: formatTick(g.value) })] }, g.value))), rightTickEntries.map((g) => (_jsx("text", { className: "st-comboChart__tickLabel", x: MARGIN.left + plotWidth + 6, y: g.y, textAnchor: "start", dominantBaseline: "middle", children: formatTick(g.value) }, g.value))), _jsx("line", { className: "st-comboChart__axis", x1: MARGIN.left, x2: MARGIN.left, y1: MARGIN.top, y2: height - MARGIN.bottom }), _jsx("line", { className: "st-comboChart__axis", x1: MARGIN.left, x2: width - MARGIN.right, y1: height - MARGIN.bottom, y2: height - MARGIN.bottom }), lines.length > 0 ? (_jsx("line", { className: "st-comboChart__axis", x1: MARGIN.left + plotWidth, x2: MARGIN.left + plotWidth, y1: MARGIN.top, y2: height - MARGIN.bottom })) : null, leftAxisLabel ? (_jsx("text", { className: "st-comboChart__axisLabel", textAnchor: "middle", transform: `translate(${MARGIN.left - 40}, ${MARGIN.top + plotHeight / 2}) rotate(-90)`, children: leftAxisLabel })) : null, rightAxisLabel ? (_jsx("text", { className: "st-comboChart__axisLabel", textAnchor: "middle", transform: `translate(${MARGIN.left + plotWidth + 40}, ${MARGIN.top + plotHeight / 2}) rotate(90)`, children: rightAxisLabel })) : null, categories.map((category, ci) => (_jsx("text", { className: "st-comboChart__categoryLabel", x: bandCenter(ci), y: height - MARGIN.bottom + 16, textAnchor: "middle", children: category }, ci))), barGroups.map((group, gi) => group.map((seg, si) => (_jsx("rect", { className: `st-comboChart__bar st-comboChart__bar--${seg.tone}`, x: seg.x, y: seg.y, width: seg.width, height: seg.height, rx: "2", "data-chart-kind": "bar", "data-chart-a": gi, "data-chart-b": si }, `${gi}-${si}`)))), lineSeries.map((series, li) => (_jsxs(React.Fragment, { children: [_jsx("path", { className: `st-comboChart__line st-comboChart__line--${series.tone}`, d: series.path, fill: "none", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), series.points.map((p, pi) => (_jsx("circle", { className: `st-comboChart__dot st-comboChart__dot--${series.tone}`, cx: p.x, cy: p.y, r: "4", "data-chart-kind": "line", "data-chart-a": li, "data-chart-b": pi }, pi)))] }, li)))] }) }), _jsx(ChartDataList, { label: label, items: dataValueItems }), legend && legendItems.length > 0 ? (_jsx("ul", { className: "st-comboChart__legend", "aria-hidden": "true", children: legendItems.map((item) => (_jsxs("li", { className: "st-comboChart__legendItem", children: [_jsx("span", { className: `st-comboChart__legendSwatch st-comboChart__legendSwatch--${item.kind} st-comboChart__legendSwatch--${item.tone}` }), item.label] }, item.key))) })) : null, tooltip ? (_jsxs("div", { className: "st-comboChart__tooltip", role: "presentation", style: { left: `${(tooltip.cx / width) * 100}%`, top: `${(tooltip.cy / height) * 100}%` }, children: [_jsx("span", { className: "st-comboChart__tooltipLabel", children: tooltip.label }), _jsx("span", { className: "st-comboChart__tooltipValue", children: tooltip.value })] })) : null] }));
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=ComboChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComboChart.js","sourceRoot":"","sources":["../src/ComboChart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type FunnelChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
|
|
3
|
+
export type FunnelChartDatum = {
|
|
4
|
+
label: string;
|
|
5
|
+
value: number;
|
|
6
|
+
tone?: FunnelChartTone;
|
|
7
|
+
};
|
|
8
|
+
export type FunnelChartProps = Omit<React.HTMLAttributes<HTMLDivElement>, "className"> & {
|
|
9
|
+
data: FunnelChartDatum[];
|
|
10
|
+
orientation?: "vertical" | "horizontal";
|
|
11
|
+
showPercentages?: boolean;
|
|
12
|
+
percentMode?: "ofFirst" | "ofPrevious";
|
|
13
|
+
legend?: boolean;
|
|
14
|
+
label: string;
|
|
15
|
+
width?: number;
|
|
16
|
+
height?: number;
|
|
17
|
+
className?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function FunnelChart({ data, orientation, showPercentages, percentMode, legend, label, width, height, className, ...rest }: FunnelChartProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=FunnelChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunnelChart.d.ts","sourceRoot":"","sources":["../src/FunnelChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,GAAG;IACvF,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAoBF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,WAAwB,EACxB,eAAsB,EACtB,WAAuB,EACvB,MAAc,EACd,KAAK,EACL,KAAW,EACX,MAAY,EACZ,SAAS,EACT,GAAG,IAAI,EACR,EAAE,gBAAgB,2CA0MlB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { classNames } from "./classNames.js";
|
|
4
|
+
import { ChartDataList } from "./chartScale.js";
|
|
5
|
+
import { contrastTextForTone } from "./chartContrast.js";
|
|
6
|
+
const MARGIN = { top: 16, right: 16, bottom: 16, left: 16 };
|
|
7
|
+
const GAP = 6;
|
|
8
|
+
const TONES = [
|
|
9
|
+
"category1",
|
|
10
|
+
"category2",
|
|
11
|
+
"category3",
|
|
12
|
+
"category4",
|
|
13
|
+
"category5",
|
|
14
|
+
"category6",
|
|
15
|
+
"category7",
|
|
16
|
+
"category8",
|
|
17
|
+
];
|
|
18
|
+
function formatPercent(p) {
|
|
19
|
+
if (!Number.isFinite(p))
|
|
20
|
+
return "0%";
|
|
21
|
+
return `${p % 1 === 0 ? p.toFixed(0) : p.toFixed(1)}%`;
|
|
22
|
+
}
|
|
23
|
+
export function FunnelChart({ data, orientation = "vertical", showPercentages = true, percentMode = "ofFirst", legend = false, label, width = 480, height = 280, className, ...rest }) {
|
|
24
|
+
const [hoveredIndex, setHoveredIndex] = React.useState(null);
|
|
25
|
+
// Pourcentages calculés par rapport à la première étape ou à la précédente.
|
|
26
|
+
// Référence nulle → 0% (pas de NaN), première étape ofPrevious → 100%.
|
|
27
|
+
const percents = (() => {
|
|
28
|
+
const first = data[0]?.value ?? 0;
|
|
29
|
+
return data.map((d, i) => {
|
|
30
|
+
const ref = percentMode === "ofPrevious" ? (data[i - 1]?.value ?? d.value) : first;
|
|
31
|
+
return ref === 0 ? 0 : (d.value / ref) * 100;
|
|
32
|
+
});
|
|
33
|
+
})();
|
|
34
|
+
// Trapèzes décroissants centrés : la demi-largeur de chaque étape est
|
|
35
|
+
// proportionnelle à sa valeur (relative au max). Les segments se rejoignent.
|
|
36
|
+
const segments = (() => {
|
|
37
|
+
if (data.length === 0)
|
|
38
|
+
return [];
|
|
39
|
+
const maxValue = Math.max(0, ...data.map((d) => Math.abs(d.value)));
|
|
40
|
+
const safeMax = maxValue === 0 ? 1 : maxValue;
|
|
41
|
+
const plotW = Math.max(width - MARGIN.left - MARGIN.right, 1);
|
|
42
|
+
const plotH = Math.max(height - MARGIN.top - MARGIN.bottom, 1);
|
|
43
|
+
if (orientation === "vertical") {
|
|
44
|
+
const band = plotH / data.length;
|
|
45
|
+
const segH = Math.max(band - GAP, 1);
|
|
46
|
+
const cx = MARGIN.left + plotW / 2;
|
|
47
|
+
return data.map((d, i) => {
|
|
48
|
+
const tone = d.tone ?? TONES[i % TONES.length];
|
|
49
|
+
const topHalf = (Math.abs(d.value) / safeMax) * (plotW / 2);
|
|
50
|
+
const nextVal = data[i + 1] ? Math.abs(data[i + 1].value) : Math.abs(d.value);
|
|
51
|
+
const botHalf = Math.min((nextVal / safeMax) * (plotW / 2), topHalf);
|
|
52
|
+
const y0 = MARGIN.top + band * i;
|
|
53
|
+
const y1 = y0 + segH;
|
|
54
|
+
const points = [
|
|
55
|
+
`${cx - topHalf},${y0}`,
|
|
56
|
+
`${cx + topHalf},${y0}`,
|
|
57
|
+
`${cx + botHalf},${y1}`,
|
|
58
|
+
`${cx - botHalf},${y1}`,
|
|
59
|
+
].join(" ");
|
|
60
|
+
return {
|
|
61
|
+
points,
|
|
62
|
+
datum: d,
|
|
63
|
+
tone,
|
|
64
|
+
textColor: contrastTextForTone(tone),
|
|
65
|
+
cx,
|
|
66
|
+
cy: (y0 + y1) / 2,
|
|
67
|
+
labelX: cx,
|
|
68
|
+
labelY: (y0 + y1) / 2,
|
|
69
|
+
percent: percents[i],
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// horizontal : entonnoir qui se rétrécit de gauche à droite.
|
|
74
|
+
const band = plotW / data.length;
|
|
75
|
+
const segW = Math.max(band - GAP, 1);
|
|
76
|
+
const cy = MARGIN.top + plotH / 2;
|
|
77
|
+
return data.map((d, i) => {
|
|
78
|
+
const tone = d.tone ?? TONES[i % TONES.length];
|
|
79
|
+
const leftHalf = (Math.abs(d.value) / safeMax) * (plotH / 2);
|
|
80
|
+
const nextVal = data[i + 1] ? Math.abs(data[i + 1].value) : Math.abs(d.value);
|
|
81
|
+
const rightHalf = Math.min((nextVal / safeMax) * (plotH / 2), leftHalf);
|
|
82
|
+
const x0 = MARGIN.left + band * i;
|
|
83
|
+
const x1 = x0 + segW;
|
|
84
|
+
const points = [
|
|
85
|
+
`${x0},${cy - leftHalf}`,
|
|
86
|
+
`${x1},${cy - rightHalf}`,
|
|
87
|
+
`${x1},${cy + rightHalf}`,
|
|
88
|
+
`${x0},${cy + leftHalf}`,
|
|
89
|
+
].join(" ");
|
|
90
|
+
return {
|
|
91
|
+
points,
|
|
92
|
+
datum: d,
|
|
93
|
+
tone,
|
|
94
|
+
textColor: contrastTextForTone(tone),
|
|
95
|
+
cx: (x0 + x1) / 2,
|
|
96
|
+
cy,
|
|
97
|
+
labelX: (x0 + x1) / 2,
|
|
98
|
+
labelY: cy,
|
|
99
|
+
percent: percents[i],
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
})();
|
|
103
|
+
const dataValueItems = data.map((d, i) => showPercentages ? `${d.label}: ${d.value} (${formatPercent(percents[i])})` : `${d.label}: ${d.value}`);
|
|
104
|
+
const legendItems = data.map((d, i) => ({ label: d.label, tone: d.tone ?? TONES[i % TONES.length] }));
|
|
105
|
+
function handleVisualPointerMove(event) {
|
|
106
|
+
const target = event.target;
|
|
107
|
+
if (!(target instanceof Element)) {
|
|
108
|
+
setHoveredIndex(null);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const index = Number(target.getAttribute("data-chart-index"));
|
|
112
|
+
setHoveredIndex(Number.isInteger(index) ? index : null);
|
|
113
|
+
}
|
|
114
|
+
const hoveredSeg = hoveredIndex !== null ? segments[hoveredIndex] : undefined;
|
|
115
|
+
return (_jsxs("div", { ...rest, className: classNames("st-funnelChart", className), children: [_jsx("div", { className: "st-funnelChart__visual", role: "img", "aria-label": label, onPointerMove: handleVisualPointerMove, onPointerLeave: () => setHoveredIndex(null), children: _jsxs("svg", { viewBox: `0 0 ${width} ${height}`, preserveAspectRatio: "xMidYMid meet", width: "100%", height: "100%", focusable: "false", "aria-hidden": "true", children: [segments.map((seg, i) => (_jsx("polygon", { className: classNames("st-funnelChart__segment", `st-funnelChart__segment--${seg.tone}`, hoveredIndex !== null && hoveredIndex !== i && "st-funnelChart__segment--dim"), points: seg.points, "data-chart-index": i }, seg.datum.label))), segments.map((seg) => (_jsxs(React.Fragment, { children: [_jsx("text", { className: "st-funnelChart__label", x: seg.labelX, y: seg.labelY - 6, textAnchor: "middle", dominantBaseline: "middle", style: { fill: seg.textColor }, children: seg.datum.label }), _jsxs("text", { className: "st-funnelChart__value", x: seg.labelX, y: seg.labelY + 8, textAnchor: "middle", dominantBaseline: "middle", style: { fill: seg.textColor }, children: [seg.datum.value, showPercentages ? ` · ${formatPercent(seg.percent)}` : null] })] }, seg.datum.label)))] }) }), _jsx(ChartDataList, { label: label, items: dataValueItems }), hoveredSeg ? (_jsxs("div", { className: "st-funnelChart__tooltip", role: "presentation", style: { left: `${(hoveredSeg.cx / width) * 100}%`, top: `${(hoveredSeg.cy / height) * 100}%` }, children: [_jsx("span", { className: "st-funnelChart__tooltipLabel", children: hoveredSeg.datum.label }), _jsxs("span", { className: "st-funnelChart__tooltipValue", children: [hoveredSeg.datum.value, showPercentages ? ` · ${formatPercent(hoveredSeg.percent)}` : null] })] })) : null, legend && legendItems.length > 0 ? (_jsx("ul", { className: "st-funnelChart__legend", "aria-hidden": "true", children: legendItems.map((item) => (_jsxs("li", { className: "st-funnelChart__legendItem", children: [_jsx("span", { className: `st-funnelChart__legendSwatch st-funnelChart__legendSwatch--${item.tone}`, "aria-hidden": "true" }), item.label] }, item.label))) })) : null] }));
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=FunnelChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunnelChart.js","sourceRoot":"","sources":["../src/FunnelChart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type GaugeChartTone = "neutral" | "info" | "success" | "warning" | "error" | "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
|
|
3
|
+
/**
|
|
4
|
+
* Seuil de coloration. La bande s'étend depuis `value` (ou le minimum)
|
|
5
|
+
* jusqu'au seuil suivant (ou le maximum). `tone` choisit la couleur.
|
|
6
|
+
*/
|
|
7
|
+
export type GaugeChartThreshold = {
|
|
8
|
+
value: number;
|
|
9
|
+
tone: GaugeChartTone;
|
|
10
|
+
};
|
|
11
|
+
export type GaugeChartFormat = "number" | "percent";
|
|
12
|
+
export type GaugeChartProps = Omit<React.HTMLAttributes<HTMLDivElement>, "className"> & {
|
|
13
|
+
value: number;
|
|
14
|
+
min?: number;
|
|
15
|
+
max?: number;
|
|
16
|
+
/** Bandes colorées sur la piste. Triées par `value` croissante. */
|
|
17
|
+
thresholds?: GaugeChartThreshold[];
|
|
18
|
+
/** Libellé décrivant la jauge (a11y + texte sous la valeur). */
|
|
19
|
+
label?: string;
|
|
20
|
+
/** Format de la valeur centrale. */
|
|
21
|
+
format?: GaugeChartFormat;
|
|
22
|
+
/** Suffixe d'unité (ignoré pour `percent`). */
|
|
23
|
+
unit?: string;
|
|
24
|
+
/** Diamètre du SVG. */
|
|
25
|
+
size?: number;
|
|
26
|
+
/** Épaisseur de l'arc. */
|
|
27
|
+
thickness?: number;
|
|
28
|
+
/** Angle de départ en degrés (0 = est, sens horaire). */
|
|
29
|
+
startAngle?: number;
|
|
30
|
+
/** Angle de fin en degrés. */
|
|
31
|
+
endAngle?: number;
|
|
32
|
+
className?: string;
|
|
33
|
+
};
|
|
34
|
+
export declare function GaugeChart({ value, min, max, thresholds, label, format, unit, size, thickness, startAngle, endAngle, className, ...rest }: GaugeChartProps): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
//# sourceMappingURL=GaugeChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GaugeChart.d.ts","sourceRoot":"","sources":["../src/GaugeChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,GACP,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,GAAG;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAWF,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,GAAO,EACP,GAAS,EACT,UAAU,EACV,KAAK,EACL,MAAiB,EACjB,IAAI,EACJ,IAAU,EACV,SAAc,EACd,UAAgB,EAChB,QAAc,EACd,SAAS,EACT,GAAG,IAAI,EACR,EAAE,eAAe,2CAyLjB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { classNames } from "./classNames.js";
|
|
4
|
+
import { ChartDataList } from "./chartScale.js";
|
|
5
|
+
const toRad = (deg) => (deg * Math.PI) / 180;
|
|
6
|
+
const polar = (radius, angle, centerX, centerY) => [centerX + radius * Math.cos(angle), centerY + radius * Math.sin(angle)];
|
|
7
|
+
export function GaugeChart({ value, min = 0, max = 100, thresholds, label, format = "number", unit, size = 220, thickness = 22, startAngle = 180, endAngle = 360, className, ...rest }) {
|
|
8
|
+
const TAU = Math.PI * 2;
|
|
9
|
+
// Bornes assainies : min/max non finis ou inversés → domaine neutre [0,0].
|
|
10
|
+
const safeMin = Number.isFinite(min) ? min : 0;
|
|
11
|
+
const safeMax = Number.isFinite(max) ? max : safeMin;
|
|
12
|
+
const span = Math.max(safeMax - safeMin, 0);
|
|
13
|
+
// Valeur assainie puis bornée à [min,max] (jamais NaN dans l'ARIA/géométrie).
|
|
14
|
+
const safeValue = Number.isFinite(value) ? value : safeMin;
|
|
15
|
+
const clamped = Math.min(Math.max(safeValue, safeMin), safeMax);
|
|
16
|
+
const frac = span > 0 ? (clamped - safeMin) / span : 0;
|
|
17
|
+
// Géométrie commune.
|
|
18
|
+
const cx = size / 2;
|
|
19
|
+
const r = size / 2 - thickness / 2 - 2;
|
|
20
|
+
const a0 = toRad(startAngle);
|
|
21
|
+
const a1 = toRad(endAngle);
|
|
22
|
+
// Un tour complet (|Δ| ≥ 2π) est borné à 2π−ε : sinon l'arc SVG dégénère
|
|
23
|
+
// (départ == arrivée → arc de longueur nulle au lieu d'un cercle plein).
|
|
24
|
+
const rawTotal = a1 - a0;
|
|
25
|
+
const totalAngle = Math.abs(rawTotal) >= TAU ? Math.sign(rawTotal || 1) * (TAU - 1e-3) : rawTotal;
|
|
26
|
+
// Hauteur réelle de l'arc pour cadrer le viewBox (demi-cercle → moitié).
|
|
27
|
+
const geometry = (() => {
|
|
28
|
+
const cyRaw = size / 2;
|
|
29
|
+
// Échantillonnage des extrema y/x pour un cadrage stable quel que soit l'angle.
|
|
30
|
+
const samples = 64;
|
|
31
|
+
let minY = Infinity;
|
|
32
|
+
let maxY = -Infinity;
|
|
33
|
+
for (let i = 0; i <= samples; i++) {
|
|
34
|
+
const a = a0 + (totalAngle * i) / samples;
|
|
35
|
+
const yOuter = cyRaw + (r + thickness / 2) * Math.sin(a);
|
|
36
|
+
minY = Math.min(minY, yOuter);
|
|
37
|
+
maxY = Math.max(maxY, yOuter);
|
|
38
|
+
}
|
|
39
|
+
minY = Math.min(minY, cyRaw - (r + thickness / 2));
|
|
40
|
+
const vbHeight = Math.min(maxY, size) - Math.max(minY, 0);
|
|
41
|
+
return { cy: cyRaw, vbTop: Math.max(minY, 0), vbHeight: Math.max(vbHeight, thickness) };
|
|
42
|
+
})();
|
|
43
|
+
const cy = geometry.cy;
|
|
44
|
+
function arcPath(fromFrac, toFrac) {
|
|
45
|
+
const from = a0 + totalAngle * fromFrac;
|
|
46
|
+
const to = a0 + totalAngle * toFrac;
|
|
47
|
+
const [x0, y0] = polar(r, from, cx, cy);
|
|
48
|
+
const [x1, y1] = polar(r, to, cx, cy);
|
|
49
|
+
const large = Math.abs(to - from) > Math.PI ? 1 : 0;
|
|
50
|
+
const sweep = totalAngle >= 0 ? 1 : 0;
|
|
51
|
+
return `M ${x0} ${y0} A ${r} ${r} 0 ${large} ${sweep} ${x1} ${y1}`;
|
|
52
|
+
}
|
|
53
|
+
// Bandes colorées issues des seuils.
|
|
54
|
+
const bands = (() => {
|
|
55
|
+
if (!thresholds || thresholds.length === 0 || span <= 0)
|
|
56
|
+
return [];
|
|
57
|
+
const sorted = [...thresholds]
|
|
58
|
+
.filter((t) => Number.isFinite(t.value))
|
|
59
|
+
.sort((a, b) => a.value - b.value);
|
|
60
|
+
const segments = [];
|
|
61
|
+
let start = safeMin;
|
|
62
|
+
for (const t of sorted) {
|
|
63
|
+
const end = Math.min(Math.max(t.value, safeMin), safeMax);
|
|
64
|
+
if (end <= start)
|
|
65
|
+
continue;
|
|
66
|
+
segments.push({ from: (start - safeMin) / span, to: (end - safeMin) / span, tone: t.tone });
|
|
67
|
+
start = end;
|
|
68
|
+
}
|
|
69
|
+
if (start < safeMax) {
|
|
70
|
+
const lastTone = sorted[sorted.length - 1]?.tone ?? "neutral";
|
|
71
|
+
segments.push({ from: (start - safeMin) / span, to: 1, tone: lastTone });
|
|
72
|
+
}
|
|
73
|
+
return segments;
|
|
74
|
+
})();
|
|
75
|
+
// Ton de la bande active (celle qui contient la valeur) pour l'a11y.
|
|
76
|
+
const activeBand = bands.find((b) => frac >= b.from && frac <= b.to) ?? bands[bands.length - 1];
|
|
77
|
+
const BAND_LABELS = {
|
|
78
|
+
neutral: "neutre",
|
|
79
|
+
info: "information",
|
|
80
|
+
success: "succès",
|
|
81
|
+
warning: "alerte",
|
|
82
|
+
error: "erreur",
|
|
83
|
+
category1: "catégorie 1",
|
|
84
|
+
category2: "catégorie 2",
|
|
85
|
+
category3: "catégorie 3",
|
|
86
|
+
category4: "catégorie 4",
|
|
87
|
+
category5: "catégorie 5",
|
|
88
|
+
category6: "catégorie 6",
|
|
89
|
+
category7: "catégorie 7",
|
|
90
|
+
category8: "catégorie 8",
|
|
91
|
+
};
|
|
92
|
+
// Position de l'aiguille.
|
|
93
|
+
const needle = (() => {
|
|
94
|
+
const a = a0 + totalAngle * frac;
|
|
95
|
+
const tip = polar(r + thickness / 2, a, cx, cy);
|
|
96
|
+
const left = polar(thickness * 0.18, a + Math.PI / 2, cx, cy);
|
|
97
|
+
const right = polar(thickness * 0.18, a - Math.PI / 2, cx, cy);
|
|
98
|
+
return `M ${left[0]} ${left[1]} L ${tip[0]} ${tip[1]} L ${right[0]} ${right[1]} Z`;
|
|
99
|
+
})();
|
|
100
|
+
const formatted = (() => {
|
|
101
|
+
if (format === "percent") {
|
|
102
|
+
const pct = span > 0 ? Math.round(frac * 100) : 0;
|
|
103
|
+
return `${pct}%`;
|
|
104
|
+
}
|
|
105
|
+
const num = Number.isInteger(clamped) ? String(clamped) : clamped.toFixed(1);
|
|
106
|
+
return unit ? `${num} ${unit}` : num;
|
|
107
|
+
})();
|
|
108
|
+
const zoneText = activeBand ? `, zone ${BAND_LABELS[activeBand.tone]}` : "";
|
|
109
|
+
const ariaValueText = `${label ? `${label}: ` : ""}${formatted}${zoneText}`;
|
|
110
|
+
const dataValueItems = [
|
|
111
|
+
`${label ? `${label}: ` : ""}${formatted} (min ${safeMin}, max ${safeMax})${zoneText}`,
|
|
112
|
+
];
|
|
113
|
+
return (_jsxs("div", { ...rest, className: classNames("st-gaugeChart", className), children: [_jsx("div", { className: "st-gaugeChart__visual", role: "meter", "aria-valuenow": clamped, "aria-valuemin": min, "aria-valuemax": max, "aria-valuetext": ariaValueText, "aria-label": label, children: _jsxs("svg", { viewBox: `0 ${geometry.vbTop} ${size} ${geometry.vbHeight}`, width: "100%", height: "100%", focusable: "false", "aria-hidden": "true", children: [_jsx("path", { className: "st-gaugeChart__track", d: arcPath(0, 1), fill: "none", strokeWidth: thickness }), bands.map((band, i) => (_jsx("path", { className: `st-gaugeChart__band st-gaugeChart__band--${band.tone}`, d: arcPath(band.from, band.to), fill: "none", strokeWidth: thickness }, i))), bands.length === 0 ? (_jsx("path", { className: "st-gaugeChart__progress", d: arcPath(0, frac), fill: "none", strokeWidth: thickness })) : null, _jsx("path", { className: "st-gaugeChart__needle", d: needle }), _jsx("circle", { className: "st-gaugeChart__hub", cx: cx, cy: cy, r: Math.max(thickness * 0.22, 4) }), _jsx("text", { className: "st-gaugeChart__value", x: cx, y: cy - thickness * 0.55, textAnchor: "middle", dominantBaseline: "auto", children: formatted }), label ? (_jsx("text", { className: "st-gaugeChart__label", x: cx, y: cy - thickness * 0.05, textAnchor: "middle", dominantBaseline: "hanging", children: label })) : null] }) }), _jsx(ChartDataList, { label: label ?? "gauge", items: dataValueItems })] }));
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=GaugeChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GaugeChart.js","sourceRoot":"","sources":["../src/GaugeChart.tsx"],"names":[],"mappings":"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"}
|