@sentropic/design-system-svelte 0.25.0 → 0.26.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.
@@ -13,6 +13,11 @@
13
13
  onMenuToggle?: () => void;
14
14
  /** aria-label du bouton burger. */
15
15
  menuLabel?: string;
16
+ /**
17
+ * Id du tiroir, partagé entre `aria-controls` (burger) et `id` (drawer).
18
+ * Auto-généré et stable si non fourni.
19
+ */
20
+ drawerId?: string;
16
21
  /** Logo (décision actée : logo SENT + sous-titre). */
17
22
  logo?: Snippet;
18
23
  /** Liens de navigation (rendus dans le <nav> desktop). */
@@ -23,9 +28,17 @@
23
28
  drawer?: Snippet;
24
29
  class?: string;
25
30
  }
31
+
32
+ // Compteur module pour générer un id de tiroir stable, déterministe et
33
+ // SSR-safe (pas de crypto). Aligné sur le pattern des 3 fw.
34
+ let appHeaderIdCounter = 0;
35
+ function nextAppHeaderId(): number {
36
+ return ++appHeaderIdCounter;
37
+ }
26
38
  </script>
27
39
 
28
40
  <script lang="ts">
41
+ import { untrack } from "svelte";
29
42
  import { Menu, X } from "@lucide/svelte";
30
43
 
31
44
  let {
@@ -33,6 +46,7 @@
33
46
  menuOpen = false,
34
47
  onMenuToggle,
35
48
  menuLabel = "Menu",
49
+ drawerId,
36
50
  logo,
37
51
  nav,
38
52
  actions,
@@ -40,6 +54,12 @@
40
54
  class: className,
41
55
  }: AppHeaderProps = $props();
42
56
 
57
+ // Id stable du tiroir : prop fournie sinon compteur module (SSR-safe, sans
58
+ // crypto). Capturé une seule fois (untrack) : un id stable ne doit pas réagir.
59
+ const resolvedDrawerId = untrack(
60
+ () => drawerId ?? `st-appHeader-drawer-${nextAppHeaderId()}`,
61
+ );
62
+
43
63
  const classes = () => ["st-appHeader", className].filter(Boolean).join(" ");
44
64
  </script>
45
65
 
@@ -54,6 +74,7 @@
54
74
  onclick={onMenuToggle}
55
75
  aria-label={menuLabel}
56
76
  aria-expanded={menuOpen}
77
+ aria-controls={resolvedDrawerId}
57
78
  aria-haspopup="menu"
58
79
  >
