@sentropic/design-system-vue 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 (59) hide show
  1. package/dist/Calendar.d.ts.map +1 -1
  2. package/dist/Calendar.js +235 -74
  3. package/dist/Calendar.js.map +1 -1
  4. package/dist/ComboChart.d.ts +119 -0
  5. package/dist/ComboChart.d.ts.map +1 -0
  6. package/dist/ComboChart.js +280 -0
  7. package/dist/ComboChart.js.map +1 -0
  8. package/dist/FunnelChart.d.ts +103 -0
  9. package/dist/FunnelChart.d.ts.map +1 -0
  10. package/dist/FunnelChart.js +191 -0
  11. package/dist/FunnelChart.js.map +1 -0
  12. package/dist/GaugeChart.d.ts +134 -0
  13. package/dist/GaugeChart.d.ts.map +1 -0
  14. package/dist/GaugeChart.js +152 -0
  15. package/dist/GaugeChart.js.map +1 -0
  16. package/dist/KpiCard.d.ts +151 -0
  17. package/dist/KpiCard.d.ts.map +1 -0
  18. package/dist/KpiCard.js +155 -0
  19. package/dist/KpiCard.js.map +1 -0
  20. package/dist/Popper.d.ts +58 -0
  21. package/dist/Popper.d.ts.map +1 -1
  22. package/dist/Popper.js +136 -5
  23. package/dist/Popper.js.map +1 -1
  24. package/dist/Rating.d.ts.map +1 -1
  25. package/dist/Rating.js +111 -18
  26. package/dist/Rating.js.map +1 -1
  27. package/dist/SelectableList.d.ts +2 -0
  28. package/dist/SelectableList.d.ts.map +1 -1
  29. package/dist/SelectableList.js +72 -21
  30. package/dist/SelectableList.js.map +1 -1
  31. package/dist/SelectableRow.d.ts +2 -2
  32. package/dist/SelectableRow.d.ts.map +1 -1
  33. package/dist/SelectableRow.js +15 -5
  34. package/dist/SelectableRow.js.map +1 -1
  35. package/dist/SlideIndicator.d.ts.map +1 -1
  36. package/dist/SlideIndicator.js +12 -5
  37. package/dist/SlideIndicator.js.map +1 -1
  38. package/dist/TimePicker.d.ts +1 -1
  39. package/dist/TimePicker.d.ts.map +1 -1
  40. package/dist/TimePicker.js +150 -14
  41. package/dist/TimePicker.js.map +1 -1
  42. package/dist/TreemapChart.d.ts +95 -0
  43. package/dist/TreemapChart.d.ts.map +1 -0
  44. package/dist/TreemapChart.js +255 -0
  45. package/dist/TreemapChart.js.map +1 -0
  46. package/dist/WaterfallChart.d.ts +84 -0
  47. package/dist/WaterfallChart.d.ts.map +1 -0
  48. package/dist/WaterfallChart.js +186 -0
  49. package/dist/WaterfallChart.js.map +1 -0
  50. package/dist/chartScale.d.ts +4 -0
  51. package/dist/chartScale.d.ts.map +1 -1
  52. package/dist/chartScale.js +44 -0
  53. package/dist/chartScale.js.map +1 -1
  54. package/dist/index.d.ts +14 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +7 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/styles.css +721 -2
  59. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ export type TreemapChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
