@basic-ui/core 0.0.35 → 0.0.38

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 (308) hide show
  1. package/build/cjs/index.js +84 -83
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/Accordion/Accordion.d.ts +0 -0
  4. package/build/esm/Accordion/Accordion.js +0 -0
  5. package/build/esm/Accordion/Accordion.js.map +0 -0
  6. package/build/esm/Accordion/AccordionBody.d.ts +0 -0
  7. package/build/esm/Accordion/AccordionBody.js +0 -0
  8. package/build/esm/Accordion/AccordionBody.js.map +0 -0
  9. package/build/esm/Accordion/AccordionHeader.d.ts +0 -0
  10. package/build/esm/Accordion/AccordionHeader.js +0 -0
  11. package/build/esm/Accordion/AccordionHeader.js.map +0 -0
  12. package/build/esm/Accordion/AccordionItem.d.ts +0 -0
  13. package/build/esm/Accordion/AccordionItem.js +1 -2
  14. package/build/esm/Accordion/AccordionItem.js.map +1 -1
  15. package/build/esm/Accordion/context.d.ts +0 -0
  16. package/build/esm/Accordion/context.js +0 -0
  17. package/build/esm/Accordion/context.js.map +0 -0
  18. package/build/esm/Accordion/index.d.ts +0 -0
  19. package/build/esm/Accordion/index.js +0 -0
  20. package/build/esm/Accordion/index.js.map +0 -0
  21. package/build/esm/Accordion/scopeQuery.d.ts +0 -0
  22. package/build/esm/Accordion/scopeQuery.js +0 -0
  23. package/build/esm/Accordion/scopeQuery.js.map +0 -0
  24. package/build/esm/CheckBox/CheckBox.d.ts +0 -0
  25. package/build/esm/CheckBox/CheckBox.js +0 -0
  26. package/build/esm/CheckBox/CheckBox.js.map +0 -0
  27. package/build/esm/CheckBox/index.d.ts +0 -0
  28. package/build/esm/CheckBox/index.js +0 -0
  29. package/build/esm/CheckBox/index.js.map +0 -0
  30. package/build/esm/ComboBox/Combobox.d.ts +0 -0
  31. package/build/esm/ComboBox/Combobox.js +2 -2
  32. package/build/esm/ComboBox/Combobox.js.map +1 -1
  33. package/build/esm/ComboBox/ComboboxButton.d.ts +0 -0
  34. package/build/esm/ComboBox/ComboboxButton.js +0 -0
  35. package/build/esm/ComboBox/ComboboxButton.js.map +0 -0
  36. package/build/esm/ComboBox/ComboboxInput.d.ts +0 -0
  37. package/build/esm/ComboBox/ComboboxInput.js +0 -0
  38. package/build/esm/ComboBox/ComboboxInput.js.map +0 -0
  39. package/build/esm/ComboBox/ComboboxLabel.d.ts +0 -0
  40. package/build/esm/ComboBox/ComboboxLabel.js +0 -0
  41. package/build/esm/ComboBox/ComboboxLabel.js.map +0 -0
  42. package/build/esm/ComboBox/ComboboxList.d.ts +0 -0
  43. package/build/esm/ComboBox/ComboboxList.js +0 -0
  44. package/build/esm/ComboBox/ComboboxList.js.map +0 -0
  45. package/build/esm/ComboBox/ComboboxOption.d.ts +0 -0
  46. package/build/esm/ComboBox/ComboboxOption.js +0 -0
  47. package/build/esm/ComboBox/ComboboxOption.js.map +0 -0
  48. package/build/esm/ComboBox/ComboboxPopover.d.ts +0 -0
  49. package/build/esm/ComboBox/ComboboxPopover.js +0 -0
  50. package/build/esm/ComboBox/ComboboxPopover.js.map +0 -0
  51. package/build/esm/ComboBox/cities.d.ts +0 -0
  52. package/build/esm/ComboBox/cities.js +0 -0
  53. package/build/esm/ComboBox/cities.js.map +0 -0
  54. package/build/esm/ComboBox/context.d.ts +0 -0
  55. package/build/esm/ComboBox/context.js +0 -0
  56. package/build/esm/ComboBox/context.js.map +0 -0
  57. package/build/esm/ComboBox/hooks.d.ts +0 -0
  58. package/build/esm/ComboBox/hooks.js +0 -0
  59. package/build/esm/ComboBox/hooks.js.map +0 -0
  60. package/build/esm/ComboBox/index.d.ts +0 -0
  61. package/build/esm/ComboBox/index.js +0 -0
  62. package/build/esm/ComboBox/index.js.map +0 -0
  63. package/build/esm/ComboBox/makeHash.d.ts +0 -0
  64. package/build/esm/ComboBox/makeHash.js +0 -0
  65. package/build/esm/ComboBox/makeHash.js.map +0 -0
  66. package/build/esm/ComboBox/scopeQuery.d.ts +0 -0
  67. package/build/esm/ComboBox/scopeQuery.js +0 -0
  68. package/build/esm/ComboBox/scopeQuery.js.map +0 -0
  69. package/build/esm/FocusLock/FocusLock.d.ts +0 -0
  70. package/build/esm/FocusLock/FocusLock.js +0 -0
  71. package/build/esm/FocusLock/FocusLock.js.map +0 -0
  72. package/build/esm/FocusLock/index.d.ts +0 -0
  73. package/build/esm/FocusLock/index.js +0 -0
  74. package/build/esm/FocusLock/index.js.map +0 -0
  75. package/build/esm/FocusLock/tabUtils.d.ts +1 -0
  76. package/build/esm/FocusLock/tabUtils.js +12 -0
  77. package/build/esm/FocusLock/tabUtils.js.map +1 -1
  78. package/build/esm/FocusLock/useFocusLock.d.ts +0 -0
  79. package/build/esm/FocusLock/useFocusLock.js +4 -11
  80. package/build/esm/FocusLock/useFocusLock.js.map +1 -1
  81. package/build/esm/List/List.d.ts +0 -0
  82. package/build/esm/List/List.js +0 -0
  83. package/build/esm/List/List.js.map +0 -0
  84. package/build/esm/List/ListItem.d.ts +0 -0
  85. package/build/esm/List/ListItem.js +0 -0
  86. package/build/esm/List/ListItem.js.map +0 -0
  87. package/build/esm/List/context.d.ts +0 -0
  88. package/build/esm/List/context.js +0 -0
  89. package/build/esm/List/context.js.map +0 -0
  90. package/build/esm/List/index.d.ts +0 -0
  91. package/build/esm/List/index.js +0 -0
  92. package/build/esm/List/index.js.map +0 -0
  93. package/build/esm/Menu/Menu.d.ts +0 -0
  94. package/build/esm/Menu/Menu.js +1 -2
  95. package/build/esm/Menu/Menu.js.map +1 -1
  96. package/build/esm/Menu/MenuButton.d.ts +0 -0
  97. package/build/esm/Menu/MenuButton.js +3 -3
  98. package/build/esm/Menu/MenuButton.js.map +1 -1
  99. package/build/esm/Menu/MenuItem.d.ts +0 -0
  100. package/build/esm/Menu/MenuItem.js +3 -4
  101. package/build/esm/Menu/MenuItem.js.map +1 -1
  102. package/build/esm/Menu/MenuList.d.ts +0 -0
  103. package/build/esm/Menu/MenuList.js +0 -0
  104. package/build/esm/Menu/MenuList.js.map +0 -0
  105. package/build/esm/Menu/MenuPopover.d.ts +0 -0
  106. package/build/esm/Menu/MenuPopover.js +0 -0
  107. package/build/esm/Menu/MenuPopover.js.map +0 -0
  108. package/build/esm/Menu/context.d.ts +0 -0
  109. package/build/esm/Menu/context.js +0 -0
  110. package/build/esm/Menu/context.js.map +0 -0
  111. package/build/esm/Menu/index.d.ts +0 -0
  112. package/build/esm/Menu/index.js +0 -0
  113. package/build/esm/Menu/index.js.map +0 -0
  114. package/build/esm/Menu/scope.d.ts +0 -0
  115. package/build/esm/Menu/scope.js +0 -0
  116. package/build/esm/Menu/scope.js.map +0 -0
  117. package/build/esm/Modal/Modal.d.ts +0 -0
  118. package/build/esm/Modal/Modal.js +2 -2
  119. package/build/esm/Modal/Modal.js.map +1 -1
  120. package/build/esm/Modal/ModalBackdrop.d.ts +0 -0
  121. package/build/esm/Modal/ModalBackdrop.js +0 -0
  122. package/build/esm/Modal/ModalBackdrop.js.map +0 -0
  123. package/build/esm/Modal/index.d.ts +0 -0
  124. package/build/esm/Modal/index.js +0 -0
  125. package/build/esm/Modal/index.js.map +0 -0
  126. package/build/esm/Popper/Popper.d.ts +0 -0
  127. package/build/esm/Popper/Popper.js +5 -0
  128. package/build/esm/Popper/Popper.js.map +1 -1
  129. package/build/esm/Popper/PopperArrow.d.ts +0 -0
  130. package/build/esm/Popper/PopperArrow.js +0 -0
  131. package/build/esm/Popper/PopperArrow.js.map +0 -0
  132. package/build/esm/Popper/context.d.ts +0 -0
  133. package/build/esm/Popper/context.js +0 -0
  134. package/build/esm/Popper/context.js.map +0 -0
  135. package/build/esm/Popper/index.d.ts +0 -0
  136. package/build/esm/Popper/index.js +0 -0
  137. package/build/esm/Popper/index.js.map +0 -0
  138. package/build/esm/Portal/Portal.d.ts +0 -0
  139. package/build/esm/Portal/Portal.js +0 -0
  140. package/build/esm/Portal/Portal.js.map +0 -0
  141. package/build/esm/Portal/index.d.ts +0 -0
  142. package/build/esm/Portal/index.js +0 -0
  143. package/build/esm/Portal/index.js.map +0 -0
  144. package/build/esm/RadioButton/RadioButton.d.ts +0 -0
  145. package/build/esm/RadioButton/RadioButton.js +0 -0
  146. package/build/esm/RadioButton/RadioButton.js.map +0 -0
  147. package/build/esm/RadioButton/RadioGroup.d.ts +0 -0
  148. package/build/esm/RadioButton/RadioGroup.js +2 -2
  149. package/build/esm/RadioButton/RadioGroup.js.map +1 -1
  150. package/build/esm/RadioButton/context.d.ts +0 -0
  151. package/build/esm/RadioButton/context.js +0 -0
  152. package/build/esm/RadioButton/context.js.map +0 -0
  153. package/build/esm/RadioButton/index.d.ts +0 -0
  154. package/build/esm/RadioButton/index.js +0 -0
  155. package/build/esm/RadioButton/index.js.map +0 -0
  156. package/build/esm/SkipNav/SkipNav.d.ts +0 -0
  157. package/build/esm/SkipNav/SkipNav.js +0 -0
  158. package/build/esm/SkipNav/SkipNav.js.map +0 -0
  159. package/build/esm/SkipNav/index.d.ts +0 -0
  160. package/build/esm/SkipNav/index.js +0 -0
  161. package/build/esm/SkipNav/index.js.map +0 -0
  162. package/build/esm/Spinner/Spinner.d.ts +0 -0
  163. package/build/esm/Spinner/Spinner.js +0 -0
  164. package/build/esm/Spinner/Spinner.js.map +0 -0
  165. package/build/esm/Spinner/SpinnerButton.d.ts +0 -0
  166. package/build/esm/Spinner/SpinnerButton.js +0 -0
  167. package/build/esm/Spinner/SpinnerButton.js.map +0 -0
  168. package/build/esm/Spinner/context.d.ts +0 -0
  169. package/build/esm/Spinner/context.js +0 -0
  170. package/build/esm/Spinner/context.js.map +0 -0
  171. package/build/esm/Spinner/index.d.ts +0 -0
  172. package/build/esm/Spinner/index.js +0 -0
  173. package/build/esm/Spinner/index.js.map +0 -0
  174. package/build/esm/Tabs/Tab.d.ts +0 -0
  175. package/build/esm/Tabs/Tab.js +0 -0
  176. package/build/esm/Tabs/Tab.js.map +0 -0
  177. package/build/esm/Tabs/TabList.d.ts +0 -0
  178. package/build/esm/Tabs/TabList.js +2 -2
  179. package/build/esm/Tabs/TabList.js.map +1 -1
  180. package/build/esm/Tabs/TabPanel.d.ts +0 -0
  181. package/build/esm/Tabs/TabPanel.js +0 -0
  182. package/build/esm/Tabs/TabPanel.js.map +0 -0
  183. package/build/esm/Tabs/TabPanels.d.ts +0 -0
  184. package/build/esm/Tabs/TabPanels.js +0 -0
  185. package/build/esm/Tabs/TabPanels.js.map +0 -0
  186. package/build/esm/Tabs/Tabs.d.ts +0 -0
  187. package/build/esm/Tabs/Tabs.js +0 -0
  188. package/build/esm/Tabs/Tabs.js.map +0 -0
  189. package/build/esm/Tabs/context.d.ts +0 -0
  190. package/build/esm/Tabs/context.js +0 -0
  191. package/build/esm/Tabs/context.js.map +0 -0
  192. package/build/esm/Tabs/index.d.ts +0 -0
  193. package/build/esm/Tabs/index.js +0 -0
  194. package/build/esm/Tabs/index.js.map +0 -0
  195. package/build/esm/Tabs/scopeQuery.d.ts +0 -0
  196. package/build/esm/Tabs/scopeQuery.js +0 -0
  197. package/build/esm/Tabs/scopeQuery.js.map +0 -0
  198. package/build/esm/Tooltip/Tooltip.d.ts +0 -0
  199. package/build/esm/Tooltip/Tooltip.js +0 -0
  200. package/build/esm/Tooltip/Tooltip.js.map +0 -0
  201. package/build/esm/Tooltip/index.d.ts +0 -0
  202. package/build/esm/Tooltip/index.js +0 -0
  203. package/build/esm/Tooltip/index.js.map +0 -0
  204. package/build/esm/Tooltip/stateMachine.d.ts +0 -0
  205. package/build/esm/Tooltip/stateMachine.js +0 -0
  206. package/build/esm/Tooltip/stateMachine.js.map +0 -0
  207. package/build/esm/Tooltip/useTooltip.d.ts +1 -1
  208. package/build/esm/Tooltip/useTooltip.js +2 -3
  209. package/build/esm/Tooltip/useTooltip.js.map +1 -1
  210. package/build/esm/hooks/index.d.ts +0 -1
  211. package/build/esm/hooks/index.js +0 -1
  212. package/build/esm/hooks/index.js.map +1 -1
  213. package/build/esm/hooks/useAutoFocus.d.ts +0 -0
  214. package/build/esm/hooks/useAutoFocus.js +5 -1
  215. package/build/esm/hooks/useAutoFocus.js.map +1 -1
  216. package/build/esm/hooks/useChildrenCounter.d.ts +0 -0
  217. package/build/esm/hooks/useChildrenCounter.js +0 -0
  218. package/build/esm/hooks/useChildrenCounter.js.map +0 -0
  219. package/build/esm/hooks/useControlledState.d.ts +0 -0
  220. package/build/esm/hooks/useControlledState.js +0 -0
  221. package/build/esm/hooks/useControlledState.js.map +0 -0
  222. package/build/esm/hooks/useFocusReturn.d.ts +2 -1
  223. package/build/esm/hooks/useFocusReturn.js +24 -13
  224. package/build/esm/hooks/useFocusReturn.js.map +1 -1
  225. package/build/esm/hooks/useFocusState.d.ts +2 -2
  226. package/build/esm/hooks/useFocusState.js +0 -0
  227. package/build/esm/hooks/useFocusState.js.map +0 -0
  228. package/build/esm/hooks/useGestureHandlers.d.ts +0 -0
  229. package/build/esm/hooks/useGestureHandlers.js +0 -0
  230. package/build/esm/hooks/useGestureHandlers.js.map +0 -0
  231. package/build/esm/hooks/useId.d.ts +0 -0
  232. package/build/esm/hooks/useId.js +0 -0
  233. package/build/esm/hooks/useId.js.map +0 -0
  234. package/build/esm/hooks/useMeasure.d.ts +0 -0
  235. package/build/esm/hooks/useMeasure.js +0 -0
  236. package/build/esm/hooks/useMeasure.js.map +0 -0
  237. package/build/esm/hooks/useOnClickOutside.d.ts +0 -0
  238. package/build/esm/hooks/useOnClickOutside.js +0 -0
  239. package/build/esm/hooks/useOnClickOutside.js.map +0 -0
  240. package/build/esm/hooks/useOnKeyDown.d.ts +0 -0
  241. package/build/esm/hooks/useOnKeyDown.js +0 -0
  242. package/build/esm/hooks/useOnKeyDown.js.map +0 -0
  243. package/build/esm/hooks/useReducerMachine.d.ts +0 -0
  244. package/build/esm/hooks/useReducerMachine.js +0 -0
  245. package/build/esm/hooks/useReducerMachine.js.map +0 -0
  246. package/build/esm/hooks/useRemoveBodyScroll.d.ts +0 -0
  247. package/build/esm/hooks/useRemoveBodyScroll.js +12 -19
  248. package/build/esm/hooks/useRemoveBodyScroll.js.map +1 -1
  249. package/build/esm/hooks/useScope.d.ts +0 -0
  250. package/build/esm/hooks/useScope.js +0 -0
  251. package/build/esm/hooks/useScope.js.map +0 -0
  252. package/build/esm/hooks/useThrottle.d.ts +0 -0
  253. package/build/esm/hooks/useThrottle.js +0 -0
  254. package/build/esm/hooks/useThrottle.js.map +0 -0
  255. package/build/esm/index.d.ts +0 -0
  256. package/build/esm/index.js +0 -0
  257. package/build/esm/index.js.map +0 -0
  258. package/build/esm/utils/assignRef.d.ts +0 -0
  259. package/build/esm/utils/assignRef.js +0 -0
  260. package/build/esm/utils/assignRef.js.map +0 -0
  261. package/build/esm/utils/clamp.d.ts +0 -0
  262. package/build/esm/utils/clamp.js +0 -0
  263. package/build/esm/utils/clamp.js.map +0 -0
  264. package/build/esm/utils/createSubscription.d.ts +0 -0
  265. package/build/esm/utils/createSubscription.js +0 -0
  266. package/build/esm/utils/createSubscription.js.map +0 -0
  267. package/build/esm/utils/getCircularIndex.d.ts +0 -0
  268. package/build/esm/utils/getCircularIndex.js +0 -0
  269. package/build/esm/utils/getCircularIndex.js.map +0 -0
  270. package/build/esm/utils/index.d.ts +0 -0
  271. package/build/esm/utils/index.js +0 -0
  272. package/build/esm/utils/index.js.map +0 -0
  273. package/build/esm/utils/rubberBandClamp.d.ts +0 -0
  274. package/build/esm/utils/rubberBandClamp.js +0 -0
  275. package/build/esm/utils/rubberBandClamp.js.map +0 -0
  276. package/build/esm/utils/wrapEvent.d.ts +0 -0
  277. package/build/esm/utils/wrapEvent.js +0 -0
  278. package/build/esm/utils/wrapEvent.js.map +0 -0
  279. package/build/tsconfig.tsbuildinfo +1 -7127
  280. package/package.json +15 -15
  281. package/src/Accordion/Accordion.story.tsx +5 -4
  282. package/src/Accordion/AccordionItem.tsx +1 -2
  283. package/src/ComboBox/ComboBox.story.tsx +11 -9
  284. package/src/ComboBox/Combobox.tsx +2 -2
  285. package/src/FocusLock/tabUtils.ts +12 -0
  286. package/src/FocusLock/useFocusLock.ts +4 -11
  287. package/src/List/List.story.tsx +5 -4
  288. package/src/Menu/Menu.story.tsx +9 -8
  289. package/src/Menu/Menu.tsx +1 -2
  290. package/src/Menu/MenuButton.tsx +3 -3
  291. package/src/Menu/MenuItem.tsx +4 -6
  292. package/src/Modal/Modal.story.tsx +34 -19
  293. package/src/Modal/Modal.tsx +2 -2
  294. package/src/Modal/NavDrawer.story.tsx +5 -4
  295. package/src/Popper/Popper.story.tsx +13 -16
  296. package/src/Popper/Popper.tsx +4 -0
  297. package/src/RadioButton/RadioButton.story.tsx +12 -9
  298. package/src/RadioButton/RadioGroup.tsx +2 -2
  299. package/src/Spinner/Spinner.story.tsx +5 -5
  300. package/src/Tabs/Tab.story.tsx +9 -8
  301. package/src/Tabs/TabList.tsx +9 -2
  302. package/src/Tooltip/Tooltip.story.tsx +6 -5
  303. package/src/Tooltip/useTooltip.ts +2 -3
  304. package/src/hooks/index.ts +0 -1
  305. package/src/hooks/useAutoFocus.ts +8 -1
  306. package/src/hooks/useFocusReturn.ts +33 -14
  307. package/src/hooks/useRemoveBodyScroll.ts +10 -18
  308. package/src/hooks/useId.ts +0 -18
