@primer/components 31.2.0-rc.c7f73427 → 31.2.1-rc.0e01900c

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 (456) 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 +18 -0
  5. package/dist/browser.esm.js +656 -645
  6. package/dist/browser.esm.js.map +1 -1
  7. package/dist/browser.umd.js +211 -200
  8. package/dist/browser.umd.js.map +1 -1
  9. package/docs/content/ActionList2.mdx +358 -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.js +28 -19
  17. package/lib/ActionList/Item.jsx +311 -0
  18. package/lib/ActionList/List.jsx +138 -0
  19. package/lib/ActionList/index.js +12 -23
  20. package/lib/ActionList2/Description.d.ts +12 -0
  21. package/lib/ActionList2/Description.js +57 -0
  22. package/lib/ActionList2/Description.jsx +29 -0
  23. package/lib/ActionList2/Divider.d.ts +5 -0
  24. package/lib/ActionList2/Divider.js +35 -0
  25. package/lib/ActionList2/Divider.jsx +22 -0
  26. package/lib/ActionList2/Group.d.ts +11 -0
  27. package/lib/ActionList2/Group.js +57 -0
  28. package/lib/ActionList2/Group.jsx +25 -0
  29. package/lib/ActionList2/Header.d.ts +26 -0
  30. package/lib/ActionList2/Header.js +55 -0
  31. package/lib/ActionList2/Header.jsx +36 -0
  32. package/lib/ActionList2/Item.d.ts +63 -0
  33. package/lib/ActionList2/Item.js +242 -0
  34. package/lib/ActionList2/Item.jsx +174 -0
  35. package/lib/ActionList2/LinkItem.d.ts +17 -0
  36. package/lib/ActionList2/LinkItem.js +57 -0
  37. package/lib/ActionList2/LinkItem.jsx +28 -0
  38. package/lib/ActionList2/List.d.ts +26 -0
  39. package/lib/ActionList2/List.js +59 -0
  40. package/lib/ActionList2/List.jsx +41 -0
  41. package/lib/ActionList2/Selection.d.ts +5 -0
  42. package/lib/ActionList2/Selection.js +84 -0
  43. package/lib/ActionList2/Selection.jsx +50 -0
  44. package/lib/ActionList2/Visuals.d.ts +9 -0
  45. package/lib/ActionList2/Visuals.js +90 -0
  46. package/lib/ActionList2/Visuals.jsx +48 -0
  47. package/lib/ActionList2/index.d.ts +36 -0
  48. package/lib/ActionList2/index.js +29 -0
  49. package/lib/ActionMenu.jsx +73 -0
  50. package/lib/AnchoredOverlay/AnchoredOverlay.jsx +100 -0
  51. package/lib/AnchoredOverlay/index.js +4 -12
  52. package/lib/Autocomplete/Autocomplete.d.ts +28 -28
  53. package/lib/Autocomplete/Autocomplete.jsx +100 -0
  54. package/lib/Autocomplete/AutocompleteContext.jsx +5 -0
  55. package/lib/Autocomplete/AutocompleteInput.d.ts +28 -28
  56. package/lib/Autocomplete/AutocompleteInput.jsx +113 -0
  57. package/lib/Autocomplete/AutocompleteMenu.jsx +190 -0
  58. package/lib/Autocomplete/AutocompleteOverlay.jsx +55 -0
  59. package/lib/Autocomplete/index.js +7 -14
  60. package/lib/Avatar.jsx +34 -0
  61. package/lib/AvatarPair.jsx +29 -0
  62. package/lib/AvatarStack.jsx +151 -0
  63. package/lib/BaseStyles.jsx +65 -0
  64. package/lib/BorderBox.jsx +18 -0
  65. package/lib/Box.jsx +10 -0
  66. package/lib/BranchName.jsx +20 -0
  67. package/lib/Breadcrumbs.jsx +74 -0
  68. package/lib/Button/Button.d.ts +25 -25
  69. package/lib/Button/Button.jsx +60 -0
  70. package/lib/Button/ButtonBase.jsx +36 -0
  71. package/lib/Button/ButtonClose.d.ts +45 -45
  72. package/lib/Button/ButtonClose.jsx +55 -0
  73. package/lib/Button/ButtonDanger.d.ts +25 -25
  74. package/lib/Button/ButtonDanger.jsx +63 -0
  75. package/lib/Button/ButtonGroup.jsx +55 -0
  76. package/lib/Button/ButtonInvisible.d.ts +25 -25
  77. package/lib/Button/ButtonInvisible.jsx +52 -0
  78. package/lib/Button/ButtonOutline.d.ts +25 -25
  79. package/lib/Button/ButtonOutline.jsx +63 -0
  80. package/lib/Button/ButtonPrimary.d.ts +25 -25
  81. package/lib/Button/ButtonPrimary.jsx +62 -0
  82. package/lib/Button/ButtonStyles.jsx +37 -0
  83. package/lib/Button/ButtonTableList.jsx +49 -0
  84. package/lib/Button/index.js +21 -70
  85. package/lib/Caret.jsx +93 -0
  86. package/lib/CircleBadge.jsx +43 -0
  87. package/lib/CircleOcticon.d.ts +42 -42
  88. package/lib/CircleOcticon.jsx +21 -0
  89. package/lib/CounterLabel.jsx +44 -0
  90. package/lib/Details.jsx +21 -0
  91. package/lib/Dialog/ConfirmationDialog.jsx +146 -0
  92. package/lib/Dialog/Dialog.js +1 -0
  93. package/lib/Dialog/Dialog.jsx +273 -0
  94. package/lib/Dialog.d.ts +45 -45
  95. package/lib/Dialog.jsx +131 -0
  96. package/lib/Dropdown.d.ts +176 -176
  97. package/lib/Dropdown.jsx +134 -0
  98. package/lib/DropdownMenu/DropdownButton.d.ts +46 -46
  99. package/lib/DropdownMenu/DropdownButton.jsx +14 -0
  100. package/lib/DropdownMenu/DropdownMenu.jsx +70 -0
  101. package/lib/DropdownMenu/index.js +6 -20
  102. package/lib/DropdownStyles.js +18 -26
  103. package/lib/FilterList.d.ts +42 -42
  104. package/lib/FilterList.jsx +63 -0
  105. package/lib/FilteredActionList/FilteredActionList.jsx +100 -0
  106. package/lib/FilteredActionList/index.js +4 -12
  107. package/lib/FilteredSearch.jsx +29 -0
  108. package/lib/Flash.jsx +70 -0
  109. package/lib/Flex.jsx +15 -0
  110. package/lib/FormGroup.jsx +25 -0
  111. package/lib/Grid.jsx +15 -0
  112. package/lib/Header.jsx +90 -0
  113. package/lib/Heading.jsx +21 -0
  114. package/lib/Label.jsx +84 -0
  115. package/lib/LabelGroup.jsx +19 -0
  116. package/lib/Link.jsx +38 -0
  117. package/lib/NewButton/button-counter.d.ts +6 -0
  118. package/lib/NewButton/button-counter.js +31 -0
  119. package/lib/NewButton/button-counter.jsx +14 -0
  120. package/lib/NewButton/button.d.ts +13 -0
  121. package/lib/NewButton/button.js +316 -0
  122. package/lib/NewButton/button.jsx +278 -0
  123. package/lib/NewButton/index.d.ts +14 -0
  124. package/lib/NewButton/index.js +8 -0
  125. package/lib/NewButton/types.d.ts +32 -0
  126. package/lib/NewButton/types.js +2 -0
  127. package/lib/Overlay.jsx +156 -0
  128. package/lib/Pagehead.jsx +18 -0
  129. package/lib/Pagination/Pagination.jsx +163 -0
  130. package/lib/Pagination/index.js +6 -12
  131. package/lib/Pagination/model.jsx +174 -0
  132. package/lib/PointerBox.jsx +25 -0
  133. package/lib/Popover.jsx +210 -0
  134. package/lib/Portal/Portal.jsx +79 -0
  135. package/lib/Portal/index.js +5 -16
  136. package/lib/Position.d.ts +4 -4
  137. package/lib/Position.jsx +46 -0
  138. package/lib/ProgressBar.jsx +39 -0
  139. package/lib/SelectMenu/SelectMenu.d.ts +246 -246
  140. package/lib/SelectMenu/SelectMenu.jsx +114 -0
  141. package/lib/SelectMenu/SelectMenuContext.jsx +5 -0
  142. package/lib/SelectMenu/SelectMenuDivider.jsx +43 -0
  143. package/lib/SelectMenu/SelectMenuFilter.jsx +59 -0
  144. package/lib/SelectMenu/SelectMenuFooter.jsx +46 -0
  145. package/lib/SelectMenu/SelectMenuHeader.jsx +44 -0
  146. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  147. package/lib/SelectMenu/SelectMenuItem.jsx +143 -0
  148. package/lib/SelectMenu/SelectMenuList.jsx +60 -0
  149. package/lib/SelectMenu/SelectMenuLoadingAnimation.jsx +21 -0
  150. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  151. package/lib/SelectMenu/SelectMenuModal.jsx +119 -0
  152. package/lib/SelectMenu/SelectMenuTab.jsx +93 -0
  153. package/lib/SelectMenu/SelectMenuTabPanel.jsx +43 -0
  154. package/lib/SelectMenu/SelectMenuTabs.jsx +58 -0
  155. package/lib/SelectMenu/hooks/useKeyboardNav.js +80 -96
  156. package/lib/SelectMenu/index.js +7 -14
  157. package/lib/SelectPanel/SelectPanel.jsx +105 -0
  158. package/lib/SelectPanel/index.js +4 -12
  159. package/lib/SideNav.jsx +177 -0
  160. package/lib/Spinner.jsx +35 -0
  161. package/lib/StateLabel.d.ts +1 -1
  162. package/lib/StateLabel.js +6 -1
  163. package/lib/StateLabel.jsx +94 -0
  164. package/lib/StyledOcticon.jsx +20 -0
  165. package/lib/SubNav.jsx +104 -0
  166. package/lib/TabNav.jsx +60 -0
  167. package/lib/Text.jsx +14 -0
  168. package/lib/TextInput.jsx +23 -0
  169. package/lib/TextInputWithTokens.d.ts +28 -28
  170. package/lib/TextInputWithTokens.jsx +218 -0
  171. package/lib/ThemeProvider.jsx +130 -0
  172. package/lib/Timeline.d.ts +43 -43
  173. package/lib/Timeline.jsx +124 -0
  174. package/lib/Token/AvatarToken.d.ts +1 -1
  175. package/lib/Token/AvatarToken.jsx +54 -0
  176. package/lib/Token/IssueLabelToken.d.ts +1 -1
  177. package/lib/Token/IssueLabelToken.jsx +125 -0
  178. package/lib/Token/Token.d.ts +1 -1
  179. package/lib/Token/Token.jsx +103 -0
  180. package/lib/Token/TokenBase.jsx +88 -0
  181. package/lib/Token/_RemoveTokenButton.jsx +108 -0
  182. package/lib/Token/_TokenTextContainer.jsx +49 -0
  183. package/lib/Token/index.js +11 -30
  184. package/lib/Tooltip.jsx +246 -0
  185. package/lib/Truncate.jsx +27 -0
  186. package/lib/UnderlineNav.jsx +90 -0
  187. package/lib/_TextInputWrapper.jsx +120 -0
  188. package/lib/_UnstyledTextInput.jsx +22 -0
  189. package/lib/__tests__/ActionList.test.jsx +49 -0
  190. package/lib/__tests__/ActionList.types.test.jsx +45 -0
  191. package/lib/__tests__/ActionList2.test.d.ts +1 -0
  192. package/lib/__tests__/ActionList2.test.js +53 -0
  193. package/lib/__tests__/ActionList2.test.jsx +46 -0
  194. package/lib/__tests__/ActionMenu.test.jsx +124 -0
  195. package/lib/__tests__/AnchoredOverlay.test.jsx +121 -0
  196. package/lib/__tests__/Autocomplete.test.jsx +299 -0
  197. package/lib/__tests__/Avatar.test.jsx +42 -0
  198. package/lib/__tests__/AvatarStack.test.jsx +43 -0
  199. package/lib/__tests__/BorderBox.test.jsx +36 -0
  200. package/lib/__tests__/Box.test.jsx +41 -0
  201. package/lib/__tests__/BranchName.test.jsx +27 -0
  202. package/lib/__tests__/Breadcrumbs.test.jsx +28 -0
  203. package/lib/__tests__/BreadcrumbsItem.test.jsx +31 -0
  204. package/lib/__tests__/Button.test.jsx +100 -0
  205. package/lib/__tests__/Caret.test.jsx +37 -0
  206. package/lib/__tests__/CircleBadge.test.jsx +55 -0
  207. package/lib/__tests__/CircleOcticon.test.jsx +45 -0
  208. package/lib/__tests__/ConfirmationDialog.test.jsx +119 -0
  209. package/lib/__tests__/CounterLabel.test.jsx +36 -0
  210. package/lib/__tests__/Details.test.jsx +85 -0
  211. package/lib/__tests__/Dialog.test.jsx +139 -0
  212. package/lib/__tests__/Dropdown.test.jsx +49 -0
  213. package/lib/__tests__/DropdownMenu.test.jsx +119 -0
  214. package/lib/__tests__/FilterList.test.jsx +27 -0
  215. package/lib/__tests__/FilterListItem.test.jsx +31 -0
  216. package/lib/__tests__/FilteredSearch.test.jsx +27 -0
  217. package/lib/__tests__/Flash.test.jsx +36 -0
  218. package/lib/__tests__/Flex.test.jsx +51 -0
  219. package/lib/__tests__/FormGroup.test.jsx +36 -0
  220. package/lib/__tests__/Grid.test.jsx +69 -0
  221. package/lib/__tests__/Header.test.jsx +45 -0
  222. package/lib/__tests__/Heading.test.jsx +71 -0
  223. package/lib/__tests__/KeyPaths.types.test.js +5 -8
  224. package/lib/__tests__/Label.test.jsx +33 -0
  225. package/lib/__tests__/LabelGroup.test.jsx +29 -0
  226. package/lib/__tests__/Link.test.jsx +43 -0
  227. package/lib/__tests__/Merge.types.test.js +13 -19
  228. package/lib/__tests__/NewButton.test.d.ts +1 -0
  229. package/lib/__tests__/NewButton.test.js +95 -0
  230. package/lib/__tests__/NewButton.test.jsx +61 -0
  231. package/lib/__tests__/Overlay.test.jsx +105 -0
  232. package/lib/__tests__/Pagehead.test.jsx +25 -0
  233. package/lib/__tests__/Pagination/Pagination.test.jsx +32 -0
  234. package/lib/__tests__/Pagination/PaginationModel.test.jsx +118 -0
  235. package/lib/__tests__/PointerBox.test.jsx +33 -0
  236. package/lib/__tests__/Popover.test.jsx +58 -0
  237. package/lib/__tests__/Portal.test.jsx +102 -0
  238. package/lib/__tests__/Position.test.jsx +96 -0
  239. package/lib/__tests__/ProgressBar.test.jsx +38 -0
  240. package/lib/__tests__/SelectMenu.test.jsx +120 -0
  241. package/lib/__tests__/SelectPanel.test.jsx +48 -0
  242. package/lib/__tests__/SideNav.test.jsx +55 -0
  243. package/lib/__tests__/Spinner.test.jsx +41 -0
  244. package/lib/__tests__/StateLabel.test.jsx +46 -0
  245. package/lib/__tests__/StyledOcticon.test.jsx +28 -0
  246. package/lib/__tests__/SubNav.test.jsx +47 -0
  247. package/lib/__tests__/SubNavLink.test.jsx +31 -0
  248. package/lib/__tests__/TabNav.test.jsx +32 -0
  249. package/lib/__tests__/Text.test.jsx +71 -0
  250. package/lib/__tests__/TextInput.test.jsx +45 -0
  251. package/lib/__tests__/TextInputWithTokens.test.jsx +302 -0
  252. package/lib/__tests__/ThemeProvider.test.jsx +314 -0
  253. package/lib/__tests__/Timeline.test.jsx +51 -0
  254. package/lib/__tests__/Token.test.jsx +93 -0
  255. package/lib/__tests__/Tooltip.test.jsx +46 -0
  256. package/lib/__tests__/Truncate.test.jsx +41 -0
  257. package/lib/__tests__/UnderlineNav.test.jsx +53 -0
  258. package/lib/__tests__/UnderlineNavLink.test.jsx +31 -0
  259. package/lib/__tests__/behaviors/anchoredPosition.test.js +229 -376
  260. package/lib/__tests__/behaviors/focusTrap.test.jsx +184 -0
  261. package/lib/__tests__/behaviors/focusZone.test.jsx +406 -0
  262. package/lib/__tests__/behaviors/iterateFocusableElements.test.jsx +58 -0
  263. package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +145 -216
  264. package/lib/__tests__/filterObject.test.js +48 -27
  265. package/lib/__tests__/hooks/useAnchoredPosition.test.jsx +29 -0
  266. package/lib/__tests__/hooks/useOnEscapePress.test.jsx +19 -0
  267. package/lib/__tests__/hooks/useOnOutsideClick.test.jsx +63 -0
  268. package/lib/__tests__/hooks/useOpenAndCloseFocus.test.jsx +61 -0
  269. package/lib/__tests__/hooks/useProvidedStateOrCreate.test.jsx +56 -0
  270. package/lib/__tests__/theme.test.js +33 -34
  271. package/lib/__tests__/themeGet.test.js +12 -23
  272. package/lib/__tests__/useSafeTimeout.test.jsx +36 -0
  273. package/lib/__tests__/utils/createSlots.test.d.ts +1 -0
  274. package/lib/__tests__/utils/createSlots.test.js +75 -0
  275. package/lib/__tests__/utils/createSlots.test.jsx +57 -0
  276. package/lib/behaviors/anchoredPosition.js +205 -234
  277. package/lib/behaviors/focusTrap.js +121 -157
  278. package/lib/behaviors/focusZone.js +434 -509
  279. package/lib/behaviors/scrollIntoViewingArea.js +18 -35
  280. package/lib/constants.js +39 -43
  281. package/lib/drafts.d.ts +8 -0
  282. package/lib/drafts.js +21 -0
  283. package/lib/hooks/index.js +16 -60
  284. package/lib/hooks/useAnchoredPosition.js +32 -40
  285. package/lib/hooks/useCombinedRefs.js +32 -36
  286. package/lib/hooks/useDetails.jsx +39 -0
  287. package/lib/hooks/useDialog.js +72 -96
  288. package/lib/hooks/useFocusTrap.js +43 -60
  289. package/lib/hooks/useFocusZone.js +54 -50
  290. package/lib/hooks/useOnEscapePress.js +25 -36
  291. package/lib/hooks/useOnOutsideClick.jsx +61 -0
  292. package/lib/hooks/useOpenAndCloseFocus.js +22 -34
  293. package/lib/hooks/useOverlay.jsx +15 -0
  294. package/lib/hooks/useProvidedRefOrCreate.js +10 -14
  295. package/lib/hooks/useProvidedStateOrCreate.js +13 -16
  296. package/lib/hooks/useRenderForcingRef.js +13 -17
  297. package/lib/hooks/useResizeObserver.js +15 -18
  298. package/lib/hooks/useSafeTimeout.js +22 -30
  299. package/lib/hooks/useScrollFlash.js +16 -23
  300. package/lib/index.d.ts +2 -0
  301. package/lib/index.js +163 -636
  302. package/lib/polyfills/eventListenerSignal.js +37 -45
  303. package/lib/stories/ActionList2.stories.js +908 -0
  304. package/lib/stories/NewButton.stories.js +230 -0
  305. package/lib/sx.d.ts +2 -0
  306. package/lib/sx.js +10 -14
  307. package/lib/theme-preval.js +65 -2945
  308. package/lib/theme.js +3 -12
  309. package/lib/utils/create-slots.d.ts +17 -0
  310. package/lib/utils/create-slots.js +105 -0
  311. package/lib/utils/create-slots.jsx +65 -0
  312. package/lib/utils/deprecate.jsx +59 -0
  313. package/lib/utils/isNumeric.jsx +7 -0
  314. package/lib/utils/iterateFocusableElements.js +63 -85
  315. package/lib/utils/ssr.jsx +6 -0
  316. package/lib/utils/test-deprecations.jsx +20 -0
  317. package/lib/utils/test-helpers.jsx +8 -0
  318. package/lib/utils/test-matchers.jsx +100 -0
  319. package/lib/utils/testing.d.ts +14 -1
  320. package/lib/utils/testing.jsx +206 -0
  321. package/lib/utils/theme.js +33 -47
  322. package/lib/utils/types/AriaRole.js +2 -1
  323. package/lib/utils/types/ComponentProps.js +2 -1
  324. package/lib/utils/types/Flatten.js +2 -1
  325. package/lib/utils/types/KeyPaths.js +2 -1
  326. package/lib/utils/types/MandateProps.js +16 -1
  327. package/lib/utils/types/Merge.js +2 -1
  328. package/lib/utils/types/index.js +16 -69
  329. package/lib/utils/uniqueId.js +5 -8
  330. package/lib/utils/use-force-update.d.ts +1 -0
  331. package/lib/utils/use-force-update.js +13 -0
  332. package/lib/utils/useIsomorphicLayoutEffect.js +8 -11
  333. package/lib/utils/userAgent.js +8 -12
  334. package/lib-esm/ActionList/Item.js +28 -19
  335. package/lib-esm/ActionList2/Description.d.ts +12 -0
  336. package/lib-esm/ActionList2/Description.js +41 -0
  337. package/lib-esm/ActionList2/Divider.d.ts +5 -0
  338. package/lib-esm/ActionList2/Divider.js +23 -0
  339. package/lib-esm/ActionList2/Group.d.ts +11 -0
  340. package/lib-esm/ActionList2/Group.js +40 -0
  341. package/lib-esm/ActionList2/Header.d.ts +26 -0
  342. package/lib-esm/ActionList2/Header.js +44 -0
  343. package/lib-esm/ActionList2/Item.d.ts +63 -0
  344. package/lib-esm/ActionList2/Item.js +208 -0
  345. package/lib-esm/ActionList2/LinkItem.d.ts +17 -0
  346. package/lib-esm/ActionList2/LinkItem.js +43 -0
  347. package/lib-esm/ActionList2/List.d.ts +26 -0
  348. package/lib-esm/ActionList2/List.js +37 -0
  349. package/lib-esm/ActionList2/Selection.d.ts +5 -0
  350. package/lib-esm/ActionList2/Selection.js +66 -0
  351. package/lib-esm/ActionList2/Visuals.d.ts +9 -0
  352. package/lib-esm/ActionList2/Visuals.js +68 -0
  353. package/lib-esm/ActionList2/index.d.ts +36 -0
  354. package/lib-esm/ActionList2/index.js +33 -0
  355. package/lib-esm/Autocomplete/Autocomplete.d.ts +28 -28
  356. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +28 -28
  357. package/lib-esm/Button/Button.d.ts +25 -25
  358. package/lib-esm/Button/ButtonClose.d.ts +45 -45
  359. package/lib-esm/Button/ButtonDanger.d.ts +25 -25
  360. package/lib-esm/Button/ButtonInvisible.d.ts +25 -25
  361. package/lib-esm/Button/ButtonOutline.d.ts +25 -25
  362. package/lib-esm/Button/ButtonPrimary.d.ts +25 -25
  363. package/lib-esm/CircleOcticon.d.ts +42 -42
  364. package/lib-esm/Dialog/Dialog.js +1 -0
  365. package/lib-esm/Dialog.d.ts +45 -45
  366. package/lib-esm/Dropdown.d.ts +176 -176
  367. package/lib-esm/DropdownMenu/DropdownButton.d.ts +46 -46
  368. package/lib-esm/FilterList.d.ts +42 -42
  369. package/lib-esm/NewButton/button-counter.d.ts +6 -0
  370. package/lib-esm/NewButton/button-counter.js +18 -0
  371. package/lib-esm/NewButton/button.d.ts +13 -0
  372. package/lib-esm/NewButton/button.js +298 -0
  373. package/lib-esm/NewButton/index.d.ts +14 -0
  374. package/lib-esm/NewButton/index.js +5 -0
  375. package/lib-esm/NewButton/types.d.ts +32 -0
  376. package/lib-esm/NewButton/types.js +1 -0
  377. package/lib-esm/Position.d.ts +4 -4
  378. package/lib-esm/SelectMenu/SelectMenu.d.ts +246 -246
  379. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  380. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  381. package/lib-esm/StateLabel.d.ts +1 -1
  382. package/lib-esm/StateLabel.js +7 -2
  383. package/lib-esm/TextInputWithTokens.d.ts +28 -28
  384. package/lib-esm/Timeline.d.ts +43 -43
  385. package/lib-esm/Token/AvatarToken.d.ts +1 -1
  386. package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
  387. package/lib-esm/Token/Token.d.ts +1 -1
  388. package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
  389. package/lib-esm/__tests__/ActionList2.test.js +41 -0
  390. package/lib-esm/__tests__/NewButton.test.d.ts +1 -0
  391. package/lib-esm/__tests__/NewButton.test.js +84 -0
  392. package/lib-esm/__tests__/utils/createSlots.test.d.ts +1 -0
  393. package/lib-esm/__tests__/utils/createSlots.test.js +67 -0
  394. package/lib-esm/drafts.d.ts +8 -0
  395. package/lib-esm/drafts.js +9 -0
  396. package/lib-esm/index.d.ts +2 -0
  397. package/lib-esm/index.js +1 -0
  398. package/lib-esm/stories/ActionList2.stories.js +796 -0
  399. package/lib-esm/stories/NewButton.stories.js +178 -0
  400. package/lib-esm/sx.d.ts +2 -0
  401. package/lib-esm/sx.js +3 -1
  402. package/lib-esm/theme-preval.js +81 -2
  403. package/lib-esm/utils/create-slots.d.ts +17 -0
  404. package/lib-esm/utils/create-slots.js +84 -0
  405. package/lib-esm/utils/testing.d.ts +14 -1
  406. package/lib-esm/utils/use-force-update.d.ts +1 -0
  407. package/lib-esm/utils/use-force-update.js +6 -0
  408. package/package-lock.json +153 -14
  409. package/package.json +7 -4
  410. package/script/build +1 -1
  411. package/src/ActionList/Item.tsx +32 -19
  412. package/src/ActionList2/Description.tsx +52 -0
  413. package/src/ActionList2/Divider.tsx +24 -0
  414. package/src/ActionList2/Group.tsx +34 -0
  415. package/src/ActionList2/Header.tsx +58 -0
  416. package/src/ActionList2/Item.tsx +246 -0
  417. package/src/ActionList2/LinkItem.tsx +49 -0
  418. package/src/ActionList2/List.tsx +55 -0
  419. package/src/ActionList2/Selection.tsx +60 -0
  420. package/src/ActionList2/Visuals.tsx +76 -0
  421. package/src/ActionList2/index.ts +39 -0
  422. package/src/Dialog/Dialog.tsx +1 -0
  423. package/src/NewButton/button-counter.tsx +15 -0
  424. package/src/NewButton/button.tsx +279 -0
  425. package/src/NewButton/index.ts +10 -0
  426. package/src/NewButton/types.ts +36 -0
  427. package/src/StateLabel.tsx +14 -2
  428. package/src/__tests__/ActionList2.test.tsx +47 -0
  429. package/src/__tests__/NewButton.test.tsx +70 -0
  430. package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
  431. package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +722 -255
  432. package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +1 -0
  433. package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +1 -0
  434. package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +1 -0
  435. package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +1 -0
  436. package/src/__tests__/__snapshots__/NewButton.test.tsx.snap +300 -0
  437. package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +4 -0
  438. package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -0
  439. package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +13 -6
  440. package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +1 -0
  441. package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +66 -0
  442. package/src/__tests__/__snapshots__/Token.test.tsx.snap +17 -0
  443. package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
  444. package/src/__tests__/utils/createSlots.test.tsx +74 -0
  445. package/src/drafts.ts +10 -0
  446. package/src/index.ts +2 -0
  447. package/src/stories/ActionList2.stories.tsx +1291 -0
  448. package/src/stories/NewButton.stories.tsx +201 -0
  449. package/src/sx.ts +3 -0
  450. package/src/theme-preval.js +1 -0
  451. package/src/utils/create-slots.tsx +96 -0
  452. package/src/utils/use-force-update.ts +7 -0
  453. package/stats.html +1 -1
  454. package/tsconfig.base.json +20 -0
  455. package/tsconfig.build.json +2 -2
  456. package/tsconfig.json +4 -17
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
-
3
- var _anchoredPosition = require("../../behaviors/anchoredPosition");
4
-
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const anchoredPosition_1 = require("../../behaviors/anchoredPosition");
5
4
  /*
6
5
 
7
6
  Note: In each test below, we check the calculation from getAnchoredPosition against exact
@@ -11,380 +10,234 @@ calculation from the inputs, which may help debugging in the event of a test fai
11
10
  */
