betterstart-cli 0.0.105 → 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 (117) 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/data-table/data-grid-body.tsx +20 -0
  6. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-grid-cell.tsx +20 -0
  7. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-grid-head.tsx +21 -0
  8. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-grid-header.tsx +20 -0
  9. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-grid-row.tsx +22 -0
  10. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-grid.tsx +7 -81
  11. package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +3 -5
  12. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/lifecycle-hooks-tab.tsx +1 -1
  13. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/snippets-tab.tsx +1 -1
  14. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +5 -7
  15. package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +9 -10
  16. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +2 -4
  17. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-restore-dialog.tsx +2 -4
  18. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +2 -4
  19. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +1 -1
  20. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog.tsx +2 -2
  21. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-dialog.tsx +5 -5
  22. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +52 -53
  23. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +3 -5
  24. package/dist/assets/adapters/next/templates/init/pages/dashboard-page.tsx +1 -1
  25. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-detail-drawer.tsx +1 -1
  26. package/dist/assets/adapters/next/templates/init/pages/settings/forms/form-notifications-drawer.tsx +5 -5
  27. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-actions.tsx +20 -20
  28. package/dist/assets/adapters/next/templates/init/pages/users/change-password-dialog.tsx +7 -5
  29. package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +3 -5
  30. package/dist/assets/adapters/next/templates/init/pages/users/create-user-dialog.tsx +1 -3
  31. package/dist/assets/adapters/next/templates/init/pages/users/delete-user-dialog.tsx +11 -5
  32. package/dist/assets/adapters/next/templates/init/pages/users/edit-role-dialog.tsx +1 -1
  33. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +13 -11
  34. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode-dropdown-button.tsx +16 -14
  35. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +2 -2
  36. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-button.tsx +14 -12
  37. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +4 -11
  38. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-shortcut-badge.tsx +15 -0
  39. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +4 -11
  40. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-shortcut-badge.tsx +15 -0
  41. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +6 -42
  42. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-shortcut-badge.tsx +15 -0
  43. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/highlight-swatch.tsx +34 -0
  44. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +16 -14
  45. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover.tsx +15 -13
  46. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item.tsx +1 -1
  47. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx +31 -29
  48. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-control-popover.tsx +15 -13
  49. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item.tsx +1 -1
  50. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx +22 -20
  51. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +5 -14
  52. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-shortcut-badge.tsx +18 -0
  53. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/history-shortcut-badge.tsx +18 -0
  54. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +5 -14
  55. package/dist/assets/shared-assets/react-admin/custom/date-picker.tsx +16 -14
  56. package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +8 -6
  57. package/dist/assets/shared-assets/react-admin/custom/icon-picker/memoized-icon.tsx +10 -0
  58. package/dist/assets/shared-assets/react-admin/custom/icon-picker.tsx +9 -10
  59. package/dist/assets/shared-assets/react-admin/custom/nested-object-list-field.tsx +2 -4
  60. package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +11 -28
  61. package/dist/assets/shared-assets/react-admin/ui/alert-dialog.tsx +30 -47
  62. package/dist/assets/shared-assets/react-admin/ui/alert.tsx +4 -4
  63. package/dist/assets/shared-assets/react-admin/ui/aspect-ratio.tsx +18 -5
  64. package/dist/assets/shared-assets/react-admin/ui/avatar.tsx +10 -13
  65. package/dist/assets/shared-assets/react-admin/ui/badge.tsx +21 -20
  66. package/dist/assets/shared-assets/react-admin/ui/breadcrumb.tsx +20 -19
  67. package/dist/assets/shared-assets/react-admin/ui/button-group.tsx +25 -24
  68. package/dist/assets/shared-assets/react-admin/ui/button.tsx +22 -31
  69. package/dist/assets/shared-assets/react-admin/ui/calendar.tsx +9 -6
  70. package/dist/assets/shared-assets/react-admin/ui/card.tsx +6 -16
  71. package/dist/assets/shared-assets/react-admin/ui/carousel.tsx +20 -17
  72. package/dist/assets/shared-assets/react-admin/ui/chart.tsx +19 -16
  73. package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +3 -4
  74. package/dist/assets/shared-assets/react-admin/ui/collapsible.tsx +6 -10
  75. package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +10 -36
  76. package/dist/assets/shared-assets/react-admin/ui/command.tsx +7 -6
  77. package/dist/assets/shared-assets/react-admin/ui/context-menu.tsx +77 -79
  78. package/dist/assets/shared-assets/react-admin/ui/dialog.tsx +29 -54
  79. package/dist/assets/shared-assets/react-admin/ui/direction.tsx +1 -18
  80. package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +121 -49
  81. package/dist/assets/shared-assets/react-admin/ui/dropdown-menu.tsx +117 -131
  82. package/dist/assets/shared-assets/react-admin/ui/empty.tsx +3 -3
  83. package/dist/assets/shared-assets/react-admin/ui/field.tsx +20 -30
  84. package/dist/assets/shared-assets/react-admin/ui/form.tsx +27 -31
  85. package/dist/assets/shared-assets/react-admin/ui/hover-card.tsx +26 -18
  86. package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +25 -12
  87. package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +3 -3
  88. package/dist/assets/shared-assets/react-admin/ui/input.tsx +4 -3
  89. package/dist/assets/shared-assets/react-admin/ui/item.tsx +26 -19
  90. package/dist/assets/shared-assets/react-admin/ui/label.tsx +18 -14
  91. package/dist/assets/shared-assets/react-admin/ui/menubar.tsx +80 -73
  92. package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +3 -3
  93. package/dist/assets/shared-assets/react-admin/ui/navigation-menu.tsx +40 -39
  94. package/dist/assets/shared-assets/react-admin/ui/pagination.tsx +18 -11
  95. package/dist/assets/shared-assets/react-admin/ui/popover.tsx +31 -30
  96. package/dist/assets/shared-assets/react-admin/ui/progress.tsx +51 -16
  97. package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +11 -17
  98. package/dist/assets/shared-assets/react-admin/ui/resizable.tsx +1 -1
  99. package/dist/assets/shared-assets/react-admin/ui/scroll-area.tsx +9 -13
  100. package/dist/assets/shared-assets/react-admin/ui/select.tsx +66 -60
  101. package/dist/assets/shared-assets/react-admin/ui/separator.tsx +3 -10
  102. package/dist/assets/shared-assets/react-admin/ui/sheet.tsx +22 -27
  103. package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +144 -126
  104. package/dist/assets/shared-assets/react-admin/ui/skeleton.tsx +1 -1
  105. package/dist/assets/shared-assets/react-admin/ui/slider.tsx +27 -29
  106. package/dist/assets/shared-assets/react-admin/ui/sonner.tsx +8 -3
  107. package/dist/assets/shared-assets/react-admin/ui/spinner.tsx +4 -3
  108. package/dist/assets/shared-assets/react-admin/ui/switch.tsx +4 -5
  109. package/dist/assets/shared-assets/react-admin/ui/table.tsx +8 -21
  110. package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +11 -16
  111. package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +2 -2
  112. package/dist/assets/shared-assets/react-admin/ui/toggle-group.tsx +12 -11
  113. package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +4 -5
  114. package/dist/assets/shared-assets/react-admin/ui/tooltip.tsx +29 -27
  115. package/dist/cli.js +145 -111
  116. package/dist/cli.js.map +1 -1
  117. package/package.json +1 -1
