@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,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>
@@ -0,0 +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>
@@ -0,0 +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>
@@ -0,0 +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>
@@ -0,0 +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>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ class: String,
4
+ });
5
+ </script>
6
+ <template>
7
+ <div :class="['sidebar-menu-sub', props.class]">
8
+ <slot />
9
+ </div>
10
+ </template>
@@ -0,0 +1,38 @@
1
+ <script setup lang="ts">
2
+ import { inject, computed } from 'vue';
3
+ const props = defineProps({
4
+ label: String,
5
+ isActive: { type: Boolean, default: false },
6
+ onClick: Function,
7
+ class: String,
8
+ });
9
+ // Gracefully handle when used outside SidebarProvider
10
+ let state = 'expanded';
11
+ let isMobile = false;
12
+ try {
13
+ const ctx = inject('sidebarContext')
14
+
15
+ if (ctx) {
16
+ state = ctx?.state;
17
+ isMobile = ctx?.isMobile;
18
+ }
19
+ } catch (e) {}
20
+ const isCollapsed = computed(() => state === 'collapsed' && !isMobile);
21
+ </script>
22
+ <template>
23
+ <template v-if="!isCollapsed">
24
+ <button
25
+ @click="props.onClick"
26
+ :class="[
27
+ 'w-full text-left px-4 py-1.5 text-sm rounded-md transition-colors duration-200',
28
+ 'hover:bg-accent/50 hover:text-foreground',
29
+ 'focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',
30
+ props.isActive ? 'bg-primary/10 text-primary font-medium' : 'text-muted-foreground',
31
+ props.class
32
+ ].filter(Boolean).join(' ')"
33
+ type="button"
34
+ >
35
+ {{ props.label }}
36
+ </button>
37
+ </template>
38
+ </template>
@@ -0,0 +1,8 @@
1
+ <script setup lang="ts">
2
+ const emit = defineEmits(['toggle']);
3
+ </script>
4
+ <template>
5
+ <button class="p-2" @click="$emit('toggle')">
6
+ <slot />
7
+ </button>
8
+ </template>
@@ -0,0 +1,5 @@
1
+ export { default as Sidebar } from './Sidebar.vue'
2
+ export { default as MenuGroup } from './MenuGroup.vue'
3
+ export { default as SidebarDemoContent } from './SidebarDemoContent.vue'
4
+ export { default as SidebarTrigger } from './SidebarTrigger.vue'
5
+ export { default as SidebarMenuItemWithIcon } from './SidebarMenuItemWithIcon.vue'
@@ -0,0 +1,43 @@
1
+ <script setup lang="ts">
2
+ import type { SliderRootEmits, SliderRootProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { SliderRange, SliderRoot, SliderThumb, SliderTrack, useForwardPropsEmits } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<SliderRootProps & { class?: HTMLAttributes["class"] }>()
9
+ const emits = defineEmits<SliderRootEmits>()
10
+
11
+ const delegatedProps = reactiveOmit(props, "class")
12
+
13
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
14
+ </script>
15
+
16
+ <template>
17
+ <SliderRoot
18
+ v-slot="{ modelValue }"
19
+ data-slot="slider"
20
+ :class="cn(
21
+ 'relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',
22
+ props.class,
23
+ )"
24
+ v-bind="forwarded"
25
+ >
26
+ <SliderTrack
27
+ data-slot="slider-track"
28
+ class="h-2 bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5"
29
+ >
30
+ <SliderRange
31
+ data-slot="slider-range"
32
+ class="h-full bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
33
+ />
34
+ </SliderTrack>
35
+
36
+ <SliderThumb
37
+ v-for="(_, key) in modelValue"
38
+ :key="key"
39
+ data-slot="slider-thumb"
40
+ class="data-[orientation=vertical]:-left-[7px] border-primary h-5 w-5 bg-slider-thumb bg-background ring-ring/50 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50"
41
+ />
42
+ </SliderRoot>
43
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Slider } from "./Slider.vue"
@@ -0,0 +1,19 @@
1
+ <script lang="ts" setup>
2
+ import type { ToasterProps } from "vue-sonner"
3
+ import { Toaster as Sonner } from "vue-sonner"
4
+
5
+ const props = defineProps<ToasterProps>()
6
+ </script>
7
+
8
+ <template>
9
+ <Sonner
10
+ class="toaster group"
11
+ v-bind="props"
12
+ :style="{
13
+ '--normal-bg': 'var(--popover)',
14
+ '--normal-text': 'var(--popover-foreground)',
15
+ '--normal-border': 'var(--border)',
16
+
17
+ }"
18
+ />
19
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Toaster } from "./Sonner.vue"
@@ -0,0 +1,38 @@
1
+ <script setup lang="ts">
2
+ import type { SwitchRootEmits, SwitchRootProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import {
6
+ SwitchRoot,
7
+
8
+ SwitchThumb,
9
+ useForwardPropsEmits,
10
+ } from "reka-ui"
11
+ import { cn } from "@/lib/utils"
12
+
13
+ const props = defineProps<SwitchRootProps & { class?: HTMLAttributes["class"] }>()
14
+
15
+ const emits = defineEmits<SwitchRootEmits>()
16
+
17
+ const delegatedProps = reactiveOmit(props, "class")
18
+
19
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
20
+ </script>
21
+
22
+ <template>
23
+ <SwitchRoot
24
+ data-slot="switch"
25
+ v-bind="forwarded"
26
+ :class="cn(
27
+ 'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-switch-background focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-6 w-11 shrink-0 items-center rounded-full border-2 border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
28
+ props.class,
29
+ )"
30
+ >
31
+ <SwitchThumb
32
+ data-slot="switch-thumb"
33
+ :class="cn('bg-switch-thumb dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block h-5 w-5 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0')"
34
+ >
35
+ <slot name="thumb" />
36
+ </SwitchThumb>
37
+ </SwitchRoot>
38
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Switch } from "./Switch.vue"
@@ -0,0 +1,16 @@
1
+ <script setup lang="ts">
2
+ import TabsContent from '@/ui/tab-content.vue';
3
+ import { cn } from '@/lib/utils';
4
+ const props = defineProps({
5
+ class: { type: String, default: '' },
6
+ });
7
+ </script>
8
+ <template>
9
+ <TabsContent
10
+ variant="card"
11
+ :class="props.class"
12
+ v-bind="$attrs"
13
+ >
14
+ <slot />
15
+ </TabsContent>
16
+ </template>
@@ -0,0 +1,102 @@
1
+ <script setup lang="ts">
2
+ import { ref, computed, watch, onMounted, onBeforeUnmount, useSlots } from 'vue';
3
+ import { TabsTrigger } from 'reka-ui';
4
+ import { cn } from '@/lib/utils';
5
+
6
+
7
+ import type { HTMLAttributes } from 'vue';
8
+ import { trigger } from '@vue/reactivity';
9
+
10
+ const props = defineProps<{
11
+ value: string | number;
12
+ class?: string;
13
+ cornerPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
14
+ disabled?: boolean;
15
+ asChild?: boolean;
16
+ as?: string;
17
+ [key: string]: any;
18
+ }>();
19
+
20
+ const { value, class: className, cornerPosition: cornerPos = 'top-right', ...rest } = props;
21
+ const cornerPosition = computed(() => cornerPos);
22
+ const triggerRef = ref<HTMLElement | null>(null);
23
+
24
+ const getClipPath = (position: string) => {
25
+ switch (position) {
26
+ case 'top-left':
27
+ return 'polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px)';
28
+ case 'top-right':
29
+ return 'polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 0 100%)';
30
+ case 'bottom-left':
31
+ return 'polygon(0 0, 100% 0, 100% 100%, 12px 100%, 0 calc(100% - 12px))';
32
+ case 'bottom-right':
33
+ return 'polygon(0 0, 100% 0, 100% calc(100% - 12px), calc(100% - 12px) 100%, 0 100%)';
34
+ default:
35
+ return 'polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 0 100%)';
36
+ }
37
+ };
38
+
39
+ const clipPathValue = computed(() => getClipPath(cornerPosition.value));
40
+ let observer: MutationObserver | null = null;
41
+
42
+ watch(() => triggerRef.value, () => {
43
+ const el = triggerRef.value;
44
+ if (!el) return;
45
+ const parent = el.$el.parentElement;
46
+ const borderDiv = parent?.querySelector('div[style*="clip-path"]') as HTMLElement | null;
47
+
48
+ const updateStyle = () => {
49
+ const isActive = el.$el.getAttribute('data-state') === 'active';
50
+
51
+ if (isActive) {
52
+ el.$el.style.clipPath = clipPathValue.value;
53
+ if (borderDiv) borderDiv.style.opacity = '1';
54
+ } else {
55
+ el.$el.style.clipPath = 'none';
56
+ if (borderDiv) borderDiv.style.opacity = '0';
57
+ }
58
+ };
59
+ updateStyle();
60
+ observer = new MutationObserver(updateStyle);
61
+ observer.observe(el.$el, { attributes: true, attributeFilter: ['data-state'] });
62
+ });
63
+
64
+ onBeforeUnmount(() => {
65
+ if (observer) observer.disconnect();
66
+ });
67
+ </script>
68
+
69
+ <template>
70
+ <div class="relative inline-flex">
71
+ <!-- Border container with corner cut - only visible when the trigger is active -->
72
+ <div
73
+ class="absolute inset-0 bg-primary transition-opacity duration-300 pointer-events-none opacity-0"
74
+ :style="{ clipPath: clipPathValue }"
75
+ />
76
+ <!-- Content container with the actual trigger -->
77
+ <TabsTrigger
78
+ ref="triggerRef"
79
+ data-slot="tabs-trigger"
80
+ :value="value"
81
+ v-bind="rest"
82
+ :class="cn(
83
+ 'corner-cut-trigger relative flex items-center justify-center gap-2 px-3 py-1.5 transition-all duration-300',
84
+ 'min-w-0 max-w-48 w-auto shrink-0',
85
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
86
+ 'disabled:pointer-events-none disabled:opacity-50',
87
+ 'text-muted-foreground hover:text-foreground',
88
+ 'data-[state=active]:text-foreground data-[state=active]:bg-background',
89
+ 'data-[state=active]:m-[1px]',
90
+ '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4',
91
+ '[&>span]:truncate [&>span]:block',
92
+ className,
93
+ )"
94
+ :data-corner-position="cornerPosition"
95
+ >
96
+ <slot />
97
+ </TabsTrigger>
98
+ </div>
99
+ </template>
100
+
101
+ <style scoped>
102
+ </style>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue';
3
+ import { cn } from '@/lib/utils';
4
+ import TabsList from '@/ui/tab-list.vue';
5
+
6
+ const props = defineProps({
7
+ cols: { type: Number, default: 2 },
8
+ class: { type: String, default: '' },
9
+ });
10
+
11
+ const gridClass = computed(() =>
12
+ cn(
13
+ props.cols === 2 && 'grid-cols-2',
14
+ props.cols === 3 && 'grid-cols-3',
15
+ props.cols === 4 && 'grid-cols-4',
16
+ props.cols === 5 && 'grid-cols-5',
17
+ props.cols === 6 && 'grid-cols-6',
18
+ props.class
19
+ )
20
+ );
21
+ </script>
22
+ <template>
23
+ <TabsList
24
+ variant="grid"
25
+ :class="gridClass"
26
+ v-bind="$attrs"
27
+ >
28
+ <slot />
29
+ </TabsList>
30
+ </template>
@@ -0,0 +1,8 @@
1
+ <template>
2
+ <div class="flex overflow-x-auto gap-1">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+ <script setup lang="ts">
7
+ // No props needed
8
+ </script>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { TabsRootEmits, TabsRootProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { TabsRoot, useForwardPropsEmits } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<TabsRootProps & { class?: HTMLAttributes["class"] }>()
9
+ const emits = defineEmits<TabsRootEmits>()
10
+
11
+ const delegatedProps = reactiveOmit(props, "class")
12
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
13
+ </script>
14
+
15
+ <template>
16
+ <TabsRoot
17
+ data-slot="tabs"
18
+ v-bind="forwarded"
19
+ :class="cn('flex flex-col', props.class)"
20
+ >
21
+ <slot />
22
+ </TabsRoot>
23
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import type { TabsContentProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { TabsContent } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<TabsContentProps & { class?: HTMLAttributes["class"] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, "class")
11
+ </script>
12
+
13
+ <template>
14
+ <TabsContent
15
+ data-slot="tabs-content"
16
+ :class="cn('flex-1 outline-none', props.class)"
17
+ v-bind="delegatedProps"
18
+ >
19
+ <slot />
20
+ </TabsContent>
21
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import type { TabsListProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { TabsList } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<TabsListProps & { class?: HTMLAttributes["class"] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, "class")
11
+ </script>
12
+
13
+ <template>
14
+ <TabsList
15
+ data-slot="tabs-list"
16
+ v-bind="delegatedProps"
17
+ :class="cn(
18
+ 'bg-muted text-muted-foreground inline-flex items-center justify-center p-[3px]',
19
+ props.class,
20
+ )"
21
+ >
22
+ <slot />
23
+ </TabsList>
24
+ </template>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import type { TabsTriggerProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { TabsTrigger as RekaTabsTrigger } from "reka-ui"
5
+ import { cn } from "@/lib/utils"
6
+
7
+ const props = defineProps<TabsTriggerProps & { class?: HTMLAttributes["class"]; variant?: "default" | "vertical" }>()
8
+ </script>
9
+
10
+ <template>
11
+ <RekaTabsTrigger
12
+ data-slot="tabs-trigger"
13
+ v-bind="props"
14
+ :class="cn(
15
+ 'relative inline-flex items-center justify-center gap-2 px-4 py-2 transition-all duration-200 ease-out',
16
+ 'min-w-0 max-w-48 w-auto shrink-0',
17
+ 'text-muted-foreground hover:text-foreground',
18
+ 'border-b-2 border-transparent',
19
+ 'data-[state=active]:text-primary data-[state=active]:border-primary',
20
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 focus-visible:ring-offset-2',
21
+ 'disabled:pointer-events-none disabled:opacity-50',
22
+ '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
23
+ '[&>span]:truncate [&>span]:block',
24
+ props.variant === 'vertical' && 'w-full justify-start border-b-0 border-r-2',
25
+ props.class,
26
+ )"
27
+ >
28
+ <slot />
29
+ </RekaTabsTrigger>
30
+ </template>