compote-ui 0.69.0 → 0.71.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 (44) hide show
  1. package/dist/components/combobox/combobox.svelte +1 -1
  2. package/dist/components/data-table-v9/create-table.svelte.d.ts +1 -1
  3. package/dist/components/data-table-v9/create-table.svelte.js +1 -21
  4. package/dist/components/data-table-v9/table-view-state.svelte.d.ts +2 -2
  5. package/dist/components/data-table-v9/table-view-state.svelte.js +2 -2
  6. package/dist/components/data-table-v9/toolbar/data-table-column-filter.svelte +2 -2
  7. package/dist/components/date-field/date-field.svelte +2 -2
  8. package/dist/components/date-input/date-input.svelte +1 -1
  9. package/dist/components/date-picker/date-picker-calendar.svelte +15 -15
  10. package/dist/components/date-picker/date-picker.svelte +4 -4
  11. package/dist/components/date-range-field/date-range-field.svelte +2 -2
  12. package/dist/components/file-upload/file-upload.svelte +1 -1
  13. package/dist/components/listbox/listbox-content.svelte +1 -1
  14. package/dist/components/nav-rail/nav-rail.svelte +1 -1
  15. package/dist/components/phone-input/phone-input.svelte +1 -1
  16. package/dist/components/progress/progress-circular.svelte +1 -1
  17. package/dist/components/progress/progress-linear.svelte +1 -1
  18. package/dist/components/table/index.d.ts +8 -0
  19. package/dist/components/table/index.js +8 -0
  20. package/dist/components/table/table-body.svelte +10 -0
  21. package/dist/components/table/table-body.svelte.d.ts +4 -0
  22. package/dist/components/table/table-caption.svelte +11 -0
  23. package/dist/components/table/table-caption.svelte.d.ts +4 -0
  24. package/dist/components/table/table-cell.svelte +16 -0
  25. package/dist/components/table/table-cell.svelte.d.ts +4 -0
  26. package/dist/components/table/table-footer.svelte +24 -0
  27. package/dist/components/table/table-footer.svelte.d.ts +7 -0
  28. package/dist/components/table/table-head.svelte +17 -0
  29. package/dist/components/table/table-head.svelte.d.ts +4 -0
  30. package/dist/components/table/table-header.svelte +16 -0
  31. package/dist/components/table/table-header.svelte.d.ts +7 -0
  32. package/dist/components/table/table-row.svelte +17 -0
  33. package/dist/components/table/table-row.svelte.d.ts +7 -0
  34. package/dist/components/table/table.svelte +15 -0
  35. package/dist/components/table/table.svelte.d.ts +4 -0
  36. package/dist/components/tags-input/tags-input.svelte +2 -2
  37. package/dist/components/toast/toast.d.ts +1 -1
  38. package/dist/icons/PhPlus.svelte +18 -0
  39. package/dist/icons/PhPlus.svelte.d.ts +5 -0
  40. package/dist/icons/index.d.ts +1 -0
  41. package/dist/icons/index.js +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +1 -0
  44. package/package.json +11 -11
@@ -130,7 +130,7 @@
130
130
  )}
131
131
  >
132
132
  {#if label}
133
- <Combobox.Label class="text-sm font-medium leading-none">
133
+ <Combobox.Label class="text-sm leading-none font-medium">
134
134
  {label}
135
135
  <Field.RequiredIndicator class="text-danger" />
136
136
  </Combobox.Label>
@@ -72,5 +72,5 @@ export declare function createTable<T extends RowData>(options: CreateDataTableO
72
72
  weakEquals: import("@tanstack/table-core").CreatedFilterFn<any, any>;
73
73
  };
74
74
  columnMeta: DataTableColumnMeta;
75
- }, T, import("@tanstack/table-core").TableState_ColumnFiltering & import("@tanstack/table-core").TableState_ColumnPinning & import("@tanstack/table-core").TableState_ColumnResizing & import("@tanstack/table-core").TableState_ColumnSizing & import("@tanstack/table-core").TableState_ColumnVisibility & import("@tanstack/table-core").TableState_GlobalFiltering & import("@tanstack/table-core").TableState_RowSelection & import("@tanstack/table-core").TableState_RowSorting>;
75
+ }, T>;
76
76
  export declare function getColumnId<T extends RowData>(column: DataTableLeafColumn<T>): string;
@@ -1,6 +1,6 @@
1
1
  import { createTable as createSvelteTable } from '@tanstack/svelte-table';
2
2
  import { useLocaleContext } from '@ark-ui/svelte/locale';
3
- import { onDestroy, untrack } from 'svelte';
3
+ import { onDestroy } from 'svelte';
4
4
  import { renderComponent, renderSnippet } from '@tanstack/svelte-table';
5
5
  import { dataTableFeatures } from './features';
6
6
  import { TYPE_NUMBER_FORMAT_DEFAULTS } from './data-table-utils';
