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.
Files changed (128) hide show
  1. package/dist/assets/adapters/next/templates/init/admin-globals.css +1 -61
  2. package/dist/assets/adapters/next/templates/init/components/layouts/admin-header.tsx +2 -19
  3. package/dist/assets/adapters/next/templates/init/components/layouts/admin-nav-link.tsx +10 -8
  4. package/dist/assets/adapters/next/templates/init/components/layouts/admin-providers.tsx +4 -7
  5. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link-skeleton.tsx +1 -5
  6. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu.tsx +53 -48
  7. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sign-out.tsx +2 -2
  8. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table-pagination.tsx +3 -1
  9. package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +3 -5
  10. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx +2 -5
  11. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-code-mirror.tsx +4 -5
  12. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-types.ts +0 -1
  13. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/lifecycle-hooks-tab.tsx +1 -1
  14. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/snippets-tab.tsx +1 -1
  15. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +5 -7
  16. package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +9 -10
  17. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +2 -4
  18. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-restore-dialog.tsx +2 -4
  19. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +2 -4
  20. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +1 -1
  21. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog.tsx +2 -2
  22. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-dialog.tsx +5 -5
  23. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +52 -53
  24. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-pagination.tsx +3 -1
  25. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +3 -5
  26. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +2 -11
  27. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor.ts +1 -2
  28. package/dist/assets/adapters/next/templates/init/pages/dashboard-page.tsx +1 -1
  29. package/dist/assets/adapters/next/templates/init/pages/forgot-password-form.tsx +1 -1
  30. package/dist/assets/adapters/next/templates/init/pages/login-form.tsx +2 -2
  31. package/dist/assets/adapters/next/templates/init/pages/reset-password-form.tsx +2 -2
  32. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-detail-drawer.tsx +1 -1
  33. package/dist/assets/adapters/next/templates/init/pages/settings/forms/form-notifications-drawer.tsx +5 -5
  34. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-actions.tsx +20 -20
  35. package/dist/assets/adapters/next/templates/init/pages/users/change-password-dialog.tsx +7 -5
  36. package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +3 -5
  37. package/dist/assets/adapters/next/templates/init/pages/users/create-user-dialog.tsx +1 -3
  38. package/dist/assets/adapters/next/templates/init/pages/users/delete-user-dialog.tsx +11 -5
  39. package/dist/assets/adapters/next/templates/init/pages/users/edit-role-dialog.tsx +1 -1
  40. package/dist/assets/shared-assets/react-admin/custom/content-editor/main-toolbar-content.tsx +3 -3
  41. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +13 -11
  42. package/dist/assets/shared-assets/react-admin/custom/content-editor/mobile-toolbar-content.tsx +1 -1
  43. package/dist/assets/shared-assets/react-admin/custom/content-editor/selection-bubble-menu.tsx +1 -5
  44. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode-dropdown-button.tsx +16 -14
  45. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +5 -17
  46. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-bubble-menu.tsx +0 -1
  47. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-button.tsx +14 -12
  48. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +2 -1
  49. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +2 -1
  50. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +2 -1
  51. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +16 -14
  52. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover.tsx +15 -13
  53. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item.tsx +1 -1
  54. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx +32 -30
  55. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-control-popover.tsx +17 -14
  56. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item.tsx +1 -1
  57. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx +23 -21
  58. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +2 -1
  59. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +2 -1
  60. package/dist/assets/shared-assets/react-admin/custom/date-picker.tsx +16 -14
  61. package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +8 -6
  62. package/dist/assets/shared-assets/react-admin/custom/icon-picker.tsx +8 -7
  63. package/dist/assets/shared-assets/react-admin/custom/nested-object-list-field.tsx +2 -4
  64. package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +11 -28
  65. package/dist/assets/shared-assets/react-admin/ui/alert-dialog.tsx +30 -47
  66. package/dist/assets/shared-assets/react-admin/ui/alert.tsx +4 -4
  67. package/dist/assets/shared-assets/react-admin/ui/aspect-ratio.tsx +18 -5
  68. package/dist/assets/shared-assets/react-admin/ui/avatar.tsx +10 -13
  69. package/dist/assets/shared-assets/react-admin/ui/badge.tsx +24 -21
  70. package/dist/assets/shared-assets/react-admin/ui/breadcrumb.tsx +20 -19
  71. package/dist/assets/shared-assets/react-admin/ui/button-group.tsx +25 -24
  72. package/dist/assets/shared-assets/react-admin/ui/button.tsx +22 -31
  73. package/dist/assets/shared-assets/react-admin/ui/calendar.tsx +10 -7
  74. package/dist/assets/shared-assets/react-admin/ui/card.tsx +6 -16
  75. package/dist/assets/shared-assets/react-admin/ui/carousel.tsx +20 -17
  76. package/dist/assets/shared-assets/react-admin/ui/chart.tsx +18 -26
  77. package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +3 -4
  78. package/dist/assets/shared-assets/react-admin/ui/collapsible.tsx +6 -10
  79. package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +9 -25
  80. package/dist/assets/shared-assets/react-admin/ui/command.tsx +7 -6
  81. package/dist/assets/shared-assets/react-admin/ui/context-menu.tsx +77 -79
  82. package/dist/assets/shared-assets/react-admin/ui/dialog.tsx +29 -54
  83. package/dist/assets/shared-assets/react-admin/ui/direction.tsx +1 -18
  84. package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +121 -49
  85. package/dist/assets/shared-assets/react-admin/ui/dropdown-menu.tsx +120 -131
  86. package/dist/assets/shared-assets/react-admin/ui/empty.tsx +3 -3
  87. package/dist/assets/shared-assets/react-admin/ui/field.tsx +20 -30
  88. package/dist/assets/shared-assets/react-admin/ui/form.tsx +27 -31
  89. package/dist/assets/shared-assets/react-admin/ui/hover-card.tsx +26 -18
  90. package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +26 -13
  91. package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +3 -3
  92. package/dist/assets/shared-assets/react-admin/ui/input.tsx +4 -3
  93. package/dist/assets/shared-assets/react-admin/ui/item.tsx +26 -19
  94. package/dist/assets/shared-assets/react-admin/ui/kbd.tsx +1 -1
  95. package/dist/assets/shared-assets/react-admin/ui/label.tsx +18 -14
  96. package/dist/assets/shared-assets/react-admin/ui/menubar.tsx +80 -73
  97. package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +3 -3
  98. package/dist/assets/shared-assets/react-admin/ui/navigation-menu.tsx +40 -39
  99. package/dist/assets/shared-assets/react-admin/ui/pagination.tsx +18 -11
  100. package/dist/assets/shared-assets/react-admin/ui/popover.tsx +31 -30
  101. package/dist/assets/shared-assets/react-admin/ui/progress.tsx +51 -16
  102. package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +11 -17
  103. package/dist/assets/shared-assets/react-admin/ui/resizable.tsx +1 -1
  104. package/dist/assets/shared-assets/react-admin/ui/scroll-area.tsx +9 -13
  105. package/dist/assets/shared-assets/react-admin/ui/select.tsx +66 -60
  106. package/dist/assets/shared-assets/react-admin/ui/separator.tsx +3 -10
  107. package/dist/assets/shared-assets/react-admin/ui/sheet.tsx +22 -27
  108. package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +144 -126
  109. package/dist/assets/shared-assets/react-admin/ui/skeleton.tsx +1 -1
  110. package/dist/assets/shared-assets/react-admin/ui/slider.tsx +27 -29
  111. package/dist/assets/shared-assets/react-admin/ui/sonner.tsx +10 -8
  112. package/dist/assets/shared-assets/react-admin/ui/spinner.tsx +4 -3
  113. package/dist/assets/shared-assets/react-admin/ui/switch.tsx +4 -5
  114. package/dist/assets/shared-assets/react-admin/ui/table.tsx +8 -21
  115. package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +11 -16
  116. package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +2 -2
  117. package/dist/assets/shared-assets/react-admin/ui/toggle-group.tsx +12 -11
  118. package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +4 -5
  119. package/dist/assets/shared-assets/react-admin/ui/tooltip.tsx +29 -27
  120. package/dist/{chunk-OYU73Q2W.js → chunk-PSDUGFMD.js} +2 -2
  121. package/dist/{chunk-OYU73Q2W.js.map → chunk-PSDUGFMD.js.map} +1 -1
  122. package/dist/cli.js +122 -137
  123. package/dist/cli.js.map +1 -1
  124. package/dist/{read-namespaced-template-EIH2NPDJ.js → read-namespaced-template-TSATYQPP.js} +2 -2
  125. package/package.json +1 -1
  126. package/dist/assets/adapters/next/templates/init/hooks/use-admin-theme.tsx +0 -72
  127. package/dist/assets/adapters/next/templates/init/utils/theme/system.ts +0 -6
  128. /package/dist/{read-namespaced-template-EIH2NPDJ.js.map → read-namespaced-template-TSATYQPP.js.map} +0 -0
