@dyrected/admin 2.4.0 → 2.4.2

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 (170) hide show
  1. package/dist/App.d.ts +1 -0
  2. package/dist/admin.css +2 -0
  3. package/dist/components/auth/auth-gate.d.ts +13 -0
  4. package/dist/components/error-boundary.d.ts +16 -0
  5. package/dist/components/forms/field-renderer.d.ts +22 -0
  6. package/dist/components/forms/fields/block-builder.d.ts +9 -0
  7. package/dist/components/forms/fields/date-picker.d.ts +8 -0
  8. package/dist/components/forms/fields/json-editor.d.ts +8 -0
  9. package/dist/components/forms/fields/media-picker.d.ts +12 -0
  10. package/dist/components/forms/fields/multi-select.d.ts +19 -0
  11. package/dist/components/forms/fields/radio-field.d.ts +8 -0
  12. package/dist/components/forms/fields/relationship-picker.d.ts +10 -0
  13. package/dist/components/forms/fields/rich-text-editor.d.ts +9 -0
  14. package/dist/components/forms/fields/select-field.d.ts +8 -0
  15. package/dist/components/forms/fields/switch-field.d.ts +6 -0
  16. package/dist/components/forms/fields/text-area-field.d.ts +8 -0
  17. package/dist/components/forms/fields/text-field.d.ts +8 -0
  18. package/dist/components/forms/form-engine.d.ts +14 -0
  19. package/dist/components/forms/form-field-renderer.d.ts +20 -0
  20. package/dist/components/forms/utils.d.ts +11 -0
  21. package/dist/components/layout/admin-shell.d.ts +5 -0
  22. package/dist/components/layout/branding-provider.d.ts +4 -0
  23. package/dist/components/live-preview/LivePreviewPane.d.ts +7 -0
  24. package/dist/components/media/focal-point-picker.d.ts +12 -0
  25. package/dist/components/media/media-card.d.ts +8 -0
  26. package/dist/components/media/media-grid.d.ts +8 -0
  27. package/dist/components/media/media-library-dialog.d.ts +11 -0
  28. package/dist/components/ui/aspect-ratio.d.ts +3 -0
  29. package/dist/components/ui/badge.d.ts +9 -0
  30. package/dist/components/ui/button.d.ts +11 -0
  31. package/dist/components/ui/calendar.d.ts +8 -0
  32. package/dist/components/ui/card.d.ts +8 -0
  33. package/dist/components/ui/checkbox.d.ts +4 -0
  34. package/dist/components/ui/command.d.ts +80 -0
  35. package/dist/components/ui/data-table.d.ts +14 -0
  36. package/dist/components/ui/dialog.d.ts +19 -0
  37. package/dist/components/ui/dropdown-menu.d.ts +27 -0
  38. package/dist/components/ui/form.d.ts +23 -0
  39. package/dist/components/ui/input.d.ts +3 -0
  40. package/dist/components/ui/label.d.ts +5 -0
  41. package/dist/components/ui/page-header.d.ts +10 -0
  42. package/dist/components/ui/pagination.d.ts +11 -0
  43. package/dist/components/ui/popover.d.ts +6 -0
  44. package/dist/components/ui/progress.d.ts +4 -0
  45. package/dist/components/ui/radio-group.d.ts +5 -0
  46. package/dist/components/ui/render-cell.d.ts +8 -0
  47. package/dist/components/ui/scroll-area.d.ts +5 -0
  48. package/dist/components/ui/select.d.ts +13 -0
  49. package/dist/components/ui/separator.d.ts +4 -0
  50. package/dist/components/ui/sheet.d.ts +25 -0
  51. package/dist/components/ui/sidebar.d.ts +65 -0
  52. package/dist/components/ui/skeleton.d.ts +2 -0
  53. package/dist/components/ui/sonner.d.ts +4 -0
  54. package/dist/components/ui/switch.d.ts +4 -0
  55. package/dist/components/ui/table.d.ts +10 -0
  56. package/dist/components/ui/tabs.d.ts +7 -0
  57. package/dist/components/ui/textarea.d.ts +3 -0
  58. package/dist/components/ui/toggle.d.ts +12 -0
  59. package/dist/components/ui/tooltip.d.ts +7 -0
  60. package/dist/hooks/use-mobile.d.ts +1 -0
  61. package/dist/hooks/use-preferences.d.ts +6 -0
  62. package/dist/index.d.ts +38 -0
  63. package/dist/index.mjs +69091 -0
  64. package/dist/lib/utils.d.ts +3 -0
  65. package/dist/main.d.ts +0 -0
  66. package/dist/pages/auth/first-user-page.d.ts +4 -0
  67. package/dist/pages/auth/login-page.d.ts +4 -0
  68. package/dist/pages/collections/edit-page.d.ts +1 -0
  69. package/dist/pages/collections/list-page.d.ts +5 -0
  70. package/dist/pages/dashboard/dashboard.d.ts +1 -0
  71. package/dist/pages/globals/editor-page.d.ts +1 -0
  72. package/dist/pages/media/media-page.d.ts +4 -0
  73. package/dist/pages/setup/setup-prompt.d.ts +6 -0
  74. package/dist/providers/dyrected-provider.d.ts +29 -0
  75. package/dist/providers/query-provider.d.ts +3 -0
  76. package/package.json +6 -3
  77. package/CHANGELOG.md +0 -153
  78. package/components.json +0 -17
  79. package/eslint.config.js +0 -22
  80. package/index.html +0 -13
  81. package/postcss.config.js +0 -6
  82. package/scripts/prefix-tailwind-precision.py +0 -98
  83. package/scripts/prefix-tailwind.py +0 -67
  84. package/src/App.css +0 -184
  85. package/src/App.tsx +0 -25
  86. package/src/assets/dyrected.svg +0 -155
  87. package/src/assets/hero.png +0 -0
  88. package/src/assets/react.svg +0 -1
  89. package/src/assets/vite.svg +0 -1
  90. package/src/components/auth/auth-gate.tsx +0 -64
  91. package/src/components/error-boundary.tsx +0 -45
  92. package/src/components/forms/field-renderer.tsx +0 -111
  93. package/src/components/forms/fields/block-builder.tsx +0 -213
  94. package/src/components/forms/fields/date-picker.tsx +0 -60
  95. package/src/components/forms/fields/json-editor.tsx +0 -62
  96. package/src/components/forms/fields/media-picker.tsx +0 -286
  97. package/src/components/forms/fields/multi-select.tsx +0 -145
  98. package/src/components/forms/fields/radio-field.tsx +0 -51
  99. package/src/components/forms/fields/relationship-picker.tsx +0 -143
  100. package/src/components/forms/fields/rich-text-editor.tsx +0 -224
  101. package/src/components/forms/fields/select-field.tsx +0 -35
  102. package/src/components/forms/fields/switch-field.tsx +0 -16
  103. package/src/components/forms/fields/text-area-field.tsx +0 -15
  104. package/src/components/forms/fields/text-field.tsx +0 -24
  105. package/src/components/forms/form-engine.tsx +0 -87
  106. package/src/components/forms/form-field-renderer.tsx +0 -269
  107. package/src/components/forms/utils.ts +0 -97
  108. package/src/components/layout/admin-shell.tsx +0 -479
  109. package/src/components/layout/branding-provider.tsx +0 -112
  110. package/src/components/live-preview/LivePreviewPane.tsx +0 -128
  111. package/src/components/media/focal-point-picker.tsx +0 -66
  112. package/src/components/media/media-card.tsx +0 -44
  113. package/src/components/media/media-grid.tsx +0 -32
  114. package/src/components/media/media-library-dialog.tsx +0 -465
  115. package/src/components/ui/aspect-ratio.tsx +0 -7
  116. package/src/components/ui/badge.tsx +0 -36
  117. package/src/components/ui/button.tsx +0 -56
  118. package/src/components/ui/calendar.tsx +0 -214
  119. package/src/components/ui/card.tsx +0 -79
  120. package/src/components/ui/checkbox.tsx +0 -28
  121. package/src/components/ui/command.tsx +0 -151
  122. package/src/components/ui/data-table.tsx +0 -219
  123. package/src/components/ui/dialog.tsx +0 -122
  124. package/src/components/ui/dropdown-menu.tsx +0 -200
  125. package/src/components/ui/form.tsx +0 -178
  126. package/src/components/ui/input.tsx +0 -24
  127. package/src/components/ui/label.tsx +0 -24
  128. package/src/components/ui/page-header.tsx +0 -30
  129. package/src/components/ui/pagination.tsx +0 -57
  130. package/src/components/ui/popover.tsx +0 -29
  131. package/src/components/ui/progress.tsx +0 -26
  132. package/src/components/ui/radio-group.tsx +0 -42
  133. package/src/components/ui/render-cell.tsx +0 -110
  134. package/src/components/ui/scroll-area.tsx +0 -46
  135. package/src/components/ui/select.tsx +0 -160
  136. package/src/components/ui/separator.tsx +0 -29
  137. package/src/components/ui/sheet.tsx +0 -140
  138. package/src/components/ui/sidebar.tsx +0 -771
  139. package/src/components/ui/skeleton.tsx +0 -15
  140. package/src/components/ui/sonner.tsx +0 -27
  141. package/src/components/ui/switch.tsx +0 -27
  142. package/src/components/ui/table.tsx +0 -117
  143. package/src/components/ui/tabs.tsx +0 -53
  144. package/src/components/ui/textarea.tsx +0 -22
  145. package/src/components/ui/toggle.tsx +0 -43
  146. package/src/components/ui/tooltip.tsx +0 -28
  147. package/src/hooks/use-mobile.tsx +0 -19
  148. package/src/hooks/use-preferences.ts +0 -56
  149. package/src/index.css +0 -111
  150. package/src/index.tsx +0 -198
  151. package/src/lib/utils.ts +0 -36
  152. package/src/main.tsx +0 -10
  153. package/src/pages/auth/first-user-page.tsx +0 -115
  154. package/src/pages/auth/login-page.tsx +0 -91
  155. package/src/pages/collections/edit-page.tsx +0 -280
  156. package/src/pages/collections/list-page.tsx +0 -343
  157. package/src/pages/dashboard/dashboard.tsx +0 -150
  158. package/src/pages/globals/editor-page.tsx +0 -122
  159. package/src/pages/media/media-page.tsx +0 -564
  160. package/src/pages/setup/setup-prompt.tsx +0 -181
  161. package/src/providers/dyrected-provider.tsx +0 -122
  162. package/src/providers/query-provider.tsx +0 -19
  163. package/src/types/jexl.d.ts +0 -11
  164. package/tailwind.config.ts +0 -103
  165. package/tsconfig.app.json +0 -28
  166. package/tsconfig.json +0 -12
  167. package/tsconfig.node.json +0 -25
  168. package/vite.config.ts +0 -39
  169. /package/{public → dist}/favicon.svg +0 -0
  170. /package/{public → dist}/icons.svg +0 -0
