@primer/components 0.0.0-2021983515 → 0.0.0-2022530194733

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 (596) hide show
  1. package/CHANGELOG.md +105 -492
  2. package/README.md +16 -16
  3. package/codemods/lib/modifyProps.js +7 -9
  4. package/codemods/lib/prettify.js +1 -1
  5. package/codemods/lib/replaceImportSource.js +5 -5
  6. package/dist/browser.esm.js +889 -1279
  7. package/dist/browser.esm.js.map +1 -1
  8. package/dist/browser.umd.js +839 -1234
  9. package/dist/browser.umd.js.map +1 -1
  10. package/index.d.ts +940 -0
  11. package/lib/AvatarPair.js +5 -6
  12. package/lib/AvatarStack.js +10 -10
  13. package/lib/BaseStyles.js +19 -18
  14. package/lib/BorderBox.js +5 -4
  15. package/lib/Box.js +2 -2
  16. package/lib/BranchName.js +1 -1
  17. package/lib/{Breadcrumbs.js → Breadcrumb.js} +23 -33
  18. package/lib/Button/Button.js +3 -3
  19. package/lib/Button/ButtonClose.js +4 -4
  20. package/lib/Button/ButtonDanger.js +2 -2
  21. package/lib/Button/ButtonInvisible.js +3 -3
  22. package/lib/Button/ButtonOutline.js +2 -2
  23. package/lib/Button/ButtonPrimary.js +2 -2
  24. package/lib/Button/ButtonTableList.js +1 -1
  25. package/lib/CircleBadge.js +1 -1
  26. package/lib/CircleOcticon.js +7 -9
  27. package/lib/CounterLabel.js +2 -2
  28. package/lib/Dialog.js +14 -13
  29. package/lib/Dropdown.js +2 -2
  30. package/lib/DropdownStyles.js +6 -6
  31. package/lib/FilterList.js +1 -1
  32. package/lib/Flash.js +1 -1
  33. package/lib/Flex.js +0 -3
  34. package/lib/Grid.js +3 -4
  35. package/lib/Header.js +2 -3
  36. package/lib/Label.js +4 -4
  37. package/lib/Link.js +12 -1
  38. package/lib/Overlay.js +36 -126
  39. package/lib/Pagehead.js +1 -1
  40. package/lib/Pagination/Pagination.js +2 -3
  41. package/lib/Popover.js +3 -3
  42. package/lib/Portal/Portal.js +12 -20
  43. package/lib/Position.js +27 -46
  44. package/lib/ProgressBar.js +1 -1
  45. package/lib/SelectMenu/SelectMenu.js +4 -4
  46. package/lib/SelectMenu/SelectMenuContext.js +1 -1
  47. package/lib/SelectMenu/SelectMenuDivider.js +3 -3
  48. package/lib/SelectMenu/SelectMenuFilter.js +6 -6
  49. package/lib/SelectMenu/SelectMenuFooter.js +3 -3
  50. package/lib/SelectMenu/SelectMenuHeader.js +2 -2
  51. package/lib/SelectMenu/SelectMenuItem.js +4 -4
  52. package/lib/SelectMenu/SelectMenuList.js +3 -3
  53. package/lib/SelectMenu/SelectMenuLoadingAnimation.js +15 -4
  54. package/lib/SelectMenu/SelectMenuModal.js +7 -7
  55. package/lib/SelectMenu/SelectMenuTab.js +3 -3
  56. package/lib/SelectMenu/SelectMenuTabPanel.js +3 -3
  57. package/lib/SelectMenu/SelectMenuTabs.js +2 -2
  58. package/lib/SelectMenu/hooks/useKeyboardNav.js +0 -2
  59. package/lib/SideNav.js +12 -20
  60. package/lib/StateLabel.js +4 -4
  61. package/lib/SubNav.js +3 -5
  62. package/lib/TabNav.js +3 -3
  63. package/lib/TextInput.js +59 -22
  64. package/lib/ThemeProvider.js +15 -32
  65. package/lib/Timeline.js +29 -24
  66. package/lib/Tooltip.js +1 -2
  67. package/lib/UnderlineNav.js +2 -2
  68. package/lib/behaviors/anchoredPosition.js +9 -17
  69. package/lib/behaviors/focusTrap.js +14 -32
  70. package/lib/behaviors/focusZone.js +148 -218
  71. package/lib/constants.js +2 -3
  72. package/lib/hooks/index.js +1 -9
  73. package/lib/hooks/useAnchoredPosition.js +4 -11
  74. package/lib/hooks/useDialog.js +1 -1
  75. package/lib/hooks/useFocusTrap.js +8 -26
  76. package/lib/hooks/useFocusZone.js +7 -7
  77. package/lib/hooks/useMouseIntent.js +58 -0
  78. package/lib/hooks/useOnEscapePress.js +10 -53
  79. package/lib/hooks/useOnOutsideClick.js +35 -62
  80. package/lib/hooks/useOpenAndCloseFocus.js +3 -8
  81. package/lib/hooks/useOverlay.js +19 -9
  82. package/lib/hooks/useSafeTimeout.js +0 -1
  83. package/lib/index.js +12 -112
  84. package/lib/polyfills/eventListenerSignal.js +1 -6
  85. package/lib/stories/Button.stories.js +114 -0
  86. package/lib/stories/Overlay.stories.js +102 -0
  87. package/lib/stories/Portal.stories.js +108 -0
  88. package/lib/stories/ThemeProvider.stories.js +95 -0
  89. package/lib/stories/useAnchoredPosition.stories.js +349 -0
  90. package/lib/stories/useFocusTrap.stories.js +278 -0
  91. package/lib/stories/useFocusZone.stories.js +490 -0
  92. package/lib/theme-preval.js +2057 -5148
  93. package/lib/utils/deprecate.js +2 -3
  94. package/lib/utils/isNumeric.js +0 -1
  95. package/lib/utils/iterateFocusableElements.js +1 -1
  96. package/lib/utils/test-deprecations.js +0 -1
  97. package/lib/utils/test-matchers.js +12 -3
  98. package/lib/utils/testing.js +4 -4
  99. package/lib/utils/theme.js +1 -1
  100. package/lib/utils/{types/AriaRole.js → types.js} +0 -0
  101. package/lib/utils/uniqueId.js +0 -1
  102. package/lib-esm/AvatarPair.js +5 -6
  103. package/lib-esm/AvatarStack.js +11 -11
  104. package/lib-esm/BaseStyles.js +16 -16
  105. package/lib-esm/BorderBox.js +3 -5
  106. package/lib-esm/Box.js +2 -2
  107. package/lib-esm/BranchName.js +1 -1
  108. package/lib-esm/{Breadcrumbs.js → Breadcrumb.js} +22 -32
  109. package/lib-esm/Button/Button.js +1 -1
  110. package/lib-esm/Button/ButtonClose.js +2 -2
  111. package/lib-esm/Button/ButtonInvisible.js +1 -1
  112. package/lib-esm/Button/ButtonTableList.js +1 -1
  113. package/lib-esm/CircleBadge.js +1 -1
  114. package/lib-esm/CircleOcticon.js +6 -9
  115. package/lib-esm/CounterLabel.js +2 -2
  116. package/lib-esm/Dialog.js +12 -10
  117. package/lib-esm/Dropdown.js +2 -2
  118. package/lib-esm/DropdownStyles.js +6 -6
  119. package/lib-esm/FilterList.js +1 -1
  120. package/lib-esm/Flash.js +1 -1
  121. package/lib-esm/Flex.js +0 -4
  122. package/lib-esm/Grid.js +2 -5
  123. package/lib-esm/Header.js +0 -1
  124. package/lib-esm/Label.js +2 -2
  125. package/lib-esm/Link.js +12 -1
  126. package/lib-esm/Overlay.js +38 -119
  127. package/lib-esm/Pagehead.js +1 -1
  128. package/lib-esm/Pagination/Pagination.js +2 -3
  129. package/lib-esm/Popover.js +3 -3
  130. package/lib-esm/Portal/Portal.js +12 -19
  131. package/lib-esm/Portal/index.js +1 -1
  132. package/lib-esm/Position.js +20 -45
  133. package/lib-esm/ProgressBar.js +1 -1
  134. package/lib-esm/SelectMenu/SelectMenu.js +3 -3
  135. package/lib-esm/SelectMenu/SelectMenuContext.js +1 -1
  136. package/lib-esm/SelectMenu/SelectMenuDivider.js +1 -1
  137. package/lib-esm/SelectMenu/SelectMenuFilter.js +4 -4
  138. package/lib-esm/SelectMenu/SelectMenuFooter.js +1 -1
  139. package/lib-esm/SelectMenu/SelectMenuHeader.js +2 -2
  140. package/lib-esm/SelectMenu/SelectMenuItem.js +2 -2
  141. package/lib-esm/SelectMenu/SelectMenuList.js +1 -1
  142. package/lib-esm/SelectMenu/SelectMenuLoadingAnimation.js +10 -5
  143. package/lib-esm/SelectMenu/SelectMenuModal.js +5 -5
  144. package/lib-esm/SelectMenu/SelectMenuTab.js +1 -1
  145. package/lib-esm/SelectMenu/SelectMenuTabPanel.js +1 -1
  146. package/lib-esm/SelectMenu/hooks/useKeyboardNav.js +0 -2
  147. package/lib-esm/SideNav.js +7 -16
  148. package/lib-esm/StateLabel.js +4 -4
  149. package/lib-esm/SubNav.js +4 -7
  150. package/lib-esm/TabNav.js +4 -5
  151. package/lib-esm/TextInput.js +49 -22
  152. package/lib-esm/ThemeProvider.js +16 -31
  153. package/lib-esm/Timeline.js +24 -19
  154. package/lib-esm/Tooltip.js +1 -2
  155. package/lib-esm/UnderlineNav.js +3 -4
  156. package/lib-esm/behaviors/anchoredPosition.js +9 -17
  157. package/lib-esm/behaviors/focusTrap.js +14 -32
  158. package/lib-esm/behaviors/focusZone.js +148 -213
  159. package/lib-esm/constants.js +1 -2
  160. package/lib-esm/hooks/index.js +1 -2
  161. package/lib-esm/hooks/useAnchoredPosition.js +5 -10
  162. package/lib-esm/hooks/useDialog.js +1 -1
  163. package/lib-esm/hooks/useFocusTrap.js +8 -25
  164. package/lib-esm/hooks/useFocusZone.js +5 -5
  165. package/lib-esm/hooks/useMouseIntent.js +50 -0
  166. package/lib-esm/hooks/useOnEscapePress.js +10 -53
  167. package/lib-esm/hooks/useOnOutsideClick.js +37 -62
  168. package/lib-esm/hooks/useOpenAndCloseFocus.js +3 -8
  169. package/lib-esm/hooks/useOverlay.js +18 -9
  170. package/lib-esm/hooks/useSafeTimeout.js +0 -1
  171. package/lib-esm/index.js +10 -22
  172. package/lib-esm/polyfills/eventListenerSignal.js +1 -6
  173. package/lib-esm/stories/Button.stories.js +79 -0
  174. package/lib-esm/stories/Overlay.stories.js +80 -0
  175. package/lib-esm/stories/Portal.stories.js +72 -0
  176. package/lib-esm/stories/ThemeProvider.stories.js +76 -0
  177. package/lib-esm/stories/useAnchoredPosition.stories.js +311 -0
  178. package/lib-esm/stories/useFocusTrap.stories.js +234 -0
  179. package/lib-esm/stories/useFocusZone.stories.js +445 -0
  180. package/lib-esm/theme-preval.js +2057 -5148
  181. package/lib-esm/utils/deprecate.js +2 -3
  182. package/lib-esm/utils/isNumeric.js +0 -1
  183. package/lib-esm/utils/iterateFocusableElements.js +1 -1
  184. package/lib-esm/utils/test-deprecations.js +1 -1
  185. package/lib-esm/utils/test-matchers.js +11 -3
  186. package/lib-esm/utils/testing.js +6 -6
  187. package/lib-esm/utils/theme.js +1 -1
  188. package/lib-esm/utils/{test-helpers.d.ts → types.js} +0 -0
  189. package/lib-esm/utils/uniqueId.js +0 -1
  190. package/package.json +95 -103
  191. package/codemods/__tests__/deprecateUtilityComponents.js +0 -200
  192. package/codemods/__tests__/removeSystemProps.js +0 -225
  193. package/codemods/deprecateUtilityComponents.js +0 -111
  194. package/codemods/removeSystemProps.js +0 -312
  195. package/lib/ActionList/Divider.d.ts +0 -9
  196. package/lib/ActionList/Divider.js +0 -40
  197. package/lib/ActionList/Group.d.ts +0 -28
  198. package/lib/ActionList/Group.js +0 -35
  199. package/lib/ActionList/Header.d.ts +0 -29
  200. package/lib/ActionList/Header.js +0 -51
  201. package/lib/ActionList/Item.d.ts +0 -92
  202. package/lib/ActionList/Item.js +0 -288
  203. package/lib/ActionList/List.d.ts +0 -88
  204. package/lib/ActionList/List.js +0 -199
  205. package/lib/ActionList/index.d.ts +0 -17
  206. package/lib/ActionList/index.js +0 -29
  207. package/lib/ActionMenu.d.ts +0 -40
  208. package/lib/ActionMenu.js +0 -103
  209. package/lib/AnchoredOverlay/AnchoredOverlay.d.ts +0 -62
  210. package/lib/AnchoredOverlay/AnchoredOverlay.js +0 -124
  211. package/lib/AnchoredOverlay/index.d.ts +0 -2
  212. package/lib/AnchoredOverlay/index.js +0 -13
  213. package/lib/Autocomplete/Autocomplete.d.ts +0 -40
  214. package/lib/Autocomplete/Autocomplete.js +0 -68
  215. package/lib/Autocomplete/AutocompleteContext.d.ts +0 -17
  216. package/lib/Autocomplete/AutocompleteContext.js +0 -11
  217. package/lib/Autocomplete/AutocompleteInput.d.ts +0 -9
  218. package/lib/Autocomplete/AutocompleteInput.js +0 -150
  219. package/lib/Autocomplete/AutocompleteMenu.d.ts +0 -71
  220. package/lib/Autocomplete/AutocompleteMenu.js +0 -223
  221. package/lib/Autocomplete/AutocompleteOverlay.d.ts +0 -17
  222. package/lib/Autocomplete/AutocompleteOverlay.js +0 -69
  223. package/lib/Autocomplete/index.d.ts +0 -2
  224. package/lib/Autocomplete/index.js +0 -15
  225. package/lib/Avatar.d.ts +0 -15
  226. package/lib/AvatarPair.d.ts +0 -8
  227. package/lib/AvatarStack.d.ts +0 -8
  228. package/lib/BaseStyles.d.ts +0 -14
  229. package/lib/BorderBox.d.ts +0 -7
  230. package/lib/Box.d.ts +0 -6
  231. package/lib/BranchName.d.ts +0 -6
  232. package/lib/Breadcrumbs.d.ts +0 -40
  233. package/lib/Button/Button.d.ts +0 -284
  234. package/lib/Button/ButtonBase.d.ts +0 -12
  235. package/lib/Button/ButtonClose.d.ts +0 -321
  236. package/lib/Button/ButtonDanger.d.ts +0 -284
  237. package/lib/Button/ButtonGroup.d.ts +0 -4
  238. package/lib/Button/ButtonInvisible.d.ts +0 -284
  239. package/lib/Button/ButtonOutline.d.ts +0 -284
  240. package/lib/Button/ButtonPrimary.d.ts +0 -284
  241. package/lib/Button/ButtonStyles.d.ts +0 -2
  242. package/lib/Button/ButtonTableList.d.ts +0 -6
  243. package/lib/Button/index.d.ts +0 -16
  244. package/lib/Caret.d.ts +0 -21
  245. package/lib/CircleBadge.d.ts +0 -25
  246. package/lib/CircleOcticon.d.ts +0 -391
  247. package/lib/CounterLabel.d.ts +0 -8
  248. package/lib/Details.d.ts +0 -6
  249. package/lib/Dialog/ConfirmationDialog.d.ts +0 -44
  250. package/lib/Dialog/ConfirmationDialog.js +0 -191
  251. package/lib/Dialog/Dialog.d.ts +0 -167
  252. package/lib/Dialog/Dialog.js +0 -304
  253. package/lib/Dialog.d.ts +0 -406
  254. package/lib/Dropdown.d.ts +0 -1262
  255. package/lib/DropdownMenu/DropdownButton.d.ts +0 -323
  256. package/lib/DropdownMenu/DropdownButton.js +0 -31
  257. package/lib/DropdownMenu/DropdownMenu.d.ts +0 -43
  258. package/lib/DropdownMenu/DropdownMenu.js +0 -94
  259. package/lib/DropdownMenu/index.d.ts +0 -4
  260. package/lib/DropdownMenu/index.js +0 -21
  261. package/lib/DropdownStyles.d.ts +0 -3
  262. package/lib/FilterList.d.ts +0 -321
  263. package/lib/FilteredActionList/FilteredActionList.d.ts +0 -16
  264. package/lib/FilteredActionList/FilteredActionList.js +0 -137
  265. package/lib/FilteredActionList/index.d.ts +0 -2
  266. package/lib/FilteredActionList/index.js +0 -13
  267. package/lib/FilteredSearch.d.ts +0 -6
  268. package/lib/Flash.d.ts +0 -9
  269. package/lib/Flex.d.ts +0 -7
  270. package/lib/FormGroup.d.ts +0 -12
  271. package/lib/Grid.d.ts +0 -7
  272. package/lib/Header.d.ts +0 -24
  273. package/lib/Heading.d.ts +0 -6
  274. package/lib/Label.d.ts +0 -11
  275. package/lib/LabelGroup.d.ts +0 -6
  276. package/lib/Link.d.ts +0 -10
  277. package/lib/Overlay.d.ts +0 -63
  278. package/lib/Pagehead.d.ts +0 -6
  279. package/lib/Pagination/Pagination.d.ts +0 -24
  280. package/lib/Pagination/index.d.ts +0 -3
  281. package/lib/Pagination/model.d.ts +0 -26
  282. package/lib/PointerBox.d.ts +0 -11
  283. package/lib/Popover.d.ts +0 -21
  284. package/lib/Portal/Portal.d.ts +0 -25
  285. package/lib/Portal/index.d.ts +0 -4
  286. package/lib/Position.d.ts +0 -34
  287. package/lib/ProgressBar.d.ts +0 -21
  288. package/lib/SelectMenu/SelectMenu.d.ts +0 -1832
  289. package/lib/SelectMenu/SelectMenuContext.d.ts +0 -8
  290. package/lib/SelectMenu/SelectMenuDivider.d.ts +0 -6
  291. package/lib/SelectMenu/SelectMenuFilter.d.ts +0 -9
  292. package/lib/SelectMenu/SelectMenuFooter.d.ts +0 -6
  293. package/lib/SelectMenu/SelectMenuHeader.d.ts +0 -11
  294. package/lib/SelectMenu/SelectMenuItem.d.ts +0 -15
  295. package/lib/SelectMenu/SelectMenuList.d.ts +0 -6
  296. package/lib/SelectMenu/SelectMenuLoadingAnimation.d.ts +0 -7
  297. package/lib/SelectMenu/SelectMenuModal.d.ts +0 -15
  298. package/lib/SelectMenu/SelectMenuTab.d.ts +0 -14
  299. package/lib/SelectMenu/SelectMenuTabPanel.d.ts +0 -13
  300. package/lib/SelectMenu/SelectMenuTabs.d.ts +0 -11
  301. package/lib/SelectMenu/hooks/useKeyboardNav.d.ts +0 -2
  302. package/lib/SelectMenu/index.d.ts +0 -2
  303. package/lib/SelectPanel/SelectPanel.d.ts +0 -25
  304. package/lib/SelectPanel/SelectPanel.js +0 -147
  305. package/lib/SelectPanel/index.d.ts +0 -2
  306. package/lib/SelectPanel/index.js +0 -13
  307. package/lib/SideNav.d.ts +0 -31
  308. package/lib/Spinner.d.ts +0 -17
  309. package/lib/Spinner.js +0 -60
  310. package/lib/StateLabel.d.ts +0 -16
  311. package/lib/StyledOcticon.d.ts +0 -12
  312. package/lib/SubNav.d.ts +0 -32
  313. package/lib/TabNav.d.ts +0 -20
  314. package/lib/Text.d.ts +0 -6
  315. package/lib/TextInput.d.ts +0 -14
  316. package/lib/TextInputWithTokens.d.ts +0 -323
  317. package/lib/TextInputWithTokens.js +0 -244
  318. package/lib/ThemeProvider.d.ts +0 -26
  319. package/lib/Timeline.d.ts +0 -407
  320. package/lib/Token/IssueLabelToken.d.ts +0 -14
  321. package/lib/Token/IssueLabelToken.js +0 -144
  322. package/lib/Token/ProfileToken.d.ts +0 -7
  323. package/lib/Token/ProfileToken.js +0 -53
  324. package/lib/Token/Token.d.ts +0 -15
  325. package/lib/Token/Token.js +0 -94
  326. package/lib/Token/TokenBase.d.ts +0 -17
  327. package/lib/Token/TokenBase.js +0 -108
  328. package/lib/Token/_RemoveTokenButton.d.ts +0 -12
  329. package/lib/Token/_RemoveTokenButton.js +0 -77
  330. package/lib/Token/_TokenTextContainer.d.ts +0 -3
  331. package/lib/Token/_TokenTextContainer.js +0 -28
  332. package/lib/Token/index.d.ts +0 -3
  333. package/lib/Token/index.js +0 -31
  334. package/lib/Tooltip.d.ts +0 -18
  335. package/lib/Truncate.d.ts +0 -11
  336. package/lib/UnderlineNav.d.ts +0 -25
  337. package/lib/_TextInputWrapper.d.ts +0 -10
  338. package/lib/_TextInputWrapper.js +0 -51
  339. package/lib/_UnstyledTextInput.d.ts +0 -2
  340. package/lib/_UnstyledTextInput.js +0 -20
  341. package/lib/behaviors/anchoredPosition.d.ts +0 -89
  342. package/lib/behaviors/focusTrap.d.ts +0 -12
  343. package/lib/behaviors/focusZone.d.ts +0 -137
  344. package/lib/constants.d.ts +0 -20
  345. package/lib/hooks/index.d.ts +0 -11
  346. package/lib/hooks/useAnchoredPosition.d.ts +0 -20
  347. package/lib/hooks/useCombinedRefs.d.ts +0 -10
  348. package/lib/hooks/useCombinedRefs.js +0 -49
  349. package/lib/hooks/useDetails.d.ts +0 -17
  350. package/lib/hooks/useDialog.d.ts +0 -16
  351. package/lib/hooks/useFocusTrap.d.ts +0 -32
  352. package/lib/hooks/useFocusZone.d.ts +0 -23
  353. package/lib/hooks/useOnEscapePress.d.ts +0 -23
  354. package/lib/hooks/useOnOutsideClick.d.ts +0 -8
  355. package/lib/hooks/useOpenAndCloseFocus.d.ts +0 -8
  356. package/lib/hooks/useOverlay.d.ts +0 -15
  357. package/lib/hooks/useProvidedRefOrCreate.d.ts +0 -10
  358. package/lib/hooks/useProvidedStateOrCreate.d.ts +0 -10
  359. package/lib/hooks/useProvidedStateOrCreate.js +0 -27
  360. package/lib/hooks/useRenderForcingRef.d.ts +0 -8
  361. package/lib/hooks/useRenderForcingRef.js +0 -25
  362. package/lib/hooks/useResizeObserver.d.ts +0 -1
  363. package/lib/hooks/useResizeObserver.js +0 -20
  364. package/lib/hooks/useSafeTimeout.d.ts +0 -12
  365. package/lib/hooks/useScrollFlash.d.ts +0 -6
  366. package/lib/hooks/useScrollFlash.js +0 -29
  367. package/lib/index.d.ts +0 -114
  368. package/lib/polyfills/eventListenerSignal.d.ts +0 -6
  369. package/lib/sx.d.ts +0 -6
  370. package/lib/theme-preval.d.ts +0 -49
  371. package/lib/theme.d.ts +0 -2
  372. package/lib/utils/deprecate.d.ts +0 -18
  373. package/lib/utils/isNumeric.d.ts +0 -1
  374. package/lib/utils/iterateFocusableElements.d.ts +0 -42
  375. package/lib/utils/scrollIntoViewingArea.d.ts +0 -1
  376. package/lib/utils/scrollIntoViewingArea.js +0 -39
  377. package/lib/utils/ssr.d.ts +0 -1
  378. package/lib/utils/ssr.js +0 -19
  379. package/lib/utils/test-deprecations.d.ts +0 -1
  380. package/lib/utils/test-helpers.d.ts +0 -0
  381. package/lib/utils/test-helpers.js +0 -9
  382. package/lib/utils/test-matchers.d.ts +0 -1
  383. package/lib/utils/testing.d.ts +0 -1028
  384. package/lib/utils/theme.d.ts +0 -9
  385. package/lib/utils/types/AriaRole.d.ts +0 -4
  386. package/lib/utils/types/ComponentProps.d.ts +0 -9
  387. package/lib/utils/types/ComponentProps.js +0 -1
  388. package/lib/utils/types/Flatten.d.ts +0 -4
  389. package/lib/utils/types/Flatten.js +0 -1
  390. package/lib/utils/types/Merge.d.ts +0 -19
  391. package/lib/utils/types/Merge.js +0 -1
  392. package/lib/utils/types/index.d.ts +0 -4
  393. package/lib/utils/types/index.js +0 -57
  394. package/lib/utils/uniqueId.d.ts +0 -1
  395. package/lib/utils/userAgent.d.ts +0 -1
  396. package/lib-esm/ActionList/Divider.d.ts +0 -9
  397. package/lib-esm/ActionList/Divider.js +0 -23
  398. package/lib-esm/ActionList/Group.d.ts +0 -28
  399. package/lib-esm/ActionList/Group.js +0 -24
  400. package/lib-esm/ActionList/Header.d.ts +0 -29
  401. package/lib-esm/ActionList/Header.js +0 -33
  402. package/lib-esm/ActionList/Item.d.ts +0 -92
  403. package/lib-esm/ActionList/Item.js +0 -253
  404. package/lib-esm/ActionList/List.d.ts +0 -88
  405. package/lib-esm/ActionList/List.js +0 -181
  406. package/lib-esm/ActionList/index.d.ts +0 -17
  407. package/lib-esm/ActionList/index.js +0 -18
  408. package/lib-esm/ActionMenu.d.ts +0 -40
  409. package/lib-esm/ActionMenu.js +0 -82
  410. package/lib-esm/AnchoredOverlay/AnchoredOverlay.d.ts +0 -62
  411. package/lib-esm/AnchoredOverlay/AnchoredOverlay.js +0 -104
  412. package/lib-esm/AnchoredOverlay/index.d.ts +0 -2
  413. package/lib-esm/AnchoredOverlay/index.js +0 -1
  414. package/lib-esm/Autocomplete/Autocomplete.d.ts +0 -40
  415. package/lib-esm/Autocomplete/Autocomplete.js +0 -47
  416. package/lib-esm/Autocomplete/AutocompleteContext.d.ts +0 -17
  417. package/lib-esm/Autocomplete/AutocompleteContext.js +0 -2
  418. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +0 -9
  419. package/lib-esm/Autocomplete/AutocompleteInput.js +0 -131
  420. package/lib-esm/Autocomplete/AutocompleteMenu.d.ts +0 -71
  421. package/lib-esm/Autocomplete/AutocompleteMenu.js +0 -204
  422. package/lib-esm/Autocomplete/AutocompleteOverlay.d.ts +0 -17
  423. package/lib-esm/Autocomplete/AutocompleteOverlay.js +0 -51
  424. package/lib-esm/Autocomplete/index.d.ts +0 -2
  425. package/lib-esm/Autocomplete/index.js +0 -1
  426. package/lib-esm/Avatar.d.ts +0 -15
  427. package/lib-esm/AvatarPair.d.ts +0 -8
  428. package/lib-esm/AvatarStack.d.ts +0 -8
  429. package/lib-esm/BaseStyles.d.ts +0 -14
  430. package/lib-esm/BorderBox.d.ts +0 -7
  431. package/lib-esm/Box.d.ts +0 -6
  432. package/lib-esm/BranchName.d.ts +0 -6
  433. package/lib-esm/Breadcrumbs.d.ts +0 -40
  434. package/lib-esm/Button/Button.d.ts +0 -284
  435. package/lib-esm/Button/ButtonBase.d.ts +0 -12
  436. package/lib-esm/Button/ButtonClose.d.ts +0 -321
  437. package/lib-esm/Button/ButtonDanger.d.ts +0 -284
  438. package/lib-esm/Button/ButtonGroup.d.ts +0 -4
  439. package/lib-esm/Button/ButtonInvisible.d.ts +0 -284
  440. package/lib-esm/Button/ButtonOutline.d.ts +0 -284
  441. package/lib-esm/Button/ButtonPrimary.d.ts +0 -284
  442. package/lib-esm/Button/ButtonStyles.d.ts +0 -2
  443. package/lib-esm/Button/ButtonTableList.d.ts +0 -6
  444. package/lib-esm/Button/index.d.ts +0 -16
  445. package/lib-esm/Caret.d.ts +0 -21
  446. package/lib-esm/CircleBadge.d.ts +0 -25
  447. package/lib-esm/CircleOcticon.d.ts +0 -391
  448. package/lib-esm/CounterLabel.d.ts +0 -8
  449. package/lib-esm/Details.d.ts +0 -6
  450. package/lib-esm/Dialog/ConfirmationDialog.d.ts +0 -44
  451. package/lib-esm/Dialog/ConfirmationDialog.js +0 -169
  452. package/lib-esm/Dialog/Dialog.d.ts +0 -167
  453. package/lib-esm/Dialog/Dialog.js +0 -274
  454. package/lib-esm/Dialog.d.ts +0 -406
  455. package/lib-esm/Dropdown.d.ts +0 -1262
  456. package/lib-esm/DropdownMenu/DropdownButton.d.ts +0 -323
  457. package/lib-esm/DropdownMenu/DropdownButton.js +0 -16
  458. package/lib-esm/DropdownMenu/DropdownMenu.d.ts +0 -43
  459. package/lib-esm/DropdownMenu/DropdownMenu.js +0 -77
  460. package/lib-esm/DropdownMenu/index.d.ts +0 -4
  461. package/lib-esm/DropdownMenu/index.js +0 -2
  462. package/lib-esm/DropdownStyles.d.ts +0 -3
  463. package/lib-esm/FilterList.d.ts +0 -321
  464. package/lib-esm/FilteredActionList/FilteredActionList.d.ts +0 -16
  465. package/lib-esm/FilteredActionList/FilteredActionList.js +0 -109
  466. package/lib-esm/FilteredActionList/index.d.ts +0 -2
  467. package/lib-esm/FilteredActionList/index.js +0 -1
  468. package/lib-esm/FilteredSearch.d.ts +0 -6
  469. package/lib-esm/Flash.d.ts +0 -9
  470. package/lib-esm/Flex.d.ts +0 -7
  471. package/lib-esm/FormGroup.d.ts +0 -12
  472. package/lib-esm/Grid.d.ts +0 -7
  473. package/lib-esm/Header.d.ts +0 -24
  474. package/lib-esm/Heading.d.ts +0 -6
  475. package/lib-esm/Label.d.ts +0 -11
  476. package/lib-esm/LabelGroup.d.ts +0 -6
  477. package/lib-esm/Link.d.ts +0 -10
  478. package/lib-esm/Overlay.d.ts +0 -63
  479. package/lib-esm/Pagehead.d.ts +0 -6
  480. package/lib-esm/Pagination/Pagination.d.ts +0 -24
  481. package/lib-esm/Pagination/index.d.ts +0 -3
  482. package/lib-esm/Pagination/model.d.ts +0 -26
  483. package/lib-esm/PointerBox.d.ts +0 -11
  484. package/lib-esm/Popover.d.ts +0 -21
  485. package/lib-esm/Portal/Portal.d.ts +0 -25
  486. package/lib-esm/Portal/index.d.ts +0 -4
  487. package/lib-esm/Position.d.ts +0 -34
  488. package/lib-esm/ProgressBar.d.ts +0 -21
  489. package/lib-esm/SelectMenu/SelectMenu.d.ts +0 -1832
  490. package/lib-esm/SelectMenu/SelectMenuContext.d.ts +0 -8
  491. package/lib-esm/SelectMenu/SelectMenuDivider.d.ts +0 -6
  492. package/lib-esm/SelectMenu/SelectMenuFilter.d.ts +0 -9
  493. package/lib-esm/SelectMenu/SelectMenuFooter.d.ts +0 -6
  494. package/lib-esm/SelectMenu/SelectMenuHeader.d.ts +0 -11
  495. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +0 -15
  496. package/lib-esm/SelectMenu/SelectMenuList.d.ts +0 -6
  497. package/lib-esm/SelectMenu/SelectMenuLoadingAnimation.d.ts +0 -7
  498. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +0 -15
  499. package/lib-esm/SelectMenu/SelectMenuTab.d.ts +0 -14
  500. package/lib-esm/SelectMenu/SelectMenuTabPanel.d.ts +0 -13
  501. package/lib-esm/SelectMenu/SelectMenuTabs.d.ts +0 -11
  502. package/lib-esm/SelectMenu/hooks/useKeyboardNav.d.ts +0 -2
  503. package/lib-esm/SelectMenu/index.d.ts +0 -2
  504. package/lib-esm/SelectPanel/SelectPanel.d.ts +0 -25
  505. package/lib-esm/SelectPanel/SelectPanel.js +0 -127
  506. package/lib-esm/SelectPanel/index.d.ts +0 -2
  507. package/lib-esm/SelectPanel/index.js +0 -1
  508. package/lib-esm/SideNav.d.ts +0 -31
  509. package/lib-esm/Spinner.d.ts +0 -17
  510. package/lib-esm/Spinner.js +0 -46
  511. package/lib-esm/StateLabel.d.ts +0 -16
  512. package/lib-esm/StyledOcticon.d.ts +0 -12
  513. package/lib-esm/SubNav.d.ts +0 -32
  514. package/lib-esm/TabNav.d.ts +0 -20
  515. package/lib-esm/Text.d.ts +0 -6
  516. package/lib-esm/TextInput.d.ts +0 -14
  517. package/lib-esm/TextInputWithTokens.d.ts +0 -323
  518. package/lib-esm/TextInputWithTokens.js +0 -219
  519. package/lib-esm/ThemeProvider.d.ts +0 -26
  520. package/lib-esm/Timeline.d.ts +0 -407
  521. package/lib-esm/Token/IssueLabelToken.d.ts +0 -14
  522. package/lib-esm/Token/IssueLabelToken.js +0 -124
  523. package/lib-esm/Token/ProfileToken.d.ts +0 -7
  524. package/lib-esm/Token/ProfileToken.js +0 -33
  525. package/lib-esm/Token/Token.d.ts +0 -15
  526. package/lib-esm/Token/Token.js +0 -73
  527. package/lib-esm/Token/TokenBase.d.ts +0 -17
  528. package/lib-esm/Token/TokenBase.js +0 -87
  529. package/lib-esm/Token/_RemoveTokenButton.d.ts +0 -12
  530. package/lib-esm/Token/_RemoveTokenButton.js +0 -60
  531. package/lib-esm/Token/_TokenTextContainer.d.ts +0 -3
  532. package/lib-esm/Token/_TokenTextContainer.js +0 -15
  533. package/lib-esm/Token/index.d.ts +0 -3
  534. package/lib-esm/Token/index.js +0 -3
  535. package/lib-esm/Tooltip.d.ts +0 -18
  536. package/lib-esm/Truncate.d.ts +0 -11
  537. package/lib-esm/UnderlineNav.d.ts +0 -25
  538. package/lib-esm/_TextInputWrapper.d.ts +0 -10
  539. package/lib-esm/_TextInputWrapper.js +0 -31
  540. package/lib-esm/_UnstyledTextInput.d.ts +0 -2
  541. package/lib-esm/_UnstyledTextInput.js +0 -7
  542. package/lib-esm/behaviors/anchoredPosition.d.ts +0 -89
  543. package/lib-esm/behaviors/focusTrap.d.ts +0 -12
  544. package/lib-esm/behaviors/focusZone.d.ts +0 -137
  545. package/lib-esm/constants.d.ts +0 -20
  546. package/lib-esm/hooks/index.d.ts +0 -11
  547. package/lib-esm/hooks/useAnchoredPosition.d.ts +0 -20
  548. package/lib-esm/hooks/useCombinedRefs.d.ts +0 -10
  549. package/lib-esm/hooks/useCombinedRefs.js +0 -36
  550. package/lib-esm/hooks/useDetails.d.ts +0 -17
  551. package/lib-esm/hooks/useDialog.d.ts +0 -16
  552. package/lib-esm/hooks/useFocusTrap.d.ts +0 -32
  553. package/lib-esm/hooks/useFocusZone.d.ts +0 -23
  554. package/lib-esm/hooks/useOnEscapePress.d.ts +0 -23
  555. package/lib-esm/hooks/useOnOutsideClick.d.ts +0 -8
  556. package/lib-esm/hooks/useOpenAndCloseFocus.d.ts +0 -8
  557. package/lib-esm/hooks/useOverlay.d.ts +0 -15
  558. package/lib-esm/hooks/useProvidedRefOrCreate.d.ts +0 -10
  559. package/lib-esm/hooks/useProvidedStateOrCreate.d.ts +0 -10
  560. package/lib-esm/hooks/useProvidedStateOrCreate.js +0 -20
  561. package/lib-esm/hooks/useRenderForcingRef.d.ts +0 -8
  562. package/lib-esm/hooks/useRenderForcingRef.js +0 -18
  563. package/lib-esm/hooks/useResizeObserver.d.ts +0 -1
  564. package/lib-esm/hooks/useResizeObserver.js +0 -10
  565. package/lib-esm/hooks/useSafeTimeout.d.ts +0 -12
  566. package/lib-esm/hooks/useScrollFlash.d.ts +0 -6
  567. package/lib-esm/hooks/useScrollFlash.js +0 -22
  568. package/lib-esm/index.d.ts +0 -114
  569. package/lib-esm/polyfills/eventListenerSignal.d.ts +0 -6
  570. package/lib-esm/sx.d.ts +0 -6
  571. package/lib-esm/theme-preval.d.ts +0 -49
  572. package/lib-esm/theme.d.ts +0 -2
  573. package/lib-esm/utils/deprecate.d.ts +0 -18
  574. package/lib-esm/utils/isNumeric.d.ts +0 -1
  575. package/lib-esm/utils/iterateFocusableElements.d.ts +0 -42
  576. package/lib-esm/utils/scrollIntoViewingArea.d.ts +0 -1
  577. package/lib-esm/utils/scrollIntoViewingArea.js +0 -30
  578. package/lib-esm/utils/ssr.d.ts +0 -1
  579. package/lib-esm/utils/ssr.js +0 -1
  580. package/lib-esm/utils/test-deprecations.d.ts +0 -1
  581. package/lib-esm/utils/test-helpers.js +0 -7
  582. package/lib-esm/utils/test-matchers.d.ts +0 -1
  583. package/lib-esm/utils/testing.d.ts +0 -1028
  584. package/lib-esm/utils/theme.d.ts +0 -9
  585. package/lib-esm/utils/types/AriaRole.d.ts +0 -4
  586. package/lib-esm/utils/types/AriaRole.js +0 -1
  587. package/lib-esm/utils/types/ComponentProps.d.ts +0 -9
  588. package/lib-esm/utils/types/ComponentProps.js +0 -1
  589. package/lib-esm/utils/types/Flatten.d.ts +0 -4
  590. package/lib-esm/utils/types/Flatten.js +0 -1
  591. package/lib-esm/utils/types/Merge.d.ts +0 -19
  592. package/lib-esm/utils/types/Merge.js +0 -1
  593. package/lib-esm/utils/types/index.d.ts +0 -4
  594. package/lib-esm/utils/types/index.js +0 -4
  595. package/lib-esm/utils/uniqueId.d.ts +0 -1
  596. package/lib-esm/utils/userAgent.d.ts +0 -1