2
+ export type TreemapChartDatum = {
3
+ label: string;
4
+ value: number;
5
+ tone?: TreemapChartTone;
6
+ children?: TreemapChartDatum[];
7
+ };
8
+ export type TreemapTiling = "squarified";
9
+ export type TreemapChartProps = {
10
+ data: TreemapChartDatum[];
11
+ tiling?: TreemapTiling;
12
+ showLabels?: boolean;
13
+ legend?: boolean;
14
+ width?: number;
15
+ height?: number;
16
+ label: string;
17
+ class?: string;
18
+ };
19
+ export declare const TreemapChart: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
20
+ data: {
21
+ type: () => TreemapChartDatum[];
22
+ required: true;
23
+ };
24
+ tiling: {
25
+ type: () => TreemapTiling;
26
+ default: string;
27
+ };
28
+ showLabels: {
29
+ type: BooleanConstructor;
30
+ default: boolean;
31
+ };
32
+ legend: {
33
+ type: BooleanConstructor;
34
+ default: boolean;
35
+ };
36
+ width: {
37
+ type: NumberConstructor;
38
+ default: number;
39
+ };
40
+ height: {
41
+ type: NumberConstructor;
42
+ default: number;
43
+ };
44
+ label: {
45
+ type: StringConstructor;
46
+ required: true;
47
+ };
48
+ class: {
49
+ type: StringConstructor;
50
+ default: undefined;
51
+ };
52
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
53
+ [key: string]: any;
54
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
55
+ data: {
56
+ type: () => TreemapChartDatum[];
57
+ required: true;
58
+ };
59
+ tiling: {
60
+ type: () => TreemapTiling;
61
+ default: string;
62
+ };
63
+ showLabels: {
64
+ type: BooleanConstructor;
65
+ default: boolean;
66
+ };
67
+ legend: {
68
+ type: BooleanConstructor;
69
+ default: boolean;
70
+ };
71
+ width: {
72
+ type: NumberConstructor;
73
+ default: number;
74
+ };
75
+ height: {
76
+ type: NumberConstructor;
77
+ default: number;
78
+ };
79
+ label: {
80
+ type: StringConstructor;
81
+ required: true;
82
+ };
83
+ class: {
84
+ type: StringConstructor;
85
+ default: undefined;
86
+ };
87
+ }>> & Readonly<{}>, {
88
+ class: string;
89
+ legend: boolean;
90
+ width: number;
91
+ height: number;
92
+ showLabels: boolean;
93
+ tiling: "squarified";
94
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
95
+ //# sourceMappingURL=TreemapChart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreemapChart.d.ts","sourceRoot":"","sources":["../src/TreemapChart.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA+GF,eAAO,MAAM,YAAY;;cAGE,MAAM,iBAAiB,EAAE;;;;cACtB,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cADtB,MAAM,iBAAiB,EAAE;;;;cACtB,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EAgO/C,CAAC"}
@@ -0,0 +1,255 @@
1
+ import { defineComponent, h, ref } from "vue";
2
+ import { classNames } from "./classNames.js";
3
+ import { chartDataList, labelColorForTone } from "./chartScale.js";
4
+ const TONES = [
5
+ "category1",
6
+ "category2",
7
+ "category3",
8
+ "category4",
9
+ "category5",
10
+ "category6",
11
+ "category7",
12
+ "category8",
13
+ ];
14
+ const PADDING = 2;
15
+ const sumValue = (d) => {
16
+ if (d.children && d.children.length > 0) {
17
+ return d.children.reduce((s, c) => s + sumValue(c), 0);
18
+ }
19
+ return Math.max(d.value, 0);
20
+ };
21
+ function squarify(nodes, rect) {
22
+ const out = [];
23
+ const total = nodes.reduce((s, n) => s + n.value, 0);
24
+ if (total <= 0 || nodes.length === 0)
25
+ return out;
26
+ const area = rect.w * rect.h;
27
+ const scale = area / total;
28
+ const items = nodes.map((n) => ({ datum: n.datum, value: n.value, area: n.value * scale }));
29
+ let free = { ...rect };
30
+ let row = [];
31
+ const worst = (r, side) => {
32
+ if (r.length === 0 || side <= 0)
33
+ return Infinity;
34
+ const s = r.reduce((acc, it) => acc + it.area, 0);
35
+ let max = -Infinity;
36
+ let min = Infinity;
37
+ for (const it of r) {
38
+ if (it.area > max)
39
+ max = it.area;
40
+ if (it.area < min)
41
+ min = it.area;
42
+ }
43
+ const s2 = s * s;
44
+ const side2 = side * side;
45
+ return Math.max((side2 * max) / s2, s2 / (side2 * min));
46
+ };
47
+ const layoutRow = (r, side, area2) => {
48
+ const s = r.reduce((acc, it) => acc + it.area, 0);
49
+ if (side <= 0)
50
+ return area2;
51
+ const thickness = s / side;
52
+ if (area2.w >= area2.h) {
53
+ let oy = area2.y;
54
+ for (const it of r) {
55
+ const hh = it.area / thickness;
56
+ out.push({ datum: it.datum, value: it.value, rect: { x: area2.x, y: oy, w: thickness, h: hh } });
57
+ oy += hh;
58
+ }
59
+ return { x: area2.x + thickness, y: area2.y, w: area2.w - thickness, h: area2.h };
60
+ }
61
+ else {
62
+ let ox = area2.x;
63
+ for (const it of r) {
64
+ const w = it.area / thickness;
65
+ out.push({ datum: it.datum, value: it.value, rect: { x: ox, y: area2.y, w, h: thickness } });
66
+ ox += w;
67
+ }
68
+ return { x: area2.x, y: area2.y + thickness, w: area2.w, h: area2.h - thickness };
69
+ }
70
+ };
71
+ for (const it of items) {
72
+ const side = Math.min(free.w, free.h);
73
+ const next = [...row, it];
74
+ if (row.length === 0 || worst(next, side) <= worst(row, side)) {
75
+ row = next;
76
+ }
77
+ else {
78
+ free = layoutRow(row, side, free);
79
+ row = [it];
80
+ }
81
+ }
82
+ if (row.length > 0) {
83
+ free = layoutRow(row, Math.min(free.w, free.h), free);
84
+ }
85
+ return out;
86
+ }
87
+ function inset(r, pad) {
88
+ const w = Math.max(r.w - pad * 2, 0);
89
+ const h = Math.max(r.h - pad * 2, 0);
90
+ return { x: r.x + pad, y: r.y + pad, w, h };
91
+ }
92
+ const LABEL_MIN_W = 44;
93
+ const LABEL_MIN_H = 22;
94
+ const VALUE_MIN_H = 38;
95
+ export const TreemapChart = defineComponent({
96
+ name: "TreemapChart",
97
+ props: {
98
+ data: { type: Array, required: true },
99
+ tiling: { type: String, default: "squarified" },
100
+ showLabels: { type: Boolean, default: true },
101
+ legend: { type: Boolean, default: false },
102
+ width: { type: Number, default: 480 },
103
+ height: { type: Number, default: 300 },
104
+ label: { type: String, required: true },
105
+ class: { type: String, default: undefined },
106
+ },
107
+ setup(props, { attrs }) {
108
+ const hoveredIndex = ref(null);
109
+ function handleLeave() {
110
+ hoveredIndex.value = null;
111
+ }
112
+ function handleVisualPointerMove(event) {
113
+ const target = event.target;
114
+ if (!(target instanceof Element)) {
115
+ hoveredIndex.value = null;
116
+ return;
117
+ }
118
+ const index = Number(target.getAttribute("data-chart-index"));
119
+ hoveredIndex.value = Number.isInteger(index) ? index : null;
120
+ }
121
+ return () => {
122
+ const data = props.data;
123
+ const showLabels = props.showLabels ?? true;
124
+ const legend = props.legend ?? false;
125
+ const width = props.width ?? 480;
126
+ const height = props.height ?? 300;
127
+ const label = props.label;
128
+ let cells = [];
129
+ if (data && data.length !== 0) {
130
+ // Squarify produit de meilleurs ratios d'aspect quand l'entrée est triée
131
+ // par valeur décroissante (voir Bruls, Huizing, van Wijk 2000).
132
+ const roots = data
133
+ .map((d, i) => ({ datum: d, value: sumValue(d), tone: d.tone ?? TONES[i % TONES.length] }))
134
+ .filter((n) => n.value > 0)
135
+ .sort((a, b) => b.value - a.value);
136
+ if (roots.length !== 0) {
137
+ const topRects = squarify(roots.map((r) => ({ datum: r.datum, value: r.value })), { x: 0, y: 0, w: width, h: height });
138
+ const result = [];
139
+ topRects.forEach((tr) => {
140
+ const root = roots.find((r) => r.datum === tr.datum);
141
+ const children = (tr.datum.children ?? [])
142
+ .filter((c) => Math.max(c.value, 0) > 0)
143
+ .sort((a, b) => Math.max(b.value, 0) - Math.max(a.value, 0));
144
+ if (children.length > 0) {
145
+ const innerRect = inset(tr.rect, PADDING);
146
+ const childRects = squarify(children.map((c) => ({ datum: c, value: Math.max(c.value, 0) })), innerRect);
147
+ childRects.forEach((cr, ci) => {
148
+ const tone = cr.datum.tone ?? root.tone ?? TONES[ci % TONES.length];
149
+ result.push({
150
+ datum: cr.datum,
151
+ value: cr.value,
152
+ tone,
153
+ textColor: labelColorForTone(tone),
154
+ rect: inset(cr.rect, PADDING / 2),
155
+ parentLabel: tr.datum.label,
156
+ depth: 1,
157
+ });
158
+ });
159
+ }
160
+ else {
161
+ result.push({
162
+ datum: tr.datum,
163
+ value: tr.value,
164
+ tone: root.tone,
165
+ textColor: labelColorForTone(root.tone),
166
+ rect: inset(tr.rect, PADDING / 2),
167
+ depth: 0,
168
+ });
169
+ }
170
+ });
171
+ cells = result;
172
+ }
173
+ }
174
+ const legendItems = !data
175
+ ? []
176
+ : data
177
+ .map((d, i) => ({ label: d.label, tone: d.tone ?? TONES[i % TONES.length] }))
178
+ .filter((_, i) => sumValue(data[i]) > 0);
179
+ const dataValueItems = cells.map((c) => c.parentLabel ? `${c.parentLabel}, ${c.datum.label}: ${c.value}` : `${c.datum.label}: ${c.value}`);
180
+ const hoveredIdx = hoveredIndex.value;
181
+ // Préfixe d'id unique pour les clip-paths (évite les collisions entre instances).
182
+ const clipPrefix = `st-treemap-clip-${Math.random().toString(36).slice(2, 9)}`;
183
+ // <defs> contenant un clipPath par cellule.
184
+ const defsChildren = cells.map((cell, i) => h("clipPath", { key: `clip${i}`, id: `${clipPrefix}-${i}` }, [
185
+ h("rect", { x: cell.rect.x, y: cell.rect.y, width: cell.rect.w, height: cell.rect.h, rx: "2" }),
186
+ ]));
187
+ const cellNodes = [h("defs", {}, defsChildren)];
188
+ cells.forEach((cell, i) => {
189
+ const groupChildren = [
190
+ h("rect", {
191
+ class: classNames("st-treemapChart__rect", `st-treemapChart__rect--${cell.tone}`, hoveredIdx !== null && hoveredIdx !== i && "st-treemapChart__rect--dim"),
192
+ x: cell.rect.x,
193
+ y: cell.rect.y,
194
+ width: cell.rect.w,
195
+ height: cell.rect.h,
196
+ rx: "2",
197
+ "data-chart-index": i,
198
+ }),
199
+ ];
200
+ if (showLabels && cell.rect.w >= LABEL_MIN_W && cell.rect.h >= LABEL_MIN_H) {
201
+ const textGroup = [
202
+ h("text", { class: "st-treemapChart__label", x: cell.rect.x + 6, y: cell.rect.y + 15, "data-chart-index": i, style: `fill: ${cell.textColor}` }, cell.datum.label),
203
+ ];
204
+ if (cell.rect.h >= VALUE_MIN_H) {
205
+ textGroup.push(h("text", { class: "st-treemapChart__value", x: cell.rect.x + 6, y: cell.rect.y + 30, "data-chart-index": i, style: `fill: ${cell.textColor}` }, String(cell.value)));
206
+ }
207
+ groupChildren.push(h("g", { "clip-path": `url(#${clipPrefix}-${i})` }, textGroup));
208
+ }
209
+ cellNodes.push(h("g", {
210
+ key: cell.parentLabel ? `${cell.parentLabel}/${cell.datum.label}` : cell.datum.label,
211
+ class: "st-treemapChart__cell",
212
+ "data-chart-index": i,
213
+ }, groupChildren));
214
+ });
215
+ const children = [
216
+ h("div", {
217
+ class: "st-treemapChart__visual",
218
+ role: "img",
219
+ "aria-label": label,
220
+ onPointermove: handleVisualPointerMove,
221
+ onPointerleave: handleLeave,
222
+ }, [
223
+ h("svg", {
224
+ viewBox: `0 0 ${width} ${height}`,
225
+ preserveAspectRatio: "xMidYMid meet",
226
+ width: "100%",
227
+ height: "100%",
228
+ focusable: "false",
229
+ "aria-hidden": "true",
230
+ }, cellNodes),
231
+ ]),
232
+ chartDataList(label, dataValueItems),
233
+ ];
234
+ if (hoveredIdx !== null && cells[hoveredIdx]) {
235
+ const cell = cells[hoveredIdx];
236
+ children.push(h("div", {
237
+ class: "st-treemapChart__tooltip",
238
+ role: "presentation",
239
+ style: `left: ${((cell.rect.x + cell.rect.w / 2) / width) * 100}%; top: ${(cell.rect.y / height) * 100}%`,
240
+ }, [
241
+ h("span", { class: "st-treemapChart__tooltipLabel" }, cell.parentLabel ? `${cell.parentLabel} · ${cell.datum.label}` : cell.datum.label),
242
+ h("span", { class: "st-treemapChart__tooltipValue" }, String(cell.value)),
243
+ ]));
244
+ }
245
+ if (legend && legendItems.length > 0) {
246
+ children.push(h("ul", { class: "st-treemapChart__legend", "aria-hidden": "true" }, legendItems.map((item) => h("li", { key: item.label, class: "st-treemapChart__legendItem" }, [
247
+ h("span", { class: `st-treemapChart__legendSwatch st-treemapChart__legendSwatch--${item.tone}`, "aria-hidden": "true" }),
248
+ ` ${item.label}`,
249
+ ]))));
250
+ }
251
+ return h("div", { ...attrs, class: classNames("st-treemapChart", props.class) }, children);
252
+ };
253
+ },
254
+ });
255
+ //# sourceMappingURL=TreemapChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreemapChart.js","sourceRoot":"","sources":["../src/TreemapChart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ export type WaterfallType = "increase" | "decrease" | "total";
2
+ export type WaterfallChartDatum = {
3
+ label: string;
4
+ value: number;
5
+ type?: WaterfallType;
6
+ };
7
+ export type WaterfallChartProps = {
8
+ data: WaterfallChartDatum[];
9
+ width?: number;
10
+ height?: number;
11
+ connectors?: boolean;
12
+ format?: (value: number) => string;
13
+ label: string;
14
+ class?: string;
15
+ };
16
+ export declare const WaterfallChart: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
17
+ data: {
18
+ type: () => WaterfallChartDatum[];
19
+ default: () => never[];
20
+ };
21
+ width: {
22
+ type: NumberConstructor;
23
+ default: number;
24
+ };
25
+ height: {
26
+ type: NumberConstructor;
27
+ default: number;
28
+ };
29
+ connectors: {
30
+ type: BooleanConstructor;
31
+ default: boolean;
32
+ };
33
+ format: {
34
+ type: () => (value: number) => string;
35
+ default: undefined;
36
+ };
37
+ label: {
38
+ type: StringConstructor;
39
+ required: true;
40
+ };
41
+ class: {
42
+ type: StringConstructor;
43
+ default: undefined;
44
+ };
45
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
46
+ [key: string]: any;
47
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
48
+ data: {
49
+ type: () => WaterfallChartDatum[];
50
+ default: () => never[];
51
+ };
52
+ width: {
53
+ type: NumberConstructor;
54
+ default: number;
55
+ };
56
+ height: {
57
+ type: NumberConstructor;
58
+ default: number;
59
+ };
60
+ connectors: {
61
+ type: BooleanConstructor;
62
+ default: boolean;
63
+ };
64
+ format: {
65
+ type: () => (value: number) => string;
66
+ default: undefined;
67
+ };
68
+ label: {
69
+ type: StringConstructor;
70
+ required: true;
71
+ };
72
+ class: {
73
+ type: StringConstructor;
74
+ default: undefined;
75
+ };
76
+ }>> & Readonly<{}>, {
77
+ class: string;
78
+ data: WaterfallChartDatum[];
79
+ width: number;
80
+ height: number;
81
+ format: (value: number) => string;
82
+ connectors: boolean;
83
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
84
+ //# sourceMappingURL=WaterfallChart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaterfallChart.d.ts","sourceRoot":"","sources":["../src/WaterfallChart.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAIF,eAAO,MAAM,cAAc;;cAGA,MAAM,mBAAmB,EAAE;;;;;;;;;;;;;;;;cAIX,MAAM,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;;;;;;;;;;;;;;;cAJ/C,MAAM,mBAAmB,EAAE;;;;;;;;;;;;;;;;cAIX,MAAM,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;;;;;;;;;;;;;;;;oBAAjB,MAAM,KAAK,MAAM;;4EAgQxE,CAAC"}
@@ -0,0 +1,186 @@
1
+ import { defineComponent, h, ref } from "vue";
2
+ import { classNames } from "./classNames.js";
3
+ import { chartDataList, formatTick, niceTicks, scaleLinear } from "./chartScale.js";
4
+ const MARGIN = { top: 12, right: 16, bottom: 32, left: 44 };
5
+ export const WaterfallChart = defineComponent({
6
+ name: "WaterfallChart",
7
+ props: {
8
+ data: { type: Array, default: () => [] },
9
+ width: { type: Number, default: 480 },
10
+ height: { type: Number, default: 240 },
11
+ connectors: { type: Boolean, default: true },
12
+ format: { type: Function, default: undefined },
13
+ label: { type: String, required: true },
14
+ class: { type: String, default: undefined },
15
+ },
16
+ setup(props, { attrs }) {
17
+ const hoveredIndex = ref(null);
18
+ function handleLeave() {
19
+ hoveredIndex.value = null;
20
+ }
21
+ function handleVisualPointerMove(event) {
22
+ const target = event.target;
23
+ if (!(target instanceof Element)) {
24
+ hoveredIndex.value = null;
25
+ return;
26
+ }
27
+ const index = Number(target.getAttribute("data-chart-index"));
28
+ hoveredIndex.value = Number.isInteger(index) ? index : null;
29
+ }
30
+ return () => {
31
+ const data = props.data ?? [];
32
+ const width = props.width ?? 480;
33
+ const height = props.height ?? 240;
34
+ const connectors = props.connectors ?? true;
35
+ const format = props.format;
36
+ const label = props.label;
37
+ const formatValue = (v) => (format ? format(v) : formatTick(v));
38
+ let cumulative = 0;
39
+ let seeded = false; // un pas non-total a-t-il déjà alimenté le cumul ?
40
+ const computed = data.map((d) => {
41
+ // Valeurs non finies neutralisées (jamais de NaN dans la géométrie/DOM).
42
+ const raw = Number.isFinite(d.value) ? d.value : 0;
43
+ const type = d.type ?? (raw >= 0 ? "increase" : "decrease");
44
+ let start;
45
+ let end;
46
+ let displayValue;
47
+ if (type === "total") {
48
+ // Un total ouvrant (aucun pas antérieur) amorce le cumul avec sa valeur ;
49
+ // un total de clôture est ANCRÉ au cumul réel, la valeur saisie étant
50
+ // ignorée pour la géométrie (barre et connecteur coïncident toujours).
51
+ start = 0;
52
+ end = seeded ? cumulative : Math.abs(raw);
53
+ cumulative = end;
54
+ seeded = true;
55
+ displayValue = end;
56
+ }
57
+ else {
58
+ // Le signe est imposé par le type : increase = +|v|, decrease = -|v|.
59
+ const signed = type === "increase" ? Math.abs(raw) : -Math.abs(raw);
60
+ start = cumulative;
61
+ end = cumulative + signed;
62
+ cumulative = end;
63
+ seeded = true;
64
+ displayValue = signed;
65
+ }
66
+ const resolvedType = type;
67
+ return { datum: d, type: resolvedType, start, end, displayValue, cumulative };
68
+ });
69
+ const bounds = computed.flatMap((c) => [c.start, c.end]);
70
+ const minRaw = Math.min(0, ...bounds);
71
+ const maxRaw = Math.max(0, ...bounds);
72
+ const ticks = niceTicks(minRaw, maxRaw, 5);
73
+ const domainMin = ticks[0];
74
+ const domainMax = ticks[ticks.length - 1];
75
+ const plotWidth = Math.max(width - MARGIN.left - MARGIN.right, 1);
76
+ const plotHeight = Math.max(height - MARGIN.top - MARGIN.bottom, 1);
77
+ let bars = [];
78
+ if (computed.length !== 0) {
79
+ const band = plotWidth / computed.length;
80
+ const barWidth = band * 0.62;
81
+ bars = computed.map((c, i) => {
82
+ const startY = scaleLinear(c.start, domainMin, domainMax, plotHeight, 0);
83
+ const endY = scaleLinear(c.end, domainMin, domainMax, plotHeight, 0);
84
+ const y = Math.min(startY, endY);
85
+ const hh = Math.abs(endY - startY);
86
+ const x = MARGIN.left + band * i + (band - barWidth) / 2;
87
+ return {
88
+ x,
89
+ y: MARGIN.top + y,
90
+ width: barWidth,
91
+ height: Math.max(hh, 0.5),
92
+ cx: MARGIN.left + band * (i + 0.5),
93
+ cy: MARGIN.top + Math.min(startY, endY),
94
+ type: c.type,
95
+ datum: c.datum,
96
+ displayValue: c.displayValue,
97
+ cumulative: c.cumulative,
98
+ index: i,
99
+ };
100
+ });
101
+ }
102
+ const connectorLines = [];
103
+ if (connectors && bars.length >= 2) {
104
+ for (let i = 0; i < computed.length - 1; i++) {
105
+ const level = computed[i].end;
106
+ const y = MARGIN.top + scaleLinear(level, domainMin, domainMax, plotHeight, 0);
107
+ // Du bord droit de la barre i au bord gauche de la barre i+1.
108
+ connectorLines.push({ x1: bars[i].x + bars[i].width, x2: bars[i + 1].x, y });
109
+ }
110
+ }
111
+ const valueAxisTicks = ticks.map((tick) => ({
112
+ value: tick,
113
+ x1: MARGIN.left,
114
+ x2: MARGIN.left + plotWidth,
115
+ y: MARGIN.top + scaleLinear(tick, domainMin, domainMax, plotHeight, 0),
116
+ }));
117
+ const zeroY = MARGIN.top + scaleLinear(0, domainMin, domainMax, plotHeight, 0);
118
+ const dataValueItems = computed.map((c) => `${c.datum.label}: ${formatValue(c.displayValue)}`);
119
+ const legendItems = [
120
+ { type: "increase", label: "Hausse" },
121
+ { type: "decrease", label: "Baisse" },
122
+ { type: "total", label: "Total" },
123
+ ];
124
+ const svgChildren = [];
125
+ for (const tick of valueAxisTicks) {
126
+ svgChildren.push(h("line", { key: `g${tick.value}`, class: "st-waterfallChart__grid", x1: tick.x1, x2: tick.x2, y1: tick.y, y2: tick.y }), h("text", { key: `t${tick.value}`, class: "st-waterfallChart__tickLabel", x: MARGIN.left - 6, y: tick.y, "text-anchor": "end", "dominant-baseline": "middle" }, formatTick(tick.value)));
127
+ }
128
+ svgChildren.push(h("line", { class: "st-waterfallChart__axis", x1: MARGIN.left, x2: MARGIN.left, y1: MARGIN.top, y2: height - MARGIN.bottom }), h("line", { class: "st-waterfallChart__axis", x1: MARGIN.left, x2: width - MARGIN.right, y1: height - MARGIN.bottom, y2: height - MARGIN.bottom }), h("line", { class: "st-waterfallChart__zero", x1: MARGIN.left, x2: width - MARGIN.right, y1: zeroY, y2: zeroY }));
129
+ connectorLines.forEach((line, i) => {
130
+ svgChildren.push(h("line", { key: `c${i}`, class: "st-waterfallChart__connector", x1: line.x1, x2: line.x2, y1: line.y, y2: line.y }));
131
+ });
132
+ bars.forEach((bar) => {
133
+ svgChildren.push(h("text", { key: `cl${bar.datum.label}`, class: "st-waterfallChart__categoryLabel", x: bar.x + bar.width / 2, y: height - MARGIN.bottom + 16, "text-anchor": "middle" }, bar.datum.label));
134
+ });
135
+ bars.forEach((bar, i) => {
136
+ svgChildren.push(h("rect", {
137
+ key: `b${bar.datum.label}`,
138
+ class: `st-waterfallChart__bar st-waterfallChart__bar--${bar.type}`,
139
+ x: bar.x,
140
+ y: bar.y,
141
+ width: bar.width,
142
+ height: bar.height,
143
+ rx: "2",
144
+ "data-chart-index": i,
145
+ }));
146
+ });
147
+ const children = [
148
+ h("div", {
149
+ class: "st-waterfallChart__visual",
150
+ role: "img",
151
+ "aria-label": label,
152
+ onPointermove: handleVisualPointerMove,
153
+ onPointerleave: handleLeave,
154
+ }, [
155
+ h("svg", {
156
+ viewBox: `0 0 ${width} ${height}`,
157
+ preserveAspectRatio: "xMidYMid meet",
158
+ width: "100%",
159
+ height: "100%",
160
+ focusable: "false",
161
+ "aria-hidden": "true",
162
+ }, svgChildren),
163
+ ]),
164
+ chartDataList(label, dataValueItems),
165
+ h("ul", { class: "st-waterfallChart__legend", "aria-hidden": "true" }, legendItems.map((item) => h("li", { key: item.type, class: "st-waterfallChart__legendItem" }, [
166
+ h("span", { class: `st-waterfallChart__legendSwatch st-waterfallChart__legendSwatch--${item.type}` }),
167
+ ` ${item.label}`,
168
+ ]))),
169
+ ];
170
+ const hoveredIdx = hoveredIndex.value;
171
+ if (hoveredIdx !== null && bars[hoveredIdx]) {
172
+ const bar = bars[hoveredIdx];
173
+ children.push(h("div", {
174
+ class: "st-waterfallChart__tooltip",
175
+ role: "presentation",
176
+ style: `left: ${(bar.cx / width) * 100}%; top: ${(bar.cy / height) * 100}%`,
177
+ }, [
178
+ h("span", { class: "st-waterfallChart__tooltipLabel" }, bar.datum.label),
179
+ h("span", { class: "st-waterfallChart__tooltipValue" }, formatValue(bar.displayValue)),
180
+ ]));
181
+ }
182
+ return h("div", { ...attrs, class: classNames("st-waterfallChart", props.class) }, children);
183
+ };
184
+ },
185
+ });
186
+ //# sourceMappingURL=WaterfallChart.js.map