@@ -4,10 +4,16 @@ import * as React from 'react'
4
4
  import type { AdminMedia } from '@admin/types'
5
5
  import { deleteMedia } from '@admin/actions/media'
6
6
  import { Button } from '@admin/components/ui/button'
7
+ import {
8
+ Drawer,
9
+ DrawerContent,
10
+ DrawerDescription,
11
+ DrawerTitle,
12
+ DrawerTrigger
13
+ } from '@admin/components/ui/drawer'
7
14
  import { Spinner } from '@admin/components/ui/spinner'
8
15
  import { Trash2, TriangleAlert } from 'lucide-react'
9
16
  import { toast } from 'sonner'
10
- import { Drawer as DrawerPrimitive } from 'vaul'
11
17
 
12
18
  interface MediaDeleteDrawerProps {
13
19
  media: AdminMedia
@@ -90,63 +96,56 @@ export function MediaDeleteDrawer({
90
96
  }
91
97
 
92
98
  return (
93
- <DrawerPrimitive.Root
99
+ <Drawer
94
100
  container={container}
95
- direction="bottom"
96
- dismissible={!isPending}
101
+ swipeDirection="down"
102
+ disablePointerDismissal={isPending}
97
103
  open={open}
98
104
  onOpenChange={handleOpenChange}
99
105
  >
100
- <DrawerPrimitive.Trigger asChild>
101
- <Button variant="destructive" disabled={disabled || isPending || !container}>
102
- <Trash2 />
103
- Delete media
104
- </Button>
105
- </DrawerPrimitive.Trigger>
106
- <DrawerPrimitive.Portal>
107
- <DrawerPrimitive.Overlay className="pointer-events-auto absolute inset-0 z-20 bg-black/45 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0" />
108
- <DrawerPrimitive.Content className="pointer-events-auto absolute inset-x-0 bottom-0 z-30 max-h-[calc(100%-1rem)] overflow-hidden p-3 outline-none">
109
- <div
110
- className="overflow-hidden rounded-sm border border-border bg-popover text-sm text-popover-foreground shadow-2xl transition-[height] duration-200 ease-out"
111
- style={contentHeight ? { height: contentHeight } : undefined}
112
- >
113
- <div
114
- ref={contentRef}
115
- className="max-h-[calc(100vh-8rem)] overflow-y-auto px-4 pt-4 pb-4"
116
- >
117
- <div aria-hidden="true" className="mx-auto mb-5 h-1.5 w-20 rounded-sm bg-muted" />
118
- <div className="mb-3 flex size-10 items-center justify-center rounded-sm bg-destructive/10 text-foreground">
119
- <TriangleAlert className="size-5" />
120
- </div>
121
- <DrawerPrimitive.Title className="font-heading text-base font-medium text-foreground">
122
- Delete this media?
123
- </DrawerPrimitive.Title>
124
- <DrawerPrimitive.Description className="mt-1 text-sm text-muted-foreground">
125
- This deletes {media.filename} from the media library. The stored file is not
126
- deleted.
127
- </DrawerPrimitive.Description>
128
- <div className="mt-5 grid grid-cols-2 gap-2">
129
- <Button
130
- variant="secondary"
131
- onClick={() => handleOpenChange(false)}
132
- disabled={isPending}
133
- >
134
- Cancel
135
- </Button>
136
- <Button
137
- variant="destructive"
138
- onClick={() => void handleDelete()}
139
- disabled={isPending}
140
- aria-busy={isPending}
141
- >
142
- {isPending && <Spinner />}
143
- {isPending ? 'Deleting…' : 'Delete media'}
144
- </Button>
145
- </div>
106
+ <DrawerTrigger
107
+ render={<Button variant="destructive" disabled={disabled || isPending || !container} />}
108
+ >
109
+ <Trash2 />
110
+ Delete media
111
+ </DrawerTrigger>
112
+ <DrawerContent className="pointer-events-auto max-h-[calc(100%-1rem)] overflow-hidden p-3 outline-none">
113
+ <div
114
+ className="overflow-hidden rounded-sm border border-border bg-popover text-sm text-popover-foreground shadow-2xl transition-[height] duration-200 ease-out"
115
+ style={contentHeight ? { height: contentHeight } : undefined}
116
+ >
117
+ <div ref={contentRef} className="max-h-[calc(100vh-8rem)] overflow-y-auto px-4 pt-4 pb-4">
118
+ <div aria-hidden="true" className="mx-auto mb-5 h-1.5 w-20 rounded-sm bg-muted" />
119
+ <div className="mb-3 flex size-10 items-center justify-center rounded-sm bg-destructive/10 text-foreground">
120
+ <TriangleAlert className="size-5" />
121
+ </div>
122
+ <DrawerTitle className="font-heading text-base font-medium text-foreground">
123
+ Delete this media?
124
+ </DrawerTitle>
125
+ <DrawerDescription className="mt-1 text-sm text-muted-foreground">
126
+ This deletes {media.filename} from the media library. The stored file is not deleted.
127
+ </DrawerDescription>
128
+ <div className="mt-5 grid grid-cols-2 gap-2">
129
+ <Button
130
+ variant="secondary"
131
+ onClick={() => handleOpenChange(false)}
132
+ disabled={isPending}
133
+ >
134
+ Cancel
135
+ </Button>
136
+ <Button
137
+ variant="destructive"
138
+ onClick={() => void handleDelete()}
139
+ disabled={isPending}
140
+ aria-busy={isPending}
141
+ >
142
+ {isPending && <Spinner />}
143
+ {isPending ? 'Deleting…' : 'Delete media'}
144
+ </Button>
146
145
  </div>
147
146
  </div>
148
- </DrawerPrimitive.Content>
149
- </DrawerPrimitive.Portal>
150
- </DrawerPrimitive.Root>
147
+ </div>
148
+ </DrawerContent>
149
+ </Drawer>
151
150
  )
152
151
  }
@@ -187,10 +187,10 @@ export function SortOrderDialog({
187
187
  onDragCancel={handleDragCancel}
188
188
  >
189
189
  <Drawer
190
- direction="right"
190
+ swipeDirection="right"
191
191
  open={open}
192
192
  onOpenChange={onOpenChange}
193
- onAnimationEnd={handleDrawerAnimationEnd}
193
+ onOpenChangeComplete={handleDrawerAnimationEnd}
194
194
  >
195
195
  <DrawerContent className="h-full w-full overflow-hidden">
196
196
  <div className="relative z-10 flex min-h-0 flex-1 flex-col gap-3 overflow-hidden">
@@ -231,9 +231,7 @@ export function SortOrderDialog({
231
231
  {isSaving && <Spinner />}
232
232
  {isSaving ? 'Saving…' : 'Save'}
233
233
  </Button>
234
- <DrawerClose asChild>
235
- <Button variant="outline">Close</Button>
236
- </DrawerClose>
234
+ <DrawerClose render={<Button variant="outline" />}>Close</DrawerClose>
237
235
  </DrawerFooter>
238
236
  </div>
239
237
  </DrawerContent>
@@ -51,7 +51,7 @@ export default function DashboardPage() {
51
51
  </p>
52
52
  </div>
53
53
  <div className="flex w-full flex-col">
54
- <Accordion type="single" collapsible defaultValue="item-1">
54
+ <Accordion defaultValue={['item-1']}>
55
55
  <AccordionItem value="item-1">
56
56
  <AccordionTrigger>
57
57
  <div className="flex items-center gap-3">
@@ -36,7 +36,7 @@ function formatMetadata(metadata: Record<string, unknown> | null): string {
36
36
 
37
37
  export function AuditLogDetailDrawer({ auditLog, open, onOpenChange }: AuditLogDetailDrawerProps) {
38
38
  return (
39
- <Drawer direction="right" open={open} onOpenChange={onOpenChange} modal>
39
+ <Drawer swipeDirection="right" open={open} onOpenChange={onOpenChange} modal>
40
40
  <DrawerContent className="h-full sm:max-w-xl">
41
41
  <DrawerHeader>
42
42
  <DrawerTitle>Audit Event</DrawerTitle>
@@ -82,7 +82,7 @@ export function FormNotificationsDrawer({
82
82
  const isPending = mutation.isPending
83
83
 
84
84
  return (
85
- <Drawer direction="right" open={open} onOpenChange={onOpenChange} modal>
85
+ <Drawer swipeDirection="right" open={open} onOpenChange={onOpenChange} modal>
86
86
  <DrawerContent className="h-full sm:max-w-xl">
87
87
  <Form {...form}>
88
88
  <form
@@ -128,10 +128,10 @@ export function FormNotificationsDrawer({
128
128
  </ScrollArea>
129
129
 
130
130
  <DrawerFooter className="flex-row justify-end">
131
- <DrawerClose asChild>
132
- <Button type="button" variant="outline" size="lg" disabled={isPending}>
133
- Cancel
134
- </Button>
131
+ <DrawerClose
132
+ render={<Button type="button" variant="outline" size="lg" disabled={isPending} />}
133
+ >
134
+ Cancel
135
135
  </DrawerClose>
136
136
  <Button
137
137
  type="submit"
@@ -23,33 +23,33 @@ export function WebhookActions({ webhook, onEdit, onDelete }: WebhookActionsProp
23
23
 
24
24
  return (
25
25
  <DropdownMenu>
26
- <DropdownMenuTrigger asChild>
27
- <Button
28
- variant="ghost"
29
- className="size-8 p-0"
30
- aria-label={`Open webhook actions for ${webhook.name}`}
31
- >
32
- <span className="sr-only">Open webhook actions</span>
33
- {sendTest.isPending ? (
34
- <Spinner className="size-4" />
35
- ) : (
36
- <MoreHorizontal className="size-4" />
37
- )}
38
- </Button>
39
- </DropdownMenuTrigger>
26
+ <DropdownMenuTrigger
27
+ render={
28
+ <Button
29
+ variant="ghost"
30
+ className="size-8 p-0"
31
+ aria-label={`Open webhook actions for ${webhook.name}`}
32
+ >
33
+ <span className="sr-only">Open webhook actions</span>
34
+ {sendTest.isPending ? (
35
+ <Spinner className="size-4" />
36
+ ) : (
37
+ <MoreHorizontal className="size-4" />
38
+ )}
39
+ </Button>
40
+ }
41
+ />
40
42
  <DropdownMenuContent align="end">
41
43
  <DropdownMenuItem
44
+ closeOnClick={false}
42
45
  disabled={sendTest.isPending}
43
46
  aria-busy={sendTest.isPending}
44
- onSelect={(event) => {
45
- event.preventDefault()
46
- sendTest.mutate(webhook.id)
47
- }}
47
+ onClick={() => sendTest.mutate(webhook.id)}
48
48
  >
49
49
  {sendTest.isPending ? 'Testing…' : 'Test'}
50
50
  </DropdownMenuItem>
51
- <DropdownMenuItem onSelect={() => onEdit(webhook)}>Edit</DropdownMenuItem>
52
- <DropdownMenuItem variant="destructive" onSelect={() => onDelete(webhook)}>
51
+ <DropdownMenuItem onClick={() => onEdit(webhook)}>Edit</DropdownMenuItem>
52
+ <DropdownMenuItem variant="destructive" onClick={() => onDelete(webhook)}>
53
53
  Delete
54
54
  </DropdownMenuItem>
55
55
  </DropdownMenuContent>
@@ -134,11 +134,13 @@ export function ChangePasswordDialog({
134
134
 
135
135
  return (
136
136
  <Dialog open={open} onOpenChange={handleOpenChange}>
137
- <DialogTrigger asChild>
138
- <DropdownMenuItem onSelect={(event) => event.preventDefault()}>
139
- <KeySquare className="size-4" />
140
- Change password
141
- </DropdownMenuItem>
137
+ <DialogTrigger
138
+ render={
139
+ <DropdownMenuItem closeOnClick={false} onClick={(event) => event.preventDefault()} />
140
+ }
141
+ >
142
+ <KeySquare className="size-4" />
143
+ Change password
142
144
  </DialogTrigger>
143
145
  <DialogContent className="sm:max-w-135">
144
146
  <Form {...form}>
@@ -148,11 +148,9 @@ export const columns: ColumnDef<User>[] = [
148
148
  return (
149
149
  <div className="flex justify-end">
150
150
  <DropdownMenu>
151
- <DropdownMenuTrigger asChild>
152
- <Button variant="ghost" className="size-8 p-0">
153
- <span className="sr-only">Open menu</span>
154
- <MoreHorizontal className="size-4" />
155
- </Button>
151
+ <DropdownMenuTrigger render={<Button variant="ghost" className="size-8 p-0" />}>
152
+ <span className="sr-only">Open menu</span>
153
+ <MoreHorizontal className="size-4" />
156
154
  </DropdownMenuTrigger>
157
155
  <DropdownMenuContent align="end">
158
156
  {!isCurrentUser ? (
@@ -108,9 +108,7 @@ export function CreateUserDialog() {
108
108
 
109
109
  return (
110
110
  <Dialog open={open} onOpenChange={handleOpenChange}>
111
- <DialogTrigger asChild>
112
- <Button>Create User</Button>
113
- </DialogTrigger>
111
+ <DialogTrigger render={<Button />}>Create User</DialogTrigger>
114
112
  <DialogContent className="sm:max-w-135">
115
113
  <Form {...form}>
116
114
  <form onSubmit={form.handleSubmit((values) => mutation.mutate(values))}>
@@ -104,11 +104,17 @@ export function DeleteUserDialog({ userId, userName, isCurrentUser }: DeleteUser
104
104
 
105
105
  return (
106
106
  <AlertDialog open={open} onOpenChange={handleOpenChange}>
107
- <AlertDialogTrigger asChild>
108
- <DropdownMenuItem variant="destructive" onSelect={(event) => event.preventDefault()}>
109
- <Trash className="size-4" />
110
- Delete user
111
- </DropdownMenuItem>
107
+ <AlertDialogTrigger
108
+ render={
109
+ <DropdownMenuItem
110
+ variant="destructive"
111
+ closeOnClick={false}
112
+ onClick={(event) => event.preventDefault()}
113
+ />
114
+ }
115
+ >
116
+ <Trash className="size-4" />
117
+ Delete user
112
118
  </AlertDialogTrigger>
113
119
  <AlertDialogContent>
114
120
  <Form {...form}>
@@ -56,7 +56,7 @@ export function EditRoleDialog({ userId, currentRole, userName, children }: Edit
56
56
 
57
57
  return (
58
58
  <Dialog open={open} onOpenChange={setOpen}>
59
- <DialogTrigger asChild>{children}</DialogTrigger>
59
+ <DialogTrigger render={children as React.ReactElement} />
60
60
  <DialogContent className="sm:max-w-87.5">
61
61
  <DialogHeader>
62
62
  <DialogTitle>Edit Role</DialogTitle>
@@ -36,17 +36,19 @@ export function MathPopoverButton({
36
36
 
37
37
  return (
38
38
  <Popover open={isOpen} onOpenChange={setIsOpen}>
39
- <PopoverTrigger asChild>
40
- <MathButton
41
- {...buttonProps}
42
- text={text}
43
- disabled={disabled || !canInsert}
44
- aria-label="Insert math"
45
- title="Math"
46
- onPointerDown={(event) => event.preventDefault()}
47
- onClick={() => setIsOpen((current) => !current)}
48
- />
49
- </PopoverTrigger>
39
+ <PopoverTrigger
40
+ render={
41
+ <MathButton
42
+ {...buttonProps}
43
+ text={text}
44
+ disabled={disabled || !canInsert}
45
+ aria-label="Insert math"
46
+ title="Math"
47
+ onPointerDown={(event) => event.preventDefault()}
48
+ onClick={() => setIsOpen((current) => !current)}
49
+ />
50
+ }
51
+ />
50
52
  <PopoverContent align="start" className="w-auto gap-0 p-0">
51
53
  <MathEditorControls
52
54
  disabled={disabled || !canInsert}
@@ -29,20 +29,22 @@ export function SourceModeDropdownButton({
29
29
 
30
30
  return (
31
31
  <DropdownMenu open={isOpen} onOpenChange={setIsOpen}>
32
- <DropdownMenuTrigger asChild>
33
- <Button
34
- type="button"
35
- variant="ghost"
36
- size="icon-sm"
37
- className="w-auto px-2"
38
- aria-label={ariaLabel ?? label}
39
- title={label}
40
- onPointerDown={(event) => event.preventDefault()}
41
- onClick={() => setIsOpen((current) => !current)}
42
- >
43
- <Icon />
44
- <ChevronDownIcon className="tiptap-button-dropdown-small" />
45
- </Button>
32
+ <DropdownMenuTrigger
33
+ render={
34
+ <Button
35
+ type="button"
36
+ variant="ghost"
37
+ size="icon-sm"
38
+ className="w-auto px-2"
39
+ aria-label={ariaLabel ?? label}
40
+ title={label}
41
+ onPointerDown={(event) => event.preventDefault()}
42
+ onClick={() => setIsOpen((current) => !current)}
43
+ />
44
+ }
45
+ >
46
+ <Icon />
47
+ <ChevronDownIcon className="tiptap-button-dropdown-small" />
46
48
  </DropdownMenuTrigger>
47
49
  <DropdownMenuContent align="start" className="w-auto min-w-40">
48
50
  <DropdownMenuGroup>{children}</DropdownMenuGroup>
@@ -173,7 +173,7 @@ export function SourceMode({
173
173
  disabled={disabled}
174
174
  aria-label={option.label}
175
175
  title={option.label}
176
- onSelect={() => applyHeading(option.level)}
176
+ onClick={() => applyHeading(option.level)}
177
177
  >
178
178
  <Icon />
179
179
  <span className="tiptap-button-text">{option.label}</span>
@@ -191,7 +191,7 @@ export function SourceMode({
191
191
  disabled={disabled}
192
192
  aria-label={option.label}
193
193
  title={option.label}
194
- onSelect={() => applyList(option.type)}
194
+ onClick={() => applyList(option.type)}
195
195
  >
196
196
  <Icon />
197
197
  <span className="tiptap-button-text">{option.label}</span>
@@ -19,18 +19,20 @@ export function TableButton({ disabled, editor, onInsertTable }: TableButtonProp
19
19
 
20
20
  return (
21
21
  <Popover open={tableButton.isOpen} onOpenChange={tableButton.setIsOpen}>
22
- <PopoverTrigger asChild>
23
- <Button
24
- type="button"
25
- variant="ghost"
26
- size="sm"
27
- disabled={tableButton.isDisabled}
28
- aria-label="Insert table"
29
- title="Table"
30
- >
31
- <TableIcon />
32
- <span className="tiptap-button-text">Table</span>
33
- </Button>
22
+ <PopoverTrigger
23
+ render={
24
+ <Button
25
+ type="button"
26
+ variant="ghost"
27
+ size="sm"
28
+ disabled={tableButton.isDisabled}
29
+ aria-label="Insert table"
30
+ title="Table"
31
+ />
32
+ }
33
+ >
34
+ <TableIcon />
35
+ <span className="tiptap-button-text">Table</span>
34
36
  </PopoverTrigger>
35
37
  <PopoverContent align="start" className="w-72 p-4">
36
38
  <div className="flex flex-col gap-3" onKeyDownCapture={tableButton.handleKeyDown}>
@@ -2,22 +2,23 @@
2
2
 
3
3
  import type { ControlAvailability, ControlShortcut, ControlTooltip } from '../control-options'
4
4
  import type { UseBlockquoteConfig } from '@admin/hooks/content-editor/use-blockquote'
5
- import { Badge } from '@admin/components/ui/badge'
6
5
  import { Button } from '@admin/components/ui/button'
7
- import { BLOCKQUOTE_SHORTCUT_KEY, useBlockquote } from '@admin/hooks/content-editor/use-blockquote'
6
+ import { useBlockquote } from '@admin/hooks/content-editor/use-blockquote'
8
7
  import { useTiptapEditor } from '@admin/hooks/content-editor/use-tiptap-editor'
9
- import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
10
8
  import { useCallback } from 'react'
11
9
  import {
12
10
  getControlTooltipTitle,
13
11
  shouldHideUnavailableControl,
14
12
  shouldShowControlShortcut
15
13
  } from '../control-options'
14
+ import { BlockquoteShortcutBadge } from './blockquote-shortcut-badge'
16
15
 
17
16
  type EditorButtonProps = React.ComponentProps<typeof Button> & {
18
17
  tooltip?: ControlTooltip
19
18
  }
20
19
 
20
+ export { BlockquoteShortcutBadge } from './blockquote-shortcut-badge'
21
+
21
22
  export interface BlockquoteButtonProps
22
23
  extends Omit<EditorButtonProps, 'type'>, Omit<UseBlockquoteConfig, 'hideWhenUnavailable'> {
23
24
  availability?: ControlAvailability
@@ -25,14 +26,6 @@ export interface BlockquoteButtonProps
25
26
  shortcut?: ControlShortcut
26
27
  }
27
28
 
28
- export function BlockquoteShortcutBadge({
29
- shortcutKeys = BLOCKQUOTE_SHORTCUT_KEY
30
- }: {
31
- shortcutKeys?: string
32
- }) {
33
- return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
34
- }
35
-
36
29
  export function BlockquoteButton({
37
30
  editor: providedEditor,
38
31
  availability,
@@ -0,0 +1,15 @@
1
+ 'use client'
2
+
3
+ import { Badge } from '@admin/components/ui/badge'
4
+ import { BLOCKQUOTE_SHORTCUT_KEY } from '@admin/hooks/content-editor/use-blockquote'
5
+ import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
6
+
7
+ function BlockquoteShortcutBadge({
8
+ shortcutKeys = BLOCKQUOTE_SHORTCUT_KEY
9
+ }: {
10
+ shortcutKeys?: string
11
+ }) {
12
+ return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
13
+ }
14
+
15
+ export { BlockquoteShortcutBadge }
@@ -2,22 +2,23 @@
2
2
 
3
3
  import type { ControlAvailability, ControlShortcut, ControlTooltip } from '../control-options'
4
4
  import type { UseCodeBlockConfig } from '@admin/hooks/content-editor/use-code-block'
5
- import { Badge } from '@admin/components/ui/badge'
6
5
  import { Button } from '@admin/components/ui/button'
7
- import { CODE_BLOCK_SHORTCUT_KEY, useCodeBlock } from '@admin/hooks/content-editor/use-code-block'
6
+ import { useCodeBlock } from '@admin/hooks/content-editor/use-code-block'
8
7
  import { useTiptapEditor } from '@admin/hooks/content-editor/use-tiptap-editor'
9
- import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
10
8
  import { useCallback } from 'react'
11
9
  import {
12
10
  getControlTooltipTitle,
13
11
  shouldHideUnavailableControl,
14
12
  shouldShowControlShortcut
15
13
  } from '../control-options'
14
+ import { CodeBlockShortcutBadge } from './code-block-shortcut-badge'
16
15
 
17
16
  type EditorButtonProps = React.ComponentProps<typeof Button> & {
18
17
  tooltip?: ControlTooltip
19
18
  }
20
19
 
20
+ export { CodeBlockShortcutBadge } from './code-block-shortcut-badge'
21
+
21
22
  export interface CodeBlockButtonProps
22
23
  extends Omit<EditorButtonProps, 'type'>, Omit<UseCodeBlockConfig, 'hideWhenUnavailable'> {
23
24
  availability?: ControlAvailability
@@ -25,14 +26,6 @@ export interface CodeBlockButtonProps
25
26
  shortcut?: ControlShortcut
26
27
  }
27
28
 
28
- export function CodeBlockShortcutBadge({
29
- shortcutKeys = CODE_BLOCK_SHORTCUT_KEY
30
- }: {
31
- shortcutKeys?: string
32
- }) {
33
- return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
34
- }
35
-
36
29
  export function CodeBlockButton({
37
30
  editor: providedEditor,
38
31
  availability,
@@ -0,0 +1,15 @@
1
+ 'use client'
2
+
3
+ import { Badge } from '@admin/components/ui/badge'
4
+ import { CODE_BLOCK_SHORTCUT_KEY } from '@admin/hooks/content-editor/use-code-block'
5
+ import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
6
+
7
+ function CodeBlockShortcutBadge({
8
+ shortcutKeys = CODE_BLOCK_SHORTCUT_KEY
9
+ }: {
10
+ shortcutKeys?: string
11
+ }) {
12
+ return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
13
+ }
14
+
15
+ export { CodeBlockShortcutBadge }