@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
@@ -7,35 +7,35 @@ export type DialogButtonVariant = NonNullable<ButtonVariants['variant']>;
7
7
  export type { HugeiconsIconDefinition };
8
8
 
9
9
  export interface ShowConfirmDialogOptions {
10
- title?: string;
11
- message: string;
12
- confirmText?: string;
13
- cancelText?: string;
14
- confirmButtonType?: DialogButtonVariant;
15
- cancelButtonType?: DialogButtonVariant;
16
- icon?: HugeiconsIconDefinition | null;
17
- confirmButtonIcon?: HugeiconsIconDefinition | null;
18
- cancelButtonIcon?: HugeiconsIconDefinition | null;
19
- onConfirm?: (() => void | Promise<void>) | null;
20
- onCancel?: (() => void | Promise<void>) | null;
10
+ title?: string;
11
+ message: string;
12
+ confirmText?: string;
13
+ cancelText?: string;
14
+ confirmButtonType?: DialogButtonVariant;
15
+ cancelButtonType?: DialogButtonVariant;
16
+ icon?: HugeiconsIconDefinition | null;
17
+ confirmButtonIcon?: HugeiconsIconDefinition | null;
18
+ cancelButtonIcon?: HugeiconsIconDefinition | null;
19
+ onConfirm?: (() => void | Promise<void>) | null;
20
+ onCancel?: (() => void | Promise<void>) | null;
21
21
  }
22
22
 
23
23
  interface ConfirmDialogRequest {
24
- id: number;
25
- options: Required<Omit<ShowConfirmDialogOptions, 'icon' | 'confirmButtonIcon' | 'cancelButtonIcon' | 'onConfirm' | 'onCancel'>> & {
26
- icon: HugeiconsIconDefinition | null;
27
- confirmButtonIcon: HugeiconsIconDefinition | null;
28
- cancelButtonIcon: HugeiconsIconDefinition | null;
29
- onConfirm: (() => void | Promise<void>) | null;
30
- onCancel: (() => void | Promise<void>) | null;
31
- };
32
- resolve: (value: boolean) => void;
24
+ id: number;
25
+ options: Required<Omit<ShowConfirmDialogOptions, 'icon' | 'confirmButtonIcon' | 'cancelButtonIcon' | 'onConfirm' | 'onCancel'>> & {
26
+ icon: HugeiconsIconDefinition | null;
27
+ confirmButtonIcon: HugeiconsIconDefinition | null;
28
+ cancelButtonIcon: HugeiconsIconDefinition | null;
29
+ onConfirm: (() => void | Promise<void>) | null;
30
+ onCancel: (() => void | Promise<void>) | null;
31
+ };
32
+ resolve: (value: boolean) => void;
33
33
  }
34
34
 
35
35
  interface ConfirmDialogState {
36
- current: ConfirmDialogRequest | null;
37
- busy: boolean;
38
- isOpen: boolean;
36
+ current: ConfirmDialogRequest | null;
37
+ busy: boolean;
38
+ isOpen: boolean;
39
39
  }
40
40
 
41
41
  const confirmDialogQueue: ConfirmDialogRequest[] = [];
@@ -48,9 +48,9 @@ const CONFIRM_DIALOG_ROOT_ID = 'ui-vintage-confirm-dialog-root';
48
48
 
49
49
  // Shared confirm dialog state
50
50
  export const confirmDialogState: ConfirmDialogState = reactive({
51
- current: null,
52
- busy: false,
53
- isOpen: false
51
+ current: null,
52
+ busy: false,
53
+ isOpen: false
54
54
  });
55
55
 
56
56
  // Keep icon definitions non-reactive
@@ -58,145 +58,145 @@ const markIcon = (icon: HugeiconsIconDefinition | null | undefined) => icon ? ma
58
58
 
59
59
  // Mount the dialog once on demand
