@ariakit/react-components 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/button/button.d.ts +1 -1
  3. package/dist/{button-Cp853csH.d.ts → button-CVWcOgxs.d.ts} +3 -3
  4. package/dist/{button-Cp853csH.d.ts.map → button-CVWcOgxs.d.ts.map} +1 -1
  5. package/dist/checkbox/checkbox-check.d.ts +1 -1
  6. package/dist/checkbox/checkbox-check.d.ts.map +1 -1
  7. package/dist/checkbox/checkbox.d.ts +2 -2
  8. package/dist/checkbox/checkbox.d.ts.map +1 -1
  9. package/dist/collection/collection-item-offscreen.d.ts +1 -1
  10. package/dist/collection/collection-item-offscreen.js +1 -1
  11. package/dist/collection/collection-item-offscreen.js.map +1 -1
  12. package/dist/collection/collection-item.d.ts +1 -1
  13. package/dist/collection/collection-renderer.d.ts +1 -1
  14. package/dist/collection/collection-renderer.js +1 -1
  15. package/dist/collection/collection-renderer.js.map +1 -1
  16. package/dist/collection/collection.d.ts +1 -1
  17. package/dist/collection/collection.d.ts.map +1 -1
  18. package/dist/{collection-item-offscreen-DyXa-sqj.d.ts → collection-item-offscreen-B5E5vNFi.d.ts} +2 -2
  19. package/dist/{collection-item-offscreen-DyXa-sqj.d.ts.map → collection-item-offscreen-B5E5vNFi.d.ts.map} +1 -1
  20. package/dist/{collection-item-C-g2BwVF.d.ts → collection-item-pvEWNoNs.d.ts} +2 -2
  21. package/dist/{collection-item-C-g2BwVF.d.ts.map → collection-item-pvEWNoNs.d.ts.map} +1 -1
  22. package/dist/{collection-renderer-DsPD9ksD.d.ts → collection-renderer-BhzF21Du.d.ts} +29 -15
  23. package/dist/collection-renderer-BhzF21Du.d.ts.map +1 -0
  24. package/dist/combobox/combobox-cancel.d.ts +2 -2
  25. package/dist/combobox/combobox-cancel.d.ts.map +1 -1
  26. package/dist/combobox/combobox-cancel.js +1 -1
  27. package/dist/combobox/combobox-cancel.js.map +1 -1
  28. package/dist/combobox/combobox-disclosure.d.ts +2 -2
  29. package/dist/combobox/combobox-disclosure.d.ts.map +1 -1
  30. package/dist/combobox/combobox-disclosure.js +1 -1
  31. package/dist/combobox/combobox-disclosure.js.map +1 -1
  32. package/dist/combobox/combobox-group-label.d.ts +1 -1
  33. package/dist/combobox/combobox-group-label.d.ts.map +1 -1
  34. package/dist/combobox/combobox-group.d.ts +1 -1
  35. package/dist/combobox/combobox-group.d.ts.map +1 -1
  36. package/dist/combobox/combobox-group.js +1 -1
  37. package/dist/combobox/combobox-group.js.map +1 -1
  38. package/dist/combobox/combobox-item-check.d.ts +1 -1
  39. package/dist/combobox/combobox-item-check.d.ts.map +1 -1
  40. package/dist/combobox/combobox-item-value.d.ts +1 -1
  41. package/dist/combobox/combobox-item-value.d.ts.map +1 -1
  42. package/dist/combobox/combobox-item.d.ts +3 -3
  43. package/dist/combobox/combobox-item.d.ts.map +1 -1
  44. package/dist/combobox/combobox-item.js +1 -1
  45. package/dist/combobox/combobox-item.js.map +1 -1
  46. package/dist/combobox/combobox-label.d.ts +1 -1
  47. package/dist/combobox/combobox-label.d.ts.map +1 -1
  48. package/dist/combobox/combobox-label.js +1 -1
  49. package/dist/combobox/combobox-label.js.map +1 -1
  50. package/dist/combobox/combobox-list.d.ts +1 -1
  51. package/dist/combobox/combobox-list.d.ts.map +1 -1
  52. package/dist/combobox/combobox-list.js +1 -1
  53. package/dist/combobox/combobox-list.js.map +1 -1
  54. package/dist/combobox/combobox-popover.d.ts +1 -1
  55. package/dist/combobox/combobox-popover.js +1 -1
  56. package/dist/combobox/combobox-popover.js.map +1 -1
  57. package/dist/combobox/combobox-row.d.ts +1 -1
  58. package/dist/combobox/combobox-row.d.ts.map +1 -1
  59. package/dist/combobox/combobox-row.js +1 -1
  60. package/dist/combobox/combobox-row.js.map +1 -1
  61. package/dist/combobox/combobox-separator.d.ts +1 -1
  62. package/dist/combobox/combobox-separator.d.ts.map +1 -1
  63. package/dist/combobox/combobox-separator.js +1 -1
  64. package/dist/combobox/combobox-separator.js.map +1 -1
  65. package/dist/combobox/combobox-value.js +1 -1
  66. package/dist/combobox/combobox-value.js.map +1 -1
  67. package/dist/combobox/combobox.d.ts +3 -3
  68. package/dist/combobox/combobox.d.ts.map +1 -1
  69. package/dist/combobox/combobox.js +16 -2
  70. package/dist/combobox/combobox.js.map +1 -1
  71. package/dist/command/command.d.ts +1 -1
  72. package/dist/{command-DckndCUK.d.ts → command-B9C8p3_S.d.ts} +3 -3
  73. package/dist/{command-DckndCUK.d.ts.map → command-B9C8p3_S.d.ts.map} +1 -1
  74. package/dist/composite/composite-container.d.ts +1 -1
  75. package/dist/composite/composite-container.d.ts.map +1 -1
  76. package/dist/composite/composite-container.js +2 -2
  77. package/dist/composite/composite-container.js.map +1 -1
  78. package/dist/composite/composite-group-label.d.ts +2 -2
  79. package/dist/composite/composite-group-label.d.ts.map +1 -1
  80. package/dist/composite/composite-group.d.ts +2 -2
  81. package/dist/composite/composite-group.d.ts.map +1 -1
  82. package/dist/composite/composite-hover.d.ts +1 -1
  83. package/dist/composite/composite-hover.js +9 -13
  84. package/dist/composite/composite-hover.js.map +1 -1
  85. package/dist/composite/composite-input.d.ts +1 -1
  86. package/dist/composite/composite-input.d.ts.map +1 -1
  87. package/dist/composite/composite-input.js +1 -1
  88. package/dist/composite/composite-input.js.map +1 -1
  89. package/dist/composite/composite-item-offscreen.d.ts +2 -2
  90. package/dist/composite/composite-item-offscreen.js +2 -2
  91. package/dist/composite/composite-item-offscreen.js.map +1 -1
  92. package/dist/composite/composite-item.d.ts +1 -1
  93. package/dist/composite/composite-item.js +2 -2
  94. package/dist/composite/composite-item.js.map +1 -1
  95. package/dist/composite/composite-overflow-disclosure.d.ts +2 -2
  96. package/dist/composite/composite-overflow-disclosure.d.ts.map +1 -1
  97. package/dist/composite/composite-overflow.d.ts +2 -2
  98. package/dist/composite/composite-overflow.d.ts.map +1 -1
  99. package/dist/composite/composite-renderer.d.ts +28 -14
  100. package/dist/composite/composite-renderer.d.ts.map +1 -1
  101. package/dist/composite/composite-renderer.js +2 -2
  102. package/dist/composite/composite-renderer.js.map +1 -1
  103. package/dist/composite/composite-row.d.ts +1 -1
  104. package/dist/composite/composite-row.d.ts.map +1 -1
  105. package/dist/composite/composite-row.js +3 -3
  106. package/dist/composite/composite-row.js.map +1 -1
  107. package/dist/composite/composite-separator.d.ts +2 -2
  108. package/dist/composite/composite-separator.d.ts.map +1 -1
  109. package/dist/composite/composite-separator.js +3 -3
  110. package/dist/composite/composite-separator.js.map +1 -1
  111. package/dist/composite/composite-typeahead.d.ts +1 -1
  112. package/dist/composite/composite-typeahead.js +3 -3
  113. package/dist/composite/composite-typeahead.js.map +1 -1
  114. package/dist/composite/composite.d.ts +1 -1
  115. package/dist/composite/composite.js +3 -3
  116. package/dist/composite/composite.js.map +1 -1
  117. package/dist/{composite-DLvyFHMq.d.ts → composite-KBhCGLEy.d.ts} +3 -3
  118. package/dist/{composite-DLvyFHMq.d.ts.map → composite-KBhCGLEy.d.ts.map} +1 -1
  119. package/dist/{composite-hover-C7ul163w.d.ts → composite-hover-BpXq3T8J.d.ts} +2 -2
  120. package/dist/{composite-hover-C7ul163w.d.ts.map → composite-hover-BpXq3T8J.d.ts.map} +1 -1
  121. package/dist/{composite-item-B4WTelVz.d.ts → composite-item-d4UXaZ84.d.ts} +4 -4
  122. package/dist/{composite-item-B4WTelVz.d.ts.map → composite-item-d4UXaZ84.d.ts.map} +1 -1
  123. package/dist/{composite-typeahead-DDhpyKqm.d.ts → composite-typeahead-0euW43GU.d.ts} +2 -2
  124. package/dist/{composite-typeahead-DDhpyKqm.d.ts.map → composite-typeahead-0euW43GU.d.ts.map} +1 -1
  125. package/dist/dialog/dialog-backdrop.d.ts +1 -1
  126. package/dist/dialog/dialog-description.d.ts +1 -1
  127. package/dist/dialog/dialog-disclosure.d.ts +1 -1
  128. package/dist/dialog/dialog-disclosure.js +1 -1
  129. package/dist/dialog/dialog-disclosure.js.map +1 -1
  130. package/dist/dialog/dialog-dismiss.d.ts +1 -1
  131. package/dist/dialog/dialog-heading.d.ts +1 -1
  132. package/dist/dialog/dialog.d.ts +1 -1
  133. package/dist/dialog/dialog.js +18 -6
  134. package/dist/dialog/dialog.js.map +1 -1
  135. package/dist/dialog/utils/disable-accessibility-tree-outside.d.ts +1 -3
  136. package/dist/dialog/utils/disable-accessibility-tree-outside.d.ts.map +1 -1
  137. package/dist/dialog/utils/disable-accessibility-tree-outside.js +1 -15
  138. package/dist/dialog/utils/disable-accessibility-tree-outside.js.map +1 -1
  139. package/dist/dialog/utils/use-hide-on-interact-outside.d.ts +1 -1
  140. package/dist/dialog/utils/use-hide-on-interact-outside.js +2 -2
  141. package/dist/dialog/utils/use-hide-on-interact-outside.js.map +1 -1
  142. package/dist/dialog/utils/use-prevent-body-scroll.js +2 -1
  143. package/dist/dialog/utils/use-prevent-body-scroll.js.map +1 -1
  144. package/dist/dialog/utils/use-previous-mouse-down-ref.d.ts +1 -1
  145. package/dist/dialog/utils/use-previous-mouse-down-ref.d.ts.map +1 -1
  146. package/dist/{dialog-C__C-zX2.d.ts → dialog-D23r2ZWj.d.ts} +4 -4
  147. package/dist/{dialog-C__C-zX2.d.ts.map → dialog-D23r2ZWj.d.ts.map} +1 -1
  148. package/dist/{dialog-description-BCZJ1Kyd.d.ts → dialog-description-CJGxnEvk.d.ts} +2 -2
  149. package/dist/{dialog-description-BCZJ1Kyd.d.ts.map → dialog-description-CJGxnEvk.d.ts.map} +1 -1
  150. package/dist/{dialog-disclosure-DLD10zlb.d.ts → dialog-disclosure-DSESk5pv.d.ts} +3 -3
  151. package/dist/{dialog-disclosure-DLD10zlb.d.ts.map → dialog-disclosure-DSESk5pv.d.ts.map} +1 -1
  152. package/dist/{dialog-dismiss-CnwEbzc6.d.ts → dialog-dismiss-DW3XQYvp.d.ts} +3 -3
  153. package/dist/{dialog-dismiss-CnwEbzc6.d.ts.map → dialog-dismiss-DW3XQYvp.d.ts.map} +1 -1
  154. package/dist/{dialog-heading-DQvnOfZH.d.ts → dialog-heading-DGA5d8VH.d.ts} +3 -3
  155. package/dist/{dialog-heading-DQvnOfZH.d.ts.map → dialog-heading-DGA5d8VH.d.ts.map} +1 -1
  156. package/dist/disclosure/disclosure-content.js +1 -1
  157. package/dist/disclosure/disclosure-content.js.map +1 -1
  158. package/dist/disclosure/disclosure.d.ts +1 -1
  159. package/dist/disclosure/disclosure.js +1 -1
  160. package/dist/disclosure/disclosure.js.map +1 -1
  161. package/dist/{disclosure-CQ37hPVP.d.ts → disclosure-C4F4sCVZ.d.ts} +3 -3
  162. package/dist/{disclosure-CQ37hPVP.d.ts.map → disclosure-C4F4sCVZ.d.ts.map} +1 -1
  163. package/dist/focus-trap/focus-trap-region.d.ts +1 -1
  164. package/dist/focus-trap/focus-trap-region.d.ts.map +1 -1
  165. package/dist/focus-trap/focus-trap.d.ts +1 -1
  166. package/dist/focus-trap/focus-trap.d.ts.map +1 -1
  167. package/dist/focusable/focusable-container.d.ts +1 -1
  168. package/dist/focusable/focusable-container.d.ts.map +1 -1
  169. package/dist/focusable/focusable.d.ts +1 -1
  170. package/dist/focusable/focusable.js +49 -8
  171. package/dist/focusable/focusable.js.map +1 -1
  172. package/dist/{focusable-B00tOxtB.d.ts → focusable-dBZH13-T.d.ts} +2 -2
  173. package/dist/{focusable-B00tOxtB.d.ts.map → focusable-dBZH13-T.d.ts.map} +1 -1
  174. package/dist/form/form-checkbox.d.ts +1 -1
  175. package/dist/form/form-checkbox.d.ts.map +1 -1
  176. package/dist/form/form-checkbox.js +1 -1
  177. package/dist/form/form-checkbox.js.map +1 -1
  178. package/dist/form/form-control.d.ts +2 -2
  179. package/dist/form/form-control.d.ts.map +1 -1
  180. package/dist/form/form-control.js +1 -1
  181. package/dist/form/form-control.js.map +1 -1
  182. package/dist/form/form-description.d.ts +2 -2
  183. package/dist/form/form-description.d.ts.map +1 -1
  184. package/dist/form/form-description.js +1 -1
  185. package/dist/form/form-description.js.map +1 -1
  186. package/dist/form/form-error.d.ts +2 -2
  187. package/dist/form/form-error.d.ts.map +1 -1
  188. package/dist/form/form-error.js +1 -1
  189. package/dist/form/form-error.js.map +1 -1
  190. package/dist/form/form-field.d.ts +1 -1
  191. package/dist/form/form-field.d.ts.map +1 -1
  192. package/dist/form/form-group-label.d.ts +2 -2
  193. package/dist/form/form-group-label.d.ts.map +1 -1
  194. package/dist/form/form-group.d.ts +2 -2
  195. package/dist/form/form-group.d.ts.map +1 -1
  196. package/dist/form/form-input.d.ts +2 -2
  197. package/dist/form/form-input.d.ts.map +1 -1
  198. package/dist/form/form-input.js +1 -1
  199. package/dist/form/form-input.js.map +1 -1
  200. package/dist/form/form-label.d.ts +2 -2
  201. package/dist/form/form-label.d.ts.map +1 -1
  202. package/dist/form/form-label.js +1 -1
  203. package/dist/form/form-label.js.map +1 -1
  204. package/dist/form/form-push.d.ts +3 -3
  205. package/dist/form/form-push.d.ts.map +1 -1
  206. package/dist/form/form-push.js +1 -1
  207. package/dist/form/form-push.js.map +1 -1
  208. package/dist/form/form-radio-group.d.ts +1 -1
  209. package/dist/form/form-radio-group.d.ts.map +1 -1
  210. package/dist/form/form-radio.d.ts +1 -1
  211. package/dist/form/form-radio.d.ts.map +1 -1
  212. package/dist/form/form-radio.js +1 -1
  213. package/dist/form/form-radio.js.map +1 -1
  214. package/dist/form/form-remove.d.ts +16 -12
  215. package/dist/form/form-remove.d.ts.map +1 -1
  216. package/dist/form/form-remove.js +15 -11
  217. package/dist/form/form-remove.js.map +1 -1
  218. package/dist/form/form-reset.d.ts +2 -2
  219. package/dist/form/form-reset.d.ts.map +1 -1
  220. package/dist/form/form-reset.js +1 -1
  221. package/dist/form/form-reset.js.map +1 -1
  222. package/dist/form/form-submit.d.ts +2 -2
  223. package/dist/form/form-submit.d.ts.map +1 -1
  224. package/dist/form/form-submit.js +1 -1
  225. package/dist/form/form-submit.js.map +1 -1
  226. package/dist/form/form.d.ts +1 -1
  227. package/dist/form/form.d.ts.map +1 -1
  228. package/dist/form/form.js +1 -1
  229. package/dist/form/form.js.map +1 -1
  230. package/dist/group/group-label.d.ts +1 -1
  231. package/dist/group/group.d.ts +1 -1
  232. package/dist/{group-label-C16IDs1b.d.ts → group-label-BKYqD4Sj.d.ts} +2 -2
  233. package/dist/{group-label-C16IDs1b.d.ts.map → group-label-BKYqD4Sj.d.ts.map} +1 -1
  234. package/dist/{group-CamegDJA.d.ts → group-nGD9e6Dj.d.ts} +2 -2
  235. package/dist/{group-CamegDJA.d.ts.map → group-nGD9e6Dj.d.ts.map} +1 -1
  236. package/dist/heading/heading.d.ts +1 -1
  237. package/dist/heading/heading.js +2 -2
  238. package/dist/heading/heading.js.map +1 -1
  239. package/dist/{heading-zY9g_9K-.d.ts → heading-D_AmeqL5.d.ts} +2 -2
  240. package/dist/{heading-zY9g_9K-.d.ts.map → heading-D_AmeqL5.d.ts.map} +1 -1
  241. package/dist/hovercard/hovercard-anchor.d.ts +2 -2
  242. package/dist/hovercard/hovercard-anchor.d.ts.map +1 -1
  243. package/dist/hovercard/hovercard-anchor.js +1 -1
  244. package/dist/hovercard/hovercard-anchor.js.map +1 -1
  245. package/dist/hovercard/hovercard-arrow.d.ts +1 -1
  246. package/dist/hovercard/hovercard-arrow.d.ts.map +1 -1
  247. package/dist/hovercard/hovercard-description.d.ts +2 -2
  248. package/dist/hovercard/hovercard-description.d.ts.map +1 -1
  249. package/dist/hovercard/hovercard-disclosure.d.ts +2 -2
  250. package/dist/hovercard/hovercard-disclosure.d.ts.map +1 -1
  251. package/dist/hovercard/hovercard-disclosure.js +4 -4
  252. package/dist/hovercard/hovercard-disclosure.js.map +1 -1
  253. package/dist/hovercard/hovercard-dismiss.d.ts +2 -2
  254. package/dist/hovercard/hovercard-dismiss.d.ts.map +1 -1
  255. package/dist/hovercard/hovercard-heading.d.ts +2 -2
  256. package/dist/hovercard/hovercard-heading.d.ts.map +1 -1
  257. package/dist/hovercard/hovercard.d.ts +1 -1
  258. package/dist/hovercard/hovercard.js +2 -2
  259. package/dist/hovercard/hovercard.js.map +1 -1
  260. package/dist/menu/menu-arrow.d.ts +2 -2
  261. package/dist/menu/menu-arrow.d.ts.map +1 -1
  262. package/dist/menu/menu-bar-provider.js +1 -1
  263. package/dist/menu/menu-bar-provider.js.map +1 -1
  264. package/dist/menu/menu-bar-store.d.ts +3 -3
  265. package/dist/menu/menu-bar-store.js +3 -3
  266. package/dist/menu/menu-bar-store.js.map +1 -1
  267. package/dist/menu/menu-bar.d.ts +1 -1
  268. package/dist/menu/menu-bar.d.ts.map +1 -1
  269. package/dist/menu/menu-bar.js +1 -1
  270. package/dist/menu/menu-bar.js.map +1 -1
  271. package/dist/menu/menu-button-arrow.d.ts +2 -2
  272. package/dist/menu/menu-button-arrow.d.ts.map +1 -1
  273. package/dist/menu/menu-button.d.ts +3 -3
  274. package/dist/menu/menu-button.d.ts.map +1 -1
  275. package/dist/menu/menu-button.js +1 -1
  276. package/dist/menu/menu-button.js.map +1 -1
  277. package/dist/menu/menu-context.d.ts +10 -3
  278. package/dist/menu/menu-context.d.ts.map +1 -1
  279. package/dist/menu/menu-context.js +8 -1
  280. package/dist/menu/menu-context.js.map +1 -1
  281. package/dist/menu/menu-description.d.ts +2 -2
  282. package/dist/menu/menu-description.d.ts.map +1 -1
  283. package/dist/menu/menu-dismiss.d.ts +2 -2
  284. package/dist/menu/menu-dismiss.d.ts.map +1 -1
  285. package/dist/menu/menu-group-label.d.ts +2 -2
  286. package/dist/menu/menu-group-label.d.ts.map +1 -1
  287. package/dist/menu/menu-group.d.ts +2 -2
  288. package/dist/menu/menu-group.d.ts.map +1 -1
  289. package/dist/menu/menu-heading.d.ts +2 -2
  290. package/dist/menu/menu-heading.d.ts.map +1 -1
  291. package/dist/menu/menu-item-check.d.ts +2 -2
  292. package/dist/menu/menu-item-check.d.ts.map +1 -1
  293. package/dist/menu/menu-item-checkbox.d.ts +2 -2
  294. package/dist/menu/menu-item-checkbox.d.ts.map +1 -1
  295. package/dist/menu/menu-item-checkbox.js +1 -1
  296. package/dist/menu/menu-item-checkbox.js.map +1 -1
  297. package/dist/menu/menu-item-radio.d.ts +2 -2
  298. package/dist/menu/menu-item-radio.d.ts.map +1 -1
  299. package/dist/menu/menu-item-radio.js +1 -1
  300. package/dist/menu/menu-item-radio.js.map +1 -1
  301. package/dist/menu/menu-item.d.ts +5 -5
  302. package/dist/menu/menu-item.d.ts.map +1 -1
  303. package/dist/menu/menu-item.js +8 -4
  304. package/dist/menu/menu-item.js.map +1 -1
  305. package/dist/menu/menu-list.d.ts +4 -4
  306. package/dist/menu/menu-list.d.ts.map +1 -1
  307. package/dist/menu/menu-list.js +6 -2
  308. package/dist/menu/menu-list.js.map +1 -1
  309. package/dist/menu/menu-provider.d.ts +1 -1
  310. package/dist/menu/menu-separator.d.ts +2 -2
  311. package/dist/menu/menu-separator.d.ts.map +1 -1
  312. package/dist/menu/menu-store.d.ts +1 -1
  313. package/dist/menu/menu.js +1 -1
  314. package/dist/menu/menu.js.map +1 -1
  315. package/dist/{menu-store-0CKKmNek.d.ts → menu-store-BpTJdcL8.d.ts} +2 -2
  316. package/dist/{menu-store-0CKKmNek.d.ts.map → menu-store-BpTJdcL8.d.ts.map} +1 -1
  317. package/dist/menubar/menubar-context.d.ts +2 -3
  318. package/dist/menubar/menubar-context.d.ts.map +1 -1
  319. package/dist/menubar/menubar-context.js +1 -3
  320. package/dist/menubar/menubar-context.js.map +1 -1
  321. package/dist/menubar/menubar-provider.d.ts +1 -1
  322. package/dist/menubar/menubar-store.d.ts +1 -1
  323. package/dist/menubar/menubar-store.js +2 -2
  324. package/dist/menubar/menubar-store.js.map +1 -1
  325. package/dist/menubar/menubar.d.ts +3 -3
  326. package/dist/menubar/menubar.d.ts.map +1 -1
  327. package/dist/{menubar-store-3h0eNIbS.d.ts → menubar-store-C553OKBw.d.ts} +3 -3
  328. package/dist/{menubar-store-3h0eNIbS.d.ts.map → menubar-store-C553OKBw.d.ts.map} +1 -1
  329. package/dist/popover/popover-anchor.d.ts +1 -1
  330. package/dist/popover/popover-arrow.d.ts +1 -1
  331. package/dist/popover/popover-arrow.d.ts.map +1 -1
  332. package/dist/popover/popover-arrow.js +4 -4
  333. package/dist/popover/popover-arrow.js.map +1 -1
  334. package/dist/popover/popover-description.d.ts +1 -1
  335. package/dist/popover/popover-disclosure-arrow.d.ts +1 -1
  336. package/dist/popover/popover-disclosure-arrow.d.ts.map +1 -1
  337. package/dist/popover/popover-disclosure-arrow.js +1 -1
  338. package/dist/popover/popover-disclosure-arrow.js.map +1 -1
  339. package/dist/popover/popover-disclosure.d.ts +3 -3
  340. package/dist/popover/popover-disclosure.d.ts.map +1 -1
  341. package/dist/popover/popover-disclosure.js +1 -1
  342. package/dist/popover/popover-disclosure.js.map +1 -1
  343. package/dist/popover/popover-dismiss.d.ts +1 -1
  344. package/dist/popover/popover-heading.d.ts +1 -1
  345. package/dist/popover/popover.d.ts +1 -1
  346. package/dist/popover/popover.js +2 -2
  347. package/dist/popover/popover.js.map +1 -1
  348. package/dist/{popover-CCqiRKqg.d.ts → popover-B9PxE5iP.d.ts} +10 -2
  349. package/dist/popover-B9PxE5iP.d.ts.map +1 -0
  350. package/dist/{popover-anchor-PgfeXyzs.d.ts → popover-anchor-W18KUmuM.d.ts} +2 -2
  351. package/dist/{popover-anchor-PgfeXyzs.d.ts.map → popover-anchor-W18KUmuM.d.ts.map} +1 -1
  352. package/dist/{popover-description-DU753dah.d.ts → popover-description-DbW4mVBb.d.ts} +3 -3
  353. package/dist/{popover-description-DU753dah.d.ts.map → popover-description-DbW4mVBb.d.ts.map} +1 -1
  354. package/dist/{popover-dismiss-DPeI6Zse.d.ts → popover-dismiss-CQFvuLzJ.d.ts} +3 -3
  355. package/dist/{popover-dismiss-DPeI6Zse.d.ts.map → popover-dismiss-CQFvuLzJ.d.ts.map} +1 -1
  356. package/dist/{popover-heading-DGsr6D5W.d.ts → popover-heading-DC8rYnwo.d.ts} +3 -3
  357. package/dist/{popover-heading-DGsr6D5W.d.ts.map → popover-heading-DC8rYnwo.d.ts.map} +1 -1
  358. package/dist/portal/portal.d.ts +1 -1
  359. package/dist/{portal-CMBWiayp.d.ts → portal-CKFTfCWH.d.ts} +2 -2
  360. package/dist/{portal-CMBWiayp.d.ts.map → portal-CKFTfCWH.d.ts.map} +1 -1
  361. package/dist/radio/radio-group.d.ts +2 -2
  362. package/dist/radio/radio-group.d.ts.map +1 -1
  363. package/dist/radio/radio-group.js +1 -1
  364. package/dist/radio/radio-group.js.map +1 -1
  365. package/dist/radio/radio.d.ts +2 -2
  366. package/dist/radio/radio.d.ts.map +1 -1
  367. package/dist/select/select-arrow.d.ts +1 -1
  368. package/dist/select/select-arrow.d.ts.map +1 -1
  369. package/dist/select/select-dismiss.d.ts +2 -2
  370. package/dist/select/select-dismiss.d.ts.map +1 -1
  371. package/dist/select/select-group-label.d.ts +1 -1
  372. package/dist/select/select-group-label.d.ts.map +1 -1
  373. package/dist/select/select-group.d.ts +1 -1
  374. package/dist/select/select-group.d.ts.map +1 -1
  375. package/dist/select/select-heading.d.ts +2 -2
  376. package/dist/select/select-heading.d.ts.map +1 -1
  377. package/dist/select/select-item-check.d.ts +1 -1
  378. package/dist/select/select-item-check.d.ts.map +1 -1
  379. package/dist/select/select-item.d.ts +3 -3
  380. package/dist/select/select-item.d.ts.map +1 -1
  381. package/dist/select/select-item.js +1 -1
  382. package/dist/select/select-item.js.map +1 -1
  383. package/dist/select/select-label.d.ts +1 -1
  384. package/dist/select/select-label.d.ts.map +1 -1
  385. package/dist/select/select-label.js +1 -1
  386. package/dist/select/select-label.js.map +1 -1
  387. package/dist/select/select-list.d.ts +3 -3
  388. package/dist/select/select-list.d.ts.map +1 -1
  389. package/dist/select/select-list.js +1 -1
  390. package/dist/select/select-list.js.map +1 -1
  391. package/dist/select/select-popover.d.ts +1 -1
  392. package/dist/select/select-renderer.d.ts +2 -2
  393. package/dist/select/select-renderer.d.ts.map +1 -1
  394. package/dist/select/select-row.d.ts +1 -1
  395. package/dist/select/select-row.d.ts.map +1 -1
  396. package/dist/select/select-row.js +1 -1
  397. package/dist/select/select-row.js.map +1 -1
  398. package/dist/select/select-separator.d.ts +1 -1
  399. package/dist/select/select-separator.d.ts.map +1 -1
  400. package/dist/select/select.d.ts +2 -2
  401. package/dist/select/select.d.ts.map +1 -1
  402. package/dist/select/select.js +1 -1
  403. package/dist/select/select.js.map +1 -1
  404. package/dist/separator/separator.d.ts +1 -1
  405. package/dist/{separator--ozQfMcK.d.ts → separator-BnvSVwBa.d.ts} +2 -2
  406. package/dist/{separator--ozQfMcK.d.ts.map → separator-BnvSVwBa.d.ts.map} +1 -1
  407. package/dist/tab/tab-list.d.ts +2 -2
  408. package/dist/tab/tab-list.d.ts.map +1 -1
  409. package/dist/tab/tab-list.js +1 -1
  410. package/dist/tab/tab-list.js.map +1 -1
  411. package/dist/tab/tab-panel.d.ts +3 -3
  412. package/dist/tab/tab-panel.d.ts.map +1 -1
  413. package/dist/tab/tab-panel.js +2 -3
  414. package/dist/tab/tab-panel.js.map +1 -1
  415. package/dist/tab/tab.d.ts +2 -2
  416. package/dist/tab/tab.d.ts.map +1 -1
  417. package/dist/tab/tab.js +1 -1
  418. package/dist/tab/tab.js.map +1 -1
  419. package/dist/tag/tag-input.d.ts +2 -2
  420. package/dist/tag/tag-input.d.ts.map +1 -1
  421. package/dist/tag/tag-input.js +1 -2
  422. package/dist/tag/tag-input.js.map +1 -1
  423. package/dist/tag/tag-list-label.d.ts +2 -2
  424. package/dist/tag/tag-list-label.d.ts.map +1 -1
  425. package/dist/tag/tag-list-label.js +1 -1
  426. package/dist/tag/tag-list-label.js.map +1 -1
  427. package/dist/tag/tag-list.d.ts +2 -2
  428. package/dist/tag/tag-list.d.ts.map +1 -1
  429. package/dist/tag/tag-list.js +1 -1
  430. package/dist/tag/tag-list.js.map +1 -1
  431. package/dist/tag/tag-remove.d.ts +1 -1
  432. package/dist/tag/tag-remove.d.ts.map +1 -1
  433. package/dist/tag/tag-remove.js +1 -2
  434. package/dist/tag/tag-remove.js.map +1 -1
  435. package/dist/tag/tag-value.js +1 -1
  436. package/dist/tag/tag-value.js.map +1 -1
  437. package/dist/tag/tag-values.js +1 -1
  438. package/dist/tag/tag-values.js.map +1 -1
  439. package/dist/tag/tag.d.ts +2 -2
  440. package/dist/tag/tag.d.ts.map +1 -1
  441. package/dist/tag/tag.js +1 -1
  442. package/dist/tag/tag.js.map +1 -1
  443. package/dist/toolbar/toolbar-container.d.ts +1 -1
  444. package/dist/toolbar/toolbar-container.d.ts.map +1 -1
  445. package/dist/toolbar/toolbar-input.d.ts +1 -1
  446. package/dist/toolbar/toolbar-input.d.ts.map +1 -1
  447. package/dist/toolbar/toolbar-item.d.ts +2 -2
  448. package/dist/toolbar/toolbar-item.d.ts.map +1 -1
  449. package/dist/toolbar/toolbar-separator.d.ts +1 -1
  450. package/dist/toolbar/toolbar-separator.d.ts.map +1 -1
  451. package/dist/toolbar/toolbar.d.ts +2 -2
  452. package/dist/toolbar/toolbar.d.ts.map +1 -1
  453. package/dist/tooltip/tooltip-anchor.d.ts +1 -1
  454. package/dist/tooltip/tooltip-anchor.d.ts.map +1 -1
  455. package/dist/tooltip/tooltip-anchor.js +15 -4
  456. package/dist/tooltip/tooltip-anchor.js.map +1 -1
  457. package/dist/tooltip/tooltip-arrow.d.ts +1 -1
  458. package/dist/tooltip/tooltip-arrow.d.ts.map +1 -1
  459. package/dist/tooltip/tooltip-arrow.js +1 -1
  460. package/dist/tooltip/tooltip-arrow.js.map +1 -1
  461. package/dist/tooltip/tooltip.js +1 -1
  462. package/dist/tooltip/tooltip.js.map +1 -1
  463. package/dist/visually-hidden/visually-hidden.d.ts +1 -1
  464. package/dist/visually-hidden/visually-hidden.d.ts.map +1 -1
  465. package/package.json +8 -8
  466. package/src/collection/collection-item-offscreen.tsx +1 -1
  467. package/src/combobox/combobox.tsx +47 -1
  468. package/src/composite/composite-container.tsx +2 -2
  469. package/src/composite/composite-hover.tsx +8 -14
  470. package/src/composite/composite-item-offscreen.tsx +2 -2
  471. package/src/composite/composite-item.tsx +2 -2
  472. package/src/composite/composite-renderer.tsx +2 -2
  473. package/src/composite/composite-row.tsx +2 -2
  474. package/src/composite/composite-separator.tsx +2 -2
  475. package/src/composite/composite-typeahead.tsx +2 -2
  476. package/src/composite/composite.tsx +3 -3
  477. package/src/dialog/dialog.tsx +33 -10
  478. package/src/dialog/utils/disable-accessibility-tree-outside.ts +0 -25
  479. package/src/dialog/utils/use-hide-on-interact-outside.ts +3 -2
  480. package/src/focusable/focusable.tsx +53 -10
  481. package/src/form/form-remove.tsx +14 -10
  482. package/src/form/form.tsx +3 -1
  483. package/src/heading/heading.tsx +2 -5
  484. package/src/hovercard/hovercard-disclosure.tsx +18 -4
  485. package/src/hovercard/hovercard.tsx +1 -1
  486. package/src/menu/menu-bar-store.ts +2 -2
  487. package/src/menu/menu-context.tsx +8 -0
  488. package/src/menu/menu-item.tsx +18 -1
  489. package/src/menu/menu-list.tsx +15 -0
  490. package/src/menubar/menubar-context.tsx +0 -5
  491. package/src/menubar/menubar-store.ts +2 -2
  492. package/src/popover/popover-arrow.tsx +3 -3
  493. package/src/popover/popover.tsx +8 -0
  494. package/src/tab/tab-panel.tsx +1 -1
  495. package/src/tag/tag-input.tsx +0 -1
  496. package/src/tag/tag-remove.tsx +0 -1
  497. package/src/tooltip/tooltip-anchor.tsx +23 -8
  498. package/dist/collection-renderer-DsPD9ksD.d.ts.map +0 -1
  499. package/dist/popover-CCqiRKqg.d.ts.map +0 -1
  500. package/src/hovercard/utils/__tests__/polygon-test.ts +0 -66
