@telus-uds/components-base 0.0.2-prerelease.7 → 1.0.1

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 (445) hide show
  1. package/.eslintrc.js +9 -0
  2. package/.ultra.cache.json +1 -1
  3. package/CHANGELOG.md +71 -0
  4. package/README.md +4 -2
  5. package/__fixtures__/Accessible.js +33 -0
  6. package/__fixtures__/Accessible.native.js +32 -0
  7. package/__fixtures__/test-utils.js +25 -0
  8. package/__fixtures__/testTheme.js +438 -31
  9. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  10. package/__tests__/Button/ButtonGroup.test.jsx +6 -7
  11. package/__tests__/Checkbox/Checkbox.test.jsx +2 -2
  12. package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
  13. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
  14. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
  15. package/__tests__/Icon/Icon.test.jsx +3 -3
  16. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  17. package/__tests__/Link/LinkBase.test.jsx +0 -14
  18. package/__tests__/Modal/Modal.test.jsx +47 -0
  19. package/__tests__/Notification/Notification.test.jsx +20 -0
  20. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  21. package/__tests__/Progress/Progress.test.jsx +79 -0
  22. package/__tests__/Radio/Radio.test.jsx +2 -2
  23. package/__tests__/Radio/RadioGroup.test.jsx +220 -0
  24. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  25. package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
  26. package/__tests__/Search/Search.test.jsx +73 -0
  27. package/__tests__/Select/Select.test.jsx +3 -2
  28. package/__tests__/Skeleton/Skeleton.test.jsx +1 -1
  29. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  30. package/__tests__/Tabs/Tabs.test.jsx +40 -0
  31. package/__tests__/Tags/Tags.test.jsx +5 -6
  32. package/__tests__/TextInput/TextArea.test.jsx +3 -2
  33. package/__tests__/TextInput/TextInputBase.test.jsx +10 -5
  34. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
  35. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
  36. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
  37. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
  38. package/__tests__/utils/children.test.jsx +128 -0
  39. package/__tests__/utils/input.test.js +59 -1
  40. package/__tests__/utils/semantics.test.jsx +43 -0
  41. package/__tests__/utils/useCopy.test.js +14 -3
  42. package/babel.config.js +20 -0
  43. package/jest.config.js +6 -3
  44. package/lib/A11yInfoProvider/index.js +54 -26
  45. package/lib/A11yText/index.js +45 -17
  46. package/lib/ActivityIndicator/Spinner.js +81 -0
  47. package/lib/ActivityIndicator/Spinner.native.js +129 -91
  48. package/lib/ActivityIndicator/index.js +28 -12
  49. package/lib/ActivityIndicator/shared.js +27 -12
  50. package/lib/BaseProvider/index.js +34 -11
  51. package/lib/Box/Box.js +153 -35
  52. package/lib/Box/index.js +13 -2
  53. package/lib/Button/Button.js +38 -16
  54. package/lib/Button/ButtonBase.js +93 -79
  55. package/lib/Button/ButtonGroup.js +112 -73
  56. package/lib/Button/ButtonLink.js +45 -19
  57. package/lib/Button/index.js +31 -4
  58. package/lib/Button/propTypes.js +32 -9
  59. package/lib/Card/Card.js +38 -41
  60. package/lib/Card/CardBase.js +86 -0
  61. package/lib/Card/PressableCardBase.js +141 -0
  62. package/lib/Card/index.js +40 -2
  63. package/lib/Checkbox/Checkbox.js +158 -111
  64. package/lib/Checkbox/CheckboxGroup.js +241 -0
  65. package/lib/Checkbox/CheckboxInput.js +74 -0
  66. package/lib/Checkbox/CheckboxInput.native.js +9 -1
  67. package/lib/Checkbox/index.js +21 -2
  68. package/lib/Divider/Divider.js +59 -28
  69. package/lib/Divider/index.js +13 -2
  70. package/lib/ExpandCollapse/Accordion.js +26 -7
  71. package/lib/ExpandCollapse/Control.js +60 -31
  72. package/lib/ExpandCollapse/ExpandCollapse.js +50 -28
  73. package/lib/ExpandCollapse/Panel.js +83 -44
  74. package/lib/ExpandCollapse/index.js +25 -7
  75. package/lib/Feedback/Feedback.js +77 -43
  76. package/lib/Feedback/index.js +13 -2
  77. package/lib/Fieldset/Fieldset.js +165 -0
  78. package/lib/Fieldset/FieldsetContainer.js +46 -0
  79. package/lib/Fieldset/FieldsetContainer.native.js +38 -0
  80. package/lib/Fieldset/Legend.js +38 -0
  81. package/lib/Fieldset/Legend.native.js +48 -0
  82. package/lib/Fieldset/cssReset.js +21 -0
  83. package/lib/Fieldset/index.js +13 -0
  84. package/lib/FlexGrid/Col/Col.js +73 -41
  85. package/lib/FlexGrid/Col/index.js +13 -2
  86. package/lib/FlexGrid/FlexGrid.js +99 -49
  87. package/lib/FlexGrid/Row/Row.js +58 -30
  88. package/lib/FlexGrid/Row/index.js +13 -2
  89. package/lib/FlexGrid/helpers/index.js +9 -1
  90. package/lib/FlexGrid/index.js +13 -2
  91. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  92. package/lib/HorizontalScroll/HorizontalScroll.js +200 -0
  93. package/lib/HorizontalScroll/HorizontalScrollButton.js +127 -0
  94. package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
  95. package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
  96. package/lib/HorizontalScroll/dictionary.js +18 -0
  97. package/lib/HorizontalScroll/index.js +35 -0
  98. package/lib/HorizontalScroll/itemPositions.js +128 -0
  99. package/lib/Icon/Icon.js +57 -48
  100. package/lib/Icon/IconText.js +54 -25
  101. package/lib/Icon/index.js +31 -4
  102. package/lib/IconButton/IconButton.js +140 -0
  103. package/lib/IconButton/index.js +13 -0
  104. package/lib/InputLabel/InputLabel.js +102 -40
  105. package/lib/InputLabel/LabelContent.js +41 -0
  106. package/lib/InputLabel/LabelContent.native.js +32 -6
  107. package/lib/InputLabel/index.js +13 -2
  108. package/lib/InputSupports/InputSupports.js +71 -52
  109. package/lib/InputSupports/index.js +13 -2
  110. package/lib/InputSupports/propTypes.js +19 -8
  111. package/lib/InputSupports/useInputSupports.js +41 -0
  112. package/lib/Link/ChevronLink.js +44 -20
  113. package/lib/Link/InlinePressable.js +56 -0
  114. package/lib/Link/InlinePressable.native.js +39 -15
  115. package/lib/Link/Link.js +36 -13
  116. package/lib/Link/LinkBase.js +98 -61
  117. package/lib/Link/TextButton.js +41 -17
  118. package/lib/Link/index.js +39 -5
  119. package/lib/List/List.js +55 -26
  120. package/lib/List/ListItem.js +79 -41
  121. package/lib/List/index.js +13 -2
  122. package/lib/Modal/Modal.js +231 -0
  123. package/lib/Modal/dictionary.js +16 -0
  124. package/lib/Modal/index.js +13 -0
  125. package/lib/Notification/Notification.js +216 -0
  126. package/lib/Notification/dictionary.js +15 -0
  127. package/lib/Notification/index.js +13 -0
  128. package/lib/Pagination/PageButton.js +61 -28
  129. package/lib/Pagination/Pagination.js +78 -43
  130. package/lib/Pagination/SideButton.js +73 -42
  131. package/lib/Pagination/dictionary.js +9 -2
  132. package/lib/Pagination/index.js +13 -2
  133. package/lib/Pagination/usePagination.js +12 -2
  134. package/lib/Progress/Progress.js +104 -0
  135. package/lib/Progress/ProgressBar.js +157 -0
  136. package/lib/Progress/ProgressBarBackground.js +61 -0
  137. package/lib/Progress/index.js +16 -0
  138. package/lib/Radio/Radio.js +116 -114
  139. package/lib/Radio/RadioButton.js +152 -0
  140. package/lib/Radio/RadioGroup.js +244 -0
  141. package/lib/Radio/RadioInput.js +76 -0
  142. package/lib/Radio/RadioInput.native.js +9 -1
  143. package/lib/Radio/index.js +21 -2
  144. package/lib/RadioCard/RadioCard.js +244 -0
  145. package/lib/RadioCard/RadioCardGroup.js +252 -0
  146. package/lib/RadioCard/index.js +21 -0
  147. package/lib/Search/Search.js +254 -0
  148. package/lib/Search/dictionary.js +19 -0
  149. package/lib/Search/index.js +13 -0
  150. package/lib/Select/Group.js +33 -0
  151. package/lib/Select/Group.native.js +16 -5
  152. package/lib/Select/Item.js +29 -0
  153. package/lib/Select/Item.native.js +14 -4
  154. package/lib/Select/Picker.js +84 -0
  155. package/lib/Select/Picker.native.js +73 -30
  156. package/lib/Select/Select.js +155 -85
  157. package/lib/Select/index.js +19 -6
  158. package/lib/SideNav/Item.js +63 -37
  159. package/lib/SideNav/ItemContent.js +41 -15
  160. package/lib/SideNav/ItemsGroup.js +55 -31
  161. package/lib/SideNav/SideNav.js +100 -73
  162. package/lib/SideNav/index.js +15 -1
  163. package/lib/Skeleton/Skeleton.js +64 -46
  164. package/lib/Skeleton/index.js +13 -2
  165. package/lib/Skeleton/skeleton.constant.js +12 -0
  166. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  167. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  168. package/lib/Spacer/Spacer.js +49 -18
  169. package/lib/Spacer/index.js +13 -2
  170. package/lib/StackView/StackView.js +72 -31
  171. package/lib/StackView/StackWrap.js +43 -13
  172. package/lib/StackView/StackWrap.native.js +13 -2
  173. package/lib/StackView/StackWrapBox.js +77 -29
  174. package/lib/StackView/StackWrapGap.js +56 -26
  175. package/lib/StackView/common.js +23 -6
  176. package/lib/StackView/getStackedContent.js +47 -17
  177. package/lib/StackView/index.js +29 -5
  178. package/lib/StepTracker/Step.js +245 -0
  179. package/lib/StepTracker/StepTracker.js +202 -0
  180. package/lib/StepTracker/dictionary.js +17 -0
  181. package/lib/StepTracker/index.js +13 -0
  182. package/lib/Tabs/Tabs.js +124 -0
  183. package/lib/Tabs/TabsItem.js +238 -0
  184. package/lib/Tabs/index.js +13 -0
  185. package/lib/Tags/Tags.js +148 -99
  186. package/lib/Tags/index.js +13 -2
  187. package/lib/TextInput/TextArea.js +57 -28
  188. package/lib/TextInput/TextInput.js +50 -23
  189. package/lib/TextInput/TextInputBase.js +90 -63
  190. package/lib/TextInput/index.js +23 -3
  191. package/lib/TextInput/propTypes.js +18 -7
  192. package/lib/ThemeProvider/ThemeProvider.js +46 -18
  193. package/lib/ThemeProvider/index.js +61 -6
  194. package/lib/ThemeProvider/useSetTheme.js +19 -5
  195. package/lib/ThemeProvider/useTheme.js +13 -4
  196. package/lib/ThemeProvider/useThemeTokens.js +32 -16
  197. package/lib/ThemeProvider/utils/index.js +31 -2
  198. package/lib/ThemeProvider/utils/styles.js +50 -14
  199. package/lib/ThemeProvider/utils/theme-tokens.js +121 -12
  200. package/lib/ToggleSwitch/ToggleSwitch.js +85 -56
  201. package/lib/ToggleSwitch/index.js +13 -2
  202. package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +20 -8
  203. package/lib/Tooltip/Backdrop.native.js +39 -15
  204. package/lib/Tooltip/Tooltip.js +117 -74
  205. package/lib/Tooltip/dictionary.js +9 -2
  206. package/lib/Tooltip/getTooltipPosition.js +9 -1
  207. package/lib/Tooltip/index.js +13 -2
  208. package/lib/TooltipButton/TooltipButton.js +57 -38
  209. package/lib/TooltipButton/index.js +13 -2
  210. package/lib/Typography/Typography.js +87 -41
  211. package/lib/Typography/index.js +13 -2
  212. package/lib/ViewportProvider/ViewportProvider.js +34 -13
  213. package/lib/ViewportProvider/index.js +28 -3
  214. package/lib/ViewportProvider/useViewport.js +15 -3
  215. package/lib/ViewportProvider/useViewportListener.js +24 -10
  216. package/lib/index.js +539 -33
  217. package/lib/utils/a11y/index.js +31 -1
  218. package/lib/utils/a11y/semantics.js +173 -0
  219. package/lib/utils/a11y/textSize.js +23 -7
  220. package/lib/utils/animation/index.js +15 -2
  221. package/lib/utils/animation/useVerticalExpandAnimation.js +27 -10
  222. package/lib/utils/children.js +134 -0
  223. package/lib/utils/index.js +163 -10
  224. package/lib/utils/info/index.js +18 -6
  225. package/lib/utils/info/platform/index.js +19 -7
  226. package/lib/utils/info/platform/platform.android.js +8 -1
  227. package/lib/utils/info/platform/platform.ios.js +8 -1
  228. package/lib/utils/info/platform/platform.js +8 -0
  229. package/lib/utils/info/platform/platform.native.js +8 -1
  230. package/lib/utils/info/versions.js +15 -4
  231. package/lib/utils/input.js +53 -25
  232. package/lib/utils/pressability.js +38 -10
  233. package/lib/utils/propTypes.js +287 -141
  234. package/lib/utils/useCopy.js +40 -5
  235. package/lib/utils/useHash.js +52 -0
  236. package/lib/utils/useHash.native.js +15 -0
  237. package/lib/utils/useResponsiveProp.js +21 -9
  238. package/lib/utils/useSpacingScale.js +19 -9
  239. package/lib/utils/useUniqueId.js +12 -3
  240. package/package.json +14 -9
  241. package/release-context.json +4 -4
  242. package/src/A11yText/index.jsx +6 -4
  243. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +5 -3
  244. package/src/ActivityIndicator/Spinner.native.jsx +5 -3
  245. package/src/Box/Box.jsx +132 -39
  246. package/src/Button/Button.jsx +10 -6
  247. package/src/Button/ButtonBase.jsx +99 -99
  248. package/src/Button/ButtonGroup.jsx +81 -69
  249. package/src/Button/ButtonLink.jsx +21 -15
  250. package/src/Button/propTypes.js +12 -2
  251. package/src/Card/Card.jsx +5 -31
  252. package/src/Card/CardBase.jsx +59 -0
  253. package/src/Card/PressableCardBase.jsx +119 -0
  254. package/src/Card/index.js +3 -0
  255. package/src/Checkbox/Checkbox.jsx +121 -112
  256. package/src/Checkbox/CheckboxGroup.jsx +206 -0
  257. package/src/Checkbox/{CheckboxInput.web.jsx → CheckboxInput.jsx} +0 -0
  258. package/src/Checkbox/index.js +2 -0
  259. package/src/Divider/Divider.jsx +7 -4
  260. package/src/ExpandCollapse/Accordion.jsx +3 -2
  261. package/src/ExpandCollapse/Control.jsx +40 -43
  262. package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
  263. package/src/ExpandCollapse/Panel.jsx +69 -63
  264. package/src/Feedback/Feedback.jsx +36 -33
  265. package/src/Fieldset/Fieldset.jsx +136 -0
  266. package/src/Fieldset/FieldsetContainer.jsx +31 -0
  267. package/src/Fieldset/FieldsetContainer.native.jsx +19 -0
  268. package/src/Fieldset/Legend.jsx +21 -0
  269. package/src/Fieldset/Legend.native.jsx +27 -0
  270. package/src/Fieldset/cssReset.js +14 -0
  271. package/src/Fieldset/index.js +3 -0
  272. package/src/FlexGrid/Col/Col.jsx +139 -132
  273. package/src/FlexGrid/FlexGrid.jsx +79 -51
  274. package/src/FlexGrid/Row/Row.jsx +55 -48
  275. package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
  276. package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
  277. package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
  278. package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
  279. package/src/HorizontalScroll/dictionary.js +11 -0
  280. package/src/HorizontalScroll/index.js +17 -0
  281. package/src/HorizontalScroll/itemPositions.js +101 -0
  282. package/src/Icon/Icon.jsx +43 -50
  283. package/src/Icon/IconText.jsx +23 -18
  284. package/src/Icon/index.js +2 -2
  285. package/src/IconButton/IconButton.jsx +114 -0
  286. package/src/IconButton/index.js +3 -0
  287. package/src/InputLabel/InputLabel.jsx +57 -35
  288. package/src/InputLabel/LabelContent.jsx +21 -0
  289. package/src/InputLabel/LabelContent.native.jsx +11 -2
  290. package/src/InputSupports/InputSupports.jsx +29 -45
  291. package/src/InputSupports/useInputSupports.js +30 -0
  292. package/src/Link/ChevronLink.jsx +26 -16
  293. package/src/Link/{InlinePressable.web.jsx → InlinePressable.jsx} +5 -3
  294. package/src/Link/InlinePressable.native.jsx +5 -3
  295. package/src/Link/Link.jsx +22 -16
  296. package/src/Link/LinkBase.jsx +76 -65
  297. package/src/Link/TextButton.jsx +30 -23
  298. package/src/List/List.jsx +5 -4
  299. package/src/List/ListItem.jsx +77 -82
  300. package/src/Modal/Modal.jsx +190 -0
  301. package/src/Modal/dictionary.js +9 -0
  302. package/src/Modal/index.js +3 -0
  303. package/src/Notification/Notification.jsx +164 -0
  304. package/src/Notification/dictionary.js +8 -0
  305. package/src/Notification/index.js +3 -0
  306. package/src/Pagination/PageButton.jsx +42 -35
  307. package/src/Pagination/Pagination.jsx +88 -92
  308. package/src/Pagination/SideButton.jsx +44 -41
  309. package/src/Progress/Progress.jsx +78 -0
  310. package/src/Progress/ProgressBar.jsx +123 -0
  311. package/src/Progress/ProgressBarBackground.jsx +36 -0
  312. package/src/Progress/index.js +6 -0
  313. package/src/Radio/Radio.jsx +82 -112
  314. package/src/Radio/RadioButton.jsx +142 -0
  315. package/src/Radio/RadioGroup.jsx +209 -0
  316. package/src/Radio/{RadioInput.web.jsx → RadioInput.jsx} +0 -0
  317. package/src/Radio/index.js +2 -0
  318. package/src/RadioCard/RadioCard.jsx +198 -0
  319. package/src/RadioCard/RadioCardGroup.jsx +218 -0
  320. package/src/RadioCard/index.js +5 -0
  321. package/src/Search/Search.jsx +225 -0
  322. package/src/Search/dictionary.js +12 -0
  323. package/src/Search/index.js +3 -0
  324. package/src/Select/{Group.web.jsx → Group.jsx} +0 -0
  325. package/src/Select/{Item.web.jsx → Item.jsx} +0 -0
  326. package/src/Select/Picker.jsx +74 -0
  327. package/src/Select/Picker.native.jsx +56 -49
  328. package/src/Select/Select.jsx +125 -92
  329. package/src/SideNav/Item.jsx +54 -47
  330. package/src/SideNav/ItemsGroup.jsx +50 -43
  331. package/src/SideNav/SideNav.jsx +68 -60
  332. package/src/Skeleton/Skeleton.jsx +25 -32
  333. package/src/Skeleton/skeleton.constant.js +3 -0
  334. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  335. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  336. package/src/Spacer/Spacer.jsx +11 -4
  337. package/src/StackView/StackView.jsx +54 -23
  338. package/src/StackView/StackWrap.jsx +16 -7
  339. package/src/StackView/StackWrapBox.jsx +63 -28
  340. package/src/StackView/StackWrapGap.jsx +46 -24
  341. package/src/StackView/common.jsx +3 -2
  342. package/src/StackView/getStackedContent.jsx +8 -2
  343. package/src/StepTracker/Step.jsx +202 -0
  344. package/src/StepTracker/StepTracker.jsx +174 -0
  345. package/src/StepTracker/dictionary.js +10 -0
  346. package/src/StepTracker/index.js +3 -0
  347. package/src/Tabs/Tabs.jsx +97 -0
  348. package/src/Tabs/TabsItem.jsx +212 -0
  349. package/src/Tabs/index.js +3 -0
  350. package/src/Tags/Tags.jsx +115 -102
  351. package/src/TextInput/TextArea.jsx +5 -4
  352. package/src/TextInput/TextInput.jsx +5 -4
  353. package/src/TextInput/TextInputBase.jsx +95 -98
  354. package/src/ThemeProvider/ThemeProvider.jsx +11 -7
  355. package/src/ThemeProvider/useSetTheme.js +4 -0
  356. package/src/ThemeProvider/useThemeTokens.js +2 -2
  357. package/src/ThemeProvider/utils/styles.js +18 -5
  358. package/src/ThemeProvider/utils/theme-tokens.js +74 -5
  359. package/src/ToggleSwitch/ToggleSwitch.jsx +50 -52
  360. package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
  361. package/src/Tooltip/Tooltip.jsx +135 -131
  362. package/src/TooltipButton/TooltipButton.jsx +23 -27
  363. package/src/Typography/Typography.jsx +71 -47
  364. package/src/index.js +23 -2
  365. package/src/utils/a11y/index.js +1 -0
  366. package/src/utils/a11y/semantics.js +162 -0
  367. package/src/utils/children.jsx +119 -0
  368. package/src/utils/index.js +3 -0
  369. package/src/utils/info/platform/platform.js +1 -0
  370. package/src/utils/info/versions.js +2 -2
  371. package/src/utils/input.js +36 -25
  372. package/src/utils/pressability.js +4 -0
  373. package/src/utils/propTypes.js +199 -72
  374. package/src/utils/useCopy.js +30 -4
  375. package/src/utils/useHash.js +39 -0
  376. package/src/utils/useHash.native.js +6 -0
  377. package/stories/A11yText/A11yText.stories.jsx +6 -10
  378. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +1 -1
  379. package/stories/Box/Box.stories.jsx +1 -1
  380. package/stories/Button/Button.stories.jsx +2 -2
  381. package/stories/Button/ButtonGroup.stories.jsx +1 -1
  382. package/stories/Button/ButtonLink.stories.jsx +1 -1
  383. package/stories/Card/Card.stories.jsx +1 -1
  384. package/stories/Checkbox/Checkbox.stories.jsx +24 -1
  385. package/stories/Divider/Divider.stories.jsx +1 -1
  386. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +2 -2
  387. package/stories/Feedback/Feedback.stories.jsx +1 -1
  388. package/stories/FlexGrid/01 FlexGrid.stories.jsx +1 -1
  389. package/stories/FlexGrid/02 Row.stories.jsx +1 -1
  390. package/stories/FlexGrid/03 Col.stories.jsx +1 -1
  391. package/stories/Icon/Icon.stories.jsx +27 -7
  392. package/stories/IconButton/IconButton.stories.jsx +50 -0
  393. package/stories/InputLabel/InputLabel.stories.jsx +1 -1
  394. package/stories/Link/ChevronLink.stories.jsx +1 -1
  395. package/stories/Link/Link.stories.jsx +17 -21
  396. package/stories/Link/TextButton.stories.jsx +1 -1
  397. package/stories/List/List.stories.jsx +1 -1
  398. package/stories/Modal/Modal.stories.jsx +29 -0
  399. package/stories/Notification/Notification.stories.jsx +82 -0
  400. package/stories/Pagination/Pagination.stories.jsx +1 -1
  401. package/stories/Progress/Progress.stories.jsx +93 -0
  402. package/stories/Radio/Radio.stories.jsx +23 -36
  403. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  404. package/stories/Search/Search.stories.jsx +16 -0
  405. package/stories/Select/Select.stories.jsx +1 -1
  406. package/stories/SideNav/SideNav.stories.jsx +1 -1
  407. package/stories/SideNav/SideNavItem.stories.jsx +1 -1
  408. package/stories/SideNav/SideNavItemsGroup.stories.jsx +1 -1
  409. package/stories/Skeleton/Skeleton.stories.jsx +2 -2
  410. package/stories/Spacer/Spacer.stories.jsx +1 -1
  411. package/stories/StackView/StackView.stories.jsx +1 -1
  412. package/stories/StackView/StackWrap.stories.jsx +1 -1
  413. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  414. package/stories/Tabs/Tabs.stories.jsx +97 -0
  415. package/stories/Tags/Tags.stories.jsx +1 -1
  416. package/stories/TextInput/TextArea.stories.jsx +1 -1
  417. package/stories/TextInput/TextInput.stories.jsx +1 -1
  418. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +1 -1
  419. package/stories/Tooltip/Tooltip.stories.jsx +1 -1
  420. package/stories/TooltipButton/TooltipButton.stories.jsx +1 -1
  421. package/stories/Typography/Typography.stories.jsx +1 -1
  422. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  423. package/stories/supports.jsx +37 -3
  424. package/__fixtures__/accessible.icon.svg +0 -6
  425. package/babel.config.json +0 -8
  426. package/docs/Contributing.stories.mdx +0 -9
  427. package/docs/Fonts.stories.mdx +0 -104
  428. package/docs/Icons.stories.mdx +0 -144
  429. package/docs/Introduction.stories.mdx +0 -9
  430. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  431. package/lib/Checkbox/CheckboxInput.web.js +0 -57
  432. package/lib/InputLabel/LabelContent.web.js +0 -17
  433. package/lib/Link/InlinePressable.web.js +0 -32
  434. package/lib/Radio/RadioInput.web.js +0 -59
  435. package/lib/Select/Group.web.js +0 -18
  436. package/lib/Select/Item.web.js +0 -15
  437. package/lib/Select/Picker.web.js +0 -63
  438. package/lib/config/svgr-icons-web.js +0 -9
  439. package/lib/config/svgr-icons.js +0 -52
  440. package/lib/utils/info/platform/platform.web.js +0 -1
  441. package/src/InputLabel/LabelContent.web.jsx +0 -13
  442. package/src/Select/Picker.web.jsx +0 -67
  443. package/src/config/svgr-icons-web.js +0 -11
  444. package/src/config/svgr-icons.js +0 -46
  445. package/src/utils/info/platform/platform.web.js +0 -1
