react-aria-components 1.5.0 → 1.7.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 (428) hide show
  1. package/README.md +1 -1
  2. package/dist/Autocomplete.main.js +91 -0
  3. package/dist/Autocomplete.main.js.map +1 -0
  4. package/dist/Autocomplete.mjs +79 -0
  5. package/dist/Autocomplete.module.js +79 -0
  6. package/dist/Autocomplete.module.js.map +1 -0
  7. package/dist/Breadcrumbs.main.js +2 -5
  8. package/dist/Breadcrumbs.main.js.map +1 -1
  9. package/dist/Breadcrumbs.mjs +3 -6
  10. package/dist/Breadcrumbs.module.js +3 -6
  11. package/dist/Breadcrumbs.module.js.map +1 -1
  12. package/dist/Button.main.js +5 -5
  13. package/dist/Button.main.js.map +1 -1
  14. package/dist/Button.mjs +5 -5
  15. package/dist/Button.module.js +5 -5
  16. package/dist/Button.module.js.map +1 -1
  17. package/dist/Calendar.main.js +29 -28
  18. package/dist/Calendar.main.js.map +1 -1
  19. package/dist/Calendar.mjs +30 -29
  20. package/dist/Calendar.module.js +30 -29
  21. package/dist/Calendar.module.js.map +1 -1
  22. package/dist/Checkbox.main.js +6 -13
  23. package/dist/Checkbox.main.js.map +1 -1
  24. package/dist/Checkbox.mjs +7 -14
  25. package/dist/Checkbox.module.js +7 -14
  26. package/dist/Checkbox.module.js.map +1 -1
  27. package/dist/Collection.main.js.map +1 -1
  28. package/dist/Collection.module.js.map +1 -1
  29. package/dist/ColorArea.main.js +6 -9
  30. package/dist/ColorArea.main.js.map +1 -1
  31. package/dist/ColorArea.mjs +5 -8
  32. package/dist/ColorArea.module.js +5 -8
  33. package/dist/ColorArea.module.js.map +1 -1
  34. package/dist/ColorField.main.js +10 -15
  35. package/dist/ColorField.main.js.map +1 -1
  36. package/dist/ColorField.mjs +6 -11
  37. package/dist/ColorField.module.js +6 -11
  38. package/dist/ColorField.module.js.map +1 -1
  39. package/dist/ColorPicker.main.js +2 -2
  40. package/dist/ColorPicker.main.js.map +1 -1
  41. package/dist/ColorPicker.mjs +1 -1
  42. package/dist/ColorPicker.module.js +1 -1
  43. package/dist/ColorPicker.module.js.map +1 -1
  44. package/dist/ColorSlider.main.js +7 -12
  45. package/dist/ColorSlider.main.js.map +1 -1
  46. package/dist/ColorSlider.mjs +5 -10
  47. package/dist/ColorSlider.module.js +5 -10
  48. package/dist/ColorSlider.module.js.map +1 -1
  49. package/dist/ColorSwatch.main.js +4 -7
  50. package/dist/ColorSwatch.main.js.map +1 -1
  51. package/dist/ColorSwatch.mjs +3 -6
  52. package/dist/ColorSwatch.module.js +3 -6
  53. package/dist/ColorSwatch.module.js.map +1 -1
  54. package/dist/ColorSwatchPicker.main.js +7 -11
  55. package/dist/ColorSwatchPicker.main.js.map +1 -1
  56. package/dist/ColorSwatchPicker.mjs +6 -10
  57. package/dist/ColorSwatchPicker.module.js +6 -10
  58. package/dist/ColorSwatchPicker.module.js.map +1 -1
  59. package/dist/ColorThumb.main.js +4 -11
  60. package/dist/ColorThumb.main.js.map +1 -1
  61. package/dist/ColorThumb.mjs +4 -11
  62. package/dist/ColorThumb.module.js +4 -11
  63. package/dist/ColorThumb.module.js.map +1 -1
  64. package/dist/ColorWheel.main.js +9 -15
  65. package/dist/ColorWheel.main.js.map +1 -1
  66. package/dist/ColorWheel.mjs +8 -14
  67. package/dist/ColorWheel.module.js +8 -14
  68. package/dist/ColorWheel.module.js.map +1 -1
  69. package/dist/ComboBox.main.js +3 -6
  70. package/dist/ComboBox.main.js.map +1 -1
  71. package/dist/ComboBox.mjs +4 -7
  72. package/dist/ComboBox.module.js +4 -7
  73. package/dist/ComboBox.module.js.map +1 -1
  74. package/dist/DateField.main.js +12 -26
  75. package/dist/DateField.main.js.map +1 -1
  76. package/dist/DateField.mjs +13 -27
  77. package/dist/DateField.module.js +13 -27
  78. package/dist/DateField.module.js.map +1 -1
  79. package/dist/DatePicker.main.js +6 -13
  80. package/dist/DatePicker.main.js.map +1 -1
  81. package/dist/DatePicker.mjs +7 -14
  82. package/dist/DatePicker.module.js +7 -14
  83. package/dist/DatePicker.module.js.map +1 -1
  84. package/dist/Dialog.main.js +4 -6
  85. package/dist/Dialog.main.js.map +1 -1
  86. package/dist/Dialog.mjs +5 -7
  87. package/dist/Dialog.module.js +5 -7
  88. package/dist/Dialog.module.js.map +1 -1
  89. package/dist/Disclosure.main.js +11 -23
  90. package/dist/Disclosure.main.js.map +1 -1
  91. package/dist/Disclosure.mjs +8 -20
  92. package/dist/Disclosure.module.js +8 -20
  93. package/dist/Disclosure.module.js.map +1 -1
  94. package/dist/DragAndDrop.main.js +2 -5
  95. package/dist/DragAndDrop.main.js.map +1 -1
  96. package/dist/DragAndDrop.mjs +3 -6
  97. package/dist/DragAndDrop.module.js +3 -6
  98. package/dist/DragAndDrop.module.js.map +1 -1
  99. package/dist/DropZone.main.js +3 -8
  100. package/dist/DropZone.main.js.map +1 -1
  101. package/dist/DropZone.mjs +4 -9
  102. package/dist/DropZone.module.js +4 -9
  103. package/dist/DropZone.module.js.map +1 -1
  104. package/dist/FieldError.main.js +2 -5
  105. package/dist/FieldError.main.js.map +1 -1
  106. package/dist/FieldError.mjs +3 -6
  107. package/dist/FieldError.module.js +3 -6
  108. package/dist/FieldError.module.js.map +1 -1
  109. package/dist/FileTrigger.main.js +2 -5
  110. package/dist/FileTrigger.main.js.map +1 -1
  111. package/dist/FileTrigger.mjs +2 -5
  112. package/dist/FileTrigger.module.js +2 -5
  113. package/dist/FileTrigger.module.js.map +1 -1
  114. package/dist/Form.main.js +2 -6
  115. package/dist/Form.main.js.map +1 -1
  116. package/dist/Form.mjs +2 -6
  117. package/dist/Form.module.js +2 -6
  118. package/dist/Form.module.js.map +1 -1
  119. package/dist/GridList.main.js +2 -6
  120. package/dist/GridList.main.js.map +1 -1
  121. package/dist/GridList.mjs +3 -7
  122. package/dist/GridList.module.js +3 -7
  123. package/dist/GridList.module.js.map +1 -1
  124. package/dist/Group.main.js +2 -5
  125. package/dist/Group.main.js.map +1 -1
  126. package/dist/Group.mjs +2 -5
  127. package/dist/Group.module.js +2 -5
  128. package/dist/Group.module.js.map +1 -1
  129. package/dist/Heading.main.js +2 -3
  130. package/dist/Heading.main.js.map +1 -1
  131. package/dist/Heading.mjs +2 -3
  132. package/dist/Heading.module.js +2 -3
  133. package/dist/Heading.module.js.map +1 -1
  134. package/dist/Input.main.js +2 -5
  135. package/dist/Input.main.js.map +1 -1
  136. package/dist/Input.mjs +2 -5
  137. package/dist/Input.module.js +2 -5
  138. package/dist/Input.module.js.map +1 -1
  139. package/dist/Keyboard.main.js +2 -3
  140. package/dist/Keyboard.main.js.map +1 -1
  141. package/dist/Keyboard.mjs +2 -3
  142. package/dist/Keyboard.module.js +2 -3
  143. package/dist/Keyboard.module.js.map +1 -1
  144. package/dist/Label.main.js +2 -3
  145. package/dist/Label.main.js.map +1 -1
  146. package/dist/Label.mjs +2 -3
  147. package/dist/Label.module.js +2 -3
  148. package/dist/Label.module.js.map +1 -1
  149. package/dist/Link.main.js +2 -6
  150. package/dist/Link.main.js.map +1 -1
  151. package/dist/Link.mjs +2 -6
  152. package/dist/Link.module.js +2 -6
  153. package/dist/Link.module.js.map +1 -1
  154. package/dist/ListBox.main.js +23 -11
  155. package/dist/ListBox.main.js.map +1 -1
  156. package/dist/ListBox.mjs +27 -15
  157. package/dist/ListBox.module.js +27 -15
  158. package/dist/ListBox.module.js.map +1 -1
  159. package/dist/Menu.main.js +56 -33
  160. package/dist/Menu.main.js.map +1 -1
  161. package/dist/Menu.mjs +58 -35
  162. package/dist/Menu.module.js +58 -35
  163. package/dist/Menu.module.js.map +1 -1
  164. package/dist/Meter.main.js +3 -6
  165. package/dist/Meter.main.js.map +1 -1
  166. package/dist/Meter.mjs +3 -6
  167. package/dist/Meter.module.js +3 -6
  168. package/dist/Meter.module.js.map +1 -1
  169. package/dist/Modal.main.js +7 -10
  170. package/dist/Modal.main.js.map +1 -1
  171. package/dist/Modal.mjs +10 -13
  172. package/dist/Modal.module.js +10 -13
  173. package/dist/Modal.module.js.map +1 -1
  174. package/dist/NumberField.main.js +6 -7
  175. package/dist/NumberField.main.js.map +1 -1
  176. package/dist/NumberField.mjs +7 -8
  177. package/dist/NumberField.module.js +7 -8
  178. package/dist/NumberField.module.js.map +1 -1
  179. package/dist/OverlayArrow.main.js +2 -6
  180. package/dist/OverlayArrow.main.js.map +1 -1
  181. package/dist/OverlayArrow.mjs +2 -6
  182. package/dist/OverlayArrow.module.js +2 -6
  183. package/dist/OverlayArrow.module.js.map +1 -1
  184. package/dist/Popover.main.js +71 -22
  185. package/dist/Popover.main.js.map +1 -1
  186. package/dist/Popover.mjs +75 -26
  187. package/dist/Popover.module.js +75 -26
  188. package/dist/Popover.module.js.map +1 -1
  189. package/dist/ProgressBar.main.js +3 -7
  190. package/dist/ProgressBar.main.js.map +1 -1
  191. package/dist/ProgressBar.mjs +3 -7
  192. package/dist/ProgressBar.module.js +3 -7
  193. package/dist/ProgressBar.module.js.map +1 -1
  194. package/dist/RadioGroup.main.js +5 -11
  195. package/dist/RadioGroup.main.js.map +1 -1
  196. package/dist/RadioGroup.mjs +5 -11
  197. package/dist/RadioGroup.module.js +5 -11
  198. package/dist/RadioGroup.module.js.map +1 -1
  199. package/dist/SearchField.main.js +9 -9
  200. package/dist/SearchField.main.js.map +1 -1
  201. package/dist/SearchField.mjs +11 -11
  202. package/dist/SearchField.module.js +11 -11
  203. package/dist/SearchField.module.js.map +1 -1
  204. package/dist/Select.main.js +9 -14
  205. package/dist/Select.main.js.map +1 -1
  206. package/dist/Select.mjs +10 -15
  207. package/dist/Select.module.js +10 -15
  208. package/dist/Select.module.js.map +1 -1
  209. package/dist/Slider.main.js +10 -22
  210. package/dist/Slider.main.js.map +1 -1
  211. package/dist/Slider.mjs +11 -23
  212. package/dist/Slider.module.js +11 -23
  213. package/dist/Slider.module.js.map +1 -1
  214. package/dist/Switch.main.js +2 -5
  215. package/dist/Switch.main.js.map +1 -1
  216. package/dist/Switch.mjs +2 -5
  217. package/dist/Switch.module.js +2 -5
  218. package/dist/Switch.module.js.map +1 -1
  219. package/dist/Table.main.js +21 -18
  220. package/dist/Table.main.js.map +1 -1
  221. package/dist/Table.mjs +22 -19
  222. package/dist/Table.module.js +22 -19
  223. package/dist/Table.module.js.map +1 -1
  224. package/dist/TableLayout.main.js.map +1 -1
  225. package/dist/TableLayout.module.js.map +1 -1
  226. package/dist/Tabs.main.js +12 -19
  227. package/dist/Tabs.main.js.map +1 -1
  228. package/dist/Tabs.mjs +15 -22
  229. package/dist/Tabs.module.js +15 -22
  230. package/dist/Tabs.module.js.map +1 -1
  231. package/dist/TagGroup.main.js +5 -11
  232. package/dist/TagGroup.main.js.map +1 -1
  233. package/dist/TagGroup.mjs +6 -12
  234. package/dist/TagGroup.module.js +6 -12
  235. package/dist/TagGroup.module.js.map +1 -1
  236. package/dist/Text.main.js +2 -3
  237. package/dist/Text.main.js.map +1 -1
  238. package/dist/Text.mjs +2 -3
  239. package/dist/Text.module.js +2 -3
  240. package/dist/Text.module.js.map +1 -1
  241. package/dist/TextArea.main.js +2 -5
  242. package/dist/TextArea.main.js.map +1 -1
  243. package/dist/TextArea.mjs +2 -5
  244. package/dist/TextArea.module.js +2 -5
  245. package/dist/TextArea.module.js.map +1 -1
  246. package/dist/TextField.main.js +12 -10
  247. package/dist/TextField.main.js.map +1 -1
  248. package/dist/TextField.mjs +14 -12
  249. package/dist/TextField.module.js +14 -12
  250. package/dist/TextField.module.js.map +1 -1
  251. package/dist/Toast.main.js +148 -0
  252. package/dist/Toast.main.js.map +1 -0
  253. package/dist/Toast.mjs +137 -0
  254. package/dist/Toast.module.js +137 -0
  255. package/dist/Toast.module.js.map +1 -0
  256. package/dist/ToggleButton.main.js +2 -5
  257. package/dist/ToggleButton.main.js.map +1 -1
  258. package/dist/ToggleButton.mjs +3 -6
  259. package/dist/ToggleButton.module.js +3 -6
  260. package/dist/ToggleButton.module.js.map +1 -1
  261. package/dist/ToggleButtonGroup.main.js +2 -5
  262. package/dist/ToggleButtonGroup.main.js.map +1 -1
  263. package/dist/ToggleButtonGroup.mjs +2 -5
  264. package/dist/ToggleButtonGroup.module.js +2 -5
  265. package/dist/ToggleButtonGroup.module.js.map +1 -1
  266. package/dist/Toolbar.main.js +2 -6
  267. package/dist/Toolbar.main.js.map +1 -1
  268. package/dist/Toolbar.mjs +2 -6
  269. package/dist/Toolbar.module.js +2 -6
  270. package/dist/Toolbar.module.js.map +1 -1
  271. package/dist/Tooltip.main.js +4 -7
  272. package/dist/Tooltip.main.js.map +1 -1
  273. package/dist/Tooltip.mjs +7 -10
  274. package/dist/Tooltip.module.js +7 -10
  275. package/dist/Tooltip.module.js.map +1 -1
  276. package/dist/Tree.main.js +39 -39
  277. package/dist/Tree.main.js.map +1 -1
  278. package/dist/Tree.mjs +36 -36
  279. package/dist/Tree.module.js +36 -36
  280. package/dist/Tree.module.js.map +1 -1
  281. package/dist/Virtualizer.main.js +4 -1
  282. package/dist/Virtualizer.main.js.map +1 -1
  283. package/dist/Virtualizer.mjs +4 -1
  284. package/dist/Virtualizer.module.js +4 -1
  285. package/dist/Virtualizer.module.js.map +1 -1
  286. package/dist/import.mjs +10 -6
  287. package/dist/main.js +34 -14
  288. package/dist/main.js.map +1 -1
  289. package/dist/module.js +10 -6
  290. package/dist/module.js.map +1 -1
  291. package/dist/types.d.ts +369 -259
  292. package/dist/types.d.ts.map +1 -1
  293. package/dist/utils.main.js +9 -68
  294. package/dist/utils.main.js.map +1 -1
  295. package/dist/utils.mjs +10 -67
  296. package/dist/utils.module.js +10 -67
  297. package/dist/utils.module.js.map +1 -1
  298. package/i18n/ar-AE.js +1 -1
  299. package/i18n/ar-AE.mjs +1 -1
  300. package/i18n/bg-BG.js +1 -1
  301. package/i18n/bg-BG.mjs +1 -1
  302. package/i18n/cs-CZ.js +1 -1
  303. package/i18n/cs-CZ.mjs +1 -1
  304. package/i18n/da-DK.js +1 -1
  305. package/i18n/da-DK.mjs +1 -1
  306. package/i18n/de-DE.js +1 -1
  307. package/i18n/de-DE.mjs +1 -1
  308. package/i18n/el-GR.js +1 -1
  309. package/i18n/el-GR.mjs +1 -1
  310. package/i18n/en-US.js +1 -1
  311. package/i18n/en-US.mjs +1 -1
  312. package/i18n/es-ES.js +1 -1
  313. package/i18n/es-ES.mjs +1 -1
  314. package/i18n/et-EE.js +1 -1
  315. package/i18n/et-EE.mjs +1 -1
  316. package/i18n/fi-FI.js +1 -1
  317. package/i18n/fi-FI.mjs +1 -1
  318. package/i18n/fr-FR.js +1 -1
  319. package/i18n/fr-FR.mjs +1 -1
  320. package/i18n/he-IL.js +1 -1
  321. package/i18n/he-IL.mjs +1 -1
  322. package/i18n/hr-HR.js +1 -1
  323. package/i18n/hr-HR.mjs +1 -1
  324. package/i18n/hu-HU.js +1 -1
  325. package/i18n/hu-HU.mjs +1 -1
  326. package/i18n/index.js +1 -1
  327. package/i18n/index.mjs +1 -1
  328. package/i18n/it-IT.js +1 -1
  329. package/i18n/it-IT.mjs +1 -1
  330. package/i18n/ja-JP.js +1 -1
  331. package/i18n/ja-JP.mjs +1 -1
  332. package/i18n/ko-KR.js +1 -1
  333. package/i18n/ko-KR.mjs +1 -1
  334. package/i18n/lt-LT.js +1 -1
  335. package/i18n/lt-LT.mjs +1 -1
  336. package/i18n/lv-LV.js +1 -1
  337. package/i18n/lv-LV.mjs +1 -1
  338. package/i18n/nb-NO.js +1 -1
  339. package/i18n/nb-NO.mjs +1 -1
  340. package/i18n/nl-NL.js +1 -1
  341. package/i18n/nl-NL.mjs +1 -1
  342. package/i18n/pl-PL.js +1 -1
  343. package/i18n/pl-PL.mjs +1 -1
  344. package/i18n/pt-BR.js +1 -1
  345. package/i18n/pt-BR.mjs +1 -1
  346. package/i18n/pt-PT.js +1 -1
  347. package/i18n/pt-PT.mjs +1 -1
  348. package/i18n/ro-RO.js +1 -1
  349. package/i18n/ro-RO.mjs +1 -1
  350. package/i18n/ru-RU.js +1 -1
  351. package/i18n/ru-RU.mjs +1 -1
  352. package/i18n/sk-SK.js +1 -1
  353. package/i18n/sk-SK.mjs +1 -1
  354. package/i18n/sl-SI.js +1 -1
  355. package/i18n/sl-SI.mjs +1 -1
  356. package/i18n/sr-SP.js +1 -1
  357. package/i18n/sr-SP.mjs +1 -1
  358. package/i18n/sv-SE.js +1 -1
  359. package/i18n/sv-SE.mjs +1 -1
  360. package/i18n/tr-TR.js +1 -1
  361. package/i18n/tr-TR.mjs +1 -1
  362. package/i18n/uk-UA.js +1 -1
  363. package/i18n/uk-UA.mjs +1 -1
  364. package/i18n/zh-CN.js +1 -1
  365. package/i18n/zh-CN.mjs +1 -1
  366. package/i18n/zh-TW.js +1 -1
  367. package/i18n/zh-TW.mjs +1 -1
  368. package/package.json +26 -29
  369. package/src/Autocomplete.tsx +75 -0
  370. package/src/Breadcrumbs.tsx +5 -8
  371. package/src/Button.tsx +8 -8
  372. package/src/Calendar.tsx +35 -39
  373. package/src/Checkbox.tsx +14 -18
  374. package/src/Collection.tsx +2 -2
  375. package/src/ColorArea.tsx +7 -11
  376. package/src/ColorField.tsx +13 -14
  377. package/src/ColorPicker.tsx +1 -2
  378. package/src/ColorSlider.tsx +10 -13
  379. package/src/ColorSwatch.tsx +7 -10
  380. package/src/ColorSwatchPicker.tsx +8 -14
  381. package/src/ColorThumb.tsx +7 -12
  382. package/src/ColorWheel.tsx +12 -18
  383. package/src/ComboBox.tsx +8 -9
  384. package/src/DateField.tsx +29 -36
  385. package/src/DatePicker.tsx +15 -17
  386. package/src/Dialog.tsx +11 -10
  387. package/src/Disclosure.tsx +18 -28
  388. package/src/DragAndDrop.tsx +5 -8
  389. package/src/DropZone.tsx +6 -10
  390. package/src/FieldError.tsx +5 -8
  391. package/src/FileTrigger.tsx +5 -8
  392. package/src/Form.tsx +6 -9
  393. package/src/GridList.tsx +11 -9
  394. package/src/Group.tsx +6 -8
  395. package/src/Heading.tsx +2 -5
  396. package/src/Input.tsx +5 -8
  397. package/src/Keyboard.tsx +2 -5
  398. package/src/Label.tsx +2 -5
  399. package/src/Link.tsx +6 -9
  400. package/src/ListBox.tsx +19 -16
  401. package/src/Menu.tsx +71 -42
  402. package/src/Meter.tsx +8 -9
  403. package/src/Modal.tsx +7 -10
  404. package/src/NumberField.tsx +16 -10
  405. package/src/OverlayArrow.tsx +6 -9
  406. package/src/Popover.tsx +84 -35
  407. package/src/ProgressBar.tsx +9 -10
  408. package/src/RadioGroup.tsx +13 -17
  409. package/src/SearchField.tsx +14 -14
  410. package/src/Select.tsx +17 -19
  411. package/src/Slider.tsx +26 -34
  412. package/src/Switch.tsx +5 -8
  413. package/src/Table.tsx +45 -34
  414. package/src/TableLayout.ts +1 -1
  415. package/src/Tabs.tsx +24 -28
  416. package/src/TagGroup.tsx +11 -15
  417. package/src/Text.tsx +2 -5
  418. package/src/TextArea.tsx +5 -7
  419. package/src/TextField.tsx +16 -16
  420. package/src/Toast.tsx +184 -0
  421. package/src/ToggleButton.tsx +5 -8
  422. package/src/ToggleButtonGroup.tsx +5 -8
  423. package/src/Toolbar.tsx +6 -9
  424. package/src/Tooltip.tsx +7 -10
  425. package/src/Tree.tsx +72 -57
  426. package/src/Virtualizer.tsx +18 -3
  427. package/src/index.ts +17 -15
  428. package/src/utils.tsx +8 -81
