@brumaombra/ui-vintage 0.9.0 → 0.9.2

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 (337) hide show
  1. package/AGENTS.md +1 -1
  2. package/COMPONENTS.md +1 -1
  3. package/README.md +3 -3
  4. package/module.mjs +43 -43
  5. package/package.json +175 -175
  6. package/src/components/background-grid/BackgroundGrid.vue +4 -4
  7. package/src/components/blog/AllPostsSection.vue +33 -33
  8. package/src/components/blog/BlogContentRenderer.vue +111 -111
  9. package/src/components/blog/BlogFAQSection.vue +20 -20
  10. package/src/components/blog/BlogHeaderSection.vue +81 -81
  11. package/src/components/blog/BlogInfoSection.vue +50 -48
  12. package/src/components/blog/BlogPostHeader.vue +135 -135
  13. package/src/components/blog/BlogProgressBar.vue +33 -33
  14. package/src/components/blog/BlogSectionTitle.vue +22 -22
  15. package/src/components/blog/BlogTagsSection.vue +25 -25
  16. package/src/components/blog/CategoriesList.vue +14 -14
  17. package/src/components/blog/CategoriesSection.vue +11 -11
  18. package/src/components/blog/CategoryCard.vue +27 -26
  19. package/src/components/blog/HeaderCarousel.vue +99 -98
  20. package/src/components/blog/PostCard.vue +34 -34
  21. package/src/components/blog/PostsList.vue +15 -15
  22. package/src/components/blog/SocialShareSidebar.vue +92 -85
  23. package/src/components/blog/TableOfContents.vue +310 -308
  24. package/src/components/busy-indicator/BusyIndicator.vue +7 -7
  25. package/src/components/busy-indicator/busy-indicator-state.ts +56 -56
  26. package/src/components/card-grid/CardGrid.vue +35 -35
  27. package/src/components/chip/Chip.vue +16 -16
  28. package/src/components/confirm-dialog/ConfirmDialog.vue +51 -51
  29. package/src/components/confirm-dialog/confirm-dialog-state.ts +131 -131
  30. package/src/components/content/BlogList.vue +32 -31
  31. package/src/components/content/BlogTable.vue +36 -36
  32. package/src/components/content/CodeBlock.vue +139 -137
  33. package/src/components/content/Flow.vue +60 -60
  34. package/src/components/content/ProseHr.vue +16 -16
  35. package/src/components/content/ProsePre.vue +12 -12
  36. package/src/components/content/Terminal.vue +62 -60
  37. package/src/components/cookie-consent/CookieConsent.vue +36 -36
  38. package/src/components/cookie-consent/useCookieConsent.ts +37 -37
  39. package/src/components/dashboard-shell/DashboardShell.vue +171 -171
  40. package/src/components/data-list/DataList.vue +6 -6
  41. package/src/components/data-list/DataListItem.vue +4 -4
  42. package/src/components/data-list/DataListLabel.vue +4 -4
  43. package/src/components/data-list/DataListText.vue +4 -4
  44. package/src/components/data-list/DataListValue.vue +4 -4
  45. package/src/components/empty-state-card/EmptyStateCard.vue +41 -41
  46. package/src/components/error-page/ErrorPage.vue +73 -73
  47. package/src/components/info-card/InfoCard.vue +31 -31
  48. package/src/components/landing/landing-content/LandingContent.vue +4 -4
  49. package/src/components/landing/landing-footer/LandingFooter.vue +129 -129
  50. package/src/components/landing/landing-navbar/LandingNavbar.vue +50 -50
  51. package/src/components/landing/landing-shell/LandingShell.vue +36 -36
  52. package/src/components/language-flag/LanguageFlag.vue +25 -25
  53. package/src/components/language-flag/flags/ChineseFlag.vue +8 -8
  54. package/src/components/language-flag/flags/EnglishFlag.vue +7 -7
  55. package/src/components/language-flag/flags/FrenchFlag.vue +5 -5
  56. package/src/components/language-flag/flags/GermanFlag.vue +5 -5
  57. package/src/components/language-flag/flags/ItalianFlag.vue +7 -7
  58. package/src/components/language-flag/flags/JapaneseFlag.vue +4 -4
  59. package/src/components/language-flag/flags/PortugueseFlag.vue +57 -57
  60. package/src/components/language-flag/flags/RussianFlag.vue +5 -5
  61. package/src/components/language-flag/flags/SpanishFlag.vue +4 -4
  62. package/src/components/language-selector/LanguageSelector.vue +77 -77
  63. package/src/components/load-more-button/LoadMoreButton.vue +19 -18
  64. package/src/components/loading-state-card/LoadingStateCard.vue +29 -29
  65. package/src/components/message-dialog/MessageDialog.vue +62 -60
  66. package/src/components/message-dialog/message-dialog-state.ts +105 -105
  67. package/src/components/message-toast/MessageToast.vue +153 -150
  68. package/src/components/message-toast/message-toast-state.ts +146 -146
  69. package/src/components/page-header/PageHeader.vue +34 -34
  70. package/src/components/progress-component/ProgressComponent.vue +33 -33
  71. package/src/components/single-value-card/SingleValueCard.vue +59 -58
  72. package/src/components/slider-form-component/SliderFormComponent.vue +36 -36
  73. package/src/components/stat-strip/StatStrip.vue +22 -22
  74. package/src/components/switch-form-component/SwitchFormComponent.vue +20 -20
  75. package/src/components/text-link/TextLink.vue +14 -14
  76. package/src/components/theme-selector/ThemeSelector.vue +65 -62
  77. package/src/components/theme-selector/theme-transition.ts +63 -63
  78. package/src/components/ui/accordion/Accordion.vue +39 -39
  79. package/src/components/ui/alert/Alert.vue +5 -5
  80. package/src/components/ui/alert/AlertDescription.vue +4 -4
  81. package/src/components/ui/alert/AlertTitle.vue +4 -4
  82. package/src/components/ui/alert/index.ts +2 -2
  83. package/src/components/ui/alert-dialog/AlertDialog.vue +3 -3
  84. package/src/components/ui/alert-dialog/AlertDialogAction.vue +3 -3
  85. package/src/components/ui/alert-dialog/AlertDialogCancel.vue +3 -3
  86. package/src/components/ui/alert-dialog/AlertDialogContent.vue +7 -7
  87. package/src/components/ui/alert-dialog/AlertDialogDescription.vue +3 -3
  88. package/src/components/ui/alert-dialog/AlertDialogFooter.vue +4 -4
  89. package/src/components/ui/alert-dialog/AlertDialogHeader.vue +4 -4
  90. package/src/components/ui/alert-dialog/AlertDialogTitle.vue +3 -3
  91. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +3 -3
  92. package/src/components/ui/animated-number/AnimatedNumber.vue +49 -48
  93. package/src/components/ui/avatar/Avatar.vue +28 -28
  94. package/src/components/ui/avatar/AvatarFallback.vue +6 -6
  95. package/src/components/ui/avatar/AvatarGroup.vue +40 -40
  96. package/src/components/ui/avatar/AvatarImage.vue +3 -3
  97. package/src/components/ui/avatar/index.ts +17 -17
  98. package/src/components/ui/badge/Badge.vue +20 -20
  99. package/src/components/ui/breadcrumb/Breadcrumb.vue +4 -4
  100. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +10 -10
  101. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +4 -4
  102. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +4 -4
  103. package/src/components/ui/breadcrumb/BreadcrumbList.vue +4 -4
  104. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +4 -4
  105. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +4 -4
  106. package/src/components/ui/busy/Busy.vue +33 -33
  107. package/src/components/ui/button/Button.vue +23 -23
  108. package/src/components/ui/button/index.ts +56 -56
  109. package/src/components/ui/calendar/Calendar.vue +138 -138
  110. package/src/components/ui/calendar/CalendarCell.vue +7 -7
  111. package/src/components/ui/calendar/CalendarCellTrigger.vue +18 -18
  112. package/src/components/ui/calendar/CalendarGrid.vue +3 -3
  113. package/src/components/ui/calendar/CalendarGridBody.vue +3 -3
  114. package/src/components/ui/calendar/CalendarGridHead.vue +3 -3
  115. package/src/components/ui/calendar/CalendarGridRow.vue +3 -3
  116. package/src/components/ui/calendar/CalendarHeadCell.vue +7 -7
  117. package/src/components/ui/calendar/CalendarHeader.vue +7 -7
  118. package/src/components/ui/calendar/CalendarHeading.vue +6 -6
  119. package/src/components/ui/calendar/CalendarNextButton.vue +16 -16
  120. package/src/components/ui/calendar/CalendarPrevButton.vue +16 -16
  121. package/src/components/ui/calendar/index.ts +4 -4
  122. package/src/components/ui/card/Card.vue +20 -20
  123. package/src/components/ui/card/CardAction.vue +8 -8
  124. package/src/components/ui/card/CardContent.vue +4 -4
  125. package/src/components/ui/card/CardDescription.vue +12 -12
  126. package/src/components/ui/card/CardFooter.vue +4 -4
  127. package/src/components/ui/card/CardHeader.vue +8 -8
  128. package/src/components/ui/card/CardText.vue +8 -8
  129. package/src/components/ui/card/CardTitle.vue +8 -8
  130. package/src/components/ui/checkbox/Checkbox.vue +27 -27
  131. package/src/components/ui/collapsible/Collapsible.vue +3 -3
  132. package/src/components/ui/collapsible/CollapsibleContent.vue +3 -3
  133. package/src/components/ui/collapsible/CollapsibleTrigger.vue +3 -3
  134. package/src/components/ui/combobox/Combobox.vue +4 -4
  135. package/src/components/ui/combobox/ComboboxAnchor.vue +16 -16
  136. package/src/components/ui/combobox/ComboboxEmpty.vue +3 -3
  137. package/src/components/ui/combobox/ComboboxGroup.vue +9 -9
  138. package/src/components/ui/combobox/ComboboxInput.vue +6 -6
  139. package/src/components/ui/combobox/ComboboxItem.vue +18 -18
  140. package/src/components/ui/combobox/ComboboxList.vue +19 -19
  141. package/src/components/ui/combobox/ComboboxSelect.vue +79 -78
  142. package/src/components/ui/combobox/ComboboxSeparator.vue +1 -1
  143. package/src/components/ui/combobox/ComboboxTrigger.vue +11 -11
  144. package/src/components/ui/combobox/types.ts +5 -5
  145. package/src/components/ui/command/Command.vue +48 -48
  146. package/src/components/ui/command/CommandDialog.vue +14 -14
  147. package/src/components/ui/command/CommandEmpty.vue +4 -4
  148. package/src/components/ui/command/CommandGroup.vue +23 -23
  149. package/src/components/ui/command/CommandInput.vue +10 -10
  150. package/src/components/ui/command/CommandItem.vue +40 -40
  151. package/src/components/ui/command/CommandList.vue +9 -9
  152. package/src/components/ui/command/CommandSeparator.vue +3 -3
  153. package/src/components/ui/command/CommandShortcut.vue +8 -8
  154. package/src/components/ui/command/index.ts +11 -11
  155. package/src/components/ui/data-table/DataTable.vue +147 -146
  156. package/src/components/ui/data-table/index.ts +11 -11
  157. package/src/components/ui/date-picker/DatePicker.vue +32 -32
  158. package/src/components/ui/date-time-picker/DateTimePicker.vue +97 -97
  159. package/src/components/ui/dialog/Dialog.vue +3 -3
  160. package/src/components/ui/dialog/DialogClose.vue +3 -3
  161. package/src/components/ui/dialog/DialogContent.vue +22 -22
  162. package/src/components/ui/dialog/DialogDescription.vue +7 -7
  163. package/src/components/ui/dialog/DialogFooter.vue +8 -8
  164. package/src/components/ui/dialog/DialogHeader.vue +4 -4
  165. package/src/components/ui/dialog/DialogOverlay.vue +7 -7
  166. package/src/components/ui/dialog/DialogScrollContent.vue +33 -33
  167. package/src/components/ui/dialog/DialogTitle.vue +3 -3
  168. package/src/components/ui/dialog/DialogTrigger.vue +3 -3
  169. package/src/components/ui/dropdown-menu/DropdownMenu.vue +3 -3
  170. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +12 -12
  171. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +15 -15
  172. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +3 -3
  173. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +12 -12
  174. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +9 -9
  175. package/src/components/ui/dropdown-menu/DropdownMenuPortal.vue +3 -3
  176. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +3 -3
  177. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +11 -11
  178. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +1 -1
  179. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +4 -4
  180. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +3 -3
  181. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +15 -15
  182. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +16 -16
  183. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +3 -3
  184. package/src/components/ui/dropdown-menu/classes.ts +16 -16
  185. package/src/components/ui/field/Field.vue +5 -5
  186. package/src/components/ui/field/FieldContent.vue +8 -8
  187. package/src/components/ui/field/FieldDescription.vue +10 -10
  188. package/src/components/ui/field/FieldError.vue +39 -39
  189. package/src/components/ui/field/FieldGroup.vue +8 -8
  190. package/src/components/ui/field/FieldLabel.vue +10 -10
  191. package/src/components/ui/field/FieldLegend.vue +11 -11
  192. package/src/components/ui/field/FieldSeparator.vue +11 -11
  193. package/src/components/ui/field/FieldSet.vue +9 -9
  194. package/src/components/ui/field/FieldTitle.vue +8 -8
  195. package/src/components/ui/field/field-context.ts +36 -36
  196. package/src/components/ui/field/index.ts +22 -22
  197. package/src/components/ui/file-dropzone/FileDropzone.vue +163 -154
  198. package/src/components/ui/file-dropzone/index.ts +19 -19
  199. package/src/components/ui/hover-card/HoverCard.vue +5 -5
  200. package/src/components/ui/hover-card/HoverCardContent.vue +13 -13
  201. package/src/components/ui/hover-card/HoverCardTrigger.vue +3 -3
  202. package/src/components/ui/input/Input.vue +13 -13
  203. package/src/components/ui/kbd/Kbd.vue +10 -10
  204. package/src/components/ui/kbd/KbdGroup.vue +49 -49
  205. package/src/components/ui/label/Label.vue +7 -7
  206. package/src/components/ui/native-select/NativeSelect.vue +17 -17
  207. package/src/components/ui/native-select/NativeSelectOptGroup.vue +3 -3
  208. package/src/components/ui/native-select/NativeSelectOption.vue +3 -3
  209. package/src/components/ui/number-field/NumberField.vue +90 -89
  210. package/src/components/ui/pagination/Pagination.vue +4 -4
  211. package/src/components/ui/pagination/PaginationContent.vue +4 -4
  212. package/src/components/ui/pagination/PaginationEllipsis.vue +10 -10
  213. package/src/components/ui/pagination/PaginationFirst.vue +9 -9
  214. package/src/components/ui/pagination/PaginationItem.vue +14 -14
  215. package/src/components/ui/pagination/PaginationLast.vue +9 -9
  216. package/src/components/ui/pagination/PaginationNext.vue +9 -9
  217. package/src/components/ui/pagination/PaginationPrevious.vue +9 -9
  218. package/src/components/ui/pagination/SimplePagination.vue +25 -25
  219. package/src/components/ui/pin-input/PinInput.vue +20 -20
  220. package/src/components/ui/pin-input/PinInputInput.vue +17 -17
  221. package/src/components/ui/pin-input/context.ts +1 -1
  222. package/src/components/ui/popover/Popover.vue +3 -3
  223. package/src/components/ui/popover/PopoverAnchor.vue +3 -3
  224. package/src/components/ui/popover/PopoverContent.vue +12 -12
  225. package/src/components/ui/popover/PopoverTrigger.vue +3 -3
  226. package/src/components/ui/progress/Progress.vue +16 -16
  227. package/src/components/ui/radio-group/RadioGroup.vue +7 -7
  228. package/src/components/ui/radio-group/RadioGroupCard.vue +39 -39
  229. package/src/components/ui/radio-group/RadioGroupItem.vue +20 -20
  230. package/src/components/ui/scroll-area/ScrollArea.vue +14 -14
  231. package/src/components/ui/scroll-area/ScrollBar.vue +12 -12
  232. package/src/components/ui/select/Select.vue +3 -3
  233. package/src/components/ui/select/SelectContent.vue +25 -25
  234. package/src/components/ui/select/SelectGroup.vue +3 -3
  235. package/src/components/ui/select/SelectItem.vue +25 -25
  236. package/src/components/ui/select/SelectItemContent.vue +32 -32
  237. package/src/components/ui/select/SelectItemText.vue +3 -3
  238. package/src/components/ui/select/SelectLabel.vue +3 -3
  239. package/src/components/ui/select/SelectScrollDownButton.vue +10 -10
  240. package/src/components/ui/select/SelectScrollUpButton.vue +10 -10
  241. package/src/components/ui/select/SelectSeparator.vue +2 -2
  242. package/src/components/ui/select/SelectTrigger.vue +15 -15
  243. package/src/components/ui/select/SelectValue.vue +3 -3
  244. package/src/components/ui/select/SelectValueContent.vue +39 -39
  245. package/src/components/ui/separator/Separator.vue +7 -7
  246. package/src/components/ui/sheet/Sheet.vue +3 -3
  247. package/src/components/ui/sheet/SheetClose.vue +3 -3
  248. package/src/components/ui/sheet/SheetContent.vue +22 -22
  249. package/src/components/ui/sheet/SheetDescription.vue +3 -3
  250. package/src/components/ui/sheet/SheetFooter.vue +3 -3
  251. package/src/components/ui/sheet/SheetHeader.vue +3 -3
  252. package/src/components/ui/sheet/SheetOverlay.vue +7 -7
  253. package/src/components/ui/sheet/SheetTitle.vue +3 -3
  254. package/src/components/ui/sheet/SheetTrigger.vue +3 -3
  255. package/src/components/ui/sidebar/Sidebar.vue +57 -57
  256. package/src/components/ui/sidebar/SidebarContent.vue +8 -8
  257. package/src/components/ui/sidebar/SidebarFooter.vue +8 -8
  258. package/src/components/ui/sidebar/SidebarGroup.vue +8 -8
  259. package/src/components/ui/sidebar/SidebarGroupAction.vue +9 -9
  260. package/src/components/ui/sidebar/SidebarGroupContent.vue +4 -4
  261. package/src/components/ui/sidebar/SidebarGroupLabel.vue +8 -8
  262. package/src/components/ui/sidebar/SidebarHeader.vue +8 -8
  263. package/src/components/ui/sidebar/SidebarInput.vue +8 -8
  264. package/src/components/ui/sidebar/SidebarInset.vue +9 -9
  265. package/src/components/ui/sidebar/SidebarMenu.vue +4 -4
  266. package/src/components/ui/sidebar/SidebarMenuAction.vue +18 -18
  267. package/src/components/ui/sidebar/SidebarMenuBadge.vue +14 -14
  268. package/src/components/ui/sidebar/SidebarMenuButton.vue +21 -21
  269. package/src/components/ui/sidebar/SidebarMenuButtonChild.vue +10 -10
  270. package/src/components/ui/sidebar/SidebarMenuItem.vue +4 -4
  271. package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +10 -10
  272. package/src/components/ui/sidebar/SidebarMenuSub.vue +9 -9
  273. package/src/components/ui/sidebar/SidebarMenuSubButton.vue +17 -17
  274. package/src/components/ui/sidebar/SidebarMenuSubItem.vue +4 -4
  275. package/src/components/ui/sidebar/SidebarProvider.vue +46 -46
  276. package/src/components/ui/sidebar/SidebarRail.vue +13 -13
  277. package/src/components/ui/sidebar/SidebarSeparator.vue +4 -4
  278. package/src/components/ui/sidebar/SidebarTrigger.vue +6 -6
  279. package/src/components/ui/sidebar/index.ts +29 -29
  280. package/src/components/ui/sidebar/utils.ts +7 -7
  281. package/src/components/ui/skeleton/Skeleton.vue +6 -6
  282. package/src/components/ui/slider/Slider.vue +14 -14
  283. package/src/components/ui/spinner/Spinner.vue +21 -21
  284. package/src/components/ui/stepper/SimpleStepper.vue +27 -27
  285. package/src/components/ui/stepper/Stepper.vue +6 -6
  286. package/src/components/ui/stepper/StepperDescription.vue +5 -5
  287. package/src/components/ui/stepper/StepperIndicator.vue +18 -18
  288. package/src/components/ui/stepper/StepperItem.vue +4 -4
  289. package/src/components/ui/stepper/StepperSeparator.vue +7 -7
  290. package/src/components/ui/stepper/StepperTitle.vue +5 -5
  291. package/src/components/ui/stepper/StepperTrigger.vue +4 -4
  292. package/src/components/ui/stepper/index.ts +3 -3
  293. package/src/components/ui/switch/Switch.vue +15 -15
  294. package/src/components/ui/table/Table.vue +6 -6
  295. package/src/components/ui/table/TableBody.vue +4 -4
  296. package/src/components/ui/table/TableCaption.vue +4 -4
  297. package/src/components/ui/table/TableCell.vue +8 -8
  298. package/src/components/ui/table/TableEmpty.vue +14 -14
  299. package/src/components/ui/table/TableFooter.vue +8 -8
  300. package/src/components/ui/table/TableHead.vue +8 -8
  301. package/src/components/ui/table/TableHeader.vue +4 -4
  302. package/src/components/ui/table/TableRow.vue +8 -8
  303. package/src/components/ui/tabs/Tabs.vue +4 -4
  304. package/src/components/ui/tabs/TabsContent.vue +4 -4
  305. package/src/components/ui/tabs/TabsList.vue +15 -15
  306. package/src/components/ui/tabs/TabsTrigger.vue +10 -10
  307. package/src/components/ui/tags-input/TagsInput.vue +17 -17
  308. package/src/components/ui/tags-input/TagsInputInput.vue +6 -6
  309. package/src/components/ui/tags-input/TagsInputItem.vue +15 -15
  310. package/src/components/ui/tags-input/TagsInputItemDelete.vue +13 -13
  311. package/src/components/ui/tags-input/TagsInputItemText.vue +4 -4
  312. package/src/components/ui/textarea/Textarea.vue +12 -12
  313. package/src/components/ui/time-picker/TimePicker.vue +25 -25
  314. package/src/components/ui/toggle-group/Toggle.vue +10 -10
  315. package/src/components/ui/toggle-group/ToggleGroup.vue +38 -38
  316. package/src/components/ui/toggle-group/ToggleGroupItem.vue +9 -9
  317. package/src/components/ui/toggle-group/index.ts +46 -46
  318. package/src/components/ui/tooltip/Tooltip.vue +3 -3
  319. package/src/components/ui/tooltip/TooltipContent.vue +13 -13
  320. package/src/components/ui/tooltip/TooltipProvider.vue +4 -4
  321. package/src/components/ui/tooltip/TooltipTrigger.vue +3 -3
  322. package/src/i18n/de.json +185 -185
  323. package/src/i18n/en.json +185 -185
  324. package/src/i18n/es.json +185 -185
  325. package/src/i18n/fr.json +185 -185
  326. package/src/i18n/it.json +185 -185
  327. package/src/i18n/ja.json +185 -185
  328. package/src/i18n/pt.json +185 -185
  329. package/src/i18n/ru.json +185 -185
  330. package/src/i18n/zh.json +185 -185
  331. package/src/lib/color-tokens.ts +24 -24
  332. package/src/lib/i18n.ts +65 -65
  333. package/src/lib/utils.ts +33 -33
  334. package/src/nuxt-components.d.ts +2 -2
  335. package/src/runtime/ui-vintage-i18n-plugin.ts +49 -49
  336. package/src/shims-vue.d.ts +3 -3
  337. package/src/styles.css +377 -377
@@ -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>
@@ -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>
@@ -1,26 +1,26 @@
1
1
  <script setup lang="ts">
2
2
  import type { HTMLAttributes } from 'vue';
3
- import { MoreHorizontalIcon } from '@hugeicons/core-free-icons';
3
+ import MoreHorizontalIcon from '@hugeicons/core-free-icons/MoreHorizontalIcon';
4
4
  import { HugeiconsIcon } from '@hugeicons/vue';
5
5
  import { useI18n } from 'vue-i18n';
6
6
  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>