@primer/components 31.2.0-rc.fbb10090 → 31.2.1-rc.32ed6e21

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 (503) 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 +26 -0
  5. package/dist/browser.esm.js +671 -654
  6. package/dist/browser.esm.js.map +1 -1
  7. package/dist/browser.umd.js +223 -206
  8. package/dist/browser.umd.js.map +1 -1
  9. package/docs/content/ActionList2.mdx +359 -0
  10. package/docs/content/{Box.md → Box.mdx} +22 -0
  11. package/docs/content/StateLabel.md +5 -4
  12. package/docs/content/getting-started.md +1 -1
  13. package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +1 -3
  14. package/docs/src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js +1 -1
  15. package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +17 -0
  16. package/docs/src/component-checklist.js +81 -0
  17. package/lib/ActionList/Divider.jsx +29 -0
  18. package/lib/ActionList/Group.jsx +23 -0
  19. package/lib/ActionList/Header.jsx +66 -0
  20. package/lib/ActionList/Item.js +55 -71
  21. package/lib/ActionList/Item.jsx +288 -0
  22. package/lib/ActionList/List.jsx +138 -0
  23. package/lib/ActionList/index.js +12 -23
  24. package/lib/ActionList2/Description.d.ts +12 -0
  25. package/lib/ActionList2/Description.js +57 -0
  26. package/lib/ActionList2/Description.jsx +29 -0
  27. package/lib/ActionList2/Divider.d.ts +5 -0
  28. package/lib/ActionList2/Divider.js +35 -0
  29. package/lib/ActionList2/Divider.jsx +22 -0
  30. package/lib/ActionList2/Group.d.ts +37 -0
  31. package/lib/ActionList2/Group.js +106 -0
  32. package/lib/ActionList2/Group.jsx +54 -0
  33. package/lib/ActionList2/Header.d.ts +26 -0
  34. package/lib/ActionList2/Header.js +55 -0
  35. package/lib/ActionList2/Header.jsx +36 -0
  36. package/lib/ActionList2/Item.d.ts +63 -0
  37. package/lib/ActionList2/Item.js +242 -0
  38. package/lib/ActionList2/Item.jsx +174 -0
  39. package/lib/ActionList2/LinkItem.d.ts +17 -0
  40. package/lib/ActionList2/LinkItem.js +57 -0
  41. package/lib/ActionList2/LinkItem.jsx +28 -0
  42. package/lib/ActionList2/List.d.ts +26 -0
  43. package/lib/ActionList2/List.js +59 -0
  44. package/lib/ActionList2/List.jsx +41 -0
  45. package/lib/ActionList2/Selection.d.ts +5 -0
  46. package/lib/ActionList2/Selection.js +84 -0
  47. package/lib/ActionList2/Selection.jsx +50 -0
  48. package/lib/ActionList2/Visuals.d.ts +9 -0
  49. package/lib/ActionList2/Visuals.js +90 -0
  50. package/lib/ActionList2/Visuals.jsx +48 -0
  51. package/lib/ActionList2/index.d.ts +36 -0
  52. package/lib/ActionList2/index.js +29 -0
  53. package/lib/ActionMenu.jsx +73 -0
  54. package/lib/AnchoredOverlay/AnchoredOverlay.jsx +100 -0
  55. package/lib/AnchoredOverlay/index.js +4 -12
  56. package/lib/Autocomplete/Autocomplete.d.ts +28 -28
  57. package/lib/Autocomplete/Autocomplete.jsx +100 -0
  58. package/lib/Autocomplete/AutocompleteContext.jsx +5 -0
  59. package/lib/Autocomplete/AutocompleteInput.d.ts +28 -28
  60. package/lib/Autocomplete/AutocompleteInput.jsx +113 -0
  61. package/lib/Autocomplete/AutocompleteMenu.jsx +190 -0
  62. package/lib/Autocomplete/AutocompleteOverlay.jsx +55 -0
  63. package/lib/Autocomplete/index.js +7 -14
  64. package/lib/Avatar.jsx +34 -0
  65. package/lib/AvatarPair.jsx +29 -0
  66. package/lib/AvatarStack.jsx +151 -0
  67. package/lib/BaseStyles.jsx +65 -0
  68. package/lib/BorderBox.jsx +18 -0
  69. package/lib/Box.jsx +10 -0
  70. package/lib/BranchName.jsx +20 -0
  71. package/lib/Breadcrumbs.jsx +74 -0
  72. package/lib/Button/Button.d.ts +25 -25
  73. package/lib/Button/Button.jsx +60 -0
  74. package/lib/Button/ButtonBase.jsx +36 -0
  75. package/lib/Button/ButtonClose.d.ts +45 -45
  76. package/lib/Button/ButtonClose.jsx +55 -0
  77. package/lib/Button/ButtonDanger.d.ts +25 -25
  78. package/lib/Button/ButtonDanger.jsx +63 -0
  79. package/lib/Button/ButtonGroup.jsx +55 -0
  80. package/lib/Button/ButtonInvisible.d.ts +25 -25
  81. package/lib/Button/ButtonInvisible.jsx +52 -0
  82. package/lib/Button/ButtonOutline.d.ts +25 -25
  83. package/lib/Button/ButtonOutline.jsx +63 -0
  84. package/lib/Button/ButtonPrimary.d.ts +25 -25
  85. package/lib/Button/ButtonPrimary.jsx +62 -0
  86. package/lib/Button/ButtonStyles.jsx +37 -0
  87. package/lib/Button/ButtonTableList.jsx +49 -0
  88. package/lib/Button/index.js +21 -70
  89. package/lib/Caret.jsx +93 -0
  90. package/lib/CircleBadge.jsx +43 -0
  91. package/lib/CircleOcticon.d.ts +42 -42
  92. package/lib/CircleOcticon.jsx +21 -0
  93. package/lib/CounterLabel.jsx +44 -0
  94. package/lib/Details.jsx +21 -0
  95. package/lib/Dialog/ConfirmationDialog.jsx +146 -0
  96. package/lib/Dialog/Dialog.js +1 -0
  97. package/lib/Dialog/Dialog.jsx +273 -0
  98. package/lib/Dialog.d.ts +45 -45
  99. package/lib/Dialog.jsx +131 -0
  100. package/lib/Dropdown.d.ts +176 -176
  101. package/lib/Dropdown.jsx +134 -0
  102. package/lib/DropdownMenu/DropdownButton.d.ts +46 -46
  103. package/lib/DropdownMenu/DropdownButton.jsx +14 -0
  104. package/lib/DropdownMenu/DropdownMenu.jsx +70 -0
  105. package/lib/DropdownMenu/index.js +6 -20
  106. package/lib/DropdownStyles.js +18 -26
  107. package/lib/FilterList.d.ts +42 -42
  108. package/lib/FilterList.jsx +63 -0
  109. package/lib/FilteredActionList/FilteredActionList.jsx +100 -0
  110. package/lib/FilteredActionList/index.js +4 -12
  111. package/lib/FilteredSearch.jsx +29 -0
  112. package/lib/Flash.jsx +70 -0
  113. package/lib/Flex.jsx +15 -0
  114. package/lib/FormGroup.jsx +25 -0
  115. package/lib/Grid.jsx +15 -0
  116. package/lib/Header.jsx +90 -0
  117. package/lib/Heading.jsx +21 -0
  118. package/lib/Label.jsx +84 -0
  119. package/lib/LabelGroup.jsx +19 -0
  120. package/lib/Link.jsx +38 -0
  121. package/lib/NewButton/button-counter.d.ts +6 -0
  122. package/lib/NewButton/button-counter.js +31 -0
  123. package/lib/NewButton/button-counter.jsx +14 -0
  124. package/lib/NewButton/button.d.ts +13 -0
  125. package/lib/NewButton/button.js +308 -0
  126. package/lib/NewButton/button.jsx +279 -0
  127. package/lib/NewButton/index.d.ts +14 -0
  128. package/lib/NewButton/index.js +8 -0
  129. package/lib/NewButton/types.d.ts +32 -0
  130. package/lib/NewButton/types.js +2 -0
  131. package/lib/Overlay.js +3 -1
  132. package/lib/Overlay.jsx +156 -0
  133. package/lib/Pagehead.jsx +18 -0
  134. package/lib/Pagination/Pagination.jsx +163 -0
  135. package/lib/Pagination/index.js +6 -12
  136. package/lib/Pagination/model.jsx +174 -0
  137. package/lib/PointerBox.jsx +25 -0
  138. package/lib/Popover.jsx +210 -0
  139. package/lib/Portal/Portal.js +3 -2
  140. package/lib/Portal/Portal.jsx +79 -0
  141. package/lib/Portal/index.js +5 -16
  142. package/lib/Position.d.ts +4 -4
  143. package/lib/Position.jsx +46 -0
  144. package/lib/ProgressBar.jsx +39 -0
  145. package/lib/SelectMenu/SelectMenu.d.ts +246 -246
  146. package/lib/SelectMenu/SelectMenu.jsx +114 -0
  147. package/lib/SelectMenu/SelectMenuContext.jsx +5 -0
  148. package/lib/SelectMenu/SelectMenuDivider.jsx +43 -0
  149. package/lib/SelectMenu/SelectMenuFilter.jsx +59 -0
  150. package/lib/SelectMenu/SelectMenuFooter.jsx +46 -0
  151. package/lib/SelectMenu/SelectMenuHeader.jsx +44 -0
  152. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  153. package/lib/SelectMenu/SelectMenuItem.jsx +143 -0
  154. package/lib/SelectMenu/SelectMenuList.jsx +60 -0
  155. package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +21 -0
  156. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  157. package/lib/SelectMenu/SelectMenuModal.jsx +119 -0
  158. package/lib/SelectMenu/SelectMenuTab.jsx +93 -0
  159. package/lib/SelectMenu/SelectMenuTabPanel.jsx +43 -0
  160. package/lib/SelectMenu/SelectMenuTabs.jsx +58 -0
  161. package/lib/SelectMenu/hooks/useKeyboardNav.js +80 -96
  162. package/lib/SelectMenu/index.js +7 -14
  163. package/lib/SelectPanel/SelectPanel.jsx +105 -0
  164. package/lib/SelectPanel/index.js +4 -12
  165. package/lib/SideNav.jsx +177 -0
  166. package/lib/Spinner.jsx +35 -0
  167. package/lib/StateLabel.d.ts +1 -1
  168. package/lib/StateLabel.js +6 -1
  169. package/lib/StateLabel.jsx +94 -0
  170. package/lib/StyledOcticon.jsx +20 -0
  171. package/lib/SubNav.jsx +104 -0
  172. package/lib/TabNav.jsx +60 -0
  173. package/lib/Text.jsx +14 -0
  174. package/lib/TextInput.jsx +23 -0
  175. package/lib/TextInputWithTokens.d.ts +28 -28
  176. package/lib/TextInputWithTokens.jsx +218 -0
  177. package/lib/ThemeProvider.jsx +130 -0
  178. package/lib/Timeline.d.ts +43 -43
  179. package/lib/Timeline.jsx +124 -0
  180. package/lib/Token/AvatarToken.d.ts +1 -1
  181. package/lib/Token/AvatarToken.jsx +54 -0
  182. package/lib/Token/IssueLabelToken.d.ts +1 -1
  183. package/lib/Token/IssueLabelToken.jsx +125 -0
  184. package/lib/Token/Token.d.ts +1 -1
  185. package/lib/Token/Token.jsx +103 -0
  186. package/lib/Token/TokenBase.jsx +88 -0
  187. package/lib/Token/_RemoveTokenButton.jsx +108 -0
  188. package/lib/Token/_TokenTextContainer.jsx +49 -0
  189. package/lib/Token/index.js +11 -30
  190. package/lib/Tooltip.jsx +246 -0
  191. package/lib/Truncate.jsx +27 -0
  192. package/lib/UnderlineNav.jsx +90 -0
  193. package/lib/_TextInputWrapper.js +2 -2
  194. package/lib/_TextInputWrapper.jsx +120 -0
  195. package/lib/_UnstyledTextInput.jsx +22 -0
  196. package/lib/__tests__/ActionList.test.jsx +49 -0
  197. package/lib/__tests__/ActionList.types.test.jsx +45 -0
  198. package/lib/__tests__/ActionList2.test.d.ts +1 -0
  199. package/lib/__tests__/ActionList2.test.js +53 -0
  200. package/lib/__tests__/ActionList2.test.jsx +46 -0
  201. package/lib/__tests__/ActionMenu.test.jsx +124 -0
  202. package/lib/__tests__/AnchoredOverlay.test.js +4 -2
  203. package/lib/__tests__/AnchoredOverlay.test.jsx +121 -0
  204. package/lib/__tests__/Autocomplete.test.jsx +299 -0
  205. package/lib/__tests__/Avatar.test.jsx +42 -0
  206. package/lib/__tests__/AvatarStack.test.jsx +43 -0
  207. package/lib/__tests__/BorderBox.test.jsx +36 -0
  208. package/lib/__tests__/Box.test.jsx +41 -0
  209. package/lib/__tests__/BranchName.test.jsx +27 -0
  210. package/lib/__tests__/Breadcrumbs.test.jsx +28 -0
  211. package/lib/__tests__/BreadcrumbsItem.test.jsx +31 -0
  212. package/lib/__tests__/Button.test.jsx +100 -0
  213. package/lib/__tests__/Caret.test.jsx +37 -0
  214. package/lib/__tests__/CircleBadge.test.jsx +55 -0
  215. package/lib/__tests__/CircleOcticon.test.jsx +45 -0
  216. package/lib/__tests__/ConfirmationDialog.test.jsx +119 -0
  217. package/lib/__tests__/CounterLabel.test.jsx +36 -0
  218. package/lib/__tests__/Details.test.jsx +85 -0
  219. package/lib/__tests__/Dialog.test.jsx +139 -0
  220. package/lib/__tests__/Dropdown.test.jsx +49 -0
  221. package/lib/__tests__/DropdownMenu.test.jsx +119 -0
  222. package/lib/__tests__/FilterList.test.jsx +27 -0
  223. package/lib/__tests__/FilterListItem.test.jsx +31 -0
  224. package/lib/__tests__/FilteredSearch.test.jsx +27 -0
  225. package/lib/__tests__/Flash.test.jsx +36 -0
  226. package/lib/__tests__/Flex.test.jsx +51 -0
  227. package/lib/__tests__/FormGroup.test.jsx +36 -0
  228. package/lib/__tests__/Grid.test.jsx +69 -0
  229. package/lib/__tests__/Header.test.jsx +45 -0
  230. package/lib/__tests__/Heading.test.jsx +71 -0
  231. package/lib/__tests__/KeyPaths.types.test.d.ts +2 -1
  232. package/lib/__tests__/KeyPaths.types.test.js +5 -8
  233. package/lib/__tests__/Label.test.jsx +33 -0
  234. package/lib/__tests__/LabelGroup.test.jsx +29 -0
  235. package/lib/__tests__/Link.test.jsx +43 -0
  236. package/lib/__tests__/Merge.types.test.js +13 -19
  237. package/lib/__tests__/NewButton.test.d.ts +1 -0
  238. package/lib/__tests__/NewButton.test.js +95 -0
  239. package/lib/__tests__/NewButton.test.jsx +61 -0
  240. package/lib/__tests__/Overlay.test.jsx +105 -0
  241. package/lib/__tests__/Pagehead.test.jsx +25 -0
  242. package/lib/__tests__/Pagination/Pagination.test.jsx +32 -0
  243. package/lib/__tests__/Pagination/PaginationModel.test.jsx +118 -0
  244. package/lib/__tests__/PointerBox.test.jsx +33 -0
  245. package/lib/__tests__/Popover.test.jsx +58 -0
  246. package/lib/__tests__/Portal.test.jsx +102 -0
  247. package/lib/__tests__/Position.test.jsx +96 -0
  248. package/lib/__tests__/ProgressBar.test.jsx +38 -0
  249. package/lib/__tests__/SelectMenu.test.jsx +120 -0
  250. package/lib/__tests__/SelectPanel.test.jsx +48 -0
  251. package/lib/__tests__/SideNav.test.jsx +55 -0
  252. package/lib/__tests__/Spinner.test.jsx +41 -0
  253. package/lib/__tests__/StateLabel.test.jsx +46 -0
  254. package/lib/__tests__/StyledOcticon.test.jsx +28 -0
  255. package/lib/__tests__/SubNav.test.jsx +47 -0
  256. package/lib/__tests__/SubNavLink.test.jsx +31 -0
  257. package/lib/__tests__/TabNav.test.jsx +32 -0
  258. package/lib/__tests__/Text.test.jsx +71 -0
  259. package/lib/__tests__/TextInput.test.jsx +45 -0
  260. package/lib/__tests__/TextInputWithTokens.test.js +1 -10
  261. package/lib/__tests__/TextInputWithTokens.test.jsx +302 -0
  262. package/lib/__tests__/ThemeProvider.test.jsx +314 -0
  263. package/lib/__tests__/Timeline.test.jsx +51 -0
  264. package/lib/__tests__/Token.test.jsx +93 -0
  265. package/lib/__tests__/Tooltip.test.jsx +46 -0
  266. package/lib/__tests__/Truncate.test.jsx +41 -0
  267. package/lib/__tests__/UnderlineNav.test.jsx +53 -0
  268. package/lib/__tests__/UnderlineNavLink.test.jsx +31 -0
  269. package/lib/__tests__/behaviors/anchoredPosition.test.js +229 -376
  270. package/lib/__tests__/behaviors/focusTrap.test.jsx +184 -0
  271. package/lib/__tests__/behaviors/focusZone.test.jsx +406 -0
  272. package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +58 -0
  273. package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +145 -216
  274. package/lib/__tests__/filterObject.test.js +48 -27
  275. package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +29 -0
  276. package/lib/__tests__/hooks/useOnEscapePress.test.jsx +19 -0
  277. package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +63 -0
  278. package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +61 -0
  279. package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +56 -0
  280. package/lib/__tests__/theme.test.js +33 -34
  281. package/lib/__tests__/themeGet.test.js +12 -23
  282. package/lib/__tests__/useSafeTimeout.test.jsx +36 -0
  283. package/lib/__tests__/utils/createSlots.test.d.ts +1 -0
  284. package/lib/__tests__/utils/createSlots.test.js +75 -0
  285. package/lib/__tests__/utils/createSlots.test.jsx +57 -0
  286. package/lib/behaviors/anchoredPosition.js +205 -234
  287. package/lib/behaviors/focusTrap.js +121 -157
  288. package/lib/behaviors/focusZone.js +434 -509
  289. package/lib/behaviors/scrollIntoViewingArea.js +18 -35
  290. package/lib/constants.js +39 -43
  291. package/lib/drafts.d.ts +8 -0
  292. package/lib/drafts.js +21 -0
  293. package/lib/hooks/index.js +16 -60
  294. package/lib/hooks/useAnchoredPosition.js +32 -39
  295. package/lib/hooks/useCombinedRefs.d.ts +2 -2
  296. package/lib/hooks/useCombinedRefs.js +32 -38
  297. package/lib/hooks/useDetails.jsx +39 -0
  298. package/lib/hooks/useDialog.js +72 -96
  299. package/lib/hooks/useFocusTrap.js +43 -60
  300. package/lib/hooks/useFocusZone.js +54 -50
  301. package/lib/hooks/useOnEscapePress.js +25 -36
  302. package/lib/hooks/useOnOutsideClick.jsx +61 -0
  303. package/lib/hooks/useOpenAndCloseFocus.js +22 -34
  304. package/lib/hooks/useOverlay.jsx +15 -0
  305. package/lib/hooks/useProvidedRefOrCreate.js +10 -14
  306. package/lib/hooks/useProvidedStateOrCreate.js +13 -16
  307. package/lib/hooks/useRenderForcingRef.js +13 -17
  308. package/lib/hooks/useResizeObserver.js +15 -18
  309. package/lib/hooks/useSafeTimeout.js +22 -30
  310. package/lib/hooks/useScrollFlash.js +16 -23
  311. package/lib/index.d.ts +2 -0
  312. package/lib/index.js +163 -636
  313. package/lib/polyfills/eventListenerSignal.js +37 -45
  314. package/lib/stories/ActionList2.stories.js +909 -0
  315. package/lib/stories/NewButton.stories.js +230 -0
  316. package/lib/stories/TextInput.stories.js +144 -0
  317. package/lib/stories/Token.stories.js +19 -2
  318. package/lib/sx.d.ts +2 -0
  319. package/lib/sx.js +10 -14
  320. package/lib/theme-preval.js +65 -2945
  321. package/lib/theme.js +3 -12
  322. package/lib/utils/create-slots.d.ts +17 -0
  323. package/lib/utils/create-slots.js +105 -0
  324. package/lib/utils/create-slots.jsx +65 -0
  325. package/lib/utils/deprecate.jsx +59 -0
  326. package/lib/utils/isNumeric.jsx +7 -0
  327. package/lib/utils/iterateFocusableElements.js +63 -85
  328. package/lib/utils/ssr.jsx +6 -0
  329. package/lib/utils/test-deprecations.jsx +20 -0
  330. package/lib/utils/test-helpers.jsx +8 -0
  331. package/lib/utils/test-matchers.jsx +100 -0
  332. package/lib/utils/testing.d.ts +20 -61
  333. package/lib/utils/testing.jsx +206 -0
  334. package/lib/utils/theme.js +33 -47
  335. package/lib/utils/types/AriaRole.js +2 -1
  336. package/lib/utils/types/ComponentProps.js +2 -1
  337. package/lib/utils/types/Flatten.js +2 -1
  338. package/lib/utils/types/KeyPaths.d.ts +1 -1
  339. package/lib/utils/types/KeyPaths.js +2 -1
  340. package/lib/utils/types/MandateProps.js +16 -1
  341. package/lib/utils/types/Merge.js +2 -1
  342. package/lib/utils/types/index.js +16 -69
  343. package/lib/utils/uniqueId.js +5 -8
  344. package/lib/utils/use-force-update.d.ts +1 -0
  345. package/lib/utils/use-force-update.js +13 -0
  346. package/lib/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  347. package/lib/utils/useIsomorphicLayoutEffect.js +9 -0
  348. package/lib/utils/userAgent.js +8 -12
  349. package/lib-esm/ActionList/Item.js +56 -72
  350. package/lib-esm/ActionList2/Description.d.ts +12 -0
  351. package/lib-esm/ActionList2/Description.js +41 -0
  352. package/lib-esm/ActionList2/Divider.d.ts +5 -0
  353. package/lib-esm/ActionList2/Divider.js +23 -0
  354. package/lib-esm/ActionList2/Group.d.ts +37 -0
  355. package/lib-esm/ActionList2/Group.js +87 -0
  356. package/lib-esm/ActionList2/Header.d.ts +26 -0
  357. package/lib-esm/ActionList2/Header.js +44 -0
  358. package/lib-esm/ActionList2/Item.d.ts +63 -0
  359. package/lib-esm/ActionList2/Item.js +208 -0
  360. package/lib-esm/ActionList2/LinkItem.d.ts +17 -0
  361. package/lib-esm/ActionList2/LinkItem.js +43 -0
  362. package/lib-esm/ActionList2/List.d.ts +26 -0
  363. package/lib-esm/ActionList2/List.js +37 -0
  364. package/lib-esm/ActionList2/Selection.d.ts +5 -0
  365. package/lib-esm/ActionList2/Selection.js +66 -0
  366. package/lib-esm/ActionList2/Visuals.d.ts +9 -0
  367. package/lib-esm/ActionList2/Visuals.js +68 -0
  368. package/lib-esm/ActionList2/index.d.ts +36 -0
  369. package/lib-esm/ActionList2/index.js +33 -0
  370. package/lib-esm/Autocomplete/Autocomplete.d.ts +28 -28
  371. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +28 -28
  372. package/lib-esm/Button/Button.d.ts +25 -25
  373. package/lib-esm/Button/ButtonClose.d.ts +45 -45
  374. package/lib-esm/Button/ButtonDanger.d.ts +25 -25
  375. package/lib-esm/Button/ButtonInvisible.d.ts +25 -25
  376. package/lib-esm/Button/ButtonOutline.d.ts +25 -25
  377. package/lib-esm/Button/ButtonPrimary.d.ts +25 -25
  378. package/lib-esm/CircleOcticon.d.ts +42 -42
  379. package/lib-esm/Dialog/Dialog.js +1 -0
  380. package/lib-esm/Dialog.d.ts +45 -45
  381. package/lib-esm/Dropdown.d.ts +176 -176
  382. package/lib-esm/DropdownMenu/DropdownButton.d.ts +46 -46
  383. package/lib-esm/FilterList.d.ts +42 -42
  384. package/lib-esm/NewButton/button-counter.d.ts +6 -0
  385. package/lib-esm/NewButton/button-counter.js +18 -0
  386. package/lib-esm/NewButton/button.d.ts +13 -0
  387. package/lib-esm/NewButton/button.js +287 -0
  388. package/lib-esm/NewButton/index.d.ts +14 -0
  389. package/lib-esm/NewButton/index.js +5 -0
  390. package/lib-esm/NewButton/types.d.ts +32 -0
  391. package/lib-esm/NewButton/types.js +1 -0
  392. package/lib-esm/Overlay.js +2 -1
  393. package/lib-esm/Portal/Portal.js +2 -1
  394. package/lib-esm/Position.d.ts +4 -4
  395. package/lib-esm/SelectMenu/SelectMenu.d.ts +246 -246
  396. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  397. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  398. package/lib-esm/StateLabel.d.ts +1 -1
  399. package/lib-esm/StateLabel.js +7 -2
  400. package/lib-esm/TextInputWithTokens.d.ts +28 -28
  401. package/lib-esm/Timeline.d.ts +43 -43
  402. package/lib-esm/Token/AvatarToken.d.ts +1 -1
  403. package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
  404. package/lib-esm/Token/Token.d.ts +1 -1
  405. package/lib-esm/_TextInputWrapper.js +2 -2
  406. package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
  407. package/lib-esm/__tests__/ActionList2.test.js +41 -0
  408. package/lib-esm/__tests__/AnchoredOverlay.test.js +4 -2
  409. package/lib-esm/__tests__/KeyPaths.types.test.d.ts +2 -1
  410. package/lib-esm/__tests__/NewButton.test.d.ts +1 -0
  411. package/lib-esm/__tests__/NewButton.test.js +84 -0
  412. package/lib-esm/__tests__/TextInputWithTokens.test.js +1 -10
  413. package/lib-esm/__tests__/utils/createSlots.test.d.ts +1 -0
  414. package/lib-esm/__tests__/utils/createSlots.test.js +67 -0
  415. package/lib-esm/drafts.d.ts +8 -0
  416. package/lib-esm/drafts.js +9 -0
  417. package/lib-esm/hooks/useAnchoredPosition.js +2 -1
  418. package/lib-esm/hooks/useCombinedRefs.d.ts +2 -2
  419. package/lib-esm/hooks/useCombinedRefs.js +3 -2
  420. package/lib-esm/hooks/useResizeObserver.js +2 -2
  421. package/lib-esm/index.d.ts +2 -0
  422. package/lib-esm/index.js +1 -0
  423. package/lib-esm/stories/ActionList2.stories.js +797 -0
  424. package/lib-esm/stories/NewButton.stories.js +178 -0
  425. package/lib-esm/stories/TextInput.stories.js +117 -0
  426. package/lib-esm/stories/Token.stories.js +14 -1
  427. package/lib-esm/sx.d.ts +2 -0
  428. package/lib-esm/sx.js +3 -1
  429. package/lib-esm/theme-preval.js +147 -368
  430. package/lib-esm/utils/create-slots.d.ts +17 -0
  431. package/lib-esm/utils/create-slots.js +84 -0
  432. package/lib-esm/utils/testing.d.ts +20 -61
  433. package/lib-esm/utils/types/KeyPaths.d.ts +1 -1
  434. package/lib-esm/utils/use-force-update.d.ts +1 -0
  435. package/lib-esm/utils/use-force-update.js +6 -0
  436. package/lib-esm/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  437. package/lib-esm/utils/useIsomorphicLayoutEffect.js +3 -0
  438. package/migrating.md +1 -1
  439. package/package-lock.json +168 -16
  440. package/package.json +9 -5
  441. package/script/build +3 -1
  442. package/src/ActionList/Item.tsx +49 -65
  443. package/src/ActionList2/Description.tsx +52 -0
  444. package/src/ActionList2/Divider.tsx +24 -0
  445. package/src/ActionList2/Group.tsx +103 -0
  446. package/src/ActionList2/Header.tsx +58 -0
  447. package/src/ActionList2/Item.tsx +246 -0
  448. package/src/ActionList2/LinkItem.tsx +49 -0
  449. package/src/ActionList2/List.tsx +55 -0
  450. package/src/ActionList2/Selection.tsx +60 -0
  451. package/src/ActionList2/Visuals.tsx +76 -0
  452. package/src/ActionList2/index.ts +39 -0
  453. package/src/Dialog/Dialog.tsx +1 -0
  454. package/src/NewButton/button-counter.tsx +15 -0
  455. package/src/NewButton/button.tsx +283 -0
  456. package/src/NewButton/index.ts +10 -0
  457. package/src/NewButton/types.ts +36 -0
  458. package/src/Overlay.tsx +2 -1
  459. package/src/Portal/Portal.tsx +2 -1
  460. package/src/StateLabel.tsx +14 -2
  461. package/src/_TextInputWrapper.tsx +7 -0
  462. package/src/__tests__/ActionList2.test.tsx +47 -0
  463. package/src/__tests__/AnchoredOverlay.test.tsx +2 -2
  464. package/src/__tests__/KeyPaths.types.test.ts +2 -1
  465. package/src/__tests__/NewButton.test.tsx +70 -0
  466. package/src/__tests__/TextInputWithTokens.test.tsx +0 -10
  467. package/src/__tests__/__snapshots__/ActionList.test.tsx.snap +5 -5
  468. package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
  469. package/src/__tests__/__snapshots__/AnchoredOverlay.test.tsx.snap +35 -135
  470. package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +747 -280
  471. package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +1 -0
  472. package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +1 -0
  473. package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +1 -0
  474. package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +1 -0
  475. package/src/__tests__/__snapshots__/NewButton.test.tsx.snap +305 -0
  476. package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +4 -0
  477. package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -0
  478. package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +13 -6
  479. package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +1 -0
  480. package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +66 -0
  481. package/src/__tests__/__snapshots__/Token.test.tsx.snap +17 -0
  482. package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
  483. package/src/__tests__/utils/createSlots.test.tsx +74 -0
  484. package/src/drafts.ts +10 -0
  485. package/src/hooks/useAnchoredPosition.ts +2 -1
  486. package/src/hooks/useCombinedRefs.ts +3 -3
  487. package/src/hooks/useResizeObserver.ts +2 -2
  488. package/src/index.ts +2 -0
  489. package/src/stories/ActionList2.stories.tsx +1291 -0
  490. package/src/stories/Button.stories.tsx +1 -1
  491. package/src/stories/NewButton.stories.tsx +201 -0
  492. package/src/stories/TextInput.stories.tsx +113 -0
  493. package/src/stories/Token.stories.tsx +12 -1
  494. package/src/sx.ts +3 -0
  495. package/src/theme-preval.js +1 -0
  496. package/src/utils/create-slots.tsx +96 -0
  497. package/src/utils/types/KeyPaths.ts +7 -1
  498. package/src/utils/use-force-update.ts +7 -0
  499. package/src/utils/useIsomorphicLayoutEffect.ts +10 -0
  500. package/stats.html +1 -1
  501. package/tsconfig.base.json +20 -0
  502. package/tsconfig.build.json +2 -2
  503. package/tsconfig.json +4 -17
