@telus-uds/components-base 0.0.2-prerelease.4 → 0.0.2-prerelease.8

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 (447) hide show
  1. package/.ultra.cache.json +1 -0
  2. package/CHANGELOG.md +76 -0
  3. package/__fixtures__/Accessible.js +33 -0
  4. package/__fixtures__/Accessible.native.js +32 -0
  5. package/__fixtures__/testTheme.js +940 -54
  6. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  7. package/__tests__/Button/ButtonBase.test.jsx +3 -32
  8. package/__tests__/Button/ButtonGroup.test.jsx +2 -2
  9. package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
  10. package/__tests__/Checkbox/CheckboxGroup.test.jsx +247 -0
  11. package/__tests__/Divider/Divider.test.jsx +26 -5
  12. package/__tests__/Feedback/Feedback.test.jsx +42 -0
  13. package/__tests__/Icon/Icon.test.jsx +3 -3
  14. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  15. package/__tests__/List/List.test.jsx +60 -0
  16. package/__tests__/Modal/Modal.test.jsx +47 -0
  17. package/__tests__/Notification/Notification.test.jsx +20 -0
  18. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  19. package/__tests__/Progress/Progress.test.jsx +79 -0
  20. package/__tests__/Radio/Radio.test.jsx +87 -0
  21. package/__tests__/Radio/RadioGroup.test.jsx +221 -0
  22. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  23. package/__tests__/RadioCard/RadioCardGroup.test.jsx +247 -0
  24. package/__tests__/Search/Search.test.jsx +72 -0
  25. package/__tests__/Select/Select.test.jsx +93 -0
  26. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  27. package/__tests__/Spacer/Spacer.test.jsx +63 -0
  28. package/__tests__/StackView/StackView.test.jsx +216 -0
  29. package/__tests__/StackView/StackWrap.test.jsx +47 -0
  30. package/__tests__/StackView/getStackedContent.test.jsx +295 -0
  31. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  32. package/__tests__/Tabs/Tabs.test.jsx +200 -0
  33. package/__tests__/Tags/Tags.test.jsx +328 -0
  34. package/__tests__/TextInput/TextArea.test.jsx +34 -0
  35. package/__tests__/TextInput/TextInputBase.test.jsx +120 -0
  36. package/__tests__/Tooltip/Tooltip.test.jsx +65 -0
  37. package/__tests__/Tooltip/getTooltipPosition.test.js +79 -0
  38. package/__tests__/utils/input.test.js +58 -0
  39. package/__tests__/utils/useCopy.test.js +42 -0
  40. package/__tests__/utils/useResponsiveProp.test.jsx +202 -0
  41. package/__tests__/utils/{spacing.test.jsx → useSpacingScale.test.jsx} +1 -1
  42. package/__tests__/utils/useUniqueId.test.js +31 -0
  43. package/babel.config.js +20 -0
  44. package/jest.config.js +8 -2
  45. package/lib/A11yInfoProvider/index.js +54 -26
  46. package/lib/A11yText/index.js +37 -14
  47. package/lib/ActivityIndicator/Spinner.js +78 -0
  48. package/lib/ActivityIndicator/Spinner.native.js +121 -87
  49. package/lib/ActivityIndicator/index.js +28 -12
  50. package/lib/ActivityIndicator/shared.js +27 -12
  51. package/lib/BaseProvider/index.js +34 -11
  52. package/lib/Box/Box.js +56 -28
  53. package/lib/Box/index.js +13 -2
  54. package/lib/Button/Button.js +38 -10
  55. package/lib/Button/ButtonBase.js +120 -109
  56. package/lib/Button/ButtonGroup.js +98 -99
  57. package/lib/Button/ButtonLink.js +41 -13
  58. package/lib/Button/index.js +31 -4
  59. package/lib/Button/propTypes.js +32 -9
  60. package/lib/Card/Card.js +36 -41
  61. package/lib/Card/CardBase.js +78 -0
  62. package/lib/Card/PressableCardBase.js +137 -0
  63. package/lib/Card/index.js +40 -2
  64. package/lib/Checkbox/Checkbox.js +344 -0
  65. package/lib/Checkbox/CheckboxGroup.js +231 -0
  66. package/lib/Checkbox/CheckboxInput.js +74 -0
  67. package/lib/Checkbox/CheckboxInput.native.js +14 -0
  68. package/lib/Checkbox/index.js +21 -0
  69. package/lib/Divider/Divider.js +81 -17
  70. package/lib/Divider/index.js +13 -2
  71. package/lib/ExpandCollapse/Accordion.js +20 -7
  72. package/lib/ExpandCollapse/Control.js +50 -27
  73. package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
  74. package/lib/ExpandCollapse/Panel.js +75 -37
  75. package/lib/ExpandCollapse/index.js +25 -7
  76. package/lib/Feedback/Feedback.js +161 -0
  77. package/lib/Feedback/index.js +13 -0
  78. package/lib/Fieldset/Fieldset.js +160 -0
  79. package/lib/Fieldset/FieldsetContainer.js +41 -0
  80. package/lib/Fieldset/FieldsetContainer.native.js +33 -0
  81. package/lib/Fieldset/Legend.js +33 -0
  82. package/lib/Fieldset/Legend.native.js +43 -0
  83. package/lib/Fieldset/cssReset.js +21 -0
  84. package/lib/Fieldset/index.js +13 -0
  85. package/lib/FlexGrid/Col/Col.js +67 -38
  86. package/lib/FlexGrid/Col/index.js +13 -2
  87. package/lib/FlexGrid/FlexGrid.js +70 -45
  88. package/lib/FlexGrid/Row/Row.js +48 -27
  89. package/lib/FlexGrid/Row/index.js +13 -2
  90. package/lib/FlexGrid/helpers/index.js +9 -1
  91. package/lib/FlexGrid/index.js +13 -2
  92. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  93. package/lib/Icon/Icon.js +52 -47
  94. package/lib/Icon/IconText.js +100 -0
  95. package/lib/Icon/index.js +31 -3
  96. package/lib/InputLabel/InputLabel.js +122 -0
  97. package/lib/InputLabel/LabelContent.js +31 -0
  98. package/lib/InputLabel/LabelContent.native.js +16 -0
  99. package/lib/InputLabel/index.js +13 -0
  100. package/lib/InputSupports/InputSupports.js +104 -0
  101. package/lib/InputSupports/index.js +13 -0
  102. package/lib/InputSupports/propTypes.js +66 -0
  103. package/lib/InputSupports/useInputSupports.js +41 -0
  104. package/lib/Link/ChevronLink.js +57 -15
  105. package/lib/Link/InlinePressable.js +50 -0
  106. package/lib/Link/InlinePressable.native.js +101 -0
  107. package/lib/Link/Link.js +30 -13
  108. package/lib/Link/LinkBase.js +121 -146
  109. package/lib/Link/TextButton.js +47 -17
  110. package/lib/Link/index.js +39 -4
  111. package/lib/List/List.js +80 -0
  112. package/lib/List/ListItem.js +237 -0
  113. package/lib/List/index.js +13 -0
  114. package/lib/Modal/Modal.js +226 -0
  115. package/lib/Modal/dictionary.js +16 -0
  116. package/lib/Modal/index.js +13 -0
  117. package/lib/Notification/Notification.js +200 -0
  118. package/lib/Notification/dictionary.js +15 -0
  119. package/lib/Notification/index.js +13 -0
  120. package/lib/Pagination/PageButton.js +45 -46
  121. package/lib/Pagination/Pagination.js +70 -40
  122. package/lib/Pagination/SideButton.js +74 -58
  123. package/lib/Pagination/dictionary.js +9 -2
  124. package/lib/Pagination/index.js +13 -2
  125. package/lib/Pagination/usePagination.js +12 -2
  126. package/lib/Progress/Progress.js +99 -0
  127. package/lib/Progress/ProgressBar.js +146 -0
  128. package/lib/Progress/ProgressBarBackground.js +57 -0
  129. package/lib/Progress/index.js +16 -0
  130. package/lib/Radio/Radio.js +292 -0
  131. package/lib/Radio/RadioButton.js +141 -0
  132. package/lib/Radio/RadioGroup.js +233 -0
  133. package/lib/Radio/RadioInput.js +76 -0
  134. package/lib/Radio/RadioInput.native.js +14 -0
  135. package/lib/Radio/index.js +21 -0
  136. package/lib/RadioCard/RadioCard.js +240 -0
  137. package/lib/RadioCard/RadioCardGroup.js +251 -0
  138. package/lib/RadioCard/index.js +21 -0
  139. package/lib/Search/Search.js +243 -0
  140. package/lib/Search/dictionary.js +19 -0
  141. package/lib/Search/index.js +13 -0
  142. package/lib/Select/Group.js +33 -0
  143. package/lib/Select/Group.native.js +25 -0
  144. package/lib/Select/Item.js +29 -0
  145. package/lib/Select/Item.native.js +19 -0
  146. package/lib/Select/Picker.js +79 -0
  147. package/lib/Select/Picker.native.js +115 -0
  148. package/lib/Select/Select.js +300 -0
  149. package/lib/Select/index.js +19 -0
  150. package/lib/SideNav/Item.js +54 -33
  151. package/lib/SideNav/ItemContent.js +41 -15
  152. package/lib/SideNav/ItemsGroup.js +46 -27
  153. package/lib/SideNav/SideNav.js +92 -69
  154. package/lib/SideNav/index.js +15 -1
  155. package/lib/Skeleton/Skeleton.js +137 -0
  156. package/lib/Skeleton/index.js +13 -0
  157. package/lib/Skeleton/skeleton.constant.js +12 -0
  158. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  159. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  160. package/lib/Spacer/Spacer.js +117 -0
  161. package/lib/Spacer/index.js +13 -0
  162. package/lib/StackView/StackView.js +129 -0
  163. package/lib/StackView/StackWrap.js +55 -0
  164. package/lib/StackView/StackWrap.native.js +14 -0
  165. package/lib/StackView/StackWrapBox.js +112 -0
  166. package/lib/StackView/StackWrapGap.js +71 -0
  167. package/lib/StackView/common.js +45 -0
  168. package/lib/StackView/getStackedContent.js +141 -0
  169. package/lib/StackView/index.js +29 -0
  170. package/lib/StepTracker/Step.js +245 -0
  171. package/lib/StepTracker/StepTracker.js +197 -0
  172. package/lib/StepTracker/dictionary.js +17 -0
  173. package/lib/StepTracker/index.js +13 -0
  174. package/lib/Tabs/HorizontalScroll.js +199 -0
  175. package/lib/Tabs/ScrollViewEnd.js +66 -0
  176. package/lib/Tabs/ScrollViewEnd.native.js +41 -0
  177. package/lib/Tabs/Tabs.js +117 -0
  178. package/lib/Tabs/TabsItem.js +234 -0
  179. package/lib/Tabs/TabsScrollButton.js +121 -0
  180. package/lib/Tabs/dictionary.js +18 -0
  181. package/lib/Tabs/index.js +13 -0
  182. package/lib/Tabs/itemPositions.js +128 -0
  183. package/lib/Tags/Tags.js +250 -0
  184. package/lib/Tags/index.js +13 -0
  185. package/lib/TextInput/TextArea.js +109 -0
  186. package/lib/TextInput/TextInput.js +75 -0
  187. package/lib/TextInput/TextInputBase.js +252 -0
  188. package/lib/TextInput/index.js +23 -0
  189. package/lib/TextInput/propTypes.js +42 -0
  190. package/lib/ThemeProvider/ThemeProvider.js +38 -14
  191. package/lib/ThemeProvider/index.js +61 -6
  192. package/lib/ThemeProvider/useSetTheme.js +14 -5
  193. package/lib/ThemeProvider/useTheme.js +13 -4
  194. package/lib/ThemeProvider/useThemeTokens.js +86 -19
  195. package/lib/ThemeProvider/utils/index.js +31 -2
  196. package/lib/ThemeProvider/utils/styles.js +52 -16
  197. package/lib/ThemeProvider/utils/theme-tokens.js +94 -16
  198. package/lib/ToggleSwitch/ToggleSwitch.js +76 -52
  199. package/lib/ToggleSwitch/index.js +13 -2
  200. package/lib/Tooltip/Backdrop.js +56 -0
  201. package/lib/Tooltip/Backdrop.native.js +59 -0
  202. package/lib/Tooltip/Tooltip.js +357 -0
  203. package/lib/Tooltip/dictionary.js +15 -0
  204. package/lib/Tooltip/getTooltipPosition.js +172 -0
  205. package/lib/Tooltip/index.js +13 -0
  206. package/lib/TooltipButton/TooltipButton.js +83 -0
  207. package/lib/TooltipButton/index.js +13 -0
  208. package/lib/Typography/Typography.js +58 -47
  209. package/lib/Typography/index.js +13 -2
  210. package/lib/ViewportProvider/ViewportProvider.js +46 -0
  211. package/lib/ViewportProvider/index.js +22 -38
  212. package/lib/ViewportProvider/useViewport.js +15 -0
  213. package/lib/ViewportProvider/useViewportListener.js +57 -0
  214. package/lib/index.js +509 -19
  215. package/lib/utils/a11y/index.js +18 -0
  216. package/lib/utils/a11y/textSize.js +49 -0
  217. package/lib/utils/animation/index.js +15 -2
  218. package/lib/utils/animation/useVerticalExpandAnimation.js +28 -11
  219. package/lib/utils/children.js +87 -0
  220. package/lib/utils/index.js +163 -4
  221. package/lib/utils/info/index.js +19 -0
  222. package/lib/utils/info/platform/index.js +23 -0
  223. package/lib/utils/info/platform/platform.android.js +8 -0
  224. package/lib/utils/info/platform/platform.ios.js +8 -0
  225. package/lib/utils/info/platform/platform.js +8 -0
  226. package/lib/utils/info/platform/platform.native.js +11 -0
  227. package/lib/utils/info/versions.js +16 -0
  228. package/lib/utils/input.js +54 -34
  229. package/lib/utils/pressability.js +120 -0
  230. package/lib/utils/propTypes.js +269 -108
  231. package/lib/utils/useCopy.js +51 -0
  232. package/lib/utils/useHash.js +48 -0
  233. package/lib/utils/useHash.native.js +15 -0
  234. package/lib/utils/useResponsiveProp.js +59 -0
  235. package/lib/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +45 -12
  236. package/lib/utils/useUniqueId.js +21 -0
  237. package/package.json +11 -8
  238. package/release-context.json +4 -4
  239. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
  240. package/src/Box/Box.jsx +13 -4
  241. package/src/Button/Button.jsx +9 -5
  242. package/src/Button/ButtonBase.jsx +74 -86
  243. package/src/Button/ButtonGroup.jsx +24 -41
  244. package/src/Button/ButtonLink.jsx +14 -4
  245. package/src/Button/propTypes.js +12 -2
  246. package/src/Card/Card.jsx +4 -30
  247. package/src/Card/CardBase.jsx +57 -0
  248. package/src/Card/PressableCardBase.jsx +112 -0
  249. package/src/Card/index.js +3 -0
  250. package/src/Checkbox/Checkbox.jsx +274 -0
  251. package/src/Checkbox/CheckboxGroup.jsx +196 -0
  252. package/src/Checkbox/CheckboxInput.jsx +55 -0
  253. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  254. package/src/Checkbox/index.js +5 -0
  255. package/src/Divider/Divider.jsx +38 -3
  256. package/src/ExpandCollapse/Control.jsx +1 -1
  257. package/src/Feedback/Feedback.jsx +108 -0
  258. package/src/Feedback/index.js +3 -0
  259. package/src/Fieldset/Fieldset.jsx +129 -0
  260. package/src/Fieldset/FieldsetContainer.jsx +22 -0
  261. package/src/Fieldset/FieldsetContainer.native.jsx +16 -0
  262. package/src/Fieldset/Legend.jsx +16 -0
  263. package/src/Fieldset/Legend.native.jsx +22 -0
  264. package/src/Fieldset/cssReset.js +14 -0
  265. package/src/Fieldset/index.js +3 -0
  266. package/src/Icon/Icon.jsx +23 -27
  267. package/src/Icon/IconText.jsx +63 -0
  268. package/src/Icon/index.js +3 -2
  269. package/src/InputLabel/InputLabel.jsx +106 -0
  270. package/src/InputLabel/LabelContent.jsx +13 -0
  271. package/src/InputLabel/LabelContent.native.jsx +6 -0
  272. package/src/InputLabel/index.js +3 -0
  273. package/src/InputSupports/InputSupports.jsx +75 -0
  274. package/src/InputSupports/index.js +3 -0
  275. package/src/InputSupports/propTypes.js +44 -0
  276. package/src/InputSupports/useInputSupports.js +30 -0
  277. package/src/Link/ChevronLink.jsx +28 -7
  278. package/src/Link/InlinePressable.jsx +37 -0
  279. package/src/Link/InlinePressable.native.jsx +73 -0
  280. package/src/Link/Link.jsx +17 -13
  281. package/src/Link/LinkBase.jsx +71 -146
  282. package/src/Link/TextButton.jsx +25 -11
  283. package/src/Link/index.js +2 -1
  284. package/src/List/List.jsx +47 -0
  285. package/src/List/ListItem.jsx +187 -0
  286. package/src/List/index.js +3 -0
  287. package/src/Modal/Modal.jsx +185 -0
  288. package/src/Modal/dictionary.js +9 -0
  289. package/src/Modal/index.js +3 -0
  290. package/src/Notification/Notification.jsx +149 -0
  291. package/src/Notification/dictionary.js +8 -0
  292. package/src/Notification/index.js +3 -0
  293. package/src/Pagination/PageButton.jsx +3 -17
  294. package/src/Pagination/SideButton.jsx +27 -38
  295. package/src/Progress/Progress.jsx +77 -0
  296. package/src/Progress/ProgressBar.jsx +110 -0
  297. package/src/Progress/ProgressBarBackground.jsx +34 -0
  298. package/src/Progress/index.js +6 -0
  299. package/src/Radio/Radio.jsx +233 -0
  300. package/src/Radio/RadioButton.jsx +131 -0
  301. package/src/Radio/RadioGroup.jsx +198 -0
  302. package/src/Radio/RadioInput.jsx +57 -0
  303. package/src/Radio/RadioInput.native.jsx +6 -0
  304. package/src/Radio/index.js +5 -0
  305. package/src/RadioCard/RadioCard.jsx +191 -0
  306. package/src/RadioCard/RadioCardGroup.jsx +211 -0
  307. package/src/RadioCard/index.js +5 -0
  308. package/src/Search/Search.jsx +204 -0
  309. package/src/Search/dictionary.js +12 -0
  310. package/src/Search/index.js +3 -0
  311. package/src/Select/Group.jsx +15 -0
  312. package/src/Select/Group.native.jsx +14 -0
  313. package/src/Select/Item.jsx +11 -0
  314. package/src/Select/Item.native.jsx +10 -0
  315. package/src/Select/Picker.jsx +67 -0
  316. package/src/Select/Picker.native.jsx +95 -0
  317. package/src/Select/Select.jsx +255 -0
  318. package/src/Select/index.js +8 -0
  319. package/src/SideNav/Item.jsx +2 -2
  320. package/src/Skeleton/Skeleton.jsx +98 -0
  321. package/src/Skeleton/index.js +3 -0
  322. package/src/Skeleton/skeleton.constant.js +3 -0
  323. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  324. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  325. package/src/Spacer/Spacer.jsx +91 -0
  326. package/src/Spacer/index.js +3 -0
  327. package/src/StackView/StackView.jsx +111 -0
  328. package/src/StackView/StackWrap.jsx +41 -0
  329. package/src/StackView/StackWrap.native.jsx +4 -0
  330. package/src/StackView/StackWrapBox.jsx +94 -0
  331. package/src/StackView/StackWrapGap.jsx +49 -0
  332. package/src/StackView/common.jsx +28 -0
  333. package/src/StackView/getStackedContent.jsx +112 -0
  334. package/src/StackView/index.js +6 -0
  335. package/src/StepTracker/Step.jsx +202 -0
  336. package/src/StepTracker/StepTracker.jsx +163 -0
  337. package/src/StepTracker/dictionary.js +10 -0
  338. package/src/StepTracker/index.js +3 -0
  339. package/src/Tabs/HorizontalScroll.jsx +165 -0
  340. package/src/Tabs/ScrollViewEnd.jsx +53 -0
  341. package/src/Tabs/ScrollViewEnd.native.jsx +24 -0
  342. package/src/Tabs/Tabs.jsx +89 -0
  343. package/src/Tabs/TabsItem.jsx +204 -0
  344. package/src/Tabs/TabsScrollButton.jsx +100 -0
  345. package/src/Tabs/dictionary.js +11 -0
  346. package/src/Tabs/index.js +3 -0
  347. package/src/Tabs/itemPositions.js +101 -0
  348. package/src/Tags/Tags.jsx +207 -0
  349. package/src/Tags/index.js +3 -0
  350. package/src/TextInput/TextArea.jsx +78 -0
  351. package/src/TextInput/TextInput.jsx +52 -0
  352. package/src/TextInput/TextInputBase.jsx +210 -0
  353. package/src/TextInput/index.js +4 -0
  354. package/src/TextInput/propTypes.js +29 -0
  355. package/src/ThemeProvider/useThemeTokens.js +56 -5
  356. package/src/ThemeProvider/utils/styles.js +18 -5
  357. package/src/ThemeProvider/utils/theme-tokens.js +46 -5
  358. package/src/ToggleSwitch/ToggleSwitch.jsx +3 -4
  359. package/src/Tooltip/Backdrop.jsx +60 -0
  360. package/src/Tooltip/Backdrop.native.jsx +33 -0
  361. package/src/Tooltip/Tooltip.jsx +294 -0
  362. package/src/Tooltip/dictionary.js +8 -0
  363. package/src/Tooltip/getTooltipPosition.js +161 -0
  364. package/src/Tooltip/index.js +3 -0
  365. package/src/TooltipButton/TooltipButton.jsx +49 -0
  366. package/src/TooltipButton/index.js +3 -0
  367. package/src/Typography/Typography.jsx +10 -24
  368. package/src/ViewportProvider/ViewportProvider.jsx +21 -0
  369. package/src/ViewportProvider/index.jsx +2 -41
  370. package/src/ViewportProvider/useViewport.js +5 -0
  371. package/src/ViewportProvider/useViewportListener.js +43 -0
  372. package/src/index.js +34 -2
  373. package/src/utils/a11y/index.js +1 -0
  374. package/src/utils/a11y/textSize.js +30 -0
  375. package/src/utils/children.jsx +66 -0
  376. package/src/utils/index.js +11 -1
  377. package/src/utils/info/index.js +8 -0
  378. package/src/utils/info/platform/index.js +11 -0
  379. package/src/utils/info/platform/platform.android.js +1 -0
  380. package/src/utils/info/platform/platform.ios.js +1 -0
  381. package/src/utils/info/platform/platform.js +1 -0
  382. package/src/utils/info/platform/platform.native.js +4 -0
  383. package/src/utils/info/versions.js +6 -0
  384. package/src/utils/input.js +22 -13
  385. package/src/utils/pressability.js +96 -0
  386. package/src/utils/propTypes.js +195 -47
  387. package/src/utils/useCopy.js +39 -0
  388. package/src/utils/useHash.js +34 -0
  389. package/src/utils/useHash.native.js +6 -0
  390. package/src/utils/useResponsiveProp.js +50 -0
  391. package/src/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +25 -10
  392. package/src/utils/useUniqueId.js +14 -0
  393. package/stories/A11yText/A11yText.stories.jsx +15 -13
  394. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +11 -2
  395. package/stories/Box/Box.stories.jsx +29 -2
  396. package/stories/Button/Button.stories.jsx +21 -20
  397. package/stories/Button/ButtonGroup.stories.jsx +2 -1
  398. package/stories/Button/ButtonLink.stories.jsx +6 -4
  399. package/stories/Card/Card.stories.jsx +13 -1
  400. package/stories/Checkbox/Checkbox.stories.jsx +94 -0
  401. package/stories/Divider/Divider.stories.jsx +26 -2
  402. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +74 -79
  403. package/stories/Feedback/Feedback.stories.jsx +96 -0
  404. package/stories/FlexGrid/01 FlexGrid.stories.jsx +20 -7
  405. package/stories/Icon/Icon.stories.jsx +15 -6
  406. package/stories/InputLabel/InputLabel.stories.jsx +42 -0
  407. package/stories/Link/ChevronLink.stories.jsx +20 -4
  408. package/stories/Link/Link.stories.jsx +39 -3
  409. package/stories/Link/TextButton.stories.jsx +24 -2
  410. package/stories/List/List.stories.jsx +117 -0
  411. package/stories/Modal/Modal.stories.jsx +29 -0
  412. package/stories/Notification/Notification.stories.jsx +82 -0
  413. package/stories/Pagination/Pagination.stories.jsx +28 -14
  414. package/stories/Progress/Progress.stories.jsx +93 -0
  415. package/stories/Radio/Radio.stories.jsx +100 -0
  416. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  417. package/stories/Search/Search.stories.jsx +16 -0
  418. package/stories/Select/Select.stories.jsx +55 -0
  419. package/stories/SideNav/SideNav.stories.jsx +17 -2
  420. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  421. package/stories/Spacer/Spacer.stories.jsx +38 -0
  422. package/stories/StackView/StackView.stories.jsx +75 -0
  423. package/stories/StackView/StackWrap.stories.jsx +64 -0
  424. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  425. package/stories/Tabs/Tabs.stories.jsx +97 -0
  426. package/stories/Tags/Tags.stories.jsx +69 -0
  427. package/stories/TextInput/TextArea.stories.jsx +100 -0
  428. package/stories/TextInput/TextInput.stories.jsx +103 -0
  429. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +16 -3
  430. package/stories/Tooltip/Tooltip.stories.jsx +81 -0
  431. package/stories/TooltipButton/TooltipButton.stories.jsx +11 -0
  432. package/stories/Typography/Typography.stories.jsx +12 -3
  433. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  434. package/stories/supports.jsx +110 -14
  435. package/__fixtures__/accessible.icon.svg +0 -6
  436. package/babel.config.json +0 -8
  437. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  438. package/lib/Pagination/useCopy.js +0 -10
  439. package/lib/config/svgr-icons-web.js +0 -9
  440. package/lib/config/svgr-icons.js +0 -52
  441. package/lib/utils/spacing/index.js +0 -2
  442. package/lib/utils/spacing/utils.js +0 -32
  443. package/src/Pagination/useCopy.js +0 -7
  444. package/src/config/svgr-icons-web.js +0 -11
  445. package/src/config/svgr-icons.js +0 -46
  446. package/src/utils/spacing/index.js +0 -3
  447. package/src/utils/spacing/utils.js +0 -28
