@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,185 @@
1
+ import React from 'react'
2
+ import {
3
+ StyleSheet,
4
+ TouchableWithoutFeedback,
5
+ View,
6
+ Modal as NativeModal,
7
+ Platform
8
+ } from 'react-native'
9
+
10
+ import PropTypes from 'prop-types'
11
+ import { applyShadowToken, useThemeTokens } from '../ThemeProvider'
12
+ import { getTokensPropType, useCopy, copyPropTypes, variantProp } from '../utils'
13
+ import { useViewport } from '../ViewportProvider'
14
+ import ButtonBase from '../Button/ButtonBase'
15
+ import dictionary from './dictionary'
16
+
17
+ const selectContainerStyles = ({
18
+ containerPaddingLeft,
19
+ containerPaddingRight,
20
+ containerPaddingTop,
21
+ containerPaddingBottom,
22
+ maxWidth,
23
+ height
24
+ }) => ({
25
+ height,
26
+ maxWidth,
27
+ paddingLeft: containerPaddingLeft,
28
+ paddingRight: containerPaddingRight,
29
+ paddingTop: containerPaddingTop,
30
+ paddingBottom: containerPaddingBottom
31
+ })
32
+
33
+ const selectModalStyles = ({
34
+ backgroundColor,
35
+ borderRadius,
36
+ height,
37
+ paddingLeft,
38
+ paddingRight,
39
+ paddingTop,
40
+ paddingBottom,
41
+ shadow
42
+ }) => ({
43
+ backgroundColor,
44
+ borderRadius,
45
+ height,
46
+ paddingLeft,
47
+ paddingRight,
48
+ paddingTop,
49
+ paddingBottom,
50
+ ...applyShadowToken(shadow)
51
+ })
52
+
53
+ const selectBackdropStyles = ({ backdropColor, backdropOpacity }) => ({
54
+ backgroundColor: backdropColor,
55
+ opacity: backdropOpacity
56
+ })
57
+
58
+ const selectCloseButtonContainerStyles = ({ paddingRight, paddingTop }) => ({
59
+ paddingRight,
60
+ paddingTop
61
+ })
62
+
63
+ const selectCloseIconProps = ({ closeIconSize, closeIconColor }) => ({
64
+ size: closeIconSize,
65
+ color: closeIconColor
66
+ })
67
+
68
+ /**
69
+ * A modal window is a secondary window that opens on top of the main one.
70
+ * Users have to interact with it before they can carry out their task and return to the main window.
71
+ * Use to reveal additional information to a user after they have performed an explicit interaction.
72
+ * They are a strongly discouraged pattern; it's preferred to have all relevant information within a page,
73
+ * and irrelevant information either linked externally or omitted.
74
+ *
75
+ * - Must only appear after a customer interaction, not on page load or any other circumstance
76
+ * - Open a modal based on explicit customer action e.g. clicking on a button/link/form field
77
+ * - Only one modal should be "current" at any time
78
+ * - Read [WebAIM's documentation](https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/dialog.html) to create accessible modals
79
+ * - Don’t use modals to reinforce or repeat information already available in the parent page or view
80
+ * - Don’t use modals consecutively
81
+ */
82
+ const Modal = ({ children, isOpen, onClose, maxWidth, tokens, variant, copy }) => {
83
+ const viewport = useViewport()
84
+ const themeTokens = useThemeTokens('Modal', tokens, variant, { viewport, maxWidth })
85
+
86
+ const { closeIcon: CloseIconComponent } = themeTokens
87
+
88
+ const getCopy = useCopy({ dictionary, copy })
89
+ const closeLabel = getCopy('closeButton')
90
+
91
+ const handleClose = () => {
92
+ if (typeof onClose === 'function') onClose()
93
+ }
94
+
95
+ const handleKeyUp = (event) => {
96
+ if (event.key === 'Escape') onClose()
97
+ }
98
+
99
+ if (!isOpen) {
100
+ return null
101
+ }
102
+
103
+ // TODO: replace the close button with IconButton when implemented (https://github.com/telus/universal-design-system/issues/281)
104
+ return (
105
+ <NativeModal transparent>
106
+ <View style={[staticStyles.positioningContainer]}>
107
+ <View
108
+ style={[staticStyles.sizingContainer, selectContainerStyles(themeTokens)]}
109
+ pointerEvents="box-none" // don't capture backdrop press events
110
+ >
111
+ <View style={[staticStyles.modal, selectModalStyles(themeTokens)]} onKeyUp={handleKeyUp}>
112
+ <View
113
+ style={[
114
+ staticStyles.closeButtonContainer,
115
+ selectCloseButtonContainerStyles(themeTokens)
116
+ ]}
117
+ >
118
+ <ButtonBase
119
+ onPress={handleClose}
120
+ accessibilityRole="button"
121
+ accessibilityLabel={closeLabel}
122
+ >
123
+ {
124
+ // TODO: add close button interactive states after IconButton is done
125
+ () => <CloseIconComponent {...selectCloseIconProps(themeTokens)} />
126
+ }
127
+ </ButtonBase>
128
+ </View>
129
+ {children}
130
+ </View>
131
+ </View>
132
+ {/* when a modal becomes open its first focusable element is being automatically focused */}
133
+ {/* and we prefer the close button over backdrop */}
134
+ <TouchableWithoutFeedback onPress={handleClose}>
135
+ <View style={[staticStyles.backdrop, selectBackdropStyles(themeTokens)]} />
136
+ </TouchableWithoutFeedback>
137
+ </View>
138
+ </NativeModal>
139
+ )
140
+ }
141
+
142
+ Modal.propTypes = {
143
+ children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]),
144
+ copy: copyPropTypes,
145
+ isOpen: PropTypes.bool,
146
+ onClose: PropTypes.func,
147
+ maxWidth: PropTypes.bool,
148
+ tokens: getTokensPropType('Modal'),
149
+ variant: variantProp.propType
150
+ }
151
+
152
+ export default Modal
153
+
154
+ const staticStyles = StyleSheet.create({
155
+ backdrop: {
156
+ position: 'absolute',
157
+ top: 0,
158
+ left: 0,
159
+ right: 0,
160
+ bottom: 0,
161
+ zIndex: -1,
162
+ ...Platform.select({
163
+ web: {
164
+ cursor: 'pointer'
165
+ }
166
+ })
167
+ },
168
+ positioningContainer: {
169
+ flexBasis: '100%',
170
+ alignItems: 'center',
171
+ justifyContent: 'center'
172
+ },
173
+ sizingContainer: {
174
+ maxHeight: '100%', // so that the container can expand up to the full viewport height
175
+ width: '100%' // ensure that the modal actually expands to the set maxWidth
176
+ },
177
+ modal: {
178
+ maxHeight: '100%' // so that the modal can expand vertically up to the sizing container's height (exclusive of its vertical padding)
179
+ },
180
+ closeButtonContainer: {
181
+ position: 'absolute',
182
+ top: 0,
183
+ right: 0
184
+ }
185
+ })
@@ -0,0 +1,9 @@
1
+ export default {
2
+ en: {
3
+ // English text from TDS Community `Modal`
4
+ closeButton: 'Close'
5
+ },
6
+ fr: {
7
+ closeButton: 'Fermer'
8
+ }
9
+ }
@@ -0,0 +1,3 @@
1
+ import Modal from './Modal'
2
+
3
+ export default Modal
@@ -0,0 +1,161 @@
1
+ import React, { useState } from 'react'
2
+ import { StyleSheet, Text, View } from 'react-native'
3
+
4
+ import PropTypes from 'prop-types'
5
+ import { applyTextStyles, useThemeTokens } from '../ThemeProvider'
6
+ import { getTokensPropType, selectTokens, variantProp } from '../utils'
7
+ import ButtonBase from '../Button/ButtonBase'
8
+ import useCopy from '../utils/useCopy'
9
+ import dictionary from './dictionary'
10
+
11
+ const selectContainerStyles = (tokens) => ({ ...tokens })
12
+
13
+ const selectTextStyles = (tokens) => applyTextStyles(selectTokens('Typography', tokens))
14
+
15
+ const selectIconProps = ({ iconSize, iconColor }) => ({
16
+ size: iconSize,
17
+ color: iconColor
18
+ })
19
+
20
+ const selectIconContainerStyles = ({ iconGap }) => ({
21
+ paddingRight: iconGap
22
+ })
23
+
24
+ const selectDismissIconProps = ({ dismissIconSize, dismissIconColor }) => ({
25
+ size: dismissIconSize,
26
+ color: dismissIconColor
27
+ })
28
+
29
+ const selectDismissButtonContainerStyles = ({ dismissButtonGap }) => ({
30
+ paddingLeft: dismissButtonGap
31
+ })
32
+
33
+ /**
34
+ * A banner that highlights important messages:
35
+ * - Status message to show there is an error or outage of services
36
+ * - Confirmation message in response to user action
37
+ * - Account information letting the user know they have almost used all their data
38
+ *
39
+ * ## Usage criteria
40
+ * - Use simple text content only, such as bold test or links. Don’t use other complex components or paragraphs
41
+ * - Show notifications before the content that the message is related to, otherwise show at the top of the main content
42
+ * - Show system notifications at the top of the page, below the navigation, and expands the full-width of the viewport
43
+ * - When showing multiple notifications, show them in order of importance from top to bottom
44
+ * - Use variants to visually show the type of message contained within the Notification.
45
+ * - The icon and colour will indicate meaning and importance
46
+ *
47
+ * ### Variants
48
+ * - Use `variant.style` to set the visual style of the notification
49
+ * - Use `dismissible` prop to enable dismissible functionality
50
+ * - Use `system` prop to set the visual style of the notification and denote an announcement from the system or application
51
+ *
52
+ * ### When to use the system prop?
53
+ * - Use `system` to show system-based messages coming from the application
54
+ * - Don’t use `system` when the message is in response to user action
55
+ *
56
+ * ## Variants
57
+ *
58
+ * #### Success
59
+ * Use the success variant to provide feedback of a successful operation. The message will include an icon to indicate meaning and importance.
60
+ *
61
+ * #### Warning
62
+ * Use the warning variant to provide feedback of a warning; users would still be able to proceed forward.
63
+ * The message will include an icon to indicate meaning and importance.
64
+ *
65
+ * #### Error
66
+ * Use the error variant to provide feedback of a failed operation. The message will include an icon to indicate meaning and importance.
67
+ *
68
+ * #### Dismissible
69
+ * Dismissible notifications should only be used for default or success notifications where there is no action needed from the user.
70
+ * If the information is passive then it should be dismissible as indicated by an interactive close button on the far right.
71
+ * If the notification requires an action then make the option(s) clear with a `ChevronLink` or `Link`.
72
+ *
73
+ * Use the `dismissible` prop to allow users to dismiss the Notification at any time. Once dismissed, the Notification is removed from the DOM.
74
+ *
75
+ * Please note:
76
+ *
77
+ * - Default and Success variants are dismissible
78
+ * - Error and Warning variants are not dismissible
79
+ *
80
+ * #### System message
81
+ * Use full-width `Notifications` to show system-based messages coming from the application, not in response to user action.
82
+ * Show system notifications at the top of the page, below the navigation, and expands the full-width of the viewport
83
+ */
84
+ const Notification = ({ children, system, dismissible, copy = 'en', tokens, variant }) => {
85
+ const [isDismissed, setIsDismissed] = useState(false)
86
+ const themeTokens = useThemeTokens('Notification', tokens, variant, { system })
87
+ const getCopy = useCopy({ dictionary, copy })
88
+
89
+ if (isDismissed) {
90
+ return null
91
+ }
92
+
93
+ const textStyles = selectTextStyles(themeTokens)
94
+
95
+ const content =
96
+ typeof children === 'string' ? <Text style={textStyles}>{children}</Text> : children
97
+
98
+ const { icon: IconComponent, dismissIcon: DismissIconComponent } = themeTokens
99
+
100
+ const onDismissPress = () => setIsDismissed(true)
101
+
102
+ // TODO: replace the dismiss button with IconButton when implemented (https://github.com/telus/universal-design-system/issues/281)
103
+ return (
104
+ <View style={[staticStyles.container, selectContainerStyles(themeTokens)]}>
105
+ {IconComponent && (
106
+ <View style={selectIconContainerStyles(themeTokens)}>
107
+ <IconComponent {...selectIconProps(themeTokens)} />
108
+ </View>
109
+ )}
110
+ <View style={staticStyles.contentContainer}>
111
+ {content && typeof content === 'function' ? content({ textStyles, variant }) : content}
112
+ </View>
113
+ {dismissible && DismissIconComponent && (
114
+ <View style={selectDismissButtonContainerStyles(themeTokens)}>
115
+ <ButtonBase
116
+ onPress={onDismissPress}
117
+ accessibilityRole="button"
118
+ accessibilityLabel={getCopy('dismiss')}
119
+ >
120
+ {() => <DismissIconComponent {...selectDismissIconProps(themeTokens)} />}
121
+ </ButtonBase>
122
+ </View>
123
+ )}
124
+ </View>
125
+ )
126
+ }
127
+
128
+ Notification.propTypes = {
129
+ /**
130
+ * Content of the `Notification`.
131
+ */
132
+ children: PropTypes.oneOfType([PropTypes.string, PropTypes.node, PropTypes.func]),
133
+ /**
134
+ * Use `system` prop to set the visual style of the notification and denote an announcement from the system or application
135
+ */
136
+ system: PropTypes.bool,
137
+ /**
138
+ * Use the `dismissible` prop to allow users to dismiss the Notification at any time.
139
+ */
140
+ dismissible: PropTypes.bool,
141
+ /**
142
+ * Select english or french copy for the accessible label of the dismiss button.
143
+ */
144
+ copy: PropTypes.oneOfType([
145
+ PropTypes.oneOf(['en', 'fr']),
146
+ PropTypes.shape({ dismiss: PropTypes.string })
147
+ ]),
148
+ tokens: getTokensPropType('Notification'),
149
+ variant: variantProp.propType
150
+ }
151
+
152
+ export default Notification
153
+
154
+ const staticStyles = StyleSheet.create({
155
+ container: {
156
+ flexDirection: 'row'
157
+ },
158
+ contentContainer: {
159
+ flex: 1
160
+ }
161
+ })
@@ -0,0 +1,8 @@
1
+ export default {
2
+ en: {
3
+ dismiss: 'Close'
4
+ },
5
+ fr: {
6
+ dismiss: 'Fermer'
7
+ }
8
+ }
@@ -0,0 +1,3 @@
1
+ import Notification from './Notification'
2
+
3
+ export default Notification
@@ -0,0 +1,70 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+
4
+ import ButtonBase from '../Button/ButtonBase'
5
+ import { useThemeTokensCallback } from '../ThemeProvider'
6
+ import {
7
+ a11yProps,
8
+ copyPropTypes,
9
+ getTokensPropType,
10
+ hrefAttrsProp,
11
+ selectTokens,
12
+ variantProp
13
+ } from '../utils'
14
+
15
+ import useCopy from '../utils/useCopy'
16
+ import dictionary from './dictionary'
17
+
18
+ function PageButton({ label, onPress, href, isActive, copy, variant, tokens, ...props }) {
19
+ const getTokens = useThemeTokensCallback('PaginationPageButton', tokens, variant)
20
+
21
+ const getCopy = useCopy({ dictionary, copy })
22
+
23
+ const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
24
+
25
+ const activeProps = isActive
26
+ ? {
27
+ selected: true,
28
+ ...a11yProps.nonFocusableProps,
29
+ // a brute fix for the focus state being stuck on an active item since it becomes non-focusable
30
+ // (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
31
+ key: 'active-item'
32
+ }
33
+ : {}
34
+
35
+ const accessibilityRole = href !== undefined ? 'link' : 'button'
36
+ const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : ''
37
+ const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`
38
+
39
+ const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
40
+ const buttonProps = {
41
+ accessibilityRole,
42
+ accessibilityLabel,
43
+ onPress,
44
+ href,
45
+ hrefAttrs,
46
+ ...rest
47
+ }
48
+
49
+ return (
50
+ <ButtonBase {...buttonProps} tokens={getButtonTokens} {...activeProps}>
51
+ {label}
52
+ </ButtonBase>
53
+ )
54
+ }
55
+
56
+ PageButton.propTypes = {
57
+ // Spreading any props into a secondary component accessed like Pagination.PageButton
58
+ // crashes a Docusaurus props table, but only in production, not in development
59
+ onPress: PropTypes.func,
60
+ href: PropTypes.string,
61
+ // If the above is fixed, the above can be replaced with this which includes full a11y etc:
62
+ // ...linkProps.types,
63
+ label: PropTypes.string,
64
+ isActive: PropTypes.bool,
65
+ copy: copyPropTypes,
66
+ variant: variantProp.propType,
67
+ tokens: getTokensPropType('PaginationPageButton')
68
+ }
69
+
70
+ export default PageButton
@@ -0,0 +1,135 @@
1
+ import React from 'react'
2
+ import { View, Text, StyleSheet } from 'react-native'
3
+
4
+ import { componentPropType, copyPropTypes, getTokensPropType, variantProp } from '../utils'
5
+ import { applyTextStyles, useThemeTokens } from '../ThemeProvider'
6
+ import { useViewport } from '../ViewportProvider'
7
+ import Box from '../Box'
8
+
9
+ import usePagination from './usePagination'
10
+ import PageButton from './PageButton'
11
+ import SideButton from './SideButton'
12
+
13
+ const selectTextStyles = ({ color, fontName, fontSize, fontWeight, lineHeight }) =>
14
+ applyTextStyles({
15
+ color,
16
+ fontName,
17
+ fontSize,
18
+ fontWeight,
19
+ lineHeight
20
+ })
21
+
22
+ function Pagination({
23
+ children,
24
+ copy = 'en',
25
+ variant,
26
+ tokens,
27
+ sideButtonVariant,
28
+ sideButtonTokens
29
+ }) {
30
+ const viewport = useViewport()
31
+ const { truncateAbove, gap, ...themeTokens } = useThemeTokens('Pagination', tokens, variant, {
32
+ viewport
33
+ })
34
+
35
+ const items = React.Children.toArray(children)
36
+
37
+ const {
38
+ isItemActive,
39
+ getItemProps,
40
+ showPrevious,
41
+ showNext,
42
+ nextItemProps,
43
+ previousItemProps,
44
+ shouldRenderButton,
45
+ shouldRenderEllipsis
46
+ } = usePagination({
47
+ items,
48
+ truncateAbove
49
+ })
50
+
51
+ const ellipsisTextStyles = selectTextStyles(themeTokens)
52
+
53
+ if (items.length === 0) {
54
+ return null
55
+ }
56
+
57
+ // TODO: replace with a spacing component when https://github.com/telus/universal-design-system/pull/531 is implemented
58
+ // concatenate all items to easily wrap them in identical spacing components
59
+ const buttons = [
60
+ showPrevious && (
61
+ <SideButton
62
+ {...previousItemProps}
63
+ direction="previous"
64
+ copy={copy}
65
+ variant={sideButtonVariant}
66
+ tokens={sideButtonTokens}
67
+ />
68
+ ),
69
+ ...items.map((child, itemIndex) => {
70
+ const buttonLabel = `${itemIndex + 1}`
71
+ const itemProps = getItemProps(itemIndex)
72
+
73
+ if (shouldRenderButton(itemIndex)) {
74
+ return (
75
+ <PageButton
76
+ {...itemProps}
77
+ label={buttonLabel}
78
+ copy={copy}
79
+ isActive={isItemActive(itemIndex)}
80
+ />
81
+ )
82
+ }
83
+
84
+ if (shouldRenderEllipsis(itemIndex)) {
85
+ return <Text style={ellipsisTextStyles}>...</Text>
86
+ }
87
+
88
+ return null
89
+ }),
90
+ showNext && (
91
+ <SideButton
92
+ {...nextItemProps}
93
+ direction="next"
94
+ copy={copy}
95
+ variant={sideButtonVariant}
96
+ tokens={sideButtonTokens}
97
+ />
98
+ )
99
+ ]
100
+
101
+ return (
102
+ <View style={staticStyles.container}>
103
+ {buttons
104
+ // keep the keys in-line with the page numbers regardless of which buttons are actually rendered
105
+ .map((element, index) => [element, `page-${index + 1}`])
106
+ .filter(([element]) => element !== null)
107
+ .map(([element, key]) => (
108
+ <Box right={gap} key={key}>
109
+ {element}
110
+ </Box>
111
+ ))}
112
+ </View>
113
+ )
114
+ }
115
+
116
+ Pagination.PageButton = PageButton
117
+
118
+ Pagination.propTypes = {
119
+ children: componentPropType('PageButton'),
120
+ copy: copyPropTypes,
121
+ variant: variantProp.propType,
122
+ tokens: getTokensPropType('Pagination'),
123
+ sideButtonVariant: variantProp.propType,
124
+ sideButtonTokens: getTokensPropType('PaginationSideButton')
125
+ }
126
+
127
+ const staticStyles = StyleSheet.create({
128
+ container: {
129
+ flexDirection: 'row',
130
+ flexWrap: 'wrap',
131
+ alignItems: 'center'
132
+ }
133
+ })
134
+
135
+ export default Pagination
@@ -0,0 +1,82 @@
1
+ import React from 'react'
2
+ import { Text } from 'react-native'
3
+
4
+ import PropTypes from 'prop-types'
5
+
6
+ import ButtonBase from '../Button/ButtonBase'
7
+ import { IconText } from '../Icon'
8
+ import { useThemeTokensCallback } from '../ThemeProvider'
9
+ import { useViewport } from '../ViewportProvider'
10
+ import { copyPropTypes, hrefAttrsProp, linkProps, selectTokens } from '../utils'
11
+
12
+ import dictionary from './dictionary'
13
+ import useCopy from '../utils/useCopy'
14
+
15
+ const selectIconTokens = ({ color, iconSize, iconDisplace }, direction) => {
16
+ return {
17
+ color,
18
+ size: iconSize,
19
+ translateX: iconDisplace * (direction === 'previous' ? -1 : 1)
20
+ }
21
+ }
22
+
23
+ const directionToSide = {
24
+ previous: 'left',
25
+ next: 'right'
26
+ }
27
+
28
+ function SideButton({ direction = 'previous', onPress, href, copy, variant, tokens, ...props }) {
29
+ const viewport = useViewport()
30
+ const buttonVariant = { direction, viewport, ...variant }
31
+ const getTokens = useThemeTokensCallback('PaginationSideButton', tokens, buttonVariant)
32
+
33
+ const getCopy = useCopy({ dictionary, copy })
34
+
35
+ const { icon } = getTokens(tokens, buttonVariant)
36
+
37
+ const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
38
+ const getIconTokens = (buttonState) => selectIconTokens(getTokens(buttonState), direction)
39
+
40
+ const label = direction === 'previous' ? getCopy('previousText') : getCopy('nextText')
41
+ const showLabel = viewport !== 'sm' && viewport !== 'xs'
42
+
43
+ const accessibilityLabel =
44
+ direction === 'previous' ? getCopy('previousLabel') : getCopy('nextLabel')
45
+ const accessibilityRole = href !== undefined ? 'link' : 'button'
46
+
47
+ const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
48
+ const buttonProps = {
49
+ accessibilityRole,
50
+ accessibilityLabel,
51
+ onPress,
52
+ href,
53
+ hrefAttrs,
54
+ ...rest
55
+ }
56
+
57
+ return (
58
+ <ButtonBase {...buttonProps} tokens={getButtonTokens}>
59
+ {({ textStyles, ...buttonState }) => {
60
+ const iconProps = { tokens: getIconTokens(buttonState) }
61
+ return (
62
+ <IconText
63
+ icon={icon}
64
+ space={1}
65
+ iconPosition={directionToSide[direction]}
66
+ iconProps={iconProps}
67
+ >
68
+ {showLabel && <Text style={textStyles}>{label}</Text>}
69
+ </IconText>
70
+ )
71
+ }}
72
+ </ButtonBase>
73
+ )
74
+ }
75
+
76
+ SideButton.propTypes = {
77
+ direction: PropTypes.oneOf(['previous', 'next']),
78
+ copy: copyPropTypes,
79
+ ...linkProps.types
80
+ }
81
+
82
+ export default SideButton
@@ -0,0 +1,18 @@
1
+ export default {
2
+ en: {
3
+ goToLabel: 'Go to page number',
4
+ currentLabel: '(current)',
5
+ previousLabel: 'Go to previous page',
6
+ previousText: 'Previous',
7
+ nextLabel: 'Go to next page',
8
+ nextText: 'Next'
9
+ },
10
+ fr: {
11
+ goToLabel: 'Aller au page n°',
12
+ currentLabel: '(page actuelle)',
13
+ previousLabel: 'Aller au page précédent',
14
+ previousText: 'Précédent',
15
+ nextLabel: 'Aller au prochain page',
16
+ nextText: 'Suivant'
17
+ }
18
+ }
@@ -0,0 +1,3 @@
1
+ import Pagination from './Pagination'
2
+
3
+ export default Pagination