betterstart-cli 0.0.106 → 0.0.107

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 (99) hide show
  1. package/dist/assets/adapters/next/templates/init/components/layouts/admin-nav-link.tsx +10 -8
  2. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link-skeleton.tsx +1 -5
  3. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu.tsx +54 -48
  4. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sign-out.tsx +2 -2
  5. package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +3 -5
  6. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/lifecycle-hooks-tab.tsx +1 -1
  7. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/snippets-tab.tsx +1 -1
  8. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +5 -7
  9. package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +9 -10
  10. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +2 -4
  11. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-restore-dialog.tsx +2 -4
  12. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +2 -4
  13. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +1 -1
  14. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog.tsx +2 -2
  15. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-dialog.tsx +5 -5
  16. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +52 -53
  17. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +3 -5
  18. package/dist/assets/adapters/next/templates/init/pages/dashboard-page.tsx +1 -1
  19. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-detail-drawer.tsx +1 -1
  20. package/dist/assets/adapters/next/templates/init/pages/settings/forms/form-notifications-drawer.tsx +5 -5
  21. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-actions.tsx +20 -20
  22. package/dist/assets/adapters/next/templates/init/pages/users/change-password-dialog.tsx +7 -5
  23. package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +3 -5
  24. package/dist/assets/adapters/next/templates/init/pages/users/create-user-dialog.tsx +1 -3
  25. package/dist/assets/adapters/next/templates/init/pages/users/delete-user-dialog.tsx +11 -5
  26. package/dist/assets/adapters/next/templates/init/pages/users/edit-role-dialog.tsx +1 -1
  27. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +13 -11
  28. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode-dropdown-button.tsx +16 -14
  29. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +2 -2
  30. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-button.tsx +14 -12
  31. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +16 -14
  32. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover.tsx +15 -13
  33. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item.tsx +1 -1
  34. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx +31 -29
  35. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-control-popover.tsx +15 -13
  36. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item.tsx +1 -1
  37. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx +22 -20
  38. package/dist/assets/shared-assets/react-admin/custom/date-picker.tsx +16 -14
  39. package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +8 -6
  40. package/dist/assets/shared-assets/react-admin/custom/icon-picker.tsx +8 -7
  41. package/dist/assets/shared-assets/react-admin/custom/nested-object-list-field.tsx +2 -4
  42. package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +11 -28
  43. package/dist/assets/shared-assets/react-admin/ui/alert-dialog.tsx +30 -47
  44. package/dist/assets/shared-assets/react-admin/ui/alert.tsx +4 -4
  45. package/dist/assets/shared-assets/react-admin/ui/aspect-ratio.tsx +18 -5
  46. package/dist/assets/shared-assets/react-admin/ui/avatar.tsx +10 -13
  47. package/dist/assets/shared-assets/react-admin/ui/badge.tsx +21 -20
  48. package/dist/assets/shared-assets/react-admin/ui/breadcrumb.tsx +20 -19
  49. package/dist/assets/shared-assets/react-admin/ui/button-group.tsx +25 -24
  50. package/dist/assets/shared-assets/react-admin/ui/button.tsx +22 -31
  51. package/dist/assets/shared-assets/react-admin/ui/calendar.tsx +9 -6
  52. package/dist/assets/shared-assets/react-admin/ui/card.tsx +6 -16
  53. package/dist/assets/shared-assets/react-admin/ui/carousel.tsx +20 -17
  54. package/dist/assets/shared-assets/react-admin/ui/chart.tsx +19 -16
  55. package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +3 -4
  56. package/dist/assets/shared-assets/react-admin/ui/collapsible.tsx +6 -10
  57. package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +10 -36
  58. package/dist/assets/shared-assets/react-admin/ui/command.tsx +7 -6
  59. package/dist/assets/shared-assets/react-admin/ui/context-menu.tsx +77 -79
  60. package/dist/assets/shared-assets/react-admin/ui/dialog.tsx +29 -54
  61. package/dist/assets/shared-assets/react-admin/ui/direction.tsx +1 -18
  62. package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +121 -49
  63. package/dist/assets/shared-assets/react-admin/ui/dropdown-menu.tsx +117 -131
  64. package/dist/assets/shared-assets/react-admin/ui/empty.tsx +3 -3
  65. package/dist/assets/shared-assets/react-admin/ui/field.tsx +20 -30
  66. package/dist/assets/shared-assets/react-admin/ui/form.tsx +27 -31
  67. package/dist/assets/shared-assets/react-admin/ui/hover-card.tsx +26 -18
  68. package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +25 -12
  69. package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +3 -3
  70. package/dist/assets/shared-assets/react-admin/ui/input.tsx +4 -3
  71. package/dist/assets/shared-assets/react-admin/ui/item.tsx +26 -19
  72. package/dist/assets/shared-assets/react-admin/ui/label.tsx +18 -14
  73. package/dist/assets/shared-assets/react-admin/ui/menubar.tsx +80 -73
  74. package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +3 -3
  75. package/dist/assets/shared-assets/react-admin/ui/navigation-menu.tsx +40 -39
  76. package/dist/assets/shared-assets/react-admin/ui/pagination.tsx +18 -11
  77. package/dist/assets/shared-assets/react-admin/ui/popover.tsx +31 -30
  78. package/dist/assets/shared-assets/react-admin/ui/progress.tsx +51 -16
  79. package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +11 -17
  80. package/dist/assets/shared-assets/react-admin/ui/resizable.tsx +1 -1
  81. package/dist/assets/shared-assets/react-admin/ui/scroll-area.tsx +9 -13
  82. package/dist/assets/shared-assets/react-admin/ui/select.tsx +66 -60
  83. package/dist/assets/shared-assets/react-admin/ui/separator.tsx +3 -10
  84. package/dist/assets/shared-assets/react-admin/ui/sheet.tsx +22 -27
  85. package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +144 -126
  86. package/dist/assets/shared-assets/react-admin/ui/skeleton.tsx +1 -1
  87. package/dist/assets/shared-assets/react-admin/ui/slider.tsx +27 -29
  88. package/dist/assets/shared-assets/react-admin/ui/sonner.tsx +8 -3
  89. package/dist/assets/shared-assets/react-admin/ui/spinner.tsx +4 -3
  90. package/dist/assets/shared-assets/react-admin/ui/switch.tsx +4 -5
  91. package/dist/assets/shared-assets/react-admin/ui/table.tsx +8 -21
  92. package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +11 -16
  93. package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +2 -2
  94. package/dist/assets/shared-assets/react-admin/ui/toggle-group.tsx +12 -11
  95. package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +4 -5
  96. package/dist/assets/shared-assets/react-admin/ui/tooltip.tsx +29 -27
  97. package/dist/cli.js +90 -110
  98. package/dist/cli.js.map +1 -1
  99. package/package.json +1 -1
