@dyrected/admin 2.0.0 → 2.4.0

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 (67) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/package.json +4 -4
  3. package/scripts/prefix-tailwind-precision.py +98 -0
  4. package/scripts/prefix-tailwind.py +67 -0
  5. package/src/components/auth/auth-gate.tsx +4 -4
  6. package/src/components/error-boundary.tsx +4 -4
  7. package/src/components/forms/fields/block-builder.tsx +24 -24
  8. package/src/components/forms/fields/date-picker.tsx +7 -7
  9. package/src/components/forms/fields/json-editor.tsx +5 -5
  10. package/src/components/forms/fields/media-picker.tsx +39 -39
  11. package/src/components/forms/fields/multi-select.tsx +12 -12
  12. package/src/components/forms/fields/radio-field.tsx +8 -8
  13. package/src/components/forms/fields/relationship-picker.tsx +13 -13
  14. package/src/components/forms/fields/rich-text-editor.tsx +22 -22
  15. package/src/components/forms/fields/select-field.tsx +3 -3
  16. package/src/components/forms/form-engine.tsx +3 -3
  17. package/src/components/forms/form-field-renderer.tsx +37 -37
  18. package/src/components/layout/admin-shell.tsx +60 -60
  19. package/src/components/live-preview/LivePreviewPane.tsx +14 -14
  20. package/src/components/media/focal-point-picker.tsx +9 -9
  21. package/src/components/media/media-card.tsx +10 -10
  22. package/src/components/media/media-grid.tsx +3 -3
  23. package/src/components/media/media-library-dialog.tsx +105 -105
  24. package/src/components/ui/badge.tsx +5 -5
  25. package/src/components/ui/button.tsx +11 -11
  26. package/src/components/ui/calendar.tsx +36 -36
  27. package/src/components/ui/card.tsx +6 -6
  28. package/src/components/ui/checkbox.tsx +3 -3
  29. package/src/components/ui/command.tsx +12 -12
  30. package/src/components/ui/data-table.tsx +18 -18
  31. package/src/components/ui/dialog.tsx +9 -9
  32. package/src/components/ui/dropdown-menu.tsx +16 -16
  33. package/src/components/ui/form.tsx +4 -4
  34. package/src/components/ui/input.tsx +3 -3
  35. package/src/components/ui/label.tsx +1 -1
  36. package/src/components/ui/page-header.tsx +6 -6
  37. package/src/components/ui/pagination.tsx +6 -6
  38. package/src/components/ui/popover.tsx +1 -1
  39. package/src/components/ui/progress.tsx +2 -2
  40. package/src/components/ui/radio-group.tsx +4 -4
  41. package/src/components/ui/render-cell.tsx +16 -16
  42. package/src/components/ui/scroll-area.tsx +6 -6
  43. package/src/components/ui/select.tsx +14 -14
  44. package/src/components/ui/separator.tsx +2 -2
  45. package/src/components/ui/sheet.tsx +13 -13
  46. package/src/components/ui/sidebar.tsx +60 -60
  47. package/src/components/ui/skeleton.tsx +1 -1
  48. package/src/components/ui/sonner.tsx +1 -1
  49. package/src/components/ui/switch.tsx +2 -2
  50. package/src/components/ui/table.tsx +7 -7
  51. package/src/components/ui/tabs.tsx +3 -3
  52. package/src/components/ui/textarea.tsx +1 -1
  53. package/src/components/ui/toggle.tsx +6 -6
  54. package/src/components/ui/tooltip.tsx +1 -1
  55. package/src/index.css +27 -27
  56. package/src/index.tsx +4 -4
  57. package/src/lib/utils.ts +7 -3
  58. package/src/pages/auth/first-user-page.tsx +18 -18
  59. package/src/pages/auth/login-page.tsx +14 -14
  60. package/src/pages/collections/edit-page.tsx +37 -37
  61. package/src/pages/collections/list-page.tsx +23 -23
  62. package/src/pages/dashboard/dashboard.tsx +49 -49
  63. package/src/pages/globals/editor-page.tsx +13 -13
  64. package/src/pages/media/media-page.tsx +106 -106
  65. package/src/pages/setup/setup-prompt.tsx +73 -44
  66. package/tailwind.config.ts +1 -0
  67. package/vite.config.ts +0 -1
@@ -147,7 +147,7 @@ const SidebarProvider = React.forwardRef<
147
147
  } as React.CSSProperties
148
148
  }
149
149
  className={cn(
150
- "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
150
+ "dy-group/sidebar-wrapper dy-flex dy-min-h-svh dy-w-full has-[[data-variant=inset]]:dy-bg-sidebar",
151
151
  className
152
152
  )}
153
153
  ref={ref}
