@brumaombra/ui-vintage 0.9.1 → 0.9.3

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 (344) hide show
  1. package/COMPONENTS.md +102 -2
  2. package/module.mjs +43 -43
  3. package/package.json +175 -175
  4. package/src/components/background-grid/BackgroundGrid.vue +4 -4
  5. package/src/components/blog/AllPostsSection.vue +33 -33
  6. package/src/components/blog/BlogCategoriesPage.vue +46 -0
  7. package/src/components/blog/BlogContentRenderer.vue +111 -111
  8. package/src/components/blog/BlogFAQSection.vue +19 -19
  9. package/src/components/blog/BlogHeaderSection.vue +80 -80
  10. package/src/components/blog/BlogIndexPage.vue +118 -0
  11. package/src/components/blog/BlogInfoSection.vue +47 -47
  12. package/src/components/blog/BlogPageBreadcrumbs.vue +43 -0
  13. package/src/components/blog/BlogPostHeader.vue +135 -135
  14. package/src/components/blog/BlogPostPage.vue +116 -0
  15. package/src/components/blog/BlogPostsPage.vue +74 -0
  16. package/src/components/blog/BlogProgressBar.vue +33 -33
  17. package/src/components/blog/BlogSectionTitle.vue +22 -22
  18. package/src/components/blog/BlogTagsPage.vue +46 -0
  19. package/src/components/blog/BlogTagsSection.vue +25 -25
  20. package/src/components/blog/BlogViewAllLink.vue +18 -0
  21. package/src/components/blog/CategoriesList.vue +14 -14
  22. package/src/components/blog/CategoriesSection.vue +11 -11
  23. package/src/components/blog/CategoryCard.vue +25 -25
  24. package/src/components/blog/HeaderCarousel.vue +97 -97
  25. package/src/components/blog/PostCard.vue +33 -33
  26. package/src/components/blog/PostsList.vue +15 -15
  27. package/src/components/blog/SocialShareSidebar.vue +84 -84
  28. package/src/components/blog/TableOfContents.vue +307 -307
  29. package/src/components/blog/blogPageUtils.ts +98 -0
  30. package/src/components/blog/index.ts +12 -1
  31. package/src/components/busy-indicator/BusyIndicator.vue +7 -7
  32. package/src/components/busy-indicator/busy-indicator-state.ts +56 -56
  33. package/src/components/card-grid/CardGrid.vue +34 -34
  34. package/src/components/chip/Chip.vue +15 -15
  35. package/src/components/confirm-dialog/ConfirmDialog.vue +50 -50
  36. package/src/components/confirm-dialog/confirm-dialog-state.ts +131 -131
  37. package/src/components/content/BlogList.vue +30 -30
  38. package/src/components/content/BlogTable.vue +36 -36
  39. package/src/components/content/CodeBlock.vue +136 -136
  40. package/src/components/content/Flow.vue +60 -60
  41. package/src/components/content/ProseHr.vue +15 -15
  42. package/src/components/content/ProsePre.vue +12 -12
  43. package/src/components/content/Terminal.vue +59 -59
  44. package/src/components/cookie-consent/CookieConsent.vue +36 -36
  45. package/src/components/cookie-consent/useCookieConsent.ts +37 -37
  46. package/src/components/dashboard-shell/DashboardShell.vue +171 -171
  47. package/src/components/data-list/DataList.vue +6 -6
  48. package/src/components/data-list/DataListItem.vue +4 -4
  49. package/src/components/data-list/DataListLabel.vue +4 -4
  50. package/src/components/data-list/DataListText.vue +4 -4
  51. package/src/components/data-list/DataListValue.vue +4 -4
  52. package/src/components/empty-state-card/EmptyStateCard.vue +40 -40
  53. package/src/components/error-page/ErrorPage.vue +72 -72
  54. package/src/components/info-card/InfoCard.vue +31 -31
  55. package/src/components/landing/landing-content/LandingContent.vue +4 -4
  56. package/src/components/landing/landing-footer/LandingFooter.vue +128 -128
  57. package/src/components/landing/landing-navbar/LandingNavbar.vue +50 -50
  58. package/src/components/landing/landing-shell/LandingShell.vue +36 -36
  59. package/src/components/language-flag/LanguageFlag.vue +25 -25
  60. package/src/components/language-flag/flags/ChineseFlag.vue +8 -8
  61. package/src/components/language-flag/flags/EnglishFlag.vue +7 -7
  62. package/src/components/language-flag/flags/FrenchFlag.vue +5 -5
  63. package/src/components/language-flag/flags/GermanFlag.vue +5 -5
  64. package/src/components/language-flag/flags/ItalianFlag.vue +7 -7
  65. package/src/components/language-flag/flags/JapaneseFlag.vue +4 -4
  66. package/src/components/language-flag/flags/PortugueseFlag.vue +57 -57
  67. package/src/components/language-flag/flags/RussianFlag.vue +5 -5
  68. package/src/components/language-flag/flags/SpanishFlag.vue +4 -4
  69. package/src/components/language-selector/LanguageSelector.vue +76 -76
  70. package/src/components/load-more-button/LoadMoreButton.vue +17 -17
  71. package/src/components/loading-state-card/LoadingStateCard.vue +28 -28
  72. package/src/components/message-dialog/MessageDialog.vue +59 -59
  73. package/src/components/message-dialog/message-dialog-state.ts +105 -105
  74. package/src/components/message-toast/MessageToast.vue +149 -149
  75. package/src/components/message-toast/message-toast-state.ts +146 -146
  76. package/src/components/page-header/PageHeader.vue +34 -34
  77. package/src/components/progress-component/ProgressComponent.vue +33 -33
  78. package/src/components/single-value-card/SingleValueCard.vue +57 -57
  79. package/src/components/slider-form-component/SliderFormComponent.vue +36 -36
  80. package/src/components/stat-strip/StatStrip.vue +22 -22
  81. package/src/components/switch-form-component/SwitchFormComponent.vue +20 -20
  82. package/src/components/text-link/TextLink.vue +14 -14
  83. package/src/components/theme-selector/ThemeSelector.vue +61 -61
  84. package/src/components/theme-selector/theme-transition.ts +63 -63
  85. package/src/components/ui/accordion/Accordion.vue +38 -38
  86. package/src/components/ui/alert/Alert.vue +5 -5
  87. package/src/components/ui/alert/AlertDescription.vue +4 -4
  88. package/src/components/ui/alert/AlertTitle.vue +4 -4
  89. package/src/components/ui/alert/index.ts +2 -2
  90. package/src/components/ui/alert-dialog/AlertDialog.vue +3 -3
  91. package/src/components/ui/alert-dialog/AlertDialogAction.vue +3 -3
  92. package/src/components/ui/alert-dialog/AlertDialogCancel.vue +3 -3
  93. package/src/components/ui/alert-dialog/AlertDialogContent.vue +7 -7
  94. package/src/components/ui/alert-dialog/AlertDialogDescription.vue +3 -3
  95. package/src/components/ui/alert-dialog/AlertDialogFooter.vue +4 -4
  96. package/src/components/ui/alert-dialog/AlertDialogHeader.vue +4 -4
  97. package/src/components/ui/alert-dialog/AlertDialogTitle.vue +3 -3
  98. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +3 -3
  99. package/src/components/ui/animated-number/AnimatedNumber.vue +49 -48
  100. package/src/components/ui/avatar/Avatar.vue +28 -28
  101. package/src/components/ui/avatar/AvatarFallback.vue +6 -6
  102. package/src/components/ui/avatar/AvatarGroup.vue +40 -40
  103. package/src/components/ui/avatar/AvatarImage.vue +3 -3
  104. package/src/components/ui/avatar/index.ts +17 -17
  105. package/src/components/ui/badge/Badge.vue +20 -20
  106. package/src/components/ui/breadcrumb/Breadcrumb.vue +4 -4
  107. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +9 -9
  108. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +4 -4
  109. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +4 -4
  110. package/src/components/ui/breadcrumb/BreadcrumbList.vue +4 -4
  111. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +4 -4
  112. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +4 -4
  113. package/src/components/ui/busy/Busy.vue +33 -33
  114. package/src/components/ui/button/Button.vue +23 -23
  115. package/src/components/ui/button/index.ts +56 -56
  116. package/src/components/ui/calendar/Calendar.vue +138 -138
  117. package/src/components/ui/calendar/CalendarCell.vue +7 -7
  118. package/src/components/ui/calendar/CalendarCellTrigger.vue +18 -18
  119. package/src/components/ui/calendar/CalendarGrid.vue +3 -3
  120. package/src/components/ui/calendar/CalendarGridBody.vue +3 -3
  121. package/src/components/ui/calendar/CalendarGridHead.vue +3 -3
  122. package/src/components/ui/calendar/CalendarGridRow.vue +3 -3
  123. package/src/components/ui/calendar/CalendarHeadCell.vue +7 -7
  124. package/src/components/ui/calendar/CalendarHeader.vue +7 -7
  125. package/src/components/ui/calendar/CalendarHeading.vue +6 -6
  126. package/src/components/ui/calendar/CalendarNextButton.vue +15 -15
  127. package/src/components/ui/calendar/CalendarPrevButton.vue +15 -15
  128. package/src/components/ui/calendar/index.ts +4 -4
  129. package/src/components/ui/card/Card.vue +20 -20
  130. package/src/components/ui/card/CardAction.vue +8 -8
  131. package/src/components/ui/card/CardContent.vue +4 -4
  132. package/src/components/ui/card/CardDescription.vue +12 -12
  133. package/src/components/ui/card/CardFooter.vue +4 -4
  134. package/src/components/ui/card/CardHeader.vue +8 -8
  135. package/src/components/ui/card/CardText.vue +8 -8
  136. package/src/components/ui/card/CardTitle.vue +8 -8
  137. package/src/components/ui/checkbox/Checkbox.vue +27 -27
  138. package/src/components/ui/collapsible/Collapsible.vue +3 -3
  139. package/src/components/ui/collapsible/CollapsibleContent.vue +3 -3
  140. package/src/components/ui/collapsible/CollapsibleTrigger.vue +3 -3
  141. package/src/components/ui/combobox/Combobox.vue +4 -4
  142. package/src/components/ui/combobox/ComboboxAnchor.vue +16 -16
  143. package/src/components/ui/combobox/ComboboxEmpty.vue +3 -3
  144. package/src/components/ui/combobox/ComboboxGroup.vue +9 -9
  145. package/src/components/ui/combobox/ComboboxInput.vue +6 -6
  146. package/src/components/ui/combobox/ComboboxItem.vue +17 -17
  147. package/src/components/ui/combobox/ComboboxList.vue +19 -19
  148. package/src/components/ui/combobox/ComboboxSelect.vue +77 -77
  149. package/src/components/ui/combobox/ComboboxSeparator.vue +1 -1
  150. package/src/components/ui/combobox/ComboboxTrigger.vue +10 -10
  151. package/src/components/ui/combobox/types.ts +5 -5
  152. package/src/components/ui/command/Command.vue +48 -48
  153. package/src/components/ui/command/CommandDialog.vue +14 -14
  154. package/src/components/ui/command/CommandEmpty.vue +4 -4
  155. package/src/components/ui/command/CommandGroup.vue +23 -23
  156. package/src/components/ui/command/CommandInput.vue +9 -9
  157. package/src/components/ui/command/CommandItem.vue +40 -40
  158. package/src/components/ui/command/CommandList.vue +9 -9
  159. package/src/components/ui/command/CommandSeparator.vue +3 -3
  160. package/src/components/ui/command/CommandShortcut.vue +8 -8
  161. package/src/components/ui/command/index.ts +11 -11
  162. package/src/components/ui/data-table/DataTable.vue +145 -145
  163. package/src/components/ui/data-table/index.ts +11 -11
  164. package/src/components/ui/date-picker/DatePicker.vue +31 -31
  165. package/src/components/ui/date-time-picker/DateTimePicker.vue +97 -97
  166. package/src/components/ui/dialog/Dialog.vue +3 -3
  167. package/src/components/ui/dialog/DialogClose.vue +3 -3
  168. package/src/components/ui/dialog/DialogContent.vue +21 -21
  169. package/src/components/ui/dialog/DialogDescription.vue +7 -7
  170. package/src/components/ui/dialog/DialogFooter.vue +8 -8
  171. package/src/components/ui/dialog/DialogHeader.vue +4 -4
  172. package/src/components/ui/dialog/DialogOverlay.vue +7 -7
  173. package/src/components/ui/dialog/DialogScrollContent.vue +32 -32
  174. package/src/components/ui/dialog/DialogTitle.vue +3 -3
  175. package/src/components/ui/dialog/DialogTrigger.vue +3 -3
  176. package/src/components/ui/dropdown-menu/DropdownMenu.vue +3 -3
  177. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +11 -11
  178. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +15 -15
  179. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +3 -3
  180. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +12 -12
  181. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +9 -9
  182. package/src/components/ui/dropdown-menu/DropdownMenuPortal.vue +3 -3
  183. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +3 -3
  184. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +11 -11
  185. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +1 -1
  186. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +4 -4
  187. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +3 -3
  188. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +15 -15
  189. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +15 -15
  190. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +3 -3
  191. package/src/components/ui/dropdown-menu/classes.ts +16 -16
  192. package/src/components/ui/field/Field.vue +5 -5
  193. package/src/components/ui/field/FieldContent.vue +8 -8
  194. package/src/components/ui/field/FieldDescription.vue +10 -10
  195. package/src/components/ui/field/FieldError.vue +39 -39
  196. package/src/components/ui/field/FieldGroup.vue +8 -8
  197. package/src/components/ui/field/FieldLabel.vue +10 -10
  198. package/src/components/ui/field/FieldLegend.vue +11 -11
  199. package/src/components/ui/field/FieldSeparator.vue +11 -11
  200. package/src/components/ui/field/FieldSet.vue +9 -9
  201. package/src/components/ui/field/FieldTitle.vue +8 -8
  202. package/src/components/ui/field/field-context.ts +36 -36
  203. package/src/components/ui/field/index.ts +22 -22
  204. package/src/components/ui/file-dropzone/FileDropzone.vue +144 -144
  205. package/src/components/ui/file-dropzone/index.ts +19 -19
  206. package/src/components/ui/hover-card/HoverCard.vue +5 -5
  207. package/src/components/ui/hover-card/HoverCardContent.vue +13 -13
  208. package/src/components/ui/hover-card/HoverCardTrigger.vue +3 -3
  209. package/src/components/ui/input/Input.vue +13 -13
  210. package/src/components/ui/kbd/Kbd.vue +10 -10
  211. package/src/components/ui/kbd/KbdGroup.vue +49 -49
  212. package/src/components/ui/label/Label.vue +7 -7
  213. package/src/components/ui/native-select/NativeSelect.vue +16 -16
  214. package/src/components/ui/native-select/NativeSelectOptGroup.vue +3 -3
  215. package/src/components/ui/native-select/NativeSelectOption.vue +3 -3
  216. package/src/components/ui/number-field/NumberField.vue +88 -88
  217. package/src/components/ui/pagination/Pagination.vue +4 -4
  218. package/src/components/ui/pagination/PaginationContent.vue +4 -4
  219. package/src/components/ui/pagination/PaginationEllipsis.vue +9 -9
  220. package/src/components/ui/pagination/PaginationFirst.vue +8 -8
  221. package/src/components/ui/pagination/PaginationItem.vue +14 -14
  222. package/src/components/ui/pagination/PaginationLast.vue +8 -8
  223. package/src/components/ui/pagination/PaginationNext.vue +8 -8
  224. package/src/components/ui/pagination/PaginationPrevious.vue +8 -8
  225. package/src/components/ui/pagination/SimplePagination.vue +25 -25
  226. package/src/components/ui/pin-input/PinInput.vue +20 -20
  227. package/src/components/ui/pin-input/PinInputInput.vue +17 -17
  228. package/src/components/ui/pin-input/context.ts +1 -1
  229. package/src/components/ui/popover/Popover.vue +3 -3
  230. package/src/components/ui/popover/PopoverAnchor.vue +3 -3
  231. package/src/components/ui/popover/PopoverContent.vue +12 -12
  232. package/src/components/ui/popover/PopoverTrigger.vue +3 -3
  233. package/src/components/ui/progress/Progress.vue +16 -16
  234. package/src/components/ui/radio-group/RadioGroup.vue +7 -7
  235. package/src/components/ui/radio-group/RadioGroupCard.vue +39 -39
  236. package/src/components/ui/radio-group/RadioGroupItem.vue +20 -20
  237. package/src/components/ui/scroll-area/ScrollArea.vue +14 -14
  238. package/src/components/ui/scroll-area/ScrollBar.vue +12 -12
  239. package/src/components/ui/select/Select.vue +3 -3
  240. package/src/components/ui/select/SelectContent.vue +25 -25
  241. package/src/components/ui/select/SelectGroup.vue +3 -3
  242. package/src/components/ui/select/SelectItem.vue +24 -24
  243. package/src/components/ui/select/SelectItemContent.vue +32 -32
  244. package/src/components/ui/select/SelectItemText.vue +3 -3
  245. package/src/components/ui/select/SelectLabel.vue +3 -3
  246. package/src/components/ui/select/SelectScrollDownButton.vue +9 -9
  247. package/src/components/ui/select/SelectScrollUpButton.vue +9 -9
  248. package/src/components/ui/select/SelectSeparator.vue +2 -2
  249. package/src/components/ui/select/SelectTrigger.vue +14 -14
  250. package/src/components/ui/select/SelectValue.vue +3 -3
  251. package/src/components/ui/select/SelectValueContent.vue +39 -39
  252. package/src/components/ui/separator/Separator.vue +7 -7
  253. package/src/components/ui/sheet/Sheet.vue +3 -3
  254. package/src/components/ui/sheet/SheetClose.vue +3 -3
  255. package/src/components/ui/sheet/SheetContent.vue +22 -22
  256. package/src/components/ui/sheet/SheetDescription.vue +3 -3
  257. package/src/components/ui/sheet/SheetFooter.vue +3 -3
  258. package/src/components/ui/sheet/SheetHeader.vue +3 -3
  259. package/src/components/ui/sheet/SheetOverlay.vue +7 -7
  260. package/src/components/ui/sheet/SheetTitle.vue +3 -3
  261. package/src/components/ui/sheet/SheetTrigger.vue +3 -3
  262. package/src/components/ui/sidebar/Sidebar.vue +57 -57
  263. package/src/components/ui/sidebar/SidebarContent.vue +8 -8
  264. package/src/components/ui/sidebar/SidebarFooter.vue +8 -8
  265. package/src/components/ui/sidebar/SidebarGroup.vue +8 -8
  266. package/src/components/ui/sidebar/SidebarGroupAction.vue +9 -9
  267. package/src/components/ui/sidebar/SidebarGroupContent.vue +4 -4
  268. package/src/components/ui/sidebar/SidebarGroupLabel.vue +8 -8
  269. package/src/components/ui/sidebar/SidebarHeader.vue +8 -8
  270. package/src/components/ui/sidebar/SidebarInput.vue +8 -8
  271. package/src/components/ui/sidebar/SidebarInset.vue +9 -9
  272. package/src/components/ui/sidebar/SidebarMenu.vue +4 -4
  273. package/src/components/ui/sidebar/SidebarMenuAction.vue +18 -18
  274. package/src/components/ui/sidebar/SidebarMenuBadge.vue +14 -14
  275. package/src/components/ui/sidebar/SidebarMenuButton.vue +21 -21
  276. package/src/components/ui/sidebar/SidebarMenuButtonChild.vue +10 -10
  277. package/src/components/ui/sidebar/SidebarMenuItem.vue +4 -4
  278. package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +10 -10
  279. package/src/components/ui/sidebar/SidebarMenuSub.vue +9 -9
  280. package/src/components/ui/sidebar/SidebarMenuSubButton.vue +17 -17
  281. package/src/components/ui/sidebar/SidebarMenuSubItem.vue +4 -4
  282. package/src/components/ui/sidebar/SidebarProvider.vue +46 -46
  283. package/src/components/ui/sidebar/SidebarRail.vue +13 -13
  284. package/src/components/ui/sidebar/SidebarSeparator.vue +4 -4
  285. package/src/components/ui/sidebar/SidebarTrigger.vue +5 -5
  286. package/src/components/ui/sidebar/index.ts +29 -29
  287. package/src/components/ui/sidebar/utils.ts +7 -7
  288. package/src/components/ui/skeleton/Skeleton.vue +6 -6
  289. package/src/components/ui/slider/Slider.vue +14 -14
  290. package/src/components/ui/spinner/Spinner.vue +21 -21
  291. package/src/components/ui/stepper/SimpleStepper.vue +26 -26
  292. package/src/components/ui/stepper/Stepper.vue +6 -6
  293. package/src/components/ui/stepper/StepperDescription.vue +5 -5
  294. package/src/components/ui/stepper/StepperIndicator.vue +17 -17
  295. package/src/components/ui/stepper/StepperItem.vue +4 -4
  296. package/src/components/ui/stepper/StepperSeparator.vue +7 -7
  297. package/src/components/ui/stepper/StepperTitle.vue +5 -5
  298. package/src/components/ui/stepper/StepperTrigger.vue +4 -4
  299. package/src/components/ui/stepper/index.ts +3 -3
  300. package/src/components/ui/switch/Switch.vue +15 -15
  301. package/src/components/ui/table/Table.vue +6 -6
  302. package/src/components/ui/table/TableBody.vue +4 -4
  303. package/src/components/ui/table/TableCaption.vue +4 -4
  304. package/src/components/ui/table/TableCell.vue +8 -8
  305. package/src/components/ui/table/TableEmpty.vue +14 -14
  306. package/src/components/ui/table/TableFooter.vue +8 -8
  307. package/src/components/ui/table/TableHead.vue +8 -8
  308. package/src/components/ui/table/TableHeader.vue +4 -4
  309. package/src/components/ui/table/TableRow.vue +8 -8
  310. package/src/components/ui/tabs/Tabs.vue +4 -4
  311. package/src/components/ui/tabs/TabsContent.vue +4 -4
  312. package/src/components/ui/tabs/TabsList.vue +15 -15
  313. package/src/components/ui/tabs/TabsTrigger.vue +10 -10
  314. package/src/components/ui/tags-input/TagsInput.vue +17 -17
  315. package/src/components/ui/tags-input/TagsInputInput.vue +6 -6
  316. package/src/components/ui/tags-input/TagsInputItem.vue +15 -15
  317. package/src/components/ui/tags-input/TagsInputItemDelete.vue +12 -12
  318. package/src/components/ui/tags-input/TagsInputItemText.vue +4 -4
  319. package/src/components/ui/textarea/Textarea.vue +12 -12
  320. package/src/components/ui/time-picker/TimePicker.vue +25 -25
  321. package/src/components/ui/toggle-group/Toggle.vue +10 -10
  322. package/src/components/ui/toggle-group/ToggleGroup.vue +38 -38
  323. package/src/components/ui/toggle-group/ToggleGroupItem.vue +9 -9
  324. package/src/components/ui/toggle-group/index.ts +46 -46
  325. package/src/components/ui/tooltip/Tooltip.vue +3 -3
  326. package/src/components/ui/tooltip/TooltipContent.vue +13 -13
  327. package/src/components/ui/tooltip/TooltipProvider.vue +4 -4
  328. package/src/components/ui/tooltip/TooltipTrigger.vue +3 -3
  329. package/src/i18n/de.json +206 -185
  330. package/src/i18n/en.json +206 -185
  331. package/src/i18n/es.json +206 -185
  332. package/src/i18n/fr.json +206 -185
  333. package/src/i18n/it.json +206 -185
  334. package/src/i18n/ja.json +206 -185
  335. package/src/i18n/pt.json +206 -185
  336. package/src/i18n/ru.json +206 -185
  337. package/src/i18n/zh.json +206 -185
  338. package/src/lib/color-tokens.ts +24 -24
  339. package/src/lib/i18n.ts +65 -65
  340. package/src/lib/utils.ts +33 -33
  341. package/src/nuxt-components.d.ts +2 -2
  342. package/src/runtime/ui-vintage-i18n-plugin.ts +49 -49
  343. package/src/shims-vue.d.ts +3 -3
  344. package/src/styles.css +377 -377
