@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 __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
+ });
@@ -0,0 +1,32 @@
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('TabNav', () => {
14
+ testing_1.behavesAsComponent({ Component: __1.TabNav });
15
+ testing_1.checkExports('TabNav', {
16
+ default: __1.TabNav
17
+ });
18
+ describe('TabNav.Link', () => {
19
+ testing_1.behavesAsComponent({ Component: __1.TabNav.Link });
20
+ });
21
+ it('should have no axe violations', async () => {
22
+ const { container } = react_2.render(<__1.TabNav aria-label="main"/>);
23
+ const results = await jest_axe_1.axe(container);
24
+ expect(results).toHaveNoViolations();
25
+ react_2.cleanup();
26
+ });
27
+ it('sets aria-label appropriately', () => {
28
+ const { getByLabelText } = react_2.render(<__1.TabNav aria-label="stuff"/>);
29
+ expect(getByLabelText('stuff')).toBeTruthy();
30
+ expect(getByLabelText('stuff').tagName).toEqual('NAV');
31
+ });
32
+ });
@@ -0,0 +1,71 @@
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 theme_1 = __importDefault(require("../theme"));
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('Text', () => {
15
+ testing_1.behavesAsComponent({ Component: __1.Text });
16
+ testing_1.checkExports('Text', {
17
+ default: __1.Text
18
+ });
19
+ it('renders a <span> by default', () => {
20
+ expect(testing_1.render(<__1.Text />).type).toEqual('span');
21
+ });
22
+ it('should have no axe violations', async () => {
23
+ const { container } = react_2.render(<__1.Text>hello</__1.Text>);
24
+ const results = await jest_axe_1.axe(container);
25
+ expect(results).toHaveNoViolations();
26
+ react_2.cleanup();
27
+ });
28
+ it('renders fontSize', () => {
29
+ for (const fontSize of theme_1.default.fontSizes) {
30
+ expect(testing_1.render(<__1.Text fontSize={fontSize}/>)).toHaveStyleRule('font-size', testing_1.px(fontSize));
31
+ }
32
+ });
33
+ it('renders responsive fontSize', () => {
34
+ expect(testing_1.renderStyles(<__1.Text fontSize={[1, 2]}/>)).toEqual({
35
+ 'font-size': testing_1.px(theme_1.default.fontSizes[1]),
36
+ [`@media screen and (min-width:${testing_1.px(theme_1.default.breakpoints[0])})`]: {
37
+ 'font-size': testing_1.px(theme_1.default.fontSizes[2])
38
+ }
39
+ });
40
+ });
41
+ it('renders responsive lineHeight', () => {
42
+ expect(testing_1.renderStyles(<__1.Text lineHeight={['condensed', 'default']}/>)).toEqual({
43
+ 'line-height': String(theme_1.default.lineHeights.condensed),
44
+ [`@media screen and (min-width:${testing_1.px(theme_1.default.breakpoints[0])})`]: {
45
+ 'line-height': String(theme_1.default.lineHeights.default)
46
+ }
47
+ });
48
+ });
49
+ it('respects fontWeight', () => {
50
+ expect(testing_1.render(<__1.Text fontWeight="bold"/>)).toHaveStyleRule('font-weight', '600');
51
+ expect(testing_1.render(<__1.Text fontWeight="normal"/>)).toHaveStyleRule('font-weight', '400');
52
+ });
53
+ it('respects the "fontStyle" prop', () => {
54
+ expect(testing_1.render(<__1.Text fontStyle="italic"/>)).toHaveStyleRule('font-style', 'italic');
55
+ expect(testing_1.render(<__1.Text as="i" fontStyle="normal"/>)).toHaveStyleRule('font-style', 'normal');
56
+ });
57
+ it('respects lineHeight', () => {
58
+ for (const [name, value] of Object.entries(theme_1.default.lineHeights)) {
59
+ expect(testing_1.render(<__1.Text lineHeight={name}/>)).toHaveStyleRule('line-height', String(value));
60
+ }
61
+ });
62
+ it('respects fontFamily="mono"', () => {
63
+ // styled-components removes the whitespace between font-family values
64
+ const mono = theme_1.default.fonts.mono.replace(/, /g, ',');
65
+ expect(testing_1.render(<__1.Text fontFamily="mono"/>)).toHaveStyleRule('font-family', mono);
66
+ });
67
+ it('respects other values for fontSize', () => {
68
+ expect(testing_1.render(<__1.Text fontSize="2em"/>)).toHaveStyleRule('font-size', '2em');
69
+ expect(testing_1.render(<__1.Text fontSize={100}/>)).toHaveStyleRule('font-size', '100px');
70
+ });
71
+ });
@@ -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
+ 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('TextInput', () => {
14
+ testing_1.behavesAsComponent({ Component: __1.TextInput, options: { skipAs: true } });
15
+ testing_1.checkExports('TextInput', {
16
+ default: __1.TextInput
17
+ });
18
+ it('should have no axe violations', async () => {
19
+ const { container } = react_2.render(<__1.TextInput aria-label="zipcode" name="zipcode" variant="small"/>);
20
+ const results = await jest_axe_1.axe(container);
21
+ expect(results).toHaveNoViolations();
22
+ react_2.cleanup();
23
+ });
24
+ it('renders', () => {
25
+ expect(testing_1.render(<__1.TextInput name="zipcode"/>)).toMatchSnapshot();
26
+ });
27
+ it('renders small', () => {
28
+ expect(testing_1.render(<__1.TextInput name="zipcode" variant="small"/>)).toMatchSnapshot();
29
+ });
30
+ it('renders large', () => {
31
+ expect(testing_1.render(<__1.TextInput name="zipcode" variant="large"/>)).toMatchSnapshot();
32
+ });
33
+ it('renders block', () => {
34
+ expect(testing_1.render(<__1.TextInput name="zipcode" block/>)).toMatchSnapshot();
35
+ });
36
+ it('should call onChange prop with input value', () => {
37
+ const onChangeMock = jest.fn();
38
+ const component = testing_1.mount(<__1.TextInput onChange={onChangeMock} value="test"/>);
39
+ component.find('input').simulate('change');
40
+ expect(onChangeMock).toHaveBeenCalled();
41
+ });
42
+ it('should render a password input', () => {
43
+ expect(testing_1.render(<__1.TextInput name="password" type="password"/>)).toMatchSnapshot();
44
+ });
45
+ });