@primer/components 31.2.0-rc.b718ff50 → 31.2.0-rc.decfca99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/.github/workflows/ci.yml +5 -2
  2. package/.github/workflows/release.yml +1 -0
  3. package/.github/workflows/release_canary.yml +1 -0
  4. package/CHANGELOG.md +13 -1
  5. package/dist/browser.esm.js +620 -618
  6. package/dist/browser.esm.js.map +1 -1
  7. package/dist/browser.umd.js +188 -186
  8. package/dist/browser.umd.js.map +1 -1
  9. package/docs/content/ActionList2.mdx +360 -0
  10. package/docs/content/StateLabel.md +5 -4
  11. package/docs/content/getting-started.md +1 -1
  12. package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +17 -0
  13. package/lib/ActionList/Divider.jsx +29 -0
  14. package/lib/ActionList/Group.jsx +23 -0
  15. package/lib/ActionList/Header.jsx +66 -0
  16. package/lib/ActionList/Item.jsx +301 -0
  17. package/lib/ActionList/List.jsx +138 -0
  18. package/lib/ActionList/index.js +12 -23
  19. package/lib/ActionList2/Description.d.ts +12 -0
  20. package/lib/ActionList2/Description.js +53 -0
  21. package/lib/ActionList2/Description.jsx +30 -0
  22. package/lib/ActionList2/Divider.d.ts +5 -0
  23. package/lib/ActionList2/Divider.js +35 -0
  24. package/lib/ActionList2/Divider.jsx +22 -0
  25. package/lib/ActionList2/Group.d.ts +11 -0
  26. package/lib/ActionList2/Group.js +57 -0
  27. package/lib/ActionList2/Group.jsx +25 -0
  28. package/lib/ActionList2/Header.d.ts +26 -0
  29. package/lib/ActionList2/Header.js +55 -0
  30. package/lib/ActionList2/Header.jsx +36 -0
  31. package/lib/ActionList2/Item.d.ts +63 -0
  32. package/lib/ActionList2/Item.js +244 -0
  33. package/lib/ActionList2/Item.jsx +174 -0
  34. package/lib/ActionList2/LinkItem.d.ts +17 -0
  35. package/lib/ActionList2/LinkItem.js +57 -0
  36. package/lib/ActionList2/LinkItem.jsx +28 -0
  37. package/lib/ActionList2/List.d.ts +26 -0
  38. package/lib/ActionList2/List.js +59 -0
  39. package/lib/ActionList2/List.jsx +41 -0
  40. package/lib/ActionList2/Selection.d.ts +5 -0
  41. package/lib/ActionList2/Selection.js +70 -0
  42. package/lib/ActionList2/Selection.jsx +36 -0
  43. package/lib/ActionList2/Visuals.d.ts +9 -0
  44. package/lib/ActionList2/Visuals.js +90 -0
  45. package/lib/ActionList2/Visuals.jsx +48 -0
  46. package/lib/ActionList2/index.d.ts +36 -0
  47. package/lib/ActionList2/index.js +29 -0
  48. package/lib/ActionMenu.jsx +73 -0
  49. package/lib/AnchoredOverlay/AnchoredOverlay.jsx +100 -0
  50. package/lib/AnchoredOverlay/index.js +4 -12
  51. package/lib/Autocomplete/Autocomplete.d.ts +28 -28
  52. package/lib/Autocomplete/Autocomplete.jsx +100 -0
  53. package/lib/Autocomplete/AutocompleteContext.jsx +5 -0
  54. package/lib/Autocomplete/AutocompleteInput.d.ts +28 -28
  55. package/lib/Autocomplete/AutocompleteInput.jsx +113 -0
  56. package/lib/Autocomplete/AutocompleteMenu.jsx +190 -0
  57. package/lib/Autocomplete/AutocompleteOverlay.jsx +55 -0
  58. package/lib/Autocomplete/index.js +7 -14
  59. package/lib/Avatar.jsx +34 -0
  60. package/lib/AvatarPair.jsx +29 -0
  61. package/lib/AvatarStack.jsx +151 -0
  62. package/lib/BaseStyles.jsx +65 -0
  63. package/lib/BorderBox.jsx +18 -0
  64. package/lib/Box.jsx +10 -0
  65. package/lib/BranchName.jsx +20 -0
  66. package/lib/Breadcrumbs.jsx +74 -0
  67. package/lib/Button/Button.d.ts +25 -25
  68. package/lib/Button/Button.jsx +60 -0
  69. package/lib/Button/ButtonBase.jsx +36 -0
  70. package/lib/Button/ButtonClose.d.ts +45 -45
  71. package/lib/Button/ButtonClose.jsx +55 -0
  72. package/lib/Button/ButtonDanger.d.ts +25 -25
  73. package/lib/Button/ButtonDanger.jsx +63 -0
  74. package/lib/Button/ButtonGroup.jsx +55 -0
  75. package/lib/Button/ButtonInvisible.d.ts +25 -25
  76. package/lib/Button/ButtonInvisible.jsx +52 -0
  77. package/lib/Button/ButtonOutline.d.ts +25 -25
  78. package/lib/Button/ButtonOutline.jsx +63 -0
  79. package/lib/Button/ButtonPrimary.d.ts +25 -25
  80. package/lib/Button/ButtonPrimary.jsx +62 -0
  81. package/lib/Button/ButtonStyles.jsx +37 -0
  82. package/lib/Button/ButtonTableList.jsx +49 -0
  83. package/lib/Button/index.js +21 -70
  84. package/lib/Caret.jsx +93 -0
  85. package/lib/CircleBadge.jsx +43 -0
  86. package/lib/CircleOcticon.d.ts +42 -42
  87. package/lib/CircleOcticon.jsx +21 -0
  88. package/lib/CounterLabel.jsx +44 -0
  89. package/lib/Details.jsx +21 -0
  90. package/lib/Dialog/ConfirmationDialog.jsx +146 -0
  91. package/lib/Dialog/Dialog.jsx +273 -0
  92. package/lib/Dialog.d.ts +45 -45
  93. package/lib/Dialog.jsx +131 -0
  94. package/lib/Dropdown.d.ts +176 -176
  95. package/lib/Dropdown.jsx +134 -0
  96. package/lib/DropdownMenu/DropdownButton.d.ts +46 -46
  97. package/lib/DropdownMenu/DropdownButton.jsx +14 -0
  98. package/lib/DropdownMenu/DropdownMenu.jsx +70 -0
  99. package/lib/DropdownMenu/index.js +6 -20
  100. package/lib/DropdownStyles.js +18 -26
  101. package/lib/FilterList.d.ts +42 -42
  102. package/lib/FilterList.jsx +63 -0
  103. package/lib/FilteredActionList/FilteredActionList.jsx +100 -0
  104. package/lib/FilteredActionList/index.js +4 -12
  105. package/lib/FilteredSearch.jsx +29 -0
  106. package/lib/Flash.jsx +70 -0
  107. package/lib/Flex.jsx +15 -0
  108. package/lib/FormGroup.jsx +25 -0
  109. package/lib/Grid.jsx +15 -0
  110. package/lib/Header.jsx +90 -0
  111. package/lib/Heading.jsx +21 -0
  112. package/lib/Label.jsx +84 -0
  113. package/lib/LabelGroup.jsx +19 -0
  114. package/lib/Link.jsx +38 -0
  115. package/lib/Overlay.jsx +156 -0
  116. package/lib/Pagehead.jsx +18 -0
  117. package/lib/Pagination/Pagination.jsx +163 -0
  118. package/lib/Pagination/index.js +6 -12
  119. package/lib/Pagination/model.jsx +174 -0
  120. package/lib/PointerBox.jsx +25 -0
  121. package/lib/Popover.jsx +210 -0
  122. package/lib/Portal/Portal.jsx +79 -0
  123. package/lib/Portal/index.js +5 -16
  124. package/lib/Position.d.ts +4 -4
  125. package/lib/Position.jsx +46 -0
  126. package/lib/ProgressBar.jsx +39 -0
  127. package/lib/SelectMenu/SelectMenu.d.ts +246 -246
  128. package/lib/SelectMenu/SelectMenu.jsx +114 -0
  129. package/lib/SelectMenu/SelectMenuContext.jsx +5 -0
  130. package/lib/SelectMenu/SelectMenuDivider.jsx +43 -0
  131. package/lib/SelectMenu/SelectMenuFilter.jsx +59 -0
  132. package/lib/SelectMenu/SelectMenuFooter.jsx +46 -0
  133. package/lib/SelectMenu/SelectMenuHeader.jsx +44 -0
  134. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  135. package/lib/SelectMenu/SelectMenuItem.jsx +143 -0
  136. package/lib/SelectMenu/SelectMenuList.jsx +60 -0
  137. package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +21 -0
  138. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  139. package/lib/SelectMenu/SelectMenuModal.jsx +119 -0
  140. package/lib/SelectMenu/SelectMenuTab.jsx +93 -0
  141. package/lib/SelectMenu/SelectMenuTabPanel.jsx +43 -0
  142. package/lib/SelectMenu/SelectMenuTabs.jsx +58 -0
  143. package/lib/SelectMenu/hooks/useKeyboardNav.js +80 -96
  144. package/lib/SelectMenu/index.js +7 -14
  145. package/lib/SelectPanel/SelectPanel.jsx +105 -0
  146. package/lib/SelectPanel/index.js +4 -12
  147. package/lib/SideNav.jsx +177 -0
  148. package/lib/Spinner.jsx +35 -0
  149. package/lib/StateLabel.d.ts +1 -1
  150. package/lib/StateLabel.js +6 -1
  151. package/lib/StateLabel.jsx +94 -0
  152. package/lib/StyledOcticon.jsx +20 -0
  153. package/lib/SubNav.jsx +104 -0
  154. package/lib/TabNav.jsx +60 -0
  155. package/lib/Text.jsx +14 -0
  156. package/lib/TextInput.jsx +23 -0
  157. package/lib/TextInputWithTokens.d.ts +28 -28
  158. package/lib/TextInputWithTokens.jsx +218 -0
  159. package/lib/ThemeProvider.jsx +130 -0
  160. package/lib/Timeline.d.ts +43 -43
  161. package/lib/Timeline.jsx +124 -0
  162. package/lib/Token/AvatarToken.d.ts +1 -1
  163. package/lib/Token/AvatarToken.jsx +54 -0
  164. package/lib/Token/IssueLabelToken.d.ts +1 -1
  165. package/lib/Token/IssueLabelToken.jsx +125 -0
  166. package/lib/Token/Token.d.ts +1 -1
  167. package/lib/Token/Token.jsx +103 -0
  168. package/lib/Token/TokenBase.jsx +88 -0
  169. package/lib/Token/_RemoveTokenButton.jsx +108 -0
  170. package/lib/Token/_TokenTextContainer.jsx +49 -0
  171. package/lib/Token/index.js +11 -30
  172. package/lib/Tooltip.jsx +246 -0
  173. package/lib/Truncate.jsx +27 -0
  174. package/lib/UnderlineNav.jsx +90 -0
  175. package/lib/_TextInputWrapper.js +2 -2
  176. package/lib/_TextInputWrapper.jsx +120 -0
  177. package/lib/_UnstyledTextInput.jsx +22 -0
  178. package/lib/__tests__/ActionList.test.jsx +49 -0
  179. package/lib/__tests__/ActionList.types.test.jsx +45 -0
  180. package/lib/__tests__/ActionList2.test.d.ts +1 -0
  181. package/lib/__tests__/ActionList2.test.js +53 -0
  182. package/lib/__tests__/ActionList2.test.jsx +46 -0
  183. package/lib/__tests__/ActionMenu.test.jsx +124 -0
  184. package/lib/__tests__/AnchoredOverlay.test.jsx +121 -0
  185. package/lib/__tests__/Autocomplete.test.jsx +299 -0
  186. package/lib/__tests__/Avatar.test.jsx +42 -0
  187. package/lib/__tests__/AvatarStack.test.jsx +43 -0
  188. package/lib/__tests__/BorderBox.test.jsx +36 -0
  189. package/lib/__tests__/Box.test.jsx +41 -0
  190. package/lib/__tests__/BranchName.test.jsx +27 -0
  191. package/lib/__tests__/Breadcrumbs.test.jsx +28 -0
  192. package/lib/__tests__/BreadcrumbsItem.test.jsx +31 -0
  193. package/lib/__tests__/Button.test.jsx +100 -0
  194. package/lib/__tests__/Caret.test.jsx +37 -0
  195. package/lib/__tests__/CircleBadge.test.jsx +55 -0
  196. package/lib/__tests__/CircleOcticon.test.jsx +45 -0
  197. package/lib/__tests__/ConfirmationDialog.test.jsx +119 -0
  198. package/lib/__tests__/CounterLabel.test.jsx +36 -0
  199. package/lib/__tests__/Details.test.jsx +85 -0
  200. package/lib/__tests__/Dialog.test.jsx +139 -0
  201. package/lib/__tests__/Dropdown.test.jsx +49 -0
  202. package/lib/__tests__/DropdownMenu.test.jsx +119 -0
  203. package/lib/__tests__/FilterList.test.jsx +27 -0
  204. package/lib/__tests__/FilterListItem.test.jsx +31 -0
  205. package/lib/__tests__/FilteredSearch.test.jsx +27 -0
  206. package/lib/__tests__/Flash.test.jsx +36 -0
  207. package/lib/__tests__/Flex.test.jsx +51 -0
  208. package/lib/__tests__/FormGroup.test.jsx +36 -0
  209. package/lib/__tests__/Grid.test.jsx +69 -0
  210. package/lib/__tests__/Header.test.jsx +45 -0
  211. package/lib/__tests__/Heading.test.jsx +71 -0
  212. package/lib/__tests__/KeyPaths.types.test.js +5 -8
  213. package/lib/__tests__/Label.test.jsx +33 -0
  214. package/lib/__tests__/LabelGroup.test.jsx +29 -0
  215. package/lib/__tests__/Link.test.jsx +43 -0
  216. package/lib/__tests__/Merge.types.test.js +13 -19
  217. package/lib/__tests__/Overlay.test.jsx +105 -0
  218. package/lib/__tests__/Pagehead.test.jsx +25 -0
  219. package/lib/__tests__/Pagination/Pagination.test.jsx +32 -0
  220. package/lib/__tests__/Pagination/PaginationModel.test.jsx +118 -0
  221. package/lib/__tests__/PointerBox.test.jsx +33 -0
  222. package/lib/__tests__/Popover.test.jsx +58 -0
  223. package/lib/__tests__/Portal.test.jsx +102 -0
  224. package/lib/__tests__/Position.test.jsx +96 -0
  225. package/lib/__tests__/ProgressBar.test.jsx +38 -0
  226. package/lib/__tests__/SelectMenu.test.jsx +120 -0
  227. package/lib/__tests__/SelectPanel.test.jsx +48 -0
  228. package/lib/__tests__/SideNav.test.jsx +55 -0
  229. package/lib/__tests__/Spinner.test.jsx +41 -0
  230. package/lib/__tests__/StateLabel.test.jsx +46 -0
  231. package/lib/__tests__/StyledOcticon.test.jsx +28 -0
  232. package/lib/__tests__/SubNav.test.jsx +47 -0
  233. package/lib/__tests__/SubNavLink.test.jsx +31 -0
  234. package/lib/__tests__/TabNav.test.jsx +32 -0
  235. package/lib/__tests__/Text.test.jsx +71 -0
  236. package/lib/__tests__/TextInput.test.jsx +45 -0
  237. package/lib/__tests__/TextInputWithTokens.test.jsx +302 -0
  238. package/lib/__tests__/ThemeProvider.test.jsx +314 -0
  239. package/lib/__tests__/Timeline.test.jsx +51 -0
  240. package/lib/__tests__/Token.test.jsx +93 -0
  241. package/lib/__tests__/Tooltip.test.jsx +46 -0
  242. package/lib/__tests__/Truncate.test.jsx +41 -0
  243. package/lib/__tests__/UnderlineNav.test.jsx +53 -0
  244. package/lib/__tests__/UnderlineNavLink.test.jsx +31 -0
  245. package/lib/__tests__/behaviors/anchoredPosition.test.js +229 -376
  246. package/lib/__tests__/behaviors/focusTrap.test.jsx +184 -0
  247. package/lib/__tests__/behaviors/focusZone.test.jsx +406 -0
  248. package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +58 -0
  249. package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +145 -216
  250. package/lib/__tests__/filterObject.test.js +48 -27
  251. package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +29 -0
  252. package/lib/__tests__/hooks/useOnEscapePress.test.jsx +19 -0
  253. package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +63 -0
  254. package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +61 -0
  255. package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +56 -0
  256. package/lib/__tests__/theme.test.js +33 -34
  257. package/lib/__tests__/themeGet.test.js +12 -23
  258. package/lib/__tests__/useSafeTimeout.test.jsx +36 -0
  259. package/lib/__tests__/utils/createSlots.test.d.ts +1 -0
  260. package/lib/__tests__/utils/createSlots.test.js +75 -0
  261. package/lib/__tests__/utils/createSlots.test.jsx +57 -0
  262. package/lib/behaviors/anchoredPosition.js +205 -234
  263. package/lib/behaviors/focusTrap.js +121 -157
  264. package/lib/behaviors/focusZone.js +434 -509
  265. package/lib/behaviors/scrollIntoViewingArea.js +18 -35
  266. package/lib/constants.js +39 -43
  267. package/lib/drafts.d.ts +7 -0
  268. package/lib/drafts.js +20 -0
  269. package/lib/hooks/index.js +16 -60
  270. package/lib/hooks/useAnchoredPosition.js +32 -40
  271. package/lib/hooks/useCombinedRefs.js +32 -36
  272. package/lib/hooks/useDetails.jsx +39 -0
  273. package/lib/hooks/useDialog.js +72 -96
  274. package/lib/hooks/useFocusTrap.js +43 -60
  275. package/lib/hooks/useFocusZone.js +54 -50
  276. package/lib/hooks/useOnEscapePress.js +25 -36
  277. package/lib/hooks/useOnOutsideClick.jsx +61 -0
  278. package/lib/hooks/useOpenAndCloseFocus.js +22 -34
  279. package/lib/hooks/useOverlay.jsx +15 -0
  280. package/lib/hooks/useProvidedRefOrCreate.js +10 -14
  281. package/lib/hooks/useProvidedStateOrCreate.js +13 -16
  282. package/lib/hooks/useRenderForcingRef.js +13 -17
  283. package/lib/hooks/useResizeObserver.js +15 -18
  284. package/lib/hooks/useSafeTimeout.js +22 -30
  285. package/lib/hooks/useScrollFlash.js +16 -23
  286. package/lib/index.js +161 -636
  287. package/lib/polyfills/eventListenerSignal.js +37 -45
  288. package/lib/stories/ActionList2.stories.js +908 -0
  289. package/lib/stories/TextInput.stories.js +144 -0
  290. package/lib/sx.d.ts +2 -0
  291. package/lib/sx.js +10 -14
  292. package/lib/theme-preval.js +65 -2945
  293. package/lib/theme.js +3 -12
  294. package/lib/utils/create-slots.d.ts +17 -0
  295. package/lib/utils/create-slots.js +105 -0
  296. package/lib/utils/create-slots.jsx +65 -0
  297. package/lib/utils/deprecate.jsx +59 -0
  298. package/lib/utils/isNumeric.jsx +7 -0
  299. package/lib/utils/iterateFocusableElements.js +63 -85
  300. package/lib/utils/ssr.jsx +6 -0
  301. package/lib/utils/test-deprecations.jsx +20 -0
  302. package/lib/utils/test-helpers.jsx +8 -0
  303. package/lib/utils/test-matchers.jsx +100 -0
  304. package/lib/utils/testing.d.ts +14 -1
  305. package/lib/utils/testing.jsx +206 -0
  306. package/lib/utils/theme.js +33 -47
  307. package/lib/utils/types/AriaRole.js +2 -1
  308. package/lib/utils/types/ComponentProps.js +2 -1
  309. package/lib/utils/types/Flatten.js +2 -1
  310. package/lib/utils/types/KeyPaths.js +2 -1
  311. package/lib/utils/types/MandateProps.js +16 -1
  312. package/lib/utils/types/Merge.js +2 -1
  313. package/lib/utils/types/index.js +16 -69
  314. package/lib/utils/uniqueId.js +5 -8
  315. package/lib/utils/use-force-update.d.ts +1 -0
  316. package/lib/utils/use-force-update.js +13 -0
  317. package/lib/utils/useIsomorphicLayoutEffect.js +8 -11
  318. package/lib/utils/userAgent.js +8 -12
  319. package/lib-esm/ActionList2/Description.d.ts +12 -0
  320. package/lib-esm/ActionList2/Description.js +37 -0
  321. package/lib-esm/ActionList2/Divider.d.ts +5 -0
  322. package/lib-esm/ActionList2/Divider.js +23 -0
  323. package/lib-esm/ActionList2/Group.d.ts +11 -0
  324. package/lib-esm/ActionList2/Group.js +40 -0
  325. package/lib-esm/ActionList2/Header.d.ts +26 -0
  326. package/lib-esm/ActionList2/Header.js +44 -0
  327. package/lib-esm/ActionList2/Item.d.ts +63 -0
  328. package/lib-esm/ActionList2/Item.js +210 -0
  329. package/lib-esm/ActionList2/LinkItem.d.ts +17 -0
  330. package/lib-esm/ActionList2/LinkItem.js +43 -0
  331. package/lib-esm/ActionList2/List.d.ts +26 -0
  332. package/lib-esm/ActionList2/List.js +37 -0
  333. package/lib-esm/ActionList2/Selection.d.ts +5 -0
  334. package/lib-esm/ActionList2/Selection.js +52 -0
  335. package/lib-esm/ActionList2/Visuals.d.ts +9 -0
  336. package/lib-esm/ActionList2/Visuals.js +68 -0
  337. package/lib-esm/ActionList2/index.d.ts +36 -0
  338. package/lib-esm/ActionList2/index.js +33 -0
  339. package/lib-esm/Autocomplete/Autocomplete.d.ts +28 -28
  340. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +28 -28
  341. package/lib-esm/Button/Button.d.ts +25 -25
  342. package/lib-esm/Button/ButtonClose.d.ts +45 -45
  343. package/lib-esm/Button/ButtonDanger.d.ts +25 -25
  344. package/lib-esm/Button/ButtonInvisible.d.ts +25 -25
  345. package/lib-esm/Button/ButtonOutline.d.ts +25 -25
  346. package/lib-esm/Button/ButtonPrimary.d.ts +25 -25
  347. package/lib-esm/CircleOcticon.d.ts +42 -42
  348. package/lib-esm/Dialog.d.ts +45 -45
  349. package/lib-esm/Dropdown.d.ts +176 -176
  350. package/lib-esm/DropdownMenu/DropdownButton.d.ts +46 -46
  351. package/lib-esm/FilterList.d.ts +42 -42
  352. package/lib-esm/Position.d.ts +4 -4
  353. package/lib-esm/SelectMenu/SelectMenu.d.ts +246 -246
  354. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  355. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  356. package/lib-esm/StateLabel.d.ts +1 -1
  357. package/lib-esm/StateLabel.js +7 -2
  358. package/lib-esm/TextInputWithTokens.d.ts +28 -28
  359. package/lib-esm/Timeline.d.ts +43 -43
  360. package/lib-esm/Token/AvatarToken.d.ts +1 -1
  361. package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
  362. package/lib-esm/Token/Token.d.ts +1 -1
  363. package/lib-esm/_TextInputWrapper.js +2 -2
  364. package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
  365. package/lib-esm/__tests__/ActionList2.test.js +41 -0
  366. package/lib-esm/__tests__/utils/createSlots.test.d.ts +1 -0
  367. package/lib-esm/__tests__/utils/createSlots.test.js +67 -0
  368. package/lib-esm/drafts.d.ts +7 -0
  369. package/lib-esm/drafts.js +8 -0
  370. package/lib-esm/stories/ActionList2.stories.js +796 -0
  371. package/lib-esm/stories/TextInput.stories.js +117 -0
  372. package/lib-esm/sx.d.ts +2 -0
  373. package/lib-esm/sx.js +3 -1
  374. package/lib-esm/theme-preval.js +81 -2
  375. package/lib-esm/utils/create-slots.d.ts +17 -0
  376. package/lib-esm/utils/create-slots.js +84 -0
  377. package/lib-esm/utils/testing.d.ts +14 -1
  378. package/lib-esm/utils/use-force-update.d.ts +1 -0
  379. package/lib-esm/utils/use-force-update.js +6 -0
  380. package/package-lock.json +153 -14
  381. package/package.json +7 -4
  382. package/script/build +1 -1
  383. package/src/ActionList2/Description.tsx +49 -0
  384. package/src/ActionList2/Divider.tsx +24 -0
  385. package/src/ActionList2/Group.tsx +34 -0
  386. package/src/ActionList2/Header.tsx +58 -0
  387. package/src/ActionList2/Item.tsx +245 -0
  388. package/src/ActionList2/LinkItem.tsx +49 -0
  389. package/src/ActionList2/List.tsx +55 -0
  390. package/src/ActionList2/Selection.tsx +40 -0
  391. package/src/ActionList2/Visuals.tsx +76 -0
  392. package/src/ActionList2/index.ts +39 -0
  393. package/src/StateLabel.tsx +14 -2
  394. package/src/_TextInputWrapper.tsx +7 -0
  395. package/src/__tests__/ActionList2.test.tsx +47 -0
  396. package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
  397. package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +1 -0
  398. package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +1 -0
  399. package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +1 -0
  400. package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +1 -0
  401. package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +1 -0
  402. package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +4 -0
  403. package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -0
  404. package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +13 -6
  405. package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +1 -0
  406. package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +66 -0
  407. package/src/__tests__/__snapshots__/Token.test.tsx.snap +17 -0
  408. package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
  409. package/src/__tests__/utils/createSlots.test.tsx +74 -0
  410. package/src/drafts.ts +9 -0
  411. package/src/stories/ActionList2.stories.tsx +1291 -0
  412. package/src/stories/TextInput.stories.tsx +113 -0
  413. package/src/sx.ts +3 -0
  414. package/src/theme-preval.js +1 -0
  415. package/src/utils/create-slots.tsx +96 -0
  416. package/src/utils/use-force-update.ts +7 -0
  417. package/stats.html +1 -1
  418. package/tsconfig.base.json +20 -0
  419. package/tsconfig.build.json +2 -2
  420. package/tsconfig.json +4 -17
