@invopop/popui 0.1.96 → 0.1.98

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 (89) hide show
  1. package/dist/CounterWidget.svelte +65 -30
  2. package/dist/GlobalSearch.svelte +1 -1
  3. package/dist/MenuItem.svelte +106 -29
  4. package/dist/ProgressBarCircle.svelte +9 -6
  5. package/dist/index.d.ts +36 -1
  6. package/dist/index.js +74 -0
  7. package/dist/separator/index.d.ts +2 -0
  8. package/dist/separator/index.js +4 -0
  9. package/dist/separator/separator.svelte +21 -0
  10. package/dist/separator/separator.svelte.d.ts +4 -0
  11. package/dist/sheet/index.d.ts +11 -0
  12. package/dist/sheet/index.js +13 -0
  13. package/dist/sheet/sheet-close.svelte +7 -0
  14. package/dist/sheet/sheet-close.svelte.d.ts +4 -0
  15. package/dist/sheet/sheet-content.svelte +65 -0
  16. package/dist/sheet/sheet-content.svelte.d.ts +15 -0
  17. package/dist/sheet/sheet-description.svelte +17 -0
  18. package/dist/sheet/sheet-description.svelte.d.ts +4 -0
  19. package/dist/sheet/sheet-footer.svelte +20 -0
  20. package/dist/sheet/sheet-footer.svelte.d.ts +5 -0
  21. package/dist/sheet/sheet-header.svelte +20 -0
  22. package/dist/sheet/sheet-header.svelte.d.ts +5 -0
  23. package/dist/sheet/sheet-overlay.svelte +20 -0
  24. package/dist/sheet/sheet-overlay.svelte.d.ts +4 -0
  25. package/dist/sheet/sheet-portal.svelte +7 -0
  26. package/dist/sheet/sheet-portal.svelte.d.ts +3 -0
  27. package/dist/sheet/sheet-title.svelte +17 -0
  28. package/dist/sheet/sheet-title.svelte.d.ts +4 -0
  29. package/dist/sheet/sheet-trigger.svelte +7 -0
  30. package/dist/sheet/sheet-trigger.svelte.d.ts +4 -0
  31. package/dist/sheet/sheet.svelte +7 -0
  32. package/dist/sheet/sheet.svelte.d.ts +3 -0
  33. package/dist/sidebar/constants.d.ts +10 -0
  34. package/dist/sidebar/constants.js +10 -0
  35. package/dist/sidebar/context.svelte.d.ts +23 -0
  36. package/dist/sidebar/context.svelte.js +58 -0
  37. package/dist/sidebar/index.d.ts +25 -0
  38. package/dist/sidebar/index.js +27 -0
  39. package/dist/sidebar/is-mobile.svelte.d.ts +4 -0
  40. package/dist/sidebar/is-mobile.svelte.js +7 -0
  41. package/dist/sidebar/sidebar-content.svelte +25 -0
  42. package/dist/sidebar/sidebar-content.svelte.d.ts +5 -0
  43. package/dist/sidebar/sidebar-footer.svelte +21 -0
  44. package/dist/sidebar/sidebar-footer.svelte.d.ts +5 -0
  45. package/dist/sidebar/sidebar-group-action.svelte +33 -0
  46. package/dist/sidebar/sidebar-group-action.svelte.d.ts +11 -0
  47. package/dist/sidebar/sidebar-group-content.svelte +21 -0
  48. package/dist/sidebar/sidebar-group-content.svelte.d.ts +5 -0
  49. package/dist/sidebar/sidebar-group-label.svelte +33 -0
  50. package/dist/sidebar/sidebar-group-label.svelte.d.ts +11 -0
  51. package/dist/sidebar/sidebar-group.svelte +21 -0
  52. package/dist/sidebar/sidebar-group.svelte.d.ts +5 -0
  53. package/dist/sidebar/sidebar-header.svelte +21 -0
  54. package/dist/sidebar/sidebar-header.svelte.d.ts +5 -0
  55. package/dist/sidebar/sidebar-input.svelte +23 -0
  56. package/dist/sidebar/sidebar-input.svelte.d.ts +5 -0
  57. package/dist/sidebar/sidebar-inset.svelte +23 -0
  58. package/dist/sidebar/sidebar-inset.svelte.d.ts +5 -0
  59. package/dist/sidebar/sidebar-menu-action.svelte +37 -0
  60. package/dist/sidebar/sidebar-menu-action.svelte.d.ts +12 -0
  61. package/dist/sidebar/sidebar-menu-badge.svelte +24 -0
  62. package/dist/sidebar/sidebar-menu-badge.svelte.d.ts +5 -0
  63. package/dist/sidebar/sidebar-menu-button.svelte +102 -0
  64. package/dist/sidebar/sidebar-menu-button.svelte.d.ts +51 -0
  65. package/dist/sidebar/sidebar-menu-item.svelte +21 -0
  66. package/dist/sidebar/sidebar-menu-item.svelte.d.ts +5 -0
  67. package/dist/sidebar/sidebar-menu-skeleton.svelte +35 -0
  68. package/dist/sidebar/sidebar-menu-skeleton.svelte.d.ts +8 -0
  69. package/dist/sidebar/sidebar-menu-sub-button.svelte +39 -0
  70. package/dist/sidebar/sidebar-menu-sub-button.svelte.d.ts +13 -0
  71. package/dist/sidebar/sidebar-menu-sub-item.svelte +21 -0
  72. package/dist/sidebar/sidebar-menu-sub-item.svelte.d.ts +5 -0
  73. package/dist/sidebar/sidebar-menu-sub.svelte +24 -0
  74. package/dist/sidebar/sidebar-menu-sub.svelte.d.ts +5 -0
  75. package/dist/sidebar/sidebar-menu.svelte +21 -0
  76. package/dist/sidebar/sidebar-menu.svelte.d.ts +5 -0
  77. package/dist/sidebar/sidebar-provider.svelte +47 -0
  78. package/dist/sidebar/sidebar-provider.svelte.d.ts +9 -0
  79. package/dist/sidebar/sidebar-rail.svelte +165 -0
  80. package/dist/sidebar/sidebar-rail.svelte.d.ts +5 -0
  81. package/dist/sidebar/sidebar-separator.svelte +19 -0
  82. package/dist/sidebar/sidebar-separator.svelte.d.ts +13 -0
  83. package/dist/sidebar/sidebar-trigger.svelte +35 -0
  84. package/dist/sidebar/sidebar-trigger.svelte.d.ts +5 -0
  85. package/dist/sidebar/sidebar.svelte +106 -0
  86. package/dist/sidebar/sidebar.svelte.d.ts +10 -0
  87. package/dist/tailwind.theme.css +20 -0
  88. package/dist/types.d.ts +3 -1
  89. package/package.json +2 -1
