@primer/components 31.2.0-rc.b718ff50 → 31.2.0-rc.decfca99

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 (420) hide show
  1. package/.github/workflows/ci.yml +5 -2
  2. package/.github/workflows/release.yml +1 -0
  3. package/.github/workflows/release_canary.yml +1 -0
  4. package/CHANGELOG.md +13 -1
  5. package/dist/browser.esm.js +620 -618
  6. package/dist/browser.esm.js.map +1 -1
  7. package/dist/browser.umd.js +188 -186
  8. package/dist/browser.umd.js.map +1 -1
  9. package/docs/content/ActionList2.mdx +360 -0
  10. package/docs/content/StateLabel.md +5 -4
  11. package/docs/content/getting-started.md +1 -1
  12. package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +17 -0
  13. package/lib/ActionList/Divider.jsx +29 -0
  14. package/lib/ActionList/Group.jsx +23 -0
  15. package/lib/ActionList/Header.jsx +66 -0
  16. package/lib/ActionList/Item.jsx +301 -0
  17. package/lib/ActionList/List.jsx +138 -0
  18. package/lib/ActionList/index.js +12 -23
  19. package/lib/ActionList2/Description.d.ts +12 -0
  20. package/lib/ActionList2/Description.js +53 -0
  21. package/lib/ActionList2/Description.jsx +30 -0
  22. package/lib/ActionList2/Divider.d.ts +5 -0
  23. package/lib/ActionList2/Divider.js +35 -0
  24. package/lib/ActionList2/Divider.jsx +22 -0
  25. package/lib/ActionList2/Group.d.ts +11 -0
  26. package/lib/ActionList2/Group.js +57 -0
  27. package/lib/ActionList2/Group.jsx +25 -0
  28. package/lib/ActionList2/Header.d.ts +26 -0
  29. package/lib/ActionList2/Header.js +55 -0
  30. package/lib/ActionList2/Header.jsx +36 -0
  31. package/lib/ActionList2/Item.d.ts +63 -0
  32. package/lib/ActionList2/Item.js +244 -0
  33. package/lib/ActionList2/Item.jsx +174 -0
  34. package/lib/ActionList2/LinkItem.d.ts +17 -0
  35. package/lib/ActionList2/LinkItem.js +57 -0
  36. package/lib/ActionList2/LinkItem.jsx +28 -0
  37. package/lib/ActionList2/List.d.ts +26 -0
  38. package/lib/ActionList2/List.js +59 -0
  39. package/lib/ActionList2/List.jsx +41 -0
  40. package/lib/ActionList2/Selection.d.ts +5 -0
  41. package/lib/ActionList2/Selection.js +70 -0
  42. package/lib/ActionList2/Selection.jsx +36 -0
  43. package/lib/ActionList2/Visuals.d.ts +9 -0
  44. package/lib/ActionList2/Visuals.js +90 -0
  45. package/lib/ActionList2/Visuals.jsx +48 -0
  46. package/lib/ActionList2/index.d.ts +36 -0
  47. package/lib/ActionList2/index.js +29 -0
  48. package/lib/ActionMenu.jsx +73 -0
  49. package/lib/AnchoredOverlay/AnchoredOverlay.jsx +100 -0
  50. package/lib/AnchoredOverlay/index.js +4 -12
  51. package/lib/Autocomplete/Autocomplete.d.ts +28 -28
  52. package/lib/Autocomplete/Autocomplete.jsx +100 -0
  53. package/lib/Autocomplete/AutocompleteContext.jsx +5 -0
  54. package/lib/Autocomplete/AutocompleteInput.d.ts +28 -28
  55. package/lib/Autocomplete/AutocompleteInput.jsx +113 -0
  56. package/lib/Autocomplete/AutocompleteMenu.jsx +190 -0
  57. package/lib/Autocomplete/AutocompleteOverlay.jsx +55 -0
  58. package/lib/Autocomplete/index.js +7 -14
  59. package/lib/Avatar.jsx +34 -0
  60. package/lib/AvatarPair.jsx +29 -0
  61. package/lib/AvatarStack.jsx +151 -0
  62. package/lib/BaseStyles.jsx +65 -0
  63. package/lib/BorderBox.jsx +18 -0
  64. package/lib/Box.jsx +10 -0
  65. package/lib/BranchName.jsx +20 -0
  66. package/lib/Breadcrumbs.jsx +74 -0
  67. package/lib/Button/Button.d.ts +25 -25
  68. package/lib/Button/Button.jsx +60 -0
  69. package/lib/Button/ButtonBase.jsx +36 -0
  70. package/lib/Button/ButtonClose.d.ts +45 -45
  71. package/lib/Button/ButtonClose.jsx +55 -0
  72. package/lib/Button/ButtonDanger.d.ts +25 -25
  73. package/lib/Button/ButtonDanger.jsx +63 -0
  74. package/lib/Button/ButtonGroup.jsx +55 -0
  75. package/lib/Button/ButtonInvisible.d.ts +25 -25
  76. package/lib/Button/ButtonInvisible.jsx +52 -0
  77. package/lib/Button/ButtonOutline.d.ts +25 -25
  78. package/lib/Button/ButtonOutline.jsx +63 -0
  79. package/lib/Button/ButtonPrimary.d.ts +25 -25
  80. package/lib/Button/ButtonPrimary.jsx +62 -0
  81. package/lib/Button/ButtonStyles.jsx +37 -0
  82. package/lib/Button/ButtonTableList.jsx +49 -0
  83. package/lib/Button/index.js +21 -70
  84. package/lib/Caret.jsx +93 -0
  85. package/lib/CircleBadge.jsx +43 -0
  86. package/lib/CircleOcticon.d.ts +42 -42
  87. package/lib/CircleOcticon.jsx +21 -0
  88. package/lib/CounterLabel.jsx +44 -0
  89. package/lib/Details.jsx +21 -0
  90. package/lib/Dialog/ConfirmationDialog.jsx +146 -0
  91. package/lib/Dialog/Dialog.jsx +273 -0
  92. package/lib/Dialog.d.ts +45 -45
  93. package/lib/Dialog.jsx +131 -0
  94. package/lib/Dropdown.d.ts +176 -176
  95. package/lib/Dropdown.jsx +134 -0
  96. package/lib/DropdownMenu/DropdownButton.d.ts +46 -46
  97. package/lib/DropdownMenu/DropdownButton.jsx +14 -0
  98. package/lib/DropdownMenu/DropdownMenu.jsx +70 -0
  99. package/lib/DropdownMenu/index.js +6 -20
  100. package/lib/DropdownStyles.js +18 -26
  101. package/lib/FilterList.d.ts +42 -42
  102. package/lib/FilterList.jsx +63 -0
  103. package/lib/FilteredActionList/FilteredActionList.jsx +100 -0
  104. package/lib/FilteredActionList/index.js +4 -12
  105. package/lib/FilteredSearch.jsx +29 -0
  106. package/lib/Flash.jsx +70 -0
  107. package/lib/Flex.jsx +15 -0
  108. package/lib/FormGroup.jsx +25 -0
  109. package/lib/Grid.jsx +15 -0
  110. package/lib/Header.jsx +90 -0
  111. package/lib/Heading.jsx +21 -0
  112. package/lib/Label.jsx +84 -0
  113. package/lib/LabelGroup.jsx +19 -0
  114. package/lib/Link.jsx +38 -0
  115. package/lib/Overlay.jsx +156 -0
  116. package/lib/Pagehead.jsx +18 -0
  117. package/lib/Pagination/Pagination.jsx +163 -0
  118. package/lib/Pagination/index.js +6 -12
  119. package/lib/Pagination/model.jsx +174 -0
  120. package/lib/PointerBox.jsx +25 -0
  121. package/lib/Popover.jsx +210 -0
  122. package/lib/Portal/Portal.jsx +79 -0
  123. package/lib/Portal/index.js +5 -16
  124. package/lib/Position.d.ts +4 -4
  125. package/lib/Position.jsx +46 -0
  126. package/lib/ProgressBar.jsx +39 -0
  127. package/lib/SelectMenu/SelectMenu.d.ts +246 -246
  128. package/lib/SelectMenu/SelectMenu.jsx +114 -0
  129. package/lib/SelectMenu/SelectMenuContext.jsx +5 -0
  130. package/lib/SelectMenu/SelectMenuDivider.jsx +43 -0
  131. package/lib/SelectMenu/SelectMenuFilter.jsx +59 -0
  132. package/lib/SelectMenu/SelectMenuFooter.jsx +46 -0
  133. package/lib/SelectMenu/SelectMenuHeader.jsx +44 -0
  134. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  135. package/lib/SelectMenu/SelectMenuItem.jsx +143 -0
  136. package/lib/SelectMenu/SelectMenuList.jsx +60 -0
  137. package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +21 -0
  138. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  139. package/lib/SelectMenu/SelectMenuModal.jsx +119 -0
  140. package/lib/SelectMenu/SelectMenuTab.jsx +93 -0
  141. package/lib/SelectMenu/SelectMenuTabPanel.jsx +43 -0
  142. package/lib/SelectMenu/SelectMenuTabs.jsx +58 -0
  143. package/lib/SelectMenu/hooks/useKeyboardNav.js +80 -96
  144. package/lib/SelectMenu/index.js +7 -14
  145. package/lib/SelectPanel/SelectPanel.jsx +105 -0
  146. package/lib/SelectPanel/index.js +4 -12
  147. package/lib/SideNav.jsx +177 -0
  148. package/lib/Spinner.jsx +35 -0
  149. package/lib/StateLabel.d.ts +1 -1
  150. package/lib/StateLabel.js +6 -1
  151. package/lib/StateLabel.jsx +94 -0
  152. package/lib/StyledOcticon.jsx +20 -0
  153. package/lib/SubNav.jsx +104 -0
  154. package/lib/TabNav.jsx +60 -0
  155. package/lib/Text.jsx +14 -0
  156. package/lib/TextInput.jsx +23 -0
  157. package/lib/TextInputWithTokens.d.ts +28 -28
  158. package/lib/TextInputWithTokens.jsx +218 -0
  159. package/lib/ThemeProvider.jsx +130 -0
  160. package/lib/Timeline.d.ts +43 -43
  161. package/lib/Timeline.jsx +124 -0
  162. package/lib/Token/AvatarToken.d.ts +1 -1
  163. package/lib/Token/AvatarToken.jsx +54 -0
  164. package/lib/Token/IssueLabelToken.d.ts +1 -1
  165. package/lib/Token/IssueLabelToken.jsx +125 -0
  166. package/lib/Token/Token.d.ts +1 -1
  167. package/lib/Token/Token.jsx +103 -0
  168. package/lib/Token/TokenBase.jsx +88 -0
  169. package/lib/Token/_RemoveTokenButton.jsx +108 -0
  170. package/lib/Token/_TokenTextContainer.jsx +49 -0
  171. package/lib/Token/index.js +11 -30
  172. package/lib/Tooltip.jsx +246 -0
  173. package/lib/Truncate.jsx +27 -0
  174. package/lib/UnderlineNav.jsx +90 -0
  175. package/lib/_TextInputWrapper.js +2 -2
  176. package/lib/_TextInputWrapper.jsx +120 -0
  177. package/lib/_UnstyledTextInput.jsx +22 -0
  178. package/lib/__tests__/ActionList.test.jsx +49 -0
  179. package/lib/__tests__/ActionList.types.test.jsx +45 -0
  180. package/lib/__tests__/ActionList2.test.d.ts +1 -0
  181. package/lib/__tests__/ActionList2.test.js +53 -0
  182. package/lib/__tests__/ActionList2.test.jsx +46 -0
  183. package/lib/__tests__/ActionMenu.test.jsx +124 -0
  184. package/lib/__tests__/AnchoredOverlay.test.jsx +121 -0
  185. package/lib/__tests__/Autocomplete.test.jsx +299 -0
  186. package/lib/__tests__/Avatar.test.jsx +42 -0
  187. package/lib/__tests__/AvatarStack.test.jsx +43 -0
  188. package/lib/__tests__/BorderBox.test.jsx +36 -0
  189. package/lib/__tests__/Box.test.jsx +41 -0
  190. package/lib/__tests__/BranchName.test.jsx +27 -0
  191. package/lib/__tests__/Breadcrumbs.test.jsx +28 -0
  192. package/lib/__tests__/BreadcrumbsItem.test.jsx +31 -0
  193. package/lib/__tests__/Button.test.jsx +100 -0
  194. package/lib/__tests__/Caret.test.jsx +37 -0
  195. package/lib/__tests__/CircleBadge.test.jsx +55 -0
  196. package/lib/__tests__/CircleOcticon.test.jsx +45 -0
  197. package/lib/__tests__/ConfirmationDialog.test.jsx +119 -0
  198. package/lib/__tests__/CounterLabel.test.jsx +36 -0
  199. package/lib/__tests__/Details.test.jsx +85 -0
  200. package/lib/__tests__/Dialog.test.jsx +139 -0
  201. package/lib/__tests__/Dropdown.test.jsx +49 -0
  202. package/lib/__tests__/DropdownMenu.test.jsx +119 -0
  203. package/lib/__tests__/FilterList.test.jsx +27 -0
  204. package/lib/__tests__/FilterListItem.test.jsx +31 -0
  205. package/lib/__tests__/FilteredSearch.test.jsx +27 -0
  206. package/lib/__tests__/Flash.test.jsx +36 -0
  207. package/lib/__tests__/Flex.test.jsx +51 -0
  208. package/lib/__tests__/FormGroup.test.jsx +36 -0
  209. package/lib/__tests__/Grid.test.jsx +69 -0
  210. package/lib/__tests__/Header.test.jsx +45 -0
  211. package/lib/__tests__/Heading.test.jsx +71 -0
  212. package/lib/__tests__/KeyPaths.types.test.js +5 -8
  213. package/lib/__tests__/Label.test.jsx +33 -0
  214. package/lib/__tests__/LabelGroup.test.jsx +29 -0
  215. package/lib/__tests__/Link.test.jsx +43 -0
  216. package/lib/__tests__/Merge.types.test.js +13 -19
  217. package/lib/__tests__/Overlay.test.jsx +105 -0
  218. package/lib/__tests__/Pagehead.test.jsx +25 -0
  219. package/lib/__tests__/Pagination/Pagination.test.jsx +32 -0
  220. package/lib/__tests__/Pagination/PaginationModel.test.jsx +118 -0
  221. package/lib/__tests__/PointerBox.test.jsx +33 -0
  222. package/lib/__tests__/Popover.test.jsx +58 -0
  223. package/lib/__tests__/Portal.test.jsx +102 -0
  224. package/lib/__tests__/Position.test.jsx +96 -0
  225. package/lib/__tests__/ProgressBar.test.jsx +38 -0
  226. package/lib/__tests__/SelectMenu.test.jsx +120 -0
  227. package/lib/__tests__/SelectPanel.test.jsx +48 -0
  228. package/lib/__tests__/SideNav.test.jsx +55 -0
  229. package/lib/__tests__/Spinner.test.jsx +41 -0
  230. package/lib/__tests__/StateLabel.test.jsx +46 -0
  231. package/lib/__tests__/StyledOcticon.test.jsx +28 -0
  232. package/lib/__tests__/SubNav.test.jsx +47 -0
  233. package/lib/__tests__/SubNavLink.test.jsx +31 -0
  234. package/lib/__tests__/TabNav.test.jsx +32 -0
  235. package/lib/__tests__/Text.test.jsx +71 -0
  236. package/lib/__tests__/TextInput.test.jsx +45 -0
  237. package/lib/__tests__/TextInputWithTokens.test.jsx +302 -0
  238. package/lib/__tests__/ThemeProvider.test.jsx +314 -0
  239. package/lib/__tests__/Timeline.test.jsx +51 -0
  240. package/lib/__tests__/Token.test.jsx +93 -0
  241. package/lib/__tests__/Tooltip.test.jsx +46 -0
  242. package/lib/__tests__/Truncate.test.jsx +41 -0
  243. package/lib/__tests__/UnderlineNav.test.jsx +53 -0
  244. package/lib/__tests__/UnderlineNavLink.test.jsx +31 -0
  245. package/lib/__tests__/behaviors/anchoredPosition.test.js +229 -376
  246. package/lib/__tests__/behaviors/focusTrap.test.jsx +184 -0
  247. package/lib/__tests__/behaviors/focusZone.test.jsx +406 -0
  248. package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +58 -0
  249. package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +145 -216
  250. package/lib/__tests__/filterObject.test.js +48 -27
  251. package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +29 -0
  252. package/lib/__tests__/hooks/useOnEscapePress.test.jsx +19 -0
  253. package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +63 -0
  254. package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +61 -0
  255. package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +56 -0
  256. package/lib/__tests__/theme.test.js +33 -34
  257. package/lib/__tests__/themeGet.test.js +12 -23
  258. package/lib/__tests__/useSafeTimeout.test.jsx +36 -0
  259. package/lib/__tests__/utils/createSlots.test.d.ts +1 -0
  260. package/lib/__tests__/utils/createSlots.test.js +75 -0
  261. package/lib/__tests__/utils/createSlots.test.jsx +57 -0
  262. package/lib/behaviors/anchoredPosition.js +205 -234
  263. package/lib/behaviors/focusTrap.js +121 -157
  264. package/lib/behaviors/focusZone.js +434 -509
  265. package/lib/behaviors/scrollIntoViewingArea.js +18 -35
  266. package/lib/constants.js +39 -43
  267. package/lib/drafts.d.ts +7 -0
  268. package/lib/drafts.js +20 -0
  269. package/lib/hooks/index.js +16 -60
  270. package/lib/hooks/useAnchoredPosition.js +32 -40
  271. package/lib/hooks/useCombinedRefs.js +32 -36
  272. package/lib/hooks/useDetails.jsx +39 -0
  273. package/lib/hooks/useDialog.js +72 -96
  274. package/lib/hooks/useFocusTrap.js +43 -60
  275. package/lib/hooks/useFocusZone.js +54 -50
  276. package/lib/hooks/useOnEscapePress.js +25 -36
  277. package/lib/hooks/useOnOutsideClick.jsx +61 -0
  278. package/lib/hooks/useOpenAndCloseFocus.js +22 -34
  279. package/lib/hooks/useOverlay.jsx +15 -0
  280. package/lib/hooks/useProvidedRefOrCreate.js +10 -14
  281. package/lib/hooks/useProvidedStateOrCreate.js +13 -16
  282. package/lib/hooks/useRenderForcingRef.js +13 -17
  283. package/lib/hooks/useResizeObserver.js +15 -18
  284. package/lib/hooks/useSafeTimeout.js +22 -30
  285. package/lib/hooks/useScrollFlash.js +16 -23
  286. package/lib/index.js +161 -636
  287. package/lib/polyfills/eventListenerSignal.js +37 -45
  288. package/lib/stories/ActionList2.stories.js +908 -0
  289. package/lib/stories/TextInput.stories.js +144 -0
  290. package/lib/sx.d.ts +2 -0
  291. package/lib/sx.js +10 -14
  292. package/lib/theme-preval.js +65 -2945
  293. package/lib/theme.js +3 -12
  294. package/lib/utils/create-slots.d.ts +17 -0
  295. package/lib/utils/create-slots.js +105 -0
  296. package/lib/utils/create-slots.jsx +65 -0
  297. package/lib/utils/deprecate.jsx +59 -0
  298. package/lib/utils/isNumeric.jsx +7 -0
  299. package/lib/utils/iterateFocusableElements.js +63 -85
  300. package/lib/utils/ssr.jsx +6 -0
  301. package/lib/utils/test-deprecations.jsx +20 -0
  302. package/lib/utils/test-helpers.jsx +8 -0
  303. package/lib/utils/test-matchers.jsx +100 -0
  304. package/lib/utils/testing.d.ts +14 -1
  305. package/lib/utils/testing.jsx +206 -0
  306. package/lib/utils/theme.js +33 -47
  307. package/lib/utils/types/AriaRole.js +2 -1
  308. package/lib/utils/types/ComponentProps.js +2 -1
  309. package/lib/utils/types/Flatten.js +2 -1
  310. package/lib/utils/types/KeyPaths.js +2 -1
  311. package/lib/utils/types/MandateProps.js +16 -1
  312. package/lib/utils/types/Merge.js +2 -1
  313. package/lib/utils/types/index.js +16 -69
  314. package/lib/utils/uniqueId.js +5 -8
  315. package/lib/utils/use-force-update.d.ts +1 -0
  316. package/lib/utils/use-force-update.js +13 -0
  317. package/lib/utils/useIsomorphicLayoutEffect.js +8 -11
  318. package/lib/utils/userAgent.js +8 -12
  319. package/lib-esm/ActionList2/Description.d.ts +12 -0
  320. package/lib-esm/ActionList2/Description.js +37 -0
  321. package/lib-esm/ActionList2/Divider.d.ts +5 -0
  322. package/lib-esm/ActionList2/Divider.js +23 -0
  323. package/lib-esm/ActionList2/Group.d.ts +11 -0
  324. package/lib-esm/ActionList2/Group.js +40 -0
  325. package/lib-esm/ActionList2/Header.d.ts +26 -0
  326. package/lib-esm/ActionList2/Header.js +44 -0
  327. package/lib-esm/ActionList2/Item.d.ts +63 -0
  328. package/lib-esm/ActionList2/Item.js +210 -0
  329. package/lib-esm/ActionList2/LinkItem.d.ts +17 -0
  330. package/lib-esm/ActionList2/LinkItem.js +43 -0
  331. package/lib-esm/ActionList2/List.d.ts +26 -0
  332. package/lib-esm/ActionList2/List.js +37 -0
  333. package/lib-esm/ActionList2/Selection.d.ts +5 -0
  334. package/lib-esm/ActionList2/Selection.js +52 -0
  335. package/lib-esm/ActionList2/Visuals.d.ts +9 -0
  336. package/lib-esm/ActionList2/Visuals.js +68 -0
  337. package/lib-esm/ActionList2/index.d.ts +36 -0
  338. package/lib-esm/ActionList2/index.js +33 -0
  339. package/lib-esm/Autocomplete/Autocomplete.d.ts +28 -28
  340. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +28 -28
  341. package/lib-esm/Button/Button.d.ts +25 -25
  342. package/lib-esm/Button/ButtonClose.d.ts +45 -45
  343. package/lib-esm/Button/ButtonDanger.d.ts +25 -25
  344. package/lib-esm/Button/ButtonInvisible.d.ts +25 -25
  345. package/lib-esm/Button/ButtonOutline.d.ts +25 -25
  346. package/lib-esm/Button/ButtonPrimary.d.ts +25 -25
  347. package/lib-esm/CircleOcticon.d.ts +42 -42
  348. package/lib-esm/Dialog.d.ts +45 -45
  349. package/lib-esm/Dropdown.d.ts +176 -176
  350. package/lib-esm/DropdownMenu/DropdownButton.d.ts +46 -46
  351. package/lib-esm/FilterList.d.ts +42 -42
  352. package/lib-esm/Position.d.ts +4 -4
  353. package/lib-esm/SelectMenu/SelectMenu.d.ts +246 -246
  354. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  355. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  356. package/lib-esm/StateLabel.d.ts +1 -1
  357. package/lib-esm/StateLabel.js +7 -2
  358. package/lib-esm/TextInputWithTokens.d.ts +28 -28
  359. package/lib-esm/Timeline.d.ts +43 -43
  360. package/lib-esm/Token/AvatarToken.d.ts +1 -1
  361. package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
  362. package/lib-esm/Token/Token.d.ts +1 -1
  363. package/lib-esm/_TextInputWrapper.js +2 -2
  364. package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
  365. package/lib-esm/__tests__/ActionList2.test.js +41 -0
  366. package/lib-esm/__tests__/utils/createSlots.test.d.ts +1 -0
  367. package/lib-esm/__tests__/utils/createSlots.test.js +67 -0
  368. package/lib-esm/drafts.d.ts +7 -0
  369. package/lib-esm/drafts.js +8 -0
  370. package/lib-esm/stories/ActionList2.stories.js +796 -0
  371. package/lib-esm/stories/TextInput.stories.js +117 -0
  372. package/lib-esm/sx.d.ts +2 -0
  373. package/lib-esm/sx.js +3 -1
  374. package/lib-esm/theme-preval.js +81 -2
  375. package/lib-esm/utils/create-slots.d.ts +17 -0
  376. package/lib-esm/utils/create-slots.js +84 -0
  377. package/lib-esm/utils/testing.d.ts +14 -1
  378. package/lib-esm/utils/use-force-update.d.ts +1 -0
  379. package/lib-esm/utils/use-force-update.js +6 -0
  380. package/package-lock.json +153 -14
  381. package/package.json +7 -4
  382. package/script/build +1 -1
  383. package/src/ActionList2/Description.tsx +49 -0
  384. package/src/ActionList2/Divider.tsx +24 -0
  385. package/src/ActionList2/Group.tsx +34 -0
  386. package/src/ActionList2/Header.tsx +58 -0
  387. package/src/ActionList2/Item.tsx +245 -0
  388. package/src/ActionList2/LinkItem.tsx +49 -0
  389. package/src/ActionList2/List.tsx +55 -0
  390. package/src/ActionList2/Selection.tsx +40 -0
  391. package/src/ActionList2/Visuals.tsx +76 -0
  392. package/src/ActionList2/index.ts +39 -0
  393. package/src/StateLabel.tsx +14 -2
  394. package/src/_TextInputWrapper.tsx +7 -0
  395. package/src/__tests__/ActionList2.test.tsx +47 -0
  396. package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
  397. package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +1 -0
  398. package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +1 -0
  399. package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +1 -0
  400. package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +1 -0
  401. package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +1 -0
  402. package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +4 -0
  403. package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -0
  404. package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +13 -6
  405. package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +1 -0
  406. package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +66 -0
  407. package/src/__tests__/__snapshots__/Token.test.tsx.snap +17 -0
  408. package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
  409. package/src/__tests__/utils/createSlots.test.tsx +74 -0
  410. package/src/drafts.ts +9 -0
  411. package/src/stories/ActionList2.stories.tsx +1291 -0
  412. package/src/stories/TextInput.stories.tsx +113 -0
  413. package/src/sx.ts +3 -0
  414. package/src/theme-preval.js +1 -0
  415. package/src/utils/create-slots.tsx +96 -0
  416. package/src/utils/use-force-update.ts +7 -0
  417. package/stats.html +1 -1
  418. package/tsconfig.base.json +20 -0
  419. package/tsconfig.build.json +2 -2
  420. package/tsconfig.json +4 -17
