@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
@@ -1,7 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  import { computed } from 'vue';
3
3
  import type { HTMLAttributes } from 'vue';
4
- import { ArrowDownRight01Icon, ArrowUpRight01Icon } from '@hugeicons/core-free-icons';
4
+ import ArrowDownRight01Icon from '@hugeicons/core-free-icons/ArrowDownRight01Icon';
5
+ import ArrowUpRight01Icon from '@hugeicons/core-free-icons/ArrowUpRight01Icon';
5
6
  import { HugeiconsIcon } from '@hugeicons/vue';
6
7
  import { AnimatedNumber } from '../ui/animated-number';
7
8
  import { Card } from '../ui/card';
@@ -10,37 +11,37 @@ import type { HugeiconsIconDefinition } from '../../lib/common-types';
10
11
 
11
12
  // Props
12
13
  const props = withDefaults(defineProps<{
13
- value: string | number;
14
- label: string;
15
- icon: HugeiconsIconDefinition;
16
- valueColor?: 'default' | 'green' | 'red' | 'gray';
17
- trend?: number | null;
18
- trendLabel?: string;
19
- description?: string;
20
- animate?: boolean;
21
- formatOptions?: Intl.NumberFormatOptions;
22
- class?: HTMLAttributes['class'];
14
+ value: string | number;
15
+ label: string;
16
+ icon: HugeiconsIconDefinition;
17
+ valueColor?: 'default' | 'green' | 'red' | 'gray';
18
+ trend?: number | null;
19
+ trendLabel?: string;
20
+ description?: string;
21
+ animate?: boolean;
22
+ formatOptions?: Intl.NumberFormatOptions;
23
+ class?: HTMLAttributes['class'];
23
24
  }>(), {
24
- valueColor: 'default',
25
- trend: null,
26
- trendLabel: '',
27
- description: '',
28
- animate: true,
29
- formatOptions: undefined
25
+ valueColor: 'default',
26
+ trend: null,
27
+ trendLabel: '',
28
+ description: '',
29
+ animate: true,
30
+ formatOptions: undefined
30
31
  });
31
32
 
32
33
  // Value classes
33
34
  const valueClass = computed(() => {
34
- switch (props.valueColor) {
35
- case 'green':
36
- return 'text-success';
37
- case 'red':
38
- return 'text-destructive';
39
- case 'gray':
40
- return 'text-muted-foreground';
41
- default:
42
- return 'text-foreground';
43
- }
35
+ switch (props.valueColor) {
36
+ case 'green':
37
+ return 'text-success';
38
+ case 'red':
39
+ return 'text-destructive';
40
+ case 'gray':
41
+ return 'text-muted-foreground';
42
+ default:
43
+ return 'text-foreground';
44
+ }
44
45
  });
45
46
 
46
47
  // Trend badge presentation
