@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
@@ -44,7 +44,7 @@ declare const TextInputWithTokens: React.ForwardRefExoticComponent<Pick<{
44
44
  } & {
45
45
  as?: string | React.ComponentType<any> | undefined;
46
46
  forwardedAs?: string | React.ComponentType<any> | undefined;
47
- }, string | number | symbol>, "maxWidth" | "minWidth" | "width" | "theme" | "className" | "block" | "icon" | "sx" | "disabled" | "variant" | "contrast"> & {
47
+ }, string | number | symbol>, "maxWidth" | "minWidth" | "width" | "theme" | "block" | "icon" | "sx" | "variant" | "className" | "disabled" | "contrast"> & {
48
48
  className?: string | undefined;
49
49
  icon?: React.ComponentType<{
50
50
  className?: string | undefined;
@@ -61,6 +61,10 @@ declare const TextInputWithTokens: React.ForwardRefExoticComponent<Pick<{
61
61
  slot?: string | undefined;
62
62
  style?: React.CSSProperties | undefined;
63
63
  title?: string | undefined;
64
+ block?: boolean | undefined;
65
+ sx?: import("./sx").BetterSystemStyleObject | undefined;
66
+ variant?: "small" | "large" | undefined;
67
+ role?: React.AriaRole | undefined;
64
68
  key?: React.Key | null | undefined;
65
69
  defaultChecked?: boolean | undefined;
66
70
  defaultValue?: string | number | readonly string[] | undefined;
@@ -68,17 +72,16 @@ declare const TextInputWithTokens: React.ForwardRefExoticComponent<Pick<{
68
72
  suppressHydrationWarning?: boolean | undefined;
69
73
  accessKey?: string | undefined;
70
74
  className?: string | undefined;
71
- contentEditable?: "inherit" | (boolean | "true" | "false") | undefined;
75
+ contentEditable?: "inherit" | (boolean | "false" | "true") | undefined;
72
76
  contextMenu?: string | undefined;
73
77
  dir?: string | undefined;
74
- draggable?: (boolean | "true" | "false") | undefined;
78
+ draggable?: (boolean | "false" | "true") | undefined;
75
79
  id?: string | undefined;
76
80
  lang?: string | undefined;
77
81
  placeholder?: string | undefined;
78
- spellCheck?: (boolean | "true" | "false") | undefined;
82
+ spellCheck?: (boolean | "false" | "true") | undefined;
79
83
  tabIndex?: number | undefined;
80
84
  radioGroup?: string | undefined;
81
- role?: React.AriaRole | undefined;
82
85
  about?: string | undefined;
83
86
  datatype?: string | undefined;
84
87
  inlist?: any;
@@ -101,47 +104,47 @@ declare const TextInputWithTokens: React.ForwardRefExoticComponent<Pick<{
101
104
  inputMode?: "search" | "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
102
105
  is?: string | undefined;
103
106
  'aria-activedescendant'?: string | undefined;
104
- 'aria-atomic'?: boolean | "true" | "false" | undefined;
105
- 'aria-autocomplete'?: "none" | "list" | "inline" | "both" | undefined;
106
- 'aria-busy'?: boolean | "true" | "false" | undefined;
107
- 'aria-checked'?: boolean | "true" | "false" | "mixed" | undefined;
107
+ 'aria-atomic'?: boolean | "false" | "true" | undefined;
108
+ 'aria-autocomplete'?: "none" | "both" | "inline" | "list" | undefined;
109
+ 'aria-busy'?: boolean | "false" | "true" | undefined;
110
+ 'aria-checked'?: boolean | "mixed" | "false" | "true" | undefined;
108
111
  'aria-colcount'?: number | undefined;
109
112
  'aria-colindex'?: number | undefined;
110
113
  'aria-colspan'?: number | undefined;
111
114
  'aria-controls'?: string | undefined;
112
- 'aria-current'?: boolean | "time" | "true" | "false" | "page" | "step" | "location" | "date" | undefined;
115
+ 'aria-current'?: boolean | "time" | "page" | "false" | "true" | "step" | "location" | "date" | undefined;
113
116
  'aria-describedby'?: string | undefined;
114
117
  'aria-details'?: string | undefined;
115
- 'aria-disabled'?: boolean | "true" | "false" | undefined;
116
- 'aria-dropeffect'?: "link" | "none" | "copy" | "execute" | "move" | "popup" | undefined;
118
+ 'aria-disabled'?: boolean | "false" | "true" | undefined;
119
+ 'aria-dropeffect'?: "link" | "none" | "copy" | "move" | "execute" | "popup" | undefined;
117
120
  'aria-errormessage'?: string | undefined;
118
- 'aria-expanded'?: boolean | "true" | "false" | undefined;
121
+ 'aria-expanded'?: boolean | "false" | "true" | undefined;
119
122
  'aria-flowto'?: string | undefined;
120
- 'aria-grabbed'?: boolean | "true" | "false" | undefined;
121
- 'aria-haspopup'?: boolean | "grid" | "dialog" | "menu" | "listbox" | "tree" | "true" | "false" | undefined;
122
- 'aria-hidden'?: boolean | "true" | "false" | undefined;
123
- 'aria-invalid'?: boolean | "true" | "false" | "grammar" | "spelling" | undefined;
123
+ 'aria-grabbed'?: boolean | "false" | "true" | undefined;
124
+ 'aria-haspopup'?: boolean | "grid" | "dialog" | "menu" | "listbox" | "false" | "true" | "tree" | undefined;
125
+ 'aria-hidden'?: boolean | "false" | "true" | undefined;
126
+ 'aria-invalid'?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
124
127
  'aria-keyshortcuts'?: string | undefined;
125
128
  'aria-label'?: string | undefined;
126
129
  'aria-labelledby'?: string | undefined;
127
130
  'aria-level'?: number | undefined;
128
131
  'aria-live'?: "off" | "assertive" | "polite" | undefined;
129
- 'aria-modal'?: boolean | "true" | "false" | undefined;
130
- 'aria-multiline'?: boolean | "true" | "false" | undefined;
131
- 'aria-multiselectable'?: boolean | "true" | "false" | undefined;
132
+ 'aria-modal'?: boolean | "false" | "true" | undefined;
133
+ 'aria-multiline'?: boolean | "false" | "true" | undefined;
134
+ 'aria-multiselectable'?: boolean | "false" | "true" | undefined;
132
135
  'aria-orientation'?: "horizontal" | "vertical" | undefined;
133
136
  'aria-owns'?: string | undefined;
134
137
  'aria-placeholder'?: string | undefined;
135
138
  'aria-posinset'?: number | undefined;
136
- 'aria-pressed'?: boolean | "true" | "false" | "mixed" | undefined;
137
- 'aria-readonly'?: boolean | "true" | "false" | undefined;
139
+ 'aria-pressed'?: boolean | "mixed" | "false" | "true" | undefined;
140
+ 'aria-readonly'?: boolean | "false" | "true" | undefined;
138
141
  'aria-relevant'?: "all" | "text" | "additions" | "additions removals" | "additions text" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | undefined;
139
- 'aria-required'?: boolean | "true" | "false" | undefined;
142
+ 'aria-required'?: boolean | "false" | "true" | undefined;
140
143
  'aria-roledescription'?: string | undefined;
141
144
  'aria-rowcount'?: number | undefined;
142
145
  'aria-rowindex'?: number | undefined;
143
146
  'aria-rowspan'?: number | undefined;
144
- 'aria-selected'?: boolean | "true" | "false" | undefined;
147
+ 'aria-selected'?: boolean | "false" | "true" | undefined;
145
148
  'aria-setsize'?: number | undefined;
146
149
  'aria-sort'?: "none" | "ascending" | "descending" | "other" | undefined;
147
150
  'aria-valuemax'?: number | undefined;
@@ -311,15 +314,12 @@ declare const TextInputWithTokens: React.ForwardRefExoticComponent<Pick<{
311
314
  onAnimationIterationCapture?: React.AnimationEventHandler<HTMLSpanElement> | undefined;
312
315
  onTransitionEnd?: React.TransitionEventHandler<HTMLSpanElement> | undefined;
313
316
  onTransitionEndCapture?: React.TransitionEventHandler<HTMLSpanElement> | undefined;
314
- block?: boolean | undefined;
315
- sx?: import("./sx").BetterSystemStyleObject | undefined;
316
317
  disabled?: boolean | undefined;
317
- variant?: "small" | "large" | undefined;
318
318
  hasIcon?: boolean | undefined;
319
319
  contrast?: boolean | undefined;
320
320
  } & {
321
321
  theme?: any;
322
- }, "maxWidth" | "minWidth" | "width" | "theme" | "block" | "sx" | "disabled" | "variant" | "contrast">, string | number | symbol> & React.RefAttributes<HTMLInputElement> & {
322
+ }, "maxWidth" | "minWidth" | "width" | "theme" | "block" | "sx" | "variant" | "disabled" | "contrast">, string | number | symbol> & React.RefAttributes<HTMLInputElement> & {
323
323
  selectedTokenIndex: number | undefined;
324
324
  setSelectedTokenIndex: React.Dispatch<React.SetStateAction<number | undefined>>;
325
325
  }, string | number | symbol> & React.RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,218 @@
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 react_1 = __importStar(require("react"));
26
+ const props_1 = require("@styled-system/props");
27
+ const focusZone_1 = require("./behaviors/focusZone");
28
+ const useCombinedRefs_1 = require("./hooks/useCombinedRefs");
29
+ const useFocusZone_1 = require("./hooks/useFocusZone");
30
+ const Token_1 = __importDefault(require("./Token/Token"));
31
+ const hooks_1 = require("./hooks");
32
+ const _UnstyledTextInput_1 = __importDefault(require("./_UnstyledTextInput"));
33
+ const _TextInputWrapper_1 = __importDefault(require("./_TextInputWrapper"));
34
+ const Box_1 = __importDefault(require("./Box"));
35
+ const Text_1 = __importDefault(require("./Text"));
36
+ const iterateFocusableElements_1 = require("./utils/iterateFocusableElements");
37
+ const overflowCountFontSizeMap = {
38
+ small: 0,
39
+ medium: 1,
40
+ large: 1,
41
+ extralarge: 2
42
+ };
43
+ // using forwardRef is important so that other components (ex. Autocomplete) can use the ref
44
+ function TextInputWithTokensInnerComponent({ icon: IconComponent, contrast, className, block, disabled, theme, sx: sxProp, tokens, onTokenRemove, tokenComponent: TokenComponent, preventTokenWrapping, size, hideTokenRemoveButtons, maxHeight, width: widthProp, minWidth: minWidthProp, maxWidth: maxWidthProp, variant: variantProp, visibleTokenCount, ...rest }, externalRef) {
45
+ const { onBlur, onFocus, onKeyDown, ...inputPropsRest } = props_1.omit(rest);
46
+ const ref = hooks_1.useProvidedRefOrCreate(externalRef);
47
+ const localInputRef = react_1.useRef(null);
48
+ const combinedInputRef = useCombinedRefs_1.useCombinedRefs(localInputRef, ref);
49
+ const [selectedTokenIndex, setSelectedTokenIndex] = react_1.useState();
50
+ const [tokensAreTruncated, setTokensAreTruncated] = react_1.useState(Boolean(visibleTokenCount));
51
+ const { containerRef } = useFocusZone_1.useFocusZone({
52
+ focusOutBehavior: 'wrap',
53
+ bindKeys: focusZone_1.FocusKeys.ArrowHorizontal | focusZone_1.FocusKeys.HomeAndEnd,
54
+ focusableElementFilter: element => {
55
+ return !element.getAttributeNames().includes('aria-hidden');
56
+ },
57
+ getNextFocusable: direction => {
58
+ if (!selectedTokenIndex && selectedTokenIndex !== 0) {
59
+ return undefined;
60
+ }
61
+ let nextIndex = selectedTokenIndex + 1; // "+ 1" accounts for the first element: the text input
62
+ if (direction === 'next') {
63
+ nextIndex += 1;
64
+ }
65
+ if (direction === 'previous') {
66
+ nextIndex -= 1;
67
+ }
68
+ if (nextIndex > tokens.length || nextIndex < 1) {
69
+ return combinedInputRef.current || undefined;
70
+ }
71
+ return containerRef.current?.children[nextIndex];
72
+ }
73
+ }, [selectedTokenIndex]);
74
+ const handleTokenRemove = (tokenId) => {
75
+ onTokenRemove(tokenId);
76
+ // HACK: wait a tick for the the token node to be removed from the DOM
77
+ setTimeout(() => {
78
+ const nextElementToFocus = containerRef.current?.children[selectedTokenIndex || 0];
79
+ // when removing the first token by keying "Backspace" or "Delete",
80
+ // `nextFocusableElement` is the div that wraps the input
81
+ const firstFocusable = nextElementToFocus && iterateFocusableElements_1.isFocusable(nextElementToFocus)
82
+ ? nextElementToFocus
83
+ : Array.from(containerRef.current?.children || []).find(el => iterateFocusableElements_1.isFocusable(el));
84
+ if (firstFocusable) {
85
+ firstFocusable.focus();
86
+ }
87
+ else {
88
+ // if there are no tokens left, focus the input
89
+ ref.current?.focus();
90
+ }
91
+ }, 0);
92
+ };
93
+ const handleTokenFocus = tokenIndex => () => {
94
+ setSelectedTokenIndex(tokenIndex);
95
+ };
96
+ const handleTokenBlur = () => {
97
+ setSelectedTokenIndex(undefined);
98
+ // HACK: wait a tick and check the focused element before hiding truncated tokens
99
+ // this prevents the tokens from hiding when the user is moving focus between tokens,
100
+ // but still hides the tokens when the user blurs the token by tabbing out or clicking somewhere else on the page
101
+ setTimeout(() => {
102
+ if (!containerRef.current?.contains(document.activeElement) && visibleTokenCount) {
103
+ setTokensAreTruncated(true);
104
+ }
105
+ }, 0);
106
+ };
107
+ const handleTokenKeyUp = event => {
108
+ if (event.key === 'Escape') {
109
+ ref.current?.focus();
110
+ }
111
+ };
112
+ const handleInputFocus = event => {
113
+ onFocus && onFocus(event);
114
+ setSelectedTokenIndex(undefined);
115
+ visibleTokenCount && setTokensAreTruncated(false);
116
+ };
117
+ const handleInputBlur = event => {
118
+ onBlur && onBlur(event);
119
+ // HACK: wait a tick and check the focused element before hiding truncated tokens
120
+ // this prevents the tokens from hiding when the user is moving focus from the input to a token,
121
+ // but still hides the tokens when the user blurs the input by tabbing out or clicking somewhere else on the page
122
+ setTimeout(() => {
123
+ if (!containerRef.current?.contains(document.activeElement) && visibleTokenCount) {
124
+ setTokensAreTruncated(true);
125
+ }
126
+ }, 0);
127
+ };
128
+ const handleInputKeyDown = e => {
129
+ if (onKeyDown) {
130
+ onKeyDown(e);
131
+ }
132
+ if (ref.current?.value) {
133
+ return;
134
+ }
135
+ const lastToken = tokens[tokens.length - 1];
136
+ if (e.key === 'Backspace' && lastToken) {
137
+ handleTokenRemove(lastToken.id);
138
+ if (ref.current) {
139
+ // TODO: eliminate the first hack by making changes to the Autocomplete component
140
+ //
141
+ // HACKS:
142
+ // 1. Directly setting `ref.current.value` instead of updating state because the autocomplete
143
+ // highlight behavior doesn't work correctly if we update the value with a setState action in onChange
144
+ // 2. Adding an extra space so that when I backspace, it doesn't delete the last letter
145
+ ref.current.value = `${lastToken.text} `;
146
+ }
147
+ // HACK: for some reason we need to wait a tick for `.select()` to work
148
+ setTimeout(() => {
149
+ ref.current?.select();
150
+ }, 0);
151
+ }
152
+ };
153
+ const focusInput = () => {
154
+ combinedInputRef.current?.focus();
155
+ };
156
+ const preventTokenClickPropagation = event => {
157
+ event.stopPropagation();
158
+ };
159
+ const visibleTokens = tokensAreTruncated ? tokens.slice(0, visibleTokenCount) : tokens;
160
+ return (<_TextInputWrapper_1.default block={block} className={className} contrast={contrast} disabled={disabled} hasIcon={!!IconComponent} theme={theme} width={widthProp} minWidth={minWidthProp} maxWidth={maxWidthProp} variant={variantProp} onClick={focusInput} sx={{
161
+ ...(block
162
+ ? {
163
+ display: 'flex',
164
+ width: '100%'
165
+ }
166
+ : {}),
167
+ ...(maxHeight
168
+ ? {
169
+ maxHeight,
170
+ overflow: 'auto'
171
+ }
172
+ : {}),
173
+ ...(preventTokenWrapping
174
+ ? {
175
+ overflow: 'auto'
176
+ }
177
+ : {}),
178
+ ...sxProp
179
+ }}>
180
+ <Box_1.default ref={containerRef} display="flex" sx={{
181
+ alignItems: 'center',
182
+ flexWrap: preventTokenWrapping ? 'nowrap' : 'wrap',
183
+ marginLeft: '-0.25rem',
184
+ marginBottom: '-0.25rem',
185
+ flexGrow: 1,
186
+ '> *': {
187
+ flexShrink: 0,
188
+ marginLeft: '0.25rem',
189
+ marginBottom: '0.25rem'
190
+ }
191
+ }}>
192
+ <Box_1.default sx={{
193
+ order: 1,
194
+ flexGrow: 1
195
+ }}>
196
+ {IconComponent && <IconComponent className="TextInput-icon"/>}
197
+ <_UnstyledTextInput_1.default ref={combinedInputRef} disabled={disabled} onFocus={handleInputFocus} onBlur={handleInputBlur} onKeyDown={handleInputKeyDown} type="text" sx={{ height: '100%' }} {...inputPropsRest}/>
198
+ </Box_1.default>
199
+ {TokenComponent
200
+ ? visibleTokens.map(({ id, ...tokenRest }, i) => (<TokenComponent key={id} onFocus={handleTokenFocus(i)} onBlur={handleTokenBlur} onKeyUp={handleTokenKeyUp} onClick={preventTokenClickPropagation} isSelected={selectedTokenIndex === i} onRemove={() => {
201
+ handleTokenRemove(id);
202
+ }} hideRemoveButton={hideTokenRemoveButtons} size={size} tabIndex={0} {...tokenRest}/>))
203
+ : null}
204
+ {tokensAreTruncated ? (<Text_1.default color="fg.muted" fontSize={size && overflowCountFontSizeMap[size]}>
205
+ +{tokens.length - visibleTokens.length}
206
+ </Text_1.default>) : null}
207
+ </Box_1.default>
208
+ </_TextInputWrapper_1.default>);
209
+ }
210
+ const TextInputWithTokens = react_1.default.forwardRef(TextInputWithTokensInnerComponent);
211
+ TextInputWithTokens.defaultProps = {
212
+ tokenComponent: Token_1.default,
213
+ size: 'extralarge',
214
+ hideTokenRemoveButtons: false,
215
+ preventTokenWrapping: false
216
+ };
217
+ TextInputWithTokens.displayName = 'TextInputWithTokens';
218
+ exports.default = TextInputWithTokens;
@@ -0,0 +1,130 @@
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
+ exports.useColorSchemeVar = exports.useTheme = exports.ThemeProvider = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const styled_components_1 = require("styled-components");
9
+ const theme_1 = __importDefault(require("./theme"));
10
+ const deepmerge_1 = __importDefault(require("deepmerge"));
11
+ const defaultColorMode = 'day';
12
+ const defaultDayScheme = 'light';
13
+ const defaultNightScheme = 'dark';
14
+ const ThemeContext = react_1.default.createContext({
15
+ setColorMode: () => null,
16
+ setDayScheme: () => null,
17
+ setNightScheme: () => null
18
+ });
19
+ const ThemeProvider = ({ children, ...props }) => {
20
+ // Get fallback values from parent ThemeProvider (if exists)
21
+ const { theme: fallbackTheme, colorMode: fallbackColorMode, dayScheme: fallbackDayScheme, nightScheme: fallbackNightScheme } = useTheme();
22
+ // Initialize state
23
+ const theme = props.theme ?? fallbackTheme ?? theme_1.default;
24
+ const [colorMode, setColorMode] = react_1.default.useState(props.colorMode ?? fallbackColorMode ?? defaultColorMode);
25
+ const [dayScheme, setDayScheme] = react_1.default.useState(props.dayScheme ?? fallbackDayScheme ?? defaultDayScheme);
26
+ const [nightScheme, setNightScheme] = react_1.default.useState(props.nightScheme ?? fallbackNightScheme ?? defaultNightScheme);
27
+ const systemColorMode = useSystemColorMode();
28
+ const resolvedColorMode = resolveColorMode(colorMode, systemColorMode);
29
+ const colorScheme = chooseColorScheme(resolvedColorMode, dayScheme, nightScheme);
30
+ const resolvedTheme = react_1.default.useMemo(() => applyColorScheme(theme, colorScheme), [theme, colorScheme]);
31
+ // Update state if props change
32
+ react_1.default.useEffect(() => {
33
+ setColorMode(props.colorMode ?? fallbackColorMode ?? defaultColorMode);
34
+ }, [props.colorMode, fallbackColorMode]);
35
+ react_1.default.useEffect(() => {
36
+ setDayScheme(props.dayScheme ?? fallbackDayScheme ?? defaultDayScheme);
37
+ }, [props.dayScheme, fallbackDayScheme]);
38
+ react_1.default.useEffect(() => {
39
+ setNightScheme(props.nightScheme ?? fallbackNightScheme ?? defaultNightScheme);
40
+ }, [props.nightScheme, fallbackNightScheme]);
41
+ return (<ThemeContext.Provider value={{
42
+ theme: resolvedTheme,
43
+ colorScheme,
44
+ colorMode,
45
+ resolvedColorMode,
46
+ dayScheme,
47
+ nightScheme,
48
+ setColorMode,
49
+ setDayScheme,
50
+ setNightScheme
51
+ }}>
52
+ <styled_components_1.ThemeProvider theme={resolvedTheme}>{children}</styled_components_1.ThemeProvider>
53
+ </ThemeContext.Provider>);
54
+ };
55
+ exports.ThemeProvider = ThemeProvider;
56
+ function useTheme() {
57
+ return react_1.default.useContext(ThemeContext);
58
+ }
59
+ exports.useTheme = useTheme;
60
+ function useColorSchemeVar(values, fallback) {
61
+ const { colorScheme = '' } = useTheme();
62
+ return values[colorScheme] ?? fallback;
63
+ }
64
+ exports.useColorSchemeVar = useColorSchemeVar;
65
+ function useSystemColorMode() {
66
+ const [systemColorMode, setSystemColorMode] = react_1.default.useState(getSystemColorMode);
67
+ react_1.default.useEffect(() => {
68
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
69
+ const media = window?.matchMedia?.('(prefers-color-scheme: dark)');
70
+ function handleChange(event) {
71
+ const isNight = event.matches;
72
+ setSystemColorMode(isNight ? 'night' : 'day');
73
+ }
74
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
75
+ if (media) {
76
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
77
+ if (media.addEventListener !== undefined) {
78
+ media.addEventListener('change', handleChange);
79
+ return function cleanup() {
80
+ media.removeEventListener('change', handleChange);
81
+ };
82
+ }
83
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
84
+ else if (media.addListener !== undefined) {
85
+ media.addListener(handleChange);
86
+ return function cleanup() {
87
+ media.removeListener(handleChange);
88
+ };
89
+ }
90
+ }
91
+ }, []);
92
+ return systemColorMode;
93
+ }
94
+ function getSystemColorMode() {
95
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
96
+ if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)')?.matches) {
97
+ return 'night';
98
+ }
99
+ return 'day';
100
+ }
101
+ function resolveColorMode(colorMode, systemColorMode) {
102
+ switch (colorMode) {
103
+ case 'auto':
104
+ return systemColorMode;
105
+ default:
106
+ return colorMode;
107
+ }
108
+ }
109
+ function chooseColorScheme(colorMode, dayScheme, nightScheme) {
110
+ switch (colorMode) {
111
+ case 'day':
112
+ return dayScheme;
113
+ case 'night':
114
+ return nightScheme;
115
+ }
116
+ }
117
+ function applyColorScheme(theme, colorScheme) {
118
+ if (!theme.colorSchemes) {
119
+ return theme;
120
+ }
121
+ if (!theme.colorSchemes[colorScheme]) {
122
+ // eslint-disable-next-line no-console
123
+ console.error(`\`${colorScheme}\` scheme not defined in \`theme.colorSchemes\``);
124
+ // Apply the first defined color scheme
125
+ const defaultColorScheme = Object.keys(theme.colorSchemes)[0];
126
+ return deepmerge_1.default(theme, theme.colorSchemes[defaultColorScheme]);
127
+ }
128
+ return deepmerge_1.default(theme, theme.colorSchemes[colorScheme]);
129
+ }
130
+ exports.default = exports.ThemeProvider;
package/lib/Timeline.d.ts CHANGED
@@ -124,6 +124,27 @@ declare const _default: string & import("styled-components").StyledComponentBase
124
124
  slot?: string | undefined;
125
125
  style?: React.CSSProperties | undefined;
126
126
  title?: string | undefined;
127
+ bg?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
128
+ m?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
129
+ mt?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
130
+ mr?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
131
+ mb?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
132
+ ml?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
133
+ mx?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
134
+ marginX?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
135
+ my?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
136
+ marginY?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
137
+ pt?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
138
+ pr?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
139
+ pb?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
140
+ pl?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
141
+ px?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
142
+ paddingX?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
143
+ py?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
144
+ paddingY?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
145
+ size?: import("styled-system").ResponsiveValue<import("csstype").Property.Height<import("styled-system").TLengthStyledSystem>, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
146
+ sx?: import("./sx").BetterSystemStyleObject | undefined;
147
+ role?: React.AriaRole | undefined;
127
148
  key?: React.Key | null | undefined;
128
149
  defaultChecked?: boolean | undefined;
129
150
  defaultValue?: string | number | readonly string[] | undefined;
@@ -131,17 +152,16 @@ declare const _default: string & import("styled-components").StyledComponentBase
131
152
  suppressHydrationWarning?: boolean | undefined;
132
153
  accessKey?: string | undefined;
133
154
  className?: string | undefined;
134
- contentEditable?: "inherit" | (boolean | "true" | "false") | undefined;
155
+ contentEditable?: "inherit" | (boolean | "false" | "true") | undefined;
135
156
  contextMenu?: string | undefined;
136
157
  dir?: string | undefined;
137
- draggable?: (boolean | "true" | "false") | undefined;
158
+ draggable?: (boolean | "false" | "true") | undefined;
138
159
  id?: string | undefined;
139
160
  lang?: string | undefined;
140
161
  placeholder?: string | undefined;
141
- spellCheck?: (boolean | "true" | "false") | undefined;
162
+ spellCheck?: (boolean | "false" | "true") | undefined;
142
163
  tabIndex?: number | undefined;
143
164
  radioGroup?: string | undefined;
144
- role?: React.AriaRole | undefined;
145
165
  about?: string | undefined;
146
166
  datatype?: string | undefined;
147
167
  inlist?: any;
@@ -164,47 +184,47 @@ declare const _default: string & import("styled-components").StyledComponentBase
164
184
  inputMode?: "search" | "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
165
185
  is?: string | undefined;
166
186
  'aria-activedescendant'?: string | undefined;
167
- 'aria-atomic'?: boolean | "true" | "false" | undefined;
168
- 'aria-autocomplete'?: "none" | "list" | "inline" | "both" | undefined;
169
- 'aria-busy'?: boolean | "true" | "false" | undefined;
170
- 'aria-checked'?: boolean | "true" | "false" | "mixed" | undefined;
187
+ 'aria-atomic'?: boolean | "false" | "true" | undefined;
188
+ 'aria-autocomplete'?: "none" | "both" | "inline" | "list" | undefined;
189
+ 'aria-busy'?: boolean | "false" | "true" | undefined;
190
+ 'aria-checked'?: boolean | "mixed" | "false" | "true" | undefined;
171
191
  'aria-colcount'?: number | undefined;
172
192
  'aria-colindex'?: number | undefined;
173
193
  'aria-colspan'?: number | undefined;
174
194
  'aria-controls'?: string | undefined;
175
- 'aria-current'?: boolean | "time" | "true" | "false" | "page" | "step" | "location" | "date" | undefined;
195
+ 'aria-current'?: boolean | "time" | "page" | "false" | "true" | "step" | "location" | "date" | undefined;
176
196
  'aria-describedby'?: string | undefined;
177
197
  'aria-details'?: string | undefined;
178
- 'aria-disabled'?: boolean | "true" | "false" | undefined;
179
- 'aria-dropeffect'?: "link" | "none" | "copy" | "execute" | "move" | "popup" | undefined;
198
+ 'aria-disabled'?: boolean | "false" | "true" | undefined;
199
+ 'aria-dropeffect'?: "link" | "none" | "copy" | "move" | "execute" | "popup" | undefined;
180
200
  'aria-errormessage'?: string | undefined;
181
- 'aria-expanded'?: boolean | "true" | "false" | undefined;
201
+ 'aria-expanded'?: boolean | "false" | "true" | undefined;
182
202
  'aria-flowto'?: string | undefined;
183
- 'aria-grabbed'?: boolean | "true" | "false" | undefined;
184
- 'aria-haspopup'?: boolean | "grid" | "dialog" | "menu" | "listbox" | "tree" | "true" | "false" | undefined;
185
- 'aria-hidden'?: boolean | "true" | "false" | undefined;
186
- 'aria-invalid'?: boolean | "true" | "false" | "grammar" | "spelling" | undefined;
203
+ 'aria-grabbed'?: boolean | "false" | "true" | undefined;
204
+ 'aria-haspopup'?: boolean | "grid" | "dialog" | "menu" | "listbox" | "false" | "true" | "tree" | undefined;
205
+ 'aria-hidden'?: boolean | "false" | "true" | undefined;
206
+ 'aria-invalid'?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
187
207
  'aria-keyshortcuts'?: string | undefined;
188
208
  'aria-label'?: string | undefined;
189
209
  'aria-labelledby'?: string | undefined;
190
210
  'aria-level'?: number | undefined;
191
211
  'aria-live'?: "off" | "assertive" | "polite" | undefined;
192
- 'aria-modal'?: boolean | "true" | "false" | undefined;
193
- 'aria-multiline'?: boolean | "true" | "false" | undefined;
194
- 'aria-multiselectable'?: boolean | "true" | "false" | undefined;
212
+ 'aria-modal'?: boolean | "false" | "true" | undefined;
213
+ 'aria-multiline'?: boolean | "false" | "true" | undefined;
214
+ 'aria-multiselectable'?: boolean | "false" | "true" | undefined;
195
215
  'aria-orientation'?: "horizontal" | "vertical" | undefined;
196
216
  'aria-owns'?: string | undefined;
197
217
  'aria-placeholder'?: string | undefined;
198
218
  'aria-posinset'?: number | undefined;
199
- 'aria-pressed'?: boolean | "true" | "false" | "mixed" | undefined;
200
- 'aria-readonly'?: boolean | "true" | "false" | undefined;
219
+ 'aria-pressed'?: boolean | "mixed" | "false" | "true" | undefined;
220
+ 'aria-readonly'?: boolean | "false" | "true" | undefined;
201
221
  'aria-relevant'?: "all" | "text" | "additions" | "additions removals" | "additions text" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | undefined;
202
- 'aria-required'?: boolean | "true" | "false" | undefined;
222
+ 'aria-required'?: boolean | "false" | "true" | undefined;
203
223
  'aria-roledescription'?: string | undefined;
204
224
  'aria-rowcount'?: number | undefined;
205
225
  'aria-rowindex'?: number | undefined;
206
226
  'aria-rowspan'?: number | undefined;
207
- 'aria-selected'?: boolean | "true" | "false" | undefined;
227
+ 'aria-selected'?: boolean | "false" | "true" | undefined;
208
228
  'aria-setsize'?: number | undefined;
209
229
  'aria-sort'?: "none" | "ascending" | "descending" | "other" | undefined;
210
230
  'aria-valuemax'?: number | undefined;
@@ -374,28 +394,8 @@ declare const _default: string & import("styled-components").StyledComponentBase
374
394
  onAnimationIterationCapture?: React.AnimationEventHandler<HTMLDivElement> | undefined;
375
395
  onTransitionEnd?: React.TransitionEventHandler<HTMLDivElement> | undefined;
376
396
  onTransitionEndCapture?: React.TransitionEventHandler<HTMLDivElement> | undefined;
377
- bg?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
378
- m?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
379
- mt?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
380
- mr?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
381
- mb?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
382
- ml?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
383
- mx?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
384
- marginX?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
385
- my?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
386
- marginY?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
387
- pt?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
388
- pr?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
389
- pb?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
390
- pl?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
391
- px?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
392
- paddingX?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
393
- py?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
394
- paddingY?: import("styled-system").ResponsiveValue<string | number | symbol, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
395
- size?: import("styled-system").ResponsiveValue<import("csstype").Property.Height<import("styled-system").TLengthStyledSystem>, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
396
397
  borderX?: import("styled-system").ResponsiveValue<import("csstype").Property.Border<import("styled-system").TLengthStyledSystem>, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
397
398
  borderY?: import("styled-system").ResponsiveValue<import("csstype").Property.Border<import("styled-system").TLengthStyledSystem>, Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>> | undefined;
398
- sx?: import("./sx").BetterSystemStyleObject | undefined;
399
399
  } & {
400
400
  theme?: any;
401
401
  }): JSX.Element;