@@ -7,60 +7,60 @@ import { avatarShapeClasses, avatarSizeClasses, avatarTextClasses } from '.';
7
7
 
8
8
  // Props
9
9
  const props = withDefaults(defineProps<{
10
- max?: number;
11
- size?: AvatarSize;
12
- shape?: AvatarShape;
13
- class?: HTMLAttributes['class'];
10
+ max?: number;
11
+ size?: AvatarSize;
12
+ shape?: AvatarShape;
13
+ class?: HTMLAttributes['class'];
14
14
  }>(), {
15
- size: 'md',
16
- shape: 'circle',
15
+ size: 'md',
16
+ shape: 'circle',
17
17
  });
18
18
 
19
19
  const slots = useSlots();
20
20
 
21
21
  // Flatten slot vnodes (v-for fragments) and drop comments / whitespace text
22
22
  function flatten(nodes: VNode[]): VNode[] {
23
- const result: VNode[] = [];
24
- for (const node of nodes) {
25
- if (node.type === Comment) continue;
26
- if (node.type === Text && typeof node.children === 'string' && !node.children.trim()) continue;
27
- if (node.type === Fragment && Array.isArray(node.children)) {
28
- result.push(...flatten(node.children as VNode[]));
29
- continue;
30
- }
31
- result.push(node);
32
- }
33
- return result;
23
+ const result: VNode[] = [];
24
+ for (const node of nodes) {
25
+ if (node.type === Comment) continue;
26
+ if (node.type === Text && typeof node.children === 'string' && !node.children.trim()) continue;
27
+ if (node.type === Fragment && Array.isArray(node.children)) {
28
+ result.push(...flatten(node.children as VNode[]));
29
+ continue;
30
+ }
31
+ result.push(node);
32
+ }
33
+ return result;
34
34
  }