@@ -187,7 +187,7 @@ const Sidebar = React.forwardRef<
187
187
  return (
188
188
  <div
189
189
  className={cn(
190
- "flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground",
190
+ "dy-flex dy-h-full dy-w-[--sidebar-width] dy-flex-col dy-bg-sidebar dy-text-sidebar-foreground",
191
191
  className
192
192
  )}
193
193
  ref={ref}
@@ -204,7 +204,7 @@ const Sidebar = React.forwardRef<
204
204
  <SheetContent
205
205
  data-sidebar="sidebar"
206
206
  data-mobile="true"
207
- className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
207
+ className="dy-w-[--sidebar-width] dy-bg-sidebar dy-p-0 dy-text-sidebar-foreground [&>button]:dy-hidden"
208
208
  style={
209
209
  {
210
210
  "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
@@ -212,11 +212,11 @@ const Sidebar = React.forwardRef<
212
212
  }
213
213
  side={side}
214
214
  >
215
- <SheetHeader className="sr-only">
215
+ <SheetHeader className="dy-sr-only">
216
216
  <SheetTitle>Sidebar</SheetTitle>
217
217
  <SheetDescription>Displays the mobile sidebar.</SheetDescription>
218
218
  </SheetHeader>
219
- <div className="flex h-full w-full flex-col">{children}</div>
219
+ <div className="dy-flex dy-h-full dy-w-full dy-flex-col">{children}</div>
220
220
  </SheetContent>
221
221
  </Sheet>
222
222
  )
@@ -225,7 +225,7 @@ const Sidebar = React.forwardRef<
225
225
  return (
226
226
  <div
227
227
  ref={ref}
228
- className="group peer hidden text-sidebar-foreground md:block"
228
+ className="dy-group dy-peer dy-hidden dy-text-sidebar-foreground md:dy-block"
229
229
  data-state={state}
230
230
  data-collapsible={state === "collapsed" ? collapsible : ""}
231
231
  data-variant={variant}
@@ -234,9 +234,9 @@ const Sidebar = React.forwardRef<
234
234
  {/* This is what handles the sidebar gap on desktop */}
235
235
  <div
236
236
  className={cn(
237
- "relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
238
- "group-data-[collapsible=offcanvas]:w-0",
239
- "group-data-[side=right]:rotate-180",
237
+ "dy-relative dy-w-[--sidebar-width] dy-bg-transparent dy-transition-[width] dy-duration-200 dy-ease-linear",
238
+ "dy-group-data-[collapsible=offcanvas]:dy-w-0",
239
+ "dy-group-data-[side=right]:dy-rotate-180",
240
240
  variant === "floating" || variant === "inset"
241
241
  ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
242
242
  : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]"
@@ -244,7 +244,7 @@ const Sidebar = React.forwardRef<
244
244
  />
245
245
  <div
246
246
  className={cn(
247
- "fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex",
247
+ "dy-fixed dy-inset-y-0 dy-z-10 dy-hidden dy-h-svh dy-w-[--sidebar-width] dy-transition-[left,right,width] dy-duration-200 dy-ease-linear md:dy-flex",
248
248
  side === "left"
249
249
  ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
250
250
  : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
@@ -258,7 +258,7 @@ const Sidebar = React.forwardRef<
258
258
  >
259
259
  <div
260
260
  data-sidebar="sidebar"
261
- className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
261
+ className="dy-flex dy-h-full dy-w-full dy-flex-col dy-bg-sidebar dy-group-data-[variant=floating]:dy-rounded-lg dy-group-data-[variant=floating]:dy-border dy-group-data-[variant=floating]:dy-border-sidebar-border dy-group-data-[variant=floating]:dy-shadow"
262
262
  >
263
263
  {children}
264
264
  </div>
@@ -281,7 +281,7 @@ const SidebarTrigger = React.forwardRef<
281
281
  data-sidebar="trigger"
282
282
  variant="ghost"
283
283
  size="icon"
284
- className={cn("h-7 w-7", className)}
284
+ className={cn("dy-h-7 dy-w-7", className)}
285
285
  onClick={(event) => {
286
286
  onClick?.(event)
287
287
  toggleSidebar()
@@ -289,7 +289,7 @@ const SidebarTrigger = React.forwardRef<
289
289
  {...props}
290
290
  >
291
291
  <PanelLeft />
292
- <span className="sr-only">Toggle Sidebar</span>
292
+ <span className="dy-sr-only">Toggle Sidebar</span>
293
293
  </Button>
294
294
  )
295
295
  })
@@ -310,12 +310,12 @@ const SidebarRail = React.forwardRef<
310
310
  onClick={toggleSidebar}
311
311
  title="Toggle Sidebar"
312
312
  className={cn(
313
- "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex",
314
- "[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
315
- "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
316
- "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
317
- "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
318
- "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
313
+ "dy-absolute dy-inset-y-0 dy-z-20 dy-hidden dy-w-4 dy--translate-x-1/2 dy-transition-all dy-ease-linear after:dy-absolute after:dy-inset-y-0 after:dy-left-1/2 after:dy-w-[2px] hover:after:dy-bg-sidebar-border dy-group-data-[side=left]:dy--right-4 dy-group-data-[side=right]:dy-left-0 sm:dy-flex",
314
+ "[[data-side=left]_&]:dy-cursor-w-resize [[data-side=right]_&]:dy-cursor-e-resize",
315
+ "[[data-side=left][data-state=collapsed]_&]:dy-cursor-e-resize [[data-side=right][data-state=collapsed]_&]:dy-cursor-w-resize",
316
+ "dy-group-data-[collapsible=offcanvas]:dy-translate-x-0 dy-group-data-[collapsible=offcanvas]:after:dy-left-full dy-group-data-[collapsible=offcanvas]:hover:dy-bg-sidebar",
317
+ "[[data-side=left][data-collapsible=offcanvas]_&]:dy--right-2",
318
+ "[[data-side=right][data-collapsible=offcanvas]_&]:dy--left-2",
319
319
  className
320
320
  )}
321
321
  {...props}
@@ -332,8 +332,8 @@ const SidebarInset = React.forwardRef<
332
332
  <main
333
333
  ref={ref}
334
334
  className={cn(
335
- "relative flex w-full flex-1 flex-col bg-background",
336
- "md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
335
+ "dy-relative dy-flex dy-w-full dy-flex-1 dy-flex-col dy-bg-background",
336
+ "md:dy-peer-data-[variant=inset]:dy-m-2 md:dy-peer-data-[state=collapsed]:dy-peer-data-[variant=inset]:dy-ml-2 md:dy-peer-data-[variant=inset]:dy-ml-0 md:dy-peer-data-[variant=inset]:dy-rounded-xl md:dy-peer-data-[variant=inset]:dy-shadow",
337
337
  className
338
338
  )}
339
339
  {...props}
@@ -351,7 +351,7 @@ const SidebarInput = React.forwardRef<
351
351
  ref={ref}
352
352
  data-sidebar="input"
353
353
  className={cn(
354
- "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
354
+ "dy-h-8 dy-w-full dy-bg-background dy-shadow-none focus-visible:dy-ring-2 focus-visible:dy-ring-sidebar-ring",
355
355
  className
356
356
  )}
357
357
  {...props}
@@ -368,7 +368,7 @@ const SidebarHeader = React.forwardRef<
368
368
  <div
369
369
  ref={ref}
370
370
  data-sidebar="header"
371
- className={cn("flex flex-col gap-2 p-2", className)}
371
+ className={cn("dy-flex dy-flex-col dy-gap-2 dy-p-2", className)}
372
372
  {...props}
373
373
  />
374
374
  )
@@ -383,7 +383,7 @@ const SidebarFooter = React.forwardRef<
383
383
  <div
384
384
  ref={ref}
385
385
  data-sidebar="footer"
386
- className={cn("flex flex-col gap-2 p-2", className)}
386
+ className={cn("dy-flex dy-flex-col dy-gap-2 dy-p-2", className)}
387
387
  {...props}
388
388
  />
389
389
  )
@@ -398,7 +398,7 @@ const SidebarSeparator = React.forwardRef<
398
398
  <Separator
399
399
  ref={ref}
400
400
  data-sidebar="separator"
401
- className={cn("mx-2 w-auto bg-sidebar-border", className)}
401
+ className={cn("dy-mx-2 dy-w-auto dy-bg-sidebar-border", className)}
402
402
  {...props}
403
403
  />
404
404
  )
@@ -414,7 +414,7 @@ const SidebarContent = React.forwardRef<
414
414
  ref={ref}
415
415
  data-sidebar="content"
416
416
  className={cn(
417
- "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
417
+ "dy-flex dy-min-h-0 dy-flex-1 dy-flex-col dy-gap-2 dy-overflow-auto dy-group-data-[collapsible=icon]:dy-overflow-hidden",
418
418
  className
419
419
  )}
420
420
  {...props}
@@ -431,7 +431,7 @@ const SidebarGroup = React.forwardRef<
431
431
  <div
432
432
  ref={ref}
433
433
  data-sidebar="group"
434
- className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
434
+ className={cn("dy-relative dy-flex dy-w-full dy-min-w-0 dy-flex-col dy-p-2", className)}
435
435
  {...props}
436
436
  />
437
437
  )
