betterstart-cli 0.0.122 → 0.0.123

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 (33) hide show
  1. package/dist/assets/adapters/next/templates/init/admin-globals.css +8 -16
  2. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx +5 -5
  3. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-code-mirror.tsx +1 -2
  4. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +1 -1
  5. package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +1 -1
  6. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +1 -1
  7. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog-content.tsx +1 -1
  8. package/dist/assets/adapters/next/templates/init/components/shared/media/media-filters-bar.tsx +1 -1
  9. package/dist/assets/adapters/next/templates/init/components/shared/page-header.tsx +1 -1
  10. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +1 -1
  11. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +1 -1
  12. package/dist/assets/adapters/next/templates/init/pages/media/media-page-content.tsx +1 -1
  13. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-detail-drawer.tsx +1 -1
  14. package/dist/assets/adapters/next/templates/init/pages/settings/forms/form-notifications-drawer.tsx +1 -1
  15. package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +1 -1
  16. package/dist/assets/shared-assets/react-admin/ui/button.tsx +1 -1
  17. package/dist/assets/shared-assets/react-admin/ui/card.tsx +11 -7
  18. package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +1 -1
  19. package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +1 -1
  20. package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +1 -1
  21. package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +1 -1
  22. package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +1 -1
  23. package/dist/assets/shared-assets/react-admin/ui/input.tsx +1 -1
  24. package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +1 -1
  25. package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +1 -1
  26. package/dist/assets/shared-assets/react-admin/ui/select.tsx +1 -1
  27. package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +3 -3
  28. package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +1 -1
  29. package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +1 -1
  30. package/dist/cli.js +50 -23
  31. package/dist/cli.js.map +1 -1
  32. package/package.json +1 -1
  33. package/dist/assets/adapters/next/templates/init/pages/container-layout.tsx +0 -3
@@ -7,9 +7,10 @@
7
7
 
8
8
  @theme inline {
9
9
  --color-background: var(--background);
10
+ --color-background-light: var(--background-light);
10
11
  --color-foreground: var(--foreground);
11
- --font-sans: var(--font-sans);
12
- --font-mono: var(--font-geist-mono), ui-monospace, SFMono-Regular, monospace;
12
+ --font-sans: var(--font-geist-sans);
13
+ --font-mono: var(--font-geist-mono);
13
14
  --color-sidebar-ring: var(--sidebar-ring);
14
15
  --color-sidebar-border: var(--sidebar-border);
15
16
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
@@ -48,6 +49,7 @@
48
49
  --text-*: initial;
49
50
  --radius-*: initial;
50
51
  --radius: 6px;
52
+ --radius-lg: calc(var(--radius) + 2px);
51
53
  --font-heading: var(--font-sans);
52
54
  --shadow-sm: var(--shadow-small);
53
55
  --shadow-md: var(--shadow-medium);
@@ -194,8 +196,9 @@
194
196
  --ds-pink-1000: lab(12.9204% 31.3916 -0.183001);
195
197
 
196
198
  --background: var(--ds-background-200);
199
+ --background-light: var(--ds-background-100);
197
200
  --foreground: var(--ds-gray-1000);
198
- --card: var(--ds-background-100);
201
+ --card: var(--color-white);
199
202
  --card-foreground: var(--ds-gray-1000);
200
203
  --popover: var(--ds-background-100);
201
204
  --popover-foreground: var(--ds-gray-1000);
@@ -204,7 +207,7 @@
204
207
  --secondary: var(--ds-gray-200);
205
208
  --secondary-foreground: var(--ds-gray-1000);
206
209
  --muted: var(--ds-gray-100);
207
- --muted-foreground: var(--ds-gray-900);
210
+ --muted-foreground: var(--ds-gray-800);
208
211
  --placeholder: var(--ds-gray-700);
209
212
  --accent: var(--ds-gray-100);
210
213
  --accent-foreground: var(--ds-gray-1000);
@@ -214,7 +217,7 @@
214
217
  --warning-foreground: var(--ds-amber-900);
215
218
  --border: var(--ds-gray-400);
216
219
  --highlight: var(--ds-gray-600);
217
- --input: var(--ds-gray-400);
220
+ --input: var(--color-white);
218
221
  --ring: var(--ds-gray-600);
219
222
  --chart-1: var(--ds-blue-700);
220
223
  --chart-2: var(--ds-purple-700);
@@ -298,22 +301,11 @@
298
301
  line-height: 20px;
299
302
  }