@@ -1,226 +1,155 @@
1
1
  "use strict";
2
-
3
- var _scrollIntoViewingArea = require("../../behaviors/scrollIntoViewingArea");
4
-
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const scrollIntoViewingArea_1 = require("../../behaviors/scrollIntoViewingArea");
5
4
  function scrollPositionFormula(positionData, isChildAboveViewingArea) {
6
- const {
7
- viewingAreaEdgePosition,
8
- childEdgePosition,
9
- margin
10
- } = positionData;
11
- const marginOffset = margin * (isChildAboveViewingArea ? -1 : 1);
12
- return childEdgePosition - viewingAreaEdgePosition + marginOffset;
13
- } // The DOMRect constructor isn't available in JSDOM, so we improvise here.
14
-
15
-
5
+ const { viewingAreaEdgePosition, childEdgePosition, margin } = positionData;
6
+ const marginOffset = margin * (isChildAboveViewingArea ? -1 : 1);
7
+ return childEdgePosition - viewingAreaEdgePosition + marginOffset;
8
+ }
9
+ // The DOMRect constructor isn't available in JSDOM, so we improvise here.
16
10
  function makeDOMRect(x, y, width, height) {
17
- return {
18
- x,
19
- y,
20
- width,
21
- height,
22
- top: y,
23
- left: x,
24
- right: x + width,
25
- bottom: y + height,
26
-
27
- toJSON() {
28
- return this;
29
- }
30
-
31
- };
32
- } // Since Jest/JSDOM doesn't support layout, we can stub out getBoundingClientRect if we know the
11
+ return {
12
+ x,
13
+ y,
14
+ width,
15
+ height,
16
+ top: y,
17
+ left: x,
18
+ right: x + width,
19
+ bottom: y + height,
20
+ toJSON() {
21
+ return this;
22
+ }
23
+ };
24
+ }
25
+ // Since Jest/JSDOM doesn't support layout, we can stub out getBoundingClientRect if we know the
33
26
  // correct dimensions. JSDOM will handle the rest of the DOM API used by getAnchoredPosition.