59
80
  {#if menuOpen}
@@ -90,7 +111,7 @@
90
111
  aria-label={menuLabel}
91
112
  onclick={onMenuToggle}
92
113
  ></button>
93
- <aside class="st-appHeader__drawer">
114
+ <aside id={resolvedDrawerId} class="st-appHeader__drawer">
94
115
  {@render drawer()}
95
116
  </aside>
96
117
  {/if}
@@ -11,6 +11,11 @@ export interface AppHeaderProps {
11
11
  onMenuToggle?: () => void;
12
12
  /** aria-label du bouton burger. */
13
13
  menuLabel?: string;
14
+ /**
15
+ * Id du tiroir, partagé entre `aria-controls` (burger) et `id` (drawer).
16
+ * Auto-généré et stable si non fourni.
17
+ */
18
+ drawerId?: string;
14
19
  /** Logo (décision actée : logo SENT + sous-titre). */
15
20
  logo?: Snippet;
16
21
  /** Liens de navigation (rendus dans le <nav> desktop). */
@@ -1 +1 @@
1
- {"version":3,"file":"AppHeader.svelte.d.ts","sourceRoot":"","sources":["../src/lib/AppHeader.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0DAA0D;IAC1D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqEH,QAAA,MAAM,SAAS,oDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"AppHeader.svelte.d.ts","sourceRoot":"","sources":["../src/lib/AppHeader.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0DAA0D;IAC1D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqFH,QAAA,MAAM,SAAS,oDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -0,0 +1,327 @@
1
+ <script lang="ts" module>
2
+ export type DivergentBarChartTone = "positive" | "negative" | "neutral";
3
+
4
+ export type DivergentBarChartDatum = {
5
+ label: string;
6
+ value: number;
7
+ tone?: DivergentBarChartTone;
8
+ };
9
+ </script>
10
+
11
+ <script lang="ts">
12
+ import ChartDataList from "./ChartDataList.svelte";
13
+
14
+ type DivergentBarChartProps = {
15
+ data: DivergentBarChartDatum[];
16
+ width?: number;
17
+ height?: number;
18
+ domain?: [number, number];
19
+ format?: (value: number) => string;
20
+ showLegend?: boolean;
21
+ label: string;
22
+ class?: string;
23
+ };
24
+
25
+ let {
26
+ data,
27
+ width = 480,
28
+ height = 260,
29
+ domain,
30
+ format = formatTick,
31
+ showLegend = true,
32
+ label,
33
+ class: className
34
+ }: DivergentBarChartProps = $props();
35
+
36
+ const MARGIN = { top: 14, right: 16, bottom: 34, left: 88 };
37
+
38
+ function niceTicks(min: number, max: number, target = 5): number[] {
39
+ if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) {
40
+ const base = Number.isFinite(max) ? max : 0;
41
+ return [base];
42
+ }
43
+ const range = max - min;
44
+ const rough = range / Math.max(target - 1, 1);
45
+ const pow = Math.pow(10, Math.floor(Math.log10(rough)));
46
+ const norm = rough / pow;
47
+ const step = norm < 1.5 ? pow : norm < 3 ? 2 * pow : norm < 7 ? 5 * pow : 10 * pow;
48
+ const start = Math.floor(min / step) * step;
49
+ const end = Math.ceil(max / step) * step;
50
+ const ticks: number[] = [];
51
+ for (let v = start; v <= end + step / 2; v += step) ticks.push(Number(v.toFixed(10)));
52
+ return ticks;
53
+ }
54
+
55
+ const scaleLinear = (v: number, d0: number, d1: number, r0: number, r1: number) =>
56
+ d1 === d0 ? r0 : r0 + ((v - d0) * (r1 - r0)) / (d1 - d0);
57
+
58
+ function formatTick(v: number): string {
59
+ if (Math.abs(v) >= 1000) return `${(v / 1000).toFixed(v % 1000 === 0 ? 0 : 1)}k`;
60
+ if (Number.isInteger(v)) return String(v);
61
+ return v.toFixed(1);
62
+ }
63
+
64
+ function signFor(value: number): "positive" | "negative" | "zero" {
65
+ if (value > 0) return "positive";
66
+ if (value < 0) return "negative";
67
+ return "zero";
68
+ }
69
+
70
+ function toneFor(datum: DivergentBarChartDatum): DivergentBarChartTone {
71
+ if (datum.tone) return datum.tone;
72
+ if (datum.value > 0) return "positive";
73
+ if (datum.value < 0) return "negative";
74
+ return "neutral";
75
+ }
76
+
77
+ let hoveredIndex: number | null = $state(null);
78
+
79
+ const validData = $derived(data.filter((d) => Number.isFinite(d.value)));
80
+
81
+ const validDomain = $derived.by<[number, number] | null>(() => {
82
+ if (!domain) return null;
83
+ const [d0, d1] = domain;
84
+ if (!Number.isFinite(d0) || !Number.isFinite(d1) || d0 >= d1 || d0 > 0 || d1 < 0) return null;
85
+ return [d0, d1];
86
+ });
87
+
88
+ const scales = $derived.by(() => {
89
+ const plotWidth = Math.max(width - MARGIN.left - MARGIN.right, 1);
90
+ const plotHeight = Math.max(height - MARGIN.top - MARGIN.bottom, 1);
91
+ if (validDomain) {
92
+ const ticks = niceTicks(validDomain[0], validDomain[1]).filter((tick) => tick >= validDomain[0] && tick <= validDomain[1]);
93
+ return { plotWidth, plotHeight, domainMin: validDomain[0], domainMax: validDomain[1], ticks: ticks.length ? ticks : [0] };
94
+ }
95
+ const maxAbs = Math.max(1, ...validData.map((d) => Math.abs(d.value)));
96
+ const ticks = niceTicks(-maxAbs, maxAbs);
97
+ return { plotWidth, plotHeight, domainMin: ticks[0], domainMax: ticks[ticks.length - 1], ticks };
98
+ });
99
+
100
+ const bars = $derived.by(() => {
101
+ if (validData.length === 0) return [];
102
+ const { domainMin, domainMax, plotWidth, plotHeight } = scales;
103
+ const band = plotHeight / validData.length;
104
+ const barHeight = Math.max(band * 0.56, 1);
105
+ const zeroX = MARGIN.left + scaleLinear(0, domainMin, domainMax, 0, plotWidth);
106
+ return validData.map((datum, index) => {
107
+ const valueX = MARGIN.left + scaleLinear(datum.value, domainMin, domainMax, 0, plotWidth);
108
+ const x = Math.min(zeroX, valueX);
109
+ const barWidth = Math.max(Math.abs(valueX - zeroX), 0.5);
110
+ const y = MARGIN.top + band * index + (band - barHeight) / 2;
111
+ return {
112
+ datum,
113
+ index,
114
+ x,
115
+ y,
116
+ width: barWidth,
117
+ height: barHeight,
118
+ cx: datum.value === 0 ? zeroX : x + barWidth / 2,
119
+ cy: y + barHeight / 2,
120
+ sign: signFor(datum.value),
121
+ tone: toneFor(datum)
122
+ };
123
+ });
124
+ });
125
+
126
+ const dataValueItems = $derived(validData.map((d) => `${d.label}: ${format(d.value)}`));
127
+
128
+ const gridTicks = $derived.by(() => {
129
+ const { ticks, domainMin, domainMax, plotWidth } = scales;
130
+ return ticks.map((tick) => ({
131
+ value: tick,
132
+ x: MARGIN.left + scaleLinear(tick, domainMin, domainMax, 0, plotWidth)
133
+ }));
134
+ });
135
+
136
+ function handleVisualPointerMove(event: PointerEvent) {
137
+ const target = event.target;
138
+ if (!(target instanceof Element)) {
139
+ hoveredIndex = null;
140
+ return;
141
+ }
142
+ const index = Number(target.getAttribute("data-chart-index"));
143
+ hoveredIndex = Number.isInteger(index) ? index : null;
144
+ }
145
+
146
+ const hoveredBar = $derived(hoveredIndex !== null ? bars[hoveredIndex] : undefined);
147
+ const zeroAxisX = $derived(MARGIN.left + scaleLinear(0, scales.domainMin, scales.domainMax, 0, scales.plotWidth));
148
+ const classes = () => ["st-divergentBarChart", className].filter(Boolean).join(" ");
149
+ </script>
150
+
151
+ <div class={classes()}>
152
+ <div
153
+ class="st-divergentBarChart__visual"
154
+ role="img"
155
+ aria-label={label}
156
+ onpointermove={handleVisualPointerMove}
157
+ onpointerleave={() => (hoveredIndex = null)}
158
+ >
159
+ <svg viewBox="0 0 {width} {height}" preserveAspectRatio="xMidYMid meet" width="100%" height="100%" focusable="false" aria-hidden="true">
160
+ {#each gridTicks as tick (tick.value)}
161
+ <line class="st-divergentBarChart__grid" x1={tick.x} x2={tick.x} y1={MARGIN.top} y2={height - MARGIN.bottom} />
162
+ <text class="st-divergentBarChart__tickLabel" x={tick.x} y={height - MARGIN.bottom + 16} text-anchor="middle">
163
+ {formatTick(tick.value)}
164
+ </text>
165
+ {/each}
166
+
167
+ <line class="st-divergentBarChart__axis" x1={MARGIN.left} x2={width - MARGIN.right} y1={height - MARGIN.bottom} y2={height - MARGIN.bottom} />
168
+ <line class="st-divergentBarChart__zeroAxis" x1={zeroAxisX} x2={zeroAxisX} y1={MARGIN.top} y2={height - MARGIN.bottom} />
169
+
170
+ {#each bars as bar (bar.datum.label)}
171
+ <text class="st-divergentBarChart__categoryLabel" x={MARGIN.left - 8} y={bar.cy} text-anchor="end" dominant-baseline="middle">
172
+ {bar.datum.label}
173
+ </text>
174
+ <rect
175
+ class="st-divergentBarChart__bar st-divergentBarChart__bar--{bar.sign} st-divergentBarChart__bar--{bar.tone}"
176
+ x={bar.x}
177
+ y={bar.y}
178
+ width={bar.width}
179
+ height={bar.height}
180
+ rx="2"
181
+ data-chart-index={bar.index}
182
+ data-chart-key={bar.datum.label}
183
+ />
184
+ {/each}
185
+ </svg>
186
+ </div>
187
+
188
+ <ChartDataList {label} items={dataValueItems} />
189
+
190
+ {#if hoveredBar}
191
+ <div class="st-divergentBarChart__tooltip" role="presentation" style="left: {(hoveredBar.cx / width) * 100}%; top: {(hoveredBar.cy / height) * 100}%">
192
+ <span class="st-divergentBarChart__tooltipLabel">{hoveredBar.datum.label}</span>
193
+ <span class="st-divergentBarChart__tooltipValue">{format(hoveredBar.datum.value)}</span>
194
+ </div>
195
+ {/if}
196
+
197
+ {#if showLegend}
198
+ <ul class="st-divergentBarChart__legend">
199
+ <li class="st-divergentBarChart__legendItem"><span class="st-divergentBarChart__legendSwatch st-divergentBarChart__legendSwatch--positive" aria-hidden="true"></span>Positive</li>
200
+ <li class="st-divergentBarChart__legendItem"><span class="st-divergentBarChart__legendSwatch st-divergentBarChart__legendSwatch--negative" aria-hidden="true"></span>Negative</li>
201
+ <li class="st-divergentBarChart__legendItem"><span class="st-divergentBarChart__legendSwatch st-divergentBarChart__legendSwatch--neutral" aria-hidden="true"></span>Zero</li>
202
+ </ul>
203
+ {/if}
204
+ </div>
205
+
206
+ <style>
207
+ .st-divergentBarChart {
208
+ color: var(--st-component-divergentBarChart-labelColor, var(--st-semantic-text-secondary));
209
+ display: block;
210
+ font-family: inherit;
211
+ position: relative;
212
+ width: 100%;
213
+ }
214
+
215
+ .st-divergentBarChart svg,
216
+ .st-divergentBarChart__visual {
217
+ display: block;
218
+ overflow: visible;
219
+ }
220
+
221
+ .st-divergentBarChart__grid {
222
+ stroke: var(--st-component-divergentBarChart-gridStroke, var(--st-semantic-border-subtle));
223
+ stroke-dasharray: 2 3;
224
+ stroke-width: 1;
225
+ opacity: 0.7;
226
+ }
227
+
228
+ .st-divergentBarChart__axis {
229
+ stroke: var(--st-component-divergentBarChart-axisStroke, var(--st-semantic-border-subtle));
230
+ stroke-width: 1;
231
+ }
232
+
233
+ .st-divergentBarChart__zeroAxis {
234
+ stroke: var(--st-component-divergentBarChart-zeroStroke, var(--st-semantic-border-strong));
235
+ stroke-width: 1.5;
236
+ }
237
+
238
+ .st-divergentBarChart__tickLabel,
239
+ .st-divergentBarChart__categoryLabel {
240
+ fill: var(--st-component-divergentBarChart-labelColor, var(--st-semantic-text-secondary));
241
+ font-size: 0.6875rem;
242
+ }
243
+
244
+ .st-divergentBarChart__bar {
245
+ cursor: pointer;
246
+ transition: opacity var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
247
+ }
248
+
249
+ .st-divergentBarChart__bar--positive {
250
+ fill: var(--st-component-divergentBarChart-positiveFill, var(--st-semantic-data-category5));
251
+ }
252
+
253
+ .st-divergentBarChart__bar--negative {
254
+ fill: var(--st-component-divergentBarChart-negativeFill, var(--st-semantic-data-category3));
255
+ }
256
+
257
+ .st-divergentBarChart__bar--neutral,
258
+ .st-divergentBarChart__bar--zero {
259
+ fill: var(--st-component-divergentBarChart-neutralFill, var(--st-semantic-data-category6));
260
+ }
261
+
262
+ .st-divergentBarChart__tooltip {
263
+ background: var(--st-component-divergentBarChart-tooltipBackground, var(--st-semantic-surface-inverse));
264
+ border-radius: var(--st-radius-sm, 0.25rem);
265
+ color: var(--st-component-divergentBarChart-tooltipText, var(--st-semantic-text-inverse));
266
+ display: inline-flex;
267
+ flex-direction: column;
268
+ font-size: 0.75rem;
269
+ gap: 0.125rem;
270
+ line-height: 1.2;
271
+ padding: 0.375rem 0.5rem;
272
+ pointer-events: none;
273
+ position: absolute;
274
+ transform: translate(-50%, calc(-100% - 8px));
275
+ white-space: nowrap;
276
+ z-index: 1;
277
+ }
278
+
279
+ .st-divergentBarChart__tooltipLabel {
280
+ font-weight: 600;
281
+ }
282
+
283
+ .st-divergentBarChart__tooltipValue {
284
+ opacity: 0.85;
285
+ }
286
+
287
+ .st-divergentBarChart__legend {
288
+ display: flex;
289
+ flex-wrap: wrap;
290
+ gap: var(--st-spacing-3, 0.75rem);
291
+ list-style: none;
292
+ margin: var(--st-spacing-2, 0.5rem) 0 0;
293
+ padding: 0;
294
+ }
295
+
296
+ .st-divergentBarChart__legendItem {
297
+ align-items: center;
298
+ color: var(--st-semantic-text-secondary);
299
+ display: inline-flex;
300
+ font-size: 0.75rem;
301
+ gap: var(--st-spacing-1, 0.25rem);
302
+ }
303
+
304
+ .st-divergentBarChart__legendSwatch {
305
+ border-radius: 2px;
306
+ height: 0.7rem;
307
+ width: 0.7rem;
308
+ }
309
+
310
+ .st-divergentBarChart__legendSwatch--positive {
311
+ background: var(--st-component-divergentBarChart-positiveFill, var(--st-semantic-data-category5));
312
+ }
313
+
314
+ .st-divergentBarChart__legendSwatch--negative {
315
+ background: var(--st-component-divergentBarChart-negativeFill, var(--st-semantic-data-category3));
316
+ }
317
+
318
+ .st-divergentBarChart__legendSwatch--neutral {
319
+ background: var(--st-component-divergentBarChart-neutralFill, var(--st-semantic-data-category6));
320
+ }
321
+
322
+ @media (prefers-reduced-motion: reduce) {
323
+ .st-divergentBarChart__bar {
324
+ transition: none;
325
+ }
326
+ }
327
+ </style>
@@ -0,0 +1,20 @@
1
+ export type DivergentBarChartTone = "positive" | "negative" | "neutral";
2
+ export type DivergentBarChartDatum = {
3
+ label: string;
4
+ value: number;
5
+ tone?: DivergentBarChartTone;
6
+ };
7
+ type DivergentBarChartProps = {
8
+ data: DivergentBarChartDatum[];
9
+ width?: number;
10
+ height?: number;
11
+ domain?: [number, number];
12
+ format?: (value: number) => string;
13
+ showLegend?: boolean;
14
+ label: string;
15
+ class?: string;
16
+ };
17
+ declare const DivergentBarChart: import("svelte").Component<DivergentBarChartProps, {}, "">;
18
+ type DivergentBarChart = ReturnType<typeof DivergentBarChart>;
19
+ export default DivergentBarChart;
20
+ //# sourceMappingURL=DivergentBarChart.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DivergentBarChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/DivergentBarChart.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAExE,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B,CAAC;AAMF,KAAK,sBAAsB,GAAG;IAC5B,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAiLJ,QAAA,MAAM,iBAAiB,4DAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -10,8 +10,18 @@
10
10
  user?: IdentityUser | null;
11
11
  /** État d'authentification (contrôlé : aucun état auth interne). */
12
12
  isAuthenticated?: boolean;
13
- /** État ouvert du dropdown (optionnellement contrôlé). */
13
+ /**
14
+ * État ouvert du dropdown (optionnellement contrôlé). Si fourni, le
15
+ * composant suit la valeur du parent ; sinon il gère un état interne.
16
+ * Reste $bindable pour l'idiome Svelte.
17
+ */
14
18
  open?: boolean;
19
+ /**
20
+ * Notifié à chaque demande de changement d'état ouvert (pattern
21
+ * contrôlé/non-contrôlé, aligné React/Vue). Le composant met aussi à jour
22
+ * `open` (bindable) quand il est non contrôlé.
23
+ */
24
+ onOpenChange?: (open: boolean) => void;
15
25
  /** Notifié au clic « Se connecter ». */
16
26
  onLogin?: () => void;
17
27
  /** Notifié au clic « Se déconnecter ». */
@@ -50,7 +60,8 @@
50
60
  let {
51
61
  user = null,
52
62
  isAuthenticated = false,
53
- open = $bindable(false),
63
+ open = $bindable(),
64
+ onOpenChange,
54
65
  onLogin,
55
66
  onLogout,
56
67
  devicesHref = "#",
@@ -66,6 +77,20 @@
66
77
  let root: HTMLDivElement | undefined = $state();
67
78
  let triggerEl: HTMLButtonElement | undefined = $state();
68
79
 
80
+ // Pattern contrôlé/non-contrôlé, IDENTIQUE aux 3 fw : si `open` est fourni en
81
+ // prop, le parent contrôle ; sinon un état interne prend le relais.
82
+ let internalOpen = $state(false);
83
+ const isOpen = $derived(open ?? internalOpen);
84
+ // Quel item focuser à la prochaine ouverture : "first" (défaut) ou "last"
85
+ // (ArrowUp depuis le trigger). Lu par l'$effect d'ouverture.
86
+ let pendingFocus: "first" | "last" = "first";
87
+
88
+ function setOpen(next: boolean) {
89
+ if (open === undefined) internalOpen = next;
90
+ else open = next; // bindable : reflète aussi côté parent en mode contrôlé
91
+ onOpenChange?.(next);
92
+ }
93
+
69
94
  const classes = () => ["st-identityMenu", className].filter(Boolean).join(" ");
70
95
  const initial = $derived(identityInitial(user));
71
96
  const displayName = $derived(user?.displayName || user?.email || "User");
@@ -85,25 +110,33 @@
85
110
  }
86
111
 
87
112
  function toggle() {
88
- open = !open;
113
+ setOpen(!isOpen);
89
114
  }
90
115
 
91
116
  function closeAndFocusTrigger() {
92
- open = false;
117
+ setOpen(false);
93
118
  triggerEl?.focus();
94
119
  }
95
120
 
96
121
  function onTriggerKeydown(event: KeyboardEvent) {
97
122
  if (event.key === "ArrowDown" || event.key === "Enter" || event.key === " ") {
98
123
  event.preventDefault();
99
- if (!open) open = true;
100
- queueMicrotask(() => focusItem(0));
124
+ pendingFocus = "first";
125
+ if (!isOpen) setOpen(true);
126
+ else queueMicrotask(() => focusItem(0));
101
127
  return;
102
128
  }
103
129
  if (event.key === "ArrowUp") {
104
130
  event.preventDefault();
105
- if (!open) open = true;
106
- queueMicrotask(() => focusItem(-1));
131
+ pendingFocus = "last";
132
+ if (!isOpen) setOpen(true);
133
+ else queueMicrotask(() => focusItem(-1));
134
+ return;
135
+ }
136
+ if (event.key === "Escape" && isOpen) {
137
+ // Esc ferme aussi depuis le trigger (global au composant ouvert).
138
+ event.preventDefault();
139
+ closeAndFocusTrigger();
107
140
  }
108
141
  }
109
142
 
@@ -130,21 +163,57 @@
130
163
  focusItem(items.length - 1);
131
164
  return;
132
165
  }
166
+ if (event.key === "Tab") {
167
+ // Piège de focus : Tab/Shift+Tab bouclent DANS le menu.
168
+ if (!items.length) return;
169
+ event.preventDefault();
170
+ focusItem(current + (event.shiftKey ? -1 : 1));
171
+ return;
172
+ }
133
173
  if (event.key === "Escape") {
134
174
  event.preventDefault();
135
175
  closeAndFocusTrigger();
136
176
  }
137
177
  }
138
178
 
179
+ // Enter/Space activent l'item courant. Sur un <a>, on suit le href en
180
+ // déclenchant un clic natif (preventDefault sur Space pour éviter le scroll).
181
+ function onItemKeydown(event: KeyboardEvent) {
182
+ if (event.key === "Enter" || event.key === " ") {
183
+ event.preventDefault();
184
+ (event.currentTarget as HTMLElement).click();
185
+ }
186
+ }
187
+
188
+ function selectAndClose() {
189
+ setOpen(false);
190
+ triggerEl?.focus();
191
+ }
192
+
139
193
  function handleLogout() {
140
- open = false;
194
+ setOpen(false);
195
+ triggerEl?.focus();
141
196
  onLogout?.();
142
197
  }
198
+
199
+ // À l'ouverture : focus le 1er item (ou le dernier sur ArrowUp). Client-only
200
+ // (guard typeof document). Restaure `pendingFocus` à "first" ensuite.
201
+ $effect(() => {
202
+ if (isOpen && typeof document !== "undefined") {
203
+ const which = pendingFocus;
204
+ queueMicrotask(() => focusItem(which === "last" ? -1 : 0));
205
+ pendingFocus = "first";
206
+ }
207
+ });
143
208
  </script>
144
209
 
145
210
  <svelte:window
146
211
  onpointerdown={(e) => {
147
- if (open && root && e.target instanceof Node && !root.contains(e.target)) open = false;
212
+ if (isOpen && root && e.target instanceof Node && !root.contains(e.target)) {
213
+ // Clic extérieur : ferme ET restaure le focus sur le trigger.
214
+ setOpen(false);
215
+ triggerEl?.focus();
216
+ }
148
217
  }}
149
218
  />
150
219
 
@@ -159,7 +228,7 @@
159
228
  class="st-identityMenu__trigger"
160
229
  bind:this={triggerEl}
161
230
  aria-haspopup="menu"
162
- aria-expanded={open}
231
+ aria-expanded={isOpen}
163
232
  aria-label={`Compte de ${displayName}`}
164
233
  onclick={toggle}
165
234
  onkeydown={onTriggerKeydown}
@@ -172,13 +241,13 @@
172
241
  {/if}
173
242
  </span>
174
243
  <ChevronDown
175
- class={`st-identityMenu__chevron${open ? " st-identityMenu__chevron--open" : ""}`}
244
+ class={`st-identityMenu__chevron${isOpen ? " st-identityMenu__chevron--open" : ""}`}
176
245
  size={16}
177
246
  aria-hidden="true"
178
247
  />
179
248
  </button>
180
249
 
181
- {#if open}
250
+ {#if isOpen}
182
251
  <div
183
252
  class="st-identityMenu__menu"
184
253
  role="menu"
@@ -191,7 +260,8 @@
191
260
  class="st-identityMenu__item"
192
261
  role="menuitem"
193
262
  tabindex="-1"
194
- onclick={() => (open = false)}
263
+ onclick={selectAndClose}
264
+ onkeydown={onItemKeydown}
195
265
  >
196
266
  {devicesLabel}
197
267
  </a>
@@ -200,7 +270,8 @@
200
270
  class="st-identityMenu__item"
201
271
  role="menuitem"
202
272
  tabindex="-1"
203
- onclick={() => (open = false)}
273
+ onclick={selectAndClose}
274
+ onkeydown={onItemKeydown}
204
275
  >
205
276
  {settingsLabel}
206
277
  </a>
@@ -8,8 +8,18 @@ export interface IdentityMenuProps {
8
8
  user?: IdentityUser | null;
9
9
  /** État d'authentification (contrôlé : aucun état auth interne). */
10
10
  isAuthenticated?: boolean;
11
- /** État ouvert du dropdown (optionnellement contrôlé). */
11
+ /**
12
+ * État ouvert du dropdown (optionnellement contrôlé). Si fourni, le
13
+ * composant suit la valeur du parent ; sinon il gère un état interne.
14
+ * Reste $bindable pour l'idiome Svelte.
15
+ */
12
16
  open?: boolean;
17
+ /**
18
+ * Notifié à chaque demande de changement d'état ouvert (pattern
19
+ * contrôlé/non-contrôlé, aligné React/Vue). Le composant met aussi à jour
20
+ * `open` (bindable) quand il est non contrôlé.
21
+ */
22
+ onOpenChange?: (open: boolean) => void;
13
23
  /** Notifié au clic « Se connecter ». */
14
24
  onLogin?: () => void;
15
25
  /** Notifié au clic « Se déconnecter ». */
@@ -1 +1 @@
1
- {"version":3,"file":"IdentityMenu.svelte.d.ts","sourceRoot":"","sources":["../src/lib/IdentityMenu.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAG7E;AAmJH,QAAA,MAAM,YAAY,2DAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"IdentityMenu.svelte.d.ts","sourceRoot":"","sources":["../src/lib/IdentityMenu.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAG7E;AA8MH,QAAA,MAAM,YAAY,2DAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -1,6 +1,12 @@
1
1
  <script lang="ts" module>
2
2
  export type LanguageToggleLocale = "fr" | "en";
3
3
 
4
+ // Compteur module pour un id de <select> stable, déterministe et SSR-safe.
5
+ let languageToggleIdCounter = 0;
6
+ function nextLanguageToggleId(): number {
7
+ return ++languageToggleIdCounter;
8
+ }
9
+
4
10
  export interface LanguageToggleProps {
5
11
  /** Langue courante (contrôlé). */
6
12
  locale?: LanguageToggleLocale;
@@ -10,8 +16,10 @@
10
16
  frLabel?: string;
11
17
  /** Libellé EN (i18n-agnostique : fourni par le parent). */
12
18
  enLabel?: string;
13
- /** aria-label du sélecteur. */
19
+ /** Libellé du sélecteur (associé via <label for> + aria-label). */
14
20
  label?: string;
21
+ /** Id du <select> ; auto-généré et stable si non fourni. */
22
+ selectId?: string;
15
23
  /**
16
24
  * Variante d'affichage :
17
25
  * - `select` (défaut) : le <select> de la source (header desktop).
@@ -25,6 +33,7 @@
25
33
  </script>
26
34
 
27
35
  <script lang="ts">
36
+ import { untrack } from "svelte";
28
37
  import { ChevronDown } from "@lucide/svelte";
29
38
 
30
39
  let {
@@ -33,11 +42,17 @@
33
42
  frLabel = "FR",
34
43
  enLabel = "EN",
35
44
  label = "Langue",
45
+ selectId,
36
46
  variant = "select",
37
47
  accordionLabel = "Langue",
38
48
  class: className,
39
49
  }: LanguageToggleProps = $props();
40
50
 
51
+ // Capturé une seule fois (untrack) : un id stable ne doit pas réagir.
52
+ const resolvedSelectId = untrack(
53
+ () => selectId ?? `st-languageToggle-${nextLanguageToggleId()}`,
54
+ );
55
+
41
56
  let open = $state(false);
42
57
 
43
58
  const classes = () => ["st-languageToggle", className].filter(Boolean).join(" ");
@@ -91,7 +106,9 @@
91
106
  {/if}
92
107
  </div>
93
108
  {:else}
109
+ <label class="st-languageToggle__srLabel" for={resolvedSelectId}>{label}</label>
94
110
  <select
111
+ id={resolvedSelectId}
95
112
  class={`st-languageToggle__select${className ? ` ${className}` : ""}`}
96
113
  value={locale}
97
114
  aria-label={label}
@@ -107,6 +124,19 @@
107
124
  width: 100%;
108
125
  }
109
126
 
127
+ /* Label associé au <select>, masqué visuellement (a11y : <label for>). */
128
+ .st-languageToggle__srLabel {
129
+ border: 0;
130
+ clip: rect(0 0 0 0);
131
+ height: 1px;
132
+ margin: -1px;
133
+ overflow: hidden;
134
+ padding: 0;
135
+ position: absolute;
136
+ white-space: nowrap;
137
+ width: 1px;
138
+ }
139
+
110
140
  /* Variante <select> — calque du <select> source (header desktop). */
111
141
  .st-languageToggle__select {
112
142
  background: var(--st-semantic-surface-default);
@@ -8,8 +8,10 @@ export interface LanguageToggleProps {
8
8
  frLabel?: string;
9
9
  /** Libellé EN (i18n-agnostique : fourni par le parent). */
10
10
  enLabel?: string;
11
- /** aria-label du sélecteur. */
11
+ /** Libellé du sélecteur (associé via <label for> + aria-label). */
12
12
  label?: string;
13
+ /** Id du <select> ; auto-généré et stable si non fourni. */
14
+ selectId?: string;
13
15
  /**
14
16
  * Variante d'affichage :
15
17
  * - `select` (défaut) : le <select> de la source (header desktop).
@@ -1 +1 @@
1
- {"version":3,"file":"LanguageToggle.svelte.d.ts","sourceRoot":"","sources":["../src/lib/LanguageToggle.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,uCAAuC;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACxD,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IACjC,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+DH,QAAA,MAAM,cAAc,yDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"LanguageToggle.svelte.d.ts","sourceRoot":"","sources":["../src/lib/LanguageToggle.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;AAQ/C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,uCAAuC;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACxD,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IACjC,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwEH,QAAA,MAAM,cAAc,yDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,382 @@
1
+ <script lang="ts" module>
2
+ export type StepLineChartTone =
3
+ | "category1"
4
+ | "category2"
5
+ | "category3"
6
+ | "category4"
7
+ | "category5"
8
+ | "category6"
9
+ | "category7"
10
+ | "category8";
11
+
12
+ export type StepLineChartDatum = {
13
+ x: number | string;
14
+ y: number;
15
+ };
16
+ </script>
17
+
18
+ <script lang="ts">
19
+ import ChartDataList from "./ChartDataList.svelte";
20
+
21
+ type StepLineChartProps = {
22
+ data: StepLineChartDatum[];
23
+ width?: number;
24
+ height?: number;
25
+ tone?: StepLineChartTone;
26
+ label: string;
27
+ class?: string;
28
+ };
29
+
30
+ let {
31
+ data = [],
32
+ width = 480,
33
+ height = 240,
34
+ tone = "category1",
35
+ label,
36
+ class: className
37
+ }: StepLineChartProps = $props();
38
+
39
+ const MARGIN = { top: 12, right: 16, bottom: 32, left: 44 };
40
+
41
+ function niceTicks(min: number, max: number, target = 5): number[] {
42
+ if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) {
43
+ const base = Number.isFinite(max) ? max : 0;
44
+ return [base];
45
+ }
46
+ const range = max - min;
47
+ const rough = range / Math.max(target - 1, 1);
48
+ const pow = Math.pow(10, Math.floor(Math.log10(rough)));
49
+ const norm = rough / pow;
50
+ let step: number;
51
+ if (norm < 1.5) step = 1 * pow;
52
+ else if (norm < 3) step = 2 * pow;
53
+ else if (norm < 7) step = 5 * pow;
54
+ else step = 10 * pow;
55
+ const start = Math.floor(min / step) * step;
56
+ const end = Math.ceil(max / step) * step;
57
+ const ticks: number[] = [];
58
+ for (let v = start; v <= end + step / 2; v += step) {
59
+ ticks.push(Number(v.toFixed(10)));
60
+ }
61
+ return ticks;
62
+ }
63
+
64
+ function scaleLinear(v: number, d0: number, d1: number, r0: number, r1: number) {
65
+ if (d1 === d0) return r0;
66
+ return r0 + ((v - d0) * (r1 - r0)) / (d1 - d0);
67
+ }
68
+
69
+ function formatTick(v: number): string {
70
+ if (Math.abs(v) >= 1000) return `${(v / 1000).toFixed(v % 1000 === 0 ? 0 : 1)}k`;
71
+ if (Number.isInteger(v)) return String(v);
72
+ return v.toFixed(1);
73
+ }
74
+
75
+ function isNumeric(x: number | string): x is number {
76
+ return typeof x === "number" && Number.isFinite(x);
77
+ }
78
+
79
+ function isValidDatum(datum: StepLineChartDatum): boolean {
80
+ return Number.isFinite(datum.y) && (typeof datum.x === "string" || isNumeric(datum.x));
81
+ }
82
+
83
+ let hoveredIndex: number | null = $state(null);
84
+
85
+ const safeData = $derived(data.filter(isValidDatum));
86
+ const plotWidth = $derived(Math.max(width - MARGIN.left - MARGIN.right, 1));
87
+ const plotHeight = $derived(Math.max(height - MARGIN.top - MARGIN.bottom, 1));
88
+
89
+ const xDomain = $derived.by(() => {
90
+ if (safeData.length === 0) return { kind: "ordinal" as const, values: [] as (number | string)[] };
91
+ const allNumeric = safeData.every((d) => isNumeric(d.x));
92
+ if (allNumeric) {
93
+ const xs = safeData.map((d) => d.x as number);
94
+ return { kind: "numeric" as const, min: Math.min(...xs), max: Math.max(...xs) };
95
+ }
96
+ return { kind: "ordinal" as const, values: safeData.map((d) => d.x) };
97
+ });
98
+
99
+ const yTicks = $derived.by(() => {
100
+ const ys = safeData.map((d) => d.y);
101
+ if (ys.length === 0) return [0];
102
+ const minRaw = Math.min(...ys);
103
+ const maxRaw = Math.max(...ys);
104
+ const padded = (maxRaw - minRaw) * 0.08 || Math.max(Math.abs(maxRaw), 1) * 0.1;
105
+ return niceTicks(minRaw - padded, maxRaw + padded, 5);
106
+ });
107
+
108
+ const yDomain = $derived.by(() => {
109
+ if (yTicks.length === 0) return { min: 0, max: 1 };
110
+ return { min: yTicks[0], max: yTicks[yTicks.length - 1] };
111
+ });
112
+
113
+ const points = $derived.by(() => {
114
+ if (safeData.length === 0) return [];
115
+ return safeData.map((d, i) => {
116
+ let x: number;
117
+ if (xDomain.kind === "numeric") {
118
+ x = scaleLinear(d.x as number, xDomain.min, xDomain.max, 0, plotWidth);
119
+ } else {
120
+ const denom = Math.max(safeData.length - 1, 1);
121
+ x = safeData.length === 1 ? plotWidth / 2 : (i / denom) * plotWidth;
122
+ }
123
+ const y = scaleLinear(d.y, yDomain.min, yDomain.max, plotHeight, 0);
124
+ return {
125
+ x: MARGIN.left + x,
126
+ y: MARGIN.top + y,
127
+ datum: d,
128
+ index: i
129
+ };
130
+ });
131
+ });
132
+
133
+ const dataValueItems = $derived(safeData.map((d) => `${d.x}: ${d.y}`));
134
+
135
+ function buildStepPath(pts: { x: number; y: number }[]): string {
136
+ if (pts.length === 0) return "";
137
+ let path = `M${pts[0].x.toFixed(2)},${pts[0].y.toFixed(2)}`;
138
+ for (let i = 1; i < pts.length; i++) {
139
+ const point = pts[i];
140
+ path += ` H${point.x.toFixed(2)} V${point.y.toFixed(2)}`;
141
+ }
142
+ return path;
143
+ }
144
+
145
+ const linePath = $derived(buildStepPath(points));
146
+
147
+ const gridLines = $derived(
148
+ yTicks.map((tick) => ({
149
+ value: tick,
150
+ y: MARGIN.top + scaleLinear(tick, yDomain.min, yDomain.max, plotHeight, 0)
151
+ }))
152
+ );
153
+
154
+ const xTickEntries = $derived.by(() => {
155
+ if (safeData.length === 0) return [];
156
+ if (xDomain.kind === "ordinal") {
157
+ return points.map((p, i) => ({
158
+ x: p.x,
159
+ label: String(safeData[i].x)
160
+ }));
161
+ }
162
+ const target = Math.min(5, safeData.length);
163
+ const stride = Math.max(1, Math.round((safeData.length - 1) / (target - 1 || 1)));
164
+ const entries: { x: number; label: string }[] = [];
165
+ for (let i = 0; i < safeData.length; i += stride) {
166
+ entries.push({ x: points[i].x, label: String(safeData[i].x) });
167
+ }
168
+ const lastIdx = safeData.length - 1;
169
+ if (entries[entries.length - 1]?.label !== String(safeData[lastIdx].x)) {
170
+ entries.push({ x: points[lastIdx].x, label: String(safeData[lastIdx].x) });
171
+ }
172
+ return entries;
173
+ });
174
+
175
+ function handleLeave() {
176
+ hoveredIndex = null;
177
+ }
178
+
179
+ function handleVisualPointerMove(event: PointerEvent) {
180
+ const target = event.target;
181
+ if (!(target instanceof Element)) {
182
+ hoveredIndex = null;
183
+ return;
184
+ }
185
+ const index = Number(target.getAttribute("data-chart-index"));
186
+ hoveredIndex = Number.isInteger(index) ? index : null;
187
+ }
188
+
189
+ const classes = () =>
190
+ ["st-stepLineChart", `st-stepLineChart--${tone}`, className].filter(Boolean).join(" ");
191
+ </script>
192
+
193
+ <div class={classes()}>
194
+ <div
195
+ class="st-stepLineChart__visual"
196
+ role="img"
197
+ aria-label={label}
198
+ onpointermove={handleVisualPointerMove}
199
+ onpointerleave={handleLeave}
200
+ >
201
+ <svg
202
+ viewBox="0 0 {width} {height}"
203
+ preserveAspectRatio="xMidYMid meet"
204
+ width="100%"
205
+ height="100%"
206
+ focusable="false"
207
+ aria-hidden="true"
208
+ >
209
+ {#each gridLines as g (g.value)}
210
+ <line
211
+ class="st-stepLineChart__grid"
212
+ x1={MARGIN.left}
213
+ x2={width - MARGIN.right}
214
+ y1={g.y}
215
+ y2={g.y}
216
+ />
217
+ <text
218
+ class="st-stepLineChart__tickLabel"
219
+ x={MARGIN.left - 6}
220
+ y={g.y}
221
+ text-anchor="end"
222
+ dominant-baseline="middle"
223
+ >
224
+ {formatTick(g.value)}
225
+ </text>
226
+ {/each}
227
+
228
+ <line
229
+ class="st-stepLineChart__axis"
230
+ x1={MARGIN.left}
231
+ x2={MARGIN.left}
232
+ y1={MARGIN.top}
233
+ y2={height - MARGIN.bottom}
234
+ />
235
+ <line
236
+ class="st-stepLineChart__axis"
237
+ x1={MARGIN.left}
238
+ x2={width - MARGIN.right}
239
+ y1={height - MARGIN.bottom}
240
+ y2={height - MARGIN.bottom}
241
+ />
242
+
243
+ {#each xTickEntries as tick, i (i)}
244
+ <text
245
+ class="st-stepLineChart__tickLabel"
246
+ x={tick.x}
247
+ y={height - MARGIN.bottom + 16}
248
+ text-anchor="middle"
249
+ >
250
+ {tick.label}
251
+ </text>
252
+ {/each}
253
+
254
+ {#if linePath}
255
+ <path
256
+ class="st-stepLineChart__line"
257
+ d={linePath}
258
+ fill="none"
259
+ stroke-width="2"
260
+ stroke-linecap="butt"
261
+ stroke-linejoin="round"
262
+ />
263
+ {/if}
264
+
265
+ {#each points as p (p.index)}
266
+ <circle
267
+ class="st-stepLineChart__dot"
268
+ cx={p.x}
269
+ cy={p.y}
270
+ r="4"
271
+ data-chart-index={p.index}
272
+ />
273
+ {/each}
274
+ </svg>
275
+ </div>
276
+
277
+ <ChartDataList {label} items={dataValueItems} />
278
+
279
+ {#if hoveredIndex !== null && points[hoveredIndex]}
280
+ {@const p = points[hoveredIndex]}
281
+ <div
282
+ class="st-stepLineChart__tooltip"
283
+ role="presentation"
284
+ style="left: {(p.x / width) * 100}%; top: {(p.y / height) * 100}%"
285
+ >
286
+ <span class="st-stepLineChart__tooltipLabel">{p.datum.x}</span>
287
+ <span class="st-stepLineChart__tooltipValue">{p.datum.y}</span>
288
+ </div>
289
+ {/if}
290
+ </div>
291
+
292
+ <style>
293
+ .st-stepLineChart {
294
+ color: var(--st-semantic-data-category1);
295
+ display: block;
296
+ font-family: inherit;
297
+ position: relative;
298
+ width: 100%;
299
+ }
300
+
301
+ .st-stepLineChart--category1 { color: var(--st-semantic-data-category1); }
302
+ .st-stepLineChart--category2 { color: var(--st-semantic-data-category2); }
303
+ .st-stepLineChart--category3 { color: var(--st-semantic-data-category3); }
304
+ .st-stepLineChart--category4 { color: var(--st-semantic-data-category4); }
305
+ .st-stepLineChart--category5 { color: var(--st-semantic-data-category5); }
306
+ .st-stepLineChart--category6 { color: var(--st-semantic-data-category6); }
307
+ .st-stepLineChart--category7 { color: var(--st-semantic-data-category7); }
308
+ .st-stepLineChart--category8 { color: var(--st-semantic-data-category8); }
309
+
310
+ .st-stepLineChart svg {
311
+ display: block;
312
+ overflow: visible;
313
+ }
314
+
315
+ .st-stepLineChart__visual {
316
+ display: block;
317
+ }
318
+
319
+ .st-stepLineChart__grid {
320
+ stroke: var(--st-component-stepLineChart-gridStroke, var(--st-semantic-border-subtle));
321
+ stroke-dasharray: 2 3;
322
+ stroke-width: 1;
323
+ opacity: 0.7;
324
+ }
325
+
326
+ .st-stepLineChart__axis {
327
+ stroke: var(--st-component-stepLineChart-axisStroke, var(--st-semantic-border-subtle));
328
+ stroke-width: 1;
329
+ }
330
+
331
+ .st-stepLineChart__tickLabel {
332
+ fill: var(--st-component-stepLineChart-labelColor, var(--st-semantic-text-secondary));
333
+ font-size: 0.6875rem;
334
+ }
335
+
336
+ .st-stepLineChart__line {
337
+ stroke: currentColor;
338
+ }
339
+
340
+ .st-stepLineChart__dot {
341
+ fill: currentColor;
342
+ stroke: var(--st-semantic-surface-default);
343
+ stroke-width: 1.5;
344
+ cursor: pointer;
345
+ transition: r 120ms ease;
346
+ }
347
+
348
+ .st-stepLineChart__dot:hover {
349
+ r: 5.5;
350
+ }
351
+
352
+ .st-stepLineChart__tooltip {
353
+ background: var(--st-component-stepLineChart-tooltipBackground, var(--st-semantic-surface-inverse));
354
+ border-radius: var(--st-radius-sm, 0.25rem);
355
+ color: var(--st-component-stepLineChart-tooltipText, var(--st-semantic-text-inverse));
356
+ display: inline-flex;
357
+ flex-direction: column;
358
+ font-size: 0.75rem;
359
+ gap: 0.125rem;
360
+ line-height: 1.2;
361
+ padding: 0.375rem 0.5rem;
362
+ pointer-events: none;
363
+ position: absolute;
364
+ transform: translate(-50%, calc(-100% - 8px));
365
+ white-space: nowrap;
366
+ z-index: 1;
367
+ }
368
+
369
+ .st-stepLineChart__tooltipLabel {
370
+ font-weight: 600;
371
+ }
372
+
373
+ .st-stepLineChart__tooltipValue {
374
+ opacity: 0.85;
375
+ }
376
+
377
+ @media (prefers-reduced-motion: reduce) {
378
+ .st-stepLineChart__dot {
379
+ transition: none;
380
+ }
381
+ }
382
+ </style>
@@ -0,0 +1,17 @@
1
+ export type StepLineChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
2
+ export type StepLineChartDatum = {
3
+ x: number | string;
4
+ y: number;
5
+ };
6
+ type StepLineChartProps = {
7
+ data: StepLineChartDatum[];
8
+ width?: number;
9
+ height?: number;
10
+ tone?: StepLineChartTone;
11
+ label: string;
12
+ class?: string;
13
+ };
14
+ declare const StepLineChart: import("svelte").Component<StepLineChartProps, {}, "">;
15
+ type StepLineChart = ReturnType<typeof StepLineChart>;
16
+ export default StepLineChart;
17
+ //# sourceMappingURL=StepLineChart.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepLineChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/StepLineChart.svelte.ts"],"names":[],"mappings":"AAGE,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,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAMF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAsNJ,QAAA,MAAM,aAAa,wDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,10 @@ export { default as CalendarHeatmapChart } from "./CalendarHeatmapChart.svelte";
13
13
  export { default as BumpChart } from "./BumpChart.svelte";
14
14
  export { default as LollipopChart } from "./LollipopChart.svelte";
15
15
  export { default as ParetoChart } from "./ParetoChart.svelte";
16
+ export { default as StepLineChart } from "./StepLineChart.svelte";
17
+ export type { StepLineChartTone, StepLineChartDatum } from "./StepLineChart.svelte";
18
+ export { default as DivergentBarChart } from "./DivergentBarChart.svelte";
19
+ export type { DivergentBarChartTone, DivergentBarChartDatum } from "./DivergentBarChart.svelte";
16
20
  export { default as Alert } from "./Alert.svelte";
17
21
  export { default as AreaChart } from "./AreaChart.svelte";
18
22
  export { default as AspectRatio } from "./AspectRatio.svelte";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -10,6 +10,8 @@ export { default as CalendarHeatmapChart } from "./CalendarHeatmapChart.svelte";
10
10
  export { default as BumpChart } from "./BumpChart.svelte";
11
11
  export { default as LollipopChart } from "./LollipopChart.svelte";
12
12
  export { default as ParetoChart } from "./ParetoChart.svelte";
13
+ export { default as StepLineChart } from "./StepLineChart.svelte";
14
+ export { default as DivergentBarChart } from "./DivergentBarChart.svelte";
13
15
  export { default as Alert } from "./Alert.svelte";
14
16
  export { default as AreaChart } from "./AreaChart.svelte";
15
17
  export { default as AspectRatio } from "./AspectRatio.svelte";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/design-system-svelte",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"