@@ -28,10 +28,36 @@ const {
28
28
  } = accordionItemContext;
29
29
  const useAccordionItemContext = () => react.useContext(accordionItemContext);
30
30
 
31
+ const tabblable = ['button:enabled:not([readonly])', 'select:enabled:not([readonly])', 'textarea:enabled:not([readonly])', 'input:enabled:not([readonly])', 'a[href]', 'area[href]', 'iframe', 'object', 'embed', '[tabindex]', '[contenteditable]', '[autofocus]'].join(',');
32
+ /* This is naive and will not consider tabIndex */
33
+
34
+ const getTabblableNodes = parentNode => {
35
+ if (!parentNode) {
36
+ return [];
37
+ }
38
+
39
+ return Array.from(parentNode.querySelectorAll(tabblable));
40
+ };
41
+ function focusOnChildNode(parentNode, itemIndex) {
42
+ const elements = getTabblableNodes(parentNode);
43
+
44
+ if (elements.length > 0) {
45
+ elements[itemIndex === -1 ? elements.length - 1 : 0].focus();
46
+ } else {
47
+ const currentTabIndex = parentNode.tabIndex;
48
+ parentNode.tabIndex = 0;
49
+ parentNode.focus();
50
+ parentNode.tabIndex = currentTabIndex;
51
+ }
52
+ }
53
+
31
54
  function useAutoFocus(open, elementRef) {
32
55
  react.useEffect(() => {
33
56
  if (open) {
34
- elementRef.current && elementRef.current.focus();
57
+ // We will only autoFocus on the first child if the currently active element isn't already trapped inside the modal
58
+ if (elementRef.current && !elementRef.current.contains(document.activeElement)) {
59
+ focusOnChildNode(elementRef.current, 0);
60
+ }
35
61
  } // eslint-disable-next-line react-hooks/exhaustive-deps
36
62
 
37
63
  }, [open]);
@@ -151,25 +177,36 @@ function useChildrenCounterChild(itemsRef, itemIndexRef, obj, disabled = false)
151
177
  }
