@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
@@ -0,0 +1,120 @@
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 styled_components_1 = __importStar(require("styled-components"));
26
+ const styled_system_1 = require("styled-system");
27
+ const constants_1 = require("./constants");
28
+ const sx_1 = __importDefault(require("./sx"));
29
+ const sizeVariants = styled_system_1.variant({
30
+ variants: {
31
+ small: {
32
+ minHeight: '28px',
33
+ px: 2,
34
+ py: '3px',
35
+ fontSize: 0,
36
+ lineHeight: '20px'
37
+ },
38
+ large: {
39
+ px: 2,
40
+ py: '10px',
41
+ fontSize: 3
42
+ }
43
+ }
44
+ });
45
+ const TextInputWrapper = styled_components_1.default.span `
46
+ display: inline-flex;
47
+ align-items: stretch;
48
+ min-height: 34px;
49
+ font-size: ${constants_1.get('fontSizes.1')};
50
+ line-height: 20px;
51
+ color: ${constants_1.get('colors.fg.default')};
52
+ vertical-align: middle;
53
+ background-repeat: no-repeat; // Repeat and position set for form states (success, error, etc)
54
+ background-position: right 8px center; // For form validation. This keeps images 8px from right and centered vertically.
55
+ border: 1px solid ${constants_1.get('colors.border.default')};
56
+ border-radius: ${constants_1.get('radii.2')};
57
+ outline: none;
58
+ box-shadow: ${constants_1.get('shadows.primer.shadow.inset')};
59
+ cursor: text;
60
+
61
+ ${props => {
62
+ if (props.hasIcon) {
63
+ return styled_components_1.css `
64
+ padding: 0;
65
+ `;
66
+ }
67
+ else {
68
+ return styled_components_1.css `
69
+ padding: 6px 12px;
70
+ `;
71
+ }
72
+ }}
73
+
74
+ .TextInput-icon {
75
+ align-self: center;
76
+ color: ${constants_1.get('colors.fg.muted')};
77
+ margin: 0 ${constants_1.get('space.2')};
78
+ flex-shrink: 0;
79
+ }
80
+
81
+ &:focus-within {
82
+ border-color: ${constants_1.get('colors.accent.emphasis')};
83
+ box-shadow: ${constants_1.get('shadows.primer.shadow.focus')};
84
+ }
85
+
86
+ ${props => props.contrast &&
87
+ styled_components_1.css `
88
+ background-color: ${constants_1.get('colors.canvas.inset')};
89
+ `}
90
+
91
+ ${props => props.disabled &&
92
+ styled_components_1.css `
93
+ color: ${constants_1.get('colors.primer.fg.disabled')};
94
+ background-color: ${constants_1.get('colors.input.disabledBg')};
95
+ border-color: ${constants_1.get('colors.border.default')};
96
+ `}
97
+
98
+ ${props => props.block &&
99
+ styled_components_1.css `
100
+ display: block;
101
+ width: 100%;
102
+ `}
103
+
104
+ ${props => props.block &&
105
+ props.hasIcon &&
106
+ styled_components_1.css `
107
+ display: flex;
108
+ `}
109
+
110
+ // Ensures inputs don't zoom on mobile but are body-font size on desktop
111
+ @media (min-width: ${constants_1.get('breakpoints.1')}) {
112
+ font-size: ${constants_1.get('fontSizes.1')};
113
+ }
114
+ ${styled_system_1.width}
115
+ ${styled_system_1.minWidth}
116
+ ${styled_system_1.maxWidth}
117
+ ${sizeVariants}
118
+ ${sx_1.default};
119
+ `;
120
+ exports.default = TextInputWrapper;
@@ -0,0 +1,22 @@
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 styled_components_1 = __importDefault(require("styled-components"));
7
+ const sx_1 = __importDefault(require("./sx"));
8
+ const UnstyledTextInput = styled_components_1.default.input `
9
+ border: 0;
10
+ font-size: inherit;
11
+ font-family: inherit;
12
+ background-color: transparent;
13
+ -webkit-appearance: none;
14
+ color: inherit;
15
+ width: 100%;
16
+ &:focus {
17
+ outline: 0;
18
+ }
19
+
20
+ ${sx_1.default};
21
+ `;
22
+ exports.default = UnstyledTextInput;
@@ -0,0 +1,49 @@
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 = require("@testing-library/react");
7
+ require("babel-polyfill");
8
+ const jest_axe_1 = require("jest-axe");
9
+ const react_2 = __importDefault(require("react"));
10
+ const theme_1 = __importDefault(require("../theme"));
11
+ const ActionList_1 = require("../ActionList");
12
+ const testing_1 = require("../utils/testing");
13
+ const __1 = require("..");
14
+ expect.extend(jest_axe_1.toHaveNoViolations);
15
+ function SimpleActionList() {
16
+ return (<__1.ThemeProvider theme={theme_1.default}>
17
+ <__1.BaseStyles>
18
+ <ActionList_1.ActionList items={[
19
+ { text: 'New file' },
20
+ ActionList_1.ActionList.Divider,
21
+ { text: 'Copy link' },
22
+ { text: 'Edit file' },
23
+ { text: 'Delete file', variant: 'danger' }
24
+ ]}/>
25
+ </__1.BaseStyles>
26
+ </__1.ThemeProvider>);
27
+ }
28
+ describe('ActionList', () => {
29
+ testing_1.behavesAsComponent({
30
+ Component: ActionList_1.ActionList,
31
+ options: { skipAs: true, skipSx: true },
32
+ toRender: () => <ActionList_1.ActionList items={[]}/>
33
+ });
34
+ testing_1.checkExports('ActionList', {
35
+ default: undefined,
36
+ ActionList: ActionList_1.ActionList
37
+ });
38
+ it('should have no axe violations', async () => {
39
+ const { container } = react_1.render(<SimpleActionList />);
40
+ const results = await jest_axe_1.axe(container);
41
+ expect(results).toHaveNoViolations();
42
+ react_1.cleanup();
43
+ });
44
+ });
45
+ describe('ActionList.Item', () => {
46
+ testing_1.behavesAsComponent({
47
+ Component: ActionList_1.ActionList.Item
48
+ });
49
+ });
@@ -0,0 +1,45 @@
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
+ exports.cannotUseAsWithoutRenderProp = exports.cannotUseAnchorDOMProps = exports.canUseDivDOMProps = exports.listWithSingleItem = exports.emptyList = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const __1 = require("..");
9
+ function emptyList() {
10
+ return <__1.ActionList items={[]}/>;
11
+ }
12
+ exports.emptyList = emptyList;
13
+ function listWithSingleItem() {
14
+ return <__1.ActionList items={[{ text: 'One' }]}/>;
15
+ }
16
+ exports.listWithSingleItem = listWithSingleItem;
17
+ function canUseDivDOMProps() {
18
+ return (<__1.ActionList items={[
19
+ {
20
+ text: 'One',
21
+ onMouseDown: () => undefined
22
+ }
23
+ ]}/>);
24
+ }
25
+ exports.canUseDivDOMProps = canUseDivDOMProps;
26
+ function cannotUseAnchorDOMProps() {
27
+ return (<__1.ActionList items={[
28
+ {
29
+ text: 'One',
30
+ // @ts-expect-error href is not a div DOM prop
31
+ href: '#'
32
+ }
33
+ ]}/>);
34
+ }
35
+ exports.cannotUseAnchorDOMProps = cannotUseAnchorDOMProps;
36
+ function cannotUseAsWithoutRenderProp() {
37
+ return (<__1.ActionList items={[
38
+ {
39
+ text: 'One',
40
+ // @ts-expect-error as is only available via manual rendering of items
41
+ as: 'a'
42
+ }
43
+ ]}/>);
44
+ }
45
+ exports.cannotUseAsWithoutRenderProp = cannotUseAsWithoutRenderProp;
@@ -0,0 +1 @@
1
+ import 'babel-polyfill';
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var _react = require("@testing-library/react");
4
+
5
+ require("babel-polyfill");
6
+
7
+ var _jestAxe = require("jest-axe");
8
+
9
+ var _react2 = _interopRequireDefault(require("react"));
10
+
11
+ var _theme = _interopRequireDefault(require("../theme"));
12
+
13
+ var _ActionList = require("../ActionList2");
14
+
15
+ var _testing = require("../utils/testing");
16
+
17
+ var _ = require("..");
18
+
19
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
+
21
+ expect.extend(_jestAxe.toHaveNoViolations);
22
+
23
+ function SimpleActionList() {
24
+ return /*#__PURE__*/_react2.default.createElement(_.ThemeProvider, {
25
+ theme: _theme.default
26
+ }, /*#__PURE__*/_react2.default.createElement(_.SSRProvider, null, /*#__PURE__*/_react2.default.createElement(_.BaseStyles, null, /*#__PURE__*/_react2.default.createElement(_ActionList.ActionList, null, /*#__PURE__*/_react2.default.createElement(_ActionList.ActionList.Item, null, "New file"), /*#__PURE__*/_react2.default.createElement(_ActionList.ActionList.Divider, null), /*#__PURE__*/_react2.default.createElement(_ActionList.ActionList.Item, null, "Copy link"), /*#__PURE__*/_react2.default.createElement(_ActionList.ActionList.Item, null, "Edit file"), /*#__PURE__*/_react2.default.createElement(_ActionList.ActionList.Item, {
27
+ variant: "danger"
28
+ }, "Delete file")))));
29
+ }
30
+
31
+ SimpleActionList.displayName = "SimpleActionList";
32
+ describe('ActionList', () => {
33
+ (0, _testing.behavesAsComponent)({
34
+ Component: _ActionList.ActionList,
35
+ options: {
36
+ skipAs: true,
37
+ skipSx: true
38
+ },
39
+ toRender: () => /*#__PURE__*/_react2.default.createElement(_ActionList.ActionList, null)
40
+ });
41
+ (0, _testing.checkExports)('ActionList2', {
42
+ default: undefined,
43
+ ActionList: _ActionList.ActionList
44
+ });
45
+ it('should have no axe violations', async () => {
46
+ const {
47
+ container
48
+ } = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(SimpleActionList, null));
49
+ const results = await (0, _jestAxe.axe)(container);
50
+ expect(results).toHaveNoViolations();
51
+ (0, _react.cleanup)();
52
+ });
53
+ });
@@ -0,0 +1,46 @@
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 = require("@testing-library/react");
7
+ require("babel-polyfill");
8
+ const jest_axe_1 = require("jest-axe");
9
+ const react_2 = __importDefault(require("react"));
10
+ const theme_1 = __importDefault(require("../theme"));
11
+ const ActionList2_1 = require("../ActionList2");
12
+ const testing_1 = require("../utils/testing");
13
+ const __1 = require("..");
14
+ expect.extend(jest_axe_1.toHaveNoViolations);
15
+ function SimpleActionList() {
16
+ return (<__1.ThemeProvider theme={theme_1.default}>
17
+ <__1.SSRProvider>
18
+ <__1.BaseStyles>
19
+ <ActionList2_1.ActionList>
20
+ <ActionList2_1.ActionList.Item>New file</ActionList2_1.ActionList.Item>
21
+ <ActionList2_1.ActionList.Divider />
22
+ <ActionList2_1.ActionList.Item>Copy link</ActionList2_1.ActionList.Item>
23
+ <ActionList2_1.ActionList.Item>Edit file</ActionList2_1.ActionList.Item>
24
+ <ActionList2_1.ActionList.Item variant="danger">Delete file</ActionList2_1.ActionList.Item>
25
+ </ActionList2_1.ActionList>
26
+ </__1.BaseStyles>
27
+ </__1.SSRProvider>
28
+ </__1.ThemeProvider>);
29
+ }
30
+ describe('ActionList', () => {
31
+ testing_1.behavesAsComponent({
32
+ Component: ActionList2_1.ActionList,
33
+ options: { skipAs: true, skipSx: true },
34
+ toRender: () => <ActionList2_1.ActionList />
35
+ });
36
+ testing_1.checkExports('ActionList2', {
37
+ default: undefined,
38
+ ActionList: ActionList2_1.ActionList
39
+ });
40
+ it('should have no axe violations', async () => {
41
+ const { container } = react_1.render(<SimpleActionList />);
42
+ const results = await jest_axe_1.axe(container);
43
+ expect(results).toHaveNoViolations();
44
+ react_1.cleanup();
45
+ });
46
+ });
@@ -0,0 +1,124 @@
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 = require("@testing-library/react");
7
+ require("babel-polyfill");
8
+ const jest_axe_1 = require("jest-axe");
9
+ const react_2 = __importDefault(require("react"));
10
+ const theme_1 = __importDefault(require("../theme"));
11
+ const ActionMenu_1 = require("../ActionMenu");
12
+ const testing_1 = require("../utils/testing");
13
+ const __1 = require("..");
14
+ expect.extend(jest_axe_1.toHaveNoViolations);
15
+ const items = [
16
+ { text: 'New file' },
17
+ { text: 'Copy link' },
18
+ { text: 'Edit file' },
19
+ { text: 'Delete file', variant: 'danger' }
20
+ ];
21
+ const mockOnActivate = jest.fn();
22
+ function SimpleActionMenu() {
23
+ return (<__1.ThemeProvider theme={theme_1.default}>
24
+ <__1.SSRProvider>
25
+ <__1.BaseStyles>
26
+ <div id="something-else">X</div>
27
+ <ActionMenu_1.ActionMenu onAction={mockOnActivate} anchorContent="Menu" items={items}/>
28
+ <div id="portal-root"></div>
29
+ </__1.BaseStyles>
30
+ </__1.SSRProvider>
31
+ </__1.ThemeProvider>);
32
+ }
33
+ describe('ActionMenu', () => {
34
+ afterEach(() => {
35
+ jest.clearAllMocks();
36
+ });
37
+ testing_1.behavesAsComponent({
38
+ Component: ActionMenu_1.ActionMenu,
39
+ options: { skipAs: true, skipSx: true },
40
+ toRender: () => (<__1.SSRProvider>
41
+ <ActionMenu_1.ActionMenu items={[]}/>
42
+ </__1.SSRProvider>)
43
+ });
44
+ testing_1.checkExports('ActionMenu', {
45
+ default: undefined,
46
+ ActionMenu: ActionMenu_1.ActionMenu
47
+ });
48
+ it('should have no axe violations', async () => {
49
+ const { container } = react_1.render(<SimpleActionMenu />);
50
+ const results = await jest_axe_1.axe(container);
51
+ expect(results).toHaveNoViolations();
52
+ react_1.cleanup();
53
+ });
54
+ it('should trigger the overlay on trigger click', async () => {
55
+ const menu = react_1.render(<SimpleActionMenu />);
56
+ let portalRoot = menu.baseElement.querySelector('#__primerPortalRoot__');
57
+ expect(portalRoot).toBeNull();
58
+ const anchor = await menu.findByText('Menu');
59
+ react_1.act(() => {
60
+ react_1.fireEvent.click(anchor);
61
+ });
62
+ portalRoot = menu.baseElement.querySelector('#__primerPortalRoot__');
63
+ expect(portalRoot).toBeTruthy();
64
+ const itemText = items
65
+ .map((i) => {
66
+ if (i.hasOwnProperty('text')) {
67
+ return i.text;
68
+ }
69
+ })
70
+ .join('');
71
+ expect(portalRoot?.textContent?.trim()).toEqual(itemText);
72
+ });
73
+ it('should dismiss the overlay on menuitem click', async () => {
74
+ const menu = react_1.render(<SimpleActionMenu />);
75
+ let portalRoot = await menu.baseElement.querySelector('#__primerPortalRoot__');
76
+ expect(portalRoot).toBeNull();
77
+ const anchor = await menu.findByText('Menu');
78
+ react_1.act(() => {
79
+ react_1.fireEvent.click(anchor);
80
+ });
81
+ portalRoot = menu.baseElement.querySelector('#__primerPortalRoot__');
82
+ expect(portalRoot).toBeTruthy();
83
+ const menuItem = await menu.queryByText(items[0].text);
84
+ react_1.act(() => {
85
+ react_1.fireEvent.click(menuItem);
86
+ });
87
+ expect(portalRoot?.textContent).toEqual(''); // menu items are hidden
88
+ });
89
+ it('should dismiss the overlay on clicking outside overlay', async () => {
90
+ const menu = react_1.render(<SimpleActionMenu />);
91
+ let portalRoot = await menu.baseElement.querySelector('#__primerPortalRoot__');
92
+ expect(portalRoot).toBeNull();
93
+ const anchor = await menu.findByText('Menu');
94
+ react_1.act(() => {
95
+ react_1.fireEvent.click(anchor);
96
+ });
97
+ portalRoot = menu.baseElement.querySelector('#__primerPortalRoot__');
98
+ expect(portalRoot).toBeTruthy();
99
+ const somethingElse = (await menu.baseElement.querySelector('#something-else'));
100
+ react_1.act(() => {
101
+ react_1.fireEvent.mouseDown(somethingElse);
102
+ });
103
+ expect(portalRoot?.textContent).toEqual(''); // menu items are hidden
104
+ });
105
+ it('should pass correct values to onAction on menu click', async () => {
106
+ const menu = react_1.render(<SimpleActionMenu />);
107
+ let portalRoot = await menu.baseElement.querySelector('#__primerPortalRoot__');
108
+ expect(portalRoot).toBeNull();
109
+ const anchor = await menu.findByText('Menu');
110
+ react_1.act(() => {
111
+ react_1.fireEvent.click(anchor);
112
+ });
113
+ portalRoot = menu.baseElement.querySelector('#__primerPortalRoot__');
114
+ expect(portalRoot).toBeTruthy();
115
+ const menuItem = (await portalRoot?.querySelector("[role='menuitem']"));
116
+ react_1.act(() => {
117
+ react_1.fireEvent.click(menuItem);
118
+ });
119
+ // onAction has been called with correct argument
120
+ expect(mockOnActivate).toHaveBeenCalledTimes(1);
121
+ const arg = mockOnActivate.mock.calls[0][0];
122
+ expect(arg.text).toEqual(items[0].text);
123
+ });
124
+ });
@@ -0,0 +1,121 @@
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 react_1 = __importStar(require("react"));
26
+ const AnchoredOverlay_1 = require("../AnchoredOverlay");
27
+ const testing_1 = require("../utils/testing");
28
+ const react_2 = require("@testing-library/react");
29
+ const jest_axe_1 = require("jest-axe");
30
+ require("babel-polyfill");
31
+ const index_1 = require("../index");
32
+ const theme_1 = __importDefault(require("../theme"));
33
+ const BaseStyles_1 = __importDefault(require("../BaseStyles"));
34
+ const ThemeProvider_1 = require("../ThemeProvider");
35
+ expect.extend(jest_axe_1.toHaveNoViolations);
36
+ const AnchoredOverlayTestComponent = ({ initiallyOpen = false, onOpenCallback, onCloseCallback } = {}) => {
37
+ const [open, setOpen] = react_1.useState(initiallyOpen);
38
+ const onOpen = react_1.useCallback((gesture) => {
39
+ setOpen(true);
40
+ onOpenCallback?.(gesture);
41
+ }, [onOpenCallback]);
42
+ const onClose = react_1.useCallback((gesture) => {
43
+ setOpen(true);
44
+ onCloseCallback?.(gesture);
45
+ }, [onCloseCallback]);
46
+ return (<ThemeProvider_1.ThemeProvider theme={theme_1.default}>
47
+ <index_1.SSRProvider>
48
+ <BaseStyles_1.default>
49
+ <AnchoredOverlay_1.AnchoredOverlay open={open} onOpen={onOpen} onClose={onClose} renderAnchor={props => <index_1.Button {...props}>Anchor Button</index_1.Button>}>
50
+ <button type="button">Focusable Child</button>
51
+ </AnchoredOverlay_1.AnchoredOverlay>
52
+ </BaseStyles_1.default>
53
+ </index_1.SSRProvider>
54
+ </ThemeProvider_1.ThemeProvider>);
55
+ };
56
+ describe('AnchoredOverlay', () => {
57
+ testing_1.behavesAsComponent({
58
+ Component: AnchoredOverlay_1.AnchoredOverlay,
59
+ options: { skipAs: true, skipSx: true },
60
+ toRender: () => <AnchoredOverlayTestComponent />
61
+ });
62
+ testing_1.checkExports('AnchoredOverlay', {
63
+ default: undefined,
64
+ AnchoredOverlay: AnchoredOverlay_1.AnchoredOverlay
65
+ });
66
+ it('should have no axe violations when open', async () => {
67
+ const { container } = react_2.render(<AnchoredOverlayTestComponent initiallyOpen={true}></AnchoredOverlayTestComponent>);
68
+ const results = await jest_axe_1.axe(container);
69
+ expect(results).toHaveNoViolations();
70
+ react_2.cleanup();
71
+ });
72
+ it('should have no axe violations when closed', async () => {
73
+ const { container } = react_2.render(<AnchoredOverlayTestComponent></AnchoredOverlayTestComponent>);
74
+ const results = await jest_axe_1.axe(container);
75
+ expect(results).toHaveNoViolations();
76
+ react_2.cleanup();
77
+ });
78
+ it('should call onOpen when the anchor is clicked', () => {
79
+ const mockOpenCallback = jest.fn();
80
+ const mockCloseCallback = jest.fn();
81
+ const anchoredOverlay = react_2.render(<AnchoredOverlayTestComponent onOpenCallback={mockOpenCallback} onCloseCallback={mockCloseCallback}/>);
82
+ const anchor = anchoredOverlay.baseElement.querySelector('[aria-haspopup="true"]');
83
+ react_2.fireEvent.click(anchor);
84
+ expect(mockOpenCallback).toHaveBeenCalledTimes(1);
85
+ expect(mockOpenCallback).toHaveBeenCalledWith('anchor-click');
86
+ expect(mockCloseCallback).toHaveBeenCalledTimes(0);
87
+ });
88
+ it('should call onOpen when the anchor activated by a key press', () => {
89
+ const mockOpenCallback = jest.fn();
90
+ const mockCloseCallback = jest.fn();
91
+ const anchoredOverlay = react_2.render(<AnchoredOverlayTestComponent onOpenCallback={mockOpenCallback} onCloseCallback={mockCloseCallback}/>);
92
+ const anchor = anchoredOverlay.baseElement.querySelector('[aria-haspopup="true"]');
93
+ react_2.fireEvent.keyDown(anchor, { key: ' ' });
94
+ expect(mockOpenCallback).toHaveBeenCalledTimes(1);
95
+ expect(mockOpenCallback).toHaveBeenCalledWith('anchor-key-press');
96
+ expect(mockCloseCallback).toHaveBeenCalledTimes(0);
97
+ });
98
+ it('should call onClose when the user clicks off of the overlay', () => {
99
+ const mockOpenCallback = jest.fn();
100
+ const mockCloseCallback = jest.fn();
101
+ const anchoredOverlay = react_2.render(<AnchoredOverlayTestComponent initiallyOpen={true} onOpenCallback={mockOpenCallback} onCloseCallback={mockCloseCallback}/>);
102
+ react_2.fireEvent.mouseDown(anchoredOverlay.baseElement);
103
+ expect(mockOpenCallback).toHaveBeenCalledTimes(0);
104
+ expect(mockCloseCallback).toHaveBeenCalledTimes(1);
105
+ expect(mockCloseCallback).toHaveBeenCalledWith('click-outside');
106
+ });
107
+ it('should call onClose when the escape key is pressed', async () => {
108
+ const mockOpenCallback = jest.fn();
109
+ const mockCloseCallback = jest.fn();
110
+ const anchoredOverlay = react_2.render(<AnchoredOverlayTestComponent initiallyOpen={true} onOpenCallback={mockOpenCallback} onCloseCallback={mockCloseCallback}/>);
111
+ const overlay = await anchoredOverlay.findByRole('none');
112
+ react_2.fireEvent.keyDown(overlay, { key: 'Escape' });
113
+ expect(mockOpenCallback).toHaveBeenCalledTimes(0);
114
+ expect(mockCloseCallback).toHaveBeenCalledTimes(1);
115
+ expect(mockCloseCallback).toHaveBeenCalledWith('escape');
116
+ });
117
+ it('should render consistently when open', () => {
118
+ const { container } = react_2.render(<AnchoredOverlayTestComponent initiallyOpen={true}/>);
119
+ expect(container).toMatchSnapshot();
120
+ });
121
+ });