@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
@@ -2,7 +2,7 @@
2
2
  import type { ComboboxItemEmits, ComboboxItemProps } from 'reka-ui';
3
3
  import type { HTMLAttributes } from 'vue';
4
4
  import { reactiveOmit } from '@vueuse/core';
5
- import { Tick02Icon } from '@hugeicons/core-free-icons';
5
+ import Tick02Icon from '@hugeicons/core-free-icons/Tick02Icon';
6
6
  import { HugeiconsIcon } from '@hugeicons/vue';
7
7
  import { ComboboxItem, ComboboxItemIndicator, useForwardPropsEmits } from 'reka-ui';
8
8
  import { cn } from '../../../lib/utils';
@@ -18,22 +18,22 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
18
18
  </script>
19
19
 
20
20
  <template>
21
- <ComboboxItem data-slot="combobox-item" v-bind="forwarded" :class="cn(
22
- 'relative flex w-full cursor-pointer items-center gap-3 rounded py-2 pr-9 pl-3 text-left text-xs font-semibold text-muted-foreground outline-hidden select-none transition-colors duration-150 sm:text-sm',
23
- 'data-highlighted:bg-accent data-highlighted:text-foreground data-[state=checked]:text-foreground data-disabled:pointer-events-none data-disabled:opacity-50',
24
- '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
25
- props.class
26
- )
27
- ">
28
- <slot />
21
+ <ComboboxItem data-slot="combobox-item" v-bind="forwarded" :class="cn(
22
+ 'relative flex w-full cursor-pointer items-center gap-3 rounded py-2 pr-9 pl-3 text-left text-xs font-semibold text-muted-foreground outline-hidden select-none transition-colors duration-150 sm:text-sm',
23
+ 'data-highlighted:bg-accent data-highlighted:text-foreground data-[state=checked]:text-foreground data-disabled:pointer-events-none data-disabled:opacity-50',
24
+ '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
25
+ props.class
26
+ )
27
+ ">
28
+ <slot />
29
29
 
30
- <!-- Trailing check indicator (pops in when selected) -->
31
- <span class="pointer-events-none absolute right-3 flex size-4 items-center justify-center text-primary">
32
- <ComboboxItemIndicator>
33
- <slot name="indicator-icon">
34
- <HugeiconsIcon :icon="Tick02Icon" class="size-4 animate-uv-pop" :stroke-width="2.5" />
35
- </slot>
36
- </ComboboxItemIndicator>
37
- </span>
38
- </ComboboxItem>
30
+ <!-- Trailing check indicator (pops in when selected) -->
31
+ <span class="pointer-events-none absolute right-3 flex size-4 items-center justify-center text-primary">
32
+ <ComboboxItemIndicator>
33
+ <slot name="indicator-icon">
34
+ <HugeiconsIcon :icon="Tick02Icon" class="size-4 animate-uv-pop" :stroke-width="2.5" />
35
+ </slot>
36
+ </ComboboxItemIndicator>
37
+ </span>
38
+ </ComboboxItem>
39
39
  </template>
