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.
- package/dist/assets/adapters/next/templates/init/admin-globals.css +8 -16
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx +5 -5
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-code-mirror.tsx +1 -2
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog-content.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-filters-bar.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/page-header.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/pages/media/media-page-content.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-detail-drawer.tsx +1 -1
- package/dist/assets/adapters/next/templates/init/pages/settings/forms/form-notifications-drawer.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/button.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/card.tsx +11 -7
- package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/input.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/select.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +3 -3
- package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +1 -1
- package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +1 -1
- package/dist/cli.js +50 -23
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- 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)
|
|
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(--
|
|
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-
|
|
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(--
|
|
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
|
}
|
package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx
CHANGED
|
@@ -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
|
|
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
|
|
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>
|
|
@@ -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-
|
|
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
|
|
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="
|
|
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="
|
|
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"
|
package/dist/assets/adapters/next/templates/init/components/shared/media/media-filters-bar.tsx
CHANGED
|
@@ -48,7 +48,7 @@ export function MediaFiltersBar({
|
|
|
48
48
|
return (
|
|
49
49
|
<div
|
|
50
50
|
className={cn(
|
|
51
|
-
'sticky top-14 z-9
|
|
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-
|
|
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="
|
|
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)
|
|
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-
|
|
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="
|
|
40
|
+
<DrawerContent className="w-full data-[swipe-direction=right]:max-w-xl">
|
|
41
41
|
<DrawerHeader>
|
|
42
42
|
<DrawerTitle>Audit Event</DrawerTitle>
|
|
43
43
|
<DrawerDescription>
|
package/dist/assets/adapters/next/templates/init/pages/settings/forms/form-notifications-drawer.tsx
CHANGED
|
@@ -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="
|
|
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-
|
|
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/
|
|
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
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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}
|
package/dist/cli.js
CHANGED
|
@@ -16340,9 +16340,10 @@ ${join}
|
|
|
16340
16340
|
</div>`;
|
|
16341
16341
|
}
|
|
16342
16342
|
function renderFormLayoutDetailsTemplate() {
|
|
16343
|
-
return `className={
|
|
16344
|
-
|
|
16345
|
-
|
|
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
|
|
16388
|
-
<CardContent className="space-y-5
|
|
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-
|
|
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
|
|
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-
|
|
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"}
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
33512
|
-
|
|
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
|
|
33515
|
-
|
|
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"),
|