@telus-uds/components-base 0.0.2-prerelease.6 → 1.0.0

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 (458) hide show
  1. package/.eslintrc.js +9 -0
  2. package/.ultra.cache.json +1 -1
  3. package/CHANGELOG.md +85 -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 +851 -57
  9. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  10. package/__tests__/Button/ButtonBase.test.jsx +2 -31
  11. package/__tests__/Button/ButtonGroup.test.jsx +6 -7
  12. package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
  13. package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
  14. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
  15. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
  16. package/__tests__/Icon/Icon.test.jsx +3 -3
  17. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  18. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  19. package/__tests__/Link/LinkBase.test.jsx +0 -14
  20. package/__tests__/List/List.test.jsx +60 -0
  21. package/__tests__/Modal/Modal.test.jsx +47 -0
  22. package/__tests__/Notification/Notification.test.jsx +20 -0
  23. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  24. package/__tests__/Progress/Progress.test.jsx +79 -0
  25. package/__tests__/Radio/Radio.test.jsx +87 -0
  26. package/__tests__/Radio/RadioGroup.test.jsx +220 -0
  27. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  28. package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
  29. package/__tests__/Search/Search.test.jsx +73 -0
  30. package/__tests__/Select/Select.test.jsx +94 -0
  31. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  32. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  33. package/__tests__/Tabs/Tabs.test.jsx +40 -0
  34. package/__tests__/Tags/Tags.test.jsx +327 -0
  35. package/__tests__/TextInput/TextArea.test.jsx +35 -0
  36. package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +29 -50
  37. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
  38. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
  39. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
  40. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
  41. package/__tests__/utils/children.test.jsx +128 -0
  42. package/__tests__/utils/input.test.js +59 -1
  43. package/__tests__/utils/semantics.test.jsx +43 -0
  44. package/__tests__/utils/useCopy.test.js +14 -3
  45. package/babel.config.js +20 -0
  46. package/jest.config.js +8 -3
  47. package/lib/A11yInfoProvider/index.js +54 -26
  48. package/lib/A11yText/index.js +45 -17
  49. package/lib/ActivityIndicator/Spinner.js +81 -0
  50. package/lib/ActivityIndicator/Spinner.native.js +129 -91
  51. package/lib/ActivityIndicator/index.js +28 -12
  52. package/lib/ActivityIndicator/shared.js +27 -12
  53. package/lib/BaseProvider/index.js +34 -11
  54. package/lib/Box/Box.js +152 -35
  55. package/lib/Box/index.js +13 -2
  56. package/lib/Button/Button.js +41 -12
  57. package/lib/Button/ButtonBase.js +125 -97
  58. package/lib/Button/ButtonGroup.js +112 -89
  59. package/lib/Button/ButtonLink.js +48 -17
  60. package/lib/Button/index.js +31 -4
  61. package/lib/Button/propTypes.js +32 -9
  62. package/lib/Card/Card.js +38 -41
  63. package/lib/Card/CardBase.js +85 -0
  64. package/lib/Card/PressableCardBase.js +141 -0
  65. package/lib/Card/index.js +40 -2
  66. package/lib/Checkbox/Checkbox.js +355 -0
  67. package/lib/Checkbox/CheckboxGroup.js +241 -0
  68. package/lib/Checkbox/CheckboxInput.js +74 -0
  69. package/lib/Checkbox/CheckboxInput.native.js +14 -0
  70. package/lib/Checkbox/index.js +21 -0
  71. package/lib/Divider/Divider.js +59 -28
  72. package/lib/Divider/index.js +13 -2
  73. package/lib/ExpandCollapse/Accordion.js +26 -7
  74. package/lib/ExpandCollapse/Control.js +60 -31
  75. package/lib/ExpandCollapse/ExpandCollapse.js +50 -28
  76. package/lib/ExpandCollapse/Panel.js +83 -44
  77. package/lib/ExpandCollapse/index.js +25 -7
  78. package/lib/Feedback/Feedback.js +90 -39
  79. package/lib/Feedback/index.js +13 -2
  80. package/lib/Fieldset/Fieldset.js +165 -0
  81. package/lib/Fieldset/FieldsetContainer.js +46 -0
  82. package/lib/Fieldset/FieldsetContainer.native.js +38 -0
  83. package/lib/Fieldset/Legend.js +38 -0
  84. package/lib/Fieldset/Legend.native.js +48 -0
  85. package/lib/Fieldset/cssReset.js +21 -0
  86. package/lib/Fieldset/index.js +13 -0
  87. package/lib/FlexGrid/Col/Col.js +73 -41
  88. package/lib/FlexGrid/Col/index.js +13 -2
  89. package/lib/FlexGrid/FlexGrid.js +99 -49
  90. package/lib/FlexGrid/Row/Row.js +58 -30
  91. package/lib/FlexGrid/Row/index.js +13 -2
  92. package/lib/FlexGrid/helpers/index.js +9 -1
  93. package/lib/FlexGrid/index.js +13 -2
  94. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  95. package/lib/HorizontalScroll/HorizontalScroll.js +200 -0
  96. package/lib/HorizontalScroll/HorizontalScrollButton.js +127 -0
  97. package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
  98. package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
  99. package/lib/HorizontalScroll/dictionary.js +18 -0
  100. package/lib/HorizontalScroll/index.js +35 -0
  101. package/lib/HorizontalScroll/itemPositions.js +128 -0
  102. package/lib/Icon/Icon.js +62 -50
  103. package/lib/Icon/IconText.js +101 -0
  104. package/lib/Icon/index.js +31 -3
  105. package/lib/IconButton/IconButton.js +140 -0
  106. package/lib/IconButton/index.js +13 -0
  107. package/lib/InputLabel/InputLabel.js +102 -40
  108. package/lib/InputLabel/LabelContent.js +41 -0
  109. package/lib/InputLabel/LabelContent.native.js +32 -6
  110. package/lib/InputLabel/index.js +13 -2
  111. package/lib/InputSupports/InputSupports.js +109 -0
  112. package/lib/InputSupports/index.js +13 -0
  113. package/lib/InputSupports/propTypes.js +66 -0
  114. package/lib/InputSupports/useInputSupports.js +41 -0
  115. package/lib/Link/ChevronLink.js +58 -31
  116. package/lib/Link/InlinePressable.js +56 -0
  117. package/lib/Link/InlinePressable.native.js +102 -0
  118. package/lib/Link/Link.js +39 -15
  119. package/lib/Link/LinkBase.js +126 -150
  120. package/lib/Link/TextButton.js +53 -18
  121. package/lib/Link/index.js +39 -4
  122. package/lib/List/List.js +81 -0
  123. package/lib/List/ListItem.js +245 -0
  124. package/lib/List/index.js +13 -0
  125. package/lib/Modal/Modal.js +231 -0
  126. package/lib/Modal/dictionary.js +16 -0
  127. package/lib/Modal/index.js +13 -0
  128. package/lib/Notification/Notification.js +216 -0
  129. package/lib/Notification/dictionary.js +15 -0
  130. package/lib/Notification/index.js +13 -0
  131. package/lib/Pagination/PageButton.js +58 -48
  132. package/lib/Pagination/Pagination.js +78 -43
  133. package/lib/Pagination/SideButton.js +79 -58
  134. package/lib/Pagination/dictionary.js +9 -2
  135. package/lib/Pagination/index.js +13 -2
  136. package/lib/Pagination/usePagination.js +12 -2
  137. package/lib/Progress/Progress.js +104 -0
  138. package/lib/Progress/ProgressBar.js +157 -0
  139. package/lib/Progress/ProgressBarBackground.js +61 -0
  140. package/lib/Progress/index.js +16 -0
  141. package/lib/Radio/Radio.js +293 -0
  142. package/lib/Radio/RadioButton.js +152 -0
  143. package/lib/Radio/RadioGroup.js +244 -0
  144. package/lib/Radio/RadioInput.js +76 -0
  145. package/lib/Radio/RadioInput.native.js +14 -0
  146. package/lib/Radio/index.js +21 -0
  147. package/lib/RadioCard/RadioCard.js +244 -0
  148. package/lib/RadioCard/RadioCardGroup.js +252 -0
  149. package/lib/RadioCard/index.js +21 -0
  150. package/lib/Search/Search.js +254 -0
  151. package/lib/Search/dictionary.js +19 -0
  152. package/lib/Search/index.js +13 -0
  153. package/lib/Select/Group.js +33 -0
  154. package/lib/Select/Group.native.js +25 -0
  155. package/lib/Select/Item.js +29 -0
  156. package/lib/Select/Item.native.js +19 -0
  157. package/lib/Select/Picker.js +84 -0
  158. package/lib/Select/Picker.native.js +130 -0
  159. package/lib/Select/Select.js +342 -0
  160. package/lib/Select/index.js +19 -0
  161. package/lib/SideNav/Item.js +63 -37
  162. package/lib/SideNav/ItemContent.js +41 -15
  163. package/lib/SideNav/ItemsGroup.js +55 -31
  164. package/lib/SideNav/SideNav.js +100 -73
  165. package/lib/SideNav/index.js +15 -1
  166. package/lib/Skeleton/Skeleton.js +137 -0
  167. package/lib/Skeleton/index.js +13 -0
  168. package/lib/Skeleton/skeleton.constant.js +12 -0
  169. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  170. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  171. package/lib/Spacer/Spacer.js +49 -18
  172. package/lib/Spacer/index.js +13 -2
  173. package/lib/StackView/StackView.js +71 -31
  174. package/lib/StackView/StackWrap.js +43 -13
  175. package/lib/StackView/StackWrap.native.js +13 -2
  176. package/lib/StackView/StackWrapBox.js +76 -29
  177. package/lib/StackView/StackWrapGap.js +56 -26
  178. package/lib/StackView/common.js +23 -6
  179. package/lib/StackView/getStackedContent.js +47 -17
  180. package/lib/StackView/index.js +29 -5
  181. package/lib/StepTracker/Step.js +245 -0
  182. package/lib/StepTracker/StepTracker.js +202 -0
  183. package/lib/StepTracker/dictionary.js +17 -0
  184. package/lib/StepTracker/index.js +13 -0
  185. package/lib/Tabs/Tabs.js +124 -0
  186. package/lib/Tabs/TabsItem.js +238 -0
  187. package/lib/Tabs/index.js +13 -0
  188. package/lib/Tags/Tags.js +266 -0
  189. package/lib/Tags/index.js +13 -0
  190. package/lib/TextInput/TextArea.js +111 -0
  191. package/lib/TextInput/TextInput.js +50 -304
  192. package/lib/TextInput/TextInputBase.js +256 -0
  193. package/lib/TextInput/index.js +23 -2
  194. package/lib/TextInput/propTypes.js +42 -0
  195. package/lib/ThemeProvider/ThemeProvider.js +46 -18
  196. package/lib/ThemeProvider/index.js +61 -6
  197. package/lib/ThemeProvider/useSetTheme.js +19 -5
  198. package/lib/ThemeProvider/useTheme.js +13 -4
  199. package/lib/ThemeProvider/useThemeTokens.js +86 -19
  200. package/lib/ThemeProvider/utils/index.js +31 -2
  201. package/lib/ThemeProvider/utils/styles.js +50 -14
  202. package/lib/ThemeProvider/utils/theme-tokens.js +121 -12
  203. package/lib/ToggleSwitch/ToggleSwitch.js +86 -57
  204. package/lib/ToggleSwitch/index.js +13 -2
  205. package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +20 -8
  206. package/lib/Tooltip/Backdrop.native.js +39 -15
  207. package/lib/Tooltip/Tooltip.js +117 -74
  208. package/lib/Tooltip/dictionary.js +9 -2
  209. package/lib/Tooltip/getTooltipPosition.js +9 -1
  210. package/lib/Tooltip/index.js +13 -2
  211. package/lib/TooltipButton/TooltipButton.js +57 -38
  212. package/lib/TooltipButton/index.js +13 -2
  213. package/lib/Typography/Typography.js +86 -55
  214. package/lib/Typography/index.js +13 -2
  215. package/lib/ViewportProvider/ViewportProvider.js +34 -13
  216. package/lib/ViewportProvider/index.js +28 -3
  217. package/lib/ViewportProvider/useViewport.js +15 -3
  218. package/lib/ViewportProvider/useViewportListener.js +24 -10
  219. package/lib/index.js +539 -26
  220. package/lib/utils/a11y/index.js +31 -0
  221. package/lib/utils/a11y/semantics.js +173 -0
  222. package/lib/utils/a11y/textSize.js +49 -0
  223. package/lib/utils/animation/index.js +15 -2
  224. package/lib/utils/animation/useVerticalExpandAnimation.js +27 -10
  225. package/lib/utils/children.js +134 -0
  226. package/lib/utils/index.js +163 -7
  227. package/lib/utils/info/index.js +19 -0
  228. package/lib/utils/info/platform/index.js +23 -0
  229. package/lib/utils/info/platform/platform.android.js +8 -0
  230. package/lib/utils/info/platform/platform.ios.js +8 -0
  231. package/lib/utils/info/platform/platform.js +8 -0
  232. package/lib/utils/info/platform/platform.native.js +11 -0
  233. package/lib/utils/info/versions.js +16 -0
  234. package/lib/utils/input.js +53 -25
  235. package/lib/utils/pressability.js +120 -0
  236. package/lib/utils/propTypes.js +338 -132
  237. package/lib/utils/useCopy.js +40 -5
  238. package/lib/utils/useHash.js +52 -0
  239. package/lib/utils/useHash.native.js +15 -0
  240. package/lib/utils/useResponsiveProp.js +21 -9
  241. package/lib/utils/useSpacingScale.js +19 -9
  242. package/lib/utils/useUniqueId.js +12 -3
  243. package/package.json +16 -10
  244. package/release-context.json +4 -4
  245. package/src/A11yText/index.jsx +6 -4
  246. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +5 -3
  247. package/src/ActivityIndicator/Spinner.native.jsx +5 -3
  248. package/src/Box/Box.jsx +131 -39
  249. package/src/Button/Button.jsx +13 -6
  250. package/src/Button/ButtonBase.jsx +134 -125
  251. package/src/Button/ButtonGroup.jsx +85 -86
  252. package/src/Button/ButtonLink.jsx +22 -7
  253. package/src/Button/propTypes.js +12 -2
  254. package/src/Card/Card.jsx +5 -31
  255. package/src/Card/CardBase.jsx +58 -0
  256. package/src/Card/PressableCardBase.jsx +119 -0
  257. package/src/Card/index.js +3 -0
  258. package/src/Checkbox/Checkbox.jsx +284 -0
  259. package/src/Checkbox/CheckboxGroup.jsx +206 -0
  260. package/src/Checkbox/CheckboxInput.jsx +55 -0
  261. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  262. package/src/Checkbox/index.js +5 -0
  263. package/src/Divider/Divider.jsx +7 -4
  264. package/src/ExpandCollapse/Accordion.jsx +3 -2
  265. package/src/ExpandCollapse/Control.jsx +40 -43
  266. package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
  267. package/src/ExpandCollapse/Panel.jsx +69 -63
  268. package/src/Feedback/Feedback.jsx +42 -30
  269. package/src/Fieldset/Fieldset.jsx +136 -0
  270. package/src/Fieldset/FieldsetContainer.jsx +31 -0
  271. package/src/Fieldset/FieldsetContainer.native.jsx +19 -0
  272. package/src/Fieldset/Legend.jsx +21 -0
  273. package/src/Fieldset/Legend.native.jsx +27 -0
  274. package/src/Fieldset/cssReset.js +14 -0
  275. package/src/Fieldset/index.js +3 -0
  276. package/src/FlexGrid/Col/Col.jsx +139 -132
  277. package/src/FlexGrid/FlexGrid.jsx +79 -51
  278. package/src/FlexGrid/Row/Row.jsx +55 -48
  279. package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
  280. package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
  281. package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
  282. package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
  283. package/src/HorizontalScroll/dictionary.js +11 -0
  284. package/src/HorizontalScroll/index.js +17 -0
  285. package/src/HorizontalScroll/itemPositions.js +101 -0
  286. package/src/Icon/Icon.jsx +46 -49
  287. package/src/Icon/IconText.jsx +68 -0
  288. package/src/Icon/index.js +3 -2
  289. package/src/IconButton/IconButton.jsx +114 -0
  290. package/src/IconButton/index.js +3 -0
  291. package/src/InputLabel/InputLabel.jsx +57 -35
  292. package/src/InputLabel/LabelContent.jsx +21 -0
  293. package/src/InputLabel/LabelContent.native.jsx +11 -2
  294. package/src/InputSupports/InputSupports.jsx +70 -0
  295. package/src/InputSupports/index.js +3 -0
  296. package/src/InputSupports/propTypes.js +44 -0
  297. package/src/InputSupports/useInputSupports.js +30 -0
  298. package/src/Link/ChevronLink.jsx +34 -21
  299. package/src/Link/InlinePressable.jsx +39 -0
  300. package/src/Link/InlinePressable.native.jsx +75 -0
  301. package/src/Link/Link.jsx +23 -13
  302. package/src/Link/LinkBase.jsx +98 -170
  303. package/src/Link/TextButton.jsx +37 -16
  304. package/src/Link/index.js +2 -1
  305. package/src/List/List.jsx +48 -0
  306. package/src/List/ListItem.jsx +182 -0
  307. package/src/List/index.js +3 -0
  308. package/src/Modal/Modal.jsx +190 -0
  309. package/src/Modal/dictionary.js +9 -0
  310. package/src/Modal/index.js +3 -0
  311. package/src/Notification/Notification.jsx +164 -0
  312. package/src/Notification/dictionary.js +8 -0
  313. package/src/Notification/index.js +3 -0
  314. package/src/Pagination/PageButton.jsx +42 -49
  315. package/src/Pagination/Pagination.jsx +88 -92
  316. package/src/Pagination/SideButton.jsx +58 -66
  317. package/src/Progress/Progress.jsx +78 -0
  318. package/src/Progress/ProgressBar.jsx +123 -0
  319. package/src/Progress/ProgressBarBackground.jsx +36 -0
  320. package/src/Progress/index.js +6 -0
  321. package/src/Radio/Radio.jsx +240 -0
  322. package/src/Radio/RadioButton.jsx +142 -0
  323. package/src/Radio/RadioGroup.jsx +209 -0
  324. package/src/Radio/RadioInput.jsx +57 -0
  325. package/src/Radio/RadioInput.native.jsx +6 -0
  326. package/src/Radio/index.js +5 -0
  327. package/src/RadioCard/RadioCard.jsx +198 -0
  328. package/src/RadioCard/RadioCardGroup.jsx +218 -0
  329. package/src/RadioCard/index.js +5 -0
  330. package/src/Search/Search.jsx +225 -0
  331. package/src/Search/dictionary.js +12 -0
  332. package/src/Search/index.js +3 -0
  333. package/src/Select/Group.jsx +15 -0
  334. package/src/Select/Group.native.jsx +14 -0
  335. package/src/Select/Item.jsx +11 -0
  336. package/src/Select/Item.native.jsx +10 -0
  337. package/src/Select/Picker.jsx +74 -0
  338. package/src/Select/Picker.native.jsx +102 -0
  339. package/src/Select/Select.jsx +298 -0
  340. package/src/Select/index.js +8 -0
  341. package/src/SideNav/Item.jsx +54 -47
  342. package/src/SideNav/ItemsGroup.jsx +50 -43
  343. package/src/SideNav/SideNav.jsx +68 -60
  344. package/src/Skeleton/Skeleton.jsx +94 -0
  345. package/src/Skeleton/index.js +3 -0
  346. package/src/Skeleton/skeleton.constant.js +3 -0
  347. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  348. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  349. package/src/Spacer/Spacer.jsx +11 -4
  350. package/src/StackView/StackView.jsx +53 -23
  351. package/src/StackView/StackWrap.jsx +16 -7
  352. package/src/StackView/StackWrapBox.jsx +62 -28
  353. package/src/StackView/StackWrapGap.jsx +46 -24
  354. package/src/StackView/common.jsx +3 -2
  355. package/src/StackView/getStackedContent.jsx +8 -2
  356. package/src/StepTracker/Step.jsx +202 -0
  357. package/src/StepTracker/StepTracker.jsx +174 -0
  358. package/src/StepTracker/dictionary.js +10 -0
  359. package/src/StepTracker/index.js +3 -0
  360. package/src/Tabs/Tabs.jsx +97 -0
  361. package/src/Tabs/TabsItem.jsx +212 -0
  362. package/src/Tabs/index.js +3 -0
  363. package/src/Tags/Tags.jsx +219 -0
  364. package/src/Tags/index.js +3 -0
  365. package/src/TextInput/TextArea.jsx +79 -0
  366. package/src/TextInput/TextInput.jsx +18 -284
  367. package/src/TextInput/TextInputBase.jsx +217 -0
  368. package/src/TextInput/index.js +2 -1
  369. package/src/TextInput/propTypes.js +29 -0
  370. package/src/ThemeProvider/ThemeProvider.jsx +11 -7
  371. package/src/ThemeProvider/useSetTheme.js +4 -0
  372. package/src/ThemeProvider/useThemeTokens.js +56 -5
  373. package/src/ThemeProvider/utils/styles.js +18 -5
  374. package/src/ThemeProvider/utils/theme-tokens.js +74 -5
  375. package/src/ToggleSwitch/ToggleSwitch.jsx +51 -53
  376. package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
  377. package/src/Tooltip/Tooltip.jsx +135 -131
  378. package/src/TooltipButton/TooltipButton.jsx +23 -27
  379. package/src/Typography/Typography.jsx +72 -59
  380. package/src/index.js +31 -3
  381. package/src/utils/a11y/index.js +2 -0
  382. package/src/utils/a11y/semantics.js +162 -0
  383. package/src/utils/a11y/textSize.js +30 -0
  384. package/src/utils/children.jsx +119 -0
  385. package/src/utils/index.js +6 -0
  386. package/src/utils/info/index.js +8 -0
  387. package/src/utils/info/platform/index.js +11 -0
  388. package/src/utils/info/platform/platform.android.js +1 -0
  389. package/src/utils/info/platform/platform.ios.js +1 -0
  390. package/src/utils/info/platform/platform.js +1 -0
  391. package/src/utils/info/platform/platform.native.js +4 -0
  392. package/src/utils/info/versions.js +6 -0
  393. package/src/utils/input.js +36 -25
  394. package/src/utils/pressability.js +96 -0
  395. package/src/utils/propTypes.js +291 -90
  396. package/src/utils/useCopy.js +30 -4
  397. package/src/utils/useHash.js +39 -0
  398. package/src/utils/useHash.native.js +6 -0
  399. package/stories/A11yText/A11yText.stories.jsx +6 -10
  400. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +1 -1
  401. package/stories/Box/Box.stories.jsx +1 -1
  402. package/stories/Button/Button.stories.jsx +7 -2
  403. package/stories/Button/ButtonGroup.stories.jsx +1 -1
  404. package/stories/Button/ButtonLink.stories.jsx +1 -1
  405. package/stories/Card/Card.stories.jsx +1 -1
  406. package/stories/Checkbox/Checkbox.stories.jsx +94 -0
  407. package/stories/Divider/Divider.stories.jsx +1 -1
  408. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +2 -2
  409. package/stories/Feedback/Feedback.stories.jsx +5 -6
  410. package/stories/FlexGrid/01 FlexGrid.stories.jsx +1 -1
  411. package/stories/FlexGrid/02 Row.stories.jsx +1 -1
  412. package/stories/FlexGrid/03 Col.stories.jsx +1 -1
  413. package/stories/Icon/Icon.stories.jsx +27 -7
  414. package/stories/IconButton/IconButton.stories.jsx +50 -0
  415. package/stories/InputLabel/InputLabel.stories.jsx +1 -1
  416. package/stories/Link/ChevronLink.stories.jsx +1 -1
  417. package/stories/Link/Link.stories.jsx +28 -18
  418. package/stories/Link/TextButton.stories.jsx +1 -1
  419. package/stories/List/List.stories.jsx +117 -0
  420. package/stories/Modal/Modal.stories.jsx +29 -0
  421. package/stories/Notification/Notification.stories.jsx +82 -0
  422. package/stories/Pagination/Pagination.stories.jsx +1 -1
  423. package/stories/Progress/Progress.stories.jsx +93 -0
  424. package/stories/Radio/Radio.stories.jsx +100 -0
  425. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  426. package/stories/Search/Search.stories.jsx +16 -0
  427. package/stories/Select/Select.stories.jsx +55 -0
  428. package/stories/SideNav/SideNav.stories.jsx +1 -1
  429. package/stories/SideNav/SideNavItem.stories.jsx +1 -1
  430. package/stories/SideNav/SideNavItemsGroup.stories.jsx +1 -1
  431. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  432. package/stories/Spacer/Spacer.stories.jsx +1 -1
  433. package/stories/StackView/StackView.stories.jsx +1 -1
  434. package/stories/StackView/StackWrap.stories.jsx +1 -1
  435. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  436. package/stories/Tabs/Tabs.stories.jsx +97 -0
  437. package/stories/Tags/Tags.stories.jsx +69 -0
  438. package/stories/TextInput/TextArea.stories.jsx +100 -0
  439. package/stories/TextInput/TextInput.stories.jsx +1 -1
  440. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +1 -1
  441. package/stories/Tooltip/Tooltip.stories.jsx +1 -1
  442. package/stories/TooltipButton/TooltipButton.stories.jsx +1 -1
  443. package/stories/Typography/Typography.stories.jsx +1 -1
  444. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  445. package/stories/supports.jsx +38 -4
  446. package/__fixtures__/accessible.icon.svg +0 -6
  447. package/babel.config.json +0 -8
  448. package/docs/Contributing.stories.mdx +0 -9
  449. package/docs/Fonts.stories.mdx +0 -104
  450. package/docs/Icons.stories.mdx +0 -144
  451. package/docs/Introduction.stories.mdx +0 -9
  452. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  453. package/lib/InputLabel/LabelContent.web.js +0 -17
  454. package/lib/config/svgr-icons-web.js +0 -9
  455. package/lib/config/svgr-icons.js +0 -52
  456. package/src/InputLabel/LabelContent.web.jsx +0 -13
  457. package/src/config/svgr-icons-web.js +0 -11
  458. package/src/config/svgr-icons.js +0 -46