34
-
35
-
36
27
  function createVirtualDOM(viewingAreaRect, childRect) {
37
- const viewingArea = document.createElement('div');
38
- viewingArea.style.overflow = 'auto';
39
- viewingArea.id = 'viewingArea'; // eslint-disable-next-line github/unescaped-html-literal
40
-
41
- viewingArea.innerHTML = '<div id="child"></div>';
42
- const child = viewingArea.querySelector('#child');
43
-
44
- child.getBoundingClientRect = () => childRect;
45
-
46
- viewingArea.getBoundingClientRect = () => viewingAreaRect;
47
-
48
- return {
49
- viewingArea,
50
- child
51
- };
28
+ const viewingArea = document.createElement('div');
29
+ viewingArea.style.overflow = 'auto';
30
+ viewingArea.id = 'viewingArea';
31
+ // eslint-disable-next-line github/unescaped-html-literal
32
+ viewingArea.innerHTML = '<div id="child"></div>';
33
+ const child = viewingArea.querySelector('#child');
34
+ child.getBoundingClientRect = () => childRect;
35
+ viewingArea.getBoundingClientRect = () => viewingAreaRect;
36
+ return { viewingArea, child };
52
37
  }
53
-
54
38
  describe('scrollIntoViewingArea', () => {
55
- it('scrolls the expected amount when only the viewingArea element and child element are passed to the function', () => {
56
- const scrollToMock = jest.fn();
57
- Object.defineProperty(window.Element.prototype, 'scrollTo', {
58
- writable: true,
59
- value: scrollToMock
60
- });
61
- const childHeight = 50;
62
- const viewAreaHeight = 100;
63
- const childStart = viewAreaHeight + 10;
64
- const expectedScrollPosition = scrollPositionFormula({
65
- viewingAreaEdgePosition: viewAreaHeight,
66
- childEdgePosition: childStart + childHeight,
67
- margin: 8
68
- }, false);
69
- const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaHeight);
70
- const childRect = makeDOMRect(0, childStart, 100, childHeight);
71
- const {
72
- viewingArea,
73
- child
74
- } = createVirtualDOM(viewingAreaRect, childRect);
75
-
76
- viewingArea.getBoundingClientRect = () => viewingAreaRect;
77
-
78
- viewingArea.scrollTop = 0;
79
-
80
- child.getBoundingClientRect = () => childRect;
81
-
82
- (0, _scrollIntoViewingArea.scrollIntoViewingArea)(child, viewingArea);
83
- expect(scrollToMock).toHaveBeenCalledWith({
84
- behavior: 'smooth',
85
- top: expectedScrollPosition
86
- });
87
- });
88
- describe('y-axis', () => {
89
- it('scrolls the child into the viewing area when it is AFTER the overflow cutoff point', () => {
90
- const scrollToMock = jest.fn();
91
- Object.defineProperty(window.Element.prototype, 'scrollTo', {
92
- writable: true,
93
- value: scrollToMock
94
- });
95
- const childHeight = 50;
96
- const viewAreaHeight = 100;
97
- const childStart = viewAreaHeight + 10;
98
- const scrollMargin = 10;
99
- const expectedScrollPosition = scrollPositionFormula({
100
- viewingAreaEdgePosition: viewAreaHeight,
101
- childEdgePosition: childStart + childHeight,
102
- margin: scrollMargin
103
- }, false);
104
- const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaHeight);
105
- const childRect = makeDOMRect(0, childStart, 100, childHeight);
106
- const {
107
- viewingArea,
108
- child
109
- } = createVirtualDOM(viewingAreaRect, childRect);
110
-
111
- viewingArea.getBoundingClientRect = () => viewingAreaRect;
112
-
113
- viewingArea.scrollTop = 0;
114
-
115
- child.getBoundingClientRect = () => childRect;
116
-
117
- (0, _scrollIntoViewingArea.scrollIntoViewingArea)(child, viewingArea, 'vertical', scrollMargin, scrollMargin, 'auto');
118
- expect(scrollToMock).toHaveBeenCalledWith({
119
- behavior: 'auto',
120
- top: expectedScrollPosition
121
- });
122
- });
123
- it('scrolls the child into the viewing area when it is BEFORE the overflow cutoff point', () => {
124
- const scrollToMock = jest.fn();
125
- Object.defineProperty(window.Element.prototype, 'scrollTo', {
126
- writable: true,
127
- value: scrollToMock
128
- });
129
- const childHeight = 50;
130
- const childStart = childHeight * -1 - 10;
131
- const scrollMargin = 10;
132
- const expectedScrollPosition = scrollPositionFormula({
133
- viewingAreaEdgePosition: 0,
134
- childEdgePosition: childStart,
135
- margin: scrollMargin
136
- }, true);
137
- const viewingAreaRect = makeDOMRect(0, 0, 100, 100);
138
- const childRect = makeDOMRect(0, childStart, 100, childHeight);
139
- const {
140
- viewingArea,
141
- child
142
- } = createVirtualDOM(viewingAreaRect, childRect);
143
-
144
- viewingArea.getBoundingClientRect = () => viewingAreaRect;
145
-
146
- viewingArea.scrollTop = 0;
147
-
148
- child.getBoundingClientRect = () => childRect;
149
-
150
- (0, _scrollIntoViewingArea.scrollIntoViewingArea)(child, viewingArea, 'vertical', scrollMargin, scrollMargin, 'auto');
151
- expect(scrollToMock).toHaveBeenCalledWith({
152
- behavior: 'auto',
153
- top: expectedScrollPosition
154
- });
39
+ it('scrolls the expected amount when only the viewingArea element and child element are passed to the function', () => {
40
+ const scrollToMock = jest.fn();
41
+ Object.defineProperty(window.Element.prototype, 'scrollTo', {
42
+ writable: true,
43
+ value: scrollToMock
44
+ });
45
+ const childHeight = 50;
46
+ const viewAreaHeight = 100;
47
+ const childStart = viewAreaHeight + 10;
48
+ const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: viewAreaHeight, childEdgePosition: childStart + childHeight, margin: 8 }, false);
49
+ const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaHeight);
50
+ const childRect = makeDOMRect(0, childStart, 100, childHeight);
51
+ const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
52
+ viewingArea.getBoundingClientRect = () => viewingAreaRect;
53
+ viewingArea.scrollTop = 0;
54
+ child.getBoundingClientRect = () => childRect;
55
+ scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea);
56
+ expect(scrollToMock).toHaveBeenCalledWith({
57
+ behavior: 'smooth',
58
+ top: expectedScrollPosition
59
+ });
155
60
  });