package/lib/Label.jsx ADDED
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ const styled_components_1 = __importStar(require("styled-components"));
26
+ const styled_system_1 = require("styled-system");
27
+ const constants_1 = require("./constants");
28
+ const sx_1 = __importDefault(require("./sx"));
29
+ const outlineStyles = styled_components_1.css `
30
+ margin-top: -1px; // offsets the 1px border
31
+ margin-bottom: -1px; // offsets the 1px border
32
+ color: ${constants_1.get('colors.fg.muted')};
33
+ border: ${constants_1.get('borderWidths.1')} solid ${constants_1.get('colors.border.default')};
34
+ box-shadow: none;
35
+ ${styled_system_1.borderColor};
36
+ ${constants_1.COMMON};
37
+ background-color: transparent;
38
+ `;
39
+ const sizeVariant = styled_system_1.variant({
40
+ variants: {
41
+ small: {
42
+ fontSize: 0,
43
+ lineHeight: '16px',
44
+ padding: '0px 8px'
45
+ },
46
+ medium: {
47
+ fontSize: 0,
48
+ lineHeight: '20px',
49
+ padding: '0 8px'
50
+ },
51
+ large: {
52
+ fontSize: 0,
53
+ lineHeight: '24px',
54
+ padding: '0 12px'
55
+ },
56
+ // corresponds to StateLabel fontSize/lineHeight/padding
57
+ xl: {
58
+ fontSize: 1,
59
+ lineHeight: '16px',
60
+ padding: '8px 12px'
61
+ }
62
+ }
63
+ });
64
+ const Label = styled_components_1.default.span `
65
+ display: inline-block;
66
+ font-weight: ${constants_1.get('fontWeights.semibold')};
67
+ color: ${constants_1.get('colors.fg.onEmphasis')};
68
+ border-radius: ${constants_1.get('radii.3')};
69
+
70
+ &:hover {
71
+ text-decoration: none;
72
+ }
73
+
74
+ ${sizeVariant}
75
+ ${constants_1.COMMON}
76
+ ${props => (props.dropshadow ? 'box-shadow: inset 0 -1px 0 rgba(27, 31, 35, 0.12)' : '')}
77
+ ${props => (props.outline ? outlineStyles : '')} // must be last to override other values
78
+ ${sx_1.default}
79
+ `;
80
+ Label.defaultProps = {
81
+ bg: 'neutral.emphasis',
82
+ variant: 'medium'
83
+ };
84
+ exports.default = Label;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const styled_components_1 = __importDefault(require("styled-components"));
7
+ const constants_1 = require("./constants");
8
+ const sx_1 = __importDefault(require("./sx"));
9
+ const LabelGroup = styled_components_1.default.span `
10
+ ${constants_1.COMMON}
11
+ & * {
12
+ margin-right: ${constants_1.get('space.1')};
13
+ }
14
+ & *:last-child {
15
+ margin-right: 0;
16
+ }
17
+ ${sx_1.default};
18
+ `;
19
+ exports.default = LabelGroup;
package/lib/Link.jsx ADDED
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const styled_components_1 = __importDefault(require("styled-components"));
7
+ const styled_system_1 = require("styled-system");
8
+ const constants_1 = require("./constants");
9
+ const sx_1 = __importDefault(require("./sx"));
10
+ const hoverColor = styled_system_1.system({
11
+ hoverColor: {
12
+ property: 'color',
13
+ scale: 'colors'
14
+ }
15
+ });
16
+ const Link = styled_components_1.default.a `
17
+ color: ${props => (props.muted ? constants_1.get('colors.fg.muted')(props) : constants_1.get('colors.accent.fg')(props))};
18
+ text-decoration: ${props => (props.underline ? 'underline' : 'none')};
19
+ &:hover {
20
+ text-decoration: ${props => (props.muted ? 'none' : 'underline')};
21
+ ${props => (props.hoverColor ? hoverColor : props.muted ? `color: ${constants_1.get('colors.accent.fg')(props)}` : '')};
22
+ }
23
+ &:is(button) {
24
+ display: inline-block;
25
+ padding: 0;
26
+ font-size: inherit;
27
+ white-space: nowrap;
28
+ cursor: pointer;
29
+ user-select: none;
30
+ background-color: transparent;
31
+ border: 0;
32
+ appearance: none;
33
+ }
34
+ ${constants_1.TYPOGRAPHY};
35
+ ${constants_1.COMMON};
36
+ ${sx_1.default};
37
+ `;
38
+ exports.default = Link;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ const styled_components_1 = __importDefault(require("styled-components"));
26
+ const react_1 = __importStar(require("react"));
27
+ const constants_1 = require("./constants");
28
+ const useIsomorphicLayoutEffect_1 = __importDefault(require("./utils/useIsomorphicLayoutEffect"));
29
+ const hooks_1 = require("./hooks");
30
+ const Portal_1 = __importDefault(require("./Portal"));
31
+ const sx_1 = __importDefault(require("./sx"));
32
+ const useCombinedRefs_1 = require("./hooks/useCombinedRefs");
33
+ const ThemeProvider_1 = require("./ThemeProvider");
34
+ const heightMap = {
35
+ xsmall: '192px',
36
+ small: '256px',
37
+ medium: '320px',
38
+ large: '432px',
39
+ xlarge: '600px',
40
+ auto: 'auto',
41
+ initial: 'auto' // Passing 'initial' initially applies 'auto'
42
+ };
43
+ const widthMap = {
44
+ small: '256px',
45
+ medium: '320px',
46
+ large: '480px',
47
+ xlarge: '640px',
48
+ xxlarge: '960px',
49
+ auto: 'auto'
50
+ };
51
+ const animationDuration = 200;
52
+ function getSlideAnimationStartingVector(anchorSide) {
53
+ if (anchorSide?.endsWith('bottom')) {
54
+ return { x: 0, y: -1 };
55
+ }
56
+ else if (anchorSide?.endsWith('top')) {
57
+ return { x: 0, y: 1 };
58
+ }
59
+ else if (anchorSide?.endsWith('right')) {
60
+ return { x: -1, y: 0 };
61
+ }
62
+ else if (anchorSide?.endsWith('left')) {
63
+ return { x: 1, y: 0 };
64
+ }
65
+ return { x: 0, y: 0 };
66
+ }
67
+ const StyledOverlay = styled_components_1.default.div `
68
+ background-color: ${constants_1.get('colors.canvas.overlay')};
69
+ box-shadow: ${constants_1.get('shadows.overlay.shadow')};
70
+ position: absolute;
71
+ min-width: 192px;
72
+ max-width: 640px;
73
+ height: ${props => heightMap[props.height || 'auto']};
74
+ max-height: ${props => props.maxHeight && heightMap[props.maxHeight]};
75
+ width: ${props => widthMap[props.width || 'auto']};
76
+ border-radius: 12px;
77
+ overflow: hidden;
78
+ animation: overlay-appear ${animationDuration}ms ${constants_1.get('animation.easeOutCubic')};
79
+
80
+ @keyframes overlay-appear {
81
+ 0% {
82
+ opacity: 0;
83
+ }
84
+ 100% {
85
+ opacity: 1;
86
+ }
87
+ }
88
+ visibility: var(--styled-overlay-visibility);
89
+ :focus {
90
+ outline: none;
91
+ }
92
+ ${constants_1.COMMON};
93
+ ${sx_1.default};
94
+ `;
95
+ /**
96
+ * An `Overlay` is a flexible floating surface, used to display transient content such as menus,
97
+ * selection options, dialogs, and more. Overlays use shadows to express elevation. The `Overlay`
98
+ * component handles all behaviors needed by overlay UIs as well as the common styles that all overlays * should have.
99
+ * @param ignoreClickRefs Optional. An array of ref objects to ignore clicks on in the `onOutsideClick` behavior. This is often used to ignore clicking on the element that toggles the open/closed state for the `Overlay` to prevent the `Overlay` from being toggled twice.
100
+ * @param initialFocusRef Optional. Ref for the element to focus when the `Overlay` is opened. If nothing is provided, the first focusable element in the `Overlay` body is focused.
101
+ * @param returnFocusRef Required. Ref for the element to focus when the `Overlay` is closed.
102
+ * @param onClickOutside Required. Function to call when clicking outside of the `Overlay`. Typically this function removes the Overlay.
103
+ * @param onEscape Required. Function to call when user presses `Escape`. Typically this function removes the Overlay.
104
+ * @param width Sets the width of the `Overlay`, pick from our set list of widths, or pass `auto` to automatically set the width based on the content of the `Overlay`. `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `480px`, `xlarge` corresponds to `640px`, `xxlarge` corresponds to `960px`.
105
+ * @param height Sets the height of the `Overlay`, pick from our set list of heights, or pass `auto` to automatically set the height based on the content of the `Overlay`, or pass `initial` to set the height based on the initial content of the `Overlay` (i.e. ignoring content changes). `xsmall` corresponds to `192px`, `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `432px`, `xlarge` corresponds to `600px`.
106
+ * @param maxHeight Sets the maximum height of the `Overlay`, pick from our set list of heights. `xsmall` corresponds to `192px`, `small` corresponds to `256px`, `medium` corresponds to `320px`, `large` corresponds to `432px`, `xlarge` corresponds to `600px`.
107
+ * @param anchorSide If provided, the Overlay will slide into position from the side of the anchor with a brief animation
108
+ * @param top Optional. Vertical position of the overlay, relative to its closest positioned ancestor (often its `Portal`).
109
+ * @param left Optional. Horizontal position of the overlay, relative to its closest positioned ancestor (often its `Portal`).
110
+ * @param portalContainerName Optional. The name of the portal container to render the Overlay into.
111
+ */
112
+ const Overlay = react_1.default.forwardRef(({ onClickOutside, role = 'none', initialFocusRef, returnFocusRef, ignoreClickRefs, onEscape, visibility = 'visible', height, top, left, anchorSide, portalContainerName, preventFocusOnOpen, ...rest }, forwardedRef) => {
113
+ const overlayRef = react_1.useRef(null);
114
+ const combinedRef = useCombinedRefs_1.useCombinedRefs(overlayRef, forwardedRef);
115
+ const { theme } = ThemeProvider_1.useTheme();
116
+ const slideAnimationDistance = parseInt(constants_1.get('space.2')(theme).replace('px', ''));
117
+ const slideAnimationEasing = constants_1.get('animation.easeOutCubic')(theme);
118
+ hooks_1.useOverlay({
119
+ overlayRef,
120
+ returnFocusRef,
121
+ onEscape,
122
+ ignoreClickRefs,
123
+ onClickOutside,
124
+ initialFocusRef,
125
+ preventFocusOnOpen
126
+ });
127
+ react_1.useEffect(() => {
128
+ if (height === 'initial' && combinedRef.current?.clientHeight) {
129
+ combinedRef.current.style.height = `${combinedRef.current.clientHeight}px`;
130
+ }
131
+ }, [height, combinedRef]);
132
+ useIsomorphicLayoutEffect_1.default(() => {
133
+ const { x, y } = getSlideAnimationStartingVector(anchorSide);
134
+ if ((!x && !y) || !overlayRef.current?.animate || visibility === 'hidden') {
135
+ return;
136
+ }
137
+ // JS animation is required because Safari does not allow css animations to start paused and then run
138
+ overlayRef.current.animate({ transform: [`translate(${slideAnimationDistance * x}px, ${slideAnimationDistance * y}px)`, `translate(0, 0)`] }, {
139
+ duration: animationDuration,
140
+ easing: slideAnimationEasing
141
+ });
142
+ }, [anchorSide, slideAnimationDistance, slideAnimationEasing, visibility]);
143
+ return (<Portal_1.default containerName={portalContainerName}>
144
+ <StyledOverlay height={height} role={role} {...rest} ref={combinedRef} style={{
145
+ top: `${top || 0}px`,
146
+ left: `${left || 0}px`,
147
+ ...rest.style,
148
+ '--styled-overlay-visibility': visibility
149
+ }}/>
150
+ </Portal_1.default>);
151
+ });
152
+ Overlay.defaultProps = {
153
+ height: 'auto',
154
+ width: 'auto'
155
+ };
156
+ exports.default = Overlay;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const styled_components_1 = __importDefault(require("styled-components"));
7
+ const constants_1 = require("./constants");
8
+ const sx_1 = __importDefault(require("./sx"));
9
+ const Pagehead = styled_components_1.default.div `
10
+ position: relative;
11
+ padding-top: ${constants_1.get('space.4')};
12
+ padding-bottom: ${constants_1.get('space.4')};
13
+ margin-bottom: ${constants_1.get('space.4')};
14
+ border-bottom: 1px solid ${constants_1.get('colors.border.default')};
15
+ ${constants_1.COMMON};
16
+ ${sx_1.default};
17
+ `;
18
+ exports.default = Pagehead;
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const styled_components_1 = __importDefault(require("styled-components"));
8
+ const Box_1 = __importDefault(require("../Box"));
9
+ const constants_1 = require("../constants");
10
+ const sx_1 = __importDefault(require("../sx"));
11
+ const model_1 = require("./model");
12
+ const Page = styled_components_1.default.a `
13
+ display: inline-block;
14
+ min-width: 32px;
15
+ padding: 5px 10px;
16
+ font-style: normal;
17
+ line-height: 20px;
18
+ color: ${constants_1.get('colors.fg.default')};
19
+ text-align: center;
20
+ white-space: nowrap;
21
+ vertical-align: middle;
22
+ cursor: pointer;
23
+ user-select: none;
24
+ text-decoration: none;
25
+
26
+ margin-right: ${constants_1.get('space.1')};
27
+
28
+ &:last-child {
29
+ margin-right: 0;
30
+ }
31
+
32
+ border: ${constants_1.get('borderWidths.1')} solid transparent;
33
+ border-radius: ${constants_1.get('radii.2')};
34
+ transition: border-color 0.2s cubic-bezier(0.3, 0, 0.5, 1);
35
+
36
+ &:hover,
37
+ &:focus {
38
+ text-decoration: none;
39
+ border-color: ${constants_1.get('colors.border.default')};
40
+ outline: 0;
41
+ transition-duration: 0.1s;
42
+ }
43
+
44
+ &:active {
45
+ border-color: ${constants_1.get('colors.border.muted')};
46
+ }
47
+
48
+ &[rel='prev'],
49
+ &[rel='next'] {
50
+ color: ${constants_1.get('colors.accent.fg')};
51
+ }
52
+
53
+ &[aria-current],
54
+ &[aria-current]:hover {
55
+ color: ${constants_1.get('colors.fg.onEmphasis')};
56
+ background-color: ${constants_1.get('colors.accent.emphasis')};
57
+ border-color: transparent;
58
+ }
59
+
60
+ &[aria-disabled],
61
+ &[aria-disabled]:hover {
62
+ color: ${constants_1.get('colors.primer.fg.disabled')}; // check
63
+ cursor: default;
64
+ border-color: transparent;
65
+ }
66
+
67
+ @supports (clip-path: polygon(50% 0, 100% 50%, 50% 100%)) {
68
+ &[rel='prev']::before,
69
+ &[rel='next']::after {
70
+ display: inline-block;
71
+ width: 16px;
72
+ height: 16px;
73
+ vertical-align: text-bottom;
74
+ content: '';
75
+ background-color: currentColor;
76
+ }
77
+
78
+ // chevron-left
79
+ &[rel='prev']::before {
80
+ margin-right: ${constants_1.get('space.1')};
81
+ clip-path: polygon(
82
+ 9.8px 12.8px,
83
+ 8.7px 12.8px,
84
+ 4.5px 8.5px,
85
+ 4.5px 7.5px,
86
+ 8.7px 3.2px,
87
+ 9.8px 4.3px,
88
+ 6.1px 8px,
89
+ 9.8px 11.7px,
90
+ 9.8px 12.8px
91
+ );
92
+ }
93
+
94
+ // chevron-right
95
+ &[rel='next']::after {
96
+ margin-left: ${constants_1.get('space.1')};
97
+ clip-path: polygon(
98
+ 6.2px 3.2px,
99
+ 7.3px 3.2px,
100
+ 11.5px 7.5px,
101
+ 11.5px 8.5px,
102
+ 7.3px 12.8px,
103
+ 6.2px 11.7px,
104
+ 9.9px 8px,
105
+ 6.2px 4.3px,
106
+ 6.2px 3.2px
107
+ );
108
+ }
109
+ }
110
+
111
+ ${constants_1.COMMON};
112
+ `;
113
+ function usePaginationPages({ theme, pageCount, currentPage, onPageChange, hrefBuilder, marginPageCount, showPages, surroundingPageCount }) {
114
+ const pageChange = react_1.default.useCallback(n => (e) => onPageChange(e, n), [onPageChange]);
115
+ const model = react_1.default.useMemo(() => {
116
+ return model_1.buildPaginationModel(pageCount, currentPage, !!showPages, marginPageCount, surroundingPageCount);
117
+ }, [pageCount, currentPage, showPages, marginPageCount, surroundingPageCount]);
118
+ const children = react_1.default.useMemo(() => {
119
+ return model.map(page => {
120
+ const { props, key, content } = model_1.buildComponentData(page, hrefBuilder, pageChange(page.num));
121
+ return (<Page {...props} key={key} theme={theme}>
122
+ {content}
123
+ </Page>);
124
+ });
125
+ }, [model, hrefBuilder, pageChange, theme]);
126
+ return children;
127
+ }
128
+ const PaginationContainer = styled_components_1.default.nav `
129
+ margin-top: 20px;
130
+ margin-bottom: 15px;
131
+ text-align: center;
132
+ ${sx_1.default};
133
+ `;
134
+ function Pagination({ theme, pageCount, currentPage, onPageChange = noop, hrefBuilder = defaultHrefBuilder, marginPageCount = 1, showPages = true, surroundingPageCount = 2, ...rest }) {
135
+ const pageElements = usePaginationPages({
136
+ theme,
137
+ pageCount,
138
+ currentPage,
139
+ onPageChange,
140
+ hrefBuilder,
141
+ marginPageCount,
142
+ showPages,
143
+ surroundingPageCount
144
+ });
145
+ return (<PaginationContainer aria-label="Pagination" {...rest} theme={theme}>
146
+ <Box_1.default display="inline-block" theme={theme}>
147
+ {pageElements}
148
+ </Box_1.default>
149
+ </PaginationContainer>);
150
+ }
151
+ function defaultHrefBuilder(pageNum) {
152
+ return `#${pageNum}`;
153
+ }
154
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
155
+ function noop() { }
156
+ Pagination.defaultProps = {
157
+ hrefBuilder: defaultHrefBuilder,
158
+ marginPageCount: 1,
159
+ onPageChange: noop,
160
+ showPages: true,
161
+ surroundingPageCount: 2
162
+ };
163
+ exports.default = Pagination;
@@ -1,13 +1,7 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _Pagination = _interopRequireDefault(require("./Pagination"));
9
-
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
-
12
- var _default = _Pagination.default;
13
- exports.default = _default;
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Pagination_1 = __importDefault(require("./Pagination"));
7
+ exports.default = Pagination_1.default;
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildComponentData = exports.buildPaginationModel = void 0;
4
+ function buildPaginationModel(pageCount, currentPage, showPages, marginPageCount, surroundingPageCount) {
5
+ const pages = [];
6
+ if (showPages) {
7
+ const pageNums = [];
8
+ const addPage = (n) => {
9
+ if (n >= 1 && n <= pageCount) {
10
+ pageNums.push(n);
11
+ }
12
+ };
13
+ // Start by defining the window of pages to show around the current page.
14
+ // If the window goes off either edge, shift it until it fits.
15
+ let extentLeft = currentPage - surroundingPageCount;
16
+ let extentRight = currentPage + surroundingPageCount;
17
+ if (extentLeft < 1 && extentRight > pageCount) {
18
+ // Our window is larger than the entire range,
19
+ // so simply display every page.
20
+ extentLeft = 1;
21
+ extentRight = pageCount;
22
+ }
23
+ else if (extentLeft < 1) {
24
+ while (extentLeft < 1) {
25
+ extentLeft++;
26
+ extentRight++;
27
+ }
28
+ }
29
+ else if (extentRight > pageCount) {
30
+ while (extentRight > pageCount) {
31
+ extentLeft--;
32
+ extentRight--;
33
+ }
34
+ }
35
+ // Next, include the pages in the margins.
36
+ // If a margin page is already covered in the window,
37
+ // extend the window to the other direction.
38
+ for (let i = 1; i <= marginPageCount; i++) {
39
+ const leftPage = i;
40
+ const rightPage = pageCount - (i - 1);
41
+ if (leftPage >= extentLeft) {
42
+ extentRight++;
43
+ }
44
+ else {
45
+ addPage(leftPage);
46
+ }
47
+ if (rightPage <= extentRight) {
48
+ extentLeft--;
49
+ }
50
+ else {
51
+ addPage(rightPage);
52
+ }
53
+ }
54
+ for (let i = extentLeft; i <= extentRight; i++) {
55
+ addPage(i);
56
+ }
57
+ const sorted = pageNums
58
+ .slice()
59
+ .sort((a, b) => a - b)
60
+ .filter((item, idx, ary) => !idx || item !== ary[idx - 1]);
61
+ for (let idx = 0; idx < sorted.length; idx++) {
62
+ const num = sorted[idx];
63
+ const selected = num === currentPage;
64
+ if (idx === 0) {
65
+ if (num !== 1) {
66
+ // If the first page isn't page one,
67
+ // we need to add a break
68
+ pages.push({
69
+ type: 'BREAK',
70
+ num: 1
71
+ });
72
+ }
73
+ pages.push({
74
+ type: 'NUM',
75
+ num,
76
+ selected
77
+ });
78
+ }
79
+ else {
80
+ const last = sorted[idx - 1];
81
+ const delta = num - last;
82
+ if (delta === 1) {
83
+ pages.push({
84
+ type: 'NUM',
85
+ num,
86
+ selected
87
+ });
88
+ }
89
+ else {
90
+ // We skipped some, so add a break
91
+ pages.push({
92
+ type: 'BREAK',
93
+ num: num - 1
94
+ });
95
+ pages.push({
96
+ type: 'NUM',
97
+ num,
98
+ selected
99
+ });
100
+ }
101
+ }
102
+ }
103
+ const lastPage = pages[pages.length - 1];
104
+ if (lastPage.type === 'NUM' && lastPage.num !== pageCount) {
105
+ // The last page we rendered wasn't the actual last page,
106
+ // so we need an additional break
107
+ pages.push({
108
+ type: 'BREAK',
109
+ num: pageCount
110
+ });
111
+ }
112
+ }
113
+ const prev = { type: 'PREV', num: currentPage - 1, disabled: currentPage === 1 };
114
+ const next = { type: 'NEXT', num: currentPage + 1, disabled: currentPage === pageCount };
115
+ return [prev, ...pages, next];
116
+ }
117
+ exports.buildPaginationModel = buildPaginationModel;
118
+ function buildComponentData(page, hrefBuilder, onClick) {
119
+ const props = {};
120
+ let content = '';
121
+ let key = '';
122
+ switch (page.type) {
123
+ case 'PREV': {
124
+ key = 'page-prev';
125
+ content = 'Previous';
126
+ if (page.disabled) {
127
+ Object.assign(props, { as: 'span', 'aria-disabled': 'true' });
128
+ }
129
+ else {
130
+ Object.assign(props, {
131
+ rel: 'prev',
132
+ href: hrefBuilder(page.num),
133
+ 'aria-label': 'Previous Page',
134
+ onClick
135
+ });
136
+ }
137
+ break;
138
+ }
139
+ case 'NEXT': {
140
+ key = 'page-next';
141
+ content = 'Next';
142
+ if (page.disabled) {
143
+ Object.assign(props, { as: 'span', 'aria-disabled': 'true' });
144
+ }
145
+ else {
146
+ Object.assign(props, {
147
+ rel: 'next',
148
+ href: hrefBuilder(page.num),
149
+ 'aria-label': 'Next Page',
150
+ onClick
151
+ });
152
+ }
153
+ break;
154
+ }
155
+ case 'NUM': {
156
+ key = `page-${page.num}`;
157
+ content = String(page.num);
158
+ if (page.selected) {
159
+ Object.assign(props, { as: 'em', 'aria-current': 'page' });
160
+ }
161
+ else {
162
+ Object.assign(props, { href: hrefBuilder(page.num), 'aria-label': `Page ${page.num}`, onClick });
163
+ }
164
+ break;
165
+ }
166
+ case 'BREAK': {
167
+ key = `page-${page.num}-break`;
168
+ content = '…';
169
+ Object.assign(props, { as: 'span', 'aria-disabled': true });
170
+ }
171
+ }
172
+ return { props, key, content };
173
+ }
174
+ exports.buildComponentData = buildComponentData;