@@ -1,15 +1,13 @@
1
- import React from 'react'
2
- import { Text } from 'react-native'
1
+ import React, { forwardRef } from 'react'
3
2
  import PropTypes from 'prop-types'
4
3
 
5
4
  import ButtonBase from '../Button/ButtonBase'
6
- import { applyTextStyles, useThemeTokensCallback } from '../ThemeProvider'
5
+ import { useThemeTokensCallback } from '../ThemeProvider'
7
6
  import {
8
7
  a11yProps,
9
8
  copyPropTypes,
10
9
  getTokensPropType,
11
10
  hrefAttrsProp,
12
- linkProps,
13
11
  selectTokens,
14
12
  variantProp
15
13
  } from '../utils'
@@ -17,64 +15,59 @@ import {
17
15
  import useCopy from '../utils/useCopy'
18
16
  import dictionary from './dictionary'
19
17
 
20
- const selectTextStyles = ({ color, fontName, fontSize, fontWeight, lineHeight, textLine }) =>
21
- applyTextStyles({
22
- color,
23
- fontName,
24
- fontSize,
25
- fontWeight,
26
- lineHeight,
27
- textDecorationLine: textLine
28
- })
18
+ const PageButton = forwardRef(
19
+ ({ label, onPress, href, isActive, copy, variant, tokens, ...props }, ref) => {
20
+ const getTokens = useThemeTokensCallback('PaginationPageButton', tokens, variant)
29
21
 
30
- function PageButton({ label, onPress, href, isActive, copy, variant, tokens, ...props }) {
31
- const getTokens = useThemeTokensCallback('PaginationPageButton', tokens, variant)
22
+ const getCopy = useCopy({ dictionary, copy })
32
23
 
33
- const getCopy = useCopy({ dictionary, copy })
24
+ const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
34
25
 
35
- const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
36
- const getTextStyles = (buttonState) => selectTextStyles(getTokens(buttonState))
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
+ : {}
37
35
 
38
- const activeProps = isActive
39
- ? {
40
- selected: true,
41
- ...a11yProps.nonFocusableProps,
42
- // a brute fix for the focus state being stuck on an active item since it becomes non-focusable
43
- // (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
44
- key: 'active-item'
45
- }
46
- : {}
36
+ const accessibilityRole = href !== undefined ? 'link' : 'button'
37
+ const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : ''
38
+ const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`
47
39
 
48
- const accessibilityRole = href !== undefined ? 'link' : 'button'
49
- const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : ''
50
- const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`
40
+ const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
41
+ const buttonProps = {
42
+ accessibilityRole,
43
+ accessibilityLabel,
44
+ onPress,
45
+ href,
46
+ hrefAttrs,
47
+ ...rest
48
+ }
51
49
 
52
- const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
53
- const buttonProps = {
54
- accessibilityRole,
55
- accessibilityLabel,
56
- onPress,
57
- href,
58
- hrefAttrs,
59
- ...rest
50
+ return (
51
+ <ButtonBase ref={ref} {...buttonProps} tokens={getButtonTokens} {...activeProps}>
52
+ {label}
53
+ </ButtonBase>
54
+ )
60
55
  }
61
-
62
- return (
63
- <ButtonBase {...buttonProps} tokens={getButtonTokens} {...activeProps}>
64
- {(buttonState) => {
65
- return <Text style={getTextStyles(buttonState)}>{label}</Text>
66
- }}
67
- </ButtonBase>
68
- )
69
- }
56
+ )
57
+ PageButton.displayName = 'PageButton'
70
58
 
71
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,
72
66
  label: PropTypes.string,
73
67
  isActive: PropTypes.bool,
74
68
  copy: copyPropTypes,
75
69
  variant: variantProp.propType,
76
- tokens: getTokensPropType('PaginationPageButton'),
77
- ...linkProps.types
70
+ tokens: getTokensPropType('PaginationPageButton')
78
71
  }
79
72
 
80
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,82 +1,80 @@
1
- import React from 'react'
2
- import { StyleSheet, View, Text, PixelRatio } from 'react-native'
1
+ import React, { forwardRef } from 'react'
2
+ import { Text } from 'react-native'
3
3
 
4
4
  import PropTypes from 'prop-types'
5
5
 
6
6
  import ButtonBase from '../Button/ButtonBase'
7
- import { applyTextStyles, useThemeTokensCallback } from '../ThemeProvider'
7
+ import { IconText } from '../Icon'
8
+ import { useThemeTokensCallback } from '../ThemeProvider'
8
9
  import { useViewport } from '../ViewportProvider'
9
10
  import { copyPropTypes, hrefAttrsProp, linkProps, selectTokens } from '../utils'
10
11
 
11
12
  import dictionary from './dictionary'
12
13
  import useCopy from '../utils/useCopy'
13
14
 
14
- const selectTextStyles = ({ color, fontName, fontSize, fontWeight, lineHeight }) =>
15
- applyTextStyles({
16
- color,
17
- fontName,
18
- fontSize,
19
- fontWeight,
20
- lineHeight
21
- })
22
-
23
15
  const selectIconTokens = ({ color, iconSize, iconDisplace }, direction) => {
24
- // Scale icon with text, but with a cap so text isn't squashed at large scales
25
- const iconScale = Math.min(PixelRatio.getFontScale(), 2)
26
-
27
16
  return {
28
17
  color,
29
- size: iconSize * iconScale,
18
+ size: iconSize,
30
19
  translateX: iconDisplace * (direction === 'previous' ? -1 : 1)
31
20
  }
32
21
  }
33
22
 
34
- function SideButton({ direction = 'previous', onPress, href, copy, variant, tokens, ...props }) {
35
- const viewport = useViewport()
36
- const buttonVariant = { direction, viewport, ...variant }
37
- const getTokens = useThemeTokensCallback('PaginationSideButton', tokens, buttonVariant)
38
-
39
- const getCopy = useCopy({ dictionary, copy })
40
-
41
- const { icon: IconComponent } = getTokens(tokens, buttonVariant)
42
-
43
- const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
44
- const getIconTokens = (buttonState) => selectIconTokens(getTokens(buttonState), direction)
45
- const getTextStyles = (buttonState) => selectTextStyles(getTokens(buttonState))
46
-
47
- const label = direction === 'previous' ? getCopy('previousText') : getCopy('nextText')
48
- const showLabel = viewport !== 'sm' && viewport !== 'xs'
49
-
50
- const accessibilityLabel =
51
- direction === 'previous' ? getCopy('previousLabel') : getCopy('nextLabel')
52
- const accessibilityRole = href !== undefined ? 'link' : 'button'
23
+ const directionToSide = {
24
+ previous: 'left',
25
+ next: 'right'
26
+ }
53
27
 
54
- const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
55
- const buttonProps = {
56
- accessibilityRole,
57
- accessibilityLabel,
58
- onPress,
59
- href,
60
- hrefAttrs,
61
- ...rest
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)
33
+
34
+ const getCopy = useCopy({ dictionary, copy })
35
+
36
+ const { icon } = getTokens(tokens, buttonVariant)
37
+
38
+ const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
39
+ const getIconTokens = (buttonState) => selectIconTokens(getTokens(buttonState), direction)
40
+
41
+ const label = direction === 'previous' ? getCopy('previousText') : getCopy('nextText')
42
+ const showLabel = viewport !== 'sm' && viewport !== 'xs'
43
+
44
+ const accessibilityLabel =
45
+ direction === 'previous' ? getCopy('previousLabel') : getCopy('nextLabel')
46
+ const accessibilityRole = href !== undefined ? 'link' : 'button'
47
+
48
+ const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
49
+ const buttonProps = {
50
+ accessibilityRole,
51
+ accessibilityLabel,
52
+ onPress,
53
+ href,
54
+ hrefAttrs,
55
+ ...rest
56
+ }
57
+
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
+ )
62
75
  }