@@ -60,26 +60,6 @@ export function createTable(options) {
60
60
  columnFilters: options.initialState?.columnFilters ?? []
61
61
  }
62
62
  });
63
- // The svelte adapter's internal $effect.pre only tracks `data` and `state` — not
64
- // `columns` — so reactive add/remove/reorder of columns never reaches the table.
65
- // Track the derived column defs here and push them through setOptions ourselves.
66
- // Re-supply the `data` getter so spreading `prev` doesn't freeze data reactivity.
67
- // CAUTION: upstream guidance says a second setOptions sync can race the adapter's
68
- // own $effect.pre (which getter-merges the original options on data/state change).
69
- // Both syncs write consistent values here, but revisit if the beta adapter ever
70
- // starts tracking `columns` itself.
71
- $effect.pre(() => {
72
- const columns = columnDefs;
73
- untrack(() => {
74
- table.setOptions((prev) => ({
75
- ...prev,
76
- get data() {
77
- return options.data;
78
- },
79
- columns
80
- }));
81
- });
82
- });
83
63
  // Notify consumers of visibility changes without taking control of the slice
84
64
  // (overriding the table's own `onColumnVisibilityChange` option would suppress
85
65
  // internal updates). The atom's `subscribe` is an explicit observer that runs
@@ -8,8 +8,8 @@ export type DataTableHeaderSection = 'left' | 'center' | 'right';
8
8
  *
9
9
  * Writable slice atoms are rune-backed, so reading them inside a $derived
10
10
  * registers the dependency. Derived table APIs (getRowModel, header groups,
11
- * getVisibleLeafColumns, …) are not reliably tracked by the beta adapter, so
12
- * each derived below first reads the slices its result depends on.
11
+ * getVisibleLeafColumns, …) aren't themselves reactive, so each derived below
12
+ * first reads the slices its result depends on.
13
13
  */
14
14
  export declare function createTableViewState<T extends RowData>(getTable: () => DataTableInstance<T>): {
15
15
  readonly table: DataTableInstance<T>;
@@ -4,8 +4,8 @@ import { getColumnMeta } from './data-table-utils';
4
4
  *
5
5
  * Writable slice atoms are rune-backed, so reading them inside a $derived
6
6
  * registers the dependency. Derived table APIs (getRowModel, header groups,
7
- * getVisibleLeafColumns, …) are not reliably tracked by the beta adapter, so
8
- * each derived below first reads the slices its result depends on.
7
+ * getVisibleLeafColumns, …) aren't themselves reactive, so each derived below
8
+ * first reads the slices its result depends on.
9
9
  */
