@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
@@ -9,20 +9,20 @@ import type { HugeiconsIconDefinition } from '../../../lib/common-types';
9
9
 
10
10
  // Props
11
11
  const props = withDefaults(defineProps<{
12
- title: string;
13
- initiallyExpanded?: boolean;
14
- open?: boolean;
15
- icon?: HugeiconsIconDefinition | null;
16
- iconClass?: HTMLAttributes['class'];
17
- class?: HTMLAttributes['class'];
12
+ title: string;
13
+ initiallyExpanded?: boolean;
14
+ open?: boolean;
15
+ icon?: HugeiconsIconDefinition | null;
16
+ iconClass?: HTMLAttributes['class'];
17
+ class?: HTMLAttributes['class'];
18
18
  }>(), {
19
- initiallyExpanded: false,
20
- open: undefined
19
+ initiallyExpanded: false,
20
+ open: undefined
21
21
  });
22
22
 
23
23
  // Emits
24
24
  const emits = defineEmits<{
25
- 'update:open': [value: boolean];
25
+ 'update:open': [value: boolean];
26
26
  }>();
27
27
 
28
28
  const contentId = useId();
@@ -34,40 +34,40 @@ const expanded = computed(() => props.open ?? internalExpanded.value);
34
34
 
35
35
  // Toggle expanded state
36
36
  const toggleExpanded = () => {
37
- const nextValue = !expanded.value;
38
- internalExpanded.value = nextValue;
39
- emits('update:open', nextValue);
37
+ const nextValue = !expanded.value;
38
+ internalExpanded.value = nextValue;
39
+ emits('update:open', nextValue);
40
40
  };
41
41
  </script>
42
42
 
43
43
  <template>
44
- <Card :data-state="expanded ? 'open' : 'closed'" :class="cn('group/accordion gap-0! overflow-hidden p-0!', props.class)">
45
- <!-- Header -->
46
- <button :id="triggerId" type="button" :aria-expanded="expanded" :aria-controls="contentId" class="group/trigger flex w-full cursor-pointer items-center gap-3 px-5 py-3.5 text-left outline-none focus-visible:bg-surface focus-visible:ring-[3px] focus-visible:ring-inset focus-visible:ring-ring/40" @click="toggleExpanded">
47
- <!-- Icon -->
48
- <span v-if="props.icon" class="flex size-7 shrink-0 items-center justify-center rounded border border-primary/30 text-primary">
49
- <HugeiconsIcon :icon="props.icon" :class="cn('size-3.5', props.iconClass)" />
50
- </span>
44
+ <Card :data-state="expanded ? 'open' : 'closed'" :class="cn('group/accordion gap-0! overflow-hidden p-0!', props.class)">
45
+ <!-- Header -->
46
+ <button :id="triggerId" type="button" :aria-expanded="expanded" :aria-controls="contentId" class="group/trigger flex w-full cursor-pointer items-center gap-3 px-5 py-3.5 text-left outline-none focus-visible:bg-surface focus-visible:ring-[3px] focus-visible:ring-inset focus-visible:ring-ring/40" @click="toggleExpanded">
47
+ <!-- Icon -->
48
+ <span v-if="props.icon" class="flex size-7 shrink-0 items-center justify-center rounded border border-primary/30 text-primary">
49
+ <HugeiconsIcon :icon="props.icon" :class="cn('size-3.5', props.iconClass)" />
50
+ </span>
51
51
 
52
- <!-- Title -->
53
- <span class="min-w-0 flex-1 text-sm font-semibold text-foreground">
54
- {{ props.title }}
55
- </span>
52
+ <!-- Title -->
53
+ <span class="min-w-0 flex-1 text-sm font-semibold text-foreground">
54
+ {{ props.title }}
55
+ </span>
56
56
 
57
- <!-- Optional content before the toggle icon -->
58
- <slot name="trailing" />
57
+ <!-- Optional content before the toggle icon -->
58
+ <slot name="trailing" />
59
59
 
