@sentropic/design-system-svelte 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Calendar.svelte +237 -42
- package/dist/Calendar.svelte.d.ts.map +1 -1
- package/dist/ComboChart.svelte +620 -0
- package/dist/ComboChart.svelte.d.ts +28 -0
- package/dist/ComboChart.svelte.d.ts.map +1 -0
- package/dist/FunnelChart.svelte +358 -0
- package/dist/FunnelChart.svelte.d.ts +21 -0
- package/dist/FunnelChart.svelte.d.ts.map +1 -0
- package/dist/GaugeChart.svelte +300 -0
- package/dist/GaugeChart.svelte.d.ts +36 -0
- package/dist/GaugeChart.svelte.d.ts.map +1 -0
- package/dist/KpiCard.svelte +318 -0
- package/dist/KpiCard.svelte.d.ts +36 -0
- package/dist/KpiCard.svelte.d.ts.map +1 -0
- package/dist/Popper.svelte +157 -0
- package/dist/Popper.svelte.d.ts +17 -0
- package/dist/Popper.svelte.d.ts.map +1 -1
- package/dist/Rating.svelte +130 -35
- package/dist/Rating.svelte.d.ts.map +1 -1
- package/dist/SelectableList.svelte +60 -12
- package/dist/SelectableList.svelte.d.ts.map +1 -1
- package/dist/SelectableRow.svelte +23 -8
- package/dist/SelectableRow.svelte.d.ts +5 -4
- package/dist/SelectableRow.svelte.d.ts.map +1 -1
- package/dist/SlideIndicator.svelte +17 -3
- package/dist/SlideIndicator.svelte.d.ts.map +1 -1
- package/dist/TimePicker.svelte +176 -13
- package/dist/TimePicker.svelte.d.ts.map +1 -1
- package/dist/TreemapChart.svelte +448 -0
- package/dist/TreemapChart.svelte.d.ts +26 -0
- package/dist/TreemapChart.svelte.d.ts.map +1 -0
- package/dist/WaterfallChart.svelte +469 -0
- package/dist/WaterfallChart.svelte.d.ts +19 -0
- package/dist/WaterfallChart.svelte.d.ts.map +1 -0
- package/dist/chartContrast.d.ts +6 -0
- package/dist/chartContrast.d.ts.map +1 -0
- package/dist/chartContrast.js +58 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/package.json +1 -1
package/dist/Calendar.svelte
CHANGED
|
@@ -173,22 +173,56 @@
|
|
|
173
173
|
return d > rangeStart.getTime() && d < rangeEnd.getTime();
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Retourne le premier jour activable (non-disabled) du mois `year`/`month`,
|
|
178
|
+
* en partant de `preferred` si celui-ci est dans le bon mois et non-disabled,
|
|
179
|
+
* sinon en balayant du 1er au dernier jour du mois.
|
|
180
|
+
* Renvoie `null` si tous les jours sont disabled (cas extrême).
|
|
181
|
+
*/
|
|
182
|
+
function clampToMonth(preferred: Date, year: number, month: number): Date | null {
|
|
183
|
+
// Si preferred est dans le bon mois et non-disabled → on le garde.
|
|
184
|
+
if (
|
|
185
|
+
preferred.getFullYear() === year &&
|
|
186
|
+
preferred.getMonth() === month &&
|
|
187
|
+
!isOutOfBounds(preferred)
|
|
188
|
+
) {
|
|
189
|
+
return preferred;
|
|
190
|
+
}
|
|
191
|
+
// Chercher le jour sélectionné dans ce mois en priorité.
|
|
192
|
+
const sel = !range ? single : rangeStart;
|
|
193
|
+
if (sel && sel.getFullYear() === year && sel.getMonth() === month && !isOutOfBounds(sel)) {
|
|
194
|
+
return sel;
|
|
195
|
+
}
|
|
196
|
+
// Balayer du 1er au dernier jour du mois.
|
|
197
|
+
const lastDay = new Date(year, month + 1, 0).getDate();
|
|
198
|
+
for (let d = 1; d <= lastDay; d++) {
|
|
199
|
+
const candidate = startOfDay(new Date(year, month, d));
|
|
200
|
+
if (!isOutOfBounds(candidate)) return candidate;
|
|
182
201
|
}
|
|
202
|
+
// Aucun jour activable (mois entièrement hors-bornes) : retourner null pour
|
|
203
|
+
// signaler l'absence de cellule focusable. Les appelants doivent traiter ce cas.
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function previousMonth() {
|
|
208
|
+
const targetMonth = viewMonth === 0 ? 11 : viewMonth - 1;
|
|
209
|
+
const targetYear = viewMonth === 0 ? viewYear - 1 : viewYear;
|
|
210
|
+
viewMonth = targetMonth;
|
|
211
|
+
viewYear = targetYear;
|
|
212
|
+
const clamped = clampToMonth(focusDate, targetYear, targetMonth);
|
|
213
|
+
if (clamped) focusDate = clamped;
|
|
214
|
+
// Si clamped === null, le mois est entièrement hors-bornes : focusDate garde
|
|
215
|
+
// l'ancienne valeur — aucune cellule ne sera tabindex=0 car toutes sont disabled.
|
|
183
216
|
}
|
|
184
217
|
|
|
185
218
|
function nextMonth() {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
219
|
+
const targetMonth = viewMonth === 11 ? 0 : viewMonth + 1;
|
|
220
|
+
const targetYear = viewMonth === 11 ? viewYear + 1 : viewYear;
|
|
221
|
+
viewMonth = targetMonth;
|
|
222
|
+
viewYear = targetYear;
|
|
223
|
+
const clamped = clampToMonth(focusDate, targetYear, targetMonth);
|
|
224
|
+
if (clamped) focusDate = clamped;
|
|
225
|
+
// Si clamped === null, le mois est entièrement hors-bornes : idem.
|
|
192
226
|
}
|
|
193
227
|
|
|
194
228
|
function pickDate(date: Date) {
|
|
@@ -217,13 +251,149 @@
|
|
|
217
251
|
|
|
218
252
|
const monthLabel = $derived(monthFormatter.format(new Date(viewYear, viewMonth, 1)));
|
|
219
253
|
|
|
254
|
+
// --- Roving tabindex : date active dans la grille -------------------------
|
|
255
|
+
// La "date active" est celle qui a tabindex=0 ; elle suit la sélection ou
|
|
256
|
+
// se positionne sur le 1er jour activable du mois affiché en l'absence de sélection.
|
|
257
|
+
// INVARIANT : focusDate est toujours dans le mois affiché ET non-disabled.
|
|
258
|
+
function initialFocusDate(): Date {
|
|
259
|
+
const sel = !range ? single : rangeStart;
|
|
260
|
+
if (sel && sel.getFullYear() === viewYear && sel.getMonth() === viewMonth && !isOutOfBounds(sel)) {
|
|
261
|
+
return sel;
|
|
262
|
+
}
|
|
263
|
+
// Trouver le premier jour activable du mois.
|
|
264
|
+
const lastDay = new Date(viewYear, viewMonth + 1, 0).getDate();
|
|
265
|
+
for (let d = 1; d <= lastDay; d++) {
|
|
266
|
+
const candidate = startOfDay(new Date(viewYear, viewMonth, d));
|
|
267
|
+
if (!isOutOfBounds(candidate)) return candidate;
|
|
268
|
+
}
|
|
269
|
+
// Mois entièrement hors-bornes : retourner le 1er jour quand même pour
|
|
270
|
+
// initialiser focusDate, mais aucune cellule ne sera tabindex=0 (toutes disabled).
|
|
271
|
+
return startOfDay(new Date(viewYear, viewMonth, 1));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
let focusDate = $state<Date>(initialFocusDate());
|
|
275
|
+
|
|
276
|
+
// Resynchronise focusDate quand la prop value change (sélection externe).
|
|
277
|
+
// Si la nouvelle valeur est dans le mois affiché et non-disabled, on la pointe ;
|
|
278
|
+
// sinon on re-clamp pour garantir l'invariant.
|
|
279
|
+
$effect(() => {
|
|
280
|
+
const sel = !range ? single : rangeStart;
|
|
281
|
+
if (sel) {
|
|
282
|
+
if (sel.getFullYear() === viewYear && sel.getMonth() === viewMonth && !isOutOfBounds(sel)) {
|
|
283
|
+
focusDate = sel;
|
|
284
|
+
} else {
|
|
285
|
+
const clamped = clampToMonth(focusDate, viewYear, viewMonth);
|
|
286
|
+
if (clamped) focusDate = clamped;
|
|
287
|
+
// Si null (mois entièrement hors-bornes), on ne touche pas focusDate :
|
|
288
|
+
// le tabindex=0 ne sera posé sur aucune cellule disabled.
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// Resynchronise focusDate quand le mois affiché change via la prop `month`
|
|
294
|
+
// (l'$effect sur `month` dans le bloc précédent met viewYear/viewMonth à jour,
|
|
295
|
+
// mais focusDate peut pointer vers l'ancien mois).
|
|
296
|
+
$effect(() => {
|
|
297
|
+
// Dépendances explicites : viewYear + viewMonth.
|
|
298
|
+
const y = viewYear;
|
|
299
|
+
const m = viewMonth;
|
|
300
|
+
if (focusDate.getFullYear() !== y || focusDate.getMonth() !== m || isOutOfBounds(focusDate)) {
|
|
301
|
+
const clamped = clampToMonth(focusDate, y, m);
|
|
302
|
+
if (clamped) focusDate = clamped;
|
|
303
|
+
// Si null (mois entièrement hors-bornes), aucune cellule ne reçoit tabindex=0.
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// Résoud l'élément DOM du jour actif et y place le focus.
|
|
308
|
+
let gridEl = $state<HTMLElement | null>(null);
|
|
309
|
+
|
|
310
|
+
function focusActiveCell() {
|
|
311
|
+
if (!gridEl) return;
|
|
312
|
+
const iso = toISO(focusDate);
|
|
313
|
+
const btn = gridEl.querySelector<HTMLElement>(`[data-date="${iso}"]`);
|
|
314
|
+
btn?.focus();
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Déplace focusDate de `deltaDays` jours ; change de mois si nécessaire.
|
|
318
|
+
function moveFocus(deltaDays: number) {
|
|
319
|
+
const next = new Date(focusDate);
|
|
320
|
+
next.setDate(next.getDate() + deltaDays);
|
|
321
|
+
// Si hors mois affiché, on bascule le mois.
|
|
322
|
+
if (next.getFullYear() !== viewYear || next.getMonth() !== viewMonth) {
|
|
323
|
+
viewYear = next.getFullYear();
|
|
324
|
+
viewMonth = next.getMonth();
|
|
325
|
+
}
|
|
326
|
+
focusDate = startOfDay(next);
|
|
327
|
+
// Focus après rendu.
|
|
328
|
+
setTimeout(focusActiveCell, 0);
|
|
329
|
+
}
|
|
330
|
+
|
|
220
331
|
function onKeyDown(event: KeyboardEvent) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
332
|
+
switch (event.key) {
|
|
333
|
+
case "ArrowLeft":
|
|
334
|
+
event.preventDefault();
|
|
335
|
+
moveFocus(-1);
|
|
336
|
+
break;
|
|
337
|
+
case "ArrowRight":
|
|
338
|
+
event.preventDefault();
|
|
339
|
+
moveFocus(1);
|
|
340
|
+
break;
|
|
341
|
+
case "ArrowUp":
|
|
342
|
+
event.preventDefault();
|
|
343
|
+
moveFocus(-7);
|
|
344
|
+
break;
|
|
345
|
+
case "ArrowDown":
|
|
346
|
+
event.preventDefault();
|
|
347
|
+
moveFocus(7);
|
|
348
|
+
break;
|
|
349
|
+
case "Home": {
|
|
350
|
+
// Début de la semaine (selon weekStartsOn).
|
|
351
|
+
event.preventDefault();
|
|
352
|
+
const dayOfWeek = focusDate.getDay();
|
|
353
|
+
const offset = (dayOfWeek - weekStartsOn + 7) % 7;
|
|
354
|
+
moveFocus(-offset);
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
case "End": {
|
|
358
|
+
// Fin de la semaine.
|
|
359
|
+
event.preventDefault();
|
|
360
|
+
const dayOfWeek = focusDate.getDay();
|
|
361
|
+
const offset = (6 - ((dayOfWeek - weekStartsOn + 7) % 7));
|
|
362
|
+
moveFocus(offset);
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
case "PageUp": {
|
|
366
|
+
event.preventDefault();
|
|
367
|
+
// previousMonth() met à jour viewYear/viewMonth ET clamp focusDate via clampToMonth,
|
|
368
|
+
// en essayant de conserver le même numéro de jour dans le mois cible.
|
|
369
|
+
const puDay = focusDate.getDate();
|
|
370
|
+
const puTargetMonth = viewMonth === 0 ? 11 : viewMonth - 1;
|
|
371
|
+
const puTargetYear = viewMonth === 0 ? viewYear - 1 : viewYear;
|
|
372
|
+
// Construit le candidat "même jour" avant d'appeler previousMonth pour que
|
|
373
|
+
// clampToMonth puisse l'évaluer (il utilise focusDate en argument).
|
|
374
|
+
const puLastDay = new Date(puTargetYear, puTargetMonth + 1, 0).getDate();
|
|
375
|
+
focusDate = startOfDay(new Date(puTargetYear, puTargetMonth, Math.min(puDay, puLastDay)));
|
|
376
|
+
previousMonth();
|
|
377
|
+
setTimeout(focusActiveCell, 0);
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
case "PageDown": {
|
|
381
|
+
event.preventDefault();
|
|
382
|
+
const pdDay = focusDate.getDate();
|
|
383
|
+
const pdTargetMonth = viewMonth === 11 ? 0 : viewMonth + 1;
|
|
384
|
+
const pdTargetYear = viewMonth === 11 ? viewYear + 1 : viewYear;
|
|
385
|
+
const pdLastDay = new Date(pdTargetYear, pdTargetMonth + 1, 0).getDate();
|
|
386
|
+
focusDate = startOfDay(new Date(pdTargetYear, pdTargetMonth, Math.min(pdDay, pdLastDay)));
|
|
387
|
+
nextMonth();
|
|
388
|
+
setTimeout(focusActiveCell, 0);
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
case "Enter":
|
|
392
|
+
case " ": {
|
|
393
|
+
event.preventDefault();
|
|
394
|
+
if (!isOutOfBounds(focusDate)) pickDate(focusDate);
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
227
397
|
}
|
|
228
398
|
}
|
|
229
399
|
</script>
|
|
@@ -248,12 +418,15 @@
|
|
|
248
418
|
<ChevronRight size={18} aria-hidden="true" />
|
|
249
419
|
</button>
|
|
250
420
|
</div>
|
|
421
|
+
<!-- svelte-ignore a11y_interactive_supports_focus -->
|
|
422
|
+
<!-- Faux positif : le grid utilise le roving tabindex (cellules-enfants portent tabindex),
|
|
423
|
+
pas un tabindex sur le conteneur — conforme ARIA Grid Pattern. -->
|
|
251
424
|
<div
|
|
252
425
|
class="st-calendar__grid"
|
|
253
426
|
role="grid"
|
|
254
|
-
tabindex="-1"
|
|
255
427
|
aria-label={monthLabel}
|
|
256
428
|
onkeydown={onKeyDown}
|
|
429
|
+
bind:this={gridEl}
|
|
257
430
|
>
|
|
258
431
|
<div class="st-calendar__weekdays" role="row">
|
|
259
432
|
{#each weekdayLabels as wd (wd)}
|
|
@@ -261,28 +434,38 @@
|
|
|
261
434
|
{/each}
|
|
262
435
|
</div>
|
|
263
436
|
<div class="st-calendar__days">
|
|
264
|
-
{#each
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
437
|
+
{#each { length: 6 } as _, rowIdx (rowIdx)}
|
|
438
|
+
<div class="st-calendar__week" role="row">
|
|
439
|
+
{#each grid.slice(rowIdx * 7, rowIdx * 7 + 7) as cell, colIdx (rowIdx * 7 + colIdx)}
|
|
440
|
+
{@const oob = isOutOfBounds(cell.date)}
|
|
441
|
+
{@const selected = isSelected(cell.date)}
|
|
442
|
+
{@const inRange = isInRange(cell.date)}
|
|
443
|
+
{@const isToday = isSameDay(cell.date, today)}
|
|
444
|
+
{@const isActive = isSameDay(cell.date, focusDate)}
|
|
445
|
+
<button
|
|
446
|
+
type="button"
|
|
447
|
+
class="st-calendar__day"
|
|
448
|
+
class:st-calendar__day--outside={!cell.inMonth}
|
|
449
|
+
class:st-calendar__day--selected={selected}
|
|
450
|
+
class:st-calendar__day--inRange={inRange}
|
|
451
|
+
class:st-calendar__day--today={isToday}
|
|
452
|
+
role="gridcell"
|
|
453
|
+
aria-label={cellFormatter.format(cell.date)}
|
|
454
|
+
aria-selected={selected ? "true" : "false"}
|
|
455
|
+
aria-current={isToday ? "date" : undefined}
|
|
456
|
+
aria-disabled={oob ? "true" : undefined}
|
|
457
|
+
disabled={oob}
|
|
458
|
+
tabindex={isActive && !oob ? 0 : -1}
|
|
459
|
+
data-date={toISO(cell.date)}
|
|
460
|
+
onclick={() => {
|
|
461
|
+
focusDate = startOfDay(cell.date);
|
|
462
|
+
pickDate(cell.date);
|
|
463
|
+
}}
|
|
464
|
+
>
|
|
465
|
+
{cell.date.getDate()}
|
|
466
|
+
</button>
|
|
467
|
+
{/each}
|
|
468
|
+
</div>
|
|
286
469
|
{/each}
|
|
287
470
|
</div>
|
|
288
471
|
</div>
|
|
@@ -340,10 +523,22 @@
|
|
|
340
523
|
gap: var(--st-spacing-1, 0.25rem);
|
|
341
524
|
}
|
|
342
525
|
|
|
343
|
-
.st-calendar__weekdays
|
|
526
|
+
.st-calendar__weekdays {
|
|
527
|
+
display: grid;
|
|
528
|
+
gap: 2px;
|
|
529
|
+
grid-template-columns: repeat(7, minmax(2rem, 1fr));
|
|
530
|
+
}
|
|
531
|
+
|
|
344
532
|
.st-calendar__days {
|
|
345
533
|
display: grid;
|
|
346
534
|
gap: 2px;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/* role="row" doit être un vrai nœud exposé à l'arbre a11y.
|
|
538
|
+
display:contents supprime le nœud → on utilise display:grid à la place. */
|
|
539
|
+
.st-calendar__week {
|
|
540
|
+
display: grid;
|
|
541
|
+
gap: 2px;
|
|
347
542
|
grid-template-columns: repeat(7, minmax(2rem, 1fr));
|
|
348
543
|
}
|
|
349
544
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Calendar.svelte.ts"],"names":[],"mappings":"AAGE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAI7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpD,KAAK,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG;IAChF,wEAAwE;IACxE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;
|
|
1
|
+
{"version":3,"file":"Calendar.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Calendar.svelte.ts"],"names":[],"mappings":"AAGE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAI7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpD,KAAK,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG;IAChF,wEAAwE;IACxE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAmaJ,QAAA,MAAM,QAAQ,mDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
|