156
- });
157
- describe('x-axis', () => {
158
- it('scrolls the child into the viewing area when it is AFTER the overflow cutoff point', () => {
159
- const scrollToMock = jest.fn();
160
- Object.defineProperty(window.Element.prototype, 'scrollTo', {
161
- writable: true,
162
- value: scrollToMock
163
- });
164
- const childWidth = 50;
165
- const viewAreaWidth = 100;
166
- const childStart = viewAreaWidth + 10;
167
- const scrollMargin = 10;
168
- const expectedScrollPosition = scrollPositionFormula({
169
- viewingAreaEdgePosition: viewAreaWidth,
170
- childEdgePosition: childStart + childWidth,
171
- margin: scrollMargin
172
- }, false);
173
- const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaWidth);
174
- const childRect = makeDOMRect(childStart, 0, childWidth, 100);
175
- const {
176
- viewingArea,
177
- child
178
- } = createVirtualDOM(viewingAreaRect, childRect);
179
-
180
- viewingArea.getBoundingClientRect = () => viewingAreaRect;
181
-
182
- viewingArea.scrollLeft = 0;
183
-
184
- child.getBoundingClientRect = () => childRect;
185
-
186
- (0, _scrollIntoViewingArea.scrollIntoViewingArea)(child, viewingArea, 'horizontal', scrollMargin, scrollMargin, 'auto');
187
- expect(scrollToMock).toHaveBeenCalledWith({
188
- behavior: 'auto',
189
- left: expectedScrollPosition
190
- });
61
+ describe('y-axis', () => {
62
+ it('scrolls the child into the viewing area when it is AFTER the overflow cutoff point', () => {
63
+ const scrollToMock = jest.fn();
64
+ Object.defineProperty(window.Element.prototype, 'scrollTo', {
65
+ writable: true,
66
+ value: scrollToMock
67
+ });
68
+ const childHeight = 50;
69
+ const viewAreaHeight = 100;
70
+ const childStart = viewAreaHeight + 10;
71
+ const scrollMargin = 10;
72
+ const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: viewAreaHeight, childEdgePosition: childStart + childHeight, margin: scrollMargin }, false);
73
+ const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaHeight);
74
+ const childRect = makeDOMRect(0, childStart, 100, childHeight);
75
+ const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
76
+ viewingArea.getBoundingClientRect = () => viewingAreaRect;
77
+ viewingArea.scrollTop = 0;
78
+ child.getBoundingClientRect = () => childRect;
79
+ scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea, 'vertical', scrollMargin, scrollMargin, 'auto');
80
+ expect(scrollToMock).toHaveBeenCalledWith({
81
+ behavior: 'auto',
82
+ top: expectedScrollPosition
83
+ });
84
+ });
85
+ it('scrolls the child into the viewing area when it is BEFORE the overflow cutoff point', () => {
86
+ const scrollToMock = jest.fn();
87
+ Object.defineProperty(window.Element.prototype, 'scrollTo', {
88
+ writable: true,
89
+ value: scrollToMock
90
+ });
91
+ const childHeight = 50;
92
+ const childStart = childHeight * -1 - 10;
93
+ const scrollMargin = 10;
94
+ const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: 0, childEdgePosition: childStart, margin: scrollMargin }, true);
95
+ const viewingAreaRect = makeDOMRect(0, 0, 100, 100);
96
+ const childRect = makeDOMRect(0, childStart, 100, childHeight);
97
+ const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
98
+ viewingArea.getBoundingClientRect = () => viewingAreaRect;
99
+ viewingArea.scrollTop = 0;
100
+ child.getBoundingClientRect = () => childRect;
101
+ scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea, 'vertical', scrollMargin, scrollMargin, 'auto');
102
+ expect(scrollToMock).toHaveBeenCalledWith({
103
+ behavior: 'auto',
104
+ top: expectedScrollPosition
105
+ });
106
+ });
191
107
  });