@@ -449,8 +449,8 @@ const SidebarGroupLabel = React.forwardRef<
449
449
  ref={ref}
450
450
  data-sidebar="group-label"
451
451
  className={cn(
452
- "flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
453
- "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
452
+ "dy-flex dy-h-8 dy-shrink-0 dy-items-center dy-rounded-md dy-px-2 dy-text-xs dy-font-medium dy-text-sidebar-foreground/70 dy-outline-none dy-ring-sidebar-ring dy-transition-[margin,opacity] dy-duration-200 dy-ease-linear focus-visible:dy-ring-2 [&>svg]:dy-size-4 [&>svg]:dy-shrink-0",
453
+ "dy-group-data-[collapsible=icon]:dy--mt-8 dy-group-data-[collapsible=icon]:dy-opacity-0",
454
454
  className
455
455
  )}
456
456
  {...props}
@@ -470,10 +470,10 @@ const SidebarGroupAction = React.forwardRef<
470
470
  ref={ref}
471
471
  data-sidebar="group-action"
472
472
  className={cn(
473
- "absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
473
+ "dy-absolute dy-right-3 dy-top-3.5 dy-flex dy-aspect-square dy-w-5 dy-items-center dy-justify-center dy-rounded-md dy-p-0 dy-text-sidebar-foreground dy-outline-none dy-ring-sidebar-ring dy-transition-transform hover:dy-bg-sidebar-accent hover:dy-text-sidebar-accent-foreground focus-visible:dy-ring-2 [&>svg]:dy-size-4 [&>svg]:dy-shrink-0",
474
474
  // Increases the hit area of the button on mobile.
475
- "after:absolute after:-inset-2 after:md:hidden",
476
- "group-data-[collapsible=icon]:hidden",
475
+ "after:dy-absolute after:dy--inset-2 after:md:dy-hidden",
476
+ "dy-group-data-[collapsible=icon]:dy-hidden",
477
477
  className
478
478
  )}
