@telus-uds/components-base 0.0.2-prerelease.5 → 0.0.2-prerelease.9

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 (429) hide show
  1. package/.ultra.cache.json +1 -0
  2. package/CHANGELOG.md +65 -0
  3. package/__fixtures__/Accessible.js +33 -0
  4. package/__fixtures__/Accessible.native.js +32 -0
  5. package/__fixtures__/testTheme.js +871 -52
  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__/Icon/Icon.test.jsx +3 -3
  12. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  13. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  14. package/__tests__/List/List.test.jsx +60 -0
  15. package/__tests__/Modal/Modal.test.jsx +47 -0
  16. package/__tests__/Notification/Notification.test.jsx +20 -0
  17. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  18. package/__tests__/Progress/Progress.test.jsx +79 -0
  19. package/__tests__/Radio/Radio.test.jsx +87 -0
  20. package/__tests__/Radio/RadioGroup.test.jsx +221 -0
  21. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  22. package/__tests__/RadioCard/RadioCardGroup.test.jsx +247 -0
  23. package/__tests__/Search/Search.test.jsx +72 -0
  24. package/__tests__/Select/Select.test.jsx +93 -0
  25. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  26. package/__tests__/StackView/StackView.test.jsx +0 -26
  27. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  28. package/__tests__/Tabs/Tabs.test.jsx +200 -0
  29. package/__tests__/Tags/Tags.test.jsx +328 -0
  30. package/__tests__/TextInput/TextArea.test.jsx +34 -0
  31. package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +20 -46
  32. package/__tests__/Tooltip/Tooltip.test.jsx +65 -0
  33. package/__tests__/Tooltip/getTooltipPosition.test.js +79 -0
  34. package/__tests__/utils/input.test.js +58 -0
  35. package/__tests__/utils/useCopy.test.js +42 -0
  36. package/__tests__/utils/useResponsiveProp.test.jsx +202 -0
  37. package/__tests__/utils/{spacing.test.jsx → useSpacingScale.test.jsx} +1 -1
  38. package/babel.config.js +20 -0
  39. package/jest.config.js +13 -4
  40. package/lib/A11yInfoProvider/index.js +54 -26
  41. package/lib/A11yText/index.js +37 -14
  42. package/lib/ActivityIndicator/Spinner.js +78 -0
  43. package/lib/ActivityIndicator/Spinner.native.js +121 -87
  44. package/lib/ActivityIndicator/index.js +28 -12
  45. package/lib/ActivityIndicator/shared.js +27 -12
  46. package/lib/BaseProvider/index.js +34 -11
  47. package/lib/Box/Box.js +54 -31
  48. package/lib/Box/index.js +13 -2
  49. package/lib/Button/Button.js +38 -10
  50. package/lib/Button/ButtonBase.js +115 -94
  51. package/lib/Button/ButtonGroup.js +94 -86
  52. package/lib/Button/ButtonLink.js +41 -13
  53. package/lib/Button/index.js +31 -4
  54. package/lib/Button/propTypes.js +32 -9
  55. package/lib/Card/Card.js +36 -41
  56. package/lib/Card/CardBase.js +78 -0
  57. package/lib/Card/PressableCardBase.js +137 -0
  58. package/lib/Card/index.js +40 -2
  59. package/lib/Checkbox/Checkbox.js +344 -0
  60. package/lib/Checkbox/CheckboxGroup.js +231 -0
  61. package/lib/Checkbox/CheckboxInput.js +74 -0
  62. package/lib/Checkbox/CheckboxInput.native.js +14 -0
  63. package/lib/Checkbox/index.js +21 -0
  64. package/lib/Divider/Divider.js +50 -24
  65. package/lib/Divider/index.js +13 -2
  66. package/lib/ExpandCollapse/Accordion.js +20 -7
  67. package/lib/ExpandCollapse/Control.js +50 -27
  68. package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
  69. package/lib/ExpandCollapse/Panel.js +75 -37
  70. package/lib/ExpandCollapse/index.js +25 -7
  71. package/lib/Feedback/Feedback.js +85 -34
  72. package/lib/Feedback/index.js +13 -2
  73. package/lib/Fieldset/Fieldset.js +160 -0
  74. package/lib/Fieldset/FieldsetContainer.js +41 -0
  75. package/lib/Fieldset/FieldsetContainer.native.js +33 -0
  76. package/lib/Fieldset/Legend.js +33 -0
  77. package/lib/Fieldset/Legend.native.js +43 -0
  78. package/lib/Fieldset/cssReset.js +21 -0
  79. package/lib/Fieldset/index.js +13 -0
  80. package/lib/FlexGrid/Col/Col.js +67 -38
  81. package/lib/FlexGrid/Col/index.js +13 -2
  82. package/lib/FlexGrid/FlexGrid.js +70 -45
  83. package/lib/FlexGrid/Row/Row.js +48 -27
  84. package/lib/FlexGrid/Row/index.js +13 -2
  85. package/lib/FlexGrid/helpers/index.js +9 -1
  86. package/lib/FlexGrid/index.js +13 -2
  87. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  88. package/lib/Icon/Icon.js +52 -47
  89. package/lib/Icon/IconText.js +100 -0
  90. package/lib/Icon/index.js +31 -3
  91. package/lib/IconButton/IconButton.js +135 -0
  92. package/lib/IconButton/index.js +13 -0
  93. package/lib/InputLabel/InputLabel.js +70 -34
  94. package/lib/InputLabel/LabelContent.js +31 -0
  95. package/lib/InputLabel/LabelContent.native.js +9 -1
  96. package/lib/InputLabel/index.js +13 -2
  97. package/lib/InputSupports/InputSupports.js +104 -0
  98. package/lib/InputSupports/index.js +13 -0
  99. package/lib/InputSupports/propTypes.js +66 -0
  100. package/lib/InputSupports/useInputSupports.js +41 -0
  101. package/lib/Link/ChevronLink.js +57 -15
  102. package/lib/Link/InlinePressable.js +50 -0
  103. package/lib/Link/InlinePressable.native.js +101 -0
  104. package/lib/Link/Link.js +30 -13
  105. package/lib/Link/LinkBase.js +114 -145
  106. package/lib/Link/TextButton.js +47 -17
  107. package/lib/Link/index.js +39 -4
  108. package/lib/List/List.js +80 -0
  109. package/lib/List/ListItem.js +237 -0
  110. package/lib/List/index.js +13 -0
  111. package/lib/Modal/Modal.js +226 -0
  112. package/lib/Modal/dictionary.js +16 -0
  113. package/lib/Modal/index.js +13 -0
  114. package/lib/Notification/Notification.js +200 -0
  115. package/lib/Notification/dictionary.js +15 -0
  116. package/lib/Notification/index.js +13 -0
  117. package/lib/Pagination/PageButton.js +45 -46
  118. package/lib/Pagination/Pagination.js +70 -40
  119. package/lib/Pagination/SideButton.js +74 -58
  120. package/lib/Pagination/dictionary.js +9 -2
  121. package/lib/Pagination/index.js +13 -2
  122. package/lib/Pagination/usePagination.js +12 -2
  123. package/lib/Progress/Progress.js +99 -0
  124. package/lib/Progress/ProgressBar.js +146 -0
  125. package/lib/Progress/ProgressBarBackground.js +57 -0
  126. package/lib/Progress/index.js +16 -0
  127. package/lib/Radio/Radio.js +292 -0
  128. package/lib/Radio/RadioButton.js +141 -0
  129. package/lib/Radio/RadioGroup.js +233 -0
  130. package/lib/Radio/RadioInput.js +76 -0
  131. package/lib/Radio/RadioInput.native.js +14 -0
  132. package/lib/Radio/index.js +21 -0
  133. package/lib/RadioCard/RadioCard.js +240 -0
  134. package/lib/RadioCard/RadioCardGroup.js +251 -0
  135. package/lib/RadioCard/index.js +21 -0
  136. package/lib/Search/Search.js +243 -0
  137. package/lib/Search/dictionary.js +19 -0
  138. package/lib/Search/index.js +13 -0
  139. package/lib/Select/Group.js +33 -0
  140. package/lib/Select/Group.native.js +25 -0
  141. package/lib/Select/Item.js +29 -0
  142. package/lib/Select/Item.native.js +19 -0
  143. package/lib/Select/Picker.js +79 -0
  144. package/lib/Select/Picker.native.js +115 -0
  145. package/lib/Select/Select.js +300 -0
  146. package/lib/Select/index.js +19 -0
  147. package/lib/SideNav/Item.js +54 -33
  148. package/lib/SideNav/ItemContent.js +41 -15
  149. package/lib/SideNav/ItemsGroup.js +46 -27
  150. package/lib/SideNav/SideNav.js +92 -69
  151. package/lib/SideNav/index.js +15 -1
  152. package/lib/Skeleton/Skeleton.js +137 -0
  153. package/lib/Skeleton/index.js +13 -0
  154. package/lib/Skeleton/skeleton.constant.js +12 -0
  155. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  156. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  157. package/lib/Spacer/Spacer.js +31 -12
  158. package/lib/Spacer/index.js +13 -2
  159. package/lib/StackView/StackView.js +57 -33
  160. package/lib/StackView/StackWrap.js +33 -10
  161. package/lib/StackView/StackWrap.native.js +13 -2
  162. package/lib/StackView/StackWrapBox.js +50 -23
  163. package/lib/StackView/StackWrapGap.js +45 -19
  164. package/lib/StackView/common.js +19 -4
  165. package/lib/StackView/getStackedContent.js +49 -19
  166. package/lib/StackView/index.js +29 -5
  167. package/lib/StepTracker/Step.js +245 -0
  168. package/lib/StepTracker/StepTracker.js +197 -0
  169. package/lib/StepTracker/dictionary.js +17 -0
  170. package/lib/StepTracker/index.js +13 -0
  171. package/lib/Tabs/HorizontalScroll.js +199 -0
  172. package/lib/Tabs/ScrollViewEnd.js +66 -0
  173. package/lib/Tabs/ScrollViewEnd.native.js +41 -0
  174. package/lib/Tabs/Tabs.js +117 -0
  175. package/lib/Tabs/TabsItem.js +234 -0
  176. package/lib/Tabs/TabsScrollButton.js +121 -0
  177. package/lib/Tabs/dictionary.js +18 -0
  178. package/lib/Tabs/index.js +13 -0
  179. package/lib/Tabs/itemPositions.js +128 -0
  180. package/lib/Tags/Tags.js +250 -0
  181. package/lib/Tags/index.js +13 -0
  182. package/lib/TextInput/TextArea.js +109 -0
  183. package/lib/TextInput/TextInput.js +41 -303
  184. package/lib/TextInput/TextInputBase.js +252 -0
  185. package/lib/TextInput/index.js +23 -2
  186. package/lib/TextInput/propTypes.js +42 -0
  187. package/lib/ThemeProvider/ThemeProvider.js +38 -14
  188. package/lib/ThemeProvider/index.js +61 -6
  189. package/lib/ThemeProvider/useSetTheme.js +14 -5
  190. package/lib/ThemeProvider/useTheme.js +13 -4
  191. package/lib/ThemeProvider/useThemeTokens.js +86 -19
  192. package/lib/ThemeProvider/utils/index.js +31 -2
  193. package/lib/ThemeProvider/utils/styles.js +52 -16
  194. package/lib/ThemeProvider/utils/theme-tokens.js +94 -16
  195. package/lib/ToggleSwitch/ToggleSwitch.js +76 -52
  196. package/lib/ToggleSwitch/index.js +13 -2
  197. package/lib/Tooltip/Backdrop.js +56 -0
  198. package/lib/Tooltip/Backdrop.native.js +59 -0
  199. package/lib/Tooltip/Tooltip.js +357 -0
  200. package/lib/Tooltip/dictionary.js +15 -0
  201. package/lib/Tooltip/getTooltipPosition.js +172 -0
  202. package/lib/Tooltip/index.js +13 -0
  203. package/lib/TooltipButton/TooltipButton.js +83 -0
  204. package/lib/TooltipButton/index.js +13 -0
  205. package/lib/Typography/Typography.js +58 -43
  206. package/lib/Typography/index.js +13 -2
  207. package/lib/ViewportProvider/ViewportProvider.js +46 -0
  208. package/lib/ViewportProvider/index.js +22 -38
  209. package/lib/ViewportProvider/useViewport.js +15 -0
  210. package/lib/ViewportProvider/useViewportListener.js +57 -0
  211. package/lib/index.js +518 -24
  212. package/lib/utils/a11y/index.js +18 -0
  213. package/lib/utils/a11y/textSize.js +49 -0
  214. package/lib/utils/animation/index.js +15 -2
  215. package/lib/utils/animation/useVerticalExpandAnimation.js +28 -11
  216. package/lib/utils/children.js +87 -0
  217. package/lib/utils/index.js +163 -4
  218. package/lib/utils/info/index.js +19 -0
  219. package/lib/utils/info/platform/index.js +23 -0
  220. package/lib/utils/info/platform/platform.android.js +8 -0
  221. package/lib/utils/info/platform/platform.ios.js +8 -0
  222. package/lib/utils/info/platform/platform.js +8 -0
  223. package/lib/utils/info/platform/platform.native.js +11 -0
  224. package/lib/utils/info/versions.js +16 -0
  225. package/lib/utils/input.js +51 -33
  226. package/lib/utils/pressability.js +120 -0
  227. package/lib/utils/propTypes.js +269 -116
  228. package/lib/utils/useCopy.js +51 -0
  229. package/lib/utils/useHash.js +48 -0
  230. package/lib/utils/useHash.native.js +15 -0
  231. package/lib/utils/useResponsiveProp.js +59 -0
  232. package/lib/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +45 -12
  233. package/lib/utils/useUniqueId.js +13 -4
  234. package/package.json +12 -9
  235. package/release-context.json +4 -4
  236. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
  237. package/src/Box/Box.jsx +11 -4
  238. package/src/Button/Button.jsx +9 -5
  239. package/src/Button/ButtonBase.jsx +69 -69
  240. package/src/Button/ButtonGroup.jsx +11 -24
  241. package/src/Button/ButtonLink.jsx +14 -4
  242. package/src/Button/propTypes.js +12 -2
  243. package/src/Card/Card.jsx +4 -30
  244. package/src/Card/CardBase.jsx +57 -0
  245. package/src/Card/PressableCardBase.jsx +112 -0
  246. package/src/Card/index.js +3 -0
  247. package/src/Checkbox/Checkbox.jsx +274 -0
  248. package/src/Checkbox/CheckboxGroup.jsx +196 -0
  249. package/src/Checkbox/CheckboxInput.jsx +55 -0
  250. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  251. package/src/Checkbox/index.js +5 -0
  252. package/src/ExpandCollapse/Control.jsx +1 -1
  253. package/src/Feedback/Feedback.jsx +31 -22
  254. package/src/Fieldset/Fieldset.jsx +129 -0
  255. package/src/Fieldset/FieldsetContainer.jsx +22 -0
  256. package/src/Fieldset/FieldsetContainer.native.jsx +16 -0
  257. package/src/Fieldset/Legend.jsx +16 -0
  258. package/src/Fieldset/Legend.native.jsx +22 -0
  259. package/src/Fieldset/cssReset.js +14 -0
  260. package/src/Fieldset/index.js +3 -0
  261. package/src/Icon/Icon.jsx +21 -26
  262. package/src/Icon/IconText.jsx +63 -0
  263. package/src/Icon/index.js +3 -2
  264. package/src/IconButton/IconButton.jsx +107 -0
  265. package/src/IconButton/index.js +3 -0
  266. package/src/InputLabel/InputLabel.jsx +11 -4
  267. package/src/InputLabel/{LabelContent.web.jsx → LabelContent.jsx} +0 -0
  268. package/src/InputSupports/InputSupports.jsx +75 -0
  269. package/src/InputSupports/index.js +3 -0
  270. package/src/InputSupports/propTypes.js +44 -0
  271. package/src/InputSupports/useInputSupports.js +30 -0
  272. package/src/Link/ChevronLink.jsx +28 -7
  273. package/src/Link/InlinePressable.jsx +37 -0
  274. package/src/Link/InlinePressable.native.jsx +73 -0
  275. package/src/Link/Link.jsx +17 -13
  276. package/src/Link/LinkBase.jsx +67 -148
  277. package/src/Link/TextButton.jsx +25 -11
  278. package/src/Link/index.js +2 -1
  279. package/src/List/List.jsx +47 -0
  280. package/src/List/ListItem.jsx +187 -0
  281. package/src/List/index.js +3 -0
  282. package/src/Modal/Modal.jsx +185 -0
  283. package/src/Modal/dictionary.js +9 -0
  284. package/src/Modal/index.js +3 -0
  285. package/src/Notification/Notification.jsx +149 -0
  286. package/src/Notification/dictionary.js +8 -0
  287. package/src/Notification/index.js +3 -0
  288. package/src/Pagination/PageButton.jsx +3 -17
  289. package/src/Pagination/SideButton.jsx +27 -38
  290. package/src/Progress/Progress.jsx +77 -0
  291. package/src/Progress/ProgressBar.jsx +110 -0
  292. package/src/Progress/ProgressBarBackground.jsx +34 -0
  293. package/src/Progress/index.js +6 -0
  294. package/src/Radio/Radio.jsx +233 -0
  295. package/src/Radio/RadioButton.jsx +131 -0
  296. package/src/Radio/RadioGroup.jsx +198 -0
  297. package/src/Radio/RadioInput.jsx +57 -0
  298. package/src/Radio/RadioInput.native.jsx +6 -0
  299. package/src/Radio/index.js +5 -0
  300. package/src/RadioCard/RadioCard.jsx +191 -0
  301. package/src/RadioCard/RadioCardGroup.jsx +211 -0
  302. package/src/RadioCard/index.js +5 -0
  303. package/src/Search/Search.jsx +204 -0
  304. package/src/Search/dictionary.js +12 -0
  305. package/src/Search/index.js +3 -0
  306. package/src/Select/Group.jsx +15 -0
  307. package/src/Select/Group.native.jsx +14 -0
  308. package/src/Select/Item.jsx +11 -0
  309. package/src/Select/Item.native.jsx +10 -0
  310. package/src/Select/Picker.jsx +67 -0
  311. package/src/Select/Picker.native.jsx +95 -0
  312. package/src/Select/Select.jsx +255 -0
  313. package/src/Select/index.js +8 -0
  314. package/src/SideNav/Item.jsx +2 -2
  315. package/src/Skeleton/Skeleton.jsx +98 -0
  316. package/src/Skeleton/index.js +3 -0
  317. package/src/Skeleton/skeleton.constant.js +3 -0
  318. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  319. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  320. package/src/StackView/StackView.jsx +25 -17
  321. package/src/StackView/StackWrap.jsx +9 -1
  322. package/src/StackView/StackWrapBox.jsx +19 -7
  323. package/src/StackView/StackWrapGap.jsx +15 -5
  324. package/src/StackView/getStackedContent.jsx +8 -2
  325. package/src/StepTracker/Step.jsx +202 -0
  326. package/src/StepTracker/StepTracker.jsx +163 -0
  327. package/src/StepTracker/dictionary.js +10 -0
  328. package/src/StepTracker/index.js +3 -0
  329. package/src/Tabs/HorizontalScroll.jsx +165 -0
  330. package/src/Tabs/ScrollViewEnd.jsx +53 -0
  331. package/src/Tabs/ScrollViewEnd.native.jsx +24 -0
  332. package/src/Tabs/Tabs.jsx +89 -0
  333. package/src/Tabs/TabsItem.jsx +204 -0
  334. package/src/Tabs/TabsScrollButton.jsx +100 -0
  335. package/src/Tabs/dictionary.js +11 -0
  336. package/src/Tabs/index.js +3 -0
  337. package/src/Tabs/itemPositions.js +101 -0
  338. package/src/Tags/Tags.jsx +207 -0
  339. package/src/Tags/index.js +3 -0
  340. package/src/TextInput/TextArea.jsx +78 -0
  341. package/src/TextInput/TextInput.jsx +17 -290
  342. package/src/TextInput/TextInputBase.jsx +210 -0
  343. package/src/TextInput/index.js +2 -1
  344. package/src/TextInput/propTypes.js +29 -0
  345. package/src/ThemeProvider/useThemeTokens.js +56 -5
  346. package/src/ThemeProvider/utils/styles.js +18 -5
  347. package/src/ThemeProvider/utils/theme-tokens.js +46 -5
  348. package/src/ToggleSwitch/ToggleSwitch.jsx +3 -4
  349. package/src/Tooltip/Backdrop.jsx +60 -0
  350. package/src/Tooltip/Backdrop.native.jsx +33 -0
  351. package/src/Tooltip/Tooltip.jsx +294 -0
  352. package/src/Tooltip/dictionary.js +8 -0
  353. package/src/Tooltip/getTooltipPosition.js +161 -0
  354. package/src/Tooltip/index.js +3 -0
  355. package/src/TooltipButton/TooltipButton.jsx +49 -0
  356. package/src/TooltipButton/index.js +3 -0
  357. package/src/Typography/Typography.jsx +10 -20
  358. package/src/ViewportProvider/ViewportProvider.jsx +21 -0
  359. package/src/ViewportProvider/index.jsx +2 -41
  360. package/src/ViewportProvider/useViewport.js +5 -0
  361. package/src/ViewportProvider/useViewportListener.js +43 -0
  362. package/src/index.js +31 -3
  363. package/src/utils/a11y/index.js +1 -0
  364. package/src/utils/a11y/textSize.js +30 -0
  365. package/src/utils/children.jsx +66 -0
  366. package/src/utils/index.js +11 -1
  367. package/src/utils/info/index.js +8 -0
  368. package/src/utils/info/platform/index.js +11 -0
  369. package/src/utils/info/platform/platform.android.js +1 -0
  370. package/src/utils/info/platform/platform.ios.js +1 -0
  371. package/src/utils/info/platform/platform.js +1 -0
  372. package/src/utils/info/platform/platform.native.js +4 -0
  373. package/src/utils/info/versions.js +6 -0
  374. package/src/utils/input.js +20 -12
  375. package/src/utils/pressability.js +96 -0
  376. package/src/utils/propTypes.js +195 -56
  377. package/src/utils/useCopy.js +39 -0
  378. package/src/utils/useHash.js +34 -0
  379. package/src/utils/useHash.native.js +6 -0
  380. package/src/utils/useResponsiveProp.js +50 -0
  381. package/src/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +25 -10
  382. package/stories/A11yText/A11yText.stories.jsx +4 -8
  383. package/stories/Button/Button.stories.jsx +5 -0
  384. package/stories/Card/Card.stories.jsx +1 -1
  385. package/stories/Checkbox/Checkbox.stories.jsx +94 -0
  386. package/stories/Feedback/Feedback.stories.jsx +5 -6
  387. package/stories/Icon/Icon.stories.jsx +27 -7
  388. package/stories/IconButton/IconButton.stories.jsx +50 -0
  389. package/stories/InputLabel/InputLabel.stories.jsx +8 -3
  390. package/stories/Link/ChevronLink.stories.jsx +3 -3
  391. package/stories/Link/Link.stories.jsx +28 -18
  392. package/stories/List/List.stories.jsx +117 -0
  393. package/stories/Modal/Modal.stories.jsx +29 -0
  394. package/stories/Notification/Notification.stories.jsx +82 -0
  395. package/stories/Progress/Progress.stories.jsx +93 -0
  396. package/stories/Radio/Radio.stories.jsx +100 -0
  397. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  398. package/stories/Search/Search.stories.jsx +16 -0
  399. package/stories/Select/Select.stories.jsx +55 -0
  400. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  401. package/stories/Spacer/Spacer.stories.jsx +7 -2
  402. package/stories/StackView/StackView.stories.jsx +10 -0
  403. package/stories/StackView/StackWrap.stories.jsx +12 -0
  404. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  405. package/stories/Tabs/Tabs.stories.jsx +97 -0
  406. package/stories/Tags/Tags.stories.jsx +69 -0
  407. package/stories/TextInput/TextArea.stories.jsx +100 -0
  408. package/stories/Tooltip/Tooltip.stories.jsx +81 -0
  409. package/stories/TooltipButton/TooltipButton.stories.jsx +11 -0
  410. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +0 -0
  411. package/stories/supports.jsx +36 -2
  412. package/__fixtures__/accessible.icon.svg +0 -6
  413. package/babel.config.json +0 -8
  414. package/docs/Contributing.stories.mdx +0 -9
  415. package/docs/Fonts.stories.mdx +0 -104
  416. package/docs/Icons.stories.mdx +0 -144
  417. package/docs/Introduction.stories.mdx +0 -9
  418. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  419. package/lib/InputLabel/LabelContent.web.js +0 -17
  420. package/lib/Pagination/useCopy.js +0 -10
  421. package/lib/config/svgr-icons-web.js +0 -9
  422. package/lib/config/svgr-icons.js +0 -52
  423. package/lib/utils/spacing/index.js +0 -2
  424. package/lib/utils/spacing/utils.js +0 -32
  425. package/src/Pagination/useCopy.js +0 -7
  426. package/src/config/svgr-icons-web.js +0 -11
  427. package/src/config/svgr-icons.js +0 -46
  428. package/src/utils/spacing/index.js +0 -3
  429. package/src/utils/spacing/utils.js +0 -28
