reka-ui 2.9.2 → 2.9.4

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 (381) hide show
  1. package/dist/Accordion/AccordionItem.js +1 -1
  2. package/dist/Accordion/AccordionRoot.js +1 -1
  3. package/dist/AlertDialog/AlertDialogContent.js +1 -1
  4. package/dist/Autocomplete/AutocompleteInput.cjs +25 -8
  5. package/dist/Autocomplete/AutocompleteInput.cjs.map +1 -1
  6. package/dist/Autocomplete/AutocompleteInput.js +26 -9
  7. package/dist/Autocomplete/AutocompleteInput.js.map +1 -1
  8. package/dist/Autocomplete/AutocompleteRoot.js +1 -1
  9. package/dist/Avatar/AvatarRoot.js +1 -1
  10. package/dist/Calendar/CalendarRoot.cjs +1 -1
  11. package/dist/Calendar/CalendarRoot.cjs.map +1 -1
  12. package/dist/Calendar/CalendarRoot.js +2 -2
  13. package/dist/Calendar/CalendarRoot.js.map +1 -1
  14. package/dist/Calendar/useCalendar.cjs +2 -2
  15. package/dist/Calendar/useCalendar.cjs.map +1 -1
  16. package/dist/Calendar/useCalendar.js +2 -2
  17. package/dist/Calendar/useCalendar.js.map +1 -1
  18. package/dist/Checkbox/CheckboxGroupRoot.js +1 -1
  19. package/dist/Checkbox/CheckboxRoot.js +1 -1
  20. package/dist/Collapsible/CollapsibleRoot.js +1 -1
  21. package/dist/Collection/Collection.js +2 -2
  22. package/dist/ColorArea/ColorAreaRoot.cjs +0 -1
  23. package/dist/ColorArea/ColorAreaRoot.cjs.map +1 -1
  24. package/dist/ColorArea/ColorAreaRoot.js +1 -2
  25. package/dist/ColorArea/ColorAreaRoot.js.map +1 -1
  26. package/dist/ColorField/ColorFieldInput.cjs +2 -1
  27. package/dist/ColorField/ColorFieldInput.cjs.map +1 -1
  28. package/dist/ColorField/ColorFieldInput.js +2 -1
  29. package/dist/ColorField/ColorFieldInput.js.map +1 -1
  30. package/dist/ColorField/ColorFieldRoot.cjs +0 -1
  31. package/dist/ColorField/ColorFieldRoot.cjs.map +1 -1
  32. package/dist/ColorField/ColorFieldRoot.js +1 -2
  33. package/dist/ColorField/ColorFieldRoot.js.map +1 -1
  34. package/dist/ColorSlider/ColorSliderRoot.js +1 -1
  35. package/dist/ColorSwatchPicker/ColorSwatchPickerItem.js +1 -1
  36. package/dist/Combobox/ComboboxContentImpl.js +1 -1
  37. package/dist/Combobox/ComboboxGroup.js +1 -1
  38. package/dist/Combobox/ComboboxItem.cjs +1 -1
  39. package/dist/Combobox/ComboboxItem.cjs.map +1 -1
  40. package/dist/Combobox/ComboboxItem.js +1 -1
  41. package/dist/Combobox/ComboboxItem.js.map +1 -1
  42. package/dist/Combobox/ComboboxRoot.js +1 -1
  43. package/dist/ConfigProvider/ConfigProvider.js +1 -1
  44. package/dist/ContextMenu/ContextMenuRoot.js +1 -1
  45. package/dist/ContextMenu/ContextMenuTrigger.cjs +1 -1
  46. package/dist/ContextMenu/ContextMenuTrigger.cjs.map +1 -1
  47. package/dist/ContextMenu/ContextMenuTrigger.js +1 -1
  48. package/dist/ContextMenu/ContextMenuTrigger.js.map +1 -1
  49. package/dist/DateField/DateFieldRoot.cjs +9 -4
  50. package/dist/DateField/DateFieldRoot.cjs.map +1 -1
  51. package/dist/DateField/DateFieldRoot.js +11 -6
  52. package/dist/DateField/DateFieldRoot.js.map +1 -1
  53. package/dist/DatePicker/DatePickerRoot.js +1 -1
  54. package/dist/DateRangeField/DateRangeFieldRoot.js +1 -1
  55. package/dist/DateRangePicker/DateRangePickerRoot.js +1 -1
  56. package/dist/Dialog/DialogRoot.js +1 -1
  57. package/dist/DismissableLayer/DismissableLayer.js +1 -1
  58. package/dist/DropdownMenu/DropdownMenuRoot.js +1 -1
  59. package/dist/DropdownMenu/DropdownMenuTrigger.cjs.map +1 -1
  60. package/dist/DropdownMenu/DropdownMenuTrigger.js.map +1 -1
  61. package/dist/Editable/EditableRoot.js +1 -1
  62. package/dist/FocusScope/FocusScope.cjs +5 -1
  63. package/dist/FocusScope/FocusScope.cjs.map +1 -1
  64. package/dist/FocusScope/FocusScope.js +6 -2
  65. package/dist/FocusScope/FocusScope.js.map +1 -1
  66. package/dist/HoverCard/HoverCardContentImpl.cjs +5 -0
  67. package/dist/HoverCard/HoverCardContentImpl.cjs.map +1 -1
  68. package/dist/HoverCard/HoverCardContentImpl.js +5 -0
  69. package/dist/HoverCard/HoverCardContentImpl.js.map +1 -1
  70. package/dist/HoverCard/HoverCardRoot.js +1 -1
  71. package/dist/Label/Label.cjs.map +1 -1
  72. package/dist/Label/Label.js.map +1 -1
  73. package/dist/Listbox/ListboxContent.cjs.map +1 -1
  74. package/dist/Listbox/ListboxContent.js.map +1 -1
  75. package/dist/Listbox/ListboxGroup.js +1 -1
  76. package/dist/Listbox/ListboxItem.cjs +1 -1
  77. package/dist/Listbox/ListboxItem.cjs.map +1 -1
  78. package/dist/Listbox/ListboxItem.js +2 -2
  79. package/dist/Listbox/ListboxItem.js.map +1 -1
  80. package/dist/Listbox/ListboxRoot.cjs +6 -5
  81. package/dist/Listbox/ListboxRoot.cjs.map +1 -1
  82. package/dist/Listbox/ListboxRoot.js +7 -6
  83. package/dist/Listbox/ListboxRoot.js.map +1 -1
  84. package/dist/Listbox/ListboxVirtualizer.cjs +3 -3
  85. package/dist/Listbox/ListboxVirtualizer.cjs.map +1 -1
  86. package/dist/Listbox/ListboxVirtualizer.js +3 -3
  87. package/dist/Listbox/ListboxVirtualizer.js.map +1 -1
  88. package/dist/Menu/MenuContentImpl.js +1 -1
  89. package/dist/Menu/MenuGroup.js +1 -1
  90. package/dist/Menu/MenuItem.cjs +1 -1
  91. package/dist/Menu/MenuItem.cjs.map +1 -1
  92. package/dist/Menu/MenuItem.js +1 -1
  93. package/dist/Menu/MenuItem.js.map +1 -1
  94. package/dist/Menu/MenuItemImpl.cjs.map +1 -1
  95. package/dist/Menu/MenuItemImpl.js.map +1 -1
  96. package/dist/Menu/MenuItemIndicator.js +1 -1
  97. package/dist/Menu/MenuRadioGroup.js +1 -1
  98. package/dist/Menu/MenuRoot.js +2 -2
  99. package/dist/Menu/MenuSub.js +1 -1
  100. package/dist/Menu/MenuSubTrigger.cjs +2 -1
  101. package/dist/Menu/MenuSubTrigger.cjs.map +1 -1
  102. package/dist/Menu/MenuSubTrigger.js +2 -1
  103. package/dist/Menu/MenuSubTrigger.js.map +1 -1
  104. package/dist/Menubar/MenubarMenu.js +1 -1
  105. package/dist/Menubar/MenubarRoot.js +1 -1
  106. package/dist/Menubar/MenubarTrigger.cjs.map +1 -1
  107. package/dist/Menubar/MenubarTrigger.js.map +1 -1
  108. package/dist/MonthPicker/MonthPickerRoot.cjs +1 -1
  109. package/dist/MonthPicker/MonthPickerRoot.cjs.map +1 -1
  110. package/dist/MonthPicker/MonthPickerRoot.js +2 -2
  111. package/dist/MonthPicker/MonthPickerRoot.js.map +1 -1
  112. package/dist/MonthRangePicker/MonthRangePickerRoot.js +1 -1
  113. package/dist/NavigationMenu/NavigationMenuItem.js +1 -1
  114. package/dist/NavigationMenu/NavigationMenuRoot.js +1 -1
  115. package/dist/NavigationMenu/NavigationMenuTrigger.cjs +1 -0
  116. package/dist/NavigationMenu/NavigationMenuTrigger.cjs.map +1 -1
  117. package/dist/NavigationMenu/NavigationMenuTrigger.js +1 -0
  118. package/dist/NavigationMenu/NavigationMenuTrigger.js.map +1 -1
  119. package/dist/NumberField/NumberFieldRoot.js +1 -1
  120. package/dist/Pagination/PaginationRoot.js +1 -1
  121. package/dist/PinInput/PinInputInput.cjs +12 -6
  122. package/dist/PinInput/PinInputInput.cjs.map +1 -1
  123. package/dist/PinInput/PinInputInput.js +12 -6
  124. package/dist/PinInput/PinInputInput.js.map +1 -1
  125. package/dist/PinInput/PinInputRoot.js +1 -1
  126. package/dist/Popover/PopoverRoot.js +1 -1
  127. package/dist/Popper/PopperArrow.cjs +1 -1
  128. package/dist/Popper/PopperArrow.cjs.map +1 -1
  129. package/dist/Popper/PopperArrow.js +1 -1
  130. package/dist/Popper/PopperArrow.js.map +1 -1
  131. package/dist/Popper/PopperContent.js +1 -1
  132. package/dist/Popper/PopperRoot.js +1 -1
  133. package/dist/Presence/Presence.js +1 -1
  134. package/dist/Primitive/Primitive.js +1 -1
  135. package/dist/Primitive/Slot.js +1 -1
  136. package/dist/Progress/ProgressRoot.js +1 -1
  137. package/dist/RadioGroup/RadioGroupItem.js +1 -1
  138. package/dist/RadioGroup/RadioGroupRoot.js +1 -1
  139. package/dist/RangeCalendar/RangeCalendarRoot.js +1 -1
  140. package/dist/RovingFocus/RovingFocusGroup.js +1 -1
  141. package/dist/RovingFocus/RovingFocusItem.cjs.map +1 -1
  142. package/dist/RovingFocus/RovingFocusItem.js.map +1 -1
  143. package/dist/ScrollArea/ScrollAreaRoot.js +1 -1
  144. package/dist/ScrollArea/ScrollAreaScrollbar.js +1 -1
  145. package/dist/ScrollArea/ScrollAreaScrollbarGlimpse.cjs +2 -2
  146. package/dist/ScrollArea/ScrollAreaScrollbarGlimpse.cjs.map +1 -1
  147. package/dist/ScrollArea/ScrollAreaScrollbarGlimpse.js +2 -2
  148. package/dist/ScrollArea/ScrollAreaScrollbarGlimpse.js.map +1 -1
  149. package/dist/ScrollArea/ScrollAreaScrollbarScroll.cjs +1 -1
  150. package/dist/ScrollArea/ScrollAreaScrollbarScroll.cjs.map +1 -1
  151. package/dist/ScrollArea/ScrollAreaScrollbarScroll.js +1 -1
  152. package/dist/ScrollArea/ScrollAreaScrollbarScroll.js.map +1 -1
  153. package/dist/ScrollArea/ScrollAreaScrollbarVisible.js +1 -1
  154. package/dist/Select/SelectContentImpl.cjs +1 -0
  155. package/dist/Select/SelectContentImpl.cjs.map +1 -1
  156. package/dist/Select/SelectContentImpl.js +2 -1
  157. package/dist/Select/SelectContentImpl.js.map +1 -1
  158. package/dist/Select/SelectGroup.js +1 -1
  159. package/dist/Select/SelectItem.cjs.map +1 -1
  160. package/dist/Select/SelectItem.js +1 -1
  161. package/dist/Select/SelectItem.js.map +1 -1
  162. package/dist/Select/SelectItemAlignedPosition.cjs +1 -1
  163. package/dist/Select/SelectItemAlignedPosition.cjs.map +1 -1
  164. package/dist/Select/SelectItemAlignedPosition.js +2 -2
  165. package/dist/Select/SelectItemAlignedPosition.js.map +1 -1
  166. package/dist/Select/SelectRoot.cjs +1 -1
  167. package/dist/Select/SelectRoot.cjs.map +1 -1
  168. package/dist/Select/SelectRoot.js +2 -2
  169. package/dist/Select/SelectRoot.js.map +1 -1
  170. package/dist/Select/SelectTrigger.cjs.map +1 -1
  171. package/dist/Select/SelectTrigger.js.map +1 -1
  172. package/dist/Slider/SliderImpl.cjs.map +1 -1
  173. package/dist/Slider/SliderImpl.js.map +1 -1
  174. package/dist/Slider/SliderRoot.js +1 -1
  175. package/dist/Slider/utils.js +1 -1
  176. package/dist/Splitter/SplitterGroup.js +1 -1
  177. package/dist/Stepper/StepperItem.js +1 -1
  178. package/dist/Stepper/StepperRoot.js +1 -1
  179. package/dist/Switch/SwitchRoot.js +1 -1
  180. package/dist/Tabs/TabsRoot.js +1 -1
  181. package/dist/Tabs/TabsTrigger.cjs.map +1 -1
  182. package/dist/Tabs/TabsTrigger.js.map +1 -1
  183. package/dist/TagsInput/TagsInputInput.cjs +3 -0
  184. package/dist/TagsInput/TagsInputInput.cjs.map +1 -1
  185. package/dist/TagsInput/TagsInputInput.js +3 -0
  186. package/dist/TagsInput/TagsInputInput.js.map +1 -1
  187. package/dist/TagsInput/TagsInputItem.js +1 -1
  188. package/dist/TagsInput/TagsInputRoot.js +1 -1
  189. package/dist/TimeField/TimeFieldRoot.js +1 -1
  190. package/dist/TimeRangeField/TimeRangeFieldRoot.js +1 -1
  191. package/dist/Toast/ToastProvider.js +1 -1
  192. package/dist/Toast/ToastRootImpl.cjs +3 -3
  193. package/dist/Toast/ToastRootImpl.cjs.map +1 -1
  194. package/dist/Toast/ToastRootImpl.js +4 -4
  195. package/dist/Toast/ToastRootImpl.js.map +1 -1
  196. package/dist/Toast/ToastViewport.cjs +5 -1
  197. package/dist/Toast/ToastViewport.cjs.map +1 -1
  198. package/dist/Toast/ToastViewport.js +5 -1
  199. package/dist/Toast/ToastViewport.js.map +1 -1
  200. package/dist/ToggleGroup/ToggleGroupRoot.js +1 -1
  201. package/dist/Toolbar/ToolbarRoot.js +1 -1
  202. package/dist/Tooltip/TooltipContentImpl.cjs +1 -1
  203. package/dist/Tooltip/TooltipContentImpl.cjs.map +1 -1
  204. package/dist/Tooltip/TooltipContentImpl.js +1 -1
  205. package/dist/Tooltip/TooltipContentImpl.js.map +1 -1
  206. package/dist/Tooltip/TooltipProvider.js +1 -1
  207. package/dist/Tooltip/TooltipRoot.js +1 -1
  208. package/dist/Tree/TreeItem.cjs.map +1 -1
  209. package/dist/Tree/TreeItem.js.map +1 -1
  210. package/dist/Tree/TreeRoot.js +1 -1
  211. package/dist/Tree/TreeVirtualizer.cjs +1 -1
  212. package/dist/Tree/TreeVirtualizer.cjs.map +1 -1
  213. package/dist/Tree/TreeVirtualizer.js +1 -1
  214. package/dist/Tree/TreeVirtualizer.js.map +1 -1
  215. package/dist/YearPicker/YearPickerRoot.cjs +1 -1
  216. package/dist/YearPicker/YearPickerRoot.cjs.map +1 -1
  217. package/dist/YearPicker/YearPickerRoot.js +2 -2
  218. package/dist/YearPicker/YearPickerRoot.js.map +1 -1
  219. package/dist/YearPicker/useYearPicker.cjs +3 -3
  220. package/dist/YearPicker/useYearPicker.cjs.map +1 -1
  221. package/dist/YearPicker/useYearPicker.js +3 -3
  222. package/dist/YearPicker/useYearPicker.js.map +1 -1
  223. package/dist/YearRangePicker/YearRangePickerRoot.js +1 -1
  224. package/dist/color/parse.cjs +10 -4
  225. package/dist/color/parse.cjs.map +1 -1
  226. package/dist/color/parse.js +10 -4
  227. package/dist/color/parse.js.map +1 -1
  228. package/dist/color/utils.cjs +5 -2
  229. package/dist/color/utils.cjs.map +1 -1
  230. package/dist/color/utils.js +5 -2
  231. package/dist/color/utils.js.map +1 -1
  232. package/dist/constant.d.cts.map +1 -1
  233. package/dist/date/calendar.cjs +1 -1
  234. package/dist/date/calendar.cjs.map +1 -1
  235. package/dist/date/calendar.js +1 -1
  236. package/dist/date/calendar.js.map +1 -1
  237. package/dist/date/useDateField.cjs +3 -0
  238. package/dist/date/useDateField.cjs.map +1 -1
  239. package/dist/date/useDateField.js +3 -0
  240. package/dist/date/useDateField.js.map +1 -1
  241. package/dist/date/utils.cjs +30 -0
  242. package/dist/date/utils.cjs.map +1 -1
  243. package/dist/date/utils.js +19 -1
  244. package/dist/date/utils.js.map +1 -1
  245. package/dist/date.d.cts +2 -1
  246. package/dist/date.d.ts +2 -1
  247. package/dist/index.cjs +6 -0
  248. package/dist/index.d.cts +4 -3
  249. package/dist/index.d.ts +4 -3
  250. package/dist/index.js +6 -0
  251. package/dist/index2.d.cts +5 -44
  252. package/dist/index2.d.cts.map +1 -1
  253. package/dist/index2.d.ts +5 -44
  254. package/dist/index2.d.ts.map +1 -1
  255. package/dist/index3.d.cts +400 -10813
  256. package/dist/index3.d.cts.map +1 -1
  257. package/dist/index3.d.ts +400 -10813
  258. package/dist/index3.d.ts.map +1 -1
  259. package/dist/index4.d.cts +10538 -0
  260. package/dist/index4.d.cts.map +1 -0
  261. package/dist/index4.d.ts +10538 -0
  262. package/dist/index4.d.ts.map +1 -0
  263. package/dist/internal.cjs +22 -0
  264. package/dist/internal.d.cts +10 -6
  265. package/dist/internal.d.cts.map +1 -1
  266. package/dist/internal.d.ts +10 -6
  267. package/dist/internal.d.ts.map +1 -1
  268. package/dist/internal.js +22 -0
  269. package/dist/namespaced/index.cjs +82 -0
  270. package/dist/namespaced/index.d.cts +77 -3
  271. package/dist/namespaced/index.d.mts +77 -3
  272. package/dist/namespaced/index.mjs +75 -3
  273. package/dist/shared/arrays.cjs +22 -0
  274. package/dist/shared/arrays.cjs.map +1 -1
  275. package/dist/shared/arrays.js +17 -1
  276. package/dist/shared/arrays.js.map +1 -1
  277. package/dist/shared/clamp.cjs +6 -0
  278. package/dist/shared/clamp.js +1 -1
  279. package/dist/shared/createContext.cjs +1 -1
  280. package/dist/shared/createContext.js +1 -1
  281. package/dist/shared/index.cjs +0 -0
  282. package/dist/shared/index.js +0 -0
  283. package/dist/shared/isValidVNodeElement.cjs +17 -0
  284. package/dist/shared/isValidVNodeElement.cjs.map +1 -0
  285. package/dist/shared/isValidVNodeElement.js +11 -0
  286. package/dist/shared/isValidVNodeElement.js.map +1 -0
  287. package/dist/shared/object.cjs +26 -0
  288. package/dist/shared/object.cjs.map +1 -0
  289. package/dist/shared/object.js +14 -0
  290. package/dist/shared/object.js.map +1 -0
  291. package/dist/shared/onFocusOutside.cjs +30 -0
  292. package/dist/shared/onFocusOutside.cjs.map +1 -0
  293. package/dist/shared/onFocusOutside.js +24 -0
  294. package/dist/shared/onFocusOutside.js.map +1 -0
  295. package/dist/shared/trap-focus.cjs +35 -0
  296. package/dist/shared/trap-focus.cjs.map +1 -0
  297. package/dist/shared/trap-focus.js +30 -0
  298. package/dist/shared/trap-focus.js.map +1 -0
  299. package/dist/shared/useForwardExpose.cjs +1 -1
  300. package/dist/shared/useForwardExpose.cjs.map +1 -1
  301. package/dist/shared/useForwardExpose.js +1 -1
  302. package/dist/shared/useForwardExpose.js.map +1 -1
  303. package/dist/shared/useForwardProps.cjs.map +1 -1
  304. package/dist/shared/useForwardProps.js.map +1 -1
  305. package/dist/shared/useForwardRef.cjs +23 -0
  306. package/dist/shared/useForwardRef.cjs.map +1 -0
  307. package/dist/shared/useForwardRef.js +17 -0
  308. package/dist/shared/useForwardRef.js.map +1 -0
  309. package/dist/shared/useGraceArea.cjs +3 -2
  310. package/dist/shared/useGraceArea.cjs.map +1 -1
  311. package/dist/shared/useGraceArea.js +3 -2
  312. package/dist/shared/useGraceArea.js.map +1 -1
  313. package/dist/shared/useKbd.cjs +17 -0
  314. package/dist/shared/useKbd.cjs.map +1 -1
  315. package/dist/shared/useKbd.js +12 -1
  316. package/dist/shared/useKbd.js.map +1 -1
  317. package/dist/shared/useSelectionBehavior.cjs +1 -1
  318. package/dist/shared/useSelectionBehavior.cjs.map +1 -1
  319. package/dist/shared/useSelectionBehavior.js +1 -1
  320. package/dist/shared/useSelectionBehavior.js.map +1 -1
  321. package/dist/shared.cjs +83 -0
  322. package/dist/shared.d.cts +2 -0
  323. package/dist/shared.d.ts +2 -0
  324. package/dist/shared.js +43 -0
  325. package/package.json +10 -6
  326. package/src/Autocomplete/AutocompleteInput.vue +30 -8
  327. package/src/Calendar/CalendarRoot.vue +1 -1
  328. package/src/Calendar/useCalendar.ts +2 -2
  329. package/src/ColorArea/ColorAreaRoot.vue +0 -4
  330. package/src/ColorField/ColorFieldInput.vue +3 -1
  331. package/src/ColorField/ColorFieldRoot.vue +0 -4
  332. package/src/Combobox/ComboboxItem.vue +3 -0
  333. package/src/ContextMenu/ContextMenuTrigger.vue +1 -4
  334. package/src/DateField/DateFieldRoot.vue +11 -4
  335. package/src/DropdownMenu/DropdownMenuTrigger.vue +2 -2
  336. package/src/FocusScope/FocusScope.vue +15 -1
  337. package/src/HoverCard/HoverCardContentImpl.vue +7 -0
  338. package/src/Label/Label.vue +1 -1
  339. package/src/Listbox/ListboxContent.vue +1 -1
  340. package/src/Listbox/ListboxItem.vue +2 -2
  341. package/src/Listbox/ListboxRoot.vue +8 -6
  342. package/src/Listbox/ListboxVirtualizer.vue +3 -3
  343. package/src/Menu/MenuItem.vue +4 -4
  344. package/src/Menu/MenuItemImpl.vue +2 -2
  345. package/src/Menu/MenuSubTrigger.vue +4 -3
  346. package/src/Menubar/MenubarTrigger.vue +2 -2
  347. package/src/MonthPicker/MonthPickerRoot.vue +1 -1
  348. package/src/NavigationMenu/NavigationMenuTrigger.vue +4 -2
  349. package/src/PinInput/PinInputInput.vue +19 -8
  350. package/src/Popper/PopperArrow.vue +3 -2
  351. package/src/RovingFocus/RovingFocusItem.vue +1 -1
  352. package/src/ScrollArea/ScrollAreaScrollbarGlimpse.vue +2 -8
  353. package/src/ScrollArea/ScrollAreaScrollbarScroll.vue +1 -4
  354. package/src/Select/SelectContentImpl.vue +3 -2
  355. package/src/Select/SelectItem.vue +1 -1
  356. package/src/Select/SelectItemAlignedPosition.vue +1 -1
  357. package/src/Select/SelectRoot.vue +1 -1
  358. package/src/Select/SelectTrigger.vue +1 -1
  359. package/src/Select/index.ts +1 -0
  360. package/src/Slider/SliderImpl.vue +4 -4
  361. package/src/Tabs/TabsTrigger.vue +1 -1
  362. package/src/TagsInput/TagsInputInput.vue +10 -1
  363. package/src/Toast/ToastRootImpl.vue +3 -3
  364. package/src/Toast/ToastViewport.vue +9 -5
  365. package/src/Tooltip/TooltipContentImpl.vue +1 -1
  366. package/src/Tree/TreeItem.vue +3 -3
  367. package/src/Tree/TreeVirtualizer.vue +1 -1
  368. package/src/YearPicker/YearPickerRoot.vue +1 -1
  369. package/src/YearPicker/useYearPicker.ts +3 -3
  370. package/src/date/calendar.ts +1 -1
  371. package/src/shared/color/parse.ts +11 -4
  372. package/src/shared/color/utils.ts +6 -2
  373. package/src/shared/date/types.ts +2 -0
  374. package/src/shared/date/useDateField.ts +3 -0
  375. package/src/shared/date/utils.ts +29 -1
  376. package/src/shared/object.ts +1 -1
  377. package/src/shared/trap-focus.ts +1 -3
  378. package/src/shared/useForwardExpose.ts +1 -1
  379. package/src/shared/useForwardProps.ts +13 -2
  380. package/src/shared/useGraceArea.ts +7 -5
  381. package/src/shared/useSelectionBehavior.ts +1 -1