10
10
  export function createTableViewState(getTable) {
11
11
  const table = $derived.by(getTable);
@@ -175,8 +175,8 @@
175
175
  {/if}
176
176
  </Popover.Trigger>
177
177
 
178
- <Popover.Content class="w-70 p-3 flex flex-col gap-3" showArrow={false}>
179
- <div class="flex items-center justify-between py-2.5 mr-1">
178
+ <Popover.Content class="flex w-70 flex-col gap-3 p-3" showArrow={false}>
179
+ <div class="mr-1 flex items-center justify-between py-2.5">
180
180
  <span class="text-sm font-medium text-ink">Filters</span>
181
181
  {#if activeCount > 0}
182
182
  <button type="button" onclick={clearFilters} class="text-xs text-primary hover:underline">
@@ -105,7 +105,7 @@
105
105
 
106
106
  <DateInput.RootProvider value={dateInput}>
107
107
  {#if label}
108
- <DateInput.Label class="text-sm font-medium leading-none">
108
+ <DateInput.Label class="text-sm leading-none font-medium">
109
109
  {label}
110
110
  <Field.RequiredIndicator />
111
111
  </DateInput.Label>
@@ -126,7 +126,7 @@
126
126
  </DateInput.SegmentContext>
127
127
  </DateInput.SegmentGroup>
128
128
  <DatePicker.Trigger
129
- class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface-1 shadow-sm hover:bg-surface-2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-50"
129
+ class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface-1 shadow-sm hover:bg-surface-2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50"
130
130
  >
131
131
  <PhCalendarBlank class="size-4" />
132
132
  </DatePicker.Trigger>
@@ -66,7 +66,7 @@
66
66
  }}
67
67
  >
68
68
  {#if label}
69
- <DateInput.Label class="text-sm font-medium leading-none">
69
+ <DateInput.Label class="text-sm leading-none font-medium">
70
70
  {label}
71
71
  <Field.RequiredIndicator />
72
72
  </DateInput.Label>
@@ -61,24 +61,24 @@
61
61
  <Portal>
62
62
  <DatePicker.Positioner>
63
63
  <DatePicker.Content
64
- class="z-50 min-w-70 rounded-lg border border-border bg-surface-document p-4 shadow-lg outline-none data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95"
64
+ class="z-50 min-w-70 rounded-lg border border-border bg-surface-document p-4 shadow-lg outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95"
65
65
  >
66
66
  <DatePicker.View view="day">
67
67
  <DatePicker.Context>
68
68
  {#snippet render(datePicker)}
69
69
  <DatePicker.ViewControl class="mb-3 flex items-center justify-between">
70
70
  <DatePicker.PrevTrigger
71
- class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-40"
71
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-40"
72
72
  >
73
73
  <PhArrowLeft class="size-4" />
74
74
  </DatePicker.PrevTrigger>
75
75
  <DatePicker.ViewTrigger
76
- class="flex-1 rounded-md py-1 text-center text-sm font-semibold text-ink hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
76
+ class="flex-1 rounded-md py-1 text-center text-sm font-semibold text-ink hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
77
77
  >
78
78
  <DatePicker.RangeText />
79
79
  </DatePicker.ViewTrigger>
80
80
  <DatePicker.NextTrigger
81
- class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-40"
81
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-40"
82
82
  >
83
83
  <PhArrowRight class="size-4" />
84
84
  </DatePicker.NextTrigger>
@@ -88,7 +88,7 @@
88
88
  <DatePicker.TableRow>
89
89
  {#each datePicker().weekDays as weekDay (weekDay.short)}
90
90
  <DatePicker.TableHeader
91
- class="pb-2 text-center text-xs font-medium uppercase text-ink-dim"
91
+ class="pb-2 text-center text-xs font-medium text-ink-dim uppercase"
92
92
  >
93
93
  {weekDay.short}
94
94
  </DatePicker.TableHeader>
@@ -101,7 +101,7 @@
101
101
  {#each week as day (day.toString())}
102
102
  <DatePicker.TableCell value={day}>
103
103
  <DatePicker.TableCellTrigger
104
- class="inline-flex h-9 w-9 items-center justify-center rounded-md text-sm text-ink hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-40 data-in-range:rounded-none data-in-range:bg-primary/15 data-outside-range:opacity-40 data-outside-range:text-ink-dim data-range-end:rounded-r-md data-range-end:bg-primary data-range-end:text-ink-inverse data-range-start:rounded-l-md data-range-start:bg-primary data-range-start:text-ink-inverse data-selected:bg-primary data-selected:text-ink-inverse data-today:font-semibold data-today:text-primary data-unavailable:line-through data-unavailable:opacity-40 data-selected:data-today:text-ink-inverse"
104
+ class="inline-flex h-9 w-9 items-center justify-center rounded-md text-sm text-ink hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-40 data-in-range:rounded-none data-in-range:bg-primary/15 data-outside-range:text-ink-dim data-outside-range:opacity-40 data-range-end:rounded-r-md data-range-end:bg-primary data-range-end:text-ink-inverse data-range-start:rounded-l-md data-range-start:bg-primary data-range-start:text-ink-inverse data-selected:bg-primary data-selected:text-ink-inverse data-today:font-semibold data-today:text-primary data-selected:data-today:text-ink-inverse data-unavailable:line-through data-unavailable:opacity-40"
105
105
  >
106
106
  {day.day}
107
107
  </DatePicker.TableCellTrigger>
@@ -143,7 +143,7 @@
143
143
  <button
144
144
  type="button"
145
145
  onclick={() => datePicker().setValue([togglePeriod(cur)])}
146
- class="h-8 rounded-md border border-border bg-surface-1 px-2 text-sm shadow-sm hover:bg-surface-2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
146
+ class="h-8 rounded-md border border-border bg-surface-1 px-2 text-sm shadow-sm hover:bg-surface-2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
147
147
  >
148
148
  {isPM(cur) ? 'PM' : 'AM'}
149
149
  </button>
@@ -159,17 +159,17 @@
159
159
  {#snippet render(datePicker)}
160
160
  <DatePicker.ViewControl class="mb-3 flex items-center justify-between">
161
161
  <DatePicker.PrevTrigger
162
- class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-40"
162
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-40"
163
163
  >
164
164
  <PhArrowLeft class="size-4" />
165
165
  </DatePicker.PrevTrigger>
166
166
  <DatePicker.ViewTrigger
167
- class="flex-1 rounded-md py-1 text-center text-sm font-semibold text-ink hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
167
+ class="flex-1 rounded-md py-1 text-center text-sm font-semibold text-ink hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
168
168
  >
169
169
  <DatePicker.RangeText />
170
170
  </DatePicker.ViewTrigger>
171
171
  <DatePicker.NextTrigger
172
- class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-40"
172
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-40"
173
173
  >
174
174
  <PhArrowRight class="size-4" />
175
175
  </DatePicker.NextTrigger>
@@ -181,7 +181,7 @@
181
181
  {#each monthRow as month (month.value)}
182
182
  <DatePicker.TableCell value={month.value}>
183
183
  <DatePicker.TableCellTrigger
184
- class="inline-flex h-10 w-full items-center justify-center rounded-md px-2 text-sm text-ink hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-outside-range:invisible data-selected:bg-primary data-selected:text-ink-inverse"
184
+ class="inline-flex h-10 w-full items-center justify-center rounded-md px-2 text-sm text-ink hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-outside-range:invisible data-selected:bg-primary data-selected:text-ink-inverse"
185
185
  >
186
186
  {month.label}
187
187
  </DatePicker.TableCellTrigger>
@@ -200,17 +200,17 @@
200
200
  {#snippet render(datePicker)}
201
201
  <DatePicker.ViewControl class="mb-3 flex items-center justify-between">
202
202
  <DatePicker.PrevTrigger
203
- class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-40"
203
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-40"
204
204
  >
205
205
  <PhArrowLeft class="size-4" />
206
206
  </DatePicker.PrevTrigger>
207
207
  <DatePicker.ViewTrigger
208
- class="flex-1 rounded-md py-1 text-center text-sm font-semibold text-ink hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
208
+ class="flex-1 rounded-md py-1 text-center text-sm font-semibold text-ink hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
209
209
  >
210
210
  <DatePicker.RangeText />
211
211
  </DatePicker.ViewTrigger>
212
212
  <DatePicker.NextTrigger
213
- class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-40"
213
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md text-ink-dim hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-40"
214
214
  >
215
215
  <PhArrowRight class="size-4" />
216
216
  </DatePicker.NextTrigger>
@@ -222,7 +222,7 @@
222
222
  {#each yearRow as year (year.value)}
223
223
  <DatePicker.TableCell value={year.value}>
224
224
  <DatePicker.TableCellTrigger
225
- class="inline-flex h-10 w-full items-center justify-center rounded-md px-2 text-sm text-ink hover:bg-surface-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-outside-range:invisible data-selected:bg-primary data-selected:text-ink-inverse"
225
+ class="inline-flex h-10 w-full items-center justify-center rounded-md px-2 text-sm text-ink hover:bg-surface-1 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-outside-range:invisible data-selected:bg-primary data-selected:text-ink-inverse"
226
226
  >
227
227
  {year.label}
228
228
  </DatePicker.TableCellTrigger>
@@ -72,7 +72,7 @@
72
72
  }}
73
73
  >
74
74
  {#if label}
75
- <DatePicker.Label class="text-sm font-medium leading-none">
75
+ <DatePicker.Label class="text-sm leading-none font-medium">
76
76
  {label}
77
77
  <Field.RequiredIndicator />
78
78
  </DatePicker.Label>
@@ -80,15 +80,15 @@
80
80
  <DatePicker.Control class="flex flex-row gap-1.5">
81
81
  <DatePicker.Input
82
82
  {placeholder}
83
- class="h-9 min-w-0 flex-1 rounded-md border border-border bg-surface-1 px-3 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-50 data-invalid:border-danger"
83
+ class="h-9 min-w-0 flex-1 rounded-md border border-border bg-surface-1 px-3 text-sm shadow-sm focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-invalid:border-danger"
84
84
  />
85
85
  <DatePicker.Trigger
86
- class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface-1 shadow-sm hover:bg-surface-2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-50"
86
+ class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface-1 shadow-sm hover:bg-surface-2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50"
87
87
  >
88
88
  <PhCalendarBlank class="size-4" />
89
89
  </DatePicker.Trigger>
90
90
  <DatePicker.ClearTrigger
91
- class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface-1 text-ink-dim shadow-sm hover:bg-surface-2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
91
+ class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface-1 text-ink-dim shadow-sm hover:bg-surface-2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
92
92
  >
93
93
  <PhX class="size-3.5" />
94
94
  </DatePicker.ClearTrigger>
@@ -72,7 +72,7 @@
72
72
 
73
73
  <DateInput.RootProvider value={dateInput}>
74
74
  {#if label}
75
- <DateInput.Label class="text-sm font-medium leading-none">
75
+ <DateInput.Label class="text-sm leading-none font-medium">
76
76
  {label}
77
77
  <Field.RequiredIndicator />
78
78
  </DateInput.Label>
@@ -96,7 +96,7 @@
96
96
  </DateInput.SegmentContext>
97
97
  </DateInput.SegmentGroup>
98
98
  <DatePicker.Trigger
99
- class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface-1 shadow-sm hover:bg-surface-2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-disabled:cursor-not-allowed data-disabled:opacity-50"
99
+ class="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface-1 shadow-sm hover:bg-surface-2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50"
100
100
  >
101
101
  <PhCalendarBlank class="size-4" />
102
102
  </DatePicker.Trigger>
@@ -27,7 +27,7 @@
27
27
 
28
28
  <FileUpload.Root {maxFiles} {accept} class="flex flex-col gap-1.5" {...restProps}>
29
29
  {#if label}
30
- <FileUpload.Label class="text-sm font-medium leading-none">{label}</FileUpload.Label>
30
+ <FileUpload.Label class="text-sm leading-none font-medium">{label}</FileUpload.Label>
31
31
  {/if}
32
32
 
33
33
  <FileUpload.Context>
@@ -20,7 +20,7 @@
20
20
  <Listbox.Content
21
21
  {...restProps}
22
22
  class={cn(
23
- 'flex min-h-0 w-full flex-1 flex-col overflow-y-auto outline-none bg-surface-document rounded p-1 border scrollbar-thin',
23
+ 'flex min-h-0 w-full flex-1 scrollbar-thin flex-col overflow-y-auto rounded border bg-surface-document p-1 outline-none',
24
24
  className
25
25
  )}
26
26
  >
@@ -14,7 +14,7 @@
14
14
  class={cn(
15
15
  'group absolute inset-y-0 left-0 z-20 flex w-16 flex-col overflow-hidden',
16
16
  'border-r border-border bg-surface-1 transition-[width] duration-200',
17
- 'hover:w-60 focus-within:w-60 data-expanded:w-60',
17
+ 'focus-within:w-60 hover:w-60 data-expanded:w-60',
18
18
  className
19
19
  )}
20
20
  {...rest}
@@ -92,7 +92,7 @@
92
92
  <Select.Control class="h-full">
93
93
  <Select.Trigger
94
94
  aria-label="Country"
95
- class="flex h-9 cursor-pointer items-center gap-1.5 rounded-l-md border-r px-2.5 text-sm outline-none transition-colors hover:bg-surface-2 active:bg-surface-2 data-disabled:cursor-not-allowed data-disabled:hover:bg-transparent"
95
+ class="flex h-9 cursor-pointer items-center gap-1.5 rounded-l-md border-r px-2.5 text-sm transition-colors outline-none hover:bg-surface-2 active:bg-surface-2 data-disabled:cursor-not-allowed data-disabled:hover:bg-transparent"
96
96
  >
97
97
  {#if selectedItem}
98
98
  <span
@@ -48,7 +48,7 @@
48
48
  />
49
49
  </Progress.Circle>
50
50
  {#if showValueText}
51
- <Progress.ValueText class="absolute text-sm font-medium tabular-nums text-ink" />
51
+ <Progress.ValueText class="absolute text-sm font-medium text-ink tabular-nums" />
52
52
  {/if}
53
53
  </div>
54
54
  {#if label}
@@ -35,7 +35,7 @@
35
35
  <Progress.Label class="text-sm font-medium text-ink">{label}</Progress.Label>
36
36
  {/if}
37
37
  {#if showValueText}
38
- <Progress.ValueText class="text-sm tabular-nums text-ink-dim" />
38
+ <Progress.ValueText class="text-sm text-ink-dim tabular-nums" />
39
39
  {/if}
40
40
  </div>
41
41
  {/if}
@@ -0,0 +1,8 @@
1
+ export { default as Root } from './table.svelte';
2
+ export { default as Header } from './table-header.svelte';
3
+ export { default as Body } from './table-body.svelte';
4
+ export { default as Footer } from './table-footer.svelte';
5
+ export { default as Row } from './table-row.svelte';
6
+ export { default as Head } from './table-head.svelte';
7
+ export { default as Cell } from './table-cell.svelte';
8
+ export { default as Caption } from './table-caption.svelte';
@@ -0,0 +1,8 @@
1
+ export { default as Root } from './table.svelte';
2
+ export { default as Header } from './table-header.svelte';
3
+ export { default as Body } from './table-body.svelte';
4
+ export { default as Footer } from './table-footer.svelte';
5
+ export { default as Row } from './table-row.svelte';
6
+ export { default as Head } from './table-head.svelte';
7
+ export { default as Cell } from './table-cell.svelte';
8
+ export { default as Caption } from './table-caption.svelte';
@@ -0,0 +1,10 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { cn } from 'tailwind-variants';
4
+
5
+ let { class: className, children, ...rest }: HTMLAttributes<HTMLTableSectionElement> = $props();
6
+ </script>
7
+
8
+ <tbody class={cn(className)} {...rest}>
9
+ {@render children?.()}
10
+ </tbody>
@@ -0,0 +1,4 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ declare const TableBody: import("svelte").Component<HTMLAttributes<HTMLTableSectionElement>, {}, "">;
3
+ type TableBody = ReturnType<typeof TableBody>;
4
+ export default TableBody;
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { cn } from 'tailwind-variants';
4
+
5
+ // Svelte types `<caption>` against HTMLElement, not HTMLTableCaptionElement.
6
+ let { class: className, children, ...rest }: HTMLAttributes<HTMLElement> = $props();
7
+ </script>
8
+
9
+ <caption class={cn('px-3 py-2 text-left text-sm text-ink-dim', className)} {...rest}>
10
+ {@render children?.()}
11
+ </caption>
@@ -0,0 +1,4 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ declare const TableCaption: import("svelte").Component<HTMLAttributes<HTMLElement>, {}, "">;
3
+ type TableCaption = ReturnType<typeof TableCaption>;
4
+ export default TableCaption;
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import type { HTMLTdAttributes } from 'svelte/elements';
3
+ import { cn } from 'tailwind-variants';
4
+
5
+ let { class: className, children, ...rest }: HTMLTdAttributes = $props();
6
+ </script>
7
+
8
+ <td
9
+ class={cn(
10
+ 'h-9 border-b border-surface-2 px-3 py-0 align-middle group-last/row:border-b-0',
11
+ className
12
+ )}
13
+ {...rest}
14
+ >
15
+ {@render children?.()}
16
+ </td>
@@ -0,0 +1,4 @@
1
+ import type { HTMLTdAttributes } from 'svelte/elements';
2
+ declare const TableCell: import("svelte").Component<HTMLTdAttributes, {}, "">;
3
+ type TableCell = ReturnType<typeof TableCell>;
4
+ export default TableCell;
@@ -0,0 +1,24 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { cn } from 'tailwind-variants';
4
+
5
+ type Props = HTMLAttributes<HTMLTableSectionElement> & {
6
+ sticky?: boolean;
7
+ };
8
+
9
+ let { sticky = true, class: className, children, ...rest }: Props = $props();
10
+ </script>
11
+
12
+ <!-- Footer cells are plain Table.Cell; the border flip (bottom -> top), the
13
+ surface and the weight are applied here so Cell stays context-free. -->
14
+ <tfoot
15
+ class={cn(
16
+ 'bg-surface-2 text-ink-dim',
17
+ '[&_td]:border-t [&_td]:border-b-0 [&_td]:border-surface-3 [&_td]:bg-surface-2 [&_td]:font-medium',
18
+ sticky && 'sticky bottom-0 z-20',
19
+ className
20
+ )}
21
+ {...rest}
22
+ >
23
+ {@render children?.()}
24
+ </tfoot>
@@ -0,0 +1,7 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ type Props = HTMLAttributes<HTMLTableSectionElement> & {
3
+ sticky?: boolean;
4
+ };
5
+ declare const TableFooter: import("svelte").Component<Props, {}, "">;
6
+ type TableFooter = ReturnType<typeof TableFooter>;
7
+ export default TableFooter;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { HTMLThAttributes } from 'svelte/elements';
3
+ import { cn } from 'tailwind-variants';
4
+
5
+ let { scope = 'col', class: className, children, ...rest }: HTMLThAttributes = $props();
6
+ </script>
7
+
8
+ <th
9
+ {scope}
10
+ class={cn(
11
+ 'h-9 border-b border-surface-3 bg-surface-2 px-3 py-0 align-middle leading-5 font-medium',
12
+ className
13
+ )}
14
+ {...rest}
15
+ >
16
+ {@render children?.()}
17
+ </th>
@@ -0,0 +1,4 @@
1
+ import type { HTMLThAttributes } from 'svelte/elements';
2
+ declare const TableHead: import("svelte").Component<HTMLThAttributes, {}, "">;
3
+ type TableHead = ReturnType<typeof TableHead>;
4
+ export default TableHead;
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { cn } from 'tailwind-variants';
4
+
5
+ type Props = HTMLAttributes<HTMLTableSectionElement> & {
6
+ sticky?: boolean;
7
+ };
8
+
9
+ let { sticky = true, class: className, children, ...rest }: Props = $props();
10
+ </script>
11
+
12
+ <!-- Sticky by default: with no scrolling ancestor it simply behaves as static,
13
+ so the same header works inside a scroll container and inside a dialog. -->
14
+ <thead class={cn('bg-surface-2 text-ink-dim', sticky && 'sticky top-0 z-20', className)} {...rest}>
15
+ {@render children?.()}
16
+ </thead>
@@ -0,0 +1,7 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ type Props = HTMLAttributes<HTMLTableSectionElement> & {
3
+ sticky?: boolean;
4
+ };
5
+ declare const TableHeader: import("svelte").Component<Props, {}, "">;
6
+ type TableHeader = ReturnType<typeof TableHeader>;
7
+ export default TableHeader;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { cn } from 'tailwind-variants';
4
+
5
+ type Props = HTMLAttributes<HTMLTableRowElement> & {
6
+ selected?: boolean;
7
+ };
8
+
9
+ let { selected = false, class: className, children, ...rest }: Props = $props();
10
+ </script>
11
+
12
+ <!-- `group/row` lets cells drop their bottom border on the last row. The hover
13
+ tint is invisible on header/footer rows because those cells set an opaque
14
+ bg-surface-2 of their own. -->
15
+ <tr class={cn('group/row h-9 hover:bg-well/60', selected && 'bg-well/60', className)} {...rest}>
16
+ {@render children?.()}
17
+ </tr>
@@ -0,0 +1,7 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ type Props = HTMLAttributes<HTMLTableRowElement> & {
3
+ selected?: boolean;
4
+ };
5
+ declare const TableRow: import("svelte").Component<Props, {}, "">;
6
+ type TableRow = ReturnType<typeof TableRow>;
7
+ export default TableRow;
@@ -0,0 +1,15 @@
1
+ <script lang="ts">
2
+ import type { HTMLTableAttributes } from 'svelte/elements';
3
+ import { cn } from 'tailwind-variants';
4
+
5
+ let { class: className, children, ...rest }: HTMLTableAttributes = $props();
6
+ </script>
7
+
8
+ <!-- border-separate (not border-collapse) keeps cell borders painted under a
9
+ sticky header, matching how DataTable renders its own table. -->
10
+ <table
11
+ class={cn('w-full border-separate border-spacing-0 text-left text-sm text-ink', className)}
12
+ {...rest}
13
+ >
14
+ {@render children?.()}
15
+ </table>
@@ -0,0 +1,4 @@
1
+ import type { HTMLTableAttributes } from 'svelte/elements';
2
+ declare const Table: import("svelte").Component<HTMLTableAttributes, {}, "">;
3
+ type Table = ReturnType<typeof Table>;
4
+ export default Table;
@@ -33,7 +33,7 @@
33
33
  <TagsInput.Context>
34
34
  {#snippet render(tagsInput)}
35
35
  {#if label}
36
- <TagsInput.Label class="text-sm font-medium leading-none data-disabled:opacity-50">
36
+ <TagsInput.Label class="text-sm leading-none font-medium data-disabled:opacity-50">
37
37
  {label}
38
38
  </TagsInput.Label>
39
39
  {/if}
@@ -55,7 +55,7 @@
55
55
  <TagsInput.ItemPreview
56
56
  class={cn(
57
57
  'inline-flex items-center gap-1 rounded bg-surface-2 py-0.5 pr-1 pl-2 text-sm',
58
- 'data-highlighted:bg-primary/10 data-disabled:opacity-50'
58
+ 'data-disabled:opacity-50 data-highlighted:bg-primary/10'
59
59
  )}
60
60
  >
61
61
  <TagsInput.ItemText>{value}</TagsInput.ItemText>
@@ -1,7 +1,7 @@
1
1
  import type { CreateToasterReturn } from '@ark-ui/svelte/toast';
2
2
  export type ToastOptions = Parameters<CreateToasterReturn['create']>[0];
3
3
  export type ToastType = NonNullable<ToastOptions['type']>;
4
- export declare const toast: import("@zag-js/toast").Store<any> & {
4
+ export declare const toast: CreateToasterReturn<any> & {
5
5
  info: (title: string | ToastOptions, options?: Omit<ToastOptions, "type">) => string;
6
6
  success: (title: string | ToastOptions, options?: Omit<ToastOptions, "type">) => string;
7
7
  warning: (title: string | ToastOptions, options?: Omit<ToastOptions, "type">) => string;
@@ -0,0 +1,18 @@
1
+ <script lang="ts">
2
+ let { class: className = '', ...restProps } = $props();
3
+ </script>
4
+
5
+ <!-- Icon from Phosphor by Phosphor Icons - https://github.com/phosphor-icons/core/blob/main/LICENSE -->
6
+ <svg
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ width="1em"
9
+ height="1em"
10
+ viewBox="0 0 256 256"
11
+ class={className}
12
+ {...restProps}
13
+ >
14
+ <path
15
+ fill="currentColor"
16
+ d="M224 128a8 8 0 0 1-8 8h-80v80a8 8 0 0 1-16 0v-80H40a8 8 0 0 1 0-16h80V40a8 8 0 0 1 16 0v80h80a8 8 0 0 1 8 8"
17
+ />
18
+ </svg>
@@ -0,0 +1,5 @@
1
+ declare const PhPlus: import("svelte").Component<{
2
+ class?: string;
3
+ } & Record<string, any>, {}, "">;
4
+ type PhPlus = ReturnType<typeof PhPlus>;
5
+ export default PhPlus;
@@ -21,6 +21,7 @@ export { default as PhMagnifyingGlass } from './PhMagnifyingGlass.svelte';
21
21
  export { default as PhMicrosoftExcelLogo } from './PhMicrosoftExcelLogo.svelte';
22
22
  export { default as PhMinus } from './PhMinus.svelte';
23
23
  export { default as PhPhone } from './PhPhone.svelte';
24
+ export { default as PhPlus } from './PhPlus.svelte';
24
25
  export { default as PhStar } from './PhStar.svelte';
25
26
  export { default as PhUploadSimple } from './PhUploadSimple.svelte';
26
27
  export { default as PhUser } from './PhUser.svelte';
@@ -21,6 +21,7 @@ export { default as PhMagnifyingGlass } from './PhMagnifyingGlass.svelte';
21
21
  export { default as PhMicrosoftExcelLogo } from './PhMicrosoftExcelLogo.svelte';
22
22
  export { default as PhMinus } from './PhMinus.svelte';
23
23
  export { default as PhPhone } from './PhPhone.svelte';
24
+ export { default as PhPlus } from './PhPlus.svelte';
24
25
  export { default as PhStar } from './PhStar.svelte';
25
26
  export { default as PhUploadSimple } from './PhUploadSimple.svelte';
26
27
  export { default as PhUser } from './PhUser.svelte';
package/dist/index.d.ts CHANGED
@@ -54,6 +54,7 @@ export { default as Select } from './components/select/select.svelte';
54
54
  export { default as Splitter } from './components/splitter/splitter.svelte';
55
55
  export type { SplitterPanelConfig, SplitterProps } from './components/splitter/types';
56
56
  export { default as Switch } from './components/switch/switch.svelte';
57
+ export * as Table from './components/table';
57
58
  export * as Tabs from './components/tabs';
58
59
  export { default as TagsInput } from './components/tags-input/tags-input.svelte';
59
60
  export type { TagsInputProps } from './components/tags-input/types';
package/dist/index.js CHANGED
@@ -42,6 +42,7 @@ export { default as QrCode } from './components/qr-code/qr-code.svelte';
42
42
  export { default as Select } from './components/select/select.svelte';
43
43
  export { default as Splitter } from './components/splitter/splitter.svelte';
44
44
  export { default as Switch } from './components/switch/switch.svelte';
45
+ export * as Table from './components/table';
45
46
  export * as Tabs from './components/tabs';
46
47
  export { default as TagsInput } from './components/tags-input/tags-input.svelte';
47
48
  export * as Toast from './components/toast';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "compote-ui",
3
- "version": "0.69.0",
3
+ "version": "0.71.0",
4
4
  "license": "MIT",
5
5
  "scripts": {
6
6
  "dev": "vite dev --open",
@@ -59,43 +59,43 @@
59
59
  "@iconify-json/ph": "^1.2.2",
60
60
  "@sveltejs/adapter-auto": "^7.0.0",
61
61
  "@sveltejs/adapter-cloudflare": "^7.2.9",
62
- "@sveltejs/kit": "^2.70.1",
62
+ "@sveltejs/kit": "^2.70.2",
63
63
  "@sveltejs/package": "^2.5.8",
64
64
  "@sveltejs/vite-plugin-svelte": "^7.2.0",
65
65
  "@tailwindcss/vite": "^4.3.3",
66
66
  "@tanstack/intent": "^0.3.6",
67
- "@tanstack/svelte-table": "9.0.0-beta.47",
67
+ "@tanstack/svelte-table": "9.0.0",
68
68
  "@types/node": "^22.20.0",
69
69
  "eslint": "^10.8.0",
70
70
  "eslint-config-prettier": "^10.1.8",
71
71
  "eslint-plugin-svelte": "^3.22.0",
72
- "globals": "^17.8.0",
72
+ "globals": "^17.9.0",
73
73
  "prettier": "^3.9.6",
74
74
  "prettier-plugin-svelte": "^4.1.1",
75
75
  "prettier-plugin-tailwindcss": "^0.8.1",
76
- "publint": "^0.3.22",
76
+ "publint": "^0.3.23",
77
77
  "svelte": "^5.56.8",
78
78
  "svelte-check": "^4.7.4",
79
79
  "tailwindcss": "^4.3.3",
80
80
  "tw-animate-css": "^1.4.0",
81
81
  "typescript": "^6.0.3",
82
- "typescript-eslint": "^8.65.0",
82
+ "typescript-eslint": "^8.66.0",
83
83
  "unplugin-icons": "^23.0.1",
84
- "vite": "^8.1.5"
84
+ "vite": "^8.2.0"
85
85
  },
86
86
  "keywords": [
87
87
  "svelte",
88
88
  "tanstack-intent"
89
89
  ],
90
90
  "dependencies": {
91
- "@ark-ui/svelte": "^5.22.1",
91
+ "@ark-ui/svelte": "^5.23.0",
92
92
  "@fontsource-variable/nunito-sans": "^5.2.7",
93
- "@internationalized/date": "^3.12.2",
94
- "@tanstack/svelte-virtual": "^3.13.34",
93
+ "@internationalized/date": "^3.12.3",
94
+ "@tanstack/svelte-virtual": "^3.13.35",
95
95
  "runed": "^0.37.1",
96
96
  "svelte-tel-input": "^4.3.2",
97
97
  "tailwind-merge": "^3.6.0",
98
- "tailwind-variants": "^3.3.0"
98
+ "tailwind-variants": "^3.3.1"
99
99
  },
100
100
  "intent": {
101
101
  "skills": [