@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,81 @@
1
+ /* eslint-disable react-native/no-inline-styles */
2
+ /* eslint-disable react/no-multi-comp */
3
+ import React from 'react'
4
+ import { View, Text } from 'react-native'
5
+
6
+ import { Tooltip, Typography } from '../../lib'
7
+ import { Container } from '../supports'
8
+
9
+ export default {
10
+ title: 'Base/Tooltip',
11
+ component: Tooltip
12
+ }
13
+
14
+ const Template = (args) => <Tooltip {...args} />
15
+
16
+ export const Default = Template.bind({})
17
+ Default.args = {
18
+ content: 'This is a tooltip'
19
+ }
20
+
21
+ export const Positioning = () => (
22
+ <>
23
+ <Typography>Here to preload the fonts</Typography>
24
+ <Container>
25
+ <Tooltip content="position is forced to left" position="left" />
26
+ </Container>
27
+ <Container>
28
+ <Tooltip content="automatically positioned" />
29
+ </Container>
30
+ <Container>
31
+ <View style={{ alignSelf: 'center', marginRight: 140 }}>
32
+ <Tooltip content="position is forced to below" position="below" />
33
+ </View>
34
+ </Container>
35
+ <Container>
36
+ <View style={{ alignSelf: 'center' }}>
37
+ <Tooltip
38
+ content="(automatically positioned) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam
39
+ luctus sapien in felis auctor commodo. Mauris sagittis, lorem eu rhoncus mattis, mi erat
40
+ mollis lectus, in ornare"
41
+ />
42
+ </View>
43
+ </Container>
44
+ <Container>
45
+ <View style={{ alignSelf: 'center', marginLeft: 140 }}>
46
+ <Tooltip content="automatically positioned" />
47
+ </View>
48
+ </Container>
49
+ <Container>
50
+ <View style={{ alignSelf: 'flex-end' }}>
51
+ <Tooltip content="automatically positioned automatically positioned" />
52
+ </View>
53
+ </Container>
54
+ <Container>
55
+ <View style={{ alignSelf: 'flex-end', marginTop: 500 }}>
56
+ <Tooltip position="right" content="position is forced to right" />
57
+ </View>
58
+ </Container>
59
+ </>
60
+ )
61
+
62
+ export const CustomControl = () => (
63
+ <Tooltip content="Amazing 😍">
64
+ <Text>Tooltip is applied to this text</Text>
65
+ </Tooltip>
66
+ )
67
+
68
+ export const CustomControlFunction = () => (
69
+ <Tooltip content="Tooltip content">
70
+ {(pressableState, variant) => (
71
+ <Text>
72
+ Tooltip is applied to this text (state: {pressableState.hover ? 'hover' : 'default'},
73
+ variant: {variant?.inverse ? 'inverse' : 'none'})
74
+ </Text>
75
+ )}
76
+ </Tooltip>
77
+ )
78
+
79
+ export const ComponentsInContent = () => (
80
+ <Tooltip content={<Typography tokens={{ color: 'white' }}>Typography in content</Typography>} />
81
+ )
@@ -0,0 +1,11 @@
1
+ import React from 'react'
2
+
3
+ import { TooltipButton } from '../../lib'
4
+
5
+ export default {
6
+ title: 'Base/TooltipButton',
7
+ component: TooltipButton
8
+ }
9
+
10
+ export const Default = () => <TooltipButton onPress={() => {}} />
11
+ Default.storyName = 'TooltipButton'
@@ -1,9 +1,11 @@
1
+ /* eslint-disable react/no-multi-comp */
1
2
  import React from 'react'
2
3
 
3
- import { useVariants, Container } from '../supports'
4
- import { Typography as TypographyComponent } from '../../lib'
4
+ import { useVariants, Container, EachParentType, parentTypesParams } from '../supports'
5
+ import { Typography } from '../../lib'
5
6
 
6
- export const Typography = TypographyComponent
7
+ export const Default = (args) => <Typography {...args} />
8
+ Default.storyName = 'Typography'
7
9
 
8
10
  const defaultChildren = 'The quick brown fox jumps over the lazy dog'
