@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,16 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.DEFAULT_COPY = void 0;
7
+ const DEFAULT_COPY = 'en';
1
8
  /**
2
9
  * Extract translations from a keyed dictionary for a given language.
3
10
  * Returns a getter.
4
11
  *
5
- * @param {object} dictionary
6
- * @param {'en'|'fr'} copy - language
12
+ * @example
13
+ * const getCopy = useCopy({
14
+ * copy: 'en',
15
+ * dictionary: {
16
+ * en: { label: 'english label' },
17
+ * fr: { label: 'french label' }
18
+ * }
19
+ * })
20
+ *
21
+ * getCopy('label') => 'english label'
22
+ *
23
+ * @description The entire dictionary may be overridden by simply passing a single language object as `copy`:
24
+ * @example
25
+ * const getCopy = useCopy({
26
+ * copy: { label: 'custom label' }
27
+ * })
28
+ *
29
+ * getCopy('label') => 'custom label'
30
+ *
31
+ * @param {object} [dictionary]
32
+ * @param {'en'|'fr'|object} copy - language
7
33
  * @return {function(string): string}
8
34
  */
35
+
36
+ exports.DEFAULT_COPY = DEFAULT_COPY;
37
+
9
38
  function useCopy({
10
39
  dictionary,
11
- copy
40
+ copy = DEFAULT_COPY
12
41
  }) {
13
- return key => dictionary[copy][key];
42
+ if (typeof copy === 'string') {
43
+ return key => key ? dictionary[copy][key] : dictionary[copy];
44
+ } // support overriding the entire copy dictionary with an object for a single language
45
+
46
+
47
+ return key => copy[key];
14
48
  }
15
49
 
16
- export default useCopy;
50
+ var _default = useCopy;
51
+ exports.default = _default;
@@ -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.6",
3
+ "version": "1.0.0",
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__"
@@ -26,7 +25,7 @@
26
25
  "format": "prettier --write .",
27
26
  "build": "babel src -d lib",
28
27
  "dev": "yarn build --watch",
29
- "release": "standard-version"
28
+ "release": "standard-version --release-as major"
30
29
  },
31
30
  "bugs": {
32
31
  "url": "https://github.com/telus/universal-design-system/issues"
@@ -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,9 +49,13 @@
47
49
  "react-test-renderer": "^16.3.2"
48
50
  },
49
51
  "dependencies": {
50
- "@telus-uds/system-constants": "^0.0.2-prerelease.1",
51
- "@telus-uds/tools-theme": "^0.0.2-prerelease.4",
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
- "prop-types": "^15.7.2"
57
+ "prop-types": "^15.7.2",
58
+ "react-native-picker-select": "^8.0.4",
59
+ "semver": "^7.3.5"
54
60
  }
55
61
  }