@@ -0,0 +1,200 @@
1
+ import React, { useState } from 'react'
2
+ import { Pressable, View, Text } from 'react-native'
3
+ import { fireEvent, render } from '@testing-library/react-native'
4
+
5
+ import { Tabs } from '../../src'
6
+ import {
7
+ getItemPositionLayoutHandler,
8
+ useItemPositions,
9
+ getItemPositionScrollTarget
10
+ } from '../../src/Tabs/itemPositions'
11
+ import Theme from '../../__fixtures__/Theme'
12
+
13
+ // ScrollViewRef.scrollTo doesn't work in Jest - unit-test the utilities instead
14
+ describe('Tabs getItemPositionScrollTarget', () => {
15
+ const positionsWithoutSpacing = {
16
+ 0: { start: 0, end: 100 },
17
+ 1: { start: 100, end: 200 },
18
+ 2: { start: 200, end: 300 }
19
+ }
20
+ const positions = {
21
+ 0: { start: 0, end: 50 },
22
+ 1: { start: 100, end: 150 },
23
+ 2: { start: 200, end: 250 }
24
+ }
25
+ it('scrolls to the start of an item rather than chopping it', () => {
26
+ const x = getItemPositionScrollTarget(150, 300, positionsWithoutSpacing)
27
+ expect(x).toBe(100)
28
+ })
29
+ it('offsets the position by a button clearance', () => {
30
+ const x = getItemPositionScrollTarget(150, 300, positionsWithoutSpacing, 20)
31
+ expect(x).toBe(80)
32
+ })
33
+ it('scrolls exactly if landing on a gap', () => {
34
+ const x = getItemPositionScrollTarget(170, 300, positions)
35
+ expect(x).toBe(170)
36
+ })
37
+ it('applies button clearance if landing on a gap', () => {
38
+ const x = getItemPositionScrollTarget(170, 300, positions, 40)
39
+ expect(x).toBe(130)
40
+ })
41
+ it('does not apply button clearance on reaching the end', () => {
42
+ const x = getItemPositionScrollTarget(300, 300, positions, 40)
43
+ expect(x).toBe(300)
44
+ })
45
+ it('does not exceed the maximum', () => {
46
+ const x = getItemPositionScrollTarget(320, 300, positions, 40)
47
+ expect(x).toBe(300)
48
+ })
49
+ it('does not go below 0', () => {
50
+ const x = getItemPositionScrollTarget(-420, 300, positions, 40)
51
+ expect(x).toBe(0)
52
+ })
53
+ })
54
+
55
+ // onLayout also doesn't work naturally in jest
56
+ describe('Tabs getItemPositionLayoutHandler', () => {
57
+ // Test component using useItemPositions with getItemPositionLayoutHandler
58
+ // that can be rerendered manually and that outputs itemPositions value
59
+ const MockComponent = () => {
60
+ const [num, setNum] = useState()
61
+ const [{ positions }] = useItemPositions()
62
+ return (
63
+ <View>
64
+ <View testID="onlayout[0]" onLayout={getItemPositionLayoutHandler(positions, 0)} />
65
+ <View testID="onlayout[1]" onLayout={getItemPositionLayoutHandler(positions, 1)} />
66
+ <Text testID="output">{JSON.stringify(positions)}</Text>
67
+ <Pressable testID="rerender" onPress={() => setNum(num + 1)}>
68
+ <Text>{num}</Text>
69
+ </Pressable>
70
+ </View>
71
+ )
72
+ }
73
+ it('gets width and x positions from onLayout events', async () => {
74
+ const { getByTestId } = render(<MockComponent />)
75
+
76
+ // onLayout doesn't work in jest but can be called directly as an event, but we
77
+ // have to pass the event object. Can't test that it gets them correctly from style
78
+ await fireEvent(getByTestId('onlayout[0]'), 'layout', {
79
+ nativeEvent: {
80
+ layout: {
81
+ width: 200,
82
+ x: 0
83
+ }
84
+ }
85
+ })
86
+ await fireEvent(getByTestId('onlayout[1]'), 'layout', {
87
+ nativeEvent: {
88
+ layout: {
89
+ width: 100,
90
+ x: 250
91
+ }
92
+ }
93
+ })
94
+ await fireEvent.press(getByTestId('rerender'))
95
+ expect(getByTestId('output')).toHaveTextContent(
96
+ '{"0":{"start":0,"end":200},"1":{"start":250,"end":350}}'
97
+ )
98
+ })
99
+ it('does not cause a rerender from onLayout events alone', async () => {
100
+ const { getByTestId } = render(<MockComponent />)
101
+
102
+ expect(getByTestId('output')).toHaveTextContent('{}')
103
+ await fireEvent(getByTestId('onlayout[0]'), 'layout', {
104
+ nativeEvent: {
105
+ layout: {
106
+ width: 200,
107
+ x: 0
108
+ }
109
+ }
110
+ })
111
+ await fireEvent(getByTestId('onlayout[1]'), 'layout', {
112
+ nativeEvent: {
113
+ layout: {
114
+ width: 100,
115
+ x: 250
116
+ }
117
+ }
118
+ })
119
+ expect(getByTestId('output')).toHaveTextContent('{}')
120
+ })
121
+ })
122
+
123
+ describe('useItemPositions', () => {
124
+ // Again we're limited in what we can test; we can't test natural onLayout
125
+ // or page load timing, but we can affirm that calling `setIsReady` after layout
126
+ // events causes a re-render that can access positions data
127
+ const IsReadyMockComponent = () => {
128
+ const [{ positions, setIsReady }] = useItemPositions()
129
+ return (
130
+ <View testID="container" onLayout={setIsReady}>
131
+ <View testID="onlayout[0]" onLayout={getItemPositionLayoutHandler(positions, 0)} />
132
+ <View testID="onlayout[1]" onLayout={getItemPositionLayoutHandler(positions, 1)} />
133
+ <Text testID="output">{JSON.stringify(positions)}</Text>
134
+ </View>
135
+ )
136
+ }
137
+ it('causes a rerender when setIsReady is called', async () => {
138
+ const { getByTestId } = render(<IsReadyMockComponent />)
139
+
140
+ expect(getByTestId('output')).toHaveTextContent('{}')
141
+ await fireEvent(getByTestId('onlayout[0]'), 'layout', {
142
+ nativeEvent: {
143
+ layout: {
144
+ width: 200,
145
+ x: 0
146
+ }
147
+ }
148
+ })
149
+ await fireEvent(getByTestId('onlayout[1]'), 'layout', {
150
+ nativeEvent: {
151
+ layout: {
152
+ width: 100,
153
+ x: 250
154
+ }
155
+ }
156
+ })
157
+ await fireEvent(getByTestId('container'), 'layout', {
158
+ nativeEvent: { layout: {} }
159
+ })
160
+
161
+ expect(getByTestId('output')).toHaveTextContent(
162
+ '{"0":{"start":0,"end":200},"1":{"start":250,"end":350}}'
163
+ )
164
+ })
165
+ })
166
+
167
+ describe('Tabs', () => {
168
+ const items = [{ label: 'one' }, { label: 'two' }, { label: 'three' }, { label: 'four' }]
169
+ const linkItems = items.map((item) => ({ ...item, href: 'https://telus.com' }))
170
+
171
+ it('renders a menu', () => {
172
+ const { queryAllByA11yRole } = render(<Tabs items={items} />, { wrapper: Theme })
173
+ expect(queryAllByA11yRole('tablist')).toHaveLength(1)
174
+ })
175
+
176
+ it('renders menuitems by default', () => {
177
+ const { queryAllByA11yRole } = render(<Tabs items={items} />, { wrapper: Theme })
178
+ expect(queryAllByA11yRole('tab')).toHaveLength(4)
179
+ expect(queryAllByA11yRole('link')).toHaveLength(0)
180
+ })
181
+
182
+ it('renders links by if hrefs are passed', () => {
183
+ const { queryAllByA11yRole } = render(<Tabs items={linkItems} />, { wrapper: Theme })
184
+ expect(queryAllByA11yRole('tab')).toHaveLength(0)
185
+ expect(queryAllByA11yRole('link')).toHaveLength(4)
186
+ })
187
+
188
+ it('is selected when pressed', () => {
189
+ const { queryByA11yState, getByText } = render(<Tabs items={items} />, { wrapper: Theme })
190
+ let selected
191
+ selected = queryByA11yState({ selected: true })
192
+ expect(selected).toBeFalsy()
193
+
194
+ fireEvent.press(getByText('two'))
195
+
196
+ selected = queryByA11yState({ selected: true })
197
+ expect(selected).toBeTruthy()
198
+ expect(selected).toHaveTextContent('two')
199
+ })
200
+ })
@@ -0,0 +1,328 @@
1
+ import React from 'react'
2
+ import { render, fireEvent } from '@testing-library/react-native'
3
+ import { toHaveTextContent } from '@testing-library/jest-native'
4
+
5
+ import Theme from '../../__fixtures__/Theme'
6
+ import Tags from '../../src/Tags'
7
+
8
+ const items = [
9
+ { label: 'One', id: 'one', accessibilityLabel: 'Option one' },
10
+ { label: 'Two', id: 'two', accessibilityLabel: 'Option two' },
11
+ { label: 'Three', id: 'three', accessibilityLabel: 'Option three' },
12
+ { label: 'Four', id: 'four', accessibilityLabel: 'Option four' }
13
+ ]
14
+ const checked = { checked: true }
15
+
16
+ // expect().toHaveTextContent doesn't work on arrays, expect().toContain etc doesn't match elements
17
+ const containsText = (queryResult, text) =>
18
+ queryResult.some((testInstance) => toHaveTextContent(testInstance, text).pass)
19
+
20
+ describe('Tags', () => {
21
+ // eslint-disable-next-line no-console
22
+ const consoleError = console.error
23
+ beforeEach(() => {
24
+ // eslint-disable-next-line no-console
25
+ console.error = () => {}
26
+ })
27
+ afterEach(() => {
28
+ // eslint-disable-next-line no-console
29
+ console.error = consoleError
30
+ })
31
+
32
+ it('Throws if has `values` without `onChange`', () => {
33
+ expect(() =>
34
+ render(
35
+ <Theme>
36
+ <Tags items={items} values={['one']} />
37
+ </Theme>
38
+ )
39
+ ).toThrow(/values.+without.+onChange/)
40
+ })
41
+ it("Doesn't throw if has `values` without `onChange` and is read only", () => {
42
+ expect(() =>
43
+ render(
44
+ <Theme>
45
+ <Tags items={items} values={['one']} readOnly />
46
+ </Theme>
47
+ )
48
+ ).not.toThrow()
49
+ })
50
+ it('Throws if has both `values` and `initialValues`', () => {
51
+ expect(() =>
52
+ render(
53
+ <Theme>
54
+ <Tags items={items} values={['one']} initialValues={['one']} onChange={() => {}} />
55
+ </Theme>
56
+ )
57
+ ).toThrow(/both(?=.*initialValues)(?=.*values){2}/)
58
+ })
59
+ })
60
+
61
+ describe('Tags (uncontrolled)', () => {
62
+ // These tests are almost the same as ButtonGroup while Tags-specific behaviours are still TBC
63
+ it('Selects one and only one item if maxValues is passed', async () => {
64
+ const { getByText, queryAllByA11yState } = render(
65
+ <Theme>
66
+ <Tags items={items} maxValues={1} />
67
+ </Theme>
68
+ )
69
+
70
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
71
+
72
+ const one = getByText('One')
73
+ await fireEvent.press(one)
74
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
75
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
76
+
77
+ const two = getByText('Two')
78
+ await fireEvent.press(two)
79
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
80
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
81
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
82
+ })
83
+
84
+ it('Deselects if the selected item is pressed', async () => {
85
+ const { getByText, queryAllByA11yState } = render(
86
+ <Theme>
87
+ <Tags items={items} />
88
+ </Theme>
89
+ )
90
+
91
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
92
+
93
+ const three = getByText('Three')
94
+ await fireEvent.press(three)
95
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
96
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
97
+
98
+ await fireEvent.press(three)
99
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
100
+ expect(containsText(queryAllByA11yState(checked), 'Three')).not.toBeTruthy()
101
+ })
102
+
103
+ it('Selects <= two items when maxValues === 2', async () => {
104
+ const { getByText, queryAllByA11yState } = render(
105
+ <Theme>
106
+ <Tags items={items} maxValues={2} />
107
+ </Theme>
108
+ )
109
+
110
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
111
+
112
+ const one = getByText('One')
113
+ await fireEvent.press(one)
114
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
115
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
116
+
117
+ const two = getByText('Two')
118
+ await fireEvent.press(two)
119
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
120
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
121
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
122
+
123
+ const three = getByText('Three')
124
+ await fireEvent.press(three)
125
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
126
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
127
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
128
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
129
+
130
+ const four = getByText('Four')
131
+ await fireEvent.press(four)
132
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
133
+ expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
134
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
135
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
136
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
137
+ })
138
+
139
+ it('Is accessible as checkboxes by default', async () => {
140
+ const { queryAllByA11yRole, queryAllByA11yState } = render(
141
+ <Theme>
142
+ <Tags items={items} />
143
+ </Theme>
144
+ )
145
+
146
+ expect(queryAllByA11yRole('radiogroup')).toHaveLength(0)
147
+ expect(queryAllByA11yRole('radio')).toHaveLength(0)
148
+
149
+ const checks = queryAllByA11yRole('checkbox')
150
+ expect(checks).toHaveLength(4)
151
+
152
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
153
+ await fireEvent.press(checks[0])
154
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
155
+ })
156
+
157
+ it('Selects unlimited items by default', async () => {
158
+ const { getByText, queryAllByA11yState } = render(
159
+ <Theme>
160
+ <Tags items={items} />
161
+ </Theme>
162
+ )
163
+
164
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
165
+
166
+ const one = getByText('One')
167
+ await fireEvent.press(one)
168
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
169
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
170
+
171
+ const two = getByText('Two')
172
+ await fireEvent.press(two)
173
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
174
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
175
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
176
+
177
+ const three = getByText('Three')
178
+ await fireEvent.press(three)
179
+ expect(queryAllByA11yState(checked)).toHaveLength(3)
180
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
181
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
182
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
183
+
184
+ const four = getByText('Four')
185
+ await fireEvent.press(four)
186
+ expect(queryAllByA11yState(checked)).toHaveLength(4)
187
+ expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
188
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
189
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
190
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
191
+ })
192
+
193
+ it('Auto-selects any provided initialValues', async () => {
194
+ const { getByText, queryAllByA11yState } = render(
195
+ <Theme>
196
+ <Tags items={items} initialValues={['one', 'two']} maxValues={3} />
197
+ </Theme>
198
+ )
199
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
200
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
201
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
202
+
203
+ const three = getByText('Three')
204
+ await fireEvent.press(three)
205
+
206
+ expect(queryAllByA11yState(checked)).toHaveLength(3)
207
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
208
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
209
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
210
+
211
+ const four = getByText('Four')
212
+ await fireEvent.press(four)
213
+ expect(queryAllByA11yState(checked)).toHaveLength(3)
214
+ expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
215
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
216
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
217
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
218
+
219
+ const two = getByText('Two')
220
+ await fireEvent.press(two)
221
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
222
+ expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
223
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
224
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
225
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
226
+ })
227
+ })
228
+
229
+ describe('Tags (controlled)', () => {
230
+ it('Calls onChange handler on press in controlled mode, providing pressed id', async () => {
231
+ const handleChange = jest.fn((arg) => arg)
232
+ const { getByText } = render(
233
+ <Theme>
234
+ <Tags items={items} values={[]} onChange={handleChange} />
235
+ </Theme>
236
+ )
237
+
238
+ expect(handleChange).toHaveBeenCalledTimes(0)
239
+
240
+ const one = getByText('One')
241
+ await fireEvent.press(one)
242
+ expect(handleChange).toHaveBeenCalledTimes(1)
243
+
244
+ expect(handleChange.mock.calls[0][0]).toEqual(['one'])
245
+
246
+ const two = getByText('Two')
247
+ await fireEvent.press(two)
248
+ expect(handleChange).toHaveBeenCalledTimes(2)
249
+ expect(handleChange.mock.calls[1][0]).toEqual(['two'])
250
+ })
251
+
252
+ it("Doesn't change its own selection if `values` is passed", async () => {
253
+ const { getByText, queryAllByA11yState } = render(
254
+ <Theme>
255
+ <Tags items={items} values={['one']} onChange={() => {}} />
256
+ </Theme>
257
+ )
258
+
259
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
260
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
261
+
262
+ const one = getByText('One')
263
+ await fireEvent.press(one)
264
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
265
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
266
+
267
+ const two = getByText('Two')
268
+ await fireEvent.press(two)
269
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
270
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
271
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
272
+ })
273
+
274
+ it('Does not render an invalid `values` invalidly', async () => {
275
+ const { queryAllByA11yState } = render(
276
+ <Theme>
277
+ <Tags items={items} values={['one', 'two', 'three']} maxValues={2} onChange={() => {}} />
278
+ </Theme>
279
+ )
280
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
281
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
282
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
283
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
284
+ })
285
+ })
286
+
287
+ describe('Tags (read-only)', () => {
288
+ it("Doesn't call onChange handler when read-only", async () => {
289
+ const handleChange = jest.fn((arg) => arg)
290
+ const { getByText } = render(
291
+ <Theme>
292
+ <Tags items={items} values={[]} onChange={handleChange} readOnly />
293
+ </Theme>
294
+ )
295
+
296
+ expect(handleChange).toHaveBeenCalledTimes(0)
297
+
298
+ const one = getByText('One')
299
+ await fireEvent.press(one)
300
+ expect(handleChange).toHaveBeenCalledTimes(0)
301
+
302
+ const two = getByText('Two')
303
+ await fireEvent.press(two)
304
+ expect(handleChange).toHaveBeenCalledTimes(0)
305
+ })
306
+
307
+ it("Doesn't change its selection on press", async () => {
308
+ const { getByText, queryAllByA11yState } = render(
309
+ <Theme>
310
+ <Tags items={items} values={['one']} readOnly />
311
+ </Theme>
312
+ )
313
+
314
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
315
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
316
+
317
+ const one = getByText('One')
318
+ await fireEvent.press(one)
319
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
320
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
321
+
322
+ const two = getByText('Two')
323
+ await fireEvent.press(two)
324
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
325
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
326
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
327
+ })
328
+ })
@@ -0,0 +1,34 @@
1
+ import React from 'react'
2
+ import { fireEvent, render } from '@testing-library/react-native'
3
+
4
+ import { Platform } from 'react-native'
5
+ import { TextArea } from '../../src'
6
+ import Theme from '../../__fixtures__/Theme'
7
+
8
+ describe('TextArea', () => {
9
+ it('renders', () => {
10
+ // at least one called test is required in a suite
11
+ render(<TextArea />, { wrapper: Theme })
12
+ })
13
+
14
+ // TODO: this won't be called until cross-platform Jest tests are configured
15
+ // see https://github.com/telus/universal-design-system/issues/319
16
+ if (Platform.OS === 'web') {
17
+ it('grows in size on input', () => {
18
+ const { getByTestId } = render(
19
+ <TextArea tokens={{ minLines: 1, maxLines: 5, lineHeight: 20 }} testID="textarea" />,
20
+ {
21
+ wrapper: Theme
22
+ }
23
+ )
24
+
25
+ const textarea = getByTestId('textarea')
26
+
27
+ expect(textarea).toHaveStyle({ height: 20 })
28
+
29
+ fireEvent.changeText(textarea, '\n\n\n')
30
+
31
+ expect(textarea).toHaveStyle({ height: 60 })
32
+ })
33
+ }
34
+ })
@@ -1,9 +1,8 @@
1
- import React from 'react'
2
1
  import { fireEvent, render } from '@testing-library/react-native'
