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