@sentropic/design-system-svelte 0.3.0 → 0.4.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.
Files changed (37) hide show
  1. package/dist/Accordion.svelte +187 -0
  2. package/dist/Accordion.svelte.d.ts +20 -0
  3. package/dist/Accordion.svelte.d.ts.map +1 -0
  4. package/dist/Combobox.svelte +390 -0
  5. package/dist/Combobox.svelte.d.ts +28 -0
  6. package/dist/Combobox.svelte.d.ts.map +1 -0
  7. package/dist/DataTable.svelte +543 -0
  8. package/dist/DataTable.svelte.d.ts +50 -0
  9. package/dist/DataTable.svelte.d.ts.map +1 -0
  10. package/dist/MultiSelect.svelte +427 -0
  11. package/dist/MultiSelect.svelte.d.ts +28 -0
  12. package/dist/MultiSelect.svelte.d.ts.map +1 -0
  13. package/dist/NumberInput.svelte +256 -0
  14. package/dist/NumberInput.svelte.d.ts +19 -0
  15. package/dist/NumberInput.svelte.d.ts.map +1 -0
  16. package/dist/PasswordInput.svelte +205 -0
  17. package/dist/PasswordInput.svelte.d.ts +17 -0
  18. package/dist/PasswordInput.svelte.d.ts.map +1 -0
  19. package/dist/ProgressBar.svelte +176 -0
  20. package/dist/ProgressBar.svelte.d.ts +17 -0
  21. package/dist/ProgressBar.svelte.d.ts.map +1 -0
  22. package/dist/Search.svelte +218 -0
  23. package/dist/Search.svelte.d.ts +16 -0
  24. package/dist/Search.svelte.d.ts.map +1 -0
  25. package/dist/Slider.svelte +279 -0
  26. package/dist/Slider.svelte.d.ts +20 -0
  27. package/dist/Slider.svelte.d.ts.map +1 -0
  28. package/dist/Tag.svelte +140 -0
  29. package/dist/Tag.svelte.d.ts +16 -0
  30. package/dist/Tag.svelte.d.ts.map +1 -0
  31. package/dist/Toggle.svelte +135 -0
  32. package/dist/Toggle.svelte.d.ts +14 -0
  33. package/dist/Toggle.svelte.d.ts.map +1 -0
  34. package/dist/index.d.ts +15 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +11 -0
  37. package/package.json +2 -2