@@ -0,0 +1,164 @@
1
+ import React, { forwardRef, 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 = forwardRef(
85
+ ({ children, system, dismissible, copy = 'en', tokens, variant }, ref) => {
86
+ const [isDismissed, setIsDismissed] = useState(false)
87
+ const themeTokens = useThemeTokens('Notification', tokens, variant, { system })
88
+ const getCopy = useCopy({ dictionary, copy })
89
+
90
+ if (isDismissed) {
91
+ return null
92
+ }
93
+
94
+ const textStyles = selectTextStyles(themeTokens)
95
+
96
+ const content =
97
+ typeof children === 'string' ? <Text style={textStyles}>{children}</Text> : children
98
+
99
+ const { icon: IconComponent, dismissIcon: DismissIconComponent } = themeTokens
100
+
101
+ const onDismissPress = () => setIsDismissed(true)
102
+
103
+ // TODO: replace the dismiss button with IconButton when implemented (https://github.com/telus/universal-design-system/issues/281)
104
+ return (
105
+ <View ref={ref} style={[staticStyles.container, selectContainerStyles(themeTokens)]}>
106
+ {IconComponent && (
107
+ <View style={selectIconContainerStyles(themeTokens)}>
108
+ <IconComponent {...selectIconProps(themeTokens)} />
109
+ </View>
110
+ )}
111
+ <View style={staticStyles.contentContainer}>
112
+ {content && typeof content === 'function' ? content({ textStyles, variant }) : content}
113
+ </View>
114
+ {dismissible && DismissIconComponent && (
115
+ <View style={selectDismissButtonContainerStyles(themeTokens)}>
116
+ <ButtonBase
117
+ onPress={onDismissPress}
118
+ accessibilityRole="button"
119
+ accessibilityLabel={getCopy('dismiss')}
120
+ >
121
+ {() => <DismissIconComponent {...selectDismissIconProps(themeTokens)} />}
122
+ </ButtonBase>
123
+ </View>
124
+ )}
125
+ </View>
126
+ )
127
+ }
128
+ )
129
+ Notification.displayName = 'Notification'
130
+
131
+ Notification.propTypes = {
132
+ /**
133
+ * Content of the `Notification`.
134
+ */
135
+ children: PropTypes.oneOfType([PropTypes.string, PropTypes.node, PropTypes.func]),
136
+ /**
137
+ * Use `system` prop to set the visual style of the notification and denote an announcement from the system or application
138
+ */
139
+ system: PropTypes.bool,
140
+ /**
141
+ * Use the `dismissible` prop to allow users to dismiss the Notification at any time.
142
+ */
143
+ dismissible: PropTypes.bool,
144
+ /**
145
+ * Select english or french copy for the accessible label of the dismiss button.
146
+ */
147
+ copy: PropTypes.oneOfType([
148
+ PropTypes.oneOf(['en', 'fr']),
149
+ PropTypes.shape({ dismiss: PropTypes.string })
150
+ ]),
151
+ tokens: getTokensPropType('Notification'),
152
+ variant: variantProp.propType
153
+ }
154
+
155
+ export default Notification
156
+
157
+ const staticStyles = StyleSheet.create({
158
+ container: {
159
+ flexDirection: 'row'
160
+ },
161
+ contentContainer: {
162
+ flex: 1
163
+ }
164
+ })
@@ -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
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
 
4
4
  import ButtonBase from '../Button/ButtonBase'
@@ -8,7 +8,6 @@ import {
8
8
  copyPropTypes,
9
9
  getTokensPropType,
10
10
  hrefAttrsProp,
11
- linkProps,
12
11
  selectTokens,
13
12
  variantProp
14
13
  } from '../utils'
@@ -16,51 +15,59 @@ import {
16
15
  import useCopy from '../utils/useCopy'
17
16
  import dictionary from './dictionary'
18
17
 
19
- function PageButton({ label, onPress, href, isActive, copy, variant, tokens, ...props }) {
20
- const getTokens = useThemeTokensCallback('PaginationPageButton', tokens, variant)
18
+ const PageButton = forwardRef(
19
+ ({ label, onPress, href, isActive, copy, variant, tokens, ...props }, ref) => {
20
+ const getTokens = useThemeTokensCallback('PaginationPageButton', tokens, variant)
21
21
 
22
- const getCopy = useCopy({ dictionary, copy })
22
+ const getCopy = useCopy({ dictionary, copy })
23
23
 
24
- const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
24
+ const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
25
25
 
26
- const activeProps = isActive
27
- ? {
28
- selected: true,
29
- ...a11yProps.nonFocusableProps,
30
- // a brute fix for the focus state being stuck on an active item since it becomes non-focusable
31
- // (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
32
- key: 'active-item'
33
- }
34
- : {}
26
+ const activeProps = isActive
27
+ ? {
28
+ selected: true,
29
+ ...a11yProps.nonFocusableProps,
30
+ // a brute fix for the focus state being stuck on an active item since it becomes non-focusable
31
+ // (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
32
+ key: 'active-item'
33
+ }
34
+ : {}
35
35
 
36
- const accessibilityRole = href !== undefined ? 'link' : 'button'
37
- const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : ''
38
- const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`
36
+ const accessibilityRole = href !== undefined ? 'link' : 'button'
37
+ const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : ''
38
+ const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`
39
39
 
40
- const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
41
- const buttonProps = {
42
- accessibilityRole,
43
- accessibilityLabel,
44
- onPress,
45
- href,
46
- hrefAttrs,
47
- ...rest
48
- }
40
+ const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
41
+ const buttonProps = {
42
+ accessibilityRole,
43
+ accessibilityLabel,
44
+ onPress,
45
+ href,
46
+ hrefAttrs,
47
+ ...rest
48
+ }
49
49
 
50
- return (
51
- <ButtonBase {...buttonProps} tokens={getButtonTokens} {...activeProps}>
52
- {label}
53
- </ButtonBase>
54
- )
55
- }
50
+ return (
51
+ <ButtonBase ref={ref} {...buttonProps} tokens={getButtonTokens} {...activeProps}>
52
+ {label}
53
+ </ButtonBase>
54
+ )
55
+ }
56
+ )
57
+ PageButton.displayName = 'PageButton'
56
58
 
57
59
  PageButton.propTypes = {
60
+ // Spreading any props into a secondary component accessed like Pagination.PageButton
61
+ // crashes a Docusaurus props table, but only in production, not in development
62
+ onPress: PropTypes.func,
63
+ href: PropTypes.string,
64
+ // If the above is fixed, the above can be replaced with this which includes full a11y etc:
65
+ // ...linkProps.types,
58
66
  label: PropTypes.string,
59
67
  isActive: PropTypes.bool,
60
68
  copy: copyPropTypes,
61
69
  variant: variantProp.propType,
62
- tokens: getTokensPropType('PaginationPageButton'),
63
- ...linkProps.types
70
+ tokens: getTokensPropType('PaginationPageButton')
64
71
  }
65
72
 
66
73
  export default PageButton
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import { View, Text, StyleSheet } from 'react-native'
3
3
 
4
4
  import { componentPropType, copyPropTypes, getTokensPropType, variantProp } from '../utils'
@@ -19,99 +19,95 @@ const selectTextStyles = ({ color, fontName, fontSize, fontWeight, lineHeight })
19
19
  lineHeight
20
20
  })