60
60
  const ensureConfirmDialogMounted = () => {
61
- // Skip mounting during SSR
62
- if (typeof document === 'undefined') {
63
- return Promise.resolve();
64
- }
65
-
66
- // Reuse the existing mount root
67
- const existingRoot = document.getElementById(CONFIRM_DIALOG_ROOT_ID);
68
- if (existingRoot) {
69
- return Promise.resolve();
70
- }
71
-
72
- // Reuse the in-flight mount
73
- if (confirmDialogMountPromise) {
74
- return confirmDialogMountPromise;
75
- }
76
-
77
- // Start the lazy mount
78
- confirmDialogMountPromise = (async () => {
79
- // Load the component only when needed
80
- const { default: ConfirmDialog } = await import('./ConfirmDialog.vue');
81
-
82
- // Guard against a concurrent mount
83
- if (document.getElementById(CONFIRM_DIALOG_ROOT_ID)) {
84
- return;
85
- }
86
-
87
- // Create the host element and render the component
88
- const container = document.createElement('div');
89
- container.id = CONFIRM_DIALOG_ROOT_ID;
90
- document.body.appendChild(container);
91
- render(h(ConfirmDialog), container);
92
- })().finally(() => {
93
- confirmDialogMountPromise = null;
94
- });
95
-
96
- // Let callers await the mount
97
- return confirmDialogMountPromise;
61
+ // Skip mounting during SSR
62
+ if (typeof document === 'undefined') {
63
+ return Promise.resolve();
64
+ }
65
+
66
+ // Reuse the existing mount root
67
+ const existingRoot = document.getElementById(CONFIRM_DIALOG_ROOT_ID);
68
+ if (existingRoot) {
69
+ return Promise.resolve();
70
+ }
71
+
72
+ // Reuse the in-flight mount
73
+ if (confirmDialogMountPromise) {
74
+ return confirmDialogMountPromise;
75
+ }
76
+
77
+ // Start the lazy mount
78
+ confirmDialogMountPromise = (async () => {
79
+ // Load the component only when needed
80
+ const { default: ConfirmDialog } = await import('./ConfirmDialog.vue');
81
+
82
+ // Guard against a concurrent mount
83
+ if (document.getElementById(CONFIRM_DIALOG_ROOT_ID)) {
84
+ return;
85
+ }
86
+
87
+ // Create the host element and render the component
88
+ const container = document.createElement('div');
89
+ container.id = CONFIRM_DIALOG_ROOT_ID;
90
+ document.body.appendChild(container);
91
+ render(h(ConfirmDialog), container);
92
+ })().finally(() => {
93
+ confirmDialogMountPromise = null;
94
+ });
95
+
96
+ // Let callers await the mount
97
+ return confirmDialogMountPromise;
98
98
  };
99
99
 
100
100
  // Show the next queued dialog
101
101
  const openNextConfirmDialog = () => {
102
- const nextDialog = confirmDialogQueue.shift() ?? null;
103
- confirmDialogState.current = nextDialog;
104
- confirmDialogState.isOpen = Boolean(nextDialog);
102
+ const nextDialog = confirmDialogQueue.shift() ?? null;
103
+ confirmDialogState.current = nextDialog;
104
+ confirmDialogState.isOpen = Boolean(nextDialog);
105
105
  };
106
106
 
107
107
  // Queue a new dialog request
108
108
  const enqueueConfirmDialog = (request: ConfirmDialogRequest) => {
109
- confirmDialogQueue.push(request);
110
- if (!confirmDialogState.current) {
111
- openNextConfirmDialog();
112
- }
109
+ confirmDialogQueue.push(request);
110
+ if (!confirmDialogState.current) {
111
+ openNextConfirmDialog();
112
+ }
113
113
  };
114
114
 
115
115
  // Clear the active dialog and continue the queue
116
116
  const clearCurrentConfirmDialog = () => {
117
- confirmDialogState.busy = false;
118
- confirmDialogState.isOpen = false;
119
- confirmDialogState.current = null;
120
- openNextConfirmDialog();
117
+ confirmDialogState.busy = false;
118
+ confirmDialogState.isOpen = false;
119
+ confirmDialogState.current = null;
120
+ openNextConfirmDialog();
121
121
  };