152
178
  }
153
179
 
154
- function useFocusReturn(open) {
155
- const previousFocusRef = react.useRef(null);
180
+ function useFocusReturn(open, rootEl) {
181
+ const previousFocusRef = react.useRef((() => {
182
+ if (open && typeof document !== 'undefined' && document.activeElement instanceof HTMLElement) {
183
+ return document.activeElement;
184
+ }
185
+
186
+ return null;
187
+ })());
156
188
  react.useEffect(() => {
157
189
  if (open) {
190
+ var _rootEl$current;
191
+
158
192
  // once opened, keep track of the element that triggered
159
193
  // the Modal opening
160
- previousFocusRef.current = document.activeElement;
161
- }
194
+ if (!previousFocusRef.current && document.activeElement instanceof HTMLElement && !((_rootEl$current = rootEl.current) != null && _rootEl$current.contains(document.activeElement))) {
195
+ previousFocusRef.current = document.activeElement;
196
+ }
162
197
 
163
- return () => {
164
- // on unmount, return focus to that element
165
- const previousFocus = previousFocusRef.current;
166
- requestAnimationFrame(() => {
167
- if (previousFocus) {
168
- previousFocus.focus();
198
+ const rootElement = rootEl.current;
199
+ const previousElement = previousFocusRef.current;
200
+ return () => {
201
+ // on unmount, return focus to that element
202
+ if (previousElement && !(rootElement != null && rootElement.contains(document.activeElement))) {
203
+ previousElement.focus({
204
+ preventScroll: true
205
+ });
169
206
  }
170
- });
171
- };
172
- }, [open]);
207
+ };
208
+ }
209
+ }, [open, rootEl]);
173
210
  }