@@ -1,2 +1,13 @@
1
- import ToggleSwitch from './ToggleSwitch';
2
- export default ToggleSwitch;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _ToggleSwitch = _interopRequireDefault(require("./ToggleSwitch"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ var _default = _ToggleSwitch.default;
13
+ exports.default = _default;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _reactDom = _interopRequireDefault(require("react-dom"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function createPortalNode(nodeId) {
17
+ const node = document.createElement('div');
18
+ node.id = nodeId; // we're mimicking React Native's Modal component, except for using an `absolute` position
19
+ // this way the backdrop stays in place when scrolling the window - that's why we need to
20
+ // position it at the scroll position when rendering
21
+
22
+ node.style.cssText = "\n position: absolute; \n top: ".concat(window.scrollY, "px;\n left: ").concat(window.scrollX, "px; \n right: 0; \n bottom: 0; \n z-index: 9999; \n pointer-events: none;\n ");
23
+ document.body.appendChild(node);
24
+ return node;
25
+ }
26
+
27
+ function removePortalNode(nodeId) {
28
+ const node = document.getElementById(nodeId);
29
+ node.parentElement.removeChild(node);
30
+ }
31
+ /**
32
+ * The Web version of Backdrop utilizes React Portal for overlaying page content, so it is
33
+ * dependent on ReactDOM. Tooltip's closing is handled by the onBlur callback of the control.
34
+ */
35
+
36
+
37
+ function Backdrop({
38
+ children
39
+ }) {
40
+ const [portalNode, setPortalNode] = (0, _react.useState)();
41
+ (0, _react.useEffect)(() => {
42
+ const nodeId = "tooltip-backdrop-".concat(Date.now());
43
+ const node = createPortalNode(nodeId);
44
+ setPortalNode(node);
45
+ return () => {
46
+ removePortalNode(nodeId);
47
+ };
48
+ }, []);
49
+ return portalNode ? /*#__PURE__*/_reactDom.default.createPortal(children, portalNode) : null;
50
+ }
51
+
52
+ Backdrop.propTypes = {
53
+ children: _propTypes.default.node
54
+ };
55
+ var _default = Backdrop;
56
+ exports.default = _default;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _TouchableWithoutFeedback = _interopRequireDefault(require("react-native-web/dist/cjs/exports/TouchableWithoutFeedback"));
11
+
12
+ var _Modal = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Modal"));
13
+
14
+ var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
15
+
16
+ var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
17
+
18
+ var _propTypes = _interopRequireDefault(require("prop-types"));
19
+
20
+ var _jsxRuntime = require("react/jsx-runtime");
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ /**
25
+ * The Native version of Backdrop utilizes React Native's Modal component for overlaying
26
+ * the app's content, since this is the only reliable to do it. The only drawback of this
27
+ * approach is that a press on the Backdrop will actually stop the press event from propagating,
28
+ * i.e. anything rendered beneath the Backdrop can't be pressed until the Backdrop is closed.
29
+ */
30
+ function Backdrop({
31
+ onPress,
32
+ children
33
+ }) {
34
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Modal.default, {
35
+ transparent: true,
36
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TouchableWithoutFeedback.default, {
37
+ onPress: onPress,
38
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
39
+ style: staticStyles.backdrop,
40
+ children: children
41
+ })
42
+ })
43
+ });
44
+ }
45
+
46
+ var _default = Backdrop;
47
+ exports.default = _default;
48
+ Backdrop.propTypes = {
49
+ onPress: _propTypes.default.func,
50
+ children: _propTypes.default.node
51
+ };
52
+
53
+ const staticStyles = _StyleSheet.default.create({
54
+ backdrop: {
55
+ flexBasis: '100%',
56
+ backgroundColor: 'rgba(255, 255, 255, 0.5)' // to visually mark that the content beneath is not pressable
57
+
58
+ }
59
+ });
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _Dimensions = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Dimensions"));
11
+
12
+ var _Platform = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Platform"));
13
+
14
+ var _Pressable = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Pressable"));
15
+
16
+ var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
17
+
18
+ var _Text = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Text"));
19
+
20
+ var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
21
+
22
+ var _propTypes = _interopRequireDefault(require("prop-types"));
23
+
24
+ var _ThemeProvider = require("../ThemeProvider");
25
+
26
+ var _utils = require("../utils");
27
+
28
+ var _Backdrop = _interopRequireDefault(require("./Backdrop"));
29
+
30
+ var _getTooltipPosition = _interopRequireDefault(require("./getTooltipPosition"));
31
+
32
+ var _TooltipButton = _interopRequireDefault(require("../TooltipButton"));
33
+
34
+ var _useCopy = _interopRequireDefault(require("../utils/useCopy"));
35
+
36
+ var _dictionary = _interopRequireDefault(require("./dictionary"));
37
+
38
+ var _jsxRuntime = require("react/jsx-runtime");
39
+
40
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
41
+
42
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
43
+
44
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
45
+
46
+ const selectTooltipStyles = ({
47
+ backgroundColor,
48
+ paddingTop,
49
+ paddingBottom,
50
+ paddingLeft,
51
+ paddingRight,
52
+ borderRadius
53
+ }) => ({
54
+ backgroundColor,
55
+ paddingTop,
56
+ paddingBottom,
57
+ paddingLeft,
58
+ paddingRight,
59
+ borderRadius
60
+ });
61
+
62
+ const selectTooltipShadowStyles = ({
63
+ shadow,
64
+ borderRadius
65
+ }) => ({
66
+ borderRadius,
67
+ ...(0, _ThemeProvider.applyShadowToken)(shadow)
68
+ });
69
+
70
+ const selectTooltipPositionStyles = ({
71
+ top,
72
+ left,
73
+ width
74
+ }) => {
75
+ return {
76
+ top,
77
+ left,
78
+ width
79
+ };
80
+ };
81
+
82
+ const selectArrowStyles = ({
83
+ backgroundColor,
84
+ arrowWidth,
85
+ arrowBorderRadius,
86
+ shadow
87
+ }, {
88
+ position,
89
+ width: tooltipWidth,
90
+ height: tooltipHeight
91
+ }) => {
92
+ // the arrow width is actually a diagonal of the rectangle that we'll use as a tip
93
+ const rectangleSide = Math.sqrt(arrowWidth * arrowWidth / 2); // position the arrow at the side and center of the tooltip - this happens before rotation
94
+ // so we use the rectangle size as basis
95
+
96
+ const verticalOffset = -1 * rectangleSide / 2;
97
+ const horizontalOffset = rectangleSide / 2; // percentage-based absolute positioning doesn't act well on native, so we have to
98
+ // calculate the pixel values
99
+
100
+ const directionalStyles = {
101
+ above: {
102
+ bottom: verticalOffset,
103
+ left: tooltipWidth / 2 - horizontalOffset,
104
+ transform: [{
105
+ rotateZ: '45deg'
106
+ }]
107
+ },
108
+ below: {
109
+ top: verticalOffset,
110
+ left: tooltipWidth / 2 - horizontalOffset,
111
+ transform: [{
112
+ rotateZ: '-135deg'
113
+ }]
114
+ },
115
+ left: {
116
+ right: verticalOffset,
117
+ top: tooltipHeight / 2 - horizontalOffset,
118
+ transform: [{
119
+ rotateZ: '-45deg'
120
+ }]
121
+ },
122
+ right: {
123
+ left: verticalOffset,
124
+ top: tooltipHeight / 2 - horizontalOffset,
125
+ transform: [{
126
+ rotateZ: '135deg'
127
+ }]
128
+ }
129
+ };
130
+ return {
131
+ backgroundColor,
132
+ width: rectangleSide,
133
+ height: rectangleSide,
134
+ borderBottomRightRadius: arrowBorderRadius,
135
+ // this corner will be the arrow tip after rotation
136
+ ...(0, _ThemeProvider.applyShadowToken)(shadow),
137
+ ...directionalStyles[position]
138
+ };
139
+ };
140
+
141
+ const selectTextStyles = tokens => (0, _ThemeProvider.applyTextStyles)((0, _utils.selectTokens)('Typography', tokens));
142
+
143
+ const defaultControl = (pressableState, variant) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_TooltipButton.default, {
144
+ pressableState: pressableState,
145
+ variant: variant
146
+ });
147
+ /**
148
+ * Tooltip provides a descriptive and detailed explanation or instructions. It can be used next to an input label
149
+ * to help a user fill it in, or as a standalone component.
150
+ *
151
+ * By default the TooltipButton component will be used as a control for triggering the tooltip, but you may attach
152
+ * a tooltip to any other component. A render function can be used to adjust the control's styling on state changes (hover, focus, etc.).
153
+ *
154
+ * ### Positioning
155
+ * By default a Tooltip will be automatically positioned in a way that ensures it fits within the viewport.
156
+ * You may suggest a position with a prop - it will be used, unless the tooltip would end up outside the viewport.
157
+ *
158
+ * ### Usage criteria
159
+ * - You may use one when the information is useful only to a small percentage of users (ie. tech savvy people wouldn't need this info).
160
+ * - Tooltips may also be useful when vertical space is an issue.
161
+ */
162
+
163
+
164
+ const Tooltip = ({
165
+ children,
166
+ content,
167
+ position = 'auto',
168
+ copy = 'en',
169
+ tokens,
170
+ variant
171
+ }) => {
172
+ const [isOpen, setIsOpen] = (0, _react.useState)(false);
173
+ const controlRef = (0, _react.useRef)();
174
+ const [controlLayout, setControlLayout] = (0, _react.useState)(null);
175
+ const [tooltipDimensions, setTooltipDimensions] = (0, _react.useState)(null);
176
+ const [windowDimensions, setWindowDimensions] = (0, _react.useState)(_Dimensions.default.get('window'));
177
+ const [tooltipPosition, setTooltipPosition] = (0, _react.useState)(null);
178
+ const getCopy = (0, _useCopy.default)({
179
+ dictionary: _dictionary.default,
180
+ copy
181
+ });
182
+ const themeTokens = (0, _ThemeProvider.useThemeTokens)('Tooltip', tokens, variant);
183
+ const {
184
+ arrowWidth,
185
+ arrowOffset
186
+ } = themeTokens;
187
+ (0, _react.useEffect)(() => {
188
+ const subscription = _Dimensions.default.addEventListener('change', ({
189
+ window
190
+ }) => {
191
+ setWindowDimensions(window);
192
+ });
193
+
194
+ return () => subscription === null || subscription === void 0 ? void 0 : subscription.remove();
195
+ });
196
+
197
+ const toggleIsOpen = () => setIsOpen(!isOpen);
198
+
199
+ const close = () => setIsOpen(false);
200
+
201
+ const getPressableState = ({
202
+ pressed,
203
+ hovered,
204
+ focused
205
+ }) => ({
206
+ pressed,
207
+ hover: hovered,
208
+ focus: focused
209
+ });
210
+
211
+ const onTooltipLayout = ({
212
+ nativeEvent: {
213
+ layout: {
214
+ width,
215
+ height
216
+ }
217
+ }
218
+ }) => {
219
+ if (tooltipDimensions === null || tooltipDimensions.width !== width || tooltipDimensions.height !== height) {
220
+ setTooltipDimensions({
221
+ width: _Platform.default.select({
222
+ web: width + 0.3,
223
+ // avoids often unnecessary line breaks due to subpixel rendering of fonts
224
+ native: width
225
+ }),
226
+ height
227
+ });
228
+ }
229
+ };
230
+
231
+ (0, _react.useEffect)(() => {
232
+ if (isOpen) {
233
+ controlRef.current.measureInWindow((x, y, width, height) => {
234
+ setControlLayout({
235
+ x,
236
+ y,
237
+ width,
238
+ height
239
+ });
240
+ });
241
+ } else {
242
+ setControlLayout(null);
243
+ setTooltipDimensions(null);
244
+ setTooltipPosition(null);
245
+ }
246
+ }, [isOpen]);
247
+ (0, _react.useEffect)(() => {
248
+ setIsOpen(false);
249
+ }, [windowDimensions]);
250
+ (0, _react.useEffect)(() => {
251
+ if (tooltipPosition !== null && !(tooltipPosition !== null && tooltipPosition !== void 0 && tooltipPosition.isNormalized) || !isOpen || controlLayout === null || tooltipDimensions == null) {
252
+ return;
253
+ }
254
+
255
+ const updatedPosition = (0, _getTooltipPosition.default)(position, {
256
+ controlLayout,
257
+ tooltipDimensions,
258
+ windowDimensions,
259
+ arrowWidth,
260
+ arrowOffset
261
+ }); // avoid ending up in an infinite normalization loop
262
+
263
+ if (tooltipPosition !== null && tooltipPosition !== void 0 && tooltipPosition.isNormalized && updatedPosition.isNormalized) {
264
+ return;
265
+ }
266
+
267
+ setTooltipPosition(updatedPosition);
268
+ }, [isOpen, position, tooltipDimensions, controlLayout, windowDimensions, arrowWidth, arrowOffset, tooltipPosition]);
269
+ const control = children !== undefined ? children : defaultControl;
270
+ const pressableStyles = control === defaultControl ? _Platform.default.select({
271
+ web: {
272
+ outline: 'none'
273
+ }
274
+ }) : undefined;
275
+ const pressableHitSlop = control === defaultControl ? {
276
+ top: 10,
277
+ bottom: 10,
278
+ left: 10,
279
+ right: 10
280
+ } : undefined;
281
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_View.default, {
282
+ style: staticStyles.container,
283
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Pressable.default, {
284
+ onPress: toggleIsOpen,
285
+ ref: controlRef,
286
+ onBlur: close,
287
+ style: pressableStyles,
288
+ hitSlop: pressableHitSlop,
289
+ accessibilityLabel: getCopy('a11yText'),
290
+ accessibilityRole: "button",
291
+ children: typeof control === 'function' ? pressableState => control(getPressableState(pressableState), variant) : control
292
+ }), isOpen && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Backdrop.default, {
293
+ onPress: close,
294
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_View.default, {
295
+ style: [staticStyles.tooltip, selectTooltipShadowStyles(themeTokens), // applied separately so that it doesn't cover the arrow
296
+ tooltipPosition && selectTooltipPositionStyles(tooltipPosition), (tooltipPosition === null || (tooltipPosition === null || tooltipPosition === void 0 ? void 0 : tooltipPosition.isNormalized)) && staticStyles.tooltipHidden // visually hide the tooltip until we have a final measurement
297
+ ],
298
+ onLayout: onTooltipLayout,
299
+ accessibilityRole: "alert",
300
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
301
+ style: [staticStyles.arrow, tooltipPosition && selectArrowStyles(themeTokens, tooltipPosition)]
302
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
303
+ style: selectTooltipStyles(themeTokens),
304
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.default, {
305
+ style: selectTextStyles(themeTokens),
306
+ children: content
307
+ })
308
+ })]
309
+ })
310
+ })]
311
+ });
312
+ };
313
+
314
+ Tooltip.propTypes = {
315
+ /**
316
+ * Used to render the control (i.e. tooltip trigger). If a render function is used it will receive the
317
+ * pressable state and tooltip variant as an argument.
318
+ */
319
+ children: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
320
+
321
+ /**
322
+ * The message. Can be raw text or text components.
323
+ */
324
+ content: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
325
+
326
+ /**
327
+ * Select english or french copy for the accessible label.
328
+ */
329
+ copy: _propTypes.default.oneOf(['en', 'fr']),
330
+
331
+ /**
332
+ * Use to place the tooltip in a specific location (only if it fits within viewport).
333
+ */
334
+ position: _propTypes.default.oneOf(['auto', 'above', 'right', 'below', 'left']),
335
+ tokens: (0, _utils.getTokensPropType)('Tooltip'),
336
+ variant: _utils.variantProp.propType
337
+ };
338
+ var _default = Tooltip;
339
+ exports.default = _default;
340
+
341
+ const staticStyles = _StyleSheet.default.create({
342
+ container: {
343
+ alignItems: 'flex-start'
344
+ },
345
+ tooltip: {
346
+ position: 'absolute',
347
+ maxWidth: 240,
348
+ top: 0,
349
+ left: 0
350
+ },
351
+ tooltipHidden: {
352
+ opacity: 0
353
+ },
354
+ arrow: {
355
+ position: 'absolute'
356
+ }
357
+ });
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = {
8
+ en: {
9
+ a11yText: 'Reveal additional information.'
10
+ },
11
+ fr: {
12
+ a11yText: 'Afficher des renseignements supplémentaires.'
13
+ }
14
+ };
15
+ exports.default = _default;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ function normalizePosition(position) {
9
+ const {
10
+ left,
11
+ right,
12
+ bottom,
13
+ top,
14
+ width,
15
+ ...rest
16
+ } = position; // adjust the coordinates so that it fits within the window
17
+
18
+ const normalized = {
19
+ left: Math.max(0, left),
20
+ right: Math.max(0, right),
21
+ top: Math.max(0, top),
22
+ bottom // since it's ok the make the document grow downwards - no need to normalize here
23
+
24
+ };
25
+
26
+ const getAbsoluteDiff = (value1, value2) => Math.abs(Math.abs(value1) - Math.abs(value2)); // adjust the width by whatever has been subtracted from left or right
27
+
28
+
29
+ normalized.width = width - Math.abs(getAbsoluteDiff(left, normalized.left) - getAbsoluteDiff(right, normalized.right));
30
+
31
+ if (normalized.top !== top) {
32
+ normalized.bottom += normalized.top - top;
33
+ }
34
+
35
+ const isNormalized = normalized.right !== right || normalized.left !== left || normalized.top !== top;
36
+ return { ...normalized,
37
+ ...rest,
38
+ isNormalized
39
+ };
40
+ }
41
+
42
+ function invertPosition(position) {
43
+ switch (position) {
44
+ case 'above':
45
+ return 'below';
46
+
47
+ case 'below':
48
+ return 'above';
49
+
50
+ case 'left':
51
+ return 'right';
52
+
53
+ default:
54
+ return 'left';
55
+ }
56
+ }
57
+
58
+ function findRectByPosition(position, rectsArray) {
59
+ return rectsArray.find(({
60
+ position: rectPosition
61
+ }) => rectPosition === position);
62
+ }
63
+ /**
64
+ * Used for absolute positioning of the tooltip. Since the tooltip is always centered relatively
65
+ * to the control (button) and we have a limited set of positions, an easy and consistent way
66
+ * of positioning it is to check all of the possible positions and pick one that will be rendered
67
+ * within the window bounds. This way we can also rely on the tooltip being actually rendered
68
+ * before it is shown, which makes it account for the width being limiting in styles, custom font
69
+ * rendering, etc.
70
+ */
71
+
72
+
73
+ function getTooltipPosition(position, {
74
+ controlLayout,
75
+ tooltipDimensions,
76
+ windowDimensions,
77
+ arrowWidth = 0,
78
+ arrowOffset = 0
79
+ }) {
80
+ const {
81
+ width: controlWidth,
82
+ height: controlHeight,
83
+ x: controlX,
84
+ y: controlY
85
+ } = controlLayout;
86
+ const {
87
+ width: tooltipWidth,
88
+ height: tooltipHeight
89
+ } = tooltipDimensions;
90
+ const {
91
+ width: windowWidth,
92
+ height: windowHeight
93
+ } = windowDimensions;
94
+ const arrowSize = arrowWidth / 2 + arrowOffset;
95
+ const horizontalBounds = {
96
+ left: controlX + controlWidth / 2 - tooltipWidth / 2,
97
+ right: windowWidth - (controlX + controlWidth / 2 + tooltipWidth / 2)
98
+ };
99
+ const verticalBounds = {
100
+ top: controlY + controlHeight / 2 - tooltipHeight / 2,
101
+ bottom: windowHeight - (controlY + controlHeight / 2 + tooltipHeight / 2)
102
+ }; // calculate absolute coordinates for each of the potential positions (relative to window)
103
+
104
+ const boundingRects = [{
105
+ position: 'above',
106
+ ...horizontalBounds,
107
+ top: controlY - tooltipHeight - arrowSize,
108
+ bottom: windowHeight - (controlY - arrowSize)
109
+ }, {
110
+ position: 'right',
111
+ ...verticalBounds,
112
+ left: controlX + controlWidth + arrowSize,
113
+ right: windowWidth - (controlX + controlWidth + tooltipWidth + arrowSize)
114
+ }, {
115
+ position: 'below',
116
+ ...horizontalBounds,
117
+ top: controlY + controlHeight + arrowSize,
118
+ bottom: windowHeight - (controlY + controlHeight + tooltipHeight + arrowSize)
119
+ }, {
120
+ position: 'left',
121
+ ...verticalBounds,
122
+ left: controlX - tooltipWidth - arrowSize,
123
+ right: windowWidth - (controlX - arrowSize)
124
+ }].map(rect => {
125
+ // an absolute value representing how much of the tooltip is overflowing the window on each side
126
+ const windowOverflow = Math.abs(Math.min(rect.top, 0) - Math.min(rect.left, 0) - Math.min(rect.right, 0) - Math.min(rect.bottom, 0));
127
+ return { ...rect,
128
+ ...tooltipDimensions,
129
+ overflow: windowOverflow,
130
+ isNormalized: false
131
+ };
132
+ }); // the 'position' prop overrides the automatic positioning
133
+
134
+ if (position !== 'auto') {
135
+ let rect = findRectByPosition(position, boundingRects); // check if the suggested 'position' fits in window
136
+
137
+ if (rect.overflow === 0) {
138
+ return rect;
139
+ } // otherwise try the inverted position (e.g. left -> right)
140
+
141
+
142
+ rect = findRectByPosition(invertPosition(position), boundingRects);
143
+
144
+ if (rect.overflow === 0) {
145
+ return rect;
146
+ }
147
+ }
148
+
149
+ const inWindow = boundingRects.filter(({
150
+ overflow
151
+ }) => overflow === 0); // pick the first position that fits in window
152
+ // (these are sorted clockwise which makes them show where one would expect them to be)
153
+
154
+ if (inWindow.length > 0) {
155
+ return inWindow[0];
156
+ } // if all positions would end up being out of window bounds, let's pick the one that is
157
+ // the least overflowing and normalize its position to fit within window bounds
158
+
159
+
160
+ boundingRects.sort(({
161
+ overflow: overflowA
162
+ }, {
163
+ overflow: overflowB
164
+ }) => overflowA - overflowB);
165
+ const leastOverflowing = boundingRects[0]; // prefer 'below' over 'above', since we can always expand the document downwards,
166
+ // and 'above' might cause issues on small viewports with large tooltips
167
+
168
+ return normalizePosition(leastOverflowing.position === 'above' ? findRectByPosition('below', boundingRects) : leastOverflowing);
169
+ }
170
+
171
+ var _default = getTooltipPosition;
172
+ exports.default = _default;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _Tooltip = _interopRequireDefault(require("./Tooltip"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ var _default = _Tooltip.default;
13
+ exports.default = _default;