create-nala 3.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 (316) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/dist/index.js +227 -0
  4. package/package.json +48 -0
  5. package/template/.env.example +45 -0
  6. package/template/_gitignore +33 -0
  7. package/template/components.json +24 -0
  8. package/template/index.html +30 -0
  9. package/template/package.json +51 -0
  10. package/template/public/favicon.svg +15 -0
  11. package/template/public/icons.svg +24 -0
  12. package/template/public/img/avatar.webp +0 -0
  13. package/template/public/screenshot.png +0 -0
  14. package/template/src/App.vue +15 -0
  15. package/template/src/auto-imports.d.ts +691 -0
  16. package/template/src/components/AppLogo.vue +159 -0
  17. package/template/src/components/EmptyState.vue +60 -0
  18. package/template/src/components/PageHeader.vue +60 -0
  19. package/template/src/components/layout/AppNavbar.vue +159 -0
  20. package/template/src/components/layout/AppSidebar.vue +74 -0
  21. package/template/src/components/layout/CommandSearchDialog.vue +120 -0
  22. package/template/src/components/ui/accordion/Accordion.vue +15 -0
  23. package/template/src/components/ui/accordion/AccordionContent.vue +20 -0
  24. package/template/src/components/ui/accordion/AccordionItem.vue +20 -0
  25. package/template/src/components/ui/accordion/AccordionTrigger.vue +34 -0
  26. package/template/src/components/ui/accordion/index.ts +4 -0
  27. package/template/src/components/ui/alert/Alert.vue +21 -0
  28. package/template/src/components/ui/alert/AlertDescription.vue +17 -0
  29. package/template/src/components/ui/alert/AlertTitle.vue +17 -0
  30. package/template/src/components/ui/alert/index.ts +30 -0
  31. package/template/src/components/ui/alert-dialog/AlertDialog.vue +15 -0
  32. package/template/src/components/ui/alert-dialog/AlertDialogAction.vue +18 -0
  33. package/template/src/components/ui/alert-dialog/AlertDialogCancel.vue +25 -0
  34. package/template/src/components/ui/alert-dialog/AlertDialogContent.vue +44 -0
  35. package/template/src/components/ui/alert-dialog/AlertDialogDescription.vue +23 -0
  36. package/template/src/components/ui/alert-dialog/AlertDialogFooter.vue +22 -0
  37. package/template/src/components/ui/alert-dialog/AlertDialogHeader.vue +17 -0
  38. package/template/src/components/ui/alert-dialog/AlertDialogTitle.vue +21 -0
  39. package/template/src/components/ui/alert-dialog/AlertDialogTrigger.vue +12 -0
  40. package/template/src/components/ui/alert-dialog/index.ts +9 -0
  41. package/template/src/components/ui/avatar/Avatar.vue +50 -0
  42. package/template/src/components/ui/avatar/AvatarFallback.vue +21 -0
  43. package/template/src/components/ui/avatar/AvatarGroup.vue +69 -0
  44. package/template/src/components/ui/avatar/AvatarImage.vue +16 -0
  45. package/template/src/components/ui/avatar/index.ts +4 -0
  46. package/template/src/components/ui/badge/Badge.vue +40 -0
  47. package/template/src/components/ui/badge/index.ts +45 -0
  48. package/template/src/components/ui/breadcrumb/Breadcrumb.vue +17 -0
  49. package/template/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +23 -0
  50. package/template/src/components/ui/breadcrumb/BreadcrumbItem.vue +17 -0
  51. package/template/src/components/ui/breadcrumb/BreadcrumbLink.vue +21 -0
  52. package/template/src/components/ui/breadcrumb/BreadcrumbList.vue +17 -0
  53. package/template/src/components/ui/breadcrumb/BreadcrumbPage.vue +20 -0
  54. package/template/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +22 -0
  55. package/template/src/components/ui/breadcrumb/index.ts +7 -0
  56. package/template/src/components/ui/button/Button.spec.ts +46 -0
  57. package/template/src/components/ui/button/Button.vue +31 -0
  58. package/template/src/components/ui/button/index.ts +41 -0
  59. package/template/src/components/ui/calendar/Calendar.vue +106 -0
  60. package/template/src/components/ui/calendar/index.ts +1 -0
  61. package/template/src/components/ui/card/Card.vue +29 -0
  62. package/template/src/components/ui/card/CardAction.vue +17 -0
  63. package/template/src/components/ui/card/CardContent.vue +17 -0
  64. package/template/src/components/ui/card/CardDescription.vue +17 -0
  65. package/template/src/components/ui/card/CardFooter.vue +17 -0
  66. package/template/src/components/ui/card/CardHeader.vue +29 -0
  67. package/template/src/components/ui/card/CardTitle.vue +17 -0
  68. package/template/src/components/ui/card/index.ts +7 -0
  69. package/template/src/components/ui/chart/AreaChart.vue +143 -0
  70. package/template/src/components/ui/chart/BarChart.vue +142 -0
  71. package/template/src/components/ui/chart/DonutChart.vue +75 -0
  72. package/template/src/components/ui/chart/LineChart.vue +132 -0
  73. package/template/src/components/ui/chart/index.ts +4 -0
  74. package/template/src/components/ui/checkbox/Checkbox.vue +57 -0
  75. package/template/src/components/ui/checkbox/index.ts +1 -0
  76. package/template/src/components/ui/collapsible/Collapsible.vue +15 -0
  77. package/template/src/components/ui/collapsible/CollapsibleContent.vue +18 -0
  78. package/template/src/components/ui/collapsible/CollapsibleTrigger.vue +12 -0
  79. package/template/src/components/ui/collapsible/index.ts +3 -0
  80. package/template/src/components/ui/command/Command.vue +88 -0
  81. package/template/src/components/ui/command/CommandDialog.vue +31 -0
  82. package/template/src/components/ui/command/CommandEmpty.vue +27 -0
  83. package/template/src/components/ui/command/CommandGroup.vue +45 -0
  84. package/template/src/components/ui/command/CommandInput.vue +39 -0
  85. package/template/src/components/ui/command/CommandItem.vue +76 -0
  86. package/template/src/components/ui/command/CommandList.vue +25 -0
  87. package/template/src/components/ui/command/CommandSeparator.vue +21 -0
  88. package/template/src/components/ui/command/CommandShortcut.vue +17 -0
  89. package/template/src/components/ui/command/index.ts +25 -0
  90. package/template/src/components/ui/context-menu/ContextMenu.vue +15 -0
  91. package/template/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +36 -0
  92. package/template/src/components/ui/context-menu/ContextMenuContent.vue +33 -0
  93. package/template/src/components/ui/context-menu/ContextMenuGroup.vue +12 -0
  94. package/template/src/components/ui/context-menu/ContextMenuItem.vue +36 -0
  95. package/template/src/components/ui/context-menu/ContextMenuLabel.vue +25 -0
  96. package/template/src/components/ui/context-menu/ContextMenuRadioGroup.vue +18 -0
  97. package/template/src/components/ui/context-menu/ContextMenuRadioItem.vue +36 -0
  98. package/template/src/components/ui/context-menu/ContextMenuSeparator.vue +18 -0
  99. package/template/src/components/ui/context-menu/ContextMenuShortcut.vue +17 -0
  100. package/template/src/components/ui/context-menu/ContextMenuSub.vue +15 -0
  101. package/template/src/components/ui/context-menu/ContextMenuSubContent.vue +36 -0
  102. package/template/src/components/ui/context-menu/ContextMenuSubTrigger.vue +32 -0
  103. package/template/src/components/ui/context-menu/ContextMenuTrigger.vue +13 -0
  104. package/template/src/components/ui/context-menu/index.ts +14 -0
  105. package/template/src/components/ui/date-picker/DatePicker.vue +233 -0
  106. package/template/src/components/ui/date-picker/index.ts +1 -0
  107. package/template/src/components/ui/dialog/Dialog.vue +19 -0
  108. package/template/src/components/ui/dialog/DialogClose.vue +15 -0
  109. package/template/src/components/ui/dialog/DialogContent.vue +53 -0
  110. package/template/src/components/ui/dialog/DialogDescription.vue +23 -0
  111. package/template/src/components/ui/dialog/DialogFooter.vue +27 -0
  112. package/template/src/components/ui/dialog/DialogHeader.vue +17 -0
  113. package/template/src/components/ui/dialog/DialogOverlay.vue +21 -0
  114. package/template/src/components/ui/dialog/DialogScrollContent.vue +59 -0
  115. package/template/src/components/ui/dialog/DialogTitle.vue +23 -0
  116. package/template/src/components/ui/dialog/DialogTrigger.vue +15 -0
  117. package/template/src/components/ui/dialog/index.ts +10 -0
  118. package/template/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
  119. package/template/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +39 -0
  120. package/template/src/components/ui/dropdown-menu/DropdownMenuContent.vue +41 -0
  121. package/template/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +15 -0
  122. package/template/src/components/ui/dropdown-menu/DropdownMenuItem.vue +31 -0
  123. package/template/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  124. package/template/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
  125. package/template/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  126. package/template/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  127. package/template/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +17 -0
  128. package/template/src/components/ui/dropdown-menu/DropdownMenuSub.vue +18 -0
  129. package/template/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -0
  130. package/template/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  131. package/template/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  132. package/template/src/components/ui/dropdown-menu/index.ts +16 -0
  133. package/template/src/components/ui/form/FormControl.vue +17 -0
  134. package/template/src/components/ui/form/FormDescription.vue +21 -0
  135. package/template/src/components/ui/form/FormItem.vue +23 -0
  136. package/template/src/components/ui/form/FormLabel.vue +25 -0
  137. package/template/src/components/ui/form/FormMessage.vue +23 -0
  138. package/template/src/components/ui/form/index.ts +7 -0
  139. package/template/src/components/ui/form/injectionKeys.ts +4 -0
  140. package/template/src/components/ui/form/useFormField.ts +30 -0
  141. package/template/src/components/ui/hover-card/HoverCard.vue +19 -0
  142. package/template/src/components/ui/hover-card/HoverCardContent.vue +43 -0
  143. package/template/src/components/ui/hover-card/HoverCardTrigger.vue +15 -0
  144. package/template/src/components/ui/hover-card/index.ts +3 -0
  145. package/template/src/components/ui/index.ts +47 -0
  146. package/template/src/components/ui/input/Input.vue +33 -0
  147. package/template/src/components/ui/input/InputAddon.vue +29 -0
  148. package/template/src/components/ui/input/InputGroup.vue +17 -0
  149. package/template/src/components/ui/input/InputIcon.vue +29 -0
  150. package/template/src/components/ui/input/index.ts +4 -0
  151. package/template/src/components/ui/kbd/Kbd.vue +30 -0
  152. package/template/src/components/ui/kbd/index.ts +1 -0
  153. package/template/src/components/ui/label/Label.vue +26 -0
  154. package/template/src/components/ui/label/index.ts +1 -0
  155. package/template/src/components/ui/loading-bar/LoadingBar.vue +41 -0
  156. package/template/src/components/ui/loading-bar/index.ts +2 -0
  157. package/template/src/components/ui/pagination/Pagination.vue +26 -0
  158. package/template/src/components/ui/pagination/PaginationContent.vue +22 -0
  159. package/template/src/components/ui/pagination/PaginationEllipsis.vue +25 -0
  160. package/template/src/components/ui/pagination/PaginationFirst.vue +33 -0
  161. package/template/src/components/ui/pagination/PaginationItem.vue +34 -0
  162. package/template/src/components/ui/pagination/PaginationLast.vue +33 -0
  163. package/template/src/components/ui/pagination/PaginationNext.vue +33 -0
  164. package/template/src/components/ui/pagination/PaginationPrevious.vue +33 -0
  165. package/template/src/components/ui/pagination/index.ts +8 -0
  166. package/template/src/components/ui/pin-input/PinInput.vue +28 -0
  167. package/template/src/components/ui/pin-input/PinInputGroup.vue +18 -0
  168. package/template/src/components/ui/pin-input/PinInputInput.vue +24 -0
  169. package/template/src/components/ui/pin-input/PinInputSeparator.vue +21 -0
  170. package/template/src/components/ui/pin-input/index.ts +4 -0
  171. package/template/src/components/ui/popover/Popover.vue +19 -0
  172. package/template/src/components/ui/popover/PopoverAnchor.vue +15 -0
  173. package/template/src/components/ui/popover/PopoverContent.vue +45 -0
  174. package/template/src/components/ui/popover/PopoverTrigger.vue +15 -0
  175. package/template/src/components/ui/popover/index.ts +4 -0
  176. package/template/src/components/ui/progress/Progress.vue +35 -0
  177. package/template/src/components/ui/progress/index.ts +1 -0
  178. package/template/src/components/ui/radio-group/RadioGroup.vue +23 -0
  179. package/template/src/components/ui/radio-group/RadioGroupItem.vue +30 -0
  180. package/template/src/components/ui/radio-group/index.ts +2 -0
  181. package/template/src/components/ui/scroll-area/ScrollArea.vue +40 -0
  182. package/template/src/components/ui/scroll-area/ScrollBar.vue +44 -0
  183. package/template/src/components/ui/scroll-area/index.ts +2 -0
  184. package/template/src/components/ui/select/Select.vue +19 -0
  185. package/template/src/components/ui/select/SelectContent.vue +51 -0
  186. package/template/src/components/ui/select/SelectGroup.vue +15 -0
  187. package/template/src/components/ui/select/SelectItem.vue +44 -0
  188. package/template/src/components/ui/select/SelectItemText.vue +15 -0
  189. package/template/src/components/ui/select/SelectLabel.vue +17 -0
  190. package/template/src/components/ui/select/SelectScrollDownButton.vue +26 -0
  191. package/template/src/components/ui/select/SelectScrollUpButton.vue +26 -0
  192. package/template/src/components/ui/select/SelectSeparator.vue +19 -0
  193. package/template/src/components/ui/select/SelectTrigger.vue +33 -0
  194. package/template/src/components/ui/select/SelectValue.vue +15 -0
  195. package/template/src/components/ui/select/index.ts +11 -0
  196. package/template/src/components/ui/separator/Separator.vue +29 -0
  197. package/template/src/components/ui/separator/index.ts +1 -0
  198. package/template/src/components/ui/sheet/Sheet.vue +19 -0
  199. package/template/src/components/ui/sheet/SheetClose.vue +15 -0
  200. package/template/src/components/ui/sheet/SheetContent.vue +62 -0
  201. package/template/src/components/ui/sheet/SheetDescription.vue +21 -0
  202. package/template/src/components/ui/sheet/SheetFooter.vue +16 -0
  203. package/template/src/components/ui/sheet/SheetHeader.vue +15 -0
  204. package/template/src/components/ui/sheet/SheetOverlay.vue +21 -0
  205. package/template/src/components/ui/sheet/SheetTitle.vue +21 -0
  206. package/template/src/components/ui/sheet/SheetTrigger.vue +15 -0
  207. package/template/src/components/ui/sheet/index.ts +8 -0
  208. package/template/src/components/ui/sidebar/Sidebar.vue +113 -0
  209. package/template/src/components/ui/sidebar/SidebarContent.vue +18 -0
  210. package/template/src/components/ui/sidebar/SidebarControl.vue +53 -0
  211. package/template/src/components/ui/sidebar/SidebarFooter.vue +18 -0
  212. package/template/src/components/ui/sidebar/SidebarGroup.vue +18 -0
  213. package/template/src/components/ui/sidebar/SidebarGroupAction.vue +27 -0
  214. package/template/src/components/ui/sidebar/SidebarGroupContent.vue +18 -0
  215. package/template/src/components/ui/sidebar/SidebarGroupLabel.vue +25 -0
  216. package/template/src/components/ui/sidebar/SidebarHeader.vue +18 -0
  217. package/template/src/components/ui/sidebar/SidebarInput.vue +22 -0
  218. package/template/src/components/ui/sidebar/SidebarInset.vue +21 -0
  219. package/template/src/components/ui/sidebar/SidebarMenu.vue +18 -0
  220. package/template/src/components/ui/sidebar/SidebarMenuAction.vue +35 -0
  221. package/template/src/components/ui/sidebar/SidebarMenuBadge.vue +26 -0
  222. package/template/src/components/ui/sidebar/SidebarMenuButton.vue +48 -0
  223. package/template/src/components/ui/sidebar/SidebarMenuButtonChild.vue +36 -0
  224. package/template/src/components/ui/sidebar/SidebarMenuItem.vue +18 -0
  225. package/template/src/components/ui/sidebar/SidebarMenuSkeleton.vue +35 -0
  226. package/template/src/components/ui/sidebar/SidebarMenuSub.vue +22 -0
  227. package/template/src/components/ui/sidebar/SidebarMenuSubButton.vue +36 -0
  228. package/template/src/components/ui/sidebar/SidebarMenuSubItem.vue +18 -0
  229. package/template/src/components/ui/sidebar/SidebarProvider.vue +136 -0
  230. package/template/src/components/ui/sidebar/SidebarRail.vue +33 -0
  231. package/template/src/components/ui/sidebar/SidebarSeparator.vue +19 -0
  232. package/template/src/components/ui/sidebar/SidebarTrigger.vue +27 -0
  233. package/template/src/components/ui/sidebar/index.ts +61 -0
  234. package/template/src/components/ui/sidebar/utils.ts +27 -0
  235. package/template/src/components/ui/skeleton/Skeleton.vue +17 -0
  236. package/template/src/components/ui/skeleton/index.ts +1 -0
  237. package/template/src/components/ui/slider/Slider.vue +42 -0
  238. package/template/src/components/ui/slider/index.ts +1 -0
  239. package/template/src/components/ui/sonner/Sonner.vue +42 -0
  240. package/template/src/components/ui/sonner/index.ts +2 -0
  241. package/template/src/components/ui/stepper/Stepper.vue +102 -0
  242. package/template/src/components/ui/stepper/index.ts +1 -0
  243. package/template/src/components/ui/switch/Switch.vue +38 -0
  244. package/template/src/components/ui/switch/index.ts +1 -0
  245. package/template/src/components/ui/table/Table.vue +16 -0
  246. package/template/src/components/ui/table/TableBody.vue +17 -0
  247. package/template/src/components/ui/table/TableCaption.vue +17 -0
  248. package/template/src/components/ui/table/TableCell.vue +22 -0
  249. package/template/src/components/ui/table/TableEmpty.vue +34 -0
  250. package/template/src/components/ui/table/TableFooter.vue +17 -0
  251. package/template/src/components/ui/table/TableHead.vue +17 -0
  252. package/template/src/components/ui/table/TableHeader.vue +17 -0
  253. package/template/src/components/ui/table/TableRow.vue +17 -0
  254. package/template/src/components/ui/table/index.ts +9 -0
  255. package/template/src/components/ui/table/utils.ts +10 -0
  256. package/template/src/components/ui/tabs/Tabs.vue +24 -0
  257. package/template/src/components/ui/tabs/TabsContent.vue +21 -0
  258. package/template/src/components/ui/tabs/TabsList.vue +24 -0
  259. package/template/src/components/ui/tabs/TabsTrigger.vue +26 -0
  260. package/template/src/components/ui/tabs/index.ts +4 -0
  261. package/template/src/components/ui/textarea/Textarea.vue +28 -0
  262. package/template/src/components/ui/textarea/index.ts +1 -0
  263. package/template/src/components/ui/timeline/Timeline.vue +73 -0
  264. package/template/src/components/ui/timeline/index.ts +1 -0
  265. package/template/src/components/ui/toggle/Toggle.vue +35 -0
  266. package/template/src/components/ui/toggle/index.ts +28 -0
  267. package/template/src/components/ui/toggle-group/ToggleGroup.vue +41 -0
  268. package/template/src/components/ui/toggle-group/ToggleGroupItem.vue +43 -0
  269. package/template/src/components/ui/toggle-group/index.ts +12 -0
  270. package/template/src/components/ui/tooltip/Tooltip.vue +19 -0
  271. package/template/src/components/ui/tooltip/TooltipContent.vue +34 -0
  272. package/template/src/components/ui/tooltip/TooltipProvider.vue +14 -0
  273. package/template/src/components/ui/tooltip/TooltipTrigger.vue +15 -0
  274. package/template/src/components/ui/tooltip/index.ts +4 -0
  275. package/template/src/components.d.ts +228 -0
  276. package/template/src/composables/useFormatter.ts +105 -0
  277. package/template/src/composables/useThemeConfig.ts +252 -0
  278. package/template/src/layouts/AdminLayout.vue +55 -0
  279. package/template/src/layouts/AuthLayout.vue +42 -0
  280. package/template/src/lib/axios.spec.ts +46 -0
  281. package/template/src/lib/axios.ts +243 -0
  282. package/template/src/lib/formatters.spec.ts +137 -0
  283. package/template/src/lib/formatters.ts +332 -0
  284. package/template/src/lib/loading-bar.ts +103 -0
  285. package/template/src/lib/utils.spec.ts +26 -0
  286. package/template/src/lib/utils.ts +7 -0
  287. package/template/src/lib/validation.spec.ts +78 -0
  288. package/template/src/main.ts +13 -0
  289. package/template/src/router/index.ts +147 -0
  290. package/template/src/services/auth.service.spec.ts +93 -0
  291. package/template/src/services/auth.service.ts +243 -0
  292. package/template/src/services/index.ts +3 -0
  293. package/template/src/services/types.ts +28 -0
  294. package/template/src/services/user.service.spec.ts +91 -0
  295. package/template/src/services/user.service.ts +283 -0
  296. package/template/src/stores/auth.spec.ts +52 -0
  297. package/template/src/stores/auth.ts +130 -0
  298. package/template/src/style.css +587 -0
  299. package/template/src/views/_starter/BlankView.vue +47 -0
  300. package/template/src/views/auth/ConfirmEmailView.vue +209 -0
  301. package/template/src/views/auth/ForgotPasswordView.vue +151 -0
  302. package/template/src/views/auth/LockScreenView.vue +175 -0
  303. package/template/src/views/auth/LoginView.vue +54 -0
  304. package/template/src/views/auth/RegisterView.vue +265 -0
  305. package/template/src/views/auth/ResetPasswordView.vue +260 -0
  306. package/template/src/views/auth/VerifyOtpView.vue +261 -0
  307. package/template/src/views/dashboard/IndexView.vue +159 -0
  308. package/template/src/views/errors/ComingSoonView.vue +241 -0
  309. package/template/src/views/errors/MaintenanceView.vue +252 -0
  310. package/template/src/views/errors/NotFoundView.vue +81 -0
  311. package/template/src/views/errors/ServerErrorView.vue +101 -0
  312. package/template/src/views/errors/UnauthorizedView.vue +64 -0
  313. package/template/tsconfig.app.json +27 -0
  314. package/template/tsconfig.json +19 -0
  315. package/template/tsconfig.node.json +23 -0
  316. package/template/vite.config.ts +46 -0
