betterstart-cli 0.0.28 → 0.0.30

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 (82) hide show
  1. package/dist/assets/adapters/next/integrations/mailchimp/actions/mailchimp.ts +0 -1
  2. package/dist/assets/adapters/next/plugins/blog/schemas/menus.json +1 -1
  3. package/dist/assets/adapters/next/plugins/blog/schemas/posts.json +1 -1
  4. package/dist/assets/adapters/next/templates/init/admin-globals.css +1 -1
  5. package/dist/assets/adapters/next/templates/init/components/layouts/admin-nav-link.tsx +12 -2
  6. package/dist/assets/adapters/next/templates/init/components/layouts/admin-settings-sidebar.tsx +75 -0
  7. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link.tsx +12 -2
  8. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar.tsx +2 -8
  9. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-grid.tsx +14 -5
  10. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table.tsx +111 -112
  11. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-types.ts +4 -0
  12. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +1 -1
  13. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +1 -1
  14. package/dist/assets/adapters/next/templates/init/components/shared/media/media-url-importer.tsx +45 -47
  15. package/dist/assets/adapters/next/templates/init/components/shared/page-header.tsx +1 -1
  16. package/dist/assets/adapters/next/templates/init/data/webhook-events.ts +5 -0
  17. package/dist/assets/adapters/next/templates/init/hooks/use-table-utils.ts +27 -7
  18. package/dist/assets/adapters/next/templates/init/hooks/use-webhooks.ts +211 -0
  19. package/dist/assets/adapters/next/templates/init/lib/actions/audit/types.ts +2 -0
  20. package/dist/assets/adapters/next/templates/init/lib/actions/forms/index.ts +0 -1
  21. package/dist/assets/adapters/next/templates/init/lib/actions/forms/types.ts +0 -4
  22. package/dist/assets/adapters/next/templates/init/lib/actions/forms/upsert-form-settings.ts +0 -2
  23. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/create-webhook.ts +55 -0
  24. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/delete-webhook.ts +26 -0
  25. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/dispatch.ts +135 -0
  26. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-deliveries.ts +124 -0
  27. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-secret.ts +28 -0
  28. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-subscriptions.ts +32 -0
  29. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhooks.ts +154 -0
  30. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/index.ts +30 -0
  31. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/internal-get-active-endpoints.ts +20 -0
  32. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/regenerate-webhook-secret.ts +35 -0
  33. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/register.ts +70 -0
  34. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/send-test-webhook.ts +81 -0
  35. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/types.ts +104 -0
  36. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/update-webhook.ts +72 -0
  37. package/dist/assets/adapters/next/templates/init/lib/db/core/schema.ts +71 -2
  38. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.ts +2 -0
  39. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/runner.ts +3 -1
  40. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/types.ts +6 -1
  41. package/dist/assets/adapters/next/templates/init/pages/auth-gate-rsc.tsx +1 -1
  42. package/dist/assets/adapters/next/templates/init/pages/media/media-page-content.tsx +1 -1
  43. package/dist/assets/adapters/next/templates/init/pages/media/media-page-skeleton.tsx +1 -1
  44. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-columns.tsx +150 -0
  45. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-page-content.tsx +137 -0
  46. package/dist/assets/adapters/next/templates/init/pages/{audit-log → settings/audit-log}/audit-log-page-skeleton.tsx +1 -1
  47. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-table.tsx +295 -0
  48. package/dist/assets/adapters/next/templates/init/pages/settings/forms/edit-form-notifications-dialog.tsx +128 -0
  49. package/dist/assets/adapters/next/templates/init/pages/settings/forms/forms-settings-page-content.tsx +111 -0
  50. package/dist/assets/adapters/next/templates/init/pages/settings/forms/forms-settings-page-skeleton.tsx +7 -0
  51. package/dist/assets/adapters/next/templates/init/pages/settings/forms/forms-settings-page.tsx +14 -0
  52. package/dist/assets/adapters/next/templates/init/pages/settings/settings-layout.tsx +10 -0
  53. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/delete-webhook-dialog.tsx +82 -0
  54. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-actions.tsx +53 -0
  55. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-enabled-switch.tsx +18 -0
  56. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-endpoint-dialog.tsx +370 -0
  57. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-columns.tsx +258 -0
  58. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-columns.tsx +200 -0
  59. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-page-content.tsx +117 -0
  60. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-page.tsx +14 -0
  61. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-table.tsx +253 -0
  62. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-page-content.tsx +161 -0
  63. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-page-skeleton.tsx +7 -0
  64. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-page.tsx +14 -0
  65. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-table.tsx +264 -0
  66. package/dist/assets/adapters/next/templates/init/pages/users/users-page-skeleton.tsx +1 -1
  67. package/dist/assets/adapters/next/templates/init/pages/users/users-table.tsx +103 -109
  68. package/dist/assets/adapters/next/templates/init/types/webhooks.ts +7 -0
  69. package/dist/assets/adapters/next/templates/init/utils/webhook/signature.ts +13 -0
  70. package/dist/assets/shared-assets/react-admin/ui/card.tsx +1 -1
  71. package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +2 -2
  72. package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +3 -3
  73. package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +1 -1
  74. package/dist/cli.js +947 -620
  75. package/dist/cli.js.map +1 -1
  76. package/package.json +1 -1
  77. package/dist/assets/adapters/next/templates/init/lib/actions/forms/test-form-webhook.ts +0 -40
  78. package/dist/assets/adapters/next/templates/init/pages/audit-log/audit-log-page-content.tsx +0 -550
  79. package/dist/assets/adapters/next/templates/init/utils/webhook/webhook.ts +0 -28
  80. /package/dist/assets/adapters/next/templates/init/pages/{audit-log → settings/audit-log}/audit-log-detail-drawer.tsx +0 -0
  81. /package/dist/assets/adapters/next/templates/init/pages/{audit-log → settings/audit-log}/audit-log-detail-row.tsx +0 -0
  82. /package/dist/assets/adapters/next/templates/init/pages/{audit-log → settings/audit-log}/audit-log-page.tsx +0 -0
