@telus-uds/components-base 0.0.2-prerelease.1 → 0.0.2-prerelease.10

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 (475) hide show
  1. package/.ultra.cache.json +1 -0
  2. package/CHANGELOG.md +120 -0
  3. package/README.md +4 -2
  4. package/__fixtures__/Accessible.js +33 -0
  5. package/__fixtures__/Accessible.native.js +32 -0
  6. package/__fixtures__/test-utils.js +25 -0
  7. package/__fixtures__/testTheme.js +1146 -145
  8. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  9. package/__tests__/Box/Box.test.jsx +81 -58
  10. package/__tests__/Button/ButtonBase.test.jsx +3 -32
  11. package/__tests__/Button/ButtonGroup.test.jsx +6 -7
  12. package/__tests__/Card/Card.test.jsx +63 -0
  13. package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
  14. package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
  15. package/__tests__/Divider/Divider.test.jsx +26 -5
  16. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
  17. package/__tests__/Feedback/Feedback.test.jsx +42 -0
  18. package/__tests__/FlexGrid/Col.test.jsx +5 -0
  19. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
  20. package/__tests__/Icon/Icon.test.jsx +3 -3
  21. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  22. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  23. package/__tests__/Link/LinkBase.test.jsx +0 -14
  24. package/__tests__/List/List.test.jsx +60 -0
  25. package/__tests__/Modal/Modal.test.jsx +47 -0
  26. package/__tests__/Notification/Notification.test.jsx +20 -0
  27. package/__tests__/Pagination/Pagination.test.jsx +160 -0
  28. package/__tests__/Progress/Progress.test.jsx +79 -0
  29. package/__tests__/Radio/Radio.test.jsx +87 -0
  30. package/__tests__/Radio/RadioGroup.test.jsx +220 -0
  31. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  32. package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
  33. package/__tests__/Search/Search.test.jsx +73 -0
  34. package/__tests__/Select/Select.test.jsx +94 -0
  35. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  36. package/__tests__/Spacer/Spacer.test.jsx +63 -0
  37. package/__tests__/StackView/StackView.test.jsx +216 -0
  38. package/__tests__/StackView/StackWrap.test.jsx +47 -0
  39. package/__tests__/StackView/getStackedContent.test.jsx +295 -0
  40. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  41. package/__tests__/Tabs/Tabs.test.jsx +40 -0
  42. package/__tests__/Tags/Tags.test.jsx +327 -0
  43. package/__tests__/TextInput/TextArea.test.jsx +35 -0
  44. package/__tests__/TextInput/TextInputBase.test.jsx +125 -0
  45. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
  46. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +14 -8
  47. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
  48. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
  49. package/__tests__/Tooltip/Tooltip.test.jsx +65 -0
  50. package/__tests__/Tooltip/getTooltipPosition.test.js +79 -0
  51. package/__tests__/utils/children.test.jsx +128 -0
  52. package/__tests__/utils/input.test.js +59 -1
  53. package/__tests__/utils/useCopy.test.js +42 -0
  54. package/__tests__/utils/useResponsiveProp.test.jsx +202 -0
  55. package/__tests__/utils/useSpacingScale.test.jsx +273 -0
  56. package/__tests__/utils/useUniqueId.test.js +31 -0
  57. package/babel.config.js +18 -1
  58. package/jest.config.js +19 -9
  59. package/lib/A11yInfoProvider/index.js +54 -26
  60. package/lib/A11yText/index.js +36 -15
  61. package/lib/ActivityIndicator/Spinner.js +78 -0
  62. package/lib/ActivityIndicator/Spinner.native.js +121 -87
  63. package/lib/ActivityIndicator/index.js +28 -12
  64. package/lib/ActivityIndicator/shared.js +27 -12
  65. package/lib/BaseProvider/index.js +34 -11
  66. package/lib/Box/Box.js +214 -87
  67. package/lib/Box/index.js +13 -2
  68. package/lib/Button/Button.js +37 -11
  69. package/lib/Button/ButtonBase.js +119 -110
  70. package/lib/Button/ButtonGroup.js +98 -101
  71. package/lib/Button/ButtonLink.js +40 -14
  72. package/lib/Button/index.js +31 -4
  73. package/lib/Button/propTypes.js +32 -9
  74. package/lib/Card/Card.js +98 -0
  75. package/lib/Card/CardBase.js +78 -0
  76. package/lib/Card/PressableCardBase.js +137 -0
  77. package/lib/Card/index.js +40 -0
  78. package/lib/Checkbox/Checkbox.js +344 -0
  79. package/lib/Checkbox/CheckboxGroup.js +231 -0
  80. package/lib/Checkbox/CheckboxInput.js +74 -0
  81. package/lib/Checkbox/CheckboxInput.native.js +14 -0
  82. package/lib/Checkbox/index.js +21 -0
  83. package/lib/Divider/Divider.js +80 -18
  84. package/lib/Divider/index.js +13 -2
  85. package/lib/ExpandCollapse/Accordion.js +19 -8
  86. package/lib/ExpandCollapse/Control.js +50 -29
  87. package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
  88. package/lib/ExpandCollapse/Panel.js +77 -41
  89. package/lib/ExpandCollapse/index.js +25 -7
  90. package/lib/Feedback/Feedback.js +161 -0
  91. package/lib/Feedback/index.js +13 -0
  92. package/lib/Fieldset/Fieldset.js +160 -0
  93. package/lib/Fieldset/FieldsetContainer.js +41 -0
  94. package/lib/Fieldset/FieldsetContainer.native.js +33 -0
  95. package/lib/Fieldset/Legend.js +33 -0
  96. package/lib/Fieldset/Legend.native.js +43 -0
  97. package/lib/Fieldset/cssReset.js +21 -0
  98. package/lib/Fieldset/index.js +13 -0
  99. package/lib/FlexGrid/Col/Col.js +66 -39
  100. package/lib/FlexGrid/Col/index.js +13 -2
  101. package/lib/FlexGrid/FlexGrid.js +70 -47
  102. package/lib/FlexGrid/Row/Row.js +47 -28
  103. package/lib/FlexGrid/Row/index.js +13 -2
  104. package/lib/FlexGrid/helpers/index.js +9 -1
  105. package/lib/FlexGrid/index.js +13 -2
  106. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  107. package/lib/HorizontalScroll/HorizontalScroll.js +199 -0
  108. package/lib/HorizontalScroll/HorizontalScrollButton.js +121 -0
  109. package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
  110. package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
  111. package/lib/HorizontalScroll/dictionary.js +18 -0
  112. package/lib/HorizontalScroll/index.js +35 -0
  113. package/lib/HorizontalScroll/itemPositions.js +128 -0
  114. package/lib/Icon/Icon.js +52 -47
  115. package/lib/Icon/IconText.js +100 -0
  116. package/lib/Icon/index.js +31 -3
  117. package/lib/IconButton/IconButton.js +135 -0
  118. package/lib/IconButton/index.js +13 -0
  119. package/lib/InputLabel/InputLabel.js +145 -0
  120. package/lib/InputLabel/LabelContent.js +39 -0
  121. package/lib/InputLabel/LabelContent.native.js +16 -0
  122. package/lib/InputLabel/index.js +13 -0
  123. package/lib/InputSupports/InputSupports.js +104 -0
  124. package/lib/InputSupports/index.js +13 -0
  125. package/lib/InputSupports/propTypes.js +66 -0
  126. package/lib/InputSupports/useInputSupports.js +41 -0
  127. package/lib/Link/ChevronLink.js +56 -16
  128. package/lib/Link/InlinePressable.js +50 -0
  129. package/lib/Link/InlinePressable.native.js +101 -0
  130. package/lib/Link/Link.js +29 -14
  131. package/lib/Link/LinkBase.js +120 -147
  132. package/lib/Link/TextButton.js +46 -18
  133. package/lib/Link/index.js +39 -4
  134. package/lib/List/List.js +80 -0
  135. package/lib/List/ListItem.js +239 -0
  136. package/lib/List/index.js +13 -0
  137. package/lib/Modal/Modal.js +226 -0
  138. package/lib/Modal/dictionary.js +16 -0
  139. package/lib/Modal/index.js +13 -0
  140. package/lib/Notification/Notification.js +215 -0
  141. package/lib/Notification/dictionary.js +15 -0
  142. package/lib/Notification/index.js +13 -0
  143. package/lib/Pagination/PageButton.js +89 -0
  144. package/lib/Pagination/Pagination.js +148 -0
  145. package/lib/Pagination/SideButton.js +124 -0
  146. package/lib/Pagination/dictionary.js +25 -0
  147. package/lib/Pagination/index.js +13 -0
  148. package/lib/Pagination/usePagination.js +80 -0
  149. package/lib/Progress/Progress.js +99 -0
  150. package/lib/Progress/ProgressBar.js +146 -0
  151. package/lib/Progress/ProgressBarBackground.js +57 -0
  152. package/lib/Progress/index.js +16 -0
  153. package/lib/Radio/Radio.js +292 -0
  154. package/lib/Radio/RadioButton.js +141 -0
  155. package/lib/Radio/RadioGroup.js +234 -0
  156. package/lib/Radio/RadioInput.js +76 -0
  157. package/lib/Radio/RadioInput.native.js +14 -0
  158. package/lib/Radio/index.js +21 -0
  159. package/lib/RadioCard/RadioCard.js +243 -0
  160. package/lib/RadioCard/RadioCardGroup.js +251 -0
  161. package/lib/RadioCard/index.js +21 -0
  162. package/lib/Search/Search.js +250 -0
  163. package/lib/Search/dictionary.js +19 -0
  164. package/lib/Search/index.js +13 -0
  165. package/lib/Select/Group.js +33 -0
  166. package/lib/Select/Group.native.js +25 -0
  167. package/lib/Select/Item.js +29 -0
  168. package/lib/Select/Item.native.js +19 -0
  169. package/lib/Select/Picker.js +79 -0
  170. package/lib/Select/Picker.native.js +127 -0
  171. package/lib/Select/Select.js +341 -0
  172. package/lib/Select/index.js +19 -0
  173. package/lib/SideNav/Item.js +54 -35
  174. package/lib/SideNav/ItemContent.js +41 -15
  175. package/lib/SideNav/ItemsGroup.js +53 -34
  176. package/lib/SideNav/SideNav.js +94 -70
  177. package/lib/SideNav/index.js +15 -1
  178. package/lib/Skeleton/Skeleton.js +137 -0
  179. package/lib/Skeleton/index.js +13 -0
  180. package/lib/Skeleton/skeleton.constant.js +12 -0
  181. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  182. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  183. package/lib/Spacer/Spacer.js +117 -0
  184. package/lib/Spacer/index.js +13 -0
  185. package/lib/StackView/StackView.js +130 -0
  186. package/lib/StackView/StackWrap.js +55 -0
  187. package/lib/StackView/StackWrap.native.js +14 -0
  188. package/lib/StackView/StackWrapBox.js +120 -0
  189. package/lib/StackView/StackWrapGap.js +71 -0
  190. package/lib/StackView/common.js +47 -0
  191. package/lib/StackView/getStackedContent.js +141 -0
  192. package/lib/StackView/index.js +29 -0
  193. package/lib/StepTracker/Step.js +245 -0
  194. package/lib/StepTracker/StepTracker.js +197 -0
  195. package/lib/StepTracker/dictionary.js +17 -0
  196. package/lib/StepTracker/index.js +13 -0
  197. package/lib/Tabs/Tabs.js +118 -0
  198. package/lib/Tabs/TabsItem.js +237 -0
  199. package/lib/Tabs/index.js +13 -0
  200. package/lib/Tags/Tags.js +250 -0
  201. package/lib/Tags/index.js +13 -0
  202. package/lib/TextInput/TextArea.js +109 -0
  203. package/lib/TextInput/TextInput.js +75 -0
  204. package/lib/TextInput/TextInputBase.js +255 -0
  205. package/lib/TextInput/index.js +23 -0
  206. package/lib/TextInput/propTypes.js +42 -0
  207. package/lib/ThemeProvider/ThemeProvider.js +46 -18
  208. package/lib/ThemeProvider/index.js +61 -6
  209. package/lib/ThemeProvider/useSetTheme.js +19 -5
  210. package/lib/ThemeProvider/useTheme.js +13 -4
  211. package/lib/ThemeProvider/useThemeTokens.js +111 -16
  212. package/lib/ThemeProvider/utils/index.js +31 -2
  213. package/lib/ThemeProvider/utils/styles.js +52 -16
  214. package/lib/ThemeProvider/utils/theme-tokens.js +154 -19
  215. package/lib/ToggleSwitch/ToggleSwitch.js +87 -93
  216. package/lib/ToggleSwitch/index.js +13 -2
  217. package/lib/Tooltip/Backdrop.js +56 -0
  218. package/lib/Tooltip/Backdrop.native.js +59 -0
  219. package/lib/Tooltip/Tooltip.js +357 -0
  220. package/lib/Tooltip/dictionary.js +15 -0
  221. package/lib/Tooltip/getTooltipPosition.js +172 -0
  222. package/lib/Tooltip/index.js +13 -0
  223. package/lib/TooltipButton/TooltipButton.js +83 -0
  224. package/lib/TooltipButton/index.js +13 -0
  225. package/lib/Typography/Typography.js +58 -49
  226. package/lib/Typography/index.js +13 -2
  227. package/lib/ViewportProvider/ViewportProvider.js +46 -0
  228. package/lib/ViewportProvider/index.js +22 -38
  229. package/lib/ViewportProvider/useViewport.js +15 -0
  230. package/lib/ViewportProvider/useViewportListener.js +57 -0
  231. package/lib/index.js +539 -17
  232. package/lib/utils/a11y/index.js +18 -0
  233. package/lib/utils/a11y/textSize.js +49 -0
  234. package/lib/utils/animation/index.js +15 -2
  235. package/lib/utils/animation/useVerticalExpandAnimation.js +28 -11
  236. package/lib/utils/children.js +134 -0
  237. package/lib/utils/index.js +163 -3
  238. package/lib/utils/info/index.js +19 -0
  239. package/lib/utils/info/platform/index.js +23 -0
  240. package/lib/utils/info/platform/platform.android.js +8 -0
  241. package/lib/utils/info/platform/platform.ios.js +8 -0
  242. package/lib/utils/info/platform/platform.js +8 -0
  243. package/lib/utils/info/platform/platform.native.js +11 -0
  244. package/lib/utils/info/versions.js +16 -0
  245. package/lib/utils/input.js +62 -38
  246. package/lib/utils/pressability.js +120 -0
  247. package/lib/utils/propTypes.js +360 -109
  248. package/lib/utils/useCopy.js +51 -0
  249. package/lib/utils/useHash.js +52 -0
  250. package/lib/utils/useHash.native.js +15 -0
  251. package/lib/utils/useResponsiveProp.js +59 -0
  252. package/lib/utils/useSpacingScale.js +135 -0
  253. package/lib/utils/useUniqueId.js +21 -0
  254. package/package.json +15 -14
  255. package/release-context.json +4 -4
  256. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
  257. package/src/Box/Box.jsx +180 -78
  258. package/src/Button/Button.jsx +9 -5
  259. package/src/Button/ButtonBase.jsx +74 -87
  260. package/src/Button/ButtonGroup.jsx +26 -43
  261. package/src/Button/ButtonLink.jsx +14 -4
  262. package/src/Button/propTypes.js +12 -2
  263. package/src/Card/Card.jsx +75 -0
  264. package/src/Card/CardBase.jsx +57 -0
  265. package/src/Card/PressableCardBase.jsx +112 -0
  266. package/src/Card/index.js +6 -0
  267. package/src/Checkbox/Checkbox.jsx +274 -0
  268. package/src/Checkbox/CheckboxGroup.jsx +196 -0
  269. package/src/Checkbox/CheckboxInput.jsx +55 -0
  270. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  271. package/src/Checkbox/index.js +5 -0
  272. package/src/Divider/Divider.jsx +38 -3
  273. package/src/ExpandCollapse/Control.jsx +3 -4
  274. package/src/ExpandCollapse/Panel.jsx +3 -3
  275. package/src/Feedback/Feedback.jsx +108 -0
  276. package/src/Feedback/index.js +3 -0
  277. package/src/Fieldset/Fieldset.jsx +129 -0
  278. package/src/Fieldset/FieldsetContainer.jsx +22 -0
  279. package/src/Fieldset/FieldsetContainer.native.jsx +16 -0
  280. package/src/Fieldset/Legend.jsx +16 -0
  281. package/src/Fieldset/Legend.native.jsx +22 -0
  282. package/src/Fieldset/cssReset.js +14 -0
  283. package/src/Fieldset/index.js +3 -0
  284. package/src/FlexGrid/Col/Col.jsx +4 -2
  285. package/src/HorizontalScroll/HorizontalScroll.jsx +165 -0
  286. package/src/HorizontalScroll/HorizontalScrollButton.jsx +108 -0
  287. package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
  288. package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
  289. package/src/HorizontalScroll/dictionary.js +11 -0
  290. package/src/HorizontalScroll/index.js +17 -0
  291. package/src/HorizontalScroll/itemPositions.js +101 -0
  292. package/src/Icon/Icon.jsx +23 -27
  293. package/src/Icon/IconText.jsx +63 -0
  294. package/src/Icon/index.js +3 -2
  295. package/src/IconButton/IconButton.jsx +107 -0
  296. package/src/IconButton/index.js +3 -0
  297. package/src/InputLabel/InputLabel.jsx +124 -0
  298. package/src/InputLabel/LabelContent.jsx +23 -0
  299. package/src/InputLabel/LabelContent.native.jsx +6 -0
  300. package/src/InputLabel/index.js +3 -0
  301. package/src/InputSupports/InputSupports.jsx +75 -0
  302. package/src/InputSupports/index.js +3 -0
  303. package/src/InputSupports/propTypes.js +44 -0
  304. package/src/InputSupports/useInputSupports.js +30 -0
  305. package/src/Link/ChevronLink.jsx +28 -7
  306. package/src/Link/InlinePressable.jsx +37 -0
  307. package/src/Link/InlinePressable.native.jsx +73 -0
  308. package/src/Link/Link.jsx +17 -13
  309. package/src/Link/LinkBase.jsx +71 -146
  310. package/src/Link/TextButton.jsx +25 -11
  311. package/src/Link/index.js +2 -1
  312. package/src/List/List.jsx +47 -0
  313. package/src/List/ListItem.jsx +184 -0
  314. package/src/List/index.js +3 -0
  315. package/src/Modal/Modal.jsx +185 -0
  316. package/src/Modal/dictionary.js +9 -0
  317. package/src/Modal/index.js +3 -0
  318. package/src/Notification/Notification.jsx +161 -0
  319. package/src/Notification/dictionary.js +8 -0
  320. package/src/Notification/index.js +3 -0
  321. package/src/Pagination/PageButton.jsx +70 -0
  322. package/src/Pagination/Pagination.jsx +135 -0
  323. package/src/Pagination/SideButton.jsx +82 -0
  324. package/src/Pagination/dictionary.js +18 -0
  325. package/src/Pagination/index.js +3 -0
  326. package/src/Pagination/usePagination.js +69 -0
  327. package/src/Progress/Progress.jsx +77 -0
  328. package/src/Progress/ProgressBar.jsx +110 -0
  329. package/src/Progress/ProgressBarBackground.jsx +34 -0
  330. package/src/Progress/index.js +6 -0
  331. package/src/Radio/Radio.jsx +233 -0
  332. package/src/Radio/RadioButton.jsx +131 -0
  333. package/src/Radio/RadioGroup.jsx +199 -0
  334. package/src/Radio/RadioInput.jsx +57 -0
  335. package/src/Radio/RadioInput.native.jsx +6 -0
  336. package/src/Radio/index.js +5 -0
  337. package/src/RadioCard/RadioCard.jsx +191 -0
  338. package/src/RadioCard/RadioCardGroup.jsx +211 -0
  339. package/src/RadioCard/index.js +5 -0
  340. package/src/Search/Search.jsx +215 -0
  341. package/src/Search/dictionary.js +12 -0
  342. package/src/Search/index.js +3 -0
  343. package/src/Select/Group.jsx +15 -0
  344. package/src/Select/Group.native.jsx +14 -0
  345. package/src/Select/Item.jsx +11 -0
  346. package/src/Select/Item.native.jsx +10 -0
  347. package/src/Select/Picker.jsx +67 -0
  348. package/src/Select/Picker.native.jsx +108 -0
  349. package/src/Select/Select.jsx +286 -0
  350. package/src/Select/index.js +8 -0
  351. package/src/SideNav/Item.jsx +5 -5
  352. package/src/SideNav/ItemsGroup.jsx +11 -13
  353. package/src/SideNav/SideNav.jsx +2 -1
  354. package/src/Skeleton/Skeleton.jsx +98 -0
  355. package/src/Skeleton/index.js +3 -0
  356. package/src/Skeleton/skeleton.constant.js +3 -0
  357. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  358. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  359. package/src/Spacer/Spacer.jsx +91 -0
  360. package/src/Spacer/index.js +3 -0
  361. package/src/StackView/StackView.jsx +113 -0
  362. package/src/StackView/StackWrap.jsx +41 -0
  363. package/src/StackView/StackWrap.native.jsx +4 -0
  364. package/src/StackView/StackWrapBox.jsx +102 -0
  365. package/src/StackView/StackWrapGap.jsx +49 -0
  366. package/src/StackView/common.jsx +29 -0
  367. package/src/StackView/getStackedContent.jsx +112 -0
  368. package/src/StackView/index.js +6 -0
  369. package/src/StepTracker/Step.jsx +202 -0
  370. package/src/StepTracker/StepTracker.jsx +163 -0
  371. package/src/StepTracker/dictionary.js +10 -0
  372. package/src/StepTracker/index.js +3 -0
  373. package/src/Tabs/Tabs.jsx +92 -0
  374. package/src/Tabs/TabsItem.jsx +205 -0
  375. package/src/Tabs/index.js +3 -0
  376. package/src/Tags/Tags.jsx +207 -0
  377. package/src/Tags/index.js +3 -0
  378. package/src/TextInput/TextArea.jsx +78 -0
  379. package/src/TextInput/TextInput.jsx +52 -0
  380. package/src/TextInput/TextInputBase.jsx +211 -0
  381. package/src/TextInput/index.js +4 -0
  382. package/src/TextInput/propTypes.js +29 -0
  383. package/src/ThemeProvider/ThemeProvider.jsx +11 -7
  384. package/src/ThemeProvider/useSetTheme.js +4 -0
  385. package/src/ThemeProvider/useThemeTokens.js +85 -7
  386. package/src/ThemeProvider/utils/styles.js +18 -5
  387. package/src/ThemeProvider/utils/theme-tokens.js +106 -8
  388. package/src/ToggleSwitch/ToggleSwitch.jsx +25 -46
  389. package/src/Tooltip/Backdrop.jsx +60 -0
  390. package/src/Tooltip/Backdrop.native.jsx +33 -0
  391. package/src/Tooltip/Tooltip.jsx +294 -0
  392. package/src/Tooltip/dictionary.js +8 -0
  393. package/src/Tooltip/getTooltipPosition.js +161 -0
  394. package/src/Tooltip/index.js +3 -0
  395. package/src/TooltipButton/TooltipButton.jsx +49 -0
  396. package/src/TooltipButton/index.js +3 -0
  397. package/src/Typography/Typography.jsx +10 -24
  398. package/src/ViewportProvider/ViewportProvider.jsx +21 -0
  399. package/src/ViewportProvider/index.jsx +2 -41
  400. package/src/ViewportProvider/useViewport.js +5 -0
  401. package/src/ViewportProvider/useViewportListener.js +43 -0
  402. package/src/index.js +38 -1
  403. package/src/utils/a11y/index.js +1 -0
  404. package/src/utils/a11y/textSize.js +30 -0
  405. package/src/utils/children.jsx +119 -0
  406. package/src/utils/index.js +11 -0
  407. package/src/utils/info/index.js +8 -0
  408. package/src/utils/info/platform/index.js +11 -0
  409. package/src/utils/info/platform/platform.android.js +1 -0
  410. package/src/utils/info/platform/platform.ios.js +1 -0
  411. package/src/utils/info/platform/platform.js +1 -0
  412. package/src/utils/info/platform/platform.native.js +4 -0
  413. package/src/utils/info/versions.js +6 -0
  414. package/src/utils/input.js +38 -26
  415. package/src/utils/pressability.js +96 -0
  416. package/src/utils/propTypes.js +298 -66
  417. package/src/utils/useCopy.js +39 -0
  418. package/src/utils/useHash.js +39 -0
  419. package/src/utils/useHash.native.js +6 -0
  420. package/src/utils/useResponsiveProp.js +50 -0
  421. package/src/utils/useSpacingScale.js +108 -0
  422. package/src/utils/useUniqueId.js +14 -0
  423. package/stories/A11yText/A11yText.stories.jsx +15 -13
  424. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +11 -2
  425. package/stories/Box/Box.stories.jsx +46 -17
  426. package/stories/Button/Button.stories.jsx +21 -20
  427. package/stories/Button/ButtonGroup.stories.jsx +2 -1
  428. package/stories/Button/ButtonLink.stories.jsx +6 -4
  429. package/stories/Card/Card.stories.jsx +62 -0
  430. package/stories/Checkbox/Checkbox.stories.jsx +94 -0
  431. package/stories/Divider/Divider.stories.jsx +26 -2
  432. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +74 -79
  433. package/stories/Feedback/Feedback.stories.jsx +96 -0
  434. package/stories/FlexGrid/01 FlexGrid.stories.jsx +20 -7
  435. package/stories/Icon/Icon.stories.jsx +35 -7
  436. package/stories/IconButton/IconButton.stories.jsx +50 -0
  437. package/stories/InputLabel/InputLabel.stories.jsx +42 -0
  438. package/stories/Link/ChevronLink.stories.jsx +20 -4
  439. package/stories/Link/Link.stories.jsx +51 -20
  440. package/stories/Link/TextButton.stories.jsx +24 -3
  441. package/stories/List/List.stories.jsx +117 -0
  442. package/stories/Modal/Modal.stories.jsx +29 -0
  443. package/stories/Notification/Notification.stories.jsx +82 -0
  444. package/stories/Pagination/Pagination.stories.jsx +64 -0
  445. package/stories/Progress/Progress.stories.jsx +93 -0
  446. package/stories/Radio/Radio.stories.jsx +100 -0
  447. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  448. package/stories/Search/Search.stories.jsx +16 -0
  449. package/stories/Select/Select.stories.jsx +55 -0
  450. package/stories/SideNav/SideNav.stories.jsx +17 -2
  451. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  452. package/stories/Spacer/Spacer.stories.jsx +38 -0
  453. package/stories/StackView/StackView.stories.jsx +75 -0
  454. package/stories/StackView/StackWrap.stories.jsx +64 -0
  455. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  456. package/stories/Tabs/Tabs.stories.jsx +97 -0
  457. package/stories/Tags/Tags.stories.jsx +69 -0
  458. package/stories/TextInput/TextArea.stories.jsx +100 -0
  459. package/stories/TextInput/TextInput.stories.jsx +103 -0
  460. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +16 -3
  461. package/stories/Tooltip/Tooltip.stories.jsx +81 -0
  462. package/stories/TooltipButton/TooltipButton.stories.jsx +11 -0
  463. package/stories/Typography/Typography.stories.jsx +12 -3
  464. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  465. package/stories/supports.jsx +148 -14
  466. package/__fixtures__/accessible.icon.svg +0 -6
  467. package/docs/Contributing.stories.mdx +0 -9
  468. package/docs/Fonts.stories.mdx +0 -104
  469. package/docs/Icons.stories.mdx +0 -144
  470. package/docs/Introduction.stories.mdx +0 -9
  471. package/lib/ActivityIndicator/Spinner.web.js +0 -57
  472. package/lib/config/svgr-icons-web.js +0 -9
  473. package/lib/config/svgr-icons.js +0 -52
  474. package/src/config/svgr-icons-web.js +0 -11
  475. package/src/config/svgr-icons.js +0 -46