12
11
  // The DOMRect constructor isn't available in JSDOM, so we improvise here.
13
12
  function makeDOMRect(x, y, width, height) {
14
- return {
15
- x,
16
- y,
17
- width,
18
- height,
19
- top: y,
20
- left: x,
21
- right: x + width,
22
- bottom: y + height,
23
-
24
- toJSON() {
25
- return this;
26
- }
27
-
28
- };
29
- } // Since Jest/JSDOM doesn't support layout, we can stub out getBoundingClientRect if we know the
13
+ return {
14
+ x,
15
+ y,
16
+ width,
17
+ height,
18
+ top: y,
19
+ left: x,
20
+ right: x + width,
21
+ bottom: y + height,
22
+ toJSON() {
23
+ return this;
24
+ }
25
+ };
26
+ }
27
+ // Since Jest/JSDOM doesn't support layout, we can stub out getBoundingClientRect if we know the
30
28
  // correct dimensions. JSDOM will handle the rest of the DOM API used by getAnchoredPosition.
31
-
32
-
33
- function createVirtualDOM(parentRect, anchorRect, floatingRect, parentBorders = {
34
- top: 0,
35
- right: 0,
36
- bottom: 0,
37
- left: 0
38
- }) {
39
- const parent = document.createElement('div');
40
- parent.style.overflow = 'hidden';
41
- parent.style.position = 'relative';
42
- parent.style.borderTopWidth = `${parentBorders.top}px`;
43
- parent.style.borderRightWidth = `${parentBorders.right}px`;
44
- parent.style.borderBottomWidth = `${parentBorders.bottom}px`;
45
- parent.style.borderLeftWidth = `${parentBorders.left}px`;
46
- parent.id = 'parent'; // eslint-disable-next-line github/unescaped-html-literal
47
-
48
- parent.innerHTML = '<div id="float"></div><div id="anchor"></div>';
49
- const float = parent.querySelector('#float');
50
- const anchor = parent.querySelector('#anchor');
51
-
52
- anchor.getBoundingClientRect = () => anchorRect;
53
-
54
- parent.getBoundingClientRect = () => parentRect;
55
-
56
- float.getBoundingClientRect = () => floatingRect;
57
-
58
- return {
59
- float,
60
- parent,
61
- anchor
62
- };
29
+ function createVirtualDOM(parentRect, anchorRect, floatingRect, parentBorders = { top: 0, right: 0, bottom: 0, left: 0 }) {
30
+ const parent = document.createElement('div');
31
+ parent.style.overflow = 'hidden';
32
+ parent.style.position = 'relative';
33
+ parent.style.borderTopWidth = `${parentBorders.top}px`;
34
+ parent.style.borderRightWidth = `${parentBorders.right}px`;
35
+ parent.style.borderBottomWidth = `${parentBorders.bottom}px`;
36
+ parent.style.borderLeftWidth = `${parentBorders.left}px`;
37
+ parent.id = 'parent';
38
+ // eslint-disable-next-line github/unescaped-html-literal
39
+ parent.innerHTML = '<div id="float"></div><div id="anchor"></div>';
40
+ const float = parent.querySelector('#float');
41
+ const anchor = parent.querySelector('#anchor');
42
+ anchor.getBoundingClientRect = () => anchorRect;
43
+ parent.getBoundingClientRect = () => parentRect;
44
+ float.getBoundingClientRect = () => floatingRect;
45
+ return { float, parent, anchor };
63
46
  }
64
-
65
47
  describe('getAnchoredPosition', () => {
66
- it('returns the correct position in the default case with no overflow', () => {
67
- const anchorRect = makeDOMRect(300, 200, 50, 50);
68
- const floatingRect = makeDOMRect(NaN, NaN, 100, 100); // eslint-disable-next-line github/unescaped-html-literal
69
-
70
- document.body.innerHTML = '<div id="float"></div><div id="anchor"></div>';
71
- const float = document.querySelector('#float');
72
- const anchor = document.querySelector('#anchor');
73
-
74
- float.getBoundingClientRect = () => floatingRect;
75
-
76
- anchor.getBoundingClientRect = () => anchorRect;
77
-
78
- document.body.getBoundingClientRect = () => makeDOMRect(0, 0, 1920, 0);
79
-
80
- Object.defineProperty(window, 'innerHeight', {
81
- get: () => 1080
48
+ it('returns the correct position in the default case with no overflow', () => {
49
+ const anchorRect = makeDOMRect(300, 200, 50, 50);
50
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
51
+ // eslint-disable-next-line github/unescaped-html-literal
52
+ document.body.innerHTML = '<div id="float"></div><div id="anchor"></div>';
53
+ const float = document.querySelector('#float');
54
+ const anchor = document.querySelector('#anchor');
55
+ float.getBoundingClientRect = () => floatingRect;
56
+ anchor.getBoundingClientRect = () => anchorRect;
57
+ document.body.getBoundingClientRect = () => makeDOMRect(0, 0, 1920, 0);
58
+ Object.defineProperty(window, 'innerHeight', { get: () => 1080 });
59
+ const settings = { anchorOffset: 4 };
60
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
61
+ expect(top).toEqual(254);
62
+ expect(left).toEqual(300);
82
63
  });
83
- const settings = {
84
- anchorOffset: 4
85
- };
86
- const {
87
- top,
88
- left
89
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings);
90
- expect(top).toEqual(254);
91
- expect(left).toEqual(300);
92
- });
93
- it('returns the correct position in the default case with no overflow, inside a clipping parent', () => {
94
- const parentRect = makeDOMRect(20, 20, 500, 500);
95
- const anchorRect = makeDOMRect(300, 200, 50, 50);
96
- const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
97
- const {
98
- float,
99
- anchor
100
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
101
- const settings = {
102
- anchorOffset: 4
103
- };
104
- const {
105
- top,
106
- left
107
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings);
108
- expect(top).toEqual(234);
109
- expect(left).toEqual(280);
110
- });
111
- it('returns the correct position for different outside side settings with no overflow', () => {
112
- const parentRect = makeDOMRect(20, 20, 500, 500);
113
- const anchorRect = makeDOMRect(300, 200, 50, 50);
114
- const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
115
- const {
116
- float,
117
- anchor
118
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
119
- const settings = {};
120
- let top = 0;
121
- let left = 0; // should be the same calculation as the default settings test above
122
-
123
- settings.side = 'outside-bottom';
124
- ({
125
- top,
126
- left
127
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings));
128
- expect(top).toEqual(234); // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
129
-
130
- expect(left).toEqual(280); // anchorRect.left - parentRect.left
131
-
132
- settings.side = 'outside-left';
133
- ({
134
- top,
135
- left
136
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings));
137
- expect(top).toEqual(180); // anchorRect.top - parentRect.top
138
-
139
- expect(left).toEqual(176); // anchorRect.left - floatingRect.width - (settings.anchorOffset ?? 4) - parentRect.left
140
-
141
- settings.side = 'outside-right';
142
- ({
143
- top,
144
- left
145
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings));
146
- expect(top).toEqual(180); // anchorRect.top - parentRect.top
147
-
148
- expect(left).toEqual(334); // anchorRect.left + anchorRect.width + (settings.anchorOffset ?? 4) - parentRect.left
149
-
150
- settings.side = 'outside-top';
151
- ({
152
- top,
153
- left
154
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings));
155
- expect(top).toEqual(76); // anchorRect.top - floatingRect.height - (settings.anchorOffset ?? 4) - parentRect.top
156
-
157
- expect(left).toEqual(280); // anchorRect.left - parentRect.left
158
- });
159
- it('returns the correct position for different inside side settings', () => {
160
- const parentRect = makeDOMRect(20, 20, 500, 500);
161
- const anchorRect = makeDOMRect(300, 200, 50, 50);
162
- const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
163
- const {
164
- float,
165
- anchor
166
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
167
- const settings = {};
168
- let top = 0;
169
- let left = 0;
170
- settings.side = 'inside-bottom';
171
- ({
172
- top,
173
- left
174
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings)); // anchorRect.top + anchorRect.height - (settings.anchorOffset ?? 4) - floatingRect.height - parentRect.top
175
-
176
- expect(top).toEqual(126); // anchorRect.left + (settings.alignmentOffset ?? 4) - parentRect.left
177
-
178
- expect(left).toEqual(284);
179
- settings.side = 'inside-left';
180
- ({
181
- top,
182
- left
183
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings));
184
- expect(top).toEqual(184); // anchorRect.top + (settings.alignmentOffset ?? 4) - parentRect.top
185
-
186
- expect(left).toEqual(284); // anchorRect.left + (settings.anchorOffset ?? 4) - parentRect.left
187
-
188
- settings.side = 'inside-right';
189
- ({
190
- top,
191
- left
192
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings)); // anchorRect.top + (settings.alignmentOffset ?? 4) - parentRect.top
193
-
194
- expect(top).toEqual(184); // anchorRect.left + anchorRect.width - (settings.anchorOffset ?? 4) - floatingRect.width - parentRect.left
195
-
196
- expect(left).toEqual(226); // almost the same as inside-left, with the exception of offsets
197
-
198
- settings.side = 'inside-top';
199
- ({
200
- top,
201
- left
202
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings));
203
- expect(top).toEqual(184); // anchorRect.top + (settings.anchorOffset ?? 4) - parentRect.top
204
-
205
- expect(left).toEqual(284); // anchorRect.left + (settings.alignmentOffset ?? 4) - parentRect.left
206
-
207
- settings.side = 'inside-center';
208
- ({
209
- top,
210
- left
211
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings));
212
- expect(top).toEqual(184); // anchorRect.top + (settings.alignmentOffset ?? 4) - parentRect.top
213
-
214
- expect(left).toEqual(255); // anchorRect.left + anchorRect.width / 2 - floatingRect.width / 2 - parentRect.left
215
- });
216
- it('returns the correct position inside centering along both axes', () => {
217
- const parentRect = makeDOMRect(20, 20, 500, 500);
218
- const anchorRect = makeDOMRect(300, 200, 50, 50);
219
- const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
220
- const {
221
- float,
222
- anchor
223
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
224
- const settings = {
225
- side: 'inside-center',
226
- align: 'center'
227
- };
228
- const {
229
- top,
230
- left
231
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings);
232
- expect(top).toEqual(155); // anchorRect.top + anchorRect.height / 2 - floatingRect.height / 2 - parentRect.top
233
-
234
- expect(left).toEqual(255); // anchorRect.left + anchorRect.width / 2 - floatingRect.width / 2 - parentRect.left
235
- });
236
- it('returns the correct position for different alignment settings with no overflow', () => {
237
- const parentRect = makeDOMRect(20, 20, 500, 500);
238
- const anchorRect = makeDOMRect(300, 200, 50, 50);
239
- const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
240
- const {
241
- float,
242
- anchor
243
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
244
- const settings = {};
245
- let top = 0;
246
- let left = 0;
247
- settings.align = 'start';
248
- ({
249
- top,
250
- left
251
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings));
252
- expect(top).toEqual(234); // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
253
-
254
- expect(left).toEqual(280); // anchorRect.left + (settings.alignmentOffset ?? 0) - parentRect.left
255
-
256
- settings.align = 'center';
257
- ({
258
- top,
259
- left
260
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings)); // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
261
-
262
- expect(top).toEqual(234); // anchorRect.left + anchorRect.width / 2 - floatingRect.width / 2 + (settings.anchorOffset ?? 0) - parentRect.left
263
-
264
- expect(left).toEqual(255);
265
- settings.align = 'end';
266
- ({
267
- top,
268
- left
269
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings)); // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
270
-
271
- expect(top).toEqual(234); // anchorRect.left + anchorRect.width - floatingRect.width - (settings.alignmentOffset ?? 0) - parentRect.left
272
-
273
- expect(left).toEqual(230);
274
- });
275
- it('properly flips to the opposite side if the calculated position overflows along the same axis', () => {
276
- const parentRect = makeDOMRect(20, 20, 500, 500);
277
- const anchorRect = makeDOMRect(300, 400, 50, 50);
278
- const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
279
- const {
280
- float,
281
- anchor
282
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
283
- const settings = {};
284
- const {
285
- top,
286
- left
287
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings);
288
- expect(top).toEqual(276); // anchorRect.top - floatingRect.height - (settings.anchorOffset ?? 4) - parentRect.top
289
-
290
- expect(left).toEqual(280); // anchorRect.left - parentRect.left
291
- });
292
- it('properly moves to an adjacent side if overflow happens along side edge and flipped edge', () => {
293
- const parentRect = makeDOMRect(20, 20, 500, 200);
294
- const anchorRect = makeDOMRect(300, 100, 50, 50);
295
- const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
296
- const {
297
- float,
298
- anchor
299
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
300
- const settings = {};
301
- const {
302
- top,
303
- left
304
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings);
305
- expect(top).toEqual(80); // anchorRect.top - parentRect.top
306
-
307
- expect(left).toEqual(334); // anchorRect.left + anchorRect.width + (settings.anchorOffset ?? 4) - parentRect.left
308
- });
309
- it('properly adjusts the position using an alignment offset if overflow happens along the alignment edge', () => {
310
- const parentRect = makeDOMRect(20, 20, 500, 500);
311
- const anchorRect = makeDOMRect(300, 200, 50, 50);
312
- const floatingRect = makeDOMRect(NaN, NaN, 400, 100);
313
- const {
314
- float,
315
- anchor
316
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
317
- const settings = {};
318
- const {
319
- top,
320
- left
321
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings);
322
- expect(top).toEqual(234); // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
323
-
324
- expect(left).toEqual(100); // parentRect.width - floatingRect.width
325
- });
326
- it('properly calculates the position that needs to be flipped and offset-adjusted', () => {
327
- const parentRect = makeDOMRect(20, 20, 500, 500);
328
- const anchorRect = makeDOMRect(300, 400, 50, 50);
329
- const floatingRect = makeDOMRect(NaN, NaN, 400, 100);
330
- const {
331
- float,
332
- anchor
333
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
334
- const settings = {};
335
- const {
336
- top,
337
- left
338
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings);
339
- expect(top).toEqual(276); // anchorRect.top - floatingRect.height - (settings.anchorOffset ?? 4) - parentRect.top
340
-
341
- expect(left).toEqual(100); // parentRect.width - floatingRect.width
342
- });
343
- it('properly calculates the outside position with many simultaneous settings interactions (stress test)', () => {
344
- const parentRect = makeDOMRect(20, 20, 200, 500);
345
- const anchorRect = makeDOMRect(95, 295, 100, 200);
346
- const floatingRect = makeDOMRect(NaN, NaN, 175, 200);
347
- const {
348
- float,
349
- anchor
350
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
351
- const settings = {
352
- side: 'outside-right',
353
- align: 'center',
354
- alignmentOffset: 10,
355
- anchorOffset: -10
356
- };
357
- const {
358
- top,
359
- left
360
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings); // expect to try right, left, and bottom before ending on top
361
-
362
- expect(top).toEqual(85); // anchorRect.top - floatingRect.height - (settings.anchorOffset ?? 4) - parentRect.top
363
- // expect center alignment to run against edge, so ignored. Also causes alignment offset to be ignored.
364
-
365
- expect(left).toEqual(25); // parentRect.width - floatingRect.width
366
- });
367
- it('properly calculates the inside position with many simultaneous settings interactions (stress test)', () => {
368
- const parentRect = makeDOMRect(20, 20, 500, 500);
369
- const anchorRect = makeDOMRect(100, 100, 300, 300);
370
- const floatingRect = makeDOMRect(NaN, NaN, 100, 200);
371
- const {
372
- float,
373
- anchor
374
- } = createVirtualDOM(parentRect, anchorRect, floatingRect);
375
- const settings = {
376
- side: 'inside-right',
377
- align: 'center',
378
- alignmentOffset: 10,
379
- anchorOffset: -10
380
- };
381
- const {
382
- top,
383
- left
384
- } = (0, _anchoredPosition.getAnchoredPosition)(float, anchor, settings); // anchorRect.top + anchorRect.height / 2 - floatingRect.height / 2 + (settings.alignmentOffset ?? 4) - parentRect.top
385
-
386
- expect(top).toEqual(140); // anchorRect.left + anchorRect.width - floatingRect.width - (settings.anchorOffset ?? 4) - parentRect.left
387
-
388
- expect(left).toEqual(290);
389
- });
390
- });
64
+ it('returns the correct position in the default case with no overflow, inside a clipping parent', () => {
65
+ const parentRect = makeDOMRect(20, 20, 500, 500);
66
+ const anchorRect = makeDOMRect(300, 200, 50, 50);
67
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
68
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
69
+ const settings = { anchorOffset: 4 };
70
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
71
+ expect(top).toEqual(234);
72
+ expect(left).toEqual(280);
73
+ });
74
+ it('returns the correct position for different outside side settings with no overflow', () => {
75
+ const parentRect = makeDOMRect(20, 20, 500, 500);
76
+ const anchorRect = makeDOMRect(300, 200, 50, 50);
77
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
78
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
79
+ const settings = {};
80
+ let top = 0;
81
+ let left = 0;
82
+ // should be the same calculation as the default settings test above
83
+ settings.side = 'outside-bottom';
84
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
85
+ expect(top).toEqual(234); // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
86
+ expect(left).toEqual(280); // anchorRect.left - parentRect.left
87
+ settings.side = 'outside-left';
88
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
89
+ expect(top).toEqual(180); // anchorRect.top - parentRect.top
90
+ expect(left).toEqual(176); // anchorRect.left - floatingRect.width - (settings.anchorOffset ?? 4) - parentRect.left
91
+ settings.side = 'outside-right';
92
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
93
+ expect(top).toEqual(180); // anchorRect.top - parentRect.top
94
+ expect(left).toEqual(334); // anchorRect.left + anchorRect.width + (settings.anchorOffset ?? 4) - parentRect.left
95
+ settings.side = 'outside-top';
96
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
97
+ expect(top).toEqual(76); // anchorRect.top - floatingRect.height - (settings.anchorOffset ?? 4) - parentRect.top
98
+ expect(left).toEqual(280); // anchorRect.left - parentRect.left
99
+ });
100
+ it('returns the correct position for different inside side settings', () => {
101
+ const parentRect = makeDOMRect(20, 20, 500, 500);
102
+ const anchorRect = makeDOMRect(300, 200, 50, 50);
103
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
104
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
105
+ const settings = {};
106
+ let top = 0;
107
+ let left = 0;
108
+ settings.side = 'inside-bottom';
109
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
110
+ // anchorRect.top + anchorRect.height - (settings.anchorOffset ?? 4) - floatingRect.height - parentRect.top
111
+ expect(top).toEqual(126);
112
+ // anchorRect.left + (settings.alignmentOffset ?? 4) - parentRect.left
113
+ expect(left).toEqual(284);
114
+ settings.side = 'inside-left';
115
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
116
+ expect(top).toEqual(184); // anchorRect.top + (settings.alignmentOffset ?? 4) - parentRect.top
117
+ expect(left).toEqual(284); // anchorRect.left + (settings.anchorOffset ?? 4) - parentRect.left
118
+ settings.side = 'inside-right';
119
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
120
+ // anchorRect.top + (settings.alignmentOffset ?? 4) - parentRect.top
121
+ expect(top).toEqual(184);
122
+ // anchorRect.left + anchorRect.width - (settings.anchorOffset ?? 4) - floatingRect.width - parentRect.left
123
+ expect(left).toEqual(226);
124
+ // almost the same as inside-left, with the exception of offsets
125
+ settings.side = 'inside-top';
126
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
127
+ expect(top).toEqual(184); // anchorRect.top + (settings.anchorOffset ?? 4) - parentRect.top
128
+ expect(left).toEqual(284); // anchorRect.left + (settings.alignmentOffset ?? 4) - parentRect.left
129
+ settings.side = 'inside-center';
130
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
131
+ expect(top).toEqual(184); // anchorRect.top + (settings.alignmentOffset ?? 4) - parentRect.top
132
+ expect(left).toEqual(255); // anchorRect.left + anchorRect.width / 2 - floatingRect.width / 2 - parentRect.left
133
+ });
134
+ it('returns the correct position inside centering along both axes', () => {
135
+ const parentRect = makeDOMRect(20, 20, 500, 500);
136
+ const anchorRect = makeDOMRect(300, 200, 50, 50);
137
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
138
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
139
+ const settings = { side: 'inside-center', align: 'center' };
140
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
141
+ expect(top).toEqual(155); // anchorRect.top + anchorRect.height / 2 - floatingRect.height / 2 - parentRect.top
142
+ expect(left).toEqual(255); // anchorRect.left + anchorRect.width / 2 - floatingRect.width / 2 - parentRect.left
143
+ });
144
+ it('returns the correct position for different alignment settings with no overflow', () => {
145
+ const parentRect = makeDOMRect(20, 20, 500, 500);
146
+ const anchorRect = makeDOMRect(300, 200, 50, 50);
147
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
148
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
149
+ const settings = {};
150
+ let top = 0;
151
+ let left = 0;
152
+ settings.align = 'start';
153
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
154
+ expect(top).toEqual(234); // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
155
+ expect(left).toEqual(280); // anchorRect.left + (settings.alignmentOffset ?? 0) - parentRect.left
156
+ settings.align = 'center';
157
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
158
+ // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
159
+ expect(top).toEqual(234);
160
+ // anchorRect.left + anchorRect.width / 2 - floatingRect.width / 2 + (settings.anchorOffset ?? 0) - parentRect.left
161
+ expect(left).toEqual(255);
162
+ settings.align = 'end';
163
+ ({ top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings));
164
+ // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
165
+ expect(top).toEqual(234);
166
+ // anchorRect.left + anchorRect.width - floatingRect.width - (settings.alignmentOffset ?? 0) - parentRect.left
167
+ expect(left).toEqual(230);
168
+ });
169
+ it('properly flips to the opposite side if the calculated position overflows along the same axis', () => {
170
+ const parentRect = makeDOMRect(20, 20, 500, 500);
171
+ const anchorRect = makeDOMRect(300, 400, 50, 50);
172
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
173
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
174
+ const settings = {};
175
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
176
+ expect(top).toEqual(276); // anchorRect.top - floatingRect.height - (settings.anchorOffset ?? 4) - parentRect.top
177
+ expect(left).toEqual(280); // anchorRect.left - parentRect.left
178
+ });
179
+ it('properly moves to an adjacent side if overflow happens along side edge and flipped edge', () => {
180
+ const parentRect = makeDOMRect(20, 20, 500, 200);
181
+ const anchorRect = makeDOMRect(300, 100, 50, 50);
182
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 100);
183
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
184
+ const settings = {};
185
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
186
+ expect(top).toEqual(80); // anchorRect.top - parentRect.top
187
+ expect(left).toEqual(334); // anchorRect.left + anchorRect.width + (settings.anchorOffset ?? 4) - parentRect.left
188
+ });
189
+ it('properly adjusts the position using an alignment offset if overflow happens along the alignment edge', () => {
190
+ const parentRect = makeDOMRect(20, 20, 500, 500);
191
+ const anchorRect = makeDOMRect(300, 200, 50, 50);
192
+ const floatingRect = makeDOMRect(NaN, NaN, 400, 100);
193
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
194
+ const settings = {};
195
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
196
+ expect(top).toEqual(234); // anchorRect.top + anchorRect.height + (settings.anchorOffset ?? 4) - parentRect.top
197
+ expect(left).toEqual(100); // parentRect.width - floatingRect.width
198
+ });
199
+ it('properly calculates the position that needs to be flipped and offset-adjusted', () => {
200
+ const parentRect = makeDOMRect(20, 20, 500, 500);
201
+ const anchorRect = makeDOMRect(300, 400, 50, 50);
202
+ const floatingRect = makeDOMRect(NaN, NaN, 400, 100);
203
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
204
+ const settings = {};
205
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
206
+ expect(top).toEqual(276); // anchorRect.top - floatingRect.height - (settings.anchorOffset ?? 4) - parentRect.top
207
+ expect(left).toEqual(100); // parentRect.width - floatingRect.width
208
+ });
209
+ it('properly calculates the outside position with many simultaneous settings interactions (stress test)', () => {
210
+ const parentRect = makeDOMRect(20, 20, 200, 500);
211
+ const anchorRect = makeDOMRect(95, 295, 100, 200);
212
+ const floatingRect = makeDOMRect(NaN, NaN, 175, 200);
213
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
214
+ const settings = {
215
+ side: 'outside-right',
216
+ align: 'center',
217
+ alignmentOffset: 10,
218
+ anchorOffset: -10
219
+ };
220
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
221
+ // expect to try right, left, and bottom before ending on top
222
+ expect(top).toEqual(85); // anchorRect.top - floatingRect.height - (settings.anchorOffset ?? 4) - parentRect.top
223
+ // expect center alignment to run against edge, so ignored. Also causes alignment offset to be ignored.
224
+ expect(left).toEqual(25); // parentRect.width - floatingRect.width
225
+ });
226
+ it('properly calculates the inside position with many simultaneous settings interactions (stress test)', () => {
227
+ const parentRect = makeDOMRect(20, 20, 500, 500);
228
+ const anchorRect = makeDOMRect(100, 100, 300, 300);
229
+ const floatingRect = makeDOMRect(NaN, NaN, 100, 200);
230
+ const { float, anchor } = createVirtualDOM(parentRect, anchorRect, floatingRect);
231
+ const settings = {
232
+ side: 'inside-right',
233
+ align: 'center',
234
+ alignmentOffset: 10,
235
+ anchorOffset: -10
236
+ };
237
+ const { top, left } = anchoredPosition_1.getAnchoredPosition(float, anchor, settings);
238
+ // anchorRect.top + anchorRect.height / 2 - floatingRect.height / 2 + (settings.alignmentOffset ?? 4) - parentRect.top
239
+ expect(top).toEqual(140);
240
+ // anchorRect.left + anchorRect.width - floatingRect.width - (settings.anchorOffset ?? 4) - parentRect.left
241
+ expect(left).toEqual(290);
242
+ });
243
+ });