@@ -0,0 +1,20 @@
1
+ <script setup lang="ts">
2
+ import type { AccordionItemProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { cn } from "@/lib/utils"
5
+ import { AccordionItem, useForwardProps } from "reka-ui"
6
+
7
+ const props = defineProps<AccordionItemProps & { class?: HTMLAttributes["class"] }>()
8
+
9
+ const forwardedProps = useForwardProps(props)
10
+ </script>
11
+
12
+ <template>
13
+ <AccordionItem
14
+ v-bind="forwardedProps"
15
+ data-slot="accordion-item"
16
+ :class="cn('border-b last:border-b-0', props.class)"
17
+ >
18
+ <slot />
19
+ </AccordionItem>
20
+ </template>
@@ -0,0 +1,34 @@
1
+ <script setup lang="ts">
2
+ import type { AccordionTriggerProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { cn } from "@/lib/utils"
5
+ import { ChevronDown } from "@lucide/vue"
6
+ import {
7
+ AccordionHeader,
8
+ AccordionTrigger,
9
+ } from "reka-ui"
10
+
11
+ const props = defineProps<AccordionTriggerProps & { class?: HTMLAttributes["class"] }>()
12
+ </script>
13
+
14
+ <template>
15
+ <AccordionHeader class="flex" data-slot="accordion-header">
16
+ <AccordionTrigger
17
+ v-bind="props"
18
+ data-slot="accordion-trigger"
19
+ :class="
20
+ cn(
21
+ 'flex flex-1 items-center justify-between py-4 text-xs font-semibold transition-all hover:underline text-left cursor-pointer [&[data-state=open]>svg]:rotate-180 text-foreground',
22
+ props.class
23
+ )
24
+ "
25
+ >
26
+ <slot />
27
+ <slot name="icon">
28
+ <ChevronDown
29
+ class="h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200"
30
+ />
31
+ </slot>
32
+ </AccordionTrigger>
33
+ </AccordionHeader>
34
+ </template>
@@ -0,0 +1,4 @@
1
+ export { default as Accordion } from "./Accordion.vue"
2
+ export { default as AccordionItem } from "./AccordionItem.vue"
3
+ export { default as AccordionTrigger } from "./AccordionTrigger.vue"
4
+ export { default as AccordionContent } from "./AccordionContent.vue"
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue"
3
+ import type { AlertVariants } from "."
4
+ import { cn } from "@/lib/utils"
5
+ import { alertVariants } from "."
6
+
7
+ const props = defineProps<{
8
+ class?: HTMLAttributes["class"]
9
+ variant?: AlertVariants["variant"]
10
+ }>()
11
+ </script>
12
+
13
+ <template>
14
+ <div
15
+ data-slot="alert"
16
+ :class="cn(alertVariants({ variant }), props.class)"
17
+ role="alert"
18
+ >
19
+ <slot />
20
+ </div>
21
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue"
3
+ import { cn } from "@/lib/utils"
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes["class"]
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ data-slot="alert-description"
13
+ :class="cn('text-muted-foreground col-start-2 text-sm [&_p]:leading-relaxed', props.class)"
14
+ >
15
+ <slot />
16
+ </div>
17
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue"
3
+ import { cn } from "@/lib/utils"
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes["class"]
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ data-slot="alert-title"
13
+ :class="cn('col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight', props.class)"
14
+ >
15
+ <slot />
16
+ </div>
17
+ </template>
@@ -0,0 +1,30 @@
1
+ import type { VariantProps } from "class-variance-authority"
2
+ import { cva } from "class-variance-authority"
3
+
4
+ export { default as Alert } from "./Alert.vue"
5
+ export { default as AlertDescription } from "./AlertDescription.vue"
6
+ export { default as AlertTitle } from "./AlertTitle.vue"
7
+
8
+ export const alertVariants = cva(
9
+ "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
10
+ {
11
+ variants: {
12
+ variant: {
13
+ default: "bg-card text-card-foreground",
14
+ destructive:
15
+ "text-destructive bg-card border-destructive/30 [&>svg]:text-destructive *:data-[slot=alert-description]:text-destructive/90",
16
+ success:
17
+ "text-emerald-700 dark:text-emerald-400 bg-emerald-500/10 border-emerald-500/20 [&>svg]:text-emerald-600 dark:[&>svg]:text-emerald-400 *:data-[slot=alert-description]:text-emerald-600/90 dark:*:data-[slot=alert-description]:text-emerald-400/90",
18
+ warning:
19
+ "text-amber-700 dark:text-amber-400 bg-amber-500/10 border-amber-500/20 [&>svg]:text-amber-600 dark:[&>svg]:text-amber-400 *:data-[slot=alert-description]:text-amber-600/90 dark:*:data-[slot=alert-description]:text-amber-400/90",
20
+ info:
21
+ "text-blue-700 dark:text-blue-400 bg-blue-500/10 border-blue-500/20 [&>svg]:text-blue-600 dark:[&>svg]:text-blue-400 *:data-[slot=alert-description]:text-blue-600/90 dark:*:data-[slot=alert-description]:text-blue-400/90",
22
+ },
23
+ },
24
+ defaultVariants: {
25
+ variant: "default",
26
+ },
27
+ },
28
+ )
29
+
30
+ export type AlertVariants = VariantProps<typeof alertVariants>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import type { AlertDialogEmits, AlertDialogProps } from "reka-ui"
3
+ import { AlertDialogRoot, useForwardPropsEmits } from "reka-ui"
4
+
5
+ const props = defineProps<AlertDialogProps>()
6
+ const emits = defineEmits<AlertDialogEmits>()
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits)
9
+ </script>
10
+
11
+ <template>
12
+ <AlertDialogRoot v-slot="slotProps" data-slot="alert-dialog" v-bind="forwarded">
13
+ <slot v-bind="slotProps" />
14
+ </AlertDialogRoot>
15
+ </template>
@@ -0,0 +1,18 @@
1
+ <script setup lang="ts">
2
+ import type { AlertDialogActionProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { AlertDialogAction } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+ import { buttonVariants } from '@/components/ui/button'
8
+
9
+ const props = defineProps<AlertDialogActionProps & { class?: HTMLAttributes["class"] }>()
10
+
11
+ const delegatedProps = reactiveOmit(props, "class")
12
+ </script>
13
+
14
+ <template>
15
+ <AlertDialogAction v-bind="delegatedProps" :class="cn(buttonVariants(), props.class)">
16
+ <slot />
17
+ </AlertDialogAction>
18
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import type { AlertDialogCancelProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { AlertDialogCancel } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+ import { buttonVariants } from '@/components/ui/button'
8
+
9
+ const props = defineProps<AlertDialogCancelProps & { class?: HTMLAttributes["class"] }>()
10
+
11
+ const delegatedProps = reactiveOmit(props, "class")
12
+ </script>
13
+
14
+ <template>
15
+ <AlertDialogCancel
16
+ v-bind="delegatedProps"
17
+ :class="cn(
18
+ buttonVariants({ variant: 'outline' }),
19
+ 'mt-2 sm:mt-0',
20
+ props.class,
21
+ )"
22
+ >
23
+ <slot />
24
+ </AlertDialogCancel>
25
+ </template>
@@ -0,0 +1,44 @@
1
+ <script setup lang="ts">
2
+ import type { AlertDialogContentEmits, AlertDialogContentProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import {
6
+ AlertDialogContent,
7
+ AlertDialogOverlay,
8
+ AlertDialogPortal,
9
+ useForwardPropsEmits,
10
+ } from "reka-ui"
11
+ import { cn } from "@/lib/utils"
12
+
13
+ defineOptions({
14
+ inheritAttrs: false,
15
+ })
16
+
17
+ const props = defineProps<AlertDialogContentProps & { class?: HTMLAttributes["class"] }>()
18
+ const emits = defineEmits<AlertDialogContentEmits>()
19
+
20
+ const delegatedProps = reactiveOmit(props, "class")
21
+
22
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
23
+ </script>
24
+
25
+ <template>
26
+ <AlertDialogPortal>
27
+ <AlertDialogOverlay
28
+ data-slot="alert-dialog-overlay"
29
+ class="data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80"
30
+ />
31
+ <AlertDialogContent
32
+ data-slot="alert-dialog-content"
33
+ v-bind="{ ...$attrs, ...forwarded }"
34
+ :class="
35
+ cn(
36
+ 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',
37
+ props.class,
38
+ )
39
+ "
40
+ >
41
+ <slot />
42
+ </AlertDialogContent>
43
+ </AlertDialogPortal>
44
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { AlertDialogDescriptionProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import {
6
+ AlertDialogDescription,
7
+ } from "reka-ui"
8
+ import { cn } from "@/lib/utils"
9
+
10
+ const props = defineProps<AlertDialogDescriptionProps & { class?: HTMLAttributes["class"] }>()
11
+
12
+ const delegatedProps = reactiveOmit(props, "class")
13
+ </script>
14
+
15
+ <template>
16
+ <AlertDialogDescription
17
+ data-slot="alert-dialog-description"
18
+ v-bind="delegatedProps"
19
+ :class="cn('text-muted-foreground text-sm', props.class)"
20
+ >
21
+ <slot />
22
+ </AlertDialogDescription>
23
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue"
3
+ import { cn } from "@/lib/utils"
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes["class"]
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ data-slot="alert-dialog-footer"
13
+ :class="
14
+ cn(
15
+ 'flex flex-col-reverse gap-2 sm:flex-row sm:justify-end',
16
+ props.class,
17
+ )
18
+ "
19
+ >
20
+ <slot />
21
+ </div>
22
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue"
3
+ import { cn } from "@/lib/utils"
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes["class"]
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ data-slot="alert-dialog-header"
13
+ :class="cn('flex flex-col gap-2 text-center sm:text-left', props.class)"
14
+ >
15
+ <slot />
16
+ </div>
17
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import type { AlertDialogTitleProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { AlertDialogTitle } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<AlertDialogTitleProps & { class?: HTMLAttributes["class"] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, "class")
11
+ </script>
12
+
13
+ <template>
14
+ <AlertDialogTitle
15
+ data-slot="alert-dialog-title"
16
+ v-bind="delegatedProps"
17
+ :class="cn('text-lg font-semibold', props.class)"
18
+ >
19
+ <slot />
20
+ </AlertDialogTitle>
21
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import type { AlertDialogTriggerProps } from "reka-ui"
3
+ import { AlertDialogTrigger } from "reka-ui"
4
+
5
+ const props = defineProps<AlertDialogTriggerProps>()
6
+ </script>
7
+
8
+ <template>
9
+ <AlertDialogTrigger data-slot="alert-dialog-trigger" v-bind="props">
10
+ <slot />
11
+ </AlertDialogTrigger>
12
+ </template>
@@ -0,0 +1,9 @@
1
+ export { default as AlertDialog } from "./AlertDialog.vue"
2
+ export { default as AlertDialogAction } from "./AlertDialogAction.vue"
3
+ export { default as AlertDialogCancel } from "./AlertDialogCancel.vue"
4
+ export { default as AlertDialogContent } from "./AlertDialogContent.vue"
5
+ export { default as AlertDialogDescription } from "./AlertDialogDescription.vue"
6
+ export { default as AlertDialogFooter } from "./AlertDialogFooter.vue"
7
+ export { default as AlertDialogHeader } from "./AlertDialogHeader.vue"
8
+ export { default as AlertDialogTitle } from "./AlertDialogTitle.vue"
9
+ export { default as AlertDialogTrigger } from "./AlertDialogTrigger.vue"
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue"
3
+ import { AvatarRoot } from "reka-ui"
4
+ import { cn } from "@/lib/utils"
5
+
6
+ /** Presence status shown as a colored pip at bottom-right of the avatar */
7
+ type AvatarStatus = "online" | "busy" | "away" | "offline"
8
+
9
+ const statusClasses: Record<AvatarStatus, string> = {
10
+ online: "bg-emerald-500",
11
+ busy: "bg-red-500",
12
+ away: "bg-amber-500",
13
+ offline: "bg-muted-foreground/60",
14
+ }
15
+
16
+ const statusLabels: Record<AvatarStatus, string> = {
17
+ online: "Online",
18
+ busy: "Do Not Disturb",
19
+ away: "Away",
20
+ offline: "Offline",
21
+ }
22
+
23
+ const props = defineProps<{
24
+ class?: HTMLAttributes["class"]
25
+ /** Presence status indicator. Renders a colored pip at bottom-right. */
26
+ status?: AvatarStatus
27
+ }>()
28
+ </script>
29
+
30
+ <template>
31
+ <div :class="cn('relative inline-flex size-8 shrink-0 rounded-full', props.class)">
32
+ <AvatarRoot
33
+ data-slot="avatar"
34
+ class="flex size-full overflow-hidden rounded-full"
35
+ >
36
+ <slot />
37
+ </AvatarRoot>
38
+
39
+ <!-- Presence status pip -->
40
+ <span
41
+ v-if="status"
42
+ :title="statusLabels[status]"
43
+ :class="cn(
44
+ 'absolute bottom-0 right-0 size-2.5 rounded-full border-2 border-background',
45
+ statusClasses[status],
46
+ )"
47
+ aria-hidden="true"
48
+ />
49
+ </div>
50
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import type { AvatarFallbackProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { AvatarFallback } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<AvatarFallbackProps & { class?: HTMLAttributes["class"] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, "class")
11
+ </script>
12
+
13
+ <template>
14
+ <AvatarFallback
15
+ data-slot="avatar-fallback"
16
+ v-bind="delegatedProps"
17
+ :class="cn('bg-muted flex size-full items-center justify-center rounded-full', props.class)"
18
+ >
19
+ <slot />
20
+ </AvatarFallback>
21
+ </template>
@@ -0,0 +1,69 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue"
3
+ import { cn } from "@/lib/utils"
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes["class"]
7
+ /**
8
+ * Maximum number of avatars to display before a "+N" overflow chip.
9
+ * @default Infinity (show all)
10
+ */
11
+ max?: number
12
+ /**
13
+ * Horizontal overlap between stacked avatars (negative space-x).
14
+ * Uses Tailwind sizing scale values (e.g. 2, 3, 4).
15
+ * @default 3
16
+ */
17
+ overlap?: 2 | 3 | 4
18
+ }>()
19
+
20
+ // Map overlap number → Tailwind negative space-x class
21
+ const overlapClass: Record<number, string> = {
22
+ 2: "-space-x-2",
23
+ 3: "-space-x-3",
24
+ 4: "-space-x-4",
25
+ }
26
+
27
+ const gap = computed(() => overlapClass[props.overlap ?? 3] ?? "-space-x-3")
28
+
29
+ // Count children via slots to apply the overflow chip
30
+ const slots = useSlots()
31
+ const children = computed(() => {
32
+ const defaultSlot = slots.default?.()
33
+ if (!defaultSlot) return []
34
+ return defaultSlot.flatMap((vnode) =>
35
+ Array.isArray(vnode.children) ? vnode.children : [vnode],
36
+ )
37
+ })
38
+
39
+ const maxVisible = computed(() => props.max ?? Infinity)
40
+ const overflowCount = computed(() =>
41
+ Math.max(0, children.value.length - maxVisible.value),
42
+ )
43
+ const visibleChildren = computed(() => children.value.slice(0, maxVisible.value))
44
+ </script>
45
+
46
+ <template>
47
+ <div
48
+ data-slot="avatar-group"
49
+ :class="cn('flex items-center p-0.5', gap, props.class)"
50
+ >
51
+ <!-- Render only up to `max` avatars -->
52
+ <component
53
+ :is="child"
54
+ v-for="(child, i) in visibleChildren"
55
+ :key="i"
56
+ class="ring-2 ring-background rounded-full"
57
+ />
58
+
59
+ <!-- Overflow chip: +N more -->
60
+ <div
61
+ v-if="overflowCount > 0"
62
+ class="inline-flex size-10 shrink-0 items-center justify-center rounded-full bg-muted ring-2 ring-background text-xs font-semibold text-muted-foreground"
63
+ :title="`${overflowCount} more`"
64
+ :aria-label="`${overflowCount} more members`"
65
+ >
66
+ +{{ overflowCount }}
67
+ </div>
68
+ </div>
69
+ </template>
@@ -0,0 +1,16 @@
1
+ <script setup lang="ts">
2
+ import type { AvatarImageProps } from "reka-ui"
3
+ import { AvatarImage } from "reka-ui"
4
+
5
+ const props = defineProps<AvatarImageProps>()
6
+ </script>
7
+
8
+ <template>
9
+ <AvatarImage
10
+ data-slot="avatar-image"
11
+ v-bind="props"
12
+ class="aspect-square size-full object-cover"
13
+ >
14
+ <slot />
15
+ </AvatarImage>
16
+ </template>
@@ -0,0 +1,4 @@
1
+ export { default as Avatar } from "./Avatar.vue"
2
+ export { default as AvatarFallback } from "./AvatarFallback.vue"
3
+ export { default as AvatarGroup } from "./AvatarGroup.vue"
4
+ export { default as AvatarImage } from "./AvatarImage.vue"
@@ -0,0 +1,40 @@
1
+ <script setup lang="ts">
2
+ import type { PrimitiveProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import type { BadgeVariants } from "."
5
+ import { reactiveOmit } from "@vueuse/core"
6
+ import { Primitive } from "reka-ui"
7
+ import { cn } from "@/lib/utils"
8
+ import { badgeVariants } from "."
9
+
10
+ const props = defineProps<
11
+ PrimitiveProps & {
12
+ variant?: BadgeVariants["variant"]
13
+ /** Shape scale: 'default' (rounded-md) | 'pill' (rounded-full) */
14
+ shape?: BadgeVariants["shape"]
15
+ /** Show a small colored status dot inside the badge */
16
+ dot?: boolean
17
+ /** Animate the dot with animate-pulse (requires dot=true) */
18
+ pulse?: boolean
19
+ class?: HTMLAttributes["class"]
20
+ }
21
+ >()
22
+
23
+ const delegatedProps = reactiveOmit(props, "class", "dot", "pulse", "shape")
24
+ </script>
25
+
26
+ <template>
27
+ <Primitive
28
+ data-slot="badge"
29
+ :class="cn(badgeVariants({ variant, shape }), props.class)"
30
+ v-bind="delegatedProps"
31
+ >
32
+ <!-- Integrated status dot indicator -->
33
+ <span
34
+ v-if="dot"
35
+ :class="cn('h-1.5 w-1.5 rounded-full bg-current shrink-0', pulse && 'animate-pulse')"
36
+ aria-hidden="true"
37
+ />
38
+ <slot />
39
+ </Primitive>
40
+ </template>
@@ -0,0 +1,45 @@
1
+ import type { VariantProps } from "class-variance-authority"
2
+ import { cva } from "class-variance-authority"
3
+
4
+ export { default as Badge } from "./Badge.vue"
5
+
6
+ export const badgeVariants = cva(
7
+ "inline-flex items-center justify-center border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1.5 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
8
+ {
9
+ variants: {
10
+ /** Semantic color intent */
11
+ variant: {
12
+ default:
13
+ "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
14
+ secondary:
15
+ "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
16
+ destructive:
17
+ "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
18
+ outline:
19
+ "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
20
+ /** Success — emerald tint */
21
+ success:
22
+ "border-emerald-500/20 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 [a&]:hover:bg-emerald-500/20",
23
+ /** Informational — blue tint */
24
+ info:
25
+ "border-blue-500/20 bg-blue-500/10 text-blue-600 dark:text-blue-400 [a&]:hover:bg-blue-500/20",
26
+ /** Cautionary — amber tint */
27
+ warning:
28
+ "border-amber-500/20 bg-amber-500/10 text-amber-600 dark:text-amber-400 [a&]:hover:bg-amber-500/20",
29
+ },
30
+ /** Shape scale */
31
+ shape: {
32
+ /** Squared corners (default) */
33
+ default: "rounded-md",
34
+ /** Fully rounded pill */
35
+ pill: "rounded-full px-2.5",
36
+ },
37
+ },
38
+ defaultVariants: {
39
+ variant: "default",
40
+ shape: "default",
41
+ },
42
+ },
43
+ )
44
+
45
+ export type BadgeVariants = VariantProps<typeof badgeVariants>
@@ -0,0 +1,17 @@
1
+ <script lang="ts" setup>
2
+ import type { HTMLAttributes } from "vue"
3
+
4
+ const props = defineProps<{
5
+ class?: HTMLAttributes["class"]
6
+ }>()
7
+ </script>
8
+
9
+ <template>
10
+ <nav
11
+ aria-label="breadcrumb"
12
+ data-slot="breadcrumb"
13
+ :class="props.class"
14
+ >
15
+ <slot />
16
+ </nav>
17
+ </template>