betterstart-cli 0.0.106 → 0.0.108
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/assets/adapters/next/templates/init/admin-globals.css +1 -61
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-header.tsx +2 -19
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-nav-link.tsx +10 -8
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-providers.tsx +4 -7
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link-skeleton.tsx +1 -5
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu.tsx +53 -48
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sign-out.tsx +2 -2
- package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table-pagination.tsx +3 -1
- package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +3 -5
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx +2 -5
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-code-mirror.tsx +4 -5
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-types.ts +0 -1
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/lifecycle-hooks-tab.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/snippets-tab.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +5 -7
- package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +9 -10
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +2 -4
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-restore-dialog.tsx +2 -4
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +2 -4
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog.tsx +2 -2
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-dialog.tsx +5 -5
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +52 -53
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-pagination.tsx +3 -1
- package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +3 -5
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +2 -11
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor.ts +1 -2
- package/dist/assets/adapters/next/templates/init/pages/dashboard-page.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/pages/forgot-password-form.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/pages/login-form.tsx +2 -2
- package/dist/assets/adapters/next/templates/init/pages/reset-password-form.tsx +2 -2
- package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-detail-drawer.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/pages/settings/forms/form-notifications-drawer.tsx +5 -5
- package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-actions.tsx +20 -20
- package/dist/assets/adapters/next/templates/init/pages/users/change-password-dialog.tsx +7 -5
- package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +3 -5
- package/dist/assets/adapters/next/templates/init/pages/users/create-user-dialog.tsx +1 -3
- package/dist/assets/adapters/next/templates/init/pages/users/delete-user-dialog.tsx +11 -5
- package/dist/assets/adapters/next/templates/init/pages/users/edit-role-dialog.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/main-toolbar-content.tsx +3 -3
- package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +13 -11
- package/dist/assets/shared-assets/react-admin/custom/content-editor/mobile-toolbar-content.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/selection-bubble-menu.tsx +1 -5
- package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode-dropdown-button.tsx +16 -14
- package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +5 -17
- package/dist/assets/shared-assets/react-admin/custom/content-editor/table-bubble-menu.tsx +0 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/table-button.tsx +14 -12
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +2 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +2 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +2 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +16 -14
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover.tsx +15 -13
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx +32 -30
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-control-popover.tsx +17 -14
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx +23 -21
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +2 -1
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +2 -1
- package/dist/assets/shared-assets/react-admin/custom/date-picker.tsx +16 -14
- package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +8 -6
- package/dist/assets/shared-assets/react-admin/custom/icon-picker.tsx +8 -7
- package/dist/assets/shared-assets/react-admin/custom/nested-object-list-field.tsx +2 -4
- package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +11 -28
- package/dist/assets/shared-assets/react-admin/ui/alert-dialog.tsx +30 -47
- package/dist/assets/shared-assets/react-admin/ui/alert.tsx +4 -4
- package/dist/assets/shared-assets/react-admin/ui/aspect-ratio.tsx +18 -5
- package/dist/assets/shared-assets/react-admin/ui/avatar.tsx +10 -13
- package/dist/assets/shared-assets/react-admin/ui/badge.tsx +24 -21
- package/dist/assets/shared-assets/react-admin/ui/breadcrumb.tsx +20 -19
- package/dist/assets/shared-assets/react-admin/ui/button-group.tsx +25 -24
- package/dist/assets/shared-assets/react-admin/ui/button.tsx +22 -31
- package/dist/assets/shared-assets/react-admin/ui/calendar.tsx +10 -7
- package/dist/assets/shared-assets/react-admin/ui/card.tsx +6 -16
- package/dist/assets/shared-assets/react-admin/ui/carousel.tsx +20 -17
- package/dist/assets/shared-assets/react-admin/ui/chart.tsx +18 -26
- package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +3 -4
- package/dist/assets/shared-assets/react-admin/ui/collapsible.tsx +6 -10
- package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +9 -25
- package/dist/assets/shared-assets/react-admin/ui/command.tsx +7 -6
- package/dist/assets/shared-assets/react-admin/ui/context-menu.tsx +77 -79
- package/dist/assets/shared-assets/react-admin/ui/dialog.tsx +29 -54
- package/dist/assets/shared-assets/react-admin/ui/direction.tsx +1 -18
- package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +121 -49
- package/dist/assets/shared-assets/react-admin/ui/dropdown-menu.tsx +120 -131
- package/dist/assets/shared-assets/react-admin/ui/empty.tsx +3 -3
- package/dist/assets/shared-assets/react-admin/ui/field.tsx +20 -30
- package/dist/assets/shared-assets/react-admin/ui/form.tsx +27 -31
- package/dist/assets/shared-assets/react-admin/ui/hover-card.tsx +26 -18
- package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +26 -13
- package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +3 -3
- package/dist/assets/shared-assets/react-admin/ui/input.tsx +4 -3
- package/dist/assets/shared-assets/react-admin/ui/item.tsx +26 -19
- package/dist/assets/shared-assets/react-admin/ui/kbd.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/label.tsx +18 -14
- package/dist/assets/shared-assets/react-admin/ui/menubar.tsx +80 -73
- package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +3 -3
- package/dist/assets/shared-assets/react-admin/ui/navigation-menu.tsx +40 -39
- package/dist/assets/shared-assets/react-admin/ui/pagination.tsx +18 -11
- package/dist/assets/shared-assets/react-admin/ui/popover.tsx +31 -30
- package/dist/assets/shared-assets/react-admin/ui/progress.tsx +51 -16
- package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +11 -17
- package/dist/assets/shared-assets/react-admin/ui/resizable.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/scroll-area.tsx +9 -13
- package/dist/assets/shared-assets/react-admin/ui/select.tsx +66 -60
- package/dist/assets/shared-assets/react-admin/ui/separator.tsx +3 -10
- package/dist/assets/shared-assets/react-admin/ui/sheet.tsx +22 -27
- package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +144 -126
- package/dist/assets/shared-assets/react-admin/ui/skeleton.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/slider.tsx +27 -29
- package/dist/assets/shared-assets/react-admin/ui/sonner.tsx +10 -8
- package/dist/assets/shared-assets/react-admin/ui/spinner.tsx +4 -3
- package/dist/assets/shared-assets/react-admin/ui/switch.tsx +4 -5
- package/dist/assets/shared-assets/react-admin/ui/table.tsx +8 -21
- package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +11 -16
- package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +2 -2
- package/dist/assets/shared-assets/react-admin/ui/toggle-group.tsx +12 -11
- package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +4 -5
- package/dist/assets/shared-assets/react-admin/ui/tooltip.tsx +29 -27
- package/dist/{chunk-OYU73Q2W.js → chunk-PSDUGFMD.js} +2 -2
- package/dist/{chunk-OYU73Q2W.js.map → chunk-PSDUGFMD.js.map} +1 -1
- package/dist/cli.js +122 -137
- package/dist/cli.js.map +1 -1
- package/dist/{read-namespaced-template-EIH2NPDJ.js → read-namespaced-template-TSATYQPP.js} +2 -2
- package/package.json +1 -1
- package/dist/assets/adapters/next/templates/init/hooks/use-admin-theme.tsx +0 -72
- package/dist/assets/adapters/next/templates/init/utils/theme/system.ts +0 -6
- /package/dist/{read-namespaced-template-EIH2NPDJ.js.map → read-namespaced-template-TSATYQPP.js.map} +0 -0
|
@@ -1,36 +1,33 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import * as React from 'react'
|
|
4
4
|
import { Button } from '@admin/components/ui/button'
|
|
5
5
|
import { cn } from '@admin/utils/shared/cn'
|
|
6
|
+
import { Dialog as SheetPrimitive } from '@base-ui/react/dialog'
|
|
6
7
|
import { XIcon } from 'lucide-react'
|
|
7
|
-
import { Dialog as SheetPrimitive } from 'radix-ui'
|
|
8
8
|
|
|
9
|
-
function Sheet({ ...props }:
|
|
9
|
+
function Sheet({ ...props }: SheetPrimitive.Root.Props) {
|
|
10
10
|
return <SheetPrimitive.Root data-slot="sheet" {...props} />
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
function SheetTrigger({ ...props }:
|
|
13
|
+
function SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {
|
|
14
14
|
return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
function SheetClose({ ...props }:
|
|
17
|
+
function SheetClose({ ...props }: SheetPrimitive.Close.Props) {
|
|
18
18
|
return <SheetPrimitive.Close data-slot="sheet-close" {...props} />
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
function SheetPortal({ ...props }:
|
|
21
|
+
function SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {
|
|
22
22
|
return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
function SheetOverlay({
|
|
26
|
-
className,
|
|
27
|
-
...props
|
|
28
|
-
}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {
|
|
25
|
+
function SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {
|
|
29
26
|
return (
|
|
30
|
-
<SheetPrimitive.
|
|
27
|
+
<SheetPrimitive.Backdrop
|
|
31
28
|
data-slot="sheet-overlay"
|
|
32
29
|
className={cn(
|
|
33
|
-
'fixed inset-0 z-50 bg-black/80 duration-
|
|
30
|
+
'fixed inset-0 z-50 bg-black/80 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs',
|
|
34
31
|
className
|
|
35
32
|
)}
|
|
36
33
|
{...props}
|
|
@@ -44,32 +41,33 @@ function SheetContent({
|
|
|
44
41
|
side = 'right',
|
|
45
42
|
showCloseButton = true,
|
|
46
43
|
...props
|
|
47
|
-
}:
|
|
44
|
+
}: SheetPrimitive.Popup.Props & {
|
|
48
45
|
side?: 'top' | 'right' | 'bottom' | 'left'
|
|
49
46
|
showCloseButton?: boolean
|
|
50
47
|
}) {
|
|
51
48
|
return (
|
|
52
49
|
<SheetPortal>
|
|
53
50
|
<SheetOverlay />
|
|
54
|
-
<SheetPrimitive.
|
|
51
|
+
<SheetPrimitive.Popup
|
|
55
52
|
data-slot="sheet-content"
|
|
56
53
|
data-side={side}
|
|
57
54
|
className={cn(
|
|
58
|
-
'fixed z-50 flex flex-col bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=
|
|
55
|
+
'fixed z-50 flex flex-col bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] 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 data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] 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 data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm',
|
|
59
56
|
className
|
|
60
57
|
)}
|
|
61
58
|
{...props}
|
|
62
59
|
>
|
|
63
60
|
{children}
|
|
64
61
|
{showCloseButton && (
|
|
65
|
-
<SheetPrimitive.Close
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
<SheetPrimitive.Close
|
|
63
|
+
data-slot="sheet-close"
|
|
64
|
+
render={<Button variant="ghost" className="absolute top-4 right-4" size="icon-sm" />}
|
|
65
|
+
>
|
|
66
|
+
<XIcon />
|
|
67
|
+
<span className="sr-only">Close</span>
|
|
70
68
|
</SheetPrimitive.Close>
|
|
71
69
|
)}
|
|
72
|
-
</SheetPrimitive.
|
|
70
|
+
</SheetPrimitive.Popup>
|
|
73
71
|
</SheetPortal>
|
|
74
72
|
)
|
|
75
73
|
}
|
|
@@ -94,20 +92,17 @@ function SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {
|
|
|
94
92
|
)
|
|
95
93
|
}
|
|
96
94
|
|
|
97
|
-
function SheetTitle({ className, ...props }:
|
|
95
|
+
function SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {
|
|
98
96
|
return (
|
|
99
97
|
<SheetPrimitive.Title
|
|
100
98
|
data-slot="sheet-title"
|
|
101
|
-
className={cn('font-heading text-base font-medium text-foreground', className)}
|
|
99
|
+
className={cn('cn-font-heading text-base font-medium text-foreground', className)}
|
|
102
100
|
{...props}
|
|
103
101
|
/>
|
|
104
102
|
)
|
|
105
103
|
}
|
|
106
104
|
|
|
107
|
-
function SheetDescription({
|
|
108
|
-
className,
|
|
109
|
-
...props
|
|
110
|
-
}: React.ComponentProps<typeof SheetPrimitive.Description>) {
|
|
105
|
+
function SheetDescription({ className, ...props }: SheetPrimitive.Description.Props) {
|
|
111
106
|
return (
|
|
112
107
|
<SheetPrimitive.Description
|
|
113
108
|
data-slot="sheet-description"
|
|
@@ -16,9 +16,10 @@ import { Skeleton } from '@admin/components/ui/skeleton'
|
|
|
16
16
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@admin/components/ui/tooltip'
|
|
17
17
|
import { useIsMobile } from '@admin/hooks/use-mobile'
|
|
18
18
|
import { cn } from '@admin/utils/shared/cn'
|
|
19
|
+
import { mergeProps } from '@base-ui/react/merge-props'
|
|
20
|
+
import { useRender } from '@base-ui/react/use-render'
|
|
19
21
|
import { cva } from 'class-variance-authority'
|
|
20
22
|
import { PanelLeftIcon } from 'lucide-react'
|
|
21
|
-
import { Slot } from 'radix-ui'
|
|
22
23
|
|
|
23
24
|
const SIDEBAR_COOKIE_NAME = 'sidebar_state'
|
|
24
25
|
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
|
|
@@ -27,14 +28,6 @@ const SIDEBAR_WIDTH_MOBILE = '18rem'
|
|
|
27
28
|
const SIDEBAR_WIDTH_ICON = '3rem'
|
|
28
29
|
const SIDEBAR_KEYBOARD_SHORTCUT = 'b'
|
|
29
30
|
|
|
30
|
-
type SidebarCookieStore = {
|
|
31
|
-
set: (options: { name: string; value: string; path: string; expires: number }) => Promise<void>
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
type WindowWithCookieStore = Window & {
|
|
35
|
-
cookieStore?: SidebarCookieStore
|
|
36
|
-
}
|
|
37
|
-
|
|
38
31
|
type SidebarContextProps = {
|
|
39
32
|
state: 'expanded' | 'collapsed'
|
|
40
33
|
open: boolean
|
|
@@ -72,6 +65,8 @@ function SidebarProvider({
|
|
|
72
65
|
const isMobile = useIsMobile()
|
|
73
66
|
const [openMobile, setOpenMobile] = React.useState(false)
|
|
74
67
|
|
|
68
|
+
// This is the internal state of the sidebar.
|
|
69
|
+
// We use openProp and setOpenProp for control from outside the component.
|
|
75
70
|
const [_open, _setOpen] = React.useState(defaultOpen)
|
|
76
71
|
const open = openProp ?? _open
|
|
77
72
|
const setOpen = React.useCallback(
|
|
@@ -83,21 +78,18 @@ function SidebarProvider({
|
|
|
83
78
|
_setOpen(openState)
|
|
84
79
|
}
|
|
85
80
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
name: SIDEBAR_COOKIE_NAME,
|
|
89
|
-
value: String(openState),
|
|
90
|
-
path: '/',
|
|
91
|
-
expires: Date.now() + SIDEBAR_COOKIE_MAX_AGE * 1000
|
|
92
|
-
})
|
|
81
|
+
// This sets the cookie to keep the sidebar state.
|
|
82
|
+
document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
|
|
93
83
|
},
|
|
94
84
|
[setOpenProp, open]
|
|
95
85
|
)
|
|
96
86
|
|
|
87
|
+
// Helper to toggle the sidebar.
|
|
97
88
|
const toggleSidebar = React.useCallback(() => {
|
|
98
89
|
return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)
|
|
99
|
-
}, [isMobile, setOpen])
|
|
90
|
+
}, [isMobile, setOpen, setOpenMobile])
|
|
100
91
|
|
|
92
|
+
// Adds a keyboard shortcut to toggle the sidebar.
|
|
101
93
|
React.useEffect(() => {
|
|
102
94
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
103
95
|
if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
|
|
@@ -110,6 +102,8 @@ function SidebarProvider({
|
|
|
110
102
|
return () => window.removeEventListener('keydown', handleKeyDown)
|
|
111
103
|
}, [toggleSidebar])
|
|
112
104
|
|
|
105
|
+
// We add a state so that we can do data-state="expanded" or "collapsed".
|
|
106
|
+
// This makes it easier to style the sidebar with Tailwind classes.
|
|
113
107
|
const state = open ? 'expanded' : 'collapsed'
|
|
114
108
|
|
|
115
109
|
const contextValue = React.useMemo<SidebarContextProps>(
|
|
@@ -122,7 +116,7 @@ function SidebarProvider({
|
|
|
122
116
|
setOpenMobile,
|
|
123
117
|
toggleSidebar
|
|
124
118
|
}),
|
|
125
|
-
[state, open, setOpen, isMobile, openMobile, toggleSidebar]
|
|
119
|
+
[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
|
|
126
120
|
)
|
|
127
121
|
|
|
128
122
|
return (
|
|
@@ -232,10 +226,13 @@ function Sidebar({
|
|
|
232
226
|
data-slot="sidebar-container"
|
|
233
227
|
data-side={side}
|
|
234
228
|
className={cn(
|
|
235
|
-
'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width)
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
229
|
+
'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex',
|
|
230
|
+
{
|
|
231
|
+
'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]':
|
|
232
|
+
variant === 'floating' || variant === 'inset',
|
|
233
|
+
'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l':
|
|
234
|
+
variant !== 'floating' && variant !== 'inset'
|
|
235
|
+
},
|
|
239
236
|
className
|
|
240
237
|
)}
|
|
241
238
|
{...props}
|
|
@@ -243,7 +240,7 @@ function Sidebar({
|
|
|
243
240
|
<div
|
|
244
241
|
data-sidebar="sidebar"
|
|
245
242
|
data-slot="sidebar-inner"
|
|
246
|
-
className="flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-
|
|
243
|
+
className="flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border"
|
|
247
244
|
>
|
|
248
245
|
{children}
|
|
249
246
|
</div>
|
|
@@ -268,7 +265,7 @@ function SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<t
|
|
|
268
265
|
}}
|
|
269
266
|
{...props}
|
|
270
267
|
>
|
|
271
|
-
<PanelLeftIcon />
|
|
268
|
+
<PanelLeftIcon className="cn-rtl-flip" />
|
|
272
269
|
<span className="sr-only">Toggle Sidebar</span>
|
|
273
270
|
</Button>
|
|
274
271
|
)
|
|
@@ -304,7 +301,7 @@ function SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {
|
|
|
304
301
|
<main
|
|
305
302
|
data-slot="sidebar-inset"
|
|
306
303
|
className={cn(
|
|
307
|
-
'relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-
|
|
304
|
+
'relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',
|
|
308
305
|
className
|
|
309
306
|
)}
|
|
310
307
|
{...props}
|
|
@@ -362,7 +359,7 @@ function SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {
|
|
|
362
359
|
data-slot="sidebar-content"
|
|
363
360
|
data-sidebar="content"
|
|
364
361
|
className={cn(
|
|
365
|
-
'no-scrollbar flex min-h-0 flex-1 flex-col gap-
|
|
362
|
+
'no-scrollbar flex min-h-0 flex-1 flex-col gap-2 overflow-auto [--radius:var(--radius-xl)] group-data-[collapsible=icon]:overflow-hidden',
|
|
366
363
|
className
|
|
367
364
|
)}
|
|
368
365
|
{...props}
|
|
@@ -375,7 +372,7 @@ function SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {
|
|
|
375
372
|
<div
|
|
376
373
|
data-slot="sidebar-group"
|
|
377
374
|
data-sidebar="group"
|
|
378
|
-
className={cn('relative flex w-full min-w-0 flex-col
|
|
375
|
+
className={cn('relative flex w-full min-w-0 flex-col p-2', className)}
|
|
379
376
|
{...props}
|
|
380
377
|
/>
|
|
381
378
|
)
|
|
@@ -383,42 +380,50 @@ function SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {
|
|
|
383
380
|
|
|
384
381
|
function SidebarGroupLabel({
|
|
385
382
|
className,
|
|
386
|
-
|
|
383
|
+
render,
|
|
387
384
|
...props
|
|
388
|
-
}:
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
385
|
+
}: useRender.ComponentProps<'div'> & React.ComponentProps<'div'>) {
|
|
386
|
+
return useRender({
|
|
387
|
+
defaultTagName: 'div',
|
|
388
|
+
props: mergeProps<'div'>(
|
|
389
|
+
{
|
|
390
|
+
className: cn(
|
|
391
|
+
'flex h-8 shrink-0 items-center rounded-md px-3 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',
|
|
392
|
+
className
|
|
393
|
+
)
|
|
394
|
+
},
|
|
395
|
+
props
|
|
396
|
+
),
|
|
397
|
+
render,
|
|
398
|
+
state: {
|
|
399
|
+
slot: 'sidebar-group-label',
|
|
400
|
+
sidebar: 'group-label'
|
|
401
|
+
}
|
|
402
|
+
})
|
|
402
403
|
}
|
|
403
404
|
|
|
404
405
|
function SidebarGroupAction({
|
|
405
406
|
className,
|
|
406
|
-
|
|
407
|
+
render,
|
|
407
408
|
...props
|
|
408
|
-
}:
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
409
|
+
}: useRender.ComponentProps<'button'> & React.ComponentProps<'button'>) {
|
|
410
|
+
return useRender({
|
|
411
|
+
defaultTagName: 'button',
|
|
412
|
+
props: mergeProps<'button'>(
|
|
413
|
+
{
|
|
414
|
+
className: cn(
|
|
415
|
+
'absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0',
|
|
416
|
+
className
|
|
417
|
+
)
|
|
418
|
+
},
|
|
419
|
+
props
|
|
420
|
+
),
|
|
421
|
+
render,
|
|
422
|
+
state: {
|
|
423
|
+
slot: 'sidebar-group-action',
|
|
424
|
+
sidebar: 'group-action'
|
|
425
|
+
}
|
|
426
|
+
})
|
|
422
427
|
}
|
|
423
428
|
|
|
424
429
|
function SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {
|
|
@@ -455,13 +460,13 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {
|
|
|
455
460
|
}
|
|
456
461
|
|
|
457
462
|
const sidebarMenuButtonVariants = cva(
|
|
458
|
-
'peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-
|
|
463
|
+
'peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-lg px-3 py-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate',
|
|
459
464
|
{
|
|
460
465
|
variants: {
|
|
461
466
|
variant: {
|
|
462
|
-
default: 'hover:bg-sidebar-accent
|
|
467
|
+
default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',
|
|
463
468
|
outline:
|
|
464
|
-
'bg-background shadow-[
|
|
469
|
+
'bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]'
|
|
465
470
|
},
|
|
466
471
|
size: {
|
|
467
472
|
default: 'h-9 text-sm',
|
|
@@ -477,34 +482,38 @@ const sidebarMenuButtonVariants = cva(
|
|
|
477
482
|
)
|
|
478
483
|
|
|
479
484
|
function SidebarMenuButton({
|
|
480
|
-
|
|
485
|
+
render,
|
|
481
486
|
isActive = false,
|
|
482
487
|
variant = 'default',
|
|
483
488
|
size = 'default',
|
|
484
489
|
tooltip,
|
|
485
490
|
className,
|
|
486
491
|
...props
|
|
487
|
-
}:
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
} & VariantProps<typeof sidebarMenuButtonVariants>) {
|
|
492
|
-
const Comp = asChild ? Slot.Root : 'button'
|
|
492
|
+
}: useRender.ComponentProps<'button'> &
|
|
493
|
+
React.ComponentProps<'button'> & {
|
|
494
|
+
isActive?: boolean
|
|
495
|
+
tooltip?: string | React.ComponentProps<typeof TooltipContent>
|
|
496
|
+
} & VariantProps<typeof sidebarMenuButtonVariants>) {
|
|
493
497
|
const { isMobile, state } = useSidebar()
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
<
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
498
|
+
const comp = useRender({
|
|
499
|
+
defaultTagName: 'button',
|
|
500
|
+
props: mergeProps<'button'>(
|
|
501
|
+
{
|
|
502
|
+
className: cn(sidebarMenuButtonVariants({ variant, size }), className)
|
|
503
|
+
},
|
|
504
|
+
props
|
|
505
|
+
),
|
|
506
|
+
render: !tooltip ? render : <TooltipTrigger render={render} />,
|
|
507
|
+
state: {
|
|
508
|
+
slot: 'sidebar-menu-button',
|
|
509
|
+
sidebar: 'menu-button',
|
|
510
|
+
size,
|
|
511
|
+
active: isActive
|
|
512
|
+
}
|
|
513
|
+
})
|
|
505
514
|
|
|
506
515
|
if (!tooltip) {
|
|
507
|
-
return
|
|
516
|
+
return comp
|
|
508
517
|
}
|
|
509
518
|
|
|
510
519
|
if (typeof tooltip === 'string') {
|
|
@@ -515,7 +524,7 @@ function SidebarMenuButton({
|
|
|
515
524
|
|
|
516
525
|
return (
|
|
517
526
|
<Tooltip>
|
|
518
|
-
|
|
527
|
+
{comp}
|
|
519
528
|
<TooltipContent
|
|
520
529
|
side="right"
|
|
521
530
|
align="center"
|
|
@@ -528,30 +537,34 @@ function SidebarMenuButton({
|
|
|
528
537
|
|
|
529
538
|
function SidebarMenuAction({
|
|
530
539
|
className,
|
|
531
|
-
|
|
540
|
+
render,
|
|
532
541
|
showOnHover = false,
|
|
533
542
|
...props
|
|
534
|
-
}:
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
}) {
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
543
|
+
}: useRender.ComponentProps<'button'> &
|
|
544
|
+
React.ComponentProps<'button'> & {
|
|
545
|
+
showOnHover?: boolean
|
|
546
|
+
}) {
|
|
547
|
+
return useRender({
|
|
548
|
+
defaultTagName: 'button',
|
|
549
|
+
props: mergeProps<'button'>(
|
|
550
|
+
{
|
|
551
|
+
className: cn(
|
|
552
|
+
'absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-2 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0',
|
|
553
|
+
{
|
|
554
|
+
'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0':
|
|
555
|
+
showOnHover
|
|
556
|
+
},
|
|
557
|
+
className
|
|
558
|
+
)
|
|
559
|
+
},
|
|
560
|
+
props
|
|
561
|
+
),
|
|
562
|
+
render,
|
|
563
|
+
state: {
|
|
564
|
+
slot: 'sidebar-menu-action',
|
|
565
|
+
sidebar: 'menu-action'
|
|
566
|
+
}
|
|
567
|
+
})
|
|
555
568
|
}
|
|
556
569
|
|
|
557
570
|
function SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {
|
|
@@ -560,7 +573,7 @@ function SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>)
|
|
|
560
573
|
data-slot="sidebar-menu-badge"
|
|
561
574
|
data-sidebar="menu-badge"
|
|
562
575
|
className={cn(
|
|
563
|
-
'pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-
|
|
576
|
+
'pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground',
|
|
564
577
|
className
|
|
565
578
|
)}
|
|
566
579
|
{...props}
|
|
@@ -575,6 +588,7 @@ function SidebarMenuSkeleton({
|
|
|
575
588
|
}: React.ComponentProps<'div'> & {
|
|
576
589
|
showIcon?: boolean
|
|
577
590
|
}) {
|
|
591
|
+
// Random width between 50 to 90%.
|
|
578
592
|
const [width] = React.useState(() => {
|
|
579
593
|
return `${Math.floor(Math.random() * 40) + 50}%`
|
|
580
594
|
})
|
|
@@ -583,10 +597,10 @@ function SidebarMenuSkeleton({
|
|
|
583
597
|
<div
|
|
584
598
|
data-slot="sidebar-menu-skeleton"
|
|
585
599
|
data-sidebar="menu-skeleton"
|
|
586
|
-
className={cn('flex h-8 items-center gap-2 rounded-
|
|
600
|
+
className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}
|
|
587
601
|
{...props}
|
|
588
602
|
>
|
|
589
|
-
{showIcon && <Skeleton className="size-4 rounded-
|
|
603
|
+
{showIcon && <Skeleton className="size-4 rounded-md" data-sidebar="menu-skeleton-icon" />}
|
|
590
604
|
<Skeleton
|
|
591
605
|
className="h-4 max-w-(--skeleton-width) flex-1"
|
|
592
606
|
data-sidebar="menu-skeleton-text"
|
|
@@ -626,31 +640,35 @@ function SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>)
|
|
|
626
640
|
}
|
|
627
641
|
|
|
628
642
|
function SidebarMenuSubButton({
|
|
629
|
-
|
|
643
|
+
render,
|
|
630
644
|
size = 'md',
|
|
631
645
|
isActive = false,
|
|
632
646
|
className,
|
|
633
647
|
...props
|
|
634
|
-
}:
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
}) {
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
648
|
+
}: useRender.ComponentProps<'a'> &
|
|
649
|
+
React.ComponentProps<'a'> & {
|
|
650
|
+
size?: 'sm' | 'md'
|
|
651
|
+
isActive?: boolean
|
|
652
|
+
}) {
|
|
653
|
+
return useRender({
|
|
654
|
+
defaultTagName: 'a',
|
|
655
|
+
props: mergeProps<'a'>(
|
|
656
|
+
{
|
|
657
|
+
className: cn(
|
|
658
|
+
'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',
|
|
659
|
+
className
|
|
660
|
+
)
|
|
661
|
+
},
|
|
662
|
+
props
|
|
663
|
+
),
|
|
664
|
+
render,
|
|
665
|
+
state: {
|
|
666
|
+
slot: 'sidebar-menu-sub-button',
|
|
667
|
+
sidebar: 'menu-sub-button',
|
|
668
|
+
size,
|
|
669
|
+
active: isActive
|
|
670
|
+
}
|
|
671
|
+
})
|
|
654
672
|
}
|
|
655
673
|
|
|
656
674
|
export {
|
|
@@ -4,7 +4,7 @@ function Skeleton({ className, ...props }: React.ComponentProps<'div'>) {
|
|
|
4
4
|
return (
|
|
5
5
|
<div
|
|
6
6
|
data-slot="skeleton"
|
|
7
|
-
className={cn('animate-pulse rounded-
|
|
7
|
+
className={cn('animate-pulse rounded-xl bg-muted', className)}
|
|
8
8
|
{...props}
|
|
9
9
|
/>
|
|
10
10
|
)
|