@@ -6,18 +6,18 @@ import { ComboboxContent, ComboboxPortal, ComboboxViewport, useForwardPropsEmits
6
6
  import { cn } from '../../../lib/utils';
7
7
 
8
8
  defineOptions({
9
- inheritAttrs: false
9
+ inheritAttrs: false
10
10
  });
11
11
 
12
12
  // Props
13
13
  const props = withDefaults(defineProps<ComboboxContentProps & {
14
- class?: HTMLAttributes['class'];
15
- viewportClass?: HTMLAttributes['class'];
14
+ class?: HTMLAttributes['class'];
15
+ viewportClass?: HTMLAttributes['class'];
16
16
  }>(), {
17
- position: 'popper',
18
- align: 'start',
19
- sideOffset: 6,
20
- collisionPadding: 8
17
+ position: 'popper',
18
+ align: 'start',
19
+ sideOffset: 6,
20
+ collisionPadding: 8
21
21
  });
22
22
 
23
23
  // Emits
@@ -28,16 +28,16 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
28
28
  </script>
29
29
 
30
30
  <template>
31
- <ComboboxPortal>
32
- <ComboboxContent data-slot="combobox-list" v-bind="{ ...$attrs, ...forwarded }" :class="cn(
33
- 'uv-floating-motion bg-popover text-popover-foreground z-50 flex w-(--reka-combobox-trigger-width) max-h-[min(var(--reka-combobox-content-available-height),20rem)] flex-col overflow-hidden rounded border border-border shadow-elevated-lg outline-hidden',
34
- props.class
35
- )
36
- ">
37
- <!-- Scrollable viewport -->
38
- <ComboboxViewport data-slot="combobox-viewport" :class="cn('min-h-0 scroll-py-1 p-1', props.viewportClass)">
39
- <slot />
40
- </ComboboxViewport>
41
- </ComboboxContent>
42
- </ComboboxPortal>
31
+ <ComboboxPortal>
32
+ <ComboboxContent data-slot="combobox-list" v-bind="{ ...$attrs, ...forwarded }" :class="cn(
33
+ 'uv-floating-motion bg-popover text-popover-foreground z-50 flex w-(--reka-combobox-trigger-width) max-h-[min(var(--reka-combobox-content-available-height),20rem)] flex-col overflow-hidden rounded border border-border shadow-elevated-lg outline-hidden',
34
+ props.class
35
+ )
36
+ ">
37
+ <!-- Scrollable viewport -->
38
+ <ComboboxViewport data-slot="combobox-viewport" :class="cn('min-h-0 scroll-py-1 p-1', props.viewportClass)">
39
+ <slot />
40
+ </ComboboxViewport>
41
+ </ComboboxContent>
42
+ </ComboboxPortal>
43
43
  </template>
@@ -2,7 +2,8 @@
2
2
  import type { HTMLAttributes } from 'vue';
3
3
  import type { AcceptableValue } from 'reka-ui';
4
4
  import { computed, ref } from 'vue';
5
- import { Cancel01Icon, Search01Icon } from '@hugeicons/core-free-icons';
5
+ import Cancel01Icon from '@hugeicons/core-free-icons/Cancel01Icon';
6
+ import Search01Icon from '@hugeicons/core-free-icons/Search01Icon';
6
7
  import { HugeiconsIcon } from '@hugeicons/vue';
7
8
  import { useI18n } from 'vue-i18n';
8
9
  import { cn } from '../../../lib/utils';
