betterstart-cli 0.0.96 → 0.0.97

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 (145) hide show
  1. package/dist/assets/adapters/next/integrations/r2/actions/r2.ts +4 -4
  2. package/dist/assets/adapters/next/integrations/railway-bucket/actions/railway-bucket.ts +5 -5
  3. package/dist/assets/adapters/next/templates/init/components/layouts/admin-header.tsx +6 -6
  4. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-branding-skeleton.tsx +2 -2
  5. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu-skeleton.tsx +1 -1
  6. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu.tsx +8 -8
  7. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar.tsx +4 -4
  8. package/dist/assets/adapters/next/templates/init/components/layouts/content-skeleton.tsx +4 -4
  9. package/dist/assets/adapters/next/templates/init/components/layouts/sidebar-branding.tsx +4 -4
  10. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-grid.tsx +1 -1
  11. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table-pagination.tsx +3 -3
  12. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table.tsx +1 -1
  13. package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +1 -1
  14. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx +5 -5
  15. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/plain-code-fallback.tsx +1 -1
  16. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +1 -1
  17. package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +5 -5
  18. package/dist/assets/adapters/next/templates/init/components/shared/entity-metadata.tsx +2 -2
  19. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +1 -1
  20. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +1 -1
  21. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog-content.tsx +3 -3
  22. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +1 -1
  23. package/dist/assets/adapters/next/templates/init/components/shared/media/media-filters-bar.tsx +2 -2
  24. package/dist/assets/adapters/next/templates/init/components/shared/media/media-gallery-dialog.tsx +2 -2
  25. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-item.tsx +3 -3
  26. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-pagination.tsx +4 -4
  27. package/dist/assets/adapters/next/templates/init/components/shared/media/media-preview.tsx +3 -3
  28. package/dist/assets/adapters/next/templates/init/components/shared/media/media-url-importer.tsx +3 -3
  29. package/dist/assets/adapters/next/templates/init/components/shared/page-header.tsx +4 -4
  30. package/dist/assets/adapters/next/templates/init/components/shared/search-input.tsx +5 -5
  31. package/dist/assets/adapters/next/templates/init/components/shared/sort-indicator.tsx +1 -1
  32. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +1 -1
  33. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-drag-overlay-item.tsx +1 -1
  34. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-item.tsx +2 -2
  35. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading-dropdown-menu.ts +0 -1
  36. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list-dropdown-menu.ts +0 -1
  37. package/dist/assets/adapters/next/templates/init/lib/actions/audit/get-audit-logs.ts +4 -1
  38. package/dist/assets/adapters/next/templates/init/lib/actions/forms/index.ts +1 -5
  39. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media.ts +4 -1
  40. package/dist/assets/adapters/next/templates/init/lib/actions/profile/index.ts +1 -5
  41. package/dist/assets/adapters/next/templates/init/lib/actions/upload/index.ts +1 -5
  42. package/dist/assets/adapters/next/templates/init/lib/db/core/schema.ts +4 -1
  43. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/runner.ts +1 -1
  44. package/dist/assets/adapters/next/templates/init/pages/admin-layout.tsx +1 -1
  45. package/dist/assets/adapters/next/templates/init/pages/auth-gate-rsc.tsx +1 -1
  46. package/dist/assets/adapters/next/templates/init/pages/dashboard-page.tsx +6 -6
  47. package/dist/assets/adapters/next/templates/init/pages/forgot-password-form.tsx +4 -4
  48. package/dist/assets/adapters/next/templates/init/pages/login-form.tsx +3 -3
  49. package/dist/assets/adapters/next/templates/init/pages/media/media-page-content.tsx +3 -3
  50. package/dist/assets/adapters/next/templates/init/pages/media/media-page-skeleton.tsx +1 -1
  51. package/dist/assets/adapters/next/templates/init/pages/minimal-account-shell.tsx +2 -2
  52. package/dist/assets/adapters/next/templates/init/pages/profile/profile-page.tsx +1 -1
  53. package/dist/assets/adapters/next/templates/init/pages/reset-password-form.tsx +3 -3
  54. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-columns.tsx +1 -1
  55. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-detail-drawer.tsx +1 -1
  56. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-detail-row.tsx +2 -2
  57. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-page-content.tsx +1 -1
  58. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-page-skeleton.tsx +1 -1
  59. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-table.tsx +2 -2
  60. package/dist/assets/adapters/next/templates/init/pages/settings/forms/forms-settings-page-content.tsx +1 -1
  61. package/dist/assets/adapters/next/templates/init/pages/settings/forms/forms-settings-page-skeleton.tsx +1 -1
  62. package/dist/assets/adapters/next/templates/init/pages/settings/forms/forms-settings-table.tsx +1 -1
  63. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-endpoint-dialog.tsx +3 -3
  64. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-columns.tsx +6 -6
  65. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-columns.tsx +7 -7
  66. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-page-content.tsx +1 -1
  67. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-table.tsx +2 -2
  68. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-page-content.tsx +1 -1
  69. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-page-skeleton.tsx +1 -1
  70. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-table.tsx +2 -2
  71. package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +4 -4
  72. package/dist/assets/adapters/next/templates/init/pages/users/users-page-content.tsx +1 -1
  73. package/dist/assets/adapters/next/templates/init/pages/users/users-page-skeleton.tsx +1 -1
  74. package/dist/assets/adapters/next/templates/init/pages/users/users-table.tsx +5 -5
  75. package/dist/assets/adapters/next/templates/init/types/table-meta.ts +1 -1
  76. package/dist/assets/shared-assets/react-admin/custom/content-editor/editor-toolbar.tsx +1 -1
  77. package/dist/assets/shared-assets/react-admin/custom/content-editor/index.tsx +2 -2
  78. package/dist/assets/shared-assets/react-admin/custom/content-editor/main-toolbar-content.tsx +4 -4
  79. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-bubble-menu.tsx +1 -1
  80. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-editor-controls.tsx +1 -1
  81. package/dist/assets/shared-assets/react-admin/custom/content-editor/mobile-toolbar-content.tsx +1 -1
  82. package/dist/assets/shared-assets/react-admin/custom/content-editor/remove-table-part-icon.tsx +1 -1
  83. package/dist/assets/shared-assets/react-admin/custom/content-editor/selection-bubble-menu.tsx +3 -3
  84. package/dist/assets/shared-assets/react-admin/custom/content-editor/slash-command-menu.tsx +6 -6
  85. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +7 -7
  86. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-add-controls.tsx +3 -3
  87. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-bubble-menu.tsx +2 -2
  88. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node.tsx +1 -1
  89. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +1 -2
  90. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +1 -2
  91. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +2 -3
  92. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-content.tsx +4 -2
  93. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +3 -2
  94. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover.tsx +5 -3
  95. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx +2 -1
  96. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-main.tsx +2 -2
  97. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-popover.tsx +1 -2
  98. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +1 -2
  99. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +1 -2
  100. package/dist/assets/shared-assets/react-admin/custom/date-picker.tsx +2 -2
  101. package/dist/assets/shared-assets/react-admin/custom/gallery-field.tsx +6 -6
  102. package/dist/assets/shared-assets/react-admin/custom/icon-picker.tsx +10 -8
  103. package/dist/assets/shared-assets/react-admin/custom/icons-column-skeleton.tsx +2 -2
  104. package/dist/assets/shared-assets/react-admin/custom/media-field-empty-state.tsx +5 -5
  105. package/dist/assets/shared-assets/react-admin/custom/media-field.tsx +7 -7
  106. package/dist/assets/shared-assets/react-admin/custom/nested-object-list-field.tsx +2 -2
  107. package/dist/assets/shared-assets/react-admin/custom/placeholder-card.tsx +1 -1
  108. package/dist/assets/shared-assets/react-admin/custom/placeholder.tsx +1 -1
  109. package/dist/assets/shared-assets/react-admin/custom/progressive-blur.tsx +1 -1
  110. package/dist/assets/shared-assets/react-admin/custom/sortable-gallery-item.tsx +3 -3
  111. package/dist/assets/shared-assets/react-admin/custom/upload-dropzone.tsx +6 -6
  112. package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +1 -1
  113. package/dist/assets/shared-assets/react-admin/ui/alert-dialog.tsx +4 -4
  114. package/dist/assets/shared-assets/react-admin/ui/badge.tsx +1 -1
  115. package/dist/assets/shared-assets/react-admin/ui/button-group.tsx +1 -1
  116. package/dist/assets/shared-assets/react-admin/ui/button.tsx +6 -6
  117. package/dist/assets/shared-assets/react-admin/ui/card.tsx +5 -5
  118. package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +1 -1
  119. package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +1 -1
  120. package/dist/assets/shared-assets/react-admin/ui/command.tsx +0 -1
  121. package/dist/assets/shared-assets/react-admin/ui/context-menu.tsx +2 -2
  122. package/dist/assets/shared-assets/react-admin/ui/dialog.tsx +3 -3
  123. package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +1 -1
  124. package/dist/assets/shared-assets/react-admin/ui/dropdown-menu.tsx +3 -3
  125. package/dist/assets/shared-assets/react-admin/ui/field.tsx +0 -1
  126. package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +2 -2
  127. package/dist/assets/shared-assets/react-admin/ui/input.tsx +1 -1
  128. package/dist/assets/shared-assets/react-admin/ui/menubar.tsx +2 -2
  129. package/dist/assets/shared-assets/react-admin/ui/pagination.tsx +0 -1
  130. package/dist/assets/shared-assets/react-admin/ui/scroll-area.tsx +1 -1
  131. package/dist/assets/shared-assets/react-admin/ui/select.tsx +2 -2
  132. package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +4 -4
  133. package/dist/assets/shared-assets/react-admin/ui/table.tsx +1 -1
  134. package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +2 -2
  135. package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +1 -1
  136. package/dist/assets/shared-assets/react-admin/ui/tooltip.tsx +1 -1
  137. package/dist/{chunk-LGZBMR7E.js → chunk-MJWUGEMK.js} +3 -3
  138. package/dist/cli.js +16179 -16153
  139. package/dist/cli.js.map +1 -1
  140. package/dist/index.d.ts +1 -1
  141. package/dist/index.js.map +1 -1
  142. package/dist/{template-reader-WRTNGRZV.js → template-reader-R2JIWUNK.js} +2 -2
  143. package/package.json +3 -3
  144. /package/dist/{chunk-LGZBMR7E.js.map → chunk-MJWUGEMK.js.map} +0 -0
  145. /package/dist/{template-reader-WRTNGRZV.js.map → template-reader-R2JIWUNK.js.map} +0 -0