@@ -10,7 +10,6 @@ import {
10
10
  DataGridRow
11
11
  } from '@admin/components/shared/data-table/data-grid'
12
12
  import { DataTablePagination } from '@admin/components/shared/data-table/data-table-pagination'
13
- import { Card, CardContent } from '@admin/components/ui/card'
14
13
  import { useTableUtils } from '@admin/hooks/use-table-utils'
15
14
  import { useUsers } from '@admin/hooks/use-users'
16
15
  import type { User } from '@admin/types/auth'
@@ -139,120 +138,115 @@ export function UsersTable<TValue>({
139
138
 
140
139
  return (
141
140
  <div className={cn('flex flex-col gap-6 pt-px pb-2 h-full', className)}>
142
- <Card className="min-h-0 flex-1 p-0">
143
- <CardContent ref={tableContainerRef} className="flex min-h-0 flex-1 flex-col p-0">
144
- <DataGrid
145
- containerClassName="min-h-0 flex-1"
146
- gridTemplateColumns={gridTemplateColumns}
147
- style={{ width: table.getTotalSize() }}
148
- >
149
- <DataGridHeader>
150
- {table.getHeaderGroups().map((headerGroup) => (
151
- <DataGridRow key={headerGroup.id}>
152
- {headerGroup.headers.map((header, headerIndex) => {
153
- const resizeLabel =
154
- typeof header.column.columnDef.header === 'string'
155
- ? header.column.columnDef.header
156
- : header.column.id
157
- const nextHeader = headerGroup.headers[headerIndex + 1]
158
- const canResizeColumn =
159
- header.column.getCanResize() && nextHeader?.column.getCanResize() === true
160
- return (
161
- <DataGridHead
162
- key={header.id}
163
- className="group/resize-header relative overflow-hidden px-4"
164
- data-column-id={header.column.id}
165
- onMouseEnter={() => setHoveredColumnId(header.column.id)}
166
- onMouseLeave={() =>
167
- setHoveredColumnId((current) =>
168
- current === header.column.id ? null : current
169
- )
170
- }
171
- >
172
- {header.isPlaceholder
173
- ? null
174
- : flexRender(header.column.columnDef.header, header.getContext())}
175
- {canResizeColumn ? (
176
- <button
177
- type="button"
178
- aria-label={`Resize ${resizeLabel} column`}
179
- className="group/resize-handle absolute right-0 top-0 z-10 flex h-full w-5 cursor-col-resize touch-none select-none items-center justify-center text-muted-foreground opacity-0 transition-opacity hover:text-foreground focus-visible:text-foreground focus-visible:opacity-100 focus-visible:outline-none group-focus-within/resize-header:opacity-100 data-[column-hovered=true]:opacity-100 data-[resizing=true]:opacity-100"
180
- data-resize-handle
181
- data-column-hovered={
182
- hoveredColumnId === header.column.id ? 'true' : 'false'
183
- }
184
- data-resizing={header.column.getIsResizing() ? 'true' : 'false'}
185
- onDoubleClick={resetColumnSizingToContainer}
186
- onMouseDown={header.getResizeHandler()}
187
- onTouchStart={header.getResizeHandler()}
188
- >
189
- <GripVertical
190
- aria-hidden="true"
191
- className={cn('size-3.5', {
192
- 'text-ring': header.column.getIsResizing()
193
- })}
194
- />
195
- </button>
196
- ) : null}
197
- </DataGridHead>
198
- )
199
- })}
200
- </DataGridRow>
201
- ))}
202
- </DataGridHeader>
203
- <DataGridBody>
204
- {isPending ? (
205
- <DataGridRow>
206
- <DataGridCell
207
- className="flex h-24 items-center justify-center text-center px-4"
208
- style={{ gridColumn: '1 / -1' }}
141
+ <DataGrid
142
+ containerClassName="min-h-0 flex-1"
143
+ containerRef={tableContainerRef}
144
+ gridTemplateColumns={gridTemplateColumns}
145
+ style={{ width: table.getTotalSize() }}
146
+ >
147
+ <DataGridHeader>
148
+ {table.getHeaderGroups().map((headerGroup) => (
149
+ <DataGridRow key={headerGroup.id}>
150
+ {headerGroup.headers.map((header, headerIndex) => {
151
+ const resizeLabel =
152
+ typeof header.column.columnDef.header === 'string'
153
+ ? header.column.columnDef.header
154
+ : header.column.id
155
+ const nextHeader = headerGroup.headers[headerIndex + 1]
156
+ const canResizeColumn =
157
+ header.column.getCanResize() && nextHeader?.column.getCanResize() === true
158
+ return (
159
+ <DataGridHead
160
+ key={header.id}
161
+ className="group/resize-header relative overflow-hidden px-4"
162
+ data-column-id={header.column.id}
163
+ onMouseEnter={() => setHoveredColumnId(header.column.id)}
164
+ onMouseLeave={() =>
165
+ setHoveredColumnId((current) =>
166
+ current === header.column.id ? null : current
167
+ )
168
+ }
209
169
  >
210
- <div className="text-muted-foreground">Loading users...</div>
211
- </DataGridCell>
212
- </DataGridRow>
213
- ) : error ? (
214
- <DataGridRow>
215
- <DataGridCell
216
- className="flex h-24 items-center justify-center text-center px-4"
217
- style={{ gridColumn: '1 / -1' }}
218
- >
219
- <div className="text-destructive">Error: {error.message}</div>
220
- </DataGridCell>
221
- </DataGridRow>
222
- ) : table.getRowModel().rows?.length ? (
223
- table.getRowModel().rows.map((row) => (
224
- <DataGridRow key={row.id} className="hover:bg-muted/50">
225
- {row.getVisibleCells().map((cell) => (
226
- <DataGridCell
227
- key={cell.id}
228
- data-column-id={cell.column.id}
229
- onMouseEnter={() => setHoveredColumnId(cell.column.id)}
230
- onMouseLeave={() =>
231
- setHoveredColumnId((current) =>
232
- current === cell.column.id ? null : current
233
- )
170
+ {header.isPlaceholder
171
+ ? null
172
+ : flexRender(header.column.columnDef.header, header.getContext())}
173
+ {canResizeColumn ? (
174
+ <button
175
+ type="button"
176
+ aria-label={`Resize ${resizeLabel} column`}
177
+ className="group/resize-handle absolute right-0 top-0 z-10 flex h-full w-5 cursor-col-resize touch-none select-none items-center justify-center text-muted-foreground opacity-0 transition-opacity hover:text-foreground focus-visible:text-foreground focus-visible:opacity-100 focus-visible:outline-none group-focus-within/resize-header:opacity-100 data-[column-hovered=true]:opacity-100 data-[resizing=true]:opacity-100"
178
+ data-resize-handle
179
+ data-column-hovered={
180
+ hoveredColumnId === header.column.id ? 'true' : 'false'
234
181
  }
235
- className="px-4"
182
+ data-resizing={header.column.getIsResizing() ? 'true' : 'false'}
183
+ onDoubleClick={resetColumnSizingToContainer}
184
+ onMouseDown={header.getResizeHandler()}
185
+ onTouchStart={header.getResizeHandler()}
236
186
  >
237
- {flexRender(cell.column.columnDef.cell, cell.getContext())}
238
- </DataGridCell>
239
- ))}
240
- </DataGridRow>
241
- ))
242
- ) : (
243
- <DataGridRow>
187
+ <GripVertical
188
+ aria-hidden="true"
189
+ className={cn('size-3.5', {
190
+ 'text-ring': header.column.getIsResizing()
191
+ })}
192
+ />
193
+ </button>
194
+ ) : null}
195
+ </DataGridHead>
196
+ )
197
+ })}
198
+ </DataGridRow>
199
+ ))}
200
+ </DataGridHeader>
201
+ <DataGridBody>
202
+ {isPending ? (
203
+ <DataGridRow>
204
+ <DataGridCell
205
+ className="flex h-24 items-center justify-center text-center px-4"
206
+ style={{ gridColumn: '1 / -1' }}
207
+ >
208
+ <div className="text-muted-foreground">Loading users…</div>
209
+ </DataGridCell>
210
+ </DataGridRow>
211
+ ) : error ? (
212
+ <DataGridRow>
213
+ <DataGridCell
214
+ className="flex h-24 items-center justify-center text-center px-4"
215
+ style={{ gridColumn: '1 / -1' }}
216
+ >
217
+ <div className="text-destructive">Error: {error.message}</div>
218
+ </DataGridCell>
219
+ </DataGridRow>
220
+ ) : table.getRowModel().rows?.length ? (
221
+ table.getRowModel().rows.map((row) => (
222
+ <DataGridRow key={row.id} className="hover:bg-muted/50">
223
+ {row.getVisibleCells().map((cell) => (
244
224
  <DataGridCell
245
- className="flex h-24 items-center justify-center text-center px-4"
246
- style={{ gridColumn: '1 / -1' }}
225
+ key={cell.id}
226
+ data-column-id={cell.column.id}
227
+ onMouseEnter={() => setHoveredColumnId(cell.column.id)}
228
+ onMouseLeave={() =>
229
+ setHoveredColumnId((current) => (current === cell.column.id ? null : current))
230
+ }
231
+ className="px-4"
247
232
  >
248
- No users found.
233
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
249
234
  </DataGridCell>
250
- </DataGridRow>
251
- )}
252
- </DataGridBody>
253
- </DataGrid>
254
- </CardContent>
255
- </Card>
235
+ ))}
236
+ </DataGridRow>
237
+ ))
238
+ ) : (
239
+ <DataGridRow>
240
+ <DataGridCell
241
+ className="flex h-24 items-center justify-center text-center px-4"
242
+ style={{ gridColumn: '1 / -1' }}
243
+ >
244
+ No users found.
245
+ </DataGridCell>
246
+ </DataGridRow>
247
+ )}
248
+ </DataGridBody>
249
+ </DataGrid>
256
250
 
257
251
  {shouldShowPagination ? (
258
252
  <DataTablePagination
@@ -0,0 +1,7 @@
1
+ export interface WebhookEventSource {
2
+ schema: string
3
+ kind: 'entity' | 'single' | 'form'
4
+ label: string
5
+ events: string[]
6
+ settingsKey?: string
7
+ }
@@ -0,0 +1,13 @@
1
+ import { createHmac, randomBytes, randomUUID } from 'node:crypto'
2
+
3
+ export function generateWebhookSecret(): string {
4
+ return `whsec_${randomBytes(32).toString('hex')}`
5
+ }
6
+
7
+ export function createWebhookEventId(): string {
8
+ return `evt_${randomUUID()}`
9
+ }
10
+
11
+ export function signWebhookPayload(secret: string, timestamp: string, body: string): string {
12
+ return `sha256=${createHmac('sha256', secret).update(`${timestamp}.${body}`).digest('hex')}`
13
+ }
@@ -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 @container/card-header grid auto-rows-min items-start gap-2 rounded-t-sm px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] border-x border-t [.border-b]:pb-6 border-border bg-muted pt-2.5 [text-box-trim:trim-both] -mb-1 pb-3',
27
+ 'group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-sm px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] border-x border-t [.border-b]:pb-6 border-border bg-muted pt-2.5 [text-box-trim:trim-both] -mb-1 pb-3',
28
28
  className
29
29
  )}
30
30
  {...props}
@@ -47,7 +47,7 @@ function DrawerOverlay({
47
47
  <DrawerPrimitive.Overlay
48
48
  data-slot="drawer-overlay"
49
49
  className={cn(
50
- 'fixed inset-0 z-50 bg-black/80 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0',
50
+ 'fixed inset-0 z-200 bg-black/80 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0',
51
51
  className
52
52
  )}
53
53
  {...props}
@@ -67,7 +67,7 @@ function DrawerContent({
67
67
  <DrawerPrimitive.Content
68
68
  data-slot="drawer-content"
69
69
  className={cn(
70
- 'group/drawer-content fixed z-50 flex h-auto flex-col bg-transparent p-2 text-sm text-popover-foreground before:absolute before:inset-2 before:-z-10 before:rounded-sm before:border before:border-border before:bg-popover data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=left]:sm:max-w-sm data-[vaul-drawer-direction=right]:sm:max-w-md space-y-4',
70
+ 'group/drawer-content fixed z-200 flex h-auto flex-col bg-transparent p-2 text-sm text-popover-foreground before:absolute before:inset-2 before:-z-10 before:rounded-sm before:border before:border-border before:bg-popover data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=left]:sm:max-w-sm data-[vaul-drawer-direction=right]:sm:max-w-md space-y-4',
71
71
  className
72
72
  )}
73
73
  style={{ touchAction: 'auto', userSelect: 'text', ...style }}
@@ -12,7 +12,7 @@ function InputGroup({ className, ...props }: React.ComponentProps<'div'>) {
12
12
  <div
13
13
  data-slot="input-group"
14
14
  className={cn(
15
- 'group/input-group border border-border relative m-0 flex h-11 w-full min-w-0 items-stretch rounded-sm bg-input p-0 transition-colors outline-none [min-inline-size:0] in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-data-[align=block-end]:rounded-sm has-data-[align=block-start]:rounded-sm 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-sm 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 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 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',
15
+ 'group/input-group border border-border relative m-0 flex h-10 w-full min-w-0 items-stretch rounded-sm bg-input p-0 transition-colors outline-none [min-inline-size:0] in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-data-[align=block-end]:rounded-sm has-data-[align=block-start]:rounded-sm 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-sm 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 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 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',
16
16
  className
17
17
  )}
18
18
  {...props}
@@ -25,8 +25,8 @@ const inputGroupAddonVariants = cva(
25
25
  {
26
26
  variants: {
27
27
  align: {
28
- 'inline-start': 'order-first self-stretch has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]',
29
- 'inline-end': 'order-last self-stretch has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]',
28
+ 'inline-start': 'order-first self-stretch has-[>kbd]:ml-[-0.15rem]',
29
+ 'inline-end': 'order-last self-stretch has-[>kbd]:mr-[-0.15rem]',
30
30
  'block-start': 'order-first w-full justify-start px-3 [.border-b]:pb-3',
31
31
  'block-end': 'order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-3'
32
32
  }
@@ -470,7 +470,7 @@ const sidebarMenuButtonVariants = cva(
470
470
  'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]'
471
471
  },
472
472
  size: {
473
- default: 'h-8.5 text-sm',
473
+ default: 'h-10 text-sm',
474
474
  sm: 'h-8 text-xs',
475
475
  lg: 'h-14 px-3 text-sm group-data-[collapsible=icon]:p-0!'
476
476
  }