@invopop/popui 0.1.3-6.beta.1 → 0.1.4-beta.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.
- package/dist/BaseButton.svelte +4 -0
- package/dist/DropdownSelect.svelte +41 -10
- package/dist/DropdownSelectGroup.svelte +15 -0
- package/dist/DropdownSelectGroup.svelte.d.ts +7 -0
- package/dist/TagStatus.svelte +1 -1
- package/dist/button/button.svelte +27 -3
- package/dist/button/button.svelte.d.ts +26 -0
- package/dist/data-table/data-table-pagination.svelte +38 -9
- package/dist/data-table/data-table-types.d.ts +8 -0
- package/dist/data-table/data-table.svelte +28 -7
- package/dist/data-table/table-styles.d.ts +1 -1
- package/dist/data-table/table-styles.js +5 -4
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -0
- package/dist/types.d.ts +5 -0
- package/package.json +1 -1
package/dist/BaseButton.svelte
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
shortcut = false,
|
|
15
15
|
fullwidth = false,
|
|
16
16
|
notification = false,
|
|
17
|
+
stackedLeft = false,
|
|
18
|
+
stackedRight = false,
|
|
17
19
|
children,
|
|
18
20
|
onclick,
|
|
19
21
|
class: className,
|
|
@@ -30,6 +32,8 @@
|
|
|
30
32
|
iconClass,
|
|
31
33
|
type,
|
|
32
34
|
disabled,
|
|
35
|
+
stackedLeft,
|
|
36
|
+
stackedRight,
|
|
33
37
|
onclick,
|
|
34
38
|
class: `${fullWidthClass} ${className || ''}`,
|
|
35
39
|
...rest
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import clsx from 'clsx'
|
|
8
8
|
import TagStatus from './TagStatus.svelte'
|
|
9
9
|
import { resolveIcon } from './helpers.js'
|
|
10
|
+
import { buttonVariants } from './button/button.svelte'
|
|
10
11
|
|
|
11
12
|
let {
|
|
12
13
|
value = $bindable(''),
|
|
@@ -17,7 +18,10 @@
|
|
|
17
18
|
multiple = false,
|
|
18
19
|
fullWidth = false,
|
|
19
20
|
widthClass = 'min-w-[160px] max-w-[420px]',
|
|
20
|
-
onSelect
|
|
21
|
+
onSelect,
|
|
22
|
+
stackLeft = false,
|
|
23
|
+
stackRight = false,
|
|
24
|
+
multipleLabel = 'items'
|
|
21
25
|
}: DropdownSelectProps = $props()
|
|
22
26
|
|
|
23
27
|
let selectDropdown: BaseDropdown | undefined = $state()
|
|
@@ -39,20 +43,34 @@
|
|
|
39
43
|
|
|
40
44
|
let selectedItems = $derived(items.filter((i) => i.selected))
|
|
41
45
|
let selectedColor = $derived(!multiple && items.find((i) => i.selected)?.color)
|
|
46
|
+
let selectedColors = $derived(
|
|
47
|
+
multiple ? selectedItems.filter((i) => i.color).map((i) => i.color) : []
|
|
48
|
+
)
|
|
49
|
+
let hasMultipleColors = $derived(multiple && selectedColors.length > 0)
|
|
42
50
|
let selectedIcon = $derived(!multiple && items.find((i) => i.selected)?.icon)
|
|
43
51
|
let selectedIconColor = $derived(
|
|
44
52
|
(!multiple && items.find((i) => i.selected)?.iconClass) || 'text-foreground-default-secondary'
|
|
45
53
|
)
|
|
46
54
|
let selectedLabel = $derived(
|
|
47
|
-
|
|
48
|
-
|
|
55
|
+
hasMultipleColors && selectedItems.length > 1
|
|
56
|
+
? `${selectedItems.length} ${multipleLabel}`
|
|
57
|
+
: `${selectedItems[0]?.label || ''}${selectedItems.length > 1 && multiple ? ' and more' : ''}` ||
|
|
58
|
+
placeholder
|
|
49
59
|
)
|
|
50
60
|
|
|
61
|
+
let isStacked = $derived(stackLeft || stackRight)
|
|
62
|
+
|
|
51
63
|
let styles = $derived(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
64
|
+
isStacked
|
|
65
|
+
? buttonVariants({
|
|
66
|
+
variant: 'ghost',
|
|
67
|
+
stackedLeft: stackLeft,
|
|
68
|
+
stackedRight: stackRight
|
|
69
|
+
})
|
|
70
|
+
: clsx('border backdrop-blur-sm backdrop-filter dropdown-select', {
|
|
71
|
+
'border-border-selected-bold shadow-active': isOpen,
|
|
72
|
+
'border-border-default-secondary hover:border-border-default-secondary-hover': !isOpen
|
|
73
|
+
})
|
|
56
74
|
)
|
|
57
75
|
|
|
58
76
|
function handleClick(val: AnyProp) {
|
|
@@ -90,13 +108,26 @@
|
|
|
90
108
|
placement="bottom-start"
|
|
91
109
|
{fullWidth}
|
|
92
110
|
bind:this={selectDropdown}
|
|
93
|
-
class={fullWidth ? '' : widthClass}
|
|
111
|
+
class={fullWidth || isStacked ? '' : widthClass}
|
|
94
112
|
>
|
|
95
113
|
{#snippet trigger()}
|
|
96
114
|
<div
|
|
97
|
-
class="{styles}
|
|
115
|
+
class="{styles} flex items-center rounded-lg py-1.5 pl-2 bg-background overflow-hidden w-full h-7"
|
|
116
|
+
class:pr-[28px]={!isStacked}
|
|
117
|
+
class:pr-2={isStacked}
|
|
98
118
|
>
|
|
99
|
-
{#if
|
|
119
|
+
{#if hasMultipleColors}
|
|
120
|
+
<div class="flex items-center gap-1 flex-1 min-w-0">
|
|
121
|
+
<div class="flex items-center -space-x-0.5">
|
|
122
|
+
{#each selectedColors.slice(0, 3) as color}
|
|
123
|
+
<span class="border-l border-background rounded-xs flex first:border-l-0">
|
|
124
|
+
<TagStatus dot status={color} />
|
|
125
|
+
</span>
|
|
126
|
+
{/each}
|
|
127
|
+
</div>
|
|
128
|
+
{@render label()}
|
|
129
|
+
</div>
|
|
130
|
+
{:else if selectedColor}
|
|
100
131
|
<div class="flex items-center gap-1 flex-1 min-w-0">
|
|
101
132
|
<TagStatus dot status={selectedColor} />
|
|
102
133
|
{@render label()}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte'
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
children: Snippet
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
let { children }: Props = $props()
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<div
|
|
12
|
+
class="flex items-center h-7 rounded-md border border-border-default-secondary divide-x divide-border-default-secondary"
|
|
13
|
+
>
|
|
14
|
+
{@render children()}
|
|
15
|
+
</div>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
children: Snippet;
|
|
4
|
+
}
|
|
5
|
+
declare const DropdownSelectGroup: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type DropdownSelectGroup = ReturnType<typeof DropdownSelectGroup>;
|
|
7
|
+
export default DropdownSelectGroup;
|
package/dist/TagStatus.svelte
CHANGED
|
@@ -36,6 +36,14 @@
|
|
|
36
36
|
hasIcon: {
|
|
37
37
|
true: '',
|
|
38
38
|
false: ''
|
|
39
|
+
},
|
|
40
|
+
stackedLeft: {
|
|
41
|
+
true: '',
|
|
42
|
+
false: ''
|
|
43
|
+
},
|
|
44
|
+
stackedRight: {
|
|
45
|
+
true: '',
|
|
46
|
+
false: ''
|
|
39
47
|
}
|
|
40
48
|
},
|
|
41
49
|
compoundVariants: [
|
|
@@ -122,13 +130,25 @@
|
|
|
122
130
|
size: 'lg',
|
|
123
131
|
iconOnly: true,
|
|
124
132
|
class: 'w-8'
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
stackedLeft: true,
|
|
136
|
+
class:
|
|
137
|
+
'!rounded-l-none hover:!bg-background-default-secondary active:!bg-background-default-secondary'
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
stackedRight: true,
|
|
141
|
+
class:
|
|
142
|
+
'!rounded-r-none hover:!bg-background-default-secondary active:!bg-background-default-secondary'
|
|
125
143
|
}
|
|
126
144
|
],
|
|
127
145
|
defaultVariants: {
|
|
128
146
|
variant: 'primary',
|
|
129
147
|
size: 'md',
|
|
130
148
|
iconOnly: false,
|
|
131
|
-
hasIcon: false
|
|
149
|
+
hasIcon: false,
|
|
150
|
+
stackedLeft: false,
|
|
151
|
+
stackedRight: false
|
|
132
152
|
}
|
|
133
153
|
})
|
|
134
154
|
|
|
@@ -141,6 +161,8 @@
|
|
|
141
161
|
icon?: IconSource
|
|
142
162
|
iconPosition?: 'left' | 'right'
|
|
143
163
|
iconClass?: string
|
|
164
|
+
stackedLeft?: boolean
|
|
165
|
+
stackedRight?: boolean
|
|
144
166
|
}
|
|
145
167
|
</script>
|
|
146
168
|
|
|
@@ -154,6 +176,8 @@
|
|
|
154
176
|
icon,
|
|
155
177
|
iconPosition = 'left',
|
|
156
178
|
iconClass = '',
|
|
179
|
+
stackedLeft = false,
|
|
180
|
+
stackedRight = false,
|
|
157
181
|
ref = $bindable(null),
|
|
158
182
|
href = undefined,
|
|
159
183
|
type = 'button',
|
|
@@ -220,7 +244,7 @@
|
|
|
220
244
|
bind:this={ref}
|
|
221
245
|
data-slot="button"
|
|
222
246
|
class={cn(
|
|
223
|
-
buttonVariants({ variant, size, iconOnly, hasIcon }),
|
|
247
|
+
buttonVariants({ variant, size, iconOnly, hasIcon, stackedLeft, stackedRight }),
|
|
224
248
|
iconPosition === 'right' && 'flex-row-reverse',
|
|
225
249
|
paddingClass,
|
|
226
250
|
className
|
|
@@ -238,7 +262,7 @@
|
|
|
238
262
|
bind:this={ref}
|
|
239
263
|
data-slot="button"
|
|
240
264
|
class={cn(
|
|
241
|
-
buttonVariants({ variant, size, iconOnly, hasIcon }),
|
|
265
|
+
buttonVariants({ variant, size, iconOnly, hasIcon, stackedLeft, stackedRight }),
|
|
242
266
|
'group',
|
|
243
267
|
iconPosition === 'right' && 'flex-row-reverse',
|
|
244
268
|
paddingClass,
|
|
@@ -26,6 +26,14 @@ export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
|
|
|
26
26
|
true: string;
|
|
27
27
|
false: string;
|
|
28
28
|
};
|
|
29
|
+
stackedLeft: {
|
|
30
|
+
true: string;
|
|
31
|
+
false: string;
|
|
32
|
+
};
|
|
33
|
+
stackedRight: {
|
|
34
|
+
true: string;
|
|
35
|
+
false: string;
|
|
36
|
+
};
|
|
29
37
|
}, undefined, "inline-flex items-center justify-center font-medium text-base whitespace-nowrap focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-selected focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-30 relative overflow-hidden box-border cursor-pointer", {
|
|
30
38
|
variant: {
|
|
31
39
|
primary: string;
|
|
@@ -50,6 +58,14 @@ export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
|
|
|
50
58
|
true: string;
|
|
51
59
|
false: string;
|
|
52
60
|
};
|
|
61
|
+
stackedLeft: {
|
|
62
|
+
true: string;
|
|
63
|
+
false: string;
|
|
64
|
+
};
|
|
65
|
+
stackedRight: {
|
|
66
|
+
true: string;
|
|
67
|
+
false: string;
|
|
68
|
+
};
|
|
53
69
|
}, undefined, import("tailwind-variants").TVReturnType<{
|
|
54
70
|
variant: {
|
|
55
71
|
primary: string;
|
|
@@ -74,6 +90,14 @@ export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
|
|
|
74
90
|
true: string;
|
|
75
91
|
false: string;
|
|
76
92
|
};
|
|
93
|
+
stackedLeft: {
|
|
94
|
+
true: string;
|
|
95
|
+
false: string;
|
|
96
|
+
};
|
|
97
|
+
stackedRight: {
|
|
98
|
+
true: string;
|
|
99
|
+
false: string;
|
|
100
|
+
};
|
|
77
101
|
}, undefined, "inline-flex items-center justify-center font-medium text-base whitespace-nowrap focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-selected focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-30 relative overflow-hidden box-border cursor-pointer", unknown, unknown, undefined>>;
|
|
78
102
|
export type ButtonVariant = VariantProps<typeof buttonVariants>['variant'];
|
|
79
103
|
export type ButtonSize = VariantProps<typeof buttonVariants>['size'];
|
|
@@ -83,6 +107,8 @@ export type ButtonProps = WithElementRef<HTMLButtonAttributes> & WithElementRef<
|
|
|
83
107
|
icon?: IconSource;
|
|
84
108
|
iconPosition?: 'left' | 'right';
|
|
85
109
|
iconClass?: string;
|
|
110
|
+
stackedLeft?: boolean;
|
|
111
|
+
stackedRight?: boolean;
|
|
86
112
|
};
|
|
87
113
|
declare const Button: import("svelte").Component<ButtonProps, {}, "ref">;
|
|
88
114
|
type Button = ReturnType<typeof Button>;
|
|
@@ -12,13 +12,18 @@
|
|
|
12
12
|
showRowsPerPage = true,
|
|
13
13
|
rowsPerPageOptions = [10, 25, 50, 100],
|
|
14
14
|
itemsLabel = 'items',
|
|
15
|
-
children
|
|
15
|
+
children,
|
|
16
|
+
selectedSlot,
|
|
17
|
+
unselectedSlot,
|
|
18
|
+
onPageChange,
|
|
19
|
+
onPageSizeChange
|
|
16
20
|
}: DataTablePaginationProps<any> = $props()
|
|
17
21
|
|
|
18
22
|
let currentPage = $derived(table.getState().pagination.pageIndex + 1)
|
|
19
23
|
let totalPages = $derived(table.getPageCount())
|
|
20
24
|
let totalItems = $derived(table.getFilteredRowModel().rows.length)
|
|
21
25
|
let rowsPerPage = $derived(table.getState().pagination.pageSize)
|
|
26
|
+
let hasSelection = $derived(Object.keys(table.getState().rowSelection).length > 0)
|
|
22
27
|
|
|
23
28
|
let pageInputValue = $derived(`${currentPage}`)
|
|
24
29
|
|
|
@@ -27,6 +32,7 @@
|
|
|
27
32
|
const value = parseInt(target.value)
|
|
28
33
|
if (value >= 1 && value <= totalPages) {
|
|
29
34
|
table.setPageIndex(value - 1)
|
|
35
|
+
onPageChange?.(value)
|
|
30
36
|
} else if (target.value === '') {
|
|
31
37
|
// Allow empty input temporarily
|
|
32
38
|
pageInputValue = ''
|
|
@@ -40,6 +46,7 @@
|
|
|
40
46
|
pageInputValue = `${currentPage}`
|
|
41
47
|
} else if (value > totalPages) {
|
|
42
48
|
table.setPageIndex(totalPages - 1)
|
|
49
|
+
onPageChange?.(totalPages)
|
|
43
50
|
}
|
|
44
51
|
}
|
|
45
52
|
|
|
@@ -63,7 +70,10 @@
|
|
|
63
70
|
variant="ghost"
|
|
64
71
|
size="md"
|
|
65
72
|
icon={ScrollLeft}
|
|
66
|
-
onclick={() =>
|
|
73
|
+
onclick={() => {
|
|
74
|
+
table.setPageIndex(0)
|
|
75
|
+
onPageChange?.(1)
|
|
76
|
+
}}
|
|
67
77
|
disabled={currentPage === 1}
|
|
68
78
|
class={cn(currentPage === 1 && 'pointer-events-none opacity-30')}
|
|
69
79
|
aria-label="First page"
|
|
@@ -72,7 +82,11 @@
|
|
|
72
82
|
variant="ghost"
|
|
73
83
|
size="md"
|
|
74
84
|
icon={ArrowLeft}
|
|
75
|
-
onclick={() =>
|
|
85
|
+
onclick={() => {
|
|
86
|
+
const newPage = currentPage - 1
|
|
87
|
+
table.previousPage()
|
|
88
|
+
onPageChange?.(newPage)
|
|
89
|
+
}}
|
|
76
90
|
disabled={currentPage === 1}
|
|
77
91
|
class={cn(currentPage === 1 && 'pointer-events-none opacity-30')}
|
|
78
92
|
aria-label="Previous page"
|
|
@@ -97,7 +111,11 @@
|
|
|
97
111
|
variant="ghost"
|
|
98
112
|
size="md"
|
|
99
113
|
icon={ArrowRight}
|
|
100
|
-
onclick={() =>
|
|
114
|
+
onclick={() => {
|
|
115
|
+
const newPage = currentPage + 1
|
|
116
|
+
table.nextPage()
|
|
117
|
+
onPageChange?.(newPage)
|
|
118
|
+
}}
|
|
101
119
|
disabled={currentPage === totalPages}
|
|
102
120
|
class={cn(currentPage === totalPages && 'pointer-events-none opacity-30')}
|
|
103
121
|
aria-label="Next page"
|
|
@@ -106,7 +124,10 @@
|
|
|
106
124
|
variant="ghost"
|
|
107
125
|
size="md"
|
|
108
126
|
icon={ScrollRight}
|
|
109
|
-
onclick={() =>
|
|
127
|
+
onclick={() => {
|
|
128
|
+
table.setPageIndex(totalPages - 1)
|
|
129
|
+
onPageChange?.(totalPages)
|
|
130
|
+
}}
|
|
110
131
|
disabled={currentPage === totalPages}
|
|
111
132
|
class={cn(currentPage === totalPages && 'pointer-events-none opacity-30')}
|
|
112
133
|
aria-label="Last page"
|
|
@@ -122,7 +143,9 @@
|
|
|
122
143
|
label: `${size} rows`
|
|
123
144
|
}))}
|
|
124
145
|
onchange={(value) => {
|
|
125
|
-
|
|
146
|
+
const size = Number(value)
|
|
147
|
+
table.setPageSize(size)
|
|
148
|
+
onPageSizeChange?.(size)
|
|
126
149
|
}}
|
|
127
150
|
placeholder="Rows per page"
|
|
128
151
|
disablePlaceholder={true}
|
|
@@ -138,7 +161,13 @@
|
|
|
138
161
|
</span>
|
|
139
162
|
{/if}
|
|
140
163
|
</div>
|
|
141
|
-
|
|
142
|
-
{
|
|
143
|
-
|
|
164
|
+
<div class="flex items-center gap-2">
|
|
165
|
+
{#if hasSelection && selectedSlot}
|
|
166
|
+
{@render selectedSlot()}
|
|
167
|
+
{:else if !hasSelection && unselectedSlot}
|
|
168
|
+
{@render unselectedSlot()}
|
|
169
|
+
{:else if children}
|
|
170
|
+
{@render children()}
|
|
171
|
+
{/if}
|
|
172
|
+
</div>
|
|
144
173
|
</div>
|
|
@@ -54,6 +54,10 @@ export interface DataTableProps<TData> {
|
|
|
54
54
|
onRowClick?: (row: TData) => void;
|
|
55
55
|
onSelectionChange?: (selectedRows: TData[]) => void;
|
|
56
56
|
filters?: Snippet;
|
|
57
|
+
paginationSelectedSlot?: Snippet;
|
|
58
|
+
paginationUnselectedSlot?: Snippet;
|
|
59
|
+
onPageChange?: (pageIndex: number) => void;
|
|
60
|
+
onPageSizeChange?: (pageSize: number) => void;
|
|
57
61
|
}
|
|
58
62
|
export interface DataTablePaginationProps<T> {
|
|
59
63
|
table: Table<T>;
|
|
@@ -63,4 +67,8 @@ export interface DataTablePaginationProps<T> {
|
|
|
63
67
|
rowsPerPageOptions?: number[];
|
|
64
68
|
itemsLabel?: string;
|
|
65
69
|
children?: Snippet;
|
|
70
|
+
selectedSlot?: Snippet;
|
|
71
|
+
unselectedSlot?: Snippet;
|
|
72
|
+
onPageChange?: (pageIndex: number) => void;
|
|
73
|
+
onPageSizeChange?: (pageSize: number) => void;
|
|
66
74
|
}
|
|
@@ -42,7 +42,11 @@
|
|
|
42
42
|
},
|
|
43
43
|
onRowClick,
|
|
44
44
|
onSelectionChange,
|
|
45
|
-
filters
|
|
45
|
+
filters,
|
|
46
|
+
paginationSelectedSlot,
|
|
47
|
+
paginationUnselectedSlot,
|
|
48
|
+
onPageChange,
|
|
49
|
+
onPageSizeChange
|
|
46
50
|
}: DataTableProps<TData> = $props()
|
|
47
51
|
|
|
48
52
|
const enableSelection = !disableSelection
|
|
@@ -214,6 +218,14 @@
|
|
|
214
218
|
{/if}
|
|
215
219
|
{/if}
|
|
216
220
|
{#if header.column.getCanResize()}
|
|
221
|
+
<!-- Always visible vertical border -->
|
|
222
|
+
<div
|
|
223
|
+
class={cn(
|
|
224
|
+
'absolute right-0 top-1/2 -translate-y-1/2 h-3 w-px bg-background-default-tertiary',
|
|
225
|
+
header.column.getIsResizing() && 'opacity-0'
|
|
226
|
+
)}
|
|
227
|
+
></div>
|
|
228
|
+
<!-- Resize handler (larger interactive area, enhanced on hover) -->
|
|
217
229
|
<div
|
|
218
230
|
role="button"
|
|
219
231
|
tabindex="0"
|
|
@@ -224,10 +236,8 @@
|
|
|
224
236
|
>
|
|
225
237
|
<div
|
|
226
238
|
class={cn(
|
|
227
|
-
'absolute right-1.5 top-0 h-full w-0.5 bg-border-default-secondary transition-opacity',
|
|
228
|
-
header.column.getIsResizing()
|
|
229
|
-
? 'opacity-0'
|
|
230
|
-
: 'opacity-0 group-hover:opacity-100'
|
|
239
|
+
'absolute right-1.5 top-0 h-full w-0.5 bg-border-default-secondary transition-opacity opacity-0',
|
|
240
|
+
!header.column.getIsResizing() && 'group-hover:opacity-100'
|
|
231
241
|
)}
|
|
232
242
|
></div>
|
|
233
243
|
</div>
|
|
@@ -246,9 +256,14 @@
|
|
|
246
256
|
>
|
|
247
257
|
{#each row.getVisibleCells() as cell, index (cell.id)}
|
|
248
258
|
{@const isLastScrollable = index === row.getVisibleCells().length - 2}
|
|
259
|
+
{@const visibleCells = row.getVisibleCells()}
|
|
260
|
+
{@const firstDataColumnIndex = visibleCells.findIndex(
|
|
261
|
+
(c) => c.column.id !== 'select' && c.column.id !== 'actions'
|
|
262
|
+
)}
|
|
263
|
+
{@const isFirstDataColumn = index === firstDataColumnIndex}
|
|
249
264
|
<Table.Cell
|
|
250
265
|
style={getCellStyle(cell, isLastScrollable)}
|
|
251
|
-
class={getCellClasses(cell, isLastScrollable)}
|
|
266
|
+
class={getCellClasses(cell, isLastScrollable, isFirstDataColumn)}
|
|
252
267
|
>
|
|
253
268
|
{#if cell.column.id === 'actions'}
|
|
254
269
|
{@render StickyCellWrapper({
|
|
@@ -297,7 +312,13 @@
|
|
|
297
312
|
</div>
|
|
298
313
|
</div>
|
|
299
314
|
{#if enablePagination}
|
|
300
|
-
<DataTablePagination
|
|
315
|
+
<DataTablePagination
|
|
316
|
+
{table}
|
|
317
|
+
selectedSlot={paginationSelectedSlot}
|
|
318
|
+
unselectedSlot={paginationUnselectedSlot}
|
|
319
|
+
{onPageChange}
|
|
320
|
+
{onPageSizeChange}
|
|
321
|
+
/>
|
|
301
322
|
{/if}
|
|
302
323
|
</div>
|
|
303
324
|
</div>
|
|
@@ -14,4 +14,4 @@ export declare function getCellStyle<TData>(cell: Cell<TData, unknown>, isLastSc
|
|
|
14
14
|
/**
|
|
15
15
|
* Calculate CSS classes for table cells
|
|
16
16
|
*/
|
|
17
|
-
export declare function getCellClasses<TData>(cell: Cell<TData, unknown>, isLastScrollable: boolean): string;
|
|
17
|
+
export declare function getCellClasses<TData>(cell: Cell<TData, unknown>, isLastScrollable: boolean, isFirstDataColumn?: boolean): string;
|
|
@@ -17,8 +17,8 @@ export function getHeaderStyle(header, isLastScrollable) {
|
|
|
17
17
|
*/
|
|
18
18
|
export function getHeaderClasses(header, isLastScrollable) {
|
|
19
19
|
return clsx('relative whitespace-nowrap overflow-hidden', {
|
|
20
|
-
'sticky right-0 text-right bg-
|
|
21
|
-
'sticky left-0 bg-
|
|
20
|
+
'sticky right-0 text-right bg-background': header.id === 'actions',
|
|
21
|
+
'sticky left-0 bg-background z-10': header.id === 'select',
|
|
22
22
|
'w-full': isLastScrollable,
|
|
23
23
|
'hover:!bg-transparent': !header.column.getCanSort()
|
|
24
24
|
});
|
|
@@ -39,10 +39,11 @@ export function getCellStyle(cell, isLastScrollable) {
|
|
|
39
39
|
/**
|
|
40
40
|
* Calculate CSS classes for table cells
|
|
41
41
|
*/
|
|
42
|
-
export function getCellClasses(cell, isLastScrollable) {
|
|
42
|
+
export function getCellClasses(cell, isLastScrollable, isFirstDataColumn = false) {
|
|
43
43
|
return clsx('whitespace-nowrap overflow-hidden', {
|
|
44
44
|
'sticky right-0 text-right !p-0': cell.column.id === 'actions',
|
|
45
45
|
'sticky left-0 !p-0 z-10': cell.column.id === 'select',
|
|
46
|
-
'w-full': isLastScrollable
|
|
46
|
+
'w-full': isLastScrollable,
|
|
47
|
+
'font-medium': isFirstDataColumn
|
|
47
48
|
});
|
|
48
49
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ import DrawerContext from './DrawerContext.svelte';
|
|
|
20
20
|
import DrawerContextItem from './DrawerContextItem.svelte';
|
|
21
21
|
import DrawerContextSeparator from './DrawerContextSeparator.svelte';
|
|
22
22
|
import DropdownSelect from './DropdownSelect.svelte';
|
|
23
|
+
import DropdownSelectGroup from './DropdownSelectGroup.svelte';
|
|
23
24
|
import EmptyState from './EmptyState.svelte';
|
|
24
25
|
import FeedEvents from './FeedEvents.svelte';
|
|
25
26
|
import FeedIconEvent from './FeedIconEvent.svelte';
|
|
@@ -81,4 +82,4 @@ import { FlexRender } from './data-table';
|
|
|
81
82
|
import { createSvelteTable } from './data-table';
|
|
82
83
|
import { renderComponent } from './data-table';
|
|
83
84
|
import { renderSnippet } from './data-table';
|
|
84
|
-
export { AlertDialog, BaseButton, BaseCard, BaseCounter, BaseDropdown, BaseFlag, BaseTable, BaseTableActions, BaseTableHeaderContent, Breadcrumbs, ButtonFile, ButtonUuidCopy, CardCheckbox, CardRelation, CompanySelector, CounterWidget, DataListItem, DatePicker, DrawerContext, DrawerContextItem, DrawerContextSeparator, DropdownSelect, EmptyState, FeedEvents, FeedIconEvent, FeedIconStatus, FeedItem, FeedItemDetail, FeedViewer, GlobalSearch, InputCheckbox, InputError, InputLabel, InputRadio, InputSearch, InputSelect, InputText, InputTextarea, InputToggle, MenuItem, MenuItemCollapsible, Notification, ProfileAvatar, ProgressBar, ProgressBarCircle, SeparatorHorizontal, ShortcutWrapper, StatusLabel, StepIconList, Table, TableBody, TableCaption, TableFooter, TableHeader, TableRow, TableHead, TableCell, Tabs, TabsContent, TabsList, TabsTrigger, TagBeta, TagProgress, TagSearch, TagStatus, TitleMain, TitleSection, Toaster, Tooltip, TooltipContent, TooltipTrigger, UuidCopy, resolveIcon, getCountryName, getStatusType, buttonVariants, DataTable, DataTableToolbar, DataTableViewOptions, FlexRender, createSvelteTable, renderComponent, renderSnippet };
|
|
85
|
+
export { AlertDialog, BaseButton, BaseCard, BaseCounter, BaseDropdown, BaseFlag, BaseTable, BaseTableActions, BaseTableHeaderContent, Breadcrumbs, ButtonFile, ButtonUuidCopy, CardCheckbox, CardRelation, CompanySelector, CounterWidget, DataListItem, DatePicker, DrawerContext, DrawerContextItem, DrawerContextSeparator, DropdownSelect, DropdownSelectGroup, EmptyState, FeedEvents, FeedIconEvent, FeedIconStatus, FeedItem, FeedItemDetail, FeedViewer, GlobalSearch, InputCheckbox, InputError, InputLabel, InputRadio, InputSearch, InputSelect, InputText, InputTextarea, InputToggle, MenuItem, MenuItemCollapsible, Notification, ProfileAvatar, ProgressBar, ProgressBarCircle, SeparatorHorizontal, ShortcutWrapper, StatusLabel, StepIconList, Table, TableBody, TableCaption, TableFooter, TableHeader, TableRow, TableHead, TableCell, Tabs, TabsContent, TabsList, TabsTrigger, TagBeta, TagProgress, TagSearch, TagStatus, TitleMain, TitleSection, Toaster, Tooltip, TooltipContent, TooltipTrigger, UuidCopy, resolveIcon, getCountryName, getStatusType, buttonVariants, DataTable, DataTableToolbar, DataTableViewOptions, FlexRender, createSvelteTable, renderComponent, renderSnippet };
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,7 @@ import DrawerContext from './DrawerContext.svelte'
|
|
|
20
20
|
import DrawerContextItem from './DrawerContextItem.svelte'
|
|
21
21
|
import DrawerContextSeparator from './DrawerContextSeparator.svelte'
|
|
22
22
|
import DropdownSelect from './DropdownSelect.svelte'
|
|
23
|
+
import DropdownSelectGroup from './DropdownSelectGroup.svelte'
|
|
23
24
|
import EmptyState from './EmptyState.svelte'
|
|
24
25
|
import FeedEvents from './FeedEvents.svelte'
|
|
25
26
|
import FeedIconEvent from './FeedIconEvent.svelte'
|
|
@@ -102,6 +103,7 @@ export {
|
|
|
102
103
|
DrawerContextItem,
|
|
103
104
|
DrawerContextSeparator,
|
|
104
105
|
DropdownSelect,
|
|
106
|
+
DropdownSelectGroup,
|
|
105
107
|
EmptyState,
|
|
106
108
|
FeedEvents,
|
|
107
109
|
FeedIconEvent,
|
package/dist/types.d.ts
CHANGED
|
@@ -168,6 +168,8 @@ export interface BaseButtonProps {
|
|
|
168
168
|
shortcut?: boolean;
|
|
169
169
|
fullwidth?: boolean;
|
|
170
170
|
notification?: boolean;
|
|
171
|
+
stackedLeft?: boolean;
|
|
172
|
+
stackedRight?: boolean;
|
|
171
173
|
children?: Snippet;
|
|
172
174
|
[key: string]: any;
|
|
173
175
|
onclick?: (event: MouseEvent) => void;
|
|
@@ -402,6 +404,9 @@ export interface DropdownSelectProps {
|
|
|
402
404
|
fullWidth?: boolean;
|
|
403
405
|
widthClass?: string;
|
|
404
406
|
onSelect?: (value: AnyProp) => void;
|
|
407
|
+
stackLeft?: boolean;
|
|
408
|
+
stackRight?: boolean;
|
|
409
|
+
multipleLabel?: string;
|
|
405
410
|
}
|
|
406
411
|
export interface EmptyStateProps {
|
|
407
412
|
icon?: Snippet;
|