192
- it('scrolls the child into the viewing area when it is BEFORE the overflow cutoff point', () => {
193
- const scrollToMock = jest.fn();
194
- Object.defineProperty(window.Element.prototype, 'scrollTo', {
195
- writable: true,
196
- value: scrollToMock
197
- });
198
- const childWidth = 50;
199
- const childStart = childWidth * -1 - 10;
200
- const scrollMargin = 10;
201
- const expectedScrollPosition = scrollPositionFormula({
202
- viewingAreaEdgePosition: 0,
203
- childEdgePosition: childStart,
204
- margin: scrollMargin
205
- }, true);
206
- const viewingAreaRect = makeDOMRect(0, 0, 100, 100);
207
- const childRect = makeDOMRect(childStart, 0, childWidth, 100);
208
- const {
209
- viewingArea,
210
- child
211
- } = createVirtualDOM(viewingAreaRect, childRect);
212
-
213
- viewingArea.getBoundingClientRect = () => viewingAreaRect;
214
-
215
- viewingArea.scrollTop = 0;
216
-
217
- child.getBoundingClientRect = () => childRect;
218
-
219
- (0, _scrollIntoViewingArea.scrollIntoViewingArea)(child, viewingArea, 'horizontal', scrollMargin, scrollMargin, 'auto');
220
- expect(scrollToMock).toHaveBeenCalledWith({
221
- behavior: 'auto',
222
- left: expectedScrollPosition
223
- });
108
+ describe('x-axis', () => {
109
+ it('scrolls the child into the viewing area when it is AFTER the overflow cutoff point', () => {
110
+ const scrollToMock = jest.fn();
111
+ Object.defineProperty(window.Element.prototype, 'scrollTo', {
112
+ writable: true,
113
+ value: scrollToMock
114
+ });
115
+ const childWidth = 50;
116
+ const viewAreaWidth = 100;
117
+ const childStart = viewAreaWidth + 10;
118
+ const scrollMargin = 10;
119
+ const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: viewAreaWidth, childEdgePosition: childStart + childWidth, margin: scrollMargin }, false);
120
+ const viewingAreaRect = makeDOMRect(0, 0, 100, viewAreaWidth);
121
+ const childRect = makeDOMRect(childStart, 0, childWidth, 100);
122
+ const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
123
+ viewingArea.getBoundingClientRect = () => viewingAreaRect;
124
+ viewingArea.scrollLeft = 0;
125
+ child.getBoundingClientRect = () => childRect;
126
+ scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea, 'horizontal', scrollMargin, scrollMargin, 'auto');
127
+ expect(scrollToMock).toHaveBeenCalledWith({
128
+ behavior: 'auto',
129
+ left: expectedScrollPosition
130
+ });
131
+ });
132
+ it('scrolls the child into the viewing area when it is BEFORE the overflow cutoff point', () => {
133
+ const scrollToMock = jest.fn();
134
+ Object.defineProperty(window.Element.prototype, 'scrollTo', {
135
+ writable: true,
136
+ value: scrollToMock
137
+ });
138
+ const childWidth = 50;
139
+ const childStart = childWidth * -1 - 10;
140
+ const scrollMargin = 10;
141
+ const expectedScrollPosition = scrollPositionFormula({ viewingAreaEdgePosition: 0, childEdgePosition: childStart, margin: scrollMargin }, true);
142
+ const viewingAreaRect = makeDOMRect(0, 0, 100, 100);
143
+ const childRect = makeDOMRect(childStart, 0, childWidth, 100);
144
+ const { viewingArea, child } = createVirtualDOM(viewingAreaRect, childRect);
145
+ viewingArea.getBoundingClientRect = () => viewingAreaRect;
146
+ viewingArea.scrollTop = 0;
147
+ child.getBoundingClientRect = () => childRect;
148
+ scrollIntoViewingArea_1.scrollIntoViewingArea(child, viewingArea, 'horizontal', scrollMargin, scrollMargin, 'auto');
149
+ expect(scrollToMock).toHaveBeenCalledWith({
150
+ behavior: 'auto',
151
+ left: expectedScrollPosition
152
+ });
153
+ });
224
154
  });
