@primer/components 29.0.0 → 29.1.1-rc.cea79543

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 (859) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +10 -0
  3. package/.devcontainer/devcontainer.json +8 -0
  4. package/.eslintrc.json +106 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  6. package/.github/ISSUE_TEMPLATE/new_component_proposal_template.md +41 -0
  7. package/.github/dependabot.yml +18 -0
  8. package/.github/pull_request_template.md +18 -0
  9. package/.github/workflows/ci.yml +31 -0
  10. package/.github/workflows/deploy_preview.yml +47 -0
  11. package/.github/workflows/deploy_production.yml +70 -0
  12. package/.github/workflows/release.yml +35 -0
  13. package/.github/workflows/release_canary.yml +70 -0
  14. package/.github/workflows/release_candidate.yml +60 -0
  15. package/.github/workflows/size.yml +13 -0
  16. package/.github/workflows/stale.yml +26 -0
  17. package/.gitignore +10 -0
  18. package/.npmrc +4 -0
  19. package/.nvmrc +1 -0
  20. package/.storybook/main.js +11 -0
  21. package/.storybook/preview.js +69 -0
  22. package/.vscode/launch.json +21 -0
  23. package/.vscode/settings.json +13 -0
  24. package/@types/@styled-system/index.d.ts +0 -0
  25. package/@types/@styled-system/prop-types/index.d.ts +1 -0
  26. package/@types/@styled-system/props/index.d.ts +1 -0
  27. package/@types/jest-styled-components/index.d.ts +1 -0
  28. package/CHANGELOG.md +16 -0
  29. package/CODEOWNERS +2 -0
  30. package/babel-defines.js +13 -0
  31. package/babel.config.js +39 -0
  32. package/contributor-docs/CODE_OF_CONDUCT.md +76 -0
  33. package/contributor-docs/CONTRIBUTING.md +274 -0
  34. package/contributor-docs/adrs/adr-001-typescript.md +23 -0
  35. package/contributor-docs/adrs/adr-002-behavior-isolation.md +106 -0
  36. package/contributor-docs/behaviors.md +132 -0
  37. package/contributor-docs/component-contents-api-patterns.md +315 -0
  38. package/contributor-docs/principles.md +39 -0
  39. package/dist/browser.esm.js +195 -195
  40. package/dist/browser.esm.js.map +1 -1
  41. package/dist/browser.umd.js +301 -301
  42. package/dist/browser.umd.js.map +1 -1
  43. package/docs/.eslintrc +0 -0
  44. package/docs/.gitignore +91 -0
  45. package/docs/components/PropsList.js +5 -0
  46. package/docs/components/State.js +9 -0
  47. package/docs/components/constants.js +34 -0
  48. package/docs/components/index.js +2 -0
  49. package/docs/content/ActionList.mdx +72 -0
  50. package/docs/content/ActionMenu.mdx +80 -0
  51. package/docs/content/AnchoredOverlay.mdx +37 -0
  52. package/docs/content/Avatar.mdx +33 -0
  53. package/docs/content/AvatarStack.mdx +43 -0
  54. package/docs/content/BorderBox.md +46 -0
  55. package/docs/content/Box.md +74 -0
  56. package/docs/content/BranchName.md +18 -0
  57. package/docs/content/Breadcrumbs.md +52 -0
  58. package/docs/content/Buttons.md +54 -0
  59. package/docs/content/CircleBadge.md +45 -0
  60. package/docs/content/CircleOcticon.md +18 -0
  61. package/docs/content/CounterLabel.md +30 -0
  62. package/docs/content/Details.md +105 -0
  63. package/docs/content/Dialog.md +108 -0
  64. package/docs/content/Dialog2.mdx +179 -0
  65. package/docs/content/Dropdown.md +72 -0
  66. package/docs/content/DropdownMenu.mdx +49 -0
  67. package/docs/content/FilterList.md +44 -0
  68. package/docs/content/FilteredSearch.md +39 -0
  69. package/docs/content/Flash.md +42 -0
  70. package/docs/content/Flex.md +58 -0
  71. package/docs/content/FormGroup.md +44 -0
  72. package/docs/content/Grid.md +59 -0
  73. package/docs/content/Header.md +79 -0
  74. package/docs/content/Heading.md +22 -0
  75. package/docs/content/Label.md +40 -0
  76. package/docs/content/LabelGroup.md +31 -0
  77. package/docs/content/Link.md +37 -0
  78. package/docs/content/Overlay.mdx +94 -0
  79. package/docs/content/Pagehead.md +27 -0
  80. package/docs/content/Pagination.md +187 -0
  81. package/docs/content/PointerBox.md +81 -0
  82. package/docs/content/Popover.md +137 -0
  83. package/docs/content/Portal.mdx +73 -0
  84. package/docs/content/Position.md +97 -0
  85. package/docs/content/ProgressBar.mdx +29 -0
  86. package/docs/content/SelectMenu.md +433 -0
  87. package/docs/content/SelectPanel.mdx +67 -0
  88. package/docs/content/SideNav.md +179 -0
  89. package/docs/content/Spinner.mdx +32 -0
  90. package/docs/content/StateLabel.md +33 -0
  91. package/docs/content/StyledOcticon.md +34 -0
  92. package/docs/content/SubNav.md +102 -0
  93. package/docs/content/TabNav.md +50 -0
  94. package/docs/content/Text.md +29 -0
  95. package/docs/content/TextInput.md +32 -0
  96. package/docs/content/Timeline.md +138 -0
  97. package/docs/content/Tooltip.md +41 -0
  98. package/docs/content/Truncate.md +65 -0
  99. package/docs/content/UnderlineNav.md +53 -0
  100. package/docs/content/anchoredPosition.mdx +163 -0
  101. package/docs/content/core-concepts.md +70 -0
  102. package/docs/content/focusTrap.mdx +103 -0
  103. package/docs/content/focusZone.mdx +145 -0
  104. package/docs/content/getting-started.md +134 -0
  105. package/docs/content/index.md +33 -0
  106. package/docs/content/linting.md +35 -0
  107. package/docs/content/overriding-styles.mdx +79 -0
  108. package/docs/content/philosophy.md +23 -0
  109. package/docs/content/primer-theme.md +89 -0
  110. package/docs/content/ssr.mdx +43 -0
  111. package/docs/content/system-props.mdx +37 -0
  112. package/docs/content/theme-reference.md +16 -0
  113. package/docs/content/theming.md +249 -0
  114. package/docs/content/useOnEscapePress.mdx +56 -0
  115. package/docs/content/useOnOutsideClick.mdx +57 -0
  116. package/docs/content/useOpenAndCloseFocus.mdx +49 -0
  117. package/docs/content/useOverlay.mdx +62 -0
  118. package/docs/content/useSafeTimeout.mdx +32 -0
  119. package/docs/gatsby-config.js +30 -0
  120. package/docs/gatsby-node.js +101 -0
  121. package/docs/package-lock.json +20979 -0
  122. package/docs/package.json +35 -0
  123. package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +21 -0
  124. package/docs/src/@primer/gatsby-theme-doctocat/components/live-code.js +84 -0
  125. package/docs/src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js +39 -0
  126. package/docs/src/@primer/gatsby-theme-doctocat/components/nav-dropdown.js +48 -0
  127. package/docs/src/@primer/gatsby-theme-doctocat/components/wrap-page-element.js +25 -0
  128. package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +54 -0
  129. package/docs/src/@primer/gatsby-theme-doctocat/nav.yml +127 -0
  130. package/docs/src/@primer/gatsby-theme-doctocat/primer-components-hero.svg +1411 -0
  131. package/docs/src/props.js +77 -0
  132. package/jest.config.js +13 -0
  133. package/lib/ActionList/Divider.js +1 -1
  134. package/lib/ActionList/Header.js +2 -2
  135. package/lib/ActionList/Item.js +10 -10
  136. package/lib/ActionList/List.js +1 -1
  137. package/lib/AvatarPair.js +1 -1
  138. package/lib/AvatarStack.js +1 -1
  139. package/lib/BranchName.js +1 -1
  140. package/lib/Breadcrumb.js +2 -2
  141. package/lib/Button/Button.d.ts +0 -1
  142. package/lib/Button/Button.js +1 -1
  143. package/lib/Button/ButtonClose.d.ts +1 -2
  144. package/lib/Button/ButtonClose.js +1 -1
  145. package/lib/Button/ButtonDanger.d.ts +0 -1
  146. package/lib/Button/ButtonInvisible.d.ts +0 -1
  147. package/lib/Button/ButtonInvisible.js +1 -1
  148. package/lib/Button/ButtonOutline.d.ts +0 -1
  149. package/lib/Button/ButtonPrimary.d.ts +0 -1
  150. package/lib/Button/ButtonTableList.js +1 -1
  151. package/lib/CircleBadge.js +1 -1
  152. package/lib/CircleOcticon.d.ts +0 -1
  153. package/lib/CircleOcticon.js +1 -1
  154. package/lib/CounterLabel.js +2 -2
  155. package/lib/Dialog/ConfirmationDialog.js +1 -1
  156. package/lib/Dialog/Dialog.js +5 -5
  157. package/lib/Dialog.d.ts +2 -3
  158. package/lib/Dialog.js +4 -4
  159. package/lib/Dropdown.d.ts +0 -4
  160. package/lib/Dropdown.js +2 -2
  161. package/lib/DropdownMenu/DropdownButton.d.ts +1 -2
  162. package/lib/DropdownStyles.js +6 -6
  163. package/lib/FilterList.d.ts +0 -1
  164. package/lib/FilterList.js +1 -1
  165. package/lib/FilteredActionList/FilteredActionList.js +2 -2
  166. package/lib/Flash.js +1 -1
  167. package/lib/Label.js +2 -2
  168. package/lib/Link.js +1 -1
  169. package/lib/Overlay.js +1 -1
  170. package/lib/Pagehead.js +1 -1
  171. package/lib/Pagination/Pagination.js +1 -1
  172. package/lib/Popover.js +1 -1
  173. package/lib/Position.d.ts +4 -4
  174. package/lib/ProgressBar.js +1 -1
  175. package/lib/SelectMenu/SelectMenu.d.ts +4 -10
  176. package/lib/SelectMenu/SelectMenuDivider.js +1 -1
  177. package/lib/SelectMenu/SelectMenuFilter.js +1 -1
  178. package/lib/SelectMenu/SelectMenuFooter.js +1 -1
  179. package/lib/SelectMenu/SelectMenuHeader.js +2 -2
  180. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  181. package/lib/SelectMenu/SelectMenuItem.js +1 -1
  182. package/lib/SelectMenu/SelectMenuList.js +1 -1
  183. package/lib/SelectMenu/SelectMenuLoadingAnimation.js +1 -1
  184. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  185. package/lib/SelectMenu/SelectMenuModal.js +2 -2
  186. package/lib/SelectMenu/SelectMenuTab.js +1 -1
  187. package/lib/SelectMenu/SelectMenuTabPanel.js +1 -1
  188. package/lib/SideNav.js +5 -5
  189. package/lib/StateLabel.js +1 -1
  190. package/lib/SubNav.js +1 -1
  191. package/lib/TabNav.js +2 -2
  192. package/lib/TextInput.js +2 -2
  193. package/lib/Timeline.d.ts +0 -1
  194. package/lib/Timeline.js +5 -5
  195. package/lib/Tooltip.js +1 -1
  196. package/lib/UnderlineNav.js +2 -2
  197. package/lib/__tests__/ActionList.d.ts +1 -0
  198. package/lib/__tests__/ActionList.js +67 -0
  199. package/lib/__tests__/ActionMenu.d.ts +1 -0
  200. package/lib/__tests__/ActionMenu.js +154 -0
  201. package/lib/__tests__/AnchoredOverlay.d.ts +1 -0
  202. package/lib/__tests__/AnchoredOverlay.js +161 -0
  203. package/lib/__tests__/Avatar.d.ts +1 -0
  204. package/lib/__tests__/Avatar.js +70 -0
  205. package/lib/__tests__/AvatarStack.d.ts +1 -0
  206. package/lib/__tests__/AvatarStack.js +71 -0
  207. package/lib/__tests__/BorderBox.d.ts +1 -0
  208. package/lib/__tests__/BorderBox.js +61 -0
  209. package/lib/__tests__/Box.d.ts +1 -0
  210. package/lib/__tests__/Box.js +81 -0
  211. package/lib/__tests__/BranchName.d.ts +1 -0
  212. package/lib/__tests__/BranchName.js +39 -0
  213. package/lib/__tests__/Breadcrumb.d.ts +1 -0
  214. package/lib/__tests__/Breadcrumb.js +42 -0
  215. package/lib/__tests__/BreadcrumbItem.d.ts +1 -0
  216. package/lib/__tests__/BreadcrumbItem.js +52 -0
  217. package/lib/__tests__/Button.d.ts +1 -0
  218. package/lib/__tests__/Button.js +152 -0
  219. package/lib/__tests__/Caret.d.ts +1 -0
  220. package/lib/__tests__/Caret.js +52 -0
  221. package/lib/__tests__/CircleBadge.d.ts +1 -0
  222. package/lib/__tests__/CircleBadge.js +87 -0
  223. package/lib/__tests__/CircleOcticon.d.ts +1 -0
  224. package/lib/__tests__/CircleOcticon.js +74 -0
  225. package/lib/__tests__/CounterLabel.d.ts +1 -0
  226. package/lib/__tests__/CounterLabel.js +61 -0
  227. package/lib/__tests__/Details.d.ts +1 -0
  228. package/lib/__tests__/Details.js +120 -0
  229. package/lib/__tests__/Dialog.d.ts +1 -0
  230. package/lib/__tests__/Dialog.js +188 -0
  231. package/lib/__tests__/Dropdown.d.ts +1 -0
  232. package/lib/__tests__/Dropdown.js +70 -0
  233. package/lib/__tests__/DropdownMenu.d.ts +1 -0
  234. package/lib/__tests__/DropdownMenu.js +153 -0
  235. package/lib/__tests__/FilterList.d.ts +1 -0
  236. package/lib/__tests__/FilterList.js +39 -0
  237. package/lib/__tests__/FilterListItem.d.ts +1 -0
  238. package/lib/__tests__/FilterListItem.js +49 -0
  239. package/lib/__tests__/FilteredSearch.d.ts +1 -0
  240. package/lib/__tests__/FilteredSearch.js +39 -0
  241. package/lib/__tests__/Flash.d.ts +1 -0
  242. package/lib/__tests__/Flash.js +65 -0
  243. package/lib/__tests__/Flex.d.ts +1 -0
  244. package/lib/__tests__/Flex.js +77 -0
  245. package/lib/__tests__/FormGroup.d.ts +1 -0
  246. package/lib/__tests__/FormGroup.js +58 -0
  247. package/lib/__tests__/Grid.d.ts +1 -0
  248. package/lib/__tests__/Grid.js +107 -0
  249. package/lib/__tests__/Header.d.ts +1 -0
  250. package/lib/__tests__/Header.js +63 -0
  251. package/lib/__tests__/Heading.d.ts +1 -0
  252. package/lib/__tests__/Heading.js +112 -0
  253. package/lib/__tests__/Label.d.ts +1 -0
  254. package/lib/__tests__/Label.js +49 -0
  255. package/lib/__tests__/LabelGroup.d.ts +1 -0
  256. package/lib/__tests__/LabelGroup.js +41 -0
  257. package/lib/__tests__/Link.d.ts +1 -0
  258. package/lib/__tests__/Link.js +73 -0
  259. package/lib/__tests__/Overlay.d.ts +1 -0
  260. package/lib/__tests__/Overlay.js +145 -0
  261. package/lib/__tests__/Pagehead.d.ts +1 -0
  262. package/lib/__tests__/Pagehead.js +40 -0
  263. package/lib/__tests__/Pagination/Pagination.d.ts +1 -0
  264. package/lib/__tests__/Pagination/Pagination.js +50 -0
  265. package/lib/__tests__/Pagination/PaginationModel.d.ts +1 -0
  266. package/lib/__tests__/Pagination/PaginationModel.js +186 -0
  267. package/lib/__tests__/PointerBox.d.ts +1 -0
  268. package/lib/__tests__/PointerBox.js +49 -0
  269. package/lib/__tests__/Popover.d.ts +1 -0
  270. package/lib/__tests__/Popover.js +70 -0
  271. package/lib/__tests__/Portal.d.ts +1 -0
  272. package/lib/__tests__/Portal.js +124 -0
  273. package/lib/__tests__/Position.d.ts +1 -0
  274. package/lib/__tests__/Position.js +149 -0
  275. package/lib/__tests__/ProgressBar.d.ts +1 -0
  276. package/lib/__tests__/ProgressBar.js +71 -0
  277. package/lib/__tests__/SelectMenu.d.ts +1 -0
  278. package/lib/__tests__/SelectMenu.js +155 -0
  279. package/lib/__tests__/SelectPanel.d.ts +1 -0
  280. package/lib/__tests__/SelectPanel.js +83 -0
  281. package/lib/__tests__/SideNav.d.ts +1 -0
  282. package/lib/__tests__/SideNav.js +75 -0
  283. package/lib/__tests__/Spinner.d.ts +1 -0
  284. package/lib/__tests__/Spinner.js +56 -0
  285. package/lib/__tests__/StateLabel.d.ts +1 -0
  286. package/lib/__tests__/StateLabel.js +74 -0
  287. package/lib/__tests__/StyledOcticon.d.ts +1 -0
  288. package/lib/__tests__/StyledOcticon.js +43 -0
  289. package/lib/__tests__/SubNav.d.ts +1 -0
  290. package/lib/__tests__/SubNav.js +65 -0
  291. package/lib/__tests__/SubNavLink.d.ts +1 -0
  292. package/lib/__tests__/SubNavLink.js +52 -0
  293. package/lib/__tests__/TabNav.d.ts +1 -0
  294. package/lib/__tests__/TabNav.js +53 -0
  295. package/lib/__tests__/Text.d.ts +1 -0
  296. package/lib/__tests__/Text.js +108 -0
  297. package/lib/__tests__/TextInput.d.ts +1 -0
  298. package/lib/__tests__/TextInput.js +81 -0
  299. package/lib/__tests__/ThemeProvider.d.ts +1 -0
  300. package/lib/__tests__/ThemeProvider.js +444 -0
  301. package/lib/__tests__/Timeline.d.ts +1 -0
  302. package/lib/__tests__/Timeline.js +80 -0
  303. package/lib/__tests__/Tooltip.d.ts +1 -0
  304. package/lib/__tests__/Tooltip.js +72 -0
  305. package/lib/__tests__/Truncate.d.ts +1 -0
  306. package/lib/__tests__/Truncate.js +66 -0
  307. package/lib/__tests__/UnderlineNav.d.ts +1 -0
  308. package/lib/__tests__/UnderlineNav.js +75 -0
  309. package/lib/__tests__/UnderlineNavLink.d.ts +1 -0
  310. package/lib/__tests__/UnderlineNavLink.js +54 -0
  311. package/lib/__tests__/behaviors/anchoredPosition.d.ts +1 -0
  312. package/lib/__tests__/behaviors/anchoredPosition.js +390 -0
  313. package/lib/__tests__/behaviors/focusTrap.d.ts +1 -0
  314. package/lib/__tests__/behaviors/focusTrap.js +234 -0
  315. package/lib/__tests__/behaviors/focusZone.d.ts +1 -0
  316. package/lib/__tests__/behaviors/focusZone.js +570 -0
  317. package/lib/__tests__/behaviors/iterateFocusableElements.d.ts +1 -0
  318. package/lib/__tests__/behaviors/iterateFocusableElements.js +55 -0
  319. package/lib/__tests__/filterObject.d.ts +1 -0
  320. package/lib/__tests__/filterObject.js +30 -0
  321. package/lib/__tests__/hooks/useAnchoredPosition.d.ts +1 -0
  322. package/lib/__tests__/hooks/useAnchoredPosition.js +54 -0
  323. package/lib/__tests__/hooks/useOnEscapePress.d.ts +1 -0
  324. package/lib/__tests__/hooks/useOnEscapePress.js +32 -0
  325. package/lib/__tests__/hooks/useOnOutsideClick.d.ts +1 -0
  326. package/lib/__tests__/hooks/useOnOutsideClick.js +87 -0
  327. package/lib/__tests__/hooks/useOpenAndCloseFocus.d.ts +1 -0
  328. package/lib/__tests__/hooks/useOpenAndCloseFocus.js +60 -0
  329. package/lib/__tests__/hooks/useProvidedStateOrCreate.d.ts +1 -0
  330. package/lib/__tests__/hooks/useProvidedStateOrCreate.js +45 -0
  331. package/lib/__tests__/theme.d.ts +1 -0
  332. package/lib/__tests__/theme.js +36 -0
  333. package/lib/__tests__/themeGet.d.ts +1 -0
  334. package/lib/__tests__/themeGet.js +25 -0
  335. package/lib/__tests__/useSafeTimeout.d.ts +1 -0
  336. package/lib/__tests__/useSafeTimeout.js +45 -0
  337. package/lib/stories/ActionList.stories.js +382 -0
  338. package/lib/stories/ActionMenu.stories.js +338 -0
  339. package/lib/stories/AnchoredOverlay.stories.js +127 -0
  340. package/lib/stories/AvatarStack.stories.js +49 -0
  341. package/lib/stories/Button.stories.js +114 -0
  342. package/lib/stories/ConfirmationDialog.stories.js +111 -0
  343. package/lib/stories/Dialog.stories.js +265 -0
  344. package/lib/stories/DropdownMenu.stories.js +122 -0
  345. package/lib/stories/Overlay.stories.js +185 -0
  346. package/lib/stories/Portal.stories.js +104 -0
  347. package/lib/stories/SelectPanel.stories.js +342 -0
  348. package/lib/stories/ThemeProvider.stories.js +102 -0
  349. package/lib/stories/useAnchoredPosition.stories.js +351 -0
  350. package/lib/stories/useFocusTrap.stories.js +356 -0
  351. package/lib/stories/useFocusZone.stories.js +599 -0
  352. package/lib/theme-preval.d.ts +12 -6
  353. package/lib/theme-preval.js +2930 -1738
  354. package/lib/utils/testing.d.ts +4707 -2355
  355. package/lib-esm/ActionList/Divider.js +1 -1
  356. package/lib-esm/ActionList/Header.js +2 -2
  357. package/lib-esm/ActionList/Item.js +10 -10
  358. package/lib-esm/ActionList/List.js +1 -1
  359. package/lib-esm/AvatarPair.js +1 -1
  360. package/lib-esm/AvatarStack.js +1 -1
  361. package/lib-esm/BranchName.js +1 -1
  362. package/lib-esm/Breadcrumb.js +2 -2
  363. package/lib-esm/Button/Button.d.ts +0 -1
  364. package/lib-esm/Button/Button.js +1 -1
  365. package/lib-esm/Button/ButtonClose.d.ts +1 -2
  366. package/lib-esm/Button/ButtonClose.js +1 -1
  367. package/lib-esm/Button/ButtonDanger.d.ts +0 -1
  368. package/lib-esm/Button/ButtonInvisible.d.ts +0 -1
  369. package/lib-esm/Button/ButtonInvisible.js +1 -1
  370. package/lib-esm/Button/ButtonOutline.d.ts +0 -1
  371. package/lib-esm/Button/ButtonPrimary.d.ts +0 -1
  372. package/lib-esm/Button/ButtonTableList.js +1 -1
  373. package/lib-esm/CircleBadge.js +1 -1
  374. package/lib-esm/CircleOcticon.d.ts +0 -1
  375. package/lib-esm/CircleOcticon.js +1 -1
  376. package/lib-esm/CounterLabel.js +2 -2
  377. package/lib-esm/Dialog/ConfirmationDialog.js +1 -1
  378. package/lib-esm/Dialog/Dialog.js +5 -5
  379. package/lib-esm/Dialog.d.ts +2 -3
  380. package/lib-esm/Dialog.js +4 -4
  381. package/lib-esm/Dropdown.d.ts +0 -4
  382. package/lib-esm/Dropdown.js +2 -2
  383. package/lib-esm/DropdownMenu/DropdownButton.d.ts +1 -2
  384. package/lib-esm/DropdownStyles.js +6 -6
  385. package/lib-esm/FilterList.d.ts +0 -1
  386. package/lib-esm/FilterList.js +1 -1
  387. package/lib-esm/FilteredActionList/FilteredActionList.js +2 -2
  388. package/lib-esm/Flash.js +1 -1
  389. package/lib-esm/Label.js +2 -2
  390. package/lib-esm/Link.js +1 -1
  391. package/lib-esm/Overlay.js +1 -1
  392. package/lib-esm/Pagehead.js +1 -1
  393. package/lib-esm/Pagination/Pagination.js +1 -1
  394. package/lib-esm/Popover.js +1 -1
  395. package/lib-esm/Position.d.ts +4 -4
  396. package/lib-esm/ProgressBar.js +1 -1
  397. package/lib-esm/SelectMenu/SelectMenu.d.ts +4 -10
  398. package/lib-esm/SelectMenu/SelectMenuDivider.js +1 -1
  399. package/lib-esm/SelectMenu/SelectMenuFilter.js +1 -1
  400. package/lib-esm/SelectMenu/SelectMenuFooter.js +1 -1
  401. package/lib-esm/SelectMenu/SelectMenuHeader.js +2 -2
  402. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  403. package/lib-esm/SelectMenu/SelectMenuItem.js +1 -1
  404. package/lib-esm/SelectMenu/SelectMenuList.js +1 -1
  405. package/lib-esm/SelectMenu/SelectMenuLoadingAnimation.js +1 -1
  406. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  407. package/lib-esm/SelectMenu/SelectMenuModal.js +2 -2
  408. package/lib-esm/SelectMenu/SelectMenuTab.js +1 -1
  409. package/lib-esm/SelectMenu/SelectMenuTabPanel.js +1 -1
  410. package/lib-esm/SideNav.js +5 -5
  411. package/lib-esm/StateLabel.js +1 -1
  412. package/lib-esm/SubNav.js +1 -1
  413. package/lib-esm/TabNav.js +2 -2
  414. package/lib-esm/TextInput.js +2 -2
  415. package/lib-esm/Timeline.d.ts +0 -1
  416. package/lib-esm/Timeline.js +5 -5
  417. package/lib-esm/Tooltip.js +1 -1
  418. package/lib-esm/UnderlineNav.js +2 -2
  419. package/lib-esm/__tests__/ActionList.d.ts +1 -0
  420. package/lib-esm/__tests__/ActionList.js +54 -0
  421. package/lib-esm/__tests__/ActionMenu.d.ts +1 -0
  422. package/lib-esm/__tests__/ActionMenu.js +141 -0
  423. package/lib-esm/__tests__/AnchoredOverlay.d.ts +1 -0
  424. package/lib-esm/__tests__/AnchoredOverlay.js +135 -0
  425. package/lib-esm/__tests__/Avatar.d.ts +1 -0
  426. package/lib-esm/__tests__/Avatar.js +58 -0
  427. package/lib-esm/__tests__/AvatarStack.d.ts +1 -0
  428. package/lib-esm/__tests__/AvatarStack.js +57 -0
  429. package/lib-esm/__tests__/BorderBox.d.ts +1 -0
  430. package/lib-esm/__tests__/BorderBox.js +49 -0
  431. package/lib-esm/__tests__/Box.d.ts +1 -0
  432. package/lib-esm/__tests__/Box.js +69 -0
  433. package/lib-esm/__tests__/BranchName.d.ts +1 -0
  434. package/lib-esm/__tests__/BranchName.js +28 -0
  435. package/lib-esm/__tests__/Breadcrumb.d.ts +1 -0
  436. package/lib-esm/__tests__/Breadcrumb.js +31 -0
  437. package/lib-esm/__tests__/BreadcrumbItem.d.ts +1 -0
  438. package/lib-esm/__tests__/BreadcrumbItem.js +41 -0
  439. package/lib-esm/__tests__/Button.d.ts +1 -0
  440. package/lib-esm/__tests__/Button.js +141 -0
  441. package/lib-esm/__tests__/Caret.d.ts +1 -0
  442. package/lib-esm/__tests__/Caret.js +42 -0
  443. package/lib-esm/__tests__/CircleBadge.d.ts +1 -0
  444. package/lib-esm/__tests__/CircleBadge.js +73 -0
  445. package/lib-esm/__tests__/CircleOcticon.d.ts +1 -0
  446. package/lib-esm/__tests__/CircleOcticon.js +61 -0
  447. package/lib-esm/__tests__/CounterLabel.d.ts +1 -0
  448. package/lib-esm/__tests__/CounterLabel.js +49 -0
  449. package/lib-esm/__tests__/Details.d.ts +1 -0
  450. package/lib-esm/__tests__/Details.js +109 -0
  451. package/lib-esm/__tests__/Dialog.d.ts +1 -0
  452. package/lib-esm/__tests__/Dialog.js +174 -0
  453. package/lib-esm/__tests__/Dropdown.d.ts +1 -0
  454. package/lib-esm/__tests__/Dropdown.js +59 -0
  455. package/lib-esm/__tests__/DropdownMenu.d.ts +1 -0
  456. package/lib-esm/__tests__/DropdownMenu.js +139 -0
  457. package/lib-esm/__tests__/FilterList.d.ts +1 -0
  458. package/lib-esm/__tests__/FilterList.js +28 -0
  459. package/lib-esm/__tests__/FilterListItem.d.ts +1 -0
  460. package/lib-esm/__tests__/FilterListItem.js +38 -0
  461. package/lib-esm/__tests__/FilteredSearch.d.ts +1 -0
  462. package/lib-esm/__tests__/FilteredSearch.js +28 -0
  463. package/lib-esm/__tests__/Flash.d.ts +1 -0
  464. package/lib-esm/__tests__/Flash.js +53 -0
  465. package/lib-esm/__tests__/Flex.d.ts +1 -0
  466. package/lib-esm/__tests__/Flex.js +66 -0
  467. package/lib-esm/__tests__/FormGroup.d.ts +1 -0
  468. package/lib-esm/__tests__/FormGroup.js +47 -0
  469. package/lib-esm/__tests__/Grid.d.ts +1 -0
  470. package/lib-esm/__tests__/Grid.js +96 -0
  471. package/lib-esm/__tests__/Header.d.ts +1 -0
  472. package/lib-esm/__tests__/Header.js +52 -0
  473. package/lib-esm/__tests__/Heading.d.ts +1 -0
  474. package/lib-esm/__tests__/Heading.js +101 -0
  475. package/lib-esm/__tests__/Label.d.ts +1 -0
  476. package/lib-esm/__tests__/Label.js +38 -0
  477. package/lib-esm/__tests__/LabelGroup.d.ts +1 -0
  478. package/lib-esm/__tests__/LabelGroup.js +28 -0
  479. package/lib-esm/__tests__/Link.d.ts +1 -0
  480. package/lib-esm/__tests__/Link.js +62 -0
  481. package/lib-esm/__tests__/Overlay.d.ts +1 -0
  482. package/lib-esm/__tests__/Overlay.js +123 -0
  483. package/lib-esm/__tests__/Pagehead.d.ts +1 -0
  484. package/lib-esm/__tests__/Pagehead.js +28 -0
  485. package/lib-esm/__tests__/Pagination/Pagination.d.ts +1 -0
  486. package/lib-esm/__tests__/Pagination/Pagination.js +37 -0
  487. package/lib-esm/__tests__/Pagination/PaginationModel.d.ts +1 -0
  488. package/lib-esm/__tests__/Pagination/PaginationModel.js +182 -0
  489. package/lib-esm/__tests__/PointerBox.d.ts +1 -0
  490. package/lib-esm/__tests__/PointerBox.js +38 -0
  491. package/lib-esm/__tests__/Popover.d.ts +1 -0
  492. package/lib-esm/__tests__/Popover.js +56 -0
  493. package/lib-esm/__tests__/Portal.d.ts +1 -0
  494. package/lib-esm/__tests__/Portal.js +104 -0
  495. package/lib-esm/__tests__/Position.d.ts +1 -0
  496. package/lib-esm/__tests__/Position.js +138 -0
  497. package/lib-esm/__tests__/ProgressBar.d.ts +1 -0
  498. package/lib-esm/__tests__/ProgressBar.js +60 -0
  499. package/lib-esm/__tests__/SelectMenu.d.ts +1 -0
  500. package/lib-esm/__tests__/SelectMenu.js +145 -0
  501. package/lib-esm/__tests__/SelectPanel.d.ts +1 -0
  502. package/lib-esm/__tests__/SelectPanel.js +67 -0
  503. package/lib-esm/__tests__/SideNav.d.ts +1 -0
  504. package/lib-esm/__tests__/SideNav.js +63 -0
  505. package/lib-esm/__tests__/Spinner.d.ts +1 -0
  506. package/lib-esm/__tests__/Spinner.js +45 -0
  507. package/lib-esm/__tests__/StateLabel.d.ts +1 -0
  508. package/lib-esm/__tests__/StateLabel.js +63 -0
  509. package/lib-esm/__tests__/StyledOcticon.d.ts +1 -0
  510. package/lib-esm/__tests__/StyledOcticon.js +31 -0
  511. package/lib-esm/__tests__/SubNav.d.ts +1 -0
  512. package/lib-esm/__tests__/SubNav.js +52 -0
  513. package/lib-esm/__tests__/SubNavLink.d.ts +1 -0
  514. package/lib-esm/__tests__/SubNavLink.js +41 -0
  515. package/lib-esm/__tests__/TabNav.d.ts +1 -0
  516. package/lib-esm/__tests__/TabNav.js +42 -0
  517. package/lib-esm/__tests__/Text.d.ts +1 -0
  518. package/lib-esm/__tests__/Text.js +95 -0
  519. package/lib-esm/__tests__/TextInput.d.ts +1 -0
  520. package/lib-esm/__tests__/TextInput.js +70 -0
  521. package/lib-esm/__tests__/ThemeProvider.d.ts +1 -0
  522. package/lib-esm/__tests__/ThemeProvider.js +408 -0
  523. package/lib-esm/__tests__/Timeline.d.ts +1 -0
  524. package/lib-esm/__tests__/Timeline.js +69 -0
  525. package/lib-esm/__tests__/Tooltip.d.ts +1 -0
  526. package/lib-esm/__tests__/Tooltip.js +61 -0
  527. package/lib-esm/__tests__/Truncate.d.ts +1 -0
  528. package/lib-esm/__tests__/Truncate.js +55 -0
  529. package/lib-esm/__tests__/UnderlineNav.d.ts +1 -0
  530. package/lib-esm/__tests__/UnderlineNav.js +62 -0
  531. package/lib-esm/__tests__/UnderlineNavLink.d.ts +1 -0
  532. package/lib-esm/__tests__/UnderlineNavLink.js +43 -0
  533. package/lib-esm/__tests__/behaviors/anchoredPosition.d.ts +1 -0
  534. package/lib-esm/__tests__/behaviors/anchoredPosition.js +388 -0
  535. package/lib-esm/__tests__/behaviors/focusTrap.d.ts +1 -0
  536. package/lib-esm/__tests__/behaviors/focusTrap.js +227 -0
  537. package/lib-esm/__tests__/behaviors/focusZone.d.ts +1 -0
  538. package/lib-esm/__tests__/behaviors/focusZone.js +487 -0
  539. package/lib-esm/__tests__/behaviors/iterateFocusableElements.d.ts +1 -0
  540. package/lib-esm/__tests__/behaviors/iterateFocusableElements.js +48 -0
  541. package/lib-esm/__tests__/filterObject.d.ts +1 -0
  542. package/lib-esm/__tests__/filterObject.js +27 -0
  543. package/lib-esm/__tests__/hooks/useAnchoredPosition.d.ts +1 -0
  544. package/lib-esm/__tests__/hooks/useAnchoredPosition.js +46 -0
  545. package/lib-esm/__tests__/hooks/useOnEscapePress.d.ts +1 -0
  546. package/lib-esm/__tests__/hooks/useOnEscapePress.js +23 -0
  547. package/lib-esm/__tests__/hooks/useOnOutsideClick.d.ts +1 -0
  548. package/lib-esm/__tests__/hooks/useOnOutsideClick.js +68 -0
  549. package/lib-esm/__tests__/hooks/useOpenAndCloseFocus.d.ts +1 -0
  550. package/lib-esm/__tests__/hooks/useOpenAndCloseFocus.js +52 -0
  551. package/lib-esm/__tests__/hooks/useProvidedStateOrCreate.d.ts +1 -0
  552. package/lib-esm/__tests__/hooks/useProvidedStateOrCreate.js +36 -0
  553. package/lib-esm/__tests__/theme.d.ts +1 -0
  554. package/lib-esm/__tests__/theme.js +33 -0
  555. package/lib-esm/__tests__/themeGet.d.ts +1 -0
  556. package/lib-esm/__tests__/themeGet.js +22 -0
  557. package/lib-esm/__tests__/useSafeTimeout.d.ts +1 -0
  558. package/lib-esm/__tests__/useSafeTimeout.js +39 -0
  559. package/lib-esm/stories/ActionList.stories.js +334 -0
  560. package/lib-esm/stories/ActionMenu.stories.js +293 -0
  561. package/lib-esm/stories/AnchoredOverlay.stories.js +101 -0
  562. package/lib-esm/stories/AvatarStack.stories.js +32 -0
  563. package/lib-esm/stories/Button.stories.js +78 -0
  564. package/lib-esm/stories/ConfirmationDialog.stories.js +86 -0
  565. package/lib-esm/stories/Dialog.stories.js +240 -0
  566. package/lib-esm/stories/DropdownMenu.stories.js +94 -0
  567. package/lib-esm/stories/Overlay.stories.js +154 -0
  568. package/lib-esm/stories/Portal.stories.js +68 -0
  569. package/lib-esm/stories/SelectPanel.stories.js +284 -0
  570. package/lib-esm/stories/ThemeProvider.stories.js +83 -0
  571. package/lib-esm/stories/useAnchoredPosition.stories.js +313 -0
  572. package/lib-esm/stories/useFocusTrap.stories.js +309 -0
  573. package/lib-esm/stories/useFocusZone.stories.js +554 -0
  574. package/lib-esm/theme-preval.d.ts +12 -6
  575. package/lib-esm/theme-preval.js +2930 -1738
  576. package/lib-esm/utils/testing.d.ts +4707 -2355
  577. package/migrating.md +250 -0
  578. package/now.json +17 -0
  579. package/package-lock.json +28661 -0
  580. package/package.json +4 -3
  581. package/rollup.config.js +36 -0
  582. package/script/build +19 -0
  583. package/script/setup +12 -0
  584. package/src/ActionList/Divider.tsx +25 -0
  585. package/src/ActionList/Group.tsx +45 -0
  586. package/src/ActionList/Header.tsx +74 -0
  587. package/src/ActionList/Item.tsx +460 -0
  588. package/src/ActionList/List.tsx +253 -0
  589. package/src/ActionList/index.ts +21 -0
  590. package/src/ActionMenu.tsx +106 -0
  591. package/src/AnchoredOverlay/AnchoredOverlay.tsx +180 -0
  592. package/src/AnchoredOverlay/index.ts +2 -0
  593. package/src/Avatar.tsx +46 -0
  594. package/src/AvatarPair.tsx +35 -0
  595. package/src/AvatarStack.tsx +161 -0
  596. package/src/BaseStyles.tsx +53 -0
  597. package/src/BorderBox.tsx +18 -0
  598. package/src/Box.tsx +54 -0
  599. package/src/BranchName.tsx +19 -0
  600. package/src/Breadcrumb.tsx +87 -0
  601. package/src/Button/Button.tsx +40 -0
  602. package/src/Button/ButtonBase.tsx +43 -0
  603. package/src/Button/ButtonClose.tsx +40 -0
  604. package/src/Button/ButtonDanger.tsx +43 -0
  605. package/src/Button/ButtonGroup.tsx +55 -0
  606. package/src/Button/ButtonInvisible.tsx +27 -0
  607. package/src/Button/ButtonOutline.tsx +43 -0
  608. package/src/Button/ButtonPrimary.tsx +41 -0
  609. package/src/Button/ButtonStyles.tsx +36 -0
  610. package/src/Button/ButtonTableList.tsx +58 -0
  611. package/src/Button/index.ts +16 -0
  612. package/src/Caret.tsx +133 -0
  613. package/src/CircleBadge.tsx +55 -0
  614. package/src/CircleOcticon.tsx +37 -0
  615. package/src/CounterLabel.tsx +52 -0
  616. package/src/Details.tsx +23 -0
  617. package/src/Dialog/ConfirmationDialog.tsx +184 -0
  618. package/src/Dialog/Dialog.tsx +419 -0
  619. package/src/Dialog.tsx +149 -0
  620. package/src/Dropdown.tsx +158 -0
  621. package/src/DropdownMenu/DropdownButton.tsx +15 -0
  622. package/src/DropdownMenu/DropdownMenu.tsx +115 -0
  623. package/src/DropdownMenu/index.ts +4 -0
  624. package/src/DropdownStyles.ts +128 -0
  625. package/src/FilterList.tsx +81 -0
  626. package/src/FilteredActionList/FilteredActionList.tsx +152 -0
  627. package/src/FilteredActionList/index.ts +2 -0
  628. package/src/FilteredSearch.tsx +28 -0
  629. package/src/Flash.tsx +77 -0
  630. package/src/Flex.tsx +15 -0
  631. package/src/FormGroup.tsx +27 -0
  632. package/src/Grid.tsx +15 -0
  633. package/src/Header.tsx +84 -0
  634. package/src/Heading.tsx +21 -0
  635. package/src/Label.tsx +75 -0
  636. package/src/LabelGroup.tsx +18 -0
  637. package/src/Link.tsx +46 -0
  638. package/src/Overlay.tsx +194 -0
  639. package/src/Pagehead.tsx +17 -0
  640. package/src/Pagination/Pagination.tsx +214 -0
  641. package/src/Pagination/index.ts +4 -0
  642. package/src/Pagination/model.tsx +187 -0
  643. package/src/PointerBox.tsx +31 -0
  644. package/src/Popover.tsx +236 -0
  645. package/src/Portal/Portal.tsx +96 -0
  646. package/src/Portal/index.ts +5 -0
  647. package/src/Position.tsx +63 -0
  648. package/src/ProgressBar.tsx +52 -0
  649. package/src/SelectMenu/SelectMenu.tsx +125 -0
  650. package/src/SelectMenu/SelectMenuContext.tsx +9 -0
  651. package/src/SelectMenu/SelectMenuDivider.tsx +25 -0
  652. package/src/SelectMenu/SelectMenuFilter.tsx +51 -0
  653. package/src/SelectMenu/SelectMenuFooter.tsx +28 -0
  654. package/src/SelectMenu/SelectMenuHeader.tsx +50 -0
  655. package/src/SelectMenu/SelectMenuItem.tsx +137 -0
  656. package/src/SelectMenu/SelectMenuList.tsx +42 -0
  657. package/src/SelectMenu/SelectMenuLoadingAnimation.tsx +24 -0
  658. package/src/SelectMenu/SelectMenuModal.tsx +121 -0
  659. package/src/SelectMenu/SelectMenuTab.tsx +88 -0
  660. package/src/SelectMenu/SelectMenuTabPanel.tsx +30 -0
  661. package/src/SelectMenu/SelectMenuTabs.tsx +44 -0
  662. package/src/SelectMenu/hooks/useKeyboardNav.js +90 -0
  663. package/src/SelectMenu/index.ts +15 -0
  664. package/src/SelectPanel/SelectPanel.tsx +173 -0
  665. package/src/SelectPanel/index.ts +2 -0
  666. package/src/SideNav.tsx +193 -0
  667. package/src/Spinner.tsx +59 -0
  668. package/src/StateLabel.tsx +110 -0
  669. package/src/StyledOcticon.tsx +24 -0
  670. package/src/SubNav.tsx +129 -0
  671. package/src/TabNav.tsx +77 -0
  672. package/src/Text.tsx +13 -0
  673. package/src/TextInput.tsx +183 -0
  674. package/src/ThemeProvider.tsx +176 -0
  675. package/src/Timeline.tsx +141 -0
  676. package/src/Tooltip.tsx +263 -0
  677. package/src/Truncate.tsx +36 -0
  678. package/src/UnderlineNav.tsx +110 -0
  679. package/src/__tests__/.eslintrc.json +11 -0
  680. package/src/__tests__/ActionList.tsx +49 -0
  681. package/src/__tests__/ActionMenu.tsx +138 -0
  682. package/src/__tests__/AnchoredOverlay.tsx +151 -0
  683. package/src/__tests__/Avatar.tsx +45 -0
  684. package/src/__tests__/AvatarStack.tsx +45 -0
  685. package/src/__tests__/BorderBox.tsx +44 -0
  686. package/src/__tests__/Box.tsx +43 -0
  687. package/src/__tests__/BranchName.tsx +27 -0
  688. package/src/__tests__/Breadcrumb.tsx +31 -0
  689. package/src/__tests__/BreadcrumbItem.tsx +32 -0
  690. package/src/__tests__/Button.tsx +129 -0
  691. package/src/__tests__/Caret.tsx +36 -0
  692. package/src/__tests__/CircleBadge.tsx +69 -0
  693. package/src/__tests__/CircleOcticon.tsx +52 -0
  694. package/src/__tests__/CounterLabel.tsx +51 -0
  695. package/src/__tests__/Details.tsx +116 -0
  696. package/src/__tests__/Dialog.tsx +157 -0
  697. package/src/__tests__/Dropdown.tsx +57 -0
  698. package/src/__tests__/DropdownMenu.tsx +138 -0
  699. package/src/__tests__/FilterList.tsx +27 -0
  700. package/src/__tests__/FilterListItem.tsx +32 -0
  701. package/src/__tests__/FilteredSearch.tsx +27 -0
  702. package/src/__tests__/Flash.tsx +46 -0
  703. package/src/__tests__/Flex.tsx +59 -0
  704. package/src/__tests__/FormGroup.tsx +39 -0
  705. package/src/__tests__/Grid.tsx +83 -0
  706. package/src/__tests__/Header.tsx +50 -0
  707. package/src/__tests__/Heading.tsx +92 -0
  708. package/src/__tests__/Label.tsx +35 -0
  709. package/src/__tests__/LabelGroup.tsx +31 -0
  710. package/src/__tests__/Link.tsx +48 -0
  711. package/src/__tests__/Overlay.tsx +103 -0
  712. package/src/__tests__/Pagehead.tsx +24 -0
  713. package/src/__tests__/Pagination/Pagination.tsx +31 -0
  714. package/src/__tests__/Pagination/PaginationModel.tsx +133 -0
  715. package/src/__tests__/Pagination/__snapshots__/Pagination.tsx.snap +184 -0
  716. package/src/__tests__/PointerBox.tsx +35 -0
  717. package/src/__tests__/Popover.tsx +69 -0
  718. package/src/__tests__/Portal.tsx +103 -0
  719. package/src/__tests__/Position.tsx +118 -0
  720. package/src/__tests__/ProgressBar.tsx +41 -0
  721. package/src/__tests__/SelectMenu.tsx +142 -0
  722. package/src/__tests__/SelectPanel.tsx +65 -0
  723. package/src/__tests__/SideNav.tsx +63 -0
  724. package/src/__tests__/Spinner.tsx +44 -0
  725. package/src/__tests__/StateLabel.tsx +50 -0
  726. package/src/__tests__/StyledOcticon.tsx +28 -0
  727. package/src/__tests__/SubNav.tsx +51 -0
  728. package/src/__tests__/SubNavLink.tsx +32 -0
  729. package/src/__tests__/TabNav.tsx +33 -0
  730. package/src/__tests__/Text.tsx +79 -0
  731. package/src/__tests__/TextInput.tsx +50 -0
  732. package/src/__tests__/ThemeProvider.tsx +441 -0
  733. package/src/__tests__/Timeline.tsx +59 -0
  734. package/src/__tests__/Tooltip.tsx +53 -0
  735. package/src/__tests__/Truncate.tsx +45 -0
  736. package/src/__tests__/UnderlineNav.tsx +59 -0
  737. package/src/__tests__/UnderlineNavLink.tsx +32 -0
  738. package/src/__tests__/__snapshots__/ActionList.tsx.snap +27 -0
  739. package/src/__tests__/__snapshots__/ActionMenu.tsx.snap +80 -0
  740. package/src/__tests__/__snapshots__/AnchoredOverlay.tsx.snap +332 -0
  741. package/src/__tests__/__snapshots__/Avatar.tsx.snap +19 -0
  742. package/src/__tests__/__snapshots__/AvatarStack.tsx.snap +377 -0
  743. package/src/__tests__/__snapshots__/BorderBox.tsx.snap +14 -0
  744. package/src/__tests__/__snapshots__/Box.tsx.snap +201 -0
  745. package/src/__tests__/__snapshots__/BranchName.tsx.snap +17 -0
  746. package/src/__tests__/__snapshots__/Breadcrumb.tsx.snap +29 -0
  747. package/src/__tests__/__snapshots__/BreadcrumbItem.tsx.snap +79 -0
  748. package/src/__tests__/__snapshots__/Button.tsx.snap +832 -0
  749. package/src/__tests__/__snapshots__/Caret.tsx.snap +373 -0
  750. package/src/__tests__/__snapshots__/CircleBadge.tsx.snap +141 -0
  751. package/src/__tests__/__snapshots__/CircleOcticon.tsx.snap +64 -0
  752. package/src/__tests__/__snapshots__/CounterLabel.tsx.snap +22 -0
  753. package/src/__tests__/__snapshots__/Details.tsx.snap +15 -0
  754. package/src/__tests__/__snapshots__/Dialog.tsx.snap +200 -0
  755. package/src/__tests__/__snapshots__/Dropdown.tsx.snap +249 -0
  756. package/src/__tests__/__snapshots__/DropdownMenu.tsx.snap +106 -0
  757. package/src/__tests__/__snapshots__/FilterList.tsx.snap +13 -0
  758. package/src/__tests__/__snapshots__/FilterListItem.tsx.snap +80 -0
  759. package/src/__tests__/__snapshots__/FilteredSearch.tsx.snap +32 -0
  760. package/src/__tests__/__snapshots__/Flash.tsx.snap +32 -0
  761. package/src/__tests__/__snapshots__/Flex.tsx.snap +130 -0
  762. package/src/__tests__/__snapshots__/FormGroup.tsx.snap +25 -0
  763. package/src/__tests__/__snapshots__/Grid.tsx.snap +178 -0
  764. package/src/__tests__/__snapshots__/Header.tsx.snap +79 -0
  765. package/src/__tests__/__snapshots__/Heading.tsx.snap +13 -0
  766. package/src/__tests__/__snapshots__/Label.tsx.snap +74 -0
  767. package/src/__tests__/__snapshots__/LabelGroup.tsx.snap +15 -0
  768. package/src/__tests__/__snapshots__/Link.tsx.snap +213 -0
  769. package/src/__tests__/__snapshots__/Pagehead.tsx.snap +15 -0
  770. package/src/__tests__/__snapshots__/PointerBox.tsx.snap +174 -0
  771. package/src/__tests__/__snapshots__/Popover.tsx.snap +4687 -0
  772. package/src/__tests__/__snapshots__/Position.tsx.snap +44 -0
  773. package/src/__tests__/__snapshots__/ProgressBar.tsx.snap +53 -0
  774. package/src/__tests__/__snapshots__/SelectMenu.tsx.snap +469 -0
  775. package/src/__tests__/__snapshots__/SelectPanel.tsx.snap +123 -0
  776. package/src/__tests__/__snapshots__/SideNav.tsx.snap +143 -0
  777. package/src/__tests__/__snapshots__/Spinner.tsx.snap +33 -0
  778. package/src/__tests__/__snapshots__/StateLabel.tsx.snap +409 -0
  779. package/src/__tests__/__snapshots__/StyledOcticon.tsx.snap +25 -0
  780. package/src/__tests__/__snapshots__/SubNav.tsx.snap +44 -0
  781. package/src/__tests__/__snapshots__/SubNavLink.tsx.snap +199 -0
  782. package/src/__tests__/__snapshots__/TabNav.tsx.snap +58 -0
  783. package/src/__tests__/__snapshots__/Text.tsx.snap +7 -0
  784. package/src/__tests__/__snapshots__/TextInput.tsx.snap +440 -0
  785. package/src/__tests__/__snapshots__/ThemeProvider.tsx.snap +15 -0
  786. package/src/__tests__/__snapshots__/Timeline.tsx.snap +159 -0
  787. package/src/__tests__/__snapshots__/Tooltip.tsx.snap +227 -0
  788. package/src/__tests__/__snapshots__/Truncate.tsx.snap +17 -0
  789. package/src/__tests__/__snapshots__/UnderlineNav.tsx.snap +59 -0
  790. package/src/__tests__/__snapshots__/UnderlineNavLink.tsx.snap +130 -0
  791. package/src/__tests__/behaviors/anchoredPosition.ts +295 -0
  792. package/src/__tests__/behaviors/focusTrap.tsx +236 -0
  793. package/src/__tests__/behaviors/focusZone.tsx +549 -0
  794. package/src/__tests__/behaviors/iterateFocusableElements.tsx +61 -0
  795. package/src/__tests__/filterObject.ts +54 -0
  796. package/src/__tests__/hooks/useAnchoredPosition.tsx +31 -0
  797. package/src/__tests__/hooks/useOnEscapePress.tsx +16 -0
  798. package/src/__tests__/hooks/useOnOutsideClick.tsx +48 -0
  799. package/src/__tests__/hooks/useOpenAndCloseFocus.tsx +48 -0
  800. package/src/__tests__/hooks/useProvidedStateOrCreate.tsx +39 -0
  801. package/src/__tests__/theme.ts +41 -0
  802. package/src/__tests__/themeGet.ts +15 -0
  803. package/src/__tests__/useSafeTimeout.tsx +36 -0
  804. package/src/behaviors/anchoredPosition.ts +442 -0
  805. package/src/behaviors/focusTrap.ts +184 -0
  806. package/src/behaviors/focusZone.ts +713 -0
  807. package/src/constants.ts +62 -0
  808. package/src/hooks/index.ts +11 -0
  809. package/src/hooks/useAnchoredPosition.ts +53 -0
  810. package/src/hooks/useCombinedRefs.ts +40 -0
  811. package/src/hooks/useDetails.tsx +54 -0
  812. package/src/hooks/useDialog.ts +121 -0
  813. package/src/hooks/useFocusTrap.ts +80 -0
  814. package/src/hooks/useFocusZone.ts +64 -0
  815. package/src/hooks/useOnEscapePress.ts +63 -0
  816. package/src/hooks/useOnOutsideClick.tsx +82 -0
  817. package/src/hooks/useOpenAndCloseFocus.ts +27 -0
  818. package/src/hooks/useOverlay.tsx +32 -0
  819. package/src/hooks/useProvidedRefOrCreate.ts +14 -0
  820. package/src/hooks/useProvidedStateOrCreate.ts +27 -0
  821. package/src/hooks/useRenderForcingRef.ts +22 -0
  822. package/src/hooks/useResizeObserver.ts +11 -0
  823. package/src/hooks/useSafeTimeout.ts +38 -0
  824. package/src/hooks/useScrollFlash.ts +21 -0
  825. package/src/index.ts +165 -0
  826. package/src/polyfills/eventListenerSignal.ts +66 -0
  827. package/src/stories/ActionList.stories.tsx +364 -0
  828. package/src/stories/ActionMenu.stories.tsx +322 -0
  829. package/src/stories/AnchoredOverlay.stories.tsx +117 -0
  830. package/src/stories/AvatarStack.stories.tsx +37 -0
  831. package/src/stories/Button.stories.tsx +88 -0
  832. package/src/stories/ConfirmationDialog.stories.tsx +105 -0
  833. package/src/stories/Dialog.stories.tsx +240 -0
  834. package/src/stories/DropdownMenu.stories.tsx +84 -0
  835. package/src/stories/Overlay.stories.tsx +186 -0
  836. package/src/stories/Portal.stories.tsx +109 -0
  837. package/src/stories/SelectPanel.stories.tsx +300 -0
  838. package/src/stories/ThemeProvider.stories.tsx +104 -0
  839. package/src/stories/useAnchoredPosition.stories.tsx +320 -0
  840. package/src/stories/useFocusTrap.stories.tsx +400 -0
  841. package/src/stories/useFocusZone.stories.tsx +663 -0
  842. package/src/sx.ts +9 -0
  843. package/src/theme-preval.js +136 -0
  844. package/src/theme.ts +3 -0
  845. package/src/utils/deprecate.tsx +73 -0
  846. package/src/utils/isNumeric.tsx +4 -0
  847. package/src/utils/iterateFocusableElements.ts +121 -0
  848. package/src/utils/ssr.tsx +1 -0
  849. package/src/utils/test-deprecations.tsx +19 -0
  850. package/src/utils/test-helpers.tsx +7 -0
  851. package/src/utils/test-matchers.tsx +109 -0
  852. package/src/utils/testing.tsx +243 -0
  853. package/src/utils/theme.js +64 -0
  854. package/src/utils/types.ts +90 -0
  855. package/src/utils/uniqueId.ts +6 -0
  856. package/src/utils/userAgent.ts +7 -0
  857. package/stats.html +3279 -0
  858. package/tsconfig.build.json +7 -0
  859. package/tsconfig.json +20 -0