35
35
 
36
36
  // Children are read at render time so slot changes are always reflected
37
37
  function getChildren() {
38
- return flatten(slots.default?.() ?? []);
38
+ return flatten(slots.default?.() ?? []);
39
39
  }
40
40
 
41
41
  // Overlap per size, kept clear of the initials so stacked fallbacks stay readable
42
42
  const overlapClasses: Record<AvatarSize, string> = {
43
- xs: '-space-x-1',
44
- sm: '-space-x-1.5',
45
- md: '-space-x-2',
46
- lg: '-space-x-2.5',
47
- xl: '-space-x-3'
43
+ xs: '-space-x-1',
44
+ sm: '-space-x-1.5',
45
+ md: '-space-x-2',
46
+ lg: '-space-x-2.5',
47
+ xl: '-space-x-3'
48
48
  };
49
49
 
50
50
  // Whether a max limit applies
51
51
  function hasMax() {
52
- return props.max !== undefined && props.max >= 0;
52
+ return props.max !== undefined && props.max >= 0;
53
53
  }
54
54
 
55
55
  // Avatars that fit within max
56
56
  function getVisible() {
57
- const children = getChildren();
58
- return hasMax() ? children.slice(0, props.max) : children;
57
+ const children = getChildren();
58
+ return hasMax() ? children.slice(0, props.max) : children;
59
59
  }