@@ -41,17 +41,38 @@ describe('Divider', () => {
41
41
  expect(divider).not.toHaveStyle(verticalStyles)
42
42
  })
43
43
 
44
- it('renders a vertical line when vertical prop is passed', () => {
44
+ it('renders space above and below a horizontal line if space prop is passed', () => {
45
+ const expectedSize = 8 // from testTheme.js
46
+
45
47
  const { getByTestId } = render(
46
48
  <Theme>
47
49
  <Text>Before</Text>
48
- <Divider vertical testID={testID} />
50
+ <Divider testID={testID} space={2} />
49
51
  <Text>After</Text>
50
52
  </Theme>
51
53
  )
52
- const divider = getByTestId(testID)
53
- expect(divider).toHaveStyle(verticalStyles)
54
- expect(divider).not.toHaveStyle(horizontalStyles)
54
+ const before = getByTestId(`${testID}-Spacer-before`)
55
+ expect(before).toHaveStyle({ height: expectedSize })
56
+
57
+ const after = getByTestId(`${testID}-Spacer-after`)
58
+ expect(after).toHaveStyle({ height: expectedSize })
59
+ })
60
+
61
+ it('renders space left and right of a vertical line if space prop is passed', () => {
62
+ const expectedSize = 8 // from testTheme.js
63
+
64
+ const { getByTestId } = render(
65
+ <Theme>
66
+ <Text>Before</Text>
67
+ <Divider vertical testID={testID} space={2} />
68
+ <Text>After</Text>
69
+ </Theme>
70
+ )
71
+ const before = getByTestId(`${testID}-Spacer-before`)
72
+ expect(before).toHaveStyle({ width: expectedSize })
73
+
74
+ const after = getByTestId(`${testID}-Spacer-after`)
75
+ expect(after).toHaveStyle({ width: expectedSize })
55
76
  })
56
77
 
57
78
  it('renders the correct styles for a given variant', () => {
@@ -64,10 +64,10 @@ describe('ExpandCollapse', () => {
64
64
  expect(onPress).toHaveBeenCalledTimes(0)
65
65
  expect(queryAllByA11yState({ expanded: true }).length).toBe(0)
66
66
 
67
- await fireEvent.press(getByText('First control'))
67
+ await fireEvent(getByText('First control'), 'press', { nativeEvent: 'example' })
68
68
  expect(queryAllByA11yState({ expanded: true }).length).toBe(1)
69
69
  expect(onPress).toHaveBeenCalledTimes(1)
70
- expect(onPress).toHaveBeenLastCalledWith(panelId)
70
+ expect(onPress).toHaveBeenLastCalledWith(panelId, { nativeEvent: 'example' })
71
71
  })
72
72
  })
73
73
 
@@ -0,0 +1,42 @@
1
+ import React from 'react'
2
+ import { Text } from 'react-native'
3
+ import { render } from '@testing-library/react-native'
4
+
5
+ import Feedback from '../../src/Feedback'
6
+ import Theme from '../../__fixtures__/Theme'
7
+
8
+ describe('Feedback', () => {
9
+ it('renders title', () => {
10
+ const { queryByText } = render(<Feedback title="Test title" />, { wrapper: Theme })
11
+
12
+ expect(queryByText('Test title')).toBeTruthy()
13
+ })
14
+
15
+ it('renders content when passed a string', () => {
16
+ const { queryByText } = render(<Feedback>Test content</Feedback>, { wrapper: Theme })
17
+
18
+ expect(queryByText('Test content')).toBeTruthy()
19
+ })
20
+
21
+ it('renders content when passed a React element', () => {
22
+ const { queryByText } = render(
23
+ <Feedback>
24
+ <Text>Test content</Text>
25
+ </Feedback>,
26
+ { wrapper: Theme }
27
+ )
28
+
29
+ expect(queryByText('Test content')).toBeTruthy()
30
+ })
31
+
32
+ it("renders content with theme's style prop when passed a function", () => {
33
+ const { getByText } = render(
34
+ <Feedback>{({ textStyles }) => <Text style={textStyles}>Test content</Text>}</Feedback>,
35
+ {
36
+ wrapper: Theme
37
+ }
38
+ )
39
+
40
+ expect(getByText('Test content')).toHaveStyle({ fontSize: 14 })
41
+ })
42
+ })
@@ -48,6 +48,7 @@ describe('FlexGrid.Col offsets', () => {
48
48
  )
49
49
  const expectIfOffsetExpected = (propViewport) => {
50
50
  const target = getByText(`${propViewport}Offset`).parent
51
+ // eslint-disable-next-line jest/valid-expect
51
52
  return expected[propViewport] ? expect(target) : expect(target).not
52
53
  }
53
54
  expectIfOffsetExpected('xs').toHaveStyle(getOffsetStyle('xs'))
@@ -103,6 +104,7 @@ describe('FlexGrid.Col sizes', () => {
103
104
 
104
105
  const expectIfSizeExpected = (propViewport) => {
105
106
  const target = getByText(propViewport).parent
107
+ // eslint-disable-next-line jest/valid-expect
106
108
  return expected[propViewport] ? expect(target) : expect(target).not
107
109
  }
108
110
  expectIfSizeExpected('xs').toHaveStyle(getNumericSizeStyle('xs'))
@@ -152,6 +154,7 @@ describe('FlexGrid.Col sizes', () => {
152
154
 
153
155
  const expectIfSizeExpected = (text) => {
154
156
  const target = getByText(text).parent
157
+ // eslint-disable-next-line jest/valid-expect
155
158
  return expected[text] ? expect(target) : expect(target).not
156
159
  }
157
160
  expectIfSizeExpected('xs-md').toHaveStyle(getNumericSizeStyle('xs'))
@@ -196,6 +199,7 @@ describe('FlexGrid.Col sizes', () => {
196
199
  )
197
200
  const expectIfHidingExpected = (propViewport) => {
198
201
  const target = getByText(propViewport).parent
202
+ // eslint-disable-next-line jest/valid-expect
199
203
  return expected[propViewport] ? expect(target) : expect(target).not
200
204
  }
201
205
  expectIfHidingExpected('xs').toHaveStyle(hidingStyle)
@@ -244,6 +248,7 @@ describe('FlexGrid.Col horizontalAlign', () => {
244
248
 
245
249
  const expectIfAlignExpected = (propViewport) => {
246
250
  const target = getByText(propViewport).parent
251
+ // eslint-disable-next-line jest/valid-expect
247
252
  return expected[propViewport] ? expect(target) : expect(target).not
248
253
  }
249
254
  expectIfAlignExpected('xs').toHaveStyle(alignRightStyle)
@@ -0,0 +1,164 @@
1
+ import React, { useState } from 'react'
2
+ import { Pressable, Text, View } from 'react-native'
3
+ import { fireEvent, render } from '@testing-library/react-native'
4
+ import {
5
+ getItemPositionLayoutHandler,
6
+ getItemPositionScrollTarget,
7
+ useItemPositions
8
+ } from '../../src/HorizontalScroll/itemPositions'
9
+
10
+ // ScrollViewRef.scrollTo doesn't work in Jest - unit-test the utilities instead
11
+ describe('HorizontalScroll', () => {
12
+ describe('getItemPositionScrollTarget', () => {
13
+ const positionsWithoutSpacing = {
14
+ 0: { start: 0, end: 100 },
15
+ 1: { start: 100, end: 200 },
16
+ 2: { start: 200, end: 300 }
17
+ }
18
+ const positions = {
19
+ 0: { start: 0, end: 50 },
20
+ 1: { start: 100, end: 150 },
21
+ 2: { start: 200, end: 250 }
22
+ }
23
+ it('scrolls to the start of an item rather than chopping it', () => {
24
+ const x = getItemPositionScrollTarget(150, 300, positionsWithoutSpacing)
25
+ expect(x).toBe(100)
26
+ })
27
+ it('offsets the position by a button clearance', () => {
28
+ const x = getItemPositionScrollTarget(150, 300, positionsWithoutSpacing, 20)
29
+ expect(x).toBe(80)
30
+ })
31
+ it('scrolls exactly if landing on a gap', () => {
32
+ const x = getItemPositionScrollTarget(170, 300, positions)
33
+ expect(x).toBe(170)
34
+ })
35
+ it('applies button clearance if landing on a gap', () => {
36
+ const x = getItemPositionScrollTarget(170, 300, positions, 40)
37
+ expect(x).toBe(130)
38
+ })
39
+ it('does not apply button clearance on reaching the end', () => {
40
+ const x = getItemPositionScrollTarget(300, 300, positions, 40)
41
+ expect(x).toBe(300)
42
+ })
43
+ it('does not exceed the maximum', () => {
44
+ const x = getItemPositionScrollTarget(320, 300, positions, 40)
45
+ expect(x).toBe(300)
46
+ })
47
+ it('does not go below 0', () => {
48
+ const x = getItemPositionScrollTarget(-420, 300, positions, 40)
49
+ expect(x).toBe(0)
50
+ })
51
+ })
52
+
53
+ // onLayout also doesn't work naturally in jest
54
+ describe('getItemPositionLayoutHandler', () => {
55
+ // Test component using useItemPositions with getItemPositionLayoutHandler
56
+ // that can be rerendered manually and that outputs itemPositions value
57
+ const MockComponent = () => {
58
+ const [num, setNum] = useState()
59
+ const [{ positions }] = useItemPositions()
60
+ return (
61
+ <View>
62
+ <View testID="onlayout[0]" onLayout={getItemPositionLayoutHandler(positions, 0)} />
63
+ <View testID="onlayout[1]" onLayout={getItemPositionLayoutHandler(positions, 1)} />
64
+ <Text testID="output">{JSON.stringify(positions)}</Text>
65
+ <Pressable testID="rerender" onPress={() => setNum(num + 1)}>
66
+ <Text>{num}</Text>
67
+ </Pressable>
68
+ </View>
69
+ )
70
+ }
71
+ it('gets width and x positions from onLayout events', async () => {
72
+ const { getByTestId } = render(<MockComponent />)
73
+
74
+ // onLayout doesn't work in jest but can be called directly as an event, but we
75
+ // have to pass the event object. Can't test that it gets them correctly from style
76
+ await fireEvent(getByTestId('onlayout[0]'), 'layout', {
77
+ nativeEvent: {
78
+ layout: {
79
+ width: 200,
80
+ x: 0
81
+ }
82
+ }
83
+ })
84
+ await fireEvent(getByTestId('onlayout[1]'), 'layout', {
85
+ nativeEvent: {
86
+ layout: {
87
+ width: 100,
88
+ x: 250
89
+ }
90
+ }
91
+ })
92
+ await fireEvent.press(getByTestId('rerender'))
93
+ expect(getByTestId('output')).toHaveTextContent(
94
+ '{"0":{"start":0,"end":200},"1":{"start":250,"end":350}}'
95
+ )
96
+ })
97
+ it('does not cause a rerender from onLayout events alone', async () => {
98
+ const { getByTestId } = render(<MockComponent />)
99
+
100
+ expect(getByTestId('output')).toHaveTextContent('{}')
101
+ await fireEvent(getByTestId('onlayout[0]'), 'layout', {
102
+ nativeEvent: {
103
+ layout: {
104
+ width: 200,
105
+ x: 0
106
+ }
107
+ }
108
+ })
109
+ await fireEvent(getByTestId('onlayout[1]'), 'layout', {
110
+ nativeEvent: {
111
+ layout: {
112
+ width: 100,
113
+ x: 250
114
+ }
115
+ }
116
+ })
117
+ expect(getByTestId('output')).toHaveTextContent('{}')
118
+ })
119
+ })
120
+
121
+ describe('useItemPositions', () => {
122
+ // Again we're limited in what we can test; we can't test natural onLayout
123
+ // or page load timing, but we can affirm that calling `setIsReady` after layout
124
+ // events causes a re-render that can access positions data
125
+ const IsReadyMockComponent = () => {
126
+ const [{ positions, setIsReady }] = useItemPositions()
127
+ return (
128
+ <View testID="container" onLayout={setIsReady}>
129
+ <View testID="onlayout[0]" onLayout={getItemPositionLayoutHandler(positions, 0)} />
130
+ <View testID="onlayout[1]" onLayout={getItemPositionLayoutHandler(positions, 1)} />
131
+ <Text testID="output">{JSON.stringify(positions)}</Text>
132
+ </View>
133
+ )
134
+ }
135
+ it('causes a rerender when setIsReady is called', async () => {
136
+ const { getByTestId } = render(<IsReadyMockComponent />)
137
+
138
+ expect(getByTestId('output')).toHaveTextContent('{}')
139
+ await fireEvent(getByTestId('onlayout[0]'), 'layout', {
140
+ nativeEvent: {
141
+ layout: {
142
+ width: 200,
143
+ x: 0
144
+ }
145
+ }
146
+ })
147
+ await fireEvent(getByTestId('onlayout[1]'), 'layout', {
148
+ nativeEvent: {
149
+ layout: {
150
+ width: 100,
151
+ x: 250
152
+ }
153
+ }
154
+ })
155
+ await fireEvent(getByTestId('container'), 'layout', {
156
+ nativeEvent: { layout: {} }
157
+ })
158
+
159
+ expect(getByTestId('output')).toHaveTextContent(
160
+ '{"0":{"start":0,"end":200},"1":{"start":250,"end":350}}'
161
+ )
162
+ })
163
+ })
164
+ })
@@ -16,7 +16,7 @@ describe('Icon', () => {
16
16
  it('gets default styles from theme', () => {
17
17
  const { getByTestId } = render(
18
18
  <Theme>
19
- <Icon IconSvg={InnerComponent} />
19
+ <Icon icon={InnerComponent} />
20
20
  </Theme>
21
21
  )
22
22
 
@@ -29,7 +29,7 @@ describe('Icon', () => {
29
29
  it('gets styles from variant', () => {
30
30
  const { getByTestId } = render(
31
31
  <Theme>
32
- <Icon IconSvg={InnerComponent} variant={{ size: 'small' }} />
32
+ <Icon icon={InnerComponent} variant={{ size: 'small' }} />
33
33
  </Theme>
34
34
  )
35
35
 
@@ -46,7 +46,7 @@ describe('Icon', () => {
46
46
  const props = { tokens: { size: 30 } }
47
47
  const { getByTestId } = render(
48
48
  <Theme>
49
- <Icon IconSvg={InnerComponent} {...props} />
49
+ <Icon icon={InnerComponent} {...props} />
50
50
  </Theme>
51
51
  )
52
52
 
@@ -0,0 +1,52 @@
1
+ import React from 'react'
2
+ import { fireEvent, render } from '@testing-library/react-native'
3
+
4
+ import { IconButton } from '../../src'
5
+ import Theme from '../../__fixtures__/Theme'
6
+
7
+ describe('IconButton', () => {
8
+ it('renders a link if href is passed', () => {
9
+ const { queryByRole } = render(<IconButton href="https://telus.com" icon={() => null} />, {
10
+ wrapper: Theme
11
+ })
12
+
13
+ expect(queryByRole('link')).toBeTruthy()
14
+
15
+ expect(queryByRole('button')).toBeFalsy()
16
+ })
17
+
18
+ it('renders a button if onPress is passed', () => {
19
+ const { queryByRole } = render(<IconButton onPress={() => {}} icon={() => null} />, {
20
+ wrapper: Theme
21
+ })
22
+
23
+ expect(queryByRole('button')).toBeTruthy()
24
+
25
+ expect(queryByRole('link')).toBeFalsy()
26
+ })
27
+
28
+ it('renders an accessible label', () => {
29
+ const { getByA11yLabel } = render(
30
+ <IconButton onPress={() => {}} icon={() => null} accessibilityLabel="test label" />,
31
+ {
32
+ wrapper: Theme
33
+ }
34
+ )
35
+
36
+ expect(getByA11yLabel('test label')).toBeTruthy()
37
+ })
38
+
39
+ it('calls onPress function when pressed', async () => {
40
+ const handlePress = jest.fn()
41
+ const { getByA11yLabel } = render(
42
+ <IconButton onPress={handlePress} icon={() => null} accessibilityLabel="test label" />,
43
+ {
44
+ wrapper: Theme
45
+ }
46
+ )
47
+ const iconButton = getByA11yLabel('test label')
48
+ expect(handlePress).toHaveBeenCalledTimes(0)
49
+ await fireEvent.press(iconButton)
50
+ expect(handlePress).toHaveBeenCalledTimes(1)
51
+ })
52
+ })
@@ -0,0 +1,50 @@
1
+ import React from 'react'
2
+ import { fireEvent, render } from '@testing-library/react-native'
3
+
4
+ import InputSupports from '../../src/InputSupports'
5
+ import Theme from '../../__fixtures__/Theme'
6
+ import Viewport from '../../__fixtures__/Viewport'
7
+
8
+ // eslint-disable-next-line react/prop-types
9
+ const Wrapper = ({ children }) => (
10
+ <Viewport viewport="xs">
11
+ <Theme>{children}</Theme>
12
+ </Viewport>
13
+ )
14
+
15
+ describe('InputSupports', () => {
16
+ it('renders the label', () => {
17
+ const { queryByText } = render(<InputSupports label="Test label content" />, {
18
+ wrapper: Wrapper
19
+ })
20
+
21
+ expect(queryByText('Test label content')).toBeTruthy()
22
+ })
23
+
24
+ it('renders the hint', () => {
25
+ const { queryByText } = render(
26
+ <InputSupports label="Test label content" hint="Test hint content" />,
27
+ { wrapper: Wrapper }
28
+ )
29
+
30
+ expect(queryByText('Test hint content')).toBeTruthy()
31
+ })
32
+
33
+ it('renders the feedback', () => {
34
+ const { queryByText } = render(<InputSupports feedback="Test feedback content" />, {
35
+ wrapper: Wrapper
36
+ })
37
+
38
+ expect(queryByText('Test feedback content')).toBeTruthy()
39
+ })
40
+
41
+ it('renders the tooltip which content shows up when pressed', () => {
42
+ const { queryByText, getByRole } = render(
43
+ <InputSupports label="Test label content" tooltip="Test tooltip content" />,
44
+ { wrapper: Wrapper }
45
+ )
46
+
47
+ fireEvent(getByRole('button'), 'press')
48
+ expect(queryByText('Test tooltip content')).toBeTruthy()
49
+ })
50
+ })
@@ -8,20 +8,6 @@ import LinkBase from '../../src/Link/LinkBase'
8
8
  beforeEach(() => jest.clearAllMocks())
9
9
 
10
10
  describe('LinkBase', () => {
11
- it('throws if both href and onPress are provided', async () => {
12
- jest.spyOn(console, 'error').mockImplementation()
13
- expect(() =>
14
- render(
15
- <Theme>
16
- <LinkBase href="example.com" onPress={jest.fn()}>
17
- click me
18
- </LinkBase>
19
- </Theme>
20
- )
21
- ).toThrow()
22
- expect(console.error).toHaveBeenCalledTimes(1)
23
- })
24
-
25
11
  it('throws if neither href nor onPress are provided', async () => {
26
12
  jest.spyOn(console, 'error').mockImplementation()
27
13
  expect(() =>
@@ -0,0 +1,60 @@
1
+ import React from 'react'
2
+ import { Text } from 'react-native'
3
+ import { render } from '@testing-library/react-native'
4
+ import { List } from '../../src'
5
+ import Theme from '../../__fixtures__/Theme'
6
+ import testTheme from '../../__fixtures__/testTheme'
7
+
8
+ const setup = ({ showDivider = false, icon, children } = {}) =>
9
+ render(
10
+ <Theme>
11
+ <List showDivider={showDivider}>
12
+ <List.Item icon={icon}>{children || 'Item'}</List.Item>
13
+ <List.Item icon={icon}>{children || 'Item'}</List.Item>
14
+ <List.Item icon={icon}>{children || 'Item'}</List.Item>
15
+ <List.Item icon={icon}>{children || 'Item'}</List.Item>
16
+ </List>
17
+ </Theme>
18
+ )
19
+
20
+ describe('List', () => {
21
+ it('should render bullets by default', () => {
22
+ const { queryAllByTestId } = setup()
23
+ const bullet = queryAllByTestId('unordered-item-bullet')
24
+ expect(bullet.length).toBe(4)
25
+ })
26
+
27
+ it('should render dividers for all items except for the last one', () => {
28
+ const { getAllByRole } = setup({ showDivider: true })
29
+ const {
30
+ interItemMarginWithDivider: marginBottom,
31
+ dividerColor: borderColor,
32
+ dividerSize: borderBottomWidth
33
+ } = testTheme.components.List.tokens
34
+
35
+ const listItems = getAllByRole('item')
36
+
37
+ listItems.forEach((item, index) => {
38
+ if (index + 1 !== listItems.length) {
39
+ expect(item).toHaveStyle({ marginBottom, borderColor, borderBottomWidth })
40
+ } else {
41
+ expect(item).toHaveStyle({})
42
+ }
43
+ })
44
+ })
45
+
46
+ it('should render the icon when defined', () => {
47
+ const { queryAllByTestId } = setup({ icon: () => <Text testID="icon" /> })
48
+
49
+ const icons = queryAllByTestId('icon')
50
+
51
+ expect(icons.length).toBe(4)
52
+ })
53
+ it('should allow children nested components', () => {
54
+ const { queryAllByTestId } = setup({ children: <Text testID="child" /> })
55
+
56
+ const children = queryAllByTestId('child')
57
+
58
+ expect(children.length).toBe(4)
59
+ })
60
+ })
@@ -0,0 +1,47 @@
1
+ import React from 'react'
2
+ import { Text } from 'react-native'
3
+ import { fireEvent, render } from '@testing-library/react-native'
4
+
5
+ import { Modal } from '../../src'
6
+ import Theme from '../../__fixtures__/Theme'
7
+
8
+ describe('Modal', () => {
9
+ it('is not rendered when closed', () => {
10
+ const { queryByText } = render(
11
+ <Modal>
12
+ <Text>Test content</Text>
13
+ </Modal>,
14
+ { wrapper: Theme }
15
+ )
16
+
17
+ expect(queryByText('Test content')).toBeFalsy()
18
+ })
19
+
20
+ it('is rendered when open', () => {
21
+ const { queryByText } = render(
22
+ <Modal isOpen>
23
+ <Text>Test content</Text>
24
+ </Modal>,
25
+ { wrapper: Theme }
26
+ )
27
+
28
+ expect(queryByText('Test content')).not.toBeFalsy()
29
+ })
30
+
31
+ it('onClose callback is triggered when closing', () => {
32
+ const onClose = jest.fn()
33
+
34
+ const { getByA11yRole } = render(
35
+ <Modal isOpen onClose={onClose}>
36
+ <Text>Test content</Text>
37
+ </Modal>,
38
+ { wrapper: Theme }
39
+ )
40
+
41
+ expect(onClose).not.toHaveBeenCalled()
42
+
43
+ fireEvent.press(getByA11yRole('button'))
44
+
45
+ expect(onClose).toHaveBeenCalledTimes(1)
46
+ })
47
+ })
@@ -0,0 +1,20 @@
1
+ import React from 'react'
2
+ import { fireEvent, render } from '@testing-library/react-native'
3
+
4
+ import { Notification } from '../../src'
5
+ import Theme from '../../__fixtures__/Theme'
6
+
7
+ describe('Notification', () => {
8
+ it('is removed when dismiss button is pressed', () => {
9
+ const content = 'Notification content lands here'
10
+ const { getByRole, getByText } = render(<Notification dismissible>{content}</Notification>, {
11
+ wrapper: Theme
12
+ })
13
+
14
+ expect(() => getByText(content)).not.toThrow()
15
+
16
+ fireEvent.press(getByRole('button'))
17
+
18
+ expect(() => getByText(content)).toThrow()
19
+ })
20
+ })