@bl33dz/fa814698dcde12f86a37ac31dd3aedf9 1.0.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 (387) hide show
  1. package/dist/perisai-ui.es.js +6402 -0
  2. package/dist/perisai-ui.umd.js +1 -0
  3. package/dist/ui.css +1 -0
  4. package/fix_imports.sh +38 -0
  5. package/generate_index.cjs +52 -0
  6. package/package.json +46 -0
  7. package/package.json.bak +42 -0
  8. package/src/index.css +7704 -0
  9. package/src/index.ts +179 -0
  10. package/src/lib/utils.ts +6 -0
  11. package/src/shadcn/accordion/Accordion.vue +19 -0
  12. package/src/shadcn/accordion/AccordionContent.vue +23 -0
  13. package/src/shadcn/accordion/AccordionItem.vue +23 -0
  14. package/src/shadcn/accordion/AccordionTrigger.vue +38 -0
  15. package/src/shadcn/accordion/index.ts +4 -0
  16. package/src/shadcn/avatar/Avatar.vue +18 -0
  17. package/src/shadcn/avatar/AvatarFallback.vue +21 -0
  18. package/src/shadcn/avatar/AvatarImage.vue +16 -0
  19. package/src/shadcn/avatar/index.ts +3 -0
  20. package/src/shadcn/breadcrumb/Breadcrumb.vue +8 -0
  21. package/src/shadcn/breadcrumb/BreadcrumbEllipsis.vue +9 -0
  22. package/src/shadcn/breadcrumb/BreadcrumbItem.vue +8 -0
  23. package/src/shadcn/breadcrumb/BreadcrumbLink.vue +8 -0
  24. package/src/shadcn/breadcrumb/BreadcrumbList.vue +8 -0
  25. package/src/shadcn/breadcrumb/BreadcrumbPage.vue +8 -0
  26. package/src/shadcn/breadcrumb/BreadcrumbSeparator.vue +8 -0
  27. package/src/shadcn/breadcrumb/index.ts +7 -0
  28. package/src/shadcn/button/Button.vue +29 -0
  29. package/src/shadcn/button/index.ts +38 -0
  30. package/src/shadcn/calendar/Calendar.vue +64 -0
  31. package/src/shadcn/calendar/CalendarCell.vue +23 -0
  32. package/src/shadcn/calendar/CalendarCellTrigger.vue +39 -0
  33. package/src/shadcn/calendar/CalendarGrid.vue +23 -0
  34. package/src/shadcn/calendar/CalendarGridBody.vue +15 -0
  35. package/src/shadcn/calendar/CalendarGridHead.vue +16 -0
  36. package/src/shadcn/calendar/CalendarGridRow.vue +22 -0
  37. package/src/shadcn/calendar/CalendarHeadCell.vue +23 -0
  38. package/src/shadcn/calendar/CalendarHeader.vue +23 -0
  39. package/src/shadcn/calendar/CalendarHeading.vue +30 -0
  40. package/src/shadcn/calendar/CalendarNextButton.vue +32 -0
  41. package/src/shadcn/calendar/CalendarPrevButton.vue +32 -0
  42. package/src/shadcn/calendar/index.ts +12 -0
  43. package/src/shadcn/card/Card.vue +8 -0
  44. package/src/shadcn/card/CardContent.vue +8 -0
  45. package/src/shadcn/card/CardDescription.vue +8 -0
  46. package/src/shadcn/card/CardHeader.vue +8 -0
  47. package/src/shadcn/card/CardTitle.vue +8 -0
  48. package/src/shadcn/card/index.ts +5 -0
  49. package/src/shadcn/checkbox/Checkbox.vue +38 -0
  50. package/src/shadcn/checkbox/index.ts +1 -0
  51. package/src/shadcn/command/Command.vue +87 -0
  52. package/src/shadcn/command/CommandDialog.vue +31 -0
  53. package/src/shadcn/command/CommandEmpty.vue +27 -0
  54. package/src/shadcn/command/CommandGroup.vue +45 -0
  55. package/src/shadcn/command/CommandInput.vue +39 -0
  56. package/src/shadcn/command/CommandItem.vue +76 -0
  57. package/src/shadcn/command/CommandList.vue +25 -0
  58. package/src/shadcn/command/CommandSeparator.vue +21 -0
  59. package/src/shadcn/command/CommandShortcut.vue +17 -0
  60. package/src/shadcn/command/index.ts +25 -0
  61. package/src/shadcn/context-menu/ContextMenu.vue +18 -0
  62. package/src/shadcn/context-menu/ContextMenuCheckboxItem.vue +38 -0
  63. package/src/shadcn/context-menu/ContextMenuContent.vue +34 -0
  64. package/src/shadcn/context-menu/ContextMenuGroup.vue +15 -0
  65. package/src/shadcn/context-menu/ContextMenuItem.vue +39 -0
  66. package/src/shadcn/context-menu/ContextMenuLabel.vue +22 -0
  67. package/src/shadcn/context-menu/ContextMenuPortal.vue +15 -0
  68. package/src/shadcn/context-menu/ContextMenuRadioGroup.vue +22 -0
  69. package/src/shadcn/context-menu/ContextMenuRadioItem.vue +38 -0
  70. package/src/shadcn/context-menu/ContextMenuSeparator.vue +22 -0
  71. package/src/shadcn/context-menu/ContextMenuShortcut.vue +17 -0
  72. package/src/shadcn/context-menu/ContextMenuSub.vue +22 -0
  73. package/src/shadcn/context-menu/ContextMenuSubContent.vue +33 -0
  74. package/src/shadcn/context-menu/ContextMenuSubTrigger.vue +33 -0
  75. package/src/shadcn/context-menu/ContextMenuTrigger.vue +17 -0
  76. package/src/shadcn/context-menu/index.ts +15 -0
  77. package/src/shadcn/dialog/Dialog.vue +18 -0
  78. package/src/shadcn/dialog/DialogClose.vue +15 -0
  79. package/src/shadcn/dialog/DialogContent.vue +46 -0
  80. package/src/shadcn/dialog/DialogDescription.vue +23 -0
  81. package/src/shadcn/dialog/DialogFooter.vue +15 -0
  82. package/src/shadcn/dialog/DialogHeader.vue +17 -0
  83. package/src/shadcn/dialog/DialogOverlay.vue +21 -0
  84. package/src/shadcn/dialog/DialogScrollContent.vue +56 -0
  85. package/src/shadcn/dialog/DialogTitle.vue +23 -0
  86. package/src/shadcn/dialog/DialogTrigger.vue +15 -0
  87. package/src/shadcn/dialog/index.ts +10 -0
  88. package/src/shadcn/dropdown-menu/DropdownMenu.vue +18 -0
  89. package/src/shadcn/dropdown-menu/DropdownMenuCheckboxItem.vue +38 -0
  90. package/src/shadcn/dropdown-menu/DropdownMenuContent.vue +36 -0
  91. package/src/shadcn/dropdown-menu/DropdownMenuGroup.vue +15 -0
  92. package/src/shadcn/dropdown-menu/DropdownMenuItem.vue +31 -0
  93. package/src/shadcn/dropdown-menu/DropdownMenuLabel.vue +23 -0
  94. package/src/shadcn/dropdown-menu/DropdownMenuRadioGroup.vue +22 -0
  95. package/src/shadcn/dropdown-menu/DropdownMenuRadioItem.vue +39 -0
  96. package/src/shadcn/dropdown-menu/DropdownMenuSeparator.vue +24 -0
  97. package/src/shadcn/dropdown-menu/DropdownMenuShortcut.vue +17 -0
  98. package/src/shadcn/dropdown-menu/DropdownMenuSub.vue +19 -0
  99. package/src/shadcn/dropdown-menu/DropdownMenuSubContent.vue +28 -0
  100. package/src/shadcn/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  101. package/src/shadcn/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  102. package/src/shadcn/dropdown-menu/index.ts +16 -0
  103. package/src/shadcn/menubar/Menubar.vue +33 -0
  104. package/src/shadcn/menubar/MenubarCheckboxItem.vue +38 -0
  105. package/src/shadcn/menubar/MenubarContent.vue +42 -0
  106. package/src/shadcn/menubar/MenubarGroup.vue +15 -0
  107. package/src/shadcn/menubar/MenubarItem.vue +37 -0
  108. package/src/shadcn/menubar/MenubarLabel.vue +20 -0
  109. package/src/shadcn/menubar/MenubarMenu.vue +15 -0
  110. package/src/shadcn/menubar/MenubarPortal.vue +5 -0
  111. package/src/shadcn/menubar/MenubarRadioGroup.vue +22 -0
  112. package/src/shadcn/menubar/MenubarRadioItem.vue +38 -0
  113. package/src/shadcn/menubar/MenubarSeparator.vue +21 -0
  114. package/src/shadcn/menubar/MenubarShortcut.vue +17 -0
  115. package/src/shadcn/menubar/MenubarSub.vue +23 -0
  116. package/src/shadcn/menubar/MenubarSubContent.vue +36 -0
  117. package/src/shadcn/menubar/MenubarSubTrigger.vue +28 -0
  118. package/src/shadcn/menubar/MenubarTrigger.vue +28 -0
  119. package/src/shadcn/menubar/index.ts +15 -0
  120. package/src/shadcn/navigation-menu/NavigationMenu.vue +35 -0
  121. package/src/shadcn/navigation-menu/NavigationMenuContent.vue +31 -0
  122. package/src/shadcn/navigation-menu/NavigationMenuIndicator.vue +23 -0
  123. package/src/shadcn/navigation-menu/NavigationMenuItem.vue +21 -0
  124. package/src/shadcn/navigation-menu/NavigationMenuLink.vue +26 -0
  125. package/src/shadcn/navigation-menu/NavigationMenuList.vue +28 -0
  126. package/src/shadcn/navigation-menu/NavigationMenuTrigger.vue +24 -0
  127. package/src/shadcn/navigation-menu/NavigationMenuViewport.vue +31 -0
  128. package/src/shadcn/navigation-menu/index.ts +14 -0
  129. package/src/shadcn/pagination/Pagination.vue +151 -0
  130. package/src/shadcn/pagination/PaginationContent.vue +22 -0
  131. package/src/shadcn/pagination/PaginationEllipsis.vue +25 -0
  132. package/src/shadcn/pagination/PaginationFirst.vue +33 -0
  133. package/src/shadcn/pagination/PaginationItem.vue +31 -0
  134. package/src/shadcn/pagination/PaginationLast.vue +33 -0
  135. package/src/shadcn/pagination/PaginationLink.vue +13 -0
  136. package/src/shadcn/pagination/PaginationNext.vue +22 -0
  137. package/src/shadcn/pagination/PaginationPrevious.vue +33 -0
  138. package/src/shadcn/pagination/index.ts +9 -0
  139. package/src/shadcn/popover/Popover.vue +18 -0
  140. package/src/shadcn/popover/PopoverAnchor.vue +15 -0
  141. package/src/shadcn/popover/PopoverContent.vue +46 -0
  142. package/src/shadcn/popover/PopoverTrigger.vue +15 -0
  143. package/src/shadcn/popover/index.ts +4 -0
  144. package/src/shadcn/radio-group/RadioGroup.vue +24 -0
  145. package/src/shadcn/radio-group/RadioGroupItem.vue +39 -0
  146. package/src/shadcn/radio-group/index.ts +2 -0
  147. package/src/shadcn/range-calendar/RangeCalendar.vue +71 -0
  148. package/src/shadcn/range-calendar/RangeCalendarCell.vue +23 -0
  149. package/src/shadcn/range-calendar/RangeCalendarCellTrigger.vue +41 -0
  150. package/src/shadcn/range-calendar/RangeCalendarGrid.vue +23 -0
  151. package/src/shadcn/range-calendar/RangeCalendarGridBody.vue +15 -0
  152. package/src/shadcn/range-calendar/RangeCalendarGridHead.vue +15 -0
  153. package/src/shadcn/range-calendar/RangeCalendarGridRow.vue +22 -0
  154. package/src/shadcn/range-calendar/RangeCalendarHeadCell.vue +23 -0
  155. package/src/shadcn/range-calendar/RangeCalendarHeader.vue +23 -0
  156. package/src/shadcn/range-calendar/RangeCalendarHeading.vue +30 -0
  157. package/src/shadcn/range-calendar/RangeCalendarNextButton.vue +32 -0
  158. package/src/shadcn/range-calendar/RangeCalendarPrevButton.vue +32 -0
  159. package/src/shadcn/range-calendar/index.ts +12 -0
  160. package/src/shadcn/select/Select.vue +18 -0
  161. package/src/shadcn/select/SelectContent.vue +52 -0
  162. package/src/shadcn/select/SelectGroup.vue +15 -0
  163. package/src/shadcn/select/SelectItem.vue +43 -0
  164. package/src/shadcn/select/SelectItemText.vue +15 -0
  165. package/src/shadcn/select/SelectLabel.vue +17 -0
  166. package/src/shadcn/select/SelectScrollDownButton.vue +26 -0
  167. package/src/shadcn/select/SelectScrollUpButton.vue +26 -0
  168. package/src/shadcn/select/SelectSeparator.vue +19 -0
  169. package/src/shadcn/select/SelectTrigger.vue +33 -0
  170. package/src/shadcn/select/SelectValue.vue +15 -0
  171. package/src/shadcn/select/index.ts +11 -0
  172. package/src/shadcn/separator/Separator.vue +31 -0
  173. package/src/shadcn/separator/index.ts +1 -0
  174. package/src/shadcn/sidebar/MenuGroup.vue +28 -0
  175. package/src/shadcn/sidebar/MenuItemRenderer.vue +23 -0
  176. package/src/shadcn/sidebar/Sidebar.vue +14 -0
  177. package/src/shadcn/sidebar/SidebarDemoContent.vue +26 -0
  178. package/src/shadcn/sidebar/SidebarMenuGroupWithLabel.vue +29 -0
  179. package/src/shadcn/sidebar/SidebarMenuItemWithIcon.vue +103 -0
  180. package/src/shadcn/sidebar/SidebarMenuSub.vue +10 -0
  181. package/src/shadcn/sidebar/SidebarMenuSubItemStyled.vue +38 -0
  182. package/src/shadcn/sidebar/SidebarTrigger.vue +8 -0
  183. package/src/shadcn/sidebar/index.ts +5 -0
  184. package/src/shadcn/slider/Slider.vue +43 -0
  185. package/src/shadcn/slider/index.ts +1 -0
  186. package/src/shadcn/sonner/Sonner.vue +19 -0
  187. package/src/shadcn/sonner/index.ts +1 -0
  188. package/src/shadcn/switch/Switch.vue +38 -0
  189. package/src/shadcn/switch/index.ts +1 -0
  190. package/src/shadcn/tabs/CardTabsContent.vue +16 -0
  191. package/src/shadcn/tabs/CornerCutTabsTrigger.vue +102 -0
  192. package/src/shadcn/tabs/GridTabsList.vue +30 -0
  193. package/src/shadcn/tabs/ScrollableTabsList.vue +8 -0
  194. package/src/shadcn/tabs/Tabs.vue +23 -0
  195. package/src/shadcn/tabs/TabsContent.vue +21 -0
  196. package/src/shadcn/tabs/TabsList.vue +24 -0
  197. package/src/shadcn/tabs/TabsTrigger.vue +30 -0
  198. package/src/shadcn/tabs/VerticalTabsList.vue +28 -0
  199. package/src/shadcn/tabs/VerticalTabsTrigger.vue +16 -0
  200. package/src/shadcn/tabs/index.ts +10 -0
  201. package/src/shadcn/toggle/Toggle.vue +35 -0
  202. package/src/shadcn/toggle/index.ts +28 -0
  203. package/src/shadcn/tooltip/Tooltip.vue +18 -0
  204. package/src/shadcn/tooltip/TooltipContent.vue +34 -0
  205. package/src/shadcn/tooltip/TooltipProvider.vue +14 -0
  206. package/src/shadcn/tooltip/TooltipTrigger.vue +15 -0
  207. package/src/shadcn/tooltip/index.ts +4 -0
  208. package/src/ui/InputOTP.vue +69 -0
  209. package/src/ui/InputOTPContext.ts +10 -0
  210. package/src/ui/InputOTPGroup.vue +7 -0
  211. package/src/ui/InputOTPSeparator.vue +8 -0
  212. package/src/ui/InputOTPSlot.vue +61 -0
  213. package/src/ui/PopoverContent.vue +27 -0
  214. package/src/ui/PopoverTrigger.vue +9 -0
  215. package/src/ui/SelectContent.vue +24 -0
  216. package/src/ui/SelectGroup.vue +22 -0
  217. package/src/ui/SelectItem.vue +25 -0
  218. package/src/ui/SelectLabel.vue +27 -0
  219. package/src/ui/SelectSeparator.vue +23 -0
  220. package/src/ui/SelectTrigger.vue +22 -0
  221. package/src/ui/SelectValue.vue +9 -0
  222. package/src/ui/SheetContent.vue +34 -0
  223. package/src/ui/SheetDescription.vue +9 -0
  224. package/src/ui/SheetHeader.vue +11 -0
  225. package/src/ui/SheetTitle.vue +9 -0
  226. package/src/ui/accordion-content.vue +21 -0
  227. package/src/ui/accordion-item.vue +18 -0
  228. package/src/ui/accordion-trigger.vue +14 -0
  229. package/src/ui/accordion.vue +9 -0
  230. package/src/ui/alert-actions.vue +13 -0
  231. package/src/ui/alert-description.vue +13 -0
  232. package/src/ui/alert-title.vue +13 -0
  233. package/src/ui/alert.vue +63 -0
  234. package/src/ui/avatar-fallback.vue +38 -0
  235. package/src/ui/avatar-group.vue +32 -0
  236. package/src/ui/avatar-image.vue +19 -0
  237. package/src/ui/avatar.vue +32 -0
  238. package/src/ui/badge.vue +90 -0
  239. package/src/ui/breadcrumb-item.vue +11 -0
  240. package/src/ui/breadcrumb-separator.vue +9 -0
  241. package/src/ui/breadcrumb.vue +11 -0
  242. package/src/ui/button.vue +76 -0
  243. package/src/ui/card-content.vue +16 -0
  244. package/src/ui/card-description.vue +16 -0
  245. package/src/ui/card-footer.vue +13 -0
  246. package/src/ui/card-header.vue +19 -0
  247. package/src/ui/card-title.vue +16 -0
  248. package/src/ui/card.vue +73 -0
  249. package/src/ui/category-breakdown-metric.vue +205 -0
  250. package/src/ui/checkbox.vue +84 -0
  251. package/src/ui/cn.ts +6 -0
  252. package/src/ui/dialog-body.vue +13 -0
  253. package/src/ui/dialog-close.vue +9 -0
  254. package/src/ui/dialog-content.vue +36 -0
  255. package/src/ui/dialog-description.vue +13 -0
  256. package/src/ui/dialog-footer.vue +13 -0
  257. package/src/ui/dialog-header.vue +13 -0
  258. package/src/ui/dialog-overlay.vue +14 -0
  259. package/src/ui/dialog-portal.vue +9 -0
  260. package/src/ui/dialog-title.vue +13 -0
  261. package/src/ui/dialog-trigger.vue +9 -0
  262. package/src/ui/dialog.vue +9 -0
  263. package/src/ui/dismissible-badges-demo.vue +94 -0
  264. package/src/ui/drawer-content.vue +53 -0
  265. package/src/ui/drawer-description.vue +23 -0
  266. package/src/ui/drawer-footer.vue +22 -0
  267. package/src/ui/drawer-header.vue +22 -0
  268. package/src/ui/drawer-title.vue +23 -0
  269. package/src/ui/drawer-trigger.vue +23 -0
  270. package/src/ui/drawer.vue +34 -0
  271. package/src/ui/dropdown-menu-checkbox-item.vue +27 -0
  272. package/src/ui/dropdown-menu-content.vue +23 -0
  273. package/src/ui/dropdown-menu-group.vue +7 -0
  274. package/src/ui/dropdown-menu-item.vue +19 -0
  275. package/src/ui/dropdown-menu-label.vue +17 -0
  276. package/src/ui/dropdown-menu-portal.vue +8 -0
  277. package/src/ui/dropdown-menu-radio-group.vue +14 -0
  278. package/src/ui/dropdown-menu-radio-item.vue +30 -0
  279. package/src/ui/dropdown-menu-separator.vue +13 -0
  280. package/src/ui/dropdown-menu-shortcut.vue +15 -0
  281. package/src/ui/dropdown-menu-sub-content.vue +8 -0
  282. package/src/ui/dropdown-menu-sub-trigger.vue +8 -0
  283. package/src/ui/dropdown-menu-sub.vue +8 -0
  284. package/src/ui/dropdown-menu-trigger.vue +8 -0
  285. package/src/ui/dropdown-menu.vue +9 -0
  286. package/src/ui/grouped-avatar.vue +19 -0
  287. package/src/ui/icons/Accessibility.vue +7 -0
  288. package/src/ui/icons/AlignLeft.vue +6 -0
  289. package/src/ui/icons/ArrowDown.vue +7 -0
  290. package/src/ui/icons/ArrowUp.vue +7 -0
  291. package/src/ui/icons/ArrowUpDown.vue +8 -0
  292. package/src/ui/icons/BookOpen.vue +6 -0
  293. package/src/ui/icons/Calendar.vue +9 -0
  294. package/src/ui/icons/Check.vue +6 -0
  295. package/src/ui/icons/ChevronRight.vue +6 -0
  296. package/src/ui/icons/Circle.vue +6 -0
  297. package/src/ui/icons/Copy.vue +7 -0
  298. package/src/ui/icons/Dot.vue +6 -0
  299. package/src/ui/icons/Edit.vue +6 -0
  300. package/src/ui/icons/FileText.vue +9 -0
  301. package/src/ui/icons/Folder.vue +6 -0
  302. package/src/ui/icons/FolderOpen.vue +7 -0
  303. package/src/ui/icons/Hash.vue +6 -0
  304. package/src/ui/icons/Home.vue +6 -0
  305. package/src/ui/icons/Minus.vue +6 -0
  306. package/src/ui/icons/MoreHorizontal.vue +8 -0
  307. package/src/ui/icons/Settings.vue +7 -0
  308. package/src/ui/icons/Slash.vue +6 -0
  309. package/src/ui/icons/Trash2.vue +6 -0
  310. package/src/ui/icons/Type.vue +6 -0
  311. package/src/ui/icons/User.vue +7 -0
  312. package/src/ui/input-otp.vue +52 -0
  313. package/src/ui/input.vue +98 -0
  314. package/src/ui/label.vue +19 -0
  315. package/src/ui/pagination.vue +41 -0
  316. package/src/ui/popover.vue +9 -0
  317. package/src/ui/progress.vue +67 -0
  318. package/src/ui/radio-group-item.vue +53 -0
  319. package/src/ui/radio-group.vue +27 -0
  320. package/src/ui/scrollable-tabs-list.vue +148 -0
  321. package/src/ui/select-multiple.vue +135 -0
  322. package/src/ui/select.vue +77 -0
  323. package/src/ui/separator.vue +60 -0
  324. package/src/ui/sheet.vue +50 -0
  325. package/src/ui/sidebar/BaseSidebar.vue +97 -0
  326. package/src/ui/sidebar/BasicSearch.vue +27 -0
  327. package/src/ui/sidebar/ResponsiveSearch.vue +54 -0
  328. package/src/ui/sidebar/Sidebar.vue +227 -0
  329. package/src/ui/sidebar/SidebarCollapseButton.vue +10 -0
  330. package/src/ui/sidebar/SidebarContent.vue +31 -0
  331. package/src/ui/sidebar/SidebarDescription.vue +10 -0
  332. package/src/ui/sidebar/SidebarExpandButton.vue +10 -0
  333. package/src/ui/sidebar/SidebarFooter.vue +10 -0
  334. package/src/ui/sidebar/SidebarGroup.vue +11 -0
  335. package/src/ui/sidebar/SidebarGroupContent.vue +10 -0
  336. package/src/ui/sidebar/SidebarGroupLabel.vue +7 -0
  337. package/src/ui/sidebar/SidebarHeader.vue +10 -0
  338. package/src/ui/sidebar/SidebarInset.vue +19 -0
  339. package/src/ui/sidebar/SidebarMenu.vue +7 -0
  340. package/src/ui/sidebar/SidebarMenuBadge.vue +7 -0
  341. package/src/ui/sidebar/SidebarMenuButton.vue +17 -0
  342. package/src/ui/sidebar/SidebarMenuItem.vue +10 -0
  343. package/src/ui/sidebar/SidebarMenuSub.vue +18 -0
  344. package/src/ui/sidebar/SidebarMenuSubContent.vue +10 -0
  345. package/src/ui/sidebar/SidebarMenuSubItem.vue +10 -0
  346. package/src/ui/sidebar/SidebarMenuSubTrigger.vue +10 -0
  347. package/src/ui/sidebar/SidebarProvider.vue +108 -0
  348. package/src/ui/sidebar/SidebarScrollArea.vue +10 -0
  349. package/src/ui/sidebar/SidebarSection.vue +10 -0
  350. package/src/ui/sidebar/SidebarSeparator.vue +8 -0
  351. package/src/ui/sidebar/SidebarShortcut.vue +10 -0
  352. package/src/ui/sidebar/SidebarTitle.vue +10 -0
  353. package/src/ui/sidebar/SidebarTrigger.vue +27 -0
  354. package/src/ui/sidebar/Wrapper.vue +12 -0
  355. package/src/ui/sidebar/context.ts +8 -0
  356. package/src/ui/sidebar/index.ts +27 -0
  357. package/src/ui/sidebar/sidebarStore.ts +40 -0
  358. package/src/ui/sidebar/types.ts +30 -0
  359. package/src/ui/sidebar/useAutoCollapse.ts +81 -0
  360. package/src/ui/sidebar.vue +24 -0
  361. package/src/ui/skeleton.vue +15 -0
  362. package/src/ui/slider.vue +32 -0
  363. package/src/ui/sonner.vue +67 -0
  364. package/src/ui/switch.vue +33 -0
  365. package/src/ui/tab-content.vue +28 -0
  366. package/src/ui/tab-list.vue +31 -0
  367. package/src/ui/tab-panel.vue +19 -0
  368. package/src/ui/tab-trigger.vue +34 -0
  369. package/src/ui/tab.vue +30 -0
  370. package/src/ui/table-body.vue +16 -0
  371. package/src/ui/table-caption.vue +20 -0
  372. package/src/ui/table-cell.vue +16 -0
  373. package/src/ui/table-footer.vue +16 -0
  374. package/src/ui/table-header.vue +132 -0
  375. package/src/ui/table-row.vue +16 -0
  376. package/src/ui/table.vue +55 -0
  377. package/src/ui/tabs.vue +33 -0
  378. package/src/ui/textarea.vue +91 -0
  379. package/src/ui/threat-gauge.vue +137 -0
  380. package/src/ui/toggle.vue +69 -0
  381. package/src/ui/tooltip-content.vue +52 -0
  382. package/src/ui/tooltip-provider.vue +13 -0
  383. package/src/ui/tooltip-root.vue +9 -0
  384. package/src/ui/tooltip-trigger.vue +13 -0
  385. package/src/ui/tooltip.vue +22 -0
  386. package/src/ui/utils.ts +6 -0
  387. package/vite.config.ts +39 -0