60
60
 
61
61
  // Number of avatars hidden behind the +N bubble
62
62
  function getOverflow() {
63
- return hasMax() ? Math.max(0, getChildren().length - (props.max ?? 0)) : 0;
63
+ return hasMax() ? Math.max(0, getChildren().length - (props.max ?? 0)) : 0;
64
64
  }
65
65
 
66
66
  // Renders a vnode as-is
@@ -68,18 +68,18 @@ const VNodeRenderer = (renderProps: { node: VNode }) => renderProps.node;
68
68
  </script>
69
69
 
70
70
  <template>
71
- <div data-slot="avatar-group" :class="cn(
72
- 'flex items-center',
73
- overlapClasses[props.size],
74
- '*:ring-2 *:ring-background',
75
- props.class
76
- )">
77
- <!-- Visible avatars -->
78
- <VNodeRenderer v-for="(node, index) in getVisible()" :key="node.key ?? index" :node="node" />
71
+ <div data-slot="avatar-group" :class="cn(
72
+ 'flex items-center',
73
+ overlapClasses[props.size],
74
+ '*:ring-2 *:ring-background',
75
+ props.class
76
+ )">
77
+ <!-- Visible avatars -->
78
+ <VNodeRenderer v-for="(node, index) in getVisible()" :key="node.key ?? index" :node="node" />
79
79
 
