@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.
- package/dist/CounterWidget.svelte +18 -1
- package/dist/GlobalSearch.svelte +1 -1
- package/dist/MenuItem.svelte +1 -1
- package/dist/index.d.ts +36 -1
- package/dist/index.js +74 -0
- package/dist/separator/index.d.ts +2 -0
- package/dist/separator/index.js +4 -0
- package/dist/separator/separator.svelte +21 -0
- package/dist/separator/separator.svelte.d.ts +4 -0
- package/dist/sheet/index.d.ts +11 -0
- package/dist/sheet/index.js +13 -0
- package/dist/sheet/sheet-close.svelte +7 -0
- package/dist/sheet/sheet-close.svelte.d.ts +4 -0
- package/dist/sheet/sheet-content.svelte +65 -0
- package/dist/sheet/sheet-content.svelte.d.ts +15 -0
- package/dist/sheet/sheet-description.svelte +17 -0
- package/dist/sheet/sheet-description.svelte.d.ts +4 -0
- package/dist/sheet/sheet-footer.svelte +20 -0
- package/dist/sheet/sheet-footer.svelte.d.ts +5 -0
- package/dist/sheet/sheet-header.svelte +20 -0
- package/dist/sheet/sheet-header.svelte.d.ts +5 -0
- package/dist/sheet/sheet-overlay.svelte +20 -0
- package/dist/sheet/sheet-overlay.svelte.d.ts +4 -0
- package/dist/sheet/sheet-portal.svelte +7 -0
- package/dist/sheet/sheet-portal.svelte.d.ts +3 -0
- package/dist/sheet/sheet-title.svelte +17 -0
- package/dist/sheet/sheet-title.svelte.d.ts +4 -0
- package/dist/sheet/sheet-trigger.svelte +7 -0
- package/dist/sheet/sheet-trigger.svelte.d.ts +4 -0
- package/dist/sheet/sheet.svelte +7 -0
- package/dist/sheet/sheet.svelte.d.ts +3 -0
- package/dist/sidebar/constants.d.ts +10 -0
- package/dist/sidebar/constants.js +10 -0
- package/dist/sidebar/context.svelte.d.ts +23 -0
- package/dist/sidebar/context.svelte.js +58 -0
- package/dist/sidebar/index.d.ts +25 -0
- package/dist/sidebar/index.js +27 -0
- package/dist/sidebar/is-mobile.svelte.d.ts +4 -0
- package/dist/sidebar/is-mobile.svelte.js +7 -0
- package/dist/sidebar/sidebar-content.svelte +25 -0
- package/dist/sidebar/sidebar-content.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-footer.svelte +21 -0
- package/dist/sidebar/sidebar-footer.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-group-action.svelte +33 -0
- package/dist/sidebar/sidebar-group-action.svelte.d.ts +11 -0
- package/dist/sidebar/sidebar-group-content.svelte +21 -0
- package/dist/sidebar/sidebar-group-content.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-group-label.svelte +33 -0
- package/dist/sidebar/sidebar-group-label.svelte.d.ts +11 -0
- package/dist/sidebar/sidebar-group.svelte +21 -0
- package/dist/sidebar/sidebar-group.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-header.svelte +21 -0
- package/dist/sidebar/sidebar-header.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-input.svelte +23 -0
- package/dist/sidebar/sidebar-input.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-inset.svelte +23 -0
- package/dist/sidebar/sidebar-inset.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu-action.svelte +37 -0
- package/dist/sidebar/sidebar-menu-action.svelte.d.ts +12 -0
- package/dist/sidebar/sidebar-menu-badge.svelte +24 -0
- package/dist/sidebar/sidebar-menu-badge.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu-button.svelte +102 -0
- package/dist/sidebar/sidebar-menu-button.svelte.d.ts +51 -0
- package/dist/sidebar/sidebar-menu-item.svelte +21 -0
- package/dist/sidebar/sidebar-menu-item.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu-skeleton.svelte +35 -0
- package/dist/sidebar/sidebar-menu-skeleton.svelte.d.ts +8 -0
- package/dist/sidebar/sidebar-menu-sub-button.svelte +39 -0
- package/dist/sidebar/sidebar-menu-sub-button.svelte.d.ts +13 -0
- package/dist/sidebar/sidebar-menu-sub-item.svelte +21 -0
- package/dist/sidebar/sidebar-menu-sub-item.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu-sub.svelte +24 -0
- package/dist/sidebar/sidebar-menu-sub.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu.svelte +21 -0
- package/dist/sidebar/sidebar-menu.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-provider.svelte +47 -0
- package/dist/sidebar/sidebar-provider.svelte.d.ts +9 -0
- package/dist/sidebar/sidebar-rail.svelte +165 -0
- package/dist/sidebar/sidebar-rail.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-separator.svelte +19 -0
- package/dist/sidebar/sidebar-separator.svelte.d.ts +13 -0
- package/dist/sidebar/sidebar-trigger.svelte +35 -0
- package/dist/sidebar/sidebar-trigger.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar.svelte +106 -0
- package/dist/sidebar/sidebar.svelte.d.ts +10 -0
- package/dist/tailwind.theme.css +20 -0
- 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
|
|
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}"
|
package/dist/GlobalSearch.svelte
CHANGED
|
@@ -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
|
)
|
package/dist/MenuItem.svelte
CHANGED
|
@@ -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,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,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,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,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,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,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
|
+
}
|