@@ -0,0 +1,543 @@
1
+ <script lang="ts" module>
2
+ import type { Snippet } from "svelte";
3
+
4
+ export interface DataTableColumn<R = DataTableRow> {
5
+ key: string;
6
+ label: string;
7
+ sortable?: boolean;
8
+ align?: "start" | "center" | "end";
9
+ width?: string;
10
+ cell?: Snippet<[R, DataTableColumn<R>]>;
11
+ }
12
+
13
+ export interface DataTableRow {
14
+ id: string;
15
+ [key: string]: unknown;
16
+ }
17
+
18
+ export type DataTableSelectMode = "none" | "single" | "multiple";
19
+
20
+ export interface DataTableSort {
21
+ key: string;
22
+ direction: "asc" | "desc";
23
+ }
24
+ </script>
25
+
26
+ <script lang="ts">
27
+ import type { HTMLTableAttributes } from "svelte/elements";
28
+
29
+ type DataTableProps = Omit<HTMLTableAttributes, "class"> & {
30
+ columns: DataTableColumn[];
31
+ rows: DataTableRow[];
32
+ caption?: string;
33
+ size?: "sm" | "md" | "lg";
34
+ selectable?: DataTableSelectMode;
35
+ selectedIds?: string[];
36
+ sortable?: boolean;
37
+ sortBy?: DataTableSort | null;
38
+ pageSize?: number;
39
+ page?: number;
40
+ selectAllLabel?: string;
41
+ selectRowLabel?: string;
42
+ sortAscendingLabel?: string;
43
+ sortDescendingLabel?: string;
44
+ sortNoneLabel?: string;
45
+ previousLabel?: string;
46
+ nextLabel?: string;
47
+ rangeLabel?: (range: { start: number; end: number; total: number }) => string;
48
+ emptyLabel?: string;
49
+ onRowClick?: (row: DataTableRow) => void;
50
+ class?: string;
51
+ };
52
+
53
+ let {
54
+ columns,
55
+ rows,
56
+ caption,
57
+ size = "md",
58
+ selectable = "none",
59
+ selectedIds = $bindable<string[]>([]),
60
+ sortable = true,
61
+ sortBy = $bindable<DataTableSort | null>(null),
62
+ pageSize,
63
+ page = $bindable(1),
64
+ selectAllLabel = "Select all rows",
65
+ selectRowLabel = "Select row",
66
+ sortAscendingLabel = "Sorted ascending",
67
+ sortDescendingLabel = "Sorted descending",
68
+ sortNoneLabel = "Not sorted",
69
+ previousLabel = "Previous",
70
+ nextLabel = "Next",
71
+ rangeLabel = ({ start, end, total }) => `${start}–${end} of ${total}`,
72
+ emptyLabel = "No data",
73
+ onRowClick,
74
+ class: className,
75
+ ...rest
76
+ }: DataTableProps = $props();
77
+
78
+ const classes = () =>
79
+ ["st-dataTable", `st-dataTable--${size}`, className].filter(Boolean).join(" ");
80
+
81
+ const isColumnSortable = (column: DataTableColumn) =>
82
+ sortable && column.sortable !== false;
83
+
84
+ const sortedRows = $derived.by(() => {
85
+ if (!sortBy) return rows;
86
+ const { key, direction } = sortBy;
87
+ const factor = direction === "asc" ? 1 : -1;
88
+ const copy = [...rows];
89
+ copy.sort((a, b) => {
90
+ const av = a[key];
91
+ const bv = b[key];
92
+ if (av == null && bv == null) return 0;
93
+ if (av == null) return 1;
94
+ if (bv == null) return -1;
95
+ if (typeof av === "number" && typeof bv === "number") {
96
+ return (av - bv) * factor;
97
+ }
98
+ const as = String(av);
99
+ const bs = String(bv);
100
+ return as.localeCompare(bs, undefined, { numeric: true, sensitivity: "base" }) * factor;
101
+ });
102
+ return copy;
103
+ });
104
+
105
+ const pageCount = $derived(
106
+ pageSize && pageSize > 0 ? Math.max(1, Math.ceil(sortedRows.length / pageSize)) : 1
107
+ );
108
+
109
+ const safePage = $derived(Math.min(Math.max(1, page), pageCount));
110
+
111
+ const visibleRows = $derived.by(() => {
112
+ if (!pageSize || pageSize <= 0) return sortedRows;
113
+ const start = (safePage - 1) * pageSize;
114
+ return sortedRows.slice(start, start + pageSize);
115
+ });
116
+
117
+ const range = $derived.by(() => {
118
+ if (!pageSize || pageSize <= 0) {
119
+ return { start: sortedRows.length === 0 ? 0 : 1, end: sortedRows.length, total: sortedRows.length };
120
+ }
121
+ if (sortedRows.length === 0) return { start: 0, end: 0, total: 0 };
122
+ const start = (safePage - 1) * pageSize + 1;
123
+ const end = Math.min(safePage * pageSize, sortedRows.length);
124
+ return { start, end, total: sortedRows.length };
125
+ });
126
+
127
+ const allVisibleSelected = $derived(
128
+ selectable === "multiple" &&
129
+ visibleRows.length > 0 &&
130
+ visibleRows.every((row) => selectedIds.includes(row.id))
131
+ );
132
+
133
+ const someVisibleSelected = $derived(
134
+ selectable === "multiple" &&
135
+ visibleRows.some((row) => selectedIds.includes(row.id)) &&
136
+ !allVisibleSelected
137
+ );
138
+
139
+ function ariaSortFor(column: DataTableColumn): "ascending" | "descending" | "none" | undefined {
140
+ if (!isColumnSortable(column)) return undefined;
141
+ if (sortBy?.key !== column.key) return "none";
142
+ return sortBy.direction === "asc" ? "ascending" : "descending";
143
+ }
144
+
145
+ function toggleSort(column: DataTableColumn) {
146
+ if (!isColumnSortable(column)) return;
147
+ if (sortBy?.key !== column.key) {
148
+ sortBy = { key: column.key, direction: "asc" };
149
+ return;
150
+ }
151
+ if (sortBy.direction === "asc") {
152
+ sortBy = { key: column.key, direction: "desc" };
153
+ return;
154
+ }
155
+ sortBy = null;
156
+ }
157
+
158
+ function toggleRow(row: DataTableRow, checked: boolean) {
159
+ if (selectable === "none") return;
160
+ if (selectable === "single") {
161
+ selectedIds = checked ? [row.id] : [];
162
+ return;
163
+ }
164
+ selectedIds = checked
165
+ ? [...selectedIds, row.id]
166
+ : selectedIds.filter((id) => id !== row.id);
167
+ }
168
+
169
+ function toggleAllVisible(checked: boolean) {
170
+ if (selectable !== "multiple") return;
171
+ const visibleIds = visibleRows.map((r) => r.id);
172
+ if (checked) {
173
+ const merged = new Set([...selectedIds, ...visibleIds]);
174
+ selectedIds = Array.from(merged);
175
+ } else {
176
+ selectedIds = selectedIds.filter((id) => !visibleIds.includes(id));
177
+ }
178
+ }
179
+
180
+ function handleRowClick(row: DataTableRow) {
181
+ onRowClick?.(row);
182
+ }
183
+
184
+ function alignClass(align?: "start" | "center" | "end") {
185
+ if (align === "center") return "st-dataTable__cell--center";
186
+ if (align === "end") return "st-dataTable__cell--end";
187
+ return null;
188
+ }
189
+
190
+ function cellValue(row: DataTableRow, key: string) {
191
+ return String(row[key] ?? "");
192
+ }
193
+
194
+ function goToPage(target: number) {
195
+ if (target >= 1 && target <= pageCount && target !== safePage) {
196
+ page = target;
197
+ }
198
+ }
199
+ </script>
200
+
201
+ <div class="st-dataTable-wrap">
202
+ <table {...rest} class={classes()}>
203
+ {#if caption}<caption>{caption}</caption>{/if}
204
+ <thead>
205
+ <tr>
206
+ {#if selectable === "multiple"}
207
+ <th scope="col" class="st-dataTable__select">
208
+ <label class="st-dataTable__selectLabel">
209
+ <input
210
+ type="checkbox"
211
+ checked={allVisibleSelected}
212
+ indeterminate={someVisibleSelected}
213
+ aria-label={selectAllLabel}
214
+ onchange={(e) => toggleAllVisible((e.currentTarget as HTMLInputElement).checked)}
215
+ />
216
+ <span class="st-visually-hidden">{selectAllLabel}</span>
217
+ </label>
218
+ </th>
219
+ {:else if selectable === "single"}
220
+ <th scope="col" class="st-dataTable__select" aria-label={selectRowLabel}></th>
221
+ {/if}
222
+ {#each columns as column (column.key)}
223
+ {@const sortState = ariaSortFor(column)}
224
+ {@const sortableCol = isColumnSortable(column)}
225
+ <th
226
+ scope="col"
227
+ class={[alignClass(column.align)].filter(Boolean).join(" ") || undefined}
228
+ aria-sort={sortState}
229
+ style={column.width ? `width: ${column.width}` : undefined}
230
+ >
231
+ {#if sortableCol}
232
+ <button
233
+ type="button"
234
+ class="st-dataTable__sortBtn"
235
+ onclick={() => toggleSort(column)}
236
+ >
237
+ <span>{column.label}</span>
238
+ <span class="st-dataTable__sortIcon" aria-hidden="true">
239
+ {#if sortState === "ascending"}↑
240
+ {:else if sortState === "descending"}↓
241
+ {:else}↕{/if}
242
+ </span>
243
+ <span class="st-visually-hidden">
244
+ {#if sortState === "ascending"}{sortAscendingLabel}
245
+ {:else if sortState === "descending"}{sortDescendingLabel}
246
+ {:else}{sortNoneLabel}{/if}
247
+ </span>
248
+ </button>
249
+ {:else}
250
+ {column.label}
251
+ {/if}
252
+ </th>
253
+ {/each}
254
+ </tr>
255
+ </thead>
256
+ <tbody>
257
+ {#if visibleRows.length === 0}
258
+ <tr>
259
+ <td
260
+ class="st-dataTable__empty"
261
+ colspan={columns.length + (selectable !== "none" ? 1 : 0)}
262
+ >
263
+ {emptyLabel}
264
+ </td>
265
+ </tr>
266
+ {:else}
267
+ {#each visibleRows as row (row.id)}
268
+ {@const isSelected = selectedIds.includes(row.id)}
269
+ <tr
270
+ class:st-dataTable__row--selected={isSelected}
271
+ class:st-dataTable__row--clickable={Boolean(onRowClick)}
272
+ onclick={onRowClick ? () => handleRowClick(row) : undefined}
273
+ >
274
+ {#if selectable === "multiple"}
275
+ <td class="st-dataTable__select">
276
+ <label class="st-dataTable__selectLabel">
277
+ <input
278
+ type="checkbox"
279
+ checked={isSelected}
280
+ aria-label={`${selectRowLabel} ${row.id}`}
281
+ onclick={(e) => e.stopPropagation()}
282
+ onchange={(e) =>
283
+ toggleRow(row, (e.currentTarget as HTMLInputElement).checked)}
284
+ />
285
+ <span class="st-visually-hidden">{selectRowLabel}</span>
286
+ </label>
287
+ </td>
288
+ {:else if selectable === "single"}
289
+ <td class="st-dataTable__select">
290
+ <label class="st-dataTable__selectLabel">
291
+ <input
292
+ type="radio"
293
+ name="st-dataTable-select"
294
+ checked={isSelected}
295
+ aria-label={`${selectRowLabel} ${row.id}`}
296
+ onclick={(e) => e.stopPropagation()}
297
+ onchange={(e) =>
298
+ toggleRow(row, (e.currentTarget as HTMLInputElement).checked)}
299
+ />
300
+ <span class="st-visually-hidden">{selectRowLabel}</span>
301
+ </label>
302
+ </td>
303
+ {/if}
304
+ {#each columns as column (column.key)}
305
+ <td class={[alignClass(column.align)].filter(Boolean).join(" ") || undefined}>
306
+ {#if column.cell}
307
+ {@render column.cell(row, column)}
308
+ {:else}
309
+ {cellValue(row, column.key)}
310
+ {/if}
311
+ </td>
312
+ {/each}
313
+ </tr>
314
+ {/each}
315
+ {/if}
316
+ </tbody>
317
+ </table>
318
+ {#if pageSize && pageSize > 0}
319
+ <div class="st-dataTable__footer">
320
+ <span class="st-dataTable__range" aria-live="polite">{rangeLabel(range)}</span>
321
+ <nav class="st-dataTable__pager" aria-label="Pagination">
322
+ <button
323
+ type="button"
324
+ class="st-dataTable__pagerBtn"
325
+ disabled={safePage <= 1}
326
+ onclick={() => goToPage(safePage - 1)}
327
+ >
328
+ {previousLabel}
329
+ </button>
330
+ <span class="st-dataTable__pagerStatus" aria-live="polite">
331
+ {safePage} / {pageCount}
332
+ </span>
333
+ <button
334
+ type="button"
335
+ class="st-dataTable__pagerBtn"
336
+ disabled={safePage >= pageCount}
337
+ onclick={() => goToPage(safePage + 1)}
338
+ >
339
+ {nextLabel}
340
+ </button>
341
+ </nav>
342
+ </div>
343
+ {/if}
344
+ </div>
345
+
346
+ <style>
347
+ .st-dataTable-wrap {
348
+ display: grid;
349
+ gap: var(--st-spacing-2, 0.5rem);
350
+ }
351
+
352
+ .st-dataTable-wrap:has(.st-dataTable) {
353
+ overflow-x: auto;
354
+ }
355
+
356
+ .st-dataTable {
357
+ background: var(--st-component-dataTable-rowBackground, var(--st-semantic-surface-default));
358
+ border: 1px solid var(--st-component-dataTable-border, var(--st-semantic-border-subtle));
359
+ border-collapse: separate;
360
+ border-radius: var(--st-component-dataTable-radius, 0.5rem);
361
+ border-spacing: 0;
362
+ color: var(--st-component-dataTable-text, var(--st-semantic-text-primary));
363
+ min-width: 100%;
364
+ }
365
+
366
+ .st-dataTable caption {
367
+ color: var(--st-component-dataTable-captionText, var(--st-semantic-text-secondary));
368
+ font-weight: 600;
369
+ padding: 0.75rem;
370
+ text-align: start;
371
+ }
372
+
373
+ .st-dataTable th,
374
+ .st-dataTable td {
375
+ border-bottom: 1px solid var(--st-component-dataTable-border, var(--st-semantic-border-subtle));
376
+ padding: 0.75rem;
377
+ text-align: start;
378
+ vertical-align: top;
379
+ }
380
+
381
+ .st-dataTable--sm th,
382
+ .st-dataTable--sm td {
383
+ font-size: 0.8125rem;
384
+ padding: 0.5rem 0.625rem;
385
+ }
386
+
387
+ .st-dataTable--lg th,
388
+ .st-dataTable--lg td {
389
+ padding: 1rem;
390
+ }
391
+
392
+ .st-dataTable th {
393
+ background: var(--st-component-dataTable-headerBackground, var(--st-semantic-surface-subtle));
394
+ font-size: 0.875rem;
395
+ font-weight: 650;
396
+ }
397
+
398
+ .st-dataTable tbody tr:hover {
399
+ background: var(--st-component-dataTable-rowHoverBackground, var(--st-semantic-surface-subtle));
400
+ }
401
+
402
+ .st-dataTable tbody tr:last-child td {
403
+ border-bottom: 0;
404
+ }
405
+
406
+ .st-dataTable__row--selected {
407
+ background: color-mix(
408
+ in srgb,
409
+ var(--st-semantic-action-primary) 10%,
410
+ var(--st-semantic-surface-default)
411
+ );
412
+ }
413
+
414
+ .st-dataTable__row--clickable {
415
+ cursor: pointer;
416
+ }
417
+
418
+ .st-dataTable__cell--center {
419
+ text-align: center;
420
+ }
421
+
422
+ .st-dataTable__cell--end {
423
+ text-align: end;
424
+ }
425
+
426
+ .st-dataTable__select {
427
+ width: 2.5rem;
428
+ }
429
+
430
+ .st-dataTable__selectLabel {
431
+ align-items: center;
432
+ display: inline-flex;
433
+ height: 1rem;
434
+ justify-content: center;
435
+ margin: 0;
436
+ width: 1rem;
437
+ }
438
+
439
+ .st-dataTable__selectLabel input {
440
+ accent-color: var(--st-semantic-action-primary);
441
+ height: 1rem;
442
+ margin: 0;
443
+ width: 1rem;
444
+ }
445
+
446
+ .st-dataTable__sortBtn {
447
+ align-items: center;
448
+ background: transparent;
449
+ border: 0;
450
+ color: inherit;
451
+ cursor: pointer;
452
+ display: inline-flex;
453
+ font: inherit;
454
+ font-weight: 650;
455
+ gap: 0.375rem;
456
+ margin: -0.25rem -0.5rem;
457
+ padding: 0.25rem 0.5rem;
458
+ text-align: start;
459
+ }
460
+
461
+ .st-dataTable__sortBtn:hover {
462
+ background: var(--st-component-control-hoverBackground, var(--st-semantic-surface-subtle));
463
+ }
464
+
465
+ .st-dataTable__sortBtn:focus-visible {
466
+ outline: 2px solid var(--st-component-control-focusRing, var(--st-semantic-border-interactive));
467
+ outline-offset: -2px;
468
+ }
469
+
470
+ .st-dataTable__sortIcon {
471
+ color: var(--st-semantic-text-secondary);
472
+ font-size: 0.75rem;
473
+ }
474
+
475
+ .st-dataTable th[aria-sort="ascending"] .st-dataTable__sortIcon,
476
+ .st-dataTable th[aria-sort="descending"] .st-dataTable__sortIcon {
477
+ color: var(--st-semantic-action-primary);
478
+ }
479
+
480
+ .st-dataTable__empty {
481
+ color: var(--st-semantic-text-muted);
482
+ text-align: center;
483
+ }
484
+
485
+ .st-dataTable__footer {
486
+ align-items: center;
487
+ color: var(--st-semantic-text-secondary);
488
+ display: flex;
489
+ flex-wrap: wrap;
490
+ font-size: 0.8125rem;
491
+ gap: 0.75rem;
492
+ justify-content: space-between;
493
+ padding: 0.25rem 0.25rem 0;
494
+ }
495
+
496
+ .st-dataTable__range {
497
+ font-variant-numeric: tabular-nums;
498
+ }
499
+
500
+ .st-dataTable__pager {
501
+ align-items: center;
502
+ display: inline-flex;
503
+ gap: 0.5rem;
504
+ }
505
+
506
+ .st-dataTable__pagerBtn {
507
+ background: var(--st-component-pagination-background, var(--st-semantic-surface-default));
508
+ border: 1px solid var(--st-component-pagination-border, var(--st-semantic-border-subtle));
509
+ border-radius: var(--st-component-pagination-radius, 0.375rem);
510
+ color: var(--st-component-pagination-text, var(--st-semantic-text-primary));
511
+ cursor: pointer;
512
+ font: inherit;
513
+ font-size: 0.8125rem;
514
+ min-height: 2rem;
515
+ padding: 0 0.625rem;
516
+ }
517
+
518
+ .st-dataTable__pagerBtn:hover:not(:disabled) {
519
+ background: var(--st-component-control-hoverBackground, var(--st-semantic-surface-subtle));
520
+ }
521
+
522
+ .st-dataTable__pagerBtn:disabled {
523
+ color: var(--st-semantic-text-muted);
524
+ cursor: not-allowed;
525
+ opacity: 0.65;
526
+ }
527
+
528
+ .st-dataTable__pagerStatus {
529
+ font-variant-numeric: tabular-nums;
530
+ }
531
+
532
+ .st-visually-hidden {
533
+ border: 0;
534
+ clip: rect(0 0 0 0);
535
+ height: 1px;
536
+ margin: -1px;
537
+ overflow: hidden;
538
+ padding: 0;
539
+ position: absolute;
540
+ white-space: nowrap;
541
+ width: 1px;
542
+ }
543
+ </style>
@@ -0,0 +1,50 @@
1
+ import type { Snippet } from "svelte";
2
+ export interface DataTableColumn<R = DataTableRow> {
3
+ key: string;
4
+ label: string;
5
+ sortable?: boolean;
6
+ align?: "start" | "center" | "end";
7
+ width?: string;
8
+ cell?: Snippet<[R, DataTableColumn<R>]>;
9
+ }
10
+ export interface DataTableRow {
11
+ id: string;
12
+ [key: string]: unknown;
13
+ }
14
+ export type DataTableSelectMode = "none" | "single" | "multiple";
15
+ export interface DataTableSort {
16
+ key: string;
17
+ direction: "asc" | "desc";
18
+ }
19
+ import type { HTMLTableAttributes } from "svelte/elements";
20
+ type DataTableProps = Omit<HTMLTableAttributes, "class"> & {
21
+ columns: DataTableColumn[];
22
+ rows: DataTableRow[];
23
+ caption?: string;
24
+ size?: "sm" | "md" | "lg";
25
+ selectable?: DataTableSelectMode;
26
+ selectedIds?: string[];
27
+ sortable?: boolean;
28
+ sortBy?: DataTableSort | null;
29
+ pageSize?: number;
30
+ page?: number;
31
+ selectAllLabel?: string;
32
+ selectRowLabel?: string;
33
+ sortAscendingLabel?: string;
34
+ sortDescendingLabel?: string;
35
+ sortNoneLabel?: string;
36
+ previousLabel?: string;
37
+ nextLabel?: string;
38
+ rangeLabel?: (range: {
39
+ start: number;
40
+ end: number;
41
+ total: number;
42
+ }) => string;
43
+ emptyLabel?: string;
44
+ onRowClick?: (row: DataTableRow) => void;
45
+ class?: string;
46
+ };
47
+ declare const DataTable: import("svelte").Component<DataTableProps, {}, "page" | "selectedIds" | "sortBy">;
48
+ type DataTable = ReturnType<typeof DataTable>;
49
+ export default DataTable;
50
+ //# sourceMappingURL=DataTable.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.svelte.d.ts","sourceRoot":"","sources":["../src/lib/DataTable.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,YAAY;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,cAAc,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,GAAG;IACzD,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAiQJ,QAAA,MAAM,SAAS,mFAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}