@@ -2,7 +2,9 @@
2
2
  import type { CounterWidgetProps } from './types'
3
3
  import { Icon } from '@steeze-ui/svelte-icon'
4
4
  import { Warning, Failure } from '@invopop/ui-icons'
5
+ import { untrack } from 'svelte'
5
6
  import ProgressBar from './ProgressBar.svelte'
7
+ import ProgressBarCircle from './ProgressBarCircle.svelte'
6
8
 
7
9
  let {
8
10
  label,
@@ -10,43 +12,76 @@
10
12
  total,
11
13
  resetDate = '',
12
14
  icon,
13
- allowOverage = true
15
+ allowOverage = true,
16
+ collapsed = false
14
17
  }: CounterWidgetProps = $props()
15
18
 
16
- let percentage = $derived(total > 0 ? (current / total) * 100 : 0)
19
+ let progress = $derived(total > 0 ? current / total : 0)
20
+ let percentage = $derived(progress * 100)
17
21
  let isOverage = $derived(current > total && allowOverage)
18
22
  let isCritical = $derived(percentage >= 100 || (current > total && !allowOverage))
19
23
  let isWarning = $derived(percentage >= 80 && percentage < 100)
24
+ let circleVariant = $derived.by<'dark' | 'warning' | 'critical'>(() => {
25
+ if (isCritical) return 'critical'
26
+ if (isWarning) return 'warning'
27
+ return 'dark'
28
+ })
29
+
30
+ const EXPAND_DELAY_MS = 200
31
+ let showCollapsed = $state(untrack(() => collapsed))
32
+ let expandTimer: ReturnType<typeof setTimeout> | null = null
33
+
34
+ $effect(() => {
35
+ if (expandTimer) clearTimeout(expandTimer)
36
+ if (collapsed) {
37
+ showCollapsed = true
38
+ } else {
39
+ expandTimer = setTimeout(() => (showCollapsed = false), EXPAND_DELAY_MS)
40
+ }
41
+ return () => {
42
+ if (expandTimer) clearTimeout(expandTimer)
43
+ }
44
+ })
20
45
  </script>
21
46
 