@@ -0,0 +1,60 @@
1
+ <template>
2
+ <Separator
3
+ :role="role"
4
+ :aria-orientation="orientation"
5
+ :aria-hidden="decorative"
6
+ :orientation="orientation"
7
+ :decorative="decorative"
8
+ :class="[
9
+ 'relative shrink-0 bg-border',
10
+ orientation === 'vertical' ? 'w-px h-full' : 'h-px w-full',
11
+ $attrs.class || '',
12
+ ]"
13
+ v-bind="$attrs"
14
+ >
15
+ <template v-if="text">
16
+ <div class="absolute inset-0 flex items-center">
17
+ <div :class="['relative flex w-full', alignClass]">
18
+ <span class="bg-background px-2 text-xs uppercase text-muted-foreground">{{ text }}</span>
19
+ </div>
20
+ </div>
21
+ </template>
22
+ </Separator>
23
+ </template>
24
+
25
+ <script setup>
26
+ import { computed, defineProps, useAttrs } from 'vue';
27
+ import { Separator } from '@/shadcn/separator';
28
+
29
+ const props = defineProps({
30
+ orientation: {
31
+ type: String,
32
+ default: 'horizontal',
33
+ validator: v => ['horizontal', 'vertical'].includes(v),
34
+ },
35
+ role: {
36
+ type: String,
37
+ default: 'separator',
38
+ },
39
+ decorative: {
40
+ type: Boolean,
41
+ default: true,
42
+ },
43
+ text: String,
44
+ align: {
45
+ type: String,
46
+ default: 'center',
47
+ validator: v => ['start', 'center', 'end'].includes(v),
48
+ },
49
+ });
50
+
51
+ const $attrs = useAttrs();
52
+
53
+ const alignClass = computed(() => {
54
+ return props.align === 'start'
55
+ ? 'justify-start'
56
+ : props.align === 'end'
57
+ ? 'justify-end'
58
+ : 'justify-center';
59
+ });
60
+ </script>
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import { ref, watch, computed } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ defineProps({
6
+ open: Boolean,
7
+ side: { type: String, default: 'right' },
8
+ class: String,
9
+ });
10
+
11
+ defineEmits(['update:open']);
12
+ </script>
13
+ <template>
14
+ <Teleport to="body">
15
+ <transition name="fade">
16
+ <div v-if="open" class="fixed inset-0 z-50 bg-black/50" data-slot="sheet-overlay" />
17
+ </transition>
18
+ <transition name="slide">
19
+ <div
20
+ v-if="open"
21
+ :data-slot="'sheet-content'"
22
+ :class="[
23
+ 'bg-background fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out',
24
+ side === 'right' && 'inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',
25
+ side === 'left' && 'inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',
26
+ side === 'top' && 'inset-x-0 top-0 h-auto border-b',
27
+ side === 'bottom' && 'inset-x-0 bottom-0 h-auto border-t',
28
+ $props.class,
29
+ ]"
30
+ >
31
+ <slot />
32
+ <button
33
+ class="ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none"
34
+ @click="$emit('update:open', false)"
35
+ >
36
+ <span class="sr-only">Close</span>
37
+ <!-- Replace with your icon component -->
38
+ <svg class="size-4" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/></svg>
39
+ </button>
40
+ </div>
41
+ </transition>
42
+ </Teleport>
43
+ </template>
44
+ <style scoped>
45
+ .fade-enter-active, .fade-leave-active { transition: opacity .2s; }
46
+ .fade-enter-from, .fade-leave-to { opacity: 0; }
47
+ .slide-enter-active, .slide-leave-active { transition: all .3s cubic-bezier(.4,0,.2,1); }
48
+ .slide-enter-from { transform: translateX(100%); }
49
+ .slide-leave-to { transform: translateX(100%); }
50
+ </style>
@@ -0,0 +1,97 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import Sheet from '@/ui/sheet.vue';
4
+ import SheetContent from '@/ui/SheetContent.vue';
5
+ import SheetHeader from '@/ui/SheetHeader.vue';
6
+ import SheetTitle from '@/ui/SheetTitle.vue';
7
+ import SheetDescription from '@/ui/SheetDescription.vue';
8
+ import { inject } from 'vue';
9
+
10
+ const SIDEBAR_WIDTH_MOBILE = '260px';
11
+
12
+ const props = defineProps({
13
+ side: { type: String, default: 'left' },
14
+ variant: { type: String, default: 'sidebar' },
15
+ collapsible: { type: String, default: 'icon' },
16
+ class: { type: String, default: '' },
17
+ });
18
+
19
+ const sidebar = inject('sidebarContext');
20
+ </script>
21
+ <template>
22
+ <div
23
+ v-if="props.collapsible === 'none'"
24
+ data-slot="sidebar"
25
+ :class="cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', props.class)"
26
+ v-bind="$attrs"
27
+ >
28
+ <slot />
29
+ </div>
30
+ <Sheet
31
+ v-else-if="sidebar.isMobile"
32
+ :open="sidebar.openMobile"
33
+ @update:open="sidebar.setOpenMobile"
34
+ v-bind="$attrs"
35
+ >
36
+ <SheetContent
37
+ data-sidebar="sidebar"
38
+ data-slot="sidebar"
39
+ data-mobile="true"
40
+ class="bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden"
41
+ :style="{ '--sidebar-width': SIDEBAR_WIDTH_MOBILE }"
42
+ :side="props.side"
43
+ >
44
+ <SheetHeader class="sr-only">
45
+ <SheetTitle>Sidebar</SheetTitle>
46
+ <SheetDescription>Displays the mobile sidebar.</SheetDescription>
47
+ </SheetHeader>
48
+ <div class="flex h-full w-full flex-col">
49
+ <slot />
50
+ </div>
51
+ </SheetContent>
52
+ </Sheet>
53
+ <div
54
+ v-else
55
+ class="group peer text-sidebar-foreground hidden md:block h-full"
56
+ :data-state="sidebar.state"
57
+ :data-collapsible="sidebar.state === 'collapsed' ? props.collapsible : ''"
58
+ :data-variant="props.variant"
59
+ :data-side="props.side"
60
+ data-slot="sidebar"
61
+ >
62
+ <!-- Sidebar gap for desktop -->
63
+ <div
64
+ data-slot="sidebar-gap"
65
+ :class="cn(
66
+ 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',
67
+ 'group-data-[collapsible=offcanvas]:w-0',
68
+ 'group-data-[side=right]:rotate-180',
69
+ props.variant === 'floating' || props.variant === 'inset'
70
+ ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+var(--spacing-4))]'
71
+ : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',
72
+ )"
73
+ />
74
+ <div
75
+ data-slot="sidebar-container"
76
+ :class="cn(
77
+ 'fixed inset-y-0 z-10 hidden h-full w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',
78
+ props.side === 'left'
79
+ ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'
80
+ : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',
81
+ props.variant === 'floating' || props.variant === 'inset'
82
+ ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-autocollapse)+var(--spacing-4)+2px)]'
83
+ : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',
84
+ props.class,
85
+ )"
86
+ v-bind="$attrs"
87
+ >
88
+ <div
89
+ data-sidebar="sidebar"
90
+ data-slot="sidebar-inner"
91
+ class="bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm"
92
+ >
93
+ <slot />
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </template>
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ import { Search } from 'lucide-vue-next';
3
+ const props = defineProps({
4
+ class: String,
5
+ placeholder: { type: String, default: 'Search...' },
6
+ value: String,
7
+ onChange: Function,
8
+ });
9
+ function handleInput(e: Event) {
10
+ const target = e.target as HTMLInputElement;
11
+ props.onChange && props.onChange(target.value);
12
+ }
13
+ </script>
14
+ <template>
15
+ <div :class="['mb-4 px-1', props.class]">
16
+ <div class="relative">
17
+ <Search class="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
18
+ <input
19
+ type="text"
20
+ :placeholder="props.placeholder"
21
+ :value="props.value"
22
+ @input="handleInput"
23
+ class="w-full pl-9 pr-3 py-2 text-sm bg-muted/50 border border-border rounded-md focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset"
24
+ />
25
+ </div>
26
+ </div>
27
+ </template>
@@ -0,0 +1,54 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue';
3
+ import { Search } from 'lucide-vue-next';
4
+
5
+ const props = defineProps({
6
+ isExpanded: Boolean,
7
+ isLocked: { type: Boolean, default: false },
8
+ onSearchClick: Function,
9
+ placeholder: { type: String, default: 'Search...' },
10
+ value: String,
11
+ onChange: Function,
12
+ class: String,
13
+ });
14
+
15
+ const inputRef = ref<HTMLInputElement | null>(null);
16
+
17
+ function handleSearchIconClick() {
18
+ props.onSearchClick && props.onSearchClick();
19
+ }
20
+ function handleInput(e: Event) {
21
+ const target = e.target as HTMLInputElement;
22
+ props.onChange && props.onChange(target.value);
23
+ }
24
+ </script>
25
+ <template>
26
+ <div :class="['mb-4 px-1 relative z-10', props.class]">
27
+ <div class="h-10 flex items-center opacity-100 visible">
28
+ <template v-if="props.isExpanded || props.isLocked">
29
+ <div class="relative w-full">
30
+ <Search class="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
31
+ <input
32
+ ref="inputRef"
33
+ type="text"
34
+ :placeholder="props.placeholder"
35
+ :value="props.value"
36
+ @input="handleInput"
37
+ class="w-full h-10 pl-9 pr-3 text-sm bg-muted/50 border border-border rounded-md focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset"
38
+ />
39
+ </div>
40
+ </template>
41
+ <template v-else>
42
+ <button
43
+ @click="handleSearchIconClick"
44
+ :title="props.isLocked ? 'Search' : 'Search (Click to expand)'"
45
+ class="w-10 h-10 min-w-10 flex items-center justify-center rounded-lg transition-all duration-200 group hover:bg-accent/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset text-muted-foreground hover:text-foreground opacity-100 relative z-20"
46
+ >
47
+ <div class="w-6 h-6 rounded-md flex items-center justify-center transition-colors duration-200 bg-transparent">
48
+ <Search class="w-4 h-4" />
49
+ </div>
50
+ </button>
51
+ </template>
52
+ </div>
53
+ </div>
54
+ </template>
@@ -0,0 +1,227 @@
1
+ <script setup lang="ts">
2
+ import { ref, computed, defineProps, useSlots } from 'vue';
3
+ import Wrapper from './Wrapper.vue';
4
+ import SidebarProvider from './SidebarProvider.vue';
5
+ import SidebarContent from './SidebarContent.vue';
6
+ import SidebarInset from './SidebarInset.vue';
7
+ import ResponsiveSearch from './ResponsiveSearch.vue';
8
+ import BaseSidebar from './BaseSidebar.vue';
9
+ import SidebarHeader from './SidebarHeader.vue';
10
+ import SidebarFooter from './SidebarFooter.vue';
11
+ import SidebarGroup from './SidebarGroup.vue';
12
+ import SidebarGroupContent from './SidebarGroupContent.vue';
13
+ import SidebarGroupLabel from './SidebarGroupLabel.vue';
14
+ import { Lock, Unlock } from 'lucide-vue-next';
15
+ import { BasicSearch } from './index';
16
+ import { useAutoCollapse } from './useAutoCollapse';
17
+
18
+ const props = defineProps({
19
+ variant: { type: String, default: 'basic' },
20
+ data: Object,
21
+ children: null,
22
+ className: String,
23
+ onMenuItemClick: Function,
24
+ searchValue: { type: String, default: '' },
25
+ onSearchChange: Function,
26
+ side: { type: String, default: 'left' },
27
+ sidebarVariant: { type: String, default: 'sidebar' },
28
+ defaultOpen: { type: Boolean, default: true },
29
+ open: { type: Boolean, default: undefined },
30
+ onOpenChange: Function,
31
+ navigationItems: Array,
32
+ recentItems: Array,
33
+ initialActiveItem: { type: String, default: 'settings' },
34
+ initialActiveSubItem: { type: String, default: 'security' },
35
+ showFooter: { type: Boolean, default: true },
36
+ footerUser: { type: String, default: 'John Doe' },
37
+ height: { type: String, default: 'h-screen' },
38
+ activeContent: null,
39
+ onLockToggle: Function,
40
+ });
41
+
42
+ const slots = useSlots();
43
+
44
+ function useSidebarState(initialItem: string, initialSubItem: string) {
45
+ const activeItem = ref(initialItem);
46
+ const activeSubItem = ref(initialSubItem);
47
+ return {
48
+ activeItem,
49
+ activeSubItem,
50
+ setActiveItem: (id: string) => (activeItem.value = id),
51
+ setActiveSubItem: (id: string) => (activeSubItem.value = id),
52
+ };
53
+ }
54
+
55
+ // Basic variant
56
+ if (props.variant === 'basic') {
57
+ const state = useSidebarState(props.initialActiveItem, props.initialActiveSubItem);
58
+ }
59
+
60
+ // Advanced state
61
+ const internalOpen = ref(props.defaultOpen);
62
+ const internalSearchValue = ref('');
63
+
64
+ const open = computed(() => props.open !== undefined ? props.open : internalOpen.value);
65
+ const setOpen = (val: boolean) => {
66
+ if (props.onOpenChange) props.onOpenChange(val);
67
+ else internalOpen.value = val;
68
+ };
69
+ const currentSearchValue = computed(() => props.searchValue || internalSearchValue.value);
70
+ const setSearchValue = (val: string) => {
71
+ if (props.onSearchChange) props.onSearchChange(val);
72
+ else internalSearchValue.value = val;
73
+ };
74
+
75
+
76
+ const {
77
+ isLocked,
78
+ isExpanded,
79
+ isLockButtonHovered,
80
+ handleLockButtonMouseEnter,
81
+ handleLockButtonMouseLeave,
82
+ handleMouseEnter,
83
+ handleMouseLeave,
84
+ toggleLock,
85
+ handleSearchClick,
86
+ } = useAutoCollapse(
87
+ props.variant,
88
+ currentSearchValue.value,
89
+ open.value,
90
+ setOpen,
91
+ props.onLockToggle
92
+ );
93
+
94
+ const getCollapsibleMode = () => {
95
+ if (props.variant === 'collapsible') return 'icon';
96
+ if (props.variant === 'autocollapse') return 'icon';
97
+ return 'none';
98
+ };
99
+
100
+ const sidebarClass = computed(() => [
101
+ 'transition-all duration-300 ease-in-out',
102
+ props.variant === 'autocollapse' && !isExpanded.value && 'overflow-hidden',
103
+ props.className
104
+ ].filter(Boolean).join(' '));
105
+ </script>
106
+ <template>
107
+ <div v-if="props.variant === 'basic'"
108
+ :class="['w-64 border bg-card p-3 flex flex-col', props.height, props.className].filter(Boolean).join(' ')"
109
+ >
110
+ <BasicSearch />
111
+ <SidebarContent
112
+ :navigationItems="props.navigationItems"
113
+ :recentItems="props.recentItems"
114
+ :activeItem="props.initialActiveItem"
115
+ :activeSubItem="props.initialActiveSubItem"
116
+ :onItemClick="() => {}"
117
+ :onSubItemClick="() => {}"
118
+ :showFooter="props.showFooter"
119
+ :footerUser="props.footerUser"
120
+ >
121
+ <slot />
122
+ </SidebarContent>
123
+ </div>
124
+ <Wrapper v-else-if="props.variant === 'autocollapse'" :height="'h-[500px]'">
125
+ <div class="relative isolate">
126
+ <SidebarProvider :open="isExpanded" :onOpenChange="() => {}">
127
+ <div
128
+ :class="['group relative z-10 transition-all duration-300 overflow-visible', isLockButtonHovered ? 'border-r-2 border-r-primary' : 'border-r border-r-border']"
129
+ @mouseenter="handleMouseEnter"
130
+ @mouseleave="handleMouseLeave"
131
+ >
132
+ <button
133
+ @click="toggleLock"
134
+ @mouseenter="handleLockButtonMouseEnter"
135
+ @mouseleave="handleLockButtonMouseLeave"
136
+ :class="[
137
+ 'absolute top-4 z-20 w-7 h-7 rounded-full bg-card border',
138
+ 'flex items-center justify-center text-primary hover:text-primary-foreground',
139
+ 'transition-all duration-300 hover:bg-primary shadow-sm',
140
+ 'focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
141
+ 'opacity-0 group-hover:opacity-100 transition-opacity duration-200',
142
+ isExpanded ? '-right-3.5' : '-right-3.5',
143
+ ]"
144
+ :title="isLocked ? 'Click to enable auto-collapse' : 'Click to lock sidebar open'"
145
+ >
146
+ <Lock v-if="isLocked" class="w-3.5 h-3.5" />
147
+ <Unlock v-else class="w-3.5 h-3.5" />
148
+ </button>
149
+ <BaseSidebar collapsible="icon" class="relative bg-card py-2 overflow-visible">
150
+ <div
151
+ class="flex flex-col h-full"
152
+ :style="{
153
+ paddingLeft: isExpanded ? '8px' : '4px',
154
+ paddingRight: isExpanded ? '16px' : '4px',
155
+ width: '100%',
156
+ minWidth: 0,
157
+ overflow: 'visible',
158
+ }"
159
+ >
160
+ <ResponsiveSearch
161
+ :isExpanded="isExpanded"
162
+ :isLocked="isLocked"
163
+ :onSearchClick="handleSearchClick"
164
+ :value="currentSearchValue"
165
+ :onChange="setSearchValue"
166
+ :placeholder="props.data?.searchPlaceholder || 'Search...'"
167
+ />
168
+ <SidebarContent
169
+ :navigationItems="props.navigationItems"
170
+ :recentItems="props.recentItems"
171
+ :activeItem="props.initialActiveItem"
172
+ :activeSubItem="props.initialActiveSubItem"
173
+ :onItemClick="props.onMenuItemClick"
174
+ :onSubItemClick="props.onMenuItemClick"
175
+ :showFooter="props.showFooter"
176
+ :footerUser="props.footerUser"
177
+ >
178
+ <slot />
179
+ </SidebarContent>
180
+ </div>
181
+ </BaseSidebar>
182
+ </div>
183
+ </SidebarProvider>
184
+ </div>
185
+ <SidebarInset class="bg-background z-[-1]">
186
+ <div class="p-4">
187
+ <slot name="activeContent" />
188
+ </div>
189
+ </SidebarInset>
190
+ </Wrapper>
191
+ <div v-else-if="props.variant === 'collapsible'" class="relative isolate">
192
+ <SidebarProvider :open="open" :onOpenChange="setOpen">
193
+ <Wrapper :height="'h-[500px]'">
194
+ <BaseSidebar collapsible="icon" class="relative bg-card px-1 py-2">
195
+ <ResponsiveSearch :isExpanded="open" :onSearchClick="() => setOpen(true)" />
196
+ <SidebarContent
197
+ :navigationItems="props.navigationItems"
198
+ :recentItems="props.recentItems"
199
+ :activeItem="props.initialActiveItem"
200
+ :activeSubItem="props.initialActiveSubItem"
201
+ :onItemClick="() => {}"
202
+ :onSubItemClick="() => {}"
203
+ :showFooter="props.showFooter"
204
+ :footerUser="props.footerUser"
205
+ >
206
+ <slot />
207
+ </SidebarContent>
208
+ </BaseSidebar>
209
+ <SidebarInset class="bg-background">
210
+ <div class="p-4">
211
+ <slot name="activeContent" />
212
+ </div>
213
+ </SidebarInset>
214
+ </Wrapper>
215
+ </SidebarProvider>
216
+ </div>
217
+ <BaseSidebar
218
+ v-else
219
+ :side="props.side"
220
+ :variant="props.sidebarVariant"
221
+ :collapsible="getCollapsibleMode()"
222
+ :class="sidebarClass"
223
+ v-bind="$attrs"
224
+ >
225
+ <slot />
226
+ </BaseSidebar>
227
+ </template>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: { type: String, default: '' },
4
+ });
5
+ </script>
6
+ <template>
7
+ <button :class="['sidebar-collapse-button', props.class]">
8
+ <slot />
9
+ </button>
10
+ </template>
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import { User } from 'lucide-vue-next';
3
+ import SidebarMenuItemWithIcon from '@/shadcn/sidebar/SidebarMenuItemWithIcon.vue';
4
+
5
+ const props = defineProps<{
6
+ navigationItems?: any[];
7
+ recentItems?: any[];
8
+ activeItem?: string;
9
+ activeSubItem?: string;
10
+ onItemClick?: (id: string) => void;
11
+ onSubItemClick?: (id: string) => void;
12
+ showFooter?: boolean;
13
+ footerUser?: string;
14
+ }>();
15
+ </script>
16
+ <template>
17
+ <!-- Scrollable Content -->
18
+ <div class="flex-1 overflow-y-auto">
19
+ <slot />
20
+ </div>
21
+
22
+ <!-- Fixed Footer -->
23
+ <div v-if="props.showFooter !== false" class="pt-3 border-t border-border px-2 flex justify-center">
24
+ <SidebarMenuItemWithIcon
25
+ :icon="User"
26
+ :label="props.footerUser ?? 'John Doe'"
27
+ :isActive="props.activeItem === 'profile'"
28
+ :onClick="() => props.onItemClick && props.onItemClick('profile')"
29
+ />
30
+ </div>
31
+ </template>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: { type: String, default: '' },
4
+ });
5
+ </script>
6
+ <template>
7
+ <div :class="['sidebar-description', props.class]">
8
+ <slot />
9
+ </div>
10
+ </template>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: { type: String, default: '' },
4
+ });
5
+ </script>
6
+ <template>
7
+ <button :class="['sidebar-expand-button', props.class]">
8
+ <slot />
9
+ </button>
10
+ </template>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: { type: String, default: '' },
4
+ });
5
+ </script>
6
+ <template>
7
+ <footer :class="['sidebar-footer', props.class]">
8
+ <slot />
9
+ </footer>
10
+ </template>
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <div :class="['sidebar-group', props.class]">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ const props = defineProps({
9
+ class: { type: String, default: '' },
10
+ });
11
+ </script>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: { type: String, default: '' },
4
+ });
5
+ </script>
6
+ <template>
7
+ <div :class="['sidebar-group-content', props.class]">
8
+ <slot />
9
+ </div>
10
+ </template>
@@ -0,0 +1,7 @@
1
+ <script setup lang="ts">
2
+ </script>
3
+ <template>
4
+ <div class="text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-1">
5
+ <slot />
6
+ </div>
7
+ </template>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: { type: String, default: '' },
4
+ });
5
+ </script>
6
+ <template>
7
+ <header :class="['sidebar-header', props.class]">
8
+ <slot />
9
+ </header>
10
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+ const props = defineProps({
5
+ class: { type: String, default: '' },
6
+ });
7
+ const classes = computed(() =>
8
+ cn(
9
+ 'bg-background relative flex w-full flex-1 flex-col',
10
+ 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',
11
+ props.class
12
+ )
13
+ );
14
+ </script>
15
+ <template>
16
+ <main data-slot="sidebar-inset" :class="classes">
17
+ <slot />
18
+ </main>
19
+ </template>
@@ -0,0 +1,7 @@
1
+ <script setup lang="ts">
2
+ </script>
3
+ <template>
4
+ <ul class="sidebar-menu">
5
+ <slot />
6
+ </ul>
7
+ </template>