@@ -52,37 +53,37 @@ const staticValue = computed(() => typeof props.value === 'number' && props.form
52
53
  </script>
53
54
 
54
55
  <template>
55
- <Card :class="cn('gap-0! p-4!', props.class)">
56
- <!-- Label and icon -->
57
- <div class="flex items-start justify-between gap-3">
58
- <span class="min-w-0 text-[11px] font-semibold leading-5 tracking-wider text-muted-foreground uppercase">
59
- {{ props.label }}
60
- </span>
61
- <span aria-hidden="true" class="flex size-8 shrink-0 items-center justify-center rounded border border-primary/30 text-primary">
62
- <HugeiconsIcon :icon="props.icon" class="size-4" />
63
- </span>
64
- </div>
56
+ <Card :class="cn('gap-0! p-4!', props.class)">
57
+ <!-- Label and icon -->
58
+ <div class="flex items-start justify-between gap-3">
59
+ <span class="min-w-0 text-[11px] font-semibold leading-5 tracking-wider text-muted-foreground uppercase">
60
+ {{ props.label }}
61
+ </span>
62
+ <span aria-hidden="true" class="flex size-8 shrink-0 items-center justify-center rounded border border-primary/30 text-primary">
63
+ <HugeiconsIcon :icon="props.icon" class="size-4" />
64
+ </span>
65
+ </div>
65
66
 
66
- <!-- Value and trend -->
67
- <div class="mt-1 flex flex-wrap items-baseline gap-x-2 gap-y-1">
68
- <span :class="['text-2xl font-semibold tracking-tight tabular-nums', valueClass]">
69
- <AnimatedNumber v-if="props.animate && typeof props.value === 'number'" :value="props.value" :format-options="props.formatOptions" />
70
- <template v-else>{{ staticValue }}</template>
71
- </span>
67
+ <!-- Value and trend -->
68
+ <div class="mt-1 flex flex-wrap items-baseline gap-x-2 gap-y-1">
69
+ <span :class="['text-2xl font-semibold tracking-tight tabular-nums', valueClass]">
70
+ <AnimatedNumber v-if="props.animate && typeof props.value === 'number'" :value="props.value" :format-options="props.formatOptions" />
71
+ <template v-else>{{ staticValue }}</template>
72
+ </span>
72
73
 
73
- <!-- Trend badge -->
74
- <span v-if="props.trend !== null" :class="cn('inline-flex items-center gap-0.5 rounded-sm px-1 py-0.5 text-[11px] font-semibold tabular-nums', trendIsPositive ? 'bg-success/10 text-success' : 'bg-destructive/10 text-destructive')">
75
- <HugeiconsIcon :icon="trendIsPositive ? ArrowUpRight01Icon : ArrowDownRight01Icon" class="size-3" />
76
- {{ formattedTrend }}
77
- </span>
78
- <span v-if="props.trend !== null && props.trendLabel" class="text-[11px] text-muted-foreground">
79
- {{ props.trendLabel }}
80
- </span>
81
- </div>
74
+ <!-- Trend badge -->
75
+ <span v-if="props.trend !== null" :class="cn('inline-flex items-center gap-0.5 rounded-sm px-1 py-0.5 text-[11px] font-semibold tabular-nums', trendIsPositive ? 'bg-success/10 text-success' : 'bg-destructive/10 text-destructive')">
76
+ <HugeiconsIcon :icon="trendIsPositive ? ArrowUpRight01Icon : ArrowDownRight01Icon" class="size-3" />
77
+ {{ formattedTrend }}
78
+ </span>
79
+ <span v-if="props.trend !== null && props.trendLabel" class="text-[11px] text-muted-foreground">
80
+ {{ props.trendLabel }}
81
+ </span>
82
+ </div>
82
83
 
83
- <!-- Description -->
84
- <span v-if="props.description" class="mt-1 text-xs leading-5 text-muted-foreground">
85
- {{ props.description }}
86
- </span>
87
- </Card>
88
- </template>
84
+ <!-- Description -->
85
+ <span v-if="props.description" class="mt-1 text-xs leading-5 text-muted-foreground">
86
+ {{ props.description }}
87
+ </span>
88
+ </Card>
89
+ </template>
@@ -5,26 +5,26 @@ import { Slider } from '../ui/slider';
5
5
 
6
6
  // Props
7
7
  const props = withDefaults(defineProps<{
8
- id?: string;
9
- label: string;
10
- description?: string;
11
- modelValue: number;
12
- min?: number;
13
- max?: number;
14
- step?: number;
15
- valueText?: string;
8
+ id?: string;
9
+ label: string;
10
+ description?: string;
11
+ modelValue: number;
12
+ min?: number;
13
+ max?: number;
14
+ step?: number;
15
+ valueText?: string;
16
16
  }>(), {
17
- id: undefined,
18
- description: '',
19
- min: 0,
20
- max: 100,
21
- step: 1,
22
- valueText: ''
17
+ id: undefined,
18
+ description: '',
19
+ min: 0,
20
+ max: 100,
21
+ step: 1,
22
+ valueText: ''
23
23
  });
24
24
 
25
25
  // Emits
26
26
  const emits = defineEmits<{
27
- (e: 'update:modelValue', value: number): void;
27
+ (e: 'update:modelValue', value: number): void;
28
28
  }>();
29
29
 
30
30
  const sliderValue = computed(() => [props.modelValue]);
@@ -32,31 +32,31 @@ const resolvedValueText = computed(() => props.valueText || String(props.modelVa
32
32
 
33
33
  // Emit the first slider value back to the parent
34
34
  const handleUpdateModelValue = (value?: number[]) => {
35
- emits('update:modelValue', value?.[0] ?? props.min);
35
+ emits('update:modelValue', value?.[0] ?? props.min);
36
36
  };
37
37
  </script>
38
38
 
39
39
  <template>
40
- <Card class="px-4 py-4">
41
- <!-- Slider header -->
42
- <div class="flex items-center justify-between gap-3">
43
- <!-- Label and description block -->
44
- <div class="space-y-2">
45
- <div class="text-sm font-semibold">
46
- {{ props.label }}
47
- </div>
48
- <div v-if="props.description" class="text-xs text-muted-foreground">
49
- {{ props.description }}
50
- </div>
51
- </div>
40
+ <Card class="px-4 py-4">
41
+ <!-- Slider header -->
42
+ <div class="flex items-center justify-between gap-3">
43
+ <!-- Label and description block -->
44
+ <div class="space-y-2">
45
+ <div class="text-sm font-semibold">
46
+ {{ props.label }}
47
+ </div>
48
+ <div v-if="props.description" class="text-xs text-muted-foreground">
49
+ {{ props.description }}
50
+ </div>
51
+ </div>
52
52
 
53
- <!-- Current slider value display -->
54
- <span class="rounded border border-border bg-background px-2 py-1 text-xs font-semibold">
55
- {{ resolvedValueText }}
56
- </span>
57
- </div>
53
+ <!-- Current slider value display -->
54
+ <span class="rounded border border-border bg-background px-2 py-1 text-xs font-semibold">
55
+ {{ resolvedValueText }}
56
+ </span>
57
+ </div>
58
58
 
59
- <!-- Slider control -->
60
- <Slider :id="props.id" :model-value="sliderValue" :min="props.min" :max="props.max" :step="props.step" :thumb-label="props.label" @update:model-value="handleUpdateModelValue" />
61
- </Card>
59
+ <!-- Slider control -->
60
+ <Slider :id="props.id" :model-value="sliderValue" :min="props.min" :max="props.max" :step="props.step" :thumb-label="props.label" @update:model-value="handleUpdateModelValue" />
61
+ </Card>
62
62
  </template>
@@ -7,30 +7,30 @@ import type { HugeiconsIconDefinition } from '../../lib/common-types';
7
7
 
8
8
  // Props
9
9
  const props = withDefaults(defineProps<{
10
- items: Array<{
11
- label: string;
12
- value: string | number;
13
- icon?: HugeiconsIconDefinition;
14
- formatOptions?: Intl.NumberFormatOptions;
15
- }>;
16
- animate?: boolean;
17
- class?: HTMLAttributes['class'];
10
+ items: Array<{
11
+ label: string;
12
+ value: string | number;
13
+ icon?: HugeiconsIconDefinition;
14
+ formatOptions?: Intl.NumberFormatOptions;
15
+ }>;
16
+ animate?: boolean;
17
+ class?: HTMLAttributes['class'];
18
18
  }>(), {
19
- animate: true
19
+ animate: true
20
20
  });
21
21
  </script>
22
22
 
23
23
  <template>
24
- <!-- Compact row of stats in one bordered strip -->
25
- <ul v-if="props.items.length > 0" data-slot="stat-strip" :class="cn('inline-flex max-w-full flex-wrap items-stretch overflow-hidden rounded border border-border bg-card text-xs shadow-elevated-sm', props.class)">
26
- <li v-for="(item, index) in props.items" :key="item.label" :class="['flex items-center gap-2 px-4 py-2.5', index > 0 && 'border-l border-border']">
27
- <HugeiconsIcon v-if="item.icon" :icon="item.icon" class="size-4 shrink-0 text-primary" />
28
- <span class="font-semibold text-foreground tabular-nums">
29
- <AnimatedNumber v-if="props.animate && typeof item.value === 'number'" :value="item.value" :format-options="item.formatOptions" />
30
- <template v-else-if="typeof item.value === 'number'">{{ new Intl.NumberFormat(undefined, item.formatOptions).format(item.value) }}</template>
31
- <template v-else>{{ item.value }}</template>
32
- </span>
33
- <span class="text-muted-foreground">{{ item.label }}</span>
34
- </li>
35
- </ul>
36
- </template>
24
+ <!-- Compact row of stats in one bordered strip -->
25
+ <ul v-if="props.items.length > 0" data-slot="stat-strip" :class="cn('inline-flex max-w-full flex-wrap items-stretch overflow-hidden rounded border border-border bg-card text-xs shadow-elevated-sm', props.class)">
26
+ <li v-for="(item, index) in props.items" :key="item.label" :class="['flex items-center gap-2 px-4 py-2.5', index > 0 && 'border-l border-border']">
27
+ <HugeiconsIcon v-if="item.icon" :icon="item.icon" class="size-4 shrink-0 text-primary" />
28
+ <span class="font-semibold text-foreground tabular-nums">
29
+ <AnimatedNumber v-if="props.animate && typeof item.value === 'number'" :value="item.value" :format-options="item.formatOptions" />
30
+ <template v-else-if="typeof item.value === 'number'">{{ new Intl.NumberFormat(undefined, item.formatOptions).format(item.value) }}</template>
31
+ <template v-else>{{ item.value }}</template>
32
+ </span>
33
+ <span class="text-muted-foreground">{{ item.label }}</span>
34
+ </li>
35
+ </ul>
36
+ </template>
@@ -4,34 +4,34 @@ import { Switch } from '../ui/switch';
4
4
 
5
5
  // Props
6
6
  const props = defineProps<{
7
- id: string;
8
- label: string;
9
- description: string;
10
- modelValue: boolean;
7
+ id: string;
8
+ label: string;
9
+ description: string;
10
+ modelValue: boolean;
11
11
  }>();
12
12
 
13
13
  // Emits
14
14
  const emits = defineEmits<{
15
- (e: 'update:modelValue', value: boolean): void;
15
+ (e: 'update:modelValue', value: boolean): void;
16
16
  }>();
17
17
  </script>
18
18
 
19
19
  <template>
20
- <Card class="flex flex-col gap-2 px-4 py-3 sm:gap-3!">
21
- <!-- Switch label and control -->
22
- <div class="flex items-center justify-between gap-4">
23
- <!-- Switch label (names the switch and toggles it on click) -->
24
- <label :for="props.id" class="cursor-pointer text-sm font-semibold">
25
- {{ props.label }}
26
- </label>
20
+ <Card class="flex flex-col gap-2 px-4 py-3 sm:gap-3!">
21
+ <!-- Switch label and control -->
22
+ <div class="flex items-center justify-between gap-4">
23
+ <!-- Switch label (names the switch and toggles it on click) -->
24
+ <label :for="props.id" class="cursor-pointer text-sm font-semibold">
25
+ {{ props.label }}
26
+ </label>
27
27
 
28
- <!-- Switch control -->
29
- <Switch :id="props.id" :aria-describedby="`${props.id}-description`" :model-value="props.modelValue" @update:model-value="emits('update:modelValue', $event)" />
30
- </div>
28
+ <!-- Switch control -->
29
+ <Switch :id="props.id" :aria-describedby="`${props.id}-description`" :model-value="props.modelValue" @update:model-value="emits('update:modelValue', $event)" />
30
+ </div>
31
31
 
32
- <!-- Description -->
33
- <div :id="`${props.id}-description`" class="text-xs text-muted-foreground">
34
- {{ props.description }}
35
- </div>
36
- </Card>
32
+ <!-- Description -->
33
+ <div :id="`${props.id}-description`" class="text-xs text-muted-foreground">
34
+ {{ props.description }}
35
+ </div>
36
+ </Card>
37
37
  </template>
@@ -3,35 +3,35 @@ import type { Component } from 'vue';
3
3
 
4
4
  // Props
5
5
  const props = withDefaults(defineProps<{
6
- to: string;
7
- text: string;
8
- linkComponent?: Component | string;
6
+ to: string;
7
+ text: string;
8
+ linkComponent?: Component | string;
9
9
  }>(), {
10
- linkComponent: 'a'
10
+ linkComponent: 'a'
11
11
  });
12
12
 
13
13
  // Emits
14
14
  const emits = defineEmits<{
15
- click: [event: MouseEvent];
15
+ click: [event: MouseEvent];
16
16
  }>();
17
17
 
18
18
  // Get link props based on the type of link component
19
19
  const getLinkProps = () => {
20
- if (props.linkComponent === 'a') {
21
- return { href: props.to };
22
- } else {
23
- return { to: props.to };
24
- }
20
+ if (props.linkComponent === 'a') {
21
+ return { href: props.to };
22
+ } else {
23
+ return { to: props.to };
24
+ }
25
25
  };
26
26
 
27
27
  // Handle click
28
28
  const handleClick = (event: MouseEvent) => {
29
- emits('click', event);
29
+ emits('click', event);
30
30
  };
31
31
  </script>
32
32
 
33
33
  <template>
34
- <component :is="props.linkComponent" v-bind="getLinkProps()" class="cursor-pointer font-semibold text-foreground hover:underline" @click="handleClick">
35
- {{ props.text }}
36
- </component>
34
+ <component :is="props.linkComponent" v-bind="getLinkProps()" class="cursor-pointer font-semibold text-foreground hover:underline" @click="handleClick">
35
+ {{ props.text }}
36
+ </component>
37
37
  </template>
@@ -1,7 +1,10 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue';
3
3
  import { useI18n } from 'vue-i18n';
4
- import { LaptopIcon, Moon01Icon, Sun01Icon, Tick02Icon } from '@hugeicons/core-free-icons';
4
+ import LaptopIcon from '@hugeicons/core-free-icons/LaptopIcon';
5
+ import Moon01Icon from '@hugeicons/core-free-icons/Moon01Icon';
6
+ import Sun01Icon from '@hugeicons/core-free-icons/Sun01Icon';
7
+ import Tick02Icon from '@hugeicons/core-free-icons/Tick02Icon';
5
8
  import { HugeiconsIcon } from '@hugeicons/vue';
6
9
  import { Button } from '../ui/button';
7
10
  import { Command, CommandGroup, CommandItem, CommandList } from '../ui/command';
@@ -17,97 +20,97 @@ let handleSystemThemeChange: (() => void) | undefined;
17
20
 
18
21
  // Resolve the icon for each theme mode
19
22
  const getThemeIcon = (theme: string) => {
20
- if (theme === 'light') {
21
- return Sun01Icon;
22
- } else if (theme === 'dark') {
23
- return Moon01Icon;
24
- } else {
25
- return LaptopIcon;
26
- }
23
+ if (theme === 'light') {
24
+ return Sun01Icon;
25
+ } else if (theme === 'dark') {
26
+ return Moon01Icon;
27
+ } else {
28
+ return LaptopIcon;
29
+ }
27
30
  };
28
31
 
29
32
  // Available themes
30
33
  const themes = computed(() => [
31
- { id: 'light' as const, label: t('uiVintage.theme.light') },
32
- { id: 'dark' as const, label: t('uiVintage.theme.dark') },
33
- { id: 'auto' as const, label: t('uiVintage.theme.auto') }
34
+ { id: 'light' as const, label: t('uiVintage.theme.light') },
35
+ { id: 'dark' as const, label: t('uiVintage.theme.dark') },
36
+ { id: 'auto' as const, label: t('uiVintage.theme.auto') }
34
37
  ]);
35
38
 
36
39
  // Handle theme selection from the menu
37
40
  const handleSelectTheme = async (theme: ThemeMode) => {
38
- currentTheme.value = theme;
39
- isOpen.value = false;
41
+ currentTheme.value = theme;
42
+ isOpen.value = false;
40
43
 
41
- // Reveal the new theme from the trigger button once the menu has closed
42
- await nextTick();
43
- const triggerElement = (triggerRef.value as { $el?: Element } | null)?.$el ?? null;
44
- await applyThemeWithTransition(theme, triggerElement);
44
+ // Reveal the new theme from the trigger button once the menu has closed
45
+ await nextTick();
46
+ const triggerElement = (triggerRef.value as { $el?: Element } | null)?.$el ?? null;
47
+ await applyThemeWithTransition(theme, triggerElement);
45
48
  };
46
49
 
47
50
  // Compute the icon for the currently selected theme
48
51
  const currentThemeIcon = computed(() => {
49
- return getThemeIcon(currentTheme.value);
52
+ return getThemeIcon(currentTheme.value);
50
53
  });
51
54
 
52
55
  // Theme options for the menu
53
56
  const themeOptions = computed(() => {
54
- return themes.value.map(theme => ({
55
- key: theme.id,
56
- label: theme.label,
57
- icon: getThemeIcon(theme.id)
58
- }));
57
+ return themes.value.map(theme => ({
58
+ key: theme.id,
59
+ label: theme.label,
60
+ icon: getThemeIcon(theme.id)
61
+ }));
59
62
  });
60
63
 
61
64
  // On component mounted
62
65
  onMounted(() => {
63
- const savedTheme = getStoredTheme();
64
- currentTheme.value = savedTheme;
65
- applyTheme(savedTheme);
66
- mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
66
+ const savedTheme = getStoredTheme();
67
+ currentTheme.value = savedTheme;
68
+ applyTheme(savedTheme);
69
+ mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
67
70
 
68
- // Handler to update the theme
69
- handleSystemThemeChange = () => {
70
- if (currentTheme.value === 'auto') {
71
- void applyThemeWithTransition('auto');
72
- }
73
- };
71
+ // Handler to update the theme
72
+ handleSystemThemeChange = () => {
73
+ if (currentTheme.value === 'auto') {
74
+ void applyThemeWithTransition('auto');
75
+ }
76
+ };
74
77
 
75
- // Listen for changes in system theme preference
76
- mediaQueryList.addEventListener('change', handleSystemThemeChange);
78
+ // Listen for changes in system theme preference
79
+ mediaQueryList.addEventListener('change', handleSystemThemeChange);
77
80
  });
78
81
 
79
82
  // Cleanup system preference listener
80
83
  onUnmounted(() => {
81
- if (mediaQueryList && handleSystemThemeChange) {
82
- mediaQueryList.removeEventListener('change', handleSystemThemeChange);
83
- }
84
+ if (mediaQueryList && handleSystemThemeChange) {
85
+ mediaQueryList.removeEventListener('change', handleSystemThemeChange);
86
+ }
84
87
  });
85
88
  </script>
86
89
 
87
90
  <template>
88
- <Popover v-model:open="isOpen">
89
- <!-- Trigger button showing the current theme icon -->
90
- <PopoverTrigger as-child>
91
- <Button ref="triggerRef" variant="secondary" size="icon" :aria-label="t('uiVintage.theme.ariaLabel')">
92
- <Transition mode="out-in" enter-active-class="transition-[rotate,scale,opacity] duration-[420ms] ease-bounce" enter-from-class="-rotate-90 scale-50 opacity-0" leave-active-class="transition-[rotate,scale,opacity] duration-150 ease-snappy" leave-to-class="rotate-90 scale-50 opacity-0">
93
- <HugeiconsIcon :key="currentTheme" :icon="currentThemeIcon" class="h-5 w-5" />
94
- </Transition>
95
- </Button>
96
- </PopoverTrigger>
91
+ <Popover v-model:open="isOpen">
92
+ <!-- Trigger button showing the current theme icon -->
93
+ <PopoverTrigger as-child>
94
+ <Button ref="triggerRef" variant="secondary" size="icon" :aria-label="t('uiVintage.theme.ariaLabel')">
95
+ <Transition mode="out-in" enter-active-class="transition-[rotate,scale,opacity] duration-[420ms] ease-bounce" enter-from-class="-rotate-90 scale-50 opacity-0" leave-active-class="transition-[rotate,scale,opacity] duration-150 ease-snappy" leave-to-class="rotate-90 scale-50 opacity-0">
96
+ <HugeiconsIcon :key="currentTheme" :icon="currentThemeIcon" class="h-5 w-5" />
97
+ </Transition>
98
+ </Button>
99
+ </PopoverTrigger>
97
100
 
98
- <!-- Theme options -->
99
- <PopoverContent side="bottom" align="end" :side-offset="8" class="w-44 p-0!">
100
- <Command :model-value="currentTheme">
101
- <CommandList :aria-label="t('uiVintage.theme.title')">
102
- <CommandGroup :heading="t('uiVintage.theme.title')" stagger>
103
- <CommandItem v-for="option in themeOptions" :key="option.key" :value="option.key" @select="handleSelectTheme(option.key)">
104
- <HugeiconsIcon :icon="option.icon" class="size-4" />
105
- <span class="flex-1">{{ option.label }}</span>
106
- <HugeiconsIcon :icon="Tick02Icon" class="ml-auto size-4 shrink-0 text-primary! transition-[opacity,scale] duration-300 ease-bounce" :class="currentTheme === option.key ? 'scale-100 opacity-100' : 'scale-50 opacity-0'" />
107
- </CommandItem>
108
- </CommandGroup>
109
- </CommandList>
110
- </Command>
111
- </PopoverContent>
112
- </Popover>
101
+ <!-- Theme options -->
102
+ <PopoverContent side="bottom" align="end" :side-offset="8" class="w-44 p-0!">
103
+ <Command :model-value="currentTheme">
104
+ <CommandList :aria-label="t('uiVintage.theme.title')">
105
+ <CommandGroup :heading="t('uiVintage.theme.title')" stagger>
106
+ <CommandItem v-for="option in themeOptions" :key="option.key" :value="option.key" @select="handleSelectTheme(option.key)">
107
+ <HugeiconsIcon :icon="option.icon" class="size-4" />
108
+ <span class="flex-1">{{ option.label }}</span>
109
+ <HugeiconsIcon :icon="Tick02Icon" class="ml-auto size-4 shrink-0 text-primary! transition-[opacity,scale] duration-300 ease-bounce" :class="currentTheme === option.key ? 'scale-100 opacity-100' : 'scale-50 opacity-0'" />
110
+ </CommandItem>
111
+ </CommandGroup>
112
+ </CommandList>
113
+ </Command>
114
+ </PopoverContent>
115
+ </Popover>
113
116
  </template>