@@ -0,0 +1,253 @@
1
+ import React from 'react'
2
+ import type {AriaRole} from '../utils/types'
3
+ import {Group, GroupProps} from './Group'
4
+ import {Item, ItemProps} from './Item'
5
+ import {Divider} from './Divider'
6
+ import styled from 'styled-components'
7
+ import {get} from '../constants'
8
+ import {SystemCssProperties} from '@styled-system/css'
9
+ import {hasActiveDescendantAttribute} from '../behaviors/focusZone'
10
+
11
+ export type ItemInput = ItemProps | (Partial<ItemProps> & {renderItem: typeof Item})
12
+
13
+ /**
14
+ * Contract for props passed to the `List` component.
15
+ */
16
+ export interface ListPropsBase {
17
+ /**
18
+ * A collection of `Item` props and `Item`-level custom `Item` renderers.
19
+ */
20
+ items: ItemInput[]
21
+
22
+ /**
23
+ * The ARIA role describing the function of `List` component. `listbox` is a common value.
24
+ */
25
+ role?: AriaRole
26
+
27
+ /**
28
+ * id to attach to the base DOM node of the list
29
+ */
30
+ id?: string
31
+
32
+ /**
33
+ * A `List`-level custom `Item` renderer. Every `Item` within this `List`
34
+ * without a `Group`-level or `Item`-level custom `Item` renderer will be
35
+ * rendered using this function component.
36
+ */
37
+ renderItem?: typeof Item
38
+
39
+ /**
40
+ * A `List`-level custom `Group` renderer. Every `Group` within this `List`
41
+ * without a `Group`-level custom `Item` renderer will be rendered using
42
+ * this function component.
43
+ */
44
+ renderGroup?: typeof Group
45
+
46
+ /**
47
+ * Style variations. Usage is discretionary.
48
+ *
49
+ * - `"inset"` - `List` children are offset (vertically and horizontally) from `List`’s edges
50
+ * - `"full"` - `List` children are flush (vertically and horizontally) with `List` edges
51
+ */
52
+ variant?: 'inset' | 'full'
53
+
54
+ /**
55
+ * For `Item`s which can be selected, whether `multiple` `Item`s or a `single` `Item` can be selected
56
+ */
57
+ selectionVariant?: 'single' | 'multiple'
58
+
59
+ /**
60
+ * Whether to display a divider above each `Item` in this `List` when it does not follow a `Header` or `Divider`.
61
+ */
62
+ showItemDividers?: boolean
63
+ }
64
+
65
+ /**
66
+ * Contract for props passed to the `List` component, when its `Item`s are collected in `Group`s.
67
+ */
68
+ export interface GroupedListProps extends ListPropsBase {
69
+ /**
70
+ * A collection of `Group` props (except `items`), plus a unique group identifier
71
+ * and `Group`-level custom `Item` or `Group` renderers.
72
+ */
73
+ groupMetadata: ((
74
+ | Omit<GroupProps, 'items'>
75
+ | Omit<Partial<GroupProps> & {renderItem?: typeof Item; renderGroup?: typeof Group}, 'items'>
76
+ ) & {groupId: string})[]
77
+
78
+ /**
79
+ * A collection of `Item` props, plus associated group identifiers
80
+ * and `Item`-level custom `Item` renderers.
81
+ */
82
+ items: ((ItemProps | (Partial<ItemProps> & {renderItem: typeof Item})) & {groupId: string})[]
83
+ }
84
+
85
+ /**
86
+ * Asserts that the given value fulfills the `GroupedListProps` contract.
87
+ * @param props A value which fulfills either the `ListPropsBase` or the `GroupedListProps` contract.
88
+ */
89
+ function isGroupedListProps(props: ListProps): props is GroupedListProps {
90
+ return 'groupMetadata' in props
91
+ }
92
+
93
+ /**
94
+ * Contract for props passed to the `List` component.
95
+ */
96
+ export type ListProps = ListPropsBase | GroupedListProps
97
+
98
+ const StyledList = styled.div`
99
+ font-size: ${get('fontSizes.1')};
100
+ /* 14px font-size * 1.428571429 = 20px line height
101
+ *
102
+ * TODO: When rem-based spacing on a 4px scale lands, replace
103
+ * hardcoded '20px'
104
+ */
105
+ line-height: 20px;
106
+
107
+ &[${hasActiveDescendantAttribute}], &:focus-within {
108
+ --item-hover-bg-override: none;
109
+ --item-hover-divider-border-color-override: ${get('colors.border.muted')};
110
+ }
111
+ `
112
+
113
+ /**
114
+ * Returns `sx` prop values for `List` children matching the given `List` style variation.
115
+ * @param variant `List` style variation.
116
+ */
117
+ function useListVariant(variant: ListProps['variant'] = 'inset'): {
118
+ firstGroupStyle?: SystemCssProperties
119
+ lastGroupStyle?: SystemCssProperties
120
+ headerStyle?: SystemCssProperties
121
+ itemStyle?: SystemCssProperties
122
+ } {
123
+ switch (variant) {
124
+ case 'full':
125
+ return {
126
+ headerStyle: {paddingX: get('space.2')},
127
+ itemStyle: {borderRadius: 0}
128
+ }
129
+ default:
130
+ return {
131
+ firstGroupStyle: {marginTop: get('space.2')},
132
+ lastGroupStyle: {marginBottom: get('space.2')},
133
+ itemStyle: {marginX: get('space.2')}
134
+ }
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Lists `Item`s, either grouped or ungrouped, with a `Divider` between each `Group`.
140
+ */
141
+ export const List = React.forwardRef<HTMLDivElement, ListProps>((props, forwardedRef): JSX.Element => {
142
+ // Get `sx` prop values for `List` children matching the given `List` style variation.
143
+ const {firstGroupStyle, lastGroupStyle, headerStyle, itemStyle} = useListVariant(props.variant)
144
+
145
+ /**
146
+ * Render a `Group` using the first of the following renderers that is defined:
147
+ * A `Group`-level or `List`-level custom `Group` renderer, or
148
+ * the default `Group` renderer.
149
+ */
150
+ const renderGroup = (
151
+ groupProps: GroupProps | (Partial<GroupProps> & {renderItem?: typeof Item; renderGroup?: typeof Group})
152
+ ) => {
153
+ const GroupComponent = (('renderGroup' in groupProps && groupProps.renderGroup) ?? props.renderGroup) || Group
154
+ return <GroupComponent {...groupProps} key={groupProps.groupId} />
155
+ }
156
+
157
+ /**
158
+ * Render an `Item` using the first of the following renderers that is defined:
159
+ * An `Item`-level, `Group`-level, or `List`-level custom `Item` renderer,
160
+ * or the default `Item` renderer.
161
+ */
162
+ const renderItem = (itemProps: ItemInput, item: ItemInput, itemIndex: number) => {
163
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
164
+ const ItemComponent = ('renderItem' in itemProps && itemProps.renderItem) || props.renderItem || Item
165
+ const key = itemProps.key ?? itemProps.id?.toString() ?? itemIndex.toString()
166
+ return (
167
+ <ItemComponent
168
+ showDivider={props.showItemDividers}
169
+ selectionVariant={props.selectionVariant}
170
+ {...itemProps}
171
+ key={key}
172
+ sx={{...itemStyle, ...itemProps.sx}}
173
+ item={item}
174
+ />
175
+ )
176
+ }
177
+
178
+ /**
179
+ * An array of `Group`s, each with an associated `Header` and with an array of `Item`s belonging to that `Group`.
180
+ */
181
+ let groups: (GroupProps | (Partial<GroupProps> & {renderItem?: typeof Item; renderGroup?: typeof Group}))[] = []
182
+
183
+ // Collect rendered `Item`s into `Group`s, avoiding excess iteration over the lists of `items` and `groupMetadata`:
184
+ if (!isGroupedListProps(props)) {
185
+ // When no `groupMetadata`s is provided, collect rendered `Item`s into a single anonymous `Group`.
186
+ groups = [{items: props.items.map((item, index) => renderItem(item, item, index)), groupId: '0'}]
187
+ } else {
188
+ // When `groupMetadata` is provided, collect rendered `Item`s into their associated `Group`s.
189
+
190
+ /**
191
+ * A map of group identifiers to `Group`s, each with an associated array of `Item`s belonging to that `Group`.
192
+ */
193
+ const groupMap = props.groupMetadata.reduce(
194
+ (groupAccumulator, groupMetadata) => groupAccumulator.set(groupMetadata.groupId, groupMetadata),
195
+ new Map<string, GroupProps | (Partial<GroupProps> & {renderItem?: typeof Item; renderGroup?: typeof Group})>()
196
+ )
197
+
198
+ for (const itemProps of props.items) {
199
+ // Look up the group associated with the current item.
200
+ const group = groupMap.get(itemProps.groupId)
201
+ const itemIndex = group?.items?.length ?? 0
202
+
203
+ // Upsert the group to include the current item (rendered).
204
+ groupMap.set(itemProps.groupId, {
205
+ ...group,
206
+ items: [
207
+ ...(group?.items ?? []),
208
+ renderItem(
209
+ {
210
+ showDivider: group?.showItemDividers,
211
+ ...(group && 'renderItem' in group && {renderItem: group.renderItem}),
212
+ ...itemProps
213
+ },
214
+ itemProps,
215
+ itemIndex
216
+ )
217
+ ]
218
+ })
219
+ }
220
+
221
+ groups = [...groupMap.values()]
222
+ }
223
+
224
+ return (
225
+ <StyledList {...props} ref={forwardedRef}>
226
+ {groups.map(({header, ...groupProps}, index) => {
227
+ const hasFilledHeader = header?.variant === 'filled'
228
+ const shouldShowDivider = index > 0 && !hasFilledHeader
229
+ return (
230
+ <React.Fragment key={groupProps.groupId}>
231
+ {shouldShowDivider ? <Divider key={`${groupProps.groupId}-divider`} /> : null}
232
+ {renderGroup({
233
+ sx: {
234
+ ...(index === 0 && firstGroupStyle),
235
+ ...(index === groups.length - 1 && lastGroupStyle),
236
+ ...(index > 0 && !shouldShowDivider && {mt: 2})
237
+ },
238
+ ...(header && {
239
+ header: {
240
+ ...header,
241
+ sx: {...headerStyle, ...header.sx}
242
+ }
243
+ }),
244
+ ...groupProps
245
+ })}
246
+ </React.Fragment>
247
+ )
248
+ })}
249
+ </StyledList>
250
+ )
251
+ })
252
+
253
+ List.displayName = 'ActionList'
@@ -0,0 +1,21 @@
1
+ import {List} from './List'
2
+ import {Group} from './Group'
3
+ import {Item} from './Item'
4
+ import {Divider} from './Divider'
5
+ export type {ListProps as ActionListProps} from './List'
6
+ export type {GroupProps} from './Group'
7
+ export type {ItemProps} from './Item'
8
+
9
+ /**
10
+ * Collection of list-related components.
11
+ */
12
+ export const ActionList = Object.assign(List, {
13
+ /** Collects related `Items` in an `ActionList`. */
14
+ Group,
15
+
16
+ /** An actionable or selectable `Item` with an optional icon and description. */
17
+ Item,
18
+
19
+ /** Visually separates `Item`s or `Group`s in an `ActionList`. */
20
+ Divider
21
+ })
@@ -0,0 +1,106 @@
1
+ import {GroupedListProps, List, ListPropsBase} from './ActionList/List'
2
+ import {Item, ItemProps} from './ActionList/Item'
3
+ import {Divider} from './ActionList/Divider'
4
+ import Button, {ButtonProps} from './Button'
5
+ import React, {useCallback, useMemo} from 'react'
6
+ import {AnchoredOverlay} from './AnchoredOverlay'
7
+ import {useProvidedStateOrCreate} from './hooks/useProvidedStateOrCreate'
8
+ import {OverlayProps} from './Overlay'
9
+ import {useProvidedRefOrCreate} from './hooks'
10
+ import {AnchoredOverlayWrapperAnchorProps} from './AnchoredOverlay/AnchoredOverlay'
11
+
12
+ interface ActionMenuBaseProps extends Partial<Omit<GroupedListProps, keyof ListPropsBase>>, ListPropsBase {
13
+ /**
14
+ * Content that is passed into the renderAnchor component, which is a button by default.
15
+ */
16
+ anchorContent?: React.ReactNode
17
+
18
+ /**
19
+ * A callback that triggers both on clicks and keyboard events. This callback will be overridden by item level `onAction` callbacks.
20
+ */
21
+ onAction?: (props: ItemProps, event?: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>) => void
22
+
23
+ /**
24
+ * If defined, will control the open/closed state of the overlay. Must be used in conjuction with `setOpen`.
25
+ */
26
+ open?: boolean
27
+
28
+ /**
29
+ * If defined, will control the open/closed state of the overlay. Must be used in conjuction with `open`.
30
+ */
31
+ setOpen?: (s: boolean) => void
32
+
33
+ /**
34
+ * Props to be spread on the internal `Overlay` component.
35
+ */
36
+ overlayProps?: Partial<OverlayProps>
37
+ }
38
+
39
+ export type ActionMenuProps = ActionMenuBaseProps & AnchoredOverlayWrapperAnchorProps
40
+
41
+ const ActionMenuItem = (props: ItemProps) => <Item role="menuitem" {...props} />
42
+
43
+ ActionMenuItem.displayName = 'ActionMenu.Item'
44
+
45
+ const ActionMenuBase = ({
46
+ anchorContent,
47
+ renderAnchor = <T extends ButtonProps>(props: T) => <Button {...props} />,
48
+ anchorRef: externalAnchorRef,
49
+ onAction,
50
+ open,
51
+ setOpen,
52
+ overlayProps,
53
+ items,
54
+ ...listProps
55
+ }: ActionMenuProps): JSX.Element => {
56
+ const [combinedOpenState, setCombinedOpenState] = useProvidedStateOrCreate(open, setOpen, false)
57
+ const anchorRef = useProvidedRefOrCreate(externalAnchorRef)
58
+ const onOpen = useCallback(() => setCombinedOpenState(true), [setCombinedOpenState])
59
+ const onClose = useCallback(() => setCombinedOpenState(false), [setCombinedOpenState])
60
+
61
+ const renderMenuAnchor = useMemo(() => {
62
+ if (renderAnchor === null) {
63
+ return null
64
+ }
65
+ return <T extends React.HTMLAttributes<HTMLElement>>(props: T) => {
66
+ return renderAnchor({
67
+ 'aria-label': 'menu',
68
+ children: anchorContent,
69
+ ...props
70
+ })
71
+ }
72
+ }, [anchorContent, renderAnchor])
73
+
74
+ const itemsToRender = useMemo(() => {
75
+ return items.map(item => {
76
+ return {
77
+ ...item,
78
+ role: 'menuitem',
79
+ onAction: (props, event) => {
80
+ const actionCallback = item.onAction ?? onAction
81
+ actionCallback?.(props as ItemProps, event)
82
+ if (!event.defaultPrevented) {
83
+ onClose()
84
+ }
85
+ }
86
+ } as ItemProps
87
+ })
88
+ }, [items, onAction, onClose])
89
+
90
+ return (
91
+ <AnchoredOverlay
92
+ renderAnchor={renderMenuAnchor}
93
+ anchorRef={anchorRef}
94
+ open={combinedOpenState}
95
+ onOpen={onOpen}
96
+ onClose={onClose}
97
+ overlayProps={overlayProps}
98
+ >
99
+ <List {...listProps} role="menu" items={itemsToRender} />
100
+ </AnchoredOverlay>
101
+ )
102
+ }
103
+
104
+ ActionMenuBase.displayName = 'ActionMenu'
105
+
106
+ export const ActionMenu = Object.assign(ActionMenuBase, {Divider, Item: ActionMenuItem})
@@ -0,0 +1,180 @@
1
+ import React, {useCallback, useEffect} from 'react'
2
+ import Overlay, {OverlayProps} from '../Overlay'
3
+ import {FocusTrapHookSettings, useFocusTrap} from '../hooks/useFocusTrap'
4
+ import {FocusZoneHookSettings, useFocusZone} from '../hooks/useFocusZone'
5
+ import {useAnchoredPosition, useProvidedRefOrCreate, useRenderForcingRef} from '../hooks'
6
+ import {useSSRSafeId} from '@react-aria/ssr'
7
+
8
+ interface AnchoredOverlayPropsWithAnchor {
9
+ /**
10
+ * A custom function component used to render the anchor element.
11
+ * Will receive the selected text as `children` prop when an item is activated.
12
+ */
13
+ renderAnchor: <T extends React.HTMLAttributes<HTMLElement>>(props: T) => JSX.Element
14
+
15
+ /**
16
+ * An override to the internal ref that will be spread on to the renderAnchor
17
+ */
18
+ anchorRef?: React.RefObject<HTMLElement>
19
+ }
20
+
21
+ interface AnchoredOverlayPropsWithoutAnchor {
22
+ /**
23
+ * A custom function component used to render the anchor element.
24
+ * When renderAnchor is null, an anchorRef is required.
25
+ */
26
+ renderAnchor: null
27
+
28
+ /**
29
+ * An override to the internal renderAnchor ref that will be used to position the overlay.
30
+ * When renderAnchor is null this can be used to make an anchor that is detached from ActionMenu.
31
+ */
32
+ anchorRef: React.RefObject<HTMLElement>
33
+ }
34
+
35
+ export type AnchoredOverlayWrapperAnchorProps =
36
+ | Partial<AnchoredOverlayPropsWithAnchor>
37
+ | AnchoredOverlayPropsWithoutAnchor
38
+
39
+ interface AnchoredOverlayBaseProps extends Pick<OverlayProps, 'height' | 'width'> {
40
+ /**
41
+ * Determines whether the overlay portion of the component should be shown or not
42
+ */
43
+ open: boolean
44
+
45
+ /**
46
+ * A callback which is called whenever the overlay is currently closed and an "open gesture" is detected.
47
+ */
48
+ onOpen?: (gesture: 'anchor-click' | 'anchor-key-press') => unknown
49
+
50
+ /**
51
+ * A callback which is called whenever the overlay is currently open and a "close gesture" is detected.
52
+ */
53
+ onClose?: (gesture: 'anchor-click' | 'click-outside' | 'escape') => unknown
54
+
55
+ /**
56
+ * Props to be spread on the internal `Overlay` component.
57
+ */
58
+ overlayProps?: Partial<OverlayProps>
59
+
60
+ /**
61
+ * Settings to apply to the Focus Zone on the internal `Overlay` component.
62
+ */
63
+ focusTrapSettings?: Partial<FocusTrapHookSettings>
64
+
65
+ /**
66
+ * Settings to apply to the Focus Zone on the internal `Overlay` component.
67
+ */
68
+ focusZoneSettings?: Partial<FocusZoneHookSettings>
69
+ }
70
+
71
+ export type AnchoredOverlayProps = AnchoredOverlayBaseProps &
72
+ (AnchoredOverlayPropsWithAnchor | AnchoredOverlayPropsWithoutAnchor)
73
+
74
+ /**
75
+ * An `AnchoredOverlay` provides an anchor that will open a floating overlay positioned relative to the anchor.
76
+ * The overlay can be opened and navigated using keyboard or mouse.
77
+ */
78
+ export const AnchoredOverlay: React.FC<AnchoredOverlayProps> = ({
79
+ renderAnchor,
80
+ anchorRef: externalAnchorRef,
81
+ children,
82
+ open,
83
+ onOpen,
84
+ onClose,
85
+ height,
86
+ width,
87
+ overlayProps,
88
+ focusTrapSettings,
89
+ focusZoneSettings
90
+ }) => {
91
+ const anchorRef = useProvidedRefOrCreate(externalAnchorRef)
92
+ const [overlayRef, updateOverlayRef] = useRenderForcingRef<HTMLDivElement>()
93
+ const anchorId = useSSRSafeId()
94
+
95
+ const onClickOutside = useCallback(() => onClose?.('click-outside'), [onClose])
96
+ const onEscape = useCallback(() => onClose?.('escape'), [onClose])
97
+
98
+ const onAnchorKeyDown = useCallback(
99
+ (event: React.KeyboardEvent<HTMLElement>) => {
100
+ if (!event.defaultPrevented) {
101
+ if (!open && ['ArrowDown', 'ArrowUp', ' ', 'Enter'].includes(event.key)) {
102
+ onOpen?.('anchor-key-press')
103
+ event.preventDefault()
104
+ }
105
+ }
106
+ },
107
+ [open, onOpen]
108
+ )
109
+ const onAnchorClick = useCallback(
110
+ (event: React.MouseEvent<HTMLElement>) => {
111
+ if (event.defaultPrevented || event.button !== 0) {
112
+ return
113
+ }
114
+ if (!open) {
115
+ onOpen?.('anchor-click')
116
+ } else {
117
+ onClose?.('anchor-click')
118
+ }
119
+ },
120
+ [open, onOpen, onClose]
121
+ )
122
+
123
+ const {position} = useAnchoredPosition(
124
+ {
125
+ anchorElementRef: anchorRef,
126
+ floatingElementRef: overlayRef
127
+ },
128
+ [overlayRef.current]
129
+ )
130
+
131
+ useEffect(() => {
132
+ // ensure overlay ref gets cleared when closed, so position can reset between closing/re-opening
133
+ if (!open && overlayRef.current) {
134
+ updateOverlayRef(null)
135
+ }
136
+ }, [open, overlayRef, updateOverlayRef])
137
+
138
+ useFocusZone({
139
+ containerRef: overlayRef,
140
+ disabled: !open || !position,
141
+ ...focusZoneSettings
142
+ })
143
+ useFocusTrap({containerRef: overlayRef, disabled: !open || !position, ...focusTrapSettings})
144
+
145
+ return (
146
+ <>
147
+ {renderAnchor &&
148
+ renderAnchor({
149
+ ref: anchorRef,
150
+ id: anchorId,
151
+ 'aria-labelledby': anchorId,
152
+ 'aria-haspopup': 'true',
153
+ tabIndex: 0,
154
+ onClick: onAnchorClick,
155
+ onKeyDown: onAnchorKeyDown
156
+ })}
157
+ {open ? (
158
+ <Overlay
159
+ returnFocusRef={anchorRef}
160
+ onClickOutside={onClickOutside}
161
+ ignoreClickRefs={[anchorRef]}
162
+ onEscape={onEscape}
163
+ ref={updateOverlayRef}
164
+ role="none"
165
+ visibility={position ? 'visible' : 'hidden'}
166
+ height={height}
167
+ width={width}
168
+ top={position?.top || 0}
169
+ left={position?.left || 0}
170
+ anchorSide={position?.anchorSide}
171
+ {...overlayProps}
172
+ >
173
+ {children}
174
+ </Overlay>
175
+ ) : null}
176
+ </>
177
+ )
178
+ }
179
+
180
+ AnchoredOverlay.displayName = 'AnchoredOverlay'
@@ -0,0 +1,2 @@
1
+ export {AnchoredOverlay} from './AnchoredOverlay'
2
+ export type {AnchoredOverlayProps} from './AnchoredOverlay'
package/src/Avatar.tsx ADDED
@@ -0,0 +1,46 @@
1
+ import styled from 'styled-components'
2
+ import {COMMON, get, SystemCommonProps} from './constants'
3
+ import sx, {SxProp} from './sx'
4
+ import {ComponentProps} from './utils/types'
5
+
6
+ type StyledAvatarProps = {
7
+ /** Sets the width and height of the avatar. */
8
+ size?: number
9
+ /** Sets the shape of the avatar to a square if true. If false, the avatar will be circular. */
10
+ square?: boolean
11
+ /** URL of the avatar image. */
12
+ src: string
13
+ /** Provide alt text when the Avatar is used without the user's name next to it. */
14
+ alt?: string
15
+ } & SystemCommonProps &
16
+ SxProp
17
+
18
+ function getBorderRadius({size, square}: StyledAvatarProps) {
19
+ if (square) {
20
+ return size && size <= 24 ? '4px' : '6px'
21
+ } else {
22
+ return '50%'
23
+ }
24
+ }
25
+
26
+ const Avatar = styled.img.attrs<StyledAvatarProps>(props => ({
27
+ height: props.size,
28
+ width: props.size
29
+ }))<StyledAvatarProps>`
30
+ display: inline-block;
31
+ overflow: hidden; // Ensure page layout in Firefox should images fail to load
32
+ line-height: ${get('lineHeights.condensedUltra')};
33
+ vertical-align: middle;
34
+ border-radius: ${props => getBorderRadius(props)};
35
+ ${COMMON};
36
+ ${sx}
37
+ `
38
+
39
+ Avatar.defaultProps = {
40
+ size: 20,
41
+ alt: '',
42
+ square: false
43
+ }
44
+
45
+ export type AvatarProps = ComponentProps<typeof Avatar>
46
+ export default Avatar
@@ -0,0 +1,35 @@
1
+ import React from 'react'
2
+ import styled from 'styled-components'
3
+ import Avatar from './Avatar'
4
+ import {get} from './constants'
5
+ import {Box, BoxProps} from '.'
6
+
7
+ const ChildAvatar = styled(Avatar)`
8
+ position: absolute;
9
+ right: -15%;
10
+ bottom: -9%;
11
+ box-shadow: ${get('shadows.avatar.childShadow')};
12
+ `
13
+
14
+ export type AvatarPairProps = BoxProps
15
+
16
+ const AvatarPair = ({children, ...rest}: AvatarPairProps) => {
17
+ const avatars = React.Children.map(children, (child, i) => {
18
+ if (!React.isValidElement(child)) return child
19
+ return i === 0 ? (
20
+ React.cloneElement(child, {size: 40})
21
+ ) : (
22
+ <ChildAvatar bg="canvas.default" {...child.props} size={20} />
23
+ )
24
+ })
25
+ return (
26
+ <Box position="relative" display="inline-flex" {...rest}>
27
+ {avatars}
28
+ </Box>
29
+ )
30
+ }
31
+
32
+ // styled() changes this
33
+ AvatarPair.displayName = 'AvatarPair'
34
+
35
+ export default AvatarPair