63
-
64
- return (
65
- <ButtonBase {...buttonProps} tokens={getButtonTokens}>
66
- {(buttonState) => (
67
- <View style={staticStyles.contentContainer}>
68
- {direction === 'previous' && IconComponent && (
69
- <IconComponent tokens={getIconTokens(buttonState)} />
70
- )}
71
- {showLabel && <Text style={getTextStyles(buttonState)}>{label}</Text>}
72
- {direction === 'next' && IconComponent && (
73
- <IconComponent tokens={getIconTokens(buttonState)} />
74
- )}
75
- </View>
76
- )}
77
- </ButtonBase>
78
- )
79
- }
76
+ )
77
+ SideButton.displayName = 'SideButton'
80
78
 
81
79
  SideButton.propTypes = {
82
80
  direction: PropTypes.oneOf(['previous', 'next']),
@@ -85,9 +83,3 @@ SideButton.propTypes = {
85
83
  }
86
84
 
87
85
  export default SideButton
88
-
89
- const staticStyles = StyleSheet.create({
90
- contentContainer: {
91
- flexDirection: 'row'
92
- }
93
- })
@@ -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
@@ -0,0 +1,123 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { Platform, StyleSheet, View } from 'react-native'
4
+
5
+ import ProgressBarBackground from './ProgressBarBackground'
6
+ import { a11yProps } from '../utils/propTypes'
7
+ import { useThemeTokens } from '../ThemeProvider'
8
+ import { getTokensPropType, variantProp } from '../utils'
9
+
10
+ const selectBarStyles = (
11
+ { backgroundColor, borderRadius, outlineWidth, outlineColor },
12
+ percentage
13
+ ) => ({
14
+ backgroundColor,
15
+ borderRadius,
16
+ outlineWidth,
17
+ outlineColor,
18
+ width: `${percentage}%`
19
+ })
20
+
21
+ /**
22
+ * The `ProgressBar` is a visual representation of linear progression.
23
+ * It provides simple but important information at a quick glance.
24
+ *
25
+ * ## Props
26
+ *
27
+ * - Use `percentage` prop to indicate completion
28
+ *
29
+ * ## Tokens
30
+ *
31
+ * - Use the following tokens to customize the appearance:
32
+ * - `backgroundColor` for the background color of the progress bar,
33
+ * - `borderRadius` for the rounded corners,
34
+ * - `outlineColor` to control the color of the border (outline),
35
+ * - `outlineWidth` to change the outline width.
36
+ *
37
+ * ## Variants
38
+ *
39
+ * - Use the following variants to render specific types of progress bars:
40
+ * - `negative`: set to `true` if you wish to use the negative theming for progress bar filling,
41
+ * - `inactive`: set to `true` if you wish to style the progress bar as inactive.
42
+ *
43
+ * ## Usability and A11y guidelines
44
+ *
45
+ * `ProgressBar` component accepts all the standard accessibility properties including the ones that
46
+ * are specific to the `progressbar` role. By default the following props are used:
47
+ *
48
+ * - `accessibilityRole` (`role`): `progressbar`,
49
+ * - `accessibilityValue.min` (`aria-valuemin`): `0`,
50
+ * - `accessibilityValue.max` (`aria-valuemax`): `100`,
51
+ * - `accessibilityValue.now` (`aria-valuenow`): `percentage`,
52
+ * - `accessibilityValue.text` (`aria-valuetext`): `%{percentage}%`,
53
+ *
54
+ */
55
+ const ProgressBar = forwardRef(
56
+ ({ children = null, percentage = 0, tokens, variant, ...rest }, ref) => {
57
+ const themeTokens = useThemeTokens('ProgressBar', tokens, variant)
58
+ if (percentage < 0) {
59
+ throw new Error('ProgressBar: `percentage` must be a positive number')
60
+ } else if (percentage > 100) {
61
+ throw new Error('ProgressBar: `percentage` cannot exceed 100')
62
+ }
63
+ const accessibilityProps = {
64
+ accessibilityRole: 'progressbar',
65
+ accessibilityValue: {
66
+ min: 0,
67
+ max: 100,
68
+ now: percentage,
69
+ text: `${percentage}%`
70
+ },
71
+ ...a11yProps.select(rest)
72
+ }
73
+
74
+ return percentage > 0 ? (
75
+ <View
76
+ ref={ref}
77
+ style={[staticStyles.bar, selectBarStyles(themeTokens, percentage)]}
78
+ {...accessibilityProps}
79
+ >
80
+ {children ?? <ProgressBarBackground variant={variant} />}
81
+ </View>
82
+ ) : null
83
+ }
84
+ )
85
+ ProgressBar.displayName = 'ProgressBar'
86
+
87
+ ProgressBar.propTypes = {
88
+ /**
89
+ * Optional children that can be used to customize the progress bar filling.
90
+ */
91
+ children: PropTypes.node,
92
+ /**
93
+ * Accessibility label for the progress bar.
94
+ */
95
+ accessibilityLabel: PropTypes.string.isRequired,
96
+ /**
97
+ * Percentage of completion.
98
+ */
99
+ percentage: PropTypes.number,
100
+ /**
101
+ * Progress bar tokens.
102
+ */
103
+ tokens: getTokensPropType('ProgressBar'),
104
+ /**
105
+ * Progress bar variant.
106
+ */
107
+ variant: variantProp.propType
108
+ }
109
+
110
+ export default ProgressBar
111
+
112
+ const staticStyles = StyleSheet.create({
113
+ bar: {
114
+ height: '100%',
115
+ overflow: 'hidden',
116
+ position: 'absolute',
117
+ ...Platform.select({
118
+ web: {
119
+ outlineStyle: 'solid'
120
+ }
121
+ })
122
+ }
123
+ })