@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.
@@ -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
- `${selectedItems[0]?.label || ''}${selectedItems.length > 1 && multiple ? ' and more' : ''}` ||
48
- placeholder
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
- clsx('border backdrop-blur-sm backdrop-filter', {
53
- 'border-border-selected-bold shadow-active': isOpen,
54
- 'border-border-default-secondary hover:border-border-default-secondary-hover': !isOpen
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} dropdown-select flex items-center rounded-lg py-1.5 pl-2 pr-[28px] bg-background overflow-hidden w-full h-8"
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 selectedColor}
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;
@@ -19,7 +19,7 @@
19
19
  'bg-background-status-void text-foreground-default-secondary': status === 'grey',
20
20
  'shadow-avatar text-foreground-default-secondary': status === 'empty',
21
21
  'px-1.5': dot,
22
- 'p-1!': dot && !label,
22
+ 'p-0!': dot && !label,
23
23
  'px-1': !dot
24
24
  })
25
25
  )
@@ -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={() => table.setPageIndex(0)}
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={() => table.previousPage()}
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={() => table.nextPage()}
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={() => table.setPageIndex(totalPages - 1)}
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
- table.setPageSize(Number(value))
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
- {#if children}
142
- {@render children()}
143
- {/if}
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 {table} />
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-white': header.id === 'actions',
21
- 'sticky left-0 bg-white z-10': header.id === 'select',
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;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@invopop/popui",
3
3
  "license": "MIT",
4
- "version": "0.1.36.beta.1",
4
+ "version": "0.1.4-beta.1",
5
5
  "repository": {
6
6
  "url": "https://github.com/invopop/popui"
7
7
  },