80
- <!-- Overflow bubble -->
81
- <span v-if="getOverflow() > 0" data-slot="avatar-group-overflow" :class="cn('relative inline-flex shrink-0 select-none items-center justify-center bg-surface font-semibold text-muted-foreground', avatarSizeClasses[props.size], avatarShapeClasses[props.shape], avatarTextClasses[props.size])">
82
- +{{ getOverflow() }}
83
- </span>
84
- </div>
80
+ <!-- Overflow bubble -->
81
+ <span v-if="getOverflow() > 0" data-slot="avatar-group-overflow" :class="cn('relative inline-flex shrink-0 select-none items-center justify-center bg-surface font-semibold text-muted-foreground', avatarSizeClasses[props.size], avatarShapeClasses[props.shape], avatarTextClasses[props.size])">
82
+ +{{ getOverflow() }}
83
+ </span>
84
+ </div>
85
85
  </template>
@@ -7,7 +7,7 @@ import { cn } from '../../../lib/utils';
7
7
 
8
8
  // Props
9
9
  const props = defineProps<AvatarImageProps & {
10
- class?: HTMLAttributes['class'];
10
+ class?: HTMLAttributes['class'];
11
11
  }>();
12
12
 
13
13
  // Emits
@@ -18,6 +18,6 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
18
18
  </script>
19
19
 
20
20
  <template>
21
- <!-- Reka reveals the image only once loaded, which plays the zoom-in entrance -->
22
- <AvatarImage data-slot="avatar-image" v-bind="forwarded" :class="cn('aspect-square size-full object-cover animate-[uv-float-in_420ms_var(--ease-out-expo)_both]', props.class)" />
21
+ <!-- Reka reveals the image only once loaded, which plays the zoom-in entrance -->
22
+ <AvatarImage data-slot="avatar-image" v-bind="forwarded" :class="cn('aspect-square size-full object-cover animate-[uv-float-in_420ms_var(--ease-out-expo)_both]', props.class)" />
23
23
  </template>
@@ -11,26 +11,26 @@ export type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';
11
11
 
12
12
  // Box size per avatar size (24/32/40/48/64px)
13
13
  export const avatarSizeClasses: Record<AvatarSize, string> = {
14
- xs: 'size-6',
15
- sm: 'size-8',
16
- md: 'size-10',
17
- lg: 'size-12',
18
- xl: 'size-16',
14
+ xs: 'size-6',
15
+ sm: 'size-8',
16
+ md: 'size-10',
17
+ lg: 'size-12',
18
+ xl: 'size-16',
19
19
  };
20
20
 
21
21
  // Initials text size per avatar size