@@ -1,771 +0,0 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import { Slot } from "@radix-ui/react-slot"
5
- import { cva, type VariantProps } from "class-variance-authority"
6
- import { PanelLeft } from "lucide-react"
7
-
8
- import { useIsMobile } from "../../hooks/use-mobile"
9
- import { cn } from "../../lib/utils"
10
- import { Button } from "../../components/ui/button"
11
- import { Input } from "../../components/ui/input"
12
- import { Separator } from "../../components/ui/separator"
13
- import {
14
- Sheet,
15
- SheetContent,
16
- SheetDescription,
17
- SheetHeader,
18
- SheetTitle,
19
- } from "../../components/ui/sheet"
20
- import { Skeleton } from "../../components/ui/skeleton"
21
- import {
22
- Tooltip,
23
- TooltipContent,
24
- TooltipProvider,
25
- TooltipTrigger,
26
- } from "../../components/ui/tooltip"
27
-
28
- const SIDEBAR_COOKIE_NAME = "sidebar_state"
29
- const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
30
- const SIDEBAR_WIDTH = "16rem"
31
- const SIDEBAR_WIDTH_MOBILE = "18rem"
32
- const SIDEBAR_WIDTH_ICON = "3rem"
33
- const SIDEBAR_KEYBOARD_SHORTCUT = "b"
34
-
35
- type SidebarContextProps = {
36
- state: "expanded" | "collapsed"
37
- open: boolean
38
- setOpen: (open: boolean) => void
39
- openMobile: boolean
40
- setOpenMobile: (open: boolean) => void
41
- isMobile: boolean
42
- toggleSidebar: () => void
43
- }
44
-
45
- const SidebarContext = React.createContext<SidebarContextProps | null>(null)
46
-
47
- function useSidebar() {
48
- const context = React.useContext(SidebarContext)
49
- if (!context) {
50
- throw new Error("useSidebar must be used within a SidebarProvider.")
51
- }
52
-
53
- return context
54
- }
55
-
56
- const SidebarProvider = React.forwardRef<
57
- HTMLDivElement,
58
- React.ComponentProps<"div"> & {
59
- defaultOpen?: boolean
60
- open?: boolean
61
- onOpenChange?: (open: boolean) => void
62
- }
63
- >(
64
- (
65
- {
66
- defaultOpen = true,
67
- open: openProp,
68
- onOpenChange: setOpenProp,
69
- className,
70
- style,
71
- children,
72
- ...props
73
- },
74
- ref
75
- ) => {
76
- const isMobile = useIsMobile()
77
- const [openMobile, setOpenMobile] = React.useState(false)
78
-
79
- // This is the internal state of the sidebar.
80
- // We use openProp and setOpenProp for control from outside the component.
81
- const [_open, _setOpen] = React.useState(defaultOpen)
82
- const open = openProp ?? _open
83
- const setOpen = React.useCallback(
84
- (value: boolean | ((value: boolean) => boolean)) => {
85
- const openState = typeof value === "function" ? value(open) : value
86
- if (setOpenProp) {
87
- setOpenProp(openState)
88
- } else {
89
- _setOpen(openState)
90
- }
91
-
92
- // This sets the cookie to keep the sidebar state.
93
- document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
94
- },
95
- [setOpenProp, open]
96
- )
97
-
98
- // Helper to toggle the sidebar.
99
- const toggleSidebar = React.useCallback(() => {
100
- return isMobile
101
- ? setOpenMobile((open) => !open)
102
- : setOpen((open) => !open)
103
- }, [isMobile, setOpen, setOpenMobile])
104
-
105
- // Adds a keyboard shortcut to toggle the sidebar.
106
- React.useEffect(() => {
107
- const handleKeyDown = (event: KeyboardEvent) => {
108
- if (
109
- event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
110
- (event.metaKey || event.ctrlKey)
111
- ) {
112
- event.preventDefault()
113
- toggleSidebar()
114
- }
115
- }
116
-
117
- window.addEventListener("keydown", handleKeyDown)
118
- return () => window.removeEventListener("keydown", handleKeyDown)
119
- }, [toggleSidebar])
120
-
121
- // We add a state so that we can do data-state="expanded" or "collapsed".
122
- // This makes it easier to style the sidebar with Tailwind classes.
123
- const state = open ? "expanded" : "collapsed"
124
-
125
- const contextValue = React.useMemo<SidebarContextProps>(
126
- () => ({
127
- state,
128
- open,
129
- setOpen,
130
- isMobile,
131
- openMobile,
132
- setOpenMobile,
133
- toggleSidebar,
134
- }),
135
- [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
136
- )
137
-
138
- return (
139
- <SidebarContext.Provider value={contextValue}>
140
- <TooltipProvider delayDuration={0}>
141
- <div
142
- style={
143
- {
144
- "--sidebar-width": SIDEBAR_WIDTH,
145
- "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
146
- ...style,
147
- } as React.CSSProperties
148
- }
149
- className={cn(
150
- "dy-group/sidebar-wrapper dy-flex dy-min-h-svh dy-w-full has-[[data-variant=inset]]:dy-bg-sidebar",
151
- className
152
- )}
153
- ref={ref}
154
- {...props}
155
- >
156
- {children}
157
- </div>
158
- </TooltipProvider>
159
- </SidebarContext.Provider>
160
- )
161
- }
162
- )
163
- SidebarProvider.displayName = "SidebarProvider"
164
-
165
- const Sidebar = React.forwardRef<
166
- HTMLDivElement,
167
- React.ComponentProps<"div"> & {
168
- side?: "left" | "right"
169
- variant?: "sidebar" | "floating" | "inset"
170
- collapsible?: "offcanvas" | "icon" | "none"
171
- }
172
- >(
173
- (
174
- {
175
- side = "left",
176
- variant = "sidebar",
177
- collapsible = "offcanvas",
178
- className,
179
- children,
180
- ...props
181
- },
182
- ref
183
- ) => {
184
- const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
185
-
186
- if (collapsible === "none") {
187
- return (
188
- <div
189
- className={cn(
190
- "dy-flex dy-h-full dy-w-[--sidebar-width] dy-flex-col dy-bg-sidebar dy-text-sidebar-foreground",
191
- className
192
- )}
193
- ref={ref}
194
- {...props}
195
- >
196
- {children}
197
- </div>
198
- )
199
- }
200
-
201
- if (isMobile) {
202
- return (
203
- <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
204
- <SheetContent
205
- data-sidebar="sidebar"
206
- data-mobile="true"
207
- className="dy-w-[--sidebar-width] dy-bg-sidebar dy-p-0 dy-text-sidebar-foreground [&>button]:dy-hidden"
208
- style={
209
- {
210
- "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
211
- } as React.CSSProperties
212
- }
213
- side={side}
214
- >
215
- <SheetHeader className="dy-sr-only">
216
- <SheetTitle>Sidebar</SheetTitle>
217
- <SheetDescription>Displays the mobile sidebar.</SheetDescription>
218
- </SheetHeader>
219
- <div className="dy-flex dy-h-full dy-w-full dy-flex-col">{children}</div>
220
- </SheetContent>
221
- </Sheet>
222
- )
223
- }
224
-
225
- return (
226
- <div
227
- ref={ref}
228
- className="dy-group dy-peer dy-hidden dy-text-sidebar-foreground md:dy-block"
229
- data-state={state}
230
- data-collapsible={state === "collapsed" ? collapsible : ""}
231
- data-variant={variant}
232
- data-side={side}
233
- >
234
- {/* This is what handles the sidebar gap on desktop */}
235
- <div
236
- className={cn(
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
- variant === "floating" || variant === "inset"
241
- ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
242
- : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]"
243
- )}
244
- />
245
- <div
246
- className={cn(
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
- side === "left"
249
- ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
250
- : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
251
- // Adjust the padding for floating and inset variants.
252
- variant === "floating" || variant === "inset"
253
- ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
254
- : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
255
- className
256
- )}
257
- {...props}
258
- >
259
- <div
260
- data-sidebar="sidebar"
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
- >
263
- {children}
264
- </div>
265
- </div>
266
- </div>
267
- )
268
- }
269
- )
270
- Sidebar.displayName = "Sidebar"
271
-
272
- const SidebarTrigger = React.forwardRef<
273
- React.ElementRef<typeof Button>,
274
- React.ComponentProps<typeof Button>
275
- >(({ className, onClick, ...props }, ref) => {
276
- const { toggleSidebar } = useSidebar()
277
-
278
- return (
279
- <Button
280
- ref={ref}
281
- data-sidebar="trigger"
282
- variant="ghost"
283
- size="icon"
284
- className={cn("dy-h-7 dy-w-7", className)}
285
- onClick={(event) => {
286
- onClick?.(event)
287
- toggleSidebar()
288
- }}
289
- {...props}
290
- >
291
- <PanelLeft />
292
- <span className="dy-sr-only">Toggle Sidebar</span>
293
- </Button>
294
- )
295
- })
296
- SidebarTrigger.displayName = "SidebarTrigger"
297
-
298
- const SidebarRail = React.forwardRef<
299
- HTMLButtonElement,
300
- React.ComponentProps<"button">
301
- >(({ className, ...props }, ref) => {
302
- const { toggleSidebar } = useSidebar()
303
-
304
- return (
305
- <button
306
- ref={ref}
307
- data-sidebar="rail"
308
- aria-label="Toggle Sidebar"
309
- tabIndex={-1}
310
- onClick={toggleSidebar}
311
- title="Toggle Sidebar"
312
- className={cn(
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
- className
320
- )}
321
- {...props}
322
- />
323
- )
324
- })
325
- SidebarRail.displayName = "SidebarRail"
326
-
327
- const SidebarInset = React.forwardRef<
328
- HTMLDivElement,
329
- React.ComponentProps<"main">
330
- >(({ className, ...props }, ref) => {
331
- return (
332
- <main
333
- ref={ref}
334
- className={cn(
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
- className
338
- )}
339
- {...props}
340
- />
341
- )
342
- })
343
- SidebarInset.displayName = "SidebarInset"
344
-
345
- const SidebarInput = React.forwardRef<
346
- React.ElementRef<typeof Input>,
347
- React.ComponentProps<typeof Input>
348
- >(({ className, ...props }, ref) => {
349
- return (
350
- <Input
351
- ref={ref}
352
- data-sidebar="input"
353
- className={cn(
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
- className
356
- )}
357
- {...props}
358
- />
359
- )
360
- })
361
- SidebarInput.displayName = "SidebarInput"
362
-
363
- const SidebarHeader = React.forwardRef<
364
- HTMLDivElement,
365
- React.ComponentProps<"div">
366
- >(({ className, ...props }, ref) => {
367
- return (
368
- <div
369
- ref={ref}
370
- data-sidebar="header"
371
- className={cn("dy-flex dy-flex-col dy-gap-2 dy-p-2", className)}
372
- {...props}
373
- />
374
- )
375
- })
376
- SidebarHeader.displayName = "SidebarHeader"
377
-
378
- const SidebarFooter = React.forwardRef<
379
- HTMLDivElement,
380
- React.ComponentProps<"div">
381
- >(({ className, ...props }, ref) => {
382
- return (
383
- <div
384
- ref={ref}
385
- data-sidebar="footer"
386
- className={cn("dy-flex dy-flex-col dy-gap-2 dy-p-2", className)}
387
- {...props}
388
- />
389
- )
390
- })
391
- SidebarFooter.displayName = "SidebarFooter"
392
-
393
- const SidebarSeparator = React.forwardRef<
394
- React.ElementRef<typeof Separator>,
395
- React.ComponentProps<typeof Separator>
396
- >(({ className, ...props }, ref) => {
397
- return (
398
- <Separator
399
- ref={ref}
400
- data-sidebar="separator"
401
- className={cn("dy-mx-2 dy-w-auto dy-bg-sidebar-border", className)}
402
- {...props}
403
- />
404
- )
405
- })
406
- SidebarSeparator.displayName = "SidebarSeparator"
407
-
408
- const SidebarContent = React.forwardRef<
409
- HTMLDivElement,
410
- React.ComponentProps<"div">
411
- >(({ className, ...props }, ref) => {
412
- return (
413
- <div
414
- ref={ref}
415
- data-sidebar="content"
416
- className={cn(
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
- className
419
- )}
420
- {...props}
421
- />
422
- )
423
- })
424
- SidebarContent.displayName = "SidebarContent"
425
-
426
- const SidebarGroup = React.forwardRef<
427
- HTMLDivElement,
428
- React.ComponentProps<"div">
429
- >(({ className, ...props }, ref) => {
430
- return (
431
- <div
432
- ref={ref}
433
- data-sidebar="group"
434
- className={cn("dy-relative dy-flex dy-w-full dy-min-w-0 dy-flex-col dy-p-2", className)}
435
- {...props}
436
- />
437
- )
438
- })
439
- SidebarGroup.displayName = "SidebarGroup"
440
-
441
- const SidebarGroupLabel = React.forwardRef<
442
- HTMLDivElement,
443
- React.ComponentProps<"div"> & { asChild?: boolean }
444
- >(({ className, asChild = false, ...props }, ref) => {
445
- const Comp = asChild ? Slot : "div"
446
-
447
- return (
448
- <Comp
449
- ref={ref}
450
- data-sidebar="group-label"
451
- className={cn(
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
- className
455
- )}
456
- {...props}
457
- />
458
- )
459
- })
460
- SidebarGroupLabel.displayName = "SidebarGroupLabel"
461
-
462
- const SidebarGroupAction = React.forwardRef<
463
- HTMLButtonElement,
464
- React.ComponentProps<"button"> & { asChild?: boolean }
465
- >(({ className, asChild = false, ...props }, ref) => {
466
- const Comp = asChild ? Slot : "button"
467
-
468
- return (
469
- <Comp
470
- ref={ref}
471
- data-sidebar="group-action"
472
- className={cn(
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
- // Increases the hit area of the button on mobile.
475
- "after:dy-absolute after:dy--inset-2 after:md:dy-hidden",
476
- "dy-group-data-[collapsible=icon]:dy-hidden",
477
- className
478
- )}
479
- {...props}
480
- />
481
- )
482
- })
483
- SidebarGroupAction.displayName = "SidebarGroupAction"
484
-
485
- const SidebarGroupContent = React.forwardRef<
486
- HTMLDivElement,
487
- React.ComponentProps<"div">
488
- >(({ className, ...props }, ref) => (
489
- <div
490
- ref={ref}
491
- data-sidebar="group-content"
492
- className={cn("dy-w-full dy-text-sm", className)}
493
- {...props}
494
- />
495
- ))
496
- SidebarGroupContent.displayName = "SidebarGroupContent"
497
-
498
- const SidebarMenu = React.forwardRef<
499
- HTMLUListElement,
500
- React.ComponentProps<"ul">
501
- >(({ className, ...props }, ref) => (
502
- <ul
503
- ref={ref}
504
- data-sidebar="menu"
505
- className={cn("dy-flex dy-w-full dy-min-w-0 dy-flex-col dy-gap-1", className)}
506
- {...props}
507
- />
508
- ))
509
- SidebarMenu.displayName = "SidebarMenu"
510
-
511
- const SidebarMenuItem = React.forwardRef<
512
- HTMLLIElement,
513
- React.ComponentProps<"li">
514
- >(({ className, ...props }, ref) => (
515
- <li
516
- ref={ref}
517
- data-sidebar="menu-item"
518
- className={cn("dy-group/menu-item dy-relative", className)}
519
- {...props}
520
- />
521
- ))
522
- SidebarMenuItem.displayName = "SidebarMenuItem"
523
-
524
- const sidebarMenuButtonVariants = cva(
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
- {
527
- variants: {
528
- variant: {
529
- default: "hover:dy-bg-sidebar-accent hover:dy-text-sidebar-accent-foreground",
530
- outline:
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
- },
533
- size: {
534
- default: "h-8 text-sm",
535
- sm: "h-7 text-xs",
536
- lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
537
- },
538
- },
539
- defaultVariants: {
540
- variant: "default",
541
- size: "default",
542
- },
543
- }
544
- )
545
-
546
- const SidebarMenuButton = React.forwardRef<
547
- HTMLButtonElement,
548
- React.ComponentProps<"button"> & {
549
- asChild?: boolean
550
- isActive?: boolean
551
- tooltip?: string | React.ComponentProps<typeof TooltipContent>
552
- } & VariantProps<typeof sidebarMenuButtonVariants>
553
- >(
554
- (
555
- {
556
- asChild = false,
557
- isActive = false,
558
- variant = "default",
559
- size = "default",
560
- tooltip,
561
- className,
562
- ...props
563
- },
564
- ref
565
- ) => {
566
- const Comp = asChild ? Slot : "button"
567
- const { isMobile, state } = useSidebar()
568
-
569
- const button = (
570
- <Comp
571
- ref={ref}
572
- data-sidebar="menu-button"
573
- data-size={size}
574
- data-active={isActive}
575
- className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
576
- {...props}
577
- />
578
- )
579
-
580
- if (!tooltip) {
581
- return button
582
- }
583
-
584
- if (typeof tooltip === "string") {
585
- tooltip = {
586
- children: tooltip,
587
- }
588
- }
589
-
590
- return (
591
- <Tooltip>
592
- <TooltipTrigger asChild>{button}</TooltipTrigger>
593
- <TooltipContent
594
- side="right"
595
- align="center"
596
- hidden={state !== "collapsed" || isMobile}
597
- {...tooltip}
598
- />
599
- </Tooltip>
600
- )
601
- }
602
- )
603
- SidebarMenuButton.displayName = "SidebarMenuButton"
604
-
605
- const SidebarMenuAction = React.forwardRef<
606
- HTMLButtonElement,
607
- React.ComponentProps<"button"> & {
608
- asChild?: boolean
609
- showOnHover?: boolean
610
- }
611
- >(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
612
- const Comp = asChild ? Slot : "button"
613
-
614
- return (
615
- <Comp
616
- ref={ref}
617
- data-sidebar="menu-action"
618
- className={cn(
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
- // Increases the hit area of the button on mobile.
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
- showOnHover &&
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
- className
629
- )}
630
- {...props}
631
- />
632
- )
633
- })
634
- SidebarMenuAction.displayName = "SidebarMenuAction"
635
-
636
- const SidebarMenuBadge = React.forwardRef<
637
- HTMLDivElement,
638
- React.ComponentProps<"div">
639
- >(({ className, ...props }, ref) => (
640
- <div
641
- ref={ref}
642
- data-sidebar="menu-badge"
643
- className={cn(
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
- className
651
- )}
652
- {...props}
653
- />
654
- ))
655
- SidebarMenuBadge.displayName = "SidebarMenuBadge"
656
-
657
- const SidebarMenuSkeleton = React.forwardRef<
658
- HTMLDivElement,
659
- React.ComponentProps<"div"> & {
660
- showIcon?: boolean
661
- }
662
- >(({ className, showIcon = false, ...props }, ref) => {
663
- const [width, setWidth] = React.useState("0%")
664
-
665
- React.useEffect(() => {
666
- // Random width between 50 to 90% set after mount to avoid hydration mismatch
667
- setWidth(`${Math.floor(Math.random() * 40) + 50}%`)
668
- }, [])
669
-
670
- return (
671
- <div
672
- ref={ref}
673
- data-sidebar="menu-skeleton"
674
- className={cn("dy-flex dy-h-8 dy-items-center dy-gap-2 dy-rounded-md dy-px-2", className)}
675
- {...props}
676
- >
677
- {showIcon && (
678
- <Skeleton
679
- className="dy-size-4 dy-rounded-md"
680
- data-sidebar="menu-skeleton-icon"
681
- />
682
- )}
683
- <Skeleton
684
- className="dy-h-4 dy-flex-1"
685
- data-sidebar="menu-skeleton-text"
686
- style={{ width }}
687
- />
688
- </div>
689
- )
690
- })
691
- SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton"
692
-
693
- const SidebarMenuSub = React.forwardRef<
694
- HTMLUListElement,
695
- React.ComponentProps<"ul">
696
- >(({ className, ...props }, ref) => (
697
- <ul
698
- ref={ref}
699
- data-sidebar="menu-sub"
700
- className={cn(
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
- className
704
- )}
705
- {...props}
706
- />
707
- ))
708
- SidebarMenuSub.displayName = "SidebarMenuSub"
709
-
710
- const SidebarMenuSubItem = React.forwardRef<
711
- HTMLLIElement,
712
- React.ComponentProps<"li">
713
- >(({ ...props }, ref) => <li ref={ref} {...props} />)
714
- SidebarMenuSubItem.displayName = "SidebarMenuSubItem"
715
-
716
- const SidebarMenuSubButton = React.forwardRef<
717
- HTMLAnchorElement,
718
- React.ComponentProps<"a"> & {
719
- asChild?: boolean
720
- size?: "sm" | "md"
721
- isActive?: boolean
722
- }
723
- >(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
724
- const Comp = asChild ? Slot : "a"
725
-
726
- return (
727
- <Comp
728
- ref={ref}
729
- data-sidebar="menu-sub-button"
730
- data-size={size}
731
- data-active={isActive}
732
- className={cn(
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
- className
739
- )}
740
- {...props}
741
- />
742
- )
743
- })
744
- SidebarMenuSubButton.displayName = "SidebarMenuSubButton"
745
-
746
- export {
747
- Sidebar,
748
- SidebarContent,
749
- SidebarFooter,
750
- SidebarGroup,
751
- SidebarGroupAction,
752
- SidebarGroupContent,
753
- SidebarGroupLabel,
754
- SidebarHeader,
755
- SidebarInput,
756
- SidebarInset,
757
- SidebarMenu,
758
- SidebarMenuAction,
759
- SidebarMenuBadge,
760
- SidebarMenuButton,
761
- SidebarMenuItem,
762
- SidebarMenuSkeleton,
763
- SidebarMenuSub,
764
- SidebarMenuSubButton,
765
- SidebarMenuSubItem,
766
- SidebarProvider,
767
- SidebarRail,
768
- SidebarSeparator,
769
- SidebarTrigger,
770
- useSidebar,
771
- }