@@ -18,26 +19,26 @@ import type { ComboboxSelectModelValue, ComboboxSelectOption, ComboboxSelectValu
18
19
 
19
20
  // Props
20
21
  const props = withDefaults(defineProps<{
21
- modelValue?: ComboboxSelectModelValue;
22
- options: ComboboxSelectOption[];
23
- placeholder?: string;
24
- searchPlaceholder?: string;
25
- emptyText?: string;
26
- multiple?: boolean;
27
- disabled?: boolean;
28
- size?: 'sm' | 'default';
29
- class?: HTMLAttributes['class'];
30
- contentClass?: HTMLAttributes['class'];
22
+ modelValue?: ComboboxSelectModelValue;
23
+ options: ComboboxSelectOption[];
24
+ placeholder?: string;
25
+ searchPlaceholder?: string;
26
+ emptyText?: string;
27
+ multiple?: boolean;
28
+ disabled?: boolean;
29
+ size?: 'sm' | 'default';
30
+ class?: HTMLAttributes['class'];
31
+ contentClass?: HTMLAttributes['class'];
31
32
  }>(), {
32
- modelValue: undefined,
33
- multiple: false,
34
- disabled: false,
35
- size: 'default'
33
+ modelValue: undefined,
34
+ multiple: false,
35
+ disabled: false,
36
+ size: 'default'
36
37
  });
37
38
 
38
39
  // Emits
39
40
  const emits = defineEmits<{
40
- 'update:modelValue': [value: ComboboxSelectModelValue];
41
+ 'update:modelValue': [value: ComboboxSelectModelValue];
41
42
  }>();
42
43
 
43
44
  const { t } = useI18n();
@@ -55,39 +56,39 @@ const emptyLabel = computed(() => props.emptyText ?? t('uiVintage.combobox.empty
55
56
 
56
57
  // Normalized selection
57
58
  const selectedValues = computed<ComboboxSelectValue[]>(() => {
58
- if (Array.isArray(props.modelValue)) return props.modelValue;
59
- return props.modelValue == null ? [] : [props.modelValue];
59
+ if (Array.isArray(props.modelValue)) return props.modelValue;
60
+ return props.modelValue == null ? [] : [props.modelValue];
60
61
  });
61
62
 
62
63
  // Lookup options by value
63
64
  const optionMap = computed(() => new Map(props.options.map(option => [option.value, option])));
64
65
 
65
66
  const selectedOptions = computed(() => selectedValues.value
66
- .map(value => optionMap.value.get(value))
67
- .filter((option): option is ComboboxSelectOption => !!option));
67
+ .map(value => optionMap.value.get(value))
68
+ .filter((option): option is ComboboxSelectOption => !!option));
68
69
 
69
70
  const selectedOption = computed(() => (props.multiple ? undefined : selectedOptions.value[0]));
70
71
 
71
72
  // Value handed to reka (array in multiple mode)
72
73
  const rootValue = computed<AcceptableValue | AcceptableValue[] | undefined>(() => {
73
- if (props.multiple) return selectedValues.value;
74
- return selectedValues.value[0];
74
+ if (props.multiple) return selectedValues.value;
75
+ return selectedValues.value[0];
75
76
  });
76
77
 
77
78
  // Label shown inside the input for single selection
78
79
  const displayValue = (value: unknown) => {
79
- if (props.multiple || value == null || Array.isArray(value)) return '';
80
- return optionMap.value.get(value as ComboboxSelectValue)?.label ?? '';
80
+ if (props.multiple || value == null || Array.isArray(value)) return '';
81
+ return optionMap.value.get(value as ComboboxSelectValue)?.label ?? '';
81
82
  };
82
83
 
83
84
  // Placeholder switches to a search prompt (or the current label) while open
84
85
  const inputPlaceholder = computed(() => {
85
- if (props.multiple) {
86
- if (open.value || selectedOptions.value.length) return searchPlaceholderText.value;
87
- return placeholderText.value;
88
- }
89
- if (open.value) return selectedOption.value?.label ?? searchPlaceholderText.value;
90
- return placeholderText.value;
86
+ if (props.multiple) {
87
+ if (open.value || selectedOptions.value.length) return searchPlaceholderText.value;
88
+ return placeholderText.value;
89
+ }
90
+ if (open.value) return selectedOption.value?.label ?? searchPlaceholderText.value;
91
+ return placeholderText.value;
91
92
  });
92
93
 
93
94
  // Leading icon mirrors the selected option icon when closed
@@ -95,68 +96,68 @@ const showsOptionIcon = computed(() => !open.value && !!selectedOption.value?.ic
95
96
  const leadingIcon = computed(() => (showsOptionIcon.value && selectedOption.value?.icon) || Search01Icon);
96
97
 
97
98
  const handleUpdate = (value: unknown) => {
98
- if (props.multiple) {
99
- emits('update:modelValue', Array.isArray(value) ? [...value] as ComboboxSelectValue[] : []);
100
- return;
101
- }
102
- emits('update:modelValue', (value ?? null) as ComboboxSelectModelValue);
99
+ if (props.multiple) {
100
+ emits('update:modelValue', Array.isArray(value) ? [...value] as ComboboxSelectValue[] : []);
101
+ return;
102
+ }
103
+ emits('update:modelValue', (value ?? null) as ComboboxSelectModelValue);
103
104
  };
104
105
 
105
106
  // Clear the text on open so the whole list is visible (single mode keeps the label as placeholder)
106
107
  const handleOpenChange = (value: boolean) => {
107
- open.value = value;
108
- interacted.value = true;
109
- if (value) searchTerm.value = '';
108
+ open.value = value;
109
+ interacted.value = true;
110
+ if (value) searchTerm.value = '';
110
111
  };
111
112
 
112
113
  // Remove a tag in multiple mode
113
114
  const removeValue = (value: ComboboxSelectValue) => {
114
- if (props.disabled) return;
115
- emits('update:modelValue', selectedValues.value.filter(item => item !== value));
115
+ if (props.disabled) return;
116
+ emits('update:modelValue', selectedValues.value.filter(item => item !== value));
116
117
  };
117
118
 
118
119
  // Backspace on an empty input removes the last tag
119
120
  const handleKeydown = (event: KeyboardEvent) => {
120
- if (!props.multiple || event.key !== 'Backspace' || searchTerm.value) return;
121
- const last = selectedValues.value[selectedValues.value.length - 1];
122
- if (last !== undefined) removeValue(last);
121
+ if (!props.multiple || event.key !== 'Backspace' || searchTerm.value) return;
122
+ const last = selectedValues.value[selectedValues.value.length - 1];
123
+ if (last !== undefined) removeValue(last);
123
124
  };
124
125
  </script>
125
126
 
126
127
  <template>
127
- <Combobox :model-value="rootValue" :multiple="props.multiple" :disabled="props.disabled" :open="open" data-slot="combobox-select" :class="cn('w-full', props.class)" @update:model-value="handleUpdate" @update:open="handleOpenChange">
128
- <!-- Field -->
129
- <ComboboxAnchor :size="props.size" :class="props.multiple && selectedOptions.length ? 'py-2' : undefined">
130
- <!-- Leading icon -->
131
- <HugeiconsIcon :key="showsOptionIcon ? `option-${selectedOption?.value}` : 'search'" :icon="leadingIcon" :class="cn('size-4', interacted && 'animate-uv-pop')" />
132
-
133
- <div class="flex min-w-0 flex-1 flex-wrap items-center gap-1.5">
134
- <!-- Selected tags (multiple mode) -->
135
- <TransitionGroup v-if="props.multiple" leave-active-class="transition-[opacity,scale] duration-150 ease-snappy" leave-to-class="scale-75 opacity-0">
136
- <span v-for="option in selectedOptions" :key="option.value" data-slot="combobox-select-tag" class="inline-flex h-7 max-w-full animate-uv-pop items-center gap-1 rounded-sm border border-border bg-surface pr-1 pl-2 text-[11px] font-semibold text-foreground sm:text-xs">
137
- <HugeiconsIcon v-if="option.icon" :icon="option.icon" class="size-3" />
138
- <span class="truncate">{{ option.label }}</span>
139
- <button type="button" :disabled="props.disabled" :aria-label="`${t('uiVintage.buttons.remove')} ${option.label}`" class="flex size-5 cursor-pointer items-center justify-center rounded-sm text-muted-foreground outline-none transition-[color,background-color,scale] duration-150 ease-spring hover:bg-accent hover:text-destructive focus-visible:ring-[3px] focus-visible:ring-ring/45 active:scale-90 disabled:pointer-events-none" @click.stop="removeValue(option.value)">
140
- <HugeiconsIcon :icon="Cancel01Icon" class="size-3" />
141
- </button>
142
- </span>
143
- </TransitionGroup>
144
-
145
- <!-- Search input -->
146
- <ComboboxInput v-model="searchTerm" :display-value="displayValue" :placeholder="inputPlaceholder" :disabled="props.disabled" @keydown="handleKeydown" />
147
- </div>
148
-
149
- <!-- Chevron trigger -->
150
- <ComboboxTrigger />
151
- </ComboboxAnchor>
152
-
153
- <!-- Options list -->
154
- <ComboboxList :class="props.contentClass">
155
- <ComboboxEmpty>{{ emptyLabel }}</ComboboxEmpty>
156
-
157
- <ComboboxItem v-for="option in props.options" :key="option.value" :value="option.value" :text-value="option.label" :disabled="option.disabled">
158
- <SelectItemContent :icon="option.icon" :label="option.label" :description="option.description" />
159
- </ComboboxItem>
160
- </ComboboxList>
161
- </Combobox>
128
+ <Combobox :model-value="rootValue" :multiple="props.multiple" :disabled="props.disabled" :open="open" data-slot="combobox-select" :class="cn('w-full', props.class)" @update:model-value="handleUpdate" @update:open="handleOpenChange">
129
+ <!-- Field -->
130
+ <ComboboxAnchor :size="props.size" :class="props.multiple && selectedOptions.length ? 'py-2' : undefined">
131
+ <!-- Leading icon -->
132
+ <HugeiconsIcon :key="showsOptionIcon ? `option-${selectedOption?.value}` : 'search'" :icon="leadingIcon" :class="cn('size-4', interacted && 'animate-uv-pop')" />
133
+
134
+ <div class="flex min-w-0 flex-1 flex-wrap items-center gap-1.5">
135
+ <!-- Selected tags (multiple mode) -->
136
+ <TransitionGroup v-if="props.multiple" leave-active-class="transition-[opacity,scale] duration-150 ease-snappy" leave-to-class="scale-75 opacity-0">
137
+ <span v-for="option in selectedOptions" :key="option.value" data-slot="combobox-select-tag" class="inline-flex h-7 max-w-full animate-uv-pop items-center gap-1 rounded-sm border border-border bg-surface pr-1 pl-2 text-[11px] font-semibold text-foreground sm:text-xs">
138
+ <HugeiconsIcon v-if="option.icon" :icon="option.icon" class="size-3" />
139
+ <span class="truncate">{{ option.label }}</span>
140
+ <button type="button" :disabled="props.disabled" :aria-label="`${t('uiVintage.buttons.remove')} ${option.label}`" class="flex size-5 cursor-pointer items-center justify-center rounded-sm text-muted-foreground outline-none transition-[color,background-color,scale] duration-150 ease-spring hover:bg-accent hover:text-destructive focus-visible:ring-[3px] focus-visible:ring-ring/45 active:scale-90 disabled:pointer-events-none" @click.stop="removeValue(option.value)">
141
+ <HugeiconsIcon :icon="Cancel01Icon" class="size-3" />
142
+ </button>
143
+ </span>
144
+ </TransitionGroup>
145
+
146
+ <!-- Search input -->
147
+ <ComboboxInput v-model="searchTerm" :display-value="displayValue" :placeholder="inputPlaceholder" :disabled="props.disabled" @keydown="handleKeydown" />
148
+ </div>
149
+
150
+ <!-- Chevron trigger -->
151
+ <ComboboxTrigger />
152
+ </ComboboxAnchor>
153
+
154
+ <!-- Options list -->
155
+ <ComboboxList :class="props.contentClass">
156
+ <ComboboxEmpty>{{ emptyLabel }}</ComboboxEmpty>
157
+
158
+ <ComboboxItem v-for="option in props.options" :key="option.value" :value="option.value" :text-value="option.label" :disabled="option.disabled">
159
+ <SelectItemContent :icon="option.icon" :label="option.label" :description="option.description" />
160
+ </ComboboxItem>
161
+ </ComboboxList>
162
+ </Combobox>
162
163
  </template>
@@ -12,5 +12,5 @@ const delegatedProps = reactiveOmit(props, 'class');
12
12
  </script>
13
13
 
14
14
  <template>
15
- <ComboboxSeparator data-slot="combobox-separator" v-bind="delegatedProps" :class="cn('-mx-1 my-1 h-px bg-border', props.class)" />
15
+ <ComboboxSeparator data-slot="combobox-separator" v-bind="delegatedProps" :class="cn('-mx-1 my-1 h-px bg-border', props.class)" />
16
16
  </template>
@@ -2,7 +2,7 @@
2
2
  import type { ComboboxTriggerProps } from 'reka-ui';
3
3
  import type { HTMLAttributes } from 'vue';
4
4
  import { reactiveOmit } from '@vueuse/core';
5
- import { ArrowDown01Icon } from '@hugeicons/core-free-icons';
5
+ import ArrowDown01Icon from '@hugeicons/core-free-icons/ArrowDown01Icon';
6
6
  import { HugeiconsIcon } from '@hugeicons/vue';
7
7
  import { ComboboxTrigger, useForwardProps } from 'reka-ui';
8
8
  import { cn } from '../../../lib/utils';
@@ -15,14 +15,14 @@ const forwardedProps = useForwardProps(delegatedProps);
15
15
  </script>
16
16
 
17
17
  <template>
18
- <ComboboxTrigger data-slot="combobox-trigger" v-bind="forwardedProps" :class="cn(
19
- 'group/combobox-trigger -mr-1 flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-sm text-muted-foreground outline-none transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-60',
20
- props.class
21
- )
22
- ">
23
- <slot>
24
- <!-- Chevron rotates with a spring while open -->
25
- <HugeiconsIcon :icon="ArrowDown01Icon" class="size-4 text-current transition-transform duration-300 ease-spring group-data-[state=open]/combobox-trigger:rotate-180" />
26
- </slot>
27
- </ComboboxTrigger>
18
+ <ComboboxTrigger data-slot="combobox-trigger" v-bind="forwardedProps" :class="cn(
19
+ 'group/combobox-trigger -mr-1 flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-sm text-muted-foreground outline-none transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-60',
20
+ props.class
21
+ )
22
+ ">
23
+ <slot>
24
+ <!-- Chevron rotates with a spring while open -->
25
+ <HugeiconsIcon :icon="ArrowDown01Icon" class="size-4 text-current transition-transform duration-300 ease-spring group-data-[state=open]/combobox-trigger:rotate-180" />
26
+ </slot>
27
+ </ComboboxTrigger>
28
28
  </template>
@@ -5,11 +5,11 @@ export type ComboboxSelectValue = string | number;
5
5
 
6
6
  // Option rendered by ComboboxSelect
7
7
  export interface ComboboxSelectOption {
8
- value: ComboboxSelectValue;
9
- label: string;
10
- description?: string;
11
- icon?: HugeiconsIconDefinition;
12
- disabled?: boolean;
8
+ value: ComboboxSelectValue;
9
+ label: string;
10
+ description?: string;
11
+ icon?: HugeiconsIconDefinition;
12
+ disabled?: boolean;
13
13
  }
14
14
 
15
15
  // v-model shape of ComboboxSelect (array when `multiple`)
@@ -9,7 +9,7 @@ import { provideCommandContext } from '.';
9
9
 
10
10
  // Props
11
11
  const props = withDefaults(defineProps<ListboxRootProps & { class?: HTMLAttributes['class'] }>(), {
12
- modelValue: ''
12
+ modelValue: ''
13
13
  });
14
14
 
15
15
  // Emits
@@ -26,68 +26,68 @@ const allGroups = ref<Map<string, Set<string>>>(new Map());
26
26
 
27
27
  const { contains } = useFilter({ sensitivity: 'base' });
28
28
  const filterState = reactive({
29
- search: '',
30
- filtered: {
31
- /** The count of all visible items. */
32
- count: 0,
33
- /** Map from visible item id to its search score. */
34
- items: new Map() as Map<string, number>,
35
- /** Set of groups with at least one visible item. */
36
- groups: new Set() as Set<string>,
37
- },
29
+ search: '',
30
+ filtered: {
31
+ /** The count of all visible items. */
32
+ count: 0,
33
+ /** Map from visible item id to its search score. */
34
+ items: new Map() as Map<string, number>,
35
+ /** Set of groups with at least one visible item. */
36
+ groups: new Set() as Set<string>,
37
+ },
38
38
  });
39
39
 
40
40
  function filterItems() {
41
- if (!filterState.search) {
42
- filterState.filtered.count = allItems.value.size;
43
- // Do nothing, each item will know to show itself because search is empty
44
- return;
45
- }
41
+ if (!filterState.search) {
42
+ filterState.filtered.count = allItems.value.size;
43
+ // Do nothing, each item will know to show itself because search is empty
44
+ return;
45
+ }
46
46
 
47
- // Reset the groups
48
- filterState.filtered.groups = new Set();
49
- let itemCount = 0;
47
+ // Reset the groups
48
+ filterState.filtered.groups = new Set();
49
+ let itemCount = 0;
50
50
 
51
- // Check which items should be included
52
- for (const [id, value] of allItems.value) {
53
- const score = contains(value, filterState.search);
54
- filterState.filtered.items.set(id, score ? 1 : 0);
55
- if (score) itemCount++;
56
- }
51
+ // Check which items should be included
52
+ for (const [id, value] of allItems.value) {
53
+ const score = contains(value, filterState.search);
54
+ filterState.filtered.items.set(id, score ? 1 : 0);
55
+ if (score) itemCount++;
56
+ }
57
57
 
58
- // Check which groups have at least 1 item shown
59
- for (const [groupId, group] of allGroups.value) {
60
- for (const itemId of group) {
61
- if (filterState.filtered.items.get(itemId)! > 0) {
62
- filterState.filtered.groups.add(groupId);
63
- break;
64
- }
65
- }
66
- }
58
+ // Check which groups have at least 1 item shown
59
+ for (const [groupId, group] of allGroups.value) {
60
+ for (const itemId of group) {
61
+ if (filterState.filtered.items.get(itemId)! > 0) {
62
+ filterState.filtered.groups.add(groupId);
63
+ break;
64
+ }
65
+ }
66
+ }
67
67
 
68
- filterState.filtered.count = itemCount;
68
+ filterState.filtered.count = itemCount;
69
69
  }
70
70
 
71
71
  watch(
72
- () => filterState.search,
73
- () => {
74
- filterItems();
75
- },
72
+ () => filterState.search,
73
+ () => {
74
+ filterItems();
75
+ },
76
76
  );
77
77
 
78
78
  provideCommandContext({
79
- allItems,
80
- allGroups,
81
- filterState,
79
+ allItems,
80
+ allGroups,
81
+ filterState,
82
82
  });
83
83
  </script>
84
84
 
85
85
  <template>
86
- <ListboxRoot data-slot="command" v-bind="forwarded" :class="cn(
87
- 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded transition-colors duration-300 ease-in-out',
88
- props.class,
89
- )
90
- ">
91
- <slot />
92
- </ListboxRoot>
86
+ <ListboxRoot data-slot="command" v-bind="forwarded" :class="cn(
87
+ 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded transition-colors duration-300 ease-in-out',
88
+ props.class,
89
+ )
90
+ ">
91
+ <slot />
92
+ </ListboxRoot>
93
93
  </template>
