@sentropic/design-system-react 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/ComboChart.d.ts +27 -0
  2. package/dist/ComboChart.d.ts.map +1 -0
  3. package/dist/ComboChart.js +189 -0
  4. package/dist/ComboChart.js.map +1 -0
  5. package/dist/FunnelChart.d.ts +20 -0
  6. package/dist/FunnelChart.d.ts.map +1 -0
  7. package/dist/FunnelChart.js +117 -0
  8. package/dist/FunnelChart.js.map +1 -0
  9. package/dist/GaugeChart.d.ts +35 -0
  10. package/dist/GaugeChart.d.ts.map +1 -0
  11. package/dist/GaugeChart.js +115 -0
  12. package/dist/GaugeChart.js.map +1 -0
  13. package/dist/KpiCard.d.ts +45 -0
  14. package/dist/KpiCard.d.ts.map +1 -0
  15. package/dist/KpiCard.js +67 -0
  16. package/dist/KpiCard.js.map +1 -0
  17. package/dist/Popper.d.ts +18 -1
  18. package/dist/Popper.d.ts.map +1 -1
  19. package/dist/Popper.js +126 -3
  20. package/dist/Popper.js.map +1 -1
  21. package/dist/SelectableList.d.ts.map +1 -1
  22. package/dist/SelectableList.js +47 -15
  23. package/dist/SelectableList.js.map +1 -1
  24. package/dist/SelectableRow.d.ts +8 -6
  25. package/dist/SelectableRow.d.ts.map +1 -1
  26. package/dist/SelectableRow.js +16 -5
  27. package/dist/SelectableRow.js.map +1 -1
  28. package/dist/TreemapChart.d.ts +25 -0
  29. package/dist/TreemapChart.d.ts.map +1 -0
  30. package/dist/TreemapChart.js +179 -0
  31. package/dist/TreemapChart.js.map +1 -0
  32. package/dist/WaterfallChart.d.ts +18 -0
  33. package/dist/WaterfallChart.d.ts.map +1 -0
  34. package/dist/WaterfallChart.js +133 -0
  35. package/dist/WaterfallChart.js.map +1 -0
  36. package/dist/catalog.d.ts.map +1 -1
  37. package/dist/catalog.js +351 -44
  38. package/dist/catalog.js.map +1 -1
  39. package/dist/chartContrast.d.ts +6 -0
  40. package/dist/chartContrast.d.ts.map +1 -0
  41. package/dist/chartContrast.js +59 -0
  42. package/dist/chartContrast.js.map +1 -0
  43. package/dist/chartScale.d.ts +6 -0
  44. package/dist/chartScale.d.ts.map +1 -1
  45. package/dist/chartScale.js +41 -0
  46. package/dist/chartScale.js.map +1 -1
  47. package/dist/index.d.ts +12 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +6 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/styles.css +739 -2
  52. 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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"}