@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,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ const doAction = (action, event) => {
11
+ var _window, _window$location;
12
+
13
+ return typeof action === 'function' && action((_window = window) === null || _window === void 0 ? void 0 : (_window$location = _window.location) === null || _window$location === void 0 ? void 0 : _window$location.hash, event);
14
+ };
15
+ /**
16
+ * @typedef {import('react').SyntheticEvent} SyntheticEvent
17
+ */
18
+
19
+ /**
20
+ * Calls a function (passing it the current hash) based on the current hash state on mount,
21
+ * and binds it to call it again any time the hash changes.
22
+ *
23
+ * Consider using `useCallback` on the function to minimise adding and removing of event listeners.
24
+ *
25
+ * On Native, this is replaced with a harmless no-op function as there is no direct equivalent.
26
+ *
27
+ * @param {(hash: string, event?: SyntheticEvent) => void} action - a function to act on the current hash on load and when it changes
28
+ * @returns
29
+ */
30
+
31
+
32
+ const useHash = (action, isReady = true) => {
33
+ const [isDone, setIsDone] = (0, _react.useState)(false); // Do the action just once when ready after component mount, from hash on page load
34
+
35
+ const isToDo = isReady && !isDone;
36
+ (0, _react.useEffect)(() => {
37
+ if (isToDo) {
38
+ setIsDone(true);
39
+ doAction(action);
40
+ }
41
+ }, [isToDo, action]); // Bind the action for each hash change; do re-bind if the function changes.
42
+
43
+ (0, _react.useEffect)(() => {
44
+ const handleChange = event => doAction(action, event);
45
+
46
+ window.addEventListener('hashchange', handleChange);
47
+ return () => window.removeEventListener('hashchange', handleChange);
48
+ }, [action]);
49
+ };
50
+
51
+ var _default = useHash;
52
+ exports.default = _default;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ /**
9
+ * No URL hashes on Native, so do a no-op. Remembering scenes for reloads
10
+ * is handled at OS level and deep links have completely different usage.
11
+ */
12
+ const useHash = () => {};
13
+
14
+ var _default = useHash;
15
+ exports.default = _default;
@@ -1,9 +1,17 @@
1
- import { viewports } from '@telus-uds/system-constants';
2
- import { useViewport } from '../ViewportProvider';
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.resolveResponsiveProp = void 0;
7
+
8
+ var _systemConstants = require("@telus-uds/system-constants");
9
+
10
+ var _ViewportProvider = require("../ViewportProvider");
3
11
 
4
12
  const hasOwn = (objectProp, key) => Object.prototype.hasOwnProperty.call(objectProp, key);
5
13
 
6
- const hasResponsiveProperties = objectProp => viewports.keys.some(key => hasOwn(objectProp, key));
14
+ const hasResponsiveProperties = objectProp => _systemConstants.viewports.keys.some(key => hasOwn(objectProp, key));
7
15
  /**
8
16
  * Resolves a prop which may be a responsive object with keys for viewports.
9
17
  *
@@ -16,12 +24,12 @@ const hasResponsiveProperties = objectProp => viewports.keys.some(key => hasOwn(
16
24
  */
17
25
 
18
26
 