479
479
  {...props}
@@ -489,7 +489,7 @@ const SidebarGroupContent = React.forwardRef<
489
489
  <div
490
490
  ref={ref}
491
491
  data-sidebar="group-content"
492
- className={cn("w-full text-sm", className)}
492
+ className={cn("dy-w-full dy-text-sm", className)}
493
493
  {...props}
494
494
  />
495
495
  ))
@@ -502,7 +502,7 @@ const SidebarMenu = React.forwardRef<
502
502
  <ul
503
503
  ref={ref}
504
504
  data-sidebar="menu"
505
- className={cn("flex w-full min-w-0 flex-col gap-1", className)}
505
+ className={cn("dy-flex dy-w-full dy-min-w-0 dy-flex-col dy-gap-1", className)}
506
506
  {...props}
507
507
  />
508
508
  ))
@@ -515,18 +515,18 @@ const SidebarMenuItem = React.forwardRef<
515
515
  <li
516
516
  ref={ref}
517
517
  data-sidebar="menu-item"
518
- className={cn("group/menu-item relative", className)}
518
+ className={cn("dy-group/menu-item dy-relative", className)}
519
519
  {...props}
520
520
  />
521
521
  ))
522
522
  SidebarMenuItem.displayName = "SidebarMenuItem"
523
523
 
