@sentropic/design-system-svelte 0.3.0 → 0.4.1

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 (46) 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/Input.svelte +9 -2
  11. package/dist/Input.svelte.d.ts +3 -2
  12. package/dist/Input.svelte.d.ts.map +1 -1
  13. package/dist/MultiSelect.svelte +427 -0
  14. package/dist/MultiSelect.svelte.d.ts +28 -0
  15. package/dist/MultiSelect.svelte.d.ts.map +1 -0
  16. package/dist/NumberInput.svelte +256 -0
  17. package/dist/NumberInput.svelte.d.ts +19 -0
  18. package/dist/NumberInput.svelte.d.ts.map +1 -0
  19. package/dist/PasswordInput.svelte +205 -0
  20. package/dist/PasswordInput.svelte.d.ts +17 -0
  21. package/dist/PasswordInput.svelte.d.ts.map +1 -0
  22. package/dist/ProgressBar.svelte +176 -0
  23. package/dist/ProgressBar.svelte.d.ts +17 -0
  24. package/dist/ProgressBar.svelte.d.ts.map +1 -0
  25. package/dist/Search.svelte +218 -0
  26. package/dist/Search.svelte.d.ts +16 -0
  27. package/dist/Search.svelte.d.ts.map +1 -0
  28. package/dist/Select.svelte +9 -2
  29. package/dist/Select.svelte.d.ts +3 -2
  30. package/dist/Select.svelte.d.ts.map +1 -1
  31. package/dist/Slider.svelte +279 -0
  32. package/dist/Slider.svelte.d.ts +20 -0
  33. package/dist/Slider.svelte.d.ts.map +1 -0
  34. package/dist/Tag.svelte +140 -0
  35. package/dist/Tag.svelte.d.ts +16 -0
  36. package/dist/Tag.svelte.d.ts.map +1 -0
  37. package/dist/Textarea.svelte +9 -2
  38. package/dist/Textarea.svelte.d.ts +3 -2
  39. package/dist/Textarea.svelte.d.ts.map +1 -1
  40. package/dist/Toggle.svelte +135 -0
  41. package/dist/Toggle.svelte.d.ts +14 -0
  42. package/dist/Toggle.svelte.d.ts.map +1 -0
  43. package/dist/index.d.ts +15 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +11 -0
  46. 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"}
package/dist/Input.svelte CHANGED
@@ -1,12 +1,13 @@
1
1
  <script lang="ts">
2
2
  import type { HTMLInputAttributes } from "svelte/elements";
3
3
 
4
- type InputProps = Omit<HTMLInputAttributes, "class" | "size"> & {
4
+ type InputProps = Omit<HTMLInputAttributes, "class" | "size" | "value"> & {
5
5
  label?: string;
6
6
  helperText?: string;
7
7
  errorText?: string;
8
8
  invalid?: boolean;
9
9
  size?: "sm" | "md" | "lg";
10
+ value?: string | number | null;
10
11
  class?: string;
11
12
  };
12
13
 
@@ -16,6 +17,7 @@
16
17
  errorText,
17
18
  invalid = false,
18
19
  size = "md",
20
+ value = $bindable(""),
19
21
  class: className,
20
22
  ...rest
21
23
  }: InputProps = $props();
@@ -28,7 +30,12 @@
28
30
  <div class={fieldClasses()}>
29
31
  <label class="st-field__control">
30
32
  {#if label}<span class="st-field__label">{label}</span>{/if}
31
- <input {...rest} class={controlClasses()} aria-invalid={isInvalid() ? "true" : undefined} />
33
+ <input
34
+ {...rest}
35
+ bind:value
36
+ class={controlClasses()}
37
+ aria-invalid={isInvalid() ? "true" : undefined}
38
+ />
32
39
  </label>
33
40
  {#if errorText}
34
41
  <span class="st-field__error">{errorText}</span>
@@ -1,13 +1,14 @@
1
1
  import type { HTMLInputAttributes } from "svelte/elements";
2
- type InputProps = Omit<HTMLInputAttributes, "class" | "size"> & {
2
+ type InputProps = Omit<HTMLInputAttributes, "class" | "size" | "value"> & {
3
3
  label?: string;
4
4
  helperText?: string;
5
5
  errorText?: string;
6
6
  invalid?: boolean;
7
7
  size?: "sm" | "md" | "lg";
8
+ value?: string | number | null;
8
9
  class?: string;
9
10
  };
10
- declare const Input: import("svelte").Component<InputProps, {}, "">;
11
+ declare const Input: import("svelte").Component<InputProps, {}, "value">;
11
12
  type Input = ReturnType<typeof Input>;
12
13
  export default Input;
13
14
  //# sourceMappingURL=Input.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Input.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Input.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAoCJ,QAAA,MAAM,KAAK,gDAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Input.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Input.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqCJ,QAAA,MAAM,KAAK,qDAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}