22
- <div class="border border-border-inverse rounded-xl w-full py-[5px] pl-2 pr-1.5 flex flex-col">
23
- <div class="flex items-center justify-between text-base font-medium">
24
- <div class="flex items-center gap-1.5">
25
- {#if icon}
26
- <Icon src={icon} class="size-3 text-icon-inverse rounded-xs" />
27
- {/if}
28
- <span class="font-medium text-foreground-inverse">
29
- {label}
30
- </span>
47
+ {#if showCollapsed}
48
+ <div
49
+ class="size-8 p-1.75 flex items-center justify-center rounded-lg border border-transparent hover:bg-background-selected-inverse"
50
+ title="{label}: {current}/{total}"
51
+ data-counter-widget-collapsed
52
+ >
53
+ <ProgressBarCircle {progress} size={16} variant={circleVariant} />
54
+ </div>
55
+ {:else}
56
+ <div class="border border-border-inverse rounded-xl w-full py-[5px] pl-2 pr-1.5 flex flex-col">
57
+ <div class="flex items-center justify-between text-base font-medium">
58
+ <div class="flex items-center gap-1.5">
59
+ {#if icon}
60
+ <Icon src={icon} class="size-3 text-icon-inverse rounded-xs" />
61
+ {/if}
62
+ <span class="font-medium text-foreground-inverse">
63
+ {label}
64
+ </span>
65
+ </div>
66
+ <div class="flex items-center gap-1.5">
67
+ {#if isCritical && !isOverage}
68
+ <Icon src={Failure} class="size-4 text-icon-critical-inverse" />
69
+ {:else if isWarning && !isOverage}
70
+ <Icon src={Warning} class="size-4 text-icon-warning-inverse" />
71
+ {/if}
72
+ <span class="font-mono text-foreground-inverse">
73
+ {current}<span class="text-white/70">/{total}</span>
74
+ </span>
75
+ </div>
31
76
  </div>
32
- <div class="flex items-center gap-1.5">
33
- {#if isCritical && !isOverage}
34
- <Icon src={Failure} class="size-4 text-icon-critical-inverse" />
35
- {:else if isWarning && !isOverage}
36
- <Icon src={Warning} class="size-4 text-icon-warning-inverse" />
37
- {/if}
38
- <span class="font-mono text-foreground-inverse">
39
- {current}<span class="text-white/70">/{total}</span>
40
- </span>
77
+ <div class="py-2">
78
+ <ProgressBar {percentage} {current} {total} {allowOverage} />
41
79
  </div>
42
- </div>
43
- <div class="py-2">
44
- <ProgressBar {percentage} {current} {total} {allowOverage} />
45
- </div>
46
80
 
47
- {#if resetDate}
48
- <span class="text-sm font-normal text-foreground-inverse-secondary">
49
- {label} reset {resetDate}
50
- </span>
51
- {/if}
52
- </div>
81
+ {#if resetDate}
82
+ <span class="text-sm font-normal text-foreground-inverse-secondary">
83
+ {label} reset {resetDate}
84
+ </span>
85
+ {/if}
86
+ </div>
87
+ {/if}
@@ -15,7 +15,7 @@
15
15
  'cursor-pointer flex items-center border border-border-inverse-default rounded-lg box-border',
16
16
  {
17
17
  'gap-1 px-2 py-1.5 w-full hover:bg-background-selected-inverse h-8': !collapsed,
18
- 'p-2 size-8': collapsed
18
+ 'p-2 size-8 mx-auto': collapsed
19
19
  }
20
20
  )
21
21
  )
@@ -1,13 +1,22 @@
1
1
  <script lang="ts">
2
2
  import MenuItem from './MenuItem.svelte'
3
+ import { flip, shift, offset } from 'svelte-floating-ui/dom'
4
+ import { createFloatingActions } from 'svelte-floating-ui'
3
5
  import clsx from 'clsx'
4
6
  import { cn } from './utils.js'
5
- import type { MenuItemProps } from './types.ts'
7
+ import type { MenuItemProps, DrawerOption, AnyProp } from './types.ts'
6
8
  import { Icon, type IconSource } from '@steeze-ui/svelte-icon'
7
- import { ChevronDown, ChevronRight } from '@invopop/ui-icons'
9
+ import { ChevronDown, ChevronRight, FolderL } from '@invopop/ui-icons'
8
10
  import { resolveIcon } from './helpers.js'
11
+ import DrawerContext from './DrawerContext.svelte'
9
12
  import TagBeta from './TagBeta.svelte'
10
13
 
14
+ const [floatingRef, floatingContent] = createFloatingActions({
15
+ strategy: 'absolute',
16
+ placement: 'bottom-start',
17
+ middleware: [offset(-4), flip(), shift()]
18
+ })
19
+
11
20
  let {
12
21
  label = '',
13
22
  url = '',
@@ -15,6 +24,7 @@
15
24
  collapsable = false,
16
25
  open = $bindable(false),
17
26
  active = false,
27
+ collapsedSidebar = false,
18
28
  iconTheme = 'default',
19
29
  icon = undefined,
20
30
  imageUrl = undefined,
@@ -27,28 +37,46 @@
27
37
  }: MenuItemProps = $props()
28
38
 
29
39
  let resolvedIcon: IconSource | undefined = $state()
40
+ let hovered = $state(false)
41
+ let highlight = $state(false)
42
+ let leaveHoverTimeout: ReturnType<typeof setTimeout> | null = null
30
43
  let rowStyles = $derived(
31
- clsx('flex items-center rounded-lg border border-transparent p-1', {
32
- 'gap-1.5': action || collapsable,
44
+ clsx('flex items-center rounded-lg border border-transparent', {
45
+ 'py-1 pr-1': !collapsedSidebar,
46
+ 'pl-2': !collapsedSidebar && !imageUrl,
47
+ 'pl-[10px]': !collapsedSidebar && imageUrl,
48
+ 'gap-1.5': !collapsedSidebar && (action || collapsable),
49
+ 'size-8 p-[7px] justify-center mx-auto': collapsedSidebar,
33
50
  'bg-background-selected-inverse': active,
34
51
  'hover:bg-background-selected-inverse': !active
35
52
  })
36
53
  )
37
54
  let buttonStyles = $derived(
38
- clsx(
39
- 'flex-1 min-w-0 h-6 cursor-pointer text-base flex items-center hover:text-white focus:text-white',
40
- {
41
- 'text-foreground-inverse font-medium': !isFolderItem,
42
- 'text-foreground-inverse-secondary': isFolderItem && !active,
43
- 'text-white': active
44
- }
45
- )
55
+ clsx('cursor-pointer text-base flex items-center hover:text-white focus:text-white', {
56
+ 'flex-1 min-w-0 h-6': !collapsedSidebar,
57
+ 'group': collapsedSidebar,
58
+ 'text-foreground-inverse font-medium': !isFolderItem,
59
+ 'text-foreground-inverse-secondary': isFolderItem && !active,
60
+ 'text-white': active
61
+ })
62
+ )
63
+ let iconStyles = $derived(
64
+ clsx({ 'group-hover:text-white text-icon-inverse-bold!': collapsedSidebar })
46
65
  )
47
66
  let wrapperStyles = $derived(
48
67
  clsx({
49
68
  'group/menu-item ml-4 border-l border-white-10 pl-2 pt-0.5 relative': isFolderItem
50
69
  })
51
70
  )
71
+ let items = $derived([
72
+ { label, value: url, selected: active, icon: resolvedIcon },
73
+ ...(children || []).map((c) => ({
74
+ label: c.label || '',
75
+ value: c.url || '',
76
+ selected: c.active,
77
+ icon: FolderL
78
+ }))
79
+ ] as DrawerOption[])
52
80
 
53
81
  $effect(() => {
54
82
  resolveIcon(icon).then((res) => (resolvedIcon = res))
@@ -61,25 +89,58 @@
61
89
 
62
90
  onclick?.(url)
63
91
  }
92
+
93
+ function handleClickChild(value: AnyProp) {
94
+ hovered = false
95
+ onclick?.(value as string)
96
+ }
97
+
98
+ function handleHover() {
99
+ highlight = true
100
+ if (leaveHoverTimeout) {
101
+ clearTimeout(leaveHoverTimeout)
102
+ }
103
+ hovered = true
104
+ }
105
+
106
+ function handleBlur() {
107
+ highlight = false
108
+ leaveHoverTimeout = setTimeout(() => {
109
+ hovered = false
110
+ }, 200)
111
+ }
64
112
  </script>
65
113
 
66
114
  <div bind:this={ref} class={cn(wrapperStyles, className)} data-menu-item-root>
67
115
  {#if isFolderItem}
68
116
  <div
69
117
  class={clsx('border-l border-white h-3 w-px absolute top-3.5 left-0 -m-px', {
70
- 'opacity-0 group-hover/menu-item:opacity-100': !active
118
+ 'opacity-0 group-hover/menu-item:opacity-100': !active && !collapsedSidebar,
119
+ 'opacity-0': collapsedSidebar && !highlight && !active
71
120
  })}
72
121
  data-menu-item-tree-indicator
73
122
  ></div>
74
123
  {/if}
75
- <div class={rowStyles} data-menu-item-row>
124
+ <div
125
+ class={rowStyles}
126
+ data-menu-item-row
127
+ use:floatingRef
128
+ onmouseenter={collapsedSidebar ? handleHover : undefined}
129
+ onmouseleave={collapsedSidebar ? handleBlur : undefined}
130
+ role={collapsedSidebar ? 'presentation' : undefined}
131
+ >
76
132
  <button
77
133
  onclick={handleClick}
78
134
  title={label}
79
135
  data-menu-item-button
80
136
  class={buttonStyles}
81
137
  >
82
- <span class="flex items-center space-x-1.5 min-w-0 flex-1" data-menu-item-content>
138
+ <span
139
+ class={clsx('flex items-center', {
140
+ 'space-x-1.5 min-w-0 flex-1': !collapsedSidebar
141
+ })}
142
+ data-menu-item-content
143
+ >
83
144
  {#if imageUrl}
84
145
  <img
85
146
  src={imageUrl}
@@ -91,22 +152,24 @@
91
152
  <Icon
92
153
  src={resolvedIcon}
93
154
  theme={iconTheme}
94
- class="h-4 w-4 text-icon-inverse"
155
+ class="{iconStyles} h-4 w-4 text-icon-inverse"
95
156
  data-menu-item-icon
96
157
  />
97
158
  {/if}
98
- <span class="truncate tracking-normal" data-menu-item-label>{label}</span>
99
- {#if beta}
100
- <TagBeta />
159
+ {#if !collapsedSidebar}
160
+ <span class="truncate tracking-normal" data-menu-item-label>{label}</span>
161
+ {#if beta}
162
+ <TagBeta />
163
+ {/if}
101
164
  {/if}
102
165
  </span>
103
166
  </button>
104
- {#if action}
167
+ {#if !collapsedSidebar && action}
105
168
  <span class="shrink-0" data-menu-item-action>
106
169
  {@render action()}
107
170
  </span>
108
171
  {/if}
109
- {#if collapsable}
172
+ {#if !collapsedSidebar && collapsable}
110
173
  <button
111
174
  class="shrink-0 cursor-pointer"
112
175
  data-menu-item-chevron
@@ -116,13 +179,27 @@
116
179
  </button>
117
180
  {/if}
118
181
  </div>
119
- {#if children?.length && (open || !collapsable)}
120
- <ul data-menu-item-children>
121
- {#each children as child}
122
- <li>
123
- <MenuItem {...child} isFolderItem {onclick} />
124
- </li>
125
- {/each}
126
- </ul>
182
+ {#if children?.length}
183
+ {#if collapsedSidebar}
184
+ {#if hovered}
185
+ <div
186
+ use:floatingContent
187
+ role="contentinfo"
188
+ onmouseenter={handleHover}
189
+ onmouseleave={handleBlur}
190
+ class="pt-4 z-30"
191
+ >
192
+ <DrawerContext autofocus onclick={handleClickChild} {items} />
193
+ </div>
194
+ {/if}
195
+ {:else if open || !collapsable}
196
+ <ul data-menu-item-children>
197
+ {#each children as child}
198
+ <li>
199
+ <MenuItem {...child} isFolderItem {onclick} />
200
+ </li>
201
+ {/each}
202
+ </ul>
203
+ {/if}
127
204
  {/if}
128
205
  </div>
@@ -4,13 +4,16 @@
4
4
  let { progress, size, variant = 'default' }: ProgressBarCircleProps = $props()
5
5
 
6
6
  let angle = $derived(360 * progress)
7
- let filledColor = $derived(
8
- variant === 'dark' ? 'var(--color-icon-inverse-bold)' : 'var(--color-icon-selected-default)'
9
- )
7
+ let filledColor = $derived.by(() => {
8
+ if (variant === 'critical') return 'var(--color-background-critical-inverse)'
9
+ if (variant === 'warning') return 'var(--color-background-warning-inverse)'
10
+ if (variant === 'dark') return 'var(--color-icon-inverse-bold)'
11
+ return 'var(--color-icon-selected-default)'
12
+ })
10
13
  let restColor = $derived(
11
- variant === 'dark'
12
- ? 'var(--color-background-selected-inverse-hover)'
13
- : 'var(--color-background-default-tertiary)'
14
+ variant === 'default'
15
+ ? 'var(--color-background-default-tertiary)'
16
+ : 'var(--color-background-selected-inverse-hover)'
14
17
  )
15
18
  let background = $derived(
16
19
  `conic-gradient(${filledColor} 0deg ${angle}deg, ${restColor} ${angle}deg 360deg)`
package/dist/index.d.ts CHANGED
@@ -77,6 +77,41 @@ import { TooltipContent } from './tooltip';
77
77
  import { TooltipTrigger } from './tooltip';
78
78
  import { TooltipProvider } from './tooltip';
79
79
  import { TooltipAutoHide } from './tooltip';
80
+ import { Separator } from './separator';
81
+ import { Sheet } from './sheet';
82
+ import { SheetClose } from './sheet';
83
+ import { SheetContent } from './sheet';
84
+ import { SheetDescription } from './sheet';
85
+ import { SheetFooter } from './sheet';
86
+ import { SheetHeader } from './sheet';
87
+ import { SheetOverlay } from './sheet';
88
+ import { SheetPortal } from './sheet';
89
+ import { SheetTitle } from './sheet';
90
+ import { SheetTrigger } from './sheet';
91
+ import { Sidebar } from './sidebar';
92
+ import { SidebarContent } from './sidebar';
93
+ import { SidebarFooter } from './sidebar';
94
+ import { SidebarGroup } from './sidebar';
95
+ import { SidebarGroupAction } from './sidebar';
96
+ import { SidebarGroupContent } from './sidebar';
97
+ import { SidebarGroupLabel } from './sidebar';
98
+ import { SidebarHeader } from './sidebar';
99
+ import { SidebarInput } from './sidebar';
100
+ import { SidebarInset } from './sidebar';
101
+ import { SidebarMenu } from './sidebar';
102
+ import { SidebarMenuAction } from './sidebar';
103
+ import { SidebarMenuBadge } from './sidebar';
104
+ import { SidebarMenuButton } from './sidebar';
105
+ import { SidebarMenuItem } from './sidebar';
106
+ import { SidebarMenuSkeleton } from './sidebar';
107
+ import { SidebarMenuSub } from './sidebar';
108
+ import { SidebarMenuSubButton } from './sidebar';
109
+ import { SidebarMenuSubItem } from './sidebar';
110
+ import { SidebarProvider } from './sidebar';
111
+ import { SidebarRail } from './sidebar';
112
+ import { SidebarSeparator } from './sidebar';
113
+ import { SidebarTrigger } from './sidebar';
114
+ import { useSidebar } from './sidebar';
80
115
  import { resolveIcon } from './helpers.js';
81
116
  import { getCountryName } from './helpers.js';
82
117
  import { getStatusType } from './helpers.js';
@@ -88,4 +123,4 @@ import { FlexRender } from './data-table';
88
123
  import { createSvelteTable } from './data-table';
89
124
  import { renderComponent } from './data-table';
90
125
  import { renderSnippet } from './data-table';
91
- export { Accordion, AlertDialog, BaseButton, BaseCard, BaseCounter, BaseDropdown, BaseFlag, BaseTableActions, Breadcrumbs, ButtonFile, ButtonSearch, 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, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonList, StatusLabel, AvatarIcon, AvatarStack, Table, TableBody, TableCaption, TableFooter, TableHeader, TableRow, TableHead, TableCell, Tabs, TabsContent, TabsList, TabsTrigger, TagBeta, TagProgress, TagSearch, TagStatus, TitleMain, TitleSection, Toaster, Tooltip, TooltipContent, TooltipTrigger, TooltipProvider, TooltipAutoHide, resolveIcon, getCountryName, getStatusType, buttonVariants, DataTable, DataTableToolbar, DataTableViewOptions, FlexRender, createSvelteTable, renderComponent, renderSnippet };
126
+ export { Accordion, AlertDialog, BaseButton, BaseCard, BaseCounter, BaseDropdown, BaseFlag, BaseTableActions, Breadcrumbs, ButtonFile, ButtonSearch, 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, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonList, StatusLabel, AvatarIcon, AvatarStack, Table, TableBody, TableCaption, TableFooter, TableHeader, TableRow, TableHead, TableCell, Tabs, TabsContent, TabsList, TabsTrigger, TagBeta, TagProgress, TagSearch, TagStatus, TitleMain, TitleSection, Toaster, Tooltip, TooltipContent, TooltipTrigger, TooltipProvider, TooltipAutoHide, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, resolveIcon, getCountryName, getStatusType, buttonVariants, DataTable, DataTableToolbar, DataTableViewOptions, FlexRender, createSvelteTable, renderComponent, renderSnippet };
package/dist/index.js CHANGED
@@ -69,6 +69,45 @@ import TitleMain from './TitleMain.svelte'
69
69
  import TitleSection from './TitleSection.svelte'
70
70
  import { Toaster } from './sonner'
71
71
  import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider, TooltipAutoHide } from './tooltip'
72
+ import { Separator } from './separator'
73
+ import {
74
+ Sheet,
75
+ SheetClose,
76
+ SheetContent,
77
+ SheetDescription,
78
+ SheetFooter,
79
+ SheetHeader,
80
+ SheetOverlay,
81
+ SheetPortal,
82
+ SheetTitle,
83
+ SheetTrigger
84
+ } from './sheet'
85
+ import {
86
+ Sidebar,
87
+ SidebarContent,
88
+ SidebarFooter,
89
+ SidebarGroup,
90
+ SidebarGroupAction,
91
+ SidebarGroupContent,
92
+ SidebarGroupLabel,
93
+ SidebarHeader,
94
+ SidebarInput,
95
+ SidebarInset,
96
+ SidebarMenu,
97
+ SidebarMenuAction,
98
+ SidebarMenuBadge,
99
+ SidebarMenuButton,
100
+ SidebarMenuItem,
101
+ SidebarMenuSkeleton,
102
+ SidebarMenuSub,
103
+ SidebarMenuSubButton,
104
+ SidebarMenuSubItem,
105
+ SidebarProvider,
106
+ SidebarRail,
107
+ SidebarSeparator,
108
+ SidebarTrigger,
109
+ useSidebar
110
+ } from './sidebar'
72
111
  import { resolveIcon, getCountryName, getStatusType } from './helpers.js'
73
112
  import { buttonVariants } from './button/button.svelte' // Ensure button styles are included
74
113
  import {
@@ -161,6 +200,41 @@ export {
161
200
  TooltipTrigger,
162
201
  TooltipProvider,
163
202
  TooltipAutoHide,
203
+ Separator,
204
+ Sheet,
205
+ SheetClose,
206
+ SheetContent,
207
+ SheetDescription,
208
+ SheetFooter,
209
+ SheetHeader,
210
+ SheetOverlay,
211
+ SheetPortal,
212
+ SheetTitle,
213
+ SheetTrigger,
214
+ Sidebar,
215
+ SidebarContent,
216
+ SidebarFooter,
217
+ SidebarGroup,
218
+ SidebarGroupAction,
219
+ SidebarGroupContent,
220
+ SidebarGroupLabel,
221
+ SidebarHeader,
222
+ SidebarInput,
223
+ SidebarInset,
224
+ SidebarMenu,
225
+ SidebarMenuAction,
226
+ SidebarMenuBadge,
227
+ SidebarMenuButton,
228
+ SidebarMenuItem,
229
+ SidebarMenuSkeleton,
230
+ SidebarMenuSub,
231
+ SidebarMenuSubButton,
232
+ SidebarMenuSubItem,
233
+ SidebarProvider,
234
+ SidebarRail,
235
+ SidebarSeparator,
236
+ SidebarTrigger,
237
+ useSidebar,
164
238
  resolveIcon,
165
239
  getCountryName,
166
240
  getStatusType,
@@ -0,0 +1,2 @@
1
+ import Root from './separator.svelte';
2
+ export { Root, Root as Separator };
@@ -0,0 +1,4 @@
1
+ import Root from './separator.svelte';
2
+ export { Root,
3
+ //
4
+ Root as Separator };
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import { Separator as SeparatorPrimitive } from 'bits-ui'
3
+ import { cn } from '../utils.js'
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ 'data-slot': dataSlot = 'separator',
9
+ ...restProps
10
+ }: SeparatorPrimitive.RootProps = $props()
11
+ </script>
12
+
13
+ <SeparatorPrimitive.Root
14
+ bind:ref
15
+ data-slot={dataSlot}
16
+ class={cn(
17
+ 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:h-full',
18
+ className
19
+ )}
20
+ {...restProps}
21
+ />
@@ -0,0 +1,4 @@
1
+ import { Separator as SeparatorPrimitive } from 'bits-ui';
2
+ declare const Separator: import("svelte").Component<SeparatorPrimitive.RootProps, {}, "ref">;
3
+ type Separator = ReturnType<typeof Separator>;
4
+ export default Separator;
@@ -0,0 +1,11 @@
1
+ import Root from './sheet.svelte';
2
+ import Portal from './sheet-portal.svelte';
3
+ import Trigger from './sheet-trigger.svelte';
4
+ import Close from './sheet-close.svelte';
5
+ import Overlay from './sheet-overlay.svelte';
6
+ import Content from './sheet-content.svelte';
7
+ import Header from './sheet-header.svelte';
8
+ import Footer from './sheet-footer.svelte';
9
+ import Title from './sheet-title.svelte';
10
+ import Description from './sheet-description.svelte';
11
+ export { Root, Close, Trigger, Portal, Overlay, Content, Header, Footer, Title, Description, Root as Sheet, Close as SheetClose, Trigger as SheetTrigger, Portal as SheetPortal, Overlay as SheetOverlay, Content as SheetContent, Header as SheetHeader, Footer as SheetFooter, Title as SheetTitle, Description as SheetDescription };
@@ -0,0 +1,13 @@
1
+ import Root from './sheet.svelte';
2
+ import Portal from './sheet-portal.svelte';
3
+ import Trigger from './sheet-trigger.svelte';
4
+ import Close from './sheet-close.svelte';
5
+ import Overlay from './sheet-overlay.svelte';
6
+ import Content from './sheet-content.svelte';
7
+ import Header from './sheet-header.svelte';
8
+ import Footer from './sheet-footer.svelte';
9
+ import Title from './sheet-title.svelte';
10
+ import Description from './sheet-description.svelte';
11
+ export { Root, Close, Trigger, Portal, Overlay, Content, Header, Footer, Title, Description,
12
+ //
13
+ Root as Sheet, Close as SheetClose, Trigger as SheetTrigger, Portal as SheetPortal, Overlay as SheetOverlay, Content as SheetContent, Header as SheetHeader, Footer as SheetFooter, Title as SheetTitle, Description as SheetDescription };
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from 'bits-ui'
3
+
4
+ let { ref = $bindable(null), ...restProps }: SheetPrimitive.CloseProps = $props()
5
+ </script>
6
+
7
+ <SheetPrimitive.Close bind:ref data-slot="sheet-close" {...restProps} />
@@ -0,0 +1,4 @@
1
+ import { Dialog as SheetPrimitive } from 'bits-ui';
2
+ declare const SheetClose: import("svelte").Component<SheetPrimitive.TriggerProps, {}, "ref">;
3
+ type SheetClose = ReturnType<typeof SheetClose>;
4
+ export default SheetClose;
@@ -0,0 +1,65 @@
1
+ <script lang="ts" module>
2
+ export type Side = 'top' | 'right' | 'bottom' | 'left'
3
+ </script>
4
+
5
+ <script lang="ts">
6
+ import { Dialog as SheetPrimitive } from 'bits-ui'
7
+ import { Close } from '@invopop/ui-icons'
8
+ import { Icon } from '@steeze-ui/svelte-icon'
9
+ import type { Snippet } from 'svelte'
10
+ import SheetPortal from './sheet-portal.svelte'
11
+ import SheetOverlay from './sheet-overlay.svelte'
12
+ import { cn, type WithoutChildrenOrChild } from '../utils.js'
13
+ import type { ComponentProps } from 'svelte'
14
+
15
+ let {
16
+ ref = $bindable(null),
17
+ class: className,
18
+ side = 'right',
19
+ showCloseButton = true,
20
+ portalProps,
21
+ children,
22
+ ...restProps
23
+ }: WithoutChildrenOrChild<SheetPrimitive.ContentProps> & {
24
+ portalProps?: WithoutChildrenOrChild<ComponentProps<typeof SheetPortal>>
25
+ side?: Side
26
+ showCloseButton?: boolean
27
+ children: Snippet
28
+ } = $props()
29
+ </script>
30
+
31
+ <SheetPortal {...portalProps}>
32
+ <SheetOverlay />
33
+ <SheetPrimitive.Content
34
+ bind:ref
35
+ data-slot="sheet-content"
36
+ data-side={side}
37
+ class={cn(
38
+ 'bg-background text-foreground fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out',
39
+ 'data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t',
40
+ 'data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r',
41
+ 'data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l',
42
+ 'data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b',
43
+ 'data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm',
44
+ 'data-[state=open]:animate-in data-[state=open]:fade-in-0',
45
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0',
46
+ 'data-[side=bottom]:data-[state=open]:slide-in-from-bottom data-[side=bottom]:data-[state=closed]:slide-out-to-bottom',
47
+ 'data-[side=left]:data-[state=open]:slide-in-from-left data-[side=left]:data-[state=closed]:slide-out-to-left',
48
+ 'data-[side=right]:data-[state=open]:slide-in-from-right data-[side=right]:data-[state=closed]:slide-out-to-right',
49
+ 'data-[side=top]:data-[state=open]:slide-in-from-top data-[side=top]:data-[state=closed]:slide-out-to-top',
50
+ className
51
+ )}
52
+ {...restProps}
53
+ >
54
+ {@render children?.()}
55
+ {#if showCloseButton}
56
+ <SheetPrimitive.Close
57
+ data-slot="sheet-close"
58
+ class="absolute top-4 right-4 rounded-md p-1 opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
59
+ >
60
+ <Icon src={Close} class="size-4" />
61
+ <span class="sr-only">Close</span>
62
+ </SheetPrimitive.Close>
63
+ {/if}
64
+ </SheetPrimitive.Content>
65
+ </SheetPortal>