@sentropic/design-system-svelte 0.34.0 → 0.34.21
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/AppChrome.svelte +660 -0
- package/dist/AppChrome.svelte.d.ts +74 -0
- package/dist/AppChrome.svelte.d.ts.map +1 -0
- package/dist/AppChrome.test.d.ts +2 -0
- package/dist/AppChrome.test.d.ts.map +1 -0
- package/dist/AppChrome.test.js +122 -0
- 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/ConfigItemCard.svelte +303 -0
- package/dist/ConfigItemCard.svelte.d.ts +37 -0
- package/dist/ConfigItemCard.svelte.d.ts.map +1 -0
- package/dist/ContentSwitcher.svelte +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/FieldCard.svelte +220 -0
- package/dist/FieldCard.svelte.d.ts +28 -0
- package/dist/FieldCard.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/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/ScoreCard.svelte +172 -0
- package/dist/ScoreCard.svelte.d.ts +27 -0
- package/dist/ScoreCard.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 +56 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -0
- package/package.json +5 -3
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
/**
|
|
3
|
+
* ColumnRangeChart — barre allant d'une valeur BASSE à une valeur HAUTE par
|
|
4
|
+
* catégorie (ex. températures min/max par mois, fourchettes de prix).
|
|
5
|
+
* API canonique (référence Svelte ; React/Vue doivent s'aligner).
|
|
6
|
+
*
|
|
7
|
+
* Props obligatoires :
|
|
8
|
+
* data ColumnRangeChartDatum[] - tableau {category, low, high, tone?}
|
|
9
|
+
* label string - aria-label du graphique
|
|
10
|
+
*
|
|
11
|
+
* Props optionnelles :
|
|
12
|
+
* orientation "vertical"|"horizontal" (défaut "vertical")
|
|
13
|
+
* width number (défaut 480)
|
|
14
|
+
* height number (défaut 240)
|
|
15
|
+
* domain [number, number] - domaine fixe de l'axe des valeurs
|
|
16
|
+
* class string
|
|
17
|
+
*/
|
|
18
|
+
export type ColumnRangeChartTone =
|
|
19
|
+
| "category1"
|
|
20
|
+
| "category2"
|
|
21
|
+
| "category3"
|
|
22
|
+
| "category4"
|
|
23
|
+
| "category5"
|
|
24
|
+
| "category6"
|
|
25
|
+
| "category7"
|
|
26
|
+
| "category8";
|
|
27
|
+
|
|
28
|
+
export type ColumnRangeChartDatum = {
|
|
29
|
+
category: string;
|
|
30
|
+
low: number;
|
|
31
|
+
high: number;
|
|
32
|
+
tone?: ColumnRangeChartTone;
|
|
33
|
+
};
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<script lang="ts">
|
|
37
|
+
import ChartDataList from "./ChartDataList.svelte";
|
|
38
|
+
|
|
39
|
+
type ColumnRangeChartProps = {
|
|
40
|
+
data: ColumnRangeChartDatum[];
|
|
41
|
+
width?: number;
|
|
42
|
+
height?: number;
|
|
43
|
+
orientation?: "vertical" | "horizontal";
|
|
44
|
+
label: string;
|
|
45
|
+
/**
|
|
46
|
+
* Domaine fixe de l'axe des valeurs `[min, max]`. Quand fourni (et fini),
|
|
47
|
+
* l'échelle l'utilise au lieu du min/max dérivé des données — laissant
|
|
48
|
+
* plusieurs ColumnRangeCharts d'une grille partager une échelle. Absent ou
|
|
49
|
+
* invalide → repli sur la plage auto (inchangé).
|
|
50
|
+
*/
|
|
51
|
+
domain?: [number, number];
|
|
52
|
+
class?: string;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
let {
|
|
56
|
+
data = [],
|
|
57
|
+
width = 480,
|
|
58
|
+
height = 240,
|
|
59
|
+
orientation = "vertical",
|
|
60
|
+
label,
|
|
61
|
+
domain,
|
|
62
|
+
class: className
|
|
63
|
+
}: ColumnRangeChartProps = $props();
|
|
64
|
+
|
|
65
|
+
const MARGIN = { top: 12, right: 16, bottom: 32, left: 44 };
|
|
66
|
+
|
|
67
|
+
function niceTicks(min: number, max: number, target = 5): number[] {
|
|
68
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) {
|
|
69
|
+
const base = Number.isFinite(max) ? max : 0;
|
|
70
|
+
return [base];
|
|
71
|
+
}
|
|
72
|
+
const range = max - min;
|
|
73
|
+
const rough = range / Math.max(target - 1, 1);
|
|
74
|
+
const pow = Math.pow(10, Math.floor(Math.log10(rough)));
|
|
75
|
+
const norm = rough / pow;
|
|
76
|
+
let step: number;
|
|
77
|
+
if (norm < 1.5) step = 1 * pow;
|
|
78
|
+
else if (norm < 3) step = 2 * pow;
|
|
79
|
+
else if (norm < 7) step = 5 * pow;
|
|
80
|
+
else step = 10 * pow;
|
|
81
|
+
const start = Math.floor(min / step) * step;
|
|
82
|
+
const end = Math.ceil(max / step) * step;
|
|
83
|
+
const ticks: number[] = [];
|
|
84
|
+
for (let v = start; v <= end + step / 2; v += step) {
|
|
85
|
+
ticks.push(Number(v.toFixed(10)));
|
|
86
|
+
}
|
|
87
|
+
return ticks;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function formatTick(v: number): string {
|
|
91
|
+
if (Math.abs(v) >= 1000) return `${(v / 1000).toFixed(v % 1000 === 0 ? 0 : 1)}k`;
|
|
92
|
+
if (Number.isInteger(v)) return String(v);
|
|
93
|
+
return v.toFixed(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Normalise un point : low/high finis, ordonnés (lo <= hi).
|
|
97
|
+
function normalize(d: ColumnRangeChartDatum): { lo: number; hi: number } | null {
|
|
98
|
+
if (!Number.isFinite(d.low) || !Number.isFinite(d.high)) return null;
|
|
99
|
+
return { lo: Math.min(d.low, d.high), hi: Math.max(d.low, d.high) };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let hoveredIndex: number | null = $state(null);
|
|
103
|
+
|
|
104
|
+
// Données valides : low + high finis.
|
|
105
|
+
const validData = $derived(data.filter((d) => normalize(d) !== null));
|
|
106
|
+
|
|
107
|
+
// Un domaine n'est honoré que si fini et ordonné (min < max).
|
|
108
|
+
const validDomain = $derived.by<[number, number] | null>(() => {
|
|
109
|
+
if (!domain) return null;
|
|
110
|
+
const [d0, d1] = domain;
|
|
111
|
+
if (!Number.isFinite(d0) || !Number.isFinite(d1) || d0 >= d1) return null;
|
|
112
|
+
return [d0, d1];
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const scales = $derived.by(() => {
|
|
116
|
+
const lows = validData.map((d) => Math.min(d.low, d.high));
|
|
117
|
+
const highs = validData.map((d) => Math.max(d.low, d.high));
|
|
118
|
+
const minRaw = validDomain ? validDomain[0] : Math.min(...lows, ...highs);
|
|
119
|
+
const maxRaw = validDomain ? validDomain[1] : Math.max(...lows, ...highs);
|
|
120
|
+
const ticks = niceTicks(minRaw, maxRaw, 5);
|
|
121
|
+
const domainMin = ticks[0];
|
|
122
|
+
const domainMax = ticks[ticks.length - 1];
|
|
123
|
+
const plotWidth = Math.max(width - MARGIN.left - MARGIN.right, 1);
|
|
124
|
+
const plotHeight = Math.max(height - MARGIN.top - MARGIN.bottom, 1);
|
|
125
|
+
return { ticks, domainMin, domainMax, plotWidth, plotHeight };
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// Fraction [0,1] d'une valeur le long de l'axe (0 = domainMin, 1 = domainMax).
|
|
129
|
+
const valueFraction = $derived((v: number) => {
|
|
130
|
+
const { domainMin, domainMax } = scales;
|
|
131
|
+
if (domainMax === domainMin) return 0;
|
|
132
|
+
const f = (v - domainMin) / (domainMax - domainMin);
|
|
133
|
+
return Math.min(1, Math.max(0, f));
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const bars = $derived.by(() => {
|
|
137
|
+
const { plotWidth, plotHeight } = scales;
|
|
138
|
+
if (validData.length === 0) return [];
|
|
139
|
+
if (orientation === "vertical") {
|
|
140
|
+
const band = plotWidth / validData.length;
|
|
141
|
+
const barWidth = band * 0.62;
|
|
142
|
+
// Pixel y pour une valeur (fraction 0 → bas, 1 → haut du plot).
|
|
143
|
+
const yOf = (v: number) => plotHeight * (1 - valueFraction(v));
|
|
144
|
+
return validData.map((d, i) => {
|
|
145
|
+
const range = normalize(d)!;
|
|
146
|
+
const yLow = yOf(range.lo);
|
|
147
|
+
const yHigh = yOf(range.hi);
|
|
148
|
+
const y = Math.min(yLow, yHigh);
|
|
149
|
+
const h = Math.abs(yLow - yHigh);
|
|
150
|
+
const x = MARGIN.left + band * i + (band - barWidth) / 2;
|
|
151
|
+
return {
|
|
152
|
+
x,
|
|
153
|
+
y: MARGIN.top + y,
|
|
154
|
+
width: barWidth,
|
|
155
|
+
height: Math.max(h, 0.5),
|
|
156
|
+
cx: MARGIN.left + band * (i + 0.5),
|
|
157
|
+
cy: MARGIN.top + (yLow + yHigh) / 2,
|
|
158
|
+
datum: d,
|
|
159
|
+
range,
|
|
160
|
+
tone: d.tone ?? "category1"
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// horizontal
|
|
165
|
+
const band = plotHeight / validData.length;
|
|
166
|
+
const barHeight = band * 0.62;
|
|
167
|
+
// Pixel x pour une valeur (fraction 0 → gauche, 1 → droite du plot).
|
|
168
|
+
const xOf = (v: number) => plotWidth * valueFraction(v);
|
|
169
|
+
return validData.map((d, i) => {
|
|
170
|
+
const range = normalize(d)!;
|
|
171
|
+
const xLow = xOf(range.lo);
|
|
172
|
+
const xHigh = xOf(range.hi);
|
|
173
|
+
const x = Math.min(xLow, xHigh);
|
|
174
|
+
const w = Math.abs(xHigh - xLow);
|
|
175
|
+
const y = MARGIN.top + band * i + (band - barHeight) / 2;
|
|
176
|
+
return {
|
|
177
|
+
x: MARGIN.left + x,
|
|
178
|
+
y,
|
|
179
|
+
width: Math.max(w, 0.5),
|
|
180
|
+
height: barHeight,
|
|
181
|
+
cx: MARGIN.left + (xLow + xHigh) / 2,
|
|
182
|
+
cy: MARGIN.top + band * (i + 0.5),
|
|
183
|
+
datum: d,
|
|
184
|
+
range,
|
|
185
|
+
tone: d.tone ?? "category1"
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
const dataValueItems = $derived(
|
|
191
|
+
bars.map((bar) => `${bar.datum.category}: ${bar.range.lo} – ${bar.range.hi}`)
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
const valueAxisTicks = $derived.by(() => {
|
|
195
|
+
const { ticks, plotWidth, plotHeight } = scales;
|
|
196
|
+
if (orientation === "vertical") {
|
|
197
|
+
return ticks.map((tick) => ({
|
|
198
|
+
value: tick,
|
|
199
|
+
x1: MARGIN.left,
|
|
200
|
+
x2: MARGIN.left + plotWidth,
|
|
201
|
+
y: MARGIN.top + plotHeight * (1 - valueFraction(tick)),
|
|
202
|
+
x: undefined,
|
|
203
|
+
y1: undefined,
|
|
204
|
+
y2: undefined
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
return ticks.map((tick) => ({
|
|
208
|
+
value: tick,
|
|
209
|
+
x: MARGIN.left + plotWidth * valueFraction(tick),
|
|
210
|
+
y1: MARGIN.top,
|
|
211
|
+
y2: MARGIN.top + plotHeight,
|
|
212
|
+
x1: undefined,
|
|
213
|
+
x2: undefined,
|
|
214
|
+
y: undefined
|
|
215
|
+
}));
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
function handleLeave() {
|
|
219
|
+
hoveredIndex = null;
|
|
220
|
+
}
|
|
221
|
+
function handleVisualPointerMove(event: PointerEvent) {
|
|
222
|
+
const target = event.target;
|
|
223
|
+
if (!(target instanceof Element)) {
|
|
224
|
+
hoveredIndex = null;
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const index = Number(target.getAttribute("data-chart-index"));
|
|
228
|
+
hoveredIndex = Number.isInteger(index) ? index : null;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const classes = () => ["st-columnRangeChart", className].filter(Boolean).join(" ");
|
|
232
|
+
</script>
|
|
233
|
+
|
|
234
|
+
<div class={classes()}>
|
|
235
|
+
<div
|
|
236
|
+
class="st-columnRangeChart__visual"
|
|
237
|
+
role="img"
|
|
238
|
+
aria-label={label}
|
|
239
|
+
onpointermove={handleVisualPointerMove}
|
|
240
|
+
onpointerleave={handleLeave}
|
|
241
|
+
>
|
|
242
|
+
<svg
|
|
243
|
+
viewBox="0 0 {width} {height}"
|
|
244
|
+
preserveAspectRatio="xMidYMid meet"
|
|
245
|
+
width="100%"
|
|
246
|
+
height="100%"
|
|
247
|
+
focusable="false"
|
|
248
|
+
aria-hidden="true"
|
|
249
|
+
>
|
|
250
|
+
<!-- gridlines + value axis ticks -->
|
|
251
|
+
{#if orientation === "vertical"}
|
|
252
|
+
{#each valueAxisTicks as tick (tick.value)}
|
|
253
|
+
<line class="st-columnRangeChart__grid" x1={tick.x1} x2={tick.x2} y1={tick.y} y2={tick.y} />
|
|
254
|
+
<text
|
|
255
|
+
class="st-columnRangeChart__tickLabel"
|
|
256
|
+
x={MARGIN.left - 6}
|
|
257
|
+
y={tick.y}
|
|
258
|
+
text-anchor="end"
|
|
259
|
+
dominant-baseline="middle"
|
|
260
|
+
>
|
|
261
|
+
{formatTick(tick.value)}
|
|
262
|
+
</text>
|
|
263
|
+
{/each}
|
|
264
|
+
{:else}
|
|
265
|
+
{#each valueAxisTicks as tick (tick.value)}
|
|
266
|
+
<line class="st-columnRangeChart__grid" x1={tick.x} x2={tick.x} y1={tick.y1} y2={tick.y2} />
|
|
267
|
+
<text
|
|
268
|
+
class="st-columnRangeChart__tickLabel"
|
|
269
|
+
x={tick.x}
|
|
270
|
+
y={height - MARGIN.bottom + 16}
|
|
271
|
+
text-anchor="middle"
|
|
272
|
+
>
|
|
273
|
+
{formatTick(tick.value)}
|
|
274
|
+
</text>
|
|
275
|
+
{/each}
|
|
276
|
+
{/if}
|
|
277
|
+
|
|
278
|
+
<!-- axes -->
|
|
279
|
+
<line
|
|
280
|
+
class="st-columnRangeChart__axis"
|
|
281
|
+
x1={MARGIN.left}
|
|
282
|
+
x2={MARGIN.left}
|
|
283
|
+
y1={MARGIN.top}
|
|
284
|
+
y2={height - MARGIN.bottom}
|
|
285
|
+
/>
|
|
286
|
+
<line
|
|
287
|
+
class="st-columnRangeChart__axis"
|
|
288
|
+
x1={MARGIN.left}
|
|
289
|
+
x2={width - MARGIN.right}
|
|
290
|
+
y1={height - MARGIN.bottom}
|
|
291
|
+
y2={height - MARGIN.bottom}
|
|
292
|
+
/>
|
|
293
|
+
|
|
294
|
+
<!-- category labels -->
|
|
295
|
+
{#each bars as bar (bar.datum.category)}
|
|
296
|
+
{#if orientation === "vertical"}
|
|
297
|
+
<text
|
|
298
|
+
class="st-columnRangeChart__categoryLabel"
|
|
299
|
+
x={bar.x + bar.width / 2}
|
|
300
|
+
y={height - MARGIN.bottom + 16}
|
|
301
|
+
text-anchor="middle"
|
|
302
|
+
>
|
|
303
|
+
{bar.datum.category}
|
|
304
|
+
</text>
|
|
305
|
+
{:else}
|
|
306
|
+
<text
|
|
307
|
+
class="st-columnRangeChart__categoryLabel"
|
|
308
|
+
x={MARGIN.left - 6}
|
|
309
|
+
y={bar.y + bar.height / 2}
|
|
310
|
+
text-anchor="end"
|
|
311
|
+
dominant-baseline="middle"
|
|
312
|
+
>
|
|
313
|
+
{bar.datum.category}
|
|
314
|
+
</text>
|
|
315
|
+
{/if}
|
|
316
|
+
{/each}
|
|
317
|
+
|
|
318
|
+
<!-- range bars (decorative, inside aria-hidden SVG) -->
|
|
319
|
+
{#each bars as bar, i (bar.datum.category)}
|
|
320
|
+
<rect
|
|
321
|
+
class="st-columnRangeChart__bar st-columnRangeChart__bar--{bar.tone}"
|
|
322
|
+
x={bar.x}
|
|
323
|
+
y={bar.y}
|
|
324
|
+
width={bar.width}
|
|
325
|
+
height={bar.height}
|
|
326
|
+
rx="2"
|
|
327
|
+
data-chart-index={i}
|
|
328
|
+
/>
|
|
329
|
+
{/each}
|
|
330
|
+
</svg>
|
|
331
|
+
</div>
|
|
332
|
+
|
|
333
|
+
<ChartDataList {label} items={dataValueItems} />
|
|
334
|
+
|
|
335
|
+
{#if hoveredIndex !== null && bars[hoveredIndex]}
|
|
336
|
+
{@const bar = bars[hoveredIndex]}
|
|
337
|
+
<div
|
|
338
|
+
class="st-columnRangeChart__tooltip"
|
|
339
|
+
role="presentation"
|
|
340
|
+
style="left: {(bar.cx / width) * 100}%; top: {(bar.cy / height) * 100}%"
|
|
341
|
+
>
|
|
342
|
+
<span class="st-columnRangeChart__tooltipLabel">{bar.datum.category}</span>
|
|
343
|
+
<span class="st-columnRangeChart__tooltipValue">{bar.range.lo} – {bar.range.hi}</span>
|
|
344
|
+
</div>
|
|
345
|
+
{/if}
|
|
346
|
+
</div>
|
|
347
|
+
|
|
348
|
+
<style>
|
|
349
|
+
.st-columnRangeChart {
|
|
350
|
+
color: var(--st-semantic-text-secondary);
|
|
351
|
+
display: block;
|
|
352
|
+
font-family: inherit;
|
|
353
|
+
position: relative;
|
|
354
|
+
width: 100%;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.st-columnRangeChart svg {
|
|
358
|
+
display: block;
|
|
359
|
+
overflow: visible;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.st-columnRangeChart__visual {
|
|
363
|
+
display: block;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.st-columnRangeChart__grid {
|
|
367
|
+
stroke: var(--st-component-columnRangeChart-gridStroke, var(--st-semantic-border-subtle));
|
|
368
|
+
stroke-dasharray: 2 3;
|
|
369
|
+
stroke-width: 1;
|
|
370
|
+
opacity: 0.7;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.st-columnRangeChart__axis {
|
|
374
|
+
stroke: var(--st-component-columnRangeChart-axisStroke, var(--st-semantic-border-subtle));
|
|
375
|
+
stroke-width: 1;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.st-columnRangeChart__tickLabel,
|
|
379
|
+
.st-columnRangeChart__categoryLabel {
|
|
380
|
+
fill: var(--st-component-columnRangeChart-labelColor, var(--st-semantic-text-secondary));
|
|
381
|
+
font-size: 0.6875rem;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
.st-columnRangeChart__bar {
|
|
385
|
+
cursor: pointer;
|
|
386
|
+
transition: opacity var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.st-columnRangeChart__bar:hover {
|
|
390
|
+
opacity: 0.82;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
.st-columnRangeChart__bar--category1 { fill: var(--st-semantic-data-category1); }
|
|
394
|
+
.st-columnRangeChart__bar--category2 { fill: var(--st-semantic-data-category2); }
|
|
395
|
+
.st-columnRangeChart__bar--category3 { fill: var(--st-semantic-data-category3); }
|
|
396
|
+
.st-columnRangeChart__bar--category4 { fill: var(--st-semantic-data-category4); }
|
|
397
|
+
.st-columnRangeChart__bar--category5 { fill: var(--st-semantic-data-category5); }
|
|
398
|
+
.st-columnRangeChart__bar--category6 { fill: var(--st-semantic-data-category6); }
|
|
399
|
+
.st-columnRangeChart__bar--category7 { fill: var(--st-semantic-data-category7); }
|
|
400
|
+
.st-columnRangeChart__bar--category8 { fill: var(--st-semantic-data-category8); }
|
|
401
|
+
|
|
402
|
+
.st-columnRangeChart__tooltip {
|
|
403
|
+
background: var(--st-component-columnRangeChart-tooltipBackground, var(--st-semantic-surface-inverse));
|
|
404
|
+
border-radius: var(--st-radius-sm, 0.25rem);
|
|
405
|
+
color: var(--st-component-columnRangeChart-tooltipText, var(--st-semantic-text-inverse));
|
|
406
|
+
display: inline-flex;
|
|
407
|
+
flex-direction: column;
|
|
408
|
+
font-size: 0.75rem;
|
|
409
|
+
gap: 0.125rem;
|
|
410
|
+
line-height: 1.2;
|
|
411
|
+
padding: 0.375rem 0.5rem;
|
|
412
|
+
pointer-events: none;
|
|
413
|
+
position: absolute;
|
|
414
|
+
transform: translate(-50%, calc(-100% - 8px));
|
|
415
|
+
white-space: nowrap;
|
|
416
|
+
z-index: 1;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.st-columnRangeChart__tooltipLabel {
|
|
420
|
+
font-weight: 600;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.st-columnRangeChart__tooltipValue {
|
|
424
|
+
opacity: 0.85;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
@media (prefers-reduced-motion: reduce) {
|
|
428
|
+
.st-columnRangeChart__bar {
|
|
429
|
+
transition: none;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
</style>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ColumnRangeChart — barre allant d'une valeur BASSE à une valeur HAUTE par
|
|
3
|
+
* catégorie (ex. températures min/max par mois, fourchettes de prix).
|
|
4
|
+
* API canonique (référence Svelte ; React/Vue doivent s'aligner).
|
|
5
|
+
*
|
|
6
|
+
* Props obligatoires :
|
|
7
|
+
* data ColumnRangeChartDatum[] - tableau {category, low, high, tone?}
|
|
8
|
+
* label string - aria-label du graphique
|
|
9
|
+
*
|
|
10
|
+
* Props optionnelles :
|
|
11
|
+
* orientation "vertical"|"horizontal" (défaut "vertical")
|
|
12
|
+
* width number (défaut 480)
|
|
13
|
+
* height number (défaut 240)
|
|
14
|
+
* domain [number, number] - domaine fixe de l'axe des valeurs
|
|
15
|
+
* class string
|
|
16
|
+
*/
|
|
17
|
+
export type ColumnRangeChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
|
|
18
|
+
export type ColumnRangeChartDatum = {
|
|
19
|
+
category: string;
|
|
20
|
+
low: number;
|
|
21
|
+
high: number;
|
|
22
|
+
tone?: ColumnRangeChartTone;
|
|
23
|
+
};
|
|
24
|
+
type ColumnRangeChartProps = {
|
|
25
|
+
data: ColumnRangeChartDatum[];
|
|
26
|
+
width?: number;
|
|
27
|
+
height?: number;
|
|
28
|
+
orientation?: "vertical" | "horizontal";
|
|
29
|
+
label: string;
|
|
30
|
+
/**
|
|
31
|
+
* Domaine fixe de l'axe des valeurs `[min, max]`. Quand fourni (et fini),
|
|
32
|
+
* l'échelle l'utilise au lieu du min/max dérivé des données — laissant
|
|
33
|
+
* plusieurs ColumnRangeCharts d'une grille partager une échelle. Absent ou
|
|
34
|
+
* invalide → repli sur la plage auto (inchangé).
|
|
35
|
+
*/
|
|
36
|
+
domain?: [number, number];
|
|
37
|
+
class?: string;
|
|
38
|
+
};
|
|
39
|
+
declare const ColumnRangeChart: import("svelte").Component<ColumnRangeChartProps, {}, "">;
|
|
40
|
+
type ColumnRangeChart = ReturnType<typeof ColumnRangeChart>;
|
|
41
|
+
export default ColumnRangeChart;
|
|
42
|
+
//# sourceMappingURL=ColumnRangeChart.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColumnRangeChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/ColumnRangeChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,oBAAoB,CAAC;CAC7B,CAAC;AAMF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,qBAAqB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqPJ,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
package/dist/Combobox.svelte
CHANGED
|
@@ -274,14 +274,17 @@
|
|
|
274
274
|
|
|
275
275
|
.st-combobox--sm {
|
|
276
276
|
min-height: var(--st-component-control-smHeight, 2rem);
|
|
277
|
+
font-size: 0.8125rem;
|
|
277
278
|
}
|
|
278
279
|
|
|
279
280
|
.st-combobox--md {
|
|
280
281
|
min-height: var(--st-component-control-mdHeight, 2.5rem);
|
|
282
|
+
font-size: 0.875rem;
|
|
281
283
|
}
|
|
282
284
|
|
|
283
285
|
.st-combobox--lg {
|
|
284
286
|
min-height: var(--st-component-control-lgHeight, 3rem);
|
|
287
|
+
font-size: 1rem;
|
|
285
288
|
}
|
|
286
289
|
|
|
287
290
|
.st-combobox:hover:not(:has(input:disabled)) {
|