@@ -1,9 +1,8 @@
1
- import { iterateFocusableElements } from '../utils/iterateFocusableElements';
1
+ import { isFocusable, iterateFocusableElements } from '../utils/iterateFocusableElements';
2
2
  import { polyfill as eventListenerSignalPolyfill } from '../polyfills/eventListenerSignal';
3
3
  import { isMacOS } from '../utils/userAgent';
4
4
  import { uniqueId } from '../utils/uniqueId';
5
5
  eventListenerSignalPolyfill();
6
- // eslint-disable-next-line no-shadow
7
6
  export let FocusKeys;
8
7
 
9
8
  (function (FocusKeys) {
@@ -163,24 +162,21 @@ function shouldIgnoreFocusHandling(keyboardEvent, activeElement) {
163
162
  return false;
164
163
  }
165
164
 
166
- export const isActiveDescendantAttribute = 'data-is-active-descendant';
167
- /**
168
- * A value of activated-directly for data-is-active-descendant indicates the descendant was activated
169
- * by a manual user interaction with intent to move active descendant. This usually translates to the
170
- * user pressing one of the bound keys (up/down arrow, etc) to move through the focus zone. This is
171
- * intended to be roughly equivalent to the :focus-visible pseudo-class
172
- **/
165
+ const subscriptions = [];
173
166
 
174
- export const activeDescendantActivatedDirectly = 'activated-directly';
175
- /**
176
- * A value of activated-indirectly for data-is-active-descendant indicates the descendant was activated
177
- * implicitly, and not by a direct key press. This includes focus zone being created from scratch, focusable
178
- * elements being added/removed, and mouseover events. This is intended to be roughly equivalent
179
- * to :focus:not(:focus-visible)
180
- **/
181
-
182
- export const activeDescendantActivatedIndirectly = 'activated-indirectly';
183
- export const hasActiveDescendantAttribute = 'data-has-active-descendant';
167
+ function notifyActiveElement(element) {
168
+ for (const subscription of subscriptions) {
169
+ subscription(element);
170
+ }
171
+ }
172
+
173
+ function subscribeToActiveElementChanges(callback) {
174
+ subscriptions.push(callback);
175
+ return () => {
176
+ const index = subscriptions.indexOf(callback);
177
+ subscriptions.splice(index, 1);
178
+ };
179
+ }
184
180
  /**
185
181
  * Sets up the arrow key focus behavior for all focusable elements in the given `container`.
186
182
  * @param container
@@ -188,6 +184,7 @@ export const hasActiveDescendantAttribute = 'data-has-active-descendant';
188
184
  * @returns
189
185
  */
190
186
 
187
+
191
188
  export function focusZone(container, settings) {
192
189
  var _settings$bindKeys, _settings$focusOutBeh, _settings$focusInStra, _settings$abortSignal;
193
190
 
@@ -198,66 +195,34 @@ export function focusZone(container, settings) {
198
195
  const focusInStrategy = (_settings$focusInStra = settings === null || settings === void 0 ? void 0 : settings.focusInStrategy) !== null && _settings$focusInStra !== void 0 ? _settings$focusInStra : 'previous';
199
196
  const activeDescendantControl = settings === null || settings === void 0 ? void 0 : settings.activeDescendantControl;
200
197
  const activeDescendantCallback = settings === null || settings === void 0 ? void 0 : settings.onActiveDescendantChanged;
201
- let currentFocusedElement;
202
198
 
203
- function getFirstFocusableElement() {
204
- return focusableElements[0];
205
- }
206
-
207
- function isActiveDescendantInputFocused() {
208
- return document.activeElement === activeDescendantControl;
209
- }
210
-
211
- function updateFocusedElement(to, directlyActivated = false) {
212
- const from = currentFocusedElement;
213
- currentFocusedElement = to;
214
-
215
- if (activeDescendantControl) {
216
- if (to && isActiveDescendantInputFocused()) {
217
- setActiveDescendant(from, to, directlyActivated);
218
- } else {
219
- clearActiveDescendant();
220
- }
221
-
222
- return;
223
- }
224
-
225
- if (from && from !== to && savedTabIndex.has(from)) {
226
- from.setAttribute('tabindex', '-1');
199
+ function updateTabIndex(from, to) {
200
+ if (!activeDescendantControl) {
201
+ from === null || from === void 0 ? void 0 : from.setAttribute('tabindex', '-1');
202
+ to === null || to === void 0 ? void 0 : to.setAttribute('tabindex', '0');
227
203
  }
228
-
229
- to === null || to === void 0 ? void 0 : to.setAttribute('tabindex', '0');
230
204
  }
231
205
 
232
- function setActiveDescendant(from, to, directlyActivated = false) {
206
+ function setActiveDescendant(from, to) {
233
207
  if (!to.id) {
234
208
  to.setAttribute('id', uniqueId());
235
209
  }
236
210
 
237
- if (from && from !== to) {
238
- from.removeAttribute(isActiveDescendantAttribute);
239
- }
240
-
241
- if (!activeDescendantControl || !directlyActivated && activeDescendantControl.getAttribute('aria-activedescendant') === to.id) {
242
- // prevent active descendant callback from being called repeatedly if the same element is activated (e.g. via mousemove)
243
- return;
244
- }
245
-
246
- activeDescendantControl.setAttribute('aria-activedescendant', to.id);
247
- container.setAttribute(hasActiveDescendantAttribute, to.id);
248
- to.setAttribute(isActiveDescendantAttribute, directlyActivated ? activeDescendantActivatedDirectly : activeDescendantActivatedIndirectly);
249
- activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(to, from, directlyActivated);
211
+ currentFocusedElement = to;
212
+ activeDescendantControl === null || activeDescendantControl === void 0 ? void 0 : activeDescendantControl.setAttribute('aria-activedescendant', to.id);
213
+ notifyActiveElement(to);
214
+ activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(to, from);
250
215
  }
251
216
 
252
- function clearActiveDescendant(previouslyActiveElement = currentFocusedElement) {
217
+ function suspendActiveDescendant() {
218
+ activeDescendantControl === null || activeDescendantControl === void 0 ? void 0 : activeDescendantControl.removeAttribute('aria-activedescendant');
219
+ activeDescendantSuspended = true;
220
+ activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(undefined, currentFocusedElement);
221
+ currentFocusedElement = undefined;
222
+
253
223
  if (focusInStrategy === 'first') {
254
- currentFocusedElement = undefined;
224
+ currentFocusedIndex = 0;
255
225
  }
256
-
257
- activeDescendantControl === null || activeDescendantControl === void 0 ? void 0 : activeDescendantControl.removeAttribute('aria-activedescendant');
258
- container.removeAttribute(hasActiveDescendantAttribute);
259
- previouslyActiveElement === null || previouslyActiveElement === void 0 ? void 0 : previouslyActiveElement.removeAttribute(isActiveDescendantAttribute);
260
- activeDescendantCallback === null || activeDescendantCallback === void 0 ? void 0 : activeDescendantCallback(undefined, previouslyActiveElement, false);
261
226
  }
262
227
 
263
228
  function beginFocusManagement(...elements) {
@@ -284,10 +249,6 @@ export function focusZone(container, settings) {
284
249
 
285
250
  element.setAttribute('tabindex', '-1');
286
251
  }
287
-
288
- if (!currentFocusedElement) {
289
- updateFocusedElement(getFirstFocusableElement());
290
- }
291
252
  }
292
253
 
293
254
  function endFocusManagement(...elements) {
@@ -295,7 +256,13 @@ export function focusZone(container, settings) {
295
256
  const focusableElementIndex = focusableElements.indexOf(element);
296
257
 
297
258
  if (focusableElementIndex >= 0) {
298
- focusableElements.splice(focusableElementIndex, 1);
259
+ focusableElements.splice(focusableElementIndex, 1); // If removing the last-focused element, set tabindex=0 to the first element in the list.
260
+
261
+ if (element === currentFocusedElement && focusableElements.length > 0) {
262
+ updateTabIndex(undefined, focusableElements[0]);
263
+ currentFocusedElement = focusableElements[0];
264
+ currentFocusedIndex = 0;
265
+ }
299
266
  }
300
267
 
301
268
  const savedIndex = savedTabIndex.get(element);
@@ -308,38 +275,44 @@ export function focusZone(container, settings) {
308
275
  }
309
276
 
310
277
  savedTabIndex.delete(element);
311
- } // If removing the last-focused element, move focus to the first element in the list.
312
-
313
-
314
- if (element === currentFocusedElement) {
315
- const nextElementToFocus = getFirstFocusableElement();
316
- updateFocusedElement(nextElementToFocus);
317
278
  }
318
279
  }
319
280
  } // Take all tabbable elements within container under management
320
281
 
321
282
 
322
- beginFocusManagement(...iterateFocusableElements(container)); // Open the first tabbable element for tabbing
283
+ beginFocusManagement(...iterateFocusableElements(container)); // If multiple focus zones have overlapping DOM, we need to know about
284
+ // any changes that result from others so that the "previous" active element
285
+ // stays consistent.
323
286
 
324
- updateFocusedElement(getFirstFocusableElement()); // If the DOM structure of the container changes, make sure we keep our state up-to-date
325
- // with respect to the focusable elements cache and its order
287
+ const unsubscribeFromActiveElementChanges = subscribeToActiveElementChanges(activeElement => {
288
+ if (focusInStrategy === 'previous') {
289
+ const tabbableElementIndex = focusableElements.indexOf(activeElement);
326
290
 
327
- const observer = new MutationObserver(mutations => {
328
- // Perform all removals first, in case element order has simply changed
329
- for (const mutation of mutations) {
330
- for (const removedNode of mutation.removedNodes) {
331
- if (removedNode instanceof HTMLElement) {
332
- endFocusManagement(...iterateFocusableElements(removedNode));
333
- }
291
+ if (tabbableElementIndex >= 0) {
292
+ const nextFocusedElement = focusableElements[tabbableElementIndex];
293
+ const previousFocusedElement = focusableElements[currentFocusedIndex];
294
+ updateTabIndex(previousFocusedElement, nextFocusedElement);
295
+ currentFocusedIndex = tabbableElementIndex;
334
296
  }
335
297
  }
298
+ }); // Open the first tabbable element for tabbing
299
+
300
+ updateTabIndex(undefined, focusableElements[0]); // If the DOM structure of the container changes, make sure we keep our state up-to-date
301
+ // with respect to the focusable elements cache and its order
336
302
 
303
+ const observer = new MutationObserver(mutations => {
337
304
  for (const mutation of mutations) {
338
305
  for (const addedNode of mutation.addedNodes) {
339
- if (addedNode instanceof HTMLElement) {
306
+ if (addedNode instanceof HTMLElement && isFocusable(addedNode)) {
340
307
  beginFocusManagement(...iterateFocusableElements(addedNode));
341
308
  }
342
309
  }
310
+
311
+ for (const removedNode of mutation.removedNodes) {
312
+ if (removedNode instanceof HTMLElement && savedTabIndex.has(removedNode)) {
313
+ endFocusManagement(...iterateFocusableElements(removedNode));
314
+ }
315
+ }
343
316
  }
344
317
  });
345
318
  observer.observe(container, {
@@ -351,7 +324,13 @@ export function focusZone(container, settings) {
351
324
  signal.addEventListener('abort', () => {
352
325
  // Clean up any modifications
353
326
  endFocusManagement(...focusableElements);
354
- });
327
+ unsubscribeFromActiveElementChanges();
328
+ }); // When using activedescendant focusing, the first focus-in is caused by our listeners
329
+ // meaning we have to approach zero. This is safe since we clamp the value before using it.
330
+
331
+ let currentFocusedIndex = 0;
332
+ let activeDescendantSuspended = activeDescendantControl ? true : false;
333
+ let currentFocusedElement = activeDescendantControl ? undefined : focusableElements[0];
355
334
  let elementIndexFocusedByClick = undefined;
356
335
  container.addEventListener('mousedown', event => {
357
336
  // Since focusin is only called when focus changes, we need to make sure the clicked
@@ -361,75 +340,35 @@ export function focusZone(container, settings) {
361
340
  }
362
341
  }, {
363
342
  signal
364
- });
365
-
366
- if (activeDescendantControl) {
367
- container.addEventListener('focusin', event => {
368
- if (event.target instanceof HTMLElement && focusableElements.includes(event.target)) {
369
- // Move focus to the activeDescendantControl if one of the descendants is focused
370
- activeDescendantControl.focus();
371
- updateFocusedElement(event.target);
372
- }
373
- });
374
- container.addEventListener('mousemove', ({
375
- target
376
- }) => {
377
- if (!(target instanceof Node)) {
378
- return;
379
- }
380
-
381
- const focusableElement = focusableElements.find(element => element.contains(target));
343
+ }); // This is called whenever focus enters the container
382
344
 
383
- if (focusableElement) {
384
- updateFocusedElement(focusableElement);
385
- }
386
- }, {
387
- signal,
388
- capture: true
389
- }); // Listeners specifically on the controlling element
390
-
391
- activeDescendantControl.addEventListener('focusin', () => {
392
- // Focus moved into the active descendant input. Activate current or first descendant.
393
- if (!currentFocusedElement) {
394
- updateFocusedElement(getFirstFocusableElement());
395
- } else {
396
- setActiveDescendant(undefined, currentFocusedElement);
397
- }
398
- });
399
- activeDescendantControl.addEventListener('focusout', () => {
400
- clearActiveDescendant();
401
- });
402
- } else {
403
- // This is called whenever focus enters an element in the container
345
+ if (!activeDescendantControl) {
404
346
  container.addEventListener('focusin', event => {
405
347
  if (event.target instanceof HTMLElement) {
406
348
  // If a click initiated the focus movement, we always want to set our internal state
407
349
  // to reflect the clicked element as the currently focused one.
408
- if (elementIndexFocusedByClick !== undefined) {
350
+ if (elementIndexFocusedByClick != undefined) {
409
351
  if (elementIndexFocusedByClick >= 0) {
410
352
  if (focusableElements[elementIndexFocusedByClick] !== currentFocusedElement) {
411
- updateFocusedElement(focusableElements[elementIndexFocusedByClick]);
353
+ updateTabIndex(currentFocusedElement, focusableElements[elementIndexFocusedByClick]);
412
354
  }
355
+
356
+ currentFocusedIndex = elementIndexFocusedByClick;
413
357
  }
414
358
 
415
359
  elementIndexFocusedByClick = undefined;
416
360
  } else {
417
361
  // Set tab indexes and internal state based on the focus handling strategy
418
362
  if (focusInStrategy === 'previous') {
419
- updateFocusedElement(event.target);
420
- } else if (focusInStrategy === 'closest' || focusInStrategy === 'first') {
421
- if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget)) {
363
+ updateTabIndex(currentFocusedElement, event.target);
364
+ } else if (focusInStrategy === 'first') {
365
+ if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget) && event.target !== focusableElements[0]) {
422
366
  // Regardless of the previously focused element, if we're coming from outside the
423
- // container, put focus onto the first encountered element (from above, it's The
424
- // first element of the container; from below, it's the last). If the
425
- // focusInStrategy is set to "first", lastKeyboardFocusDirection will always
426
- // be undefined.
427
- const targetElementIndex = lastKeyboardFocusDirection === 'previous' ? focusableElements.length - 1 : 0;
428
- const targetElement = focusableElements[targetElementIndex];
429
- targetElement === null || targetElement === void 0 ? void 0 : targetElement.focus();
430
- return;
367
+ // container, put focus onto the first element.
368
+ currentFocusedIndex = 0;
369
+ focusableElements[0].focus();
431
370
  } else {
432
- updateFocusedElement(event.target);
371
+ updateTabIndex(currentFocusedElement, event.target);
433
372
  }
434
373
  } else if (typeof focusInStrategy === 'function') {
435
374
  if (event.relatedTarget instanceof Element && !container.contains(event.relatedTarget)) {
@@ -437,54 +376,31 @@ export function focusZone(container, settings) {
437
376
  const requestedFocusElementIndex = elementToFocus ? focusableElements.indexOf(elementToFocus) : -1;
438
377
 
439
378
  if (requestedFocusElementIndex >= 0 && elementToFocus instanceof HTMLElement) {
440
- // Since we are calling focus() this handler will run again synchronously. Therefore,
379
+ currentFocusedIndex = requestedFocusElementIndex; // Since we are calling focus() this handler will run again synchronously. Therefore,
441
380
  // we don't want to let this invocation finish since it will clobber the value of
442
381
  // currentFocusedElement.
382
+
443
383
  elementToFocus.focus();
444
384
  return;
445
385
  } else {
446
- // eslint-disable-next-line no-console
386
+ // Should we warn here?
447
387
  console.warn('Element requested is not a known focusable element.');
448
388
  }
449
389
  } else {
450
- updateFocusedElement(event.target);
390
+ updateTabIndex(currentFocusedElement, event.target);
451
391
  }
452
392
  }
453
393
  }
454
- }
455
-
456
- lastKeyboardFocusDirection = undefined;
457
- }, {
458
- signal
459
- });
460
- }
461
394
 
462
- const keyboardEventRecipient = activeDescendantControl !== null && activeDescendantControl !== void 0 ? activeDescendantControl : container; // If the strategy is "closest", we need to capture the direction that the user
463
- // is trying to move focus before our focusin handler is executed.
464
-
465
- let lastKeyboardFocusDirection = undefined;
466
-
467
- if (focusInStrategy === 'closest') {
468
- document.addEventListener('keydown', event => {
469
- if (event.key === 'Tab') {
470
- lastKeyboardFocusDirection = getDirection(event);
395
+ notifyActiveElement(event.target);
396
+ currentFocusedElement = event.target;
471
397
  }
472
398
  }, {
473
- signal,
474
- capture: true
399
+ signal
475
400
  });
476
401
  }
477
402
 
478
- function getCurrentFocusedIndex() {
479
- if (!currentFocusedElement) {
480
- return 0;
481
- }
482
-
483
- const focusedIndex = focusableElements.indexOf(currentFocusedElement);
484
- const fallbackIndex = currentFocusedElement === container ? -1 : 0;
485
- return focusedIndex !== -1 ? focusedIndex : fallbackIndex;
486
- } // "keydown" is the event that triggers DOM focus change, so that is what we use here
487
-
403
+ const keyboardEventRecipient = activeDescendantControl !== null && activeDescendantControl !== void 0 ? activeDescendantControl : container; // "keydown" is the event that triggers DOM focus change, so that is what we use here
488
404
 
489
405
  keyboardEventRecipient.addEventListener('keydown', event => {
490
406
  if (event.key in KEY_TO_DIRECTION) {
@@ -493,57 +409,65 @@ export function focusZone(container, settings) {
493
409
  if (!event.defaultPrevented && (keyBit & bindKeys) > 0 && !shouldIgnoreFocusHandling(event, document.activeElement)) {
494
410
  // Moving forward or backward?
495
411
  const direction = getDirection(event);
496
- let nextElementToFocus = undefined; // If there is a custom function that retrieves the next focusable element, try calling that first.
412
+ let nextElementToFocus = undefined;
497
413
 
498
- if (settings !== null && settings !== void 0 && settings.getNextFocusable) {
499
- var _document$activeEleme;
414
+ if (activeDescendantSuspended) {
415
+ activeDescendantSuspended = false;
416
+ nextElementToFocus = focusableElements[currentFocusedIndex];
417
+ } else {
418
+ // If there is a custom function that retrieves the next focusable element, try calling that first.
419
+ if (settings !== null && settings !== void 0 && settings.getNextFocusable) {
420
+ var _document$activeEleme;
500
421
 
501
- nextElementToFocus = settings.getNextFocusable(direction, (_document$activeEleme = document.activeElement) !== null && _document$activeEleme !== void 0 ? _document$activeEleme : undefined, event);
502
- }
422
+ nextElementToFocus = settings.getNextFocusable(direction, (_document$activeEleme = document.activeElement) !== null && _document$activeEleme !== void 0 ? _document$activeEleme : undefined, event);
423
+ }
503
424
 
504
- if (!nextElementToFocus) {
505
- const lastFocusedIndex = getCurrentFocusedIndex();
506
- let nextFocusedIndex = lastFocusedIndex;
425
+ if (!nextElementToFocus) {
426
+ const lastFocusedIndex = currentFocusedIndex;
427
+
428
+ if (direction === 'previous') {
429
+ currentFocusedIndex -= 1;
430
+ } else if (direction === 'start') {
431
+ currentFocusedIndex = 0;
432
+ } else if (direction === 'next') {
433
+ currentFocusedIndex += 1;
434
+ } else if (direction === 'end') {
435
+ currentFocusedIndex = focusableElements.length - 1;
436
+ }
507
437
 
508
- if (direction === 'previous') {
509
- nextFocusedIndex -= 1;
510
- } else if (direction === 'start') {
511
- nextFocusedIndex = 0;
512
- } else if (direction === 'next') {
513
- nextFocusedIndex += 1;
514
- } else {
515
- // end
516
- nextFocusedIndex = focusableElements.length - 1;
517
- }
438
+ if (currentFocusedIndex < 0) {
439
+ // Tab should never cause focus to wrap. Use focusTrap for that behavior.
440
+ if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
441
+ currentFocusedIndex = focusableElements.length - 1;
442
+ } else {
443
+ if (activeDescendantControl) {
444
+ suspendActiveDescendant();
445
+ }
518
446
 
519
- if (nextFocusedIndex < 0) {
520
- // Tab should never cause focus to wrap. Use focusTrap for that behavior.
521
- if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
522
- nextFocusedIndex = focusableElements.length - 1;
523
- } else {
524
- nextFocusedIndex = 0;
447
+ currentFocusedIndex = 0;
448
+ }
525
449
  }
526
- }
527
450
 
528
- if (nextFocusedIndex >= focusableElements.length) {
529
- if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
530
- nextFocusedIndex = 0;
531
- } else {
532
- nextFocusedIndex = focusableElements.length - 1;
451
+ if (currentFocusedIndex >= focusableElements.length) {
452
+ if (focusOutBehavior === 'wrap' && event.key !== 'Tab') {
453
+ currentFocusedIndex = 0;
454
+ } else {
455
+ currentFocusedIndex = focusableElements.length - 1;
456
+ }
533
457
  }
534
- }
535
458
 
536
- if (lastFocusedIndex !== nextFocusedIndex) {
537
- nextElementToFocus = focusableElements[nextFocusedIndex];
459
+ if (lastFocusedIndex !== currentFocusedIndex) {
460
+ nextElementToFocus = focusableElements[currentFocusedIndex];
461
+ }
538
462
  }
539
463
  }
540
464
 
541
- if (activeDescendantControl) {
542
- updateFocusedElement(nextElementToFocus || currentFocusedElement, true);
543
- } else if (nextElementToFocus) {
544
- lastKeyboardFocusDirection = direction; // updateFocusedElement will be called implicitly when focus moves, as long as the event isn't prevented somehow
545
-
546
- nextElementToFocus.focus();
465
+ if (nextElementToFocus) {
466
+ if (activeDescendantControl) {
467
+ setActiveDescendant(currentFocusedElement, nextElementToFocus);
468
+ } else {
469
+ nextElementToFocus.focus();
470
+ }
547
471
  } // Tab should always allow escaping from this container, so only
548
472
  // preventDefault if tab key press already resulted in a focus movement
549
473
 
@@ -553,8 +477,19 @@ export function focusZone(container, settings) {
553
477
  }
554
478
  }
555
479
  }
480
+
481
+ if (event.key === 'Escape' && !activeDescendantSuspended && activeDescendantControl) {
482
+ suspendActiveDescendant();
483
+ }
556
484
  }, {
557
485
  signal
558
486
  });
487
+
488
+ if (activeDescendantControl) {
489
+ activeDescendantControl.addEventListener('focusout', () => {
490
+ suspendActiveDescendant();
491
+ });
492
+ }
493
+
559
494
  return controller;
560
495
  }
@@ -1,5 +1,4 @@
1
- import { themeGet } from '@styled-system/theme-get'; // eslint-disable-next-line import/no-namespace
2
-
1
+ import { themeGet } from '@styled-system/theme-get';
3
2
  import * as styledSystem from 'styled-system';
4
3
  import theme from './theme';
5
4
  const {
@@ -3,5 +3,4 @@ export { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
3
3
  export { useOnEscapePress } from './useOnEscapePress';
4
4
  export { useOpenAndCloseFocus } from './useOpenAndCloseFocus';
5
5
  export { useAnchoredPosition } from './useAnchoredPosition';
6
- export { useOverlay } from './useOverlay';
7
- export { useRenderForcingRef } from './useRenderForcingRef';
6
+ export { useOverlay } from './useOverlay';
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { getAnchoredPosition } from '../behaviors/anchoredPosition';
3
3
  import { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
4
- import { useResizeObserver } from './useResizeObserver';
5
4
 
6
5
  /**
7
6
  * Calculates the top and left values for an absolutely-positioned floating element
@@ -12,20 +11,16 @@ import { useResizeObserver } from './useResizeObserver';
12
11
  * @returns An object of {top: number, left: number} to absolutely-position the
13
12
  * floating element.
14
13
  */
15
- export function useAnchoredPosition(settings, dependencies = []) {
14
+ export function useAnchoredPosition(settings, dependencies) {
16
15
  const floatingElementRef = useProvidedRefOrCreate(settings === null || settings === void 0 ? void 0 : settings.floatingElementRef);
17
16
  const anchorElementRef = useProvidedRefOrCreate(settings === null || settings === void 0 ? void 0 : settings.anchorElementRef);
18
17
  const [position, setPosition] = React.useState(undefined);
19
- const updatePosition = React.useCallback(() => {
18
+ React.useEffect(() => {
20
19
  if (floatingElementRef.current instanceof Element && anchorElementRef.current instanceof Element) {
21
20
  setPosition(getAnchoredPosition(floatingElementRef.current, anchorElementRef.current, settings));
22
- } else {
23
- setPosition(undefined);
24
- }
25
- }, // eslint-disable-next-line react-hooks/exhaustive-deps
26
- [floatingElementRef, anchorElementRef, ...dependencies]);
27
- React.useLayoutEffect(updatePosition, [updatePosition]);
28
- useResizeObserver(updatePosition);
21
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
22
+
23
+ }, dependencies !== null && dependencies !== void 0 ? dependencies : []);
29
24
  return {
30
25
  floatingElementRef,
31
26
  anchorElementRef,
@@ -42,7 +42,7 @@ function useDialog({
42
42
  }
43
43
  }, [isOpen, initialFocusRef, closeButtonRef]);
44
44
  const getFocusableItem = useCallback((e, movement) => {
45
- if (modalRef.current) {
45
+ if (modalRef && modalRef.current) {
46
46
  const items = Array.from(modalRef.current.querySelectorAll('*')).filter(focusable);
47
47
  if (items.length === 0) return;
48
48
  e.preventDefault();
@@ -7,31 +7,11 @@ import { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
7
7
  * that should trap focus.
8
8
  * @param settings {FocusTrapHookSettings}
9
9
  */
10
- export function useFocusTrap(settings, dependencies = []) {
10
+ export function useFocusTrap(settings) {
11
11
  const containerRef = useProvidedRefOrCreate(settings === null || settings === void 0 ? void 0 : settings.containerRef);
12
12
  const initialFocusRef = useProvidedRefOrCreate(settings === null || settings === void 0 ? void 0 : settings.initialFocusRef);
13
13
  const disabled = settings === null || settings === void 0 ? void 0 : settings.disabled;
14
14
  const abortController = React.useRef();
15
- const previousFocusedElement = React.useRef(null); // If we are enabling a focus trap and haven't already stored the previously focused element
16
- // go ahead an do that so we can restore later when the trap is disabled.
17
-
18
- if (!previousFocusedElement.current && !(settings !== null && settings !== void 0 && settings.disabled)) {
19
- previousFocusedElement.current = document.activeElement;
20
- } // This function removes the event listeners that enable the focus trap and restores focus
21
- // to the previously-focused element (if necessary).
22
-
23
-
24
- function disableTrap() {
25
- var _abortController$curr;
26
-
27
- (_abortController$curr = abortController.current) === null || _abortController$curr === void 0 ? void 0 : _abortController$curr.abort();
28
-
29
- if (settings !== null && settings !== void 0 && settings.restoreFocusOnCleanUp && previousFocusedElement.current instanceof HTMLElement) {
30
- previousFocusedElement.current.focus();
31
- previousFocusedElement.current = null;
32
- }
33
- }
34
-
35
15
  React.useEffect(() => {
36
16
  if (containerRef.current instanceof HTMLElement) {
37
17
  if (!disabled) {
@@ -39,14 +19,17 @@ export function useFocusTrap(settings, dependencies = []) {
39
19
 
40
20
  abortController.current = focusTrap(containerRef.current, (_initialFocusRef$curr = initialFocusRef.current) !== null && _initialFocusRef$curr !== void 0 ? _initialFocusRef$curr : undefined);
41
21
  return () => {
42
- disableTrap();
22
+ var _abortController$curr;
23
+
24
+ (_abortController$curr = abortController.current) === null || _abortController$curr === void 0 ? void 0 : _abortController$curr.abort();
43
25
  };
44
26
  } else {
45
- disableTrap();
27
+ var _abortController$curr2;
28
+
29
+ (_abortController$curr2 = abortController.current) === null || _abortController$curr2 === void 0 ? void 0 : _abortController$curr2.abort();
46
30
  }
47
31
  }
48
- }, // eslint-disable-next-line react-hooks/exhaustive-deps
49
- [containerRef, initialFocusRef, disabled, ...dependencies]);
32
+ }, [containerRef, initialFocusRef, disabled]);
50
33
  return {
51
34
  containerRef,
52
35
  initialFocusRef
@@ -1,12 +1,12 @@
1
1
  import React, { useEffect } from 'react';
2
2
  import { focusZone } from '../behaviors/focusZone';
3
3
  import { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
4
- export function useFocusZone(settings = {}, dependencies = []) {
4
+ export function useFocusZone(settings = {}, dependencies) {
5
5
  const containerRef = useProvidedRefOrCreate(settings.containerRef);
6
6
  const useActiveDescendant = !!settings.activeDescendantFocus;
7
7
  const passedActiveDescendantRef = typeof settings.activeDescendantFocus === 'boolean' || !settings.activeDescendantFocus ? undefined : settings.activeDescendantFocus;
8
8
  const activeDescendantControlRef = useProvidedRefOrCreate(passedActiveDescendantRef);
9
- const disabled = settings.disabled;
9
+ const disabled = settings === null || settings === void 0 ? void 0 : settings.disabled;
10
10
  const abortController = React.useRef();
11
11
  useEffect(() => {
12
12
  if (containerRef.current instanceof HTMLElement && (!useActiveDescendant || activeDescendantControlRef.current instanceof HTMLElement)) {
@@ -27,9 +27,9 @@ export function useFocusZone(settings = {}, dependencies = []) {
27
27
 
28
28
  (_abortController$curr2 = abortController.current) === null || _abortController$curr2 === void 0 ? void 0 : _abortController$curr2.abort();
29
29
  }
30
- }
31
- }, // eslint-disable-next-line react-hooks/exhaustive-deps
32
- [disabled, ...dependencies]);
30
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
31
+
32
+ }, dependencies !== null && dependencies !== void 0 ? dependencies : []);
33
33
  return {
34
34
  containerRef,
35
35
  activeDescendantControlRef