@@ -40,16 +40,16 @@ export function SearchInput({
40
40
 
41
41
  return (
42
42
  <Form {...form}>
43
- <form onSubmit={form.handleSubmit(onSubmit)} className="flex items-center w-full">
43
+ <form onSubmit={form.handleSubmit(onSubmit)} className="flex w-full items-center">
44
44
  <FormField
45
45
  control={form.control}
46
46
  name="search"
47
47
  render={({ field }) => (
48
48
  <FormItem className="w-full">
49
49
  <div className="relative w-full">
50
- <Search className="text-foreground pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2" />
50
+ <Search className="pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-foreground" />
51
51
  <FormControl>
52
- <Input {...field} placeholder={placeholder} className="pl-9 w-full" />
52
+ <Input {...field} placeholder={placeholder} className="w-full pl-9" />
53
53
  </FormControl>
54
54
 
55
55
  {value ? (
@@ -63,7 +63,7 @@ export function SearchInput({
63
63
  onSearch(null)
64
64
  }}
65
65
  aria-label="Clear search"
66
- className="absolute right-2 top-1/2 -translate-y-1/2 text-foreground size-7"
66
+ className="absolute top-1/2 right-2 size-7 -translate-y-1/2 text-foreground"
67
67
  >
68
68
  <X className="size-4" />
69
69
  </Button>
@@ -72,7 +72,7 @@ export function SearchInput({
72
72
  type="submit"
73
73
  variant="ghost"
74
74
  size="icon-sm"
75
- className="absolute right-2 top-1/2 -translate-y-1/2 text-foreground size-7"
75
+ className="absolute top-1/2 right-2 size-7 -translate-y-1/2 text-foreground"
76
76
  disabled={isPending}
77
77
  >
78
78
  <CornerDownLeft className="size-4" />
@@ -18,7 +18,7 @@ export function SortIndicator({ direction }: { direction: false | 'asc' | 'desc'
18
18
  <Icon
19
19
  aria-hidden="true"
20
20
  className={cn(
21
- 'size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-visible:opacity-100 group-hover/resize-header:opacity-100',
21
+ 'size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-hover/resize-header:opacity-100 group-focus-visible:opacity-100',
22
22
  {
23
23
  'text-foreground': direction !== false
24
24
  }
@@ -194,7 +194,7 @@ export function SortOrderDialog({
194
194
  onAnimationEnd={handleDrawerAnimationEnd}
195
195
  >
196
196
  <DrawerContent className="h-full w-full overflow-hidden">
197
- <div className="relative z-10 flex min-h-0 flex-1 flex-col overflow-hidden gap-3">
197
+ <div className="relative z-10 flex min-h-0 flex-1 flex-col gap-3 overflow-hidden">
198
198
  <DrawerHeader>
199
199
  <DrawerTitle>{title}</DrawerTitle>
200
200
  {description ? <DrawerDescription>{description}</DrawerDescription> : null}
@@ -6,7 +6,7 @@ export function DragOverlayItem({ label }: { label: string }) {
6
6
  <Button
7
7
  type="button"
8
8
  variant="outline"
9
- className="shrink-0 w-full justify-start gap-2 px-2 font-normal touch-none cursor-grabbing"
9
+ className="w-full shrink-0 cursor-grabbing touch-none justify-start gap-2 px-2 font-normal"
10
10
  >
11
11
  <GripVertical strokeWidth={1} />
12
12
  <span className="min-w-0 truncate text-sm">{label}</span>
@@ -16,9 +16,9 @@ export function SortableItem({ id, label }: SortOrderItemData) {
16
16
  type="button"
17
17
  variant="outline"
18
18
  className={cn(
19
- 'shrink-0 w-full justify-start gap-2 px-2 font-normal cursor-grab touch-none active:cursor-grabbing',
19
+ 'w-full shrink-0 cursor-grab touch-none justify-start gap-2 px-2 font-normal active:cursor-grabbing',
20
20
  {
21
- 'opacity-50 z-20': isDragging
21
+ 'z-20 opacity-50': isDragging
22
22
  }
23
23
  )}
24
24
  {...attributes}
@@ -6,7 +6,6 @@ import type { Editor } from '@tiptap/react'
6
6
  // --- Icons ---
7
7
  import { HeadingIcon } from 'lucide-react'
8
8
  import { useEffect, useState } from 'react'
9
-
10
9
  import {
11
10
  canToggle,
12
11
  headingIcons,
@@ -8,7 +8,6 @@ import type { Editor } from '@tiptap/react'
8
8
  // --- Icons ---
9
9
  import { ListIcon, ListOrderedIcon, ListTodoIcon } from 'lucide-react'
10
10
  import { useEffect, useMemo, useState } from 'react'
11
-
12
11
  import { canToggleList, isListActive, type ListType, listIcons } from './use-list'
13
12
 
14
13
  /**
@@ -94,7 +94,10 @@ async function queryAuditLogs(query: AuditLogQuery = {}): Promise<AuditLogPage>
94
94
  .orderBy(...orderBy)
95
95
  const [rows, countResult] = await Promise.all([
96
96
  pageSize ? orderedQuery.limit(pageSize).offset(offset) : orderedQuery,
97
- db.select({ count: sql<number>`count(*)` }).from(auditLog).where(where)
97
+ db
98
+ .select({ count: sql<number>`count(*)` })
99
+ .from(auditLog)
100
+ .where(where)
98
101
  ])
99
102
  const total = Number(countResult[0]?.count ?? 0)
100
103
  const resolvedPageSize = pageSize ?? total
@@ -1,8 +1,4 @@
1
1
  export { getAllFormSettings } from './get-all-form-settings'
2
2
  export { getFormSettings } from './get-form-settings'
3
- export type {
4
- FormSettingsData,
5
- FormSettingsResult,
6
- UpsertFormSettingsInput
7
- } from './types'
3
+ export type { FormSettingsData, FormSettingsResult, UpsertFormSettingsInput } from './types'
8
4
  export { upsertFormSettings } from './upsert-form-settings'
@@ -57,7 +57,10 @@ export async function getMedia(params: GetMediaParams = {}) {
57
57
 
58
58
  const [items, countResult] = await Promise.all([
59
59
  itemsQuery,
60
- db.select({ count: sql<number>`count(*)` }).from(adminMedia).where(where)
60
+ db
61
+ .select({ count: sql<number>`count(*)` })
62
+ .from(adminMedia)
63
+ .where(where)
61
64
  ])
62
65
 
63
66
  const result: GetMediaResult = {
@@ -1,9 +1,5 @@
1
1
  export { changeOwnPassword } from './change-own-password'
2
2
  export { invalidateUsersCache } from './invalidate-users-cache'
3
3
  export { isEmailConfigured } from './is-email-configured'
4
- export type {
5
- ChangeOwnPasswordInput,
6
- ChangeOwnPasswordResult,
7
- UpdateEmailResult
8
- } from './types'
4
+ export type { ChangeOwnPasswordInput, ChangeOwnPasswordResult, UpdateEmailResult } from './types'
9
5
  export { updateEmail } from './update-email'
@@ -1,8 +1,4 @@
1
- export type {
2
- FileValidationConfig,
3
- RemoteUploadOptions,
4
- UploadResult
5
- } from './types'
1
+ export type { FileValidationConfig, RemoteUploadOptions, UploadResult } from './types'
6
2
  export { uploadFile } from './upload-file'
7
3
  export { uploadFiles } from './upload-files'
8
4
  export { uploadImageFromUrl } from './upload-image-from-url'
@@ -224,7 +224,10 @@ export const auditLog = pgTable(
224
224
  sourceType: varchar('source_type', { length: 50 }).notNull().default('server_action'),
225
225
  ipAddress: varchar('ip_address', { length: 100 }),
226
226
  userAgent: varchar('user_agent', { length: 500 }),
227
- changedFields: text('changed_fields').array().notNull().default(sql`ARRAY[]::text[]`),
227
+ changedFields: text('changed_fields')
228
+ .array()
229
+ .notNull()
230
+ .default(sql`ARRAY[]::text[]`),
228
231
  metadata: jsonb('metadata'),
229
232
  createdAt: timestamp('created_at', { precision: 3, mode: 'string' })
230
233
  .default(sql`CURRENT_TIMESTAMP`)
@@ -92,7 +92,7 @@ function toAdminEventContext(
92
92
  metadata: {
93
93
  entityType: context.entityType,
94
94
  schemaType: context.schemaType ?? 'entity',
95
- ...(context.metadata ?? {})
95
+ ...context.metadata
96
96
  }
97
97
  }
98
98
  }
@@ -11,7 +11,7 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
11
11
  <AdminProviders>
12
12
  <div
13
13
  className={cn(
14
- 'admin-root size-screen antialiased mt-px',
14
+ 'admin-root size-screen mt-px antialiased',
15
15
  GeistSans.variable,
16
16
  GeistMono.variable
17
17
  )}
@@ -8,7 +8,7 @@ export async function AuthGateRsc({ children }: { children: React.ReactNode }) {
8
8
  return (
9
9
  <SidebarProvider className="min-h-svh">
10
10
  <AdminSidebar />
11
- <div className="relative flex min-w-0 flex-1 flex-col [--admin-shell-content-left:0px] md:[--admin-shell-content-left:var(--sidebar-width)] md:peer-data-[state=collapsed]:[--admin-shell-content-left:var(--sidebar-width-icon)] pb-14">
11
+ <div className="relative flex min-w-0 flex-1 flex-col pb-14 [--admin-shell-content-left:0px] md:[--admin-shell-content-left:var(--sidebar-width)] md:peer-data-[state=collapsed]:[--admin-shell-content-left:var(--sidebar-width-icon)]">
12
12
  {children}
13
13
  </div>
14
14
  </SidebarProvider>
@@ -34,7 +34,7 @@ export default function DashboardPage() {
34
34
  <React.Fragment>
35
35
  <PageHeader title="Dashboard" hasBackButton={false} />
36
36
 
37
- <div className="p-6 space-y-6 w-full">
37
+ <div className="w-full space-y-6 p-6">
38
38
  <Card>
39
39
  <CardHeader>
40
40
  <div className="flex items-center gap-2">
@@ -44,13 +44,13 @@ export default function DashboardPage() {
44
44
  </CardHeader>
45
45
  <CardContent className="p-10!">
46
46
  <div className="grid grid-cols-2 gap-10">
47
- <div className="flex flex-col w-full gap-1">
47
+ <div className="flex w-full flex-col gap-1">
48
48
  <p className="text-base font-medium">Hey, let's get started</p>
49
49
  <p className="text-muted-foreground">
50
50
  Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.
51
51
  </p>
52
52
  </div>
53
- <div className="flex flex-col w-full">
53
+ <div className="flex w-full flex-col">
54
54
  <Accordion type="single" collapsible defaultValue="item-1">
55
55
  <AccordionItem value="item-1">
56
56
  <AccordionTrigger>
@@ -59,11 +59,11 @@ export default function DashboardPage() {
59
59
  <span>Setup ENV Variables</span>
60
60
  </div>
61
61
  </AccordionTrigger>
62
- <AccordionContent className="pl-7 h-auto">
63
- <div className="flex flex-col w-full gap-1">
62
+ <AccordionContent className="h-auto pl-7">
63
+ <div className="flex w-full flex-col gap-1">
64
64
  {envVariables.map((env) => (
65
65
  <div
66
- className="flex flex-col w-full bg-card border shadow-card border-border rounded-sm pl-4 pr-2 py-2"
66
+ className="flex w-full flex-col rounded-sm border border-border bg-card py-2 pr-2 pl-4 shadow-card"
67
67
  key={env.name}
68
68
  >
69
69
  <div className="flex items-center justify-between">
@@ -59,7 +59,7 @@ export function ForgotPasswordForm({ className, ...props }: React.ComponentProps
59
59
  </div>
60
60
  <div className="p-6 md:p-20">
61
61
  {success ? (
62
- <FieldGroup className="pb-12 gap-10">
62
+ <FieldGroup className="gap-10 pb-12">
63
63
  <div className="flex flex-col items-start">
64
64
  <h1 className="text-xl font-medium">Check your email</h1>
65
65
  <p className="text-balance text-muted-foreground">
@@ -73,7 +73,7 @@ export function ForgotPasswordForm({ className, ...props }: React.ComponentProps
73
73
  </FieldGroup>
74
74
  ) : (
75
75
  <form onSubmit={handleSubmit}>
76
- <FieldGroup className="pb-12 gap-10">
76
+ <FieldGroup className="gap-10 pb-12">
77
77
  <div className="flex flex-col items-start">
78
78
  <h1 className="text-xl font-medium">Forgot password</h1>
79
79
  <p className="text-balance text-muted-foreground">
@@ -82,7 +82,7 @@ export function ForgotPasswordForm({ className, ...props }: React.ComponentProps
82
82
  </p>
83
83
  </div>
84
84
  {error ? (
85
- <div className="bg-destructive/10 text-destructive text-sm p-3 rounded-md">
85
+ <div className="rounded-md bg-destructive/10 p-3 text-sm text-destructive">
86
86
  {error}
87
87
  </div>
88
88
  ) : null}
@@ -108,7 +108,7 @@ export function ForgotPasswordForm({ className, ...props }: React.ComponentProps
108
108
  </Field>
109
109
  <Link
110
110
  href="/admin/login"
111
- className="text-sm text-center underline-offset-4 hover:underline"
111
+ className="text-center text-sm underline-offset-4 hover:underline"
112
112
  >
113
113
  Back to login
114
114
  </Link>
@@ -64,18 +64,18 @@ export function LoginForm({ className, ...props }: React.ComponentProps<'div'>)
64
64
  />
65
65
  </div>
66
66
  <form onSubmit={handleSubmit} className="p-6 md:p-20">
67
- <FieldGroup className="pb-12 gap-10">
67
+ <FieldGroup className="gap-10 pb-12">
68
68
  <div className="flex flex-col items-start">
69
69
  <h1 className="text-xl font-medium">Welcome back</h1>
70
70
  <p className="text-balance text-muted-foreground">Login to your account</p>
71
71
  </div>
72
72
  {resetSuccess ? (
73
- <div className="bg-emerald-500/10 text-emerald-700 dark:text-emerald-400 text-sm p-3 rounded-md">
73
+ <div className="rounded-md bg-emerald-500/10 p-3 text-sm text-emerald-700 dark:text-emerald-400">
74
74
  Password reset successfully. Please log in with your new password.
75
75
  </div>
76
76
  ) : null}
77
77
  {error ? (
78
- <div className="bg-destructive/10 text-destructive text-sm p-3 rounded-md">
78
+ <div className="rounded-md bg-destructive/10 p-3 text-sm text-destructive">
79
79
  {error}
80
80
  </div>
81
81
  ) : null}
@@ -205,7 +205,7 @@ export function MediaPageContent() {
205
205
  }
206
206
  />
207
207
 
208
- <main className="space-y-3 px-4 pb-4 flex-1">
208
+ <main className="flex-1 space-y-3 px-4 pb-4">
209
209
  <div className="flex w-full flex-col gap-4 pt-px">
210
210
  {activeTab === 'url' ? (
211
211
  <MediaUrlImporter
@@ -219,7 +219,7 @@ export function MediaPageContent() {
219
219
  progress={progress}
220
220
  isUploading={isUploading}
221
221
  multiple
222
- className="h-37 shrink-0 w-full"
222
+ className="h-37 w-full shrink-0"
223
223
  />
224
224
  )}
225
225
  </div>
@@ -237,7 +237,7 @@ export function MediaPageContent() {
237
237
  selectedIds={selected}
238
238
  isSelectMode={isSelectMode}
239
239
  onItemClick={handleItemClick}
240
- className="lg:grid-cols-12 pb-12 pt-px px-px"
240
+ className="px-px pt-px pb-12 lg:grid-cols-12"
241
241
  />
242
242
  {total > DEFAULT_MEDIA_PAGE_SIZE ? (
243
243
  <MediaGridPagination
@@ -1,6 +1,6 @@
1
1
  export function MediaPageSkeleton() {
2
2
  return (
3
- <div className="flex items-center justify-center h-48">
3
+ <div className="flex h-48 items-center justify-center">
4
4
  <div className="text-muted-foreground">Loading Media…</div>
5
5
  </div>
6
6
  )
@@ -9,11 +9,11 @@ export function MinimalAccountShell({
9
9
  children: React.ReactNode
10
10
  }) {
11
11
  return (
12
- <div className="min-h-screen flex flex-col">
12
+ <div className="flex min-h-screen flex-col">
13
13
  <header className="sticky top-0 z-50 flex h-14 items-center justify-between border-b bg-background px-6">
14
14
  <Link
15
15
  href="/admin/profile"
16
- className="text-sm font-medium hover:text-foreground/80 transition-colors"
16
+ className="text-sm font-medium transition-colors hover:text-foreground/80"
17
17
  >
18
18
  {name}
19
19
  </Link>
@@ -17,7 +17,7 @@ export default async function ProfilePage() {
17
17
  return (
18
18
  <>
19
19
  {showPageHeader && <PageHeader title="Profile" />}
20
- <main className="container mx-auto max-w-5xl w-full p-4">
20
+ <main className="container mx-auto w-full max-w-5xl p-4">
21
21
  <ProfileForm
22
22
  user={{
23
23
  name: session.user.name,
@@ -41,7 +41,7 @@ export function ResetPasswordForm({ className, ...props }: React.ComponentProps<
41
41
  />
42
42
  </div>
43
43
  <div className="p-6 md:p-20">
44
- <FieldGroup className="pb-12 gap-10">
44
+ <FieldGroup className="gap-10 pb-12">
45
45
  <div className="flex flex-col items-start">
46
46
  <h1 className="text-xl font-medium">Invalid reset link</h1>
47
47
  <p className="text-balance text-muted-foreground">
@@ -108,13 +108,13 @@ export function ResetPasswordForm({ className, ...props }: React.ComponentProps<
108
108
  />
109
109
  </div>
110
110
  <form onSubmit={handleSubmit} className="p-6 md:p-20">
111
- <FieldGroup className="pb-12 gap-10">
111
+ <FieldGroup className="gap-10 pb-12">
112
112
  <div className="flex flex-col items-start">
113
113
  <h1 className="text-xl font-medium">Reset password</h1>
114
114
  <p className="text-balance text-muted-foreground">Enter your new password below</p>
115
115
  </div>
116
116
  {error ? (
117
- <div className="bg-destructive/10 text-destructive text-sm p-3 rounded-md">
117
+ <div className="rounded-md bg-destructive/10 p-3 text-sm text-destructive">
118
118
  {error}
119
119
  </div>
120
120
  ) : null}
@@ -53,7 +53,7 @@ function SortableAuditLogHeader({
53
53
  <Button
54
54
  variant="ghost"
55
55
  onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
56
- className="w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group"
56
+ className="group w-full min-w-0 scale-100! justify-start overflow-hidden rounded-none border-none bg-transparent! px-0!"
57
57
  aria-label={`Sort by ${label}, ${sortLabel}`}
58
58
  aria-sort={
59
59
  sortDirection === 'asc' ? 'ascending' : sortDirection === 'desc' ? 'descending' : 'none'
@@ -46,7 +46,7 @@ export function AuditLogDetailDrawer({ auditLog, open, onOpenChange }: AuditLogD
46
46
  </DrawerHeader>
47
47
  <ScrollArea className="min-h-0 flex-1 px-6">
48
48
  {auditLog ? (
49
- <div className="flex flex-col w-full gap-4">
49
+ <div className="flex w-full flex-col gap-4">
50
50
  <Card>
51
51
  <CardHeader>
52
52
  <CardTitle>Event Details</CardTitle>
@@ -7,9 +7,9 @@ interface AuditLogDetailRowProps {
7
7
 
8
8
  export function AuditLogDetailRow({ label, value }: AuditLogDetailRowProps) {
9
9
  return (
10
- <div className="grid grid-cols-[120px_1fr] gap-3 border-b border-border py-2 px-4 last:border-b-0">
10
+ <div className="grid grid-cols-[120px_1fr] gap-3 border-b border-border px-4 py-2 last:border-b-0">
11
11
  <dt className="text-sm font-medium text-muted-foreground">{label}</dt>
12
- <dd className="min-w-0 text-sm text-foreground break-words">{value || 'Unknown'}</dd>
12
+ <dd className="min-w-0 text-sm break-words text-foreground">{value || 'Unknown'}</dd>
13
13
  </div>
14
14
  )
15
15
  }
@@ -114,7 +114,7 @@ export function AuditLogPageContent() {
114
114
  isPending={isSearchFetching}
115
115
  onSearch={handleSearch}
116
116
  />
117
- <main className="space-y-4 px-4 pb-4 flex-1">
117
+ <main className="flex-1 space-y-4 px-4 pb-4">
118
118
  <AuditLogTable
119
119
  columns={columns}
120
120
  search={search}
@@ -1,6 +1,6 @@
1
1
  export function AuditLogPageSkeleton() {
2
2
  return (
3
- <div className="flex items-center justify-center h-48">
3
+ <div className="flex h-48 items-center justify-center">
4
4
  <div className="text-muted-foreground">Loading Audit Logs…</div>
5
5
  </div>
6
6
  )
@@ -160,7 +160,7 @@ export function AuditLogTable<TValue>({
160
160
  .join(' ')
161
161
 
162
162
  return (
163
- <div className={cn('flex flex-col gap-6 pt-px pb-2 h-full', className)}>
163
+ <div className={cn('flex h-full flex-col gap-6 pt-px pb-2', className)}>
164
164
  <DataGrid
165
165
  containerClassName="min-h-0 flex-1"
166
166
  containerRef={tableContainerRef}
@@ -197,7 +197,7 @@ export function AuditLogTable<TValue>({
197
197
  <button
198
198
  type="button"
199
199
  aria-label={`Resize ${resizeLabel} column`}
200
- className="group/resize-handle absolute right-0 top-0 z-10 flex h-full w-5 cursor-col-resize touch-none select-none items-center justify-center text-muted-foreground opacity-0 transition-opacity hover:text-foreground focus-visible:text-foreground focus-visible:opacity-100 focus-visible:outline-none group-focus-within/resize-header:opacity-100 data-[column-hovered=true]:opacity-100 data-[resizing=true]:opacity-100"
200
+ className="group/resize-handle absolute top-0 right-0 z-10 flex h-full w-5 cursor-col-resize touch-none items-center justify-center text-muted-foreground opacity-0 transition-opacity select-none group-focus-within/resize-header:opacity-100 hover:text-foreground focus-visible:text-foreground focus-visible:opacity-100 focus-visible:outline-none data-[column-hovered=true]:opacity-100 data-[resizing=true]:opacity-100"
201
201
  data-resize-handle
202
202
  data-column-hovered={
203
203
  hoveredColumnId === header.column.id ? 'true' : 'false'
@@ -36,7 +36,7 @@ export function FormsSettingsPageContent() {
36
36
  return (
37
37
  <React.Fragment>
38
38
  <PageHeader title="Form Settings" />
39
- <main className="space-y-4 px-4 pb-4 flex-1 pt-4">
39
+ <main className="flex-1 space-y-4 px-4 pt-4 pb-4">
40
40
  <FormsSettingsTable
41
41
  columns={columns}
42
42
  rows={rows}
@@ -1,6 +1,6 @@
1
1
  export function FormsSettingsPageSkeleton() {
2
2
  return (
3
- <div className="flex items-center justify-center h-48">
3
+ <div className="flex h-48 items-center justify-center">
4
4
  <div className="text-muted-foreground">Loading Form Settings…</div>
5
5
  </div>
6
6
  )
@@ -32,7 +32,7 @@ export function FormsSettingsTable({
32
32
  })
33
33
 
34
34
  return (
35
- <div className={cn('flex flex-col gap-6 pt-px pb-2 h-full', className)}>
35
+ <div className={cn('flex h-full flex-col gap-6 pt-px pb-2', className)}>
36
36
  <DataGrid
37
37
  containerClassName="min-h-0 flex-1"
38
38
  gridTemplateColumns="minmax(200px, 1fr) minmax(240px, 2fr)"
@@ -242,7 +242,7 @@ export function WebhookEndpointDialog({ webhook, open, onOpenChange }: WebhookEn
242
242
  />
243
243
  {isEdit && (
244
244
  <div className="space-y-2 rounded-md border border-border p-3">
245
- <p className="text-sm font-medium leading-none">Signing secret</p>
245
+ <p className="text-sm leading-none font-medium">Signing secret</p>
246
246
  <div className="flex items-center gap-2">
247
247
  <span className="min-w-0 flex-1 truncate font-mono text-xs">
248
248
  {secret ?? 'whsec_••••••••••••••••'}
@@ -283,7 +283,7 @@ export function WebhookEndpointDialog({ webhook, open, onOpenChange }: WebhookEn
283
283
  <React.Fragment>
284
284
  {formSources.length > 0 && (
285
285
  <fieldset className="space-y-2 rounded-md border border-border p-3">
286
- <legend className="px-1 text-xs font-medium uppercase tracking-wide text-muted-foreground">
286
+ <legend className="px-1 text-xs font-medium tracking-wide text-muted-foreground uppercase">
287
287
  Events · Forms
288
288
  </legend>
289
289
  {formSources.flatMap((source) =>
@@ -308,7 +308,7 @@ export function WebhookEndpointDialog({ webhook, open, onOpenChange }: WebhookEn
308
308
  )}
309
309
  {contentSources.length > 0 && (
310
310
  <fieldset className="space-y-2 rounded-md border border-border p-3">
311
- <legend className="px-1 text-xs font-medium uppercase tracking-wide text-muted-foreground">
311
+ <legend className="px-1 text-xs font-medium tracking-wide text-muted-foreground uppercase">
312
312
  Events · Entities
313
313
  </legend>
314
314
  {contentSources.flatMap((source) =>
@@ -35,7 +35,7 @@ export function createWebhooksColumns({
35
35
  <Button
36
36
  variant="ghost"
37
37
  onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
38
- className="w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group"
38
+ className="group w-full min-w-0 scale-100! justify-start overflow-hidden rounded-none border-none bg-transparent! px-0!"
39
39
  aria-label={`Sort by Name, ${sortLabel}`}
40
40
  aria-sort={
41
41
  sortDirection === 'asc'
@@ -69,7 +69,7 @@ export function createWebhooksColumns({
69
69
  <Button
70
70
  variant="ghost"
71
71
  onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
72
- className="w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group"
72
+ className="group w-full min-w-0 scale-100! justify-start overflow-hidden rounded-none border-none bg-transparent! px-0!"
73
73
  aria-label={`Sort by URL, ${sortLabel}`}
74
74
  aria-sort={
75
75
  sortDirection === 'asc'
@@ -104,7 +104,7 @@ export function createWebhooksColumns({
104
104
  <Button
105
105
  variant="ghost"
106
106
  onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
107
- className="w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group"
107
+ className="group w-full min-w-0 scale-100! justify-start overflow-hidden rounded-none border-none bg-transparent! px-0!"
108
108
  aria-label={`Sort by Enabled, ${sortLabel}`}
109
109
  aria-sort={
110
110
  sortDirection === 'asc'
@@ -137,7 +137,7 @@ export function createWebhooksColumns({
137
137
  <Button
138
138
  variant="ghost"
139
139
  onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
140
- className="w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group"
140
+ className="group w-full min-w-0 scale-100! justify-start overflow-hidden rounded-none border-none bg-transparent! px-0!"
141
141
  aria-label={`Sort by Events, ${sortLabel}`}
142
142
  aria-sort={
143
143
  sortDirection === 'asc'
@@ -170,7 +170,7 @@ export function createWebhooksColumns({
170
170
  <Button
171
171
  variant="ghost"
172
172
  onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
173
- className="w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group"
173
+ className="group w-full min-w-0 scale-100! justify-start overflow-hidden rounded-none border-none bg-transparent! px-0!"
174
174
  aria-label={`Sort by Last delivery, ${sortLabel}`}
175
175
  aria-sort={
176
176
  sortDirection === 'asc'
@@ -217,7 +217,7 @@ export function createWebhooksColumns({
217
217
  <Button
218
218
  variant="ghost"
219
219
  onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
220
- className="w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group"
220
+ className="group w-full min-w-0 scale-100! justify-start overflow-hidden rounded-none border-none bg-transparent! px-0!"
221
221
  aria-label={`Sort by Created, ${sortLabel}`}
222
222
  aria-sort={
223
223
  sortDirection === 'asc'