@sentropic/design-system-svelte 0.33.0 → 0.34.20
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/AppHeader.svelte +159 -1
- package/dist/AppHeader.svelte.d.ts +18 -1
- package/dist/AppHeader.svelte.d.ts.map +1 -1
- package/dist/ArcDiagramChart.svelte +380 -0
- package/dist/ArcDiagramChart.svelte.d.ts +43 -0
- package/dist/ArcDiagramChart.svelte.d.ts.map +1 -0
- package/dist/AreaRangeChart.svelte +487 -0
- package/dist/AreaRangeChart.svelte.d.ts +38 -0
- package/dist/AreaRangeChart.svelte.d.ts.map +1 -0
- package/dist/AreaSplineRangeChart.svelte +478 -0
- package/dist/AreaSplineRangeChart.svelte.d.ts +37 -0
- package/dist/AreaSplineRangeChart.svelte.d.ts.map +1 -0
- package/dist/BellCurveChart.svelte +487 -0
- package/dist/BellCurveChart.svelte.d.ts +40 -0
- package/dist/BellCurveChart.svelte.d.ts.map +1 -0
- package/dist/Calendar.svelte +11 -0
- package/dist/ChatThread.svelte +32 -1
- package/dist/ChatThread.svelte.d.ts +14 -0
- package/dist/ChatThread.svelte.d.ts.map +1 -1
- package/dist/ColumnPyramidChart.svelte +332 -0
- package/dist/ColumnPyramidChart.svelte.d.ts +35 -0
- package/dist/ColumnPyramidChart.svelte.d.ts.map +1 -0
- package/dist/ColumnRangeChart.svelte +432 -0
- package/dist/ColumnRangeChart.svelte.d.ts +42 -0
- package/dist/ColumnRangeChart.svelte.d.ts.map +1 -0
- package/dist/Combobox.svelte +3 -0
- package/dist/ContentSwitcher.svelte +1 -1
- package/dist/DataTable.svelte.d.ts +1 -1
- package/dist/DatePicker.svelte +3 -0
- package/dist/DependencyWheelChart.svelte +413 -0
- package/dist/DependencyWheelChart.svelte.d.ts +42 -0
- package/dist/DependencyWheelChart.svelte.d.ts.map +1 -0
- package/dist/DumbbellChart.svelte +403 -0
- package/dist/DumbbellChart.svelte.d.ts +44 -0
- package/dist/DumbbellChart.svelte.d.ts.map +1 -0
- package/dist/ErrorBarChart.svelte +428 -0
- package/dist/ErrorBarChart.svelte.d.ts +40 -0
- package/dist/ErrorBarChart.svelte.d.ts.map +1 -0
- package/dist/GanttChart.svelte +410 -0
- package/dist/GanttChart.svelte.d.ts +39 -0
- package/dist/GanttChart.svelte.d.ts.map +1 -0
- package/dist/HLCChart.svelte +330 -0
- package/dist/HLCChart.svelte.d.ts +32 -0
- package/dist/HLCChart.svelte.d.ts.map +1 -0
- package/dist/HeikinAshiChart.svelte +365 -0
- package/dist/HeikinAshiChart.svelte.d.ts +37 -0
- package/dist/HeikinAshiChart.svelte.d.ts.map +1 -0
- package/dist/HollowCandlestickChart.svelte +357 -0
- package/dist/HollowCandlestickChart.svelte.d.ts +34 -0
- package/dist/HollowCandlestickChart.svelte.d.ts.map +1 -0
- package/dist/Input.svelte +3 -0
- package/dist/ItemChart.svelte +389 -0
- package/dist/ItemChart.svelte.d.ts +67 -0
- package/dist/ItemChart.svelte.d.ts.map +1 -0
- package/dist/Link.svelte +12 -1
- package/dist/Link.svelte.d.ts +4 -0
- package/dist/Link.svelte.d.ts.map +1 -1
- package/dist/LollipopChart.svelte +1 -1
- package/dist/MultiSelect.svelte +3 -0
- package/dist/NumberInput.svelte +3 -0
- package/dist/OHLCChart.svelte +343 -0
- package/dist/OHLCChart.svelte.d.ts +33 -0
- package/dist/OHLCChart.svelte.d.ts.map +1 -0
- package/dist/OrganizationChart.svelte +284 -0
- package/dist/OrganizationChart.svelte.d.ts +19 -0
- package/dist/OrganizationChart.svelte.d.ts.map +1 -0
- package/dist/PasswordInput.svelte +3 -0
- package/dist/PolygonChart.svelte +189 -0
- package/dist/PolygonChart.svelte.d.ts +17 -0
- package/dist/PolygonChart.svelte.d.ts.map +1 -0
- package/dist/Search.svelte +7 -5
- package/dist/Select.svelte +3 -0
- package/dist/StreamgraphChart.svelte +283 -0
- package/dist/StreamgraphChart.svelte.d.ts +23 -0
- package/dist/StreamgraphChart.svelte.d.ts.map +1 -0
- package/dist/StreamingMessage.svelte +44 -2
- package/dist/StreamingMessage.svelte.d.ts +18 -1
- package/dist/StreamingMessage.svelte.d.ts.map +1 -1
- package/dist/TileMapChart.svelte +314 -0
- package/dist/TileMapChart.svelte.d.ts +45 -0
- package/dist/TileMapChart.svelte.d.ts.map +1 -0
- package/dist/TimePicker.svelte +3 -0
- package/dist/TimelineChart.svelte +362 -0
- package/dist/TimelineChart.svelte.d.ts +22 -0
- package/dist/TimelineChart.svelte.d.ts.map +1 -0
- package/dist/TreegraphChart.svelte +281 -0
- package/dist/TreegraphChart.svelte.d.ts +19 -0
- package/dist/TreegraphChart.svelte.d.ts.map +1 -0
- package/dist/VariablePieChart.svelte +313 -0
- package/dist/VariablePieChart.svelte.d.ts +52 -0
- package/dist/VariablePieChart.svelte.d.ts.map +1 -0
- package/dist/VennChart.svelte +348 -0
- package/dist/VennChart.svelte.d.ts +72 -0
- package/dist/VennChart.svelte.d.ts.map +1 -0
- package/dist/WordCloudChart.svelte +279 -0
- package/dist/WordCloudChart.svelte.d.ts +18 -0
- package/dist/WordCloudChart.svelte.d.ts.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/package.json +5 -3
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
/**
|
|
3
|
+
* DumbbellChart — pour chaque catégorie, une ligne horizontale reliant une
|
|
4
|
+
* valeur BASSE à une valeur HAUTE, avec un cercle plein à chaque extrémité
|
|
5
|
+
* (la basse et la haute portent deux teintes distinctes). Idéal pour comparer
|
|
6
|
+
* deux mesures par catégorie : avant/après, min/max, objectif/réalisé.
|
|
7
|
+
* API canonique (référence Svelte ; React/Vue s'alignent).
|
|
8
|
+
*
|
|
9
|
+
* Props obligatoires :
|
|
10
|
+
* data DumbbellChartDatum[] - tableau {category, low, high}
|
|
11
|
+
* label string - aria-label du graphique
|
|
12
|
+
*
|
|
13
|
+
* Props optionnelles :
|
|
14
|
+
* lowTone "category1".."category8" (défaut "category1") - cercle BAS
|
|
15
|
+
* highTone "category1".."category8" (défaut "category2") - cercle HAUT
|
|
16
|
+
* lowLabel string (défaut "Bas") - libellé légende du cercle bas
|
|
17
|
+
* highLabel string (défaut "Haut") - libellé légende du cercle haut
|
|
18
|
+
* width number (défaut 480)
|
|
19
|
+
* height number (défaut 240)
|
|
20
|
+
* class string
|
|
21
|
+
*
|
|
22
|
+
* Les catégories sont distribuées sur l'axe vertical (une ligne par
|
|
23
|
+
* catégorie) ; l'axe horizontal porte l'échelle de valeurs graduée.
|
|
24
|
+
*/
|
|
25
|
+
export type DumbbellChartTone =
|
|
26
|
+
| "category1"
|
|
27
|
+
| "category2"
|
|
28
|
+
| "category3"
|
|
29
|
+
| "category4"
|
|
30
|
+
| "category5"
|
|
31
|
+
| "category6"
|
|
32
|
+
| "category7"
|
|
33
|
+
| "category8";
|
|
34
|
+
|
|
35
|
+
export type DumbbellChartDatum = {
|
|
36
|
+
category: string;
|
|
37
|
+
low: number;
|
|
38
|
+
high: number;
|
|
39
|
+
};
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<script lang="ts">
|
|
43
|
+
import ChartDataList from "./ChartDataList.svelte";
|
|
44
|
+
import GraphLegend from "./GraphLegend.svelte";
|
|
45
|
+
|
|
46
|
+
type DumbbellChartProps = {
|
|
47
|
+
data: DumbbellChartDatum[];
|
|
48
|
+
width?: number;
|
|
49
|
+
height?: number;
|
|
50
|
+
lowTone?: DumbbellChartTone;
|
|
51
|
+
highTone?: DumbbellChartTone;
|
|
52
|
+
lowLabel?: string;
|
|
53
|
+
highLabel?: string;
|
|
54
|
+
label: string;
|
|
55
|
+
class?: string;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
let {
|
|
59
|
+
data = [],
|
|
60
|
+
width = 480,
|
|
61
|
+
height = 240,
|
|
62
|
+
lowTone = "category1",
|
|
63
|
+
highTone = "category2",
|
|
64
|
+
lowLabel = "Bas",
|
|
65
|
+
highLabel = "Haut",
|
|
66
|
+
label,
|
|
67
|
+
class: className
|
|
68
|
+
}: DumbbellChartProps = $props();
|
|
69
|
+
|
|
70
|
+
const MARGIN = { top: 16, right: 20, bottom: 32, left: 96 };
|
|
71
|
+
const DOT_RADIUS = 5;
|
|
72
|
+
|
|
73
|
+
function niceTicks(min: number, max: number, target = 5): number[] {
|
|
74
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) {
|
|
75
|
+
const base = Number.isFinite(max) ? max : 0;
|
|
76
|
+
return [base];
|
|
77
|
+
}
|
|
78
|
+
const range = max - min;
|
|
79
|
+
const rough = range / Math.max(target - 1, 1);
|
|
80
|
+
const pow = Math.pow(10, Math.floor(Math.log10(rough)));
|
|
81
|
+
const norm = rough / pow;
|
|
82
|
+
let step: number;
|
|
83
|
+
if (norm < 1.5) step = 1 * pow;
|
|
84
|
+
else if (norm < 3) step = 2 * pow;
|
|
85
|
+
else if (norm < 7) step = 5 * pow;
|
|
86
|
+
else step = 10 * pow;
|
|
87
|
+
const start = Math.floor(min / step) * step;
|
|
88
|
+
const end = Math.ceil(max / step) * step;
|
|
89
|
+
const ticks: number[] = [];
|
|
90
|
+
for (let v = start; v <= end + step / 2; v += step) {
|
|
91
|
+
ticks.push(Number(v.toFixed(10)));
|
|
92
|
+
}
|
|
93
|
+
return ticks;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function scaleLinear(v: number, d0: number, d1: number, r0: number, r1: number) {
|
|
97
|
+
if (d1 === d0) return r0;
|
|
98
|
+
return r0 + ((v - d0) * (r1 - r0)) / (d1 - d0);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function formatTick(v: number): string {
|
|
102
|
+
if (Math.abs(v) >= 1000) return `${(v / 1000).toFixed(v % 1000 === 0 ? 0 : 1)}k`;
|
|
103
|
+
if (Number.isInteger(v)) return String(v);
|
|
104
|
+
return v.toFixed(1);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Normalise un point : low/high finis, ordonnés (lo <= hi).
|
|
108
|
+
function normalize(d: DumbbellChartDatum): { lo: number; hi: number } | null {
|
|
109
|
+
if (!Number.isFinite(d.low) || !Number.isFinite(d.high)) return null;
|
|
110
|
+
return { lo: Math.min(d.low, d.high), hi: Math.max(d.low, d.high) };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Données valides : low + high finis.
|
|
114
|
+
const validData = $derived(data.filter((d) => normalize(d) !== null));
|
|
115
|
+
|
|
116
|
+
const dataValueItems = $derived(
|
|
117
|
+
validData.map((d) => {
|
|
118
|
+
const r = normalize(d)!;
|
|
119
|
+
return `${d.category}: ${r.lo} – ${r.hi}`;
|
|
120
|
+
})
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
// Réduit la police des étiquettes de catégorie quand l'espace réservé (marge
|
|
124
|
+
// gauche) est plus petit que le défaut de référence, pour éviter le rognage
|
|
125
|
+
// (cf. fix lollipop : adapter la taille au conteneur).
|
|
126
|
+
const categoryFontSize = $derived.by(() => {
|
|
127
|
+
const ratio = Math.min(1, MARGIN.left / 96);
|
|
128
|
+
return Math.max(0.5, 0.6875 * ratio);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
let hoveredIndex: number | null = $state(null);
|
|
132
|
+
|
|
133
|
+
const plotWidth = $derived(Math.max(width - MARGIN.left - MARGIN.right, 1));
|
|
134
|
+
const plotHeight = $derived(Math.max(height - MARGIN.top - MARGIN.bottom, 1));
|
|
135
|
+
|
|
136
|
+
const xTicks = $derived.by(() => {
|
|
137
|
+
if (validData.length === 0) return [0];
|
|
138
|
+
const lows = validData.map((d) => normalize(d)!.lo);
|
|
139
|
+
const highs = validData.map((d) => normalize(d)!.hi);
|
|
140
|
+
const minRaw = Math.min(...lows);
|
|
141
|
+
const maxRaw = Math.max(...highs);
|
|
142
|
+
const padded = (maxRaw - minRaw) * 0.08 || Math.max(Math.abs(maxRaw), 1) * 0.1;
|
|
143
|
+
return niceTicks(minRaw - padded, maxRaw + padded, 5);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const xDomain = $derived.by(() => {
|
|
147
|
+
if (xTicks.length === 0) return { min: 0, max: 1 };
|
|
148
|
+
return { min: xTicks[0], max: xTicks[xTicks.length - 1] };
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
const rows = $derived.by(() => {
|
|
152
|
+
if (validData.length === 0) return [];
|
|
153
|
+
const band = plotHeight / validData.length;
|
|
154
|
+
return validData.map((d, i) => {
|
|
155
|
+
const r = normalize(d)!;
|
|
156
|
+
const cy = MARGIN.top + band * (i + 0.5);
|
|
157
|
+
const xLow = MARGIN.left + scaleLinear(r.lo, xDomain.min, xDomain.max, 0, plotWidth);
|
|
158
|
+
const xHigh = MARGIN.left + scaleLinear(r.hi, xDomain.min, xDomain.max, 0, plotWidth);
|
|
159
|
+
return {
|
|
160
|
+
datum: d,
|
|
161
|
+
range: r,
|
|
162
|
+
cy,
|
|
163
|
+
xLow,
|
|
164
|
+
xHigh,
|
|
165
|
+
index: i
|
|
166
|
+
};
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const gridLines = $derived(
|
|
171
|
+
xTicks.map((tick) => ({
|
|
172
|
+
value: tick,
|
|
173
|
+
x: MARGIN.left + scaleLinear(tick, xDomain.min, xDomain.max, 0, plotWidth)
|
|
174
|
+
}))
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
const legendEntries = $derived([
|
|
178
|
+
{ label: lowLabel, shape: "circle" as const, tone: lowTone },
|
|
179
|
+
{ label: highLabel, shape: "circle" as const, tone: highTone }
|
|
180
|
+
]);
|
|
181
|
+
|
|
182
|
+
function handleLeave() {
|
|
183
|
+
hoveredIndex = null;
|
|
184
|
+
}
|
|
185
|
+
function handleVisualPointerMove(event: PointerEvent) {
|
|
186
|
+
const target = event.target;
|
|
187
|
+
if (!(target instanceof Element)) {
|
|
188
|
+
hoveredIndex = null;
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const index = Number(target.getAttribute("data-chart-index"));
|
|
192
|
+
hoveredIndex = Number.isInteger(index) ? index : null;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const classes = () => ["st-dumbbellChart", className].filter(Boolean).join(" ");
|
|
196
|
+
</script>
|
|
197
|
+
|
|
198
|
+
<div class={classes()}>
|
|
199
|
+
<div
|
|
200
|
+
class="st-dumbbellChart__visual"
|
|
201
|
+
role="img"
|
|
202
|
+
aria-label={label}
|
|
203
|
+
onpointermove={handleVisualPointerMove}
|
|
204
|
+
onpointerleave={handleLeave}
|
|
205
|
+
>
|
|
206
|
+
<svg
|
|
207
|
+
viewBox="0 0 {width} {height}"
|
|
208
|
+
preserveAspectRatio="xMidYMid meet"
|
|
209
|
+
width="100%"
|
|
210
|
+
height="100%"
|
|
211
|
+
focusable="false"
|
|
212
|
+
aria-hidden="true"
|
|
213
|
+
>
|
|
214
|
+
<!-- gridlines + X axis ticks -->
|
|
215
|
+
{#each gridLines as g (g.value)}
|
|
216
|
+
<line
|
|
217
|
+
class="st-dumbbellChart__grid"
|
|
218
|
+
x1={g.x}
|
|
219
|
+
x2={g.x}
|
|
220
|
+
y1={MARGIN.top}
|
|
221
|
+
y2={height - MARGIN.bottom}
|
|
222
|
+
/>
|
|
223
|
+
<text
|
|
224
|
+
class="st-dumbbellChart__tickLabel"
|
|
225
|
+
x={g.x}
|
|
226
|
+
y={height - MARGIN.bottom + 16}
|
|
227
|
+
text-anchor="middle"
|
|
228
|
+
>
|
|
229
|
+
{formatTick(g.value)}
|
|
230
|
+
</text>
|
|
231
|
+
{/each}
|
|
232
|
+
|
|
233
|
+
<!-- axes -->
|
|
234
|
+
<line
|
|
235
|
+
class="st-dumbbellChart__axis"
|
|
236
|
+
x1={MARGIN.left}
|
|
237
|
+
x2={MARGIN.left}
|
|
238
|
+
y1={MARGIN.top}
|
|
239
|
+
y2={height - MARGIN.bottom}
|
|
240
|
+
/>
|
|
241
|
+
<line
|
|
242
|
+
class="st-dumbbellChart__axis"
|
|
243
|
+
x1={MARGIN.left}
|
|
244
|
+
x2={width - MARGIN.right}
|
|
245
|
+
y1={height - MARGIN.bottom}
|
|
246
|
+
y2={height - MARGIN.bottom}
|
|
247
|
+
/>
|
|
248
|
+
|
|
249
|
+
<!-- category labels + dumbbells -->
|
|
250
|
+
{#each rows as row (row.index)}
|
|
251
|
+
<text
|
|
252
|
+
class="st-dumbbellChart__categoryLabel"
|
|
253
|
+
x={MARGIN.left - 8}
|
|
254
|
+
y={row.cy}
|
|
255
|
+
text-anchor="end"
|
|
256
|
+
dominant-baseline="middle"
|
|
257
|
+
style="font-size: {categoryFontSize}rem"
|
|
258
|
+
>
|
|
259
|
+
{row.datum.category}
|
|
260
|
+
</text>
|
|
261
|
+
<line
|
|
262
|
+
class="st-dumbbellChart__connector"
|
|
263
|
+
x1={row.xLow}
|
|
264
|
+
x2={row.xHigh}
|
|
265
|
+
y1={row.cy}
|
|
266
|
+
y2={row.cy}
|
|
267
|
+
/>
|
|
268
|
+
<circle
|
|
269
|
+
class="st-dumbbellChart__dot st-dumbbellChart__dot--low st-dumbbellChart__dot--{lowTone}"
|
|
270
|
+
cx={row.xLow}
|
|
271
|
+
cy={row.cy}
|
|
272
|
+
r={DOT_RADIUS}
|
|
273
|
+
data-chart-index={row.index}
|
|
274
|
+
/>
|
|
275
|
+
<circle
|
|
276
|
+
class="st-dumbbellChart__dot st-dumbbellChart__dot--high st-dumbbellChart__dot--{highTone}"
|
|
277
|
+
cx={row.xHigh}
|
|
278
|
+
cy={row.cy}
|
|
279
|
+
r={DOT_RADIUS}
|
|
280
|
+
data-chart-index={row.index}
|
|
281
|
+
/>
|
|
282
|
+
{/each}
|
|
283
|
+
</svg>
|
|
284
|
+
<GraphLegend class="st-dumbbellChart__legend" entries={legendEntries} />
|
|
285
|
+
</div>
|
|
286
|
+
|
|
287
|
+
<ChartDataList {label} items={dataValueItems} />
|
|
288
|
+
|
|
289
|
+
{#if hoveredIndex !== null && rows[hoveredIndex]}
|
|
290
|
+
{@const row = rows[hoveredIndex]}
|
|
291
|
+
<div
|
|
292
|
+
class="st-dumbbellChart__tooltip"
|
|
293
|
+
role="presentation"
|
|
294
|
+
style="left: {((row.xLow + row.xHigh) / 2 / width) * 100}%; top: {(row.cy / height) * 100}%"
|
|
295
|
+
>
|
|
296
|
+
<span class="st-dumbbellChart__tooltipLabel">{row.datum.category}</span>
|
|
297
|
+
<span class="st-dumbbellChart__tooltipValue">{row.range.lo} – {row.range.hi}</span>
|
|
298
|
+
</div>
|
|
299
|
+
{/if}
|
|
300
|
+
</div>
|
|
301
|
+
|
|
302
|
+
<style>
|
|
303
|
+
.st-dumbbellChart {
|
|
304
|
+
color: var(--st-semantic-data-category1);
|
|
305
|
+
display: block;
|
|
306
|
+
font-family: inherit;
|
|
307
|
+
position: relative;
|
|
308
|
+
width: 100%;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.st-dumbbellChart svg {
|
|
312
|
+
display: block;
|
|
313
|
+
overflow: visible;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.st-dumbbellChart__visual {
|
|
317
|
+
display: block;
|
|
318
|
+
position: relative;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.st-dumbbellChart__legend {
|
|
322
|
+
position: absolute;
|
|
323
|
+
right: 0.25rem;
|
|
324
|
+
top: 0.25rem;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.st-dumbbellChart__grid {
|
|
328
|
+
stroke: var(--st-component-dumbbellChart-gridStroke, var(--st-semantic-border-subtle));
|
|
329
|
+
stroke-dasharray: 2 3;
|
|
330
|
+
stroke-width: 1;
|
|
331
|
+
opacity: 0.7;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.st-dumbbellChart__axis {
|
|
335
|
+
stroke: var(--st-component-dumbbellChart-axisStroke, var(--st-semantic-border-subtle));
|
|
336
|
+
stroke-width: 1;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.st-dumbbellChart__tickLabel,
|
|
340
|
+
.st-dumbbellChart__categoryLabel {
|
|
341
|
+
fill: var(--st-component-dumbbellChart-labelColor, var(--st-semantic-text-secondary));
|
|
342
|
+
font-size: 0.6875rem;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.st-dumbbellChart__connector {
|
|
346
|
+
stroke: var(--st-component-dumbbellChart-connectorStroke, var(--st-semantic-border-strong));
|
|
347
|
+
stroke-width: 2;
|
|
348
|
+
stroke-linecap: round;
|
|
349
|
+
opacity: 0.6;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.st-dumbbellChart__dot {
|
|
353
|
+
fill: currentColor;
|
|
354
|
+
stroke: var(--st-semantic-surface-default);
|
|
355
|
+
stroke-width: 1.5;
|
|
356
|
+
cursor: pointer;
|
|
357
|
+
transition: r 120ms ease;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.st-dumbbellChart__dot:hover {
|
|
361
|
+
r: 7;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.st-dumbbellChart__dot--category1 { fill: var(--st-semantic-data-category1); }
|
|
365
|
+
.st-dumbbellChart__dot--category2 { fill: var(--st-semantic-data-category2); }
|
|
366
|
+
.st-dumbbellChart__dot--category3 { fill: var(--st-semantic-data-category3); }
|
|
367
|
+
.st-dumbbellChart__dot--category4 { fill: var(--st-semantic-data-category4); }
|
|
368
|
+
.st-dumbbellChart__dot--category5 { fill: var(--st-semantic-data-category5); }
|
|
369
|
+
.st-dumbbellChart__dot--category6 { fill: var(--st-semantic-data-category6); }
|
|
370
|
+
.st-dumbbellChart__dot--category7 { fill: var(--st-semantic-data-category7); }
|
|
371
|
+
.st-dumbbellChart__dot--category8 { fill: var(--st-semantic-data-category8); }
|
|
372
|
+
|
|
373
|
+
@media (prefers-reduced-motion: reduce) {
|
|
374
|
+
.st-dumbbellChart__dot {
|
|
375
|
+
transition: none;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.st-dumbbellChart__tooltip {
|
|
380
|
+
background: var(--st-component-dumbbellChart-tooltipBackground, var(--st-semantic-surface-inverse));
|
|
381
|
+
border-radius: var(--st-radius-sm, 0.25rem);
|
|
382
|
+
color: var(--st-component-dumbbellChart-tooltipText, var(--st-semantic-text-inverse));
|
|
383
|
+
display: inline-flex;
|
|
384
|
+
flex-direction: column;
|
|
385
|
+
font-size: 0.75rem;
|
|
386
|
+
gap: 0.125rem;
|
|
387
|
+
line-height: 1.2;
|
|
388
|
+
padding: 0.375rem 0.5rem;
|
|
389
|
+
pointer-events: none;
|
|
390
|
+
position: absolute;
|
|
391
|
+
transform: translate(-50%, calc(-100% - 8px));
|
|
392
|
+
white-space: nowrap;
|
|
393
|
+
z-index: 1;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
.st-dumbbellChart__tooltipLabel {
|
|
397
|
+
font-weight: 600;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.st-dumbbellChart__tooltipValue {
|
|
401
|
+
opacity: 0.85;
|
|
402
|
+
}
|
|
403
|
+
</style>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DumbbellChart — pour chaque catégorie, une ligne horizontale reliant une
|
|
3
|
+
* valeur BASSE à une valeur HAUTE, avec un cercle plein à chaque extrémité
|
|
4
|
+
* (la basse et la haute portent deux teintes distinctes). Idéal pour comparer
|
|
5
|
+
* deux mesures par catégorie : avant/après, min/max, objectif/réalisé.
|
|
6
|
+
* API canonique (référence Svelte ; React/Vue s'alignent).
|
|
7
|
+
*
|
|
8
|
+
* Props obligatoires :
|
|
9
|
+
* data DumbbellChartDatum[] - tableau {category, low, high}
|
|
10
|
+
* label string - aria-label du graphique
|
|
11
|
+
*
|
|
12
|
+
* Props optionnelles :
|
|
13
|
+
* lowTone "category1".."category8" (défaut "category1") - cercle BAS
|
|
14
|
+
* highTone "category1".."category8" (défaut "category2") - cercle HAUT
|
|
15
|
+
* lowLabel string (défaut "Bas") - libellé légende du cercle bas
|
|
16
|
+
* highLabel string (défaut "Haut") - libellé légende du cercle haut
|
|
17
|
+
* width number (défaut 480)
|
|
18
|
+
* height number (défaut 240)
|
|
19
|
+
* class string
|
|
20
|
+
*
|
|
21
|
+
* Les catégories sont distribuées sur l'axe vertical (une ligne par
|
|
22
|
+
* catégorie) ; l'axe horizontal porte l'échelle de valeurs graduée.
|
|
23
|
+
*/
|
|
24
|
+
export type DumbbellChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
|
|
25
|
+
export type DumbbellChartDatum = {
|
|
26
|
+
category: string;
|
|
27
|
+
low: number;
|
|
28
|
+
high: number;
|
|
29
|
+
};
|
|
30
|
+
type DumbbellChartProps = {
|
|
31
|
+
data: DumbbellChartDatum[];
|
|
32
|
+
width?: number;
|
|
33
|
+
height?: number;
|
|
34
|
+
lowTone?: DumbbellChartTone;
|
|
35
|
+
highTone?: DumbbellChartTone;
|
|
36
|
+
lowLabel?: string;
|
|
37
|
+
highLabel?: string;
|
|
38
|
+
label: string;
|
|
39
|
+
class?: string;
|
|
40
|
+
};
|
|
41
|
+
declare const DumbbellChart: import("svelte").Component<DumbbellChartProps, {}, "">;
|
|
42
|
+
type DumbbellChart = ReturnType<typeof DumbbellChart>;
|
|
43
|
+
export default DumbbellChart;
|
|
44
|
+
//# sourceMappingURL=DumbbellChart.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DumbbellChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/DumbbellChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAOF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA+LJ,QAAA,MAAM,aAAa,wDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|