@bl33dz/fa814698dcde12f86a37ac31dd3aedf9 1.0.6 → 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 +97 -94
  4. package/dist/perisai-ui.umd.js +1 -1
  5. package/package.json +45 -45
  6. package/src/globals.css +575 -575
  7. package/src/index.ts +178 -177
  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 -17
  187. package/src/shadcn/spinner/index.ts +1 -1
  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,33 +1,33 @@
1
- <script setup lang="ts">
2
- import type { SelectTriggerProps } from "reka-ui"
3
- import type { HTMLAttributes } from "vue"
4
- import { reactiveOmit } from "@vueuse/core"
5
- import { ChevronDown } from "lucide-vue-next"
6
- import { SelectIcon, SelectTrigger, useForwardProps } from "reka-ui"
7
- import { cn } from "@/lib/utils"
8
-
9
- const props = withDefaults(
10
- defineProps<SelectTriggerProps & { class?: HTMLAttributes["class"], size?: "sm" | "default" }>(),
11
- { size: "default" },
12
- )
13
-
14
- const delegatedProps = reactiveOmit(props, "class", "size")
15
- const forwardedProps = useForwardProps(delegatedProps)
16
- </script>
17
-
18
- <template>
19
- <SelectTrigger
20
- data-slot="select-trigger"
21
- :data-size="size"
22
- v-bind="forwardedProps"
23
- :class="cn(
24
- 'border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*=\'text-\'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
25
- props.class,
26
- )"
27
- >
28
- <slot />
29
- <SelectIcon as-child>
30
- <ChevronDown class="size-4 opacity-50" />
31
- </SelectIcon>
32
- </SelectTrigger>
33
- </template>
1
+ <script setup lang="ts">
2
+ import type { SelectTriggerProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { ChevronDown } from "lucide-vue-next"
6
+ import { SelectIcon, SelectTrigger, useForwardProps } from "reka-ui"
7
+ import { cn } from "@/lib/utils"
8
+
9
+ const props = withDefaults(
10
+ defineProps<SelectTriggerProps & { class?: HTMLAttributes["class"], size?: "sm" | "default" }>(),
11
+ { size: "default" },
12
+ )
13
+
14
+ const delegatedProps = reactiveOmit(props, "class", "size")
15
+ const forwardedProps = useForwardProps(delegatedProps)
16
+ </script>
17
+
18
+ <template>
19
+ <SelectTrigger
20
+ data-slot="select-trigger"
21
+ :data-size="size"
22
+ v-bind="forwardedProps"
23
+ :class="cn(
24
+ 'border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*=\'text-\'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
25
+ props.class,
26
+ )"
27
+ >
28
+ <slot />
29
+ <SelectIcon as-child>
30
+ <ChevronDown class="size-4 opacity-50" />
31
+ </SelectIcon>
32
+ </SelectTrigger>
33
+ </template>
@@ -1,15 +1,15 @@
1
- <script setup lang="ts">
2
- import type { SelectValueProps } from "reka-ui"
3
- import { SelectValue } from "reka-ui"
4
-
5
- const props = defineProps<SelectValueProps>()
6
- </script>
7
-
8
- <template>
9
- <SelectValue
10
- data-slot="select-value"
11
- v-bind="props"
12
- >
13
- <slot />
14
- </SelectValue>
15
- </template>
1
+ <script setup lang="ts">
2
+ import type { SelectValueProps } from "reka-ui"
3
+ import { SelectValue } from "reka-ui"
4
+
5
+ const props = defineProps<SelectValueProps>()
6
+ </script>
7
+
8
+ <template>
9
+ <SelectValue
10
+ data-slot="select-value"
11
+ v-bind="props"
12
+ >
13
+ <slot />
14
+ </SelectValue>
15
+ </template>
@@ -1,11 +1,11 @@
1
- export { default as Select } from "./Select.vue"
2
- export { default as SelectContent } from "./SelectContent.vue"
3
- export { default as SelectGroup } from "./SelectGroup.vue"
4
- export { default as SelectItem } from "./SelectItem.vue"
5
- export { default as SelectItemText } from "./SelectItemText.vue"
6
- export { default as SelectLabel } from "./SelectLabel.vue"
7
- export { default as SelectScrollDownButton } from "./SelectScrollDownButton.vue"
8
- export { default as SelectScrollUpButton } from "./SelectScrollUpButton.vue"
9
- export { default as SelectSeparator } from "./SelectSeparator.vue"
10
- export { default as SelectTrigger } from "./SelectTrigger.vue"
11
- export { default as SelectValue } from "./SelectValue.vue"
1
+ export { default as Select } from "./Select.vue"
2
+ export { default as SelectContent } from "./SelectContent.vue"
3
+ export { default as SelectGroup } from "./SelectGroup.vue"
4
+ export { default as SelectItem } from "./SelectItem.vue"
5
+ export { default as SelectItemText } from "./SelectItemText.vue"
6
+ export { default as SelectLabel } from "./SelectLabel.vue"
7
+ export { default as SelectScrollDownButton } from "./SelectScrollDownButton.vue"
8
+ export { default as SelectScrollUpButton } from "./SelectScrollUpButton.vue"
9
+ export { default as SelectSeparator } from "./SelectSeparator.vue"
10
+ export { default as SelectTrigger } from "./SelectTrigger.vue"
11
+ export { default as SelectValue } from "./SelectValue.vue"
@@ -1,31 +1,31 @@
1
- <script setup lang="ts">
2
- import type { SeparatorProps } from "reka-ui"
3
- import type { HTMLAttributes } from "vue"
4
- import { reactiveOmit } from "@vueuse/core"
5
- import { Separator } from "reka-ui"
6
- import { cn } from "@/lib/utils"
7
-
8
- const props = withDefaults(defineProps<
9
- SeparatorProps & { class?: HTMLAttributes["class"] }
10
- >(), {
11
- orientation: "horizontal",
12
- decorative: true,
13
- })
14
-
15
- const delegatedProps = reactiveOmit(props, "class")
16
- </script>
17
-
18
- <template>
19
- <Separator
20
- data-slot="separator-root"
21
- v-bind="delegatedProps"
22
- :class="
23
- cn(
24
- 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',
25
- props.class,
26
- )
27
- "
28
- >
29
- <slot />
30
- </Separator>
31
- </template>
1
+ <script setup lang="ts">
2
+ import type { SeparatorProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { Separator } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = withDefaults(defineProps<
9
+ SeparatorProps & { class?: HTMLAttributes["class"] }
10
+ >(), {
11
+ orientation: "horizontal",
12
+ decorative: true,
13
+ })
14
+
15
+ const delegatedProps = reactiveOmit(props, "class")
16
+ </script>
17
+
18
+ <template>
19
+ <Separator
20
+ data-slot="separator-root"
21
+ v-bind="delegatedProps"
22
+ :class="
23
+ cn(
24
+ 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',
25
+ props.class,
26
+ )
27
+ "
28
+ >
29
+ <slot />
30
+ </Separator>
31
+ </template>
@@ -1 +1 @@
1
- export { default as Separator } from "./Separator.vue"
1
+ export { default as Separator } from "./Separator.vue"
@@ -1,28 +1,28 @@
1
- <script setup lang="ts">
2
- import SidebarMenuGroupWithLabel from './SidebarMenuGroupWithLabel.vue';
3
- import MenuItemRenderer from './MenuItemRenderer.vue';
4
-
5
- const props = defineProps({
6
- label: String,
7
- items: Array,
8
- activeItem: String,
9
- activeSubItem: String,
10
- onItemClick: Function,
11
- onSubItemClick: Function,
12
- });
13
- </script>
14
- <template>
15
- <SidebarMenuGroupWithLabel :label="props.label">
16
- <div class="flex flex-col items-start ml-1">
17
- <MenuItemRenderer
18
- v-for="item in props.items"
19
- :key="item.id"
20
- :item="item"
21
- :activeItem="props.activeItem"
22
- :activeSubItem="props.activeSubItem"
23
- :onItemClick="props.onItemClick"
24
- :onSubItemClick="props.onSubItemClick"
25
- />
26
- </div>
27
- </SidebarMenuGroupWithLabel>
28
- </template>
1
+ <script setup lang="ts">
2
+ import SidebarMenuGroupWithLabel from './SidebarMenuGroupWithLabel.vue';
3
+ import MenuItemRenderer from './MenuItemRenderer.vue';
4
+
5
+ const props = defineProps({
6
+ label: String,
7
+ items: Array,
8
+ activeItem: String,
9
+ activeSubItem: String,
10
+ onItemClick: Function,
11
+ onSubItemClick: Function,
12
+ });
13
+ </script>
14
+ <template>
15
+ <SidebarMenuGroupWithLabel :label="props.label">
16
+ <div class="flex flex-col items-start ml-1">
17
+ <MenuItemRenderer
18
+ v-for="item in props.items"
19
+ :key="item.id"
20
+ :item="item"
21
+ :activeItem="props.activeItem"
22
+ :activeSubItem="props.activeSubItem"
23
+ :onItemClick="props.onItemClick"
24
+ :onSubItemClick="props.onSubItemClick"
25
+ />
26
+ </div>
27
+ </SidebarMenuGroupWithLabel>
28
+ </template>
@@ -1,23 +1,23 @@
1
- <script setup lang="ts">
2
- import { SidebarMenuItemWithIcon } from './index';
3
- import SidebarMenuSub from '@/ui/sidebar/SidebarMenuSub.vue';
4
- import SidebarMenuSubItemStyled from './SidebarMenuSubItemStyled.vue';
5
-
6
- const props = defineProps({
7
- item: { type: Object, required: true },
8
- activeItem: String,
9
- activeSubItem: String,
10
- onItemClick: Function,
11
- onSubItemClick: Function,
12
- });
13
- </script>
14
- <template>
15
- <SidebarMenuItemWithIcon :icon="props.item.icon" :label="props.item.label" :badge="props.item.badge"
16
- :isActive="props.activeItem === props.item.id"
17
- @click="() => props.onItemClick && props.onItemClick(props.item.id)" />
18
- <SidebarMenuSub v-if="props.item.submenu && props.activeItem === props.item.id" class="relative w-full">
19
- <SidebarMenuSubItemStyled v-for="subItem in props.item.submenu" :key="subItem.id" :label="subItem.label"
20
- :isActive="props.activeSubItem === subItem.id"
21
- @click="() => props.onSubItemClick && props.onSubItemClick(subItem.id)" />
22
- </SidebarMenuSub>
23
- </template>
1
+ <script setup lang="ts">
2
+ import { SidebarMenuItemWithIcon } from './index';
3
+ import SidebarMenuSub from '@/ui/sidebar/SidebarMenuSub.vue';
4
+ import SidebarMenuSubItemStyled from './SidebarMenuSubItemStyled.vue';
5
+
6
+ const props = defineProps({
7
+ item: { type: Object, required: true },
8
+ activeItem: String,
9
+ activeSubItem: String,
10
+ onItemClick: Function,
11
+ onSubItemClick: Function,
12
+ });
13
+ </script>
14
+ <template>
15
+ <SidebarMenuItemWithIcon :icon="props.item.icon" :label="props.item.label" :badge="props.item.badge"
16
+ :isActive="props.activeItem === props.item.id"
17
+ @click="() => props.onItemClick && props.onItemClick(props.item.id)" />
18
+ <SidebarMenuSub v-if="props.item.submenu && props.activeItem === props.item.id" class="relative w-full">
19
+ <SidebarMenuSubItemStyled v-for="subItem in props.item.submenu" :key="subItem.id" :label="subItem.label"
20
+ :isActive="props.activeSubItem === subItem.id"
21
+ @click="() => props.onSubItemClick && props.onSubItemClick(subItem.id)" />
22
+ </SidebarMenuSub>
23
+ </template>
@@ -1,14 +1,14 @@
1
- <script setup lang="ts">
2
- import { cn } from '@/lib/utils';
3
- const props = defineProps({
4
- class: { type: String, default: '' },
5
- height: { type: String, default: '' },
6
- footerUser: { type: String, default: '' },
7
- });
8
- </script>
9
- <template>
10
- <aside :class="cn('flex flex-col bg-background border-r w-64', props.class)" :style="props.height ? { height: props.height } : {}">
11
- <slot />
12
- <footer v-if="props.footerUser" class="mt-auto p-4 border-t text-xs text-muted-foreground">{{ props.footerUser }}</footer>
13
- </aside>
14
- </template>
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ const props = defineProps({
4
+ class: { type: String, default: '' },
5
+ height: { type: String, default: '' },
6
+ footerUser: { type: String, default: '' },
7
+ });
8
+ </script>
9
+ <template>
10
+ <aside :class="cn('flex flex-col bg-background border-r w-64', props.class)" :style="props.height ? { height: props.height } : {}">
11
+ <slot />
12
+ <footer v-if="props.footerUser" class="mt-auto p-4 border-t text-xs text-muted-foreground">{{ props.footerUser }}</footer>
13
+ </aside>
14
+ </template>
@@ -1,26 +1,26 @@
1
- <script setup lang="ts">
2
- const props = defineProps({
3
- title: { type: String, default: '' },
4
- description: { type: String, default: '' },
5
- statusText: { type: String, default: '' },
6
- features: { type: Array, default: () => [] },
7
- });
8
- </script>
9
- <template>
10
- <div class="space-y-4">
11
- <div class="flex items-center gap-3">
12
- <div class="w-2 h-2 rounded-full bg-primary" />
13
- <h3 class="text-lg font-medium">{{ props.title }}</h3>
14
- <span v-if="props.statusText" class="text-sm text-muted-foreground">
15
- {{ props.statusText }}
16
- </span>
17
- </div>
18
- <p class="text-muted-foreground">{{ props.description }}</p>
19
- <div class="p-4 bg-muted/50 rounded-lg">
20
- <h4 class="font-medium mb-2">Features:</h4>
21
- <ul class="space-y-1 text-sm text-muted-foreground">
22
- <li v-for="(feature, index) in props.features" :key="index">• {{ feature }}</li>
23
- </ul>
24
- </div>
25
- </div>
26
- </template>
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ title: { type: String, default: '' },
4
+ description: { type: String, default: '' },
5
+ statusText: { type: String, default: '' },
6
+ features: { type: Array, default: () => [] },
7
+ });
8
+ </script>
9
+ <template>
10
+ <div class="space-y-4">
11
+ <div class="flex items-center gap-3">
12
+ <div class="w-2 h-2 rounded-full bg-primary" />
13
+ <h3 class="text-lg font-medium">{{ props.title }}</h3>
14
+ <span v-if="props.statusText" class="text-sm text-muted-foreground">
15
+ {{ props.statusText }}
16
+ </span>
17
+ </div>
18
+ <p class="text-muted-foreground">{{ props.description }}</p>
19
+ <div class="p-4 bg-muted/50 rounded-lg">
20
+ <h4 class="font-medium mb-2">Features:</h4>
21
+ <ul class="space-y-1 text-sm text-muted-foreground">
22
+ <li v-for="(feature, index) in props.features" :key="index">• {{ feature }}</li>
23
+ </ul>
24
+ </div>
25
+ </div>
26
+ </template>
@@ -1,29 +1,29 @@
1
- <script setup lang="ts">
2
- import { computed, inject } from 'vue';
3
- import Separator from '@/ui/separator.vue';
4
-
5
- const props = defineProps({
6
- label: String,
7
- class: String,
8
- });
9
-
10
- const sidebar = inject('sidebarContext');
11
- const isCollapsed = computed(() => sidebar && sidebar.state === 'collapsed' && !sidebar.isMobile);
12
- </script>
13
- <template>
14
- <div :class="['space-y-1 mt-3 first:mt-0', props.class]">
15
- <template v-if="isCollapsed">
16
- <div class="h-[16px] flex items-center mb-1">
17
- <Separator />
18
- </div>
19
- </template>
20
- <template v-else>
21
- <h3 class="px-2 text-xs font-medium uppercase tracking-wider text-muted-foreground line-clamp-1">
22
- {{ props.label }}
23
- </h3>
24
- </template>
25
- <div class="space-y-1">
26
- <slot />
27
- </div>
28
- </div>
29
- </template>
1
+ <script setup lang="ts">
2
+ import { computed, inject } from 'vue';
3
+ import Separator from '@/ui/separator.vue';
4
+
5
+ const props = defineProps({
6
+ label: String,
7
+ class: String,
8
+ });
9
+
10
+ const sidebar = inject('sidebarContext');
11
+ const isCollapsed = computed(() => sidebar && sidebar.state === 'collapsed' && !sidebar.isMobile);
12
+ </script>
13
+ <template>
14
+ <div :class="['space-y-1 mt-3 first:mt-0', props.class]">
15
+ <template v-if="isCollapsed">
16
+ <div class="h-[16px] flex items-center mb-1">
17
+ <Separator />
18
+ </div>
19
+ </template>
20
+ <template v-else>
21
+ <h3 class="px-2 text-xs font-medium uppercase tracking-wider text-muted-foreground line-clamp-1">
22
+ {{ props.label }}
23
+ </h3>
24
+ </template>
25
+ <div class="space-y-1">
26
+ <slot />
27
+ </div>
28
+ </div>
29
+ </template>
@@ -1,103 +1,103 @@
1
- <script setup lang="ts">
2
- import { computed, inject } from 'vue';
3
- import { cn } from '@/lib/utils';
4
- import Tooltip from '@/ui/tooltip.vue';
5
- import TooltipTrigger from '@/ui/tooltip-trigger.vue';
6
- import TooltipContent from '@/ui/tooltip-content.vue';
7
-
8
- const props = defineProps({
9
- icon: [Object, Function],
10
- label: String,
11
- isActive: { type: Boolean, default: false },
12
- badge: String,
13
- onClick: Function,
14
- class: String,
15
- });
16
-
17
- // Inject sidebar context
18
- const sidebar = inject('sidebarContext');
19
- const isCollapsed = computed(() => sidebar && sidebar.state === 'collapsed' && !sidebar.isMobile);
20
-
21
- const baseClasses = computed(() =>
22
- cn(
23
- 'relative w-full flex items-center gap-2 pl-2 pr-3 py-2 rounded-lg text-left transition-all duration-200 group hover:bg-accent/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',
24
- isCollapsed.value && 'justify-center px-2 w-10 h-10 min-w-10',
25
- props.class
26
- )
27
- );
28
-
29
- const stateClasses = computed(() =>
30
- cn(
31
- props.isActive
32
- ? 'bg-primary/10 text-primary'
33
- : 'text-muted-foreground hover:text-foreground'
34
- )
35
- );
36
-
37
- const iconClasses = computed(() =>
38
- cn(
39
- 'relative w-6 h-6 rounded-md flex items-center justify-center transition-colors duration-200',
40
- isCollapsed.value
41
- ? 'bg-transparent'
42
- : props.isActive
43
- ? 'bg-primary/15 text-primary'
44
- : 'bg-muted group-hover:bg-accent text-muted-foreground group-hover:text-foreground'
45
- )
46
- );
47
- </script>
48
- <template>
49
- <Tooltip v-if="isCollapsed">
50
- <TooltipTrigger as-child>
51
- <button
52
- :class="cn(baseClasses, stateClasses)"
53
- @click="props.onClick"
54
- >
55
- <div :class="iconClasses">
56
- <component v-if="props.icon" :is="props.icon" class="w-4 h-4" />
57
- </div>
58
- </button>
59
- </TooltipTrigger>
60
- <TooltipContent side="right" align="center">
61
- <p>{{ props.label }}</p>
62
- <span v-if="props.badge" class="ml-2 text-xs opacity-60">({{ props.badge }})</span>
63
- </TooltipContent>
64
- </Tooltip>
65
- <button
66
- v-else
67
- type="button"
68
- @click="(e) => props.onClick && props.onClick(e)"
69
- :class="cn(baseClasses, stateClasses, props.class)"
70
- >
71
- <!-- Icon Container -->
72
- <div
73
- :class="cn(
74
- 'relative w-6 h-6 rounded-md flex items-center justify-center transition-colors duration-200',
75
- isCollapsed
76
- ? 'bg-transparent'
77
- : props.isActive
78
- ? 'bg-primary/15 text-primary'
79
- : 'bg-muted group-hover:bg-accent text-muted-foreground group-hover:text-foreground'
80
- )"
81
- >
82
- <component v-if="props.icon" :is="props.icon" class="w-4 h-4" />
83
- </div>
84
-
85
- <!-- Label - Hidden when collapsed -->
86
- <span v-if="!isCollapsed" class="flex-1 text-sm font-medium leading-none truncate">
87
- {{ props.label }}
88
- </span>
89
-
90
- <!-- Badge - Hidden when collapsed -->
91
- <span
92
- v-if="!isCollapsed && props.badge"
93
- :class="cn(
94
- 'absolute right-3 inline-flex items-center justify-center px-2 py-0.5 text-xs font-medium rounded-full min-w-[1.25rem] h-5',
95
- props.isActive
96
- ? 'bg-primary/20 text-primary'
97
- : 'bg-muted text-muted-foreground group-hover:bg-accent group-hover:text-foreground'
98
- )"
99
- >
100
- {{ props.badge }}
101
- </span>
102
- </button>
103
- </template>
1
+ <script setup lang="ts">
2
+ import { computed, inject } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+ import Tooltip from '@/ui/tooltip.vue';
5
+ import TooltipTrigger from '@/ui/tooltip-trigger.vue';
6
+ import TooltipContent from '@/ui/tooltip-content.vue';
7
+
8
+ const props = defineProps({
9
+ icon: [Object, Function],
10
+ label: String,
11
+ isActive: { type: Boolean, default: false },
12
+ badge: String,
13
+ onClick: Function,
14
+ class: String,
15
+ });
16
+
17
+ // Inject sidebar context
18
+ const sidebar = inject('sidebarContext');
19
+ const isCollapsed = computed(() => sidebar && sidebar.state === 'collapsed' && !sidebar.isMobile);
20
+
21
+ const baseClasses = computed(() =>
22
+ cn(
23
+ 'relative w-full flex items-center gap-2 pl-2 pr-3 py-2 rounded-lg text-left transition-all duration-200 group hover:bg-accent/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',
24
+ isCollapsed.value && 'justify-center px-2 w-10 h-10 min-w-10',
25
+ props.class
26
+ )
27
+ );
28
+
29
+ const stateClasses = computed(() =>
30
+ cn(
31
+ props.isActive
32
+ ? 'bg-primary/10 text-primary'
33
+ : 'text-muted-foreground hover:text-foreground'
34
+ )
35
+ );
36
+
37
+ const iconClasses = computed(() =>
38
+ cn(
39
+ 'relative w-6 h-6 rounded-md flex items-center justify-center transition-colors duration-200',
40
+ isCollapsed.value
41
+ ? 'bg-transparent'
42
+ : props.isActive
43
+ ? 'bg-primary/15 text-primary'
44
+ : 'bg-muted group-hover:bg-accent text-muted-foreground group-hover:text-foreground'
45
+ )
46
+ );
47
+ </script>
48
+ <template>
49
+ <Tooltip v-if="isCollapsed">
50
+ <TooltipTrigger as-child>
51
+ <button
52
+ :class="cn(baseClasses, stateClasses)"
53
+ @click="props.onClick"
54
+ >
55
+ <div :class="iconClasses">
56
+ <component v-if="props.icon" :is="props.icon" class="w-4 h-4" />
57
+ </div>
58
+ </button>
59
+ </TooltipTrigger>
60
+ <TooltipContent side="right" align="center">
61
+ <p>{{ props.label }}</p>
62
+ <span v-if="props.badge" class="ml-2 text-xs opacity-60">({{ props.badge }})</span>
63
+ </TooltipContent>
64
+ </Tooltip>
65
+ <button
66
+ v-else
67
+ type="button"
68
+ @click="(e) => props.onClick && props.onClick(e)"
69
+ :class="cn(baseClasses, stateClasses, props.class)"
70
+ >
71
+ <!-- Icon Container -->
72
+ <div
73
+ :class="cn(
74
+ 'relative w-6 h-6 rounded-md flex items-center justify-center transition-colors duration-200',
75
+ isCollapsed
76
+ ? 'bg-transparent'
77
+ : props.isActive
78
+ ? 'bg-primary/15 text-primary'
79
+ : 'bg-muted group-hover:bg-accent text-muted-foreground group-hover:text-foreground'
80
+ )"
81
+ >
82
+ <component v-if="props.icon" :is="props.icon" class="w-4 h-4" />
83
+ </div>
84
+
85
+ <!-- Label - Hidden when collapsed -->
86
+ <span v-if="!isCollapsed" class="flex-1 text-sm font-medium leading-none truncate">
87
+ {{ props.label }}
88
+ </span>
89
+
90
+ <!-- Badge - Hidden when collapsed -->
91
+ <span
92
+ v-if="!isCollapsed && props.badge"
93
+ :class="cn(
94
+ 'absolute right-3 inline-flex items-center justify-center px-2 py-0.5 text-xs font-medium rounded-full min-w-[1.25rem] h-5',
95
+ props.isActive
96
+ ? 'bg-primary/20 text-primary'
97
+ : 'bg-muted text-muted-foreground group-hover:bg-accent group-hover:text-foreground'
98
+ )"
99
+ >
100
+ {{ props.badge }}
101
+ </span>
102
+ </button>
103
+ </template>