@@ -5,8 +5,6 @@
5
5
 
6
6
  @plugin "@tailwindcss/typography";
7
7
 
8
- @custom-variant dark (&:is(.dark *));
9
-
10
8
  @theme inline {
11
9
  --color-background: var(--background);
12
10
  --color-foreground: var(--foreground);
@@ -97,6 +95,7 @@
97
95
  --accent-foreground: oklch(0.15 0 0);
98
96
  --destructive: oklch(0.577 0.245 27.325);
99
97
  --warning: oklch(0.625 0.165 57.4);
98
+ --warning-foreground: oklch(0.625 0.165 57.4);
100
99
  --border: oklch(0.93 0 0);
101
100
  --highlight: oklch(0.9 0.004 286.32);
102
101
  --input: oklch(0.994 0 0);
@@ -174,65 +173,6 @@
174
173
  --tt-color-highlight-pink-contrast: rgba(225, 136, 179, 0.27);
175
174
  }
176
175
 
177
- .dark {
178
- --background: oklch(0.144 0 0);
179
- --foreground: oklch(0.985 0 0);
180
- --card: oklch(0.15 0 0);
181
- --card-foreground: oklch(0.985 0 0);
182
- --popover: oklch(0.15 0 0);
183
- --popover-foreground: oklch(0.985 0 0);
184
- --primary: oklch(0.922 0 0);
185
- --primary-foreground: oklch(0.15 0 0);
186
- --secondary: oklch(0.269 0 0);
187
- --secondary-foreground: oklch(0.985 0 0);
188
- --muted: oklch(0.269 0 0);
189
- --muted-foreground: oklch(0.708 0 0);
190
- --accent: oklch(0.269 0 0);
191
- --accent-foreground: oklch(0.985 0 0);
192
- --destructive: oklch(0.704 0.191 22.216);
193
- --warning: oklch(0.75 0.2 90);
194
- --warning-foreground: oklch(0.625 0.165 57.4);
195
- --border: oklch(1 0 0 / 10%);
196
- --highlight: oklch(1 0 0 / 10%);
197
- --input: oklch(1 0 0 / 15%);
198
- --ring: oklch(0.556 0 0);
199
- --chart-1: oklch(0.845 0.143 164.978);
200
- --chart-2: oklch(0.696 0.17 162.48);
201
- --chart-3: oklch(0.596 0.145 163.225);
202
- --chart-4: oklch(0.508 0.118 165.612);
203
- --chart-5: oklch(0.432 0.095 166.913);
204
- --sidebar: oklch(0.15 0 0);
205
- --sidebar-foreground: oklch(0.985 0 0);
206
- --sidebar-primary: oklch(0.488 0.243 264.376);
207
- --sidebar-primary-foreground: oklch(0.985 0 0);
208
- --sidebar-accent: oklch(0.269 0 0);
209
- --sidebar-accent-foreground: oklch(0.985 0 0);
210
- --sidebar-border: oklch(1 0 0 / 10%);
211
- --sidebar-ring: oklch(0.556 0 0);
212
- --tt-bg-color: var(--background);
213
- --tt-bg-color-contrast: var(--border);
214
- --tt-color-highlight-yellow: #6b6524;
215
- --tt-color-highlight-green: #509568;
216
- --tt-color-highlight-blue: #6e92aa;
217
- --tt-color-highlight-purple: #583e74;
218
- --tt-color-highlight-red: #743e42;
219
- --tt-color-highlight-gray: rgb(47, 47, 47);
220
- --tt-color-highlight-brown: rgb(74, 50, 40);
221
- --tt-color-highlight-orange: rgb(92, 59, 35);
222
- --tt-color-highlight-pink: rgb(78, 44, 60);
223
- --tt-color-highlight-yellow-contrast: #58531e;
224
- --tt-color-highlight-green-contrast: #47855d;
225
- --tt-color-highlight-blue-contrast: #5e86a1;
226
- --tt-color-highlight-purple-contrast: #4c3564;
227
- --tt-color-highlight-red-contrast: #643539;
228
- --tt-color-highlight-gray-contrast: rgba(255, 255, 255, 0.094);
229
- --tt-color-highlight-brown-contrast: rgba(184, 101, 69, 0.25);
230
- --tt-color-highlight-orange-contrast: rgba(233, 126, 37, 0.2);
231
- --tt-color-highlight-pink-contrast: rgba(220, 76, 145, 0.22);
232
- --shadow-small: 0px 1px 2px #00000029;
233
- --shadow-medium: 0px 2px 2px #00000052, 0px 8px 8px -8px #00000029;
234
- }
235
-
236
176
  @layer base {
237
177
  * {
238
178
  @apply border-border outline-ring/50;
@@ -1,31 +1,14 @@
1
1
  'use client'
2
2
 
3
- import { Button } from '@admin/components/ui/button'
4
3
  import { SidebarTrigger, useSidebar } from '@admin/components/ui/sidebar'
5
- import { useTheme } from '@admin/hooks/use-admin-theme'
6
- import { Moon, Sun } from 'lucide-react'
7
4
 
8
5
  export function AdminHeader() {
9
- const { theme, setTheme } = useTheme()
10
6
  const { state } = useSidebar()
11
7
 
12
8
  return (
13
9
  <header className="sticky top-0 z-50 flex h-14 w-full shrink-0 items-center gap-2 border-b border-border">
14
- <div className="flex w-full flex-1 items-center justify-between gap-1 px-5">
15
- <div className="flex w-full items-center gap-2">
16
- {state === 'collapsed' && <SidebarTrigger />}
17
- </div>
18
- <div className="ml-auto flex items-center gap-2">
19
- <Button
20
- variant="ghost"
21
- size="icon"
22
- onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
23
- >
24
- <Sun className="size-4 scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90" />
25
- <Moon className="absolute size-4 scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0" />
26
- <span className="sr-only">Toggle theme</span>
27
- </Button>
28
- </div>
10
+ <div className="flex w-full flex-1 items-center gap-2 px-5">
11
+ {state === 'collapsed' && <SidebarTrigger />}
29
12
  </div>
30
13
  </header>
31
14
  )
@@ -20,14 +20,16 @@ export function AdminNavLink({
20
20
  : pathname === href || pathname.startsWith(`${href}/`)
21
21
 
22
22
  return (
23
- <SidebarMenuButton asChild>
24
- <Link
25
- aria-current={isActive ? 'page' : undefined}
26
- data-active={isActive ? true : undefined}
27
- href={href}
28
- >
29
- {children}
30
- </Link>
23
+ <SidebarMenuButton
24
+ render={
25
+ <Link
26
+ aria-current={isActive ? 'page' : undefined}
27
+ data-active={isActive ? true : undefined}
28
+ href={href}
29
+ />
30
+ }
31
+ >
32
+ {children}
31
33
  </SidebarMenuButton>
32
34
  )
33
35
  }
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { Toaster } from '@admin/components/ui/sonner'
4
4
  import { TooltipProvider } from '@admin/components/ui/tooltip'
5
- import { AdminThemeProvider } from '@admin/hooks/use-admin-theme'
6
5
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
7
6
  import { useState } from 'react'
8
7
 
@@ -22,12 +21,10 @@ export function AdminProviders({ children }: { children: React.ReactNode }) {
22
21
 
23
22
  return (
24
23
  <QueryClientProvider client={queryClient}>
25
- <AdminThemeProvider>
26
- <TooltipProvider>
27
- {children}
28
- <Toaster position="top-right" richColors />
29
- </TooltipProvider>
30
- </AdminThemeProvider>
24
+ <TooltipProvider>
25
+ {children}
26
+ <Toaster position="top-right" richColors />
27
+ </TooltipProvider>
31
28
  </QueryClientProvider>
32
29
  )
33
30
  }
@@ -3,9 +3,5 @@ import { SidebarMenuButton } from '@admin/components/ui/sidebar'
3
3
  import Link from 'next/link'
4
4
 
5
5
  export function SidebarNavLinkSkeleton({ href, children }: { href: string; children: ReactNode }) {
6
- return (
7
- <SidebarMenuButton asChild>
8
- <Link href={href}>{children}</Link>
9
- </SidebarMenuButton>
10
- )
6
+ return <SidebarMenuButton render={<Link href={href} />}>{children}</SidebarMenuButton>
11
7
  }
@@ -24,61 +24,66 @@ export async function SidebarUserMenu() {
24
24
  <SidebarMenu className="h-full">
25
25
  <SidebarMenuItem className="h-full">
26
26
  <DropdownMenu>
27
- <DropdownMenuTrigger asChild>
28
- <Button
29
- variant="ghost"
30
- className="h-full w-full justify-start border-none bg-transparent! px-3 text-left ring-0!"
31
- >
32
- <Avatar className="size-8 shrink-0">
33
- <AvatarImage src={user.image ?? undefined} />
34
- <AvatarFallback className="text-xs font-semibold group-hover:bg-white">
35
- {user.name?.charAt(0) ?? user.email?.charAt(0) ?? '?'}
36
- </AvatarFallback>
37
- </Avatar>
38
- <div className="flex-1 truncate group-data-[collapsible=icon]:hidden">
39
- <p className="truncate font-medium">{user.name}</p>
40
- </div>
27
+ <DropdownMenuTrigger
28
+ render={
29
+ <Button
30
+ variant="ghost"
31
+ className="h-full w-full justify-start border-none bg-transparent! px-3 text-left ring-0!"
32
+ >
33
+ <Avatar className="size-8 shrink-0">
34
+ <AvatarImage src={user.image ?? undefined} />
35
+ <AvatarFallback className="text-xs font-semibold group-hover:bg-white">
36
+ {user.name?.charAt(0) ?? user.email?.charAt(0) ?? '?'}
37
+ </AvatarFallback>
38
+ </Avatar>
39
+ <div className="flex-1 truncate group-data-[collapsible=icon]:hidden">
40
+ <p className="truncate font-medium">{user.name}</p>
41
+ </div>
41
42
 
42
- <div className="group-data-[collapsible=icon]:hidden">
43
- <span
44
- className={cn(
45
- buttonVariants({ variant: 'outline', size: 'icon' }),
46
- 'size-7 rounded-sm group-hover:bg-white'
47
- )}
48
- >
49
- <Ellipsis strokeWidth={2} className="size-4" />
50
- </span>
51
- </div>
52
- </Button>
53
- </DropdownMenuTrigger>
43
+ <div className="group-data-[collapsible=icon]:hidden">
44
+ <span
45
+ className={cn(
46
+ buttonVariants({ variant: 'outline', size: 'icon' }),
47
+ 'size-7 rounded-sm group-hover:bg-white'
48
+ )}
49
+ >
50
+ <Ellipsis strokeWidth={2} className="size-4" />
51
+ </span>
52
+ </div>
53
+ </Button>
54
+ }
55
+ />
54
56
  <DropdownMenuContent align="start" alignOffset={12} className="w-68 p-1">
55
57
  <DropdownMenuGroup>
56
- <DropdownMenuItem className="justify-between" asChild>
57
- <Link
58
- href="/admin/profile"
59
- prefetch={true}
60
- className="flex w-full items-center justify-between gap-2 py-2 pr-1"
61
- >
62
- <div className="flex items-center gap-2">
63
- <div className="flex flex-col">
64
- <p className="truncate font-medium">{user.name}</p>
65
- <p className="truncate text-sm font-normal text-muted-foreground [text-box-trim:trim-start]">
66
- {user.email}
67
- </p>
68
- </div>
58
+ <DropdownMenuItem
59
+ className="justify-between"
60
+ render={
61
+ <Link
62
+ href="/admin/profile"
63
+ className="flex w-full items-center justify-between gap-2 py-2 pr-1"
64
+ />
65
+ }
66
+ >
67
+ <div className="flex items-center gap-2">
68
+ <div className="flex flex-col">
69
+ <p className="truncate font-medium">{user.name}</p>
70
+ <p className="truncate text-sm font-normal text-muted-foreground [text-box-trim:trim-start]">
71
+ {user.email}
72
+ </p>
69
73
  </div>
70
- <Button variant="ghost" className="pointer-events-none size-8! shrink-0">
71
- <Settings strokeWidth={2} className="size-4" />
72
- </Button>
73
- </Link>
74
+ </div>
75
+ <Button variant="ghost" className="pointer-events-none size-8! shrink-0">
76
+ <Settings strokeWidth={2} className="size-4" />
77
+ </Button>
74
78
  </DropdownMenuItem>
75
79
  </DropdownMenuGroup>
76
80
  <DropdownMenuGroup>
77
- <DropdownMenuItem className="justify-between" asChild>
78
- <Link href="https://betterstart.io/docs" target="_blank">
79
- <span>Docs</span>
80
- <BookOpen strokeWidth={1.2} className="size-4" />
81
- </Link>
81
+ <DropdownMenuItem
82
+ className="justify-between"
83
+ render={<Link href="https://betterstart.io/docs" target="_blank" />}
84
+ >
85
+ <span>Docs</span>
86
+ <BookOpen strokeWidth={1.2} className="size-4" />
82
87
  </DropdownMenuItem>
83
88
  <AdminSignOut className="justify-between" />
84
89
  </DropdownMenuGroup>
@@ -48,8 +48,8 @@ export function AdminSignOut({
48
48
 
49
49
  return (
50
50
  <DropdownMenuItem
51
- onSelect={(event) => {
52
- event.preventDefault()
51
+ closeOnClick={false}
52
+ onClick={() => {
53
53
  handleSignOut()
54
54
  }}
55
55
  disabled={isPending}
@@ -70,7 +70,9 @@ export function DataTablePagination<TData>(props: DataTablePaginationProps<TData
70
70
  )
71
71
 
72
72
  const handlePageSizeChange = React.useCallback(
73
- (value: string) => {
73
+ (value: string | null) => {
74
+ if (value === null) return
75
+
74
76
  React.startTransition(() => {
75
77
  if (value === 'all') {
76
78
  setPageSize(-1)
@@ -34,11 +34,9 @@ export function DeleteDialog({
34
34
 
35
35
  return (
36
36
  <AlertDialog open={open} onOpenChange={setOpen}>
37
- <AlertDialogTrigger asChild>
38
- <Button variant="destructive" size="default">
39
- <Trash2 className="-ml-0.5 size-3.5" strokeWidth={2} />
40
- Delete {count} {label}
41
- </Button>
37
+ <AlertDialogTrigger render={<Button variant="destructive" size="default" />}>
38
+ <Trash2 className="-ml-0.5 size-3.5" strokeWidth={2} />
39
+ Delete {count} {label}
42
40
  </AlertDialogTrigger>
43
41
  <AlertDialogContent>
44
42
  <AlertDialogHeader>
@@ -5,7 +5,6 @@ import type { DevModeCodeLanguage, DevModeSnippetCodeTab } from './dev-mode-type
5
5
  import { Button } from '@admin/components/ui/button'
6
6
  import { Card, CardContent, CardHeader } from '@admin/components/ui/card'
7
7
  import { Tabs, TabsContent, TabsList, TabsTrigger } from '@admin/components/ui/tabs'
8
- import { useTheme } from '@admin/hooks/use-admin-theme'
9
8
  import { useCopyToClipboard } from '@admin/hooks/use-copy-to-clipboard'
10
9
  import { Check, Copy } from 'lucide-react'
11
10
  import { PlainCodeFallback } from './plain-code-fallback'
@@ -21,8 +20,6 @@ interface CopyableCodeBlockProps {
21
20
 
22
21
  export function CopyableCodeBlock({ label, code, language, tabs }: CopyableCodeBlockProps) {
23
22
  const [copy, isCopied] = useCopyToClipboard()
24
- const { resolvedTheme } = useTheme()
25
- const codeTheme = resolvedTheme === 'dark' ? 'dark' : 'light'
26
23
  const fallbackTab: DevModeSnippetCodeTab = {
27
24
  id: 'code',
28
25
  label,
@@ -68,7 +65,7 @@ export function CopyableCodeBlock({ label, code, language, tabs }: CopyableCodeB
68
65
  <TabsContent key={tab.id} value={tab.id} className="min-h-0 overflow-auto">
69
66
  <CardContent className="h-full overflow-auto p-0">
70
67
  <React.Suspense fallback={<PlainCodeFallback code={tab.code} />}>
71
- <LazyCodeMirror code={tab.code} language={tab.language} theme={codeTheme} />
68
+ <LazyCodeMirror code={tab.code} language={tab.language} />
72
69
  </React.Suspense>
73
70
  </CardContent>
74
71
  </TabsContent>
@@ -94,7 +91,7 @@ export function CopyableCodeBlock({ label, code, language, tabs }: CopyableCodeB
94
91
  </CardHeader>
95
92
  <CardContent className="overflow-auto p-0">
96
93
  <React.Suspense fallback={<PlainCodeFallback code={code} />}>
97
- <LazyCodeMirror code={code} language={language} theme={codeTheme} />
94
+ <LazyCodeMirror code={code} language={language} />
98
95
  </React.Suspense>
99
96
  </CardContent>
100
97
  </>
@@ -1,11 +1,11 @@
1
1
  'use client'
2
2
 
3
3
  import * as React from 'react'
4
- import type { DevModeCodeLanguage, DevModeCodeTheme } from './dev-mode-types'
4
+ import type { DevModeCodeLanguage } from './dev-mode-types'
5
5
  import { javascript } from '@codemirror/lang-javascript'
6
6
  import { json } from '@codemirror/lang-json'
7
7
  import { EditorView } from '@codemirror/view'
8
- import { githubDark, githubLight } from '@uiw/codemirror-theme-github'
8
+ import { githubLight } from '@uiw/codemirror-theme-github'
9
9
  import CodeMirror from '@uiw/react-codemirror'
10
10
 
11
11
  const codeMirrorSetup = {
@@ -43,10 +43,9 @@ const compactCodeTheme = EditorView.theme({
43
43
  interface DevModeCodeMirrorProps {
44
44
  code: string
45
45
  language: DevModeCodeLanguage
46
- theme: DevModeCodeTheme
47
46
  }
48
47
 
49
- export default function DevModeCodeMirror({ code, language, theme }: DevModeCodeMirrorProps) {
48
+ export default function DevModeCodeMirror({ code, language }: DevModeCodeMirrorProps) {
50
49
  const extensions = React.useMemo(
51
50
  () =>
52
51
  language === 'json'
@@ -62,7 +61,7 @@ export default function DevModeCodeMirror({ code, language, theme }: DevModeCode
62
61
  readOnly
63
62
  basicSetup={codeMirrorSetup}
64
63
  extensions={extensions}
65
- theme={theme === 'dark' ? githubDark : githubLight}
64
+ theme={githubLight}
66
65
  className="flex-1 [&>.cm-editor]:h-full"
67
66
  />
68
67
  )
@@ -1,5 +1,4 @@
1
1
  export type DevModeCodeLanguage = 'tsx' | 'ts' | 'json'
2
- export type DevModeCodeTheme = 'light' | 'dark'
3
2
  export type DevModeSnippetIcon =
4
3
  | 'eye'
5
4
  | 'file-code'
@@ -50,7 +50,7 @@ export function LifecycleHooksTab({ lifecycleHooks }: LifecycleHooksTabProps) {
50
50
  }
51
51
 
52
52
  return (
53
- <Accordion type="single" defaultValue={firstHook.id} className="min-h-0 shrink-0 rounded-sm">
53
+ <Accordion defaultValue={[firstHook.id]} className="min-h-0 shrink-0 rounded-sm">
54
54
  {lifecycleHooks.map((hook) => {
55
55
  const HookIcon = LIFECYCLE_HOOK_ICONS[hook.icon]
56
56
  const phaseLabel = LIFECYCLE_HOOK_PHASE_LABELS[hook.phase]
@@ -47,7 +47,7 @@ export function SnippetsTab({ snippets }: SnippetsTabProps) {
47
47
  }
48
48
 
49
49
  return (
50
- <Accordion type="single" defaultValue={firstSnippet.id} className="min-h-0 shrink-0 rounded-sm">
50
+ <Accordion defaultValue={[firstSnippet.id]} className="min-h-0 shrink-0 rounded-sm">
51
51
  {snippets.map((snippet) => {
52
52
  const SnippetIcon = SNIPPET_ICONS[snippet.icon]
53
53
  const snippetKindLabel = SNIPPET_KIND_LABELS[snippet.kind]
@@ -46,14 +46,12 @@ export function DevModeIntegrateButton({
46
46
  }
47
47
 
48
48
  return (
49
- <Drawer direction="right" handleOnly onOpenChange={handleOpenChange}>
50
- <DrawerTrigger asChild>
51
- <Button type="button" variant="outline">
52
- <Code2 />
53
- <span className="hidden sm:inline">Dev Mode</span>
54
- </Button>
49
+ <Drawer swipeDirection="right" onOpenChange={handleOpenChange}>
50
+ <DrawerTrigger render={<Button type="button" variant="outline" />}>
51
+ <Code2 />
52
+ <span className="hidden sm:inline">Dev Mode</span>
55
53
  </DrawerTrigger>
56
- <DrawerContent className="w-full overflow-hidden data-[vaul-drawer-direction=right]:sm:max-w-2xl data-[vaul-drawer-direction=right]:lg:max-w-4xl">
54
+ <DrawerContent className="w-full overflow-hidden data-[swipe-direction=right]:sm:max-w-2xl data-[swipe-direction=right]:lg:max-w-4xl">
57
55
  <DrawerHeader className="pb-4">
58
56
  <DrawerTitle>{integration.schemaLabel}</DrawerTitle>
59
57
  <DrawerDescription>
@@ -104,17 +104,16 @@ export function EntityFiltersBar({
104
104
  return (
105
105
  <div key={filter.key} className="relative flex items-center gap-1">
106
106
  <DropdownMenu>
107
- <DropdownMenuTrigger asChild>
108
- <Button variant="outline" className="w-45 justify-between">
109
- {filter.value
110
- ? (filter.options.find((o) => o.value === filter.value)?.label ??
111
- filter.label)
112
- : `All ${filter.label}`}
107
+ <DropdownMenuTrigger
108
+ render={<Button variant="outline" className="w-45 justify-between" />}
109
+ >
110
+ {filter.value
111
+ ? (filter.options.find((o) => o.value === filter.value)?.label ?? filter.label)
112
+ : `All ${filter.label}`}
113
113
 
114
- {!filter.value && (
115
- <ChevronDown className="absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-foreground" />
116
- )}
117
- </Button>
114
+ {!filter.value && (
115
+ <ChevronDown className="absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-foreground" />
116
+ )}
118
117
  </DropdownMenuTrigger>
119
118
  <DropdownMenuContent align="start">
120
119
  <DropdownMenuRadioGroup
@@ -36,10 +36,8 @@ export function EntityVersionItem({
36
36
  <Badge variant="secondary">v{version.version}</Badge>
37
37
  </div>
38
38
  <Tooltip>
39
- <TooltipTrigger asChild>
40
- <p className="w-fit text-xs text-muted-foreground">
41
- Saved {formatDistanceToNow(createdDate, { addSuffix: true })}
42
- </p>
39
+ <TooltipTrigger render={<p className="w-fit text-xs text-muted-foreground" />}>
40
+ Saved {formatDistanceToNow(createdDate, { addSuffix: true })}
43
41
  </TooltipTrigger>
44
42
  <TooltipContent>{format(createdDate, 'PPpp')}</TooltipContent>
45
43
  </Tooltip>
@@ -48,10 +48,8 @@ export function EntityVersionRestoreDialog({
48
48
 
49
49
  return (
50
50
  <AlertDialog open={open} onOpenChange={setOpen}>
51
- <AlertDialogTrigger asChild>
52
- <Button variant="outline" size="sm">
53
- Restore
54
- </Button>
51
+ <AlertDialogTrigger render={<Button variant="outline" size="sm" />}>
52
+ Restore
55
53
  </AlertDialogTrigger>
56
54
  <AlertDialogContent>
57
55
  <AlertDialogHeader>
@@ -34,10 +34,8 @@ export function EntityVersionsCurrentRow({ updatedAt, author }: EntityVersionsCu
34
34
  <Badge variant="outline">Current</Badge>
35
35
  </div>
36
36
  <Tooltip>
37
- <TooltipTrigger asChild>
38
- <p className="w-fit text-xs text-muted-foreground">
39
- Edited {formatDistanceToNow(updatedDate, { addSuffix: true })}
40
- </p>
37
+ <TooltipTrigger render={<p className="w-fit text-xs text-muted-foreground" />}>
38
+ Edited {formatDistanceToNow(updatedDate, { addSuffix: true })}
41
39
  </TooltipTrigger>
42
40
  <TooltipContent>{format(updatedDate, 'PPpp')}</TooltipContent>
43
41
  </Tooltip>
@@ -42,7 +42,7 @@ export function EntityVersionsDrawer({
42
42
  onRestored
43
43
  }: EntityVersionsDrawerProps) {
44
44
  return (
45
- <Drawer direction="right" open={open} onOpenChange={onOpenChange} modal>
45
+ <Drawer swipeDirection="right" open={open} onOpenChange={onOpenChange} modal>
46
46
  <DrawerContent className="h-full sm:max-w-lg">
47
47
  <DrawerHeader>
48
48
  <DrawerTitle>Versions</DrawerTitle>
@@ -31,10 +31,10 @@ export function EditMediaDialog({ media, open, onOpenChange, onSaved }: EditMedi
31
31
 
32
32
  return (
33
33
  <Drawer
34
- direction="right"
34
+ swipeDirection="right"
35
35
  open={isOpen}
36
36
  onOpenChange={handleOpenChange}
37
- onAnimationEnd={(nextOpen) => {
37
+ onOpenChangeComplete={(nextOpen) => {
38
38
  if (nextOpen) {
39
39
  setClosingMedia(null)
40
40
  return
@@ -52,11 +52,11 @@ export function MediaDeleteDialog({ media, disabled = false, onDeleted }: MediaD
52
52
 
53
53
  return (
54
54
  <AlertDialog>
55
- <AlertDialogTrigger asChild>
56
- <Button variant="destructive" disabled={disabled || isPending}>
57
- <Trash2 />
58
- Delete media
59
- </Button>
55
+ <AlertDialogTrigger
56
+ render={<Button variant="destructive" disabled={disabled || isPending} />}
57
+ >
58
+ <Trash2 />
59
+ Delete media
60
60
  </AlertDialogTrigger>
61
61
  <AlertDialogContent>
62
62
  <AlertDialogHeader>