@object-ui/components 3.3.0 → 3.3.1

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 (321) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +21 -1
  3. package/dist/index.css +6339 -2
  4. package/dist/index.js +17600 -17481
  5. package/dist/index.umd.cjs +36 -36
  6. package/dist/packages/components/src/custom/empty.d.ts +12 -1
  7. package/dist/packages/components/src/renderers/action/action-bar.d.ts +12 -1
  8. package/dist/packages/components/src/ui/chart.d.ts +10 -29
  9. package/package.json +65 -44
  10. package/.turbo/turbo-build.log +0 -84
  11. package/README_SHADCN_SYNC.md +0 -281
  12. package/TESTING.md +0 -335
  13. package/docs/FilterBuilder.md +0 -268
  14. package/metadata/Chart.component.yml +0 -30
  15. package/metadata/FilterBuilder.component.yml +0 -39
  16. package/metadata/GridLayout.component.yml +0 -27
  17. package/metadata/Menu.component.yml +0 -31
  18. package/metadata/ObjectForm.component.yml +0 -34
  19. package/metadata/ObjectGrid.component.yml +0 -72
  20. package/metadata/Page.component.yml +0 -24
  21. package/postcss.config.js +0 -14
  22. package/shadcn-components.json +0 -440
  23. package/src/SchemaRenderer.tsx +0 -28
  24. package/src/__tests__/PageRendererRegions.test.tsx +0 -668
  25. package/src/__tests__/README.md +0 -124
  26. package/src/__tests__/__snapshots__/snapshot-critical.test.tsx.snap +0 -811
  27. package/src/__tests__/__snapshots__/snapshot.test.tsx.snap +0 -327
  28. package/src/__tests__/accessibility.test.tsx +0 -137
  29. package/src/__tests__/action-bar.test.tsx +0 -206
  30. package/src/__tests__/api-consistency.test.tsx +0 -596
  31. package/src/__tests__/basic-renderers.test.tsx +0 -255
  32. package/src/__tests__/color-contrast.test.tsx +0 -212
  33. package/src/__tests__/complex-disclosure-renderers.test.tsx +0 -302
  34. package/src/__tests__/compliance.test.tsx +0 -72
  35. package/src/__tests__/config-field-renderer.test.tsx +0 -307
  36. package/src/__tests__/config-panel-renderer.test.tsx +0 -580
  37. package/src/__tests__/config-primitives.test.tsx +0 -106
  38. package/src/__tests__/edge-cases.test.tsx +0 -285
  39. package/src/__tests__/feedback-overlay-renderers.test.tsx +0 -349
  40. package/src/__tests__/filter-builder.test.tsx +0 -409
  41. package/src/__tests__/form-renderers.test.tsx +0 -364
  42. package/src/__tests__/layout-data-renderers.test.tsx +0 -340
  43. package/src/__tests__/mobile-accessibility.test.tsx +0 -120
  44. package/src/__tests__/navigation-overlay.test.tsx +0 -370
  45. package/src/__tests__/snapshot-critical.test.tsx +0 -317
  46. package/src/__tests__/snapshot.test.tsx +0 -205
  47. package/src/__tests__/test-utils.tsx +0 -190
  48. package/src/__tests__/use-config-draft.test.tsx +0 -295
  49. package/src/__tests__/view-compliance.test.tsx +0 -153
  50. package/src/__tests__/wcag-audit.test.tsx +0 -493
  51. package/src/custom/action-param-dialog.tsx +0 -264
  52. package/src/custom/button-group.tsx +0 -91
  53. package/src/custom/combobox.tsx +0 -104
  54. package/src/custom/config-field-renderer.tsx +0 -276
  55. package/src/custom/config-panel-renderer.tsx +0 -306
  56. package/src/custom/config-row.tsx +0 -50
  57. package/src/custom/date-picker.tsx +0 -61
  58. package/src/custom/empty.tsx +0 -112
  59. package/src/custom/field.tsx +0 -81
  60. package/src/custom/filter-builder.tsx +0 -418
  61. package/src/custom/index.ts +0 -21
  62. package/src/custom/input-group.tsx +0 -53
  63. package/src/custom/item.tsx +0 -201
  64. package/src/custom/kbd.tsx +0 -36
  65. package/src/custom/mobile-dialog-content.tsx +0 -67
  66. package/src/custom/native-select.tsx +0 -33
  67. package/src/custom/navigation-overlay.tsx +0 -334
  68. package/src/custom/section-header.tsx +0 -68
  69. package/src/custom/sort-builder.tsx +0 -129
  70. package/src/custom/spinner.tsx +0 -26
  71. package/src/custom/view-skeleton.tsx +0 -243
  72. package/src/custom/view-states.tsx +0 -153
  73. package/src/debug/DebugPanel.tsx +0 -313
  74. package/src/debug/__tests__/DebugPanel.test.tsx +0 -134
  75. package/src/debug/index.ts +0 -10
  76. package/src/hooks/use-config-draft.ts +0 -127
  77. package/src/hooks/use-mobile.tsx +0 -27
  78. package/src/index.css +0 -245
  79. package/src/index.ts +0 -47
  80. package/src/lib/use-sync-external-store-shim.ts +0 -10
  81. package/src/lib/use-sync-external-store-with-selector-shim.ts +0 -90
  82. package/src/lib/utils.tsx +0 -35
  83. package/src/new-components.test.ts +0 -73
  84. package/src/renderers/action/action-bar.tsx +0 -221
  85. package/src/renderers/action/action-button.tsx +0 -158
  86. package/src/renderers/action/action-group.tsx +0 -270
  87. package/src/renderers/action/action-icon.tsx +0 -150
  88. package/src/renderers/action/action-menu.tsx +0 -203
  89. package/src/renderers/action/index.ts +0 -19
  90. package/src/renderers/action/resolve-icon.ts +0 -35
  91. package/src/renderers/basic/button-group.tsx +0 -79
  92. package/src/renderers/basic/div.tsx +0 -60
  93. package/src/renderers/basic/html.tsx +0 -43
  94. package/src/renderers/basic/icon.tsx +0 -89
  95. package/src/renderers/basic/image.tsx +0 -49
  96. package/src/renderers/basic/index.ts +0 -18
  97. package/src/renderers/basic/navigation-menu.tsx +0 -81
  98. package/src/renderers/basic/pagination.tsx +0 -109
  99. package/src/renderers/basic/separator.tsx +0 -57
  100. package/src/renderers/basic/span.tsx +0 -63
  101. package/src/renderers/basic/text.tsx +0 -52
  102. package/src/renderers/complex/README-KANBAN.md +0 -208
  103. package/src/renderers/complex/TIMELINE.md +0 -353
  104. package/src/renderers/complex/__tests__/data-table-airtable-ux.test.tsx +0 -239
  105. package/src/renderers/complex/__tests__/data-table-batch-editing.test.tsx +0 -275
  106. package/src/renderers/complex/__tests__/data-table-cell-renderer.test.tsx +0 -120
  107. package/src/renderers/complex/__tests__/data-table-editing.test.tsx +0 -221
  108. package/src/renderers/complex/__tests__/data-table.test.ts +0 -76
  109. package/src/renderers/complex/carousel.tsx +0 -69
  110. package/src/renderers/complex/data-table.tsx +0 -1243
  111. package/src/renderers/complex/filter-builder.tsx +0 -77
  112. package/src/renderers/complex/index.ts +0 -16
  113. package/src/renderers/complex/resizable.tsx +0 -66
  114. package/src/renderers/complex/scroll-area.tsx +0 -58
  115. package/src/renderers/complex/table.tsx +0 -95
  116. package/src/renderers/data-display/alert.tsx +0 -46
  117. package/src/renderers/data-display/avatar.tsx +0 -38
  118. package/src/renderers/data-display/badge.tsx +0 -55
  119. package/src/renderers/data-display/breadcrumb.tsx +0 -61
  120. package/src/renderers/data-display/index.ts +0 -18
  121. package/src/renderers/data-display/kbd.tsx +0 -50
  122. package/src/renderers/data-display/list.tsx +0 -75
  123. package/src/renderers/data-display/statistic.tsx +0 -95
  124. package/src/renderers/data-display/table.tsx +0 -78
  125. package/src/renderers/data-display/tree-view.tsx +0 -176
  126. package/src/renderers/disclosure/accordion.tsx +0 -69
  127. package/src/renderers/disclosure/collapsible.tsx +0 -53
  128. package/src/renderers/disclosure/index.ts +0 -11
  129. package/src/renderers/disclosure/toggle-group.tsx +0 -79
  130. package/src/renderers/feedback/empty.tsx +0 -49
  131. package/src/renderers/feedback/index.ts +0 -16
  132. package/src/renderers/feedback/loading.tsx +0 -78
  133. package/src/renderers/feedback/progress.tsx +0 -29
  134. package/src/renderers/feedback/skeleton.tsx +0 -31
  135. package/src/renderers/feedback/sonner.tsx +0 -56
  136. package/src/renderers/feedback/spinner.tsx +0 -55
  137. package/src/renderers/feedback/toast.tsx +0 -59
  138. package/src/renderers/feedback/toaster.tsx +0 -23
  139. package/src/renderers/form/button.tsx +0 -103
  140. package/src/renderers/form/calendar.tsx +0 -34
  141. package/src/renderers/form/checkbox.tsx +0 -71
  142. package/src/renderers/form/combobox.tsx +0 -48
  143. package/src/renderers/form/command.tsx +0 -58
  144. package/src/renderers/form/date-picker.tsx +0 -84
  145. package/src/renderers/form/file-upload.tsx +0 -184
  146. package/src/renderers/form/form.tsx +0 -540
  147. package/src/renderers/form/index.ts +0 -26
  148. package/src/renderers/form/input-otp.tsx +0 -51
  149. package/src/renderers/form/input.tsx +0 -121
  150. package/src/renderers/form/label.tsx +0 -45
  151. package/src/renderers/form/radio-group.tsx +0 -63
  152. package/src/renderers/form/select.tsx +0 -94
  153. package/src/renderers/form/slider.tsx +0 -61
  154. package/src/renderers/form/switch.tsx +0 -48
  155. package/src/renderers/form/textarea.tsx +0 -76
  156. package/src/renderers/form/toggle.tsx +0 -42
  157. package/src/renderers/index.ts +0 -18
  158. package/src/renderers/layout/aspect-ratio.tsx +0 -51
  159. package/src/renderers/layout/card.tsx +0 -85
  160. package/src/renderers/layout/container.tsx +0 -122
  161. package/src/renderers/layout/flex.tsx +0 -132
  162. package/src/renderers/layout/grid.tsx +0 -178
  163. package/src/renderers/layout/index.ts +0 -19
  164. package/src/renderers/layout/page.tsx +0 -466
  165. package/src/renderers/layout/semantic.tsx +0 -48
  166. package/src/renderers/layout/stack.tsx +0 -132
  167. package/src/renderers/layout/tabs.tsx +0 -97
  168. package/src/renderers/navigation/header-bar.tsx +0 -118
  169. package/src/renderers/navigation/index.ts +0 -10
  170. package/src/renderers/navigation/sidebar.tsx +0 -208
  171. package/src/renderers/overlay/alert-dialog.tsx +0 -72
  172. package/src/renderers/overlay/context-menu.tsx +0 -100
  173. package/src/renderers/overlay/dialog.tsx +0 -77
  174. package/src/renderers/overlay/drawer.tsx +0 -77
  175. package/src/renderers/overlay/dropdown-menu.tsx +0 -99
  176. package/src/renderers/overlay/hover-card.tsx +0 -55
  177. package/src/renderers/overlay/index.ts +0 -18
  178. package/src/renderers/overlay/menubar.tsx +0 -76
  179. package/src/renderers/overlay/popover.tsx +0 -56
  180. package/src/renderers/overlay/sheet.tsx +0 -77
  181. package/src/renderers/overlay/tooltip.tsx +0 -67
  182. package/src/renderers/placeholders.tsx +0 -107
  183. package/src/stories/CRMApp.stories.tsx +0 -706
  184. package/src/stories/ConfigPanel.stories.tsx +0 -232
  185. package/src/stories/Guide.mdx +0 -55
  186. package/src/stories/MockedData.stories.tsx +0 -121
  187. package/src/stories/assets/accessibility.png +0 -0
  188. package/src/stories/assets/accessibility.svg +0 -1
  189. package/src/stories/assets/addon-library.png +0 -0
  190. package/src/stories/assets/assets.png +0 -0
  191. package/src/stories/assets/avif-test-image.avif +0 -0
  192. package/src/stories/assets/context.png +0 -0
  193. package/src/stories/assets/discord.svg +0 -1
  194. package/src/stories/assets/docs.png +0 -0
  195. package/src/stories/assets/figma-plugin.png +0 -0
  196. package/src/stories/assets/github.svg +0 -1
  197. package/src/stories/assets/share.png +0 -0
  198. package/src/stories/assets/styling.png +0 -0
  199. package/src/stories/assets/testing.png +0 -0
  200. package/src/stories/assets/theming.png +0 -0
  201. package/src/stories/assets/tutorials.svg +0 -1
  202. package/src/stories/assets/youtube.svg +0 -1
  203. package/src/stories/button.css +0 -30
  204. package/src/stories/header.css +0 -32
  205. package/src/stories/page.css +0 -68
  206. package/src/stories-json/Accessibility.mdx +0 -297
  207. package/src/stories-json/EdgeCases.stories.tsx +0 -160
  208. package/src/stories-json/GettingStarted.mdx +0 -89
  209. package/src/stories-json/Introduction.mdx +0 -127
  210. package/src/stories-json/accordion.stories.tsx +0 -43
  211. package/src/stories-json/aggrid.stories.tsx +0 -103
  212. package/src/stories-json/alert.stories.tsx +0 -39
  213. package/src/stories-json/aspect-ratio.stories.tsx +0 -34
  214. package/src/stories-json/avatar.stories.tsx +0 -38
  215. package/src/stories-json/badge.stories.tsx +0 -53
  216. package/src/stories-json/breadcrumb.stories.tsx +0 -30
  217. package/src/stories-json/button-group.stories.tsx +0 -43
  218. package/src/stories-json/button.stories.tsx +0 -73
  219. package/src/stories-json/calendar.stories.tsx +0 -85
  220. package/src/stories-json/card.stories.tsx +0 -48
  221. package/src/stories-json/carousel.stories.tsx +0 -33
  222. package/src/stories-json/charts.stories.tsx +0 -195
  223. package/src/stories-json/chatbot.stories.tsx +0 -349
  224. package/src/stories-json/code-editor.stories.tsx +0 -92
  225. package/src/stories-json/collapsible.stories.tsx +0 -40
  226. package/src/stories-json/controls.stories.tsx +0 -36
  227. package/src/stories-json/crm-live-data.stories.tsx +0 -154
  228. package/src/stories-json/dashboard.stories.tsx +0 -318
  229. package/src/stories-json/data-table.stories.tsx +0 -136
  230. package/src/stories-json/data_display_extras.stories.tsx +0 -102
  231. package/src/stories-json/date-picker.stories.tsx +0 -28
  232. package/src/stories-json/detail-view.stories.tsx +0 -258
  233. package/src/stories-json/dialog.stories.tsx +0 -43
  234. package/src/stories-json/feedback_extras.stories.tsx +0 -40
  235. package/src/stories-json/feedback_others.stories.tsx +0 -46
  236. package/src/stories-json/form-variants.stories.tsx +0 -210
  237. package/src/stories-json/form_advanced.stories.tsx +0 -117
  238. package/src/stories-json/form_extras.stories.tsx +0 -123
  239. package/src/stories-json/grid.stories.tsx +0 -56
  240. package/src/stories-json/icon.stories.tsx +0 -36
  241. package/src/stories-json/input.stories.tsx +0 -52
  242. package/src/stories-json/kanban.stories.tsx +0 -295
  243. package/src/stories-json/layout_extended.stories.tsx +0 -76
  244. package/src/stories-json/layout_flex.stories.tsx +0 -107
  245. package/src/stories-json/list-view.stories.tsx +0 -97
  246. package/src/stories-json/markdown.stories.tsx +0 -129
  247. package/src/stories-json/menus.stories.tsx +0 -63
  248. package/src/stories-json/metric-card.stories.tsx +0 -143
  249. package/src/stories-json/navigation-menu.stories.tsx +0 -37
  250. package/src/stories-json/object-aggrid-advanced.stories.tsx +0 -389
  251. package/src/stories-json/object-aggrid.stories.tsx +0 -252
  252. package/src/stories-json/object-form.stories.tsx +0 -130
  253. package/src/stories-json/object-gantt.stories.tsx +0 -114
  254. package/src/stories-json/object-grid.stories.tsx +0 -315
  255. package/src/stories-json/object-map.stories.tsx +0 -116
  256. package/src/stories-json/object-view.stories.tsx +0 -118
  257. package/src/stories-json/overlay_extras.stories.tsx +0 -113
  258. package/src/stories-json/overlay_others.stories.tsx +0 -76
  259. package/src/stories-json/page.stories.tsx +0 -55
  260. package/src/stories-json/reports.stories.tsx +0 -163
  261. package/src/stories-json/resizable.stories.tsx +0 -44
  262. package/src/stories-json/select.stories.tsx +0 -34
  263. package/src/stories-json/separator.stories.tsx +0 -41
  264. package/src/stories-json/sidebar.stories.tsx +0 -147
  265. package/src/stories-json/statistic.stories.tsx +0 -44
  266. package/src/stories-json/tabs.stories.tsx +0 -51
  267. package/src/stories-json/timeline.stories.tsx +0 -188
  268. package/src/stories-json/typography.stories.tsx +0 -45
  269. package/src/types/config-panel.ts +0 -101
  270. package/src/ui/accordion.tsx +0 -66
  271. package/src/ui/alert-dialog.tsx +0 -149
  272. package/src/ui/alert.tsx +0 -67
  273. package/src/ui/aspect-ratio.tsx +0 -15
  274. package/src/ui/avatar.tsx +0 -58
  275. package/src/ui/badge.tsx +0 -44
  276. package/src/ui/breadcrumb.tsx +0 -123
  277. package/src/ui/button.tsx +0 -64
  278. package/src/ui/calendar.tsx +0 -221
  279. package/src/ui/card.tsx +0 -87
  280. package/src/ui/carousel.tsx +0 -270
  281. package/src/ui/chart.tsx +0 -377
  282. package/src/ui/checkbox.tsx +0 -38
  283. package/src/ui/collapsible.tsx +0 -19
  284. package/src/ui/command.tsx +0 -161
  285. package/src/ui/context-menu.tsx +0 -208
  286. package/src/ui/dialog.tsx +0 -130
  287. package/src/ui/drawer.tsx +0 -126
  288. package/src/ui/dropdown-menu.tsx +0 -208
  289. package/src/ui/form.tsx +0 -186
  290. package/src/ui/hover-card.tsx +0 -37
  291. package/src/ui/index.ts +0 -56
  292. package/src/ui/input-otp.tsx +0 -79
  293. package/src/ui/input.tsx +0 -30
  294. package/src/ui/label.tsx +0 -34
  295. package/src/ui/menubar.tsx +0 -264
  296. package/src/ui/navigation-menu.tsx +0 -136
  297. package/src/ui/pagination.tsx +0 -125
  298. package/src/ui/popover.tsx +0 -39
  299. package/src/ui/progress.tsx +0 -36
  300. package/src/ui/radio-group.tsx +0 -52
  301. package/src/ui/resizable.tsx +0 -53
  302. package/src/ui/scroll-area.tsx +0 -56
  303. package/src/ui/select.tsx +0 -168
  304. package/src/ui/separator.tsx +0 -39
  305. package/src/ui/sheet.tsx +0 -150
  306. package/src/ui/sidebar.tsx +0 -781
  307. package/src/ui/skeleton.tsx +0 -23
  308. package/src/ui/slider.tsx +0 -39
  309. package/src/ui/sonner.tsx +0 -53
  310. package/src/ui/switch.tsx +0 -37
  311. package/src/ui/table.tsx +0 -125
  312. package/src/ui/tabs.tsx +0 -63
  313. package/src/ui/textarea.tsx +0 -30
  314. package/src/ui/toast.tsx +0 -137
  315. package/src/ui/toggle-group.tsx +0 -69
  316. package/src/ui/toggle.tsx +0 -53
  317. package/src/ui/tooltip.tsx +0 -38
  318. package/src/ui/typography.tsx +0 -85
  319. package/tsconfig.json +0 -19
  320. package/vite.config.ts +0 -71
  321. package/vitest.config.ts +0 -5
