@invopop/popui 0.1.97 → 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 (87) hide show
  1. package/dist/CounterWidget.svelte +18 -1
  2. package/dist/GlobalSearch.svelte +1 -1
  3. package/dist/MenuItem.svelte +1 -1
  4. package/dist/index.d.ts +36 -1
  5. package/dist/index.js +74 -0
  6. package/dist/separator/index.d.ts +2 -0
  7. package/dist/separator/index.js +4 -0
  8. package/dist/separator/separator.svelte +21 -0
  9. package/dist/separator/separator.svelte.d.ts +4 -0
  10. package/dist/sheet/index.d.ts +11 -0
  11. package/dist/sheet/index.js +13 -0
  12. package/dist/sheet/sheet-close.svelte +7 -0
  13. package/dist/sheet/sheet-close.svelte.d.ts +4 -0
  14. package/dist/sheet/sheet-content.svelte +65 -0
  15. package/dist/sheet/sheet-content.svelte.d.ts +15 -0
  16. package/dist/sheet/sheet-description.svelte +17 -0
  17. package/dist/sheet/sheet-description.svelte.d.ts +4 -0
  18. package/dist/sheet/sheet-footer.svelte +20 -0
  19. package/dist/sheet/sheet-footer.svelte.d.ts +5 -0
  20. package/dist/sheet/sheet-header.svelte +20 -0
  21. package/dist/sheet/sheet-header.svelte.d.ts +5 -0
  22. package/dist/sheet/sheet-overlay.svelte +20 -0
  23. package/dist/sheet/sheet-overlay.svelte.d.ts +4 -0
  24. package/dist/sheet/sheet-portal.svelte +7 -0
  25. package/dist/sheet/sheet-portal.svelte.d.ts +3 -0
  26. package/dist/sheet/sheet-title.svelte +17 -0
  27. package/dist/sheet/sheet-title.svelte.d.ts +4 -0
  28. package/dist/sheet/sheet-trigger.svelte +7 -0
  29. package/dist/sheet/sheet-trigger.svelte.d.ts +4 -0
  30. package/dist/sheet/sheet.svelte +7 -0
  31. package/dist/sheet/sheet.svelte.d.ts +3 -0
  32. package/dist/sidebar/constants.d.ts +10 -0
  33. package/dist/sidebar/constants.js +10 -0
  34. package/dist/sidebar/context.svelte.d.ts +23 -0
  35. package/dist/sidebar/context.svelte.js +58 -0
  36. package/dist/sidebar/index.d.ts +25 -0
  37. package/dist/sidebar/index.js +27 -0
  38. package/dist/sidebar/is-mobile.svelte.d.ts +4 -0
  39. package/dist/sidebar/is-mobile.svelte.js +7 -0
  40. package/dist/sidebar/sidebar-content.svelte +25 -0
  41. package/dist/sidebar/sidebar-content.svelte.d.ts +5 -0
  42. package/dist/sidebar/sidebar-footer.svelte +21 -0
  43. package/dist/sidebar/sidebar-footer.svelte.d.ts +5 -0
  44. package/dist/sidebar/sidebar-group-action.svelte +33 -0
  45. package/dist/sidebar/sidebar-group-action.svelte.d.ts +11 -0
  46. package/dist/sidebar/sidebar-group-content.svelte +21 -0
  47. package/dist/sidebar/sidebar-group-content.svelte.d.ts +5 -0
  48. package/dist/sidebar/sidebar-group-label.svelte +33 -0
  49. package/dist/sidebar/sidebar-group-label.svelte.d.ts +11 -0
  50. package/dist/sidebar/sidebar-group.svelte +21 -0
  51. package/dist/sidebar/sidebar-group.svelte.d.ts +5 -0
  52. package/dist/sidebar/sidebar-header.svelte +21 -0
  53. package/dist/sidebar/sidebar-header.svelte.d.ts +5 -0
  54. package/dist/sidebar/sidebar-input.svelte +23 -0
  55. package/dist/sidebar/sidebar-input.svelte.d.ts +5 -0
  56. package/dist/sidebar/sidebar-inset.svelte +23 -0
  57. package/dist/sidebar/sidebar-inset.svelte.d.ts +5 -0
  58. package/dist/sidebar/sidebar-menu-action.svelte +37 -0
  59. package/dist/sidebar/sidebar-menu-action.svelte.d.ts +12 -0
  60. package/dist/sidebar/sidebar-menu-badge.svelte +24 -0
  61. package/dist/sidebar/sidebar-menu-badge.svelte.d.ts +5 -0
  62. package/dist/sidebar/sidebar-menu-button.svelte +102 -0
  63. package/dist/sidebar/sidebar-menu-button.svelte.d.ts +51 -0
  64. package/dist/sidebar/sidebar-menu-item.svelte +21 -0
  65. package/dist/sidebar/sidebar-menu-item.svelte.d.ts +5 -0
  66. package/dist/sidebar/sidebar-menu-skeleton.svelte +35 -0
  67. package/dist/sidebar/sidebar-menu-skeleton.svelte.d.ts +8 -0
  68. package/dist/sidebar/sidebar-menu-sub-button.svelte +39 -0
  69. package/dist/sidebar/sidebar-menu-sub-button.svelte.d.ts +13 -0
  70. package/dist/sidebar/sidebar-menu-sub-item.svelte +21 -0
  71. package/dist/sidebar/sidebar-menu-sub-item.svelte.d.ts +5 -0
  72. package/dist/sidebar/sidebar-menu-sub.svelte +24 -0
  73. package/dist/sidebar/sidebar-menu-sub.svelte.d.ts +5 -0
  74. package/dist/sidebar/sidebar-menu.svelte +21 -0
  75. package/dist/sidebar/sidebar-menu.svelte.d.ts +5 -0
  76. package/dist/sidebar/sidebar-provider.svelte +47 -0
  77. package/dist/sidebar/sidebar-provider.svelte.d.ts +9 -0
  78. package/dist/sidebar/sidebar-rail.svelte +165 -0
  79. package/dist/sidebar/sidebar-rail.svelte.d.ts +5 -0
  80. package/dist/sidebar/sidebar-separator.svelte +19 -0
  81. package/dist/sidebar/sidebar-separator.svelte.d.ts +13 -0
  82. package/dist/sidebar/sidebar-trigger.svelte +35 -0
  83. package/dist/sidebar/sidebar-trigger.svelte.d.ts +5 -0
  84. package/dist/sidebar/sidebar.svelte +106 -0
  85. package/dist/sidebar/sidebar.svelte.d.ts +10 -0
  86. package/dist/tailwind.theme.css +20 -0
  87. package/package.json +2 -1