60
- <!-- Toggle icon -->
61
- <HugeiconsIcon :icon="ArrowDown01Icon" class="size-4 shrink-0 text-muted-foreground transition-[rotate,color] duration-[420ms] ease-spring group-hover/trigger:text-primary group-data-[state=open]/accordion:rotate-180 group-data-[state=open]/accordion:text-primary" />
62
- </button>
60
+ <!-- Toggle icon -->
61
+ <HugeiconsIcon :icon="ArrowDown01Icon" class="size-4 shrink-0 text-muted-foreground transition-[rotate,color] duration-[420ms] ease-spring group-hover/trigger:text-primary group-data-[state=open]/accordion:rotate-180 group-data-[state=open]/accordion:text-primary" />
62
+ </button>
63
63
 
64
- <!-- Content -->
65
- <div :id="contentId" role="region" :aria-labelledby="triggerId" :aria-hidden="!expanded" :inert="!expanded || undefined" :class="['grid transition-[grid-template-rows,opacity] duration-[380ms] ease-out-expo', expanded ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0']">
66
- <div class="overflow-hidden">
67
- <div :class="['border-t border-border px-5 py-4 transition-[translate,filter] duration-[420ms] ease-spring', expanded ? 'translate-y-0 blur-none' : '-translate-y-2 blur-[2px]']">
68
- <slot />
69
- </div>
70
- </div>
71
- </div>
72
- </Card>
73
- </template>
64
+ <!-- Content -->
65
+ <div :id="contentId" role="region" :aria-labelledby="triggerId" :aria-hidden="!expanded" :inert="!expanded || undefined" :class="['grid transition-[grid-template-rows,opacity] duration-[380ms] ease-out-expo', expanded ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0']">
66
+ <div class="overflow-hidden">
67
+ <div :class="['border-t border-border px-5 py-4 transition-[translate,filter] duration-[420ms] ease-spring', expanded ? 'translate-y-0 blur-none' : '-translate-y-2 blur-[2px]']">
68
+ <slot />
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </Card>
73
+ </template>
@@ -6,13 +6,13 @@ import { alertClasses, type AlertColors } from '.';
6
6
 
7
7
  // Props
8
8
  const props = defineProps<{
9
- class?: HTMLAttributes['class'];
10
- color?: AlertColors['color'];
9
+ class?: HTMLAttributes['class'];
10
+ color?: AlertColors['color'];
11
11
  }>();
12
12
  </script>
13
13
 
14
14
  <template>
15
- <div data-slot="alert" role="alert" :class="cn(alertClasses(), getSurfaceToneClasses(props.color ?? 'gray'), props.class)">
16
- <slot />
17
- </div>
15
+ <div data-slot="alert" role="alert" :class="cn(alertClasses(), getSurfaceToneClasses(props.color ?? 'gray'), props.class)">
16
+ <slot />
17
+ </div>
18
18
  </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
- <div data-slot="alert-description" :class="cn('col-start-2 grid justify-items-start gap-1 [&_p]:leading-relaxed', props.class)">
13
- <slot />
14
- </div>
12
+ <div data-slot="alert-description" :class="cn('col-start-2 grid justify-items-start gap-1 [&_p]:leading-relaxed', props.class)">
13
+ <slot />
14
+ </div>
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
- <div data-slot="alert-title" :class="cn('col-start-2 line-clamp-1 min-h-4 font-semibold tracking-tight text-current', props.class)">
13
- <slot />
14
- </div>
12
+ <div data-slot="alert-title" :class="cn('col-start-2 line-clamp-1 min-h-4 font-semibold tracking-tight text-current', props.class)">
13
+ <slot />
14
+ </div>
15
15
  </template>
@@ -7,9 +7,9 @@ export { default as AlertDescription } from './AlertDescription.vue';
7
7
  export { default as AlertTitle } from './AlertTitle.vue';
8
8
 
9
9
  export type AlertColors = {
10
- color?: ToneColor | null | undefined;
10
+ color?: ToneColor | null | undefined;
11
11
  };