@@ -1,7 +1,7 @@
1
1
  {
2
- "previousReleaseTag": "@telus-uds/components-base/v0.0.2-prerelease.5",
3
- "changelog": "### [0.0.2-prerelease.6](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v0.0.2-prerelease.5...@telus-uds/components-base/v0.0.2-prerelease.6) (2021-11-08)\n\n\n### Features\n\n* **base:** add Tooltip component ([#687](https://github.com/telus/universal-design-system/issues/687)) ([38aaad4](https://github.com/telus/universal-design-system/commit/38aaad43d664b76e85a264901df5e1ca045a0304))\n* **base:** responsive directions with `useResponsiveProp` ([#677](https://github.com/telus/universal-design-system/issues/677)) ([b61e6a7](https://github.com/telus/universal-design-system/commit/b61e6a75159ce3fbd81758148ff8d10ab73cb409))\n\n\n### Bug Fixes\n\n* **base:** fix Tooltip positioning when page scrollbar is rendered ([#728](https://github.com/telus/universal-design-system/issues/728)) ([c52167d](https://github.com/telus/universal-design-system/commit/c52167d94b1306749f2755ed2c4fb39bedd5dbf6))\n* **base:** refresh viewport on first render, for SSR ([#712](https://github.com/telus/universal-design-system/issues/712)) ([b6288c0](https://github.com/telus/universal-design-system/commit/b6288c0e003a73f88e3fa5743ee085a767c53a0b))\n",
4
- "releaseTag": "@telus-uds/components-base/v0.0.2-prerelease.6",
5
- "newVersion": "0.0.2-prerelease.6",
2
+ "previousReleaseTag": "@telus-uds/components-base/v0.0.2-prerelease.10",
3
+ "changelog": "## [1.0.0](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v0.0.2-prerelease.10...@telus-uds/components-base/v1.0.0) (2022-02-03)\n\n\n### Features\n\n* add dataSet prop ([#1156](https://github.com/telus/universal-design-system/issues/1156)) ([21f49f6](https://github.com/telus/universal-design-system/commit/21f49f6c898118bb94c45f07a52c163b61e4cbaa))\n* **base:** add forwardRef to remaining components ([#1218](https://github.com/telus/universal-design-system/issues/1218)) ([49ccc42](https://github.com/telus/universal-design-system/commit/49ccc4217a68613f23dd7a23dd99e0f61fd6f121))\n* **base:** add tag prop for semantic HTML ([#1222](https://github.com/telus/universal-design-system/issues/1222)) ([581d070](https://github.com/telus/universal-design-system/commit/581d070782dfe569ffcf20c34de6e4409cdd8dfa))\n* **themes:** validate theme token types ([#1221](https://github.com/telus/universal-design-system/issues/1221)) ([dae382d](https://github.com/telus/universal-design-system/commit/dae382d19f86b88cd5de9df8c94f8200aee5b33f))\n\n\n### Bug Fixes\n\n* **base:** avoid errors in apps and update demo app ([#1215](https://github.com/telus/universal-design-system/issues/1215)) ([df6897a](https://github.com/telus/universal-design-system/commit/df6897a4918342e9859e596b9578bcdefc1a5702))\n",
4
+ "releaseTag": "@telus-uds/components-base/v1.0.0",
5
+ "newVersion": "1.0.0",
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,146 @@ 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
+ variant: variantProp.propType,
159
+ tokens: getTokensPropType('Box'),
160
+ /**
161
+ * Sets default padding on all sides of the box using the theme's spacing scale.
162
+ *
163
+ * @see {@link SpacingValue}
164
+ */
133
165
  space: spacingProps.types.spacingValue,
166
+ /**
167
+ * Sets top and bottom padding using the theme's spacing scale.
168
+ *
169
+ * @see {@link SpacingValue}
170
+ */
134
171
  vertical: spacingProps.types.spacingValue,
172
+ /**
173
+ * Sets left and right padding using the theme's spacing scale.
174
+ *
175
+ * @see {@link SpacingValue}
176
+ */
135
177
  horizontal: spacingProps.types.spacingValue,
178
+ /**
179
+ * Sets bottom padding using the theme's spacing scale.
180
+ *
181
+ * @see {@link SpacingValue}
182
+ */
136
183
  bottom: spacingProps.types.spacingValue,
184
+ /**
185
+ * Sets left padding using the theme's spacing scale.
186
+ *
187
+ * @see {@link SpacingValue}
188
+ */
137
189
  left: spacingProps.types.spacingValue,
190
+ /**
191
+ * Sets right padding using the theme's spacing scale.
192
+ *
193
+ * @see {@link SpacingValue}
194
+ */
138
195
  right: spacingProps.types.spacingValue,
196
+ /**
197
+ * Sets top padding using the theme's spacing scale.
198
+ *
199
+ * @see {@link SpacingValue}
200
+ */
139
201
  top: spacingProps.types.spacingValue,
202
+ /**
203
+ * Sets the `flex` style, which controls `flexGrow`, `flexShrink` and `flexBasis` styles.
204
+ *
205
+ * Set as 1 for the box to stretch and grow to fit in the available space, or another number to share
206
+ * space disproportionately with siblings. See https://reactnative.dev/docs/flexbox#flex for details.
207
+ *
208
+ * With the default `0`, the box takes its minimum width from its content.
209
+ */
210
+ flex: PropTypes.number,
211
+ /**
212
+ * Renders a scrollable ScrollView instead of an unscrollable View.
213
+ *
214
+ * May take an object of ScrollView props which are passed to the rendered ScrollView.
215
+ */
140
216
  scroll: PropTypes.oneOfType([
141
217
  PropTypes.bool,
142
218
  ScrollView.propTypes ? PropTypes.shape(ScrollView.propTypes) : PropTypes.object
143
219
  ]),
144
- variant: variantProp.propType,
145
- tokens: getTokensPropType('Box'),
220
+ /**
221
+ * Optional semantic HTML tag, to apply to the container on web. Does not change styling.
222
+ *
223
+ * In native apps, if a header tag is provided ("h1", "h2" etc) and accessibilityRole prop
224
+ * is not defined, the accessibilityRole will default to "heading".
225
+ */
226
+ tag: PropTypes.oneOf(layoutTags),
227
+ /**
228
+ * Use in tests if the box itself needs to be targetted and no other way of selecting the
229
+ * box is available (e.g. it cannot be targetted using an appropriate `accessibilityRole`).
230
+ */
146
231
  testID: PropTypes.string,
232
+ /**
233
+ * @ignore
234
+ */
235
+ dataSet: PropTypes.object,
236
+ /**
237
+ * Box accepts any content as children.
238
+ */
147
239
  children: PropTypes.node.isRequired
148
240
  }
149
241
 
@@ -1,15 +1,22 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
+
2
3
  import ButtonBase from './ButtonBase'
3
- import buttonPropTypes from './propTypes'
4
+ import buttonPropTypes, { textAndA11yText } from './propTypes'
5
+ import { useThemeTokensCallback } from '../ThemeProvider'
4
6
  import { a11yProps } from '../utils/propTypes'
5
7
 
6
- const Button = ({ accessibilityRole = 'button', ...props }) => (
7
- <ButtonBase {...props} accessibilityRole={accessibilityRole} />
8
- )
8
+ const Button = forwardRef(({ accessibilityRole = 'button', tokens, variant, ...props }, ref) => {
9
+ const getTokens = useThemeTokensCallback('Button', tokens, variant)
10
+ return (
11
+ <ButtonBase {...props} tokens={getTokens} accessibilityRole={accessibilityRole} ref={ref} />
12
+ )
13
+ })
14
+ Button.displayName = 'Button'
9
15
 
10
16
  Button.propTypes = {
11
17
  ...a11yProps.types,
12
- ...buttonPropTypes
18
+ ...buttonPropTypes,
19
+ children: textAndA11yText
13
20
  }
14
21
 
15
22
  export default Button