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
@@ -2,14 +2,9 @@
2
2
 
3
3
  import type { ControlAvailability, ControlShortcut, ControlTooltip } from '../control-options'
4
4
  import type { UseColorHighlightConfig } from '@admin/hooks/content-editor/use-color-highlight'
5
- import { Badge } from '@admin/components/ui/badge'
6
5
  import { Button } from '@admin/components/ui/button'
7
- import {
8
- COLOR_HIGHLIGHT_SHORTCUT_KEY,
9
- useColorHighlight
10
- } from '@admin/hooks/content-editor/use-color-highlight'
6
+ import { useColorHighlight } from '@admin/hooks/content-editor/use-color-highlight'
11
7
  import { useTiptapEditor } from '@admin/hooks/content-editor/use-tiptap-editor'
12
- import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
13
8
  import { cn } from '@admin/utils/shared/cn'
14
9
  import { useCallback, useMemo } from 'react'
15
10
  import {
@@ -17,11 +12,16 @@ import {
17
12
  shouldHideUnavailableControl,
18
13
  shouldShowControlShortcut
19
14
  } from '../control-options'
15
+ import { ColorHighlightShortcutBadge } from './color-highlight-shortcut-badge'
16
+ import { HighlightSwatch } from './highlight-swatch'
20
17
 
21
18
  type EditorButtonProps = React.ComponentProps<typeof Button> & {
22
19
  tooltip?: ControlTooltip
23
20
  }
24
21
 
22
+ export { ColorHighlightShortcutBadge } from './color-highlight-shortcut-badge'
23
+ export { HighlightSwatch } from './highlight-swatch'
24
+
25
25
  export interface ColorHighlightButtonProps
26
26
  extends Omit<EditorButtonProps, 'type'>, Omit<UseColorHighlightConfig, 'hideWhenUnavailable'> {
27
27
  availability?: ControlAvailability
@@ -29,42 +29,6 @@ export interface ColorHighlightButtonProps
29
29
  shortcut?: ControlShortcut
30
30
  }
31
31
 
32
- export function ColorHighlightShortcutBadge({
33
- shortcutKeys = COLOR_HIGHLIGHT_SHORTCUT_KEY
34
- }: {
35
- shortcutKeys?: string
36
- }) {
37
- return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
38
- }
39
-
40
- export function HighlightSwatch({ highlightColor }: { highlightColor: string }) {
41
- return (
42
- <span
43
- className={cn(
44
- 'relative -mx-[0.175rem] size-5 rounded-sm transition-transform duration-200 ease-in-out',
45
- 'bg-[var(--highlight-color)]',
46
- 'shadow-[inset_0_0_0_1px_var(--highlight-shadow),_0_1px_2px_var(--highlight-shadow-soft)]',
47
- "after:absolute after:inset-0 after:box-border after:size-full after:rounded-sm after:border after:opacity-0 after:transition-opacity after:duration-200 after:ease-in-out after:content-['']",
48
- 'after:border-[var(--highlight-after-border)]',
49
- 'group-data-[active-state=on]/highlight:scale-110',
50
- 'group-data-[highlighted=true]/highlight:scale-110',
51
- 'group-data-[active-state=on]/highlight:after:opacity-100',
52
- 'group-data-[highlighted=true]/highlight:after:opacity-100'
53
- )}
54
- style={
55
- {
56
- '--highlight-color': highlightColor,
57
- '--highlight-shadow':
58
- 'color-mix(in oklab, var(--highlight-border-color, var(--highlight-color)) 72%, var(--foreground) 28%)',
59
- '--highlight-shadow-soft': 'color-mix(in oklab, var(--foreground) 10%, transparent)',
60
- '--highlight-after-border':
61
- 'color-mix(in oklab, var(--highlight-border-color, var(--highlight-color)) 52%, var(--foreground) 48%)'
62
- } as React.CSSProperties
63
- }
64
- />
65
- )
66
- }
67
-
68
32
  export function ColorHighlightButton({
69
33
  editor: providedEditor,
70
34
  availability,
@@ -0,0 +1,15 @@
1
+ 'use client'
2
+
3
+ import { Badge } from '@admin/components/ui/badge'
4
+ import { COLOR_HIGHLIGHT_SHORTCUT_KEY } from '@admin/hooks/content-editor/use-color-highlight'
5
+ import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
6
+
7
+ function ColorHighlightShortcutBadge({
8
+ shortcutKeys = COLOR_HIGHLIGHT_SHORTCUT_KEY
9
+ }: {
10
+ shortcutKeys?: string
11
+ }) {
12
+ return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
13
+ }
14
+
15
+ export { ColorHighlightShortcutBadge }
@@ -0,0 +1,34 @@
1
+ 'use client'
2
+
3
+ import type { CSSProperties } from 'react'
4
+ import { cn } from '@admin/utils/shared/cn'
5
+
6
+ function HighlightSwatch({ highlightColor }: { highlightColor: string }) {
7
+ return (
8
+ <span
9
+ className={cn(
10
+ 'relative -mx-[0.175rem] size-5 rounded-sm transition-transform duration-200 ease-in-out',
11
+ 'bg-[var(--highlight-color)]',
12
+ 'shadow-[inset_0_0_0_1px_var(--highlight-shadow),_0_1px_2px_var(--highlight-shadow-soft)]',
13
+ "after:absolute after:inset-0 after:box-border after:size-full after:rounded-sm after:border after:opacity-0 after:transition-opacity after:duration-200 after:ease-in-out after:content-['']",
14
+ 'after:border-[var(--highlight-after-border)]',
15
+ 'group-data-[active-state=on]/highlight:scale-110',
16
+ 'group-data-[highlighted=true]/highlight:scale-110',
17
+ 'group-data-[active-state=on]/highlight:after:opacity-100',
18
+ 'group-data-[highlighted=true]/highlight:after:opacity-100'
19
+ )}
20
+ style={
21
+ {
22
+ '--highlight-color': highlightColor,
23
+ '--highlight-shadow':
24
+ 'color-mix(in oklab, var(--highlight-border-color, var(--highlight-color)) 72%, var(--foreground) 28%)',
25
+ '--highlight-shadow-soft': 'color-mix(in oklab, var(--foreground) 10%, transparent)',
26
+ '--highlight-after-border':
27
+ 'color-mix(in oklab, var(--highlight-border-color, var(--highlight-color)) 52%, var(--foreground) 48%)'
28
+ } as CSSProperties
29
+ }
30
+ />
31
+ )
32
+ }
33
+
34
+ export { HighlightSwatch }
@@ -69,20 +69,22 @@ export function ColorHighlightPopover({
69
69
 
70
70
  return (
71
71
  <Popover open={isOpen} onOpenChange={handleOpenChange}>
72
- <PopoverTrigger asChild>
73
- <ColorHighlightPopoverButton
74
- disabled={disabled || !canColorHighlight}
75
- data-active-state={isActive ? 'on' : 'off'}
76
- data-disabled={disabled || !canColorHighlight}
77
- aria-pressed={isActive}
78
- aria-label={label}
79
- title={label}
80
- tooltip={tooltip}
81
- {...props}
82
- ref={ref}
83
- >
84
- <Icon />
85
- </ColorHighlightPopoverButton>
72
+ <PopoverTrigger
73
+ render={
74
+ <ColorHighlightPopoverButton
75
+ disabled={disabled || !canColorHighlight}
76
+ data-active-state={isActive ? 'on' : 'off'}
77
+ data-disabled={disabled || !canColorHighlight}
78
+ aria-pressed={isActive}
79
+ aria-label={label}
80
+ title={label}
81
+ tooltip={tooltip}
82
+ {...props}
83
+ ref={ref}
84
+ />
85
+ }
86
+ >
87
+ <Icon />
86
88
  </PopoverTrigger>
87
89
  <PopoverContent
88
90
  aria-label="Highlight colors"
@@ -31,19 +31,21 @@ export function SourceColorHighlightPopover({
31
31
 
32
32
  return (
33
33
  <Popover open={isOpen} onOpenChange={setIsOpen}>
34
- <PopoverTrigger asChild>
35
- <ColorHighlightPopoverButton
36
- disabled={disabled}
37
- data-active-state="off"
38
- data-disabled={disabled}
39
- aria-pressed={false}
40
- aria-label="Highlight"
41
- title="Highlight"
42
- tooltip={tooltip}
43
- {...props}
44
- >
45
- <HighlighterIcon />
46
- </ColorHighlightPopoverButton>
34
+ <PopoverTrigger
35
+ render={
36
+ <ColorHighlightPopoverButton
37
+ disabled={disabled}
38
+ data-active-state="off"
39
+ data-disabled={disabled}
40
+ aria-pressed={false}
41
+ aria-label="Highlight"
42
+ title="Highlight"
43
+ tooltip={tooltip}
44
+ {...props}
45
+ />
46
+ }
47
+ >
48
+ <HighlighterIcon />
47
49
  </PopoverTrigger>
48
50
  <PopoverContent
49
51
  aria-label="Highlight colors"
@@ -27,7 +27,7 @@ export function HeadingDropdownMenuItem({
27
27
  disabled={!canToggle}
28
28
  aria-label={label}
29
29
  title={label}
30
- onSelect={() => handleToggle()}
30
+ onClick={() => handleToggle()}
31
31
  >
32
32
  <Icon />
33
33
  <span className="tiptap-button-text">{label}</span>
@@ -61,35 +61,37 @@ export function HeadingDropdownMenu({
61
61
 
62
62
  return (
63
63
  <DropdownMenu modal={false} open={isOpen} onOpenChange={handleOpenChange}>
64
- <DropdownMenuTrigger asChild>
65
- <Button
66
- type="button"
67
- variant="ghost"
68
- data-active-state={isActive ? 'on' : 'off'}
69
- role="button"
70
- tabIndex={-1}
71
- disabled={!canToggle}
72
- data-disabled={!canToggle}
73
- aria-label="Format text as heading"
74
- aria-pressed={isActive}
75
- title={getControlTooltipTitle(tooltip, 'Heading')}
76
- size="icon-sm"
77
- className="w-auto px-2"
78
- {...buttonProps}
79
- ref={ref}
80
- onPointerDown={(event) => event.preventDefault()}
81
- onClick={() => handleOpenChange(!isOpen)}
82
- >
83
- {children ? (
84
- children
85
- ) : (
86
- <>
87
- <Icon />
88
- <ChevronDownIcon className="tiptap-button-dropdown-small" />
89
- </>
90
- )}
91
- </Button>
92
- </DropdownMenuTrigger>
64
+ <DropdownMenuTrigger
65
+ render={
66
+ <Button
67
+ type="button"
68
+ variant="ghost"
69
+ data-active-state={isActive ? 'on' : 'off'}
70
+ role="button"
71
+ tabIndex={-1}
72
+ disabled={!canToggle}
73
+ data-disabled={!canToggle}
74
+ aria-label="Format text as heading"
75
+ aria-pressed={isActive}
76
+ title={getControlTooltipTitle(tooltip, 'Heading')}
77
+ size="icon-sm"
78
+ className="w-auto px-2"
79
+ {...buttonProps}
80
+ ref={ref}
81
+ onPointerDown={(event) => event.preventDefault()}
82
+ onClick={() => handleOpenChange(!isOpen)}
83
+ >
84
+ {children ? (
85
+ children
86
+ ) : (
87
+ <>
88
+ <Icon />
89
+ <ChevronDownIcon className="tiptap-button-dropdown-small" />
90
+ </>
91
+ )}
92
+ </Button>
93
+ }
94
+ ></DropdownMenuTrigger>
93
95
 
94
96
  <DropdownMenuContent
95
97
  align="start"
@@ -62,19 +62,21 @@ export function LinkControlPopover({
62
62
 
63
63
  return (
64
64
  <Popover open={isOpen} onOpenChange={handleOnOpenChange}>
65
- <PopoverTrigger asChild>
66
- <LinkButton
67
- {...buttonProps}
68
- disabled={isDisabled}
69
- data-active-state={isActive ? 'on' : 'off'}
70
- data-disabled={isDisabled}
71
- aria-label={label}
72
- aria-pressed={isActive}
73
- onClick={handleClick}
74
- ref={ref}
75
- >
76
- {children ?? <LinkIcon />}
77
- </LinkButton>
65
+ <PopoverTrigger
66
+ render={
67
+ <LinkButton
68
+ {...buttonProps}
69
+ disabled={isDisabled}
70
+ data-active-state={isActive ? 'on' : 'off'}
71
+ data-disabled={isDisabled}
72
+ aria-label={label}
73
+ aria-pressed={isActive}
74
+ onClick={handleClick}
75
+ ref={ref}
76
+ />
77
+ }
78
+ >
79
+ {children ?? <LinkIcon />}
78
80
  </PopoverTrigger>
79
81
 
80
82
  <PopoverContent className="w-auto max-w-[calc(100vw-2rem)]">
@@ -36,7 +36,7 @@ export function ListDropdownMenuItem({
36
36
  disabled={!canToggle}
37
37
  aria-label={itemLabel}
38
38
  title={itemLabel}
39
- onSelect={() => handleToggle()}
39
+ onClick={() => handleToggle()}
40
40
  >
41
41
  <Icon />
42
42
  <span className="tiptap-button-text">{label}</span>
@@ -59,26 +59,28 @@ export function ListDropdownMenu({
59
59
 
60
60
  return (
61
61
  <DropdownMenu modal={false} open={isOpen} onOpenChange={handleOnOpenChange}>
62
- <DropdownMenuTrigger asChild>
63
- <Button
64
- type="button"
65
- variant="ghost"
66
- data-active-state={isActive ? 'on' : 'off'}
67
- role="button"
68
- tabIndex={-1}
69
- disabled={!canToggle}
70
- data-disabled={!canToggle}
71
- aria-label="List options"
72
- title={getControlTooltipTitle(tooltip, 'List')}
73
- size="icon-sm"
74
- className="w-auto px-2"
75
- {...props}
76
- onPointerDown={(event) => event.preventDefault()}
77
- onClick={() => handleOnOpenChange(!isOpen)}
78
- >
79
- <Icon />
80
- <ChevronDownIcon className="tiptap-button-dropdown-small" />
81
- </Button>
62
+ <DropdownMenuTrigger
63
+ render={
64
+ <Button
65
+ type="button"
66
+ variant="ghost"
67
+ data-active-state={isActive ? 'on' : 'off'}
68
+ role="button"
69
+ tabIndex={-1}
70
+ disabled={!canToggle}
71
+ data-disabled={!canToggle}
72
+ aria-label="List options"
73
+ title={getControlTooltipTitle(tooltip, 'List')}
74
+ size="icon-sm"
75
+ className="w-auto px-2"
76
+ {...props}
77
+ onPointerDown={(event) => event.preventDefault()}
78
+ onClick={() => handleOnOpenChange(!isOpen)}
79
+ />
80
+ }
81
+ >
82
+ <Icon />
83
+ <ChevronDownIcon className="tiptap-button-dropdown-small" />
82
84
  </DropdownMenuTrigger>
83
85
 
84
86
  <DropdownMenuContent
@@ -1,23 +1,24 @@
1
1
  'use client'
2
2
 
3
3
  import type { ControlAvailability, ControlShortcut, ControlTooltip } from '../control-options'
4
- import type { Mark, UseMarkConfig } from '@admin/hooks/content-editor/use-mark'
5
- import { Badge } from '@admin/components/ui/badge'
4
+ import type { UseMarkConfig } from '@admin/hooks/content-editor/use-mark'
6
5
  import { Button } from '@admin/components/ui/button'
7
- import { MARK_SHORTCUT_KEYS, useMark } from '@admin/hooks/content-editor/use-mark'
6
+ import { useMark } from '@admin/hooks/content-editor/use-mark'
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 { MarkShortcutBadge } from './mark-shortcut-badge'
16
15
 
17
16
  type EditorButtonProps = React.ComponentProps<typeof Button> & {
18
17
  tooltip?: ControlTooltip
19
18
  }
20
19
 
20
+ export { MarkShortcutBadge } from './mark-shortcut-badge'
21
+
21
22
  export interface MarkButtonProps
22
23
  extends Omit<EditorButtonProps, 'type'>, Omit<UseMarkConfig, 'hideWhenUnavailable'> {
23
24
  availability?: ControlAvailability
@@ -25,16 +26,6 @@ export interface MarkButtonProps
25
26
  shortcut?: ControlShortcut
26
27
  }
27
28
 
28
- export function MarkShortcutBadge({
29
- type,
30
- shortcutKeys = MARK_SHORTCUT_KEYS[type]
31
- }: {
32
- type: Mark
33
- shortcutKeys?: string
34
- }) {
35
- return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
36
- }
37
-
38
29
  export function MarkButton({
39
30
  editor: providedEditor,
40
31
  availability,
@@ -0,0 +1,18 @@
1
+ 'use client'
2
+
3
+ import type { Mark } from '@admin/hooks/content-editor/use-mark'
4
+ import { Badge } from '@admin/components/ui/badge'
5
+ import { MARK_SHORTCUT_KEYS } from '@admin/hooks/content-editor/use-mark'
6
+ import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
7
+
8
+ function MarkShortcutBadge({
9
+ type,
10
+ shortcutKeys = MARK_SHORTCUT_KEYS[type]
11
+ }: {
12
+ type: Mark
13
+ shortcutKeys?: string
14
+ }) {
15
+ return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
16
+ }
17
+
18
+ export { MarkShortcutBadge }
@@ -0,0 +1,18 @@
1
+ 'use client'
2
+
3
+ import type { UndoRedoAction } from '@admin/hooks/content-editor/use-undo-redo'
4
+ import { Badge } from '@admin/components/ui/badge'
5
+ import { UNDO_REDO_SHORTCUT_KEYS } from '@admin/hooks/content-editor/use-undo-redo'
6
+ import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
7
+
8
+ function HistoryShortcutBadge({
9
+ action,
10
+ shortcutKeys = UNDO_REDO_SHORTCUT_KEYS[action]
11
+ }: {
12
+ action: UndoRedoAction
13
+ shortcutKeys?: string
14
+ }) {
15
+ return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
16
+ }
17
+
18
+ export { HistoryShortcutBadge }
@@ -1,23 +1,24 @@
1
1
  'use client'
2
2
 
3
3
  import type { ControlAvailability, ControlShortcut, ControlTooltip } from '../control-options'
4
- import type { UndoRedoAction, UseUndoRedoConfig } from '@admin/hooks/content-editor/use-undo-redo'
5
- import { Badge } from '@admin/components/ui/badge'
4
+ import type { UseUndoRedoConfig } from '@admin/hooks/content-editor/use-undo-redo'
6
5
  import { Button } from '@admin/components/ui/button'
7
6
  import { useTiptapEditor } from '@admin/hooks/content-editor/use-tiptap-editor'
8
- import { UNDO_REDO_SHORTCUT_KEYS, useUndoRedo } from '@admin/hooks/content-editor/use-undo-redo'
9
- import { parseShortcutKeys } from '@admin/utils/editor/parse-shortcut-keys'
7
+ import { useUndoRedo } from '@admin/hooks/content-editor/use-undo-redo'
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 { HistoryShortcutBadge } from './history-shortcut-badge'
16
15
 
17
16
  type EditorButtonProps = React.ComponentProps<typeof Button> & {
18
17
  tooltip?: ControlTooltip
19
18
  }
20
19
 
20
+ export { HistoryShortcutBadge } from './history-shortcut-badge'
21
+
21
22
  export interface UndoRedoButtonProps
22
23
  extends Omit<EditorButtonProps, 'type'>, Omit<UseUndoRedoConfig, 'hideWhenUnavailable'> {
23
24
  availability?: ControlAvailability
@@ -25,16 +26,6 @@ export interface UndoRedoButtonProps
25
26
  shortcut?: ControlShortcut
26
27
  }
27
28
 
28
- export function HistoryShortcutBadge({
29
- action,
30
- shortcutKeys = UNDO_REDO_SHORTCUT_KEYS[action]
31
- }: {
32
- action: UndoRedoAction
33
- shortcutKeys?: string
34
- }) {
35
- return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>
36
- }
37
-
38
29
  export function UndoRedoButton({
39
30
  editor: providedEditor,
40
31
  action,
@@ -32,20 +32,22 @@ export function DatePicker({
32
32
 
33
33
  return (
34
34
  <Popover open={open} onOpenChange={setOpen}>
35
- <PopoverTrigger asChild>
36
- <Button
37
- variant="outline"
38
- size="lg"
39
- className={cn(
40
- 'w-full justify-start pl-3! text-left font-normal',
41
- { 'text-muted-foreground': !date },
42
- className
43
- )}
44
- disabled={disabled}
45
- >
46
- <CalendarIcon className="size-4" />
47
- {date ? format(date, 'PPP') : <span>{placeholder}</span>}
48
- </Button>
35
+ <PopoverTrigger
36
+ render={
37
+ <Button
38
+ variant="outline"
39
+ size="lg"
40
+ className={cn(
41
+ 'w-full justify-start pl-3! text-left font-normal',
42
+ { 'text-muted-foreground': !date },
43
+ className
44
+ )}
45
+ disabled={disabled}
46
+ />
47
+ }
48
+ >
49
+ <CalendarIcon className="size-4" />
50
+ {date ? format(date, 'PPP') : <span>{placeholder}</span>}
49
51
  </PopoverTrigger>
50
52
  <PopoverContent className="w-auto overflow-hidden p-0" align="start">
51
53
  <Calendar
@@ -130,12 +130,14 @@ export function DateRangePicker({
130
130
  }
131
131
  }}
132
132
  >
133
- <PopoverTrigger asChild>
134
- <Button variant="outline" className={cn('w-[206px]', className)} disabled={disabled}>
135
- <CalendarIcon />
136
- <span className="min-w-0 flex-1 truncate text-left tabular-nums">{triggerLabel}</span>
137
- <ChevronDown />
138
- </Button>
133
+ <PopoverTrigger
134
+ render={
135
+ <Button variant="outline" className={cn('w-[206px]', className)} disabled={disabled} />
136
+ }
137
+ >
138
+ <CalendarIcon />
139
+ <span className="min-w-0 flex-1 truncate text-left tabular-nums">{triggerLabel}</span>
140
+ <ChevronDown />
139
141
  </PopoverTrigger>
140
142
  <PopoverContent className="w-[282px] gap-0 overflow-hidden rounded-sm p-0" align="start">
141
143
  <Calendar
@@ -0,0 +1,10 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import type { IconName } from 'lucide-react/dynamic'
5
+ import { DynamicIcon } from 'lucide-react/dynamic'
6
+
7
+ const MemoizedIcon = React.memo(({ name }: { name: IconName }) => <DynamicIcon name={name} />)
8
+ MemoizedIcon.displayName = 'MemoizedIcon'
9
+
10
+ export { MemoizedIcon }
@@ -19,6 +19,7 @@ import Fuse from 'fuse.js'
19
19
  import { DynamicIcon, dynamicIconImports } from 'lucide-react/dynamic'
20
20
  import { useCallback, useMemo, useState } from 'react'
21
21
  import { useDebounceValue } from 'usehooks-ts'
22
+ import { MemoizedIcon } from './icon-picker/memoized-icon'
22
23
  import { IconsColumnSkeleton } from './icons-column-skeleton'
23
24
  import { iconsData } from './icons-data'
24
25
 
@@ -26,9 +27,6 @@ const DEFAULT_ICONS = iconsData.filter((icon: IconData) => {
26
27
  return icon.name in dynamicIconImports
27
28
  })
28
29
 
29
- const MemoizedIcon = React.memo(({ name }: { name: IconName }) => <DynamicIcon name={name} />)
30
- MemoizedIcon.displayName = 'MemoizedIcon'
31
-
32
30
  interface IconPickerProps extends Omit<
33
31
  React.ComponentPropsWithoutRef<typeof PopoverTrigger>,
34
32
  'onSelect' | 'onOpenChange'
@@ -348,16 +346,17 @@ const IconPicker = React.forwardRef<React.ComponentRef<typeof PopoverTrigger>, I
348
346
  }, [isPopoverVisible, virtualizer])
349
347
 
350
348
  const selectedIconName = (value || selectedIcon) as IconName | undefined
349
+ const trigger = React.isValidElement(children) ? (
350
+ children
351
+ ) : (
352
+ <Button variant="outline" size="lg">
353
+ {selectedIconName ? <DynamicIcon name={selectedIconName} /> : triggerPlaceholder}
354
+ </Button>
355
+ )
351
356
 
352
357
  return (
353
358
  <Popover open={open ?? isOpen} onOpenChange={handleOpenChange} modal={modal}>
354
- <PopoverTrigger ref={ref} asChild {...props}>
355
- {children || (
356
- <Button variant="outline" size="lg">
357
- {selectedIconName ? <DynamicIcon name={selectedIconName} /> : triggerPlaceholder}
358
- </Button>
359
- )}
360
- </PopoverTrigger>
359
+ <PopoverTrigger ref={ref} render={trigger} {...props} />
361
360
  <PopoverContent className="w-64 p-2">
362
361
  {searchable && (
363
362
  <Input placeholder={searchPlaceholder} onChange={handleSearchChange} className="mb-2" />
@@ -170,10 +170,8 @@ export function NestedObjectListField({
170
170
 
171
171
  <CardContent className="p-0!">
172
172
  <Accordion
173
- type="single"
174
- collapsible
175
- value={expanded}
176
- onValueChange={handleExpandedChange}
173
+ value={expanded ? [expanded] : []}
174
+ onValueChange={(nextValue) => handleExpandedChange(nextValue[0] ?? '')}
177
175
  className="border-none"
178
176
  >
179
177
  {items.map((_, index) => (