reka-ui 2.2.1 → 2.3.0

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 (556) hide show
  1. package/dist/Accordion/AccordionItem.cjs.map +1 -1
  2. package/dist/Accordion/AccordionItem.js.map +1 -1
  3. package/dist/Accordion/AccordionRoot.cjs.map +1 -1
  4. package/dist/Accordion/AccordionRoot.js.map +1 -1
  5. package/dist/AlertDialog/AlertDialogCancel.cjs.map +1 -1
  6. package/dist/AlertDialog/AlertDialogCancel.js.map +1 -1
  7. package/dist/AlertDialog/AlertDialogContent.cjs.map +1 -1
  8. package/dist/AlertDialog/AlertDialogContent.js.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.cjs.map +1 -1
  10. package/dist/AspectRatio/AspectRatio.js.map +1 -1
  11. package/dist/Avatar/AvatarFallback.cjs +11 -14
  12. package/dist/Avatar/AvatarFallback.cjs.map +1 -1
  13. package/dist/Avatar/AvatarFallback.js +12 -15
  14. package/dist/Avatar/AvatarFallback.js.map +1 -1
  15. package/dist/Avatar/AvatarImage.cjs +3 -2
  16. package/dist/Avatar/AvatarImage.cjs.map +1 -1
  17. package/dist/Avatar/AvatarImage.js +3 -2
  18. package/dist/Avatar/AvatarImage.js.map +1 -1
  19. package/dist/Avatar/AvatarRoot.cjs +1 -1
  20. package/dist/Avatar/AvatarRoot.cjs.map +1 -1
  21. package/dist/Avatar/AvatarRoot.js +1 -1
  22. package/dist/Avatar/AvatarRoot.js.map +1 -1
  23. package/dist/Avatar/utils.cjs +43 -16
  24. package/dist/Avatar/utils.cjs.map +1 -1
  25. package/dist/Avatar/utils.js +44 -17
  26. package/dist/Avatar/utils.js.map +1 -1
  27. package/dist/Calendar/CalendarCell.cjs +2 -2
  28. package/dist/Calendar/CalendarCell.cjs.map +1 -1
  29. package/dist/Calendar/CalendarCell.js +2 -2
  30. package/dist/Calendar/CalendarCell.js.map +1 -1
  31. package/dist/Calendar/CalendarCellTrigger.cjs +5 -1
  32. package/dist/Calendar/CalendarCellTrigger.cjs.map +1 -1
  33. package/dist/Calendar/CalendarCellTrigger.js +5 -1
  34. package/dist/Calendar/CalendarCellTrigger.js.map +1 -1
  35. package/dist/Calendar/CalendarGrid.cjs.map +1 -1
  36. package/dist/Calendar/CalendarGrid.js.map +1 -1
  37. package/dist/Calendar/CalendarHeading.cjs.map +1 -1
  38. package/dist/Calendar/CalendarHeading.js.map +1 -1
  39. package/dist/Calendar/CalendarNext.cjs.map +1 -1
  40. package/dist/Calendar/CalendarNext.js.map +1 -1
  41. package/dist/Calendar/CalendarPrev.cjs.map +1 -1
  42. package/dist/Calendar/CalendarPrev.js.map +1 -1
  43. package/dist/Calendar/CalendarRoot.cjs +7 -4
  44. package/dist/Calendar/CalendarRoot.cjs.map +1 -1
  45. package/dist/Calendar/CalendarRoot.js +7 -4
  46. package/dist/Calendar/CalendarRoot.js.map +1 -1
  47. package/dist/Calendar/useCalendar.cjs +2 -2
  48. package/dist/Calendar/useCalendar.cjs.map +1 -1
  49. package/dist/Calendar/useCalendar.js +2 -2
  50. package/dist/Calendar/useCalendar.js.map +1 -1
  51. package/dist/Checkbox/CheckboxGroupRoot.cjs.map +1 -1
  52. package/dist/Checkbox/CheckboxGroupRoot.js.map +1 -1
  53. package/dist/Checkbox/CheckboxRoot.cjs.map +1 -1
  54. package/dist/Checkbox/CheckboxRoot.js.map +1 -1
  55. package/dist/Collapsible/CollapsibleContent.cjs.map +1 -1
  56. package/dist/Collapsible/CollapsibleContent.js.map +1 -1
  57. package/dist/Collapsible/CollapsibleRoot.cjs +2 -0
  58. package/dist/Collapsible/CollapsibleRoot.cjs.map +1 -1
  59. package/dist/Collapsible/CollapsibleRoot.js +2 -0
  60. package/dist/Collapsible/CollapsibleRoot.js.map +1 -1
  61. package/dist/Collection/Collection.cjs.map +1 -1
  62. package/dist/Collection/Collection.js.map +1 -1
  63. package/dist/Combobox/ComboboxContentImpl.cjs.map +1 -1
  64. package/dist/Combobox/ComboboxContentImpl.js.map +1 -1
  65. package/dist/Combobox/ComboboxGroup.cjs.map +1 -1
  66. package/dist/Combobox/ComboboxGroup.js.map +1 -1
  67. package/dist/Combobox/ComboboxInput.cjs.map +1 -1
  68. package/dist/Combobox/ComboboxInput.js.map +1 -1
  69. package/dist/Combobox/ComboboxItem.cjs.map +1 -1
  70. package/dist/Combobox/ComboboxItem.js.map +1 -1
  71. package/dist/Combobox/ComboboxRoot.cjs +1 -2
  72. package/dist/Combobox/ComboboxRoot.cjs.map +1 -1
  73. package/dist/Combobox/ComboboxRoot.js +1 -2
  74. package/dist/Combobox/ComboboxRoot.js.map +1 -1
  75. package/dist/Combobox/ComboboxTrigger.cjs.map +1 -1
  76. package/dist/Combobox/ComboboxTrigger.js.map +1 -1
  77. package/dist/Combobox/ComboboxViewport.cjs.map +1 -1
  78. package/dist/Combobox/ComboboxViewport.js.map +1 -1
  79. package/dist/Combobox/ComboboxVirtualizer.cjs.map +1 -1
  80. package/dist/Combobox/ComboboxVirtualizer.js.map +1 -1
  81. package/dist/ConfigProvider/ConfigProvider.cjs.map +1 -1
  82. package/dist/ConfigProvider/ConfigProvider.js.map +1 -1
  83. package/dist/ContextMenu/ContextMenuContent.cjs.map +1 -1
  84. package/dist/ContextMenu/ContextMenuContent.js.map +1 -1
  85. package/dist/ContextMenu/ContextMenuRoot.cjs.map +1 -1
  86. package/dist/ContextMenu/ContextMenuRoot.js.map +1 -1
  87. package/dist/ContextMenu/ContextMenuSub.cjs +1 -1
  88. package/dist/ContextMenu/ContextMenuSub.cjs.map +1 -1
  89. package/dist/ContextMenu/ContextMenuSub.js +1 -1
  90. package/dist/ContextMenu/ContextMenuSub.js.map +1 -1
  91. package/dist/ContextMenu/ContextMenuTrigger.cjs.map +1 -1
  92. package/dist/ContextMenu/ContextMenuTrigger.js.map +1 -1
  93. package/dist/DateField/DateFieldInput.cjs +1 -0
  94. package/dist/DateField/DateFieldInput.cjs.map +1 -1
  95. package/dist/DateField/DateFieldInput.js +1 -0
  96. package/dist/DateField/DateFieldInput.js.map +1 -1
  97. package/dist/DateField/DateFieldRoot.cjs +7 -1
  98. package/dist/DateField/DateFieldRoot.cjs.map +1 -1
  99. package/dist/DateField/DateFieldRoot.js +7 -1
  100. package/dist/DateField/DateFieldRoot.js.map +1 -1
  101. package/dist/DatePicker/DatePickerCellTrigger.cjs.map +1 -1
  102. package/dist/DatePicker/DatePickerCellTrigger.js.map +1 -1
  103. package/dist/DatePicker/DatePickerContent.cjs +8 -3
  104. package/dist/DatePicker/DatePickerContent.cjs.map +1 -1
  105. package/dist/DatePicker/DatePickerContent.js +9 -4
  106. package/dist/DatePicker/DatePickerContent.js.map +1 -1
  107. package/dist/DatePicker/DatePickerHeading.cjs.map +1 -1
  108. package/dist/DatePicker/DatePickerHeading.js.map +1 -1
  109. package/dist/DatePicker/DatePickerNext.cjs.map +1 -1
  110. package/dist/DatePicker/DatePickerNext.js.map +1 -1
  111. package/dist/DatePicker/DatePickerPrev.cjs.map +1 -1
  112. package/dist/DatePicker/DatePickerPrev.js.map +1 -1
  113. package/dist/DatePicker/DatePickerRoot.cjs +1 -0
  114. package/dist/DatePicker/DatePickerRoot.cjs.map +1 -1
  115. package/dist/DatePicker/DatePickerRoot.js +1 -0
  116. package/dist/DatePicker/DatePickerRoot.js.map +1 -1
  117. package/dist/DateRangeField/DateRangeFieldInput.cjs +1 -0
  118. package/dist/DateRangeField/DateRangeFieldInput.cjs.map +1 -1
  119. package/dist/DateRangeField/DateRangeFieldInput.js +1 -0
  120. package/dist/DateRangeField/DateRangeFieldInput.js.map +1 -1
  121. package/dist/DateRangeField/DateRangeFieldRoot.cjs +13 -9
  122. package/dist/DateRangeField/DateRangeFieldRoot.cjs.map +1 -1
  123. package/dist/DateRangeField/DateRangeFieldRoot.js +13 -9
  124. package/dist/DateRangeField/DateRangeFieldRoot.js.map +1 -1
  125. package/dist/DateRangePicker/DateRangePickerCalendar.cjs +2 -1
  126. package/dist/DateRangePicker/DateRangePickerCalendar.cjs.map +1 -1
  127. package/dist/DateRangePicker/DateRangePickerCalendar.js +2 -1
  128. package/dist/DateRangePicker/DateRangePickerCalendar.js.map +1 -1
  129. package/dist/DateRangePicker/DateRangePickerContent.cjs +8 -3
  130. package/dist/DateRangePicker/DateRangePickerContent.cjs.map +1 -1
  131. package/dist/DateRangePicker/DateRangePickerContent.js +9 -4
  132. package/dist/DateRangePicker/DateRangePickerContent.js.map +1 -1
  133. package/dist/DateRangePicker/DateRangePickerHeading.cjs.map +1 -1
  134. package/dist/DateRangePicker/DateRangePickerHeading.js.map +1 -1
  135. package/dist/DateRangePicker/DateRangePickerNext.cjs.map +1 -1
  136. package/dist/DateRangePicker/DateRangePickerNext.js.map +1 -1
  137. package/dist/DateRangePicker/DateRangePickerPrev.cjs.map +1 -1
  138. package/dist/DateRangePicker/DateRangePickerPrev.js.map +1 -1
  139. package/dist/DateRangePicker/DateRangePickerRoot.cjs +6 -2
  140. package/dist/DateRangePicker/DateRangePickerRoot.cjs.map +1 -1
  141. package/dist/DateRangePicker/DateRangePickerRoot.js +6 -2
  142. package/dist/DateRangePicker/DateRangePickerRoot.js.map +1 -1
  143. package/dist/Dialog/DialogContentImpl.cjs.map +1 -1
  144. package/dist/Dialog/DialogContentImpl.js.map +1 -1
  145. package/dist/Dialog/DialogContentNonModal.cjs.map +1 -1
  146. package/dist/Dialog/DialogContentNonModal.js.map +1 -1
  147. package/dist/Dialog/DialogRoot.cjs +4 -1
  148. package/dist/Dialog/DialogRoot.cjs.map +1 -1
  149. package/dist/Dialog/DialogRoot.js +4 -1
  150. package/dist/Dialog/DialogRoot.js.map +1 -1
  151. package/dist/Dialog/DialogTrigger.cjs.map +1 -1
  152. package/dist/Dialog/DialogTrigger.js.map +1 -1
  153. package/dist/DismissableLayer/DismissableLayer.cjs.map +1 -1
  154. package/dist/DismissableLayer/DismissableLayer.js.map +1 -1
  155. package/dist/DismissableLayer/DismissableLayerBranch.cjs.map +1 -1
  156. package/dist/DismissableLayer/DismissableLayerBranch.js.map +1 -1
  157. package/dist/DismissableLayer/utils.cjs +7 -3
  158. package/dist/DismissableLayer/utils.cjs.map +1 -1
  159. package/dist/DismissableLayer/utils.js +8 -4
  160. package/dist/DismissableLayer/utils.js.map +1 -1
  161. package/dist/DropdownMenu/DropdownMenuContent.cjs.map +1 -1
  162. package/dist/DropdownMenu/DropdownMenuContent.js.map +1 -1
  163. package/dist/DropdownMenu/DropdownMenuRoot.cjs +1 -1
  164. package/dist/DropdownMenu/DropdownMenuRoot.cjs.map +1 -1
  165. package/dist/DropdownMenu/DropdownMenuRoot.js +1 -1
  166. package/dist/DropdownMenu/DropdownMenuRoot.js.map +1 -1
  167. package/dist/DropdownMenu/DropdownMenuSub.cjs +1 -1
  168. package/dist/DropdownMenu/DropdownMenuSub.cjs.map +1 -1
  169. package/dist/DropdownMenu/DropdownMenuSub.js +1 -1
  170. package/dist/DropdownMenu/DropdownMenuSub.js.map +1 -1
  171. package/dist/DropdownMenu/DropdownMenuTrigger.cjs.map +1 -1
  172. package/dist/DropdownMenu/DropdownMenuTrigger.js.map +1 -1
  173. package/dist/Editable/EditableInput.cjs.map +1 -1
  174. package/dist/Editable/EditableInput.js.map +1 -1
  175. package/dist/Editable/EditableRoot.cjs +1 -1
  176. package/dist/Editable/EditableRoot.cjs.map +1 -1
  177. package/dist/Editable/EditableRoot.js +1 -1
  178. package/dist/Editable/EditableRoot.js.map +1 -1
  179. package/dist/FocusScope/FocusScope.cjs.map +1 -1
  180. package/dist/FocusScope/FocusScope.js.map +1 -1
  181. package/dist/HoverCard/HoverCardContentImpl.cjs.map +1 -1
  182. package/dist/HoverCard/HoverCardContentImpl.js.map +1 -1
  183. package/dist/HoverCard/HoverCardRoot.cjs +1 -1
  184. package/dist/HoverCard/HoverCardRoot.cjs.map +1 -1
  185. package/dist/HoverCard/HoverCardRoot.js +1 -1
  186. package/dist/HoverCard/HoverCardRoot.js.map +1 -1
  187. package/dist/Listbox/ListboxFilter.cjs.map +1 -1
  188. package/dist/Listbox/ListboxFilter.js.map +1 -1
  189. package/dist/Listbox/ListboxItem.cjs.map +1 -1
  190. package/dist/Listbox/ListboxItem.js.map +1 -1
  191. package/dist/Listbox/ListboxRoot.cjs +1 -1
  192. package/dist/Listbox/ListboxRoot.cjs.map +1 -1
  193. package/dist/Listbox/ListboxRoot.js +1 -1
  194. package/dist/Listbox/ListboxRoot.js.map +1 -1
  195. package/dist/Listbox/ListboxVirtualizer.cjs +3 -3
  196. package/dist/Listbox/ListboxVirtualizer.cjs.map +1 -1
  197. package/dist/Listbox/ListboxVirtualizer.js +3 -3
  198. package/dist/Listbox/ListboxVirtualizer.js.map +1 -1
  199. package/dist/Menu/MenuCheckboxItem.cjs.map +1 -1
  200. package/dist/Menu/MenuCheckboxItem.js.map +1 -1
  201. package/dist/Menu/MenuContentImpl.cjs.map +1 -1
  202. package/dist/Menu/MenuContentImpl.js.map +1 -1
  203. package/dist/Menu/MenuItemImpl.cjs.map +1 -1
  204. package/dist/Menu/MenuItemImpl.js.map +1 -1
  205. package/dist/Menu/MenuItemIndicator.cjs.map +1 -1
  206. package/dist/Menu/MenuItemIndicator.js.map +1 -1
  207. package/dist/Menu/MenuRadioGroup.cjs.map +1 -1
  208. package/dist/Menu/MenuRadioGroup.js.map +1 -1
  209. package/dist/Menu/MenuRoot.cjs +1 -1
  210. package/dist/Menu/MenuRoot.cjs.map +1 -1
  211. package/dist/Menu/MenuRoot.js +1 -1
  212. package/dist/Menu/MenuRoot.js.map +1 -1
  213. package/dist/Menu/MenuSub.cjs +1 -1
  214. package/dist/Menu/MenuSub.cjs.map +1 -1
  215. package/dist/Menu/MenuSub.js +1 -1
  216. package/dist/Menu/MenuSub.js.map +1 -1
  217. package/dist/Menu/MenuSubTrigger.cjs.map +1 -1
  218. package/dist/Menu/MenuSubTrigger.js.map +1 -1
  219. package/dist/Menubar/MenubarContent.cjs.map +1 -1
  220. package/dist/Menubar/MenubarContent.js.map +1 -1
  221. package/dist/Menubar/MenubarMenu.cjs.map +1 -1
  222. package/dist/Menubar/MenubarMenu.js.map +1 -1
  223. package/dist/Menubar/MenubarRoot.cjs.map +1 -1
  224. package/dist/Menubar/MenubarRoot.js.map +1 -1
  225. package/dist/Menubar/MenubarSub.cjs +1 -1
  226. package/dist/Menubar/MenubarSub.cjs.map +1 -1
  227. package/dist/Menubar/MenubarSub.js +1 -1
  228. package/dist/Menubar/MenubarSub.js.map +1 -1
  229. package/dist/Menubar/MenubarTrigger.cjs.map +1 -1
  230. package/dist/Menubar/MenubarTrigger.js.map +1 -1
  231. package/dist/NavigationMenu/NavigationMenuContent.cjs.map +1 -1
  232. package/dist/NavigationMenu/NavigationMenuContent.js.map +1 -1
  233. package/dist/NavigationMenu/NavigationMenuContentImpl.cjs.map +1 -1
  234. package/dist/NavigationMenu/NavigationMenuContentImpl.js.map +1 -1
  235. package/dist/NavigationMenu/NavigationMenuIndicator.cjs.map +1 -1
  236. package/dist/NavigationMenu/NavigationMenuIndicator.js.map +1 -1
  237. package/dist/NavigationMenu/NavigationMenuItem.cjs.map +1 -1
  238. package/dist/NavigationMenu/NavigationMenuItem.js.map +1 -1
  239. package/dist/NavigationMenu/NavigationMenuList.cjs.map +1 -1
  240. package/dist/NavigationMenu/NavigationMenuList.js.map +1 -1
  241. package/dist/NavigationMenu/NavigationMenuRoot.cjs.map +1 -1
  242. package/dist/NavigationMenu/NavigationMenuRoot.js.map +1 -1
  243. package/dist/NavigationMenu/NavigationMenuSub.cjs.map +1 -1
  244. package/dist/NavigationMenu/NavigationMenuSub.js.map +1 -1
  245. package/dist/NavigationMenu/NavigationMenuTrigger.cjs.map +1 -1
  246. package/dist/NavigationMenu/NavigationMenuTrigger.js.map +1 -1
  247. package/dist/NavigationMenu/NavigationMenuViewport.cjs.map +1 -1
  248. package/dist/NavigationMenu/NavigationMenuViewport.js.map +1 -1
  249. package/dist/NumberField/NumberFieldInput.cjs +2 -2
  250. package/dist/NumberField/NumberFieldInput.cjs.map +1 -1
  251. package/dist/NumberField/NumberFieldInput.js +2 -2
  252. package/dist/NumberField/NumberFieldInput.js.map +1 -1
  253. package/dist/NumberField/NumberFieldRoot.cjs +8 -5
  254. package/dist/NumberField/NumberFieldRoot.cjs.map +1 -1
  255. package/dist/NumberField/NumberFieldRoot.js +8 -5
  256. package/dist/NumberField/NumberFieldRoot.js.map +1 -1
  257. package/dist/Pagination/PaginationFirst.cjs.map +1 -1
  258. package/dist/Pagination/PaginationFirst.js.map +1 -1
  259. package/dist/Pagination/PaginationLast.cjs.map +1 -1
  260. package/dist/Pagination/PaginationLast.js.map +1 -1
  261. package/dist/Pagination/PaginationList.cjs.map +1 -1
  262. package/dist/Pagination/PaginationList.js.map +1 -1
  263. package/dist/Pagination/PaginationListItem.cjs.map +1 -1
  264. package/dist/Pagination/PaginationListItem.js.map +1 -1
  265. package/dist/Pagination/PaginationNext.cjs.map +1 -1
  266. package/dist/Pagination/PaginationNext.js.map +1 -1
  267. package/dist/Pagination/PaginationPrev.cjs.map +1 -1
  268. package/dist/Pagination/PaginationPrev.js.map +1 -1
  269. package/dist/Pagination/PaginationRoot.cjs.map +1 -1
  270. package/dist/Pagination/PaginationRoot.js.map +1 -1
  271. package/dist/PinInput/PinInputInput.cjs +1 -1
  272. package/dist/PinInput/PinInputInput.cjs.map +1 -1
  273. package/dist/PinInput/PinInputInput.js +1 -1
  274. package/dist/PinInput/PinInputInput.js.map +1 -1
  275. package/dist/PinInput/PinInputRoot.cjs.map +1 -1
  276. package/dist/PinInput/PinInputRoot.js.map +1 -1
  277. package/dist/Popover/PopoverAnchor.cjs.map +1 -1
  278. package/dist/Popover/PopoverAnchor.js.map +1 -1
  279. package/dist/Popover/PopoverContentModal.cjs.map +1 -1
  280. package/dist/Popover/PopoverContentModal.js.map +1 -1
  281. package/dist/Popover/PopoverContentNonModal.cjs.map +1 -1
  282. package/dist/Popover/PopoverContentNonModal.js.map +1 -1
  283. package/dist/Popover/PopoverRoot.cjs +1 -1
  284. package/dist/Popover/PopoverRoot.cjs.map +1 -1
  285. package/dist/Popover/PopoverRoot.js +1 -1
  286. package/dist/Popover/PopoverRoot.js.map +1 -1
  287. package/dist/Popover/PopoverTrigger.cjs.map +1 -1
  288. package/dist/Popover/PopoverTrigger.js.map +1 -1
  289. package/dist/Popper/PopperAnchor.cjs.map +1 -1
  290. package/dist/Popper/PopperAnchor.js.map +1 -1
  291. package/dist/Popper/PopperArrow.cjs.map +1 -1
  292. package/dist/Popper/PopperArrow.js.map +1 -1
  293. package/dist/Popper/PopperContent.cjs.map +1 -1
  294. package/dist/Popper/PopperContent.js.map +1 -1
  295. package/dist/Presence/Presence.cjs.map +1 -1
  296. package/dist/Presence/Presence.js.map +1 -1
  297. package/dist/Presence/usePresence.cjs.map +1 -1
  298. package/dist/Presence/usePresence.js.map +1 -1
  299. package/dist/Primitive/Slot.cjs +1 -9
  300. package/dist/Primitive/Slot.cjs.map +1 -1
  301. package/dist/Primitive/Slot.js +1 -9
  302. package/dist/Primitive/Slot.js.map +1 -1
  303. package/dist/Progress/ProgressRoot.cjs +3 -2
  304. package/dist/Progress/ProgressRoot.cjs.map +1 -1
  305. package/dist/Progress/ProgressRoot.js +3 -2
  306. package/dist/Progress/ProgressRoot.js.map +1 -1
  307. package/dist/RadioGroup/Radio.cjs.map +1 -1
  308. package/dist/RadioGroup/Radio.js.map +1 -1
  309. package/dist/RadioGroup/RadioGroupItem.cjs.map +1 -1
  310. package/dist/RadioGroup/RadioGroupItem.js.map +1 -1
  311. package/dist/RadioGroup/RadioGroupRoot.cjs.map +1 -1
  312. package/dist/RadioGroup/RadioGroupRoot.js.map +1 -1
  313. package/dist/RangeCalendar/RangeCalendarCell.cjs +2 -2
  314. package/dist/RangeCalendar/RangeCalendarCell.cjs.map +1 -1
  315. package/dist/RangeCalendar/RangeCalendarCell.js +2 -2
  316. package/dist/RangeCalendar/RangeCalendarCell.js.map +1 -1
  317. package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs +28 -9
  318. package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs.map +1 -1
  319. package/dist/RangeCalendar/RangeCalendarCellTrigger.js +28 -9
  320. package/dist/RangeCalendar/RangeCalendarCellTrigger.js.map +1 -1
  321. package/dist/RangeCalendar/RangeCalendarGrid.cjs.map +1 -1
  322. package/dist/RangeCalendar/RangeCalendarGrid.js.map +1 -1
  323. package/dist/RangeCalendar/RangeCalendarHeading.cjs.map +1 -1
  324. package/dist/RangeCalendar/RangeCalendarHeading.js.map +1 -1
  325. package/dist/RangeCalendar/RangeCalendarNext.cjs.map +1 -1
  326. package/dist/RangeCalendar/RangeCalendarNext.js.map +1 -1
  327. package/dist/RangeCalendar/RangeCalendarPrev.cjs.map +1 -1
  328. package/dist/RangeCalendar/RangeCalendarPrev.js.map +1 -1
  329. package/dist/RangeCalendar/RangeCalendarRoot.cjs +26 -9
  330. package/dist/RangeCalendar/RangeCalendarRoot.cjs.map +1 -1
  331. package/dist/RangeCalendar/RangeCalendarRoot.js +26 -9
  332. package/dist/RangeCalendar/RangeCalendarRoot.js.map +1 -1
  333. package/dist/RangeCalendar/useRangeCalendar.cjs +21 -4
  334. package/dist/RangeCalendar/useRangeCalendar.cjs.map +1 -1
  335. package/dist/RangeCalendar/useRangeCalendar.js +21 -4
  336. package/dist/RangeCalendar/useRangeCalendar.js.map +1 -1
  337. package/dist/RovingFocus/RovingFocusGroup.cjs +1 -1
  338. package/dist/RovingFocus/RovingFocusGroup.cjs.map +1 -1
  339. package/dist/RovingFocus/RovingFocusGroup.js +1 -1
  340. package/dist/RovingFocus/RovingFocusGroup.js.map +1 -1
  341. package/dist/RovingFocus/RovingFocusItem.cjs.map +1 -1
  342. package/dist/RovingFocus/RovingFocusItem.js.map +1 -1
  343. package/dist/ScrollArea/ScrollAreaCornerImpl.cjs.map +1 -1
  344. package/dist/ScrollArea/ScrollAreaCornerImpl.js.map +1 -1
  345. package/dist/ScrollArea/ScrollAreaRoot.cjs.map +1 -1
  346. package/dist/ScrollArea/ScrollAreaRoot.js.map +1 -1
  347. package/dist/ScrollArea/ScrollAreaScrollbar.cjs.map +1 -1
  348. package/dist/ScrollArea/ScrollAreaScrollbar.js.map +1 -1
  349. package/dist/ScrollArea/ScrollAreaScrollbarAuto.cjs.map +1 -1
  350. package/dist/ScrollArea/ScrollAreaScrollbarAuto.js.map +1 -1
  351. package/dist/ScrollArea/ScrollAreaScrollbarHover.cjs.map +1 -1
  352. package/dist/ScrollArea/ScrollAreaScrollbarHover.js.map +1 -1
  353. package/dist/ScrollArea/ScrollAreaScrollbarImpl.cjs.map +1 -1
  354. package/dist/ScrollArea/ScrollAreaScrollbarImpl.js.map +1 -1
  355. package/dist/ScrollArea/ScrollAreaScrollbarScroll.cjs.map +1 -1
  356. package/dist/ScrollArea/ScrollAreaScrollbarScroll.js.map +1 -1
  357. package/dist/ScrollArea/ScrollAreaScrollbarX.cjs.map +1 -1
  358. package/dist/ScrollArea/ScrollAreaScrollbarX.js.map +1 -1
  359. package/dist/ScrollArea/ScrollAreaScrollbarY.cjs.map +1 -1
  360. package/dist/ScrollArea/ScrollAreaScrollbarY.js.map +1 -1
  361. package/dist/ScrollArea/ScrollAreaThumb.cjs.map +1 -1
  362. package/dist/ScrollArea/ScrollAreaThumb.js.map +1 -1
  363. package/dist/ScrollArea/ScrollAreaViewport.cjs.map +1 -1
  364. package/dist/ScrollArea/ScrollAreaViewport.js.map +1 -1
  365. package/dist/Select/BubbleSelect.cjs.map +1 -1
  366. package/dist/Select/BubbleSelect.js.map +1 -1
  367. package/dist/Select/SelectContent.cjs.map +1 -1
  368. package/dist/Select/SelectContent.js.map +1 -1
  369. package/dist/Select/SelectContentImpl.cjs +1 -1
  370. package/dist/Select/SelectContentImpl.cjs.map +1 -1
  371. package/dist/Select/SelectContentImpl.js +1 -1
  372. package/dist/Select/SelectContentImpl.js.map +1 -1
  373. package/dist/Select/SelectItem.cjs.map +1 -1
  374. package/dist/Select/SelectItem.js.map +1 -1
  375. package/dist/Select/SelectItemAlignedPosition.cjs +1 -1
  376. package/dist/Select/SelectItemAlignedPosition.cjs.map +1 -1
  377. package/dist/Select/SelectItemAlignedPosition.js +1 -1
  378. package/dist/Select/SelectItemAlignedPosition.js.map +1 -1
  379. package/dist/Select/SelectItemText.cjs.map +1 -1
  380. package/dist/Select/SelectItemText.js.map +1 -1
  381. package/dist/Select/SelectProvider.cjs.map +1 -1
  382. package/dist/Select/SelectProvider.js.map +1 -1
  383. package/dist/Select/SelectRoot.cjs +3 -1
  384. package/dist/Select/SelectRoot.cjs.map +1 -1
  385. package/dist/Select/SelectRoot.js +3 -1
  386. package/dist/Select/SelectRoot.js.map +1 -1
  387. package/dist/Select/SelectScrollButtonImpl.cjs.map +1 -1
  388. package/dist/Select/SelectScrollButtonImpl.js.map +1 -1
  389. package/dist/Select/SelectTrigger.cjs.map +1 -1
  390. package/dist/Select/SelectTrigger.js.map +1 -1
  391. package/dist/Select/SelectValue.cjs.map +1 -1
  392. package/dist/Select/SelectValue.js.map +1 -1
  393. package/dist/Select/SelectViewport.cjs.map +1 -1
  394. package/dist/Select/SelectViewport.js.map +1 -1
  395. package/dist/Slider/SliderHorizontal.cjs +7 -4
  396. package/dist/Slider/SliderHorizontal.cjs.map +1 -1
  397. package/dist/Slider/SliderHorizontal.js +7 -4
  398. package/dist/Slider/SliderHorizontal.js.map +1 -1
  399. package/dist/Slider/SliderRange.cjs +2 -2
  400. package/dist/Slider/SliderRange.cjs.map +1 -1
  401. package/dist/Slider/SliderRange.js +2 -2
  402. package/dist/Slider/SliderRange.js.map +1 -1
  403. package/dist/Slider/SliderRoot.cjs.map +1 -1
  404. package/dist/Slider/SliderRoot.js.map +1 -1
  405. package/dist/Slider/SliderThumb.cjs.map +1 -1
  406. package/dist/Slider/SliderThumb.js.map +1 -1
  407. package/dist/Slider/SliderThumbImpl.cjs +3 -3
  408. package/dist/Slider/SliderThumbImpl.cjs.map +1 -1
  409. package/dist/Slider/SliderThumbImpl.js +3 -3
  410. package/dist/Slider/SliderThumbImpl.js.map +1 -1
  411. package/dist/Slider/SliderVertical.cjs +7 -4
  412. package/dist/Slider/SliderVertical.cjs.map +1 -1
  413. package/dist/Slider/SliderVertical.js +7 -4
  414. package/dist/Slider/SliderVertical.js.map +1 -1
  415. package/dist/Slider/utils.cjs +1 -1
  416. package/dist/Slider/utils.cjs.map +1 -1
  417. package/dist/Slider/utils.js +1 -1
  418. package/dist/Slider/utils.js.map +1 -1
  419. package/dist/Splitter/SplitterGroup.cjs.map +1 -1
  420. package/dist/Splitter/SplitterGroup.js.map +1 -1
  421. package/dist/Splitter/SplitterPanel.cjs +16 -10
  422. package/dist/Splitter/SplitterPanel.cjs.map +1 -1
  423. package/dist/Splitter/SplitterPanel.js +16 -10
  424. package/dist/Splitter/SplitterPanel.js.map +1 -1
  425. package/dist/Stepper/StepperIndicator.cjs.map +1 -1
  426. package/dist/Stepper/StepperIndicator.js.map +1 -1
  427. package/dist/Stepper/StepperItem.cjs.map +1 -1
  428. package/dist/Stepper/StepperItem.js.map +1 -1
  429. package/dist/Stepper/StepperRoot.cjs +30 -3
  430. package/dist/Stepper/StepperRoot.cjs.map +1 -1
  431. package/dist/Stepper/StepperRoot.js +30 -3
  432. package/dist/Stepper/StepperRoot.js.map +1 -1
  433. package/dist/Stepper/StepperTrigger.cjs.map +1 -1
  434. package/dist/Stepper/StepperTrigger.js.map +1 -1
  435. package/dist/Switch/SwitchRoot.cjs.map +1 -1
  436. package/dist/Switch/SwitchRoot.js.map +1 -1
  437. package/dist/Tabs/TabsContent.cjs.map +1 -1
  438. package/dist/Tabs/TabsContent.js.map +1 -1
  439. package/dist/Tabs/TabsIndicator.cjs.map +1 -1
  440. package/dist/Tabs/TabsIndicator.js.map +1 -1
  441. package/dist/Tabs/TabsList.cjs.map +1 -1
  442. package/dist/Tabs/TabsList.js.map +1 -1
  443. package/dist/Tabs/TabsRoot.cjs.map +1 -1
  444. package/dist/Tabs/TabsRoot.js.map +1 -1
  445. package/dist/Tabs/TabsTrigger.cjs.map +1 -1
  446. package/dist/Tabs/TabsTrigger.js.map +1 -1
  447. package/dist/TagsInput/TagsInputInput.cjs +1 -0
  448. package/dist/TagsInput/TagsInputInput.cjs.map +1 -1
  449. package/dist/TagsInput/TagsInputInput.js +1 -0
  450. package/dist/TagsInput/TagsInputInput.js.map +1 -1
  451. package/dist/TagsInput/TagsInputItem.cjs.map +1 -1
  452. package/dist/TagsInput/TagsInputItem.js.map +1 -1
  453. package/dist/TagsInput/TagsInputItemDelete.cjs.map +1 -1
  454. package/dist/TagsInput/TagsInputItemDelete.js.map +1 -1
  455. package/dist/TagsInput/TagsInputRoot.cjs +1 -1
  456. package/dist/TagsInput/TagsInputRoot.cjs.map +1 -1
  457. package/dist/TagsInput/TagsInputRoot.js +1 -1
  458. package/dist/TagsInput/TagsInputRoot.js.map +1 -1
  459. package/dist/TimeField/TimeFieldInput.cjs +1 -0
  460. package/dist/TimeField/TimeFieldInput.cjs.map +1 -1
  461. package/dist/TimeField/TimeFieldInput.js +1 -0
  462. package/dist/TimeField/TimeFieldInput.js.map +1 -1
  463. package/dist/TimeField/TimeFieldRoot.cjs +13 -4
  464. package/dist/TimeField/TimeFieldRoot.cjs.map +1 -1
  465. package/dist/TimeField/TimeFieldRoot.js +13 -4
  466. package/dist/TimeField/TimeFieldRoot.js.map +1 -1
  467. package/dist/Toast/ToastAnnounce.cjs.map +1 -1
  468. package/dist/Toast/ToastAnnounce.js.map +1 -1
  469. package/dist/Toast/ToastRoot.cjs.map +1 -1
  470. package/dist/Toast/ToastRoot.js.map +1 -1
  471. package/dist/Toast/ToastRootImpl.cjs +1 -1
  472. package/dist/Toast/ToastRootImpl.cjs.map +1 -1
  473. package/dist/Toast/ToastRootImpl.js +1 -1
  474. package/dist/Toast/ToastRootImpl.js.map +1 -1
  475. package/dist/Toast/ToastViewport.cjs +1 -1
  476. package/dist/Toast/ToastViewport.cjs.map +1 -1
  477. package/dist/Toast/ToastViewport.js +1 -1
  478. package/dist/Toast/ToastViewport.js.map +1 -1
  479. package/dist/Toggle/Toggle.cjs.map +1 -1
  480. package/dist/Toggle/Toggle.js.map +1 -1
  481. package/dist/ToggleGroup/ToggleGroupItem.cjs.map +1 -1
  482. package/dist/ToggleGroup/ToggleGroupItem.js.map +1 -1
  483. package/dist/ToggleGroup/ToggleGroupRoot.cjs.map +1 -1
  484. package/dist/ToggleGroup/ToggleGroupRoot.js.map +1 -1
  485. package/dist/Toolbar/ToolbarRoot.cjs.map +1 -1
  486. package/dist/Toolbar/ToolbarRoot.js.map +1 -1
  487. package/dist/Tooltip/TooltipContentImpl.cjs +1 -1
  488. package/dist/Tooltip/TooltipContentImpl.cjs.map +1 -1
  489. package/dist/Tooltip/TooltipContentImpl.js +1 -1
  490. package/dist/Tooltip/TooltipContentImpl.js.map +1 -1
  491. package/dist/Tooltip/TooltipRoot.cjs +1 -1
  492. package/dist/Tooltip/TooltipRoot.cjs.map +1 -1
  493. package/dist/Tooltip/TooltipRoot.js +1 -1
  494. package/dist/Tooltip/TooltipRoot.js.map +1 -1
  495. package/dist/Tooltip/TooltipTrigger.cjs +1 -1
  496. package/dist/Tooltip/TooltipTrigger.cjs.map +1 -1
  497. package/dist/Tooltip/TooltipTrigger.js +1 -1
  498. package/dist/Tooltip/TooltipTrigger.js.map +1 -1
  499. package/dist/Tree/TreeItem.cjs +4 -1
  500. package/dist/Tree/TreeItem.cjs.map +1 -1
  501. package/dist/Tree/TreeItem.js +4 -1
  502. package/dist/Tree/TreeItem.js.map +1 -1
  503. package/dist/Tree/TreeRoot.cjs +29 -3
  504. package/dist/Tree/TreeRoot.cjs.map +1 -1
  505. package/dist/Tree/TreeRoot.js +29 -3
  506. package/dist/Tree/TreeRoot.js.map +1 -1
  507. package/dist/Tree/TreeVirtualizer.cjs +2 -2
  508. package/dist/Tree/TreeVirtualizer.cjs.map +1 -1
  509. package/dist/Tree/TreeVirtualizer.js +2 -2
  510. package/dist/Tree/TreeVirtualizer.js.map +1 -1
  511. package/dist/Viewport/Viewport.cjs.map +1 -1
  512. package/dist/Viewport/Viewport.js.map +1 -1
  513. package/dist/VisuallyHidden/VisuallyHiddenInputBubble.cjs.map +1 -1
  514. package/dist/VisuallyHidden/VisuallyHiddenInputBubble.js.map +1 -1
  515. package/dist/component/BaseSeparator.cjs.map +1 -1
  516. package/dist/component/BaseSeparator.js.map +1 -1
  517. package/dist/date/calendar.cjs.map +1 -1
  518. package/dist/date/calendar.js.map +1 -1
  519. package/dist/date/parser.cjs +22 -7
  520. package/dist/date/parser.cjs.map +1 -1
  521. package/dist/date/parser.js +23 -8
  522. package/dist/date/parser.js.map +1 -1
  523. package/dist/date/useDateField.cjs +21 -6
  524. package/dist/date/useDateField.cjs.map +1 -1
  525. package/dist/date/useDateField.js +21 -6
  526. package/dist/date/useDateField.js.map +1 -1
  527. package/dist/date/utils.cjs +31 -2
  528. package/dist/date/utils.cjs.map +1 -1
  529. package/dist/date/utils.js +30 -3
  530. package/dist/date/utils.js.map +1 -1
  531. package/dist/index.d.ts +492 -351
  532. package/dist/shared/useBodyScrollLock.cjs +2 -2
  533. package/dist/shared/useBodyScrollLock.cjs.map +1 -1
  534. package/dist/shared/useBodyScrollLock.js +2 -2
  535. package/dist/shared/useBodyScrollLock.js.map +1 -1
  536. package/dist/shared/useDateFormatter.cjs +12 -10
  537. package/dist/shared/useDateFormatter.cjs.map +1 -1
  538. package/dist/shared/useDateFormatter.js +12 -10
  539. package/dist/shared/useDateFormatter.js.map +1 -1
  540. package/dist/shared/useDirection.cjs.map +1 -1
  541. package/dist/shared/useDirection.js.map +1 -1
  542. package/dist/shared/useForwardProps.cjs +4 -2
  543. package/dist/shared/useForwardProps.cjs.map +1 -1
  544. package/dist/shared/useForwardProps.js +5 -3
  545. package/dist/shared/useForwardProps.js.map +1 -1
  546. package/dist/shared/useGraceArea.cjs.map +1 -1
  547. package/dist/shared/useGraceArea.js.map +1 -1
  548. package/dist/shared/useId.cjs +2 -2
  549. package/dist/shared/useId.cjs.map +1 -1
  550. package/dist/shared/useId.js +2 -2
  551. package/dist/shared/useId.js.map +1 -1
  552. package/dist/shared/useLocale.cjs.map +1 -1
  553. package/dist/shared/useLocale.js.map +1 -1
  554. package/dist/shared/useNonce.cjs.map +1 -1
  555. package/dist/shared/useNonce.js.map +1 -1
  556. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxRoot.js","sources":["../../src/Listbox/ListboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { AcceptableValue, DataOrientation, Direction, FormFieldProps } from '@/shared/types'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { getFocusIntent } from '@/RovingFocus/utils'\nimport { createContext, findValuesBetween, useDirection, useFormControl, useKbd, useTypeahead } from '@/shared'\nimport { Primitive } from '..'\n\ntype ListboxRootContext<T> = {\n modelValue: Ref<T | Array<T> | undefined>\n onValueChange: (val: T) => void\n multiple: Ref<boolean>\n orientation: Ref<DataOrientation>\n dir: Ref<Direction>\n disabled: Ref<boolean>\n highlightOnHover: Ref<boolean>\n highlightedElement: Ref<HTMLElement | null>\n isVirtual: Ref<boolean>\n virtualFocusHook: EventHook<Event | null | undefined>\n virtualKeydownHook: EventHook<KeyboardEvent>\n virtualHighlightHook: EventHook<any>\n by?: string | ((a: T, b: T) => boolean)\n firstValue?: Ref<T | undefined>\n selectionBehavior?: Ref<'toggle' | 'replace'>\n\n focusable: Ref<boolean>\n\n onLeave: (event: Event) => void\n onEnter: (event: Event) => void\n changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void\n onKeydownNavigation: (event: KeyboardEvent) => void\n onKeydownEnter: (event: KeyboardEvent) => void\n onKeydownTypeAhead: (event: KeyboardEvent) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n highlightFirstItem: (event: InputEvent) => void\n}\n\nexport const [injectListboxRootContext, provideListboxRootContext]\n = createContext<ListboxRootContext<AcceptableValue>>('ListboxRoot')\n\nexport interface ListboxRootProps<T = AcceptableValue> extends PrimitiveProps, FormFieldProps {\n /** The controlled value of the listbox. Can be binded with with `v-model`. */\n modelValue?: T | Array<T>\n /** The value of the listbox when initially rendered. Use when you do not need to control the state of the Listbox */\n defaultValue?: T | Array<T>\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\n /** The orientation of the listbox. <br>Mainly so arrow navigation is done accordingly (left & right vs. up & down) */\n orientation?: DataOrientation\n /** The reading direction of the listbox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** When `true`, prevents the user from interacting with listbox */\n disabled?: boolean\n /**\n * How multiple selection should behave in the collection.\n * @defaultValue 'toggle'\n */\n selectionBehavior?: 'toggle' | 'replace'\n /** When `true`, hover over item will trigger highlight */\n highlightOnHover?: boolean\n /** Use this to compare objects by a particular field, or pass your own comparison function for complete control over how objects are compared. */\n by?: string | ((a: T, b: T) => boolean)\n}\n\nexport type ListboxRootEmits<T = AcceptableValue> = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [value: T]\n /** Event handler when highlighted element changes. */\n 'highlight': [payload: { ref: HTMLElement, value: T } | undefined]\n /** Event handler called when container is being focused. Can be prevented. */\n 'entryFocus': [event: CustomEvent]\n /** Event handler called when the mouse leave the container */\n 'leave': [event: Event]\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { nextTick, ref, toRefs, watch } from 'vue'\nimport { compare } from './utils'\n\nconst props = withDefaults(defineProps<ListboxRootProps>(), {\n selectionBehavior: 'toggle',\n orientation: 'vertical',\n})\nconst emits = defineEmits<ListboxRootEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current active value */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { multiple, highlightOnHover, orientation, disabled, selectionBehavior, dir: propDir } = toRefs(props)\nconst { getItems } = useCollection<{ value: T }>({ isProvider: true })\nconst { handleTypeaheadSearch } = useTypeahead()\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst kbd = useKbd()\nconst dir = useDirection(propDir)\n\nconst isFormControl = useFormControl(currentElement)\n\nconst firstValue = ref<T>()\nconst isUserAction = ref(false)\nconst focusable = ref(true)\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<T | T[] | undefined>\n\nfunction onValueChange(val: T) {\n isUserAction.value = true\n if (props.multiple) {\n const modelArray = Array.isArray(modelValue.value) ? [...modelValue.value] : []\n const index = modelArray.findIndex(i => compare(i, val, props.by))\n if (props.selectionBehavior === 'toggle') {\n index === -1 ? modelArray.push(val) : modelArray.splice(index, 1)\n modelValue.value = modelArray\n }\n else {\n modelValue.value = [val]\n firstValue.value = val\n }\n }\n else {\n if (props.selectionBehavior === 'toggle') {\n if (compare(modelValue.value, val, props.by))\n modelValue.value = undefined\n else\n modelValue.value = val\n }\n else {\n modelValue.value = val\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nconst highlightedElement = ref<HTMLElement | null>(null)\nconst previousElement = ref<HTMLElement | null>(null)\nconst isVirtual = ref(false)\nconst isComposing = ref(false)\nconst virtualFocusHook = createEventHook<Event | null | undefined>()\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\nconst virtualHighlightHook = createEventHook<T>()\n\nfunction getCollectionItem() {\n return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')\n}\n\nfunction changeHighlight(el: HTMLElement, scrollIntoView = true) {\n if (!el)\n return\n\n highlightedElement.value = el\n if (focusable.value)\n highlightedElement.value.focus()\n if (scrollIntoView)\n highlightedElement.value.scrollIntoView({ block: 'nearest' })\n\n const highlightedItem = getItems().find(i => i.ref === el)\n emits('highlight', highlightedItem)\n}\n\nfunction highlightItem(value: T) {\n if (isVirtual.value) {\n virtualHighlightHook.trigger(value)\n }\n else {\n const item = getItems().find(i => compare(i.value, value, props.by))\n if (item) {\n highlightedElement.value = item.ref\n changeHighlight(item.ref)\n }\n }\n}\n\nfunction onKeydownEnter(event: KeyboardEvent) {\n if (highlightedElement.value && highlightedElement.value.isConnected) {\n event.preventDefault()\n event.stopPropagation()\n\n if (!isComposing.value) {\n highlightedElement.value.click()\n }\n }\n}\n\nfunction onKeydownTypeAhead(event: KeyboardEvent) {\n if (!focusable.value)\n return\n isUserAction.value = true\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n\n if (isMetaKey && event.key === 'a' && multiple.value) {\n const collection = getItems()\n const values = collection.map(i => i.value)\n modelValue.value = [...values]\n event.preventDefault()\n changeHighlight(collection[collection.length - 1].ref)\n }\n else if (!isMetaKey) {\n const el = handleTypeaheadSearch(event.key, getItems())\n if (el)\n changeHighlight(el)\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nfunction onCompositionStart() {\n isComposing.value = true\n}\nfunction onCompositionEnd() {\n requestAnimationFrame(() => {\n isComposing.value = false\n })\n}\n\nfunction highlightFirstItem() {\n nextTick(() => {\n const event = new KeyboardEvent('keydown', { key: 'PageUp' })\n onKeydownNavigation(event)\n })\n}\n\nfunction onLeave(event: Event) {\n const el = highlightedElement.value\n\n if ((el as Node)?.isConnected) {\n previousElement.value = el\n }\n\n highlightedElement.value = null\n emits('leave', event)\n}\n\nfunction onEnter(event: Event) {\n const entryFocusEvent = new CustomEvent('listbox.entryFocus', { bubbles: false, cancelable: true })\n event.currentTarget?.dispatchEvent(entryFocusEvent)\n emits('entryFocus', entryFocusEvent)\n\n if (entryFocusEvent.defaultPrevented)\n return\n\n if (previousElement.value) {\n changeHighlight(previousElement.value)\n }\n else {\n const el = getCollectionItem()?.[0]\n changeHighlight(el)\n }\n}\n\nfunction onKeydownNavigation(event: KeyboardEvent) {\n const intent = getFocusIntent(event, orientation.value, dir.value)\n if (!intent)\n return\n\n let collection = getCollectionItem()\n if (highlightedElement.value) {\n if (intent === 'last') {\n collection.reverse()\n }\n else if (intent === 'prev' || intent === 'next') {\n if (intent === 'prev')\n collection.reverse()\n\n const currentIndex = collection.indexOf(highlightedElement.value)\n collection = collection.slice(currentIndex + 1)\n }\n handleMultipleReplace(event, collection[0])\n }\n\n if (collection.length) {\n const index = !highlightedElement.value && intent === 'prev' ? collection.length - 1 : 0\n changeHighlight(collection[index])\n }\n\n if (isVirtual.value)\n return virtualKeydownHook.trigger(event)\n}\n\nfunction handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {\n if (isVirtual.value || props.selectionBehavior !== 'replace' || !multiple.value || !Array.isArray(modelValue.value))\n return\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n if (isMetaKey && !event.shiftKey)\n return\n\n if (event.shiftKey) {\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n let lastValue = collection.find(i => i.ref === targetEl)?.value\n\n if (event.key === kbd.END)\n lastValue = collection[collection.length - 1].value\n else if (event.key === kbd.HOME)\n lastValue = collection[0].value\n\n if (!lastValue || !firstValue.value)\n return\n\n const values = findValuesBetween(collection.map(i => i.value), firstValue.value, lastValue)\n modelValue.value = values\n }\n}\n\nasync function highlightSelected(event?: Event) {\n await nextTick()\n if (isVirtual.value) {\n // Trigger on nextTick for Virtualizer to be mounted\n virtualFocusHook.trigger(event)\n }\n else {\n const collection = getCollectionItem()\n const item = collection.find(i => i.dataset.state === 'checked')\n if (item)\n changeHighlight(item)\n else if (collection.length)\n changeHighlight(collection[0])\n }\n}\n\n// watch for only programmatic changes\nwatch(modelValue, () => {\n if (!isUserAction.value) {\n nextTick(() => {\n highlightSelected()\n })\n }\n}, { immediate: true, deep: true })\n\ndefineExpose({\n highlightedElement,\n highlightItem,\n highlightFirstItem,\n highlightSelected,\n getItems,\n})\n\nprovideListboxRootContext({\n modelValue,\n // @ts-expect-error ignoring\n onValueChange,\n multiple,\n orientation,\n dir,\n disabled,\n highlightOnHover,\n highlightedElement,\n isVirtual,\n virtualFocusHook,\n virtualKeydownHook,\n virtualHighlightHook,\n by: props.by,\n firstValue,\n selectionBehavior,\n\n focusable,\n onLeave,\n onEnter,\n changeHighlight,\n onKeydownEnter,\n onKeydownNavigation,\n onKeydownTypeAhead,\n onCompositionStart,\n onCompositionEnd,\n highlightFirstItem,\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerleave=\"onLeave\"\n @focusout=\"async (event: FocusEvent) => {\n const target = (event.relatedTarget || event.target) as HTMLElement | null\n await nextTick()\n if (highlightedElement && currentElement && !currentElement.contains(target)) {\n onLeave(event)\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n :name=\"name\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ListboxRoot.js","sources":["../../src/Listbox/ListboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { AcceptableValue, DataOrientation, Direction, FormFieldProps } from '@/shared/types'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { getFocusIntent } from '@/RovingFocus/utils'\nimport { createContext, findValuesBetween, useDirection, useFormControl, useKbd, useTypeahead } from '@/shared'\nimport { Primitive } from '..'\n\ntype ListboxRootContext<T> = {\n modelValue: Ref<T | Array<T> | undefined>\n onValueChange: (val: T) => void\n multiple: Ref<boolean>\n orientation: Ref<DataOrientation>\n dir: Ref<Direction>\n disabled: Ref<boolean>\n highlightOnHover: Ref<boolean>\n highlightedElement: Ref<HTMLElement | null>\n isVirtual: Ref<boolean>\n virtualFocusHook: EventHook<Event | null | undefined>\n virtualKeydownHook: EventHook<KeyboardEvent>\n virtualHighlightHook: EventHook<any>\n by?: string | ((a: T, b: T) => boolean)\n firstValue?: Ref<T | undefined>\n selectionBehavior?: Ref<'toggle' | 'replace'>\n\n focusable: Ref<boolean>\n\n onLeave: (event: Event) => void\n onEnter: (event: Event) => void\n changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void\n onKeydownNavigation: (event: KeyboardEvent) => void\n onKeydownEnter: (event: KeyboardEvent) => void\n onKeydownTypeAhead: (event: KeyboardEvent) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n highlightFirstItem: (event: InputEvent) => void\n}\n\nexport const [injectListboxRootContext, provideListboxRootContext]\n = createContext<ListboxRootContext<AcceptableValue>>('ListboxRoot')\n\nexport interface ListboxRootProps<T = AcceptableValue> extends PrimitiveProps, FormFieldProps {\n /** The controlled value of the listbox. Can be binded with with `v-model`. */\n modelValue?: T | Array<T>\n /** The value of the listbox when initially rendered. Use when you do not need to control the state of the Listbox */\n defaultValue?: T | Array<T>\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\n /** The orientation of the listbox. <br>Mainly so arrow navigation is done accordingly (left & right vs. up & down) */\n orientation?: DataOrientation\n /** The reading direction of the listbox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** When `true`, prevents the user from interacting with listbox */\n disabled?: boolean\n /**\n * How multiple selection should behave in the collection.\n * @defaultValue 'toggle'\n */\n selectionBehavior?: 'toggle' | 'replace'\n /** When `true`, hover over item will trigger highlight */\n highlightOnHover?: boolean\n /** Use this to compare objects by a particular field, or pass your own comparison function for complete control over how objects are compared. */\n by?: string | ((a: T, b: T) => boolean)\n}\n\nexport type ListboxRootEmits<T = AcceptableValue> = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [value: T]\n /** Event handler when highlighted element changes. */\n 'highlight': [payload: { ref: HTMLElement, value: T } | undefined]\n /** Event handler called when container is being focused. Can be prevented. */\n 'entryFocus': [event: CustomEvent]\n /** Event handler called when the mouse leave the container */\n 'leave': [event: Event]\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { nextTick, ref, toRefs, watch } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { compare } from './utils'\n\nconst props = withDefaults(defineProps<ListboxRootProps>(), {\n selectionBehavior: 'toggle',\n orientation: 'vertical',\n})\nconst emits = defineEmits<ListboxRootEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current active value */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { multiple, highlightOnHover, orientation, disabled, selectionBehavior, dir: propDir } = toRefs(props)\nconst { getItems } = useCollection<{ value: T }>({ isProvider: true })\nconst { handleTypeaheadSearch } = useTypeahead()\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst kbd = useKbd()\nconst dir = useDirection(propDir)\n\nconst isFormControl = useFormControl(currentElement)\n\nconst firstValue = ref<T>()\nconst isUserAction = ref(false)\nconst focusable = ref(true)\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<T | T[] | undefined>\n\nfunction onValueChange(val: T) {\n isUserAction.value = true\n if (props.multiple) {\n const modelArray = Array.isArray(modelValue.value) ? [...modelValue.value] : []\n const index = modelArray.findIndex(i => compare(i, val, props.by))\n if (props.selectionBehavior === 'toggle') {\n index === -1 ? modelArray.push(val) : modelArray.splice(index, 1)\n modelValue.value = modelArray\n }\n else {\n modelValue.value = [val]\n firstValue.value = val\n }\n }\n else {\n if (props.selectionBehavior === 'toggle') {\n if (compare(modelValue.value, val, props.by))\n modelValue.value = undefined\n else\n modelValue.value = val\n }\n else {\n modelValue.value = val\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nconst highlightedElement = ref<HTMLElement | null>(null)\nconst previousElement = ref<HTMLElement | null>(null)\nconst isVirtual = ref(false)\nconst isComposing = ref(false)\nconst virtualFocusHook = createEventHook<Event | null | undefined>()\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\nconst virtualHighlightHook = createEventHook<T>()\n\nfunction getCollectionItem() {\n return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')\n}\n\nfunction changeHighlight(el: HTMLElement, scrollIntoView = true) {\n if (!el)\n return\n\n highlightedElement.value = el\n if (focusable.value)\n highlightedElement.value.focus()\n if (scrollIntoView)\n highlightedElement.value.scrollIntoView({ block: 'nearest' })\n\n const highlightedItem = getItems().find(i => i.ref === el)\n emits('highlight', highlightedItem)\n}\n\nfunction highlightItem(value: T) {\n if (isVirtual.value) {\n virtualHighlightHook.trigger(value)\n }\n else {\n const item = getItems().find(i => compare(i.value, value, props.by))\n if (item) {\n highlightedElement.value = item.ref\n changeHighlight(item.ref)\n }\n }\n}\n\nfunction onKeydownEnter(event: KeyboardEvent) {\n if (highlightedElement.value && highlightedElement.value.isConnected) {\n event.preventDefault()\n event.stopPropagation()\n\n if (!isComposing.value) {\n highlightedElement.value.click()\n }\n }\n}\n\nfunction onKeydownTypeAhead(event: KeyboardEvent) {\n if (!focusable.value)\n return\n isUserAction.value = true\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n\n if (isMetaKey && event.key === 'a' && multiple.value) {\n const collection = getItems()\n const values = collection.map(i => i.value)\n modelValue.value = [...values]\n event.preventDefault()\n changeHighlight(collection[collection.length - 1].ref)\n }\n else if (!isMetaKey) {\n const el = handleTypeaheadSearch(event.key, getItems())\n if (el)\n changeHighlight(el)\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nfunction onCompositionStart() {\n isComposing.value = true\n}\nfunction onCompositionEnd() {\n requestAnimationFrame(() => {\n isComposing.value = false\n })\n}\n\nfunction highlightFirstItem() {\n nextTick(() => {\n const event = new KeyboardEvent('keydown', { key: 'PageUp' })\n onKeydownNavigation(event)\n })\n}\n\nfunction onLeave(event: Event) {\n const el = highlightedElement.value\n\n if ((el as Node)?.isConnected) {\n previousElement.value = el\n }\n\n highlightedElement.value = null\n emits('leave', event)\n}\n\nfunction onEnter(event: Event) {\n const entryFocusEvent = new CustomEvent('listbox.entryFocus', { bubbles: false, cancelable: true })\n event.currentTarget?.dispatchEvent(entryFocusEvent)\n emits('entryFocus', entryFocusEvent)\n\n if (entryFocusEvent.defaultPrevented)\n return\n\n if (previousElement.value) {\n changeHighlight(previousElement.value)\n }\n else {\n const el = getCollectionItem()?.[0]\n changeHighlight(el)\n }\n}\n\nfunction onKeydownNavigation(event: KeyboardEvent) {\n const intent = getFocusIntent(event, orientation.value, dir.value)\n if (!intent)\n return\n\n let collection = getCollectionItem()\n if (highlightedElement.value) {\n if (intent === 'last') {\n collection.reverse()\n }\n else if (intent === 'prev' || intent === 'next') {\n if (intent === 'prev')\n collection.reverse()\n\n const currentIndex = collection.indexOf(highlightedElement.value)\n collection = collection.slice(currentIndex + 1)\n }\n handleMultipleReplace(event, collection[0])\n }\n\n if (collection.length) {\n const index = !highlightedElement.value && intent === 'prev' ? collection.length - 1 : 0\n changeHighlight(collection[index])\n }\n\n if (isVirtual.value)\n return virtualKeydownHook.trigger(event)\n}\n\nfunction handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {\n if (isVirtual.value || props.selectionBehavior !== 'replace' || !multiple.value || !Array.isArray(modelValue.value))\n return\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n if (isMetaKey && !event.shiftKey)\n return\n\n if (event.shiftKey) {\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n let lastValue = collection.find(i => i.ref === targetEl)?.value\n\n if (event.key === kbd.END)\n lastValue = collection[collection.length - 1].value\n else if (event.key === kbd.HOME)\n lastValue = collection[0].value\n\n if (!lastValue || !firstValue.value)\n return\n\n const values = findValuesBetween(collection.map(i => i.value), firstValue.value, lastValue)\n modelValue.value = values\n }\n}\n\nasync function highlightSelected(event?: Event) {\n await nextTick()\n if (isVirtual.value) {\n // Trigger on nextTick for Virtualizer to be mounted\n virtualFocusHook.trigger(event)\n }\n else {\n const collection = getCollectionItem()\n const item = collection.find(i => i.dataset.state === 'checked')\n if (item)\n changeHighlight(item)\n else if (collection.length)\n changeHighlight(collection[0])\n }\n}\n\n// watch for only programmatic changes\nwatch(modelValue, () => {\n if (!isUserAction.value) {\n nextTick(() => {\n highlightSelected()\n })\n }\n}, { immediate: true, deep: true })\n\ndefineExpose({\n highlightedElement,\n highlightItem,\n highlightFirstItem,\n highlightSelected,\n getItems,\n})\n\nprovideListboxRootContext({\n modelValue,\n // @ts-expect-error ignoring\n onValueChange,\n multiple,\n orientation,\n dir,\n disabled,\n highlightOnHover,\n highlightedElement,\n isVirtual,\n virtualFocusHook,\n virtualKeydownHook,\n virtualHighlightHook,\n by: props.by,\n firstValue,\n selectionBehavior,\n\n focusable,\n onLeave,\n onEnter,\n changeHighlight,\n onKeydownEnter,\n onKeydownNavigation,\n onKeydownTypeAhead,\n onCompositionStart,\n onCompositionEnd,\n highlightFirstItem,\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerleave=\"onLeave\"\n @focusout=\"async (event: FocusEvent) => {\n const target = (event.relatedTarget || event.target) as HTMLElement | null\n await nextTick()\n if (highlightedElement && currentElement && !currentElement.contains(target)) {\n onLeave(event)\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n :name=\"name\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  const vue = require('vue');
4
- const Collection_Collection = require('../Collection/Collection.cjs');
5
- const RovingFocus_utils = require('../RovingFocus/utils.cjs');
6
- const shared_useTypeahead = require('../shared/useTypeahead.cjs');
7
4
  const vueVirtual = require('@tanstack/vue-virtual');
8
5
  const core = require('@vueuse/core');
9
6
  const shared = require('@vueuse/shared');
7
+ const Collection_Collection = require('../Collection/Collection.cjs');
8
+ const RovingFocus_utils = require('../RovingFocus/utils.cjs');
9
+ const shared_useTypeahead = require('../shared/useTypeahead.cjs');
10
10
  const Listbox_utils = require('./utils.cjs');
11
11
  const shared_getActiveElement = require('../shared/getActiveElement.cjs');
12
12
  const Listbox_ListboxRoot = require('./ListboxRoot.cjs');
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxVirtualizer.cjs","sources":["../../src/Listbox/ListboxVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ListboxVirtualizerProps<T extends AcceptableValue = AcceptableValue> {\n /** List of items */\n options: T[]\n /** Number of items rendered outside the visible area */\n overscan?: number\n /** Estimated size (in px) of each item */\n estimateSize?: number\n /** Text content for each item to achieve type-ahead feature */\n textContent?: (option: T) => string\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { AcceptableValue } from '@/shared/types'\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref, VNode } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { findValuesBetween, getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { useParentElement } from '@vueuse/core'\nimport { refAutoReset } from '@vueuse/shared'\nimport { cloneVNode, computed, Fragment, useSlots } from 'vue'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\nimport { compare, queryCheckedElement } from './utils'\n\nconst props = defineProps<ListboxVirtualizerProps<T>>()\n\ndefineSlots<{\n default: (props: {\n option: T\n virtualizer: Virtualizer<HTMLElement, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectListboxRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection<{ value: T }>()\n\n// set virtual true when this component mounted\nrootContext.isVirtual.value = true\n\nconst padding = computed(() => {\n const el = parentEl.value\n if (!el) {\n return { start: 0, end: 0 }\n }\n else {\n const styles = window.getComputedStyle(el)\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop),\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom),\n }\n }\n})\n\nconst virtualizer = useVirtualizer(\n {\n get scrollPaddingStart() { return padding.value.start },\n get scrollPaddingEnd() { return padding.value.end },\n get count() { return props.options.length },\n get horizontal() { return rootContext.orientation.value === 'horizontal' },\n estimateSize() {\n return props.estimateSize ?? 28\n },\n getScrollElement() { return parentEl.value },\n overscan: props.overscan ?? 12,\n },\n)\n\nconst virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map((item) => {\n const defaultNode = slots.default!({\n option: props.options[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })[0]\n\n const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)\n ? defaultNode.children[0] as VNode\n : defaultNode\n\n return {\n item,\n is: cloneVNode(targetNode, {\n 'key': `${item.key}`,\n 'data-index': item.index,\n 'aria-setsize': props.options.length,\n 'aria-posinset': item.index + 1,\n 'style': {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translateY(${item.start}px)`,\n overflowAnchor: 'none',\n },\n }),\n }\n}))\n\nrootContext.virtualFocusHook.on((event) => {\n const index = props.options.findIndex((option) => {\n if (Array.isArray(rootContext.modelValue.value))\n return compare(option, rootContext.modelValue.value[0], rootContext.by)\n else\n return compare(option, rootContext.modelValue.value!, rootContext.by)\n })\n if (index !== -1) {\n event?.preventDefault()\n\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item) {\n rootContext.changeHighlight(item)\n if (event)\n item?.focus()\n }\n })\n }\n else {\n rootContext.highlightFirstItem(event as InputEvent)\n }\n})\n\nrootContext.virtualHighlightHook.on((value) => {\n const index = props.options.findIndex((option) => {\n return compare(option, value, rootContext.by)\n })\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item)\n rootContext.changeHighlight(item)\n })\n})\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: T) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option?.toString().toLowerCase()\n }\n\n return props.options.map((option, index) => ({\n index,\n textContent: parseTextContent(option),\n }))\n})\n\nfunction handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' | 'next') {\n if (!rootContext.firstValue?.value || !rootContext.multiple.value || !Array.isArray(rootContext.modelValue.value))\n return\n\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n const lastValue = collection.find(i => i.ref === rootContext.highlightedElement.value)?.value\n if (!lastValue)\n return\n\n let value: T[] | null = null\n switch (intent) {\n case 'prev':\n case 'next': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, lastValue)\n break\n }\n case 'first': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[0])\n break\n }\n case 'last': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])\n break\n }\n }\n rootContext.modelValue.value = value\n}\n\nrootContext.virtualKeydownHook.on((event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n const isTabKey = event.key === 'Tab' && !isMetaKey\n if (isTabKey)\n return\n\n let intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n // Meta + A, select all feature\n if (isMetaKey && event.key === 'a' && rootContext.multiple.value) {\n event.preventDefault()\n rootContext.modelValue.value = [...props.options]\n // purposely make the focus to last\n intent = 'last'\n }\n else if (event.shiftKey && intent) {\n handleMultipleReplace(event, intent)\n }\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : props.options.length - 1\n virtualizer.value.scrollToIndex(index)\n requestAnimationFrame(() => {\n const items = getItems()\n const item = intent === 'first' ? items[0] : items[items.length - 1]\n if (item)\n rootContext.changeHighlight(item.ref)\n })\n }\n else if (!intent && !isMetaKey) {\n search.value += event.key\n const currentIndex = Number(getActiveElement()?.getAttribute('data-index'))\n const currentMatch = optionsWithMetadata.value[currentIndex].textContent\n const filteredOptions = optionsWithMetadata.value.map(i => i.textContent ?? '')\n const next = getNextMatch(filteredOptions, search.value, currentMatch)\n\n const nextMatch = optionsWithMetadata.value.find(option => option.textContent === next)\n if (nextMatch) {\n virtualizer.value.scrollToIndex(nextMatch.index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${nextMatch.index}\"]`)\n if (item instanceof HTMLElement)\n rootContext.changeHighlight(item)\n })\n }\n }\n})\n</script>\n\n<template>\n <div\n data-reka-virtualizer\n :style=\"{\n position: 'relative',\n width: '100%',\n height: `${virtualizer.getTotalSize()}px`,\n }\"\n >\n <component\n :is=\"is\"\n v-for=\"{ is, item } in virtualizedItems\"\n :key=\"item.index\"\n />\n </div>\n</template>\n"],"names":["useSlots","injectListboxRootContext","useParentElement","useCollection","computed","useVirtualizer","Fragment","cloneVNode","compare","queryCheckedElement","refAutoReset","findValuesBetween","MAP_KEY_TO_FOCUS_INTENT","getActiveElement","getNextMatch"],"mappings":"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"}
1
+ {"version":3,"file":"ListboxVirtualizer.cjs","sources":["../../src/Listbox/ListboxVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ListboxVirtualizerProps<T extends AcceptableValue = AcceptableValue> {\n /** List of items */\n options: T[]\n /** Number of items rendered outside the visible area */\n overscan?: number\n /** Estimated size (in px) of each item */\n estimateSize?: number\n /** Text content for each item to achieve type-ahead feature */\n textContent?: (option: T) => string\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref, VNode } from 'vue'\nimport type { AcceptableValue } from '@/shared/types'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { useParentElement } from '@vueuse/core'\nimport { refAutoReset } from '@vueuse/shared'\nimport { cloneVNode, computed, Fragment, useSlots } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { findValuesBetween, getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\nimport { compare, queryCheckedElement } from './utils'\n\nconst props = defineProps<ListboxVirtualizerProps<T>>()\n\ndefineSlots<{\n default?: (props: {\n option: T\n virtualizer: Virtualizer<HTMLElement, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectListboxRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection<{ value: T }>()\n\n// set virtual true when this component mounted\nrootContext.isVirtual.value = true\n\nconst padding = computed(() => {\n const el = parentEl.value\n if (!el) {\n return { start: 0, end: 0 }\n }\n else {\n const styles = window.getComputedStyle(el)\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop),\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom),\n }\n }\n})\n\nconst virtualizer = useVirtualizer(\n {\n get scrollPaddingStart() { return padding.value.start },\n get scrollPaddingEnd() { return padding.value.end },\n get count() { return props.options.length },\n get horizontal() { return rootContext.orientation.value === 'horizontal' },\n estimateSize() {\n return props.estimateSize ?? 28\n },\n getScrollElement() { return parentEl.value },\n overscan: props.overscan ?? 12,\n },\n)\n\nconst virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map((item) => {\n const defaultNode = slots.default!({\n option: props.options[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })[0]\n\n const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)\n ? defaultNode.children[0] as VNode\n : defaultNode\n\n return {\n item,\n is: cloneVNode(targetNode, {\n 'key': `${item.key}`,\n 'data-index': item.index,\n 'aria-setsize': props.options.length,\n 'aria-posinset': item.index + 1,\n 'style': {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translateY(${item.start}px)`,\n overflowAnchor: 'none',\n },\n }),\n }\n}))\n\nrootContext.virtualFocusHook.on((event) => {\n const index = props.options.findIndex((option) => {\n if (Array.isArray(rootContext.modelValue.value))\n return compare(option, rootContext.modelValue.value[0], rootContext.by)\n else\n return compare(option, rootContext.modelValue.value!, rootContext.by)\n })\n if (index !== -1) {\n event?.preventDefault()\n\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item) {\n rootContext.changeHighlight(item)\n if (event)\n item?.focus()\n }\n })\n }\n else {\n rootContext.highlightFirstItem(event as InputEvent)\n }\n})\n\nrootContext.virtualHighlightHook.on((value) => {\n const index = props.options.findIndex((option) => {\n return compare(option, value, rootContext.by)\n })\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item)\n rootContext.changeHighlight(item)\n })\n})\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: T) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option?.toString().toLowerCase()\n }\n\n return props.options.map((option, index) => ({\n index,\n textContent: parseTextContent(option),\n }))\n})\n\nfunction handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' | 'next') {\n if (!rootContext.firstValue?.value || !rootContext.multiple.value || !Array.isArray(rootContext.modelValue.value))\n return\n\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n const lastValue = collection.find(i => i.ref === rootContext.highlightedElement.value)?.value\n if (!lastValue)\n return\n\n let value: T[] | null = null\n switch (intent) {\n case 'prev':\n case 'next': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, lastValue)\n break\n }\n case 'first': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[0])\n break\n }\n case 'last': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])\n break\n }\n }\n rootContext.modelValue.value = value\n}\n\nrootContext.virtualKeydownHook.on((event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n const isTabKey = event.key === 'Tab' && !isMetaKey\n if (isTabKey)\n return\n\n let intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n // Meta + A, select all feature\n if (isMetaKey && event.key === 'a' && rootContext.multiple.value) {\n event.preventDefault()\n rootContext.modelValue.value = [...props.options]\n // purposely make the focus to last\n intent = 'last'\n }\n else if (event.shiftKey && intent) {\n handleMultipleReplace(event, intent)\n }\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : props.options.length - 1\n virtualizer.value.scrollToIndex(index)\n requestAnimationFrame(() => {\n const items = getItems()\n const item = intent === 'first' ? items[0] : items[items.length - 1]\n if (item)\n rootContext.changeHighlight(item.ref)\n })\n }\n else if (!intent && !isMetaKey) {\n search.value += event.key\n const currentIndex = Number(getActiveElement()?.getAttribute('data-index'))\n const currentMatch = optionsWithMetadata.value[currentIndex].textContent\n const filteredOptions = optionsWithMetadata.value.map(i => i.textContent ?? '')\n const next = getNextMatch(filteredOptions, search.value, currentMatch)\n\n const nextMatch = optionsWithMetadata.value.find(option => option.textContent === next)\n if (nextMatch) {\n virtualizer.value.scrollToIndex(nextMatch.index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${nextMatch.index}\"]`)\n if (item instanceof HTMLElement)\n rootContext.changeHighlight(item)\n })\n }\n }\n})\n</script>\n\n<template>\n <div\n data-reka-virtualizer\n :style=\"{\n position: 'relative',\n width: '100%',\n height: `${virtualizer.getTotalSize()}px`,\n }\"\n >\n <component\n :is=\"is\"\n v-for=\"{ is, item } in virtualizedItems\"\n :key=\"item.index\"\n />\n </div>\n</template>\n"],"names":["useSlots","injectListboxRootContext","useParentElement","useCollection","computed","useVirtualizer","Fragment","cloneVNode","compare","queryCheckedElement","refAutoReset","findValuesBetween","MAP_KEY_TO_FOCUS_INTENT","getActiveElement","getNextMatch"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { defineComponent, useSlots, computed, Fragment, cloneVNode, createElementBlock, openBlock, normalizeStyle, unref, renderList, createBlock, resolveDynamicComponent } from 'vue';
2
- import { u as useCollection } from '../Collection/Collection.js';
3
- import { M as MAP_KEY_TO_FOCUS_INTENT } from '../RovingFocus/utils.js';
4
- import { g as getNextMatch } from '../shared/useTypeahead.js';
5
2
  import { useVirtualizer } from '@tanstack/vue-virtual';
6
3
  import { useParentElement } from '@vueuse/core';
7
4
  import { refAutoReset } from '@vueuse/shared';
5
+ import { u as useCollection } from '../Collection/Collection.js';
6
+ import { M as MAP_KEY_TO_FOCUS_INTENT } from '../RovingFocus/utils.js';
7
+ import { g as getNextMatch } from '../shared/useTypeahead.js';
8
8
  import { c as compare, q as queryCheckedElement } from './utils.js';
9
9
  import { g as getActiveElement } from '../shared/getActiveElement.js';
10
10
  import { i as injectListboxRootContext } from './ListboxRoot.js';
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxVirtualizer.js","sources":["../../src/Listbox/ListboxVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ListboxVirtualizerProps<T extends AcceptableValue = AcceptableValue> {\n /** List of items */\n options: T[]\n /** Number of items rendered outside the visible area */\n overscan?: number\n /** Estimated size (in px) of each item */\n estimateSize?: number\n /** Text content for each item to achieve type-ahead feature */\n textContent?: (option: T) => string\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { AcceptableValue } from '@/shared/types'\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref, VNode } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { findValuesBetween, getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { useParentElement } from '@vueuse/core'\nimport { refAutoReset } from '@vueuse/shared'\nimport { cloneVNode, computed, Fragment, useSlots } from 'vue'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\nimport { compare, queryCheckedElement } from './utils'\n\nconst props = defineProps<ListboxVirtualizerProps<T>>()\n\ndefineSlots<{\n default: (props: {\n option: T\n virtualizer: Virtualizer<HTMLElement, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectListboxRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection<{ value: T }>()\n\n// set virtual true when this component mounted\nrootContext.isVirtual.value = true\n\nconst padding = computed(() => {\n const el = parentEl.value\n if (!el) {\n return { start: 0, end: 0 }\n }\n else {\n const styles = window.getComputedStyle(el)\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop),\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom),\n }\n }\n})\n\nconst virtualizer = useVirtualizer(\n {\n get scrollPaddingStart() { return padding.value.start },\n get scrollPaddingEnd() { return padding.value.end },\n get count() { return props.options.length },\n get horizontal() { return rootContext.orientation.value === 'horizontal' },\n estimateSize() {\n return props.estimateSize ?? 28\n },\n getScrollElement() { return parentEl.value },\n overscan: props.overscan ?? 12,\n },\n)\n\nconst virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map((item) => {\n const defaultNode = slots.default!({\n option: props.options[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })[0]\n\n const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)\n ? defaultNode.children[0] as VNode\n : defaultNode\n\n return {\n item,\n is: cloneVNode(targetNode, {\n 'key': `${item.key}`,\n 'data-index': item.index,\n 'aria-setsize': props.options.length,\n 'aria-posinset': item.index + 1,\n 'style': {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translateY(${item.start}px)`,\n overflowAnchor: 'none',\n },\n }),\n }\n}))\n\nrootContext.virtualFocusHook.on((event) => {\n const index = props.options.findIndex((option) => {\n if (Array.isArray(rootContext.modelValue.value))\n return compare(option, rootContext.modelValue.value[0], rootContext.by)\n else\n return compare(option, rootContext.modelValue.value!, rootContext.by)\n })\n if (index !== -1) {\n event?.preventDefault()\n\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item) {\n rootContext.changeHighlight(item)\n if (event)\n item?.focus()\n }\n })\n }\n else {\n rootContext.highlightFirstItem(event as InputEvent)\n }\n})\n\nrootContext.virtualHighlightHook.on((value) => {\n const index = props.options.findIndex((option) => {\n return compare(option, value, rootContext.by)\n })\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item)\n rootContext.changeHighlight(item)\n })\n})\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: T) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option?.toString().toLowerCase()\n }\n\n return props.options.map((option, index) => ({\n index,\n textContent: parseTextContent(option),\n }))\n})\n\nfunction handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' | 'next') {\n if (!rootContext.firstValue?.value || !rootContext.multiple.value || !Array.isArray(rootContext.modelValue.value))\n return\n\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n const lastValue = collection.find(i => i.ref === rootContext.highlightedElement.value)?.value\n if (!lastValue)\n return\n\n let value: T[] | null = null\n switch (intent) {\n case 'prev':\n case 'next': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, lastValue)\n break\n }\n case 'first': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[0])\n break\n }\n case 'last': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])\n break\n }\n }\n rootContext.modelValue.value = value\n}\n\nrootContext.virtualKeydownHook.on((event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n const isTabKey = event.key === 'Tab' && !isMetaKey\n if (isTabKey)\n return\n\n let intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n // Meta + A, select all feature\n if (isMetaKey && event.key === 'a' && rootContext.multiple.value) {\n event.preventDefault()\n rootContext.modelValue.value = [...props.options]\n // purposely make the focus to last\n intent = 'last'\n }\n else if (event.shiftKey && intent) {\n handleMultipleReplace(event, intent)\n }\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : props.options.length - 1\n virtualizer.value.scrollToIndex(index)\n requestAnimationFrame(() => {\n const items = getItems()\n const item = intent === 'first' ? items[0] : items[items.length - 1]\n if (item)\n rootContext.changeHighlight(item.ref)\n })\n }\n else if (!intent && !isMetaKey) {\n search.value += event.key\n const currentIndex = Number(getActiveElement()?.getAttribute('data-index'))\n const currentMatch = optionsWithMetadata.value[currentIndex].textContent\n const filteredOptions = optionsWithMetadata.value.map(i => i.textContent ?? '')\n const next = getNextMatch(filteredOptions, search.value, currentMatch)\n\n const nextMatch = optionsWithMetadata.value.find(option => option.textContent === next)\n if (nextMatch) {\n virtualizer.value.scrollToIndex(nextMatch.index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${nextMatch.index}\"]`)\n if (item instanceof HTMLElement)\n rootContext.changeHighlight(item)\n })\n }\n }\n})\n</script>\n\n<template>\n <div\n data-reka-virtualizer\n :style=\"{\n position: 'relative',\n width: '100%',\n height: `${virtualizer.getTotalSize()}px`,\n }\"\n >\n <component\n :is=\"is\"\n v-for=\"{ is, item } in virtualizedItems\"\n :key=\"item.index\"\n />\n </div>\n</template>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ListboxVirtualizer.js","sources":["../../src/Listbox/ListboxVirtualizer.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ListboxVirtualizerProps<T extends AcceptableValue = AcceptableValue> {\n /** List of items */\n options: T[]\n /** Number of items rendered outside the visible area */\n overscan?: number\n /** Estimated size (in px) of each item */\n estimateSize?: number\n /** Text content for each item to achieve type-ahead feature */\n textContent?: (option: T) => string\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { VirtualItem, Virtualizer } from '@tanstack/vue-virtual'\nimport type { Ref, VNode } from 'vue'\nimport type { AcceptableValue } from '@/shared/types'\nimport { useVirtualizer } from '@tanstack/vue-virtual'\nimport { useParentElement } from '@vueuse/core'\nimport { refAutoReset } from '@vueuse/shared'\nimport { cloneVNode, computed, Fragment, useSlots } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { MAP_KEY_TO_FOCUS_INTENT } from '@/RovingFocus/utils'\nimport { findValuesBetween, getActiveElement } from '@/shared'\nimport { getNextMatch } from '@/shared/useTypeahead'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\nimport { compare, queryCheckedElement } from './utils'\n\nconst props = defineProps<ListboxVirtualizerProps<T>>()\n\ndefineSlots<{\n default?: (props: {\n option: T\n virtualizer: Virtualizer<HTMLElement, Element>\n virtualItem: VirtualItem\n }) => any\n}>()\n\nconst slots = useSlots()\nconst rootContext = injectListboxRootContext()\nconst parentEl = useParentElement() as Ref<HTMLElement>\nconst { getItems } = useCollection<{ value: T }>()\n\n// set virtual true when this component mounted\nrootContext.isVirtual.value = true\n\nconst padding = computed(() => {\n const el = parentEl.value\n if (!el) {\n return { start: 0, end: 0 }\n }\n else {\n const styles = window.getComputedStyle(el)\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop),\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom),\n }\n }\n})\n\nconst virtualizer = useVirtualizer(\n {\n get scrollPaddingStart() { return padding.value.start },\n get scrollPaddingEnd() { return padding.value.end },\n get count() { return props.options.length },\n get horizontal() { return rootContext.orientation.value === 'horizontal' },\n estimateSize() {\n return props.estimateSize ?? 28\n },\n getScrollElement() { return parentEl.value },\n overscan: props.overscan ?? 12,\n },\n)\n\nconst virtualizedItems = computed(() => virtualizer.value.getVirtualItems().map((item) => {\n const defaultNode = slots.default!({\n option: props.options[item.index],\n virtualizer: virtualizer.value,\n virtualItem: item,\n })[0]\n\n const targetNode = defaultNode.type === Fragment && Array.isArray(defaultNode.children)\n ? defaultNode.children[0] as VNode\n : defaultNode\n\n return {\n item,\n is: cloneVNode(targetNode, {\n 'key': `${item.key}`,\n 'data-index': item.index,\n 'aria-setsize': props.options.length,\n 'aria-posinset': item.index + 1,\n 'style': {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translateY(${item.start}px)`,\n overflowAnchor: 'none',\n },\n }),\n }\n}))\n\nrootContext.virtualFocusHook.on((event) => {\n const index = props.options.findIndex((option) => {\n if (Array.isArray(rootContext.modelValue.value))\n return compare(option, rootContext.modelValue.value[0], rootContext.by)\n else\n return compare(option, rootContext.modelValue.value!, rootContext.by)\n })\n if (index !== -1) {\n event?.preventDefault()\n\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item) {\n rootContext.changeHighlight(item)\n if (event)\n item?.focus()\n }\n })\n }\n else {\n rootContext.highlightFirstItem(event as InputEvent)\n }\n})\n\nrootContext.virtualHighlightHook.on((value) => {\n const index = props.options.findIndex((option) => {\n return compare(option, value, rootContext.by)\n })\n virtualizer.value.scrollToIndex(index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = queryCheckedElement(parentEl.value)\n if (item)\n rootContext.changeHighlight(item)\n })\n})\n\n// Reset `search` 1 second after it was last updated\nconst search = refAutoReset('', 1000)\nconst optionsWithMetadata = computed(() => {\n const parseTextContent = (option: T) => {\n if (props.textContent)\n return props.textContent(option)\n else\n return option?.toString().toLowerCase()\n }\n\n return props.options.map((option, index) => ({\n index,\n textContent: parseTextContent(option),\n }))\n})\n\nfunction handleMultipleReplace(event: Event, intent: 'first' | 'last' | 'prev' | 'next') {\n if (!rootContext.firstValue?.value || !rootContext.multiple.value || !Array.isArray(rootContext.modelValue.value))\n return\n\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n const lastValue = collection.find(i => i.ref === rootContext.highlightedElement.value)?.value\n if (!lastValue)\n return\n\n let value: T[] | null = null\n switch (intent) {\n case 'prev':\n case 'next': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, lastValue)\n break\n }\n case 'first': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[0])\n break\n }\n case 'last': {\n value = findValuesBetween(props.options, rootContext.firstValue.value as T, props.options?.[props.options.length - 1])\n break\n }\n }\n rootContext.modelValue.value = value\n}\n\nrootContext.virtualKeydownHook.on((event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n const isTabKey = event.key === 'Tab' && !isMetaKey\n if (isTabKey)\n return\n\n let intent = MAP_KEY_TO_FOCUS_INTENT[event.key]\n\n // Meta + A, select all feature\n if (isMetaKey && event.key === 'a' && rootContext.multiple.value) {\n event.preventDefault()\n rootContext.modelValue.value = [...props.options]\n // purposely make the focus to last\n intent = 'last'\n }\n else if (event.shiftKey && intent) {\n handleMultipleReplace(event, intent)\n }\n\n if (['first', 'last'].includes(intent)) {\n event.preventDefault()\n\n const index = intent === 'first' ? 0 : props.options.length - 1\n virtualizer.value.scrollToIndex(index)\n requestAnimationFrame(() => {\n const items = getItems()\n const item = intent === 'first' ? items[0] : items[items.length - 1]\n if (item)\n rootContext.changeHighlight(item.ref)\n })\n }\n else if (!intent && !isMetaKey) {\n search.value += event.key\n const currentIndex = Number(getActiveElement()?.getAttribute('data-index'))\n const currentMatch = optionsWithMetadata.value[currentIndex].textContent\n const filteredOptions = optionsWithMetadata.value.map(i => i.textContent ?? '')\n const next = getNextMatch(filteredOptions, search.value, currentMatch)\n\n const nextMatch = optionsWithMetadata.value.find(option => option.textContent === next)\n if (nextMatch) {\n virtualizer.value.scrollToIndex(nextMatch.index, { align: 'start' })\n requestAnimationFrame(() => {\n const item = parentEl.value.querySelector(`[data-index=\"${nextMatch.index}\"]`)\n if (item instanceof HTMLElement)\n rootContext.changeHighlight(item)\n })\n }\n }\n})\n</script>\n\n<template>\n <div\n data-reka-virtualizer\n :style=\"{\n position: 'relative',\n width: '100%',\n height: `${virtualizer.getTotalSize()}px`,\n }\"\n >\n <component\n :is=\"is\"\n v-for=\"{ is, item } in virtualizedItems\"\n :key=\"item.index\"\n />\n </div>\n</template>\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuCheckboxItem.cjs","sources":["../../src/Menu/MenuCheckboxItem.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {\n MenuItemEmits,\n MenuItemProps,\n} from './MenuItem.vue'\nimport type { CheckedState } from './utils'\n\nexport type MenuCheckboxItemEmits = MenuItemEmits & {\n /** Event handler called when the checked state changes. */\n 'update:modelValue': [payload: boolean]\n}\n\nexport interface MenuCheckboxItemProps extends MenuItemProps {\n /** The controlled checked state of the item. Can be used as `v-model`. */\n modelValue?: CheckedState\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { useVModel } from '@vueuse/core'\nimport MenuItem from './MenuItem.vue'\nimport { provideMenuItemIndicatorContext } from './MenuItemIndicator.vue'\nimport { getCheckedState, isIndeterminate } from './utils'\n\nconst props = withDefaults(defineProps<MenuCheckboxItemProps>(), {\n modelValue: false,\n})\nconst emits = defineEmits<MenuCheckboxItemEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current modelValue state */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits)\n\nprovideMenuItemIndicatorContext({ modelValue })\n</script>\n\n<template>\n <MenuItem\n role=\"menuitemcheckbox\"\n v-bind=\"props\"\n :aria-checked=\"isIndeterminate(modelValue) ? 'mixed' : modelValue\"\n :data-state=\"getCheckedState(modelValue)\"\n @select=\"\n async (event) => {\n emits('select', event);\n if (isIndeterminate(modelValue)) {\n modelValue = true;\n }\n else {\n modelValue = !modelValue;\n }\n }\n \"\n >\n <slot :model-value=\"modelValue\" />\n </MenuItem>\n</template>\n"],"names":["useVModel","provideMenuItemIndicatorContext"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAAA,cAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAK,CAAA;AAEvD,IAAgCC,sDAAA,CAAA,EAAE,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MenuCheckboxItem.cjs","sources":["../../src/Menu/MenuCheckboxItem.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {\n MenuItemEmits,\n MenuItemProps,\n} from './MenuItem.vue'\nimport type { CheckedState } from './utils'\n\nexport type MenuCheckboxItemEmits = MenuItemEmits & {\n /** Event handler called when the checked state changes. */\n 'update:modelValue': [payload: boolean]\n}\n\nexport interface MenuCheckboxItemProps extends MenuItemProps {\n /** The controlled checked state of the item. Can be used as `v-model`. */\n modelValue?: CheckedState\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { useVModel } from '@vueuse/core'\nimport MenuItem from './MenuItem.vue'\nimport { provideMenuItemIndicatorContext } from './MenuItemIndicator.vue'\nimport { getCheckedState, isIndeterminate } from './utils'\n\nconst props = withDefaults(defineProps<MenuCheckboxItemProps>(), {\n modelValue: false,\n})\nconst emits = defineEmits<MenuCheckboxItemEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current modelValue state */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits)\n\nprovideMenuItemIndicatorContext({ modelValue })\n</script>\n\n<template>\n <MenuItem\n role=\"menuitemcheckbox\"\n v-bind=\"props\"\n :aria-checked=\"isIndeterminate(modelValue) ? 'mixed' : modelValue\"\n :data-state=\"getCheckedState(modelValue)\"\n @select=\"\n async (event) => {\n emits('select', event);\n if (isIndeterminate(modelValue)) {\n modelValue = true;\n }\n else {\n modelValue = !modelValue;\n }\n }\n \"\n >\n <slot :model-value=\"modelValue\" />\n </MenuItem>\n</template>\n"],"names":["useVModel","provideMenuItemIndicatorContext"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAAA,cAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAK,CAAA;AAEvD,IAAgCC,sDAAA,CAAA,EAAE,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuCheckboxItem.js","sources":["../../src/Menu/MenuCheckboxItem.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {\n MenuItemEmits,\n MenuItemProps,\n} from './MenuItem.vue'\nimport type { CheckedState } from './utils'\n\nexport type MenuCheckboxItemEmits = MenuItemEmits & {\n /** Event handler called when the checked state changes. */\n 'update:modelValue': [payload: boolean]\n}\n\nexport interface MenuCheckboxItemProps extends MenuItemProps {\n /** The controlled checked state of the item. Can be used as `v-model`. */\n modelValue?: CheckedState\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { useVModel } from '@vueuse/core'\nimport MenuItem from './MenuItem.vue'\nimport { provideMenuItemIndicatorContext } from './MenuItemIndicator.vue'\nimport { getCheckedState, isIndeterminate } from './utils'\n\nconst props = withDefaults(defineProps<MenuCheckboxItemProps>(), {\n modelValue: false,\n})\nconst emits = defineEmits<MenuCheckboxItemEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current modelValue state */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits)\n\nprovideMenuItemIndicatorContext({ modelValue })\n</script>\n\n<template>\n <MenuItem\n role=\"menuitemcheckbox\"\n v-bind=\"props\"\n :aria-checked=\"isIndeterminate(modelValue) ? 'mixed' : modelValue\"\n :data-state=\"getCheckedState(modelValue)\"\n @select=\"\n async (event) => {\n emits('select', event);\n if (isIndeterminate(modelValue)) {\n modelValue = true;\n }\n else {\n modelValue = !modelValue;\n }\n }\n \"\n >\n <slot :model-value=\"modelValue\" />\n </MenuItem>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAwBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAA,SAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAK,CAAA;AAEvD,IAAgC,+BAAA,CAAA,EAAE,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MenuCheckboxItem.js","sources":["../../src/Menu/MenuCheckboxItem.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {\n MenuItemEmits,\n MenuItemProps,\n} from './MenuItem.vue'\nimport type { CheckedState } from './utils'\n\nexport type MenuCheckboxItemEmits = MenuItemEmits & {\n /** Event handler called when the checked state changes. */\n 'update:modelValue': [payload: boolean]\n}\n\nexport interface MenuCheckboxItemProps extends MenuItemProps {\n /** The controlled checked state of the item. Can be used as `v-model`. */\n modelValue?: CheckedState\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { useVModel } from '@vueuse/core'\nimport MenuItem from './MenuItem.vue'\nimport { provideMenuItemIndicatorContext } from './MenuItemIndicator.vue'\nimport { getCheckedState, isIndeterminate } from './utils'\n\nconst props = withDefaults(defineProps<MenuCheckboxItemProps>(), {\n modelValue: false,\n})\nconst emits = defineEmits<MenuCheckboxItemEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current modelValue state */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits)\n\nprovideMenuItemIndicatorContext({ modelValue })\n</script>\n\n<template>\n <MenuItem\n role=\"menuitemcheckbox\"\n v-bind=\"props\"\n :aria-checked=\"isIndeterminate(modelValue) ? 'mixed' : modelValue\"\n :data-state=\"getCheckedState(modelValue)\"\n @select=\"\n async (event) => {\n emits('select', event);\n if (isIndeterminate(modelValue)) {\n modelValue = true;\n }\n else {\n modelValue = !modelValue;\n }\n }\n \"\n >\n <slot :model-value=\"modelValue\" />\n </MenuItem>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAwBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAA,SAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAK,CAAA;AAEvD,IAAgC,+BAAA,CAAA,EAAE,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuContentImpl.cjs","sources":["../../src/Menu/MenuContentImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {\n DismissableLayerEmits,\n DismissableLayerProps,\n} from '@/DismissableLayer'\nimport type { FocusScopeProps } from '@/FocusScope'\nimport type { PopperContentProps } from '@/Popper'\nimport type { RovingFocusGroupEmits } from '@/RovingFocus'\nimport type { Ref } from 'vue'\nimport type {\n GraceIntent,\n Side,\n} from './utils'\n\nimport {\n createContext,\n getActiveElement,\n useArrowNavigation,\n useFocusGuards,\n useForwardExpose,\n useTypeahead,\n} from '@/shared'\nimport { useBodyScrollLock } from '@/shared/useBodyScrollLock'\n\nexport interface MenuContentContext {\n onItemEnter: (event: PointerEvent) => boolean\n onItemLeave: (event: PointerEvent) => void\n onTriggerLeave: (event: PointerEvent) => boolean\n searchRef: Ref<string>\n pointerGraceTimerRef: Ref<number>\n onPointerGraceIntentChange: (intent: GraceIntent | null) => void\n}\n\nexport const [injectMenuContentContext, provideMenuContentContext]\n = createContext<MenuContentContext>('MenuContent')\n\nexport interface MenuContentImplPrivateProps {\n /**\n * When `true`, hover/focus/click interactions will be disabled on elements outside\n * the `DismissableLayer`. Users will need to click twice on outside elements to\n * interact with them: once to close the `DismissableLayer`, and again to trigger the element.\n */\n disableOutsidePointerEvents?: DismissableLayerProps['disableOutsidePointerEvents']\n /**\n * Whether scrolling outside the `MenuContent` should be prevented\n * @defaultValue false\n */\n disableOutsideScroll?: boolean\n\n /**\n * Whether focus should be trapped within the `MenuContent`\n * @defaultValue also\n */\n trapFocus?: FocusScopeProps['trapped']\n}\n\nexport type MenuContentImplEmits = DismissableLayerEmits & Omit<RovingFocusGroupEmits, 'update:currentTabStopId'> & {\n openAutoFocus: [event: Event]\n /**\n * Event handler called when auto-focusing on close.\n * Can be prevented.\n */\n closeAutoFocus: [event: Event]\n}\n\ntype MenuContentImplPrivateEmits = MenuContentImplEmits & {\n /**\n * Handler called when the `DismissableLayer` should be dismissed\n */\n dismiss: []\n}\n\nexport interface MenuContentImplProps\n extends MenuContentImplPrivateProps,\n Omit<PopperContentProps, 'dir'> {\n /**\n * When `true`, keyboard navigation will loop from last item to first, and vice versa.\n * @defaultValue false\n */\n loop?: boolean\n}\n\nexport interface MenuRootContentTypeProps\n extends Omit<MenuContentImplProps, 'disableOutsidePointerEvents' | 'disableOutsideScroll' | 'trapFocus'> {}\n</script>\n\n<script setup lang=\"ts\">\nimport { DismissableLayer } from '@/DismissableLayer'\nimport { FocusScope } from '@/FocusScope'\nimport {\n PopperContent,\n PopperContentPropsDefaultValue,\n} from '@/Popper'\nimport { RovingFocusGroup } from '@/RovingFocus'\nimport {\n onUnmounted,\n ref,\n toRefs,\n watch,\n} from 'vue'\nimport { injectMenuContext, injectMenuRootContext } from './MenuRoot.vue'\nimport {\n FIRST_LAST_KEYS,\n focusFirst,\n getOpenState,\n isMouseEvent,\n isPointerInGraceArea,\n LAST_KEYS,\n} from './utils'\n\nconst props = withDefaults(defineProps<MenuContentImplProps>(), {\n ...PopperContentPropsDefaultValue,\n})\nconst emits = defineEmits<MenuContentImplPrivateEmits>()\nconst menuContext = injectMenuContext()\nconst rootContext = injectMenuRootContext()\n\nconst { trapFocus, disableOutsidePointerEvents, loop } = toRefs(props)\n\nuseFocusGuards()\nuseBodyScrollLock(disableOutsidePointerEvents.value)\n\nconst searchRef = ref('')\nconst timerRef = ref(0)\nconst pointerGraceTimerRef = ref(0)\nconst pointerGraceIntentRef = ref<GraceIntent | null>(null)\nconst pointerDirRef = ref<Side>('right')\nconst lastPointerXRef = ref(0)\nconst currentItemId = ref<string | null>(null)\n\nconst rovingFocusGroupRef = ref<InstanceType<typeof RovingFocusGroup>>()\nconst { forwardRef, currentElement: contentElement } = useForwardExpose()\nconst { handleTypeaheadSearch } = useTypeahead()\n\nwatch(contentElement, (el) => {\n menuContext!.onContentChange(el)\n})\n\nonUnmounted(() => {\n window.clearTimeout(timerRef.value)\n})\n\nfunction isPointerMovingToSubmenu(event: PointerEvent) {\n const isMovingTowards\n = pointerDirRef.value === pointerGraceIntentRef.value?.side\n\n return (\n isMovingTowards\n && isPointerInGraceArea(event, pointerGraceIntentRef.value?.area)\n )\n}\n\nasync function handleMountAutoFocus(event: Event) {\n emits('openAutoFocus', event)\n if (event.defaultPrevented)\n return\n // when opening, explicitly focus the content area only and leave\n // `onEntryFocus` in control of focusing first item\n event.preventDefault()\n contentElement.value?.focus({\n preventScroll: true,\n })\n}\n\nfunction handleKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented)\n return\n // submenu key events bubble through portals. We only care about keys in this menu.\n const target = event.target as HTMLElement\n const isKeyDownInside\n = target.closest('[data-reka-menu-content]') === event.currentTarget\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey\n const isCharacterKey = event.key.length === 1\n\n const el = useArrowNavigation(\n event,\n getActiveElement() as HTMLElement,\n contentElement.value,\n {\n loop: loop.value,\n arrowKeyOptions: 'vertical',\n dir: rootContext?.dir.value,\n focus: true,\n attributeName: '[data-reka-collection-item]:not([data-disabled])',\n },\n )\n if (el)\n return el?.focus()\n\n // prevent \"Space\" taken account into handleTypeahead\n if (event.code === 'Space')\n return\n\n const collectionItems = rovingFocusGroupRef.value?.getItems() ?? []\n\n if (isKeyDownInside) {\n // menus should not be navigated using tab key so we prevent it\n if (event.key === 'Tab')\n event.preventDefault()\n if (!isModifierKey && isCharacterKey)\n handleTypeaheadSearch(event.key, collectionItems)\n }\n\n // focus first/last item based on key pressed\n if (event.target !== contentElement.value)\n return\n if (!FIRST_LAST_KEYS.includes(event.key))\n return\n event.preventDefault()\n const candidateNodes = [...collectionItems.map(item => item.ref)]\n if (LAST_KEYS.includes(event.key))\n candidateNodes.reverse()\n focusFirst(candidateNodes)\n}\n\nfunction handleBlur(event: FocusEvent) {\n // clear search buffer when leaving the menu\n // @ts-expect-error the provided currentTarget and target should be HTMLElement\n if (!event?.currentTarget?.contains?.(event.target)) {\n window.clearTimeout(timerRef.value)\n searchRef.value = ''\n }\n}\n\nfunction handlePointerMove(event: PointerEvent) {\n if (!isMouseEvent(event))\n return\n const target = event.target as HTMLElement\n const pointerXHasChanged = lastPointerXRef.value !== event.clientX\n\n // We don't use `event.movementX` for this check because Safari will\n // always return `0` on a pointer event.\n if (\n (event?.currentTarget as HTMLElement)?.contains(target)\n && pointerXHasChanged\n ) {\n const newDir = event.clientX > lastPointerXRef.value ? 'right' : 'left'\n pointerDirRef.value = newDir\n lastPointerXRef.value = event.clientX\n }\n}\n\nprovideMenuContentContext({\n onItemEnter: (event) => {\n // event.preventDefault() we can't prevent pointerMove event\n if (isPointerMovingToSubmenu(event))\n return true\n else\n return false\n },\n onItemLeave: (event) => {\n if (isPointerMovingToSubmenu(event))\n return\n contentElement.value?.focus()\n currentItemId.value = null\n },\n onTriggerLeave: (event) => {\n // event.preventDefault() we can't prevent pointerLeave event\n if (isPointerMovingToSubmenu(event))\n return true\n else\n return false\n },\n searchRef,\n pointerGraceTimerRef,\n onPointerGraceIntentChange: (intent) => {\n pointerGraceIntentRef.value = intent\n },\n})\n</script>\n\n<template>\n <FocusScope\n as-child\n :trapped=\"trapFocus\"\n @mount-auto-focus=\"handleMountAutoFocus\"\n @unmount-auto-focus=\"emits('closeAutoFocus', $event)\"\n >\n <DismissableLayer\n as-child\n :disable-outside-pointer-events=\"disableOutsidePointerEvents\"\n @escape-key-down=\"emits('escapeKeyDown', $event)\"\n @pointer-down-outside=\"emits('pointerDownOutside', $event)\"\n @focus-outside=\"emits('focusOutside', $event)\"\n @interact-outside=\"emits('interactOutside', $event)\"\n @dismiss=\"emits('dismiss')\"\n >\n <RovingFocusGroup\n ref=\"rovingFocusGroupRef\"\n v-model:current-tab-stop-id=\"currentItemId\"\n as-child\n orientation=\"vertical\"\n :dir=\"rootContext.dir.value\"\n :loop=\"loop\"\n @entry-focus=\"(event) => {\n emits('entryFocus', event)\n // only focus first item when using keyboard\n if (!rootContext.isUsingKeyboardRef.value) event.preventDefault();\n }\"\n >\n <PopperContent\n :ref=\"forwardRef\"\n role=\"menu\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-orientation=\"vertical\"\n data-reka-menu-content\n :data-state=\"getOpenState(menuContext.open.value)\"\n :dir=\"rootContext.dir.value\"\n :side=\"side\"\n :side-offset=\"sideOffset\"\n :align=\"align\"\n :align-offset=\"alignOffset\"\n :avoid-collisions=\"avoidCollisions\"\n :collision-boundary=\"collisionBoundary\"\n :collision-padding=\"collisionPadding\"\n :arrow-padding=\"arrowPadding\"\n :prioritize-position=\"prioritizePosition\"\n :position-strategy=\"positionStrategy\"\n :update-position-strategy=\"updatePositionStrategy\"\n :sticky=\"sticky\"\n :hide-when-detached=\"hideWhenDetached\"\n :reference=\"reference\"\n @keydown=\"handleKeyDown\"\n @blur=\"handleBlur\"\n @pointermove=\"handlePointerMove\"\n >\n <slot />\n </PopperContent>\n </RovingFocusGroup>\n </DismissableLayer>\n </FocusScope>\n</template>\n"],"names":["createContext","injectMenuContext","injectMenuRootContext","toRefs","useFocusGuards","useBodyScrollLock","ref","useForwardExpose","useTypeahead","watch","onUnmounted","isPointerInGraceArea","useArrowNavigation","getActiveElement","FIRST_LAST_KEYS","LAST_KEYS","focusFirst","isMouseEvent"],"mappings":"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"}
1
+ {"version":3,"file":"MenuContentImpl.cjs","sources":["../../src/Menu/MenuContentImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type {\n GraceIntent,\n Side,\n} from './utils'\nimport type {\n DismissableLayerEmits,\n DismissableLayerProps,\n} from '@/DismissableLayer'\nimport type { FocusScopeProps } from '@/FocusScope'\nimport type { PopperContentProps } from '@/Popper'\nimport type { RovingFocusGroupEmits } from '@/RovingFocus'\n\nimport {\n createContext,\n getActiveElement,\n useArrowNavigation,\n useFocusGuards,\n useForwardExpose,\n useTypeahead,\n} from '@/shared'\nimport { useBodyScrollLock } from '@/shared/useBodyScrollLock'\n\nexport interface MenuContentContext {\n onItemEnter: (event: PointerEvent) => boolean\n onItemLeave: (event: PointerEvent) => void\n onTriggerLeave: (event: PointerEvent) => boolean\n searchRef: Ref<string>\n pointerGraceTimerRef: Ref<number>\n onPointerGraceIntentChange: (intent: GraceIntent | null) => void\n}\n\nexport const [injectMenuContentContext, provideMenuContentContext]\n = createContext<MenuContentContext>('MenuContent')\n\nexport interface MenuContentImplPrivateProps {\n /**\n * When `true`, hover/focus/click interactions will be disabled on elements outside\n * the `DismissableLayer`. Users will need to click twice on outside elements to\n * interact with them: once to close the `DismissableLayer`, and again to trigger the element.\n */\n disableOutsidePointerEvents?: DismissableLayerProps['disableOutsidePointerEvents']\n /**\n * Whether scrolling outside the `MenuContent` should be prevented\n * @defaultValue false\n */\n disableOutsideScroll?: boolean\n\n /**\n * Whether focus should be trapped within the `MenuContent`\n * @defaultValue also\n */\n trapFocus?: FocusScopeProps['trapped']\n}\n\nexport type MenuContentImplEmits = DismissableLayerEmits & Omit<RovingFocusGroupEmits, 'update:currentTabStopId'> & {\n openAutoFocus: [event: Event]\n /**\n * Event handler called when auto-focusing on close.\n * Can be prevented.\n */\n closeAutoFocus: [event: Event]\n}\n\ntype MenuContentImplPrivateEmits = MenuContentImplEmits & {\n /**\n * Handler called when the `DismissableLayer` should be dismissed\n */\n dismiss: []\n}\n\nexport interface MenuContentImplProps\n extends MenuContentImplPrivateProps,\n Omit<PopperContentProps, 'dir'> {\n /**\n * When `true`, keyboard navigation will loop from last item to first, and vice versa.\n * @defaultValue false\n */\n loop?: boolean\n}\n\nexport interface MenuRootContentTypeProps\n extends Omit<MenuContentImplProps, 'disableOutsidePointerEvents' | 'disableOutsideScroll' | 'trapFocus'> {}\n</script>\n\n<script setup lang=\"ts\">\nimport {\n onUnmounted,\n ref,\n toRefs,\n watch,\n} from 'vue'\nimport { DismissableLayer } from '@/DismissableLayer'\nimport { FocusScope } from '@/FocusScope'\nimport {\n PopperContent,\n PopperContentPropsDefaultValue,\n} from '@/Popper'\nimport { RovingFocusGroup } from '@/RovingFocus'\nimport { injectMenuContext, injectMenuRootContext } from './MenuRoot.vue'\nimport {\n FIRST_LAST_KEYS,\n focusFirst,\n getOpenState,\n isMouseEvent,\n isPointerInGraceArea,\n LAST_KEYS,\n} from './utils'\n\nconst props = withDefaults(defineProps<MenuContentImplProps>(), {\n ...PopperContentPropsDefaultValue,\n})\nconst emits = defineEmits<MenuContentImplPrivateEmits>()\nconst menuContext = injectMenuContext()\nconst rootContext = injectMenuRootContext()\n\nconst { trapFocus, disableOutsidePointerEvents, loop } = toRefs(props)\n\nuseFocusGuards()\nuseBodyScrollLock(disableOutsidePointerEvents.value)\n\nconst searchRef = ref('')\nconst timerRef = ref(0)\nconst pointerGraceTimerRef = ref(0)\nconst pointerGraceIntentRef = ref<GraceIntent | null>(null)\nconst pointerDirRef = ref<Side>('right')\nconst lastPointerXRef = ref(0)\nconst currentItemId = ref<string | null>(null)\n\nconst rovingFocusGroupRef = ref<InstanceType<typeof RovingFocusGroup>>()\nconst { forwardRef, currentElement: contentElement } = useForwardExpose()\nconst { handleTypeaheadSearch } = useTypeahead()\n\nwatch(contentElement, (el) => {\n menuContext!.onContentChange(el)\n})\n\nonUnmounted(() => {\n window.clearTimeout(timerRef.value)\n})\n\nfunction isPointerMovingToSubmenu(event: PointerEvent) {\n const isMovingTowards\n = pointerDirRef.value === pointerGraceIntentRef.value?.side\n\n return (\n isMovingTowards\n && isPointerInGraceArea(event, pointerGraceIntentRef.value?.area)\n )\n}\n\nasync function handleMountAutoFocus(event: Event) {\n emits('openAutoFocus', event)\n if (event.defaultPrevented)\n return\n // when opening, explicitly focus the content area only and leave\n // `onEntryFocus` in control of focusing first item\n event.preventDefault()\n contentElement.value?.focus({\n preventScroll: true,\n })\n}\n\nfunction handleKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented)\n return\n // submenu key events bubble through portals. We only care about keys in this menu.\n const target = event.target as HTMLElement\n const isKeyDownInside\n = target.closest('[data-reka-menu-content]') === event.currentTarget\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey\n const isCharacterKey = event.key.length === 1\n\n const el = useArrowNavigation(\n event,\n getActiveElement() as HTMLElement,\n contentElement.value,\n {\n loop: loop.value,\n arrowKeyOptions: 'vertical',\n dir: rootContext?.dir.value,\n focus: true,\n attributeName: '[data-reka-collection-item]:not([data-disabled])',\n },\n )\n if (el)\n return el?.focus()\n\n // prevent \"Space\" taken account into handleTypeahead\n if (event.code === 'Space')\n return\n\n const collectionItems = rovingFocusGroupRef.value?.getItems() ?? []\n\n if (isKeyDownInside) {\n // menus should not be navigated using tab key so we prevent it\n if (event.key === 'Tab')\n event.preventDefault()\n if (!isModifierKey && isCharacterKey)\n handleTypeaheadSearch(event.key, collectionItems)\n }\n\n // focus first/last item based on key pressed\n if (event.target !== contentElement.value)\n return\n if (!FIRST_LAST_KEYS.includes(event.key))\n return\n event.preventDefault()\n const candidateNodes = [...collectionItems.map(item => item.ref)]\n if (LAST_KEYS.includes(event.key))\n candidateNodes.reverse()\n focusFirst(candidateNodes)\n}\n\nfunction handleBlur(event: FocusEvent) {\n // clear search buffer when leaving the menu\n // @ts-expect-error the provided currentTarget and target should be HTMLElement\n if (!event?.currentTarget?.contains?.(event.target)) {\n window.clearTimeout(timerRef.value)\n searchRef.value = ''\n }\n}\n\nfunction handlePointerMove(event: PointerEvent) {\n if (!isMouseEvent(event))\n return\n const target = event.target as HTMLElement\n const pointerXHasChanged = lastPointerXRef.value !== event.clientX\n\n // We don't use `event.movementX` for this check because Safari will\n // always return `0` on a pointer event.\n if (\n (event?.currentTarget as HTMLElement)?.contains(target)\n && pointerXHasChanged\n ) {\n const newDir = event.clientX > lastPointerXRef.value ? 'right' : 'left'\n pointerDirRef.value = newDir\n lastPointerXRef.value = event.clientX\n }\n}\n\nprovideMenuContentContext({\n onItemEnter: (event) => {\n // event.preventDefault() we can't prevent pointerMove event\n if (isPointerMovingToSubmenu(event))\n return true\n else\n return false\n },\n onItemLeave: (event) => {\n if (isPointerMovingToSubmenu(event))\n return\n contentElement.value?.focus()\n currentItemId.value = null\n },\n onTriggerLeave: (event) => {\n // event.preventDefault() we can't prevent pointerLeave event\n if (isPointerMovingToSubmenu(event))\n return true\n else\n return false\n },\n searchRef,\n pointerGraceTimerRef,\n onPointerGraceIntentChange: (intent) => {\n pointerGraceIntentRef.value = intent\n },\n})\n</script>\n\n<template>\n <FocusScope\n as-child\n :trapped=\"trapFocus\"\n @mount-auto-focus=\"handleMountAutoFocus\"\n @unmount-auto-focus=\"emits('closeAutoFocus', $event)\"\n >\n <DismissableLayer\n as-child\n :disable-outside-pointer-events=\"disableOutsidePointerEvents\"\n @escape-key-down=\"emits('escapeKeyDown', $event)\"\n @pointer-down-outside=\"emits('pointerDownOutside', $event)\"\n @focus-outside=\"emits('focusOutside', $event)\"\n @interact-outside=\"emits('interactOutside', $event)\"\n @dismiss=\"emits('dismiss')\"\n >\n <RovingFocusGroup\n ref=\"rovingFocusGroupRef\"\n v-model:current-tab-stop-id=\"currentItemId\"\n as-child\n orientation=\"vertical\"\n :dir=\"rootContext.dir.value\"\n :loop=\"loop\"\n @entry-focus=\"(event) => {\n emits('entryFocus', event)\n // only focus first item when using keyboard\n if (!rootContext.isUsingKeyboardRef.value) event.preventDefault();\n }\"\n >\n <PopperContent\n :ref=\"forwardRef\"\n role=\"menu\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-orientation=\"vertical\"\n data-reka-menu-content\n :data-state=\"getOpenState(menuContext.open.value)\"\n :dir=\"rootContext.dir.value\"\n :side=\"side\"\n :side-offset=\"sideOffset\"\n :align=\"align\"\n :align-offset=\"alignOffset\"\n :avoid-collisions=\"avoidCollisions\"\n :collision-boundary=\"collisionBoundary\"\n :collision-padding=\"collisionPadding\"\n :arrow-padding=\"arrowPadding\"\n :prioritize-position=\"prioritizePosition\"\n :position-strategy=\"positionStrategy\"\n :update-position-strategy=\"updatePositionStrategy\"\n :sticky=\"sticky\"\n :hide-when-detached=\"hideWhenDetached\"\n :reference=\"reference\"\n @keydown=\"handleKeyDown\"\n @blur=\"handleBlur\"\n @pointermove=\"handlePointerMove\"\n >\n <slot />\n </PopperContent>\n </RovingFocusGroup>\n </DismissableLayer>\n </FocusScope>\n</template>\n"],"names":["createContext","injectMenuContext","injectMenuRootContext","toRefs","useFocusGuards","useBodyScrollLock","ref","useForwardExpose","useTypeahead","watch","onUnmounted","isPointerInGraceArea","useArrowNavigation","getActiveElement","FIRST_LAST_KEYS","LAST_KEYS","focusFirst","isMouseEvent"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuContentImpl.js","sources":["../../src/Menu/MenuContentImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type {\n DismissableLayerEmits,\n DismissableLayerProps,\n} from '@/DismissableLayer'\nimport type { FocusScopeProps } from '@/FocusScope'\nimport type { PopperContentProps } from '@/Popper'\nimport type { RovingFocusGroupEmits } from '@/RovingFocus'\nimport type { Ref } from 'vue'\nimport type {\n GraceIntent,\n Side,\n} from './utils'\n\nimport {\n createContext,\n getActiveElement,\n useArrowNavigation,\n useFocusGuards,\n useForwardExpose,\n useTypeahead,\n} from '@/shared'\nimport { useBodyScrollLock } from '@/shared/useBodyScrollLock'\n\nexport interface MenuContentContext {\n onItemEnter: (event: PointerEvent) => boolean\n onItemLeave: (event: PointerEvent) => void\n onTriggerLeave: (event: PointerEvent) => boolean\n searchRef: Ref<string>\n pointerGraceTimerRef: Ref<number>\n onPointerGraceIntentChange: (intent: GraceIntent | null) => void\n}\n\nexport const [injectMenuContentContext, provideMenuContentContext]\n = createContext<MenuContentContext>('MenuContent')\n\nexport interface MenuContentImplPrivateProps {\n /**\n * When `true`, hover/focus/click interactions will be disabled on elements outside\n * the `DismissableLayer`. Users will need to click twice on outside elements to\n * interact with them: once to close the `DismissableLayer`, and again to trigger the element.\n */\n disableOutsidePointerEvents?: DismissableLayerProps['disableOutsidePointerEvents']\n /**\n * Whether scrolling outside the `MenuContent` should be prevented\n * @defaultValue false\n */\n disableOutsideScroll?: boolean\n\n /**\n * Whether focus should be trapped within the `MenuContent`\n * @defaultValue also\n */\n trapFocus?: FocusScopeProps['trapped']\n}\n\nexport type MenuContentImplEmits = DismissableLayerEmits & Omit<RovingFocusGroupEmits, 'update:currentTabStopId'> & {\n openAutoFocus: [event: Event]\n /**\n * Event handler called when auto-focusing on close.\n * Can be prevented.\n */\n closeAutoFocus: [event: Event]\n}\n\ntype MenuContentImplPrivateEmits = MenuContentImplEmits & {\n /**\n * Handler called when the `DismissableLayer` should be dismissed\n */\n dismiss: []\n}\n\nexport interface MenuContentImplProps\n extends MenuContentImplPrivateProps,\n Omit<PopperContentProps, 'dir'> {\n /**\n * When `true`, keyboard navigation will loop from last item to first, and vice versa.\n * @defaultValue false\n */\n loop?: boolean\n}\n\nexport interface MenuRootContentTypeProps\n extends Omit<MenuContentImplProps, 'disableOutsidePointerEvents' | 'disableOutsideScroll' | 'trapFocus'> {}\n</script>\n\n<script setup lang=\"ts\">\nimport { DismissableLayer } from '@/DismissableLayer'\nimport { FocusScope } from '@/FocusScope'\nimport {\n PopperContent,\n PopperContentPropsDefaultValue,\n} from '@/Popper'\nimport { RovingFocusGroup } from '@/RovingFocus'\nimport {\n onUnmounted,\n ref,\n toRefs,\n watch,\n} from 'vue'\nimport { injectMenuContext, injectMenuRootContext } from './MenuRoot.vue'\nimport {\n FIRST_LAST_KEYS,\n focusFirst,\n getOpenState,\n isMouseEvent,\n isPointerInGraceArea,\n LAST_KEYS,\n} from './utils'\n\nconst props = withDefaults(defineProps<MenuContentImplProps>(), {\n ...PopperContentPropsDefaultValue,\n})\nconst emits = defineEmits<MenuContentImplPrivateEmits>()\nconst menuContext = injectMenuContext()\nconst rootContext = injectMenuRootContext()\n\nconst { trapFocus, disableOutsidePointerEvents, loop } = toRefs(props)\n\nuseFocusGuards()\nuseBodyScrollLock(disableOutsidePointerEvents.value)\n\nconst searchRef = ref('')\nconst timerRef = ref(0)\nconst pointerGraceTimerRef = ref(0)\nconst pointerGraceIntentRef = ref<GraceIntent | null>(null)\nconst pointerDirRef = ref<Side>('right')\nconst lastPointerXRef = ref(0)\nconst currentItemId = ref<string | null>(null)\n\nconst rovingFocusGroupRef = ref<InstanceType<typeof RovingFocusGroup>>()\nconst { forwardRef, currentElement: contentElement } = useForwardExpose()\nconst { handleTypeaheadSearch } = useTypeahead()\n\nwatch(contentElement, (el) => {\n menuContext!.onContentChange(el)\n})\n\nonUnmounted(() => {\n window.clearTimeout(timerRef.value)\n})\n\nfunction isPointerMovingToSubmenu(event: PointerEvent) {\n const isMovingTowards\n = pointerDirRef.value === pointerGraceIntentRef.value?.side\n\n return (\n isMovingTowards\n && isPointerInGraceArea(event, pointerGraceIntentRef.value?.area)\n )\n}\n\nasync function handleMountAutoFocus(event: Event) {\n emits('openAutoFocus', event)\n if (event.defaultPrevented)\n return\n // when opening, explicitly focus the content area only and leave\n // `onEntryFocus` in control of focusing first item\n event.preventDefault()\n contentElement.value?.focus({\n preventScroll: true,\n })\n}\n\nfunction handleKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented)\n return\n // submenu key events bubble through portals. We only care about keys in this menu.\n const target = event.target as HTMLElement\n const isKeyDownInside\n = target.closest('[data-reka-menu-content]') === event.currentTarget\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey\n const isCharacterKey = event.key.length === 1\n\n const el = useArrowNavigation(\n event,\n getActiveElement() as HTMLElement,\n contentElement.value,\n {\n loop: loop.value,\n arrowKeyOptions: 'vertical',\n dir: rootContext?.dir.value,\n focus: true,\n attributeName: '[data-reka-collection-item]:not([data-disabled])',\n },\n )\n if (el)\n return el?.focus()\n\n // prevent \"Space\" taken account into handleTypeahead\n if (event.code === 'Space')\n return\n\n const collectionItems = rovingFocusGroupRef.value?.getItems() ?? []\n\n if (isKeyDownInside) {\n // menus should not be navigated using tab key so we prevent it\n if (event.key === 'Tab')\n event.preventDefault()\n if (!isModifierKey && isCharacterKey)\n handleTypeaheadSearch(event.key, collectionItems)\n }\n\n // focus first/last item based on key pressed\n if (event.target !== contentElement.value)\n return\n if (!FIRST_LAST_KEYS.includes(event.key))\n return\n event.preventDefault()\n const candidateNodes = [...collectionItems.map(item => item.ref)]\n if (LAST_KEYS.includes(event.key))\n candidateNodes.reverse()\n focusFirst(candidateNodes)\n}\n\nfunction handleBlur(event: FocusEvent) {\n // clear search buffer when leaving the menu\n // @ts-expect-error the provided currentTarget and target should be HTMLElement\n if (!event?.currentTarget?.contains?.(event.target)) {\n window.clearTimeout(timerRef.value)\n searchRef.value = ''\n }\n}\n\nfunction handlePointerMove(event: PointerEvent) {\n if (!isMouseEvent(event))\n return\n const target = event.target as HTMLElement\n const pointerXHasChanged = lastPointerXRef.value !== event.clientX\n\n // We don't use `event.movementX` for this check because Safari will\n // always return `0` on a pointer event.\n if (\n (event?.currentTarget as HTMLElement)?.contains(target)\n && pointerXHasChanged\n ) {\n const newDir = event.clientX > lastPointerXRef.value ? 'right' : 'left'\n pointerDirRef.value = newDir\n lastPointerXRef.value = event.clientX\n }\n}\n\nprovideMenuContentContext({\n onItemEnter: (event) => {\n // event.preventDefault() we can't prevent pointerMove event\n if (isPointerMovingToSubmenu(event))\n return true\n else\n return false\n },\n onItemLeave: (event) => {\n if (isPointerMovingToSubmenu(event))\n return\n contentElement.value?.focus()\n currentItemId.value = null\n },\n onTriggerLeave: (event) => {\n // event.preventDefault() we can't prevent pointerLeave event\n if (isPointerMovingToSubmenu(event))\n return true\n else\n return false\n },\n searchRef,\n pointerGraceTimerRef,\n onPointerGraceIntentChange: (intent) => {\n pointerGraceIntentRef.value = intent\n },\n})\n</script>\n\n<template>\n <FocusScope\n as-child\n :trapped=\"trapFocus\"\n @mount-auto-focus=\"handleMountAutoFocus\"\n @unmount-auto-focus=\"emits('closeAutoFocus', $event)\"\n >\n <DismissableLayer\n as-child\n :disable-outside-pointer-events=\"disableOutsidePointerEvents\"\n @escape-key-down=\"emits('escapeKeyDown', $event)\"\n @pointer-down-outside=\"emits('pointerDownOutside', $event)\"\n @focus-outside=\"emits('focusOutside', $event)\"\n @interact-outside=\"emits('interactOutside', $event)\"\n @dismiss=\"emits('dismiss')\"\n >\n <RovingFocusGroup\n ref=\"rovingFocusGroupRef\"\n v-model:current-tab-stop-id=\"currentItemId\"\n as-child\n orientation=\"vertical\"\n :dir=\"rootContext.dir.value\"\n :loop=\"loop\"\n @entry-focus=\"(event) => {\n emits('entryFocus', event)\n // only focus first item when using keyboard\n if (!rootContext.isUsingKeyboardRef.value) event.preventDefault();\n }\"\n >\n <PopperContent\n :ref=\"forwardRef\"\n role=\"menu\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-orientation=\"vertical\"\n data-reka-menu-content\n :data-state=\"getOpenState(menuContext.open.value)\"\n :dir=\"rootContext.dir.value\"\n :side=\"side\"\n :side-offset=\"sideOffset\"\n :align=\"align\"\n :align-offset=\"alignOffset\"\n :avoid-collisions=\"avoidCollisions\"\n :collision-boundary=\"collisionBoundary\"\n :collision-padding=\"collisionPadding\"\n :arrow-padding=\"arrowPadding\"\n :prioritize-position=\"prioritizePosition\"\n :position-strategy=\"positionStrategy\"\n :update-position-strategy=\"updatePositionStrategy\"\n :sticky=\"sticky\"\n :hide-when-detached=\"hideWhenDetached\"\n :reference=\"reference\"\n @keydown=\"handleKeyDown\"\n @blur=\"handleBlur\"\n @pointermove=\"handlePointerMove\"\n >\n <slot />\n </PopperContent>\n </RovingFocusGroup>\n </DismissableLayer>\n </FocusScope>\n</template>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MenuContentImpl.js","sources":["../../src/Menu/MenuContentImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type {\n GraceIntent,\n Side,\n} from './utils'\nimport type {\n DismissableLayerEmits,\n DismissableLayerProps,\n} from '@/DismissableLayer'\nimport type { FocusScopeProps } from '@/FocusScope'\nimport type { PopperContentProps } from '@/Popper'\nimport type { RovingFocusGroupEmits } from '@/RovingFocus'\n\nimport {\n createContext,\n getActiveElement,\n useArrowNavigation,\n useFocusGuards,\n useForwardExpose,\n useTypeahead,\n} from '@/shared'\nimport { useBodyScrollLock } from '@/shared/useBodyScrollLock'\n\nexport interface MenuContentContext {\n onItemEnter: (event: PointerEvent) => boolean\n onItemLeave: (event: PointerEvent) => void\n onTriggerLeave: (event: PointerEvent) => boolean\n searchRef: Ref<string>\n pointerGraceTimerRef: Ref<number>\n onPointerGraceIntentChange: (intent: GraceIntent | null) => void\n}\n\nexport const [injectMenuContentContext, provideMenuContentContext]\n = createContext<MenuContentContext>('MenuContent')\n\nexport interface MenuContentImplPrivateProps {\n /**\n * When `true`, hover/focus/click interactions will be disabled on elements outside\n * the `DismissableLayer`. Users will need to click twice on outside elements to\n * interact with them: once to close the `DismissableLayer`, and again to trigger the element.\n */\n disableOutsidePointerEvents?: DismissableLayerProps['disableOutsidePointerEvents']\n /**\n * Whether scrolling outside the `MenuContent` should be prevented\n * @defaultValue false\n */\n disableOutsideScroll?: boolean\n\n /**\n * Whether focus should be trapped within the `MenuContent`\n * @defaultValue also\n */\n trapFocus?: FocusScopeProps['trapped']\n}\n\nexport type MenuContentImplEmits = DismissableLayerEmits & Omit<RovingFocusGroupEmits, 'update:currentTabStopId'> & {\n openAutoFocus: [event: Event]\n /**\n * Event handler called when auto-focusing on close.\n * Can be prevented.\n */\n closeAutoFocus: [event: Event]\n}\n\ntype MenuContentImplPrivateEmits = MenuContentImplEmits & {\n /**\n * Handler called when the `DismissableLayer` should be dismissed\n */\n dismiss: []\n}\n\nexport interface MenuContentImplProps\n extends MenuContentImplPrivateProps,\n Omit<PopperContentProps, 'dir'> {\n /**\n * When `true`, keyboard navigation will loop from last item to first, and vice versa.\n * @defaultValue false\n */\n loop?: boolean\n}\n\nexport interface MenuRootContentTypeProps\n extends Omit<MenuContentImplProps, 'disableOutsidePointerEvents' | 'disableOutsideScroll' | 'trapFocus'> {}\n</script>\n\n<script setup lang=\"ts\">\nimport {\n onUnmounted,\n ref,\n toRefs,\n watch,\n} from 'vue'\nimport { DismissableLayer } from '@/DismissableLayer'\nimport { FocusScope } from '@/FocusScope'\nimport {\n PopperContent,\n PopperContentPropsDefaultValue,\n} from '@/Popper'\nimport { RovingFocusGroup } from '@/RovingFocus'\nimport { injectMenuContext, injectMenuRootContext } from './MenuRoot.vue'\nimport {\n FIRST_LAST_KEYS,\n focusFirst,\n getOpenState,\n isMouseEvent,\n isPointerInGraceArea,\n LAST_KEYS,\n} from './utils'\n\nconst props = withDefaults(defineProps<MenuContentImplProps>(), {\n ...PopperContentPropsDefaultValue,\n})\nconst emits = defineEmits<MenuContentImplPrivateEmits>()\nconst menuContext = injectMenuContext()\nconst rootContext = injectMenuRootContext()\n\nconst { trapFocus, disableOutsidePointerEvents, loop } = toRefs(props)\n\nuseFocusGuards()\nuseBodyScrollLock(disableOutsidePointerEvents.value)\n\nconst searchRef = ref('')\nconst timerRef = ref(0)\nconst pointerGraceTimerRef = ref(0)\nconst pointerGraceIntentRef = ref<GraceIntent | null>(null)\nconst pointerDirRef = ref<Side>('right')\nconst lastPointerXRef = ref(0)\nconst currentItemId = ref<string | null>(null)\n\nconst rovingFocusGroupRef = ref<InstanceType<typeof RovingFocusGroup>>()\nconst { forwardRef, currentElement: contentElement } = useForwardExpose()\nconst { handleTypeaheadSearch } = useTypeahead()\n\nwatch(contentElement, (el) => {\n menuContext!.onContentChange(el)\n})\n\nonUnmounted(() => {\n window.clearTimeout(timerRef.value)\n})\n\nfunction isPointerMovingToSubmenu(event: PointerEvent) {\n const isMovingTowards\n = pointerDirRef.value === pointerGraceIntentRef.value?.side\n\n return (\n isMovingTowards\n && isPointerInGraceArea(event, pointerGraceIntentRef.value?.area)\n )\n}\n\nasync function handleMountAutoFocus(event: Event) {\n emits('openAutoFocus', event)\n if (event.defaultPrevented)\n return\n // when opening, explicitly focus the content area only and leave\n // `onEntryFocus` in control of focusing first item\n event.preventDefault()\n contentElement.value?.focus({\n preventScroll: true,\n })\n}\n\nfunction handleKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented)\n return\n // submenu key events bubble through portals. We only care about keys in this menu.\n const target = event.target as HTMLElement\n const isKeyDownInside\n = target.closest('[data-reka-menu-content]') === event.currentTarget\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey\n const isCharacterKey = event.key.length === 1\n\n const el = useArrowNavigation(\n event,\n getActiveElement() as HTMLElement,\n contentElement.value,\n {\n loop: loop.value,\n arrowKeyOptions: 'vertical',\n dir: rootContext?.dir.value,\n focus: true,\n attributeName: '[data-reka-collection-item]:not([data-disabled])',\n },\n )\n if (el)\n return el?.focus()\n\n // prevent \"Space\" taken account into handleTypeahead\n if (event.code === 'Space')\n return\n\n const collectionItems = rovingFocusGroupRef.value?.getItems() ?? []\n\n if (isKeyDownInside) {\n // menus should not be navigated using tab key so we prevent it\n if (event.key === 'Tab')\n event.preventDefault()\n if (!isModifierKey && isCharacterKey)\n handleTypeaheadSearch(event.key, collectionItems)\n }\n\n // focus first/last item based on key pressed\n if (event.target !== contentElement.value)\n return\n if (!FIRST_LAST_KEYS.includes(event.key))\n return\n event.preventDefault()\n const candidateNodes = [...collectionItems.map(item => item.ref)]\n if (LAST_KEYS.includes(event.key))\n candidateNodes.reverse()\n focusFirst(candidateNodes)\n}\n\nfunction handleBlur(event: FocusEvent) {\n // clear search buffer when leaving the menu\n // @ts-expect-error the provided currentTarget and target should be HTMLElement\n if (!event?.currentTarget?.contains?.(event.target)) {\n window.clearTimeout(timerRef.value)\n searchRef.value = ''\n }\n}\n\nfunction handlePointerMove(event: PointerEvent) {\n if (!isMouseEvent(event))\n return\n const target = event.target as HTMLElement\n const pointerXHasChanged = lastPointerXRef.value !== event.clientX\n\n // We don't use `event.movementX` for this check because Safari will\n // always return `0` on a pointer event.\n if (\n (event?.currentTarget as HTMLElement)?.contains(target)\n && pointerXHasChanged\n ) {\n const newDir = event.clientX > lastPointerXRef.value ? 'right' : 'left'\n pointerDirRef.value = newDir\n lastPointerXRef.value = event.clientX\n }\n}\n\nprovideMenuContentContext({\n onItemEnter: (event) => {\n // event.preventDefault() we can't prevent pointerMove event\n if (isPointerMovingToSubmenu(event))\n return true\n else\n return false\n },\n onItemLeave: (event) => {\n if (isPointerMovingToSubmenu(event))\n return\n contentElement.value?.focus()\n currentItemId.value = null\n },\n onTriggerLeave: (event) => {\n // event.preventDefault() we can't prevent pointerLeave event\n if (isPointerMovingToSubmenu(event))\n return true\n else\n return false\n },\n searchRef,\n pointerGraceTimerRef,\n onPointerGraceIntentChange: (intent) => {\n pointerGraceIntentRef.value = intent\n },\n})\n</script>\n\n<template>\n <FocusScope\n as-child\n :trapped=\"trapFocus\"\n @mount-auto-focus=\"handleMountAutoFocus\"\n @unmount-auto-focus=\"emits('closeAutoFocus', $event)\"\n >\n <DismissableLayer\n as-child\n :disable-outside-pointer-events=\"disableOutsidePointerEvents\"\n @escape-key-down=\"emits('escapeKeyDown', $event)\"\n @pointer-down-outside=\"emits('pointerDownOutside', $event)\"\n @focus-outside=\"emits('focusOutside', $event)\"\n @interact-outside=\"emits('interactOutside', $event)\"\n @dismiss=\"emits('dismiss')\"\n >\n <RovingFocusGroup\n ref=\"rovingFocusGroupRef\"\n v-model:current-tab-stop-id=\"currentItemId\"\n as-child\n orientation=\"vertical\"\n :dir=\"rootContext.dir.value\"\n :loop=\"loop\"\n @entry-focus=\"(event) => {\n emits('entryFocus', event)\n // only focus first item when using keyboard\n if (!rootContext.isUsingKeyboardRef.value) event.preventDefault();\n }\"\n >\n <PopperContent\n :ref=\"forwardRef\"\n role=\"menu\"\n :as=\"as\"\n :as-child=\"asChild\"\n aria-orientation=\"vertical\"\n data-reka-menu-content\n :data-state=\"getOpenState(menuContext.open.value)\"\n :dir=\"rootContext.dir.value\"\n :side=\"side\"\n :side-offset=\"sideOffset\"\n :align=\"align\"\n :align-offset=\"alignOffset\"\n :avoid-collisions=\"avoidCollisions\"\n :collision-boundary=\"collisionBoundary\"\n :collision-padding=\"collisionPadding\"\n :arrow-padding=\"arrowPadding\"\n :prioritize-position=\"prioritizePosition\"\n :position-strategy=\"positionStrategy\"\n :update-position-strategy=\"updatePositionStrategy\"\n :sticky=\"sticky\"\n :hide-when-detached=\"hideWhenDetached\"\n :reference=\"reference\"\n @keydown=\"handleKeyDown\"\n @blur=\"handleBlur\"\n @pointermove=\"handlePointerMove\"\n >\n <slot />\n </PopperContent>\n </RovingFocusGroup>\n </DismissableLayer>\n </FocusScope>\n</template>\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuItemImpl.cjs","sources":["../../src/Menu/MenuItemImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface MenuItemImplProps extends PrimitiveProps {\n /** When `true`, prevents the user from interacting with the item. */\n disabled?: boolean\n /**\n * Optional text used for typeahead purposes. By default the typeahead behavior will use the `.textContent` of the item. <br>\n * Use this when the content is complex, or you have non-textual content inside.\n */\n textValue?: string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { useCollection } from '@/Collection'\nimport {\n Primitive,\n} from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\nimport { nextTick, ref } from 'vue'\nimport { injectMenuContentContext } from './MenuContentImpl.vue'\nimport { isMouseEvent } from './utils'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<MenuItemImplProps>()\n\nconst contentContext = injectMenuContentContext()\nconst { forwardRef } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst isFocused = ref(false)\n\nasync function handlePointerMove(event: PointerEvent) {\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n if (props.disabled) {\n contentContext.onItemLeave(event)\n }\n else {\n const defaultPrevented = contentContext.onItemEnter(event)\n if (!defaultPrevented) {\n const item = event.currentTarget;\n (item as HTMLElement)?.focus({ preventScroll: true })\n }\n }\n}\n\nasync function handlePointerLeave(event: PointerEvent) {\n await nextTick()\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n contentContext.onItemLeave(event)\n}\n</script>\n\n<template>\n <CollectionItem :value=\"{ textValue }\">\n <Primitive\n :ref=\"forwardRef\"\n role=\"menuitem\"\n tabindex=\"-1\"\n v-bind=\"$attrs\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-disabled=\"disabled || undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-highlighted=\"isFocused ? '' : undefined\"\n @pointermove=\"handlePointerMove\"\n @pointerleave=\"handlePointerLeave\"\n @focus=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented || disabled) return;\n isFocused = true;\n }\n \"\n @blur=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented) return;\n isFocused = false;\n }\n \"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":["injectMenuContentContext","useForwardExpose","useCollection","ref","isMouseEvent","nextTick"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,iBAAiBA,6CAAyB,EAAA;AAChD,IAAM,MAAA,EAAE,UAAW,EAAA,GAAIC,wCAAiB,EAAA;AACxC,IAAM,MAAA,EAAE,cAAe,EAAA,GAAIC,mCAAc,EAAA;AAEzC,IAAM,MAAA,SAAA,GAAYC,QAAI,KAAK,CAAA;AAE3B,IAAA,eAAe,kBAAkB,KAAqB,EAAA;AACpD,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAACC,wBAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA,OAE7B,MAAA;AACH,QAAM,MAAA,gBAAA,GAAmB,cAAe,CAAA,WAAA,CAAY,KAAK,CAAA;AACzD,QAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,UAAA,MAAM,OAAO,KAAM,CAAA,aAAA;AACnB,UAAC,IAAsB,EAAA,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA;AACtD;AACF;AAGF,IAAA,eAAe,mBAAmB,KAAqB,EAAA;AACrD,MAAA,MAAMC,YAAS,EAAA;AACf,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAACD,wBAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MenuItemImpl.cjs","sources":["../../src/Menu/MenuItemImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface MenuItemImplProps extends PrimitiveProps {\n /** When `true`, prevents the user from interacting with the item. */\n disabled?: boolean\n /**\n * Optional text used for typeahead purposes. By default the typeahead behavior will use the `.textContent` of the item. <br>\n * Use this when the content is complex, or you have non-textual content inside.\n */\n textValue?: string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { nextTick, ref } from 'vue'\nimport { useCollection } from '@/Collection'\nimport {\n Primitive,\n} from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\nimport { injectMenuContentContext } from './MenuContentImpl.vue'\nimport { isMouseEvent } from './utils'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<MenuItemImplProps>()\n\nconst contentContext = injectMenuContentContext()\nconst { forwardRef } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst isFocused = ref(false)\n\nasync function handlePointerMove(event: PointerEvent) {\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n if (props.disabled) {\n contentContext.onItemLeave(event)\n }\n else {\n const defaultPrevented = contentContext.onItemEnter(event)\n if (!defaultPrevented) {\n const item = event.currentTarget;\n (item as HTMLElement)?.focus({ preventScroll: true })\n }\n }\n}\n\nasync function handlePointerLeave(event: PointerEvent) {\n await nextTick()\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n contentContext.onItemLeave(event)\n}\n</script>\n\n<template>\n <CollectionItem :value=\"{ textValue }\">\n <Primitive\n :ref=\"forwardRef\"\n role=\"menuitem\"\n tabindex=\"-1\"\n v-bind=\"$attrs\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-disabled=\"disabled || undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-highlighted=\"isFocused ? '' : undefined\"\n @pointermove=\"handlePointerMove\"\n @pointerleave=\"handlePointerLeave\"\n @focus=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented || disabled) return;\n isFocused = true;\n }\n \"\n @blur=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented) return;\n isFocused = false;\n }\n \"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":["injectMenuContentContext","useForwardExpose","useCollection","ref","isMouseEvent","nextTick"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,iBAAiBA,6CAAyB,EAAA;AAChD,IAAM,MAAA,EAAE,UAAW,EAAA,GAAIC,wCAAiB,EAAA;AACxC,IAAM,MAAA,EAAE,cAAe,EAAA,GAAIC,mCAAc,EAAA;AAEzC,IAAM,MAAA,SAAA,GAAYC,QAAI,KAAK,CAAA;AAE3B,IAAA,eAAe,kBAAkB,KAAqB,EAAA;AACpD,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAACC,wBAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA,OAE7B,MAAA;AACH,QAAM,MAAA,gBAAA,GAAmB,cAAe,CAAA,WAAA,CAAY,KAAK,CAAA;AACzD,QAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,UAAA,MAAM,OAAO,KAAM,CAAA,aAAA;AACnB,UAAC,IAAsB,EAAA,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA;AACtD;AACF;AAGF,IAAA,eAAe,mBAAmB,KAAqB,EAAA;AACrD,MAAA,MAAMC,YAAS,EAAA;AACf,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAACD,wBAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuItemImpl.js","sources":["../../src/Menu/MenuItemImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface MenuItemImplProps extends PrimitiveProps {\n /** When `true`, prevents the user from interacting with the item. */\n disabled?: boolean\n /**\n * Optional text used for typeahead purposes. By default the typeahead behavior will use the `.textContent` of the item. <br>\n * Use this when the content is complex, or you have non-textual content inside.\n */\n textValue?: string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { useCollection } from '@/Collection'\nimport {\n Primitive,\n} from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\nimport { nextTick, ref } from 'vue'\nimport { injectMenuContentContext } from './MenuContentImpl.vue'\nimport { isMouseEvent } from './utils'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<MenuItemImplProps>()\n\nconst contentContext = injectMenuContentContext()\nconst { forwardRef } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst isFocused = ref(false)\n\nasync function handlePointerMove(event: PointerEvent) {\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n if (props.disabled) {\n contentContext.onItemLeave(event)\n }\n else {\n const defaultPrevented = contentContext.onItemEnter(event)\n if (!defaultPrevented) {\n const item = event.currentTarget;\n (item as HTMLElement)?.focus({ preventScroll: true })\n }\n }\n}\n\nasync function handlePointerLeave(event: PointerEvent) {\n await nextTick()\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n contentContext.onItemLeave(event)\n}\n</script>\n\n<template>\n <CollectionItem :value=\"{ textValue }\">\n <Primitive\n :ref=\"forwardRef\"\n role=\"menuitem\"\n tabindex=\"-1\"\n v-bind=\"$attrs\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-disabled=\"disabled || undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-highlighted=\"isFocused ? '' : undefined\"\n @pointermove=\"handlePointerMove\"\n @pointerleave=\"handlePointerLeave\"\n @focus=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented || disabled) return;\n isFocused = true;\n }\n \"\n @blur=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented) return;\n isFocused = false;\n }\n \"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AA4BA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,iBAAiB,wBAAyB,EAAA;AAChD,IAAM,MAAA,EAAE,UAAW,EAAA,GAAI,gBAAiB,EAAA;AACxC,IAAM,MAAA,EAAE,cAAe,EAAA,GAAI,aAAc,EAAA;AAEzC,IAAM,MAAA,SAAA,GAAY,IAAI,KAAK,CAAA;AAE3B,IAAA,eAAe,kBAAkB,KAAqB,EAAA;AACpD,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAAC,aAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA,OAE7B,MAAA;AACH,QAAM,MAAA,gBAAA,GAAmB,cAAe,CAAA,WAAA,CAAY,KAAK,CAAA;AACzD,QAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,UAAA,MAAM,OAAO,KAAM,CAAA,aAAA;AACnB,UAAC,IAAsB,EAAA,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA;AACtD;AACF;AAGF,IAAA,eAAe,mBAAmB,KAAqB,EAAA;AACrD,MAAA,MAAM,QAAS,EAAA;AACf,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAAC,aAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MenuItemImpl.js","sources":["../../src/Menu/MenuItemImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface MenuItemImplProps extends PrimitiveProps {\n /** When `true`, prevents the user from interacting with the item. */\n disabled?: boolean\n /**\n * Optional text used for typeahead purposes. By default the typeahead behavior will use the `.textContent` of the item. <br>\n * Use this when the content is complex, or you have non-textual content inside.\n */\n textValue?: string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { nextTick, ref } from 'vue'\nimport { useCollection } from '@/Collection'\nimport {\n Primitive,\n} from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\nimport { injectMenuContentContext } from './MenuContentImpl.vue'\nimport { isMouseEvent } from './utils'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<MenuItemImplProps>()\n\nconst contentContext = injectMenuContentContext()\nconst { forwardRef } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst isFocused = ref(false)\n\nasync function handlePointerMove(event: PointerEvent) {\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n if (props.disabled) {\n contentContext.onItemLeave(event)\n }\n else {\n const defaultPrevented = contentContext.onItemEnter(event)\n if (!defaultPrevented) {\n const item = event.currentTarget;\n (item as HTMLElement)?.focus({ preventScroll: true })\n }\n }\n}\n\nasync function handlePointerLeave(event: PointerEvent) {\n await nextTick()\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n contentContext.onItemLeave(event)\n}\n</script>\n\n<template>\n <CollectionItem :value=\"{ textValue }\">\n <Primitive\n :ref=\"forwardRef\"\n role=\"menuitem\"\n tabindex=\"-1\"\n v-bind=\"$attrs\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-disabled=\"disabled || undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-highlighted=\"isFocused ? '' : undefined\"\n @pointermove=\"handlePointerMove\"\n @pointerleave=\"handlePointerLeave\"\n @focus=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented || disabled) return;\n isFocused = true;\n }\n \"\n @blur=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented) return;\n isFocused = false;\n }\n \"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AA4BA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,iBAAiB,wBAAyB,EAAA;AAChD,IAAM,MAAA,EAAE,UAAW,EAAA,GAAI,gBAAiB,EAAA;AACxC,IAAM,MAAA,EAAE,cAAe,EAAA,GAAI,aAAc,EAAA;AAEzC,IAAM,MAAA,SAAA,GAAY,IAAI,KAAK,CAAA;AAE3B,IAAA,eAAe,kBAAkB,KAAqB,EAAA;AACpD,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAAC,aAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA,OAE7B,MAAA;AACH,QAAM,MAAA,gBAAA,GAAmB,cAAe,CAAA,WAAA,CAAY,KAAK,CAAA;AACzD,QAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,UAAA,MAAM,OAAO,KAAM,CAAA,aAAA;AACnB,UAAC,IAAsB,EAAA,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA;AACtD;AACF;AAGF,IAAA,eAAe,mBAAmB,KAAqB,EAAA;AACrD,MAAA,MAAM,QAAS,EAAA;AACf,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAAC,aAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuItemIndicator.cjs","sources":["../../src/Menu/MenuItemIndicator.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { Ref } from 'vue'\nimport type { CheckedState } from './utils'\nimport { createContext } from '@/shared'\n\ninterface MenuItemIndicatorContext {\n modelValue: Ref<CheckedState>\n}\n\nexport interface MenuItemIndicatorProps extends PrimitiveProps {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with Vue animation libraries.\n */\n forceMount?: boolean\n}\n\nexport const [injectMenuItemIndicatorContext, provideMenuItemIndicatorContext]\n = createContext<MenuItemIndicatorContext>(\n ['MenuCheckboxItem', 'MenuRadioItem'],\n 'MenuItemIndicatorContext',\n )\n</script>\n\n<script setup lang=\"ts\">\nimport { Presence } from '@/Presence'\nimport { Primitive } from '@/Primitive'\nimport { ref } from 'vue'\nimport { getCheckedState, isIndeterminate } from './utils'\n\nwithDefaults(defineProps<MenuItemIndicatorProps>(), {\n as: 'span',\n})\n\nconst indicatorContext = injectMenuItemIndicatorContext({\n modelValue: ref(false),\n})\n</script>\n\n<template>\n <Presence\n :present=\"\n forceMount\n || isIndeterminate(indicatorContext.modelValue.value)\n || indicatorContext.modelValue.value === true\n \"\n >\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-state=\"getCheckedState(indicatorContext.modelValue.value)\"\n >\n <slot />\n </Primitive>\n </Presence>\n</template>\n"],"names":["createContext","ref"],"mappings":";;;;;;;;AAkBa,MAAA,CAAC,8BAAgC,EAAA,+BAA+B,CACzE,GAAAA,kCAAA;AAAA,EACA,CAAC,oBAAoB,eAAe,CAAA;AAAA,EACpC;AACF;;;;;;;;;AAaF,IAAA,MAAM,mBAAmB,8BAA+B,CAAA;AAAA,MACtD,UAAA,EAAYC,QAAI,KAAK;AAAA,KACtB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MenuItemIndicator.cjs","sources":["../../src/Menu/MenuItemIndicator.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type { CheckedState } from './utils'\nimport type { PrimitiveProps } from '@/Primitive'\nimport { createContext } from '@/shared'\n\ninterface MenuItemIndicatorContext {\n modelValue: Ref<CheckedState>\n}\n\nexport interface MenuItemIndicatorProps extends PrimitiveProps {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with Vue animation libraries.\n */\n forceMount?: boolean\n}\n\nexport const [injectMenuItemIndicatorContext, provideMenuItemIndicatorContext]\n = createContext<MenuItemIndicatorContext>(\n ['MenuCheckboxItem', 'MenuRadioItem'],\n 'MenuItemIndicatorContext',\n )\n</script>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { Presence } from '@/Presence'\nimport { Primitive } from '@/Primitive'\nimport { getCheckedState, isIndeterminate } from './utils'\n\nwithDefaults(defineProps<MenuItemIndicatorProps>(), {\n as: 'span',\n})\n\nconst indicatorContext = injectMenuItemIndicatorContext({\n modelValue: ref(false),\n})\n</script>\n\n<template>\n <Presence\n :present=\"\n forceMount\n || isIndeterminate(indicatorContext.modelValue.value)\n || indicatorContext.modelValue.value === true\n \"\n >\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-state=\"getCheckedState(indicatorContext.modelValue.value)\"\n >\n <slot />\n </Primitive>\n </Presence>\n</template>\n"],"names":["createContext","ref"],"mappings":";;;;;;;;AAkBa,MAAA,CAAC,8BAAgC,EAAA,+BAA+B,CACzE,GAAAA,kCAAA;AAAA,EACA,CAAC,oBAAoB,eAAe,CAAA;AAAA,EACpC;AACF;;;;;;;;;AAaF,IAAA,MAAM,mBAAmB,8BAA+B,CAAA;AAAA,MACtD,UAAA,EAAYC,QAAI,KAAK;AAAA,KACtB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuItemIndicator.js","sources":["../../src/Menu/MenuItemIndicator.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { Ref } from 'vue'\nimport type { CheckedState } from './utils'\nimport { createContext } from '@/shared'\n\ninterface MenuItemIndicatorContext {\n modelValue: Ref<CheckedState>\n}\n\nexport interface MenuItemIndicatorProps extends PrimitiveProps {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with Vue animation libraries.\n */\n forceMount?: boolean\n}\n\nexport const [injectMenuItemIndicatorContext, provideMenuItemIndicatorContext]\n = createContext<MenuItemIndicatorContext>(\n ['MenuCheckboxItem', 'MenuRadioItem'],\n 'MenuItemIndicatorContext',\n )\n</script>\n\n<script setup lang=\"ts\">\nimport { Presence } from '@/Presence'\nimport { Primitive } from '@/Primitive'\nimport { ref } from 'vue'\nimport { getCheckedState, isIndeterminate } from './utils'\n\nwithDefaults(defineProps<MenuItemIndicatorProps>(), {\n as: 'span',\n})\n\nconst indicatorContext = injectMenuItemIndicatorContext({\n modelValue: ref(false),\n})\n</script>\n\n<template>\n <Presence\n :present=\"\n forceMount\n || isIndeterminate(indicatorContext.modelValue.value)\n || indicatorContext.modelValue.value === true\n \"\n >\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-state=\"getCheckedState(indicatorContext.modelValue.value)\"\n >\n <slot />\n </Primitive>\n </Presence>\n</template>\n"],"names":[],"mappings":";;;;;;AAkBa,MAAA,CAAC,8BAAgC,EAAA,+BAA+B,CACzE,GAAA,aAAA;AAAA,EACA,CAAC,oBAAoB,eAAe,CAAA;AAAA,EACpC;AACF;;;;;;;;;AAaF,IAAA,MAAM,mBAAmB,8BAA+B,CAAA;AAAA,MACtD,UAAA,EAAY,IAAI,KAAK;AAAA,KACtB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MenuItemIndicator.js","sources":["../../src/Menu/MenuItemIndicator.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type { CheckedState } from './utils'\nimport type { PrimitiveProps } from '@/Primitive'\nimport { createContext } from '@/shared'\n\ninterface MenuItemIndicatorContext {\n modelValue: Ref<CheckedState>\n}\n\nexport interface MenuItemIndicatorProps extends PrimitiveProps {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with Vue animation libraries.\n */\n forceMount?: boolean\n}\n\nexport const [injectMenuItemIndicatorContext, provideMenuItemIndicatorContext]\n = createContext<MenuItemIndicatorContext>(\n ['MenuCheckboxItem', 'MenuRadioItem'],\n 'MenuItemIndicatorContext',\n )\n</script>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { Presence } from '@/Presence'\nimport { Primitive } from '@/Primitive'\nimport { getCheckedState, isIndeterminate } from './utils'\n\nwithDefaults(defineProps<MenuItemIndicatorProps>(), {\n as: 'span',\n})\n\nconst indicatorContext = injectMenuItemIndicatorContext({\n modelValue: ref(false),\n})\n</script>\n\n<template>\n <Presence\n :present=\"\n forceMount\n || isIndeterminate(indicatorContext.modelValue.value)\n || indicatorContext.modelValue.value === true\n \"\n >\n <Primitive\n :as=\"as\"\n :as-child=\"asChild\"\n :data-state=\"getCheckedState(indicatorContext.modelValue.value)\"\n >\n <slot />\n </Primitive>\n </Presence>\n</template>\n"],"names":[],"mappings":";;;;;;AAkBa,MAAA,CAAC,8BAAgC,EAAA,+BAA+B,CACzE,GAAA,aAAA;AAAA,EACA,CAAC,oBAAoB,eAAe,CAAA;AAAA,EACpC;AACF;;;;;;;;;AAaF,IAAA,MAAM,mBAAmB,8BAA+B,CAAA;AAAA,MACtD,UAAA,EAAY,IAAI,KAAK;AAAA,KACtB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuRadioGroup.cjs","sources":["../../src/Menu/MenuRadioGroup.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type { MenuGroupProps } from './MenuGroup.vue'\nimport { createContext } from '@/shared'\n\ninterface MenuRadioGroupContext {\n modelValue: Ref<string>\n onValueChange: (payload: string) => void\n}\n\nexport interface MenuRadioGroupProps extends MenuGroupProps {\n /** The value of the selected item in the group. */\n modelValue?: string\n}\n\nexport type MenuRadioGroupEmits = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [payload: string]\n}\n\nexport const [injectMenuRadioGroupContext, provideMenuRadioGroupContext]\n = createContext<MenuRadioGroupContext>('MenuRadioGroup')\n</script>\n\n<script setup lang=\"ts\">\nimport { useVModel } from '@vueuse/core'\nimport MenuGroup from './MenuGroup.vue'\n\nconst props = withDefaults(defineProps<MenuRadioGroupProps>(), {\n modelValue: '',\n})\nconst emits = defineEmits<MenuRadioGroupEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current input values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits)\n\nprovideMenuRadioGroupContext({\n modelValue,\n onValueChange: (payload) => {\n modelValue.value = payload\n },\n})\n</script>\n\n<template>\n <MenuGroup v-bind=\"props\">\n <slot :model-value=\"modelValue\" />\n </MenuGroup>\n</template>\n"],"names":["createContext","useVModel"],"mappings":";;;;;;;AAoBO,MAAM,CAAC,2BAAA,EAA6B,4BAA4B,CAAA,GACnEA,mCAAqC,gBAAgB;;;;;;;;;;AAOzD,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAAC,cAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAK,CAAA;AAEvD,IAA6B,4BAAA,CAAA;AAAA,MAC3B,UAAA;AAAA,MACA,aAAA,EAAe,CAAC,OAAY,KAAA;AAC1B,QAAA,UAAA,CAAW,KAAQ,GAAA,OAAA;AAAA;AACrB,KACD,CAAA;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MenuRadioGroup.cjs","sources":["../../src/Menu/MenuRadioGroup.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type { MenuGroupProps } from './MenuGroup.vue'\nimport { createContext } from '@/shared'\n\ninterface MenuRadioGroupContext {\n modelValue: Ref<string>\n onValueChange: (payload: string) => void\n}\n\nexport interface MenuRadioGroupProps extends MenuGroupProps {\n /** The value of the selected item in the group. */\n modelValue?: string\n}\n\nexport type MenuRadioGroupEmits = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [payload: string]\n}\n\nexport const [injectMenuRadioGroupContext, provideMenuRadioGroupContext]\n = createContext<MenuRadioGroupContext>('MenuRadioGroup')\n</script>\n\n<script setup lang=\"ts\">\nimport { useVModel } from '@vueuse/core'\nimport MenuGroup from './MenuGroup.vue'\n\nconst props = withDefaults(defineProps<MenuRadioGroupProps>(), {\n modelValue: '',\n})\nconst emits = defineEmits<MenuRadioGroupEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current input values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits)\n\nprovideMenuRadioGroupContext({\n modelValue,\n onValueChange: (payload) => {\n modelValue.value = payload\n },\n})\n</script>\n\n<template>\n <MenuGroup v-bind=\"props\">\n <slot :model-value=\"modelValue\" />\n </MenuGroup>\n</template>\n"],"names":["createContext","useVModel"],"mappings":";;;;;;;AAoBO,MAAM,CAAC,2BAAA,EAA6B,4BAA4B,CAAA,GACnEA,mCAAqC,gBAAgB;;;;;;;;;;AAOzD,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAAC,cAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAK,CAAA;AAEvD,IAA6B,4BAAA,CAAA;AAAA,MAC3B,UAAA;AAAA,MACA,aAAA,EAAe,CAAC,OAAY,KAAA;AAC1B,QAAA,UAAA,CAAW,KAAQ,GAAA,OAAA;AAAA;AACrB,KACD,CAAA;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuRadioGroup.js","sources":["../../src/Menu/MenuRadioGroup.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type { MenuGroupProps } from './MenuGroup.vue'\nimport { createContext } from '@/shared'\n\ninterface MenuRadioGroupContext {\n modelValue: Ref<string>\n onValueChange: (payload: string) => void\n}\n\nexport interface MenuRadioGroupProps extends MenuGroupProps {\n /** The value of the selected item in the group. */\n modelValue?: string\n}\n\nexport type MenuRadioGroupEmits = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [payload: string]\n}\n\nexport const [injectMenuRadioGroupContext, provideMenuRadioGroupContext]\n = createContext<MenuRadioGroupContext>('MenuRadioGroup')\n</script>\n\n<script setup lang=\"ts\">\nimport { useVModel } from '@vueuse/core'\nimport MenuGroup from './MenuGroup.vue'\n\nconst props = withDefaults(defineProps<MenuRadioGroupProps>(), {\n modelValue: '',\n})\nconst emits = defineEmits<MenuRadioGroupEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current input values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits)\n\nprovideMenuRadioGroupContext({\n modelValue,\n onValueChange: (payload) => {\n modelValue.value = payload\n },\n})\n</script>\n\n<template>\n <MenuGroup v-bind=\"props\">\n <slot :model-value=\"modelValue\" />\n </MenuGroup>\n</template>\n"],"names":[],"mappings":";;;;;AAoBO,MAAM,CAAC,2BAAA,EAA6B,4BAA4B,CAAA,GACnE,cAAqC,gBAAgB;;;;;;;;;;AAOzD,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAA,SAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAK,CAAA;AAEvD,IAA6B,4BAAA,CAAA;AAAA,MAC3B,UAAA;AAAA,MACA,aAAA,EAAe,CAAC,OAAY,KAAA;AAC1B,QAAA,UAAA,CAAW,KAAQ,GAAA,OAAA;AAAA;AACrB,KACD,CAAA;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MenuRadioGroup.js","sources":["../../src/Menu/MenuRadioGroup.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Ref } from 'vue'\nimport type { MenuGroupProps } from './MenuGroup.vue'\nimport { createContext } from '@/shared'\n\ninterface MenuRadioGroupContext {\n modelValue: Ref<string>\n onValueChange: (payload: string) => void\n}\n\nexport interface MenuRadioGroupProps extends MenuGroupProps {\n /** The value of the selected item in the group. */\n modelValue?: string\n}\n\nexport type MenuRadioGroupEmits = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [payload: string]\n}\n\nexport const [injectMenuRadioGroupContext, provideMenuRadioGroupContext]\n = createContext<MenuRadioGroupContext>('MenuRadioGroup')\n</script>\n\n<script setup lang=\"ts\">\nimport { useVModel } from '@vueuse/core'\nimport MenuGroup from './MenuGroup.vue'\n\nconst props = withDefaults(defineProps<MenuRadioGroupProps>(), {\n modelValue: '',\n})\nconst emits = defineEmits<MenuRadioGroupEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current input values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits)\n\nprovideMenuRadioGroupContext({\n modelValue,\n onValueChange: (payload) => {\n modelValue.value = payload\n },\n})\n</script>\n\n<template>\n <MenuGroup v-bind=\"props\">\n <slot :model-value=\"modelValue\" />\n </MenuGroup>\n</template>\n"],"names":[],"mappings":";;;;;AAoBO,MAAM,CAAC,2BAAA,EAA6B,4BAA4B,CAAA,GACnE,cAAqC,gBAAgB;;;;;;;;;;AAOzD,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAA,SAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAK,CAAA;AAEvD,IAA6B,4BAAA,CAAA;AAAA,MAC3B,UAAA;AAAA,MACA,aAAA,EAAe,CAAC,OAAY,KAAA;AAC1B,QAAA,UAAA,CAAW,KAAQ,GAAA,OAAA;AAAA;AACrB,KACD,CAAA;;;;;;;;;;;;;;"}