225
- });
226
- });
155
+ });
@@ -1,30 +1,51 @@
1
1
  "use strict";
2
-
3
- var _theme = require("../utils/theme");
4
-
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const theme_1 = require("../utils/theme");
5
4
  describe('filterObject', () => {
6
- const colors = {
7
- scale: {
8
- gray: ['#fafbfc', '#f6f8fa', '#e1e4e8', '#d1d5da', '#959da5', '#6a737d', '#586069', '#444d56', '#2f363d', '#24292e']
9
- },
10
- btn: {
11
- shadow: '0 1px 0 rgba(27,31,35,0.04)'
12
- }
13
- };
14
- it('filters out shadow values', () => {
15
- const expected = {
16
- scale: {
17
- gray: ['#fafbfc', '#f6f8fa', '#e1e4e8', '#d1d5da', '#959da5', '#6a737d', '#586069', '#444d56', '#2f363d', '#24292e']
18
- }
5
+ const colors = {
6
+ scale: {
7
+ gray: [
8
+ '#fafbfc',
9
+ '#f6f8fa',
10
+ '#e1e4e8',
11
+ '#d1d5da',
12
+ '#959da5',
13
+ '#6a737d',
14
+ '#586069',
15
+ '#444d56',
16
+ '#2f363d',
17
+ '#24292e'
18
+ ]
19
+ },
20
+ btn: {
21
+ shadow: '0 1px 0 rgba(27,31,35,0.04)'
22
+ }
19
23
  };
20
- expect((0, _theme.filterObject)(colors, value => (0, _theme.isColorValue)(value))).toEqual(expected);
21
- });
22
- it('filters out color values', () => {
23
- const expected = {
24
- btn: {
25
- shadow: '0 1px 0 rgba(27,31,35,0.04)'
26
- }
27
- };
28
- expect((0, _theme.filterObject)(colors, value => (0, _theme.isShadowValue)(value))).toEqual(expected);
29
- });
30
- });
24
+ it('filters out shadow values', () => {
25
+ const expected = {
26
+ scale: {
27
+ gray: [
28
+ '#fafbfc',
29
+ '#f6f8fa',
30
+ '#e1e4e8',
31
+ '#d1d5da',
32
+ '#959da5',
33
+ '#6a737d',
34
+ '#586069',
35
+ '#444d56',
36
+ '#2f363d',
37
+ '#24292e'
38
+ ]
39
+ }
40
+ };
41
+ expect(theme_1.filterObject(colors, (value) => theme_1.isColorValue(value))).toEqual(expected);
42
+ });
43
+ it('filters out color values', () => {
44
+ const expected = {
45
+ btn: {
46
+ shadow: '0 1px 0 rgba(27,31,35,0.04)'
47
+ }
48
+ };
49
+ expect(theme_1.filterObject(colors, (value) => theme_1.isShadowValue(value))).toEqual(expected);
50
+ });
51
+ });
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const useAnchoredPosition_1 = require("../../hooks/useAnchoredPosition");
8
+ const react_2 = require("@testing-library/react");
9
+ const Component = ({ callback }) => {
10
+ const floatingElementRef = react_1.default.useRef(null);
11
+ const anchorElementRef = react_1.default.useRef(null);
12
+ callback(useAnchoredPosition_1.useAnchoredPosition({ floatingElementRef, anchorElementRef }));
13
+ return (<div style={{ position: 'absolute' }}>
14
+ <div style={{ position: 'absolute', top: '20px', left: '20px', height: '50px', width: '50px' }} ref={floatingElementRef}/>
15
+ <div ref={anchorElementRef}/>
16
+ </div>);
17
+ };
18
+ it('should should return a position', () => {
19
+ const cb = jest.fn();
20
+ react_2.render(<Component callback={cb}/>);
21
+ expect(cb).toHaveBeenCalledTimes(2);
22
+ expect(cb.mock.calls[1][0]['position']).toMatchInlineSnapshot(`
23
+ Object {
24
+ "anchorSide": "outside-bottom",
25
+ "left": 0,
26
+ "top": 4,
27
+ }
28
+ `);
29
+ });
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const useOnEscapePress_1 = require("../../hooks/useOnEscapePress");
7
+ const react_1 = require("@testing-library/react");
8
+ const react_2 = __importDefault(require("react"));
9
+ it('should call function when user presses escape', () => {
10
+ const functionToCall = jest.fn();
11
+ const Component = () => {
12
+ useOnEscapePress_1.useOnEscapePress(functionToCall);
13
+ return <div>content</div>;
14
+ };
15
+ const { getByText } = react_1.render(<Component />);
16
+ const domNode = getByText('content');
17
+ react_1.fireEvent.keyDown(domNode, { key: 'Escape', code: 'Escape', keyCode: 27, charCode: 27 });
18
+ expect(functionToCall).toHaveBeenCalledTimes(1);
19
+ });
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ const useOnOutsideClick_1 = require("../../hooks/useOnOutsideClick");
26
+ const react_1 = require("@testing-library/react");
27
+ const react_2 = __importStar(require("react"));
28
+ const user_event_1 = __importDefault(require("@testing-library/user-event"));
29
+ const Component = ({ callback }) => {
30
+ const containerRef = react_2.useRef(null);
31
+ const outerButton = react_2.useRef(null);
32
+ const secondButton = react_2.useRef(null);
33
+ useOnOutsideClick_1.useOnOutsideClick({ ignoreClickRefs: [secondButton], containerRef, onClickOutside: callback });
34
+ return (<div>
35
+ <button ref={outerButton}>button</button>
36
+ <button ref={secondButton}>button two</button>
37
+ <div ref={containerRef}>content</div>
38
+ </div>);
39
+ };
40
+ it('should call function when user clicks outside container', () => {
41
+ const mockFunction = jest.fn();
42
+ const { getByText } = react_1.render(<Component callback={mockFunction}/>);
43
+ user_event_1.default.click(getByText('button'));
44
+ expect(mockFunction).toHaveBeenCalledTimes(1);
45
+ });
46
+ it('should not call function when user right clicks', () => {
47
+ const mockFunction = jest.fn();
48
+ const { getByText } = react_1.render(<Component callback={mockFunction}/>);
49
+ user_event_1.default.click(getByText('button'), { button: 1 });
50
+ expect(mockFunction).toHaveBeenCalledTimes(0);
51
+ });
52
+ it('should not call function when clicking on ignored refs', () => {
53
+ const mockFunction = jest.fn();
54
+ const { getByText } = react_1.render(<Component callback={mockFunction}/>);
55
+ user_event_1.default.click(getByText('button two'));
56
+ expect(mockFunction).toHaveBeenCalledTimes(0);
57
+ });
58
+ it('should not call function when clicking inside container', () => {
59
+ const mockFunction = jest.fn();
60
+ const { getByText } = react_1.render(<Component callback={mockFunction}/>);
61
+ user_event_1.default.click(getByText('content'));
62
+ expect(mockFunction).toHaveBeenCalledTimes(0);
63
+ });
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ const react_1 = __importStar(require("react"));
23
+ const react_2 = require("@testing-library/react");
24
+ const useOpenAndCloseFocus_1 = require("../../hooks/useOpenAndCloseFocus");
25
+ const Component = () => {
26
+ const containerRef = react_1.useRef(null);
27
+ const returnFocusRef = react_1.useRef(null);
28
+ const noButtonRef = react_1.useRef(null);
29
+ useOpenAndCloseFocus_1.useOpenAndCloseFocus({ containerRef, initialFocusRef: noButtonRef, returnFocusRef });
30
+ return (<>
31
+ <button ref={returnFocusRef}>trigger</button>
32
+ <div ref={containerRef}>
33
+ <button>yes</button>
34
+ <button ref={noButtonRef}>no</button>
35
+ </div>
36
+ </>);
37
+ };
38
+ const ComponentTwo = () => {
39
+ const buttonRef = react_1.useRef(null);
40
+ const containerRef = react_1.useRef(null);
41
+ useOpenAndCloseFocus_1.useOpenAndCloseFocus({ containerRef, returnFocusRef: buttonRef });
42
+ return (<>
43
+ <button ref={buttonRef}>button trigger</button>
44
+ <div ref={containerRef}>
45
+ <button>yes</button>
46
+ <button>no</button>
47
+ </div>
48
+ </>);
49
+ };
50
+ it('should focus element passed into function', async () => {
51
+ const { getByText } = react_2.render(<Component />);
52
+ await react_2.waitFor(() => getByText('no'));
53
+ const noButton = getByText('no');
54
+ expect(document.activeElement).toEqual(noButton);
55
+ });
56
+ it('should focus first element when nothing is passed', async () => {
57
+ const { getByText } = react_2.render(<ComponentTwo />);
58
+ await react_2.waitFor(() => getByText('yes'));
59
+ const yesButton = getByText('yes');
60
+ expect(document.activeElement).toEqual(yesButton);
61
+ });