@@ -1,781 +0,0 @@
1
- /**
2
- * ObjectUI
3
- * Copyright (c) 2024-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
-
9
- "use client"
10
-
11
- import * as React from "react"
12
- import { Slot } from "@radix-ui/react-slot"
13
- import { cva, type VariantProps } from "class-variance-authority"
14
- import { PanelLeft } from "lucide-react"
15
-
16
- import { useIsMobile } from "../hooks/use-mobile"
17
- import { cn } from "../lib/utils"
18
- import { Button } from "./button"
19
- import { Input } from "./input"
20
- import { Separator } from "./separator"
21
- import {
22
- Sheet,
23
- SheetContent,
24
- SheetDescription,
25
- SheetHeader,
26
- SheetTitle,
27
- } from "./sheet"
28
- import { Skeleton } from "./skeleton"
29
- import {
30
- Tooltip,
31
- TooltipContent,
32
- TooltipProvider,
33
- TooltipTrigger,
34
- } from "./tooltip"
35
-
36
- const SIDEBAR_COOKIE_NAME = "sidebar_state"
37
- const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
38
- const SIDEBAR_WIDTH = "16rem"
39
- const SIDEBAR_WIDTH_MOBILE = "18rem"
40
- const SIDEBAR_WIDTH_ICON = "3rem"
41
- const SIDEBAR_KEYBOARD_SHORTCUT = "b"
42
-
43
- type SidebarContextProps = {
44
- state: "expanded" | "collapsed"
45
- open: boolean
46
- setOpen: (open: boolean) => void
47
- openMobile: boolean
48
- setOpenMobile: (open: boolean) => void
49
- isMobile: boolean
50
- toggleSidebar: () => void
51
- }
52
-
53
- const SidebarContext = React.createContext<SidebarContextProps | null>(null)
54
-
55
- function useSidebar() {
56
- const context = React.useContext(SidebarContext)
57
- if (!context) {
58
- throw new Error("useSidebar must be used within a SidebarProvider.")
59
- }
60
-
61
- return context
62
- }
63
-
64
- const SidebarProvider = React.forwardRef<
65
- HTMLDivElement,
66
- React.ComponentProps<"div"> & {
67
- defaultOpen?: boolean
68
- open?: boolean
69
- onOpenChange?: (open: boolean) => void
70
- }
71
- >(
72
- (
73
- {
74
- defaultOpen = true,
75
- open: openProp,
76
- onOpenChange: setOpenProp,
77
- className,
78
- style,
79
- children,
80
- ...props
81
- },
82
- ref
83
- ) => {
84
- const isMobile = useIsMobile()
85
- const [openMobile, setOpenMobile] = React.useState(false)
86
-
87
- // This is the internal state of the sidebar.
88
- // We use openProp and setOpenProp for control from outside the component.
89
- const [_open, _setOpen] = React.useState(defaultOpen)
90
- const open = openProp ?? _open
91
- const setOpen = React.useCallback(
92
- (value: boolean | ((value: boolean) => boolean)) => {
93
- const openState = typeof value === "function" ? value(open) : value
94
- if (setOpenProp) {
95
- setOpenProp(openState)
96
- } else {
97
- _setOpen(openState)
98
- }
99
-
100
- // This sets the cookie to keep the sidebar state.
101
- document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
102
- },
103
- [setOpenProp, open]
104
- )
105
-
106
- // Helper to toggle the sidebar.
107
- const toggleSidebar = React.useCallback(() => {
108
- return isMobile
109
- ? setOpenMobile((open) => !open)
110
- : setOpen((open) => !open)
111
- }, [isMobile, setOpen, setOpenMobile])
112
-
113
- // Adds a keyboard shortcut to toggle the sidebar.
114
- React.useEffect(() => {
115
- const handleKeyDown = (event: KeyboardEvent) => {
116
- if (
117
- event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
118
- (event.metaKey || event.ctrlKey)
119
- ) {
120
- event.preventDefault()
121
- toggleSidebar()
122
- }
123
- }
124
-
125
- window.addEventListener("keydown", handleKeyDown)
126
- return () => window.removeEventListener("keydown", handleKeyDown)
127
- }, [toggleSidebar])
128
-
129
- // We add a state so that we can do data-state="expanded" or "collapsed".
130
- // This makes it easier to style the sidebar with Tailwind classes.
131
- const state = open ? "expanded" : "collapsed"
132
-
133
- const contextValue = React.useMemo<SidebarContextProps>(
134
- () => ({
135
- state,
136
- open,
137
- setOpen,
138
- isMobile,
139
- openMobile,
140
- setOpenMobile,
141
- toggleSidebar,
142
- }),
143
- [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
144
- )
145
-
146
- return (
147
- <SidebarContext.Provider value={contextValue}>
148
- <TooltipProvider delayDuration={0}>
149
- <div
150
- style={
151
- {
152
- "--sidebar-width": SIDEBAR_WIDTH,
153
- "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
154
- ...style,
155
- } as React.CSSProperties
156
- }
157
- className={cn(
158
- "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
159
- className
160
- )}
161
- ref={ref}
162
- {...props}
163
- >
164
- {children}
165
- </div>
166
- </TooltipProvider>
167
- </SidebarContext.Provider>
168
- )
169
- }
170
- )
171
- SidebarProvider.displayName = "SidebarProvider"
172
-
173
- const Sidebar = React.forwardRef<
174
- HTMLDivElement,
175
- React.ComponentProps<"div"> & {
176
- side?: "left" | "right"
177
- variant?: "sidebar" | "floating" | "inset"
178
- collapsible?: "offcanvas" | "icon" | "none"
179
- }
180
- >(
181
- (
182
- {
183
- side = "left",
184
- variant = "sidebar",
185
- collapsible = "offcanvas",
186
- className,
187
- children,
188
- ...props
189
- },
190
- ref
191
- ) => {
192
- const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
193
-
194
- if (collapsible === "none") {
195
- return (
196
- <div
197
- className={cn(
198
- "flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground",
199
- className
200
- )}
201
- ref={ref}
202
- {...props}
203
- >
204
- {children}
205
- </div>
206
- )
207
- }
208
-
209
- if (isMobile) {
210
- return (
211
- <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
212
- <SheetContent
213
- data-sidebar="sidebar"
214
- data-mobile="true"
215
- className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
216
- style={
217
- {
218
- "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
219
- } as React.CSSProperties
220
- }
221
- side={side}
222
- >
223
- <SheetHeader className="sr-only">
224
- <SheetTitle>Sidebar</SheetTitle>
225
- <SheetDescription>Displays the mobile sidebar.</SheetDescription>
226
- </SheetHeader>
227
- <div className="flex h-full w-full flex-col">{children}</div>
228
- </SheetContent>
229
- </Sheet>
230
- )
231
- }
232
-
233
- return (
234
- <div
235
- ref={ref}
236
- className="group peer hidden text-sidebar-foreground md:block"
237
- data-state={state}
238
- data-collapsible={collapsible}
239
- data-variant={variant}
240
- data-side={side}
241
- >
242
- {/* This is what handles the sidebar gap on desktop */}
243
- <div
244
- className={cn(
245
- "relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
246
- "group-data-[collapsible=offcanvas]:w-0",
247
- "group-data-[side=right]:rotate-180",
248
- variant === "floating" || variant === "inset"
249
- ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
250
- : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]"
251
- )}
252
- />
253
- <div
254
- className={cn(
255
- "fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex",
256
- side === "left"
257
- ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
258
- : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
259
- // Adjust the padding for floating and inset variants.
260
- variant === "floating" || variant === "inset"
261
- ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
262
- : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
263
- className
264
- )}
265
- {...props}
266
- >
267
- <div
268
- data-sidebar="sidebar"
269
- 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"
270
- >
271
- {children}
272
- </div>
273
- </div>
274
- </div>
275
- )
276
- }
277
- )
278
- Sidebar.displayName = "Sidebar"
279
-
280
- const SidebarTrigger = React.forwardRef<
281
- React.ElementRef<typeof Button>,
282
- React.ComponentProps<typeof Button>
283
- >(({ className, onClick, ...props }, ref) => {
284
- const { toggleSidebar } = useSidebar()
285
-
286
- return (
287
- <Button
288
- ref={ref}
289
- data-sidebar="trigger"
290
- variant="ghost"
291
- size="icon"
292
- className={cn("h-7 w-7", className)}
293
- onClick={(event) => {
294
- onClick?.(event)
295
- toggleSidebar()
296
- }}
297
- {...props}
298
- >
299
- <PanelLeft />
300
- <span className="sr-only">Toggle Sidebar</span>
301
- </Button>
302
- )
303
- })
304
- SidebarTrigger.displayName = "SidebarTrigger"
305
-
306
- const SidebarRail = React.forwardRef<
307
- HTMLButtonElement,
308
- React.ComponentProps<"button">
309
- >(({ className, ...props }, ref) => {
310
- const { toggleSidebar } = useSidebar()
311
-
312
- return (
313
- <button
314
- ref={ref}
315
- data-sidebar="rail"
316
- aria-label="Toggle Sidebar"
317
- tabIndex={-1}
318
- onClick={toggleSidebar}
319
- title="Toggle Sidebar"
320
- className={cn(
321
- "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",
322
- "[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
323
- "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
324
- "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
325
- "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
326
- "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
327
- className
328
- )}
329
- {...props}
330
- />
331
- )
332
- })
333
- SidebarRail.displayName = "SidebarRail"
334
-
335
- const SidebarInset = React.forwardRef<
336
- HTMLDivElement,
337
- React.ComponentProps<"main">
338
- >(({ className, ...props }, ref) => {
339
- return (
340
- <main
341
- ref={ref}
342
- className={cn(
343
- "relative flex w-full flex-1 flex-col bg-background",
344
- "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",
345
- className
346
- )}
347
- {...props}
348
- />
349
- )
350
- })
351
- SidebarInset.displayName = "SidebarInset"
352
-
353
- const SidebarInput = React.forwardRef<
354
- React.ElementRef<typeof Input>,
355
- React.ComponentProps<typeof Input>
356
- >(({ className, ...props }, ref) => {
357
- return (
358
- <Input
359
- ref={ref}
360
- data-sidebar="input"
361
- className={cn(
362
- "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
363
- className
364
- )}
365
- {...props}
366
- />
367
- )
368
- })
369
- SidebarInput.displayName = "SidebarInput"
370
-
371
- const SidebarHeader = React.forwardRef<
372
- HTMLDivElement,
373
- React.ComponentProps<"div">
374
- >(({ className, ...props }, ref) => {
375
- return (
376
- <div
377
- ref={ref}
378
- data-sidebar="header"
379
- className={cn("flex flex-col gap-2 p-2", className)}
380
- {...props}
381
- />
382
- )
383
- })
384
- SidebarHeader.displayName = "SidebarHeader"
385
-
386
- const SidebarFooter = React.forwardRef<
387
- HTMLDivElement,
388
- React.ComponentProps<"div">
389
- >(({ className, ...props }, ref) => {
390
- return (
391
- <div
392
- ref={ref}
393
- data-sidebar="footer"
394
- className={cn("flex flex-col gap-2 p-2", className)}
395
- {...props}
396
- />
397
- )
398
- })
399
- SidebarFooter.displayName = "SidebarFooter"
400
-
401
- const SidebarSeparator = React.forwardRef<
402
- React.ElementRef<typeof Separator>,
403
- React.ComponentProps<typeof Separator>
404
- >(({ className, ...props }, ref) => {
405
- return (
406
- <Separator
407
- ref={ref}
408
- data-sidebar="separator"
409
- className={cn("mx-2 w-auto bg-sidebar-border", className)}
410
- {...props}
411
- />
412
- )
413
- })
414
- SidebarSeparator.displayName = "SidebarSeparator"
415
-
416
- const SidebarContent = React.forwardRef<
417
- HTMLDivElement,
418
- React.ComponentProps<"div">
419
- >(({ className, ...props }, ref) => {
420
- return (
421
- <div
422
- ref={ref}
423
- data-sidebar="content"
424
- className={cn(
425
- "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
426
- className
427
- )}
428
- {...props}
429
- />
430
- )
431
- })
432
- SidebarContent.displayName = "SidebarContent"
433
-
434
- const SidebarGroup = React.forwardRef<
435
- HTMLDivElement,
436
- React.ComponentProps<"div">
437
- >(({ className, ...props }, ref) => {
438
- return (
439
- <div
440
- ref={ref}
441
- data-sidebar="group"
442
- className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
443
- {...props}
444
- />
445
- )
446
- })
447
- SidebarGroup.displayName = "SidebarGroup"
448
-
449
- const SidebarGroupLabel = React.forwardRef<
450
- HTMLDivElement,
451
- React.ComponentProps<"div"> & { asChild?: boolean }
452
- >(({ className, asChild = false, ...props }, ref) => {
453
- const Comp = asChild ? Slot : "div"
454
-
455
- return (
456
- <Comp
457
- ref={ref}
458
- data-sidebar="group-label"
459
- className={cn(
460
- "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",
461
- "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
462
- className
463
- )}
464
- {...props}
465
- />
466
- )
467
- })
468
- SidebarGroupLabel.displayName = "SidebarGroupLabel"
469
-
470
- const SidebarGroupAction = React.forwardRef<
471
- HTMLButtonElement,
472
- React.ComponentProps<"button"> & { asChild?: boolean }
473
- >(({ className, asChild = false, ...props }, ref) => {
474
- const Comp = asChild ? Slot : "button"
475
-
476
- return (
477
- <Comp
478
- ref={ref}
479
- data-sidebar="group-action"
480
- className={cn(
481
- "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",
482
- // Increases the hit area of the button on mobile.
483
- "after:absolute after:-inset-2 after:md:hidden",
484
- "group-data-[collapsible=icon]:hidden",
485
- className
486
- )}
487
- {...props}
488
- />
489
- )
490
- })
491
- SidebarGroupAction.displayName = "SidebarGroupAction"
492
-
493
- const SidebarGroupContent = React.forwardRef<
494
- HTMLDivElement,
495
- React.ComponentProps<"div">
496
- >(({ className, ...props }, ref) => (
497
- <div
498
- ref={ref}
499
- data-sidebar="group-content"
500
- className={cn("w-full text-sm", className)}
501
- {...props}
502
- />
503
- ))
504
- SidebarGroupContent.displayName = "SidebarGroupContent"
505
-
506
- const SidebarMenu = React.forwardRef<
507
- HTMLUListElement,
508
- React.ComponentProps<"ul">
509
- >(({ className, ...props }, ref) => (
510
- <ul
511
- ref={ref}
512
- data-sidebar="menu"
513
- className={cn("flex w-full min-w-0 flex-col gap-1", className)}
514
- {...props}
515
- />
516
- ))
517
- SidebarMenu.displayName = "SidebarMenu"
518
-
519
- const SidebarMenuItem = React.forwardRef<
520
- HTMLLIElement,
521
- React.ComponentProps<"li">
522
- >(({ className, ...props }, ref) => (
523
- <li
524
- ref={ref}
525
- data-sidebar="menu-item"
526
- className={cn("group/menu-item relative", className)}
527
- {...props}
528
- />
529
- ))
530
- SidebarMenuItem.displayName = "SidebarMenuItem"
531
-
532
- const sidebarMenuButtonVariants = cva(
533
- "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 sidebar-menu-button-icon-mode [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
534
- {
535
- variants: {
536
- variant: {
537
- default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
538
- outline:
539
- "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))]",
540
- },
541
- size: {
542
- default: "h-8 text-sm",
543
- sm: "h-7 text-xs",
544
- lg: "h-12 text-sm sidebar-menu-button-icon-mode-lg",
545
- },
546
- },
547
- defaultVariants: {
548
- variant: "default",
549
- size: "default",
550
- },
551
- }
552
- )
553
-
554
- const SidebarMenuButton = React.forwardRef<
555
- HTMLButtonElement,
556
- React.ComponentProps<"button"> & {
557
- asChild?: boolean
558
- isActive?: boolean
559
- tooltip?: string | React.ComponentProps<typeof TooltipContent>
560
- } & VariantProps<typeof sidebarMenuButtonVariants>
561
- >(
562
- (
563
- {
564
- asChild = false,
565
- isActive = false,
566
- variant = "default",
567
- size = "default",
568
- tooltip,
569
- className,
570
- ...props
571
- },
572
- ref
573
- ) => {
574
- const Comp = asChild ? Slot : "button"
575
- const { isMobile, state } = useSidebar()
576
-
577
- const button = (
578
- <Comp
579
- ref={ref}
580
- data-sidebar="menu-button"
581
- data-size={size}
582
- data-active={isActive}
583
- className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
584
- {...props}
585
- />
586
- )
587
-
588
- if (!tooltip) {
589
- return button
590
- }
591
-
592
- if (typeof tooltip === "string") {
593
- tooltip = {
594
- children: tooltip,
595
- }
596
- }
597
-
598
- return (
599
- <Tooltip>
600
- <TooltipTrigger asChild>{button}</TooltipTrigger>
601
- <TooltipContent
602
- side="right"
603
- align="center"
604
- hidden={state !== "collapsed" || isMobile}
605
- {...tooltip}
606
- />
607
- </Tooltip>
608
- )
609
- }
610
- )
611
- SidebarMenuButton.displayName = "SidebarMenuButton"
612
-
613
- const SidebarMenuAction = React.forwardRef<
614
- HTMLButtonElement,
615
- React.ComponentProps<"button"> & {
616
- asChild?: boolean
617
- showOnHover?: boolean
618
- }
619
- >(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
620
- const Comp = asChild ? Slot : "button"
621
-
622
- return (
623
- <Comp
624
- ref={ref}
625
- data-sidebar="menu-action"
626
- className={cn(
627
- "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",
628
- // Increases the hit area of the button on mobile.
629
- "after:absolute after:-inset-2 after:md:hidden",
630
- "peer-data-[size=sm]/menu-button:top-1",
631
- "peer-data-[size=default]/menu-button:top-1.5",
632
- "peer-data-[size=lg]/menu-button:top-2.5",
633
- "group-data-[collapsible=icon]:hidden",
634
- showOnHover &&
635
- "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",
636
- className
637
- )}
638
- {...props}
639
- />
640
- )
641
- })
642
- SidebarMenuAction.displayName = "SidebarMenuAction"
643
-
644
- const SidebarMenuBadge = React.forwardRef<
645
- HTMLDivElement,
646
- React.ComponentProps<"div">
647
- >(({ className, ...props }, ref) => (
648
- <div
649
- ref={ref}
650
- data-sidebar="menu-badge"
651
- className={cn(
652
- "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",
653
- "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
654
- "peer-data-[size=sm]/menu-button:top-1",
655
- "peer-data-[size=default]/menu-button:top-1.5",
656
- "peer-data-[size=lg]/menu-button:top-2.5",
657
- "group-data-[collapsible=icon]:hidden",
658
- className
659
- )}
660
- {...props}
661
- />
662
- ))
663
- SidebarMenuBadge.displayName = "SidebarMenuBadge"
664
-
665
- const SidebarMenuSkeleton = React.forwardRef<
666
- HTMLDivElement,
667
- React.ComponentProps<"div"> & {
668
- showIcon?: boolean
669
- }
670
- >(({ className, showIcon = false, ...props }, ref) => {
671
- // Random width between 50 to 90%.
672
- const width = React.useMemo(() => {
673
- return `${Math.floor(Math.random() * 40) + 50}%`
674
- }, [])
675
-
676
- return (
677
- <div
678
- ref={ref}
679
- data-sidebar="menu-skeleton"
680
- className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
681
- {...props}
682
- >
683
- {showIcon && (
684
- <Skeleton
685
- className="size-4 rounded-md"
686
- data-sidebar="menu-skeleton-icon"
687
- />
688
- )}
689
- <Skeleton
690
- className="h-4 max-w-[--skeleton-width] flex-1"
691
- data-sidebar="menu-skeleton-text"
692
- style={
693
- {
694
- "--skeleton-width": width,
695
- } as React.CSSProperties
696
- }
697
- />
698
- </div>
699
- )
700
- })
701
- SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton"
702
-
703
- const SidebarMenuSub = React.forwardRef<
704
- HTMLUListElement,
705
- React.ComponentProps<"ul">
706
- >(({ className, ...props }, ref) => (
707
- <ul
708
- ref={ref}
709
- data-sidebar="menu-sub"
710
- className={cn(
711
- "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",
712
- "group-data-[collapsible=icon]:hidden",
713
- className
714
- )}
715
- {...props}
716
- />
717
- ))
718
- SidebarMenuSub.displayName = "SidebarMenuSub"
719
-
720
- const SidebarMenuSubItem = React.forwardRef<
721
- HTMLLIElement,
722
- React.ComponentProps<"li">
723
- >(({ ...props }, ref) => <li ref={ref} {...props} />)
724
- SidebarMenuSubItem.displayName = "SidebarMenuSubItem"
725
-
726
- const SidebarMenuSubButton = React.forwardRef<
727
- HTMLAnchorElement,
728
- React.ComponentProps<"a"> & {
729
- asChild?: boolean
730
- size?: "sm" | "md"
731
- isActive?: boolean
732
- }
733
- >(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
734
- const Comp = asChild ? Slot : "a"
735
-
736
- return (
737
- <Comp
738
- ref={ref}
739
- data-sidebar="menu-sub-button"
740
- data-size={size}
741
- data-active={isActive}
742
- className={cn(
743
- "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",
744
- "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
745
- size === "sm" && "text-xs",
746
- size === "md" && "text-sm",
747
- "group-data-[collapsible=icon]:hidden",
748
- className
749
- )}
750
- {...props}
751
- />
752
- )
753
- })
754
- SidebarMenuSubButton.displayName = "SidebarMenuSubButton"
755
-
756
- export {
757
- Sidebar,
758
- SidebarContent,
759
- SidebarFooter,
760
- SidebarGroup,
761
- SidebarGroupAction,
762
- SidebarGroupContent,
763
- SidebarGroupLabel,
764
- SidebarHeader,
765
- SidebarInput,
766
- SidebarInset,
767
- SidebarMenu,
768
- SidebarMenuAction,
769
- SidebarMenuBadge,
770
- SidebarMenuButton,
771
- SidebarMenuItem,
772
- SidebarMenuSkeleton,
773
- SidebarMenuSub,
774
- SidebarMenuSubButton,
775
- SidebarMenuSubItem,
776
- SidebarProvider,
777
- SidebarRail,
778
- SidebarSeparator,
779
- SidebarTrigger,
780
- useSidebar,
781
- }