122
122
 
123
123
  // Close the current dialog after the leave transition (only if it is still the given request)
124
124
  const scheduleCloseCurrentConfirmDialog = (request: ConfirmDialogRequest) => {
125
- // Guard against missing, replaced, or already closed dialogs
126
- if (confirmDialogState.current !== request || !confirmDialogState.isOpen) return;
127
- confirmDialogState.isOpen = false;
128
-
129
- // Clear any existing close timer to avoid racing conditions
130
- if (closeTimer) {
131
- clearTimeout(closeTimer);
132
- }
133
-
134
- // Schedule the dialog to be cleared after the leave transition
135
- closeTimer = setTimeout(() => {
136
- closeTimer = null;
137
- clearCurrentConfirmDialog();
138
- }, DIALOG_CLOSE_DURATION_MS);
125
+ // Guard against missing, replaced, or already closed dialogs
126
+ if (confirmDialogState.current !== request || !confirmDialogState.isOpen) return;
127
+ confirmDialogState.isOpen = false;
128
+
129
+ // Clear any existing close timer to avoid racing conditions
130
+ if (closeTimer) {
131
+ clearTimeout(closeTimer);
132
+ }
133
+
134
+ // Schedule the dialog to be cleared after the leave transition
135
+ closeTimer = setTimeout(() => {
136
+ closeTimer = null;
137
+ clearCurrentConfirmDialog();
138
+ }, DIALOG_CLOSE_DURATION_MS);
139
139
  };
140
140
 
141
141
  // Resolve the dialog as cancelled (ignored while a confirm or cancel handler is still running)
142
142
  export const closeConfirmDialog = () => {
143
- const current = confirmDialogState.current;
144
- if (!current || !confirmDialogState.isOpen || confirmDialogState.busy) return;
145
- current.resolve(false);
146
- scheduleCloseCurrentConfirmDialog(current);
143
+ const current = confirmDialogState.current;
144
+ if (!current || !confirmDialogState.isOpen || confirmDialogState.busy) return;
145
+ current.resolve(false);
146
+ scheduleCloseCurrentConfirmDialog(current);
147
147
  };
148
148
 
149
149
  // Run a dialog handler, then resolve and close the dialog it belongs to
150
150
  const runConfirmDialogHandler = async (handler: (() => void | Promise<void>) | null, result: boolean) => {
151
- const current = confirmDialogState.current;
152
- if (!current || !confirmDialogState.isOpen || confirmDialogState.busy) return;
153
- confirmDialogState.busy = true;
154
-
155
- try {
156
- await handler?.();
157
- current.resolve(result);
158
- } catch (error) {
159
- // Settle the caller's promise even when the handler throws, then surface the error
160
- current.resolve(false);
161
- throw error;
162
- } finally {
163
- scheduleCloseCurrentConfirmDialog(current);
164
- }
151
+ const current = confirmDialogState.current;
152
+ if (!current || !confirmDialogState.isOpen || confirmDialogState.busy) return;
153
+ confirmDialogState.busy = true;
154
+
155
+ try {
156
+ await handler?.();
157
+ current.resolve(result);
158
+ } catch (error) {
159
+ // Settle the caller's promise even when the handler throws, then surface the error
160
+ current.resolve(false);
161
+ throw error;
162
+ } finally {
163
+ scheduleCloseCurrentConfirmDialog(current);
164
+ }
165
165
  };
166
166
 
167
167
  // Run the cancel handler for the active dialog
168
168
  export const cancelActiveConfirmDialog = async () => {
169
- await runConfirmDialogHandler(confirmDialogState.current?.options.onCancel ?? null, false);
169
+ await runConfirmDialogHandler(confirmDialogState.current?.options.onCancel ?? null, false);
170
170
  };
171
171
 
172
172
  // Run the confirm handler for the active dialog
173
173
  export const confirmActiveDialog = async () => {
174
- await runConfirmDialogHandler(confirmDialogState.current?.options.onConfirm ?? null, true);
174
+ await runConfirmDialogHandler(confirmDialogState.current?.options.onConfirm ?? null, true);
175
175
  };
