@betterstart/cli 0.1.69 → 0.1.71

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 (77) hide show
  1. package/dist/chunk-E4HZYXQ2.js +36 -0
  2. package/dist/chunk-E4HZYXQ2.js.map +1 -0
  3. package/dist/cli.js +799 -4586
  4. package/dist/cli.js.map +1 -1
  5. package/dist/reader-2T45D7JZ.js +7 -0
  6. package/package.json +1 -1
  7. package/templates/init/api/auth-route.ts +3 -0
  8. package/templates/init/api/upload-route.ts +74 -0
  9. package/templates/init/cms-globals.css +200 -0
  10. package/templates/init/components/data-table/data-table-pagination.tsx +90 -0
  11. package/templates/init/components/data-table/data-table-toolbar.tsx +93 -0
  12. package/templates/init/components/data-table/data-table.tsx +188 -0
  13. package/templates/init/components/layout/cms-header.tsx +32 -0
  14. package/templates/init/components/layout/cms-nav-link.tsx +25 -0
  15. package/templates/init/components/layout/cms-providers.tsx +33 -0
  16. package/templates/init/components/layout/cms-search.tsx +25 -0
  17. package/templates/init/components/layout/cms-sidebar.tsx +192 -0
  18. package/templates/init/components/layout/cms-sign-out.tsx +30 -0
  19. package/templates/init/components/shared/delete-dialog.tsx +75 -0
  20. package/templates/init/components/shared/page-header.tsx +23 -0
  21. package/templates/init/components/shared/status-badge.tsx +43 -0
  22. package/templates/init/data/navigation.ts +39 -0
  23. package/templates/init/db/client.ts +8 -0
  24. package/templates/init/db/schema.ts +88 -0
  25. package/{dist/chunk-6JCWMKSY.js → templates/init/drizzle.config.ts} +2 -11
  26. package/templates/init/hooks/use-cms-theme.tsx +78 -0
  27. package/templates/init/hooks/use-editor-image-upload.ts +82 -0
  28. package/templates/init/hooks/use-local-storage.ts +46 -0
  29. package/templates/init/hooks/use-mobile.ts +19 -0
  30. package/templates/init/hooks/use-upload.ts +177 -0
  31. package/templates/init/hooks/use-users.ts +13 -0
  32. package/templates/init/lib/actions/form-settings.ts +126 -0
  33. package/templates/init/lib/actions/profile.ts +62 -0
  34. package/templates/init/lib/actions/upload.ts +153 -0
  35. package/templates/init/lib/actions/users.ts +145 -0
  36. package/templates/init/lib/auth/auth-client.ts +12 -0
  37. package/templates/init/lib/auth/auth.ts +43 -0
  38. package/templates/init/lib/auth/middleware.ts +44 -0
  39. package/templates/init/lib/markdown/cached.ts +7 -0
  40. package/templates/init/lib/markdown/format.ts +55 -0
  41. package/templates/init/lib/markdown/render.ts +182 -0
  42. package/templates/init/lib/r2.ts +55 -0
  43. package/templates/init/pages/account-layout.tsx +63 -0
  44. package/templates/init/pages/authenticated-layout.tsx +26 -0
  45. package/templates/init/pages/cms-layout.tsx +16 -0
  46. package/templates/init/pages/dashboard-page.tsx +91 -0
  47. package/templates/init/pages/login-form.tsx +117 -0
  48. package/templates/init/pages/login-page.tsx +17 -0
  49. package/templates/init/pages/profile/profile-form.tsx +361 -0
  50. package/templates/init/pages/profile/profile-page.tsx +34 -0
  51. package/templates/init/pages/users/columns.tsx +241 -0
  52. package/templates/init/pages/users/create-user-dialog.tsx +116 -0
  53. package/templates/init/pages/users/edit-role-dialog.tsx +92 -0
  54. package/templates/init/pages/users/users-page-content.tsx +29 -0
  55. package/templates/init/pages/users/users-page.tsx +19 -0
  56. package/templates/init/pages/users/users-table.tsx +219 -0
  57. package/templates/init/types/auth.ts +78 -0
  58. package/templates/init/types/index.ts +79 -0
  59. package/templates/init/types/table-meta.ts +16 -0
  60. package/templates/init/utils/cn.ts +6 -0
  61. package/templates/init/utils/mailchimp.ts +39 -0
  62. package/templates/init/utils/seo.ts +90 -0
  63. package/templates/init/utils/validation.ts +105 -0
  64. package/templates/init/utils/webhook.ts +28 -0
  65. package/templates/ui/alert-dialog.tsx +46 -28
  66. package/templates/ui/avatar.tsx +37 -20
  67. package/templates/ui/button.tsx +3 -3
  68. package/templates/ui/card.tsx +30 -18
  69. package/templates/ui/dialog.tsx +46 -22
  70. package/templates/ui/dropdown-menu.tsx +1 -1
  71. package/templates/ui/input.tsx +1 -1
  72. package/templates/ui/select.tsx +42 -34
  73. package/templates/ui/sidebar.tsx +13 -13
  74. package/templates/ui/table.tsx +2 -2
  75. package/dist/chunk-6JCWMKSY.js.map +0 -1
  76. package/dist/drizzle-config-EDKOEZ6G.js +0 -7
  77. /package/dist/{drizzle-config-EDKOEZ6G.js.map → reader-2T45D7JZ.js.map} +0 -0