22
22
  export const avatarTextClasses: Record<AvatarSize, string> = {
23
- xs: 'text-[10px]',
24
- sm: 'text-xs',
25
- md: 'text-sm',
26
- lg: 'text-base',
27
- xl: 'text-lg',
23
+ xs: 'text-[10px]',
24
+ sm: 'text-xs',
25
+ md: 'text-sm',
26
+ lg: 'text-base',
27
+ xl: 'text-lg',
28
28
  };
29
29
 
30
30
  // Corner radius per avatar shape
31
31
  export const avatarShapeClasses: Record<AvatarShape, string> = {
32
- circle: 'rounded-full',
33
- square: 'rounded',
32
+ circle: 'rounded-full',
33
+ square: 'rounded',
34
34
  };
35
35
 
36
36
  // Context shared by an avatar with its image and fallback
@@ -38,10 +38,10 @@ export const avatarContextKey: InjectionKey<{ size: Ref<AvatarSize>; shape: Ref<
38
38
 
39
39
  // Compute up to 2 initials from a full name
40
40
  export function getInitials(name: string | null | undefined): string {
41
- const words = (name ?? '').trim().split(/\s+/).filter(Boolean);
42
- if (words.length === 0) return '';
41
+ const words = (name ?? '').trim().split(/\s+/).filter(Boolean);
42
+ if (words.length === 0) return '';
43
43
 
44
- // Single word: first two characters, otherwise first letter of the first and last word
45
- if (words.length === 1) return Array.from(words[0]!).slice(0, 2).join('').toUpperCase();
46
- return (Array.from(words[0]!)[0]! + Array.from(words[words.length - 1]!)[0]!).toUpperCase();
44
+ // Single word: first two characters, otherwise first letter of the first and last word
45
+ if (words.length === 1) return Array.from(words[0]!).slice(0, 2).join('').toUpperCase();
46
+ return (Array.from(words[0]!)[0]! + Array.from(words[words.length - 1]!)[0]!).toUpperCase();
47
47
  }
@@ -7,30 +7,30 @@ import type { HugeiconsIconDefinition } from '../../../lib/common-types';
7
7
 
8
8
  // Props
9
9
  const props = withDefaults(defineProps<{
10
- text: string;
11
- icon?: HugeiconsIconDefinition | null;
12
- color?: ToneColor;
13
- dot?: boolean;
14
- pulse?: boolean;
15
- class?: HTMLAttributes['class'];
10
+ text: string;
11
+ icon?: HugeiconsIconDefinition | null;
12
+ color?: ToneColor;
13
+ dot?: boolean;
14
+ pulse?: boolean;
15
+ class?: HTMLAttributes['class'];
16
16
  }>(), {
17
- icon: null,
18
- color: 'gray',
19
- dot: false,
20
- pulse: false
17
+ icon: null,
18
+ color: 'gray',
19
+ dot: false,
20
+ pulse: false
21
21
  });
22
22
  </script>
23
23
 
24
24
  <template>
25
- <span data-slot="badge" :class="cn('inline-flex w-fit items-center justify-center gap-1.5 whitespace-nowrap rounded border px-2 py-0.5 text-xs font-semibold transition-colors duration-150', getSurfaceToneClasses(props.color), props.class)">
26
- <!-- Status dot -->
27
- <span v-if="props.dot || props.pulse" class="relative flex size-1.5 shrink-0">
28
- <span v-if="props.pulse" class="absolute inset-0 animate-uv-ping-soft rounded-full bg-current" />
29
- <span class="relative size-1.5 rounded-full bg-current" />
30
- </span>
25
+ <span data-slot="badge" :class="cn('inline-flex w-fit items-center justify-center gap-1.5 whitespace-nowrap rounded border px-2 py-0.5 text-xs font-semibold transition-colors duration-150', getSurfaceToneClasses(props.color), props.class)">
26
+ <!-- Status dot -->
27
+ <span v-if="props.dot || props.pulse" class="relative flex size-1.5 shrink-0">
28
+ <span v-if="props.pulse" class="absolute inset-0 animate-uv-ping-soft rounded-full bg-current" />
29
+ <span class="relative size-1.5 rounded-full bg-current" />
30
+ </span>
31
31
 
32
- <!-- Icon -->
33
- <HugeiconsIcon v-if="props.icon" :icon="props.icon" class="size-3.5 shrink-0" :stroke-width="1.8" />
34
- {{ props.text }}
35
- </span>
32
+ <!-- Icon -->
33
+ <HugeiconsIcon v-if="props.icon" :icon="props.icon" class="size-3.5 shrink-0" :stroke-width="1.8" />
34
+ {{ props.text }}
35
+ </span>
36
36
  </template>
@@ -4,14 +4,14 @@ import { useI18n } from 'vue-i18n';
4
4
 
5
5
  // Props
6
6
  const props = defineProps<{
7
- class?: HTMLAttributes['class'];
7
+ class?: HTMLAttributes['class'];
8
8
  }>();
9
9
 
10
10
  const { t } = useI18n();
11
11
  </script>
12
12
 
13
13
  <template>
14
- <nav :aria-label="t('uiVintage.common.breadcrumb')" data-slot="breadcrumb" :class="props.class">
15
- <slot />
16
- </nav>
14
+ <nav :aria-label="t('uiVintage.common.breadcrumb')" data-slot="breadcrumb" :class="props.class">
15
+ <slot />
16
+ </nav>
17
17
  </template>
@@ -7,20 +7,20 @@ import { cn } from '../../../lib/utils';
7
7
 
8
8
  // Props
9
9
  const props = defineProps<{
10
- class?: HTMLAttributes['class'];
10
+ class?: HTMLAttributes['class'];
11
11
  }>();
12
12
 
13
13
  const { t } = useI18n();
14
14
  </script>
15
15
 
16
16
  <template>
17
- <span data-slot="breadcrumb-ellipsis" role="presentation" :class="cn('flex size-6 items-center justify-center rounded-sm transition-colors duration-150 hover:bg-accent hover:text-primary', props.class)">
18
- <!-- Default slot content -->
19
- <slot>
20
- <HugeiconsIcon :icon="MoreHorizontalIcon" class="size-4" aria-hidden="true" />
21
- </slot>
17
+ <span data-slot="breadcrumb-ellipsis" role="presentation" :class="cn('flex size-6 items-center justify-center rounded-sm transition-colors duration-150 hover:bg-accent hover:text-primary', props.class)">
18
+ <!-- Default slot content -->
19
+ <slot>
20
+ <HugeiconsIcon :icon="MoreHorizontalIcon" class="size-4" aria-hidden="true" />
21
+ </slot>
22
22
 
23
- <!-- Screen reader text for accessibility -->
24
- <span class="sr-only">{{ t('uiVintage.common.more') }}</span>
25
- </span>
23
+ <!-- Screen reader text for accessibility -->
24
+ <span class="sr-only">{{ t('uiVintage.common.more') }}</span>
25
+ </span>
26
26
  </template>
@@ -4,12 +4,12 @@ import { cn } from '../../../lib/utils';
4
4
 
5
5
  // Props
6
6
  const props = defineProps<{
7
- class?: HTMLAttributes['class'];
7
+ class?: HTMLAttributes['class'];
8
8
  }>();
9
9
  </script>
10
10
 
11
11
  <template>
12
- <li data-slot="breadcrumb-item" :class="cn('inline-flex items-center gap-1.5', props.class)">
13
- <slot />
14
- </li>
12
+ <li data-slot="breadcrumb-item" :class="cn('inline-flex items-center gap-1.5', props.class)">
13
+ <slot />
14
+ </li>
15
15
  </template>
@@ -6,12 +6,12 @@ import { cn } from '../../../lib/utils';
6
6
 
7
7
  // Props
8
8
  const props = withDefaults(defineProps<PrimitiveProps & { class?: HTMLAttributes['class'] }>(), {
9
- as: 'a'
9
+ as: 'a'
10
10
  });
11
11
  </script>
12
12
 
13
13
  <template>
14
- <Primitive data-slot="breadcrumb-link" :as="as" :as-child="asChild" :class="cn('rounded-sm bg-[linear-gradient(currentColor,currentColor)] bg-[length:0%_1px] bg-left-bottom bg-no-repeat text-muted-foreground outline-none transition-[color,background-size] duration-300 ease-out-expo hover:bg-[length:100%_1px] hover:text-primary focus-visible:ring-[3px] focus-visible:ring-ring/45', props.class)">
15
- <slot />
16
- </Primitive>
14
+ <Primitive data-slot="breadcrumb-link" :as="as" :as-child="asChild" :class="cn('rounded-sm bg-[linear-gradient(currentColor,currentColor)] bg-[length:0%_1px] bg-left-bottom bg-no-repeat text-muted-foreground outline-none transition-[color,background-size] duration-300 ease-out-expo hover:bg-[length:100%_1px] hover:text-primary focus-visible:ring-[3px] focus-visible:ring-ring/45', props.class)">
15
+ <slot />
16
+ </Primitive>
17
17
  </template>
@@ -4,12 +4,12 @@ import { cn } from '../../../lib/utils';
4
4
 
5
5
  // Props
6
6
  const props = defineProps<{
7
- class?: HTMLAttributes['class'];
7
+ class?: HTMLAttributes['class'];
8
8
  }>();
9
9
  </script>
10
10
 
11
11
  <template>
12
- <ol data-slot="breadcrumb-list" :class="cn('flex w-fit max-w-full flex-wrap items-center gap-1.5 rounded border border-border bg-card px-3 py-1.5 text-xs wrap-break-word text-muted-foreground shadow-elevated-sm sm:gap-2 sm:text-sm', props.class)">
13
- <slot />
14
- </ol>
12
+ <ol data-slot="breadcrumb-list" :class="cn('flex w-fit max-w-full flex-wrap items-center gap-1.5 rounded border border-border bg-card px-3 py-1.5 text-xs wrap-break-word text-muted-foreground shadow-elevated-sm sm:gap-2 sm:text-sm', props.class)">
13
+ <slot />
14
+ </ol>
15
15
  </template>
@@ -4,12 +4,12 @@ import { cn } from '../../../lib/utils';
4
4
 
5
5
  // Props
6
6
  const props = defineProps<{
7
- class?: HTMLAttributes['class'];
7
+ class?: HTMLAttributes['class'];
8
8
  }>();
9
9
  </script>
10
10
 
11
11
  <template>
12
- <span data-slot="breadcrumb-page" role="link" aria-disabled="true" aria-current="page" :class="cn('min-w-0 font-semibold text-foreground', props.class)">
13
- <slot />
14
- </span>
12
+ <span data-slot="breadcrumb-page" role="link" aria-disabled="true" aria-current="page" :class="cn('min-w-0 font-semibold text-foreground', props.class)">
13
+ <slot />
14
+ </span>
15
15
  </template>
@@ -4,12 +4,12 @@ import { cn } from '../../../lib/utils';
4
4
 
5
5
  // Props
6
6
  const props = defineProps<{
7
- class?: HTMLAttributes['class'];
7
+ class?: HTMLAttributes['class'];
8
8
  }>();
9
9
  </script>
10
10
 
11
11
  <template>
12
- <li data-slot="breadcrumb-separator" role="presentation" aria-hidden="true" :class="cn('font-semibold text-primary/50 select-none [&>svg]:size-3.5', props.class)">
13
- <slot>/</slot>
14
- </li>
12
+ <li data-slot="breadcrumb-separator" role="presentation" aria-hidden="true" :class="cn('font-semibold text-primary/50 select-none [&>svg]:size-3.5', props.class)">
13
+ <slot>/</slot>
14
+ </li>
15
15
  </template>
@@ -6,12 +6,12 @@ import { Spinner } from '../spinner';
6
6
 
7
7
  // Props
8
8
  const props = withDefaults(defineProps<{
9
- show?: boolean;
10
- label?: string;
11
- class?: HTMLAttributes['class'];
12
- overlayClass?: HTMLAttributes['class'];
9
+ show?: boolean;
10
+ label?: string;
11
+ class?: HTMLAttributes['class'];
12
+ overlayClass?: HTMLAttributes['class'];
13
13
  }>(), {
14
- show: false
14
+ show: false
15
15
  });
16
16
 
17
17
  const message = useUiVintageMessage();
@@ -19,57 +19,57 @@ const resolvedLabel = computed(() => props.label || message('uiVintage.common.lo
19
19
  </script>
20
20
 
21
21
  <template>
22
- <Transition name="uv-busy">
23
- <div v-if="props.show" data-slot="busy-overlay" :class="cn(
24
- 'fixed inset-0 z-50 flex items-center justify-center bg-black/40 backdrop-blur-[3px] dark:bg-black/60',
25
- props.overlayClass,
26
- )">
27
- <div data-slot="busy-content" role="status" aria-live="polite" aria-busy="true" :class="cn(
28
- 'uv-busy-card bg-card text-card-foreground flex w-72 flex-col items-center justify-center gap-4 rounded border border-border px-8 py-7 text-center shadow-elevated-xl',
29
- props.class,
30
- )">
31
- <slot>
32
- <!-- Spinner (decorative: the container already announces the label) -->
33
- <Spinner data-slot="busy-spinner" size="xl" aria-hidden="true" class="text-primary" />
22
+ <Transition name="uv-busy">
23
+ <div v-if="props.show" data-slot="busy-overlay" :class="cn(
24
+ 'fixed inset-0 z-50 flex items-center justify-center bg-black/40 backdrop-blur-[3px] dark:bg-black/60',
25
+ props.overlayClass,
26
+ )">
27
+ <div data-slot="busy-content" role="status" aria-live="polite" aria-busy="true" :class="cn(
28
+ 'uv-busy-card bg-card text-card-foreground flex w-72 flex-col items-center justify-center gap-4 rounded border border-border px-8 py-7 text-center shadow-elevated-xl',
29
+ props.class,
30
+ )">
31
+ <slot>
32
+ <!-- Spinner (decorative: the container already announces the label) -->
33
+ <Spinner data-slot="busy-spinner" size="xl" aria-hidden="true" class="text-primary" />
34
34
 
