@bl33dz/fa814698dcde12f86a37ac31dd3aedf9 1.0.5 → 1.0.7

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 (388) hide show
  1. package/README.md +80 -95
  2. package/dist/fa814698dcde12f86a37ac31dd3aedf9.css +1 -1
  3. package/dist/perisai-ui.es.js +864 -847
  4. package/dist/perisai-ui.umd.js +1 -1
  5. package/package.json +45 -45
  6. package/src/{global.css → globals.css} +575 -575
  7. package/src/index.ts +178 -176
  8. package/src/lib/utils.ts +6 -6
  9. package/src/shadcn/accordion/Accordion.vue +19 -19
  10. package/src/shadcn/accordion/AccordionContent.vue +23 -23
  11. package/src/shadcn/accordion/AccordionItem.vue +23 -23
  12. package/src/shadcn/accordion/AccordionTrigger.vue +38 -38
  13. package/src/shadcn/accordion/index.ts +4 -4
  14. package/src/shadcn/avatar/Avatar.vue +18 -18
  15. package/src/shadcn/avatar/AvatarFallback.vue +21 -21
  16. package/src/shadcn/avatar/AvatarImage.vue +16 -16
  17. package/src/shadcn/avatar/index.ts +3 -3
  18. package/src/shadcn/breadcrumb/Breadcrumb.vue +8 -8
  19. package/src/shadcn/breadcrumb/BreadcrumbEllipsis.vue +9 -9
  20. package/src/shadcn/breadcrumb/BreadcrumbItem.vue +8 -8
  21. package/src/shadcn/breadcrumb/BreadcrumbLink.vue +8 -8
  22. package/src/shadcn/breadcrumb/BreadcrumbList.vue +8 -8
  23. package/src/shadcn/breadcrumb/BreadcrumbPage.vue +8 -8
  24. package/src/shadcn/breadcrumb/BreadcrumbSeparator.vue +8 -8
  25. package/src/shadcn/breadcrumb/index.ts +7 -7
  26. package/src/shadcn/button/Button.vue +29 -29
  27. package/src/shadcn/button/index.ts +38 -38
  28. package/src/shadcn/calendar/Calendar.vue +64 -64
  29. package/src/shadcn/calendar/CalendarCell.vue +23 -23
  30. package/src/shadcn/calendar/CalendarCellTrigger.vue +39 -39
  31. package/src/shadcn/calendar/CalendarGrid.vue +23 -23
  32. package/src/shadcn/calendar/CalendarGridBody.vue +15 -15
  33. package/src/shadcn/calendar/CalendarGridHead.vue +16 -16
  34. package/src/shadcn/calendar/CalendarGridRow.vue +22 -22
  35. package/src/shadcn/calendar/CalendarHeadCell.vue +23 -23
  36. package/src/shadcn/calendar/CalendarHeader.vue +23 -23
  37. package/src/shadcn/calendar/CalendarHeading.vue +30 -30
  38. package/src/shadcn/calendar/CalendarNextButton.vue +32 -32
  39. package/src/shadcn/calendar/CalendarPrevButton.vue +32 -32
  40. package/src/shadcn/calendar/index.ts +12 -12
  41. package/src/shadcn/card/Card.vue +8 -8
  42. package/src/shadcn/card/CardContent.vue +8 -8
  43. package/src/shadcn/card/CardDescription.vue +8 -8
  44. package/src/shadcn/card/CardHeader.vue +8 -8
  45. package/src/shadcn/card/CardTitle.vue +8 -8
  46. package/src/shadcn/card/index.ts +5 -5
  47. package/src/shadcn/checkbox/Checkbox.vue +38 -38
  48. package/src/shadcn/checkbox/index.ts +1 -1
  49. package/src/shadcn/command/Command.vue +87 -87
  50. package/src/shadcn/command/CommandDialog.vue +31 -31
  51. package/src/shadcn/command/CommandEmpty.vue +27 -27
  52. package/src/shadcn/command/CommandGroup.vue +45 -45
  53. package/src/shadcn/command/CommandInput.vue +39 -39
  54. package/src/shadcn/command/CommandItem.vue +76 -76
  55. package/src/shadcn/command/CommandList.vue +25 -25
  56. package/src/shadcn/command/CommandSeparator.vue +21 -21
  57. package/src/shadcn/command/CommandShortcut.vue +17 -17
  58. package/src/shadcn/command/index.ts +25 -25
  59. package/src/shadcn/context-menu/ContextMenu.vue +18 -18
  60. package/src/shadcn/context-menu/ContextMenuCheckboxItem.vue +38 -38
  61. package/src/shadcn/context-menu/ContextMenuContent.vue +34 -34
  62. package/src/shadcn/context-menu/ContextMenuGroup.vue +15 -15
  63. package/src/shadcn/context-menu/ContextMenuItem.vue +39 -39
  64. package/src/shadcn/context-menu/ContextMenuLabel.vue +22 -22
  65. package/src/shadcn/context-menu/ContextMenuPortal.vue +15 -15
  66. package/src/shadcn/context-menu/ContextMenuRadioGroup.vue +22 -22
  67. package/src/shadcn/context-menu/ContextMenuRadioItem.vue +38 -38
  68. package/src/shadcn/context-menu/ContextMenuSeparator.vue +22 -22
  69. package/src/shadcn/context-menu/ContextMenuShortcut.vue +17 -17
  70. package/src/shadcn/context-menu/ContextMenuSub.vue +22 -22
  71. package/src/shadcn/context-menu/ContextMenuSubContent.vue +33 -33
  72. package/src/shadcn/context-menu/ContextMenuSubTrigger.vue +33 -33
  73. package/src/shadcn/context-menu/ContextMenuTrigger.vue +17 -17
  74. package/src/shadcn/context-menu/index.ts +15 -15
  75. package/src/shadcn/dialog/Dialog.vue +18 -18
  76. package/src/shadcn/dialog/DialogClose.vue +15 -15
  77. package/src/shadcn/dialog/DialogContent.vue +46 -46
  78. package/src/shadcn/dialog/DialogDescription.vue +23 -23
  79. package/src/shadcn/dialog/DialogFooter.vue +15 -15
  80. package/src/shadcn/dialog/DialogHeader.vue +17 -17
  81. package/src/shadcn/dialog/DialogOverlay.vue +21 -21
  82. package/src/shadcn/dialog/DialogScrollContent.vue +56 -56
  83. package/src/shadcn/dialog/DialogTitle.vue +23 -23
  84. package/src/shadcn/dialog/DialogTrigger.vue +15 -15
  85. package/src/shadcn/dialog/index.ts +10 -10
  86. package/src/shadcn/dropdown-menu/DropdownMenu.vue +18 -18
  87. package/src/shadcn/dropdown-menu/DropdownMenuCheckboxItem.vue +38 -38
  88. package/src/shadcn/dropdown-menu/DropdownMenuContent.vue +36 -36
  89. package/src/shadcn/dropdown-menu/DropdownMenuGroup.vue +15 -15
  90. package/src/shadcn/dropdown-menu/DropdownMenuItem.vue +31 -31
  91. package/src/shadcn/dropdown-menu/DropdownMenuLabel.vue +23 -23
  92. package/src/shadcn/dropdown-menu/DropdownMenuRadioGroup.vue +22 -22
  93. package/src/shadcn/dropdown-menu/DropdownMenuRadioItem.vue +39 -39
  94. package/src/shadcn/dropdown-menu/DropdownMenuSeparator.vue +24 -24
  95. package/src/shadcn/dropdown-menu/DropdownMenuShortcut.vue +17 -17
  96. package/src/shadcn/dropdown-menu/DropdownMenuSub.vue +19 -19
  97. package/src/shadcn/dropdown-menu/DropdownMenuSubContent.vue +28 -28
  98. package/src/shadcn/dropdown-menu/DropdownMenuSubTrigger.vue +31 -31
  99. package/src/shadcn/dropdown-menu/DropdownMenuTrigger.vue +17 -17
  100. package/src/shadcn/dropdown-menu/index.ts +16 -16
  101. package/src/shadcn/menubar/Menubar.vue +33 -33
  102. package/src/shadcn/menubar/MenubarCheckboxItem.vue +38 -38
  103. package/src/shadcn/menubar/MenubarContent.vue +42 -42
  104. package/src/shadcn/menubar/MenubarGroup.vue +15 -15
  105. package/src/shadcn/menubar/MenubarItem.vue +37 -37
  106. package/src/shadcn/menubar/MenubarLabel.vue +20 -20
  107. package/src/shadcn/menubar/MenubarMenu.vue +15 -15
  108. package/src/shadcn/menubar/MenubarPortal.vue +5 -5
  109. package/src/shadcn/menubar/MenubarRadioGroup.vue +22 -22
  110. package/src/shadcn/menubar/MenubarRadioItem.vue +38 -38
  111. package/src/shadcn/menubar/MenubarSeparator.vue +21 -21
  112. package/src/shadcn/menubar/MenubarShortcut.vue +17 -17
  113. package/src/shadcn/menubar/MenubarSub.vue +23 -23
  114. package/src/shadcn/menubar/MenubarSubContent.vue +36 -36
  115. package/src/shadcn/menubar/MenubarSubTrigger.vue +28 -28
  116. package/src/shadcn/menubar/MenubarTrigger.vue +28 -28
  117. package/src/shadcn/menubar/index.ts +15 -15
  118. package/src/shadcn/navigation-menu/NavigationMenu.vue +35 -35
  119. package/src/shadcn/navigation-menu/NavigationMenuContent.vue +31 -31
  120. package/src/shadcn/navigation-menu/NavigationMenuIndicator.vue +23 -23
  121. package/src/shadcn/navigation-menu/NavigationMenuItem.vue +21 -21
  122. package/src/shadcn/navigation-menu/NavigationMenuLink.vue +26 -26
  123. package/src/shadcn/navigation-menu/NavigationMenuList.vue +28 -28
  124. package/src/shadcn/navigation-menu/NavigationMenuTrigger.vue +24 -24
  125. package/src/shadcn/navigation-menu/NavigationMenuViewport.vue +31 -31
  126. package/src/shadcn/navigation-menu/index.ts +14 -14
  127. package/src/shadcn/pagination/Pagination.vue +151 -151
  128. package/src/shadcn/pagination/PaginationContent.vue +22 -22
  129. package/src/shadcn/pagination/PaginationEllipsis.vue +25 -25
  130. package/src/shadcn/pagination/PaginationFirst.vue +33 -33
  131. package/src/shadcn/pagination/PaginationItem.vue +31 -31
  132. package/src/shadcn/pagination/PaginationLast.vue +33 -33
  133. package/src/shadcn/pagination/PaginationLink.vue +13 -13
  134. package/src/shadcn/pagination/PaginationNext.vue +22 -22
  135. package/src/shadcn/pagination/PaginationPrevious.vue +33 -33
  136. package/src/shadcn/pagination/index.ts +9 -9
  137. package/src/shadcn/popover/Popover.vue +18 -18
  138. package/src/shadcn/popover/PopoverAnchor.vue +15 -15
  139. package/src/shadcn/popover/PopoverContent.vue +46 -46
  140. package/src/shadcn/popover/PopoverTrigger.vue +15 -15
  141. package/src/shadcn/popover/index.ts +4 -4
  142. package/src/shadcn/radio-group/RadioGroup.vue +24 -24
  143. package/src/shadcn/radio-group/RadioGroupItem.vue +39 -39
  144. package/src/shadcn/radio-group/index.ts +2 -2
  145. package/src/shadcn/range-calendar/RangeCalendar.vue +71 -71
  146. package/src/shadcn/range-calendar/RangeCalendarCell.vue +23 -23
  147. package/src/shadcn/range-calendar/RangeCalendarCellTrigger.vue +41 -41
  148. package/src/shadcn/range-calendar/RangeCalendarGrid.vue +23 -23
  149. package/src/shadcn/range-calendar/RangeCalendarGridBody.vue +15 -15
  150. package/src/shadcn/range-calendar/RangeCalendarGridHead.vue +15 -15
  151. package/src/shadcn/range-calendar/RangeCalendarGridRow.vue +22 -22
  152. package/src/shadcn/range-calendar/RangeCalendarHeadCell.vue +23 -23
  153. package/src/shadcn/range-calendar/RangeCalendarHeader.vue +23 -23
  154. package/src/shadcn/range-calendar/RangeCalendarHeading.vue +30 -30
  155. package/src/shadcn/range-calendar/RangeCalendarNextButton.vue +32 -32
  156. package/src/shadcn/range-calendar/RangeCalendarPrevButton.vue +32 -32
  157. package/src/shadcn/range-calendar/index.ts +12 -12
  158. package/src/shadcn/select/Select.vue +18 -18
  159. package/src/shadcn/select/SelectContent.vue +52 -52
  160. package/src/shadcn/select/SelectGroup.vue +15 -15
  161. package/src/shadcn/select/SelectItem.vue +43 -43
  162. package/src/shadcn/select/SelectItemText.vue +15 -15
  163. package/src/shadcn/select/SelectLabel.vue +17 -17
  164. package/src/shadcn/select/SelectScrollDownButton.vue +26 -26
  165. package/src/shadcn/select/SelectScrollUpButton.vue +26 -26
  166. package/src/shadcn/select/SelectSeparator.vue +19 -19
  167. package/src/shadcn/select/SelectTrigger.vue +33 -33
  168. package/src/shadcn/select/SelectValue.vue +15 -15
  169. package/src/shadcn/select/index.ts +11 -11
  170. package/src/shadcn/separator/Separator.vue +31 -31
  171. package/src/shadcn/separator/index.ts +1 -1
  172. package/src/shadcn/sidebar/MenuGroup.vue +28 -28
  173. package/src/shadcn/sidebar/MenuItemRenderer.vue +23 -23
  174. package/src/shadcn/sidebar/Sidebar.vue +14 -14
  175. package/src/shadcn/sidebar/SidebarDemoContent.vue +26 -26
  176. package/src/shadcn/sidebar/SidebarMenuGroupWithLabel.vue +29 -29
  177. package/src/shadcn/sidebar/SidebarMenuItemWithIcon.vue +103 -103
  178. package/src/shadcn/sidebar/SidebarMenuSub.vue +10 -10
  179. package/src/shadcn/sidebar/SidebarMenuSubItemStyled.vue +38 -38
  180. package/src/shadcn/sidebar/SidebarTrigger.vue +8 -8
  181. package/src/shadcn/sidebar/index.ts +5 -5
  182. package/src/shadcn/slider/Slider.vue +43 -43
  183. package/src/shadcn/slider/index.ts +1 -1
  184. package/src/shadcn/sonner/Sonner.vue +19 -19
  185. package/src/shadcn/sonner/index.ts +1 -1
  186. package/src/shadcn/spinner/Spinner.vue +17 -0
  187. package/src/shadcn/spinner/index.ts +1 -0
  188. package/src/shadcn/switch/Switch.vue +38 -38
  189. package/src/shadcn/switch/index.ts +1 -1
  190. package/src/shadcn/tabs/CardTabsContent.vue +16 -16
  191. package/src/shadcn/tabs/CornerCutTabsTrigger.vue +102 -102
  192. package/src/shadcn/tabs/GridTabsList.vue +30 -30
  193. package/src/shadcn/tabs/ScrollableTabsList.vue +8 -8
  194. package/src/shadcn/tabs/Tabs.vue +23 -23
  195. package/src/shadcn/tabs/TabsContent.vue +21 -21
  196. package/src/shadcn/tabs/TabsList.vue +24 -24
  197. package/src/shadcn/tabs/TabsTrigger.vue +30 -30
  198. package/src/shadcn/tabs/VerticalTabsList.vue +28 -28
  199. package/src/shadcn/tabs/VerticalTabsTrigger.vue +16 -16
  200. package/src/shadcn/tabs/index.ts +10 -10
  201. package/src/shadcn/toggle/Toggle.vue +35 -35
  202. package/src/shadcn/toggle/index.ts +28 -28
  203. package/src/shadcn/tooltip/Tooltip.vue +18 -18
  204. package/src/shadcn/tooltip/TooltipContent.vue +34 -34
  205. package/src/shadcn/tooltip/TooltipProvider.vue +14 -14
  206. package/src/shadcn/tooltip/TooltipTrigger.vue +15 -15
  207. package/src/shadcn/tooltip/index.ts +4 -4
  208. package/src/shadcn/tree/index.ts +2 -0
  209. package/src/ui/InputOTP.vue +69 -69
  210. package/src/ui/InputOTPContext.ts +9 -9
  211. package/src/ui/InputOTPGroup.vue +7 -7
  212. package/src/ui/InputOTPSeparator.vue +8 -8
  213. package/src/ui/InputOTPSlot.vue +61 -61
  214. package/src/ui/PopoverContent.vue +27 -27
  215. package/src/ui/PopoverTrigger.vue +9 -9
  216. package/src/ui/SelectContent.vue +23 -23
  217. package/src/ui/SelectGroup.vue +12 -12
  218. package/src/ui/SelectItem.vue +25 -25
  219. package/src/ui/SelectLabel.vue +16 -16
  220. package/src/ui/SelectSeparator.vue +17 -17
  221. package/src/ui/SelectTrigger.vue +22 -22
  222. package/src/ui/SelectValue.vue +9 -9
  223. package/src/ui/SheetContent.vue +34 -34
  224. package/src/ui/SheetDescription.vue +9 -9
  225. package/src/ui/SheetHeader.vue +11 -11
  226. package/src/ui/SheetTitle.vue +9 -9
  227. package/src/ui/accordion-content.vue +21 -21
  228. package/src/ui/accordion-item.vue +18 -18
  229. package/src/ui/accordion-trigger.vue +14 -14
  230. package/src/ui/accordion.vue +9 -9
  231. package/src/ui/alert-actions.vue +13 -13
  232. package/src/ui/alert-description.vue +13 -13
  233. package/src/ui/alert-title.vue +13 -13
  234. package/src/ui/alert.vue +63 -63
  235. package/src/ui/avatar-fallback.vue +38 -38
  236. package/src/ui/avatar-group.vue +32 -32
  237. package/src/ui/avatar-image.vue +19 -19
  238. package/src/ui/avatar.vue +32 -32
  239. package/src/ui/badge.vue +90 -90
  240. package/src/ui/breadcrumb-item.vue +11 -11
  241. package/src/ui/breadcrumb-separator.vue +9 -9
  242. package/src/ui/breadcrumb.vue +11 -11
  243. package/src/ui/button.vue +76 -76
  244. package/src/ui/card-content.vue +16 -16
  245. package/src/ui/card-description.vue +16 -16
  246. package/src/ui/card-footer.vue +13 -13
  247. package/src/ui/card-header.vue +19 -19
  248. package/src/ui/card-title.vue +16 -16
  249. package/src/ui/card.vue +73 -73
  250. package/src/ui/category-breakdown-metric.vue +205 -205
  251. package/src/ui/checkbox.vue +84 -84
  252. package/src/ui/cn.ts +6 -6
  253. package/src/ui/dialog-body.vue +13 -13
  254. package/src/ui/dialog-close.vue +9 -9
  255. package/src/ui/dialog-content.vue +36 -36
  256. package/src/ui/dialog-description.vue +13 -13
  257. package/src/ui/dialog-footer.vue +13 -13
  258. package/src/ui/dialog-header.vue +13 -13
  259. package/src/ui/dialog-overlay.vue +14 -14
  260. package/src/ui/dialog-portal.vue +9 -9
  261. package/src/ui/dialog-title.vue +13 -13
  262. package/src/ui/dialog-trigger.vue +9 -9
  263. package/src/ui/dialog.vue +9 -9
  264. package/src/ui/dismissible-badges-demo.vue +94 -94
  265. package/src/ui/drawer-content.vue +53 -53
  266. package/src/ui/drawer-description.vue +23 -23
  267. package/src/ui/drawer-footer.vue +22 -22
  268. package/src/ui/drawer-header.vue +22 -22
  269. package/src/ui/drawer-title.vue +23 -23
  270. package/src/ui/drawer-trigger.vue +23 -23
  271. package/src/ui/drawer.vue +34 -34
  272. package/src/ui/dropdown-menu-checkbox-item.vue +27 -27
  273. package/src/ui/dropdown-menu-content.vue +23 -23
  274. package/src/ui/dropdown-menu-group.vue +7 -7
  275. package/src/ui/dropdown-menu-item.vue +19 -19
  276. package/src/ui/dropdown-menu-label.vue +17 -17
  277. package/src/ui/dropdown-menu-portal.vue +8 -8
  278. package/src/ui/dropdown-menu-radio-group.vue +14 -14
  279. package/src/ui/dropdown-menu-radio-item.vue +30 -30
  280. package/src/ui/dropdown-menu-separator.vue +13 -13
  281. package/src/ui/dropdown-menu-shortcut.vue +15 -15
  282. package/src/ui/dropdown-menu-sub-content.vue +8 -8
  283. package/src/ui/dropdown-menu-sub-trigger.vue +8 -8
  284. package/src/ui/dropdown-menu-sub.vue +8 -8
  285. package/src/ui/dropdown-menu-trigger.vue +8 -8
  286. package/src/ui/dropdown-menu.vue +9 -9
  287. package/src/ui/grouped-avatar.vue +19 -19
  288. package/src/ui/icons/Accessibility.vue +7 -7
  289. package/src/ui/icons/AlignLeft.vue +6 -6
  290. package/src/ui/icons/ArrowDown.vue +7 -7
  291. package/src/ui/icons/ArrowUp.vue +7 -7
  292. package/src/ui/icons/ArrowUpDown.vue +8 -8
  293. package/src/ui/icons/BookOpen.vue +6 -6
  294. package/src/ui/icons/Calendar.vue +9 -9
  295. package/src/ui/icons/Check.vue +6 -6
  296. package/src/ui/icons/ChevronRight.vue +6 -6
  297. package/src/ui/icons/Circle.vue +6 -6
  298. package/src/ui/icons/Copy.vue +7 -7
  299. package/src/ui/icons/Dot.vue +6 -6
  300. package/src/ui/icons/Edit.vue +6 -6
  301. package/src/ui/icons/FileText.vue +9 -9
  302. package/src/ui/icons/Folder.vue +6 -6
  303. package/src/ui/icons/FolderOpen.vue +7 -7
  304. package/src/ui/icons/Hash.vue +6 -6
  305. package/src/ui/icons/Home.vue +6 -6
  306. package/src/ui/icons/Minus.vue +6 -6
  307. package/src/ui/icons/MoreHorizontal.vue +8 -8
  308. package/src/ui/icons/Settings.vue +7 -7
  309. package/src/ui/icons/Slash.vue +6 -6
  310. package/src/ui/icons/Trash2.vue +6 -6
  311. package/src/ui/icons/Type.vue +6 -6
  312. package/src/ui/icons/User.vue +7 -7
  313. package/src/ui/input-otp.vue +52 -52
  314. package/src/ui/input.vue +98 -98
  315. package/src/ui/label.vue +19 -19
  316. package/src/ui/pagination.vue +41 -41
  317. package/src/ui/popover.vue +9 -9
  318. package/src/ui/progress.vue +67 -67
  319. package/src/ui/radio-group-item.vue +53 -53
  320. package/src/ui/radio-group.vue +27 -27
  321. package/src/ui/scrollable-tabs-list.vue +148 -148
  322. package/src/ui/select-multiple.vue +135 -135
  323. package/src/ui/select.vue +77 -77
  324. package/src/ui/separator.vue +60 -60
  325. package/src/ui/sheet.vue +50 -50
  326. package/src/ui/sidebar/BaseSidebar.vue +97 -97
  327. package/src/ui/sidebar/BasicSearch.vue +27 -27
  328. package/src/ui/sidebar/ResponsiveSearch.vue +54 -54
  329. package/src/ui/sidebar/Sidebar.vue +227 -227
  330. package/src/ui/sidebar/SidebarCollapseButton.vue +10 -10
  331. package/src/ui/sidebar/SidebarContent.vue +31 -31
  332. package/src/ui/sidebar/SidebarDescription.vue +10 -10
  333. package/src/ui/sidebar/SidebarExpandButton.vue +10 -10
  334. package/src/ui/sidebar/SidebarFooter.vue +10 -10
  335. package/src/ui/sidebar/SidebarGroup.vue +11 -11
  336. package/src/ui/sidebar/SidebarGroupContent.vue +10 -10
  337. package/src/ui/sidebar/SidebarGroupLabel.vue +7 -7
  338. package/src/ui/sidebar/SidebarHeader.vue +10 -10
  339. package/src/ui/sidebar/SidebarInset.vue +19 -19
  340. package/src/ui/sidebar/SidebarMenu.vue +7 -7
  341. package/src/ui/sidebar/SidebarMenuBadge.vue +7 -7
  342. package/src/ui/sidebar/SidebarMenuButton.vue +17 -17
  343. package/src/ui/sidebar/SidebarMenuItem.vue +10 -10
  344. package/src/ui/sidebar/SidebarMenuSub.vue +18 -18
  345. package/src/ui/sidebar/SidebarMenuSubContent.vue +10 -10
  346. package/src/ui/sidebar/SidebarMenuSubItem.vue +10 -10
  347. package/src/ui/sidebar/SidebarMenuSubTrigger.vue +10 -10
  348. package/src/ui/sidebar/SidebarProvider.vue +108 -108
  349. package/src/ui/sidebar/SidebarScrollArea.vue +10 -10
  350. package/src/ui/sidebar/SidebarSection.vue +10 -10
  351. package/src/ui/sidebar/SidebarSeparator.vue +8 -8
  352. package/src/ui/sidebar/SidebarShortcut.vue +10 -10
  353. package/src/ui/sidebar/SidebarTitle.vue +10 -10
  354. package/src/ui/sidebar/SidebarTrigger.vue +27 -27
  355. package/src/ui/sidebar/Wrapper.vue +12 -12
  356. package/src/ui/sidebar/context.ts +8 -8
  357. package/src/ui/sidebar/index.ts +27 -27
  358. package/src/ui/sidebar/sidebarStore.ts +40 -40
  359. package/src/ui/sidebar/types.ts +30 -30
  360. package/src/ui/sidebar/useAutoCollapse.ts +81 -81
  361. package/src/ui/sidebar.vue +24 -24
  362. package/src/ui/skeleton.vue +15 -15
  363. package/src/ui/slider.vue +32 -32
  364. package/src/ui/sonner.vue +67 -67
  365. package/src/ui/switch.vue +33 -33
  366. package/src/ui/tab-content.vue +28 -28
  367. package/src/ui/tab-list.vue +31 -31
  368. package/src/ui/tab-panel.vue +19 -19
  369. package/src/ui/tab-trigger.vue +34 -34
  370. package/src/ui/tab.vue +30 -30
  371. package/src/ui/table-body.vue +16 -16
  372. package/src/ui/table-caption.vue +20 -20
  373. package/src/ui/table-cell.vue +16 -16
  374. package/src/ui/table-footer.vue +16 -16
  375. package/src/ui/table-header.vue +132 -132
  376. package/src/ui/table-row.vue +16 -16
  377. package/src/ui/table.vue +55 -55
  378. package/src/ui/tabs.vue +33 -33
  379. package/src/ui/textarea.vue +91 -91
  380. package/src/ui/threat-gauge.vue +137 -137
  381. package/src/ui/toggle.vue +69 -69
  382. package/src/ui/tooltip-content.vue +52 -52
  383. package/src/ui/tooltip-provider.vue +13 -13
  384. package/src/ui/tooltip-root.vue +9 -9
  385. package/src/ui/tooltip-trigger.vue +13 -13
  386. package/src/ui/tooltip.vue +22 -22
  387. package/src/ui/utils.ts +6 -6
  388. package/vite.config.ts +39 -39
@@ -1,54 +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>
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>
@@ -1,227 +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>
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>
@@ -1,10 +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>
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>
@@ -1,31 +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>
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>