19
- export const resolveResponsiveProp = (prop, viewport, defaultValue) => {
27
+ const resolveResponsiveProp = (prop, viewport, defaultValue) => {
20
28
  if (prop === undefined) return defaultValue;
21
29
  if (!prop || typeof prop !== 'object' || !hasResponsiveProperties(prop)) return prop;
22
- const value = viewports.keys.includes(viewport) ? // If there's a current viewport, return the closest match at or below it
23
- viewports.inherit(prop)[viewport] : // If no current viewport is available, default to smallest viewport
24
- prop[viewports.keys.find(key => hasOwn(prop, key))];
30
+ const value = _systemConstants.viewports.keys.includes(viewport) ? // If there's a current viewport, return the closest match at or below it
31
+ _systemConstants.viewports.inherit(prop)[viewport] : // If no current viewport is available, default to smallest viewport
32
+ prop[_systemConstants.viewports.keys.find(key => hasOwn(prop, key))];
25
33
  return value === undefined ? defaultValue : value;
26
34
  };
27
35
  /**
@@ -39,9 +47,13 @@ export const resolveResponsiveProp = (prop, viewport, defaultValue) => {
39
47
  * @returns {*}
40
48
  */
41
49
 
50
+
51
+ exports.resolveResponsiveProp = resolveResponsiveProp;
52
+
42
53
  const useResponsiveProp = (prop, defaultValue) => {
43
- const viewport = useViewport();
54
+ const viewport = (0, _ViewportProvider.useViewport)();
44
55
  return resolveResponsiveProp(prop, viewport, defaultValue);
45
56
  };
46
57
 
47
- export default useResponsiveProp;
58
+ var _default = useResponsiveProp;
59
+ exports.default = _default;
@@ -1,6 +1,16 @@
1
- import { useViewport } from '../ViewportProvider';
2
- import { useThemeTokens } from '../ThemeProvider';
3
- import { resolveResponsiveProp } from './useResponsiveProp';
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _ViewportProvider = require("../ViewportProvider");
9
+
10
+ var _ThemeProvider = require("../ThemeProvider");
11
+
12
+ var _useResponsiveProp = require("./useResponsiveProp");
13
+
4
14
  /**
5
15
  * @typedef {import('@telus-uds/system-constants/viewports').Viewport} Viewport
6
16
  * @typedef {import('./propTypes.js').SpacingValue} SpacingValue
@@ -8,9 +18,8 @@ import { resolveResponsiveProp } from './useResponsiveProp';
8
18
  * @typedef {import('./propTypes.js').SpacingObject} SpacingObject
9
19
  * @typedef {import('./propTypes.js').SpacingOptions} SpacingOptions
10
20
  */
11
-
12
21
  const resolveSpacingOptions = space => {
13
- if (!space?.options) return {};
22
+ if (!(space !== null && space !== void 0 && space.options)) return {};
14
23
  const {
15
24
  size,
16
25
  variant,
@@ -103,21 +112,22 @@ const resolveSpacingOptions = space => {
103
112
  const useSpacingScale = spaceValue => {
104
113
  // In future, may need to consider window height as well as width, particularly for native apps,
105
114
  // e.g. to ensure designs don't look lost on large, tall, not-so-wide portrait screens.
106
- const viewport = useViewport();
115
+ const viewport = (0, _ViewportProvider.useViewport)();
107
116
  const {
108
117
  tokens,
109
118
  variant,
110
119
  overridden,
111
120
  subtract = 0
112
121
  } = resolveSpacingOptions(spaceValue);
113
- const space = !overridden && (spaceValue?.space ?? resolveResponsiveProp(spaceValue, viewport, 0));
122
+ const space = !overridden && ((spaceValue === null || spaceValue === void 0 ? void 0 : spaceValue.space) ?? (0, _useResponsiveProp.resolveResponsiveProp)(spaceValue, viewport, 0));
114
123
  const {
115
124
  size
116
- } = useThemeTokens('spacingScale', tokens, variant, {
125
+ } = (0, _ThemeProvider.useThemeTokens)('spacingScale', tokens, variant, {
117
126
  space: typeof space === 'number' ? space : 0,
118
127
  viewport
119
128
  });
120
129
  return Math.max(size - subtract, 0);
121
130
  };
122
131
 
123
- export default useSpacingScale;
132
+ var _default = useSpacingScale;
133
+ exports.default = _default;
@@ -1,12 +1,21 @@
1
- import { useState } from 'react';
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
2
10
  let id = 0;
3
11
 
4
12
  function useUniqueId(prefix = '') {
5
- const [uniqueId] = useState(() => {
13
+ const [uniqueId] = (0, _react.useState)(() => {
6
14
  id += 1;
7
15
  return `${prefix}-${id}`;
8
16
  });
9
17
  return uniqueId;
10
18
  }
11
19
 
12
- export default useUniqueId;
20
+ var _default = useUniqueId;
21
+ exports.default = _default;
package/package.json CHANGED
@@ -1,16 +1,15 @@
1
1
  {
2
2
  "name": "@telus-uds/components-base",
3
- "version": "0.0.2-prerelease.7",
3
+ "version": "1.0.1",
4
4
  "description": "Base components",
5
5
  "keywords": [
6
6
  "base"
7
7
  ],
8
8
  "author": "TELUS Digital",
9
9
  "homepage": "https://github.com/telus/universal-design-system#readme",
10
- "license": "ISC",
10
+ "license": "UNLICENSED",
11
11
  "main": "lib/index.js",
12
- "module": "lib/index.js",
13
- "react-native": "lib/index.js",
12
+ "react-native": "src/index.js",
14
13
  "directories": {
15
14
  "lib": "lib",
16
15
  "test": "__tests__"
@@ -34,11 +33,14 @@
34
33
  "standard-engine": {
35
34
  "skip": true
36
35
  },
36
+ "browserslist": [
37
+ "extends @telus-uds/browserslist-config"
38
+ ],
37
39
  "peerDependencies": {
38
- "react": "*",
40
+ "react": "^17.0.2",
39
41
  "react-dom": "*",
40
42
  "react-native": "*",
41
- "react-native-web": "~0.14.13"
43
+ "react-native-web": "^0.17.0"
42
44
  },
43
45
  "devDependencies": {
44
46
  "@testing-library/jest-native": "^4.0.1",
@@ -47,10 +49,13 @@
47
49
  "react-test-renderer": "^16.3.2"
48
50
  },
49
51
  "dependencies": {
50
- "@telus-uds/system-constants": "^0.0.2-prerelease.2",
51
- "@telus-uds/system-themes": "^0.0.2-prerelease.0",
52
+ "airbnb-prop-types": "^2.16.0",
53
+ "@telus-uds/system-constants": "^1.0.0",
54
+ "@telus-uds/system-theme-tokens": "^1.0.0",
55
+ "lodash.debounce": "^4.0.8",
52
56
  "lodash.merge": "^4.6.2",
53
57
  "prop-types": "^15.7.2",
54
- "react-native-picker-select": "^8.0.4"
58
+ "react-native-picker-select": "^8.0.4",
59
+ "semver": "^7.3.5"
55
60
  }
56
61
  }
@@ -1,7 +1,7 @@
1
1
  {
2
- "previousReleaseTag": "@telus-uds/components-base/v0.0.2-prerelease.6",
3
- "changelog": "### [0.0.2-prerelease.7](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v0.0.2-prerelease.6...@telus-uds/components-base/v0.0.2-prerelease.7) (2021-11-23)\n\n\n### Features\n\n* **base:** add `Radio` button ([#731](https://github.com/telus/universal-design-system/issues/731)) ([ad1613c](https://github.com/telus/universal-design-system/commit/ad1613c547fe3b0cdf1490a92267f32045356133))\n* **base:** add base `Checkbox` component ([#706](https://github.com/telus/universal-design-system/issues/706)) ([a3fa01a](https://github.com/telus/universal-design-system/commit/a3fa01ad0da342be02c15284a103c22d7b315ae9))\n* **base:** add Tags component ([#785](https://github.com/telus/universal-design-system/issues/785)) ([90bbf40](https://github.com/telus/universal-design-system/commit/90bbf4035a0bc0a8cdf319d9b366c8498c0dfb56))\n* **base:** add TextArea ([#720](https://github.com/telus/universal-design-system/issues/720)) ([b18cae3](https://github.com/telus/universal-design-system/commit/b18cae3357375019ecc4e24e78ed9a2345b26139))\n* **base:** add the Select component ([#759](https://github.com/telus/universal-design-system/issues/759)) ([9cfdf84](https://github.com/telus/universal-design-system/commit/9cfdf846b7a273dd140537b60e08f30a70c13a66))\n* **base:** adding list component ([#296](https://github.com/telus/universal-design-system/issues/296)) ([#703](https://github.com/telus/universal-design-system/issues/703)) ([50e474d](https://github.com/telus/universal-design-system/commit/50e474d3d7f1988f5971a10be8416c8ac510626f))\n* **base:** implementing base Skeleton component ([#770](https://github.com/telus/universal-design-system/issues/770)) ([1138f08](https://github.com/telus/universal-design-system/commit/1138f08885f4cf67fc0fb7273758d20cc0a989c1)), closes [#296](https://github.com/telus/universal-design-system/issues/296) [#296](https://github.com/telus/universal-design-system/issues/296) [#296](https://github.com/telus/universal-design-system/issues/296) [#296](https://github.com/telus/universal-design-system/issues/296) [#296](https://github.com/telus/universal-design-system/issues/296) [#296](https://github.com/telus/universal-design-system/issues/296) [#296](https://github.com/telus/universal-design-system/issues/296)\n\n\n### Bug Fixes\n\n* **base:** adjust event handlers for checkbox / radio inputs on Web ([#820](https://github.com/telus/universal-design-system/issues/820)) ([87624d2](https://github.com/telus/universal-design-system/commit/87624d29166ce85aeaf7dc1db4dc5b60ecd170a5))\n* **base:** fix button text alignment ([#794](https://github.com/telus/universal-design-system/issues/794)) ([9671087](https://github.com/telus/universal-design-system/commit/9671087477eb45b0d3c872b47f1d24cdd43a727f))\n* **base:** various visual fixes for native/app ([#797](https://github.com/telus/universal-design-system/issues/797)) ([a00ab12](https://github.com/telus/universal-design-system/commit/a00ab124c40e1ea46441270acfd64ae0f37b0a68))\n* export a11ytext [prerelease-components-base] ([#830](https://github.com/telus/universal-design-system/issues/830)) ([af627a2](https://github.com/telus/universal-design-system/commit/af627a2b4fa4cbf78983521bbb66b86ab9f87601))\n* **jest:** pick .web files in -allium-web tests ([#765](https://github.com/telus/universal-design-system/issues/765)) ([e0b1bd5](https://github.com/telus/universal-design-system/commit/e0b1bd5edcc52b916685f8c5dcd8d2901d2ecdbd))\n",
4
- "releaseTag": "@telus-uds/components-base/v0.0.2-prerelease.7",
5
- "newVersion": "0.0.2-prerelease.7",
2
+ "previousReleaseTag": "@telus-uds/components-base/v1.0.0",
3
+ "changelog": "### [1.0.1](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v1.0.0...@telus-uds/components-base/v1.0.1) (2022-02-07)\n\n\n### Bug Fixes\n\n* **base:** add dataSet to FlexGrid (via viewProps) ([#1276](https://github.com/telus/universal-design-system/issues/1276)) ([dea06a1](https://github.com/telus/universal-design-system/commit/dea06a1393bd78147b0eebfde10f4d3365b518b4))\n",
4
+ "releaseTag": "@telus-uds/components-base/v1.0.1",
5
+ "newVersion": "1.0.1",
6
6
  "packageName": "@telus-uds/components-base"
7
7
  }
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import { Platform, StyleSheet, View } from 'react-native'
3
3
  import PropTypes from 'prop-types'
4
4
 
@@ -10,7 +10,7 @@ import { a11yProps } from '../utils/propTypes'
10
10
  * It should be used to add selectable screen-reader-only text to the main document flow,
11
11
  * as a sibling to blocks of text like paragraphs and interactive elements like buttons.
12
12
  */
13
- const A11yText = ({ text, heading, ...rest }) => {
13
+ const A11yText = forwardRef(({ text, heading, ...rest }, ref) => {
14
14
  const a11y = a11yProps.select({
15
15
  // On iOS, needs `accessible` to be true to be focusable without non-a11y content.
16
16
  // On Web, `accessible` causes RNW to set attributes that may make the element be treated as a group.
@@ -21,8 +21,10 @@ const A11yText = ({ text, heading, ...rest }) => {
21
21
  accessibilityRole: heading ? 'header' : 'text',
22
22
  ...rest
23
23
  })
24
- return <View style={styles.invisible} {...a11y} />
25
- }
24
+ return <View style={styles.invisible} ref={ref} {...a11y} />
25
+ })
26
+
27
+ A11yText.displayName = 'A11yText'
26
28
 
27
29
  A11yText.propTypes = {
28
30
  text: PropTypes.string.isRequired,
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import { DURATION, MIN_EMPTY_ANGLE, MIN_STROKE_ANGLE, BEZIER, propTypes } from './shared'
3
3
 
4
4
  const SVG_RADIUS = 20
@@ -20,8 +20,9 @@ const bezierProps = {
20
20
  }
21
21
  // We're using svg rather than css here to define the animation to avoid needing to introduce css injection mechanism
22
22
  // It's possible to replicate this functionality with RNW animations, but it snags on chrome at least, see https://github.com/telus/universal-design-system/pull/477 for details.
23
- const Spinner = ({ size, color, thickness, label }) => (
23
+ const Spinner = forwardRef(({ size, color, thickness, label }, ref) => (
24
24
  <svg
25
+ ref={ref}
25
26
  width={`${size}px`}
26
27
  height={`${size}px`}
27
28
  viewBox="0 0 48 48"
@@ -62,7 +63,8 @@ const Spinner = ({ size, color, thickness, label }) => (
62
63
  </circle>
63
64
  </g>
64
65
  </svg>
65
- )
66
+ ))
67
+ Spinner.displayName = 'Spinner'
66
68
 
67
69
  Spinner.propTypes = propTypes
68
70
 
@@ -1,11 +1,11 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import { Animated, Easing, StyleSheet, View } from 'react-native'
3
3
  import { DURATION, MIN_EMPTY_ANGLE, MIN_STROKE_ANGLE, BEZIER, propTypes } from './shared'
4
4
 
5
5
  const ea = MIN_EMPTY_ANGLE / 2
6
6
  const sa = MIN_STROKE_ANGLE / 2
7
7
 
8
- const Spinner = ({ size, color, thickness, label }) => {
8
+ const Spinner = forwardRef(({ size, color, thickness, label }, ref) => {
9
9
  const { current: timer } = React.useRef(new Animated.Value(0))
10
10
 
11
11
  React.useLayoutEffect(() => {
@@ -31,6 +31,7 @@ const Spinner = ({ size, color, thickness, label }) => {
31
31
  // Credit to https://github.com/n4kz/react-native-indicators and https://github.com/callstack/react-native-paper for this
32
32
  return (
33
33
  <View
34
+ ref={ref}
34
35
  style={[styles.container]}
35
36
  accessible
36
37
  accessibilityLabel={label}
@@ -109,7 +110,8 @@ const Spinner = ({ size, color, thickness, label }) => {
109
110
  </Animated.View>
110
111
  </View>
111
112
  )
112
- }
113
+ })
114
+ Spinner.displayName = 'Spinner'
113
115
 
114
116
  Spinner.propTypes = propTypes
115
117
 
package/src/Box/Box.jsx CHANGED
@@ -1,8 +1,17 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { View, ScrollView } from 'react-native'
4
4
  import { useThemeTokens } from '../ThemeProvider'
5
- import { a11yProps, spacingProps, variantProp, getTokensPropType, useSpacingScale } from '../utils'
5
+ import {
6
+ a11yProps,
7
+ spacingProps,
8
+ variantProp,
9
+ getTokensPropType,
10
+ useSpacingScale,
11
+ viewProps,
12
+ getA11yPropsFromHtmlTag,
13
+ layoutTags
14
+ } from '../utils'
6
15
  /**
7
16
  * @typedef {import('../utils/propTypes.js').SpacingValue} SpacingValue
8
17
  * @typedef {import('../utils/propTypes.js').SpacingIndex} SpacingIndex
@@ -87,63 +96,147 @@ const selectBoxStyles = (tokens) => {
87
96
  * text content is inside a scrollable box, as screens are not scrollable by default and even very
88
97
  * short text will require scrolling on small devices at the highest accessibility text scaling settings.
89
98
  */
90
- const Box = ({
91
- space,
92
- horizontal = space,
93
- vertical = space,
94
- top = vertical,
95
- bottom = vertical,
96
- left = horizontal,
97
- right = horizontal,
98
- children,
99
- variant,
100
- tokens,
101
- scroll,
102
- testID,
103
- ...rest
104
- }) => {
105
- const a11y = a11yProps.select(rest)
99
+ const Box = forwardRef(
100
+ (
101
+ {
102
+ space,
103
+ horizontal = space,
104
+ vertical = space,
105
+ top = vertical,
106
+ bottom = vertical,
107
+ left = horizontal,
108
+ right = horizontal,
109
+ flex,
110
+ children,
111
+ variant,
112
+ tokens,
113
+ scroll,
114
+ tag,
115
+ accessibilityRole,
116
+ testID,
117
+ dataSet,
118
+ ...rest
119
+ },
120
+ ref
121
+ ) => {
122
+ const props = {
123
+ ...getA11yPropsFromHtmlTag(tag, accessibilityRole),
124
+ ...a11yProps.select(rest),
125
+ ...viewProps.select(rest)
126
+ }
106
127
 
107
- const themeTokens = useThemeTokens('Box', tokens, variant)
108
- const styles = {
109
- paddingLeft: useSpacingScale(left),
110
- paddingRight: useSpacingScale(right),
111
- paddingTop: useSpacingScale(top),
112
- paddingBottom: useSpacingScale(bottom),
113
- ...selectBoxStyles(themeTokens)
114
- }
128
+ const themeTokens = useThemeTokens('Box', tokens, variant)
129
+ const styles = {
130
+ flex,
131
+ paddingLeft: useSpacingScale(left),
132
+ paddingRight: useSpacingScale(right),
133
+ paddingTop: useSpacingScale(top),
134
+ paddingBottom: useSpacingScale(bottom),
135
+ ...selectBoxStyles(themeTokens)
136
+ }
115
137
 
116
- if (scroll) {
117
- const scrollProps = typeof scroll === 'object' ? scroll : {}
118
- scrollProps.contentContainerStyle = [styles, scrollProps.contentContainerStyle]
138
+ if (scroll) {
139
+ const scrollProps = typeof scroll === 'object' ? scroll : {}
140
+ scrollProps.contentContainerStyle = [styles, scrollProps.contentContainerStyle]
141
+ return (
142
+ <ScrollView {...scrollProps} {...props} testID={testID} dataSet={dataSet} ref={ref}>
143
+ {children}
144
+ </ScrollView>
145
+ )
146
+ }
119
147
  return (
120
- <ScrollView {...scrollProps} {...a11y} testID={testID}>
148
+ <View {...props} style={styles} testID={testID} dataSet={dataSet} ref={ref}>
121
149
  {children}
122
- </ScrollView>
150
+ </View>
123
151
  )
124
152
  }
125
- return (
126
- <View {...a11y} style={styles} testID={testID}>
127
- {children}
128
- </View>
129
- )
130
- }
153
+ )
154
+ Box.displayName = 'Box'
131
155
 
132
156
  Box.propTypes = {
157
+ ...a11yProps.propTypes,
158
+ ...viewProps.types,
159
+ variant: variantProp.propType,
160
+ tokens: getTokensPropType('Box'),
161
+ /**
162
+ * Sets default padding on all sides of the box using the theme's spacing scale.
163
+ *
164
+ * @see {@link SpacingValue}
165
+ */
133
166
  space: spacingProps.types.spacingValue,
167
+ /**
168
+ * Sets top and bottom padding using the theme's spacing scale.
169
+ *
170
+ * @see {@link SpacingValue}
171
+ */
134
172
  vertical: spacingProps.types.spacingValue,
173
+ /**
174
+ * Sets left and right padding using the theme's spacing scale.
175
+ *
176
+ * @see {@link SpacingValue}
177
+ */
135
178
  horizontal: spacingProps.types.spacingValue,
179
+ /**
180
+ * Sets bottom padding using the theme's spacing scale.
181
+ *
182
+ * @see {@link SpacingValue}
183
+ */
136
184
  bottom: spacingProps.types.spacingValue,
185
+ /**
186
+ * Sets left padding using the theme's spacing scale.
187
+ *
188
+ * @see {@link SpacingValue}
189
+ */
137
190
  left: spacingProps.types.spacingValue,
191
+ /**
192
+ * Sets right padding using the theme's spacing scale.
193
+ *
194
+ * @see {@link SpacingValue}
195
+ */
138
196
  right: spacingProps.types.spacingValue,
197
+ /**
198
+ * Sets top padding using the theme's spacing scale.
199
+ *
200
+ * @see {@link SpacingValue}
201
+ */
139
202
  top: spacingProps.types.spacingValue,
203
+ /**
204
+ * Sets the `flex` style, which controls `flexGrow`, `flexShrink` and `flexBasis` styles.
205
+ *
206
+ * Set as 1 for the box to stretch and grow to fit in the available space, or another number to share
207
+ * space disproportionately with siblings. See https://reactnative.dev/docs/flexbox#flex for details.
208
+ *
209
+ * With the default `0`, the box takes its minimum width from its content.
210
+ */
211
+ flex: PropTypes.number,
212
+ /**
213
+ * Renders a scrollable ScrollView instead of an unscrollable View.
214
+ *
215
+ * May take an object of ScrollView props which are passed to the rendered ScrollView.
216
+ */
140
217
  scroll: PropTypes.oneOfType([
141
218
  PropTypes.bool,
142
219
  ScrollView.propTypes ? PropTypes.shape(ScrollView.propTypes) : PropTypes.object
143
220
  ]),
144
- variant: variantProp.propType,
145
- tokens: getTokensPropType('Box'),
221
+ /**
222
+ * Optional semantic HTML tag, to apply to the container on web. Does not change styling.
223
+ *
224
+ * In native apps, if a header tag is provided ("h1", "h2" etc) and accessibilityRole prop
225
+ * is not defined, the accessibilityRole will default to "heading".
226
+ */
227
+ tag: PropTypes.oneOf(layoutTags),
228
+ /**
229
+ * Use in tests if the box itself needs to be targetted and no other way of selecting the
230
+ * box is available (e.g. it cannot be targetted using an appropriate `accessibilityRole`).
231
+ */
146
232
  testID: PropTypes.string,
233
+ /**
234
+ * @ignore
235
+ */
236
+ dataSet: PropTypes.object,
237
+ /**
238
+ * Box accepts any content as children.
239
+ */
147
240
  children: PropTypes.node.isRequired
148
241
  }
149
242
 
@@ -1,18 +1,22 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
 
3
3
  import ButtonBase from './ButtonBase'
4
- import buttonPropTypes from './propTypes'
4
+ import buttonPropTypes, { textAndA11yText } from './propTypes'
5
5
  import { useThemeTokensCallback } from '../ThemeProvider'
6
6
  import { a11yProps } from '../utils/propTypes'
7
7
 
8
- const Button = ({ accessibilityRole = 'button', tokens, variant, ...props }) => {
8
+ const Button = forwardRef(({ accessibilityRole = 'button', tokens, variant, ...props }, ref) => {
9
9
  const getTokens = useThemeTokensCallback('Button', tokens, variant)
10
- return <ButtonBase {...props} tokens={getTokens} accessibilityRole={accessibilityRole} />
11
- }
10
+ return (
11
+ <ButtonBase {...props} tokens={getTokens} accessibilityRole={accessibilityRole} ref={ref} />
12
+ )
13
+ })
14
+ Button.displayName = 'Button'
12
15
 
13
16
  Button.propTypes = {
14
17
  ...a11yProps.types,
15
- ...buttonPropTypes
18
+ ...buttonPropTypes,
19
+ children: textAndA11yText
16
20
  }
17
21
 
18
22
  export default Button