@@ -0,0 +1,49 @@
1
+ import React from 'react'
2
+ import {ForwardRefComponent as PolymorphicForwardRefComponent} from '@radix-ui/react-polymorphic'
3
+ import Link from '../Link'
4
+ import {SxProp, merge} from '../sx'
5
+ import {Item, ItemProps} from './Item'
6
+
7
+ // adopted from React.AnchorHTMLAttributes
8
+ type LinkProps = {
9
+ download?: string
10
+ href?: string
11
+ hrefLang?: string
12
+ media?: string
13
+ ping?: string
14
+ rel?: string
15
+ target?: string
16
+ type?: string
17
+ referrerPolicy?: React.AnchorHTMLAttributes<HTMLAnchorElement>['referrerPolicy']
18
+ }
19
+
20
+ // LinkItem does not support selected, variants, etc.
21
+ type LinkItemProps = Pick<ItemProps, 'children' | 'sx'> & LinkProps
22
+
23
+ export const LinkItem = React.forwardRef(({sx = {}, as: Component, ...props}, forwardedRef) => {
24
+ const styles = {
25
+ // occupy full size of Item
26
+ paddingX: 2,
27
+ paddingY: '6px', // custom value off the scale
28
+ display: 'flex',
29
+ flexGrow: 1, // full width
30
+ borderRadius: 2,
31
+
32
+ // inherit Item styles
33
+ color: 'inherit',
34
+ '&:hover': {color: 'inherit', textDecoration: 'none'}
35
+ }
36
+
37
+ return (
38
+ <Item
39
+ sx={{paddingY: 0, paddingX: 0}}
40
+ _PrivateItemWrapper={({children}) => (
41
+ <Link as={Component} sx={merge(styles, sx as SxProp)} {...props} ref={forwardedRef}>
42
+ {children}
43
+ </Link>
44
+ )}
45
+ >
46
+ {props.children}
47
+ </Item>
48
+ )
49
+ }) as PolymorphicForwardRefComponent<'a', LinkItemProps>
@@ -0,0 +1,55 @@
1
+ import React from 'react'
2
+ import {ForwardRefComponent as PolymorphicForwardRefComponent} from '@radix-ui/react-polymorphic'
3
+ import styled from 'styled-components'
4
+ import sx, {SxProp, merge} from '../sx'
5
+ import {AriaRole} from '../utils/types'
6
+
7
+ export type ListProps = {
8
+ /**
9
+ * `inset` children are offset (vertically and horizontally) from `List`’s edges, `full` children are flush (vertically and horizontally) with `List` edges
10
+ */
11
+ variant?: 'inset' | 'full'
12
+ /**
13
+ * Whether multiple Items or a single Item can be selected.
14
+ */
15
+ selectionVariant?: 'single' | 'multiple'
16
+ /**
17
+ * Display a divider above each `Item` in this `List` when it does not follow a `Header` or `Divider`.
18
+ */
19
+ showDividers?: boolean
20
+ /**
21
+ * The ARIA role describing the function of `List` component. `listbox` or `menu` are a common values.
22
+ */
23
+ role?: AriaRole
24
+ } & SxProp
25
+
26
+ type ContextProps = Pick<ListProps, 'variant' | 'selectionVariant' | 'showDividers'>
27
+ export const ListContext = React.createContext<ContextProps>({})
28
+
29
+ const ListBox = styled.ul<SxProp>(sx)
30
+
31
+ export const List = React.forwardRef<HTMLUListElement, ListProps>(
32
+ (
33
+ {variant = 'inset', selectionVariant, showDividers = false, sx: sxProp = {}, ...props},
34
+ forwardedRef
35
+ ): JSX.Element => {
36
+ const styles = {
37
+ margin: 0,
38
+ paddingInlineStart: 0, // reset ul styles
39
+ paddingY: variant === 'inset' ? 2 : 0
40
+ }
41
+
42
+ return (
43
+ <ListBox
44
+ sx={merge(styles, sxProp as SxProp)}
45
+ aria-multiselectable={selectionVariant === 'multiple' ? true : undefined}
46
+ {...props}
47
+ ref={forwardedRef}
48
+ >
49
+ <ListContext.Provider value={{variant, selectionVariant, showDividers}}>{props.children}</ListContext.Provider>
50
+ </ListBox>
51
+ )
52
+ }
53
+ ) as PolymorphicForwardRefComponent<'ul', ListProps>
54
+
55
+ List.displayName = 'ActionList'
@@ -0,0 +1,60 @@
1
+ import React from 'react'
2
+ import {CheckIcon} from '@primer/octicons-react'
3
+ import {ListContext} from './List'
4
+ import {GroupContext} from './Group'
5
+ import {ItemProps} from './Item'
6
+ import {LeadingVisualContainer} from './Visuals'
7
+
8
+ type SelectionProps = Pick<ItemProps, 'selected'>
9
+ export const Selection: React.FC<SelectionProps> = ({selected}) => {
10
+ const {selectionVariant: listSelectionVariant} = React.useContext(ListContext)
11
+ const {selectionVariant: groupSelectionVariant} = React.useContext(GroupContext)
12
+
13
+ /** selectionVariant in Group can override the selectionVariant in List root */
14
+ const selectionVariant = typeof groupSelectionVariant !== 'undefined' ? groupSelectionVariant : listSelectionVariant
15
+
16
+ // if selectionVariant is not set on List, don't show selection
17
+ if (!selectionVariant) {
18
+ // to avoid confusion, fail loudly instead of silently ignoring
19
+ if (selected)
20
+ throw new Error(
21
+ 'For Item to be selected, ActionList or ActionList.Group needs to have a selectionVariant defined'
22
+ )
23
+ return null
24
+ }
25
+
26
+ if (selectionVariant === 'single') {
27
+ return <LeadingVisualContainer>{selected && <CheckIcon />}</LeadingVisualContainer>
28
+ }
29
+
30
+ /**
31
+ * selectionVariant is multiple
32
+ * we use a svg instead of an input because there should not
33
+ * be an interactive element inside an option
34
+ * svg copied from primer/css
35
+ */
36
+ return (
37
+ <LeadingVisualContainer
38
+ sx={{
39
+ rect: {
40
+ fill: selected ? 'accent.fg' : 'canvas.default',
41
+ stroke: selected ? 'accent.fg' : 'border.default'
42
+ },
43
+ path: {
44
+ fill: 'fg.onEmphasis',
45
+ boxShadow: 'shadow.small',
46
+ opacity: selected ? 1 : 0
47
+ }
48
+ }}
49
+ >
50
+ <svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
51
+ <rect x="2" y="2" width="12" height="12" rx="4"></rect>
52
+ <path
53
+ fillRule="evenodd"
54
+ strokeWidth="0"
55
+ d="M4.03231 8.69862C3.84775 8.20646 4.49385 7.77554 4.95539 7.77554C5.41693 7.77554 6.80154 9.85246 6.80154 9.85246C6.80154 9.85246 10.2631 4.314 10.4938 4.08323C10.7246 3.85246 11.8785 4.08323 11.4169 5.00631C11.0081 5.82388 7.26308 11.4678 7.26308 11.4678C7.26308 11.4678 6.80154 12.1602 6.34 11.4678C5.87846 10.7755 4.21687 9.19077 4.03231 8.69862Z"
56
+ />
57
+ </svg>
58
+ </LeadingVisualContainer>
59
+ )
60
+ }
@@ -0,0 +1,76 @@
1
+ import React from 'react'
2
+ import Box from '../Box'
3
+ import {SxProp, merge} from '../sx'
4
+ import {get} from '../constants'
5
+ import {getVariantStyles, Slot, ItemContext, TEXT_ROW_HEIGHT} from './Item'
6
+
7
+ type VisualProps = SxProp & React.HTMLAttributes<HTMLSpanElement>
8
+
9
+ export const LeadingVisualContainer: React.FC<VisualProps> = ({sx = {}, ...props}) => {
10
+ return (
11
+ <Box
12
+ as="span"
13
+ sx={merge(
14
+ {
15
+ height: TEXT_ROW_HEIGHT, // match height of text row
16
+ minWidth: get('space.3'),
17
+ maxWidth: TEXT_ROW_HEIGHT, // square (same as height)
18
+ display: 'flex',
19
+ justifyContent: 'center',
20
+ alignItems: 'center',
21
+ flexShrink: 0,
22
+ marginRight: 2
23
+ },
24
+ sx as SxProp
25
+ )}
26
+ {...props}
27
+ />
28
+ )
29
+ }
30
+
31
+ export type LeadingVisualProps = VisualProps
32
+ export const LeadingVisual: React.FC<VisualProps> = ({sx = {}, ...props}) => {
33
+ return (
34
+ <Slot name="LeadingVisual">
35
+ {({variant, disabled}: ItemContext) => (
36
+ <LeadingVisualContainer
37
+ sx={merge(
38
+ {
39
+ color: getVariantStyles(variant, disabled).iconColor,
40
+ svg: {fontSize: 0}
41
+ },
42
+ sx as SxProp
43
+ )}
44
+ {...props}
45
+ >
46
+ {props.children}
47
+ </LeadingVisualContainer>
48
+ )}
49
+ </Slot>
50
+ )
51
+ }
52
+
53
+ export type TrailingVisualProps = VisualProps
54
+ export const TrailingVisual: React.FC<VisualProps> = ({sx = {}, ...props}) => {
55
+ return (
56
+ <Slot name="TrailingVisual">
57
+ {({variant, disabled}: ItemContext) => (
58
+ <Box
59
+ as="span"
60
+ sx={merge(
61
+ {
62
+ height: '20px', // match height of text row
63
+ flexShrink: 0,
64
+ color: getVariantStyles(variant, disabled).annotationColor,
65
+ marginLeft: 2
66
+ },
67
+ sx as SxProp
68
+ )}
69
+ {...props}
70
+ >
71
+ {props.children}
72
+ </Box>
73
+ )}
74
+ </Slot>
75
+ )
76
+ }
@@ -0,0 +1,39 @@
1
+ import {List} from './List'
2
+ import {Group} from './Group'
3
+ import {Item} from './Item'
4
+ import {LinkItem} from './LinkItem'
5
+ import {Divider} from './Divider'
6
+ import {Description} from './Description'
7
+ import {LeadingVisual, TrailingVisual} from './Visuals'
8
+
9
+ export type {ListProps as ActionListProps} from './List'
10
+ export type {GroupProps} from './Group'
11
+ export type {ItemProps} from './Item'
12
+ export type {DescriptionProps} from './Description'
13
+ export type {LeadingVisualProps, TrailingVisualProps} from './Visuals'
14
+
15
+ /**
16
+ * Collection of list-related components.
17
+ */
18
+ export const ActionList = Object.assign(List, {
19
+ /** Collects related `Items` in an `ActionList`. */
20
+ Group,
21
+
22
+ /** An actionable or selectable `Item` */
23
+ Item,
24
+
25
+ /** A `Item` that renders a full-size anchor inside ListItem */
26
+ LinkItem,
27
+
28
+ /** Visually separates `Item`s or `Group`s in an `ActionList`. */
29
+ Divider,
30
+
31
+ /** Secondary text which provides additional information about an `Item`. */
32
+ Description,
33
+
34
+ /** Icon (or similar) positioned before `Item` text. */
35
+ LeadingVisual,
36
+
37
+ /** Icon (or similar) positioned after `Item` text. */
38
+ TrailingVisual
39
+ })
@@ -372,6 +372,7 @@ const Buttons: React.FC<{buttons: DialogButtonProps[]}> = ({buttons}) => {
372
372
  <ButtonElement
373
373
  key={index}
374
374
  {...buttonProps}
375
+ variant={buttonType}
375
376
  ref={autoFocus && autoFocusCount === 0 ? (autoFocusCount++, autoFocusRef) : null}
376
377
  >
377
378
  {content}
@@ -0,0 +1,15 @@
1
+ import React from 'react'
2
+ import {SxProp} from '../sx'
3
+ import CounterLabel from '../CounterLabel'
4
+
5
+ export type CounterProps = {
6
+ children: number
7
+ } & SxProp
8
+
9
+ export const Counter = ({children, sx: sxProp = {}, ...props}: CounterProps) => {
10
+ return (
11
+ <CounterLabel data-component="ButtonCounter" sx={{ml: 2, ...sxProp}} {...props}>
12
+ {children}
13
+ </CounterLabel>
14
+ )
15
+ }
@@ -0,0 +1,283 @@
1
+ import React, {forwardRef} from 'react'
2
+ import Box from '../Box'
3
+ import styled from 'styled-components'
4
+ import sx, {merge, SxProp} from '../sx'
5
+ import {useTheme, Theme} from '../ThemeProvider'
6
+ import {VariantType, ButtonProps} from './types'
7
+
8
+ const TEXT_ROW_HEIGHT = '20px' // custom value off the scale
9
+
10
+ const getVariantStyles = (variant: VariantType = 'default', theme?: Theme) => {
11
+ const style = {
12
+ default: {
13
+ color: 'btn.text',
14
+ backgroundColor: 'btn.bg',
15
+ boxShadow: `${theme?.shadows.btn.shadow}, ${theme?.shadows.btn.insetShadow}`,
16
+ '&:hover:not([disabled])': {
17
+ backgroundColor: 'btn.hoverBg'
18
+ },
19
+ // focus must come before :active so that the active box shadow overrides
20
+ '&:focus:not([disabled])': {
21
+ boxShadow: `${theme?.shadows.btn.focusShadow}`
22
+ },
23
+ '&:active:not([disabled])': {
24
+ backgroundColor: 'btn.selectedBg',
25
+ boxShadow: `${theme?.shadows.btn.shadowActive}`
26
+ },
27
+ '&:disabled': {
28
+ color: 'primer.fg.disabled',
29
+ backgroundColor: 'btn.disabledBg'
30
+ }
31
+ },
32
+ primary: {
33
+ color: 'btn.primary.text',
34
+ backgroundColor: 'btn.primary.bg',
35
+ borderColor: 'border.subtle',
36
+ boxShadow: `${theme?.shadows.btn.primary.shadow}`,
37
+ '&:hover:not([disabled])': {
38
+ color: 'btn.primary.hoverText',
39
+ backgroundColor: 'btn.primary.hoverBg'
40
+ },
41
+ // focus must come before :active so that the active box shadow overrides
42
+ '&:focus:not([disabled])': {
43
+ boxShadow: `${theme?.shadows.btn.primary.focusShadow}`
44
+ },
45
+ '&:active:not([disabled])': {
46
+ backgroundColor: 'btn.primary.selectedBg',
47
+ boxShadow: `${theme?.shadows.btn.primary.selectedShadow}`
48
+ },
49
+ '&:disabled': {
50
+ color: 'btn.primary.disabledText',
51
+ backgroundColor: 'btn.primary.disabledBg'
52
+ },
53
+ '[data-component="ButtonCounter"]': {
54
+ backgroundColor: 'btn.primary.counterBg',
55
+ color: 'btn.primary.text'
56
+ }
57
+ },
58
+ danger: {
59
+ color: 'btn.danger.text',
60
+ backgroundColor: 'btn.bg',
61
+ boxShadow: `${theme?.shadows.btn.shadow}`,
62
+ '&:hover:not([disabled])': {
63
+ color: 'btn.danger.hoverText',
64
+ backgroundColor: 'btn.danger.hoverBg',
65
+ borderColor: 'btn.danger.hoverBorder',
66
+ boxShadow: `${theme?.shadows.btn.danger.hoverShadow}`,
67
+ '[data-component="ButtonCounter"]': {
68
+ backgroundColor: 'btn.danger.hoverCounterBg',
69
+ color: 'btn.danger.hoverText'
70
+ }
71
+ },
72
+ // focus must come before :active so that the active box shadow overrides
73
+ '&:focus:not([disabled])': {
74
+ borderColor: 'btn.danger.focusBorder',
75
+ boxShadow: `${theme?.shadows.btn.danger.focusShadow}`
76
+ },
77
+ '&:active:not([disabled])': {
78
+ color: 'btn.danger.selectedText',
79
+ backgroundColor: 'btn.danger.selectedBg',
80
+ boxShadow: `${theme?.shadows.btn.danger.selectedShadow}`,
81
+ borderColor: 'btn.danger.selectedBorder'
82
+ },
83
+ '&:disabled': {
84
+ color: 'btn.danger.disabledText',
85
+ backgroundColor: 'btn.danger.disabledBg',
86
+ borderColor: 'btn.danger.disabledBorder',
87
+ '[data-component="ButtonCounter"]': {
88
+ backgroundColor: 'btn.danger.disabledCounterBg'
89
+ }
90
+ },
91
+ '[data-component="ButtonCounter"]': {
92
+ color: 'btn.danger.text',
93
+ backgroundColor: 'btn.danger.counterBg'
94
+ }
95
+ },
96
+ invisible: {
97
+ color: 'accent.fg',
98
+ backgroundColor: 'transparent',
99
+ border: '0',
100
+ boxShadow: 'none',
101
+ '&:hover:not([disabled])': {
102
+ backgroundColor: 'btn.hoverBg'
103
+ },
104
+ // focus must come before :active so that the active box shadow overrides
105
+ '&:focus:not([disabled])': {
106
+ boxShadow: `${theme?.shadows.btn.focusShadow}`
107
+ },
108
+ '&:active:not([disabled])': {
109
+ backgroundColor: 'btn.selectedBg'
110
+ },
111
+ '&:disabled': {
112
+ color: 'primer.fg.disabled'
113
+ }
114
+ },
115
+ outline: {
116
+ color: 'btn.outline.text',
117
+ boxShadow: `${theme?.shadows.btn.shadow}`,
118
+
119
+ '&:hover': {
120
+ color: 'btn.outline.hoverText',
121
+ backgroundColor: 'btn.outline.hoverBg',
122
+ borderColor: 'outline.hoverBorder',
123
+ boxShadow: `${theme?.shadows.btn.outline.hoverShadow}`,
124
+ '[data-component="ButtonCounter"]': {
125
+ backgroundColor: 'btn.outline.hoverCounterBg',
126
+ color: 'btn.outline.hoverText'
127
+ }
128
+ },
129
+ // focus must come before :active so that the active box shadow overrides
130
+ '&:focus': {
131
+ borderColor: 'btn.outline.focusBorder',
132
+ boxShadow: `${theme?.shadows.btn.outline.focusShadow}`
133
+ },
134
+
135
+ '&:active:not([disabled])': {
136
+ color: 'btn.outline.selectedText',
137
+ backgroundColor: 'btn.outline.selectedBg',
138
+ boxShadow: `${theme?.shadows.btn.outline.selectedShadow}`,
139
+ borderColor: 'btn.outline.selectedBorder'
140
+ },
141
+
142
+ '&:disabled': {
143
+ color: 'btn.outline.disabledText',
144
+ backgroundColor: 'btn.outline.disabledBg',
145
+ borderColor: 'btn.border',
146
+ '[data-component="ButtonCounter"]': {
147
+ backgroundColor: 'btn.outline.disabledCounterBg'
148
+ }
149
+ },
150
+ '[data-component="ButtonCounter"]': {
151
+ backgroundColor: 'btn.outline.counterBg',
152
+ color: 'btn.outline.text'
153
+ }
154
+ }
155
+ }
156
+ return style[variant]
157
+ }
158
+
159
+ const getSizeStyles = (size = 'medium', variant: VariantType = 'default', iconOnly: boolean) => {
160
+ let paddingY, paddingX, fontSize
161
+ switch (size) {
162
+ case 'small':
163
+ paddingY = 3
164
+ paddingX = 12
165
+ fontSize = 0
166
+ break
167
+ case 'large':
168
+ paddingY = 9
169
+ paddingX = 20
170
+ fontSize = 2
171
+ break
172
+ case 'medium':
173
+ default:
174
+ paddingY = 5
175
+ paddingX = 16
176
+ fontSize = 1
177
+ }
178
+ if (iconOnly) {
179
+ paddingX = paddingY + 2
180
+ }
181
+ if (variant === 'invisible') {
182
+ paddingY = paddingY + 1
183
+ }
184
+ return {
185
+ paddingY: `${paddingY}px`,
186
+ paddingX: `${paddingX}px`,
187
+ fontSize,
188
+ '[data-component="ButtonCounter"]': {
189
+ fontSize
190
+ }
191
+ }
192
+ }
193
+
194
+ const ButtonBase = styled.button<SxProp>(sx)
195
+
196
+ const Button = forwardRef<HTMLButtonElement, ButtonProps>(
197
+ ({children, sx: sxProp = {}, ...props}, forwardedRef): JSX.Element => {
198
+ const {
199
+ icon: Icon,
200
+ leadingIcon: LeadingIcon,
201
+ trailingIcon: TrailingIcon,
202
+ variant = 'default',
203
+ size = 'medium'
204
+ } = props
205
+ const iconOnly = !!Icon
206
+ const {theme} = useTheme()
207
+
208
+ const styles = {
209
+ borderRadius: '2',
210
+ border: '1px solid',
211
+ borderColor: theme?.colors.btn.border,
212
+ display: 'grid',
213
+ gridTemplateAreas: '"leadingIcon text trailingIcon"',
214
+ fontWeight: 'bold',
215
+ lineHeight: TEXT_ROW_HEIGHT,
216
+ whiteSpace: 'nowrap',
217
+ verticalAlign: 'middle',
218
+ cursor: 'pointer',
219
+ appearance: 'none',
220
+ userSelect: 'none',
221
+ textDecoration: 'none',
222
+ textAlign: 'center',
223
+ '& > :not(:last-child)': {
224
+ mr: '2'
225
+ },
226
+ '&:focus': {
227
+ outline: 'none'
228
+ },
229
+ '&:disabled': {
230
+ cursor: 'default'
231
+ },
232
+ '&:disabled svg': {
233
+ opacity: '0.6'
234
+ },
235
+ '[data-component="leadingIcon"]': {
236
+ gridArea: 'leadingIcon'
237
+ },
238
+ '[data-component="text"]': {
239
+ gridArea: 'text'
240
+ },
241
+ '[data-component="trailingIcon"]': {
242
+ gridArea: 'trailingIcon'
243
+ }
244
+ }
245
+ const iconWrapStyles = {
246
+ display: 'inline-block'
247
+ }
248
+ const sxStyles = merge.all([
249
+ styles,
250
+ getSizeStyles(size, variant, iconOnly),
251
+ getVariantStyles(variant, theme),
252
+ sxProp as SxProp
253
+ ])
254
+ return (
255
+ <ButtonBase sx={sxStyles} ref={forwardedRef} {...props}>
256
+ {LeadingIcon && (
257
+ <Box as="span" data-component="leadingIcon" sx={iconWrapStyles} aria-hidden={!iconOnly}>
258
+ <LeadingIcon />
259
+ </Box>
260
+ )}
261
+ <span data-component="text" hidden={Icon ? true : false}>
262
+ {children}
263
+ </span>
264
+ {Icon && (
265
+ <Box data-component="icon-only" as="span" sx={{display: 'inline-block'}} aria-hidden={!iconOnly}>
266
+ <Icon />
267
+ </Box>
268
+ )}
269
+ {TrailingIcon && (
270
+ <Box as="span" data-component="trailingIcon" sx={{...iconWrapStyles, ml: 2}} aria-hidden={!iconOnly}>
271
+ <TrailingIcon />
272
+ </Box>
273
+ )}
274
+ </ButtonBase>
275
+ )
276
+ }
277
+ )
278
+
279
+ Button.displayName = 'Button'
280
+
281
+ Object.assign(Button, {})
282
+
283
+ export {Button}
@@ -0,0 +1,10 @@
1
+ import {Button} from './button'
2
+ import {Counter} from './button-counter'
3
+ import {ButtonProps} from './types'
4
+ // change this when moving to released state
5
+
6
+ export type {ButtonProps as NewButtonProps}
7
+
8
+ export const NewButton = Object.assign(Button, {
9
+ Counter
10
+ })
@@ -0,0 +1,36 @@
1
+ import React, {HTMLAttributes} from 'react'
2
+ import {IconProps} from '@primer/octicons-react'
3
+ import {SxProp} from '../sx'
4
+
5
+ export type VariantType = 'default' | 'primary' | 'invisible' | 'danger' | 'outline'
6
+
7
+ export type Size = 'small' | 'medium' | 'large'
8
+
9
+ export type ButtonProps = {
10
+ /**
11
+ * Determine's the styles on a button one of 'default' | 'primary' | 'invisible' | 'danger'
12
+ */
13
+ variant?: VariantType
14
+ /**
15
+ * Size of button and fontSize of text in button
16
+ */
17
+ size?: Size
18
+ /**
19
+ * This is to be used if it is an icon-only button. Will make text visually hidden
20
+ */
21
+ icon?: React.FunctionComponent<IconProps>
22
+ /**
23
+ * The leading icon comes before button content
24
+ */
25
+ leadingIcon?: React.FunctionComponent<IconProps>
26
+ /**
27
+ * The trailing icon comes after button content
28
+ */
29
+ trailingIcon?: React.FunctionComponent<IconProps>
30
+ /**
31
+ * Items that are disabled can not be clicked, selected, or navigated through.
32
+ */
33
+ disabled?: boolean
34
+ children: React.ReactNode
35
+ } & SxProp &
36
+ HTMLAttributes<HTMLButtonElement>
package/src/Overlay.tsx CHANGED
@@ -1,7 +1,8 @@
1
1
  import styled from 'styled-components'
2
- import React, {ReactElement, useEffect, useLayoutEffect, useRef} from 'react'
2
+ import React, {ReactElement, useEffect, useRef} from 'react'
3
3
  import {get, COMMON, SystemPositionProps, SystemCommonProps} from './constants'
4
4
  import {ComponentProps} from './utils/types'
5
+ import useLayoutEffect from './utils/useIsomorphicLayoutEffect'
5
6
  import {useOverlay, TouchOrMouseEvent} from './hooks'
6
7
  import Portal from './Portal'
7
8
  import sx, {SxProp} from './sx'
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
2
  import {createPortal} from 'react-dom'
3
+ import useLayoutEffect from '../utils/useIsomorphicLayoutEffect'
3
4
 
4
5
  const PRIMER_PORTAL_ROOT_ID = '__primerPortalRoot__'
5
6
  const DEFAULT_PORTAL_CONTAINER_NAME = '__default__'
@@ -69,7 +70,7 @@ export const Portal: React.FC<PortalProps> = ({children, onMount, containerName:
69
70
  hostElement.style.zIndex = '1'
70
71
  const elementRef = React.useRef(hostElement)
71
72
 
72
- React.useLayoutEffect(() => {
73
+ useLayoutEffect(() => {
73
74
  let containerName = _containerName
74
75
  if (containerName === undefined) {
75
76
  containerName = DEFAULT_PORTAL_CONTAINER_NAME