35
- <!-- Label -->
36
- <span v-if="resolvedLabel" data-slot="busy-label" class="text-xs font-semibold text-foreground sm:text-sm">
37
- {{ resolvedLabel }}
38
- </span>
39
- </slot>
40
- </div>
41
- </div>
42
- </Transition>
35
+ <!-- Label -->
36
+ <span v-if="resolvedLabel" data-slot="busy-label" class="text-xs font-semibold text-foreground sm:text-sm">
37
+ {{ resolvedLabel }}
38
+ </span>
39
+ </slot>
40
+ </div>
41
+ </div>
42
+ </Transition>
43
43
  </template>
44
44
 
45
45
  <style scoped>
46
46
  .uv-busy-enter-active {
47
- transition: opacity 0.25s var(--ease-out-expo);
47
+ transition: opacity 0.25s var(--ease-out-expo);
48
48
  }
49
49
 
50
50
  .uv-busy-leave-active {
51
- transition: opacity 0.18s var(--ease-snappy);
51
+ transition: opacity 0.18s var(--ease-snappy);
52
52
  }
53
53
 
54
54
  .uv-busy-enter-from,
55
55
  .uv-busy-leave-to {
56
- opacity: 0;
56
+ opacity: 0;
57
57
  }
58
58
 
59
59
  .uv-busy-enter-active .uv-busy-card {
60
- transition: transform 0.45s var(--ease-spring), filter 0.3s var(--ease-out-expo);
60
+ transition: transform 0.45s var(--ease-spring), filter 0.3s var(--ease-out-expo);
61
61
  }