@@ -1,49 +1,57 @@
1
- 'use client'
1
+ "use client"
2
2
 
3
- import { cn } from '@cms/utils/cn'
4
- import { Check, ChevronDown, ChevronsUpDown, ChevronUp } from 'lucide-react'
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
- function Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {
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({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {
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('scroll-my-1 p-1', className)}
22
+ className={cn("scroll-my-1 p-1", className)}
17
23
  {...props}
18
24
  />
19
25
  )
20
26
  }
21
27
 
22
- function SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {
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 = 'default',
36
+ size = "default",
29
37
  children,
30
38
  ...props
31
39
  }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
32
- size?: 'sm' | 'default'
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
- "border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 flex w-fit items-center justify-between gap-1.5 rounded-lg border bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-3 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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
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
- <ChevronsUpDown className="text-muted-foreground pointer-events-none size-4" />
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 = 'item-aligned',
56
- align = 'center',
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 === 'item-aligned'}
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
- 'data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)',
79
- position === 'popper' && ''
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({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {
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('text-muted-foreground px-1.5 py-1 text-xs', className)}
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
- "focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none 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",
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
- <Check className="pointer-events-none" />
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('bg-border pointer-events-none -mx-1 my-1 h-px', className)}
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
- "bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4",
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
- <ChevronUp />
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
- "bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4",
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
- <ChevronDown />
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
  }
@@ -233,7 +233,7 @@ function Sidebar({
233
233
  <div
234
234
  data-sidebar="sidebar"
235
235
  data-slot="sidebar-inner"
236
- className="bg-sidebar 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"
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
- 'bg-background 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',
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 p-2', className)}
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-accent-foreground 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',
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-0', className)}
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-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground gap-2 rounded-md p-2 text-left text-sm 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 data-active: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',
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-accent-foreground',
452
+ default: 'hover:bg-sidebar-accent hover:text-sidebar-primary',
453
453
  outline:
454
- 'bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]'
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-8 text-sm',
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-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground 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',
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-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0',
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-accent-foreground peer-data-active/menu-button:text-sidebar-accent-foreground 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',
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-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground 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',
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}
@@ -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-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0',
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('p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0', className)}
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":[]}
@@ -1,7 +0,0 @@
1
- import {
2
- drizzleConfigTemplate
3
- } from "./chunk-6JCWMKSY.js";
4
- export {
5
- drizzleConfigTemplate
6
- };
7
- //# sourceMappingURL=drizzle-config-EDKOEZ6G.js.map