@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
@@ -0,0 +1,108 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { Pressable, StyleSheet } from 'react-native'
4
+
5
+ import { useThemeTokensCallback } from '../ThemeProvider'
6
+ import {
7
+ resolvePressableTokens,
8
+ selectTokens,
9
+ variantProp,
10
+ getTokensPropType,
11
+ useCopy,
12
+ copyPropTypes,
13
+ a11yProps
14
+ } from '../utils'
15
+ import Icon from '../Icon'
16
+ import Typography from '../Typography'
17
+ import dictionary from './dictionary'
18
+
19
+ const selectButtonStyles = (
20
+ { borderRadius, backgroundColor, borderColor, borderWidth, padding },
21
+ direction
22
+ ) => [
23
+ staticStyles.absolute,
24
+ staticStyles[direction],
25
+ {
26
+ borderRadius,
27
+ backgroundColor,
28
+ borderColor,
29
+ borderWidth,
30
+ padding
31
+ }
32
+ ]
33
+
34
+ /**
35
+ * Button within a Tabs component showing users that content is available to the left or
36
+ * right, scrolling a screen's worth of content left or right when pressed.
37
+ *
38
+ * This is rendered automatically by `Tabs` and isn't intended be used directly.
39
+ *
40
+ * @TODO when IconButton is complete and stable revisit this and update interaction state styles.
41
+ */
42
+ const HorizontalScrollButton = ({
43
+ direction = 'next',
44
+ icon,
45
+ onPress,
46
+ offset,
47
+ variant,
48
+ tokens,
49
+ copy
50
+ }) => {
51
+ const getTokens = useThemeTokensCallback('HorizontalScrollButton', tokens, variant)
52
+ const resolveButtonTokens = (pressableState) => resolvePressableTokens(getTokens, pressableState)
53
+ const getPressableStyle = (pressableState) => [
54
+ selectButtonStyles(resolveButtonTokens(pressableState), direction),
55
+ { marginTop: -1 * (offset || 0) }
56
+ ]
57
+
58
+ const getCopy = useCopy({ dictionary, copy })
59
+ const label = direction === 'previous' ? getCopy('previousText') : getCopy('nextText')
60
+
61
+ return (
62
+ <Pressable
63
+ style={getPressableStyle}
64
+ onPress={onPress}
65
+ accessibilityLabel={label}
66
+ accessibilityRole="button"
67
+ // For keyboard-tab or screenreader-swipe navigation, users can just go through all items
68
+ {...a11yProps.nonFocusableProps}
69
+ >
70
+ {(pressableState) => {
71
+ const iconTokens = selectTokens('Icon', resolveButtonTokens(pressableState), 'icon')
72
+ return icon ? (
73
+ <Icon icon={icon} tokens={iconTokens} />
74
+ ) : (
75
+ <Typography
76
+ tokens={{ fontSize: iconTokens.size, lineHeight: 1, color: iconTokens.color }}
77
+ >
78
+ {direction === 'next' ? '→' : '←'}
79
+ </Typography>
80
+ )
81
+ }}
82
+ </Pressable>
83
+ )
84
+ }
85
+
86
+ const staticStyles = StyleSheet.create({
87
+ absolute: {
88
+ position: 'absolute'
89
+ },
90
+ previous: {
91
+ left: 0
92
+ },
93
+ next: {
94
+ right: 0
95
+ }
96
+ })
97
+
98
+ HorizontalScrollButton.propTypes = {
99
+ tokens: getTokensPropType('HorizontalScrollButton'),
100
+ variant: variantProp.propType,
101
+ copy: copyPropTypes,
102
+ direction: PropTypes.oneOf(['previous', 'next']),
103
+ offset: PropTypes.number,
104
+ icon: PropTypes.elementType,
105
+ onPress: PropTypes.func.isRequired
106
+ }
107
+
108
+ export default HorizontalScrollButton
@@ -0,0 +1,53 @@
1
+ import React, { forwardRef, useCallback, useEffect } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { ScrollView } from 'react-native'
4
+ import debounce from 'lodash.debounce'
5
+
6
+ const DEBOUNCE_MS = 100
7
+
8
+ /**
9
+ * A wrapper for ScrollView that supports an `onScrollEnd` function.
10
+ *
11
+ * React Native Web hasn't got around to implementing any scroll end handlers yet,
12
+ * so we need to work around it with debouncing on `onScroll`. See:
13
+ * https://github.com/necolas/react-native-web/issues/1021
14
+ */
15
+ const ScrollViewEnd = forwardRef(({ onScrollEnd, onScroll, ...props }, ref) => {
16
+ // Return debounced function directly from useCallback so it has .cancel method etc.
17
+ // Linter complains this stops it automatically scanning the deps, but we can check them manually.
18
+ // eslint-disable-next-line react-hooks/exhaustive-deps
19
+ const debounceScrollEnd = useCallback(
20
+ debounce((event) => onScrollEnd(event), DEBOUNCE_MS),
21
+ [onScrollEnd]
22
+ )
23
+
24
+ // Call any onScroll handler immediately, and any onScrollEnd handler after 100ms of no scrolling
25
+ const handleScroll = (event) => {
26
+ if (typeof onScroll === 'function') onScroll(event)
27
+ if (typeof onScrollEnd === 'function') debounceScrollEnd(event)
28
+ }
29
+
30
+ // Cancel any lingering debounce timeouts on dismount
31
+ useEffect(() => debounceScrollEnd.cancel)
32
+
33
+ return (
34
+ <ScrollView
35
+ ref={ref}
36
+ {...props}
37
+ onScroll={handleScroll}
38
+ scrollEventThrottle={DEBOUNCE_MS / 2}
39
+ />
40
+ )
41
+ })
42
+ ScrollViewEnd.displayName = 'ScrollViewEnd'
43
+
44
+ ScrollViewEnd.propTypes = {
45
+ onScrollEnd: PropTypes.func.isRequired,
46
+ onScroll: PropTypes.func
47
+ }
48
+
49
+ ScrollViewEnd.defaultProps = {
50
+ onScroll: null
51
+ }
52
+
53
+ export default ScrollViewEnd
@@ -0,0 +1,24 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { ScrollView } from 'react-native'
4
+
5
+ /**
6
+ * A wrapper for ScrollView that supports an `onScrollEnd` function.
7
+ *
8
+ * React Native has two scroll end handlers, we want to treat them both the same.
9
+ */
10
+ const ScrollViewEnd = forwardRef(({ onScrollEnd, ...props }, ref) => (
11
+ <ScrollView
12
+ ref={ref}
13
+ {...props}
14
+ onScrollEndDrag={onScrollEnd}
15
+ onMomentumScrollEnd={onScrollEnd}
16
+ />
17
+ ))
18
+ ScrollViewEnd.displayName = 'ScrollViewEnd'
19
+
20
+ ScrollViewEnd.propTypes = {
21
+ onScrollEnd: PropTypes.func.isRequired
22
+ }
23
+
24
+ export default ScrollViewEnd
@@ -0,0 +1,11 @@
1
+ export default {
2
+ en: {
3
+ // English text from TDS Community `Tabs`
4
+ previousLabel: 'Move menu to the left',
5
+ nextLabel: 'Move menu to the right'
6
+ },
7
+ fr: {
8
+ previousLabel: 'Déplacer le menu vers la gauche',
9
+ nextLabel: 'Déplacer le menu vers la droite'
10
+ }
11
+ }
@@ -0,0 +1,17 @@
1
+ import HorizontalScroll, { selectHorizontalScrollTokens } from './HorizontalScroll'
2
+ import {
3
+ useItemPositions,
4
+ getItemPositionScrollTarget,
5
+ getItemPositionLayoutHandler,
6
+ itemPositionsPropType
7
+ } from './itemPositions'
8
+
9
+ export default HorizontalScroll
10
+ export { default as HorizontalScrollButton } from './HorizontalScrollButton'
11
+ export const horizontalScrollUtils = {
12
+ selectHorizontalScrollTokens,
13
+ useItemPositions,
14
+ getItemPositionScrollTarget,
15
+ getItemPositionLayoutHandler,
16
+ itemPositionsPropType
17
+ }
@@ -0,0 +1,101 @@
1
+ import { useRef, useState } from 'react'
2
+ import PropTypes from 'prop-types'
3
+
4
+ // Utilities to assist scrolling a parent so that it snaps neatly to an appropriate child.
5
+
6
+ /**
7
+ * @typedef ItemPositionPosition
8
+ * @property {number} [ItemPositionItem.start] - optional theme scale variants e.g. compact, wide
9
+ * @property {number} [ItemPositionItem.end] - optional override to force a particular pixel size
10
+ *
11
+ * @typedef {Object.<number, ItemPositionItem>} ItemPositionPositions - ref object of start/end coordinates
12
+ *
13
+ * @typedef ItemPositions
14
+ * @property {number} ItemPositions.contentWidth - current width of potentially-overflowing content inside scrollable
15
+ * @property {number} ItemPositions.containerWidth - current width of non-overflowing outer scroll container
16
+ * @property {number} ItemPositions.scrollOffset - current x position of the left edge of the visible section of the scrollable content
17
+ * @property {ItemPositionPositions} ItemPositions.positions - `{ start, end }` coordinates of each scrollable content item, by index
18
+ * @property {(targetX: number) => void)} ItemPositions.scrollTo - function to scroll to a co-ordinate, applying scrolling logic
19
+ * @property {() => void)} ItemPositions.setIsReady - function to call when layout has been calculated and itemPositions data is ready
20
+ */
21
+
22
+ /**
23
+ * Takes a desired scroll target coordinate and returns a valid coordinate
24
+ * that, when not scrolling to one end or another, snaps to the start of an item,
25
+ * making sure any "scroll back" button doesn't overlap the first item.
26
+ *
27
+ * @param {number} x - the intended coordinate to scroll to
28
+ * @param {number} scrollMax - the highest posible coordinate to scroll to
29
+ * @param {ItemPositionPositions} positions - positions list from `useItemPositions` ref
30
+ * @param {number} [buttonClearance] - offset to allow space for a button
31
+ * @returns {number}
32
+ */
33
+ export const getItemPositionScrollTarget = (x, scrollMax, positions, buttonClearance = 0) => {
34
+ if (x <= 0) return 0
35
+ if (x >= scrollMax) return scrollMax
36
+
37
+ // If not scrolling all the way to the start or end, stop
38
+ // where the first item is not coverred by the scroll previous button
39
+ const targetItem = Object.values(positions).find(({ start, end }) => start <= x && end > x)
40
+
41
+ // If there's no target item we're landing at a gap between items
42
+ const targetX = targetItem ? targetItem.start : x
43
+ return Math.max(0, targetX - buttonClearance)
44
+ }
45
+
46
+ /**
47
+ * Returns a handler for React Native's `onLayout` which updates the values of
48
+ * the ref object returned from `useItemPositions`.
49
+ *
50
+ * @param {ItemPositionPositions} positions
51
+ * @param {number} index
52
+ * @returns {function}
53
+ */
54
+ export const getItemPositionLayoutHandler = (positions, index) => {
55
+ const handleLayout = ({
56
+ nativeEvent: {
57
+ layout: { width, x }
58
+ }
59
+ }) => {
60
+ /* eslint-disable-next-line no-param-reassign */
61
+ positions[index] = { start: x, end: x + width }
62
+ }
63
+ return handleLayout
64
+ }
65
+
66
+ /**
67
+ * Wrapper for `useRef` which gives a mutable object in which item start/end coordinates,
68
+ * scrollTo method and content/container widths may be set and updated without causing a re-render.
69
+ *
70
+ * @returns {[ItemPositions, isReady: bool]} tuple array of:
71
+ * - current ref object `{ positions, contentWidth, containerWidth, scrollOffset, scrollTo, setIsReady }`
72
+ * - boolean that updates to `true` (causing a re-render) after the first time `setIsReady` is called
73
+ */
74
+ export const useItemPositions = () => {
75
+ const [isReady, setIsReady] = useState(false)
76
+ return [
77
+ useRef({
78
+ positions: {},
79
+ scrollTo: () => {},
80
+ contentWidth: 0,
81
+ containerWidth: 0,
82
+ scrollOffset: 0,
83
+ setIsReady
84
+ }).current,
85
+ isReady
86
+ ]
87
+ }
88
+
89
+ /**
90
+ * PropType for the ref object returned by `useItemPositions`
91
+ */
92
+ export const itemPositionsPropType = PropTypes.exact({
93
+ positions: PropTypes.objectOf(
94
+ PropTypes.shape({ start: PropTypes.number, end: PropTypes.number })
95
+ ),
96
+ scrollTo: PropTypes.func,
97
+ contentWidth: PropTypes.number,
98
+ containerWidth: PropTypes.number,
99
+ scrollOffset: PropTypes.number,
100
+ setIsReady: PropTypes.func
101
+ })
package/src/Icon/Icon.jsx CHANGED
@@ -3,23 +3,34 @@ import { Platform, View } from 'react-native'
3
3
  import PropTypes from 'prop-types'