21
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
-
22
+ const Pagination = forwardRef(
23
+ ({ children, copy = 'en', variant, tokens, sideButtonVariant, sideButtonTokens }, ref) => {
24
+ const viewport = useViewport()
25
+ const { truncateAbove, gap, ...themeTokens } = useThemeTokens('Pagination', tokens, variant, {
26
+ viewport
27
+ })
28
+
29
+ const items = React.Children.toArray(children)
30
+
31
+ const {
32
+ isItemActive,
33
+ getItemProps,
34
+ showPrevious,
35
+ showNext,
36
+ nextItemProps,
37
+ previousItemProps,
38
+ shouldRenderButton,
39
+ shouldRenderEllipsis
40
+ } = usePagination({
41
+ items,
42
+ truncateAbove
43
+ })
44
+
45
+ const ellipsisTextStyles = selectTextStyles(themeTokens)
46
+
47
+ if (items.length === 0) {
88
48
  return null
89
- }),
90
- showNext && (
91
- <SideButton
92
- {...nextItemProps}
93
- direction="next"
94
- copy={copy}
95
- variant={sideButtonVariant}
96
- tokens={sideButtonTokens}
97
- />
49
+ }
50
+
51
+ // TODO: replace with a spacing component when https://github.com/telus/universal-design-system/pull/531 is implemented
52
+ // concatenate all items to easily wrap them in identical spacing components
53
+ const buttons = [
54
+ showPrevious && (
55
+ <SideButton
56
+ {...previousItemProps}
57
+ direction="previous"
58
+ copy={copy}
59
+ variant={sideButtonVariant}
60
+ tokens={sideButtonTokens}
61
+ />
62
+ ),
63
+ ...items.map((child, itemIndex) => {
64
+ const buttonLabel = `${itemIndex + 1}`
65
+ const itemProps = getItemProps(itemIndex)
66
+
67
+ if (shouldRenderButton(itemIndex)) {
68
+ return (
69
+ <PageButton
70
+ {...itemProps}
71
+ label={buttonLabel}
72
+ copy={copy}
73
+ isActive={isItemActive(itemIndex)}
74
+ />
75
+ )
76
+ }
77
+
78
+ if (shouldRenderEllipsis(itemIndex)) {
79
+ return <Text style={ellipsisTextStyles}>...</Text>
80
+ }
81
+
82
+ return null
83
+ }),
84
+ showNext && (
85
+ <SideButton
86
+ {...nextItemProps}
87
+ direction="next"
88
+ copy={copy}
89
+ variant={sideButtonVariant}
90
+ tokens={sideButtonTokens}
91
+ />
92
+ )
93
+ ]
94
+
95
+ return (
96
+ <View style={staticStyles.container} ref={ref}>
97
+ {buttons
98
+ // keep the keys in-line with the page numbers regardless of which buttons are actually rendered
99
+ .map((element, index) => [element, `page-${index + 1}`])
100
+ .filter(([element]) => element !== null)
101
+ .map(([element, key]) => (
102
+ <Box right={gap} key={key}>
103
+ {element}
104
+ </Box>
105
+ ))}
106
+ </View>
98
107
  )
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
- }
108
+ }
109
+ )
110
+ PageButton.displayName = 'PageButton'
115
111
 