524
524
  const sidebarMenuButtonVariants = cva(
525
- "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
525
+ "dy-peer/menu-button dy-flex dy-w-full dy-items-center dy-gap-2 dy-overflow-hidden dy-rounded-md dy-p-2 dy-text-left dy-text-sm dy-outline-none dy-ring-sidebar-ring dy-transition-[width,height,padding] hover:dy-bg-sidebar-accent hover:dy-text-sidebar-accent-foreground focus-visible:dy-ring-2 active:dy-bg-sidebar-accent active:dy-text-sidebar-accent-foreground disabled:dy-pointer-events-none disabled:dy-opacity-50 dy-group-has-[[data-sidebar=menu-action]]/menu-item:dy-pr-8 aria-disabled:dy-pointer-events-none aria-disabled:dy-opacity-50 data-[active=true]:dy-bg-sidebar-accent data-[active=true]:dy-font-medium data-[active=true]:dy-text-sidebar-accent-foreground data-[state=open]:hover:dy-bg-sidebar-accent data-[state=open]:hover:dy-text-sidebar-accent-foreground dy-group-data-[collapsible=icon]:dy-!size-8 dy-group-data-[collapsible=icon]:dy-!p-2 [&>span:last-child]:dy-truncate [&>svg]:dy-size-4 [&>svg]:dy-shrink-0",
526
526
  {
527
527
  variants: {
528
528
  variant: {
529
- default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
529
+ default: "hover:dy-bg-sidebar-accent hover:dy-text-sidebar-accent-foreground",
530
530
  outline:
531
531
  "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))]",
532
532
  },
@@ -616,15 +616,15 @@ const SidebarMenuAction = React.forwardRef<
616
616
  ref={ref}
617
617
  data-sidebar="menu-action"
618
618
  className={cn(
619
- "absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0",
619
+ "dy-absolute dy-right-1 dy-top-1.5 dy-flex dy-aspect-square dy-w-5 dy-items-center dy-justify-center dy-rounded-md dy-p-0 dy-text-sidebar-foreground dy-outline-none dy-ring-sidebar-ring dy-transition-transform hover:dy-bg-sidebar-accent hover:dy-text-sidebar-accent-foreground focus-visible:dy-ring-2 dy-peer-hover/menu-button:dy-text-sidebar-accent-foreground [&>svg]:dy-size-4 [&>svg]:dy-shrink-0",
620
620
  // Increases the hit area of the button on mobile.
621
- "after:absolute after:-inset-2 after:md:hidden",
622
- "peer-data-[size=sm]/menu-button:top-1",
623
- "peer-data-[size=default]/menu-button:top-1.5",
624
- "peer-data-[size=lg]/menu-button:top-2.5",
625
- "group-data-[collapsible=icon]:hidden",
621
+ "after:dy-absolute after:dy--inset-2 after:md:dy-hidden",
622
+ "dy-peer-data-[size=sm]/menu-button:dy-top-1",
623
+ "dy-peer-data-[size=default]/menu-button:dy-top-1.5",
624
+ "dy-peer-data-[size=lg]/menu-button:dy-top-2.5",
625
+ "dy-group-data-[collapsible=icon]:dy-hidden",
626
626
  showOnHover &&
627
- "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",
627
+ "dy-group-focus-within/menu-item:dy-opacity-100 dy-group-hover/menu-item:dy-opacity-100 data-[state=open]:dy-opacity-100 dy-peer-data-[active=true]/menu-button:dy-text-sidebar-accent-foreground md:dy-opacity-0",
628
628
  className
629
629
  )}
630
630
  {...props}
@@ -641,12 +641,12 @@ const SidebarMenuBadge = React.forwardRef<
641
641
  ref={ref}
642
642
  data-sidebar="menu-badge"
643
643
  className={cn(
644
- "pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground",
645
- "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
646
- "peer-data-[size=sm]/menu-button:top-1",
647
- "peer-data-[size=default]/menu-button:top-1.5",
648
- "peer-data-[size=lg]/menu-button:top-2.5",
649
- "group-data-[collapsible=icon]:hidden",
644
+ "dy-pointer-events-none dy-absolute dy-right-1 dy-flex dy-h-5 dy-min-w-5 dy-select-none dy-items-center dy-justify-center dy-rounded-md dy-px-1 dy-text-xs dy-font-medium dy-tabular-nums dy-text-sidebar-foreground",
645
+ "dy-peer-hover/menu-button:dy-text-sidebar-accent-foreground dy-peer-data-[active=true]/menu-button:dy-text-sidebar-accent-foreground",
646
+ "dy-peer-data-[size=sm]/menu-button:dy-top-1",
647
+ "dy-peer-data-[size=default]/menu-button:dy-top-1.5",
648
+ "dy-peer-data-[size=lg]/menu-button:dy-top-2.5",
649
+ "dy-group-data-[collapsible=icon]:dy-hidden",
650
650
  className
651
651
  )}
652
652
  {...props}
@@ -671,17 +671,17 @@ const SidebarMenuSkeleton = React.forwardRef<
671
671
  <div
672
672
  ref={ref}
673
673
  data-sidebar="menu-skeleton"
674
- className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
674
+ className={cn("dy-flex dy-h-8 dy-items-center dy-gap-2 dy-rounded-md dy-px-2", className)}
675
675
  {...props}
676
676
  >
677
677
  {showIcon && (
678
678
  <Skeleton
679
- className="size-4 rounded-md"
679
+ className="dy-size-4 dy-rounded-md"
680
680
  data-sidebar="menu-skeleton-icon"
681
681
  />
682
682
  )}
683
683
  <Skeleton
684
- className="h-4 flex-1"
684
+ className="dy-h-4 dy-flex-1"
685
685
  data-sidebar="menu-skeleton-text"
686
686
  style={{ width }}
687
687
  />
@@ -698,8 +698,8 @@ const SidebarMenuSub = React.forwardRef<
698
698
  ref={ref}
699
699
  data-sidebar="menu-sub"
700
700
  className={cn(
701
- "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
702
- "group-data-[collapsible=icon]:hidden",
701
+ "dy-mx-3.5 dy-flex dy-min-w-0 dy-translate-x-px dy-flex-col dy-gap-1 dy-border-l dy-border-sidebar-border dy-px-2.5 dy-py-0.5",
702
+ "dy-group-data-[collapsible=icon]:dy-hidden",
703
703
  className
704
704
  )}
705
705
  {...props}
@@ -730,11 +730,11 @@ const SidebarMenuSubButton = React.forwardRef<
730
730
  data-size={size}
731
731
  data-active={isActive}
732
732
  className={cn(
733
- "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground 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 [&>svg]:text-sidebar-accent-foreground",
734
- "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
735
- size === "sm" && "text-xs",
736
- size === "md" && "text-sm",
737
- "group-data-[collapsible=icon]:hidden",
733
+ "dy-flex dy-h-7 dy-min-w-0 dy--translate-x-px dy-items-center dy-gap-2 dy-overflow-hidden dy-rounded-md dy-px-2 dy-text-sidebar-foreground dy-outline-none dy-ring-sidebar-ring hover:dy-bg-sidebar-accent hover:dy-text-sidebar-accent-foreground focus-visible:dy-ring-2 active:dy-bg-sidebar-accent active:dy-text-sidebar-accent-foreground disabled:dy-pointer-events-none disabled:dy-opacity-50 aria-disabled:dy-pointer-events-none aria-disabled:dy-opacity-50 [&>span:last-child]:dy-truncate [&>svg]:dy-size-4 [&>svg]:dy-shrink-0 [&>svg]:dy-text-sidebar-accent-foreground",
734
+ "data-[active=true]:dy-bg-sidebar-accent data-[active=true]:dy-text-sidebar-accent-foreground",
735
+ size === "sm" && "dy-text-xs",
736
+ size === "md" && "dy-text-sm",
737
+ "dy-group-data-[collapsible=icon]:dy-hidden",
738
738
  className
739
739
  )}
740
740
  {...props}
@@ -6,7 +6,7 @@ function Skeleton({
6
6
  }: React.HTMLAttributes<HTMLDivElement>) {
7
7
  return (
8
8
  <div
9
- className={cn("animate-pulse rounded-md bg-muted", className)}
9
+ className={cn("dy-animate-pulse dy-rounded-md dy-bg-muted", className)}
10
10
  {...props}
11
11
  />
12
12
  )
@@ -5,7 +5,7 @@ type ToasterProps = React.ComponentProps<typeof Sonner>
5
5
  const Toaster = ({ ...props }: ToasterProps) => {
6
6
  return (
7
7
  <Sonner
8
- className="toaster group"
8
+ className="dy-toaster dy-group"
9
9
  toastOptions={{
10
10
  classNames: {
11
11
  toast:
@@ -9,7 +9,7 @@ const Switch = React.forwardRef<
9
9
  >(({ className, ...props }, ref) => (
10
10
  <SwitchPrimitives.Root
11
11
  className={cn(
12
- "peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
12
+ "dy-peer dy-inline-flex dy-h-6 dy-w-11 dy-shrink-0 dy-cursor-pointer dy-items-center dy-rounded-full dy-border-2 dy-border-transparent dy-transition-colors focus-visible:dy-outline-none focus-visible:dy-ring-2 focus-visible:dy-ring-ring focus-visible:dy-ring-offset-2 focus-visible:dy-ring-offset-background disabled:dy-cursor-not-allowed disabled:dy-opacity-50 data-[state=checked]:dy-bg-primary data-[state=unchecked]:dy-bg-input",
13
13
  className
14
14
  )}
15
15
  {...props}
@@ -17,7 +17,7 @@ const Switch = React.forwardRef<
17
17
  >
18
18
  <SwitchPrimitives.Thumb
19
19
  className={cn(
20
- "pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0"
20
+ "dy-pointer-events-none dy-block dy-h-5 dy-w-5 dy-rounded-full dy-bg-background dy-shadow-lg dy-ring-0 dy-transition-transform data-[state=checked]:dy-translate-x-5 data-[state=unchecked]:dy-translate-x-0"
21
21
  )}
22
22
  />
23
23
  </SwitchPrimitives.Root>
@@ -6,10 +6,10 @@ const Table = React.forwardRef<
6
6
  HTMLTableElement,
7
7
  React.HTMLAttributes<HTMLTableElement>
8
8
  >(({ className, ...props }, ref) => (
9
- <div className="relative w-full overflow-auto">
9
+ <div className="dy-relative dy-w-full dy-overflow-auto">
10
10
  <table
11
11
  ref={ref}
12
- className={cn("w-full caption-bottom text-sm", className)}
12
+ className={cn("dy-w-full dy-caption-bottom dy-text-sm", className)}
13
13
  {...props}
14
14
  />
15
15
  </div>
@@ -20,7 +20,7 @@ const TableHeader = React.forwardRef<
20
20
  HTMLTableSectionElement,
21
21
  React.HTMLAttributes<HTMLTableSectionElement>
22
22
  >(({ className, ...props }, ref) => (
23
- <thead ref={ref} className={cn("[&_tr]:border-b", className)} {...props} />
23
+ <thead ref={ref} className={cn("[&_tr]:dy-border-b", className)} {...props} />
24
24
  ))
25
25
  TableHeader.displayName = "TableHeader"
26
26
 
@@ -30,7 +30,7 @@ const TableBody = React.forwardRef<
30
30
  >(({ className, ...props }, ref) => (
31
31
  <tbody
32
32
  ref={ref}
33
- className={cn("[&_tr:last-child]:border-0", className)}
33
+ className={cn("[&_tr:last-child]:dy-border-0", className)}
34
34
  {...props}
35
35
  />
36
36
  ))
@@ -43,7 +43,7 @@ const TableFooter = React.forwardRef<
43
43
  <tfoot
44
44
  ref={ref}
45
45
  className={cn(
46
- "border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
46
+ "dy-border-t dy-bg-muted/50 dy-font-medium [&>tr]:last:dy-border-b-0",
47
47
  className
48
48
  )}
49
49
  {...props}
@@ -58,7 +58,7 @@ const TableRow = React.forwardRef<
58
58
  <tr
59
59
  ref={ref}
60
60
  className={cn(
61
- "border-b border-border/30 transition-colors hover:bg-muted/30 data-[state=selected]:bg-muted",
61
+ "dy-border-b dy-border-border/30 dy-transition-colors hover:dy-bg-muted/30 data-[state=selected]:dy-bg-muted",
62
62
  className
63
63
  )}
64
64
  {...props}
@@ -99,7 +99,7 @@ const TableCaption = React.forwardRef<
99
99
  >(({ className, ...props }, ref) => (
100
100
  <caption
101
101
  ref={ref}
102
- className={cn("mt-4 text-sm text-muted-foreground", className)}
102
+ className={cn("dy-mt-4 dy-text-sm dy-text-muted-foreground", className)}
103
103
  {...props}
104
104
  />
105
105
  ))
@@ -12,7 +12,7 @@ const TabsList = React.forwardRef<
12
12
  <TabsPrimitive.List
13
13
  ref={ref}
14
14
  className={cn(
15
- "inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",
15
+ "dy-inline-flex dy-h-10 dy-items-center dy-justify-center dy-rounded-md dy-bg-muted dy-p-1 dy-text-muted-foreground",
16
16
  className
17
17
  )}
18
18
  {...props}
@@ -27,7 +27,7 @@ const TabsTrigger = React.forwardRef<
27
27
  <TabsPrimitive.Trigger
28
28
  ref={ref}
29
29
  className={cn(
30
- "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
30
+ "dy-inline-flex dy-items-center dy-justify-center dy-whitespace-nowrap dy-rounded-sm dy-px-3 dy-py-1.5 dy-text-sm dy-font-medium dy-ring-offset-background dy-transition-all focus-visible:dy-outline-none focus-visible:dy-ring-2 focus-visible:dy-ring-ring focus-visible:dy-ring-offset-2 disabled:dy-pointer-events-none disabled:dy-opacity-50 data-[state=active]:dy-bg-background data-[state=active]:dy-text-foreground data-[state=active]:dy-shadow-sm",
31
31
  className
32
32
  )}
33
33
  {...props}
@@ -42,7 +42,7 @@ const TabsContent = React.forwardRef<
42
42
  <TabsPrimitive.Content
43
43
  ref={ref}
44
44
  className={cn(
45
- "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
45
+ "dy-mt-2 dy-ring-offset-background focus-visible:dy-outline-none focus-visible:dy-ring-2 focus-visible:dy-ring-ring focus-visible:dy-ring-offset-2",
46
46
  className
47
47
  )}
48
48
  {...props}
@@ -9,7 +9,7 @@ const Textarea = React.forwardRef<
9
9
  return (
10
10
  <textarea
11
11
  className={cn(
12
- "flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
12
+ "dy-flex dy-min-h-[80px] dy-w-full dy-rounded-md dy-border dy-border-input dy-bg-background dy-px-3 dy-py-2 dy-text-base dy-ring-offset-background placeholder:dy-text-muted-foreground focus-visible:dy-outline-none focus-visible:dy-ring-2 focus-visible:dy-ring-ring focus-visible:dy-ring-offset-2 disabled:dy-cursor-not-allowed disabled:dy-opacity-50 md:dy-text-sm",
13
13
  className
14
14
  )}
15
15
  ref={ref}
@@ -5,18 +5,18 @@ import { cva, type VariantProps } from "class-variance-authority"
5
5
  import { cn } from "../../lib/utils"
6
6
 
7
7
  const toggleVariants = cva(
8
- "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 gap-2",
8
+ "dy-inline-flex dy-items-center dy-justify-center dy-rounded-md dy-text-sm dy-font-medium dy-ring-offset-background dy-transition-colors hover:dy-bg-muted hover:dy-text-muted-foreground focus-visible:dy-outline-none focus-visible:dy-ring-2 focus-visible:dy-ring-ring focus-visible:dy-ring-offset-2 disabled:dy-pointer-events-none disabled:dy-opacity-50 data-[state=on]:dy-bg-accent data-[state=on]:dy-text-accent-foreground [&_svg]:dy-pointer-events-none [&_svg]:dy-size-4 [&_svg]:dy-shrink-0 dy-gap-2",
9
9
  {
10
10
  variants: {
11
11
  variant: {
12
- default: "bg-transparent",
12
+ default: "dy-bg-transparent",
13
13
  outline:
14
- "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground",
14
+ "dy-border dy-border-input dy-bg-transparent hover:dy-bg-accent hover:dy-text-accent-foreground",
15
15
  },
16
16
  size: {
17
- default: "h-10 px-3 min-w-10",
18
- sm: "h-9 px-2.5 min-w-9",
19
- lg: "h-11 px-5 min-w-11",
17
+ default: "dy-h-10 dy-px-3 dy-min-w-10",
18
+ sm: "dy-h-9 dy-px-2.5 dy-min-w-9",
19
+ lg: "dy-h-11 dy-px-5 dy-min-w-11",
20
20
  },
21
21
  },
22
22
  defaultVariants: {
@@ -17,7 +17,7 @@ const TooltipContent = React.forwardRef<
17
17
  ref={ref}
18
18
  sideOffset={sideOffset}
19
19
  className={cn(
20
- "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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 origin-[--radix-tooltip-content-transform-origin]",
20
+ "dy-z-50 dy-overflow-hidden dy-rounded-md dy-border dy-bg-popover dy-px-3 dy-py-1.5 dy-text-sm dy-text-popover-foreground dy-shadow-md dy-animate-in dy-fade-in-0 dy-zoom-in-95 data-[state=closed]:dy-animate-out data-[state=closed]:dy-fade-out-0 data-[state=closed]:dy-zoom-out-95 data-[side=bottom]:dy-slide-in-from-top-2 data-[side=left]:dy-slide-in-from-right-2 data-[side=right]:dy-slide-in-from-left-2 data-[side=top]:dy-slide-in-from-bottom-2 dy-origin-[--radix-tooltip-content-transform-origin]",
21
21
  className
22
22
  )}
23
23
  {...props}
package/src/index.css CHANGED
@@ -59,53 +59,53 @@
59
59
  --sidebar-ring: 38 92% 50%;
60
60
  }
61
61
 
62
- .admin-ui {
62
+ .dy-admin-ui {
63
63
  color-scheme: light;
64
- @apply font-sans;
64
+ @apply dy-font-sans;
65
65
  }
66
66
 
67
- .admin-ui h1,
68
- .admin-ui h2,
69
- .admin-ui h3,
70
- .admin-ui h4,
71
- .admin-ui h5,
72
- .admin-ui h6 {
73
- @apply font-serif;
67
+ .dy-admin-ui h1,
68
+ .dy-admin-ui h2,
69
+ .dy-admin-ui h3,
70
+ .dy-admin-ui h4,
71
+ .dy-admin-ui h5,
72
+ .dy-admin-ui h6 {
73
+ @apply dy-font-serif;
74
74
  }
75
75
  }
76
76
 
77
77
  @layer utilities {
78
- .admin-ui .left-accent {
79
- @apply border-l-2 border-primary/10 px-4 -mx-8 py-4 transition-all duration-200 bg-transparent;
78
+ .dy-admin-ui .left-accent {
79
+ @apply dy-border-l-2 dy-border-primary/10 dy-px-4 dy--mx-8 dy-py-4 dy-transition-all dy-duration-200 dy-bg-transparent;
80
80
  }
81
81
 
82
- .admin-ui .left-accent:hover {
83
- @apply border-l-primary bg-primary/[0.04];
82
+ .dy-admin-ui .left-accent:hover {
83
+ @apply dy-border-l-primary dy-bg-primary/[0.04];
84
84
  }
85
85
 
86
- .admin-ui .left-accent .left-accent {
87
- @apply px-4 -mx-4;
86
+ .dy-admin-ui .left-accent .left-accent {
87
+ @apply dy-px-4 dy--mx-4;
88
88
  }
89
89
 
90
- .admin-ui .left-accent .left-accent .left-accent{
91
- @apply px-4 mx-0;
90
+ .dy-admin-ui .left-accent .left-accent .left-accent{
91
+ @apply dy-px-4 dy-mx-0;
92
92
  }
93
93
 
94
- .admin-ui .flat-container {
95
- @apply bg-transparent border-none shadow-none p-0;
94
+ .dy-admin-ui .flat-container {
95
+ @apply dy-bg-transparent dy-border-none dy-shadow-none dy-p-0;
96
96
  }
97
97
  }
98
98
 
99
99
  @layer components {
100
- .admin-ui input,
101
- .admin-ui select,
102
- .admin-ui textarea {
103
- @apply focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:outline-none focus:outline-none border-border/60 bg-transparent transition-all;
100
+ .dy-admin-ui input,
101
+ .dy-admin-ui select,
102
+ .dy-admin-ui textarea {
103
+ @apply focus-visible:dy-ring-0 focus-visible:dy-ring-offset-0 focus-visible:dy-outline-none focus:dy-outline-none dy-border-border/60 dy-bg-transparent dy-transition-all;
104
104
  }
105
105
 
106
- .admin-ui input:focus,
107
- .admin-ui select:focus,
108
- .admin-ui textarea:focus {
109
- @apply border-primary/50;
106
+ .dy-admin-ui input:focus,
107
+ .dy-admin-ui select:focus,
108
+ .dy-admin-ui textarea:focus {
109
+ @apply dy-border-primary/50;
110
110
  }
111
111
  }
package/src/index.tsx CHANGED
@@ -133,14 +133,14 @@ export function AdminUI({
133
133
 
134
134
  if (!mounted) {
135
135
  return (
136
- <div className="flex-1 flex items-center justify-center p-12 bg-muted/5 animate-pulse">
137
- <div className="text-muted-foreground/40 text-sm font-medium">Loading Dashboard...</div>
136
+ <div className="dy-flex-1 dy-flex dy-items-center dy-justify-center dy-p-12 dy-bg-muted/5 dy-animate-pulse">
137
+ <div className="dy-text-muted-foreground/40 dy-text-sm dy-font-medium">Loading Dashboard...</div>
138
138
  </div>
139
139
  );
140
140
  }
141
141
 
142
142
  return (
143
- <div className="admin-ui h-full">
143
+ <div className="dy-admin-ui dy-h-full">
144
144
  <ErrorBoundary>
145
145
  <DyrectedProvider apiKey={apiKey} baseUrl={baseUrl} siteId={siteId}>
146
146
  <QueryProvider>
@@ -179,7 +179,7 @@ export interface AdminStandaloneProps {
179
179
 
180
180
  export function AdminStandalone({ apiKey, baseUrl, siteId }: AdminStandaloneProps) {
181
181
  return (
182
- <div className="admin-ui h-full">
182
+ <div className="dy-admin-ui dy-h-full">
183
183
  <DyrectedProvider apiKey={apiKey} baseUrl={baseUrl} siteId={siteId}>
184
184
  <QueryProvider>
185
185
  <MemoryRouter>
package/src/lib/utils.ts CHANGED
@@ -1,8 +1,12 @@
1
- import { type ClassValue, clsx } from "clsx"
2
- import { twMerge } from "tailwind-merge"
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { extendTailwindMerge } from "tailwind-merge"
3
+
4
+ const customTwMerge = extendTailwindMerge({
5
+ prefix: "dy-",
6
+ })
3
7
 
4
8
  export function cn(...inputs: ClassValue[]) {
5
- return twMerge(clsx(inputs))
9
+ return customTwMerge(clsx(inputs))
6
10
  }
7
11
 
8
12
  export function getMediaUrl(val: string | any, baseUrl: string) {