4
4
 
5
5
  import { useThemeTokens } from '../ThemeProvider'
6
- import { getTokensPropType, variantProp } from '../utils/propTypes'
6
+ import { getTokensPropType, scaleWithText, variantProp } from '../utils'
7
7
 
8
- const Icon = ({ IconSvg, variant, label, titleId, tokens = {} }) => {
8
+ const Icon = ({
9
+ icon: IconComponent,
10
+ accessibilityLabel,
11
+ variant,
12
+ tokens,
13
+ scalesWithText = false
14
+ }) => {
9
15
  const themeTokens = useThemeTokens('Icon', tokens, variant)
16
+
17
+ const size = scalesWithText ? scaleWithText(themeTokens.size) : themeTokens.size
18
+
10
19
  const iconContent = (
11
- <IconSvg title={label} titleId={titleId} size={themeTokens.size} color={themeTokens.color} />
20
+ <IconComponent title={accessibilityLabel} size={size} color={themeTokens.color} />
12
21
  )
13
22
 
14
23
  return Platform.OS === 'web' ? (
15
24
  <View
16
25
  // eslint-disable-next-line react-native/no-inline-styles
17
26
  style={{
18
- // TODO: https://github.com/telus/universal-design-system/issues/487
19
- transition: 'transform 200ms',
27
+ // TODO: systematise animations.
28
+ // https://github.com/telus/universal-design-system/issues/487
29
+ transition: 'transform 200ms, color 200ms',
20
30
  transform: [
21
31
  themeTokens.scale ? `scale(${themeTokens.scale})` : '',
22
- themeTokens.translateX ? `translateX(${themeTokens.translateX}px)` : ''
32
+ themeTokens.translateX ? `translateX(${themeTokens.translateX}px)` : '',
33
+ themeTokens.translateY ? `translateY(${themeTokens.translateY}px)` : ''
23
34
  ]
24
35
  .filter((exists) => exists)
25
36
  .join(' ')
@@ -32,41 +43,26 @@ const Icon = ({ IconSvg, variant, label, titleId, tokens = {} }) => {
32
43
  )
33
44
  }
34
45
 
35
- // Auto-generated SVG icon components wrap Icon and pass through these props:
36
46
  export const iconComponentPropTypes = {
37
47
  variant: variantProp.propType,
38
48
  tokens: getTokensPropType('Icon'),
39
49
  /**
40
50
  * Descriptive label used in web SVG title tag for accessibility
41
51
  */
42
- label: PropTypes.string,
43
- /**
44
- * On web, this unique id is applied to <SVG> title and aria-labelledby attr
45
- */
46
- titleId: PropTypes.string
47
- }
48
-
49
- // Auto-generated SVG icon components contain an inner SVG component taking these props:
50
- export const iconSvgPropTypes = {
51
- title: iconComponentPropTypes.label,
52
- titleId: iconComponentPropTypes.titleId,
53
- /**
54
- * The size of the SVG icon after resolving tokens
55
- */
56
- size: PropTypes.number,
52
+ accessibilityLabel: PropTypes.string,
57
53
  /**
58
- * The color of the SVG icon after resolving tokens
54
+ * controls whether the icon size should be proportionate to any accessibility-related font scaling.
59
55
  */
60
- color: PropTypes.string
56
+ scalesWithText: PropTypes.bool
61
57
  }
62
58
 
63
59
  Icon.propTypes = {
64
60
  ...iconComponentPropTypes,
65
61
  /**
66
- * Function component containing this icon's SVG or native equivalent.
67
- * UDS's SVGR config turns static SVG files into components that pass this to <Icon>.
62
+ * A valid UDS icon component imported from a UDS palette
63
+ * (e.g.) `import { MyIcon } from @telus-uds/palette-<brand>/build/web/icons`
68
64
  */
69
- IconSvg: PropTypes.func.isRequired
65
+ icon: PropTypes.elementType.isRequired
70
66
  }
71
67
 
72
68
  export default Icon
@@ -0,0 +1,63 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { Platform, View } from 'react-native'
4
+
5
+ import Icon, { iconComponentPropTypes } from './Icon'
6
+ import { getStackedContent } from '../StackView'
7
+ import { spacingProps } from '../utils'
8
+
9
+ /**
10
+ * Returns an icon and some text with a sized gap between them. This is a utility component
11
+ * intended for use when creating components, not intended for use in applications on its own.
12
+ *
13
+ * IconText does not wrap its children, so should be used either:
14
+ * - inline within a <Text> element
15
+ * - within a container with `flexDirection: 'row'`
16
+ */
17
+ const IconText = ({ space, iconPosition = 'left', icon: IconComponent, iconProps, children }) => {
18
+ const iconContent = IconComponent && <Icon icon={IconComponent} scalesWithText {...iconProps} />
19
+
20
+ // Inline images on Android are always baseline-aligned which makes them look misaligned - offset it.
21
+ // See abandoned issue https://github.com/facebook/react-native/issues/6529
22
+ const size = iconProps?.tokens?.size
23
+ const iconAdjusted =
24
+ Platform.OS === 'android' && iconContent && size ? (
25
+ <View style={{ transform: [{ translateY: size * 0.2 }] }}>{iconContent}</View>
26
+ ) : (
27
+ iconContent
28
+ )
29
+
30
+ return getStackedContent(
31
+ iconPosition === 'left' ? [iconAdjusted, children] : [children, iconAdjusted],
32
+ { space, direction: 'row' }
33
+ )
34
+ }
35
+
36
+ IconText.propTypes = {
37
+ /**
38
+ * Amount of space to separate the text content and icon. Uses the themes's spacing scale
39
+ * (see useSpacingScale for more info).
40
+ */
41
+ space: spacingProps.types.spacingValue,
42
+ /**
43
+ * Whether the icon should be to the left of the content or the right of the content.
44
+ */
45
+ iconPosition: PropTypes.oneOf(['left', 'right']),
46
+ /**
47
+ * A valid UDS icon component imported from a UDS palette.
48
+ */
49
+ icon: PropTypes.func,
50
+ /**
51
+ * Props that will be passed to the icon component. By default the icon's `scalesWithText`
52
+ * prop will be set as "true" so that the icon continues to match the size of the text
53
+ * if users use accessibility settings to increase text size.
54
+ */
55
+ iconProps: PropTypes.exact(iconComponentPropTypes),
56
+ /**
57
+ * Content to be rendered alongside the Icon component. Usually this should be a
58
+ * `<Typography>` component, or a component that renders `<Text>`.
59
+ */
60
+ children: PropTypes.node
61
+ }
62
+
63
+ export default IconText
package/src/Icon/index.js CHANGED
@@ -1,4 +1,5 @@
1
- import Icon, { iconComponentPropTypes, iconSvgPropTypes } from './Icon'
1
+ import Icon, { iconComponentPropTypes } from './Icon'
2
+ import IconText from './IconText'
2
3
 
3
4
  export default Icon
4
- export { iconComponentPropTypes, iconSvgPropTypes }
5
+ export { iconComponentPropTypes, IconText }
@@ -0,0 +1,107 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { Pressable, Platform, StyleSheet, View } from 'react-native'
4
+
5
+ import { applyOuterBorder, useThemeTokensCallback, applyShadowToken } from '../ThemeProvider'
6
+ import {
7
+ variantProp,
8
+ linkProps,
9
+ resolvePressableState,
10
+ hrefAttrsProp,
11
+ getTokensPropType,
12
+ selectTokens
13
+ } from '../utils'
14
+ import { a11yProps } from '../utils/propTypes'
15
+ import Icon from '../Icon'
16
+
17
+ const selectOuterStyle = ({
18
+ backgroundColor,
19
+ borderRadius,
20
+ outerBorderWidth,
21
+ outerBorderColor,
22
+ outerBorderGap,
23
+ shadow
24
+ }) => [
25
+ {
26
+ backgroundColor,
27
+ ...applyShadowToken(shadow),
28
+ ...applyOuterBorder({ borderRadius, outerBorderWidth, outerBorderColor, outerBorderGap }),
29
+ ...Platform.select({ web: { outline: 'none', display: 'inline-flex' } })
30
+ },
31
+ staticStyles.outer
32
+ ]
33
+
34
+ const selectInnerStyle = ({ borderColor, borderWidth = 0, borderRadius, padding = 0 }) => ({
35
+ // Inner borders animate with the icon and should be treated like a themable feature of the icon
36
+ borderColor,
37
+ borderRadius,
38
+ borderWidth,
39
+ padding: Math.max(0, padding - borderWidth) // Stable size as border changes
40
+ })
41
+
42
+ /**
43
+ * A pressable themeless base component that handles pressable states and passes tokens
44
+ * based on these to an outer border and a base Card component. Not intended to be used in
45
+ * apps or sites directly: build themed components on top of this.
46
+ */
47
+ const IconButton = ({
48
+ tokens,
49
+ variant,
50
+ icon: IconComponent,
51
+ href,
52
+ hrefAttrs,
53
+ onPress,
54
+ accessibilityRole = href ? 'link' : 'button',
55
+ ...rest
56
+ }) => {
57
+ const a11y = a11yProps.select({
58
+ ...rest,
59
+ accessibilityRole
60
+ })
61
+ const handlePress = linkProps.handleHref({ href, onPress })
62
+
63
+ const getTokens = useThemeTokensCallback('IconButton', tokens, variant)
64
+ const getOuterStyle = (pressableState) =>
65
+ selectOuterStyle(getTokens(resolvePressableState(pressableState)))
66
+
67
+ return (
68
+ <Pressable
69
+ href={href}
70
+ onPress={handlePress}
71
+ hrefAttrs={hrefAttrs}
72
+ style={getOuterStyle}
73
+ {...a11y}
74
+ >
75
+ {(pressableState) => {
76
+ const themeTokens = getTokens(resolvePressableState(pressableState))
77
+ return (
78
+ <View style={selectInnerStyle(themeTokens)}>
79
+ <Icon
80
+ icon={IconComponent}
81
+ title={a11y.accessibilityLabel}
82
+ tokens={selectTokens('Icon', themeTokens, 'icon')}
83
+ />
84
+ </View>
85
+ )
86
+ }}
87
+ </Pressable>
88
+ )
89
+ }
90
+
91
+ IconButton.propTypes = {
92
+ ...a11yProps.types,
93
+ variant: variantProp.propType,
94
+ tokens: getTokensPropType('IconButton'),
95
+ icon: PropTypes.elementType.isRequired,
96
+ href: PropTypes.string,
97
+ hrefAttrs: PropTypes.shape(hrefAttrsProp.types),
98
+ onPress: PropTypes.func
99
+ }
100
+
101
+ const staticStyles = StyleSheet.create({
102
+ outer: {
103
+ alignSelf: 'flex-start'
104
+ }
105
+ })
106
+
107
+ export default IconButton
@@ -0,0 +1,3 @@
1
+ import IconButton from './IconButton'
2
+
3
+ export default IconButton