package/src/GridList.tsx CHANGED
@@ -57,6 +57,11 @@ export interface GridListRenderProps {
57
57
  }
58
58
 
59
59
  export interface GridListProps<T> extends Omit<AriaGridListProps<T>, 'children'>, CollectionProps<T>, StyleRenderProps<GridListRenderProps>, SlotProps, ScrollableProps<HTMLDivElement> {
60
+ /**
61
+ * Whether typeahead navigation is disabled.
62
+ * @default false
63
+ */
64
+ disallowTypeAhead?: boolean,
60
65
  /** How multiple selection should behave in the collection. */
61
66
  selectionBehavior?: SelectionBehavior,
62
67
  /** The drag and drop hooks returned by `useDragAndDrop` used to enable drag and drop behavior for the GridList. */
@@ -73,7 +78,11 @@ export interface GridListProps<T> extends Omit<AriaGridListProps<T>, 'children'>
73
78
 
74
79
  export const GridListContext = createContext<ContextValue<GridListProps<any>, HTMLDivElement>>(null);
75
80
 
76
- function GridList<T extends object>(props: GridListProps<T>, ref: ForwardedRef<HTMLDivElement>) {
81
+ /**
82
+ * A grid list displays a list of interactive items, with support for keyboard navigation,
83
+ * single or multiple selection, and row actions.
84
+ */
85
+ export const GridList = /*#__PURE__*/ (forwardRef as forwardRefType)(function GridList<T extends object>(props: GridListProps<T>, ref: ForwardedRef<HTMLDivElement>) {
77
86
  // Render the portal first so that we have the collection by the time we render the DOM in SSR.
78
87
  [props, ref] = useContextProps(props, ref, GridListContext);
79
88
 
@@ -82,7 +91,7 @@ function GridList<T extends object>(props: GridListProps<T>, ref: ForwardedRef<H
82
91
  {collection => <GridListInner props={props} collection={collection} gridListRef={ref} />}
83
92
  </CollectionBuilder>
84
93
  );
85
- }
94
+ });
86
95
 
87
96
  interface GridListInnerProps<T extends object> {
88
97
  props: GridListProps<T>,
@@ -243,13 +252,6 @@ function GridListInner<T extends object>({props, collection, gridListRef: ref}:
243
252
  );
244
253
  }
245
254
 
246
- /**
247
- * A grid list displays a list of interactive items, with support for keyboard navigation,
248
- * single or multiple selection, and row actions.
249
- */
250
- const _GridList = /*#__PURE__*/ (forwardRef as forwardRefType)(GridList);
251
- export {_GridList as GridList};
252
-
253
255
  export interface GridListItemRenderProps extends ItemRenderProps {}
254
256
 
255
257
  export interface GridListItemProps<T = object> extends RenderProps<GridListItemRenderProps>, LinkDOMProps, HoverEvents {
package/src/Group.tsx CHANGED
@@ -60,7 +60,10 @@ export interface GroupProps extends AriaLabelingProps, Omit<HTMLAttributes<HTMLE
60
60
 
61
61
  export const GroupContext = createContext<ContextValue<GroupProps, HTMLDivElement>>({});
62
62
 
63
- function Group(props: GroupProps, ref: ForwardedRef<HTMLDivElement>) {
63
+ /**
64
+ * A group represents a set of related UI controls, and supports interactive states for styling.
65
+ */
66
+ export const Group = /*#__PURE__*/ (forwardRef as forwardRefType)(function Group(props: GroupProps, ref: ForwardedRef<HTMLDivElement>) {
64
67
  [props, ref] = useContextProps(props, ref, GroupContext);
65
68
  let {isDisabled, isInvalid, onHoverStart, onHoverChange, onHoverEnd, ...otherProps} = props;
66
69
 
@@ -71,6 +74,7 @@ function Group(props: GroupProps, ref: ForwardedRef<HTMLDivElement>) {
71
74
 
72
75
  isDisabled ??= !!props['aria-disabled'] && props['aria-disabled'] !== 'false';
73
76
  isInvalid ??= !!props['aria-invalid'] && props['aria-invalid'] !== 'false';
77
+
74
78
  let renderProps = useRenderProps({
75
79
  ...props,
76
80
  values: {isHovered, isFocusWithin: isFocused, isFocusVisible, isDisabled, isInvalid},
@@ -92,10 +96,4 @@ function Group(props: GroupProps, ref: ForwardedRef<HTMLDivElement>) {
92
96
  {renderProps.children}
93
97
  </div>
94
98
  );
95
- }
96
-
97
- /**
98
- * A group represents a set of related UI controls, and supports interactive states for styling.
99
- */
100
- const _Group = /*#__PURE__*/ (forwardRef as forwardRefType)(Group);
101
- export {_Group as Group};
99
+ });
package/src/Heading.tsx CHANGED
@@ -18,7 +18,7 @@ export interface HeadingProps extends HTMLAttributes<HTMLElement> {
18
18
  level?: number
19
19
  }
20
20
 
21
- function Heading(props: HeadingProps, ref: ForwardedRef<HTMLHeadingElement>) {
21
+ export const Heading = forwardRef(function Heading(props: HeadingProps, ref: ForwardedRef<HTMLHeadingElement>) {
22
22
  [props, ref] = useContextProps(props, ref, HeadingContext);
23
23
  let {children, level = 3, className, ...domProps} = props;
24
24
  let Element = `h${level}` as ElementType;
@@ -28,7 +28,4 @@ function Heading(props: HeadingProps, ref: ForwardedRef<HTMLHeadingElement>) {
28
28
  {children}
29
29
  </Element>
30
30
  );
31
- }
32
-
33
- const _Heading = forwardRef(Heading);
34
- export {_Heading as Heading};
31
+ });
package/src/Input.tsx CHANGED
@@ -53,7 +53,10 @@ let filterHoverProps = (props: InputProps) => {
53
53
  return otherProps;
54
54
  };
55
55
 
56
- function Input(props: InputProps, ref: ForwardedRef<HTMLInputElement>) {
56
+ /**
57
+ * An input allows a user to input text.
58
+ */
59
+ export const Input = /*#__PURE__*/ createHideableComponent(function Input(props: InputProps, ref: ForwardedRef<HTMLInputElement>) {
57
60
  [props, ref] = useContextProps(props, ref, InputContext);
58
61
 
59
62
  let {hoverProps, isHovered} = useHover(props);
@@ -86,10 +89,4 @@ function Input(props: InputProps, ref: ForwardedRef<HTMLInputElement>) {
86
89
  data-focus-visible={isFocusVisible || undefined}
87
90
  data-invalid={isInvalid || undefined} />
88
91
  );
89
- }
90
-
91
- /**
92
- * An input allows a user to input text.
93
- */
94
- const _Input = /*#__PURE__*/ createHideableComponent(Input);
95
- export {_Input as Input};
92
+ });
package/src/Keyboard.tsx CHANGED
@@ -15,10 +15,7 @@ import React, {createContext, ForwardedRef, forwardRef, HTMLAttributes} from 're
15
15
 
16
16
  export const KeyboardContext = createContext<ContextValue<HTMLAttributes<HTMLElement>, HTMLElement>>({});
17
17
 
18
- function Keyboard(props: HTMLAttributes<HTMLElement>, ref: ForwardedRef<HTMLElement>) {
18
+ export const Keyboard = forwardRef(function Keyboard(props: HTMLAttributes<HTMLElement>, ref: ForwardedRef<HTMLElement>) {
19
19
  [props, ref] = useContextProps(props, ref, KeyboardContext);
20
20
  return <kbd dir="ltr" {...props} ref={ref} />;
21
- }
22
-
23
- const _Keyboard = forwardRef(Keyboard);
24
- export {_Keyboard as Keyboard};
21
+ });
package/src/Label.tsx CHANGED
@@ -20,12 +20,9 @@ export interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {
20
20
 
21
21
  export const LabelContext = createContext<ContextValue<LabelProps, HTMLLabelElement>>({});
22
22
 
23
- function Label(props: LabelProps, ref: ForwardedRef<HTMLLabelElement>) {
23
+ export const Label = /*#__PURE__*/ createHideableComponent(function Label(props: LabelProps, ref: ForwardedRef<HTMLLabelElement>) {
24
24
  [props, ref] = useContextProps(props, ref, LabelContext);
25
25
  let {elementType: ElementType = 'label', ...labelProps} = props;
26
26
  // @ts-ignore
27
27
  return <ElementType className="react-aria-Label" {...labelProps} ref={ref} />;
28
- }
29
-
30
- const _Label = /*#__PURE__*/ createHideableComponent(Label);
31
- export {_Label as Label};
28
+ });
package/src/Link.tsx CHANGED
@@ -52,7 +52,11 @@ export interface LinkRenderProps {
52
52
 
53
53
  export const LinkContext = createContext<ContextValue<LinkProps, HTMLAnchorElement>>(null);
54
54
 
55
- function Link(props: LinkProps, ref: ForwardedRef<HTMLAnchorElement>) {
55
+ /**
56
+ * A link allows a user to navigate to another page or resource within a web page
57
+ * or application.
58
+ */
59
+ export const Link = /*#__PURE__*/ (forwardRef as forwardRefType)(function Link(props: LinkProps, ref: ForwardedRef<HTMLAnchorElement>) {
56
60
  [props, ref] = useContextProps(props, ref, LinkContext);
57
61
 
58
62
  let ElementType: ElementType = props.href && !props.isDisabled ? 'a' : 'span';
@@ -88,11 +92,4 @@ function Link(props: LinkProps, ref: ForwardedRef<HTMLAnchorElement>) {
88
92
  {renderProps.children}
89
93
  </ElementType>
90
94
  );
91
- }
92
-
93
- /**
94
- * A link allows a user to navigate to another page or resource within a web page
95
- * or application.
96
- */
97
- const _Link = /*#__PURE__*/ (forwardRef as forwardRefType)(Link);
98
- export {_Link as Link};
95
+ });
package/src/ListBox.tsx CHANGED
@@ -13,16 +13,17 @@
13
13
  import {AriaListBoxOptions, AriaListBoxProps, DraggableItemResult, DragPreviewRenderer, DroppableCollectionResult, DroppableItemResult, FocusScope, ListKeyboardDelegate, mergeProps, useCollator, useFocusRing, useHover, useListBox, useListBoxSection, useLocale, useOption} from 'react-aria';
14
14
  import {Collection, CollectionBuilder, createBranchComponent, createLeafComponent} from '@react-aria/collections';
15
15
  import {CollectionProps, CollectionRendererContext, ItemRenderProps, SectionContext, SectionProps} from './Collection';
16
- import {ContextValue, Provider, RenderProps, ScrollableProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps, useSlot} from './utils';
16
+ import {ContextValue, DEFAULT_SLOT, Provider, RenderProps, ScrollableProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps, useSlot} from './utils';
17
17
  import {DragAndDropContext, DropIndicatorContext, DropIndicatorProps, useDndPersistedKeys, useRenderDropIndicator} from './DragAndDrop';
18
18
  import {DragAndDropHooks} from './useDragAndDrop';
19
- import {DraggableCollectionState, DroppableCollectionState, ListState, Node, Orientation, SelectionBehavior, useListState} from 'react-stately';
20
- import {filterDOMProps, useObjectRef} from '@react-aria/utils';
19
+ import {DraggableCollectionState, DroppableCollectionState, ListState, Node, Orientation, SelectionBehavior, UNSTABLE_useFilteredListState, useListState} from 'react-stately';
20
+ import {filterDOMProps, mergeRefs, useObjectRef} from '@react-aria/utils';
21
21
  import {forwardRefType, HoverEvents, Key, LinkDOMProps, RefObject} from '@react-types/shared';
22
22
  import {HeaderContext} from './Header';
23
23
  import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useEffect, useMemo, useRef} from 'react';
24
24
  import {SeparatorContext} from './Separator';
25
25
  import {TextContext} from './Text';
26
+ import {UNSTABLE_InternalAutocompleteContext} from './Autocomplete';
26
27
 
27
28
  export interface ListBoxRenderProps {
28
29
  /**
@@ -79,7 +80,10 @@ export interface ListBoxProps<T> extends Omit<AriaListBoxProps<T>, 'children' |
79
80
  export const ListBoxContext = createContext<ContextValue<ListBoxProps<any>, HTMLDivElement>>(null);
80
81
  export const ListStateContext = createContext<ListState<any> | null>(null);
81
82
 
82
- function ListBox<T extends object>(props: ListBoxProps<T>, ref: ForwardedRef<HTMLDivElement>) {
83
+ /**
84
+ * A listbox displays a list of options and allows a user to select one or more of them.
85
+ */
86
+ export const ListBox = /*#__PURE__*/ (forwardRef as forwardRefType)(function ListBox<T extends object>(props: ListBoxProps<T>, ref: ForwardedRef<HTMLDivElement>) {
83
87
  [props, ref] = useContextProps(props, ref, ListBoxContext);
84
88
  let state = useContext(ListStateContext);
85
89
 
@@ -98,7 +102,7 @@ function ListBox<T extends object>(props: ListBoxProps<T>, ref: ForwardedRef<HTM
98
102
  {collection => <StandaloneListBox props={props} listBoxRef={ref} collection={collection} />}
99
103
  </CollectionBuilder>
100
104
  );
101
- }
105
+ });
102
106
 
103
107
  function StandaloneListBox({props, listBoxRef, collection}) {
104
108
  props = {...props, collection, children: null, items: null};
@@ -107,20 +111,19 @@ function StandaloneListBox({props, listBoxRef, collection}) {
107
111
  return <ListBoxInner state={state} props={props} listBoxRef={listBoxRef} />;
108
112
  }
109
113
 
110
- /**
111
- * A listbox displays a list of options and allows a user to select one or more of them.
112
- */
113
- const _ListBox = /*#__PURE__*/ (forwardRef as forwardRefType)(ListBox);
114
- export {_ListBox as ListBox};
115
-
116
114
  interface ListBoxInnerProps<T> {
117
115
  state: ListState<T>,
118
116
  props: ListBoxProps<T> & AriaListBoxOptions<T>,
119
117
  listBoxRef: RefObject<HTMLDivElement | null>
120
118
  }
121
119
 
122
- function ListBoxInner<T extends object>({state, props, listBoxRef}: ListBoxInnerProps<T>) {
120
+ function ListBoxInner<T extends object>({state: inputState, props, listBoxRef}: ListBoxInnerProps<T>) {
121
+ let {filter, collectionProps, collectionRef} = useContext(UNSTABLE_InternalAutocompleteContext) || {};
122
+ props = useMemo(() => collectionProps ? ({...props, ...collectionProps}) : props, [props, collectionProps]);
123
123
  let {dragAndDropHooks, layout = 'stack', orientation = 'vertical'} = props;
124
+ // Memoed so that useAutocomplete callback ref is properly only called once on mount and not everytime a rerender happens
125
+ listBoxRef = useObjectRef(useMemo(() => mergeRefs(listBoxRef, collectionRef !== undefined ? collectionRef as RefObject<HTMLDivElement> : null), [collectionRef, listBoxRef]));
126
+ let state = UNSTABLE_useFilteredListState(inputState, filter);
124
127
  let {collection, selectionManager} = state;
125
128
  let isListDraggable = !!dragAndDropHooks?.useDraggableCollectionState;
126
129
  let isListDroppable = !!dragAndDropHooks?.useDroppableCollectionState;
@@ -246,7 +249,7 @@ function ListBoxInner<T extends object>({state, props, listBoxRef}: ListBoxInner
246
249
  [DragAndDropContext, {dragAndDropHooks, dragState, dropState}],
247
250
  [SeparatorContext, {elementType: 'div'}],
248
251
  [DropIndicatorContext, {render: ListBoxDropIndicatorWrapper}],
249
- [SectionContext, {name: 'ListBoxSection', render: ListBoxSection}]
252
+ [SectionContext, {name: 'ListBoxSection', render: ListBoxSectionInner}]
250
253
  ]}>
251
254
  <CollectionRoot
252
255
  collection={collection}
@@ -263,7 +266,7 @@ function ListBoxInner<T extends object>({state, props, listBoxRef}: ListBoxInner
263
266
 
264
267
  export interface ListBoxSectionProps<T> extends SectionProps<T> {}
265
268
 
266
- function ListBoxSection<T extends object>(props: ListBoxSectionProps<T>, ref: ForwardedRef<HTMLElement>, section: Node<T>, className = 'react-aria-ListBoxSection') {
269
+ function ListBoxSectionInner<T extends object>(props: ListBoxSectionProps<T>, ref: ForwardedRef<HTMLElement>, section: Node<T>, className = 'react-aria-ListBoxSection') {
267
270
  let state = useContext(ListStateContext)!;
268
271
  let {dragAndDropHooks, dropState} = useContext(DragAndDropContext)!;
269
272
  let {CollectionBranch} = useContext(CollectionRendererContext);
@@ -298,8 +301,7 @@ function ListBoxSection<T extends object>(props: ListBoxSectionProps<T>, ref: Fo
298
301
  /**
299
302
  * A ListBoxSection represents a section within a ListBox.
300
303
  */
301
- const _ListBoxSection = /*#__PURE__*/ createBranchComponent('section', ListBoxSection);
302
- export {_ListBoxSection as ListBoxSection};
304
+ export const ListBoxSection = /*#__PURE__*/ createBranchComponent('section', ListBoxSectionInner);
303
305
 
304
306
  export interface ListBoxItemRenderProps extends ItemRenderProps {}
305
307
 
@@ -397,6 +399,7 @@ export const ListBoxItem = /*#__PURE__*/ createLeafComponent('item', function Li
397
399
  values={[
398
400
  [TextContext, {
399
401
  slots: {
402
+ [DEFAULT_SLOT]: labelProps,
400
403
  label: labelProps,
401
404
  description: descriptionProps
402
405
  }
package/src/Menu.tsx CHANGED
@@ -10,20 +10,19 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
-
14
- import {AriaMenuProps, FocusScope, mergeProps, useFocusRing, useMenu, useMenuItem, useMenuSection, useMenuTrigger} from 'react-aria';
15
- import {MenuTriggerProps as BaseMenuTriggerProps, Collection as ICollection, Node, TreeState, useMenuTriggerState, useTreeState} from 'react-stately';
16
- import {Collection, CollectionBuilder, createBranchComponent, createLeafComponent} from '@react-aria/collections';
13
+ import {AriaMenuProps, FocusScope, mergeProps, useHover, useMenu, useMenuItem, useMenuSection, useMenuTrigger, useSubmenuTrigger} from 'react-aria';
14
+ import {BaseCollection, Collection, CollectionBuilder, createBranchComponent, createLeafComponent} from '@react-aria/collections';
15
+ import {MenuTriggerProps as BaseMenuTriggerProps, Collection as ICollection, Node, RootMenuTriggerState, TreeState, useMenuTriggerState, useSubmenuTriggerState, useTreeState} from 'react-stately';
17
16
  import {CollectionProps, CollectionRendererContext, ItemRenderProps, SectionContext, SectionProps, usePersistedKeys} from './Collection';
18
- import {ContextValue, Provider, RenderProps, ScrollableProps, SlotProps, StyleProps, useContextProps, useRenderProps, useSlot, useSlottedContext} from './utils';
19
- import {filterDOMProps, useObjectRef, useResizeObserver} from '@react-aria/utils';
17
+ import {ContextValue, DEFAULT_SLOT, Provider, RenderProps, ScrollableProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps, useSlot, useSlottedContext} from './utils';
18
+ import {filterDOMProps, mergeRefs, useObjectRef, useResizeObserver} from '@react-aria/utils';
20
19
  import {FocusStrategy, forwardRefType, HoverEvents, Key, LinkDOMProps, MultipleSelection} from '@react-types/shared';
21
20
  import {HeaderContext} from './Header';
22
21
  import {KeyboardContext} from './Keyboard';
23
22
  import {MultipleSelectionState, SelectionManager, useMultipleSelectionState} from '@react-stately/selection';
24
23
  import {OverlayTriggerStateContext} from './Dialog';
25
24
  import {PopoverContext} from './Popover';
26
- import {PressResponder, useHover} from '@react-aria/interactions';
25
+ import {PressResponder} from '@react-aria/interactions';
27
26
  import React, {
28
27
  createContext,
29
28
  ForwardedRef,
@@ -33,13 +32,13 @@ import React, {
33
32
  RefObject,
34
33
  useCallback,
35
34
  useContext,
35
+ useMemo,
36
36
  useRef,
37
37
  useState
38
38
  } from 'react';
39
- import {RootMenuTriggerState, useSubmenuTriggerState} from '@react-stately/menu';
40
39
  import {SeparatorContext} from './Separator';
41
40
  import {TextContext} from './Text';
42
- import {useSubmenuTrigger} from '@react-aria/menu';
41
+ import {UNSTABLE_InternalAutocompleteContext} from './Autocomplete';
43
42
 
44
43
  export const MenuContext = createContext<ContextValue<MenuProps<any>, HTMLDivElement>>(null);
45
44
  export const MenuStateContext = createContext<TreeState<any> | null>(null);
@@ -69,7 +68,6 @@ export function MenuTrigger(props: MenuTriggerProps) {
69
68
  ref: ref,
70
69
  onResize: onResize
71
70
  });
72
-
73
71
  let scrollRef = useRef(null);
74
72
 
75
73
  return (
@@ -83,7 +81,8 @@ export function MenuTrigger(props: MenuTriggerProps) {
83
81
  triggerRef: ref,
84
82
  scrollRef,
85
83
  placement: 'bottom start',
86
- style: {'--trigger-width': buttonWidth} as React.CSSProperties
84
+ style: {'--trigger-width': buttonWidth} as React.CSSProperties,
85
+ 'aria-labelledby': menuProps['aria-labelledby']
87
86
  }]
88
87
  ]}>
89
88
  <PressResponder {...menuTriggerProps} ref={ref} isPressed={state.isOpen}>
@@ -105,7 +104,7 @@ export interface SubmenuTriggerProps {
105
104
  delay?: number
106
105
  }
107
106
 
108
- const SubmenuTriggerContext = createContext<{parentMenuRef: RefObject<HTMLElement | null>} | null>(null);
107
+ const SubmenuTriggerContext = createContext<{parentMenuRef: RefObject<HTMLElement | null>, shouldUseVirtualFocus?: boolean} | null>(null);
109
108
 
110
109
  /**
111
110
  * A submenu trigger is used to wrap a submenu's trigger item and the submenu itself.
@@ -119,11 +118,12 @@ export const SubmenuTrigger = /*#__PURE__*/ createBranchComponent('submenutrigg
119
118
  let submenuTriggerState = useSubmenuTriggerState({triggerKey: item.key}, rootMenuTriggerState);
120
119
  let submenuRef = useRef<HTMLDivElement>(null);
121
120
  let itemRef = useObjectRef(ref);
122
- let {parentMenuRef} = useContext(SubmenuTriggerContext)!;
121
+ let {parentMenuRef, shouldUseVirtualFocus} = useContext(SubmenuTriggerContext)!;
123
122
  let {submenuTriggerProps, submenuProps, popoverProps} = useSubmenuTrigger({
124
123
  parentMenuRef,
125
124
  submenuRef,
126
- delay: props.delay
125
+ delay: props.delay,
126
+ shouldUseVirtualFocus
127
127
  }, submenuTriggerState, itemRef);
128
128
 
129
129
  return (
@@ -137,9 +137,7 @@ export const SubmenuTrigger = /*#__PURE__*/ createBranchComponent('submenutrigg
137
137
  trigger: 'SubmenuTrigger',
138
138
  triggerRef: itemRef,
139
139
  placement: 'end top',
140
- // Prevent parent popover from hiding submenu.
141
- // @ts-ignore
142
- 'data-react-aria-top-layer': true,
140
+ 'aria-labelledby': submenuProps['aria-labelledby'],
143
141
  ...popoverProps
144
142
  }]
145
143
  ]}>
@@ -149,41 +147,72 @@ export const SubmenuTrigger = /*#__PURE__*/ createBranchComponent('submenutrigg
149
147
  );
150
148
  }, props => props.children[0]);
151
149
 
152
- export interface MenuProps<T> extends Omit<AriaMenuProps<T>, 'children'>, CollectionProps<T>, StyleProps, SlotProps, ScrollableProps<HTMLDivElement> {}
150
+ export interface MenuRenderProps {
151
+ /**
152
+ * Whether the menu has no items and should display its empty state.
153
+ * @selector [data-empty]
154
+ */
155
+ isEmpty: boolean
156
+ }
157
+
158
+ export interface MenuProps<T> extends Omit<AriaMenuProps<T>, 'children'>, CollectionProps<T>, StyleRenderProps<MenuRenderProps>, SlotProps, ScrollableProps<HTMLDivElement> {
159
+ /** Provides content to display when there are no items in the list. */
160
+ renderEmptyState?: () => ReactNode
161
+ }
153
162
 
154
- function Menu<T extends object>(props: MenuProps<T>, ref: ForwardedRef<HTMLDivElement>) {
163
+ /**
164
+ * A menu displays a list of actions or options that a user can choose.
165
+ */
166
+ export const Menu = /*#__PURE__*/ (forwardRef as forwardRefType)(function Menu<T extends object>(props: MenuProps<T>, ref: ForwardedRef<HTMLDivElement>) {
155
167
  [props, ref] = useContextProps(props, ref, MenuContext);
156
168
 
157
169
  // Delay rendering the actual menu until we have the collection so that auto focus works properly.
158
170
  return (
159
171
  <CollectionBuilder content={<Collection {...props} />}>
160
- {collection => collection.size > 0 && <MenuInner props={props} collection={collection} menuRef={ref} />}
172
+ {collection => <MenuInner props={props} collection={collection} menuRef={ref} />}
161
173
  </CollectionBuilder>
162
174
  );
163
- }
175
+ });
164
176
 
165
177
  interface MenuInnerProps<T> {
166
178
  props: MenuProps<T>,
167
- collection: ICollection<Node<object>>,
179
+ collection: BaseCollection<object>,
168
180
  menuRef: RefObject<HTMLDivElement | null>
169
181
  }
170
182
 
171
183
  function MenuInner<T extends object>({props, collection, menuRef: ref}: MenuInnerProps<T>) {
184
+ let {filter, collectionProps: autocompleteMenuProps, collectionRef} = useContext(UNSTABLE_InternalAutocompleteContext) || {};
185
+ // Memoed so that useAutocomplete callback ref is properly only called once on mount and not everytime a rerender happens
186
+ ref = useObjectRef(useMemo(() => mergeRefs(ref, collectionRef !== undefined ? collectionRef as RefObject<HTMLDivElement> : null), [collectionRef, ref]));
187
+ let filteredCollection = useMemo(() => filter ? collection.UNSTABLE_filter(filter) : collection, [collection, filter]);
172
188
  let state = useTreeState({
173
189
  ...props,
174
- collection,
190
+ collection: filteredCollection as ICollection<Node<object>>,
175
191
  children: undefined
176
192
  });
177
193
  let triggerState = useContext(RootMenuTriggerStateContext);
178
194
  let {isVirtualized, CollectionRoot} = useContext(CollectionRendererContext);
179
- let {menuProps} = useMenu({...props, isVirtualized, onClose: props.onClose || triggerState?.close}, state, ref);
195
+ let {menuProps} = useMenu({...props, ...autocompleteMenuProps, isVirtualized, onClose: props.onClose || triggerState?.close}, state, ref);
180
196
  let renderProps = useRenderProps({
181
197
  defaultClassName: 'react-aria-Menu',
182
198
  className: props.className,
183
199
  style: props.style,
184
- values: {}
200
+ values: {
201
+ isEmpty: state.collection.size === 0
202
+ }
185
203
  });
186
204
 
205
+ let emptyState: ReactElement | null = null;
206
+ if (state.collection.size === 0 && props.renderEmptyState) {
207
+ emptyState = (
208
+ <div
209
+ role="menuitem"
210
+ style={{display: 'contents'}}>
211
+ {props.renderEmptyState()}
212
+ </div>
213
+ );
214
+ }
215
+
187
216
  return (
188
217
  <FocusScope>
189
218
  <div
@@ -192,32 +221,33 @@ function MenuInner<T extends object>({props, collection, menuRef: ref}: MenuInne
192
221
  {...renderProps}
193
222
  ref={ref}
194
223
  slot={props.slot || undefined}
224
+ data-empty={state.collection.size === 0 || undefined}
195
225
  onScroll={props.onScroll}>
196
226
  <Provider
197
227
  values={[
198
228
  [MenuStateContext, state],
199
229
  [SeparatorContext, {elementType: 'div'}],
200
- [SectionContext, {name: 'MenuSection', render: MenuSection}],
201
- [SubmenuTriggerContext, {parentMenuRef: ref}],
230
+ [SectionContext, {name: 'MenuSection', render: MenuSectionInner}],
231
+ [SubmenuTriggerContext, {parentMenuRef: ref, shouldUseVirtualFocus: autocompleteMenuProps?.shouldUseVirtualFocus}],
202
232
  [MenuItemContext, null],
203
- [SelectionManagerContext, state.selectionManager]
233
+ [UNSTABLE_InternalAutocompleteContext, null],
234
+ [SelectionManagerContext, state.selectionManager],
235
+ /* Ensure root MenuTriggerState is defined, in case Menu is rendered outside a MenuTrigger. */
236
+ /* We assume the context can never change between defined and undefined. */
237
+ /* eslint-disable-next-line react-hooks/rules-of-hooks */
238
+ [RootMenuTriggerStateContext, triggerState ?? useMenuTriggerState({})]
204
239
  ]}>
205
240
  <CollectionRoot
206
- collection={collection}
241
+ collection={state.collection}
207
242
  persistedKeys={usePersistedKeys(state.selectionManager.focusedKey)}
208
243
  scrollRef={ref} />
209
244
  </Provider>
245
+ {emptyState}
210
246
  </div>
211
247
  </FocusScope>
212
248
  );
213
249
  }
214
250
 
215
- /**
216
- * A menu displays a list of actions or options that a user can choose.
217
- */
218
- const _Menu = /*#__PURE__*/ (forwardRef as forwardRefType)(Menu);
219
- export {_Menu as Menu};
220
-
221
251
  export interface MenuSectionProps<T> extends SectionProps<T>, MultipleSelection {}
222
252
 
223
253
  // A subclass of SelectionManager that forwards focus-related properties to the parent,
@@ -251,7 +281,7 @@ class GroupSelectionManager extends SelectionManager {
251
281
  }
252
282
  }
253
283
 
254
- function MenuSection<T extends object>(props: MenuSectionProps<T>, ref: ForwardedRef<HTMLElement>, section: Node<T>, className = 'react-aria-MenuSection') {
284
+ function MenuSectionInner<T extends object>(props: MenuSectionProps<T>, ref: ForwardedRef<HTMLElement>, section: Node<T>, className = 'react-aria-MenuSection') {
255
285
  let state = useContext(MenuStateContext)!;
256
286
  let {CollectionBranch} = useContext(CollectionRendererContext);
257
287
  let [headingRef, heading] = useSlot();
@@ -290,8 +320,7 @@ function MenuSection<T extends object>(props: MenuSectionProps<T>, ref: Forwarde
290
320
  /**
291
321
  * A MenuSection represents a section within a Menu.
292
322
  */
293
- const _MenuSection = /*#__PURE__*/ createBranchComponent('section', MenuSection);
294
- export {_MenuSection as MenuSection};
323
+ export const MenuSection = /*#__PURE__*/ createBranchComponent('section', MenuSectionInner);
295
324
 
296
325
  export interface MenuItemRenderProps extends ItemRenderProps {
297
326
  /**
@@ -342,7 +371,6 @@ export const MenuItem = /*#__PURE__*/ createLeafComponent('item', function MenuI
342
371
  selectionManager
343
372
  }, state, ref);
344
373
 
345
- let {isFocusVisible, focusProps} = useFocusRing();
346
374
  let {hoverProps, isHovered} = useHover({
347
375
  isDisabled: states.isDisabled
348
376
  });
@@ -354,7 +382,7 @@ export const MenuItem = /*#__PURE__*/ createLeafComponent('item', function MenuI
354
382
  values: {
355
383
  ...states,
356
384
  isHovered,
357
- isFocusVisible,
385
+ isFocusVisible: states.isFocusVisible,
358
386
  selectionMode: selectionManager.selectionMode,
359
387
  selectionBehavior: selectionManager.selectionBehavior,
360
388
  hasSubmenu: !!props['aria-haspopup'],
@@ -366,13 +394,13 @@ export const MenuItem = /*#__PURE__*/ createLeafComponent('item', function MenuI
366
394
 
367
395
  return (
368
396
  <ElementType
369
- {...mergeProps(menuItemProps, focusProps, hoverProps)}
397
+ {...mergeProps(menuItemProps, hoverProps)}
370
398
  {...renderProps}
371
399
  ref={ref}
372
400
  data-disabled={states.isDisabled || undefined}
373
401
  data-hovered={isHovered || undefined}
374
402
  data-focused={states.isFocused || undefined}
375
- data-focus-visible={isFocusVisible || undefined}
403
+ data-focus-visible={states.isFocusVisible || undefined}
376
404
  data-pressed={states.isPressed || undefined}
377
405
  data-selected={states.isSelected || undefined}
378
406
  data-selection-mode={selectionManager.selectionMode === 'none' ? undefined : selectionManager.selectionMode}
@@ -382,6 +410,7 @@ export const MenuItem = /*#__PURE__*/ createLeafComponent('item', function MenuI
382
410
  values={[
383
411
  [TextContext, {
384
412
  slots: {
413
+ [DEFAULT_SLOT]: labelProps,
385
414
  label: labelProps,
386
415
  description: descriptionProps
387
416
  }
package/src/Meter.tsx CHANGED
@@ -33,7 +33,10 @@ export interface MeterRenderProps {
33
33
 
34
34
  export const MeterContext = createContext<ContextValue<MeterProps, HTMLDivElement>>(null);
35
35
 
36
- function Meter(props: MeterProps, ref: ForwardedRef<HTMLDivElement>) {
36
+ /**
37
+ * A meter represents a quantity within a known range, or a fractional value.
38
+ */
39
+ export const Meter = /*#__PURE__*/ (forwardRef as forwardRefType)(function Meter(props: MeterProps, ref: ForwardedRef<HTMLDivElement>) {
37
40
  [props, ref] = useContextProps(props, ref, MeterContext);
38
41
  let {
39
42
  value = 0,
@@ -42,7 +45,9 @@ function Meter(props: MeterProps, ref: ForwardedRef<HTMLDivElement>) {
42
45
  } = props;
43
46
  value = clamp(value, minValue, maxValue);
44
47
 
45
- let [labelRef, label] = useSlot();
48
+ let [labelRef, label] = useSlot(
49
+ !props['aria-label'] && !props['aria-labelledby']
50
+ );
46
51
  let {
47
52
  meterProps,
48
53
  labelProps
@@ -67,10 +72,4 @@ function Meter(props: MeterProps, ref: ForwardedRef<HTMLDivElement>) {
67
72
  </LabelContext.Provider>
68
73
  </div>
69
74
  );
70
- }
71
-
72
- /**
73
- * A meter represents a quantity within a known range, or a fractional value.
74
- */
75
- const _Meter = /*#__PURE__*/ (forwardRef as forwardRefType)(Meter);
76
- export {_Meter as Meter};
75
+ });
package/src/Modal.tsx CHANGED
@@ -11,9 +11,9 @@
11
11
  */
12
12
 
13
13
  import {AriaModalOverlayProps, DismissButton, Overlay, useIsSSR, useModalOverlay} from 'react-aria';
14
- import {ContextValue, Provider, RenderProps, SlotProps, useContextProps, useEnterAnimation, useExitAnimation, useRenderProps} from './utils';
14
+ import {ContextValue, Provider, RenderProps, SlotProps, useContextProps, useRenderProps} from './utils';
15
15
  import {DOMAttributes, forwardRefType, RefObject} from '@react-types/shared';
16
- import {filterDOMProps, mergeProps, mergeRefs, useObjectRef, useViewportSize} from '@react-aria/utils';
16
+ import {filterDOMProps, mergeProps, mergeRefs, useEnterAnimation, useExitAnimation, useObjectRef, useViewportSize} from '@react-aria/utils';
17
17
  import {OverlayTriggerProps, OverlayTriggerState, useOverlayTriggerState} from 'react-stately';
18
18
  import {OverlayTriggerStateContext} from './Dialog';
19
19
  import React, {createContext, ForwardedRef, forwardRef, useContext, useMemo, useRef} from 'react';
@@ -61,7 +61,10 @@ export interface ModalRenderProps {
61
61
  state: OverlayTriggerState
62
62
  }
63
63
 
64
- function Modal(props: ModalOverlayProps, ref: ForwardedRef<HTMLDivElement>) {
64
+ /**
65
+ * A modal is an overlay element which blocks interaction with elements outside it.
66
+ */
67
+ export const Modal = /*#__PURE__*/ (forwardRef as forwardRefType)(function Modal(props: ModalOverlayProps, ref: ForwardedRef<HTMLDivElement>) {
65
68
  let ctx = useContext(InternalModalContext);
66
69
 
67
70
  if (ctx) {
@@ -98,7 +101,7 @@ function Modal(props: ModalOverlayProps, ref: ForwardedRef<HTMLDivElement>) {
98
101
  </ModalContent>
99
102
  </ModalOverlay>
100
103
  );
101
- }
104
+ });
102
105
 
103
106
  interface ModalOverlayInnerProps extends ModalOverlayProps {
104
107
  overlayRef: RefObject<HTMLDivElement | null>,
@@ -107,12 +110,6 @@ interface ModalOverlayInnerProps extends ModalOverlayProps {
107
110
  isExiting: boolean
108
111
  }
109
112
 
110
- /**
111
- * A modal is an overlay element which blocks interaction with elements outside it.
112
- */
113
- const _Modal = /*#__PURE__*/ (forwardRef as forwardRefType)(Modal);
114
- export {_Modal as Modal};
115
-
116
113
  function ModalOverlayWithForwardRef(props: ModalOverlayProps, ref: ForwardedRef<HTMLDivElement>) {
117
114
  [props, ref] = useContextProps(props, ref, ModalContext);
118
115
  let contextState = useContext(OverlayTriggerStateContext);