116
112
  Pagination.PageButton = PageButton
117
113
 
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import { Text } from 'react-native'
3
3
 
4
4
  import PropTypes from 'prop-types'
@@ -25,53 +25,56 @@ const directionToSide = {
25
25
  next: 'right'
26
26
  }
27
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)
28
+ const SideButton = forwardRef(
29
+ ({ direction = 'previous', onPress, href, copy, variant, tokens, ...props }, ref) => {
30
+ const viewport = useViewport()
31
+ const buttonVariant = { direction, viewport, ...variant }
32
+ const getTokens = useThemeTokensCallback('PaginationSideButton', tokens, buttonVariant)
32
33
 
33
- const getCopy = useCopy({ dictionary, copy })
34
+ const getCopy = useCopy({ dictionary, copy })
34
35
 
35
- const { icon } = getTokens(tokens, buttonVariant)
36
+ const { icon } = getTokens(tokens, buttonVariant)
36
37
 
37
- const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
38
- const getIconTokens = (buttonState) => selectIconTokens(getTokens(buttonState), direction)
38
+ const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
39
+ const getIconTokens = (buttonState) => selectIconTokens(getTokens(buttonState), direction)
39
40
 
40
- const label = direction === 'previous' ? getCopy('previousText') : getCopy('nextText')
41
- const showLabel = viewport !== 'sm' && viewport !== 'xs'
41
+ const label = direction === 'previous' ? getCopy('previousText') : getCopy('nextText')
42
+ const showLabel = viewport !== 'sm' && viewport !== 'xs'
42
43
 
43
- const accessibilityLabel =
44
- direction === 'previous' ? getCopy('previousLabel') : getCopy('nextLabel')
45
- const accessibilityRole = href !== undefined ? 'link' : 'button'
44
+ const accessibilityLabel =
45
+ direction === 'previous' ? getCopy('previousLabel') : getCopy('nextLabel')
46
+ const accessibilityRole = href !== undefined ? 'link' : 'button'
46
47
 
47
- const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
48
- const buttonProps = {
49
- accessibilityRole,
50
- accessibilityLabel,
51
- onPress,
52
- href,
53
- hrefAttrs,
54
- ...rest
55
- }
48
+ const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
49
+ const buttonProps = {
50
+ accessibilityRole,
51
+ accessibilityLabel,
52
+ onPress,
53
+ href,
54
+ hrefAttrs,
55
+ ...rest
56
+ }
56
57
 
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
- }
58
+ return (
59
+ <ButtonBase ref={ref} {...buttonProps} tokens={getButtonTokens}>
60
+ {({ textStyles, ...buttonState }) => {
61
+ const iconProps = { tokens: getIconTokens(buttonState) }
62
+ return (
63
+ <IconText
64
+ icon={icon}
65
+ space={1}
66
+ iconPosition={directionToSide[direction]}
67
+ iconProps={iconProps}
68
+ >
69
+ {showLabel && <Text style={textStyles}>{label}</Text>}
70
+ </IconText>
71
+ )
72
+ }}
73
+ </ButtonBase>
74
+ )
75
+ }
76
+ )
77
+ SideButton.displayName = 'SideButton'
75
78
 