176
176
 
177
177
  // Queue and show a confirm dialog
178
178
  export const showConfirmDialog = (options: ShowConfirmDialogOptions) => {
179
- // Ensure the renderer exists before queuing work
180
- void ensureConfirmDialogMounted();
181
-
182
- // Return a promise that resolves with the user's choice
183
- return new Promise<boolean>((resolve) => {
184
- enqueueConfirmDialog({
185
- id: nextConfirmDialogId += 1,
186
- options: {
187
- title: options.title ?? getUiVintageRuntimeMessage('uiVintage.messageDialog.confirm', 'Confirm'),
188
- message: options.message,
189
- confirmText: options.confirmText ?? getUiVintageRuntimeMessage('uiVintage.buttons.confirm', 'Confirm'),
190
- cancelText: options.cancelText ?? getUiVintageRuntimeMessage('uiVintage.buttons.cancel', 'Cancel'),
191
- confirmButtonType: options.confirmButtonType ?? 'primary',
192
- cancelButtonType: options.cancelButtonType ?? 'secondary',
193
- icon: markIcon(options.icon),
194
- confirmButtonIcon: markIcon(options.confirmButtonIcon),
195
- cancelButtonIcon: markIcon(options.cancelButtonIcon),
196
- onConfirm: options.onConfirm ?? null,
197
- onCancel: options.onCancel ?? null
198
- },
199
- resolve
200
- });
201
- });
179
+ // Ensure the renderer exists before queuing work
180
+ void ensureConfirmDialogMounted();
181
+
182
+ // Return a promise that resolves with the user's choice
183
+ return new Promise<boolean>((resolve) => {
184
+ enqueueConfirmDialog({
185
+ id: nextConfirmDialogId += 1,
186
+ options: {
187
+ title: options.title ?? getUiVintageRuntimeMessage('uiVintage.messageDialog.confirm', 'Confirm'),
188
+ message: options.message,
189
+ confirmText: options.confirmText ?? getUiVintageRuntimeMessage('uiVintage.buttons.confirm', 'Confirm'),
190
+ cancelText: options.cancelText ?? getUiVintageRuntimeMessage('uiVintage.buttons.cancel', 'Cancel'),
191
+ confirmButtonType: options.confirmButtonType ?? 'primary',
192
+ cancelButtonType: options.cancelButtonType ?? 'secondary',
193
+ icon: markIcon(options.icon),
194
+ confirmButtonIcon: markIcon(options.confirmButtonIcon),
195
+ cancelButtonIcon: markIcon(options.cancelButtonIcon),
196
+ onConfirm: options.onConfirm ?? null,
197
+ onCancel: options.onCancel ?? null
198
+ },
199
+ resolve
200
+ });
201
+ });
202
202
  };
@@ -1,51 +1,52 @@
1
1
  <script setup lang="ts">
2
- import { Cancel01Icon, Tick02Icon } from '@hugeicons/core-free-icons';
2
+ import Cancel01Icon from '@hugeicons/core-free-icons/Cancel01Icon';
3
+ import Tick02Icon from '@hugeicons/core-free-icons/Tick02Icon';
3
4
  import { HugeiconsIcon } from '@hugeicons/vue';
4
5
  import { Card } from '../ui/card';
5
6
 
6
7
  // Props
7
8
  const props = withDefaults(defineProps<{
8
- items?: string[];
9
- variant?: 'circle' | 'checkmark' | 'numbered' | 'cross';
9
+ items?: string[];
10
+ variant?: 'circle' | 'checkmark' | 'numbered' | 'cross';
10
11
  }>(), {
11
- items: () => [],
12
- variant: 'checkmark'
12
+ items: () => [],
13
+ variant: 'checkmark'
13
14
  });
14
15
 
15
16
  // Marker classes