9
11
 
@@ -38,3 +40,10 @@ LongTextTypographyVariants.args = {
38
40
  'and what the current screen size is of the window in which this component is being shown.'
39
41
  ]
40
42
  }
43
+
44
+ export const ParentTypes = (args) => (
45
+ <EachParentType componentThemeName="Typography" {...args}>
46
+ {({ label, variant }) => <Typography {...args} variant={variant}>{`${label}. `}</Typography>}
47
+ </EachParentType>
48
+ )
49
+ ParentTypes.parameters = parentTypesParams
@@ -14,7 +14,7 @@ InlineBlockDiv.propTypes = { children: PropTypes.node }
14
14
 
15
15
  const FloatDiv = ({ children }) => (
16
16
  <div>
17
- <div style={{ float: 'right' }}>{children}</div>
17
+ <div style={{ float: 'right', maxWidth: '85%', marginLeft: '10px' }}>{children}</div>
18
18
  <Typography block>
19
19
  Some lengthy text in a paragraph with a block above it containing the components to test,
20
20
  where the block above it has the style "float: right" applied and no other styles, giving the
@@ -1,23 +1,131 @@
1
1
  /* eslint-disable react/no-multi-comp */
2
2
  import React from 'react'
3
3
  import PropTypes from 'prop-types'
4
- import { View, StyleSheet } from 'react-native'
4
+ import { Platform, ScrollView, Text, View, StyleSheet } from 'react-native'
5
+
6
+ // eslint-disable-next-line import/no-extraneous-dependencies
7
+ import * as alliumIcons from '@telus-uds/palette-allium/build/rn/icons'
8
+ // eslint-disable-next-line import/no-extraneous-dependencies
9
+ import * as koodoIcons from '@telus-uds/palette-koodo/build/rn/icons'
10
+ // eslint-disable-next-line import/no-extraneous-dependencies
11
+ import * as pmIcons from '@telus-uds/palette-public-mobile/build/rn/icons'
12
+
5
13
  import { useTheme, getComponentTheme } from '../lib/ThemeProvider'
6
14
  import { Typography } from '../lib'
7
15
  import { containers as platformContainers } from './platform-supports'
8
16
 
9
- const FlexRow = ({ children }) => <View style={styles.row}>{children}</View>
10
- FlexRow.propTypes = { children: PropTypes.node }
17
+ const iconSets = {
18
+ allium: alliumIcons,
19
+ koodo: koodoIcons,
20
+ publicMobile: pmIcons
21
+ }
22
+
23
+ const RowWrap = ({ children }) => <View style={styles.rowWrap}>{children}</View>
24
+ RowWrap.propTypes = { children: PropTypes.node }
25
+
26
+ const RowStretch = ({ children }) => (
27
+ <ScrollView horizontal contentContainerStyle={styles.rowStretch}>
28
+ {children}
29
+ </ScrollView>
30
+ )
31
+ RowStretch.propTypes = { children: PropTypes.node }
32
+
33
+ const ColumnWrap = ({ children }) => (
34
+ <ScrollView
35
+ horizontal
36
+ style={styles.columnWrapContainer}
37
+ contentContainerStyle={styles.columnWrap}
38
+ >
39
+ {children}
40
+ </ScrollView>
41
+ )
42
+ ColumnWrap.propTypes = { children: PropTypes.node }
43
+
44
+ const ColumnStretch = ({ children }) => (
45
+ <View containerStyle={styles.columnStretch}>{children}</View>
46
+ )
47
+ ColumnStretch.propTypes = { children: PropTypes.node }
11
48
 
12
- const FlexColumn = ({ children }) => <View style={styles.column}>{children}</View>
13
- FlexColumn.propTypes = { children: PropTypes.node }
49
+ // TODO: find a way to give Base stories a complete empty SpacingObject for easy editting
50
+ // while giving themed stories a simpler value.
51
+ export const spacingObjectArg = { xs: 1, lg: 3 }
14
52
 
15
53
  export const parentTypes = {
16
- FlexRow,
17
- FlexColumn,
54
+ RowWrap,
55
+ RowStretch,
56
+ ColumnWrap,
57
+ ColumnStretch,
18
58
  ...platformContainers
19
59
  }
20
60
 
61
+ /**
62
+ * React Native (and therefore also React Native Web) components are usually at some level based on
63
+ * `View` and have some default layout styles that are quite different to regular web defaults:
64
+ *
65
+ * - `display: flex` instead of `display: block`
66
+ * - `flexDirection: column` instead of `flexDirection: row` when flex
67
+ * - `position: relative`
68
+ *
69
+ * It's easy to fall into the trap of developing and testing something that works fine in a regular
70
+ * `View` but doesn't work as expected in other common layout containers. This is particularly true
71
+ * for UDS where internally we are devleoping entirely within React Native but many real-world use cases
72
+ * will mix UDS components with regular web HTML elements.
73
+ *
74
+ * The `EachParentType` support component and related `parentTypes` tooling are intended to make it easy
75
+ * to routinely test and demonstrate how UDS components behave in a wide range of parent types.
76
+ *
77
+ * To use it, pass as `children` a render function that takes the following and places them appropriately
78
+ * in a demonstration of your component (be careful to not wrap the component in a `View` or container as
79
+ * that will defeat the point of the exercise!):
80
+ *
81
+ * - `variant` - each theme variant will be rendered as siblings, pass this to the component's `variant` prop.
82
+ * - `label` - this will describe the parent type / variant combination and ideally should be somewhere easy to read
83
+ * inside the component to help users understand what they are looking at.
84
+ * - `index` - the index of the currently rendered component variant (`0` if the component has no variants).
85
+ */
86
+ export const EachParentType = ({ children, componentThemeName, ...args }) => {
87
+ const variants = useVariants(componentThemeName)
88
+ return Object.entries(parentTypes).map(([parentLabel, ParentType]) => (
89
+ <Container key={parentLabel} offWhite>
90
+ <ParentType>
91
+ {variants.map(([key, value, variantLabel], index) => {
92
+ const label = variantLabel ? `${parentLabel}: ${variantLabel}` : parentLabel
93
+ const variant = { ...args.variant, [key]: value }
94
+ return typeof children === 'function' ? children({ label, variant, index }) : children
95
+ })}
96
+ </ParentType>
97
+ </Container>
98
+ ))
99
+ }
100
+
101
+ const parentTypesList = `\`"${Object.keys(parentTypes).join('"`, `"')}"\``
102
+
103
+ export const parentTypesParams = {
104
+ docs: {
105
+ storyDescription: `This tests how this component's variants render in each of the following types of container: ${parentTypesList}.`
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Utility component that takes a render function as its child and runs it for each
111
+ * icon entry in the RN build of the palette of the currently selected theme.
112
+ *
113
+ * If the theme isn't supported or named, it returns a message saying no icons found.
114
+ */
115
+ export const EachIcon = ({ children }) => {
116
+ const theme = useTheme()
117
+ const themeName = theme?.metadata?.name
118
+ const iconSet = iconSets[themeName]
119
+ return iconSet ? (
120
+ Object.entries(iconSet).map((iconEntry) => children(iconEntry))
121
+ ) : (
122
+ <Text>{`No icons found for theme "${themeName}"`}</Text>
123
+ )
124
+ }
125
+ EachIcon.propTypes = {
126
+ children: PropTypes.func
127
+ }
128
+
21
129
  export const Placeholder = ({ margin = false, ...props }) => (
22
130
  <View style={[styles.placeholder, margin && styles.margin]}>
23
131
  <Typography {...props} />
@@ -32,17 +140,29 @@ export const Container = ({
32
140
  padding = 8,
33
141
  dark = false,
34
142
  offWhite = false,
143
+ borderWidth,
144
+ style,
35
145
  children
36
146
  }) => (
37
- <View style={[{ margin, padding }, dark && styles.dark, offWhite && styles.offWhite]}>
147
+ <View
148
+ style={[
149
+ { margin, padding },
150
+ dark && styles.dark,
151
+ offWhite && styles.offWhite,
152
+ { borderWidth },
153
+ style
154
+ ]}
155
+ >
38
156
  {children}
39
157
  </View>
40
158
  )
41
159
  Container.propTypes = {
42
160
  margin: PropTypes.number,
43
161
  padding: PropTypes.number,
162
+ borderWidth: PropTypes.number,
44
163
  dark: PropTypes.bool,
45
164
  offWhite: PropTypes.bool,
165
+ style: PropTypes.object,
46
166
  children: PropTypes.node
47
167
  }
48
168
 
@@ -53,6 +173,8 @@ const getVariantLabel = (key, value) => `${key}${typeof value === 'string' ? `:
53
173
  */
54
174
  export const useVariants = (componentName) => {
55
175
  const theme = useTheme()
176
+ if (!componentName) return [['default', {}]]
177
+
56
178
  const { appearances } = getComponentTheme(theme, componentName)
57
179
 
58
180
  if (!appearances) {
@@ -62,7 +184,7 @@ export const useVariants = (componentName) => {
62
184
  }
63
185
 
64
186
  const variants = Object.entries(appearances).reduce(
65
- (pairs, [key, { values, type }]) =>
187
+ (pairs, [key, { values, type } = {}]) =>
66
188
  type === 'variant'
67
189
  ? [...pairs, ...values.map((value) => [key, value, getVariantLabel(key, value)])]
68
190
  : pairs,
@@ -72,14 +194,26 @@ export const useVariants = (componentName) => {
72
194
  }
73
195
 
74
196
  const styles = StyleSheet.create({
75
- row: {
197
+ rowWrap: {
76
198
  flexDirection: 'row',
77
- alignItems: 'center',
78
- flexWrap: 'wrap'
199
+ alignItems: 'flex-start',
200
+ flexWrap: 'wrap',
201
+ flex: 1
202
+ },
203
+ rowStretch: {
204
+ flexDirection: 'row',
205
+ flexGrow: 1
206
+ },
207
+ columnStretch: {
208
+ // alignItems: 'stretch' and flexDirection: 'column' are the default
79
209
  },
80
- column: {
210
+ columnWrap: {
81
211
  flexDirection: 'column',
82
- alignItems: 'center'
212
+ alignItems: 'flex-start',
213
+ flexWrap: 'wrap',
214
+ // Ensure the content columns wrap
215
+ ...Platform.select({ web: { maxHeight: 150 }, default: { height: 125, minWidth: '200%' } }),
216
+ flexGrow: 1
83
217
  },
84
218
  content: {
85
219
  maxWidth: 200,
@@ -1,6 +0,0 @@
1
- <svg viewBox="0 0 24 24">
2
- <path
3
- d="M4.2311 12.2566L4.8931 12.9186C4.2651 13.8746 3.9111 14.9836 3.9111 16.1536C3.9111 17.7386 4.5291 19.2316 5.6511 20.3536C6.7731 21.4746 8.2641 22.0926 9.8501 22.0926C10.9235 22.0926 11.9432 21.7951 12.842 21.2619L13.0841 21.1106L13.7311 21.7556C12.5641 22.5666 11.2141 22.9996 9.8501 22.9996C8.0961 22.9996 6.3411 22.3316 5.0061 20.9966C3.7121 19.7026 2.9991 17.9826 2.9991 16.1536C2.9991 14.8388 3.37676 13.586 4.06644 12.5034L4.2311 12.2566ZM10.0407 2.26661C10.2191 2.26661 10.3994 2.30373 10.5683 2.37899L10.743 2.4718C11.3183 2.80605 16.6402 5.89799 16.6497 5.90461C16.9567 6.09661 17.1567 6.39661 17.2287 6.72661C17.3529 7.16041 17.2827 7.64038 17.0086 8.02655L16.9097 8.15161L14.2287 10.8896C14.3347 10.9776 14.4398 11.0683 14.5423 11.1634L14.7084 11.3251L14.7217 11.3406L19.8577 10.7376L19.9287 10.7356C20.2777 10.7356 20.6147 10.8766 20.8597 11.1286C21.0898 11.364 21.2204 11.6759 21.228 12.0008L21.2237 12.1406L20.8337 18.8506C20.7837 19.6246 20.1427 20.2196 19.3787 20.2196L19.2847 20.2166C18.5271 20.1677 17.9457 19.55 17.9233 18.8064L17.9257 18.6656L18.2627 14.2006C18.2707 14.1446 18.2257 14.0976 18.1737 14.0976L16.4637 14.3986C16.9377 16.196 16.6627 18.145 15.6541 19.7655L15.4887 20.0186L14.8287 19.3596C15.4437 18.4086 15.7897 17.3106 15.7897 16.1526C15.7897 14.5676 15.1717 13.0746 14.0507 11.9536C12.9277 10.8316 11.4367 10.2136 9.8497 10.2136C8.78912 10.2136 7.77727 10.5043 6.88425 11.0257L6.6437 11.1736L5.9957 10.5256C6.89297 9.90834 7.89686 9.51172 8.93523 9.36958L9.2477 9.33461L11.7547 6.55661L10.2547 5.68061L8.3307 7.30961C8.0417 7.59861 7.6647 7.74361 7.2887 7.74361C6.9127 7.74361 6.5377 7.59961 6.2497 7.31161C5.70782 6.76973 5.69593 5.8886 6.17199 5.30432L6.2737 5.19161L9.1757 2.59561C9.4197 2.37861 9.7277 2.26661 10.0407 2.26661ZM20.2817 12.6526C20.3768 11.8055 19.8748 11.6893 19.5319 11.6977L19.4697 11.7006L15.4947 12.1676C15.7179 12.506 15.9053 12.8694 16.0711 13.2408L16.1917 13.5206L17.9407 13.2126L18.0177 13.1906L18.1737 13.1866C18.4617 13.1866 18.7357 13.3116 18.9277 13.5276C19.0777 13.7009 19.1638 13.9187 19.1739 14.1445L19.1707 14.2806L18.8337 18.7346C18.8247 18.8706 18.8727 19.0136 18.9697 19.1236C19.0457 19.2108 19.1454 19.2698 19.257 19.2951L19.3427 19.3076C19.6316 19.3076 19.8517 19.1283 19.9104 18.8861L19.9247 18.7926L20.2817 12.6526ZM10.0407 3.17761C9.9687 3.17761 9.89895 3.1973 9.83862 3.23414L9.7817 3.27661L6.9047 5.84961C6.6897 6.07961 6.6827 6.45661 6.8927 6.66661C7.0007 6.77361 7.1397 6.83261 7.2887 6.83261C7.4071 6.83261 7.52166 6.79485 7.61753 6.72445L7.6857 6.66561L7.7127 6.63861L10.1567 4.56861L13.1807 6.33461L10.5177 9.28661C11.4555 9.38172 12.3648 9.67199 13.2008 10.1371L13.5107 10.3196L16.2377 7.53561C16.3452 7.40644 16.393 7.24116 16.3729 7.07565L16.3527 6.97661L16.3397 6.92261C16.3267 6.86361 16.2887 6.75661 16.1747 6.68161L10.2347 3.23061C10.1757 3.19561 10.1087 3.17761 10.0407 3.17761ZM17.7427 0.999908C18.9037 0.999908 19.8487 1.94491 19.8487 3.10591C19.8487 4.26691 18.9037 5.21291 17.7427 5.21291C16.5817 5.21291 15.6367 4.26691 15.6367 3.10591C15.6367 1.94491 16.5817 0.999908 17.7427 0.999908ZM17.7427 1.91091C17.0837 1.91091 16.5477 2.44691 16.5477 3.10591C16.5477 3.76491 17.0837 4.30191 17.7427 4.30191C18.4017 4.30191 18.9377 3.76491 18.9377 3.10591C18.9377 2.44691 18.4017 1.91091 17.7427 1.91091Z"
4
- fillRule="evenodd"
5
- />
6
- </svg>
@@ -1,9 +0,0 @@
1
- import { Meta } from '@storybook/addon-docs/blocks'
2
-
3
- <Meta title="Guides/Contributing" />
4
-
5
- # Contributing to UDS
6
-
7
- Contributions are welcome, we have a code of conduct, etc etc...
8
-
9
- <!-- @TODO fill out -->
@@ -1,104 +0,0 @@
1
- import { Meta } from '@storybook/addon-docs/blocks'
2
-
3
- <Meta title="Guides/Fonts" />
4
-
5
- # Fonts
6
-
7
- ## Understanding the font model and React Native limitations
8
-
9
- React Native broadly adheres to the CSS model for fonts, and so we use this as the basis of our font modelling for UDS.
10
- Font properties are named to correspond to CSS properties (_e.g._ `fontWeight` is equivalent to `font-weight`).
11
- In general you can specify design tokens corresponding to all CSS font properties.
12
-
13
- However, React Native does not handle font families in the same way as CSS does for web.
14
- On the web it is normal to specify a font via a `font-family`, and then apply a `font-weight` and `font-style` from within that family.
15
- You could then create equivalent `font-face` declarations which "group" all of the font weights and styles of that font face into a font family.
16
- Unfortunately, React Native does not have particularly good support for [font weights within a font family](https://reactnative.dev/docs/text-style-props#fontweight).
17
- In order to support font weights effectively on React Native we need to define a new font family for every font face/font weight/font style combination.
18
- So whereas in CSS you might write:
19
-
20
- ```CSS
21
- .my-font-class {
22
- font-family: "MyFont";
23
- font-weight: 400;
24
- font-style: normal;
25
- }
26
- .my-font-class.bold {
27
- font-weight: 700;
28
- }
29
- .my-font-class.italic {
30
- font-style: italic;
31
- }
32
- ```
33
-
34
- The equivalent in a React Native stylesheet would be:
35
-
36
- ```js
37
- const styles = StyleSheet.create({
38
- myFont: {
39
- fontFamily: 'MyFont400normal'
40
- },
41
- bold: {
42
- fontFamily: 'MyFont700normal'
43
- },
44
- italic: {
45
- fontFamily: 'MyFont400italic'
46
- }
47
- })
48
- ```
49
-
50
- In UDS Base components this mapping is handled for you, but if you are building your own React Native components you need to be aware of how fonts are defined in your application.
51
- The below section documents how to load fonts into your application depending on your target platforms and tooling.
52
-
53
- Using system fonts in React Native (for ios and android) is possible, but requires non-trivial consideration of font faces and weights.
54
- As such **system fonts are currently not supported in UDS**.
55
-
56
- ## Font loading options
57
-
58
- Broadly speaking there are 3 variables to consider:
59
-
60
- 1. **Defining fonts in CSS or JS** - If you are building cross-platform, you will need to import your fonts into your javascript code rather than define them with CSS.
61
- 2. **Included in bundle or served from CDN** - Again if you are targeting cross-platform, you will need to bundle your font assets. If you are targeting web-only then you can choose to either include fonts in your bundle, or reference resources on a CDN.
62
- 3. **Split or whole families** - For the reasons above, UDS Base components expect font faces to be defined split into individual declarations, _e.g._ `MyFont700normal`. If you're using UDS Base components in your application, or a library which depends on UDS Base, you'll need to make sure these font faces are defined. You can also define fonts as families, where you have a single font name (_e.g._ MyFont) for multiple weights and styles. This is a more typical approach for web projects.
63
-
64
- Note that in each case you will be using either a web build or a React Native build of the brand palette. Each build offers several options for importing fonts.
65
-
66
- ### React Native Build
67
-
68
- #### With Expo
69
-
70
- In expo applications you can use `expo-fonts`:
71
-
72
- ```js
73
- /* in app.js */
74
- import { useFonts } from 'expo-font'
75
- import AppLoading from 'expo-app-loading' // recommended to handle loading state
76
- import * as fonts from '@telus-uds/<my-palette-name>/build/rn/fonts'
77
-
78
- export default () => {
79
- ...
80
- const [fontsLoaded, fontsError] = useFonts(fonts)
81
- return fontsLoaded ? <App /> : <AppLoading />
82
- }
83
- ```
84
-
85
- #### In a web application (e.g. storybook)
86
-
87
- ```js
88
- import '@telus-uds/<my-palette-name>/build/rn/fonts/fonts.css'
89
- ```
90
-
91
- **Note:** this assumes you have an appropriate loader set up to handle css imports (this is true for create-react-app by default).
92
-
93
- With either of these setups, fonts are only available in the React Native format for font families (_e.g._ `MyFont700normal`)
94
-
95
- ### Web build
96
-
97
- The web build of the brand palette offers 4 different built css files for defining fonts. Include the appropriate file(s) into your build tooling the same way you would any other third party css file.
98
-
99
- 1. `@telus-uds/<my-palette-name>/build/web/fonts/fonts-local.css` - defines split font faces with local font file imports. Great for use with UDS Base if you want to bundle your fonts into your app.
100
- 2. `@telus-uds/<my-palette-name>/build/web/fonts/fonts-cdn.css` - Exactly the same definitions as fonts-local, but references resources on a CDN.
101
- 3. `@telus-uds/<my-palette-name>/build/web/fonts/fonts-local-family.css` - Includes the same fonts as above, but defined in web-friendly font families, also uses local font file imports.
102
- 4. `@telus-uds/<my-palette-name>/build/web/fonts/fonts-cdn-family.css` - The font family declarations as above, but referencing CDN resources.
103
-
104
- **Note** you may well wish to include both the split and the family declarations in your app (for example you're using UDS Base components and you have some of your own web components which use the font weights within a font family model). This is fine and won't increase your bundle size or the number of network requests (for local or CDN respectively) because both sets of declarations point at exactly the same resources. However you **should not mix CDN and local CSS**. If you do you'll end up with the fonts in your bundle, and being requested from the CDN.
@@ -1,144 +0,0 @@
1
- import { Meta } from '@storybook/addon-docs/blocks'
2
-
3
- <Meta title="Guides/Icons" />
4
-
5
- # Icons
6
-
7
- Icons are available through their respective brand palettes as raw SVG resources.
8
- In order to use icons as React components we are using [SVGR](https://react-svgr.com/) to transform the SVG resources into components.
9
- In order to use UDS icons in your application you will need to apply the SVGR transform in your build pipeline (_e.g._ webpack config), instructions on how to do this are included for common use cases below.
10
-
11
- Using a build-time transform enables us to keep the rendering and theming React logic for icons in the same place as for all other components, and enable outcome teams to include only the icons which they need in their bundle.
12
-
13
- ## Configuring icon transforms
14
-
15
- SVGR supports [cosmiconfig](https://github.com/davidtheclark/cosmiconfig#readme). You can use any of the cosmiconfig methods for applying the SVGR configuration exposed at `@telus-uds/components-base/config/svgr-icons`.
16
- For example, you can create a `svgr.config.js` file at the root of your project, and add the following line to it:
17
-
18
- ```js
19
- module.exports = require(@telus-uds/components-base/config/svgr-icons)
20
- ```
21
-
22
- Once you have SVGR configuration in place, you will need to add a build step. Included below are example configurations for common use cases.
23
- If your use case isn't covered below, or you are having problems configuring icons for your application, get in touch with the core UDS team.
24
-
25
- The SVGR configuration is configured to transform SVGs into React Native components.
26
- To do this it relies on `react-native-svg`. You will need to include this as a production dependency in your project.
27
- We also offer a config preset for web-only builds to avoid this (see Webpack for web-only below). This is recommended for web projects to avoid the need to include an alias `react-native-svg`
28
-
29
- ### Standalone
30
-
31
- SVGR can be applied as a standalone transform, via its own [well-documented CLI](https://react-svgr.com/docs/cli/).
32
-
33
- ### Webpack
34
-
35
- For Webpack you will need to create a new Webpack loader rule to apply the SVGR using '@svgr/webpack' which you will need to include as a dev dependency in your project.
36
-
37
- ```js
38
- /* in your webpack.config.js */
39
- // create a new loader rule leveraging @svgr/webpack
40
- const iconLoaderRule = {
41
- test: /\.icon\.svg$/,
42
- exclude: /node_modules/,
43
- use: [
44
- {
45
- loader: '@svgr/webpack'
46
- }
47
- ]
48
- }
49
-
50
- // if you already have an svg loader rule, adjust it to avoid it matching icons
51
- const svgLoaderRule = config.module.rules.find((rule) => rule.test.test('.svg'))
52
- svgLoaderRule.exclude = iconLoaderRule.test
53
-
54
- // add your new rule
55
- config.module.rules.unshift(iconLoaderRule)
56
- ```
57
-
58
- **Note**: if your Webpack config is using a `oneOf` rule to apply file loaders, you may need to tweak the above to target that `oneOf`:
59
-
60
- ```js
61
- config.module.rules[1].oneOf.unshift(iconLoaderRule)
62
- ```
63
-
64
- With a oneOf rule, you don't need to worry about adjusting existing SVG loaders, as long as you place your icon loader rule at the head of the list (_e.g._ via `unshift`).
65
-
66
- ### Storybook
67
-
68
- Storybook uses Webpack under the hood, so the instructions are very similiar. You will again need to ensure that '@svgr/webpack' is included as a dev dependency.
69
-
70
- ```js
71
- /* in your .storybook/main.js file */
72
- // create a new loader rule leveraging @svgr/webpack
73
- const iconLoaderRule = {
74
- test: /\.icon\.svg$/,
75
- exclude: /node_modules/,
76
- use: [
77
- {
78
- loader: '@svgr/webpack'
79
- }
80
- ]
81
- }
82
-
83
- module.exports = {
84
- ...
85
- webpackFinal: async (config) => {
86
- // tweak existing rule to avoid matching *.icon.svg
87
- const fileLoaderRule = config.module.rules.find((rule) => rule.test.test('.svg'))
88
- fileLoaderRule.exclude = iconLoaderRule.test
89
-
90
- // Add icon loader rule
91
- config.module.rules.push(iconLoaderRule)
92
- return config
93
- }
94
- }
95
- ```
96
-
97
- ### Metro (React Native)
98
-
99
- For the Metro bundler the terminology is slightly different and we're applying a _transformer_ rather than a loader.
100
- The example below uses the expo default metro config, but you can switch `getDefaultConfig` out for any metro config generator.
101
- For Metro you will need to ensure you have `react-native-svg-transformer` installed as a dev dependency.
102
-
103
- ````js
104
- /* in your metro.config.js file */
105
- const { getDefaultConfig } = require("@expo/metro-config");
106
-
107
- module.exports = (async () => {
108
- const {
109
- resolver: { sourceExts, assetExts }
110
- } = await getDefaultConfig(__dirname);
111
- return {
112
- transformer: {
113
- // apply the SVGR transformer
114
- babelTransformerPath: require.resolve("react-native-svg-transformer")
115
- },
116
- resolver: {
117
- // ensure SVGs are *not* treated as assets...
118
- assetExts: assetExts.filter(ext => ext !== "svg"),
119
- // ...but instead as source files to be transformed
120
- sourceExts: [...sourceExts, "svg"]
121
- }
122
- };
123
- })();
124
-
125
-
126
- ### Webpack for web-only
127
- If you are only targeting the web platform, and want to avoid the dependency on `react-native-svg`, you can follow the Webpack instructions above, but replace the contents of your `svgr.config.js` file with:
128
-
129
- ```js
130
- module.exports = require(@telus-uds/components-base/config/svgr-icons-web)
131
- ````
132
-
133
- ## Using icons
134
-
135
- If you are using a standalone build you can use the generated files as you would any other React component.
136
- Assuming you are using Metro or Webpack and have applied the correct configuration as above, you can simply use your icons as components with
137
-
138
- ```js
139
- const MyIconComponent = require('path/to/my-icon.icon.svg')
140
-
141
- ...
142
-
143
- return <MyIconComponent />
144
- ```
@@ -1,9 +0,0 @@
1
- import { Meta } from '@storybook/addon-docs/blocks'
2
-
3
- <Meta title="Guides/Introduction" />
4
-
5
- # Welcome to the UDS workshop
6
-
7
- This is the storybook for developing and documenting Universal Design System (UDS) components.
8
-
9
- <!-- @TODO fill out -->