@primer/components 31.2.0-rc.c7f73427 → 31.2.1-rc.0e01900c

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 (456) 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 +18 -0
  5. package/dist/browser.esm.js +656 -645
  6. package/dist/browser.esm.js.map +1 -1
  7. package/dist/browser.umd.js +211 -200
  8. package/dist/browser.umd.js.map +1 -1
  9. package/docs/content/ActionList2.mdx +358 -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.js +28 -19
  17. package/lib/ActionList/Item.jsx +311 -0
  18. package/lib/ActionList/List.jsx +138 -0
  19. package/lib/ActionList/index.js +12 -23
  20. package/lib/ActionList2/Description.d.ts +12 -0
  21. package/lib/ActionList2/Description.js +57 -0
  22. package/lib/ActionList2/Description.jsx +29 -0
  23. package/lib/ActionList2/Divider.d.ts +5 -0
  24. package/lib/ActionList2/Divider.js +35 -0
  25. package/lib/ActionList2/Divider.jsx +22 -0
  26. package/lib/ActionList2/Group.d.ts +11 -0
  27. package/lib/ActionList2/Group.js +57 -0
  28. package/lib/ActionList2/Group.jsx +25 -0
  29. package/lib/ActionList2/Header.d.ts +26 -0
  30. package/lib/ActionList2/Header.js +55 -0
  31. package/lib/ActionList2/Header.jsx +36 -0
  32. package/lib/ActionList2/Item.d.ts +63 -0
  33. package/lib/ActionList2/Item.js +242 -0
  34. package/lib/ActionList2/Item.jsx +174 -0
  35. package/lib/ActionList2/LinkItem.d.ts +17 -0
  36. package/lib/ActionList2/LinkItem.js +57 -0
  37. package/lib/ActionList2/LinkItem.jsx +28 -0
  38. package/lib/ActionList2/List.d.ts +26 -0
  39. package/lib/ActionList2/List.js +59 -0
  40. package/lib/ActionList2/List.jsx +41 -0
  41. package/lib/ActionList2/Selection.d.ts +5 -0
  42. package/lib/ActionList2/Selection.js +84 -0
  43. package/lib/ActionList2/Selection.jsx +50 -0
  44. package/lib/ActionList2/Visuals.d.ts +9 -0
  45. package/lib/ActionList2/Visuals.js +90 -0
  46. package/lib/ActionList2/Visuals.jsx +48 -0
  47. package/lib/ActionList2/index.d.ts +36 -0
  48. package/lib/ActionList2/index.js +29 -0
  49. package/lib/ActionMenu.jsx +73 -0
  50. package/lib/AnchoredOverlay/AnchoredOverlay.jsx +100 -0
  51. package/lib/AnchoredOverlay/index.js +4 -12
  52. package/lib/Autocomplete/Autocomplete.d.ts +28 -28
  53. package/lib/Autocomplete/Autocomplete.jsx +100 -0
  54. package/lib/Autocomplete/AutocompleteContext.jsx +5 -0
  55. package/lib/Autocomplete/AutocompleteInput.d.ts +28 -28
  56. package/lib/Autocomplete/AutocompleteInput.jsx +113 -0
  57. package/lib/Autocomplete/AutocompleteMenu.jsx +190 -0
  58. package/lib/Autocomplete/AutocompleteOverlay.jsx +55 -0
  59. package/lib/Autocomplete/index.js +7 -14
  60. package/lib/Avatar.jsx +34 -0
  61. package/lib/AvatarPair.jsx +29 -0
  62. package/lib/AvatarStack.jsx +151 -0
  63. package/lib/BaseStyles.jsx +65 -0
  64. package/lib/BorderBox.jsx +18 -0
  65. package/lib/Box.jsx +10 -0
  66. package/lib/BranchName.jsx +20 -0
  67. package/lib/Breadcrumbs.jsx +74 -0
  68. package/lib/Button/Button.d.ts +25 -25
  69. package/lib/Button/Button.jsx +60 -0
  70. package/lib/Button/ButtonBase.jsx +36 -0
  71. package/lib/Button/ButtonClose.d.ts +45 -45
  72. package/lib/Button/ButtonClose.jsx +55 -0
  73. package/lib/Button/ButtonDanger.d.ts +25 -25
  74. package/lib/Button/ButtonDanger.jsx +63 -0
  75. package/lib/Button/ButtonGroup.jsx +55 -0
  76. package/lib/Button/ButtonInvisible.d.ts +25 -25
  77. package/lib/Button/ButtonInvisible.jsx +52 -0
  78. package/lib/Button/ButtonOutline.d.ts +25 -25
  79. package/lib/Button/ButtonOutline.jsx +63 -0
  80. package/lib/Button/ButtonPrimary.d.ts +25 -25
  81. package/lib/Button/ButtonPrimary.jsx +62 -0
  82. package/lib/Button/ButtonStyles.jsx +37 -0
  83. package/lib/Button/ButtonTableList.jsx +49 -0
  84. package/lib/Button/index.js +21 -70
  85. package/lib/Caret.jsx +93 -0
  86. package/lib/CircleBadge.jsx +43 -0
  87. package/lib/CircleOcticon.d.ts +42 -42
  88. package/lib/CircleOcticon.jsx +21 -0
  89. package/lib/CounterLabel.jsx +44 -0
  90. package/lib/Details.jsx +21 -0
  91. package/lib/Dialog/ConfirmationDialog.jsx +146 -0
  92. package/lib/Dialog/Dialog.js +1 -0
  93. package/lib/Dialog/Dialog.jsx +273 -0
  94. package/lib/Dialog.d.ts +45 -45
  95. package/lib/Dialog.jsx +131 -0
  96. package/lib/Dropdown.d.ts +176 -176
  97. package/lib/Dropdown.jsx +134 -0
  98. package/lib/DropdownMenu/DropdownButton.d.ts +46 -46
  99. package/lib/DropdownMenu/DropdownButton.jsx +14 -0
  100. package/lib/DropdownMenu/DropdownMenu.jsx +70 -0
  101. package/lib/DropdownMenu/index.js +6 -20
  102. package/lib/DropdownStyles.js +18 -26
  103. package/lib/FilterList.d.ts +42 -42
  104. package/lib/FilterList.jsx +63 -0
  105. package/lib/FilteredActionList/FilteredActionList.jsx +100 -0
  106. package/lib/FilteredActionList/index.js +4 -12
  107. package/lib/FilteredSearch.jsx +29 -0
  108. package/lib/Flash.jsx +70 -0
  109. package/lib/Flex.jsx +15 -0
  110. package/lib/FormGroup.jsx +25 -0
  111. package/lib/Grid.jsx +15 -0
  112. package/lib/Header.jsx +90 -0
  113. package/lib/Heading.jsx +21 -0
  114. package/lib/Label.jsx +84 -0
  115. package/lib/LabelGroup.jsx +19 -0
  116. package/lib/Link.jsx +38 -0
  117. package/lib/NewButton/button-counter.d.ts +6 -0
  118. package/lib/NewButton/button-counter.js +31 -0
  119. package/lib/NewButton/button-counter.jsx +14 -0
  120. package/lib/NewButton/button.d.ts +13 -0
  121. package/lib/NewButton/button.js +316 -0
  122. package/lib/NewButton/button.jsx +278 -0
  123. package/lib/NewButton/index.d.ts +14 -0
  124. package/lib/NewButton/index.js +8 -0
  125. package/lib/NewButton/types.d.ts +32 -0
  126. package/lib/NewButton/types.js +2 -0
  127. package/lib/Overlay.jsx +156 -0
  128. package/lib/Pagehead.jsx +18 -0
  129. package/lib/Pagination/Pagination.jsx +163 -0
  130. package/lib/Pagination/index.js +6 -12
  131. package/lib/Pagination/model.jsx +174 -0
  132. package/lib/PointerBox.jsx +25 -0
  133. package/lib/Popover.jsx +210 -0
  134. package/lib/Portal/Portal.jsx +79 -0
  135. package/lib/Portal/index.js +5 -16
  136. package/lib/Position.d.ts +4 -4
  137. package/lib/Position.jsx +46 -0
  138. package/lib/ProgressBar.jsx +39 -0
  139. package/lib/SelectMenu/SelectMenu.d.ts +246 -246
  140. package/lib/SelectMenu/SelectMenu.jsx +114 -0
  141. package/lib/SelectMenu/SelectMenuContext.jsx +5 -0
  142. package/lib/SelectMenu/SelectMenuDivider.jsx +43 -0
  143. package/lib/SelectMenu/SelectMenuFilter.jsx +59 -0
  144. package/lib/SelectMenu/SelectMenuFooter.jsx +46 -0
  145. package/lib/SelectMenu/SelectMenuHeader.jsx +44 -0
  146. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  147. package/lib/SelectMenu/SelectMenuItem.jsx +143 -0
  148. package/lib/SelectMenu/SelectMenuList.jsx +60 -0
  149. package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +21 -0
  150. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  151. package/lib/SelectMenu/SelectMenuModal.jsx +119 -0
  152. package/lib/SelectMenu/SelectMenuTab.jsx +93 -0
  153. package/lib/SelectMenu/SelectMenuTabPanel.jsx +43 -0
  154. package/lib/SelectMenu/SelectMenuTabs.jsx +58 -0
  155. package/lib/SelectMenu/hooks/useKeyboardNav.js +80 -96
  156. package/lib/SelectMenu/index.js +7 -14
  157. package/lib/SelectPanel/SelectPanel.jsx +105 -0
  158. package/lib/SelectPanel/index.js +4 -12
  159. package/lib/SideNav.jsx +177 -0
  160. package/lib/Spinner.jsx +35 -0
  161. package/lib/StateLabel.d.ts +1 -1
  162. package/lib/StateLabel.js +6 -1
  163. package/lib/StateLabel.jsx +94 -0
  164. package/lib/StyledOcticon.jsx +20 -0
  165. package/lib/SubNav.jsx +104 -0
  166. package/lib/TabNav.jsx +60 -0
  167. package/lib/Text.jsx +14 -0
  168. package/lib/TextInput.jsx +23 -0
  169. package/lib/TextInputWithTokens.d.ts +28 -28
  170. package/lib/TextInputWithTokens.jsx +218 -0
  171. package/lib/ThemeProvider.jsx +130 -0
  172. package/lib/Timeline.d.ts +43 -43
  173. package/lib/Timeline.jsx +124 -0
  174. package/lib/Token/AvatarToken.d.ts +1 -1
  175. package/lib/Token/AvatarToken.jsx +54 -0
  176. package/lib/Token/IssueLabelToken.d.ts +1 -1
  177. package/lib/Token/IssueLabelToken.jsx +125 -0
  178. package/lib/Token/Token.d.ts +1 -1
  179. package/lib/Token/Token.jsx +103 -0
  180. package/lib/Token/TokenBase.jsx +88 -0
  181. package/lib/Token/_RemoveTokenButton.jsx +108 -0
  182. package/lib/Token/_TokenTextContainer.jsx +49 -0
  183. package/lib/Token/index.js +11 -30
  184. package/lib/Tooltip.jsx +246 -0
  185. package/lib/Truncate.jsx +27 -0
  186. package/lib/UnderlineNav.jsx +90 -0
  187. package/lib/_TextInputWrapper.jsx +120 -0
  188. package/lib/_UnstyledTextInput.jsx +22 -0
  189. package/lib/__tests__/ActionList.test.jsx +49 -0
  190. package/lib/__tests__/ActionList.types.test.jsx +45 -0
  191. package/lib/__tests__/ActionList2.test.d.ts +1 -0
  192. package/lib/__tests__/ActionList2.test.js +53 -0
  193. package/lib/__tests__/ActionList2.test.jsx +46 -0
  194. package/lib/__tests__/ActionMenu.test.jsx +124 -0
  195. package/lib/__tests__/AnchoredOverlay.test.jsx +121 -0
  196. package/lib/__tests__/Autocomplete.test.jsx +299 -0
  197. package/lib/__tests__/Avatar.test.jsx +42 -0
  198. package/lib/__tests__/AvatarStack.test.jsx +43 -0
  199. package/lib/__tests__/BorderBox.test.jsx +36 -0
  200. package/lib/__tests__/Box.test.jsx +41 -0
  201. package/lib/__tests__/BranchName.test.jsx +27 -0
  202. package/lib/__tests__/Breadcrumbs.test.jsx +28 -0
  203. package/lib/__tests__/BreadcrumbsItem.test.jsx +31 -0
  204. package/lib/__tests__/Button.test.jsx +100 -0
  205. package/lib/__tests__/Caret.test.jsx +37 -0
  206. package/lib/__tests__/CircleBadge.test.jsx +55 -0
  207. package/lib/__tests__/CircleOcticon.test.jsx +45 -0
  208. package/lib/__tests__/ConfirmationDialog.test.jsx +119 -0
  209. package/lib/__tests__/CounterLabel.test.jsx +36 -0
  210. package/lib/__tests__/Details.test.jsx +85 -0
  211. package/lib/__tests__/Dialog.test.jsx +139 -0
  212. package/lib/__tests__/Dropdown.test.jsx +49 -0
  213. package/lib/__tests__/DropdownMenu.test.jsx +119 -0
  214. package/lib/__tests__/FilterList.test.jsx +27 -0
  215. package/lib/__tests__/FilterListItem.test.jsx +31 -0
  216. package/lib/__tests__/FilteredSearch.test.jsx +27 -0
  217. package/lib/__tests__/Flash.test.jsx +36 -0
  218. package/lib/__tests__/Flex.test.jsx +51 -0
  219. package/lib/__tests__/FormGroup.test.jsx +36 -0
  220. package/lib/__tests__/Grid.test.jsx +69 -0
  221. package/lib/__tests__/Header.test.jsx +45 -0
  222. package/lib/__tests__/Heading.test.jsx +71 -0
  223. package/lib/__tests__/KeyPaths.types.test.js +5 -8
  224. package/lib/__tests__/Label.test.jsx +33 -0
  225. package/lib/__tests__/LabelGroup.test.jsx +29 -0
  226. package/lib/__tests__/Link.test.jsx +43 -0
  227. package/lib/__tests__/Merge.types.test.js +13 -19
  228. package/lib/__tests__/NewButton.test.d.ts +1 -0
  229. package/lib/__tests__/NewButton.test.js +95 -0
  230. package/lib/__tests__/NewButton.test.jsx +61 -0
  231. package/lib/__tests__/Overlay.test.jsx +105 -0
  232. package/lib/__tests__/Pagehead.test.jsx +25 -0
  233. package/lib/__tests__/Pagination/Pagination.test.jsx +32 -0
  234. package/lib/__tests__/Pagination/PaginationModel.test.jsx +118 -0
  235. package/lib/__tests__/PointerBox.test.jsx +33 -0
  236. package/lib/__tests__/Popover.test.jsx +58 -0
  237. package/lib/__tests__/Portal.test.jsx +102 -0
  238. package/lib/__tests__/Position.test.jsx +96 -0
  239. package/lib/__tests__/ProgressBar.test.jsx +38 -0
  240. package/lib/__tests__/SelectMenu.test.jsx +120 -0
  241. package/lib/__tests__/SelectPanel.test.jsx +48 -0
  242. package/lib/__tests__/SideNav.test.jsx +55 -0
  243. package/lib/__tests__/Spinner.test.jsx +41 -0
  244. package/lib/__tests__/StateLabel.test.jsx +46 -0
  245. package/lib/__tests__/StyledOcticon.test.jsx +28 -0
  246. package/lib/__tests__/SubNav.test.jsx +47 -0
  247. package/lib/__tests__/SubNavLink.test.jsx +31 -0
  248. package/lib/__tests__/TabNav.test.jsx +32 -0
  249. package/lib/__tests__/Text.test.jsx +71 -0
  250. package/lib/__tests__/TextInput.test.jsx +45 -0
  251. package/lib/__tests__/TextInputWithTokens.test.jsx +302 -0
  252. package/lib/__tests__/ThemeProvider.test.jsx +314 -0
  253. package/lib/__tests__/Timeline.test.jsx +51 -0
  254. package/lib/__tests__/Token.test.jsx +93 -0
  255. package/lib/__tests__/Tooltip.test.jsx +46 -0
  256. package/lib/__tests__/Truncate.test.jsx +41 -0
  257. package/lib/__tests__/UnderlineNav.test.jsx +53 -0
  258. package/lib/__tests__/UnderlineNavLink.test.jsx +31 -0
  259. package/lib/__tests__/behaviors/anchoredPosition.test.js +229 -376
  260. package/lib/__tests__/behaviors/focusTrap.test.jsx +184 -0
  261. package/lib/__tests__/behaviors/focusZone.test.jsx +406 -0
  262. package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +58 -0
  263. package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +145 -216
  264. package/lib/__tests__/filterObject.test.js +48 -27
  265. package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +29 -0
  266. package/lib/__tests__/hooks/useOnEscapePress.test.jsx +19 -0
  267. package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +63 -0
  268. package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +61 -0
  269. package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +56 -0
  270. package/lib/__tests__/theme.test.js +33 -34
  271. package/lib/__tests__/themeGet.test.js +12 -23
  272. package/lib/__tests__/useSafeTimeout.test.jsx +36 -0
  273. package/lib/__tests__/utils/createSlots.test.d.ts +1 -0
  274. package/lib/__tests__/utils/createSlots.test.js +75 -0
  275. package/lib/__tests__/utils/createSlots.test.jsx +57 -0
  276. package/lib/behaviors/anchoredPosition.js +205 -234
  277. package/lib/behaviors/focusTrap.js +121 -157
  278. package/lib/behaviors/focusZone.js +434 -509
  279. package/lib/behaviors/scrollIntoViewingArea.js +18 -35
  280. package/lib/constants.js +39 -43
  281. package/lib/drafts.d.ts +8 -0
  282. package/lib/drafts.js +21 -0
  283. package/lib/hooks/index.js +16 -60
  284. package/lib/hooks/useAnchoredPosition.js +32 -40
  285. package/lib/hooks/useCombinedRefs.js +32 -36
  286. package/lib/hooks/useDetails.jsx +39 -0
  287. package/lib/hooks/useDialog.js +72 -96
  288. package/lib/hooks/useFocusTrap.js +43 -60
  289. package/lib/hooks/useFocusZone.js +54 -50
  290. package/lib/hooks/useOnEscapePress.js +25 -36
  291. package/lib/hooks/useOnOutsideClick.jsx +61 -0
  292. package/lib/hooks/useOpenAndCloseFocus.js +22 -34
  293. package/lib/hooks/useOverlay.jsx +15 -0
  294. package/lib/hooks/useProvidedRefOrCreate.js +10 -14
  295. package/lib/hooks/useProvidedStateOrCreate.js +13 -16
  296. package/lib/hooks/useRenderForcingRef.js +13 -17
  297. package/lib/hooks/useResizeObserver.js +15 -18
  298. package/lib/hooks/useSafeTimeout.js +22 -30
  299. package/lib/hooks/useScrollFlash.js +16 -23
  300. package/lib/index.d.ts +2 -0
  301. package/lib/index.js +163 -636
  302. package/lib/polyfills/eventListenerSignal.js +37 -45
  303. package/lib/stories/ActionList2.stories.js +908 -0
  304. package/lib/stories/NewButton.stories.js +230 -0
  305. package/lib/sx.d.ts +2 -0
  306. package/lib/sx.js +10 -14
  307. package/lib/theme-preval.js +65 -2945
  308. package/lib/theme.js +3 -12
  309. package/lib/utils/create-slots.d.ts +17 -0
  310. package/lib/utils/create-slots.js +105 -0
  311. package/lib/utils/create-slots.jsx +65 -0
  312. package/lib/utils/deprecate.jsx +59 -0
  313. package/lib/utils/isNumeric.jsx +7 -0
  314. package/lib/utils/iterateFocusableElements.js +63 -85
  315. package/lib/utils/ssr.jsx +6 -0
  316. package/lib/utils/test-deprecations.jsx +20 -0
  317. package/lib/utils/test-helpers.jsx +8 -0
  318. package/lib/utils/test-matchers.jsx +100 -0
  319. package/lib/utils/testing.d.ts +14 -1
  320. package/lib/utils/testing.jsx +206 -0
  321. package/lib/utils/theme.js +33 -47
  322. package/lib/utils/types/AriaRole.js +2 -1
  323. package/lib/utils/types/ComponentProps.js +2 -1
  324. package/lib/utils/types/Flatten.js +2 -1
  325. package/lib/utils/types/KeyPaths.js +2 -1
  326. package/lib/utils/types/MandateProps.js +16 -1
  327. package/lib/utils/types/Merge.js +2 -1
  328. package/lib/utils/types/index.js +16 -69
  329. package/lib/utils/uniqueId.js +5 -8
  330. package/lib/utils/use-force-update.d.ts +1 -0
  331. package/lib/utils/use-force-update.js +13 -0
  332. package/lib/utils/useIsomorphicLayoutEffect.js +8 -11
  333. package/lib/utils/userAgent.js +8 -12
  334. package/lib-esm/ActionList/Item.js +28 -19
  335. package/lib-esm/ActionList2/Description.d.ts +12 -0
  336. package/lib-esm/ActionList2/Description.js +41 -0
  337. package/lib-esm/ActionList2/Divider.d.ts +5 -0
  338. package/lib-esm/ActionList2/Divider.js +23 -0
  339. package/lib-esm/ActionList2/Group.d.ts +11 -0
  340. package/lib-esm/ActionList2/Group.js +40 -0
  341. package/lib-esm/ActionList2/Header.d.ts +26 -0
  342. package/lib-esm/ActionList2/Header.js +44 -0
  343. package/lib-esm/ActionList2/Item.d.ts +63 -0
  344. package/lib-esm/ActionList2/Item.js +208 -0
  345. package/lib-esm/ActionList2/LinkItem.d.ts +17 -0
  346. package/lib-esm/ActionList2/LinkItem.js +43 -0
  347. package/lib-esm/ActionList2/List.d.ts +26 -0
  348. package/lib-esm/ActionList2/List.js +37 -0
  349. package/lib-esm/ActionList2/Selection.d.ts +5 -0
  350. package/lib-esm/ActionList2/Selection.js +66 -0
  351. package/lib-esm/ActionList2/Visuals.d.ts +9 -0
  352. package/lib-esm/ActionList2/Visuals.js +68 -0
  353. package/lib-esm/ActionList2/index.d.ts +36 -0
  354. package/lib-esm/ActionList2/index.js +33 -0
  355. package/lib-esm/Autocomplete/Autocomplete.d.ts +28 -28
  356. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +28 -28
  357. package/lib-esm/Button/Button.d.ts +25 -25
  358. package/lib-esm/Button/ButtonClose.d.ts +45 -45
  359. package/lib-esm/Button/ButtonDanger.d.ts +25 -25
  360. package/lib-esm/Button/ButtonInvisible.d.ts +25 -25
  361. package/lib-esm/Button/ButtonOutline.d.ts +25 -25
  362. package/lib-esm/Button/ButtonPrimary.d.ts +25 -25
  363. package/lib-esm/CircleOcticon.d.ts +42 -42
  364. package/lib-esm/Dialog/Dialog.js +1 -0
  365. package/lib-esm/Dialog.d.ts +45 -45
  366. package/lib-esm/Dropdown.d.ts +176 -176
  367. package/lib-esm/DropdownMenu/DropdownButton.d.ts +46 -46
  368. package/lib-esm/FilterList.d.ts +42 -42
  369. package/lib-esm/NewButton/button-counter.d.ts +6 -0
  370. package/lib-esm/NewButton/button-counter.js +18 -0
  371. package/lib-esm/NewButton/button.d.ts +13 -0
  372. package/lib-esm/NewButton/button.js +298 -0
  373. package/lib-esm/NewButton/index.d.ts +14 -0
  374. package/lib-esm/NewButton/index.js +5 -0
  375. package/lib-esm/NewButton/types.d.ts +32 -0
  376. package/lib-esm/NewButton/types.js +1 -0
  377. package/lib-esm/Position.d.ts +4 -4
  378. package/lib-esm/SelectMenu/SelectMenu.d.ts +246 -246
  379. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  380. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  381. package/lib-esm/StateLabel.d.ts +1 -1
  382. package/lib-esm/StateLabel.js +7 -2
  383. package/lib-esm/TextInputWithTokens.d.ts +28 -28
  384. package/lib-esm/Timeline.d.ts +43 -43
  385. package/lib-esm/Token/AvatarToken.d.ts +1 -1
  386. package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
  387. package/lib-esm/Token/Token.d.ts +1 -1
  388. package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
  389. package/lib-esm/__tests__/ActionList2.test.js +41 -0
  390. package/lib-esm/__tests__/NewButton.test.d.ts +1 -0
  391. package/lib-esm/__tests__/NewButton.test.js +84 -0
  392. package/lib-esm/__tests__/utils/createSlots.test.d.ts +1 -0
  393. package/lib-esm/__tests__/utils/createSlots.test.js +67 -0
  394. package/lib-esm/drafts.d.ts +8 -0
  395. package/lib-esm/drafts.js +9 -0
  396. package/lib-esm/index.d.ts +2 -0
  397. package/lib-esm/index.js +1 -0
  398. package/lib-esm/stories/ActionList2.stories.js +796 -0
  399. package/lib-esm/stories/NewButton.stories.js +178 -0
  400. package/lib-esm/sx.d.ts +2 -0
  401. package/lib-esm/sx.js +3 -1
  402. package/lib-esm/theme-preval.js +81 -2
  403. package/lib-esm/utils/create-slots.d.ts +17 -0
  404. package/lib-esm/utils/create-slots.js +84 -0
  405. package/lib-esm/utils/testing.d.ts +14 -1
  406. package/lib-esm/utils/use-force-update.d.ts +1 -0
  407. package/lib-esm/utils/use-force-update.js +6 -0
  408. package/package-lock.json +153 -14
  409. package/package.json +7 -4
  410. package/script/build +1 -1
  411. package/src/ActionList/Item.tsx +32 -19
  412. package/src/ActionList2/Description.tsx +52 -0
  413. package/src/ActionList2/Divider.tsx +24 -0
  414. package/src/ActionList2/Group.tsx +34 -0
  415. package/src/ActionList2/Header.tsx +58 -0
  416. package/src/ActionList2/Item.tsx +246 -0
  417. package/src/ActionList2/LinkItem.tsx +49 -0
  418. package/src/ActionList2/List.tsx +55 -0
  419. package/src/ActionList2/Selection.tsx +60 -0
  420. package/src/ActionList2/Visuals.tsx +76 -0
  421. package/src/ActionList2/index.ts +39 -0
  422. package/src/Dialog/Dialog.tsx +1 -0
  423. package/src/NewButton/button-counter.tsx +15 -0
  424. package/src/NewButton/button.tsx +279 -0
  425. package/src/NewButton/index.ts +10 -0
  426. package/src/NewButton/types.ts +36 -0
  427. package/src/StateLabel.tsx +14 -2
  428. package/src/__tests__/ActionList2.test.tsx +47 -0
  429. package/src/__tests__/NewButton.test.tsx +70 -0
  430. package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
  431. package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +722 -255
  432. package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +1 -0
  433. package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +1 -0
  434. package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +1 -0
  435. package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +1 -0
  436. package/src/__tests__/__snapshots__/NewButton.test.tsx.snap +300 -0
  437. package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +4 -0
  438. package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -0
  439. package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +13 -6
  440. package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +1 -0
  441. package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +66 -0
  442. package/src/__tests__/__snapshots__/Token.test.tsx.snap +17 -0
  443. package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
  444. package/src/__tests__/utils/createSlots.test.tsx +74 -0
  445. package/src/drafts.ts +10 -0
  446. package/src/index.ts +2 -0
  447. package/src/stories/ActionList2.stories.tsx +1291 -0
  448. package/src/stories/NewButton.stories.tsx +201 -0
  449. package/src/sx.ts +3 -0
  450. package/src/theme-preval.js +1 -0
  451. package/src/utils/create-slots.tsx +96 -0
  452. package/src/utils/use-force-update.ts +7 -0
  453. package/stats.html +1 -1
  454. package/tsconfig.base.json +20 -0
  455. package/tsconfig.build.json +2 -2
  456. package/tsconfig.json +4 -17