@@ -2,6 +2,7 @@
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'
6
7
  import ProgressBarCircle from './ProgressBarCircle.svelte'
7
8
 
@@ -25,9 +26,25 @@
25
26
  if (isWarning) return 'warning'
26
27
  return 'dark'
27
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
+ })
28
45
  </script>
29
46
 
30
- {#if collapsed}
47
+ {#if showCollapsed}
31
48
  <div
32
49
  class="size-8 p-1.75 flex items-center justify-center rounded-lg border border-transparent hover:bg-background-selected-inverse"
33
50
  title="{label}: {current}/{total}"
@@ -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
  )
@@ -46,7 +46,7 @@
46
46
  'pl-2': !collapsedSidebar && !imageUrl,
47
47
  'pl-[10px]': !collapsedSidebar && imageUrl,
48
48
  'gap-1.5': !collapsedSidebar && (action || collapsable),
49
- 'size-8 p-[7px] justify-center': collapsedSidebar,
49
+ 'size-8 p-[7px] justify-center mx-auto': collapsedSidebar,
50
50
  'bg-background-selected-inverse': active,
51
51
  'hover:bg-background-selected-inverse': !active
52
52
  })
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>
@@ -0,0 +1,15 @@
1
+ export type Side = 'top' | 'right' | 'bottom' | 'left';
2
+ import { Dialog as SheetPrimitive } from 'bits-ui';
3
+ import type { Snippet } from 'svelte';
4
+ import SheetPortal from './sheet-portal.svelte';
5
+ import { type WithoutChildrenOrChild } from '../utils.js';
6
+ import type { ComponentProps } from 'svelte';
7
+ type $$ComponentProps = WithoutChildrenOrChild<SheetPrimitive.ContentProps> & {
8
+ portalProps?: WithoutChildrenOrChild<ComponentProps<typeof SheetPortal>>;
9
+ side?: Side;
10
+ showCloseButton?: boolean;
11
+ children: Snippet;
12
+ };
13
+ declare const SheetContent: import("svelte").Component<$$ComponentProps, {}, "ref">;
14
+ type SheetContent = ReturnType<typeof SheetContent>;
15
+ export default SheetContent;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from 'bits-ui'
3
+ import { cn } from '../utils.js'
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ ...restProps
9
+ }: SheetPrimitive.DescriptionProps = $props()
10
+ </script>
11
+
12
+ <SheetPrimitive.Description
13
+ bind:ref
14
+ data-slot="sheet-description"
15
+ class={cn('text-foreground-secondary text-sm', className)}
16
+ {...restProps}
17
+ />
@@ -0,0 +1,4 @@
1
+ import { Dialog as SheetPrimitive } from 'bits-ui';
2
+ declare const SheetDescription: import("svelte").Component<SheetPrimitive.DescriptionProps, {}, "ref">;
3
+ type SheetDescription = ReturnType<typeof SheetDescription>;
4
+ export default SheetDescription;
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import { cn, type WithElementRef } from '../utils.js'
3
+ import type { HTMLAttributes } from 'svelte/elements'
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props()
11
+ </script>
12
+
13
+ <div
14
+ bind:this={ref}
15
+ data-slot="sheet-footer"
16
+ class={cn('mt-auto flex flex-col gap-2 p-4', className)}
17
+ {...restProps}
18
+ >
19
+ {@render children?.()}
20
+ </div>
@@ -0,0 +1,5 @@
1
+ import { type WithElementRef } from '../utils.js';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ declare const SheetFooter: import("svelte").Component<WithElementRef<HTMLAttributes<HTMLDivElement>>, {}, "ref">;
4
+ type SheetFooter = ReturnType<typeof SheetFooter>;
5
+ export default SheetFooter;
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements'
3
+ import { cn, type WithElementRef } from '../utils.js'
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props()
11
+ </script>
12
+
13
+ <div
14
+ bind:this={ref}
15
+ data-slot="sheet-header"
16
+ class={cn('flex flex-col gap-1.5 p-4', className)}
17
+ {...restProps}
18
+ >
19
+ {@render children?.()}
20
+ </div>
@@ -0,0 +1,5 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ import { type WithElementRef } from '../utils.js';
3
+ declare const SheetHeader: import("svelte").Component<WithElementRef<HTMLAttributes<HTMLDivElement>>, {}, "ref">;
4
+ type SheetHeader = ReturnType<typeof SheetHeader>;
5
+ export default SheetHeader;
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from 'bits-ui'
3
+ import { cn } from '../utils.js'
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ ...restProps
9
+ }: SheetPrimitive.OverlayProps = $props()
10
+ </script>
11
+
12
+ <SheetPrimitive.Overlay
13
+ bind:ref
14
+ data-slot="sheet-overlay"
15
+ class={cn(
16
+ 'fixed inset-0 z-50 bg-black/10 supports-[backdrop-filter]:backdrop-blur-xs',
17
+ className
18
+ )}
19
+ {...restProps}
20
+ />
@@ -0,0 +1,4 @@
1
+ import { Dialog as SheetPrimitive } from 'bits-ui';
2
+ declare const SheetOverlay: import("svelte").Component<SheetPrimitive.OverlayProps, {}, "ref">;
3
+ type SheetOverlay = ReturnType<typeof SheetOverlay>;
4
+ export default SheetOverlay;
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from 'bits-ui'
3
+
4
+ let { ...restProps }: SheetPrimitive.PortalProps = $props()
5
+ </script>
6
+
7
+ <SheetPrimitive.Portal {...restProps} />
@@ -0,0 +1,3 @@
1
+ declare const SheetPortal: import("svelte").Component<import("bits-ui").PortalProps, {}, "">;
2
+ type SheetPortal = ReturnType<typeof SheetPortal>;
3
+ export default SheetPortal;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from 'bits-ui'
3
+ import { cn } from '../utils.js'
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ ...restProps
9
+ }: SheetPrimitive.TitleProps = $props()
10
+ </script>
11
+
12
+ <SheetPrimitive.Title
13
+ bind:ref
14
+ data-slot="sheet-title"
15
+ class={cn('text-foreground font-medium', className)}
16
+ {...restProps}
17
+ />
@@ -0,0 +1,4 @@
1
+ import { Dialog as SheetPrimitive } from 'bits-ui';
2
+ declare const SheetTitle: import("svelte").Component<SheetPrimitive.TitleProps, {}, "ref">;
3
+ type SheetTitle = ReturnType<typeof SheetTitle>;
4
+ export default SheetTitle;
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from 'bits-ui'
3
+
4
+ let { ref = $bindable(null), ...restProps }: SheetPrimitive.TriggerProps = $props()
5
+ </script>
6
+
7
+ <SheetPrimitive.Trigger bind:ref data-slot="sheet-trigger" {...restProps} />
@@ -0,0 +1,4 @@
1
+ import { Dialog as SheetPrimitive } from 'bits-ui';
2
+ declare const SheetTrigger: import("svelte").Component<SheetPrimitive.TriggerProps, {}, "ref">;
3
+ type SheetTrigger = ReturnType<typeof SheetTrigger>;
4
+ export default SheetTrigger;
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as SheetPrimitive } from 'bits-ui'
3
+
4
+ let { open = $bindable(false), ...restProps }: SheetPrimitive.RootProps = $props()
5
+ </script>
6
+
7
+ <SheetPrimitive.Root bind:open {...restProps} />
@@ -0,0 +1,3 @@
1
+ declare const Sheet: import("svelte").Component<import("bits-ui").AlertDialogRootPropsWithoutHTML, {}, "open">;
2
+ type Sheet = ReturnType<typeof Sheet>;
3
+ export default Sheet;
@@ -0,0 +1,10 @@
1
+ export declare const SIDEBAR_COOKIE_NAME = "sidebar_state";
2
+ export declare const SIDEBAR_WIDTH_STORAGE_KEY = "sidebar_width";
3
+ export declare const SIDEBAR_COOKIE_MAX_AGE: number;
4
+ export declare const SIDEBAR_WIDTH = "16rem";
5
+ export declare const SIDEBAR_WIDTH_MOBILE = "18rem";
6
+ export declare const SIDEBAR_WIDTH_ICON = "3rem";
7
+ export declare const SIDEBAR_KEYBOARD_SHORTCUT = ".";
8
+ export declare const SIDEBAR_MIN_WIDTH_PX = 240;
9
+ export declare const SIDEBAR_MAX_WIDTH_PX = 384;
10
+ export declare const SIDEBAR_DRAG_THRESHOLD_PX = 4;
@@ -0,0 +1,10 @@
1
+ export const SIDEBAR_COOKIE_NAME = 'sidebar_state';
2
+ export const SIDEBAR_WIDTH_STORAGE_KEY = 'sidebar_width';
3
+ export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
4
+ export const SIDEBAR_WIDTH = '16rem';
5
+ export const SIDEBAR_WIDTH_MOBILE = '18rem';
6
+ export const SIDEBAR_WIDTH_ICON = '3rem';
7
+ export const SIDEBAR_KEYBOARD_SHORTCUT = '.';
8
+ export const SIDEBAR_MIN_WIDTH_PX = 240;
9
+ export const SIDEBAR_MAX_WIDTH_PX = 384;
10
+ export const SIDEBAR_DRAG_THRESHOLD_PX = 4;
@@ -0,0 +1,23 @@
1
+ type Getter<T> = () => T;
2
+ export type SidebarStateProps = {
3
+ open: Getter<boolean>;
4
+ setOpen: (open: boolean) => void;
5
+ };
6
+ declare class SidebarState {
7
+ #private;
8
+ readonly props: SidebarStateProps;
9
+ open: boolean;
10
+ openMobile: boolean;
11
+ width: string;
12
+ setOpen: SidebarStateProps['setOpen'];
13
+ state: string;
14
+ constructor(props: SidebarStateProps);
15
+ get isMobile(): boolean;
16
+ setWidth: (px: number) => void;
17
+ handleShortcutKeydown: (e: KeyboardEvent) => void;
18
+ setOpenMobile: (value: boolean) => void;
19
+ toggle: () => boolean | void;
20
+ }
21
+ export declare function setSidebar(props: SidebarStateProps): SidebarState;
22
+ export declare function useSidebar(): SidebarState;
23
+ export {};
@@ -0,0 +1,58 @@
1
+ import { getContext, setContext } from 'svelte';
2
+ import { SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_MAX_WIDTH_PX, SIDEBAR_MIN_WIDTH_PX, SIDEBAR_WIDTH, SIDEBAR_WIDTH_STORAGE_KEY } from './constants.js';
3
+ import { IsMobile } from './is-mobile.svelte.js';
4
+ class SidebarState {
5
+ props;
6
+ open = $derived.by(() => this.props.open());
7
+ openMobile = $state(false);
8
+ width = $state(SIDEBAR_WIDTH);
9
+ setOpen;
10
+ #isMobile;
11
+ state = $derived.by(() => (this.open ? 'expanded' : 'collapsed'));
12
+ constructor(props) {
13
+ this.setOpen = props.setOpen;
14
+ this.#isMobile = new IsMobile();
15
+ this.props = props;
16
+ if (typeof localStorage !== 'undefined') {
17
+ const stored = localStorage.getItem(SIDEBAR_WIDTH_STORAGE_KEY);
18
+ if (stored)
19
+ this.width = stored;
20
+ }
21
+ }
22
+ get isMobile() {
23
+ return this.#isMobile.current;
24
+ }
25
+ setWidth = (px) => {
26
+ const clamped = Math.max(SIDEBAR_MIN_WIDTH_PX, Math.min(SIDEBAR_MAX_WIDTH_PX, px));
27
+ this.width = `${clamped}px`;
28
+ if (typeof localStorage !== 'undefined') {
29
+ try {
30
+ localStorage.setItem(SIDEBAR_WIDTH_STORAGE_KEY, this.width);
31
+ }
32
+ catch {
33
+ // ignore quota / private-mode errors
34
+ }
35
+ }
36
+ };
37
+ handleShortcutKeydown = (e) => {
38
+ if (e.key === SIDEBAR_KEYBOARD_SHORTCUT && (e.metaKey || e.ctrlKey)) {
39
+ e.preventDefault();
40
+ this.toggle();
41
+ }
42
+ };
43
+ setOpenMobile = (value) => {
44
+ this.openMobile = value;
45
+ };
46
+ toggle = () => {
47
+ return this.#isMobile.current
48
+ ? (this.openMobile = !this.openMobile)
49
+ : this.setOpen(!this.open);
50
+ };
51
+ }
52
+ const SYMBOL_KEY = 'scn-sidebar';
53
+ export function setSidebar(props) {
54
+ return setContext(Symbol.for(SYMBOL_KEY), new SidebarState(props));
55
+ }
56
+ export function useSidebar() {
57
+ return getContext(Symbol.for(SYMBOL_KEY));
58
+ }