@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.
- package/dist/Calendar.d.ts.map +1 -1
- package/dist/Calendar.js +235 -74
- package/dist/Calendar.js.map +1 -1
- package/dist/ComboChart.d.ts +119 -0
- package/dist/ComboChart.d.ts.map +1 -0
- package/dist/ComboChart.js +280 -0
- package/dist/ComboChart.js.map +1 -0
- package/dist/FunnelChart.d.ts +103 -0
- package/dist/FunnelChart.d.ts.map +1 -0
- package/dist/FunnelChart.js +191 -0
- package/dist/FunnelChart.js.map +1 -0
- package/dist/GaugeChart.d.ts +134 -0
- package/dist/GaugeChart.d.ts.map +1 -0
- package/dist/GaugeChart.js +152 -0
- package/dist/GaugeChart.js.map +1 -0
- package/dist/KpiCard.d.ts +151 -0
- package/dist/KpiCard.d.ts.map +1 -0
- package/dist/KpiCard.js +155 -0
- package/dist/KpiCard.js.map +1 -0
- package/dist/Popper.d.ts +58 -0
- package/dist/Popper.d.ts.map +1 -1
- package/dist/Popper.js +136 -5
- package/dist/Popper.js.map +1 -1
- package/dist/Rating.d.ts.map +1 -1
- package/dist/Rating.js +111 -18
- package/dist/Rating.js.map +1 -1
- package/dist/SelectableList.d.ts +2 -0
- package/dist/SelectableList.d.ts.map +1 -1
- package/dist/SelectableList.js +72 -21
- package/dist/SelectableList.js.map +1 -1
- package/dist/SelectableRow.d.ts +2 -2
- package/dist/SelectableRow.d.ts.map +1 -1
- package/dist/SelectableRow.js +15 -5
- package/dist/SelectableRow.js.map +1 -1
- package/dist/SlideIndicator.d.ts.map +1 -1
- package/dist/SlideIndicator.js +12 -5
- package/dist/SlideIndicator.js.map +1 -1
- package/dist/TimePicker.d.ts +1 -1
- package/dist/TimePicker.d.ts.map +1 -1
- package/dist/TimePicker.js +150 -14
- package/dist/TimePicker.js.map +1 -1
- package/dist/TreemapChart.d.ts +95 -0
- package/dist/TreemapChart.d.ts.map +1 -0
- package/dist/TreemapChart.js +255 -0
- package/dist/TreemapChart.js.map +1 -0
- package/dist/WaterfallChart.d.ts +84 -0
- package/dist/WaterfallChart.d.ts.map +1 -0
- package/dist/WaterfallChart.js +186 -0
- package/dist/WaterfallChart.js.map +1 -0
- package/dist/chartScale.d.ts +4 -0
- package/dist/chartScale.d.ts.map +1 -1
- package/dist/chartScale.js +44 -0
- package/dist/chartScale.js.map +1 -1
- package/dist/index.d.ts +14 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +721 -2
- package/package.json +1 -1
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
export type GaugeChartTone = "neutral" | "info" | "success" | "warning" | "error" | "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
|
|
2
|
+
export type GaugeChartThreshold = {
|
|
3
|
+
value: number;
|
|
4
|
+
tone: GaugeChartTone;
|
|
5
|
+
};
|
|
6
|
+
export type GaugeChartFormat = "number" | "percent";
|
|
7
|
+
export type GaugeChartProps = {
|
|
8
|
+
value: number;
|
|
9
|
+
min?: number;
|
|
10
|
+
max?: number;
|
|
11
|
+
thresholds?: GaugeChartThreshold[];
|
|
12
|
+
label?: string;
|
|
13
|
+
format?: GaugeChartFormat;
|
|
14
|
+
unit?: string;
|
|
15
|
+
size?: number;
|
|
16
|
+
thickness?: number;
|
|
17
|
+
startAngle?: number;
|
|
18
|
+
endAngle?: number;
|
|
19
|
+
class?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare const GaugeChart: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
22
|
+
value: {
|
|
23
|
+
type: NumberConstructor;
|
|
24
|
+
required: true;
|
|
25
|
+
};
|
|
26
|
+
min: {
|
|
27
|
+
type: NumberConstructor;
|
|
28
|
+
default: number;
|
|
29
|
+
};
|
|
30
|
+
max: {
|
|
31
|
+
type: NumberConstructor;
|
|
32
|
+
default: number;
|
|
33
|
+
};
|
|
34
|
+
thresholds: {
|
|
35
|
+
type: () => GaugeChartThreshold[];
|
|
36
|
+
default: undefined;
|
|
37
|
+
};
|
|
38
|
+
label: {
|
|
39
|
+
type: StringConstructor;
|
|
40
|
+
default: undefined;
|
|
41
|
+
};
|
|
42
|
+
format: {
|
|
43
|
+
type: () => GaugeChartFormat;
|
|
44
|
+
default: string;
|
|
45
|
+
};
|
|
46
|
+
unit: {
|
|
47
|
+
type: StringConstructor;
|
|
48
|
+
default: undefined;
|
|
49
|
+
};
|
|
50
|
+
size: {
|
|
51
|
+
type: NumberConstructor;
|
|
52
|
+
default: number;
|
|
53
|
+
};
|
|
54
|
+
thickness: {
|
|
55
|
+
type: NumberConstructor;
|
|
56
|
+
default: number;
|
|
57
|
+
};
|
|
58
|
+
startAngle: {
|
|
59
|
+
type: NumberConstructor;
|
|
60
|
+
default: number;
|
|
61
|
+
};
|
|
62
|
+
endAngle: {
|
|
63
|
+
type: NumberConstructor;
|
|
64
|
+
default: number;
|
|
65
|
+
};
|
|
66
|
+
class: {
|
|
67
|
+
type: StringConstructor;
|
|
68
|
+
default: undefined;
|
|
69
|
+
};
|
|
70
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
71
|
+
[key: string]: any;
|
|
72
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
73
|
+
value: {
|
|
74
|
+
type: NumberConstructor;
|
|
75
|
+
required: true;
|
|
76
|
+
};
|
|
77
|
+
min: {
|
|
78
|
+
type: NumberConstructor;
|
|
79
|
+
default: number;
|
|
80
|
+
};
|
|
81
|
+
max: {
|
|
82
|
+
type: NumberConstructor;
|
|
83
|
+
default: number;
|
|
84
|
+
};
|
|
85
|
+
thresholds: {
|
|
86
|
+
type: () => GaugeChartThreshold[];
|
|
87
|
+
default: undefined;
|
|
88
|
+
};
|
|
89
|
+
label: {
|
|
90
|
+
type: StringConstructor;
|
|
91
|
+
default: undefined;
|
|
92
|
+
};
|
|
93
|
+
format: {
|
|
94
|
+
type: () => GaugeChartFormat;
|
|
95
|
+
default: string;
|
|
96
|
+
};
|
|
97
|
+
unit: {
|
|
98
|
+
type: StringConstructor;
|
|
99
|
+
default: undefined;
|
|
100
|
+
};
|
|
101
|
+
size: {
|
|
102
|
+
type: NumberConstructor;
|
|
103
|
+
default: number;
|
|
104
|
+
};
|
|
105
|
+
thickness: {
|
|
106
|
+
type: NumberConstructor;
|
|
107
|
+
default: number;
|
|
108
|
+
};
|
|
109
|
+
startAngle: {
|
|
110
|
+
type: NumberConstructor;
|
|
111
|
+
default: number;
|
|
112
|
+
};
|
|
113
|
+
endAngle: {
|
|
114
|
+
type: NumberConstructor;
|
|
115
|
+
default: number;
|
|
116
|
+
};
|
|
117
|
+
class: {
|
|
118
|
+
type: StringConstructor;
|
|
119
|
+
default: undefined;
|
|
120
|
+
};
|
|
121
|
+
}>> & Readonly<{}>, {
|
|
122
|
+
class: string;
|
|
123
|
+
label: string;
|
|
124
|
+
min: number;
|
|
125
|
+
max: number;
|
|
126
|
+
size: number;
|
|
127
|
+
thickness: number;
|
|
128
|
+
thresholds: GaugeChartThreshold[];
|
|
129
|
+
format: GaugeChartFormat;
|
|
130
|
+
unit: string;
|
|
131
|
+
startAngle: number;
|
|
132
|
+
endAngle: number;
|
|
133
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
134
|
+
//# sourceMappingURL=GaugeChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GaugeChart.d.ts","sourceRoot":"","sources":["../src/GaugeChart.ts"],"names":[],"mappings":"AAIA,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,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;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAWF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;cAMU,MAAM,mBAAmB,EAAE;;;;;;;;cAE9B,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAFnB,MAAM,mBAAmB,EAAE;;;;;;;;cAE9B,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EA8KlD,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { defineComponent, h } from "vue";
|
|
2
|
+
import { classNames } from "./classNames.js";
|
|
3
|
+
import { chartDataList } from "./chartScale.js";
|
|
4
|
+
const toRad = (deg) => (deg * Math.PI) / 180;
|
|
5
|
+
const polar = (radius, angle, centerX, centerY) => [centerX + radius * Math.cos(angle), centerY + radius * Math.sin(angle)];
|
|
6
|
+
export const GaugeChart = defineComponent({
|
|
7
|
+
name: "GaugeChart",
|
|
8
|
+
props: {
|
|
9
|
+
value: { type: Number, required: true },
|
|
10
|
+
min: { type: Number, default: 0 },
|
|
11
|
+
max: { type: Number, default: 100 },
|
|
12
|
+
thresholds: { type: Array, default: undefined },
|
|
13
|
+
label: { type: String, default: undefined },
|
|
14
|
+
format: { type: String, default: "number" },
|
|
15
|
+
unit: { type: String, default: undefined },
|
|
16
|
+
size: { type: Number, default: 220 },
|
|
17
|
+
thickness: { type: Number, default: 22 },
|
|
18
|
+
startAngle: { type: Number, default: 180 },
|
|
19
|
+
endAngle: { type: Number, default: 360 },
|
|
20
|
+
class: { type: String, default: undefined },
|
|
21
|
+
},
|
|
22
|
+
setup(props, { attrs }) {
|
|
23
|
+
return () => {
|
|
24
|
+
const value = props.value;
|
|
25
|
+
const min = props.min ?? 0;
|
|
26
|
+
const max = props.max ?? 100;
|
|
27
|
+
const thresholds = props.thresholds;
|
|
28
|
+
const label = props.label;
|
|
29
|
+
const format = props.format ?? "number";
|
|
30
|
+
const unit = props.unit;
|
|
31
|
+
const size = props.size ?? 220;
|
|
32
|
+
const thickness = props.thickness ?? 22;
|
|
33
|
+
const startAngle = props.startAngle ?? 180;
|
|
34
|
+
const endAngle = props.endAngle ?? 360;
|
|
35
|
+
const span = Math.max(max - min, 0);
|
|
36
|
+
const clamped = Math.min(Math.max(value, min), max);
|
|
37
|
+
const frac = span > 0 ? (clamped - min) / span : 0;
|
|
38
|
+
const cx = size / 2;
|
|
39
|
+
const r = size / 2 - thickness / 2 - 2;
|
|
40
|
+
const a0 = toRad(startAngle);
|
|
41
|
+
const a1 = toRad(endAngle);
|
|
42
|
+
const totalAngle = a1 - a0;
|
|
43
|
+
// Hauteur réelle de l'arc pour cadrer le viewBox.
|
|
44
|
+
const cyRaw = size / 2;
|
|
45
|
+
const samples = 64;
|
|
46
|
+
let minY = Infinity;
|
|
47
|
+
let maxY = -Infinity;
|
|
48
|
+
for (let i = 0; i <= samples; i++) {
|
|
49
|
+
const a = a0 + (totalAngle * i) / samples;
|
|
50
|
+
const yOuter = cyRaw + (r + thickness / 2) * Math.sin(a);
|
|
51
|
+
minY = Math.min(minY, yOuter);
|
|
52
|
+
maxY = Math.max(maxY, yOuter);
|
|
53
|
+
}
|
|
54
|
+
minY = Math.min(minY, cyRaw - (r + thickness / 2));
|
|
55
|
+
const vbHeightRaw = Math.min(maxY, size) - Math.max(minY, 0);
|
|
56
|
+
const geometry = { cy: cyRaw, vbTop: Math.max(minY, 0), vbHeight: Math.max(vbHeightRaw, thickness) };
|
|
57
|
+
const cy = geometry.cy;
|
|
58
|
+
const arcPath = (fromFrac, toFrac) => {
|
|
59
|
+
const from = a0 + totalAngle * fromFrac;
|
|
60
|
+
const to = a0 + totalAngle * toFrac;
|
|
61
|
+
const [x0, y0] = polar(r, from, cx, cy);
|
|
62
|
+
const [x1, y1] = polar(r, to, cx, cy);
|
|
63
|
+
const large = Math.abs(to - from) > Math.PI ? 1 : 0;
|
|
64
|
+
const sweep = totalAngle >= 0 ? 1 : 0;
|
|
65
|
+
return `M ${x0} ${y0} A ${r} ${r} 0 ${large} ${sweep} ${x1} ${y1}`;
|
|
66
|
+
};
|
|
67
|
+
let bands = [];
|
|
68
|
+
if (thresholds && thresholds.length > 0 && span > 0) {
|
|
69
|
+
const sorted = [...thresholds].sort((a, b) => a.value - b.value);
|
|
70
|
+
const segments = [];
|
|
71
|
+
let start = min;
|
|
72
|
+
for (const t of sorted) {
|
|
73
|
+
const end = Math.min(Math.max(t.value, min), max);
|
|
74
|
+
if (end <= start)
|
|
75
|
+
continue;
|
|
76
|
+
segments.push({ from: (start - min) / span, to: (end - min) / span, tone: t.tone });
|
|
77
|
+
start = end;
|
|
78
|
+
}
|
|
79
|
+
if (start < max) {
|
|
80
|
+
const lastTone = sorted[sorted.length - 1]?.tone ?? "neutral";
|
|
81
|
+
segments.push({ from: (start - min) / span, to: 1, tone: lastTone });
|
|
82
|
+
}
|
|
83
|
+
bands = segments;
|
|
84
|
+
}
|
|
85
|
+
const needleAngle = a0 + totalAngle * frac;
|
|
86
|
+
const tip = polar(r + thickness / 2, needleAngle, cx, cy);
|
|
87
|
+
const leftPt = polar(thickness * 0.18, needleAngle + Math.PI / 2, cx, cy);
|
|
88
|
+
const rightPt = polar(thickness * 0.18, needleAngle - Math.PI / 2, cx, cy);
|
|
89
|
+
const needle = `M ${leftPt[0]} ${leftPt[1]} L ${tip[0]} ${tip[1]} L ${rightPt[0]} ${rightPt[1]} Z`;
|
|
90
|
+
let formatted;
|
|
91
|
+
if (format === "percent") {
|
|
92
|
+
const pct = span > 0 ? Math.round(frac * 100) : 0;
|
|
93
|
+
formatted = `${pct}%`;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const num = Number.isInteger(clamped) ? String(clamped) : clamped.toFixed(1);
|
|
97
|
+
formatted = unit ? `${num} ${unit}` : num;
|
|
98
|
+
}
|
|
99
|
+
// Inclure la bande de seuil active dans aria-valuetext (a11y : zone succès/alerte/erreur).
|
|
100
|
+
let activeBandLabel;
|
|
101
|
+
if (bands.length > 0) {
|
|
102
|
+
const activeBand = bands.find((b) => b.to >= frac && b.from <= frac) ?? bands[bands.length - 1];
|
|
103
|
+
if (activeBand)
|
|
104
|
+
activeBandLabel = activeBand.tone;
|
|
105
|
+
}
|
|
106
|
+
const ariaValueText = [label ? `${label}: ${formatted}` : formatted, activeBandLabel ? `zone ${activeBandLabel}` : undefined]
|
|
107
|
+
.filter(Boolean)
|
|
108
|
+
.join(", ");
|
|
109
|
+
const dataValueItems = [`${label ? `${label}: ` : ""}${formatted} (min ${min}, max ${max})`];
|
|
110
|
+
const svgChildren = [
|
|
111
|
+
h("path", { class: "st-gaugeChart__track", d: arcPath(0, 1), fill: "none", "stroke-width": thickness }),
|
|
112
|
+
];
|
|
113
|
+
bands.forEach((band, i) => {
|
|
114
|
+
svgChildren.push(h("path", {
|
|
115
|
+
key: `band${i}`,
|
|
116
|
+
class: `st-gaugeChart__band st-gaugeChart__band--${band.tone}`,
|
|
117
|
+
d: arcPath(band.from, band.to),
|
|
118
|
+
fill: "none",
|
|
119
|
+
"stroke-width": thickness,
|
|
120
|
+
}));
|
|
121
|
+
});
|
|
122
|
+
if (bands.length === 0) {
|
|
123
|
+
svgChildren.push(h("path", { class: "st-gaugeChart__progress", d: arcPath(0, frac), fill: "none", "stroke-width": thickness }));
|
|
124
|
+
}
|
|
125
|
+
svgChildren.push(h("path", { class: "st-gaugeChart__needle", d: needle }), h("circle", { class: "st-gaugeChart__hub", cx, cy, r: Math.max(thickness * 0.22, 4) }), h("text", { class: "st-gaugeChart__value", x: cx, y: cy - thickness * 0.55, "text-anchor": "middle", "dominant-baseline": "auto" }, formatted));
|
|
126
|
+
if (label) {
|
|
127
|
+
svgChildren.push(h("text", { class: "st-gaugeChart__label", x: cx, y: cy - thickness * 0.05, "text-anchor": "middle", "dominant-baseline": "hanging" }, label));
|
|
128
|
+
}
|
|
129
|
+
return h("div", { ...attrs, class: classNames("st-gaugeChart", props.class) }, [
|
|
130
|
+
h("div", {
|
|
131
|
+
class: "st-gaugeChart__visual",
|
|
132
|
+
role: "meter",
|
|
133
|
+
"aria-valuenow": clamped,
|
|
134
|
+
"aria-valuemin": min,
|
|
135
|
+
"aria-valuemax": max,
|
|
136
|
+
"aria-valuetext": ariaValueText,
|
|
137
|
+
"aria-label": label,
|
|
138
|
+
}, [
|
|
139
|
+
h("svg", {
|
|
140
|
+
viewBox: `0 ${geometry.vbTop} ${size} ${geometry.vbHeight}`,
|
|
141
|
+
width: "100%",
|
|
142
|
+
height: "100%",
|
|
143
|
+
focusable: "false",
|
|
144
|
+
"aria-hidden": "true",
|
|
145
|
+
}, svgChildren),
|
|
146
|
+
]),
|
|
147
|
+
chartDataList(label ?? "gauge", dataValueItems),
|
|
148
|
+
]);
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=GaugeChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GaugeChart.js","sourceRoot":"","sources":["../src/GaugeChart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
export type KpiCardSize = "sm" | "md" | "lg";
|
|
2
|
+
export type KpiCardTrend = "up" | "down" | "flat";
|
|
3
|
+
export type KpiCardFormat = "number" | "currency" | "percent";
|
|
4
|
+
export type KpiCardDeltaFormat = "percent" | "absolute";
|
|
5
|
+
export type KpiCardTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
|
|
6
|
+
export type KpiCardProps = {
|
|
7
|
+
/**
|
|
8
|
+
* Valeur principale. Si `format="percent"`, `value` est une FRACTION (0–1) :
|
|
9
|
+
* passer `0.42` affiche « 42 % » (Intl multiplie par 100). Le formatage ne
|
|
10
|
+
* s'applique qu'aux `number` ; une `string` est rendue telle quelle.
|
|
11
|
+
*/
|
|
12
|
+
value: number | string;
|
|
13
|
+
label: string;
|
|
14
|
+
/**
|
|
15
|
+
* Variation. En `deltaFormat="percent"` (défaut), `delta` est une FRACTION :
|
|
16
|
+
* `0.12` → « +12 % ». NaN/Infinity sont rendus inertes.
|
|
17
|
+
*/
|
|
18
|
+
delta?: number;
|
|
19
|
+
deltaFormat?: KpiCardDeltaFormat;
|
|
20
|
+
trend?: KpiCardTrend;
|
|
21
|
+
format?: KpiCardFormat;
|
|
22
|
+
unit?: string;
|
|
23
|
+
currency?: string;
|
|
24
|
+
locale?: string;
|
|
25
|
+
sparkline?: number[];
|
|
26
|
+
size?: KpiCardSize;
|
|
27
|
+
tone?: KpiCardTone;
|
|
28
|
+
class?: string;
|
|
29
|
+
};
|
|
30
|
+
export declare const KpiCard: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
31
|
+
value: {
|
|
32
|
+
type: () => number | string;
|
|
33
|
+
required: true;
|
|
34
|
+
};
|
|
35
|
+
label: {
|
|
36
|
+
type: StringConstructor;
|
|
37
|
+
required: true;
|
|
38
|
+
};
|
|
39
|
+
delta: {
|
|
40
|
+
type: NumberConstructor;
|
|
41
|
+
default: undefined;
|
|
42
|
+
};
|
|
43
|
+
deltaFormat: {
|
|
44
|
+
type: () => KpiCardDeltaFormat;
|
|
45
|
+
default: string;
|
|
46
|
+
};
|
|
47
|
+
trend: {
|
|
48
|
+
type: () => KpiCardTrend;
|
|
49
|
+
default: undefined;
|
|
50
|
+
};
|
|
51
|
+
format: {
|
|
52
|
+
type: () => KpiCardFormat;
|
|
53
|
+
default: string;
|
|
54
|
+
};
|
|
55
|
+
unit: {
|
|
56
|
+
type: StringConstructor;
|
|
57
|
+
default: undefined;
|
|
58
|
+
};
|
|
59
|
+
currency: {
|
|
60
|
+
type: StringConstructor;
|
|
61
|
+
default: string;
|
|
62
|
+
};
|
|
63
|
+
locale: {
|
|
64
|
+
type: StringConstructor;
|
|
65
|
+
default: undefined;
|
|
66
|
+
};
|
|
67
|
+
sparkline: {
|
|
68
|
+
type: () => number[];
|
|
69
|
+
default: undefined;
|
|
70
|
+
};
|
|
71
|
+
size: {
|
|
72
|
+
type: () => KpiCardSize;
|
|
73
|
+
default: string;
|
|
74
|
+
};
|
|
75
|
+
tone: {
|
|
76
|
+
type: () => KpiCardTone;
|
|
77
|
+
default: undefined;
|
|
78
|
+
};
|
|
79
|
+
class: {
|
|
80
|
+
type: StringConstructor;
|
|
81
|
+
default: undefined;
|
|
82
|
+
};
|
|
83
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
84
|
+
[key: string]: any;
|
|
85
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
86
|
+
value: {
|
|
87
|
+
type: () => number | string;
|
|
88
|
+
required: true;
|
|
89
|
+
};
|
|
90
|
+
label: {
|
|
91
|
+
type: StringConstructor;
|
|
92
|
+
required: true;
|
|
93
|
+
};
|
|
94
|
+
delta: {
|
|
95
|
+
type: NumberConstructor;
|
|
96
|
+
default: undefined;
|
|
97
|
+
};
|
|
98
|
+
deltaFormat: {
|
|
99
|
+
type: () => KpiCardDeltaFormat;
|
|
100
|
+
default: string;
|
|
101
|
+
};
|
|
102
|
+
trend: {
|
|
103
|
+
type: () => KpiCardTrend;
|
|
104
|
+
default: undefined;
|
|
105
|
+
};
|
|
106
|
+
format: {
|
|
107
|
+
type: () => KpiCardFormat;
|
|
108
|
+
default: string;
|
|
109
|
+
};
|
|
110
|
+
unit: {
|
|
111
|
+
type: StringConstructor;
|
|
112
|
+
default: undefined;
|
|
113
|
+
};
|
|
114
|
+
currency: {
|
|
115
|
+
type: StringConstructor;
|
|
116
|
+
default: string;
|
|
117
|
+
};
|
|
118
|
+
locale: {
|
|
119
|
+
type: StringConstructor;
|
|
120
|
+
default: undefined;
|
|
121
|
+
};
|
|
122
|
+
sparkline: {
|
|
123
|
+
type: () => number[];
|
|
124
|
+
default: undefined;
|
|
125
|
+
};
|
|
126
|
+
size: {
|
|
127
|
+
type: () => KpiCardSize;
|
|
128
|
+
default: string;
|
|
129
|
+
};
|
|
130
|
+
tone: {
|
|
131
|
+
type: () => KpiCardTone;
|
|
132
|
+
default: undefined;
|
|
133
|
+
};
|
|
134
|
+
class: {
|
|
135
|
+
type: StringConstructor;
|
|
136
|
+
default: undefined;
|
|
137
|
+
};
|
|
138
|
+
}>> & Readonly<{}>, {
|
|
139
|
+
class: string;
|
|
140
|
+
tone: KpiCardTone;
|
|
141
|
+
locale: string;
|
|
142
|
+
size: KpiCardSize;
|
|
143
|
+
format: KpiCardFormat;
|
|
144
|
+
unit: string;
|
|
145
|
+
currency: string;
|
|
146
|
+
delta: number;
|
|
147
|
+
deltaFormat: KpiCardDeltaFormat;
|
|
148
|
+
trend: KpiCardTrend;
|
|
149
|
+
sparkline: number[];
|
|
150
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
151
|
+
//# sourceMappingURL=KpiCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KpiCard.d.ts","sourceRoot":"","sources":["../src/KpiCard.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7C,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAClD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,UAAU,CAAC;AACxD,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,YAAY,GAAG;IACzB;;;;OAIG;IACH,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,OAAO;;cAG8B,MAAM,MAAM,GAAG,MAAM;;;;;;;;;;;;cAGpC,MAAM,kBAAkB;;;;cAC9B,MAAM,YAAY;;;;cACjB,MAAM,aAAa;;;;;;;;;;;;;;;;cAIjB,MAAM,MAAM,EAAE;;;;cAClB,MAAM,WAAW;;;;cACjB,MAAM,WAAW;;;;;;;;;;;cAXK,MAAM,MAAM,GAAG,MAAM;;;;;;;;;;;;cAGpC,MAAM,kBAAkB;;;;cAC9B,MAAM,YAAY;;;;cACjB,MAAM,aAAa;;;;;;;;;;;;;;;;cAIjB,MAAM,MAAM,EAAE;;;;cAClB,MAAM,WAAW;;;;cACjB,MAAM,WAAW;;;;;;;;;;;;;;;;;;;4EAyK3C,CAAC"}
|
package/dist/KpiCard.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { defineComponent, h } from "vue";
|
|
2
|
+
import { classNames } from "./classNames.js";
|
|
3
|
+
import { Sparkline } from "./Sparkline.js";
|
|
4
|
+
export const KpiCard = defineComponent({
|
|
5
|
+
name: "KpiCard",
|
|
6
|
+
props: {
|
|
7
|
+
value: { type: [Number, String], required: true },
|
|
8
|
+
label: { type: String, required: true },
|
|
9
|
+
delta: { type: Number, default: undefined },
|
|
10
|
+
deltaFormat: { type: String, default: "percent" },
|
|
11
|
+
trend: { type: String, default: undefined },
|
|
12
|
+
format: { type: String, default: "number" },
|
|
13
|
+
unit: { type: String, default: undefined },
|
|
14
|
+
currency: { type: String, default: "EUR" },
|
|
15
|
+
locale: { type: String, default: undefined },
|
|
16
|
+
sparkline: { type: Array, default: undefined },
|
|
17
|
+
size: { type: String, default: "md" },
|
|
18
|
+
tone: { type: String, default: undefined },
|
|
19
|
+
class: { type: String, default: undefined },
|
|
20
|
+
},
|
|
21
|
+
setup(props, { attrs }) {
|
|
22
|
+
return () => {
|
|
23
|
+
const value = props.value;
|
|
24
|
+
const label = props.label;
|
|
25
|
+
const delta = props.delta;
|
|
26
|
+
const deltaFormat = props.deltaFormat ?? "percent";
|
|
27
|
+
const format = props.format ?? "number";
|
|
28
|
+
const unit = props.unit;
|
|
29
|
+
const currency = props.currency ?? "EUR";
|
|
30
|
+
const locale = props.locale;
|
|
31
|
+
const sparkline = props.sparkline;
|
|
32
|
+
const size = props.size ?? "md";
|
|
33
|
+
const tone = props.tone;
|
|
34
|
+
const resolvedTrend = props.trend ?? (delta == null ? undefined : delta > 0 ? "up" : delta < 0 ? "down" : "flat");
|
|
35
|
+
let formattedValue;
|
|
36
|
+
if (typeof value === "string") {
|
|
37
|
+
formattedValue = value;
|
|
38
|
+
}
|
|
39
|
+
else if (!Number.isFinite(value)) {
|
|
40
|
+
// Jamais de « NaN »/« ∞ » dans le DOM ni l'aria.
|
|
41
|
+
formattedValue = "—";
|
|
42
|
+
}
|
|
43
|
+
else if (format === "currency") {
|
|
44
|
+
// Un code devise invalide fait lever Intl ; on retombe sur le nombre brut.
|
|
45
|
+
try {
|
|
46
|
+
formattedValue = new Intl.NumberFormat(locale, { style: "currency", currency }).format(value);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
formattedValue = new Intl.NumberFormat(locale).format(value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (format === "percent") {
|
|
53
|
+
formattedValue = new Intl.NumberFormat(locale, {
|
|
54
|
+
style: "percent",
|
|
55
|
+
maximumFractionDigits: 2,
|
|
56
|
+
}).format(value);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
formattedValue = new Intl.NumberFormat(locale).format(value);
|
|
60
|
+
}
|
|
61
|
+
let formattedDelta;
|
|
62
|
+
if (delta != null && Number.isFinite(delta)) {
|
|
63
|
+
const sign = delta > 0 ? "+" : "";
|
|
64
|
+
if (deltaFormat === "percent") {
|
|
65
|
+
const pct = new Intl.NumberFormat(locale, {
|
|
66
|
+
style: "percent",
|
|
67
|
+
maximumFractionDigits: 1,
|
|
68
|
+
}).format(delta);
|
|
69
|
+
formattedDelta = `${sign}${pct}`;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
formattedDelta = `${sign}${new Intl.NumberFormat(locale).format(delta)}`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const sparklineTone = resolvedTrend === "up" ? "success" : resolvedTrend === "down" ? "error" : "neutral";
|
|
76
|
+
const arrow = resolvedTrend === "up"
|
|
77
|
+
? "M3 8.5 7 4l4 4.5"
|
|
78
|
+
: resolvedTrend === "down"
|
|
79
|
+
? "M3 5.5 7 10l4-4.5"
|
|
80
|
+
: "M3 7h8";
|
|
81
|
+
const trendLabel = resolvedTrend === "up"
|
|
82
|
+
? "en hausse"
|
|
83
|
+
: resolvedTrend === "down"
|
|
84
|
+
? "en baisse"
|
|
85
|
+
: resolvedTrend === "flat"
|
|
86
|
+
? "stable"
|
|
87
|
+
: undefined;
|
|
88
|
+
// L'unité est redondante quand le format est déjà autosuffisant.
|
|
89
|
+
const ariaUnit = format === "currency" || format === "percent" ? undefined : unit;
|
|
90
|
+
const ariaLabel = [
|
|
91
|
+
label,
|
|
92
|
+
formattedValue,
|
|
93
|
+
ariaUnit,
|
|
94
|
+
formattedDelta && `${formattedDelta} ${trendLabel ?? ""}`.trim(),
|
|
95
|
+
]
|
|
96
|
+
.filter(Boolean)
|
|
97
|
+
.join(", ");
|
|
98
|
+
const classes = classNames("st-kpiCard", `st-kpiCard--${size}`, tone && `st-kpiCard--${tone}`, tone && "st-kpiCard--toned", props.class);
|
|
99
|
+
const valueChildren = [
|
|
100
|
+
h("span", { class: "st-kpiCard__number" }, formattedValue),
|
|
101
|
+
];
|
|
102
|
+
if (unit) {
|
|
103
|
+
valueChildren.push(h("span", { class: "st-kpiCard__unit" }, unit));
|
|
104
|
+
}
|
|
105
|
+
const footerChildren = [];
|
|
106
|
+
if (formattedDelta) {
|
|
107
|
+
footerChildren.push(h("span", {
|
|
108
|
+
class: `st-kpiCard__delta st-kpiCard__delta--${resolvedTrend ?? "flat"}`,
|
|
109
|
+
"aria-hidden": "true",
|
|
110
|
+
}, [
|
|
111
|
+
h("svg", {
|
|
112
|
+
class: "st-kpiCard__arrow",
|
|
113
|
+
width: "14",
|
|
114
|
+
height: "14",
|
|
115
|
+
viewBox: "0 0 14 14",
|
|
116
|
+
"aria-hidden": "true",
|
|
117
|
+
focusable: "false",
|
|
118
|
+
}, [
|
|
119
|
+
h("path", {
|
|
120
|
+
d: arrow,
|
|
121
|
+
fill: "none",
|
|
122
|
+
stroke: "currentColor",
|
|
123
|
+
"stroke-width": "1.75",
|
|
124
|
+
"stroke-linecap": "round",
|
|
125
|
+
"stroke-linejoin": "round",
|
|
126
|
+
}),
|
|
127
|
+
]),
|
|
128
|
+
h("span", { class: "st-kpiCard__deltaValue" }, formattedDelta),
|
|
129
|
+
]));
|
|
130
|
+
}
|
|
131
|
+
if (sparkline && sparkline.length > 0) {
|
|
132
|
+
footerChildren.push(h(Sparkline, {
|
|
133
|
+
class: "st-kpiCard__sparkline",
|
|
134
|
+
data: sparkline,
|
|
135
|
+
tone: sparklineTone,
|
|
136
|
+
area: true,
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
const labelChildren = [];
|
|
140
|
+
if (tone) {
|
|
141
|
+
labelChildren.push(h("span", { class: "st-kpiCard__swatch", "aria-hidden": "true" }));
|
|
142
|
+
}
|
|
143
|
+
labelChildren.push(h("span", { class: "st-kpiCard__labelText" }, label));
|
|
144
|
+
const children = [
|
|
145
|
+
h("p", { class: "st-kpiCard__label" }, labelChildren),
|
|
146
|
+
h("p", { class: "st-kpiCard__value" }, valueChildren),
|
|
147
|
+
];
|
|
148
|
+
if (formattedDelta || sparkline) {
|
|
149
|
+
children.push(h("div", { class: "st-kpiCard__footer" }, footerChildren));
|
|
150
|
+
}
|
|
151
|
+
return h("article", { ...attrs, class: classes, role: "group", "aria-label": ariaLabel }, children);
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=KpiCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KpiCard.js","sourceRoot":"","sources":["../src/KpiCard.ts"],"names":[],"mappings":"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"}
|