174
211
 
175
212
  function useFocusState(props = {}) {
@@ -196,21 +233,6 @@ function useFocusState(props = {}) {
196
233
  };
197
234
  }
198
235
 
199
- // the lifetime of the app before it gets reloaded, I mean ... come on.
200
- // I don't even know what xillion that is.
201
- // /me googles
202
- // Oh duh, quadrillion. Nine quadrillion components. I think we're okay.
203
-
204
- let id = 0;
205
-
206
- const genId = () => `${++id}`;
207
-
208
- function useId(preferredId) {
209
- const [id, setId] = react.useState(preferredId);
210
- react.useEffect(() => setId(genId()), []);
211
- return id;
212
- }
213
-
214
236
  function useOnClickOutside(ref, handler, active = true) {
215
237
  const listener = react.useCallback(event => {
216
238
  // Do nothing if clicking ref's element or descendent elements
@@ -277,40 +299,33 @@ function useReducerMachine(chart, reducer, initialData) {
277
299
  return [state, data, transition];
278
300
  }
279
301
 
302
+ let scrollBodyCount = 0;
280
303
  function useRemoveBodyScroll(open) {
281
304
  react.useEffect(() => {
282
305
  if (open) {
283
- const locksCount = (window.__SCROLL_BODY_COUNT__ || 0) + 1; // calculate scrollbar width if mounting the first scroll lock
306
+ scrollBodyCount += 1; // calculate scrollbar width if mounting the first scroll lock
284
307
 
285
308
  let scrollBarWidth = 0;
286
309
 
287
- if (locksCount === 1) {
310
+ if (scrollBodyCount === 1) {
288
311
  scrollBarWidth = window.innerWidth - document.body.clientWidth;
289
312
  }
290
313
 
291
314
  document.body.style.overflow = 'hidden';
292
315
 
293
316
  if (scrollBarWidth > 0) {
294
- document.body.style.paddingRight = `${scrollBarWidth}px`;
295
- } // save current lock count in global object
296
-
297
-
298
- window.__SCROLL_BODY_COUNT__ = locksCount;
299
- }
317
+ document.body.style.marginRight = `${scrollBarWidth}px`;
318
+ }
300
319
 
301
- return () => {
302
- if (open) {
303
- const locksCount = window.__SCROLL_BODY_COUNT__ - 1;
320
+ return () => {
321
+ scrollBodyCount -= 1;
304
322
 
305
- if (locksCount === 0) {
323
+ if (scrollBodyCount === 0) {
306
324
  document.body.style.overflow = '';
307
- document.body.style.paddingRight = '';
308
- } // save current lock count in global object
309
-
310
-
311
- window.__SCROLL_BODY_COUNT__ = locksCount;
312
- }
313
- };
325
+ document.body.style.marginRight = '';
326
+ }
327
+ };
328
+ }
314
329
  }, [open]);
315
330
  }
316
331
 
@@ -648,7 +663,7 @@ const AccordionItem = /*#__PURE__*/react.forwardRef(function AccordionItem(props
648
663
  } = props,
649
664
  otherProps = _objectWithoutPropertiesLoose__default['default'](props, ["as", "expanded", "onChange"]);
650
665
 
651
- const id = useId();
666
+ const id = react.useId();
652
667
  const headerId = id ? `accordion-header-${id}` : undefined;
653
668
  const bodyId = id ? `accordion-body-${id}` : undefined;
654
669
  const contextValue = {
@@ -1272,8 +1287,8 @@ const Combobox = /*#__PURE__*/react.forwardRef(function Combobox(_ref, ref) {
1272
1287
  lastActionType: INIT
1273
1288
  };
1274
1289
  const [state, data, transition] = useReducerMachine(stateChart, comboboxReducer, defaultData);
1275
- listboxIdRef.current = useId();
1276
- labelIdRef.current = useId();
1290
+ listboxIdRef.current = react.useId();
1291
+ labelIdRef.current = react.useId();
1277
1292
  const context = react.useMemo(() => ({
1278
1293
  data,
1279
1294
  inputRef,
@@ -1667,17 +1682,6 @@ const ComboboxPopover = /*#__PURE__*/react.forwardRef(function ComboboxPopover(_
1667
1682
  }));
1668
1683
  });
1669
1684
 
1670
- const tabblable = ['button:enabled:not([readonly])', 'select:enabled:not([readonly])', 'textarea:enabled:not([readonly])', 'input:enabled:not([readonly])', 'a[href]', 'area[href]', 'iframe', 'object', 'embed', '[tabindex]', '[contenteditable]', '[autofocus]'].join(',');
1671
- /* This is naive and will not consider tabIndex */
1672
-
1673
- const getTabblableNodes = parentNode => {
1674
- if (!parentNode) {
1675
- return [];
1676
- }
1677
-
1678
- return Array.from(parentNode.querySelectorAll(tabblable));
1679
- };
1680
-
1681
1685
  const focusLockStack = [];
1682
1686
  function useFocusLock(ref, opts) {
1683
1687
  const {
@@ -1700,19 +1704,12 @@ function useFocusLock(ref, opts) {
1700
1704
  }
1701
1705
 
1702
1706
  if (event.target === lockEndRef.current) {
1703
- rootEl.focus();
1707
+ focusOnChildNode(rootEl, 0);
1704
1708
  } else if (event.target === lockStartRef.current) {
1705
- const nodes = getTabblableNodes(rootEl);
1706
-
1707
- if (nodes.length > 0) {
1708
- const nodeToFocus = nodes.length - 1;
1709
- nodes[nodeToFocus].focus();
1710
- } else {
1711
- rootEl.focus();
1712
- }
1709
+ focusOnChildNode(rootEl, -1);
1713
1710
  } else if (document !== event.target && rootEl !== event.target && !rootEl.contains(event.target)) {
1714
1711
  event.preventDefault();
1715
- rootEl.focus();
1712
+ focusOnChildNode(rootEl, 0);
1716
1713
  }
1717
1714
  };
1718
1715
 
@@ -1797,7 +1794,7 @@ const Menu = /*#__PURE__*/react.forwardRef(function Menu(props, forwardedRef) {
1797
1794
  const [open, onChange] = useControlledState(openProp, onChangeProp, defaultOpen, setState => (e, isOpen) => {
1798
1795
  setState(isOpen);
1799
1796
  });
1800
- menuListIdRef.current = useId();
1797
+ menuListIdRef.current = react.useId();
1801
1798
  const value = {
1802
1799
  menuListIdRef,
1803
1800
  openWithArrowKeyRef,
@@ -1830,7 +1827,8 @@ const MenuButton = /*#__PURE__*/react.forwardRef(function MenuButton(props, forw
1830
1827
  buttonRef,
1831
1828
  onChange
1832
1829
  } = useMenuContext();
1833
- const buttonId = useId(preferredId);
1830
+ const buttonIdGenerated = react.useId();
1831
+ const buttonId = preferredId || buttonIdGenerated;
1834
1832
 
1835
1833
  const handleKeyDown = e => {
1836
1834
  if (disabled) {
@@ -1891,7 +1889,6 @@ const MenuItem = /*#__PURE__*/react.forwardRef(function MenuItem(props, forwarde
1891
1889
  otherProps = _objectWithoutPropertiesLoose__default['default'](props, ["as", "disabled", "onSelect", "onClick", "onKeyDown"]);
1892
1890
 
1893
1891
  const {
1894
- menuListIdRef,
1895
1892
  onChange,
1896
1893
  buttonRef
1897
1894
  } = useMenuContext();
@@ -1900,7 +1897,7 @@ const MenuItem = /*#__PURE__*/react.forwardRef(function MenuItem(props, forwarde
1900
1897
  onNavigate
1901
1898
  } = useMenuListContext();
1902
1899
  const ref = react.useRef();
1903
- const itemIndex = react.useRef(-1);
1900
+ const itemId = react.useId();
1904
1901
  const isActive = ref.current && ref.current === navigationItem;
1905
1902
  const handleSelect = wrapEvent(onSelect, e => {
1906
1903
  var _buttonRef$current;
@@ -1932,7 +1929,7 @@ const MenuItem = /*#__PURE__*/react.forwardRef(function MenuItem(props, forwarde
1932
1929
 
1933
1930
  return /*#__PURE__*/jsxRuntime.jsx(Comp, _extends__default['default']({
1934
1931
  ref: assignMultipleRefs(ref, forwardedRef),
1935
- id: disabled ? undefined : `${menuListIdRef.current}_${itemIndex.current}`,
1932
+ id: disabled ? undefined : itemId,
1936
1933
  "data-menu-item": "",
1937
1934
  "data-highlighted": isActive ? '' : undefined,
1938
1935
  role: "menuitem",
@@ -2192,6 +2189,11 @@ const Popper = /*#__PURE__*/react.memo( /*#__PURE__*/react.forwardRef(function P
2192
2189
  popperEngineInstance.current = null;
2193
2190
  };
2194
2191
  }, [anchorEl, modifiers, placement, strategy, defaultModifiers]);
2192
+ useEnhancedEffect(() => {
2193
+ var _popperEngineInstance;
2194
+
2195
+ (_popperEngineInstance = popperEngineInstance.current) == null ? void 0 : _popperEngineInstance.forceUpdate();
2196
+ }, [props.hidden || props['aria-hidden']]);
2195
2197
  const contextValue = {
2196
2198
  arrowRef
2197
2199
  };
@@ -2277,7 +2279,7 @@ const Modal = /*#__PURE__*/react.forwardRef((_ref, ref) => {
2277
2279
  otherProps = _objectWithoutPropertiesLoose__default['default'](_ref, ["as", "children", "trapFocus", "style"]);
2278
2280
 
2279
2281
  const modalRef = react.useRef(null);
2280
- useFocusReturn(trapFocus);
2282
+ useFocusReturn(trapFocus, modalRef);
2281
2283
  useRemoveBodyScroll(trapFocus);
2282
2284
  useAutoFocus(trapFocus, modalRef);
2283
2285
  return /*#__PURE__*/jsxRuntime.jsx(FocusLock, {
@@ -2289,7 +2291,7 @@ const Modal = /*#__PURE__*/react.forwardRef((_ref, ref) => {
2289
2291
  role: "dialog",
2290
2292
  "aria-modal": "true",
2291
2293
  style: style,
2292
- tabIndex: 0
2294
+ tabIndex: -1
2293
2295
  }, otherProps, {
2294
2296
  children: children
2295
2297
  }))
@@ -2395,7 +2397,7 @@ const RadioGroup = /*#__PURE__*/react.forwardRef(function RadioGroup(props, forw
2395
2397
  const [value, onChange] = useControlledState(valueProp, onChangeProp, defaultValue, setValue => (e, value) => {
2396
2398
  setValue(value);
2397
2399
  });
2398
- const fallbackId = useId();
2400
+ const fallbackId = react.useId();
2399
2401
  return /*#__PURE__*/jsxRuntime.jsx(RadioGroupProvider, {
2400
2402
  value: {
2401
2403
  value,
@@ -2686,7 +2688,7 @@ const TabList = /*#__PURE__*/react.forwardRef(function TabList(props, forwardedR
2686
2688
  const ref = react.useRef();
2687
2689
  const tabsScope = useScope(ref);
2688
2690
  const tabsContext = useTabsContext();
2689
- const id = useId();
2691
+ const id = react.useId();
2690
2692
 
2691
2693
  if (!tabsContext) {
2692
2694
  throw new Error('Missing <Tabs /> in the component tree');
@@ -2968,7 +2970,7 @@ function useTooltip(childProps, childRef, tooltipProps) {
2968
2970
  } = childProps;
2969
2971
  const anchorEl = react.useRef(null);
2970
2972
  const [visible, setVisible] = react.useState(false);
2971
- const id = useId('');
2973
+ const id = react.useId();
2972
2974
  react.useEffect(() => {
2973
2975
  subscription.subscribe(() => {
2974
2976
  setVisible((state.current.state === Visible || state.current.state === LeavingVisible) && state.current.id === id);
@@ -3132,7 +3134,6 @@ exports.useControlledState = useControlledState;
3132
3134
  exports.useFocusReturn = useFocusReturn;
3133
3135
  exports.useFocusState = useFocusState;
3134
3136
  exports.useGestureHandlers = useGestureHandlers;
3135
- exports.useId = useId;
3136
3137
  exports.useMeasure = useMeasure;
3137
3138
  exports.useOnClickOutside = useOnClickOutside;
3138
3139
  exports.useOnKeyDown = useOnKeyDown;