compote-ui 0.79.2 → 0.80.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 (58) hide show
  1. package/dist/components/data-table-v9/column-filter-editing.svelte.d.ts +41 -0
  2. package/dist/components/data-table-v9/column-filter-editing.svelte.js +88 -0
  3. package/dist/components/data-table-v9/column-filter-kind.d.ts +10 -0
  4. package/dist/components/data-table-v9/column-filter-kind.js +25 -0
  5. package/dist/components/data-table-v9/create-table.svelte.js +37 -25
  6. package/dist/components/data-table-v9/data-table-head.svelte +230 -201
  7. package/dist/components/data-table-v9/data-table-head.svelte.d.ts +2 -0
  8. package/dist/components/data-table-v9/data-table-utils.d.ts +7 -0
  9. package/dist/components/data-table-v9/data-table-utils.js +4 -0
  10. package/dist/components/data-table-v9/data-table.svelte +154 -151
  11. package/dist/components/data-table-v9/data-table.svelte.d.ts +2 -0
  12. package/dist/components/data-table-v9/date-cell.d.ts +13 -0
  13. package/dist/components/data-table-v9/date-cell.js +38 -0
  14. package/dist/components/data-table-v9/filter-editors/boolean-filter-editor.svelte +45 -0
  15. package/dist/components/data-table-v9/filter-editors/boolean-filter-editor.svelte.d.ts +7 -0
  16. package/dist/components/data-table-v9/filter-editors/column-filter-editor.svelte +33 -0
  17. package/dist/components/data-table-v9/filter-editors/column-filter-editor.svelte.d.ts +30 -0
  18. package/dist/components/data-table-v9/filter-editors/date-range-filter-editor.svelte +52 -0
  19. package/dist/components/data-table-v9/filter-editors/date-range-filter-editor.svelte.d.ts +28 -0
  20. package/dist/components/data-table-v9/filter-editors/range-filter-editor.svelte +51 -0
  21. package/dist/components/data-table-v9/filter-editors/range-filter-editor.svelte.d.ts +30 -0
  22. package/dist/components/data-table-v9/filter-editors/select-filter-editor.svelte +59 -0
  23. package/dist/components/data-table-v9/filter-editors/select-filter-editor.svelte.d.ts +28 -0
  24. package/dist/components/data-table-v9/filter-editors/text-filter-editor.svelte +20 -0
  25. package/dist/components/data-table-v9/filter-editors/text-filter-editor.svelte.d.ts +8 -0
  26. package/dist/components/data-table-v9/header/column-header-filter.svelte +66 -0
  27. package/dist/components/data-table-v9/header/column-header-filter.svelte.d.ts +30 -0
  28. package/dist/components/data-table-v9/table-view-state.svelte.d.ts +1 -0
  29. package/dist/components/data-table-v9/table-view-state.svelte.js +3 -0
  30. package/dist/components/data-table-v9/toolbar/data-table-column-filter.svelte +203 -459
  31. package/dist/components/data-table-v9/toolbar/data-table-column-filter.svelte.d.ts +1 -1
  32. package/dist/components/data-table-v9/virtual/data-table-virtualized.svelte +82 -79
  33. package/dist/components/data-table-v9/virtual/data-table-virtualized.svelte.d.ts +2 -0
  34. package/dist/components/dialog/alert-dialog.svelte +73 -71
  35. package/dist/components/dialog/dialog-root.svelte +45 -43
  36. package/dist/components/drawer/drawer-content.svelte +213 -211
  37. package/dist/components/popover/popover-content.svelte +97 -71
  38. package/dist/components/popover/popover-content.svelte.d.ts +2 -1
  39. package/dist/components/popover/popover-description.svelte +19 -15
  40. package/dist/components/popover/popover-labels.svelte.d.ts +18 -0
  41. package/dist/components/popover/popover-labels.svelte.js +35 -0
  42. package/dist/components/popover/popover-root.svelte +27 -24
  43. package/dist/components/popover/popover-title.svelte +19 -15
  44. package/dist/icons/PhFunnelFill.svelte +19 -0
  45. package/dist/icons/PhFunnelFill.svelte.d.ts +5 -0
  46. package/dist/icons/index.d.ts +1 -0
  47. package/dist/icons/index.js +1 -0
  48. package/dist/utils/date-filter.d.ts +31 -0
  49. package/dist/utils/date-filter.js +58 -0
  50. package/dist/utils/date.d.ts +19 -1
  51. package/dist/utils/date.js +48 -1
  52. package/dist/utils/release-focus-on-exit.d.ts +22 -0
  53. package/dist/utils/release-focus-on-exit.js +26 -0
  54. package/package.json +1 -1
  55. package/skills/component-usage/references/overlays-and-floating-ui.md +278 -273
  56. package/skills/data-table/SKILL.md +314 -283
  57. package/skills/data-table/references/column-options.md +175 -150
  58. package/skills/data-table/references/table-state-and-reactivity.md +65 -60