76
79
  SideButton.propTypes = {
77
80
  direction: PropTypes.oneOf(['previous', 'next']),
@@ -0,0 +1,78 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { View } from 'react-native'
4
+
5
+ import { a11yProps } from '../utils/propTypes'
6
+ import { useThemeTokens } from '../ThemeProvider'
7
+ import { getTokensPropType, variantProp } from '../utils'
8
+
9
+ const selectProgressStyles = ({
10
+ backgroundColor,
11
+ borderWidth,
12
+ borderColor,
13
+ borderRadius,
14
+ height
15
+ }) => ({
16
+ backgroundColor,
17
+ borderWidth,
18
+ borderColor,
19
+ borderRadius,
20
+ height
21
+ })
22
+
23
+ /**
24
+ * The `Progress` is a container for displaying one or several `ProgressBar`s.
25
+ *
26
+ * ## Props
27
+ *
28
+ * - Use `children` prop to pass one or multiple `ProgressBar`s. Note that in case of stacked progress bars
29
+ * each next will be displayed on top of the previous one.
30
+ *
31
+ * ## Tokens
32
+ *
33
+ * - Use the following tokens to customize the appearance:
34
+ * - `backgroundColor` for the background color of the progress container,
35
+ * - `borderColor` to control the color of the border,
36
+ * - `borderRadius` for the rounded corners,
37
+ * - `borderWidth` to change the border width.
38
+ * - `height` to control the height of the progress bars displayed within the progress bar container.
39
+ *
40
+ * ## Variants
41
+ *
42
+ * - Use the `size` variant to control the height of your progress bars: passing `'mini'` will make your
43
+ * progress bar container narrower.
44
+ *
45
+ * ## Usability and A11y guidelines
46
+ *
47
+ * `Progress` component accepts the standard accessibility properties, however it's more important to make sure
48
+ * its children (instances of `ProgressBar`) receive the accessibility properties specific to the `progressbar`
49
+ * role.
50
+ *
51
+ */
52
+ const Progress = forwardRef(({ children, tokens, variant, ...rest }, ref) => {
53
+ const themeTokens = useThemeTokens('Progress', tokens, variant)
54
+
55
+ return (
56
+ <View ref={ref} style={selectProgressStyles(themeTokens)} {...a11yProps.select(rest)}>
57
+ {children}
58
+ </View>
59
+ )
60
+ })
61
+ Progress.displayName = 'Progress'
62
+
63
+ Progress.propTypes = {
64
+ /**
65
+ * Use the `children` prop to supply one or several `ProgressBar`s.
66
+ */
67
+ children: PropTypes.node.isRequired,
68
+ /**
69
+ * Progress tokens.
70
+ */
71
+ tokens: getTokensPropType('Progress'),
72
+ /**
73
+ * Progress variant.
74
+ */
75
+ variant: variantProp.propType
76
+ }
77
+
78
+ export default Progress