@@ -1,36 +1,33 @@
1
1
  'use client'
2
2
 
3
- import type * as React from 'react'
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 }: React.ComponentProps<typeof SheetPrimitive.Root>) {
9
+ function Sheet({ ...props }: SheetPrimitive.Root.Props) {
10
10
  return <SheetPrimitive.Root data-slot="sheet" {...props} />
11
11
  }
12
12
 
13
- function SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {
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 }: React.ComponentProps<typeof SheetPrimitive.Close>) {
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 }: React.ComponentProps<typeof SheetPrimitive.Portal>) {
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.Overlay
27
+ <SheetPrimitive.Backdrop
31
28
  data-slot="sheet-overlay"
32
29
  className={cn(
33
- 'fixed inset-0 z-50 bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0',
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
- }: React.ComponentProps<typeof SheetPrimitive.Content> & {
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.Content
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=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=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=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10',
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 data-slot="sheet-close" asChild>
66
- <Button variant="ghost" className="absolute top-4 right-4" size="icon-sm">
67
- <XIcon />
68
- <span className="sr-only">Close</span>
69
- </Button>
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.Content>
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 }: React.ComponentProps<typeof SheetPrimitive.Title>) {
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
- const cookieStore = (window as WindowWithCookieStore).cookieStore
87
- void cookieStore?.set({
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) border-border/80 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',
236
- variant === 'floating' || variant === 'inset'
237
- ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'
238
- : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',
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-sm group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border"
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-sm md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',
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-4 overflow-auto [--radius:var(--radius-xl)] group-data-[collapsible=icon]:overflow-hidden',
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 gap-1 p-2', className)}
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
- asChild = false,
383
+ render,
387
384
  ...props
388
- }: React.ComponentProps<'div'> & { asChild?: boolean }) {
389
- const Comp = asChild ? Slot.Root : 'div'
390
-
391
- return (
392
- <Comp
393
- data-slot="sidebar-group-label"
394
- data-sidebar="group-label"
395
- className={cn(
396
- 'mb-1 flex shrink-0 items-center rounded-sm 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',
397
- className
398
- )}
399
- {...props}
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
- asChild = false,
407
+ render,
407
408
  ...props
408
- }: React.ComponentProps<'button'> & { asChild?: boolean }) {
409
- const Comp = asChild ? Slot.Root : 'button'
410
-
411
- return (
412
- <Comp
413
- data-slot="sidebar-group-action"
414
- data-sidebar="group-action"
415
- className={cn(
416
- 'absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-sm 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',
417
- className
418
- )}
419
- {...props}
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-[6px] px-3 py-2 text-left text-sm font-medium text-sidebar-foreground 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:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate',
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/60 hover:text-sidebar-accent-foreground',
467
+ default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',
463
468
  outline:
464
- 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]'
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
- asChild = false,
485
+ render,
481
486
  isActive = false,
482
487
  variant = 'default',
483
488
  size = 'default',
484
489
  tooltip,
485
490
  className,
486
491
  ...props
487
- }: React.ComponentProps<'button'> & {
488
- asChild?: boolean
489
- isActive?: boolean
490
- tooltip?: string | React.ComponentProps<typeof TooltipContent>
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
- const button = (
496
- <Comp
497
- data-slot="sidebar-menu-button"
498
- data-sidebar="menu-button"
499
- data-size={size}
500
- data-active={isActive}
501
- className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
502
- {...props}
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 button
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
- <TooltipTrigger asChild>{button}</TooltipTrigger>
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
- asChild = false,
540
+ render,
532
541
  showOnHover = false,
533
542
  ...props
534
- }: React.ComponentProps<'button'> & {
535
- asChild?: boolean
536
- showOnHover?: boolean
537
- }) {
538
- const Comp = asChild ? Slot.Root : 'button'
539
-
540
- return (
541
- <Comp
542
- data-slot="sidebar-menu-action"
543
- data-sidebar="menu-action"
544
- className={cn(
545
- 'absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-sm 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',
546
- {
547
- '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':
548
- showOnHover
549
- },
550
- className
551
- )}
552
- {...props}
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-sm 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',
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-sm px-2', className)}
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-sm" data-sidebar="menu-skeleton-icon" />}
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
- asChild = false,
643
+ render,
630
644
  size = 'md',
631
645
  isActive = false,
632
646
  className,
633
647
  ...props
634
- }: React.ComponentProps<'a'> & {
635
- asChild?: boolean
636
- size?: 'sm' | 'md'
637
- isActive?: boolean
638
- }) {
639
- const Comp = asChild ? Slot.Root : 'a'
640
-
641
- return (
642
- <Comp
643
- data-slot="sidebar-menu-sub-button"
644
- data-sidebar="menu-sub-button"
645
- data-size={size}
646
- data-active={isActive}
647
- className={cn(
648
- 'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-sm 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-foreground',
649
- className
650
- )}
651
- {...props}
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-sm bg-secondary', className)}
7
+ className={cn('animate-pulse rounded-xl bg-muted', className)}
8
8
  {...props}
9
9
  />
10
10
  )