62
62
 
63
63
  .uv-busy-leave-active .uv-busy-card {
64
- transition: transform 0.18s var(--ease-snappy);
64
+ transition: transform 0.18s var(--ease-snappy);
65
65
  }
66
66
 
67
67
  .uv-busy-enter-from .uv-busy-card {
68
- transform: translateY(10px) scale(0.92);
69
- filter: blur(4px);
68
+ transform: translateY(10px) scale(0.92);
69
+ filter: blur(4px);
70
70
  }
71
71
 
72
72
  .uv-busy-leave-to .uv-busy-card {
73
- transform: scale(0.96);
73
+ transform: scale(0.96);
74
74
  }
75
75
  </style>
@@ -9,34 +9,34 @@ import { buttonVariants } from '.';
9
9
 
10
10
  // Props
11
11
  const props = withDefaults(defineProps<PrimitiveProps & {
12
- variant?: ButtonVariants['variant'];
13
- size?: ButtonVariants['size'];
14
- loading?: boolean;
15
- disabled?: boolean;
16
- class?: HTMLAttributes['class'];
12
+ variant?: ButtonVariants['variant'];
13
+ size?: ButtonVariants['size'];
14
+ loading?: boolean;
15
+ disabled?: boolean;
16
+ class?: HTMLAttributes['class'];
17
17
  }>(), {
18
- as: 'button',
19
- loading: false,
20
- disabled: false
18
+ as: 'button',
19
+ loading: false,
20
+ disabled: false
21
21
  });
22
22
  </script>
23
23
 
24
24
  <template>
25
- <Primitive data-slot="button" :data-variant="variant" :data-size="size" :data-loading="props.loading ? '' : undefined" :aria-busy="props.loading || undefined" :disabled="props.disabled || props.loading || undefined" :as="as" :as-child="asChild" :class="cn(buttonVariants({ variant, size }), props.class)">
26
- <!-- As-child buttons delegate rendering to the slotted element -->
27
- <slot v-if="asChild" />
25
+ <Primitive data-slot="button" :data-variant="variant" :data-size="size" :data-loading="props.loading ? '' : undefined" :aria-busy="props.loading || undefined" :disabled="props.disabled || props.loading || undefined" :as="as" :as-child="asChild" :class="cn(buttonVariants({ variant, size }), props.class)">
26
+ <!-- As-child buttons delegate rendering to the slotted element -->
27
+ <slot v-if="asChild" />
28
28
 
29
- <template v-else>
30
- <!-- Content (kept in the layout while loading so the width never jumps) -->
31
- <span v-if="props.loading" class="invisible contents">
32
- <slot />
33
- </span>
34
- <slot v-else />
29
+ <template v-else>
30
+ <!-- Content (kept in the layout while loading so the width never jumps) -->
31
+ <span v-if="props.loading" class="invisible contents">
32
+ <slot />
33
+ </span>
34
+ <slot v-else />
35
35
 
36
- <!-- Loading indicator -->
37
- <span v-if="props.loading" class="absolute inset-0 flex items-center justify-center">
38
- <Spinner size="sm" />
39
- </span>
40
- </template>
41
- </Primitive>
36
+ <!-- Loading indicator -->
37
+ <span v-if="props.loading" class="absolute inset-0 flex items-center justify-center">
38
+ <Spinner size="sm" />
39
+ </span>
40
+ </template>
41
+ </Primitive>
42
42
  </template>