@@ -117,7 +117,21 @@ watchEffect((cleanupFn) => {
117
117
  // if the element still exist inside the container,
118
118
  // if not then we focus to the container
119
119
  function handleMutations(mutations: MutationRecord[]) {
120
- const isLastFocusedElementExist = container.contains(lastFocusedElementRef.value)
120
+ const lastFocusedElement = lastFocusedElementRef.value
121
+
122
+ // Mutation may be triggered by something unrelated to focus, e.g. class is set on an element
123
+ // so we first check if we even have a previously focused element.
124
+ if (lastFocusedElement === null) {
125
+ return
126
+ }
127
+
128
+ // Ensure mutations removed nodes from the DOM at all.
129
+ const anyNodesRemoved = mutations.some(m => m.removedNodes.length > 0)
130
+ if (!anyNodesRemoved) {
131
+ return
132
+ }
133
+
134
+ const isLastFocusedElementExist = container.contains(lastFocusedElement)
121
135
  if (!isLastFocusedElementExist)
122
136
  focus(container)
123
137
  }
@@ -9,6 +9,7 @@ export interface HoverCardContentImplProps extends PopperContentProps {}
9
9
  </script>
10
10
 
11
11
  <script setup lang="ts">
12
+ import { useEventListener } from '@vueuse/core'
12
13
  import { nextTick, onMounted, onUnmounted, ref, watchEffect } from 'vue'
13
14
  import { DismissableLayer } from '@/DismissableLayer'
14
15
  import { PopperContent } from '@/Popper'
@@ -68,6 +69,12 @@ onMounted(() => {
68
69
  const tabbables = getTabbableNodes(contentElement.value)
69
70
  tabbables.forEach(tabbable => tabbable.setAttribute('tabindex', '-1'))
70
71
  }
72
+
73
+ useEventListener(window, 'scroll', (event: Event) => {
74
+ const target = event.target as HTMLElement
75
+ if (target?.contains(rootContext.triggerElement.value!))
76
+ rootContext.onDismiss()
77
+ }, { capture: true })
71
78
  })
72
79
 
73
80
  onUnmounted(() => {
@@ -21,7 +21,7 @@ useForwardExpose()
21
21
  <template>
22
22
  <Primitive
23
23
  v-bind="props"
24
- @mousedown="(event) => {
24
+ @mousedown="(event: MouseEvent) => {
25
25
  // prevent text selection when double clicking label
26
26
  if (!event.defaultPrevented && event.detail > 1) event.preventDefault();
27
27
  }"
@@ -29,7 +29,7 @@ const isClickFocus = refAutoReset(false, 10)
29
29
  :aria-multiselectable="!!rootContext.multiple.value"
30
30
  :data-orientation="rootContext.orientation.value"
31
31
  @mousedown.left="isClickFocus = true"
32
- @focus="(ev) => {
32
+ @focus="(ev: FocusEvent) => {
33
33
  if (isClickFocus)
34
34
  return
35
35
  rootContext.onEnter(ev)
@@ -92,8 +92,8 @@ provideListboxItemContext({
92
92
  if (rootContext.highlightedElement.value === currentElement)
93
93
  return
94
94
 
95
- if (rootContext.highlightOnHover.value && !rootContext.focusable.value)
96
- rootContext.changeHighlight(currentElement, false)
95
+ if (rootContext.highlightOnHover.value)
96
+ rootContext.changeHighlight(currentElement, false, false)
97
97
  }"
98
98
  >
99
99
  <slot />
@@ -27,7 +27,7 @@ type ListboxRootContext<T> = {
27
27
 
28
28
  onLeave: (event: Event) => void
29
29
  onEnter: (event: Event) => void
30
- changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void
30
+ changeHighlight: (el: HTMLElement, scrollIntoView?: boolean, focus?: boolean) => void
31
31
  onKeydownNavigation: (event: KeyboardEvent) => void
32
32
  onKeydownEnter: (event: KeyboardEvent) => void
33
33
  onKeydownTypeAhead: (event: KeyboardEvent) => void
@@ -157,12 +157,12 @@ function getCollectionItem() {
157
157
  return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')
158
158
  }
159
159
 
160
- function changeHighlight(el: HTMLElement, scrollIntoView = true) {
160
+ function changeHighlight(el: HTMLElement, scrollIntoView = true, focus?: boolean) {
161
161
  if (!el)
162
162
  return
163
163
 
164
164
  highlightedElement.value = el
165
- if (focusable.value)
165
+ if (focus ?? focusable.value)
166
166
  highlightedElement.value.focus()
167
167
  if (scrollIntoView)
168
168
  highlightedElement.value.scrollIntoView({ block: 'nearest' })
@@ -211,7 +211,9 @@ function onKeydownTypeAhead(event: KeyboardEvent) {
211
211
  const values = collection.map(i => i.value)
212
212
  modelValue.value = [...values]
213
213
  event.preventDefault()
214
- changeHighlight(collection[collection.length - 1].ref)
214
+ const lastItem = collection.at(-1)
215
+ if (lastItem)
216
+ changeHighlight(lastItem.ref)
215
217
  }
216
218
  else if (!isMetaKey) {
217
219
  const el = handleTypeaheadSearch(event.key, getItems())
@@ -309,9 +311,9 @@ function handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {
309
311
  let lastValue = collection.find(i => i.ref === targetEl)?.value
310
312
 
311
313
  if (event.key === kbd.END)
312
- lastValue = collection[collection.length - 1].value
314
+ lastValue = collection.at(-1)?.value
313
315
  else if (event.key === kbd.HOME)
314
- lastValue = collection[0].value
316
+ lastValue = collection[0]?.value
315
317
 
316
318
  if (!lastValue || !firstValue.value)
317
319
  return
@@ -83,7 +83,7 @@ const virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map(
83
83
  })[0]
84
84
 
85
85
  const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)
86
- ? defaultNode.children[0] as VNode
86
+ ? defaultNode.children.find(child => typeof (child as VNode).type !== 'symbol') as VNode
87
87
  : defaultNode
88
88
 
89
89
  return {
@@ -178,7 +178,7 @@ function handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' |
178
178
  break
179
179
  }
180
180
  case 'last': {
181
- value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])
181
+ value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options.at(-1)!)
182
182
  break
183
183
  }
184
184
  }
@@ -211,7 +211,7 @@ rootContext.virtualKeydownHook.on((event) => {
211
211
  virtualizer.value.scrollToIndex(index)
212
212
  requestAnimationFrame(() => {
213
213
  const items = getItems()
214
- const item = intent === 'first' ? items[0] : items[items.length - 1]
214
+ const item = intent === 'first' ? items[0] : items.at(-1)
215
215
  if (item)
216
216
  rootContext.changeHighlight(item.ref)
217
217
  })
@@ -57,21 +57,21 @@ async function handleSelect() {
57
57
  }
58
58
  "
59
59
  @pointerup="
60
- async (event) => {
60
+ async (event: PointerEvent) => {
61
61
  await nextTick();
62
62
  if (event.defaultPrevented) return;
63
63
  // Pointer down can move to a different menu item which should activate it on pointer up.
64
64
  // We dispatch a click for selection to allow composition with click based triggers and to
65
65
  // prevent Firefox from getting stuck in text selection mode when the menu closes.
66
- if (!isPointerDownRef) event.currentTarget?.click();
66
+ if (!isPointerDownRef) (event.currentTarget as HTMLElement)?.click();
67
67
  }
68
68
  "
69
69
  @keydown="
70
- async (event) => {
70
+ async (event: KeyboardEvent) => {
71
71
  const isTypingAhead = contentContext.searchRef.value !== '';
72
72
  if (disabled || (isTypingAhead && event.key === ' ')) return;
73
73
  if (SELECTION_KEYS.includes(event.key)) {
74
- event.currentTarget.click();
74
+ (event.currentTarget as HTMLElement)?.click();
75
75
  /**
76
76
  * We prevent default browser behaviour for selection keys as they should trigger
77
77
  * a selection only:
@@ -79,7 +79,7 @@ async function handlePointerLeave(event: PointerEvent) {
79
79
  @pointermove="handlePointerMove"
80
80
  @pointerleave="handlePointerLeave"
81
81
  @focus="
82
- async (event) => {
82
+ async (event: FocusEvent) => {
83
83
  await nextTick();
84
84
  if (event.defaultPrevented || disabled) return;
85
85
  isFocused = true;
@@ -87,7 +87,7 @@ async function handlePointerLeave(event: PointerEvent) {
87
87
  }
88
88
  "
89
89
  @blur="
90
- async (event) => {
90
+ async (event: FocusEvent) => {
91
91
  await nextTick();
92
92
  if (event.defaultPrevented) return;
93
93
  isFocused = false;
@@ -133,7 +133,8 @@ async function handleKeyDown(event: KeyboardEvent) {
133
133
  v-bind="props"
134
134
  :id="subContext.triggerId"
135
135
  :ref="
136
- (vnode: ComponentPublicInstance) => {
136
+ (vnode: Element | ComponentPublicInstance | null) => {
137
+ if (!vnode) return undefined
137
138
  // @ts-ignore
138
139
  subContext?.onTriggerChange(vnode?.$el);
139
140
  return undefined
@@ -144,14 +145,14 @@ async function handleKeyDown(event: KeyboardEvent) {
144
145
  :aria-controls="subContext.contentId"
145
146
  :data-state="getOpenState(menuContext.open.value)"
146
147
  @click="
147
- async (event) => {
148
+ async (event: MouseEvent) => {
148
149
  if (props.disabled || event.defaultPrevented) return;
149
150
  /**
150
151
  * We manually focus because iOS Safari doesn't always focus on click (e.g. buttons)
151
152
  * and we rely heavily on `onFocusOutside` for submenus to close when switching
152
153
  * between separate submenus.
153
154
  */
154
- event.currentTarget.focus();
155
+ (event.currentTarget as HTMLElement)?.focus();
155
156
  if (!menuContext.open.value) menuContext.onOpenChange(true);
156
157
  }
157
158
  "
@@ -60,7 +60,7 @@ onMounted(() => {
60
60
  :data-disabled="disabled ? '' : undefined"
61
61
  :disabled="disabled"
62
62
  :data-value="menuContext.value"
63
- @pointerdown="(event) => {
63
+ @pointerdown="(event: PointerEvent) => {
64
64
  // only call handler if it's the left button (mousedown gets triggered by all mouse buttons)
65
65
  // but not when the control key is pressed (avoiding MacOS right click)
66
66
  if (!disabled && event.button === 0 && event.ctrlKey === false) {
@@ -77,7 +77,7 @@ onMounted(() => {
77
77
  triggerElement?.focus()
78
78
  }
79
79
  }"
80
- @keydown.enter.space.arrow-down="(event) => {
80
+ @keydown.enter.space.arrow-down="(event: KeyboardEvent) => {
81
81
  if (disabled) return;
82
82
  if (['Enter', ' '].includes(event.key)) rootContext.onMenuToggle(menuContext.value);
83
83
  if (event.key === 'ArrowDown') rootContext.onMenuOpen(menuContext.value);
@@ -196,7 +196,7 @@ const { isInvalid, isMonthSelected } = useMonthPickerState({
196
196
 
197
197
  watch(modelValue, (_modelValue) => {
198
198
  if (Array.isArray(_modelValue) && _modelValue.length) {
199
- const lastValue = _modelValue[_modelValue.length - 1]
199
+ const lastValue = _modelValue.at(-1)
200
200
  if (lastValue && !isSameYearMonth(placeholder.value, lastValue))
201
201
  onPlaceholderChange(lastValue)
202
202
  }
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { VNode } from 'vue'
2
+ import type { ComponentPublicInstance } from 'vue'
3
3
  import type { PrimitiveProps } from '@/Primitive'
4
4
  import { useCollection } from '@/Collection'
5
5
  import { useForwardExpose } from '@/shared'
@@ -119,7 +119,9 @@ function handleKeydown(ev: KeyboardEvent) {
119
119
  }
120
120
  }
121
121
 
122
- function setFocusProxyRef(node: VNode) {
122
+ function setFocusProxyRef(node: Element | ComponentPublicInstance | null) {
123
+ if (!node)
124
+ return undefined
123
125
  // @ts-expect-error unrefElement expect MaybeRef, but also support Vnode
124
126
  itemContext.focusProxyRef.value = unrefElement(node)
125
127
  return undefined
@@ -21,13 +21,16 @@ const props = withDefaults(defineProps<PinInputInputProps>(), {
21
21
  })
22
22
 
23
23
  const context = injectPinInputRootContext()
24
- const inputElements = computed(() => Array.from(context.inputElements!.value))
24
+ const inputElements = computed(() => [...context.inputElements!.value])
25
25
  const currentValue = computed(() => context.currentModelValue.value[props.index])
26
26
 
27
27
  const disabled = computed(() => props.disabled || context.disabled.value)
28
28
  const isOtpMode = computed(() => context.otp.value)
29
29
  const isPasswordMode = computed(() => context.mask.value)
30
30
 
31
+ const NUMBER_REG = /^\d*$/
32
+ const NON_NUMBER_REG = /\D/g
33
+
31
34
  const { primitiveElement, currentElement } = usePrimitiveElement()
32
35
  function handleInput(event: InputEvent) {
33
36
  const target = event.target as HTMLInputElement
@@ -37,8 +40,8 @@ function handleInput(event: InputEvent) {
37
40
  return
38
41
  }
39
42
 
40
- if (context.isNumericMode.value && !/^\d*$/.test(target.value)) {
41
- target.value = target.value.replace(/\D/g, '')
43
+ if (context.isNumericMode.value && !NUMBER_REG.test(target.value)) {
44
+ target.value = target.value.replace(NON_NUMBER_REG, '')
42
45
  return
43
46
  }
44
47
 
@@ -127,7 +130,10 @@ function handlePaste(event: ClipboardEvent) {
127
130
  if (!clipboardData)
128
131
  return
129
132
 
130
- const values = clipboardData.getData('text')
133
+ const rawValues = clipboardData.getData('text')
134
+ const values = context.isNumericMode.value
135
+ ? rawValues.replace(NON_NUMBER_REG, '')
136
+ : rawValues
131
137
  handleMultipleCharacter(values)
132
138
  }
133
139
 
@@ -138,10 +144,15 @@ function handleMultipleCharacter(values: string) {
138
144
  for (let i = initialIndex; i < lastIndex; i++) {
139
145
  const input = inputElements.value[i]
140
146
  const value = values[i - initialIndex]
141
- if (context.isNumericMode.value && !/^\d*$/.test(value))
142
- continue
143
-
144
- tempModelValue[i] = value
147
+ if (context.isNumericMode.value) {
148
+ const num = Number.parseInt(value)
149
+ if (Number.isNaN(num))
150
+ continue
151
+ tempModelValue[i] = num
152
+ }
153
+ else {
154
+ tempModelValue[i] = value
155
+ }
145
156
  input.focus()
146
157
  }
147
158
  context.modelValue.value = tempModelValue
@@ -14,6 +14,7 @@ export interface PopperArrowProps extends ArrowProps, PrimitiveProps {}
14
14
  </script>
15
15
 
16
16
  <script setup lang="ts">
17
+ import type { ComponentPublicInstance } from 'vue'
17
18
  import { computed } from 'vue'
18
19
  import { useForwardExpose } from '@/shared'
19
20
  import Arrow from '@/shared/component/Arrow.vue'
@@ -36,8 +37,8 @@ const baseSide = computed(() => OPPOSITE_SIDE[contentContext.placedSide.value])
36
37
 
37
38
  <template>
38
39
  <span
39
- :ref="(el: HTMLElement) => {
40
- contentContext.onArrowChange(el)
40
+ :ref="(el: Element | ComponentPublicInstance | null) => {
41
+ contentContext.onArrowChange((el as HTMLElement) ?? undefined)
41
42
  return undefined
42
43
  }"
43
44
  :style="{
@@ -97,7 +97,7 @@ function handleKeydown(event: KeyboardEvent) {
97
97
  :as="as"
98
98
  :as-child="asChild"
99
99
  @mousedown="
100
- (event) => {
100
+ (event: MouseEvent) => {
101
101
  // We prevent focusing non-focusable items on `mousedown`.
102
102
  // Even though the item has tabIndex={-1}, that only means take it out of the tab order.
103
103
  if (!focusable) event.preventDefault();
@@ -65,10 +65,7 @@ const debounceScrollEnd = useDebounceFn(() => dispatch('SCROLL_END'), 100)
65
65
 
66
66
  watchEffect((onCleanup) => {
67
67
  if (state.value === 'glimpse') {
68
- const timeId = window.setTimeout(
69
- () => dispatch('HIDE'),
70
- rootContext.scrollHideDelay.value,
71
- )
68
+ const timeId = window.setTimeout(dispatch, rootContext.scrollHideDelay.value, 'HIDE')
72
69
 
73
70
  onCleanup(() => {
74
71
  window.clearTimeout(timeId)
@@ -78,10 +75,7 @@ watchEffect((onCleanup) => {
78
75
 
79
76
  watchEffect((onCleanup) => {
80
77
  if (state.value === 'idle') {
81
- const timeId = window.setTimeout(
82
- () => dispatch('HIDE'),
83
- rootContext.scrollHideDelay.value,
84
- )
78
+ const timeId = window.setTimeout(dispatch, rootContext.scrollHideDelay.value, 'HIDE')
85
79
 
86
80
  onCleanup(() => {
87
81
  window.clearTimeout(timeId)
@@ -44,10 +44,7 @@ const visible = computed(() => state.value !== 'hidden')
44
44
 
45
45
  watchEffect((onCleanup) => {
46
46
  if (state.value === 'idle') {
47
- const timeId = window.setTimeout(
48
- () => dispatch('HIDE'),
49
- rootContext.scrollHideDelay.value,
50
- )
47
+ const timeId = window.setTimeout(dispatch, rootContext.scrollHideDelay.value, 'HIDE')
51
48
 
52
49
  onCleanup(() => {
53
50
  window.clearTimeout(timeId)
@@ -301,8 +301,9 @@ provideSelectContentContext({
301
301
  v-bind="{ ...$attrs, ...forwardedProps }"
302
302
  :id="rootContext.contentId"
303
303
  :ref="
304
- (vnode: ComponentPublicInstance) => {
305
- const el = unrefElement(vnode) as HTMLElement | undefined
304
+ (vnode: Element | ComponentPublicInstance | null) => {
305
+ if (!vnode) return undefined
306
+ const el = unrefElement(vnode as ComponentPublicInstance) as HTMLElement | undefined
306
307
  // special case for PopperContent
307
308
  if (el?.hasAttribute('data-reka-popper-content-wrapper'))
308
309
  content = el.firstElementChild as HTMLElement
@@ -169,7 +169,7 @@ provideSelectItemContext({
169
169
  @focus="isFocused = true"
170
170
  @blur="isFocused = false"
171
171
  @pointerup="handleSelectCustomEvent"
172
- @pointerdown="(event) => {
172
+ @pointerdown="(event: PointerEvent) => {
173
173
  (event.currentTarget as HTMLElement).focus({ preventScroll: true })
174
174
  }"
175
175
  @touchend.prevent.stop
@@ -145,7 +145,7 @@ function position() {
145
145
  = contentTopToItemMiddle <= topEdgeToTriggerMiddle
146
146
 
147
147
  if (willAlignWithoutTopOverflow) {
148
- const isLastItem = selectedItem.value === items[items.length - 1]
148
+ const isLastItem = selectedItem.value === items.at(-1)
149
149
  contentWrapperElement.value.style.bottom = `${0}px`
150
150
  const viewportOffsetBottom
151
151
  = contentElement.value.clientHeight
@@ -201,7 +201,7 @@ provideSelectRootContext({
201
201
  />
202
202
 
203
203
  <BubbleSelect
204
- v-if="isFormControl"
204
+ v-if="isFormControl && name"
205
205
  :key="nativeSelectKey"
206
206
  aria-hidden="true"
207
207
  tabindex="-1"
@@ -111,7 +111,7 @@ function handlePointerOpen(event: PointerEvent) {
111
111
  }
112
112
  "
113
113
  @keydown="
114
- (event) => {
114
+ (event: KeyboardEvent) => {
115
115
  const isTypingAhead = search !== '';
116
116
  const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
117
117
  if (!isModifierKey && event.key.length === 1)
@@ -19,6 +19,7 @@ export {
19
19
  export {
20
20
  injectSelectItemContext,
21
21
  default as SelectItem,
22
+ type SelectItemEmits,
22
23
  type SelectItemProps,
23
24
  type SelectEvent as SelectItemSelectEvent,
24
25
  } from './SelectItem.vue'
@@ -29,7 +29,7 @@ const rootContext = injectSliderRootContext()
29
29
  <Primitive
30
30
  data-slider-impl
31
31
  v-bind="props"
32
- @keydown="(event) => {
32
+ @keydown="(event: KeyboardEvent) => {
33
33
  if (event.key === 'Home') {
34
34
  emits('homeKeyDown', event)
35
35
  // Prevent scrolling to page start
@@ -46,7 +46,7 @@ const rootContext = injectSliderRootContext()
46
46
  event.preventDefault();
47
47
  }
48
48
  }"
49
- @pointerdown="(event) => {
49
+ @pointerdown="(event: PointerEvent) => {
50
50
  const target = event.target as HTMLElement;
51
51
  target.setPointerCapture(event.pointerId);
52
52
  // Prevent browser focus behaviour because we focus a thumb manually when values change.
@@ -60,11 +60,11 @@ const rootContext = injectSliderRootContext()
60
60
  emits('slideStart', event)
61
61
  }
62
62
  }"
63
- @pointermove="(event) => {
63
+ @pointermove="(event: PointerEvent) => {
64
64
  const target = event.target as HTMLElement;
65
65
  if (target.hasPointerCapture(event.pointerId)) emits('slideMove', event);
66
66
  }"
67
- @pointerup="(event) => {
67
+ @pointerup="(event: PointerEvent) => {
68
68
  const target = event.target as HTMLElement;
69
69
  if (target.hasPointerCapture(event.pointerId)) {
70
70
  target.releasePointerCapture(event.pointerId);
@@ -51,7 +51,7 @@ const isSelected = computed(() => props.value === rootContext.modelValue.value)
51
51
  :disabled="disabled"
52
52
  :data-disabled="disabled ? '' : undefined"
53
53
  :data-orientation="rootContext.orientation.value"
54
- @mousedown.left="(event) => {
54
+ @mousedown.left="(event: MouseEvent) => {
55
55
  // only call handler if it's the left button (mousedown gets triggered by all mouse buttons)
56
56
  // but not when the control key is pressed (avoiding MacOS right click)
57
57
  if (!disabled && event.ctrlKey === false) {
@@ -24,13 +24,22 @@ const props = withDefaults(defineProps<TagsInputInputProps>(), {
24
24
  const context = injectTagsInputRootContext()
25
25
  const { forwardRef, currentElement } = useForwardExpose()
26
26
 
27
- function handleBlur(event: Event) {
27
+ function handleBlur(event: FocusEvent) {
28
28
  context.selectedElement.value = undefined
29
29
 
30
30
  if (!context.addOnBlur.value)
31
31
  return
32
32
 
33
33
  const target = event.target as HTMLInputElement
34
+
35
+ // If the blur is caused by clicking an option within the content,
36
+ // we don't trigger the `addOnBlur` action,
37
+ // because the clicked option should be added instead of the input's current value.
38
+ const relatedTarget = event.relatedTarget as HTMLElement | null
39
+ const controlledId = target.getAttribute('aria-controls')
40
+ if (controlledId && relatedTarget?.closest(`#${CSS.escape(controlledId)}`))
41
+ return
42
+
34
43
  if (!target.value)
35
44
  return
36
45
 
@@ -82,7 +82,7 @@ const closeTimerRef = ref(0)
82
82
  const remainingTime = ref(duration.value)
83
83
 
84
84
  const remainingRaf = useRafFn(() => {
85
- const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.value
85
+ const elapsedTime = Date.now() - closeTimerStartTimeRef.value
86
86
  remainingTime.value = Math.max(closeTimerRemainingTimeRef.value - elapsedTime, 0)
87
87
  }, { fpsLimit: 60 })
88
88
 
@@ -95,7 +95,7 @@ function startTimer(duration: number) {
95
95
  if (!isClient)
96
96
  return
97
97
  window.clearTimeout(closeTimerRef.value)
98
- closeTimerStartTimeRef.value = new Date().getTime()
98
+ closeTimerStartTimeRef.value = Date.now()
99
99
  closeTimerRef.value = window.setTimeout(handleClose, duration)
100
100
  }
101
101
 
@@ -133,7 +133,7 @@ watchEffect((cleanupFn) => {
133
133
  emits('resume')
134
134
  }
135
135
  const handlePause = () => {
136
- const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.value
136
+ const elapsedTime = Date.now() - closeTimerStartTimeRef.value
137
137
  closeTimerRemainingTimeRef.value = closeTimerRemainingTimeRef.value - elapsedTime
138
138
  window.clearTimeout(closeTimerRef.value)
139
139
  remainingRaf.pause()
@@ -48,7 +48,9 @@ const hasToasts = computed(() => providerContext.toastCount.value > 0)
48
48
  const headFocusProxyRef = ref<HTMLElement>()
49
49
  const tailFocusProxyRef = ref<HTMLElement>()
50
50
 
51
- const hotkeyMessage = computed(() => hotkey.value.join('+').replace(/Key/g, '').replace(/Digit/g, ''))
51
+ const KEY_RE = /Key/g
52
+ const DIGIT_RE = /Digit/g
53
+ const hotkeyMessage = computed(() => hotkey.value.join('+').replace(KEY_RE, '').replace(DIGIT_RE, ''))
52
54
 
53
55
  onKeyStroke(hotkey.value, () => {
54
56
  currentElement.value.focus()
@@ -172,8 +174,9 @@ function getSortedTabbableCandidates({ tabbingDirection }: { tabbingDirection: '
172
174
  >
173
175
  <FocusProxy
174
176
  v-if="hasToasts"
175
- :ref="(node: ComponentPublicInstance) => {
176
- headFocusProxyRef = unrefElement(node) as HTMLElement
177
+ :ref="(node: Element | ComponentPublicInstance | null) => {
178
+ if (!node) return undefined
179
+ headFocusProxyRef = unrefElement(node as ComponentPublicInstance) as HTMLElement
177
180
  return undefined
178
181
  }"
179
182
  @focus-from-outside-viewport="() => {
@@ -196,8 +199,9 @@ function getSortedTabbableCandidates({ tabbingDirection }: { tabbingDirection: '
196
199
  </CollectionSlot>
197
200
  <FocusProxy
198
201
  v-if="hasToasts"
199
- :ref="(node: ComponentPublicInstance) => {
200
- tailFocusProxyRef = unrefElement(node) as HTMLElement
202
+ :ref="(node: Element | ComponentPublicInstance | null) => {
203
+ if (!node) return undefined
204
+ tailFocusProxyRef = unrefElement(node as ComponentPublicInstance) as HTMLElement
201
205
  return undefined
202
206
  }"
203
207
  @focus-from-outside-viewport="() => {
@@ -85,7 +85,7 @@ onMounted(() => {
85
85
  const target = event.target as HTMLElement
86
86
  if (target?.contains(rootContext.trigger.value!))
87
87
  rootContext.onClose()
88
- })
88
+ }, { capture: true })
89
89
  // Close this tooltip if another one opens
90
90
  useEventListener(window, TOOLTIP_OPEN, rootContext.onClose)
91
91
  })
@@ -178,9 +178,9 @@ defineExpose({
178
178
  :data-selected="isSelected ? '' : undefined"
179
179
  :data-expanded="isExpanded ? '' : undefined"
180
180
  @keydown.enter.space.self.prevent="handleSelectCustomEvent"
181
- @keydown.right.prevent="(ev) => rootContext.dir.value === 'ltr' ? handleKeydownRight(ev) : handleKeydownLeft(ev)"
182
- @keydown.left.prevent="(ev) => rootContext.dir.value === 'ltr' ? handleKeydownLeft(ev) : handleKeydownRight(ev)"
183
- @click.stop="(ev) => {
181
+ @keydown.right.prevent="(ev: KeyboardEvent) => rootContext.dir.value === 'ltr' ? handleKeydownRight(ev) : handleKeydownLeft(ev)"
182
+ @keydown.left.prevent="(ev: KeyboardEvent) => rootContext.dir.value === 'ltr' ? handleKeydownLeft(ev) : handleKeydownRight(ev)"
183
+ @click.stop="(ev: PointerEvent) => {
184
184
  handleSelectCustomEvent(ev)
185
185
  handleToggleCustomEvent(ev)
186
186
  }"
@@ -134,7 +134,7 @@ rootContext.virtualKeydownHook.on((event) => {
134
134
  virtualizer.value.scrollToIndex(index)
135
135
  requestAnimationFrame(() => {
136
136
  const items = getItems()
137
- const item = intent === 'first' ? items[0] : items[items.length - 1]
137
+ const item = intent === 'first' ? items[0] : items.at(-1)!
138
138
  item.ref.focus()
139
139
  })
140
140
  }
@@ -202,7 +202,7 @@ const { isInvalid, isYearSelected } = useYearPickerState({
202
202
 
203
203
  watch(modelValue, (_modelValue) => {
204
204
  if (Array.isArray(_modelValue) && _modelValue.length) {
205
- const lastValue = _modelValue[_modelValue.length - 1]
205
+ const lastValue = _modelValue.at(-1)
206
206
  if (lastValue && !isSameYear(placeholder.value, lastValue))
207
207
  onPlaceholderChange(lastValue)
208
208
  }