300
303
 
301
- .admin-root {
302
- font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
303
- }
304
-
305
304
  .admin-root .tiptap-button-icon,
306
305
  .admin-root .tiptap-button-icon-sub {
307
306
  @apply text-foreground;
308
307
  }
309
308
 
310
- .admin-root code,
311
- .admin-root pre,
312
- .admin-root kbd {
313
- font-family:
314
- var(--font-geist-mono), ui-monospace, SFMono-Regular, monospace;
315
- }
316
-
317
309
  html {
318
310
  @apply font-sans;
319
311
  }
@@ -32,10 +32,10 @@ export function CopyableCodeBlock({ label, code, language, tabs }: CopyableCodeB
32
32
  const hasTabs = codeTabs.length > 1
33
33
 
34
34
  return (
35
- <Card className="flex w-full flex-col gap-0 p-0">
35
+ <Card className="flex h-full w-full flex-col gap-0 p-0">
36
36
  {hasTabs ? (
37
37
  <Tabs value={activeTab.id} onValueChange={setActiveTabId} className="min-h-0 flex-1 gap-0">
38
- <CardHeader className="flex items-center justify-between gap-2 border-b border-border bg-background pt-[5px]! pr-1 pb-2! pl-3.5!">
38
+ <CardHeader className="flex items-center justify-between gap-2 py-1!">
39
39
  <div className="flex min-w-0 flex-1 items-center gap-2">
40
40
  <span className="min-w-0 truncate font-medium text-muted-foreground">{label}</span>
41
41
  <TabsList className="h-fit! shrink-0">
@@ -61,7 +61,7 @@ export function CopyableCodeBlock({ label, code, language, tabs }: CopyableCodeB
61
61
 
62
62
  {codeTabs.map((tab) => (
63
63
  <TabsContent key={tab.id} value={tab.id} className="min-h-0 overflow-auto">
64
- <CardContent className="h-full overflow-auto p-0">
64
+ <CardContent className="h-full overflow-auto border-t p-0">
65
65
  <React.Suspense fallback={<PlainCodeFallback code={tab.code} />}>
66
66
  <LazyCodeMirror code={tab.code} language={tab.language} />
67
67
  </React.Suspense>
@@ -71,7 +71,7 @@ export function CopyableCodeBlock({ label, code, language, tabs }: CopyableCodeB
71
71
  </Tabs>
72
72
  ) : (
73
73
  <>
74
- <CardHeader className="flex items-center justify-between gap-2 border-b border-border bg-background pt-[5px]! pr-1 pb-2! pl-3.5!">
74
+ <CardHeader className="flex items-center justify-between gap-2 py-1!">
75
75
  <span className="min-w-0 truncate font-medium text-muted-foreground">{label}</span>
76
76
  <Button
77
77
  type="button"
@@ -85,7 +85,7 @@ export function CopyableCodeBlock({ label, code, language, tabs }: CopyableCodeB
85
85
  {isCopied ? <Check /> : <Copy />}
86
86
  </Button>
87
87
  </CardHeader>
88
- <CardContent className="overflow-auto p-0">
88
+ <CardContent className="h-full overflow-auto border-t p-0">
89
89
  <React.Suspense fallback={<PlainCodeFallback code={code} />}>
90
90
  <LazyCodeMirror code={code} language={language} />
91
91
  </React.Suspense>
@@ -35,8 +35,7 @@ const compactCodeTheme = EditorView.theme({
35
35
  padding: '0 16px'
36
36
  },
37
37
  '.cm-scroller': {
38
- fontFamily:
39
- 'ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace'
38
+ fontFamily: 'var(--font-geist-mono)'
40
39
  }
41
40
  })
42
41
 
@@ -60,7 +60,7 @@ export function DevModeIntegrateButton({
60
60
  </DrawerHeader>
61
61
 
62
62
  {loadedIntegration ? (
63
- <Tabs defaultValue="snippets" className="min-h-0 flex-1 gap-4 overflow-hidden px-6 pb-4">
63
+ <Tabs defaultValue="snippets" className="min-h-0 flex-1 gap-2 overflow-hidden px-6 pb-4">
64
64
  <TabsList className="w-full">
65
65
  <TabsTrigger value="snippets">Snippets</TabsTrigger>
66
66
  <TabsTrigger value="lifecycle-hooks">Lifecycle Hooks</TabsTrigger>
@@ -64,7 +64,7 @@ export function EntityFiltersBar({
64
64
  return (
65
65
  <div
66
66
  className={cn(
67
- 'sticky top-14 z-10 flex h-16 flex-row items-center justify-between gap-1 overflow-x-clip bg-background px-4 transition-shadow',
67
+ 'sticky top-14 z-10 mt-6 mb-3 flex flex-row items-center justify-between gap-1 overflow-x-clip bg-background px-6 transition-shadow',
68
68
  {
69
69
  'shadow-modal/3': hasScrolled
70
70
  }
@@ -43,7 +43,7 @@ export function EntityVersionsDrawer({
43
43
  }: EntityVersionsDrawerProps) {
44
44
  return (
45
45
  <Drawer swipeDirection="right" open={open} onOpenChange={onOpenChange} modal>
46
- <DrawerContent className="h-full max-w-lg">
46
+ <DrawerContent className="w-full data-[swipe-direction=right]:max-w-lg">
47
47
  <DrawerHeader>
48
48
  <DrawerTitle>Versions</DrawerTitle>
49
49
  <DrawerDescription>
@@ -91,7 +91,7 @@ export function EditMediaDialogContent({
91
91
  }
92
92
 
93
93
  return (
94
- <DrawerContent className="h-full w-full overflow-hidden">
94
+ <DrawerContent className="w-full overflow-hidden">
95
95
  <div
96
96
  ref={handleDrawerContainerRef}
97
97
  className="pointer-events-none absolute inset-3 z-20 overflow-hidden rounded"
@@ -48,7 +48,7 @@ export function MediaFiltersBar({
48
48
  return (
49
49
  <div
50
50
  className={cn(
51
- 'sticky top-14 z-9 flex h-16 flex-row items-center justify-between gap-1 overflow-clip bg-background px-4 transition-shadow',
51
+ 'sticky top-14 z-9 mt-6 mb-3 flex flex-row items-center justify-between gap-1 overflow-clip bg-background px-6 transition-shadow',
52
52
  {
53
53
  'shadow-modal/3': hasScrolled
54
54
  }
@@ -23,7 +23,7 @@ export function PageHeader({
23
23
 
24
24
  return (
25
25
  <>
26
- <header className="fixed top-0 right-0 left-(--admin-shell-content-left) z-200 grid h-14 grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center border-t border-b border-border/80 bg-sidebar px-4 transition-[left] duration-200 ease-linear">
26
+ <header className="fixed top-0 right-0 left-(--admin-shell-content-left) z-30 grid h-14 grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center border-t border-b border-border/80 bg-sidebar px-4 transition-[left] duration-200 ease-linear">
27
27
  <div className="flex w-full items-center justify-start gap-2">
28
28
  {hasBackButton && (
29
29
  <Button variant="ghost" size="icon" onClick={() => router.back()}>
@@ -192,7 +192,7 @@ export function SortOrderDialog({
192
192
  onOpenChange={onOpenChange}
193
193
  onOpenChangeComplete={handleDrawerAnimationEnd}
194
194
  >
195
- <DrawerContent className="h-full w-full overflow-hidden">
195
+ <DrawerContent className="w-full overflow-hidden data-[swipe-direction=right]:max-w-md">
196
196
  <div className="relative z-10 flex min-h-0 flex-1 flex-col gap-3 overflow-hidden">
197
197
  <DrawerHeader>
198
198
  <DrawerTitle>{title}</DrawerTitle>
@@ -39,7 +39,7 @@ import { githubLightInit } from '@uiw/codemirror-theme-github'
39
39
  import { NuqsAdapter } from 'nuqs/adapters/react'
40
40
  import { createRoot } from 'react-dom/client'
41
41
 
42
- const ADMIN_MONO_FONT_FAMILY = 'var(--font-geist-mono), ui-monospace, SFMono-Regular, monospace'
42
+ const ADMIN_MONO_FONT_FAMILY = 'var(--font-geist-mono)'
43
43
  const editorTheme = githubLightInit({ settings: { fontFamily: ADMIN_MONO_FONT_FAMILY } })
44
44
 
45
45
  type MarkdownMediaGalleryWidgetProps = {
@@ -206,7 +206,7 @@ export function MediaPageContent() {
206
206
  }
207
207
  />
208
208
 
209
- <main className="flex-1 space-y-3 px-4 pb-4">
209
+ <main className="flex-1 space-y-3 px-6 pb-6">
210
210
  <div className="flex w-full flex-col gap-4 pt-px">
211
211
  {activeTab === 'url' ? (
212
212
  <MediaUrlImporter
@@ -37,7 +37,7 @@ function formatMetadata(metadata: Record<string, unknown> | null): string {
37
37
  export function AuditLogDetailDrawer({ auditLog, open, onOpenChange }: AuditLogDetailDrawerProps) {
38
38
  return (
39
39
  <Drawer swipeDirection="right" open={open} onOpenChange={onOpenChange} modal>
40
- <DrawerContent className="h-full max-w-xl">
40
+ <DrawerContent className="w-full data-[swipe-direction=right]:max-w-xl">
41
41
  <DrawerHeader>
42
42
  <DrawerTitle>Audit Event</DrawerTitle>
43
43
  <DrawerDescription>
@@ -83,7 +83,7 @@ export function FormNotificationsDrawer({
83
83
 
84
84
  return (
85
85
  <Drawer swipeDirection="right" open={open} onOpenChange={onOpenChange} modal>
86
- <DrawerContent className="h-full max-w-xl">
86
+ <DrawerContent className="w-full data-[swipe-direction=right]:max-w-xl">
87
87
  <Form {...form}>
88
88
  <form
89
89
  autoComplete="off"
@@ -16,7 +16,7 @@ function AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {
16
16
  return (
17
17
  <AccordionPrimitive.Item
18
18
  data-slot="accordion-item"
19
- className={cn('not-last:border-b data-open:bg-muted/50', className)}
19
+ className={cn('not-last:border-b data-open:bg-background-light', className)}
20
20
  {...props}
21
21
  />
22
22
  )
@@ -10,7 +10,7 @@ const buttonVariants = cva(
10
10
  variant: {
11
11
  default: 'bg-primary text-primary-foreground hover:bg-primary/80',
12
12
  outline:
13
- 'border-border bg-input/30 hover:bg-input/50 hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground',
13
+ 'border-border bg-input hover:border-foreground/10 hover:bg-accent hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground',
14
14
  secondary:
15
15
  'bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',
16
16
  ghost:
@@ -11,7 +11,7 @@ function Card({
11
11
  data-slot="card"
12
12
  data-size={size}
13
13
  className={cn(
14
- 'group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded bg-card py-(--card-spacing) text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t *:[img:last-child]:rounded-b',
14
+ 'group/card flex flex-col overflow-clip rounded-lg border bg-accent text-card-foreground has-[>img:first-child]:pt-0 *:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b',
15
15
  className
16
16
  )}
17
17
  {...props}
@@ -24,7 +24,7 @@ function CardHeader({ className, ...props }: React.ComponentProps<'div'>) {
24
24
  <div
25
25
  data-slot="card-header"
26
26
  className={cn(
27
- 'group/card-header grid auto-rows-min items-start gap-2 rounded-t px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)',
27
+ 'group/card-header grid auto-rows-min items-start gap-2 rounded-t-lg bg-accent px-5 py-2 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]',
28
28
  className
29
29
  )}
30
30
  {...props}
@@ -64,7 +64,14 @@ function CardAction({ className, ...props }: React.ComponentProps<'div'>) {
64
64
 
65
65
  function CardContent({ className, ...props }: React.ComponentProps<'div'>) {
66
66
  return (
67
- <div data-slot="card-content" className={cn('px-(--card-spacing)', className)} {...props} />
67
+ <div
68
+ data-slot="card-content"
69
+ className={cn(
70
+ 'overflow-clip rounded-t-lg bg-card px-5 py-5 [[data-slot=card-header]~&]:border-t',
71
+ className
72
+ )}
73
+ {...props}
74
+ />
68
75
  )
69
76
  }
70
77
 
@@ -72,10 +79,7 @@ function CardFooter({ className, ...props }: React.ComponentProps<'div'>) {
72
79
  return (
73
80
  <div
74
81
  data-slot="card-footer"
75
- className={cn(
76
- 'flex items-center rounded-b px-(--card-spacing) [.border-t]:pt-(--card-spacing)',
77
- className
78
- )}
82
+ className={cn('flex items-center rounded-b px-5 [.border-t]:pt-(--card-spacing)', className)}
79
83
  {...props}
80
84
  />
81
85
  )
@@ -9,7 +9,7 @@ function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {
9
9
  <CheckboxPrimitive.Root
10
10
  data-slot="checkbox"
11
11
  className={cn(
12
- 'peer relative flex size-4 shrink-0 items-center justify-center rounded border border-input transition-shadow outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground',
12
+ 'peer relative flex size-4 shrink-0 items-center justify-center rounded border border-border transition-shadow outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground',
13
13
  className
14
14
  )}
15
15
  {...props}
@@ -207,7 +207,7 @@ function ComboboxChips({
207
207
  <ComboboxPrimitive.Chips
208
208
  data-slot="combobox-chips"
209
209
  className={cn(
210
- 'flex min-h-9 flex-wrap items-center gap-1.5 rounded border border-input bg-input/30 bg-clip-padding px-2.5 py-1.5 transition-colors focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-[3px] has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5',
210
+ 'flex min-h-9 flex-wrap items-center gap-1.5 rounded border border-border bg-input/30 bg-clip-padding px-2.5 py-1.5 transition-colors focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-[3px] has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5',
211
211
  className
212
212
  )}
213
213
  {...props}
@@ -158,7 +158,7 @@ function DrawerHeader({ className, ...props }: React.ComponentProps<'div'>) {
158
158
  <div
159
159
  data-slot="drawer-header"
160
160
  className={cn(
161
- 'flex shrink-0 flex-col gap-1.5 p-4 pb-0 text-left group-data-[swipe-axis=y]/drawer-popup:text-center',
161
+ 'flex shrink-0 flex-col px-6 py-4 pb-0 text-left group-data-[swipe-axis=y]/drawer-popup:text-center',
162
162
  className
163
163
  )}
164
164
  {...props}
@@ -14,7 +14,7 @@ function InputGroup({ className, ...props }: React.ComponentProps<'div'>) {
14
14
  data-slot="input-group"
15
15
  role="group"
16
16
  className={cn(
17
- 'group/input-group relative flex h-9 w-full min-w-0 items-center rounded border border-input bg-input/30 transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-data-[align=block-end]:rounded has-data-[align=block-start]:rounded has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-[3px] has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[textarea]:rounded has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5',
17
+ 'group/input-group relative flex h-9 w-full min-w-0 items-center rounded border border-border bg-input/30 transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-data-[align=block-end]:rounded has-data-[align=block-start]:rounded has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-[3px] has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[textarea]:rounded has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5',
18
18
  className
19
19
  )}
20
20
  {...props}
@@ -54,7 +54,7 @@ function InputOTPSlot({
54
54
  data-slot="input-otp-slot"
55
55
  data-active={isActive}
56
56
  className={cn(
57
- 'relative flex size-9 items-center justify-center border-y border-r border-input bg-input/30 transition-all outline-none first:rounded-l first:border-l last:rounded-r aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-[3px] data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20',
57
+ 'relative flex size-9 items-center justify-center border-y border-r border-border bg-input/30 transition-all outline-none first:rounded-l first:border-l last:rounded-r aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-[3px] data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20',
58
58
  className
59
59
  )}
60
60
  {...props}
@@ -8,7 +8,7 @@ function Input({ className, type, ...props }: React.ComponentProps<'input'>) {
8
8
  type={type}
9
9
  data-slot="input"
10
10
  className={cn(
11
- 'h-9 w-full min-w-0 rounded border border-input bg-input/30 px-3 py-1 transition-colors outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:font-medium file:text-foreground placeholder:text-placeholder focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20',
11
+ 'h-9 w-full min-w-0 rounded border border-border bg-input px-3 py-1 transition-colors outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:font-medium file:text-foreground placeholder:text-placeholder focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20',
12
12
  className
13
13
  )}
14
14
  {...props}
@@ -19,7 +19,7 @@ function NativeSelect({ className, size = 'default', ...props }: NativeSelectPro
19
19
  <select
20
20
  data-slot="native-select"
21
21
  data-size={size}
22
- className="h-9 w-full min-w-0 appearance-none rounded border border-input bg-input/30 py-1 pr-8 pl-3 transition-colors outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-placeholder focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 data-[size=sm]:h-8"
22
+ className="h-9 w-full min-w-0 appearance-none rounded border border-border bg-input/30 py-1 pr-8 pl-3 transition-colors outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-placeholder focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 data-[size=sm]:h-8"
23
23
  {...props}
24
24
  />
25
25
  <ChevronDownIcon
@@ -19,7 +19,7 @@ function RadioGroupItem({ className, ...props }: RadioPrimitive.Root.Props) {
19
19
  <RadioPrimitive.Root
20
20
  data-slot="radio-group-item"
21
21
  className={cn(
22
- 'group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded border border-input outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground',
22
+ 'group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded border border-border outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground',
23
23
  className
24
24
  )}
25
25
  {...props}
@@ -40,7 +40,7 @@ function SelectTrigger({
40
40
  data-slot="select-trigger"
41
41
  data-size={size}
42
42
  className={cn(
43
- "flex w-fit items-center justify-between gap-1.5 rounded border border-input bg-input/30 px-3 py-2 whitespace-nowrap transition-colors outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 data-placeholder:text-placeholder data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
43
+ "flex w-fit items-center justify-between gap-1.5 rounded border border-border bg-input/30 px-3 py-2 whitespace-nowrap transition-colors outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 data-placeholder:text-placeholder data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
44
44
  className
45
45
  )}
46
46
  {...props}
@@ -51,9 +51,9 @@ function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {
51
51
  <TabsPrimitive.Tab
52
52
  data-slot="tabs-trigger"
53
53
  className={cn(
54
- "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded border border-transparent px-2 py-1 font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start group-data-vertical/tabs:px-2.5 group-data-vertical/tabs:py-1.5 hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
55
- 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent',
56
- 'data-active:bg-background data-active:text-foreground',
54
+ "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded border border-transparent bg-clip-padding px-2 py-1 font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start group-data-vertical/tabs:px-2.5 group-data-vertical/tabs:py-1.5 hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
55
+ 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:border-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent',
56
+ 'data-active:border-border data-active:bg-input data-active:text-foreground',
57
57
  'after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100',
58
58
  className
59
59
  )}
@@ -6,7 +6,7 @@ function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {
6
6
  <textarea
7
7
  data-slot="textarea"
8
8
  className={cn(
9
- 'flex field-sizing-content min-h-16 w-full resize-none rounded border border-input bg-input/30 px-3 py-3 transition-colors outline-none placeholder:text-placeholder focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20',
9
+ 'flex field-sizing-content min-h-16 w-full resize-none rounded border border-border bg-input/30 px-3 py-3 transition-colors outline-none placeholder:text-placeholder focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20',
10
10
  className
11
11
  )}
12
12
  {...props}
@@ -11,7 +11,7 @@ const toggleVariants = cva(
11
11
  variants: {
12
12
  variant: {
13
13
  default: 'bg-transparent',
14
- outline: 'border border-input bg-transparent hover:bg-muted'
14
+ outline: 'border border-border bg-transparent hover:bg-muted'
15
15
  },
16
16
  size: {
17
17
  default:
package/dist/cli.js CHANGED
@@ -16340,9 +16340,10 @@ ${join}
16340
16340
  </div>`;
16341
16341
  }
16342
16342
  function renderFormLayoutDetailsTemplate() {
16343
- return `className={initialData?.id != null
16344
- ? 'sticky top-32 space-y-4 pb-4'
16345
- : 'sticky top-14 space-y-4 pb-4'}`;
16343
+ return `className={cn('sticky space-y-4', {
16344
+ 'top-32': initialData?.id != null,
16345
+ 'top-14': initialData?.id == null
16346
+ })}`;
16346
16347
  }
16347
16348
  function renderFormCardContentGridTemplate({
16348
16349
  tabSidebarEntriesGrid,
@@ -16384,8 +16385,8 @@ function renderFormCardContentDetailsTemplate({
16384
16385
  }) {
16385
16386
  return `${formGridOpen}
16386
16387
  <div className="h-full min-w-0">
16387
- <Card className="min-w-0 h-full">
16388
- <CardContent className="space-y-5 gap-0 h-full">
16388
+ <Card className="h-full min-w-0">
16389
+ <CardContent className="flex h-full min-h-0 flex-col space-y-5 p-8">
16389
16390
  ${mainFieldsJsx}
16390
16391
  </CardContent>
16391
16392
  </Card>
@@ -16822,7 +16823,7 @@ function renderFormLayoutDetailsBranchBodyTemplate({
16822
16823
  return ` {initialData?.id != null && (
16823
16824
  <div
16824
16825
  className={cn(
16825
- 'sticky z-100 flex flex-row items-center justify-between gap-1 px-4 bg-background h-14 top-14 transition-shadow overflow-x-clip',
16826
+ 'sticky top-14 z-20 flex h-14 flex-row items-center justify-between gap-1 overflow-x-clip bg-background px-6 transition-shadow',
16826
16827
  {
16827
16828
  'shadow-modal/2': hasScrolled,
16828
16829
  'border-b border-border/80': !hasScrolled
@@ -16874,7 +16875,7 @@ function renderFormTabContentDetailsTemplate({
16874
16875
  </TabsContent>`;
16875
16876
  }
16876
16877
  function renderEntityFormBody({ contentComponentName }) {
16877
- return ` <main className="w-full p-4 h-full">
16878
+ return ` <main className="h-full w-full px-6 pt-6">
16878
16879
  <${contentComponentName} state={entityForm} />
16879
16880
  </main>`;
16880
16881
  }
@@ -17036,7 +17037,7 @@ function buildEntityFormArtifacts({
17036
17037
  const withHandlerSection = (handlers) => handlers ? `
17037
17038
  ${handlers}
17038
17039
  ` : "";
17039
- const needsCn = hasRelationship || hasSelectCombobox || shouldGuardSidebarByTab;
17040
+ const needsCn = hasRelationship || hasSelectCombobox || shouldGuardSidebarByTab || /\bcn\s*\(/.test(formBodyJSX);
17040
17041
  const metadataOffsetConst = showMetadataWidget ? "const SCROLL_BORDER_OFFSET = 8;\n\n" : "";
17041
17042
  const metadataScrollState = showMetadataWidget ? " const hasScrolled = usePageScrollThreshold(SCROLL_BORDER_OFFSET)\n" : "";
17042
17043
  const metadataStrip = showMetadataWidget ? renderEntityFormPageRenderer({
@@ -19278,7 +19279,7 @@ function renderTextareaField(field, indent, label, hintJSX, context) {
19278
19279
  `${indent} `
19279
19280
  ),
19280
19281
  toLowerCase: label.toLowerCase(),
19281
- fillControlClass: fillControlClass(field, "min-h-[80px]"),
19282
+ fillControlClass: fillControlClass(field, "min-h-20"),
19282
19283
  fieldProps
19283
19284
  }
19284
19285
  });
@@ -19660,7 +19661,7 @@ function buildEntityFormLayout({
19660
19661
  const sidebarVisibilityState = shouldGuardSidebarByTab ? `
19661
19662
  const hasVisibleSidebarFields = ${sidebarTabNames.map((tabName) => `activeTab === ${JSON.stringify(tabName)}`).join(" || ")}
19662
19663
  ` : "";
19663
- const formGridOpen = shouldGuardSidebarByTab ? renderEntityFormContentRenderer({ kind: "renderFormLayoutDetailsBranchTemplate" }) : ` <div className="grid ${hasSidebarFields ? "grid-cols-entity-form" : "grid-cols-1"} gap-4 items-start h-full">`;
19664
+ const formGridOpen = shouldGuardSidebarByTab ? renderEntityFormContentRenderer({ kind: "renderFormLayoutDetailsBranchTemplate" }) : ` <div className="grid h-full ${hasSidebarFields ? "grid-cols-entity-form" : "grid-cols-1"} items-start gap-6">`;
19664
19665
  const sidebarCardJSX = !hasSidebarFields ? "" : shouldGuardSidebarByTab ? renderEntityFormContentRenderer({
19665
19666
  kind: "renderFormContentSidebarColumnTemplate",
19666
19667
  props: {
@@ -21261,7 +21262,8 @@ ${createButtonContent}
21261
21262
  }
21262
21263
  />
21263
21264
  ${hasFiltersLabel}
21264
- <main className="space-y-4 px-4 pb-4 flex-1">
21265
+
21266
+ <main className="flex-1 space-y-4 px-6 pb-6">
21265
21267
  <${plural}Table ${tableProps} />${sortOrderDialog}
21266
21268
  </main>
21267
21269
  </React.Fragment>
@@ -32263,7 +32265,8 @@ function scaffoldCoreSchemas({
32263
32265
  const schemaName = "settings";
32264
32266
  const schemaPath = path71.join(cwd, config.paths.schemas, `${schemaName}.json`);
32265
32267
  fs60.mkdirSync(path71.dirname(schemaPath), { recursive: true });
32266
- fs60.writeFileSync(schemaPath, schemaContent, "utf-8");
32268
+ fs60.writeFileSync(schemaPath, `${schemaContent}
32269
+ `, "utf-8");
32267
32270
  result.schemas.push(`${schemaName}.json`);
32268
32271
  ensureSnapshotGitFiles(cwd);
32269
32272
  try {
@@ -32510,7 +32513,6 @@ function scaffoldLayout({ cwd, config }) {
32510
32513
  );
32511
32514
  write(path74.join(config.paths.pages, "page.tsx"), readTemplate("pages/dashboard-page.tsx"));
32512
32515
  const containerDir = path74.join(config.paths.pages, ADMIN_CONTAINER_ROUTE_GROUP);
32513
- write(path74.join(containerDir, "layout.tsx"), readTemplate("pages/container-layout.tsx"));
32514
32516
  const usersDir = path74.join(containerDir, "users");
32515
32517
  write(path74.join(usersDir, "page.tsx"), readTemplate("pages/users/users-page.tsx"));
32516
32518
  write(
@@ -33499,20 +33501,50 @@ function renderBaseFontDeclarations() {
33499
33501
  `;
33500
33502
  }
33501
33503
 
33504
+ // adapters/next/templates/renderers/init/scaffolders/tailwind/mono-font-family-rule.ts
33505
+ function renderMonoFontFamilyRule() {
33506
+ return `code,
33507
+ kbd,
33508
+ samp,
33509
+ pre {
33510
+ font-family: var(--font-geist-mono);
33511
+ }
33512
+ `;
33513
+ }
33514
+
33515
+ // adapters/next/templates/renderers/init/scaffolders/tailwind/root-font-family-rule.ts
33516
+ function renderRootFontFamilyRule() {
33517
+ return `html {
33518
+ font-family: var(--font-geist-sans);
33519
+ }
33520
+ `;
33521
+ }
33522
+
33502
33523
  // adapters/next/init/scaffolders/tailwind/apply-base-font.ts
33503
33524
  function applyBaseFont(content) {
33504
33525
  const bodyRule = /(?:^|\n)body\s*\{[^}]*\}/.exec(content);
33505
33526
  if (!bodyRule) {
33506
33527
  return `${content}
33528
+ ${renderRootFontFamilyRule()}
33507
33529
  body {
33508
33530
  ${renderBaseFontDeclarations()}}
33509
- `;
33531
+
33532
+ ${renderMonoFontFamilyRule()}`;
33510
33533
  }
33511
- if (/font-size\s*:/.test(bodyRule[0])) {
33512
- return content;
33534
+ const leadingNewline = bodyRule[0].startsWith("\n") ? "\n" : "";
33535
+ let rule = bodyRule[0].slice(leadingNewline.length).replace(/\n[ \t]*font-family:[^;]*;/g, "");
33536
+ if (!/font-size\s*:/.test(rule)) {
33537
+ const closingBrace = rule.length - 1;
33538
+ rule = `${rule.slice(0, closingBrace)}${renderBaseFontDeclarations()}${rule.slice(closingBrace)}`;
33513
33539
  }
33514
- const closingBrace = bodyRule.index + bodyRule[0].length - 1;
33515
- return `${content.slice(0, closingBrace)}${renderBaseFontDeclarations()}${content.slice(closingBrace)}`;
33540
+ const before = content.slice(0, bodyRule.index);
33541
+ const after = content.slice(bodyRule.index + bodyRule[0].length);
33542
+ const rootRule = content.includes(renderRootFontFamilyRule()) ? "" : `${renderRootFontFamilyRule()}
33543
+ `;
33544
+ const monoRule = content.includes(renderMonoFontFamilyRule()) ? "" : `
33545
+
33546
+ ${renderMonoFontFamilyRule()}`;
33547
+ return `${before}${leadingNewline}${rootRule}${rule}${monoRule}${after}`;
33516
33548
  }
33517
33549
 
33518
33550
  // adapters/next/init/scaffolders/tailwind/get-admin-theme-vars.ts
@@ -38352,11 +38384,6 @@ var TEMPLATE_REGISTRY = {
38352
38384
  base: "cwd",
38353
38385
  dependencies: ["auth-gate"]
38354
38386
  },
38355
- "container-layout": {
38356
- relPath: "app/(admin)/admin/(authenticated)/(container)/layout.tsx",
38357
- content: () => readTemplate("pages/container-layout.tsx"),
38358
- base: "cwd"
38359
- },
38360
38387
  "auth-gate": {
38361
38388
  relPath: "app/(admin)/admin/(authenticated)/auth-gate.tsx",
38362
38389
  content: () => readTemplate("pages/auth-gate.tsx"),