@@ -1,5 +1,5 @@
1
1
  import type { RowData } from '@tanstack/svelte-table';
2
- import type { DataTableInstance } from '../data-table-utils';
2
+ import { type DataTableInstance } from '../data-table-utils';
3
3
  declare function $$render<T extends RowData>(): {
4
4
  props: {
5
5
  table: DataTableInstance<T>;
@@ -1,79 +1,82 @@
1
- <script lang="ts" generics="T extends RowData">
2
- import type { RowData } from '@tanstack/svelte-table';
3
- import type { HTMLAttributes } from 'svelte/elements';
4
- import { cn, type ClassValue } from 'tailwind-variants';
5
- import type { DataTableInstance } from '../data-table-utils';
6
- import { createTableViewState } from '../table-view-state.svelte';
7
- import DataTableHead from '../data-table-head.svelte';
8
- import DataTableFoot from '../data-table-foot.svelte';
9
- import DataTableVirtualRows from './data-table-virtual-rows.svelte';
10
- import { tableSizeStyle } from '../data-table-utils';
11
-
12
- type Props = Omit<HTMLAttributes<HTMLDivElement>, 'class'> & {
13
- table: DataTableInstance<T>;
14
- caption?: string;
15
- emptyMessage?: string;
16
- class?: ClassValue;
17
- onRowClick?: (details: { row: T; event: MouseEvent }) => void;
18
- onRowDoubleClick?: (details: { row: T; event: MouseEvent }) => void;
19
- };
20
-
21
- let {
22
- table,
23
- caption,
24
- emptyMessage = 'No rows found',
25
- class: className,
26
- onRowClick,
27
- onRowDoubleClick,
28
- ...rest
29
- }: Props = $props();
30
-
31
- let scrollContainerRef = $state<HTMLDivElement | undefined>(undefined);
32
-
33
- const view = createTableViewState(() => table);
34
- </script>
35
-
36
- <div
37
- class={cn(
38
- 'flex max-h-full min-h-0 flex-col overflow-hidden rounded-lg border border-surface-3 bg-surface-1',
39
- className
40
- )}
41
- {...rest}
42
- >
43
- {#if view.isColumnResizing}
44
- <div aria-hidden="true" class="fixed inset-0 z-50 cursor-col-resize select-none"></div>
45
- {/if}
46
-
47
- <div class="min-h-0 flex-1 overflow-auto" bind:this={scrollContainerRef}>
48
- <table
49
- class="table-fixed border-separate border-spacing-0 text-sm"
50
- style="display: grid; {tableSizeStyle(table, view.isRowSelectionEnabled, view)}"
51
- >
52
- {#if caption}
53
- <caption class="sr-only">{caption}</caption>
54
- {/if}
55
- <DataTableHead {table} {view} isVirtual />
56
- {#if scrollContainerRef}
57
- <DataTableVirtualRows
58
- {table}
59
- {view}
60
- scrollContainer={scrollContainerRef}
61
- {emptyMessage}
62
- {onRowClick}
63
- {onRowDoubleClick}
64
- />
65
- {/if}
66
- {#if view.hasFooter}
67
- <DataTableFoot {table} {view} hasGrowColumn={false} isVirtual />
68
- {/if}
69
- </table>
70
- </div>
71
-
72
- <div class="shrink-0 border-t border-surface-3 bg-surface-2 px-3 py-2 text-sm text-ink-dim">
73
- {#if view.isRowSelectionEnabled}
74
- {view.selectedRowCount} of {view.rowModel.rows.length} rows selected
75
- {:else}
76
- {view.rowModel.rows.length} rows
77
- {/if}
78
- </div>
79
- </div>
1
+ <script lang="ts" generics="T extends RowData">
2
+ import type { RowData } from '@tanstack/svelte-table';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+ import { cn, type ClassValue } from 'tailwind-variants';
5
+ import type { DataTableInstance } from '../data-table-utils';
6
+ import { createTableViewState } from '../table-view-state.svelte';
7
+ import DataTableHead from '../data-table-head.svelte';
8
+ import DataTableFoot from '../data-table-foot.svelte';
9
+ import DataTableVirtualRows from './data-table-virtual-rows.svelte';
10
+ import { tableSizeStyle } from '../data-table-utils';
11
+
12
+ type Props = Omit<HTMLAttributes<HTMLDivElement>, 'class'> & {
13
+ table: DataTableInstance<T>;
14
+ caption?: string;
15
+ emptyMessage?: string;
16
+ class?: ClassValue;
17
+ /** Show a filter funnel in the header of every filterable column. */
18
+ headerFilters?: boolean;
19
+ onRowClick?: (details: { row: T; event: MouseEvent }) => void;
20
+ onRowDoubleClick?: (details: { row: T; event: MouseEvent }) => void;
21
+ };
22
+
23
+ let {
24
+ table,
25
+ caption,
26
+ emptyMessage = 'No rows found',
27
+ class: className,
28
+ headerFilters = false,
29
+ onRowClick,
30
+ onRowDoubleClick,
31
+ ...rest
32
+ }: Props = $props();
33
+
34
+ let scrollContainerRef = $state<HTMLDivElement | undefined>(undefined);
35
+
36
+ const view = createTableViewState(() => table);
37
+ </script>
38
+
39
+ <div
40
+ class={cn(
41
+ 'flex max-h-full min-h-0 flex-col overflow-hidden rounded-lg border border-surface-3 bg-surface-1',
42
+ className
43
+ )}
44
+ {...rest}
45
+ >
46
+ {#if view.isColumnResizing}
47
+ <div aria-hidden="true" class="fixed inset-0 z-50 cursor-col-resize select-none"></div>
48
+ {/if}
49
+
50
+ <div class="min-h-0 flex-1 overflow-auto" bind:this={scrollContainerRef}>
51
+ <table
52
+ class="table-fixed border-separate border-spacing-0 text-sm"
53
+ style="display: grid; {tableSizeStyle(table, view.isRowSelectionEnabled, view)}"
54
+ >
55
+ {#if caption}
56
+ <caption class="sr-only">{caption}</caption>
57
+ {/if}
58
+ <DataTableHead {table} {view} isVirtual {headerFilters} />
59
+ {#if scrollContainerRef}
60
+ <DataTableVirtualRows
61
+ {table}
62
+ {view}
63
+ scrollContainer={scrollContainerRef}
64
+ {emptyMessage}
65
+ {onRowClick}
66
+ {onRowDoubleClick}
67
+ />
68
+ {/if}
69
+ {#if view.hasFooter}
70
+ <DataTableFoot {table} {view} hasGrowColumn={false} isVirtual />
71
+ {/if}
72
+ </table>
73
+ </div>
74
+
75
+ <div class="shrink-0 border-t border-surface-3 bg-surface-2 px-3 py-2 text-sm text-ink-dim">
76
+ {#if view.isRowSelectionEnabled}
77
+ {view.selectedRowCount} of {view.rowModel.rows.length} rows selected
78
+ {:else}
79
+ {view.rowModel.rows.length} rows
80
+ {/if}
81
+ </div>
82
+ </div>
@@ -8,6 +8,8 @@ declare function $$render<T extends RowData>(): {
8
8
  caption?: string;
9
9
  emptyMessage?: string;
10
10
  class?: ClassValue;
11
+ /** Show a filter funnel in the header of every filterable column. */
12
+ headerFilters?: boolean;
11
13
  onRowClick?: (details: {
12
14
  row: T;
13
15
  event: MouseEvent;
@@ -1,71 +1,73 @@
1
- <script lang="ts">
2
- import { PhX } from '../../icons';
3
- import { Dialog } from '@ark-ui/svelte/dialog';
4
- import { Portal } from '@ark-ui/svelte/portal';
5
- import type { AlertDialogProps } from './dialog.types';
6
-
7
- let {
8
- open = $bindable(),
9
- title,
10
- description,
11
- confirmLabel = 'Confirm',
12
- cancelLabel = 'Cancel',
13
- onConfirm,
14
- onCancel,
15
- variant = 'default',
16
- lazyMount = true,
17
- unmountOnExit = true,
18
- ...restProps
19
- }: AlertDialogProps = $props();
20
-
21
- const confirmClass = $derived(
22
- variant === 'destructive'
23
- ? 'inline-flex h-9 items-center justify-center rounded-md bg-red-600 px-4 text-sm font-medium text-ink-inverse shadow-sm transition-colors hover:bg-red-700 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring'
24
- : 'inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-ink-inverse shadow-sm transition-colors hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring'
25
- );
26
- </script>
27
-
28
- <Dialog.Root role="alertdialog" bind:open {lazyMount} {unmountOnExit} {...restProps}>
29
- <Portal>
30
- <Dialog.Backdrop
31
- class="fixed inset-0 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0"
32
- style="z-index: calc(50 + var(--layer-index, 0))"
33
- />
34
- <Dialog.Positioner
35
- class="fixed inset-0 flex items-center justify-center"
36
- style="z-index: calc(50 + var(--layer-index, 0))"
37
- >
38
- <Dialog.Content
39
- class="relative w-full max-w-md rounded-lg border bg-surface-1 p-6 shadow-xl 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"
40
- >
41
- <Dialog.Title class="text-lg leading-none font-semibold tracking-tight">
42
- {title}
43
- </Dialog.Title>
44
- {#if description}
45
- <Dialog.Description class="mt-2 text-sm text-ink-dim">
46
- {#each Array.isArray(description) ? description : [description] as line, i (i)}
47
- <span class="block">{line}</span>
48
- {/each}
49
- </Dialog.Description>
50
- {/if}
51
- <div class="mt-6 flex justify-end gap-3">
52
- <Dialog.CloseTrigger
53
- class="inline-flex h-9 items-center justify-center rounded-md border bg-surface-1 px-4 text-sm font-medium shadow-sm transition-colors hover:bg-surface-2 hover:text-ink focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
54
- onclick={onCancel}
55
- >
56
- {cancelLabel}
57
- </Dialog.CloseTrigger>
58
- <button type="button" class={confirmClass} onclick={onConfirm}>
59
- {confirmLabel}
60
- </button>
61
- </div>
62
- <Dialog.CloseTrigger
63
- class="absolute top-3 right-3 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-none"
64
- >
65
- <PhX class="h-4 w-4" />
66
- <span class="sr-only">Close</span>
67
- </Dialog.CloseTrigger>
68
- </Dialog.Content>
69
- </Dialog.Positioner>
70
- </Portal>
71
- </Dialog.Root>
1
+ <script lang="ts">
2
+ import { PhX } from '../../icons';
3
+ import { Dialog } from '@ark-ui/svelte/dialog';
4
+ import { Portal } from '@ark-ui/svelte/portal';
5
+ import { releaseFocusOnExitProps } from '../../utils/release-focus-on-exit';
6
+ import type { AlertDialogProps } from './dialog.types';
7
+
8
+ let {
9
+ open = $bindable(),
10
+ title,
11
+ description,
12
+ confirmLabel = 'Confirm',
13
+ cancelLabel = 'Cancel',
14
+ onConfirm,
15
+ onCancel,
16
+ variant = 'default',
17
+ lazyMount = true,
18
+ unmountOnExit = true,
19
+ ...restProps
20
+ }: AlertDialogProps = $props();
21
+
22
+ const confirmClass = $derived(
23
+ variant === 'destructive'
24
+ ? 'inline-flex h-9 items-center justify-center rounded-md bg-red-600 px-4 text-sm font-medium text-ink-inverse shadow-sm transition-colors hover:bg-red-700 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring'
25
+ : 'inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-ink-inverse shadow-sm transition-colors hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring'
26
+ );
27
+ </script>
28
+
29
+ <Dialog.Root role="alertdialog" bind:open {lazyMount} {unmountOnExit} {...restProps}>
30
+ <Portal>
31
+ <Dialog.Backdrop
32
+ class="fixed inset-0 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0"
33
+ style="z-index: calc(50 + var(--layer-index, 0))"
34
+ />
35
+ <Dialog.Positioner
36
+ class="fixed inset-0 flex items-center justify-center"
37
+ style="z-index: calc(50 + var(--layer-index, 0))"
38
+ >
39
+ <Dialog.Content
40
+ class="relative w-full max-w-md rounded-lg border bg-surface-1 p-6 shadow-xl 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"
41
+ {...releaseFocusOnExitProps}
42
+ >
43
+ <Dialog.Title class="text-lg leading-none font-semibold tracking-tight">
44
+ {title}
45
+ </Dialog.Title>
46
+ {#if description}
47
+ <Dialog.Description class="mt-2 text-sm text-ink-dim">
48
+ {#each Array.isArray(description) ? description : [description] as line, i (i)}
49
+ <span class="block">{line}</span>
50
+ {/each}
51
+ </Dialog.Description>
52
+ {/if}
53
+ <div class="mt-6 flex justify-end gap-3">
54
+ <Dialog.CloseTrigger
55
+ class="inline-flex h-9 items-center justify-center rounded-md border bg-surface-1 px-4 text-sm font-medium shadow-sm transition-colors hover:bg-surface-2 hover:text-ink focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
56
+ onclick={onCancel}
57
+ >
58
+ {cancelLabel}
59
+ </Dialog.CloseTrigger>
60
+ <button type="button" class={confirmClass} onclick={onConfirm}>
61
+ {confirmLabel}
62
+ </button>
63
+ </div>
64
+ <Dialog.CloseTrigger
65
+ class="absolute top-3 right-3 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-none"
66
+ >
67
+ <PhX class="h-4 w-4" />
68
+ <span class="sr-only">Close</span>
69
+ </Dialog.CloseTrigger>
70
+ </Dialog.Content>
71
+ </Dialog.Positioner>
72
+ </Portal>
73
+ </Dialog.Root>
@@ -1,43 +1,45 @@
1
- <script lang="ts">
2
- import { Dialog } from '@ark-ui/svelte/dialog';
3
- import { Portal } from '@ark-ui/svelte/portal';
4
- import { cn } from 'tailwind-variants';
5
- import type { DialogProps } from './dialog.types';
6
-
7
- let {
8
- open = $bindable(),
9
- children,
10
- contentClass,
11
- lazyMount = true,
12
- unmountOnExit = true,
13
- onOpenChange,
14
- ...restProps
15
- }: DialogProps = $props();
16
-
17
- function handleOpenChange(details: { open: boolean }) {
18
- open = details.open;
19
- onOpenChange?.(details);
20
- }
21
- </script>
22
-
23
- <Dialog.Root {open} {lazyMount} {unmountOnExit} onOpenChange={handleOpenChange} {...restProps}>
24
- <Portal>
25
- <Dialog.Backdrop
26
- class="fixed inset-0 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0"
27
- style="z-index: calc(50 + var(--layer-index, 0))"
28
- />
29
- <Dialog.Positioner
30
- class="fixed inset-0 flex items-center justify-center p-4"
31
- style="z-index: calc(50 + var(--layer-index, 0))"
32
- >
33
- <Dialog.Content
34
- class={cn(
35
- 'relative w-full max-w-2xl rounded-lg border bg-surface-1 p-6 shadow-xl 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',
36
- contentClass
37
- )}
38
- >
39
- {@render children()}
40
- </Dialog.Content>
41
- </Dialog.Positioner>
42
- </Portal>
43
- </Dialog.Root>
1
+ <script lang="ts">
2
+ import { Dialog } from '@ark-ui/svelte/dialog';
3
+ import { Portal } from '@ark-ui/svelte/portal';
4
+ import { releaseFocusOnExitProps } from '../../utils/release-focus-on-exit';
5
+ import { cn } from 'tailwind-variants';
6
+ import type { DialogProps } from './dialog.types';
7
+
8
+ let {
9
+ open = $bindable(),
10
+ children,
11
+ contentClass,
12
+ lazyMount = true,
13
+ unmountOnExit = true,
14
+ onOpenChange,
15
+ ...restProps
16
+ }: DialogProps = $props();
17
+
18
+ function handleOpenChange(details: { open: boolean }) {
19
+ open = details.open;
20
+ onOpenChange?.(details);
21
+ }
22
+ </script>
23
+
24
+ <Dialog.Root {open} {lazyMount} {unmountOnExit} onOpenChange={handleOpenChange} {...restProps}>
25
+ <Portal>
26
+ <Dialog.Backdrop
27
+ class="fixed inset-0 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0"
28
+ style="z-index: calc(50 + var(--layer-index, 0))"
29
+ />
30
+ <Dialog.Positioner
31
+ class="fixed inset-0 flex items-center justify-center p-4"
32
+ style="z-index: calc(50 + var(--layer-index, 0))"
33
+ >
34
+ <Dialog.Content
35
+ class={cn(
36
+ 'relative w-full max-w-2xl rounded-lg border bg-surface-1 p-6 shadow-xl 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',
37
+ contentClass
38
+ )}
39
+ {...releaseFocusOnExitProps}
40
+ >
41
+ {@render children()}
42
+ </Dialog.Content>
43
+ </Dialog.Positioner>
44
+ </Portal>
45
+ </Dialog.Root>