3
-
4
- import { TextInput } from '../../src'
5
- import Theme from '../../__fixtures__/Theme'
2
+ import React from 'react'
3
+ import TextInputBase from '../../src/TextInput/TextInputBase'
6
4
  import Viewport from '../../__fixtures__/Viewport'
5
+ import Theme from '../../__fixtures__/Theme'
7
6
 
8
7
  // eslint-disable-next-line react/prop-types
9
8
  const Wrapper = ({ children }) => (
@@ -12,40 +11,7 @@ const Wrapper = ({ children }) => (
12
11
  </Viewport>
13
12
  )
14
13
 
15
- describe('TextInput', () => {
16
- it('renders the label', () => {
17
- const { queryByText } = render(<TextInput label="Test label content" />, { wrapper: Wrapper })
18
-
19
- expect(queryByText('Test label content')).toBeTruthy()
20
- })
21
-
22
- it('renders the hint', () => {
23
- const { queryByText } = render(
24
- <TextInput label="Test label content" hint="Test hint content" />,
25
- { wrapper: Wrapper }
26
- )
27
-
28
- expect(queryByText('Test hint content')).toBeTruthy()
29
- })
30
-
31
- it('renders the feedback', () => {
32
- const { queryByText } = render(<TextInput feedback="Test feedback content" />, {
33
- wrapper: Wrapper
34
- })
35
-
36
- expect(queryByText('Test feedback content')).toBeTruthy()
37
- })
38
-
39
- it('renders the tooltip', () => {
40
- const { queryByText } = render(
41
- <TextInput label="Test label content" tooltip="Test tooltip content" />,
42
- { wrapper: Wrapper }
43
- )
44
-
45
- // TODO: check for either the actual content or accessible text when the Tooltip is rendered
46
- expect(queryByText('?')).toBeTruthy()
47
- })
48
-
14
+ describe('TextInputBaseBase', () => {
49
15
  it('triggers the interactive callbacks', () => {
50
16
  const onFocus = jest.fn()
51
17
  const onBlur = jest.fn()
@@ -53,8 +19,8 @@ describe('TextInput', () => {
53
19
  const onMouseOut = jest.fn()
54
20
 
55
21
  const { getByA11yLabel } = render(
56
- <TextInput
57
- label="Input label"
22
+ <TextInputBase
23
+ accessibilityLabel="Input label"
58
24
  onFocus={onFocus}
59
25
  onBlur={onBlur}
60
26
  onMouseOver={onMouseOver}
@@ -85,7 +51,7 @@ describe('TextInput', () => {
85
51
  })
86
52
 
87
53
  it("can't be edited when inactive", () => {
88
- const { getByA11yLabel } = render(<TextInput label="Input label" inactive />, {
54
+ const { getByA11yLabel } = render(<TextInputBase accessibilityLabel="Input label" inactive />, {
89
55
  wrapper: Wrapper
90
56
  })
91
57
 
@@ -97,9 +63,12 @@ describe('TextInput', () => {
97
63
  it('changes value when uncontrolled', () => {
98
64
  const onChange = jest.fn()
99
65
 
100
- const { getByA11yLabel } = render(<TextInput label="Input label" onChange={onChange} />, {
101
- wrapper: Wrapper
102
- })
66
+ const { getByA11yLabel } = render(
67
+ <TextInputBase accessibilityLabel="Input label" onChange={onChange} />,
68
+ {
69
+ wrapper: Wrapper
70
+ }
71
+ )
103
72
 
104
73
  const input = getByA11yLabel('Input label')
105
74
 
@@ -113,7 +82,7 @@ describe('TextInput', () => {
113
82
  const onChange = jest.fn()
114
83
 
115
84
  const { getByA11yLabel } = render(
116
- <TextInput label="Input label" onChange={onChange} value="initial value" />,
85
+ <TextInputBase accessibilityLabel="Input label" onChange={onChange} value="initial value" />,
117
86
  {
118
87
  wrapper: Wrapper
119
88
  }
@@ -131,7 +100,12 @@ describe('TextInput', () => {
131
100
  const onChange = jest.fn()
132
101
 
133
102
  const { getByA11yLabel } = render(
134
- <TextInput label="Input label" onChange={onChange} value="initial value" readOnly />,
103
+ <TextInputBase
104
+ accessibilityLabel="Input label"
105
+ onChange={onChange}
106
+ value="initial value"
107
+ readOnly
108
+ />,
135
109
  {
136
110
  wrapper: Wrapper
137
111
  }