@@ -16,7 +16,7 @@ import {
16
16
  useCollectionRenderer,
17
17
  } from "../collection/collection-renderer.tsx";
18
18
  import type { CollectionStoreItem } from "../collection/collection-store.ts";
19
- import { useCompositeContext } from "./composite-context.tsx";
19
+ import { useCompositeScopedContext } from "./composite-context.tsx";
20
20
  import type { CompositeStore, CompositeStoreItem } from "./composite-store.ts";
21
21
 
22
22
  const TagName = "div" satisfies ElementType;
@@ -102,7 +102,7 @@ export function useCompositeRenderer<T extends Item = any>({
102
102
  "aria-posinset": ariaPosInSet = 1,
103
103
  ...props
104
104
  }: CompositeRendererProps<T>) {
105
- const context = useCompositeContext();
105
+ const context = useCompositeScopedContext();
106
106
  store = store || (context as typeof store);
107
107
 
108
108
  const orientation = useStoreState(store, (state) =>
@@ -12,7 +12,7 @@ import type { ElementType } from "react";
12
12
  import { useMemo } from "react";
13
13
  import {
14
14
  CompositeRowContext,
15
- useCompositeContext,
15
+ useCompositeScopedContext,
16
16
  } from "./composite-context.tsx";
17
17
  import type { CompositeStore } from "./composite-store.ts";
18
18
 
@@ -44,7 +44,7 @@ export const useCompositeRow = createHook<TagName, CompositeRowOptions>(
44
44
  "aria-posinset": ariaPosInSet,
45
45
  ...props
46
46
  }) {
47
- const context = useCompositeContext();
47
+ const context = useCompositeScopedContext();
48
48
  store = store || context;
49
49
 
50
50
  invariant(
@@ -5,7 +5,7 @@ import { invariant } from "@ariakit/utils";
5
5
  import type { ElementType } from "react";
6
6
  import type { SeparatorOptions } from "../separator/separator.tsx";
7
7
  import { useSeparator } from "../separator/separator.tsx";
8
- import { useCompositeContext } from "./composite-context.tsx";
8
+ import { useCompositeScopedContext } from "./composite-context.tsx";
9
9
  import type { CompositeStore } from "./composite-store.ts";
10
10
 
11
11
  const TagName = "hr" satisfies ElementType;
@@ -29,7 +29,7 @@ export const useCompositeSeparator = createHook<
29
29
  TagName,
30
30
  CompositeSeparatorOptions
31
31
  >(function useCompositeSeparator({ store, ...props }) {
32
- const context = useCompositeContext();
32
+ const context = useCompositeScopedContext();
33
33
  store = store || context;
34
34
 
35
35
  invariant(
@@ -16,7 +16,7 @@ import {
16
16
  } from "@ariakit/utils";
17
17
  import type { ElementType, KeyboardEvent } from "react";
18
18
  import { useRef } from "react";
19
- import { useCompositeContext } from "./composite-context.tsx";
19
+ import { useCompositeScopedContext } from "./composite-context.tsx";
20
20
  import type { CompositeStore, CompositeStoreItem } from "./composite-store.ts";
21
21
  import { flipItems } from "./utils.ts";
22
22
 
@@ -112,7 +112,7 @@ export const useCompositeTypeahead = createHook<
112
112
  TagName,
113
113
  CompositeTypeaheadOptions
114
114
  >(function useCompositeTypeahead({ store, typeahead = true, ...props }) {
115
- const context = useCompositeContext();
115
+ const context = useCompositeScopedContext();
116
116
  store = store || context;
117
117
 
118
118
  invariant(
@@ -35,7 +35,7 @@ import { useCallback, useEffect, useRef, useState } from "react";
35
35
  import type { FocusableOptions } from "../focusable/focusable.tsx";
36
36
  import { useFocusable } from "../focusable/focusable.tsx";
37
37
  import {
38
- CompositeContextProvider,
38
+ CompositeScopedContextProvider,
39
39
  useCompositeProviderContext,
40
40
  } from "./composite-context.tsx";
41
41
  import type { CompositeStore, CompositeStoreItem } from "./composite-store.ts";
@@ -445,9 +445,9 @@ export const useComposite = createHook<TagName, CompositeOptions>(
445
445
  props = useWrapElement(
446
446
  props,
447
447
  (element) => (
448
- <CompositeContextProvider value={store}>
448
+ <CompositeScopedContextProvider value={store}>
449
449
  {element}
450
- </CompositeContextProvider>
450
+ </CompositeScopedContextProvider>
451
451
  ),
452
452
  [store],
453
453
  );
@@ -20,6 +20,8 @@ import {
20
20
  getWindow,
21
21
  addGlobalEventListener,
22
22
  getFirstTabbableIn,
23
+ isElement,
24
+ isNode,
23
25
  isFocusable,
24
26
  chain,
25
27
  isSafari,
@@ -497,13 +499,16 @@ export const useDialog = createHook<TagName, DialogOptions>(function useDialog({
497
499
  // Ignore the event if the current dialog is marked by another dialog.
498
500
  // This guarantees that only the topmost dialog will close on Escape.
499
501
  if (isElementMarked(dialog)) return;
500
- const target = event.target as Element | null;
501
- if (!target) return;
502
+ const target = event.target;
503
+ // Guard against non-node targets (e.g. a synthetic event dispatched on
504
+ // window) so `contains` doesn't throw. `isNode` rather than `isElement`
505
+ // keeps non-element nodes working with `contains`, as before.
506
+ if (!isNode(target)) return;
502
507
  const { disclosureElement } = store.getState();
503
508
  // This considers valid targets only the disclosure element or descendants
504
509
  // of the dialog element.
505
510
  const isValidTarget = () => {
506
- if (target.tagName === "BODY") return true;
511
+ if (isElement(target) && target.tagName === "BODY") return true;
507
512
  if (contains(dialog, target)) return true;
508
513
  if (!disclosureElement) return true;
509
514
  if (contains(disclosureElement, target)) return true;
@@ -608,6 +613,23 @@ export function createDialogComponent<T extends DialogOptions>(
608
613
  });
609
614
  }
610
615
 
616
+ const DialogImpl = forwardRef(function DialogImpl(props: DialogProps) {
617
+ const htmlProps = useDialog(props);
618
+ return createElement(TagName, htmlProps);
619
+ });
620
+
621
+ const DialogWithStore = createDialogComponent(
622
+ DialogImpl,
623
+ useDialogProviderContext,
624
+ );
625
+
626
+ const DialogWithInternalStore = forwardRef(function DialogWithInternalStore(
627
+ props: DialogProps,
628
+ ) {
629
+ const store = useDialogStore({ open: props.open });
630
+ return <DialogWithStore {...props} store={store} />;
631
+ });
632
+
611
633
  /**
612
634
  * Renders a dialog similar to the native `dialog` element that's rendered in a
613
635
  * [`portal`](https://ariakit.com/reference/dialog#portal) by default.
@@ -628,13 +650,14 @@ export function createDialogComponent<T extends DialogOptions>(
628
650
  * </Dialog>
629
651
  * ```
630
652
  */
631
- export const Dialog = createDialogComponent(
632
- forwardRef(function Dialog(props: DialogProps) {
633
- const htmlProps = useDialog(props);
634
- return createElement(TagName, htmlProps);
635
- }),
636
- useDialogProviderContext,
637
- );
653
+ export const Dialog = forwardRef(function Dialog(props: DialogProps) {
654
+ const context = useDialogProviderContext();
655
+ // The hoisted store is only needed for the unmountOnHide mounted-state gate.
656
+ if (props.store || context || !props.unmountOnHide) {
657
+ return <DialogWithStore {...props} />;
658
+ }
659
+ return <DialogWithInternalStore {...props} />;
660
+ });
638
661
 
639
662
  export interface DialogOptions<T extends ElementType = TagName>
640
663
  extends FocusableOptions<T>, PortalOptions<T>, DisclosureContentOptions<T> {
@@ -1,30 +1,5 @@
1
- import { isBackdrop } from "./is-backdrop.ts";
2
1
  import { setAttribute } from "./orchestrate.ts";
3
- import { walkTreeOutside } from "./walk-tree-outside.ts";
4
-
5
- type Elements = Array<Element | null>;
6
2
 
7
3
  export function hideElementFromAccessibilityTree(element: Element) {
8
4
  return setAttribute(element, "aria-hidden", "true");
9
5
  }
10
-
11
- export function disableAccessibilityTreeOutside(
12
- id: string,
13
- elements: Elements,
14
- ) {
15
- const cleanups: Array<() => void> = [];
16
- const ids = elements.map((el) => el?.id);
17
-
18
- walkTreeOutside(id, elements, (element) => {
19
- if (isBackdrop(element, ...ids)) return;
20
- cleanups.unshift(hideElementFromAccessibilityTree(element));
21
- });
22
-
23
- const restoreAccessibilityTree = () => {
24
- for (const cleanup of cleanups) {
25
- cleanup();
26
- }
27
- };
28
-
29
- return restoreAccessibilityTree;
30
- }
@@ -5,6 +5,7 @@ import {
5
5
  getDocument,
6
6
  getWindow,
7
7
  addGlobalEventListener,
8
+ isElement,
8
9
  } from "@ariakit/utils";
9
10
  import type { MutableRefObject } from "react";
10
11
  import { useEffect, useRef } from "react";
@@ -78,9 +79,9 @@ function useEventOutside({
78
79
  if (!open) return;
79
80
  const onEvent = (event: Event) => {
80
81
  const { contentElement, disclosureElement } = store.getState();
81
- const target = event.target as Element | null;
82
+ const target = event.target;
82
83
  if (!contentElement) return;
83
- if (!target) return;
84
+ if (!isElement(target)) return;
84
85
  // When an element is unmounted right after it receives focus, the focus
85
86
  // event is triggered after that, when the element isn't part of the
86
87
  // current document anymore. We just ignore it.
@@ -10,6 +10,7 @@ import {
10
10
  import type { Options, Props } from "@ariakit/react-utils";
11
11
  import {
12
12
  addGlobalEventListener,
13
+ isElement,
13
14
  isFocusEventOutside,
14
15
  isSelfTarget,
15
16
  queueBeforeEvent,
@@ -119,6 +120,18 @@ function needsSafariTabIndex(tagName?: string, inputType?: string) {
119
120
  return false;
120
121
  }
121
122
 
123
+ function isNativeSubmitControl(element: HTMLElement) {
124
+ if (element.tagName === "BUTTON") {
125
+ const { type } = element as HTMLButtonElement;
126
+ return type === "submit";
127
+ }
128
+ if (element.tagName === "INPUT") {
129
+ const { type } = element as HTMLInputElement;
130
+ return type === "submit" || type === "image";
131
+ }
132
+ return false;
133
+ }
134
+
122
135
  function getTabIndex({
123
136
  focusable,
124
137
  trulyDisabled,
@@ -170,13 +183,11 @@ let hasInstalledGlobalEventListeners = false;
170
183
  let isKeyboardModality = true;
171
184
 
172
185
  function onGlobalMouseDown(event: MouseEvent) {
173
- const target = event.target as HTMLElement | EventTarget | null;
174
- if (target && "hasAttribute" in target) {
175
- // If the target element is already focus-visible, we keep the keyboard
176
- // modality.
177
- if (!target.hasAttribute("data-focus-visible")) {
178
- isKeyboardModality = false;
179
- }
186
+ const target = event.target;
187
+ // If the target element is already focus-visible, we keep the keyboard
188
+ // modality.
189
+ if (isElement(target) && !target.hasAttribute("data-focus-visible")) {
190
+ isKeyboardModality = false;
180
191
  }
181
192
  }
182
193
 
@@ -225,16 +236,26 @@ export const useFocusable = createHook<TagName, FocusableOptions>(
225
236
  const disabled = focusable && disabledFromProps(props);
226
237
  const trulyDisabled = disabled && !accessibleWhenDisabled;
227
238
  const [focusVisible, setFocusVisible] = useState(false);
239
+ const focusVisibleRef = useRef(false);
240
+ const nativeSubmitObserverCleanupRef = useRef<(() => void) | null>(null);
241
+ const cleanupFocusVisible = useEvent((element: HTMLElement | null) => {
242
+ nativeSubmitObserverCleanupRef.current?.();
243
+ nativeSubmitObserverCleanupRef.current = null;
244
+ focusVisibleRef.current = false;
245
+ element?.removeAttribute("data-focus-visible");
246
+ });
228
247
 
229
248
  // When the focusable element is disabled, it doesn't trigger a blur event
230
249
  // so we can't set focusVisible to false there. Instead, we have to do it
231
250
  // here by checking the element's disabled attribute.
232
251
  useEffect(() => {
233
252
  if (!focusable) return;
234
- if (trulyDisabled && focusVisible) {
253
+ if (!trulyDisabled) return;
254
+ cleanupFocusVisible(ref.current);
255
+ if (focusVisible) {
235
256
  setFocusVisible(false);
236
257
  }
237
- }, [focusable, trulyDisabled, focusVisible]);
258
+ }, [focusable, trulyDisabled, focusVisible, cleanupFocusVisible]);
238
259
 
239
260
  // When an element that has focus becomes hidden, it doesn't trigger a blur
240
261
  // event so we can't set focusVisible to false there. We observe the element
@@ -248,6 +269,7 @@ export const useFocusable = createHook<TagName, FocusableOptions>(
248
269
  if (typeof IntersectionObserver === "undefined") return;
249
270
  const observer = new IntersectionObserver(() => {
250
271
  if (!isFocusable(element)) {
272
+ focusVisibleRef.current = false;
251
273
  setFocusVisible(false);
252
274
  }
253
275
  });
@@ -255,6 +277,10 @@ export const useFocusable = createHook<TagName, FocusableOptions>(
255
277
  return () => observer.disconnect();
256
278
  }, [focusable, focusVisible]);
257
279
 
280
+ useEffect(() => {
281
+ return () => nativeSubmitObserverCleanupRef.current?.();
282
+ }, []);
283
+
258
284
  // Disable events when the element is disabled.
259
285
  const onKeyPressCapture = useDisableEvent(
260
286
  props.onKeyPressCapture,
@@ -286,6 +312,22 @@ export const useFocusable = createHook<TagName, FocusableOptions>(
286
312
  // other data attributes like data-active-item. See
287
313
  // https://github.com/ariakit/ariakit/issues/4083
288
314
  element.dataset.focusVisible = "true";
315
+ focusVisibleRef.current = true;
316
+ // React 19's useFormStatus may lose the pending state when local
317
+ // component state changes while a native submit control is pending.
318
+ if (isNativeSubmitControl(element)) {
319
+ nativeSubmitObserverCleanupRef.current?.();
320
+ nativeSubmitObserverCleanupRef.current = null;
321
+ if (typeof IntersectionObserver !== "undefined") {
322
+ const observer = new IntersectionObserver(() => {
323
+ if (isFocusable(element)) return;
324
+ cleanupFocusVisible(element);
325
+ });
326
+ observer.observe(element);
327
+ nativeSubmitObserverCleanupRef.current = () => observer.disconnect();
328
+ }
329
+ return;
330
+ }
289
331
  setFocusVisible(true);
290
332
  };
291
333
 
@@ -296,6 +338,7 @@ export const useFocusable = createHook<TagName, FocusableOptions>(
296
338
  if (event.defaultPrevented) return;
297
339
  if (!focusable) return;
298
340
  if (focusVisible) return;
341
+ if (focusVisibleRef.current) return;
299
342
  if (event.metaKey) return;
300
343
  if (event.altKey) return;
301
344
  if (event.ctrlKey) return;
@@ -335,7 +378,7 @@ export const useFocusable = createHook<TagName, FocusableOptions>(
335
378
  // Since we set the data-focus-visible attribute on the element in the
336
379
  // handleFocusVisible function, we remove it directly here. Otherwise, the
337
380
  // attribute might not be removed on lower-end devices.
338
- event.currentTarget.removeAttribute("data-focus-visible");
381
+ cleanupFocusVisible(event.currentTarget);
339
382
  setFocusVisible(false);
340
383
  });
341
384
 
@@ -62,9 +62,10 @@ function findPushButton(
62
62
  * const values = useStoreState(store, "values");
63
63
  *
64
64
  * <Form store={store}>
65
- * {values.languages.map((_, i) => (
66
- * <FormInput key={i} name={store.names.languages[i]} />
67
- * ))}
65
+ * {values.languages.map((language, i) => {
66
+ * if (language == null) return null;
67
+ * return <FormInput key={i} name={store.names.languages[i]} />;
68
+ * })}
68
69
  * <Role {...props}>Remove first language</Role>
69
70
  * </Form>
70
71
  * ```
@@ -136,7 +137,7 @@ export const useFormRemove = createHook<TagName, FormRemoveOptions>(
136
137
  * prop to `false`.
137
138
  * @see https://ariakit.com/components/form
138
139
  * @example
139
- * ```jsx {13}
140
+ * ```jsx {15}
140
141
  * const form = useFormStore({
141
142
  * defaultValues: {
142
143
  * languages: ["JavaScript", "PHP"],
@@ -146,12 +147,15 @@ export const useFormRemove = createHook<TagName, FormRemoveOptions>(
146
147
  * const values = useStoreState(form, "values");
147
148
  *
148
149
  * <Form store={form}>
149
- * {values.languages.map((_, i) => (
150
- * <div key={i}>
151
- * <FormInput name={form.names.languages[i]} />
152
- * <FormRemove name={form.names.languages} index={i} />
153
- * </div>
154
- * ))}
150
+ * {values.languages.map((language, i) => {
151
+ * if (language == null) return null;
152
+ * return (
153
+ * <div key={i}>
154
+ * <FormInput name={form.names.languages[i]} />
155
+ * <FormRemove name={form.names.languages} index={i} />
156
+ * </div>
157
+ * );
158
+ * })}
155
159
  * </Form>
156
160
  * ```
157
161
  */
package/src/form/form.tsx CHANGED
@@ -104,8 +104,10 @@ export const useForm = createHook<TagName, FormOptions>(function useForm({
104
104
  }, [autoFocusOnSubmit, submitFailed, items]);
105
105
 
106
106
  const onSubmitProp = props.onSubmit;
107
+ // React 19 types submit handlers with SubmitEvent instead of FormEvent.
108
+ type SubmitEvent = Parameters<NonNullable<typeof onSubmitProp>>[0];
107
109
 
108
- const onSubmit = useEvent((event: FormEvent<HTMLType>) => {
110
+ const onSubmit = useEvent((event: SubmitEvent) => {
109
111
  onSubmitProp?.(event);
110
112
  if (event.defaultPrevented) return;
111
113
  event.preventDefault();
@@ -7,7 +7,7 @@ import {
7
7
  } from "@ariakit/react-utils";
8
8
  import type { Options, Props } from "@ariakit/react-utils";
9
9
  import type { ElementType } from "react";
10
- import { useContext, useMemo, useRef } from "react";
10
+ import { useContext, useRef } from "react";
11
11
  import { HeadingContext } from "./heading-context.tsx";
12
12
  import type { HeadingLevels } from "./utils.ts";
13
13
 
@@ -33,10 +33,7 @@ export const useHeading = createHook<TagName, HeadingOptions>(
33
33
  const level: HeadingLevels = useContext(HeadingContext) || 1;
34
34
  const Element = `h${level}` as const;
35
35
  const tagName = useTagName(ref, Element);
36
- const isNativeHeading = useMemo(
37
- () => !!tagName && /^h\d$/.test(tagName),
38
- [tagName],
39
- );
36
+ const isNativeHeading = !!tagName && /^h\d$/.test(tagName);
40
37
 
41
38
  props = {
42
39
  render: <Element />,
@@ -7,7 +7,13 @@ import {
7
7
  } from "@ariakit/react-utils";
8
8
  import type { Props } from "@ariakit/react-utils";
9
9
  import { sync } from "@ariakit/store";
10
- import { contains, addGlobalEventListener, invariant } from "@ariakit/utils";
10
+ import {
11
+ contains,
12
+ addGlobalEventListener,
13
+ invariant,
14
+ isElement,
15
+ isNode,
16
+ } from "@ariakit/utils";
11
17
  import type {
12
18
  ElementType,
13
19
  MouseEvent,
@@ -58,8 +64,11 @@ export const useHovercardDisclosure = createHook<
58
64
  if (!visible) return;
59
65
  const onBlur = (event: FocusEvent) => {
60
66
  if (!store) return;
61
- const nextActiveElement = event.relatedTarget as Element | null;
62
- if (nextActiveElement) {
67
+ const nextActiveElement = event.relatedTarget;
68
+ // `isNode` rather than `isElement` so non-element nodes keep working with
69
+ // `contains` (as before); a non-node relatedTarget (e.g. window) would
70
+ // make `contains` throw, so it falls through to hiding the disclosure.
71
+ if (isNode(nextActiveElement)) {
63
72
  const {
64
73
  anchorElement: anchor,
65
74
  popoverElement: popover,
@@ -72,7 +81,12 @@ export const useHovercardDisclosure = createHook<
72
81
  // it's going to render focus trap elements outside of the portal.
73
82
  // These elements may transfer focus to the disclosure button, so we
74
83
  // also ignore them here.
75
- if (nextActiveElement.hasAttribute("data-focus-trap")) return;
84
+ if (
85
+ isElement(nextActiveElement) &&
86
+ nextActiveElement.hasAttribute("data-focus-trap")
87
+ ) {
88
+ return;
89
+ }
76
90
  }
77
91
  setVisible(false);
78
92
  };
@@ -65,7 +65,7 @@ function isMovingOnHovercard(
65
65
  // The mouse is moving on an element inside the anchor element.
66
66
  if (anchor && contains(anchor, target)) return true;
67
67
  // The mouse is moving on an element inside a nested hovercard.
68
- if (nested?.some((card) => isMovingOnHovercard(target, card, anchor))) {
68
+ if (nested?.some((card) => hasFocusWithin(card) || contains(card, target))) {
69
69
  return true;
70
70
  }
71
71
  return false;
@@ -27,8 +27,8 @@ export function useMenuBarStoreProps<T extends Core.MenuBarStore>(
27
27
  * instead.
28
28
  * @example
29
29
  * ```jsx
30
- * const menu = useMenuBarStore();
31
- * <MenuBar store={menu} />
30
+ * const menubar = useMenuBarStore();
31
+ * <MenuBar store={menubar} />
32
32
  * ```
33
33
  */
34
34
  export function useMenuBarStore(props: MenuBarStoreProps = {}): MenuBarStore {
@@ -74,3 +74,11 @@ export const MenuBarScopedContextProvider = MenubarScopedContextProvider;
74
74
  export const MenuItemCheckedContext = createContext<boolean | undefined>(
75
75
  undefined,
76
76
  );
77
+
78
+ /**
79
+ * Whether the enclosing menu list is currently hidden (e.g. a closed menu
80
+ * rendered without `unmountOnHide`). `MenuItem` uses it to skip registering
81
+ * items that aren't shown yet. Defaults to `false` so items without a menu list
82
+ * ancestor (such as menubar items) keep registering.
83
+ */
84
+ export const MenuListHiddenContext = createContext(false);
@@ -17,6 +17,7 @@ import {
17
17
  invariant,
18
18
  } from "@ariakit/utils";
19
19
  import type { BooleanOrCallback } from "@ariakit/utils";
20
+ import { useContext } from "react";
20
21
  import type { ElementType, MouseEvent } from "react";
21
22
  import type { CompositeHoverOptions } from "../composite/composite-hover.tsx";
22
23
  import { useCompositeHover } from "../composite/composite-hover.tsx";
@@ -24,7 +25,10 @@ import type { CompositeItemOptions } from "../composite/composite-item.tsx";
24
25
  import { useCompositeItem } from "../composite/composite-item.tsx";
25
26
  import { useMenubarScopedContext } from "../menubar/menubar-context.tsx";
26
27
  import type { MenubarStore } from "../menubar/menubar-store.ts";
27
- import { useMenuScopedContext } from "./menu-context.tsx";
28
+ import {
29
+ MenuListHiddenContext,
30
+ useMenuScopedContext,
31
+ } from "./menu-context.tsx";
28
32
  import type { MenuStore, MenuStoreState } from "./menu-store.ts";
29
33
 
30
34
  const TagName = "div" satisfies ElementType;
@@ -108,6 +112,10 @@ export const useMenuItem = createHook<TagName, MenuItemOptions>(
108
112
  "contentElement" in state ? state.contentElement : null,
109
113
  );
110
114
 
115
+ // Whether the enclosing menu list is currently hidden (provided by
116
+ // `MenuList`; see `MenuListHiddenContext`).
117
+ const menuListHidden = useContext(MenuListHiddenContext);
118
+
111
119
  const role = getPopupItemRole(contentElement, "menuitem");
112
120
 
113
121
  props = {
@@ -120,6 +128,15 @@ export const useMenuItem = createHook<TagName, MenuItemOptions>(
120
128
  store,
121
129
  preventScrollOnKeyDown,
122
130
  ...props,
131
+ // Skip registering items while the menu list is hidden. Unlike a Select,
132
+ // a Menu doesn't interact with its items while hidden, so registering
133
+ // them isn't useful. Registering many hidden menus' items at once on
134
+ // mount can also cascade into React's "Maximum update depth exceeded"
135
+ // error. Using the list's actual hidden state (rather than the store's
136
+ // `mounted` state) keeps items registered in `alwaysVisible` or
137
+ // `hidden={false}` menus, where the list is shown even while closed.
138
+ // See https://github.com/ariakit/ariakit/issues/3214.
139
+ shouldRegisterItem: menuListHidden ? false : props.shouldRegisterItem,
123
140
  });
124
141
 
125
142
  props = useCompositeHover({
@@ -19,6 +19,7 @@ import { useComposite } from "../composite/composite.tsx";
19
19
  import type { DisclosureContentOptions } from "../disclosure/disclosure-content.tsx";
20
20
  import { isHidden } from "../disclosure/disclosure-content.tsx";
21
21
  import {
22
+ MenuListHiddenContext,
22
23
  MenuScopedContextProvider,
23
24
  useMenuProviderContext,
24
25
  } from "./menu-context.tsx";
@@ -157,6 +158,20 @@ export const useMenuList = createHook<TagName, MenuListOptions>(
157
158
  const hidden = isHidden(mounted, props.hidden, alwaysVisible);
158
159
  const style = hidden ? { ...props.style, display: "none" } : props.style;
159
160
 
161
+ // Expose the list's actual hidden state so MenuItem can avoid registering
162
+ // items while they're not shown. This accounts for `alwaysVisible` and
163
+ // `hidden={false}`, where the list is visible even though the store is
164
+ // closed. See https://github.com/ariakit/ariakit/issues/3214.
165
+ props = useWrapElement(
166
+ props,
167
+ (element) => (
168
+ <MenuListHiddenContext.Provider value={hidden}>
169
+ {element}
170
+ </MenuListHiddenContext.Provider>
171
+ ),
172
+ [hidden],
173
+ );
174
+
160
175
  props = {
161
176
  "aria-labelledby": ariaLabelledBy,
162
177
  hidden,
@@ -1,5 +1,4 @@
1
1
  import { createStoreContext } from "@ariakit/react-utils";
2
- import { createContext } from "react";
3
2
  import {
4
3
  CompositeContextProvider,
5
4
  CompositeScopedContextProvider,
@@ -33,7 +32,3 @@ export const useMenubarProviderContext = menubar.useProviderContext;
33
32
  export const MenubarContextProvider = menubar.ContextProvider;
34
33
 
35
34
  export const MenubarScopedContextProvider = menubar.ScopedContextProvider;
36
-
37
- export const MenuItemCheckedContext = createContext<boolean | undefined>(
38
- undefined,
39
- );
@@ -22,9 +22,9 @@ export function useMenubarStoreProps<T extends Core.MenubarStore>(
22
22
  * @see https://ariakit.com/components/menubar
23
23
  * @example
24
24
  * ```jsx
25
- * const menu = useMenubarStore();
25
+ * const menubar = useMenubarStore();
26
26
  *
27
- * <Menubar store={menu} />
27
+ * <Menubar store={menubar} />
28
28
  * ```
29
29
  */
30
30
  export function useMenubarStore(props: MenubarStoreProps = {}): MenubarStore {
@@ -128,7 +128,7 @@ export const usePopoverArrow = createHook<TagName, PopoverArrowOptions>(
128
128
  // the appearance of borders on HTML elements.
129
129
  <path
130
130
  fill="none"
131
- stroke={`var(--ak-layer, ${fill})`}
131
+ stroke={fill}
132
132
  d={POPOVER_ARROW_PATH}
133
133
  mask={`url(#${maskId})`}
134
134
  />
@@ -162,8 +162,8 @@ export const usePopoverArrow = createHook<TagName, PopoverArrowOptions>(
162
162
  width: "1em",
163
163
  height: "1em",
164
164
  pointerEvents: "none",
165
- fill: `var(--ak-layer, ${fill})`,
166
- stroke: `var(--ak-layer-border, ${stroke})`,
165
+ fill,
166
+ stroke,
167
167
  strokeWidth,
168
168
  ...props.style,
169
169
  },
@@ -526,6 +526,14 @@ export interface PopoverOptions<
526
526
  * @default false
527
527
  */
528
528
  fixed?: boolean;
529
+ /**
530
+ * @default false
531
+ */
532
+ modal?: DialogOptions<T>["modal"];
533
+ /**
534
+ * @default false
535
+ */
536
+ portal?: DialogOptions<T>["portal"];
529
537
  /**
530
538
  * The distance between the popover and the anchor element.
531
539
  *
@@ -123,7 +123,7 @@ export const useTabPanel = createHook<TagName, TabPanelOptions>(
123
123
  return () => {
124
124
  element.removeEventListener("scroll", onScroll);
125
125
  };
126
- }, [scrollRestoration, mounted, tabId, getScrollElement, store]);
126
+ }, [scrollRestoration, mounted, tabId, getScrollElement]);
127
127
 
128
128
  const [hasTabbableChildren, setHasTabbableChildren] = useState(false);
129
129