16
17
  const getMarkerClasses = () => {
17
- const toneClasses = {
18
- checkmark: 'rounded bg-success/10 text-success',
19
- cross: 'rounded bg-destructive/10 text-destructive',
20
- numbered: 'text-[11px] font-semibold tabular-nums text-primary',
21
- circle: ''
22
- };
23
- return ['mt-px flex size-5 shrink-0 items-center justify-center', toneClasses[props.variant]];
18
+ const toneClasses = {
19
+ checkmark: 'rounded bg-success/10 text-success',
20
+ cross: 'rounded bg-destructive/10 text-destructive',
21
+ numbered: 'text-[11px] font-semibold tabular-nums text-primary',
22
+ circle: ''
23
+ };
24
+ return ['mt-px flex size-5 shrink-0 items-center justify-center', toneClasses[props.variant]];
24
25
  };
25
26
 
26
27
  // Format the item number with a leading zero
27
28
  const formatNumber = (index: number) => {
28
- return String(index + 1).padStart(2, '0');
29
+ return String(index + 1).padStart(2, '0');
29
30
  };
30
31
  </script>
31
32
 
32
33
  <template>
33
- <div class="not-prose my-6 sm:my-8">
34
- <Card data-aos="blur-up" class="gap-0! py-0! overflow-hidden">
35
- <ul class="divide-y divide-border">
36
- <li v-for="(item, index) in props.items" :key="index" data-aos="blur-up" :data-aos-delay="100 + index * 80" class="flex items-start gap-3 px-4 py-3.5 text-xs leading-relaxed text-foreground sm:px-5 md:text-sm">
37
- <!-- Marker -->
38
- <span aria-hidden="true" :class="getMarkerClasses()">
39
- <HugeiconsIcon v-if="props.variant === 'checkmark'" :icon="Tick02Icon" :stroke-width="2.5" class="size-3" />
40
- <HugeiconsIcon v-else-if="props.variant === 'cross'" :icon="Cancel01Icon" :stroke-width="2.5" class="size-3" />
41
- <template v-else-if="props.variant === 'numbered'">{{ formatNumber(index) }}</template>
42
- <span v-else class="size-1.5 rounded-full bg-primary" />
43
- </span>
34
+ <div class="not-prose my-6 sm:my-8">
35
+ <Card data-aos="blur-up" class="gap-0! py-0! overflow-hidden">
36
+ <ul class="divide-y divide-border">
37
+ <li v-for="(item, index) in props.items" :key="index" data-aos="blur-up" :data-aos-delay="100 + index * 80" class="flex items-start gap-3 px-4 py-3.5 text-xs leading-relaxed text-foreground sm:px-5 md:text-sm">
38
+ <!-- Marker -->
39
+ <span aria-hidden="true" :class="getMarkerClasses()">
40
+ <HugeiconsIcon v-if="props.variant === 'checkmark'" :icon="Tick02Icon" :stroke-width="2.5" class="size-3" />
41
+ <HugeiconsIcon v-else-if="props.variant === 'cross'" :icon="Cancel01Icon" :stroke-width="2.5" class="size-3" />
42
+ <template v-else-if="props.variant === 'numbered'">{{ formatNumber(index) }}</template>
43
+ <span v-else class="size-1.5 rounded-full bg-primary" />
44
+ </span>
44
45
 
45
- <!-- Content -->
46
- <span class="flex-1">{{ item }}</span>
47
- </li>
48
- </ul>
49
- </Card>
50
- </div>
51
- </template>
46
+ <!-- Content -->
47
+ <span class="flex-1">{{ item }}</span>
48
+ </li>
49
+ </ul>
50
+ </Card>
51
+ </div>
52
+ </template>
@@ -4,53 +4,53 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '.
4
4
 
5
5
  // Props
6
6
  const props = withDefaults(defineProps<{
7
- headers?: string[];
8
- rows?: string[][];
9
- highlightCol?: number;
7
+ headers?: string[];
8
+ rows?: string[][];
9
+ highlightCol?: number;
10
10
  }>(), {
11
- headers: () => [],
12
- rows: () => [],
13
- highlightCol: -1
11
+ headers: () => [],
12
+ rows: () => [],
13
+ highlightCol: -1
14
14
  });
15
15
 
