@betterstart/cli 0.1.69 → 0.1.70
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/chunk-E4HZYXQ2.js +36 -0
- package/dist/chunk-E4HZYXQ2.js.map +1 -0
- package/dist/cli.js +580 -4444
- package/dist/cli.js.map +1 -1
- package/dist/reader-2T45D7JZ.js +7 -0
- package/package.json +1 -1
- package/templates/init/api/auth-route.ts +3 -0
- package/templates/init/api/upload-route.ts +74 -0
- package/templates/init/cms-globals.css +200 -0
- package/templates/init/components/data-table/data-table-pagination.tsx +90 -0
- package/templates/init/components/data-table/data-table-toolbar.tsx +93 -0
- package/templates/init/components/data-table/data-table.tsx +188 -0
- package/templates/init/components/layout/cms-header.tsx +32 -0
- package/templates/init/components/layout/cms-nav-link.tsx +25 -0
- package/templates/init/components/layout/cms-providers.tsx +33 -0
- package/templates/init/components/layout/cms-search.tsx +25 -0
- package/templates/init/components/layout/cms-sidebar.tsx +192 -0
- package/templates/init/components/layout/cms-sign-out.tsx +30 -0
- package/templates/init/components/shared/delete-dialog.tsx +75 -0
- package/templates/init/components/shared/page-header.tsx +23 -0
- package/templates/init/components/shared/status-badge.tsx +43 -0
- package/templates/init/data/navigation.ts +39 -0
- package/templates/init/db/client.ts +8 -0
- package/templates/init/db/schema.ts +88 -0
- package/{dist/chunk-6JCWMKSY.js → templates/init/drizzle.config.ts} +2 -11
- package/templates/init/hooks/use-cms-theme.tsx +78 -0
- package/templates/init/hooks/use-editor-image-upload.ts +82 -0
- package/templates/init/hooks/use-local-storage.ts +46 -0
- package/templates/init/hooks/use-mobile.ts +19 -0
- package/templates/init/hooks/use-upload.ts +177 -0
- package/templates/init/hooks/use-users.ts +13 -0
- package/templates/init/lib/actions/form-settings.ts +126 -0
- package/templates/init/lib/actions/profile.ts +62 -0
- package/templates/init/lib/actions/upload.ts +153 -0
- package/templates/init/lib/actions/users.ts +145 -0
- package/templates/init/lib/auth/auth-client.ts +12 -0
- package/templates/init/lib/auth/auth.ts +43 -0
- package/templates/init/lib/auth/middleware.ts +44 -0
- package/templates/init/lib/markdown/cached.ts +7 -0
- package/templates/init/lib/markdown/format.ts +55 -0
- package/templates/init/lib/markdown/render.ts +182 -0
- package/templates/init/lib/r2.ts +55 -0
- package/templates/init/pages/account-layout.tsx +63 -0
- package/templates/init/pages/authenticated-layout.tsx +26 -0
- package/templates/init/pages/cms-layout.tsx +16 -0
- package/templates/init/pages/dashboard-page.tsx +91 -0
- package/templates/init/pages/login-form.tsx +117 -0
- package/templates/init/pages/login-page.tsx +17 -0
- package/templates/init/pages/profile/profile-form.tsx +361 -0
- package/templates/init/pages/profile/profile-page.tsx +34 -0
- package/templates/init/pages/users/columns.tsx +241 -0
- package/templates/init/pages/users/create-user-dialog.tsx +116 -0
- package/templates/init/pages/users/edit-role-dialog.tsx +92 -0
- package/templates/init/pages/users/users-page-content.tsx +29 -0
- package/templates/init/pages/users/users-page.tsx +19 -0
- package/templates/init/pages/users/users-table.tsx +219 -0
- package/templates/init/types/auth.ts +78 -0
- package/templates/init/types/index.ts +79 -0
- package/templates/init/types/table-meta.ts +16 -0
- package/templates/init/utils/cn.ts +6 -0
- package/templates/init/utils/mailchimp.ts +39 -0
- package/templates/init/utils/seo.ts +90 -0
- package/templates/init/utils/validation.ts +105 -0
- package/templates/init/utils/webhook.ts +28 -0
- package/templates/ui/alert-dialog.tsx +46 -28
- package/templates/ui/avatar.tsx +37 -20
- package/templates/ui/button.tsx +3 -3
- package/templates/ui/card.tsx +30 -18
- package/templates/ui/dialog.tsx +46 -22
- package/templates/ui/dropdown-menu.tsx +1 -1
- package/templates/ui/input.tsx +1 -1
- package/templates/ui/select.tsx +42 -34
- package/templates/ui/sidebar.tsx +13 -13
- package/templates/ui/table.tsx +2 -2
- package/dist/chunk-6JCWMKSY.js.map +0 -1
- package/dist/drizzle-config-EDKOEZ6G.js +0 -7
- /package/dist/{drizzle-config-EDKOEZ6G.js.map → reader-2T45D7JZ.js.map} +0 -0
package/templates/ui/select.tsx
CHANGED
|
@@ -1,49 +1,57 @@
|
|
|
1
|
-
|
|
1
|
+
"use client"
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import { Select as SelectPrimitive } from 'radix-ui'
|
|
6
|
-
import type * as React from 'react'
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Select as SelectPrimitive } from "radix-ui"
|
|
7
5
|
|
|
8
|
-
|
|
6
|
+
import { cn } from "@cms/utils/cn"
|
|
7
|
+
import { ChevronDownIcon, CheckIcon, ChevronUpIcon } from "lucide-react"
|
|
8
|
+
|
|
9
|
+
function Select({
|
|
10
|
+
...props
|
|
11
|
+
}: React.ComponentProps<typeof SelectPrimitive.Root>) {
|
|
9
12
|
return <SelectPrimitive.Root data-slot="select" {...props} />
|
|
10
13
|
}
|
|
11
14
|
|
|
12
|
-
function SelectGroup({
|
|
15
|
+
function SelectGroup({
|
|
16
|
+
className,
|
|
17
|
+
...props
|
|
18
|
+
}: React.ComponentProps<typeof SelectPrimitive.Group>) {
|
|
13
19
|
return (
|
|
14
20
|
<SelectPrimitive.Group
|
|
15
21
|
data-slot="select-group"
|
|
16
|
-
className={cn(
|
|
22
|
+
className={cn("scroll-my-1 p-1", className)}
|
|
17
23
|
{...props}
|
|
18
24
|
/>
|
|
19
25
|
)
|
|
20
26
|
}
|
|
21
27
|
|
|
22
|
-
function SelectValue({
|
|
28
|
+
function SelectValue({
|
|
29
|
+
...props
|
|
30
|
+
}: React.ComponentProps<typeof SelectPrimitive.Value>) {
|
|
23
31
|
return <SelectPrimitive.Value data-slot="select-value" {...props} />
|
|
24
32
|
}
|
|
25
33
|
|
|
26
34
|
function SelectTrigger({
|
|
27
35
|
className,
|
|
28
|
-
size =
|
|
36
|
+
size = "default",
|
|
29
37
|
children,
|
|
30
38
|
...props
|
|
31
39
|
}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
|
|
32
|
-
size?:
|
|
40
|
+
size?: "sm" | "default"
|
|
33
41
|
}) {
|
|
34
42
|
return (
|
|
35
43
|
<SelectPrimitive.Trigger
|
|
36
44
|
data-slot="select-trigger"
|
|
37
45
|
data-size={size}
|
|
38
46
|
className={cn(
|
|
39
|
-
"
|
|
47
|
+
"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none 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 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *: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 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
40
48
|
className
|
|
41
49
|
)}
|
|
42
50
|
{...props}
|
|
43
51
|
>
|
|
44
52
|
{children}
|
|
45
53
|
<SelectPrimitive.Icon asChild>
|
|
46
|
-
<
|
|
54
|
+
<ChevronDownIcon className="pointer-events-none size-4 text-muted-foreground" />
|
|
47
55
|
</SelectPrimitive.Icon>
|
|
48
56
|
</SelectPrimitive.Trigger>
|
|
49
57
|
)
|
|
@@ -52,21 +60,16 @@ function SelectTrigger({
|
|
|
52
60
|
function SelectContent({
|
|
53
61
|
className,
|
|
54
62
|
children,
|
|
55
|
-
position =
|
|
56
|
-
align =
|
|
63
|
+
position = "item-aligned",
|
|
64
|
+
align = "center",
|
|
57
65
|
...props
|
|
58
66
|
}: React.ComponentProps<typeof SelectPrimitive.Content>) {
|
|
59
67
|
return (
|
|
60
68
|
<SelectPrimitive.Portal>
|
|
61
69
|
<SelectPrimitive.Content
|
|
62
70
|
data-slot="select-content"
|
|
63
|
-
data-align-trigger={position ===
|
|
64
|
-
className={cn(
|
|
65
|
-
'bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg shadow-md ring-1 duration-100 data-[align-trigger=true]:animate-none',
|
|
66
|
-
position === 'popper' &&
|
|
67
|
-
'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',
|
|
68
|
-
className
|
|
69
|
-
)}
|
|
71
|
+
data-align-trigger={position === "item-aligned"}
|
|
72
|
+
className={cn("z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:focus:bg-foreground/10 **:data-[slot$=-item]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-foreground/5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! **:data-[variant=destructive]:focus:bg-foreground/10! **:data-[variant=destructive]:text-accent-foreground! **:data-[variant=destructive]:**:text-accent-foreground!", position ==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className )}
|
|
70
73
|
position={position}
|
|
71
74
|
align={align}
|
|
72
75
|
{...props}
|
|
@@ -75,8 +78,8 @@ function SelectContent({
|
|
|
75
78
|
<SelectPrimitive.Viewport
|
|
76
79
|
data-position={position}
|
|
77
80
|
className={cn(
|
|
78
|
-
|
|
79
|
-
position ===
|
|
81
|
+
"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)",
|
|
82
|
+
position === "popper" && ""
|
|
80
83
|
)}
|
|
81
84
|
>
|
|
82
85
|
{children}
|
|
@@ -87,11 +90,14 @@ function SelectContent({
|
|
|
87
90
|
)
|
|
88
91
|
}
|
|
89
92
|
|
|
90
|
-
function SelectLabel({
|
|
93
|
+
function SelectLabel({
|
|
94
|
+
className,
|
|
95
|
+
...props
|
|
96
|
+
}: React.ComponentProps<typeof SelectPrimitive.Label>) {
|
|
91
97
|
return (
|
|
92
98
|
<SelectPrimitive.Label
|
|
93
99
|
data-slot="select-label"
|
|
94
|
-
className={cn(
|
|
100
|
+
className={cn("px-1.5 py-1 text-xs text-muted-foreground", className)}
|
|
95
101
|
{...props}
|
|
96
102
|
/>
|
|
97
103
|
)
|
|
@@ -106,14 +112,14 @@ function SelectItem({
|
|
|
106
112
|
<SelectPrimitive.Item
|
|
107
113
|
data-slot="select-item"
|
|
108
114
|
className={cn(
|
|
109
|
-
"
|
|
115
|
+
"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-3 text-sm outline-hidden select-none focus:bg-accent! focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
|
|
110
116
|
className
|
|
111
117
|
)}
|
|
112
118
|
{...props}
|
|
113
119
|
>
|
|
114
120
|
<span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center">
|
|
115
121
|
<SelectPrimitive.ItemIndicator>
|
|
116
|
-
<
|
|
122
|
+
<CheckIcon className="pointer-events-none" />
|
|
117
123
|
</SelectPrimitive.ItemIndicator>
|
|
118
124
|
</span>
|
|
119
125
|
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
|
|
@@ -128,7 +134,7 @@ function SelectSeparator({
|
|
|
128
134
|
return (
|
|
129
135
|
<SelectPrimitive.Separator
|
|
130
136
|
data-slot="select-separator"
|
|
131
|
-
className={cn(
|
|
137
|
+
className={cn("pointer-events-none -mx-1 my-1 h-px bg-border", className)}
|
|
132
138
|
{...props}
|
|
133
139
|
/>
|
|
134
140
|
)
|
|
@@ -142,12 +148,13 @@ function SelectScrollUpButton({
|
|
|
142
148
|
<SelectPrimitive.ScrollUpButton
|
|
143
149
|
data-slot="select-scroll-up-button"
|
|
144
150
|
className={cn(
|
|
145
|
-
"
|
|
151
|
+
"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",
|
|
146
152
|
className
|
|
147
153
|
)}
|
|
148
154
|
{...props}
|
|
149
155
|
>
|
|
150
|
-
<
|
|
156
|
+
<ChevronUpIcon
|
|
157
|
+
/>
|
|
151
158
|
</SelectPrimitive.ScrollUpButton>
|
|
152
159
|
)
|
|
153
160
|
}
|
|
@@ -160,12 +167,13 @@ function SelectScrollDownButton({
|
|
|
160
167
|
<SelectPrimitive.ScrollDownButton
|
|
161
168
|
data-slot="select-scroll-down-button"
|
|
162
169
|
className={cn(
|
|
163
|
-
"
|
|
170
|
+
"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",
|
|
164
171
|
className
|
|
165
172
|
)}
|
|
166
173
|
{...props}
|
|
167
174
|
>
|
|
168
|
-
<
|
|
175
|
+
<ChevronDownIcon
|
|
176
|
+
/>
|
|
169
177
|
</SelectPrimitive.ScrollDownButton>
|
|
170
178
|
)
|
|
171
179
|
}
|
|
@@ -180,5 +188,5 @@ export {
|
|
|
180
188
|
SelectScrollUpButton,
|
|
181
189
|
SelectSeparator,
|
|
182
190
|
SelectTrigger,
|
|
183
|
-
SelectValue
|
|
191
|
+
SelectValue,
|
|
184
192
|
}
|
package/templates/ui/sidebar.tsx
CHANGED
|
@@ -233,7 +233,7 @@ function Sidebar({
|
|
|
233
233
|
<div
|
|
234
234
|
data-sidebar="sidebar"
|
|
235
235
|
data-slot="sidebar-inner"
|
|
236
|
-
className="
|
|
236
|
+
className="group-data-[variant=floating]:ring-sidebar-border flex size-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1"
|
|
237
237
|
>
|
|
238
238
|
{children}
|
|
239
239
|
</div>
|
|
@@ -294,7 +294,7 @@ function SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {
|
|
|
294
294
|
<main
|
|
295
295
|
data-slot="sidebar-inset"
|
|
296
296
|
className={cn(
|
|
297
|
-
'
|
|
297
|
+
'relative flex w-full flex-1 flex-col md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',
|
|
298
298
|
className
|
|
299
299
|
)}
|
|
300
300
|
{...props}
|
|
@@ -329,7 +329,7 @@ function SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {
|
|
|
329
329
|
<div
|
|
330
330
|
data-slot="sidebar-footer"
|
|
331
331
|
data-sidebar="footer"
|
|
332
|
-
className={cn('flex flex-col gap-2
|
|
332
|
+
className={cn('flex flex-col gap-2 px-2', className)}
|
|
333
333
|
{...props}
|
|
334
334
|
/>
|
|
335
335
|
)
|
|
@@ -403,7 +403,7 @@ function SidebarGroupAction({
|
|
|
403
403
|
data-slot="sidebar-group-action"
|
|
404
404
|
data-sidebar="group-action"
|
|
405
405
|
className={cn(
|
|
406
|
-
'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-
|
|
406
|
+
'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-primary absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0',
|
|
407
407
|
className
|
|
408
408
|
)}
|
|
409
409
|
{...props}
|
|
@@ -427,7 +427,7 @@ function SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {
|
|
|
427
427
|
<ul
|
|
428
428
|
data-slot="sidebar-menu"
|
|
429
429
|
data-sidebar="menu"
|
|
430
|
-
className={cn('flex w-full min-w-0 flex-col gap-
|
|
430
|
+
className={cn('flex w-full min-w-0 flex-col gap-px', className)}
|
|
431
431
|
{...props}
|
|
432
432
|
/>
|
|
433
433
|
)
|
|
@@ -445,16 +445,16 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {
|
|
|
445
445
|
}
|
|
446
446
|
|
|
447
447
|
const sidebarMenuButtonVariants = cva(
|
|
448
|
-
'ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-
|
|
448
|
+
'ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-primary active:bg-sidebar-accent active:text-sidebar-primary data-active:bg-sidebar-accent data-active:text-sidebar-primary data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-primary gap-2 rounded-md p-2 text-left transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! focus-visible:ring-2 font-medium peer/menu-button flex w-full items-center overflow-hidden outline-hidden group/menu-button disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&_svg]:size-4 [&_svg]:shrink-0 text-sidebar-foreground',
|
|
449
449
|
{
|
|
450
450
|
variants: {
|
|
451
451
|
variant: {
|
|
452
|
-
default: 'hover:bg-sidebar-accent hover:text-sidebar-
|
|
452
|
+
default: 'hover:bg-sidebar-accent hover:text-sidebar-primary',
|
|
453
453
|
outline:
|
|
454
|
-
'bg-background hover:bg-sidebar-accent hover:text-sidebar-
|
|
454
|
+
'bg-background hover:bg-sidebar-accent hover:text-sidebar-primary shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]'
|
|
455
455
|
},
|
|
456
456
|
size: {
|
|
457
|
-
default: 'h-
|
|
457
|
+
default: 'h-9 text-sm',
|
|
458
458
|
sm: 'h-7 text-xs',
|
|
459
459
|
lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!'
|
|
460
460
|
}
|
|
@@ -532,9 +532,9 @@ function SidebarMenuAction({
|
|
|
532
532
|
data-slot="sidebar-menu-action"
|
|
533
533
|
data-sidebar="menu-action"
|
|
534
534
|
className={cn(
|
|
535
|
-
'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-
|
|
535
|
+
'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-primary peer-hover/menu-button:text-sidebar-primary absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0',
|
|
536
536
|
showOnHover &&
|
|
537
|
-
'peer-data-active/menu-button:text-sidebar-
|
|
537
|
+
'peer-data-active/menu-button:text-sidebar-primary group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0',
|
|
538
538
|
className
|
|
539
539
|
)}
|
|
540
540
|
{...props}
|
|
@@ -548,7 +548,7 @@ function SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>)
|
|
|
548
548
|
data-slot="sidebar-menu-badge"
|
|
549
549
|
data-sidebar="menu-badge"
|
|
550
550
|
className={cn(
|
|
551
|
-
'text-sidebar-foreground peer-hover/menu-button:text-sidebar-
|
|
551
|
+
'text-sidebar-foreground peer-hover/menu-button:text-sidebar-primary peer-data-active/menu-button:text-sidebar-primary pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1',
|
|
552
552
|
className
|
|
553
553
|
)}
|
|
554
554
|
{...props}
|
|
@@ -634,7 +634,7 @@ function SidebarMenuSubButton({
|
|
|
634
634
|
data-size={size}
|
|
635
635
|
data-active={isActive || undefined}
|
|
636
636
|
className={cn(
|
|
637
|
-
'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-
|
|
637
|
+
'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-primary active:bg-sidebar-accent active:text-sidebar-primary [&>svg]:text-sidebar-primary data-active:bg-sidebar-accent data-active:text-sidebar-primary flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden group-data-[collapsible=icon]:hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',
|
|
638
638
|
className
|
|
639
639
|
)}
|
|
640
640
|
{...props}
|
package/templates/ui/table.tsx
CHANGED
|
@@ -57,7 +57,7 @@ function TableHead({ className, ...props }: React.ComponentProps<'th'>) {
|
|
|
57
57
|
<th
|
|
58
58
|
data-slot="table-head"
|
|
59
59
|
className={cn(
|
|
60
|
-
'text-foreground h-10 px-
|
|
60
|
+
'text-foreground h-10 px-4 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0',
|
|
61
61
|
className
|
|
62
62
|
)}
|
|
63
63
|
{...props}
|
|
@@ -69,7 +69,7 @@ function TableCell({ className, ...props }: React.ComponentProps<'td'>) {
|
|
|
69
69
|
return (
|
|
70
70
|
<td
|
|
71
71
|
data-slot="table-cell"
|
|
72
|
-
className={cn('
|
|
72
|
+
className={cn('px-4 py-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0', className)}
|
|
73
73
|
{...props}
|
|
74
74
|
/>
|
|
75
75
|
)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init/templates/db/drizzle-config.ts"],"sourcesContent":["/**\n * Template: cms/db/drizzle.config.ts\n * Drizzle Kit configuration for CMS database\n */\nexport function drizzleConfigTemplate(): string {\n return `import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { defineConfig } from 'drizzle-kit'\n\n// Load .env.local (avoids @next/env dependency for drizzle-kit)\nfor (const envFile of ['.env.local', '.env']) {\n try {\n const content = readFileSync(resolve(process.cwd(), envFile), 'utf-8')\n for (const line of content.split('\\\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx === -1) continue\n const key = trimmed.slice(0, eqIdx).trim()\n const val = trimmed\n .slice(eqIdx + 1)\n .trim()\n .replace(/^['\"]|['\"]$/g, '')\n if (!process.env[key]) process.env[key] = val\n }\n } catch {}\n}\n\nexport default defineConfig({\n out: './cms/db/migrations',\n schema: './cms/db/schema.ts',\n dialect: 'postgresql',\n dbCredentials: {\n url: process.env.BETTERSTART_DATABASE_URL!\n }\n})\n`\n}\n"],"mappings":";AAIO,SAAS,wBAAgC;AAC9C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCT;","names":[]}
|
|
File without changes
|