12
12
 
13
13
  export const alertClasses: (props?: ClassProp) => string = cva(
14
- 'relative w-full rounded px-3 py-2 text-xs transition-colors duration-300 ease-in-out grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 content-start items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current sm:px-4 sm:py-3 sm:text-sm',
14
+ 'relative w-full rounded px-3 py-2 text-xs transition-colors duration-300 ease-in-out grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 content-start items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current sm:px-4 sm:py-3 sm:text-sm',
15
15
  );
@@ -13,7 +13,7 @@ const forwarded = useForwardPropsEmits(props, emits);
13
13
  </script>
14
14
 
15
15
  <template>
16
- <AlertDialogRoot v-slot="slotProps" data-slot="alert-dialog" v-bind="forwarded">
17
- <slot v-bind="slotProps" />
18
- </AlertDialogRoot>
16
+ <AlertDialogRoot v-slot="slotProps" data-slot="alert-dialog" v-bind="forwarded">
17
+ <slot v-bind="slotProps" />
18
+ </AlertDialogRoot>
19
19
  </template>
@@ -14,7 +14,7 @@ const delegatedProps = reactiveOmit(props, 'class');
14
14
  </script>
15
15
 
16
16
  <template>
17
- <AlertDialogAction v-bind="delegatedProps" :class="cn(buttonVariants(), props.class)">
18
- <slot />
19
- </AlertDialogAction>
17
+ <AlertDialogAction v-bind="delegatedProps" :class="cn(buttonVariants(), props.class)">
18
+ <slot />
19
+ </AlertDialogAction>
20
20
  </template>
@@ -14,7 +14,7 @@ const delegatedProps = reactiveOmit(props, 'class');
14
14
  </script>
15
15
 
16
16
  <template>
17
- <AlertDialogCancel v-bind="delegatedProps" :class="cn(buttonVariants({ variant: 'secondary' }), 'mt-2 sm:mt-0', props.class)">
18
- <slot />
19
- </AlertDialogCancel>
17
+ <AlertDialogCancel v-bind="delegatedProps" :class="cn(buttonVariants({ variant: 'secondary' }), 'mt-2 sm:mt-0', props.class)">
18
+ <slot />
19
+ </AlertDialogCancel>
20
20
  </template>
@@ -7,7 +7,7 @@ import { cn } from '../../../lib/utils';
7
7
 
8
8
  // Keep attrs on the dialog content element
9
9
  defineOptions({
10
- inheritAttrs: false
10
+ inheritAttrs: false
11
11
  });
12
12
 
13
13
  // Props
@@ -24,10 +24,10 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
24
24
  </script>
25
25
 
26
26
  <template>
27
- <AlertDialogPortal>
28
- <AlertDialogOverlay data-slot="alert-dialog-overlay" class="uv-overlay-motion fixed inset-0 z-50 bg-black/40 backdrop-blur-[3px] dark:bg-black/60" />
29
- <AlertDialogContent data-slot="alert-dialog-content" v-bind="{ ...$attrs, ...forwarded }" :class="cn('uv-modal-motion bg-card text-card-foreground fixed top-[50%] left-[50%] z-50 grid w-[95%] max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-0 overflow-hidden rounded border border-border shadow-elevated-xl sm:max-w-lg', props.class)">
30
- <slot />
31
- </AlertDialogContent>
32
- </AlertDialogPortal>
27
+ <AlertDialogPortal>
28
+ <AlertDialogOverlay data-slot="alert-dialog-overlay" class="uv-overlay-motion fixed inset-0 z-50 bg-black/40 backdrop-blur-[3px] dark:bg-black/60" />
29
+ <AlertDialogContent data-slot="alert-dialog-content" v-bind="{ ...$attrs, ...forwarded }" :class="cn('uv-modal-motion bg-card text-card-foreground fixed top-[50%] left-[50%] z-50 grid w-[95%] max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-0 overflow-hidden rounded border border-border shadow-elevated-xl sm:max-w-lg', props.class)">
30
+ <slot />
31
+ </AlertDialogContent>
32
+ </AlertDialogPortal>
33
33
  </template>