@@ -11,9 +11,9 @@ import Command from './Command.vue';
11
11
 
12
12
  // Props
13
13
  const props = defineProps<DialogRootProps & {
14
- title?: string;
15
- description?: string;
16
- contentClass?: HTMLAttributes['class'];
14
+ title?: string;
15
+ description?: string;
16
+ contentClass?: HTMLAttributes['class'];
17
17
  }>();
18
18
 
19
19
  const { t } = useI18n();
@@ -29,15 +29,15 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
29
29
  </script>
30
30
 
31
31
  <template>
32
- <Dialog v-slot="slotProps" v-bind="forwarded">
33
- <DialogContent :class="cn('top-[12vh] translate-y-0 gap-0 overflow-hidden p-0 sm:max-w-xl', props.contentClass)">
34
- <DialogHeader class="sr-only">
35
- <DialogTitle>{{ resolvedTitle }}</DialogTitle>
36
- <DialogDescription>{{ resolvedDescription }}</DialogDescription>
37
- </DialogHeader>
38
- <Command>
39
- <slot v-bind="slotProps" />
40
- </Command>
41
- </DialogContent>
42
- </Dialog>
32
+ <Dialog v-slot="slotProps" v-bind="forwarded">
33
+ <DialogContent :class="cn('top-[12vh] translate-y-0 gap-0 overflow-hidden p-0 sm:max-w-xl', props.contentClass)">
34
+ <DialogHeader class="sr-only">
35
+ <DialogTitle>{{ resolvedTitle }}</DialogTitle>
36
+ <DialogDescription>{{ resolvedDescription }}</DialogDescription>
37
+ </DialogHeader>
38
+ <Command>
39
+ <slot v-bind="slotProps" />
40
+ </Command>
41
+ </DialogContent>
42
+ </Dialog>
43
43
  </template>
@@ -15,12 +15,12 @@ const delegatedProps = reactiveOmit(props, 'class');
15
15
 
16
16
  const { filterState } = useCommand();
17
17
  const isRender = computed(
18
- () => !!filterState.search && filterState.filtered.count === 0,
18
+ () => !!filterState.search && filterState.filtered.count === 0,
19
19
  );
20
20
  </script>
21
21
 
22
22
  <template>
23
- <Primitive v-if="isRender" data-slot="command-empty" v-bind="delegatedProps" :class="cn('py-6 text-center text-sm', props.class)">
24
- <slot />
25
- </Primitive>
23
+ <Primitive v-if="isRender" data-slot="command-empty" v-bind="delegatedProps" :class="cn('py-6 text-center text-sm', props.class)">
24
+ <slot />
25
+ </Primitive>
26
26
  </template>