@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,10 +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>
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>
@@ -1,38 +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>
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>
@@ -1,8 +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>
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>
@@ -1,5 +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'
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'
@@ -1,43 +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>
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>
@@ -1 +1 @@
1
- export { default as Slider } from "./Slider.vue"
1
+ export { default as Slider } from "./Slider.vue"
@@ -1,19 +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>
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>
@@ -1 +1 @@
1
- export { default as Toaster } from "./Sonner.vue"
1
+ export { default as Toaster } from "./Sonner.vue"
@@ -1,17 +1,17 @@
1
- <script setup lang="ts">
2
- import type { HTMLAttributes } from "vue"
3
- import { Loader2Icon } from "lucide-vue-next"
4
- import { cn } from "@/lib/utils"
5
-
6
- const props = defineProps<{
7
- class?: HTMLAttributes["class"]
8
- }>()
9
- </script>
10
-
11
- <template>
12
- <Loader2Icon
13
- role="status"
14
- aria-label="Loading"
15
- :class="cn('size-4 animate-spin', props.class)"
16
- />
17
- </template>
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue"
3
+ import { Loader2Icon } from "lucide-vue-next"
4
+ import { cn } from "@/lib/utils"
5
+
6
+ const props = defineProps<{
7
+ class?: HTMLAttributes["class"]
8
+ }>()
9
+ </script>
10
+
11
+ <template>
12
+ <Loader2Icon
13
+ role="status"
14
+ aria-label="Loading"
15
+ :class="cn('size-4 animate-spin', props.class)"
16
+ />
17
+ </template>
@@ -1 +1 @@
1
- export { default as Spinner } from "./Spinner.vue"
1
+ export { default as Spinner } from "./Spinner.vue"
@@ -1,38 +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>
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>
@@ -1 +1 @@
1
- export { default as Switch } from "./Switch.vue"
1
+ export { default as Switch } from "./Switch.vue"
@@ -1,16 +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>
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>
@@ -1,102 +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>
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>