@@ -13,7 +13,7 @@ const delegatedProps = reactiveOmit(props, 'class');
13
13
  </script>
14
14
 
15
15
  <template>
16
- <AlertDialogDescription data-slot="alert-dialog-description" v-bind="delegatedProps" :class="cn('text-xs leading-6 text-muted-foreground sm:text-sm', props.class)">
17
- <slot />
18
- </AlertDialogDescription>
16
+ <AlertDialogDescription data-slot="alert-dialog-description" v-bind="delegatedProps" :class="cn('text-xs leading-6 text-muted-foreground sm:text-sm', props.class)">
17
+ <slot />
18
+ </AlertDialogDescription>
19
19
  </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
- <div data-slot="alert-dialog-footer" :class="cn('flex flex-col-reverse gap-3 border-t border-border bg-surface/60 px-5 py-4 sm:flex-row-reverse sm:px-6', props.class)">
13
- <slot />
14
- </div>
12
+ <div data-slot="alert-dialog-footer" :class="cn('flex flex-col-reverse gap-3 border-t border-border bg-surface/60 px-5 py-4 sm:flex-row-reverse sm:px-6', props.class)">
13
+ <slot />
14
+ </div>
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
- <div data-slot="alert-dialog-header" :class="cn('flex flex-col gap-1.5 text-center sm:text-left', props.class)">
13
- <slot />
14
- </div>
12
+ <div data-slot="alert-dialog-header" :class="cn('flex flex-col gap-1.5 text-center sm:text-left', props.class)">
13
+ <slot />
14
+ </div>
15
15
  </template>
@@ -13,7 +13,7 @@ const delegatedProps = reactiveOmit(props, 'class');
13
13
  </script>
14
14
 
15
15
  <template>
16
- <AlertDialogTitle data-slot="alert-dialog-title" v-bind="delegatedProps" :class="cn('text-base font-semibold', props.class)">
17
- <slot />
18
- </AlertDialogTitle>
16
+ <AlertDialogTitle data-slot="alert-dialog-title" v-bind="delegatedProps" :class="cn('text-base font-semibold', props.class)">
17
+ <slot />
18
+ </AlertDialogTitle>
19
19
  </template>
@@ -7,7 +7,7 @@ const props = defineProps<AlertDialogTriggerProps>();
7
7
  </script>
8
8
 
9
9
  <template>
10
- <AlertDialogTrigger data-slot="alert-dialog-trigger" v-bind="props">
11
- <slot />
12
- </AlertDialogTrigger>
10
+ <AlertDialogTrigger data-slot="alert-dialog-trigger" v-bind="props">
11
+ <slot />
12
+ </AlertDialogTrigger>
13
13
  </template>
@@ -5,21 +5,21 @@ import { cn } from '../../../lib/utils';
5
5
 
6
6
  // Props
7
7
  const props = withDefaults(defineProps<{
8
- value: number;
9
- duration?: number;
10
- locale?: string;
11
- formatOptions?: Intl.NumberFormatOptions;
12
- prefix?: string;
13
- suffix?: string;
14
- animateOnMount?: boolean;
15
- class?: HTMLAttributes['class'];
8
+ value: number;
9
+ duration?: number;
10
+ locale?: string;
11
+ formatOptions?: Intl.NumberFormatOptions;
12
+ prefix?: string;
13
+ suffix?: string;
14
+ animateOnMount?: boolean;
15
+ class?: HTMLAttributes['class'];
16
16
  }>(), {
17
- duration: 900,
18
- locale: undefined,
19
- formatOptions: undefined,
20
- prefix: '',
21
- suffix: '',
22
- animateOnMount: true
17
+ duration: 900,
18
+ locale: undefined,
19
+ formatOptions: undefined,
20
+ prefix: '',
21
+ suffix: '',
22
+ animateOnMount: true
23
23
  });