16
16
  // Header cell classes
17
17
  const getHeaderClasses = (colIndex: number) => {
18
- const baseClasses = 'h-10 px-4 text-left text-[11px] font-semibold uppercase tracking-wider text-muted-foreground sm:px-5';
19
- const highlightClass = props.highlightCol === colIndex ? 'text-primary shadow-[inset_0_-2px_0_var(--primary)]' : '';
20
- return [baseClasses, highlightClass];
18
+ const baseClasses = 'h-10 px-4 text-left text-[11px] font-semibold uppercase tracking-wider text-muted-foreground sm:px-5';
19
+ const highlightClass = props.highlightCol === colIndex ? 'text-primary shadow-[inset_0_-2px_0_var(--primary)]' : '';
20
+ return [baseClasses, highlightClass];
21
21
  };
22
22
 
23
23
  // Body cell classes
24
24
  const getCellClasses = (colIndex: number) => {
25
- const baseClasses = 'min-w-32 px-4 py-3 align-top leading-relaxed whitespace-normal sm:px-5';
26
- const firstColClass = colIndex === 0 ? 'font-medium text-foreground' : 'text-muted-foreground';
27
- const highlightClass = props.highlightCol === colIndex ? 'bg-primary/5 text-foreground' : '';
28
- return [baseClasses, firstColClass, highlightClass];
25
+ const baseClasses = 'min-w-32 px-4 py-3 align-top leading-relaxed whitespace-normal sm:px-5';
26
+ const firstColClass = colIndex === 0 ? 'font-medium text-foreground' : 'text-muted-foreground';
27
+ const highlightClass = props.highlightCol === colIndex ? 'bg-primary/5 text-foreground' : '';
28
+ return [baseClasses, firstColClass, highlightClass];
29
29
  };
30
30
  </script>
31
31
 
32
32
  <template>
33
- <div class="not-prose my-6 sm:my-8">
34
- <Card data-aos="blur-up" class="gap-0! py-0! overflow-hidden">
35
- <Table class="w-full text-left text-sm">
36
- <!-- Table header -->
37
- <TableHeader>
38
- <TableRow class="bg-surface hover:bg-surface">
39
- <TableHead v-for="(header, colIndex) in props.headers" :key="colIndex" :class="getHeaderClasses(colIndex)">
40
- {{ header }}
41
- </TableHead>
42
- </TableRow>
43
- </TableHeader>
33
+ <div class="not-prose my-6 sm:my-8">
34
+ <Card data-aos="blur-up" class="gap-0! py-0! overflow-hidden">
35
+ <Table class="w-full text-left text-sm">
36
+ <!-- Table header -->
37
+ <TableHeader>
38
+ <TableRow class="bg-surface hover:bg-surface">
39
+ <TableHead v-for="(header, colIndex) in props.headers" :key="colIndex" :class="getHeaderClasses(colIndex)">
40
+ {{ header }}
41
+ </TableHead>
42
+ </TableRow>
43
+ </TableHeader>
44
44
 
45
- <!-- Table body -->
46
- <TableBody>
47
- <TableRow v-for="(row, rowIndex) in props.rows" :key="rowIndex" class="last:border-b-0 hover:bg-surface/60">
48
- <TableCell v-for="(cell, colIndex) in row" :key="colIndex" :class="getCellClasses(colIndex)">
49
- {{ cell }}
50
- </TableCell>
51
- </TableRow>
52
- </TableBody>
53
- </Table>
54
- </Card>
55
- </div>
56
- </template>
45
+ <!-- Table body -->
46
+ <TableBody>
47
+ <TableRow v-for="(row, rowIndex) in props.rows" :key="rowIndex" class="last:border-b-0 hover:bg-surface/60">
48
+ <TableCell v-for="(cell, colIndex) in row" :key="colIndex" :class="getCellClasses(colIndex)">
49
+ {{ cell }}
50
+ </TableCell>
51
+ </TableRow>
52
+ </TableBody>
53
+ </Table>
54
+ </Card>
55
+ </div>
56
+ </template>