@@ -0,0 +1,102 @@
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 index_1 = __importStar(require("../Portal/index"));
26
+ const react_1 = require("@testing-library/react");
27
+ const react_2 = __importDefault(require("react"));
28
+ const BaseStyles_1 = __importDefault(require("../BaseStyles"));
29
+ describe('Portal', () => {
30
+ it('renders a default portal into document.body (no BaseStyles present)', () => {
31
+ const { baseElement } = react_1.render(<index_1.default>123test123</index_1.default>);
32
+ const generatedRoot = baseElement.querySelector('#__primerPortalRoot__');
33
+ expect(generatedRoot).toBeInstanceOf(HTMLElement);
34
+ expect(generatedRoot?.textContent?.trim()).toEqual('123test123');
35
+ baseElement.innerHTML = '';
36
+ });
37
+ it('renders a default portal into nearest BaseStyles element', () => {
38
+ const toRender = (<div id="renderedRoot">
39
+ <BaseStyles_1.default>
40
+ <div id="baseStylesRoot">
41
+ <index_1.default>123test123</index_1.default>
42
+ </div>
43
+ </BaseStyles_1.default>
44
+ </div>);
45
+ const { baseElement } = react_1.render(toRender);
46
+ const baseStylesRoot = baseElement.querySelector('#baseStylesRoot');
47
+ const baseStylesElement = baseStylesRoot?.parentElement;
48
+ const generatedRoot = baseStylesElement?.querySelector('#__primerPortalRoot__');
49
+ expect(baseStylesRoot).toBeInstanceOf(HTMLElement);
50
+ expect(baseStylesElement).toBeInstanceOf(HTMLElement);
51
+ expect(generatedRoot).toBeInstanceOf(HTMLElement);
52
+ expect(generatedRoot?.textContent?.trim()).toEqual('123test123');
53
+ baseElement.innerHTML = '';
54
+ });
55
+ it('renders into the custom portal root (default root name - declarative)', () => {
56
+ const toRender = (<div id="renderedRoot">
57
+ <div id="__primerPortalRoot__"></div>
58
+ <index_1.default>123test123</index_1.default>
59
+ </div>);
60
+ const { baseElement } = react_1.render(toRender);
61
+ const renderedRoot = baseElement.querySelector('#renderedRoot');
62
+ const portalRoot = renderedRoot?.querySelector('#__primerPortalRoot__');
63
+ expect(portalRoot).toBeInstanceOf(HTMLElement);
64
+ expect(portalRoot?.textContent?.trim()).toEqual('123test123');
65
+ baseElement.innerHTML = '';
66
+ });
67
+ it('renders into the custom portal root (default root name - imperative)', () => {
68
+ const portalRootJSX = <div id="myPortalRoot"></div>;
69
+ let { baseElement } = react_1.render(portalRootJSX);
70
+ const portalRoot = baseElement.querySelector('#myPortalRoot');
71
+ expect(portalRoot).toBeInstanceOf(HTMLElement);
72
+ index_1.registerPortalRoot(baseElement.querySelector('#myPortalRoot'));
73
+ const toRender = <index_1.default>123test123</index_1.default>;
74
+ ({ baseElement } = react_1.render(toRender));
75
+ expect(portalRoot?.textContent?.trim()).toEqual('123test123');
76
+ baseElement.innerHTML = '';
77
+ });
78
+ it('renders into multiple custom portal roots (named)', () => {
79
+ const portalRootJSX = (<main>
80
+ <div id="myPortalRoot1"></div>
81
+ <div id="myPortalRoot2"></div>
82
+ </main>);
83
+ let { baseElement } = react_1.render(portalRootJSX);
84
+ const fancyPortalRoot1 = baseElement.querySelector('#myPortalRoot1');
85
+ const fancyPortalRoot2 = baseElement.querySelector('#myPortalRoot2');
86
+ expect(fancyPortalRoot1).toBeInstanceOf(HTMLElement);
87
+ expect(fancyPortalRoot2).toBeInstanceOf(HTMLElement);
88
+ index_1.registerPortalRoot(baseElement.querySelector('#myPortalRoot1'), 'fancyPortal1');
89
+ index_1.registerPortalRoot(baseElement.querySelector('#myPortalRoot2'), 'fancyPortal2');
90
+ const toRender = (<>
91
+ <index_1.default>123test123</index_1.default>
92
+ <index_1.default containerName="fancyPortal1">456test456</index_1.default>
93
+ <index_1.default containerName="fancyPortal2">789test789</index_1.default>
94
+ </>);
95
+ ({ baseElement } = react_1.render(toRender));
96
+ const generatedRoot = baseElement.querySelector('#__primerPortalRoot__');
97
+ expect(generatedRoot?.textContent?.trim()).toEqual('123test123');
98
+ expect(fancyPortalRoot1?.textContent?.trim()).toEqual('456test456');
99
+ expect(fancyPortalRoot2?.textContent?.trim()).toEqual('789test789');
100
+ baseElement.innerHTML = '';
101
+ });
102
+ });
@@ -0,0 +1,96 @@
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 __1 = require("..");
8
+ const testing_1 = require("../utils/testing");
9
+ const react_2 = require("@testing-library/react");
10
+ const jest_axe_1 = require("jest-axe");
11
+ require("babel-polyfill");
12
+ expect.extend(jest_axe_1.toHaveNoViolations);
13
+ describe('position components', () => {
14
+ describe('Absolute', () => {
15
+ testing_1.behavesAsComponent({ Component: __1.Absolute });
16
+ testing_1.checkExports('Position', {
17
+ default: __1.Position,
18
+ Absolute: __1.Absolute,
19
+ Fixed: __1.Fixed,
20
+ Relative: __1.Relative,
21
+ Sticky: __1.Sticky
22
+ });
23
+ it('should have no axe violations', async () => {
24
+ const { container } = react_2.render(<__1.Absolute />);
25
+ const results = await jest_axe_1.axe(container);
26
+ expect(results).toHaveNoViolations();
27
+ react_2.cleanup();
28
+ });
29
+ it('sets position: absolute', () => {
30
+ expect(testing_1.render(<__1.Absolute />)).toHaveStyleRule('position', 'absolute');
31
+ });
32
+ it('can render other components with the as prop', () => {
33
+ const result = testing_1.render(<__1.Absolute as={__1.Box} borderWidth="1px" borderStyle="solid" borderColor="border.default" borderRadius={2}/>);
34
+ expect(result).toHaveStyleRule('position', 'absolute');
35
+ expect(result).toHaveStyleRule('border-width', '1px');
36
+ expect(result).toHaveStyleRule('border-style', 'solid');
37
+ });
38
+ });
39
+ describe('Fixed', () => {
40
+ testing_1.behavesAsComponent({ Component: __1.Fixed });
41
+ it('respects the "as" prop', () => {
42
+ expect(testing_1.render(<__1.Fixed as="span"/>).type).toEqual('span');
43
+ });
44
+ it('should have no axe violations', async () => {
45
+ const { container } = react_2.render(<__1.Fixed />);
46
+ const results = await jest_axe_1.axe(container);
47
+ expect(results).toHaveNoViolations();
48
+ react_2.cleanup();
49
+ });
50
+ it('sets position: fixed', () => {
51
+ expect(testing_1.render(<__1.Fixed />)).toHaveStyleRule('position', 'fixed');
52
+ });
53
+ it('can render other components with the as prop', () => {
54
+ const result = testing_1.render(<__1.Fixed as={__1.Box} borderWidth="1px" borderStyle="solid" borderColor="border.default" borderRadius={2}/>);
55
+ expect(result).toHaveStyleRule('position', 'fixed');
56
+ expect(result).toHaveStyleRule('border-width', '1px');
57
+ expect(result).toHaveStyleRule('border-style', 'solid');
58
+ });
59
+ });
60
+ describe('Relative', () => {
61
+ testing_1.behavesAsComponent({ Component: __1.Relative });
62
+ it('should have no axe violations', async () => {
63
+ const { container } = react_2.render(<__1.Relative />);
64
+ const results = await jest_axe_1.axe(container);
65
+ expect(results).toHaveNoViolations();
66
+ react_2.cleanup();
67
+ });
68
+ it('sets position: relative', () => {
69
+ expect(testing_1.render(<__1.Relative />)).toHaveStyleRule('position', 'relative');
70
+ });
71
+ it('can render other components with the as prop', () => {
72
+ const result = testing_1.render(<__1.Relative as={__1.Box} borderWidth="1px" borderStyle="solid" borderColor="border.default" borderRadius={2}/>);
73
+ expect(result).toHaveStyleRule('position', 'relative');
74
+ expect(result).toHaveStyleRule('border-width', '1px');
75
+ expect(result).toHaveStyleRule('border-style', 'solid');
76
+ });
77
+ });
78
+ describe('Sticky', () => {
79
+ testing_1.behavesAsComponent({ Component: __1.Sticky });
80
+ it('should have no axe violations', async () => {
81
+ const { container } = react_2.render(<__1.Sticky />);
82
+ const results = await jest_axe_1.axe(container);
83
+ expect(results).toHaveNoViolations();
84
+ react_2.cleanup();
85
+ });
86
+ it('sets position: sticky', () => {
87
+ expect(testing_1.render(<__1.Sticky />)).toHaveStyleRule('position', 'sticky');
88
+ });
89
+ it('can render other components with the as prop', () => {
90
+ const result = testing_1.render(<__1.Sticky as={__1.Box} borderWidth="1px" borderStyle="solid" borderColor="border.default" borderRadius={2}/>);
91
+ expect(result).toHaveStyleRule('position', 'sticky');
92
+ expect(result).toHaveStyleRule('border-width', '1px');
93
+ expect(result).toHaveStyleRule('border-style', 'solid');
94
+ });
95
+ });
96
+ });
@@ -0,0 +1,38 @@
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 __1 = require("..");
8
+ const testing_1 = require("../utils/testing");
9
+ const react_2 = require("@testing-library/react");
10
+ const jest_axe_1 = require("jest-axe");
11
+ require("babel-polyfill");
12
+ expect.extend(jest_axe_1.toHaveNoViolations);
13
+ describe('ProgressBar', () => {
14
+ testing_1.behavesAsComponent({ Component: __1.ProgressBar });
15
+ testing_1.checkExports('ProgressBar', {
16
+ default: __1.ProgressBar
17
+ });
18
+ it('should have no axe violations', async () => {
19
+ const { container } = react_2.render(<__1.ProgressBar progress={80} barSize="small"/>);
20
+ const results = await jest_axe_1.axe(container);
21
+ expect(results).toHaveNoViolations();
22
+ react_2.cleanup();
23
+ });
24
+ it('respects the "barSize" prop', () => {
25
+ expect(testing_1.render(<__1.ProgressBar progress={80} barSize="small"/>)).toHaveStyleRule('height', '5px');
26
+ expect(testing_1.render(<__1.ProgressBar progress={80} barSize="default"/>)).toHaveStyleRule('height', '8px');
27
+ expect(testing_1.render(<__1.ProgressBar progress={80} barSize="large"/>)).toHaveStyleRule('height', '10px');
28
+ });
29
+ it('respects the "inline" prop', () => {
30
+ expect(testing_1.render(<__1.ProgressBar progress={80} inline/>)).toHaveStyleRule('display', 'inline-flex');
31
+ });
32
+ it('respects the "width" prop', () => {
33
+ expect(testing_1.render(<__1.ProgressBar progress={80} inline width="100px"/>)).toHaveStyleRule('width', '100px');
34
+ });
35
+ it('respects the "progress" prop', () => {
36
+ expect(testing_1.render(<__1.ProgressBar progress={80}/>)).toMatchSnapshot();
37
+ });
38
+ });
@@ -0,0 +1,120 @@
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 __1 = require("..");
8
+ const testing_1 = require("../utils/testing");
9
+ const react_2 = require("@testing-library/react");
10
+ const jest_axe_1 = require("jest-axe");
11
+ require("babel-polyfill");
12
+ expect.extend(jest_axe_1.toHaveNoViolations);
13
+ const BasicSelectMenu = ({ onClick, as, align = 'left' }) => {
14
+ return (<__1.SelectMenu as={as}>
15
+ <__1.Button as="summary">Projects</__1.Button>
16
+ <__1.SelectMenu.Modal title="Projects" align={align}>
17
+ <__1.SelectMenu.List>
18
+ <__1.SelectMenu.Item selected href="#">
19
+ Primer Components bugs
20
+ </__1.SelectMenu.Item>
21
+ <__1.SelectMenu.Item onClick={onClick} as={as} data-test="menu-item" href="#">
22
+ Primer Components roadmap
23
+ </__1.SelectMenu.Item>
24
+ <__1.SelectMenu.Divider>stuff</__1.SelectMenu.Divider>
25
+ <__1.SelectMenu.Item href="#"> Project 3</__1.SelectMenu.Item>
26
+ <__1.SelectMenu.Item href="#">Project 4</__1.SelectMenu.Item>
27
+ <__1.SelectMenu.Footer>footer</__1.SelectMenu.Footer>
28
+ </__1.SelectMenu.List>
29
+ </__1.SelectMenu.Modal>
30
+ </__1.SelectMenu>);
31
+ };
32
+ const MenuWithTabs = ({ onClick }) => {
33
+ return (<__1.SelectMenu initialTab="Organization">
34
+ <__1.Button as="summary">Projects</__1.Button>
35
+ <__1.SelectMenu.Modal title="Projects">
36
+ <__1.SelectMenu.Tabs>
37
+ <__1.SelectMenu.Tab index={0} onClick={onClick} data-test="repo-tab" tabName="Repository"/>
38
+ <__1.SelectMenu.Tab index={1} tabName="Organization"/>
39
+ </__1.SelectMenu.Tabs>
40
+ <__1.SelectMenu.TabPanel tabName="Repository">
41
+ <__1.SelectMenu.Item href="#">Primer Components bugs</__1.SelectMenu.Item>
42
+ <__1.SelectMenu.Item href="#">Primer Components roadmap</__1.SelectMenu.Item>
43
+ <__1.SelectMenu.Item href="#"> Project 3</__1.SelectMenu.Item>
44
+ <__1.SelectMenu.Item href="#">Project 4</__1.SelectMenu.Item>
45
+ </__1.SelectMenu.TabPanel>
46
+ <__1.SelectMenu.TabPanel tabName="Organization">
47
+ <__1.SelectMenu.Item href="#"> Project 2</__1.SelectMenu.Item>
48
+ </__1.SelectMenu.TabPanel>
49
+ <__1.SelectMenu.Footer>Showing 3 of 3</__1.SelectMenu.Footer>
50
+ </__1.SelectMenu.Modal>
51
+ </__1.SelectMenu>);
52
+ };
53
+ describe('SelectMenu', () => {
54
+ testing_1.checkExports('SelectMenu', {
55
+ default: __1.SelectMenu
56
+ });
57
+ for (const Comp of [
58
+ __1.SelectMenu.List,
59
+ __1.SelectMenu.Divider,
60
+ __1.SelectMenu.Filter,
61
+ __1.SelectMenu.Item,
62
+ __1.SelectMenu.List,
63
+ __1.SelectMenu.Modal,
64
+ __1.SelectMenu.Tabs,
65
+ __1.SelectMenu.Tab,
66
+ __1.SelectMenu.TabPanel,
67
+ __1.SelectMenu.Header
68
+ ]) {
69
+ it('sets a valid displayName', () => {
70
+ expect(Comp.displayName).toMatch(testing_1.COMPONENT_DISPLAY_NAME_REGEX);
71
+ });
72
+ }
73
+ it('should have no axe violations', async () => {
74
+ const { container } = react_2.render(<BasicSelectMenu />);
75
+ const results = await jest_axe_1.axe(container);
76
+ expect(results).toHaveNoViolations();
77
+ react_2.cleanup();
78
+ });
79
+ it('does not allow the "as" prop on SelectMenu', () => {
80
+ const component = testing_1.mount(<BasicSelectMenu as="span"/>);
81
+ expect(component.find('details').length).toEqual(1);
82
+ });
83
+ it('shows correct initial tab', () => {
84
+ const testInstance = testing_1.renderRoot(<MenuWithTabs />);
85
+ expect(testInstance.findByProps({ 'aria-selected': true }).props.children).toBe('Organization');
86
+ });
87
+ it('clicking on a tab opens the tab', () => {
88
+ const component = testing_1.mount(<MenuWithTabs />);
89
+ const tab = component.find("[data-test='repo-tab']").first();
90
+ tab.simulate('click');
91
+ expect(tab.getDOMNode().attributes.getNamedItem('aria-selected')).toBeTruthy();
92
+ });
93
+ it('selected items have aria-checked', () => {
94
+ const testInstance = testing_1.renderRoot(<BasicSelectMenu />);
95
+ expect(testInstance.findByProps({ 'aria-checked': true }).props.children[1]).toBe('Primer Components bugs');
96
+ });
97
+ it('clicking on a list item calls user provided onClick handler', () => {
98
+ const mockClick = jest.fn();
99
+ const component = testing_1.mount(<BasicSelectMenu onClick={mockClick}/>);
100
+ const item = component.find("[data-test='menu-item']").first();
101
+ item.simulate('click');
102
+ expect(mockClick.mock.calls.length).toEqual(1);
103
+ });
104
+ it('clicking on a tab calls user provided onClick handler', () => {
105
+ const mockClick = jest.fn();
106
+ const component = testing_1.mount(<MenuWithTabs onClick={mockClick}/>);
107
+ const item = component.find("[data-test='repo-tab']").first();
108
+ item.simulate('click');
109
+ expect(mockClick.mock.calls.length).toEqual(1);
110
+ });
111
+ it('clicking on an item closes the modal', () => {
112
+ const component = testing_1.mount(<BasicSelectMenu />);
113
+ const item = component.find("[data-test='menu-item']").first();
114
+ item.simulate('click');
115
+ expect(component.getDOMNode().attributes.getNamedItem('open')).toBeFalsy();
116
+ });
117
+ it('right-aligned modal has right: 0px', () => {
118
+ expect(testing_1.render(<BasicSelectMenu align="right"/>)).toMatchSnapshot();
119
+ });
120
+ });
@@ -0,0 +1,48 @@
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 SelectPanel_1 = require("../SelectPanel");
12
+ const testing_1 = require("../utils/testing");
13
+ const __1 = require("..");
14
+ expect.extend(jest_axe_1.toHaveNoViolations);
15
+ const items = [{ text: 'Foo' }, { text: 'Bar' }, { text: 'Baz' }, { text: 'Bon' }];
16
+ function SimpleSelectPanel() {
17
+ const [selected, setSelected] = react_2.default.useState([]);
18
+ const [, setFilter] = react_2.default.useState('');
19
+ const [open, setOpen] = react_2.default.useState(false);
20
+ return (<__1.ThemeProvider theme={theme_1.default}>
21
+ <__1.SSRProvider>
22
+ <__1.BaseStyles>
23
+ <SelectPanel_1.SelectPanel items={items} placeholder="Select Items" placeholderText="Filter Items" selected={selected} onSelectedChange={setSelected} onFilterChange={setFilter} open={open} onOpenChange={setOpen}/>
24
+ <div id="portal-root"></div>
25
+ </__1.BaseStyles>
26
+ </__1.SSRProvider>
27
+ </__1.ThemeProvider>);
28
+ }
29
+ describe('SelectPanel', () => {
30
+ afterEach(() => {
31
+ jest.clearAllMocks();
32
+ });
33
+ testing_1.behavesAsComponent({
34
+ Component: SelectPanel_1.SelectPanel,
35
+ options: { skipAs: true, skipSx: true },
36
+ toRender: () => <SimpleSelectPanel />
37
+ });
38
+ testing_1.checkExports('SelectPanel', {
39
+ default: undefined,
40
+ SelectPanel: SelectPanel_1.SelectPanel
41
+ });
42
+ it('should have no axe violations', async () => {
43
+ const { container } = react_1.render(<SimpleSelectPanel />);
44
+ const results = await jest_axe_1.axe(container);
45
+ expect(results).toHaveNoViolations();
46
+ react_1.cleanup();
47
+ });
48
+ });
@@ -0,0 +1,55 @@
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 __1 = require("..");
8
+ const testing_1 = require("../utils/testing");
9
+ const react_2 = require("@testing-library/react");
10
+ const jest_axe_1 = require("jest-axe");
11
+ require("babel-polyfill");
12
+ expect.extend(jest_axe_1.toHaveNoViolations);
13
+ describe('SideNav', () => {
14
+ testing_1.behavesAsComponent({ Component: __1.SideNav });
15
+ testing_1.checkExports('SideNav', {
16
+ default: __1.SideNav
17
+ });
18
+ describe('SideNav.Link', () => {
19
+ testing_1.behavesAsComponent({ Component: __1.SideNav.Link });
20
+ });
21
+ it('should have no axe violations', async () => {
22
+ const { container } = react_2.render(<__1.SideNav>
23
+ <__1.SideNav.Link href="#">One</__1.SideNav.Link>
24
+ <__1.SideNav.Link href="#" selected>
25
+ Two
26
+ </__1.SideNav.Link>
27
+ </__1.SideNav>);
28
+ const results = await jest_axe_1.axe(container);
29
+ expect(results).toHaveNoViolations();
30
+ react_2.cleanup();
31
+ });
32
+ it('renders a <nav> and <a>', () => {
33
+ expect(testing_1.render(<__1.SideNav />).type).toEqual('nav');
34
+ expect(testing_1.render(<__1.SideNav.Link />).type).toEqual('a');
35
+ });
36
+ it('sets aria-label appropriately', () => {
37
+ expect(testing_1.render(<__1.SideNav aria-label="foo"/>).props['aria-label']).toEqual('foo');
38
+ });
39
+ it('sets aria-current on a selected link', () => {
40
+ const elem = (<__1.SideNav>
41
+ <__1.SideNav.Link href="#one">One</__1.SideNav.Link>
42
+ <__1.SideNav.Link href="#two" selected>
43
+ Two
44
+ </__1.SideNav.Link>
45
+ </__1.SideNav>);
46
+ const wrapper = testing_1.mount(elem);
47
+ expect(wrapper.find('[aria-current="page"]').text()).toEqual('Two');
48
+ });
49
+ it('sets different styles for SideNavs with the lightweight variant', () => {
50
+ const regular = testing_1.render(<__1.SideNav />);
51
+ const lightweight = testing_1.render(<__1.SideNav variant="lightweight"/>);
52
+ expect(regular.props.className).toEqual(expect.stringContaining('variant-normal'));
53
+ expect(lightweight.props.className).toEqual(expect.stringContaining('variant-lightweight'));
54
+ });
55
+ });
@@ -0,0 +1,41 @@
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 __1 = require("..");
8
+ const testing_1 = require("../utils/testing");
9
+ const react_2 = require("@testing-library/react");
10
+ const jest_axe_1 = require("jest-axe");
11
+ require("babel-polyfill");
12
+ expect.extend(jest_axe_1.toHaveNoViolations);
13
+ describe('Spinner', () => {
14
+ afterEach(() => {
15
+ react_2.cleanup();
16
+ });
17
+ testing_1.behavesAsComponent({
18
+ Component: __1.Spinner
19
+ });
20
+ testing_1.checkExports('Spinner', {
21
+ default: __1.Spinner
22
+ });
23
+ it('should have no axe violations', async () => {
24
+ const { container } = react_2.render(<__1.Spinner />);
25
+ const results = await jest_axe_1.axe(container);
26
+ expect(results).toHaveNoViolations();
27
+ });
28
+ it('should respect size arguments', () => {
29
+ const expectSize = (input, expectedSize) => {
30
+ const { container } = react_2.render(<__1.Spinner size={input}/>);
31
+ const svg = container.querySelector('svg');
32
+ expect(svg.getAttribute('height')).toEqual(expectedSize);
33
+ expect(svg.getAttribute('width')).toEqual(expectedSize);
34
+ };
35
+ // default: medium
36
+ expectSize(undefined, '32px');
37
+ expectSize('small', '16px');
38
+ expectSize('medium', '32px');
39
+ expectSize('large', '64px');
40
+ });
41
+ });
@@ -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 = __importDefault(require("react"));
7
+ const __1 = require("..");
8
+ const testing_1 = require("../utils/testing");
9
+ const react_2 = require("@testing-library/react");
10
+ const jest_axe_1 = require("jest-axe");
11
+ require("babel-polyfill");
12
+ expect.extend(jest_axe_1.toHaveNoViolations);
13
+ describe('StateLabel', () => {
14
+ testing_1.behavesAsComponent({
15
+ Component: __1.StateLabel,
16
+ toRender: () => <__1.StateLabel status="issueOpened">Open</__1.StateLabel>,
17
+ options: {
18
+ // Rendering a StyledOcticon seems to break getComputedStyles, which
19
+ // the sx prop implementation test uses to make sure the prop is working correctly.
20
+ // Despite my best efforts, I cannot figure out why this is happening. So,
21
+ // unfortunately, we will simply skip this test.
22
+ skipSx: true
23
+ }
24
+ });
25
+ testing_1.checkExports('StateLabel', {
26
+ default: __1.StateLabel
27
+ });
28
+ it('should have no axe violations', async () => {
29
+ const { container } = react_2.render(<__1.StateLabel status="issueOpened"/>);
30
+ const results = await jest_axe_1.axe(container);
31
+ expect(results).toHaveNoViolations();
32
+ react_2.cleanup();
33
+ });
34
+ it('respects the status prop', () => {
35
+ expect(testing_1.render(<__1.StateLabel status="issueOpened"/>)).toMatchSnapshot();
36
+ expect(testing_1.render(<__1.StateLabel status="issueClosed"/>)).toMatchSnapshot();
37
+ expect(testing_1.render(<__1.StateLabel status="pullMerged"/>)).toMatchSnapshot();
38
+ });
39
+ it('respects the variant prop', () => {
40
+ expect(testing_1.render(<__1.StateLabel variant="small" status="issueOpened"/>)).toMatchSnapshot();
41
+ expect(testing_1.render(<__1.StateLabel variant="normal" status="issueOpened"/>)).toMatchSnapshot();
42
+ });
43
+ it('renders children', () => {
44
+ expect(testing_1.render(<__1.StateLabel status="issueOpened">hi</__1.StateLabel>)).toMatchSnapshot();
45
+ });
46
+ });
@@ -0,0 +1,28 @@
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 octicons_react_1 = require("@primer/octicons-react");
8
+ const __1 = require("..");
9
+ const testing_1 = require("../utils/testing");
10
+ const react_2 = require("@testing-library/react");
11
+ const jest_axe_1 = require("jest-axe");
12
+ require("babel-polyfill");
13
+ expect.extend(jest_axe_1.toHaveNoViolations);
14
+ describe('StyledOcticon', () => {
15
+ testing_1.behavesAsComponent({
16
+ Component: __1.StyledOcticon,
17
+ toRender: () => <__1.StyledOcticon icon={octicons_react_1.XIcon}/>
18
+ });
19
+ testing_1.checkExports('StyledOcticon', {
20
+ default: __1.StyledOcticon
21
+ });
22
+ it('should have no axe violations', async () => {
23
+ const { container } = react_2.render(<__1.StyledOcticon icon={octicons_react_1.XIcon}/>);
24
+ const results = await jest_axe_1.axe(container);
25
+ expect(results).toHaveNoViolations();
26
+ react_2.cleanup();
27
+ });
28
+ });
@@ -0,0 +1,47 @@
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 __1 = require("..");
8
+ const testing_1 = require("../utils/testing");
9
+ const react_2 = require("@testing-library/react");
10
+ const jest_axe_1 = require("jest-axe");
11
+ require("babel-polyfill");
12
+ expect.extend(jest_axe_1.toHaveNoViolations);
13
+ describe('SubNav', () => {
14
+ testing_1.behavesAsComponent({ Component: __1.SubNav });
15
+ testing_1.checkExports('SubNav', {
16
+ default: __1.SubNav
17
+ });
18
+ it('should have no axe violations', async () => {
19
+ const { container } = react_2.render(<__1.SubNav />);
20
+ const results = await jest_axe_1.axe(container);
21
+ expect(results).toHaveNoViolations();
22
+ react_2.cleanup();
23
+ });
24
+ it('renders a <nav>', () => {
25
+ expect(testing_1.render(<__1.SubNav />).type).toEqual('nav');
26
+ });
27
+ it('adds the SubNav class', () => {
28
+ expect(testing_1.rendersClass(<__1.SubNav />, 'SubNav')).toEqual(true);
29
+ });
30
+ it('sets aria-label to the "label" prop', () => {
31
+ expect(testing_1.render(<__1.SubNav label="foo"/>).props['aria-label']).toEqual('foo');
32
+ });
33
+ it('wraps its children in an "SubNav-body" div', () => {
34
+ const children = <b>yo</b>;
35
+ const wrapper = testing_1.mount(<__1.SubNav>{children}</__1.SubNav>);
36
+ const body = wrapper.find('.SubNav-body');
37
+ expect(body.exists()).toEqual(true);
38
+ expect(body.childAt(0).type()).toEqual('b');
39
+ });
40
+ it('respects the "actions" prop', () => {
41
+ const content = <h1>hi!</h1>;
42
+ const wrapper = testing_1.mount(<__1.SubNav actions={content}/>);
43
+ const actions = wrapper.find('.SubNav-actions');
44
+ expect(actions.exists()).toEqual(true);
45
+ expect(actions.text()).toEqual('hi!');
46
+ });
47
+ });
@@ -0,0 +1,31 @@
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 __1 = require("..");
8
+ const testing_1 = require("../utils/testing");
9
+ const react_2 = require("@testing-library/react");
10
+ const jest_axe_1 = require("jest-axe");
11
+ require("babel-polyfill");
12
+ expect.extend(jest_axe_1.toHaveNoViolations);
13
+ describe('SubNav.Link', () => {
14
+ testing_1.behavesAsComponent({ Component: __1.SubNav.Link });
15
+ it('renders an <a> by default', () => {
16
+ expect(testing_1.render(<__1.SubNav.Link />).type).toEqual('a');
17
+ });
18
+ it('should have no axe violations', async () => {
19
+ const { container } = react_2.render(<__1.SubNav.Link />);
20
+ const results = await jest_axe_1.axe(container);
21
+ expect(results).toHaveNoViolations();
22
+ react_2.cleanup();
23
+ });
24
+ it('respects the "selected" prop', () => {
25
+ expect(testing_1.render(<__1.SubNav.Link selected/>)).toMatchSnapshot();
26
+ });
27
+ it('adds activeClassName={SELECTED_CLASS} when it gets a "to" prop', () => {
28
+ const Link = ({ theme: _ignoredTheme, ...props }) => <div {...props}/>;
29
+ expect(testing_1.render(<__1.SubNav.Link as={Link} to="#"/>)).toMatchSnapshot();
30
+ });
31
+ });