24
24
 
25
25
  // The server always renders the final value (search engines, link previews and the first paint never see a 0), the count-up only runs for components created in the browser
@@ -32,9 +32,9 @@ let frame: number | null = null;
32
32
 
33
33
  // Format the displayed value
34
34
  const formatter = computed(() => {
35
- // Default to the precision of the target so intermediate frames never show stray decimals
36
- const decimals = (String(props.value).split('.')[1] ?? '').length;
37
- return new Intl.NumberFormat(props.locale, props.formatOptions ?? { minimumFractionDigits: decimals, maximumFractionDigits: decimals });
35
+ // Default to the precision of the target so intermediate frames never show stray decimals
36
+ const decimals = (String(props.value).split('.')[1] ?? '').length;
37
+ return new Intl.NumberFormat(props.locale, props.formatOptions ?? { minimumFractionDigits: decimals, maximumFractionDigits: decimals });
38
38
  });
39
39
  const formattedValue = computed(() => `${props.prefix}${formatter.value.format(displayValue.value)}${props.suffix}`);
40
40
 
@@ -46,32 +46,32 @@ const easeOutExpo = (progress: number) => progress === 1 ? 1 : 1 - Math.pow(2, -
46
46
 
47
47
  // Tween from the current displayed value to the target value
48
48
  const animateTo = (target: number) => {
49
- if (frame !== null) cancelAnimationFrame(frame);
49
+ if (frame !== null) cancelAnimationFrame(frame);
50
50
 
51
- // Jump straight to the value when motion is reduced or unavailable
52
- const prefersReducedMotion = typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;
53
- if (typeof requestAnimationFrame === 'undefined' || prefersReducedMotion || props.duration <= 0) {
54
- displayValue.value = target;
55
- return;
56
- }
51
+ // Jump straight to the value when motion is reduced or unavailable
52
+ const prefersReducedMotion = typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;
53
+ if (typeof requestAnimationFrame === 'undefined' || prefersReducedMotion || props.duration <= 0) {
54
+ displayValue.value = target;
55
+ return;
56
+ }
57
57
 
58
- const from = displayValue.value;
59
- const start = performance.now();
60
- direction.value = target >= from ? 'up' : 'down';
58
+ const from = displayValue.value;
59
+ const start = performance.now();
60
+ direction.value = target >= from ? 'up' : 'down';
61
61
 
62
- // Advance one frame of the tween
63
- const step = (now: number) => {
64
- const progress = Math.min(1, (now - start) / props.duration);
65
- displayValue.value = from + (target - from) * easeOutExpo(progress);
66
- if (progress < 1) {
67
- frame = requestAnimationFrame(step);
68
- } else {
69
- displayValue.value = target;
70
- direction.value = null;
71
- frame = null;
72
- }
73
- };
74
- frame = requestAnimationFrame(step);
62
+ // Advance one frame of the tween
63
+ const step = (now: number) => {
64
+ const progress = Math.min(1, (now - start) / props.duration);
65
+ displayValue.value = from + (target - from) * easeOutExpo(progress);
66
+ if (progress < 1) {
67
+ frame = requestAnimationFrame(step);
68
+ } else {
69
+ displayValue.value = target;
70
+ direction.value = null;
71
+ frame = null;
72
+ }
73
+ };
74
+ frame = requestAnimationFrame(step);
75
75
  };
76
76
 
77
77
  // Re-animate whenever the value changes
@@ -79,24 +79,25 @@ watch(() => props.value, value => animateTo(value));
79
79
 
80
80
  // When hydrating server HTML (the element already exists before the first render), keep the final value the server rendered, so there is no mismatch and no flash to 0
81
81
  onBeforeMount(() => {
82
- isHydrated = !!instance?.vnode.el;
83
- if (isHydrated) displayValue.value = props.value;
82
+ isHydrated = !!instance?.vnode.el;
83
+ if (isHydrated) displayValue.value = props.value;
84
84
  });
85
85
 
86
86
  // Count up on mount (only for components created in the browser, server-rendered ones already show the final value)
87
87
  onMounted(() => {
88
- if (props.animateOnMount && !isHydrated) animateTo(props.value);
88
+ if (props.animateOnMount && !isHydrated) animateTo(props.value);
89
89
  });
90
90
 
91
91
  // Stop any pending frame
92
92
  onBeforeUnmount(() => {
93
- if (frame !== null) cancelAnimationFrame(frame);
93
+ if (frame !== null) cancelAnimationFrame(frame);
94
94
  });
95
95
  </script>
96
96
 
97
97
  <template>
98
- <span data-slot="animated-number" :data-direction="direction ?? undefined" :class="cn('inline-block tabular-nums', props.class)">
99
- <span aria-hidden="true">{{ formattedValue }}</span>
100
- <span class="sr-only">{{ accessibleValue }}</span>
101
- </span>
98
+ <!-- The server and the browser can format the same number differently (e.g. Node writes "1000" and Chrome "1.000" in Italian, their locale data differ), so a text mismatch is expected and the browser's formatting wins -->
99
+ <span data-slot="animated-number" :data-direction="direction ?? undefined" :class="cn('inline-block tabular-nums', props.class)">
100
+ <span aria-hidden="true" data-allow-mismatch="text">{{ formattedValue }}</span>
101
+ <span class="sr-only" data-allow-mismatch="text">{{ accessibleValue }}</span>
102
+ </span>
102
103
  </template>
@@ -11,13 +11,13 @@ import { avatarContextKey, avatarShapeClasses, avatarSizeClasses } from '.';
11
11
 
12
12
  // Props
13
13
  const props = withDefaults(defineProps<AvatarRootProps & {
14
- size?: AvatarSize;
15
- shape?: AvatarShape;
16
- status?: AvatarStatus;
17
- class?: HTMLAttributes['class'];
14
+ size?: AvatarSize;
15
+ shape?: AvatarShape;
16
+ status?: AvatarStatus;
17
+ class?: HTMLAttributes['class'];
18
18
  }>(), {
19
- size: 'md',
20
- shape: 'circle',
19
+ size: 'md',
20
+ shape: 'circle',
21
21
  });
22
22
 
23
23
  const delegatedProps = reactiveOmit(props, 'class', 'size', 'shape', 'status');
@@ -29,19 +29,19 @@ provide(avatarContextKey, { size: toRef(props, 'size'), shape: toRef(props, 'sha
29
29
 
30
30
  // Status dot size scales with the avatar
31
31
  const statusSizeClasses: Record<AvatarSize, string> = {
32
- xs: 'size-2',
33
- sm: 'size-2.5',
34
- md: 'size-3',
35
- lg: 'size-3.5',
36
- xl: 'size-4',
32
+ xs: 'size-2',
33
+ sm: 'size-2.5',
34
+ md: 'size-3',
35
+ lg: 'size-3.5',
36
+ xl: 'size-4',
37
37
  };
38
38
 
39
39
  // Status dot color
40
40
  const statusColorClasses: Record<AvatarStatus, string> = {
41
- online: 'bg-success',
42
- offline: 'bg-muted-foreground',
43
- busy: 'bg-destructive',
44
- away: 'bg-warning',
41
+ online: 'bg-success',
42
+ offline: 'bg-muted-foreground',
43
+ busy: 'bg-destructive',
44
+ away: 'bg-warning',
45
45
  };
46
46
 
47
47
  // Square avatars tuck the dot slightly outside the corner
@@ -49,18 +49,18 @@ const statusPositionClass = computed(() => props.shape === 'square' ? '-right-0.
49
49
  </script>
50
50
 
51
51
  <template>
52
- <span data-slot="avatar" :data-size="props.size" :data-shape="props.shape" :data-status="props.status" :class="cn('relative inline-flex shrink-0 select-none align-middle', avatarSizeClasses[props.size], avatarShapeClasses[props.shape], props.class)">
53
- <!-- Avatar surface -->
54
- <AvatarRoot v-bind="delegatedProps" :class="cn('relative flex size-full items-center justify-center overflow-hidden bg-surface', avatarShapeClasses[props.shape])">
55
- <slot />
56
- </AvatarRoot>
52
+ <span data-slot="avatar" :data-size="props.size" :data-shape="props.shape" :data-status="props.status" :class="cn('relative inline-flex shrink-0 select-none align-middle', avatarSizeClasses[props.size], avatarShapeClasses[props.shape], props.class)">
53
+ <!-- Avatar surface -->
54
+ <AvatarRoot v-bind="delegatedProps" :class="cn('relative flex size-full items-center justify-center overflow-hidden bg-surface', avatarShapeClasses[props.shape])">
55
+ <slot />
56
+ </AvatarRoot>
57
57
 
58
- <!-- Status dot -->
59
- <span v-if="props.status" data-slot="avatar-status" :class="cn('absolute rounded-full ring-2 ring-background', statusSizeClasses[props.size], statusPositionClass)">
60
- <!-- Soft halo for online presence -->
61
- <span v-if="props.status === 'online'" aria-hidden="true" :class="cn('absolute inset-0 rounded-full animate-uv-ping-soft', statusColorClasses[props.status])" />
62
- <span aria-hidden="true" :class="cn('relative block size-full rounded-full animate-uv-pop', statusColorClasses[props.status])" />
63
- <span class="sr-only">{{ t(`uiVintage.avatar.status.${props.status}`) }}</span>
64
- </span>
65
- </span>
58
+ <!-- Status dot -->
59
+ <span v-if="props.status" data-slot="avatar-status" :class="cn('absolute rounded-full ring-2 ring-background', statusSizeClasses[props.size], statusPositionClass)">
60
+ <!-- Soft halo for online presence -->
61
+ <span v-if="props.status === 'online'" aria-hidden="true" :class="cn('absolute inset-0 rounded-full animate-uv-ping-soft', statusColorClasses[props.status])" />
62
+ <span aria-hidden="true" :class="cn('relative block size-full rounded-full animate-uv-pop', statusColorClasses[props.status])" />
63
+ <span class="sr-only">{{ t(`uiVintage.avatar.status.${props.status}`) }}</span>
64
+ </span>
65
+ </span>
66
66
  </template>
@@ -9,8 +9,8 @@ import { avatarContextKey, avatarShapeClasses, avatarTextClasses, getInitials }
9
9
 
10
10
  // Props
11
11
  const props = defineProps<AvatarFallbackProps & {
12
- name?: string;
13
- class?: HTMLAttributes['class'];
12
+ name?: string;
13
+ class?: HTMLAttributes['class'];
14
14
  }>();
15
15
 
16
16
  const delegatedProps = reactiveOmit(props, 'class', 'name');
@@ -25,8 +25,8 @@ const initials = computed(() => getInitials(props.name));
25
25
  </script>
26
26
 
27
27
  <template>
28
- <!-- With a name the initials act as an image of the person, so screen readers announce the name instead of the letters -->
29
- <AvatarFallback data-slot="avatar-fallback" v-bind="delegatedProps" :role="props.name ? 'img' : undefined" :aria-label="props.name || undefined" :class="cn('flex size-full items-center justify-center bg-surface font-semibold uppercase text-muted-foreground', textClass, shapeClass, props.class)">
30
- <slot>{{ initials }}</slot>
31
- </AvatarFallback>
28
+ <!-- With a name the initials act as an image of the person, so screen readers announce the name instead of the letters -->
29
+ <AvatarFallback data-slot="avatar-fallback" v-bind="delegatedProps" :role="props.name ? 'img' : undefined" :aria-label="props.name || undefined" :class="cn('flex size-full items-center justify-center bg-surface font-semibold uppercase text-muted-foreground', textClass, shapeClass, props.class)">
30
+ <slot>{{ initials }}</slot>
31
+ </AvatarFallback>
32
32
  </template>