@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,18 +1,16 @@
1
- import React from 'react'
2
- import { Pressable, Text, View, StyleSheet, Platform } from 'react-native'
1
+ import React, { forwardRef } from 'react'
2
+ import { Pressable, View, StyleSheet, Platform } from 'react-native'
3
3
 
4
- import { useThemeTokensCallback } from '../ThemeProvider'
5
- import { applyTextStyles, applyShadowToken } from '../ThemeProvider/utils'
4
+ import { applyTextStyles, applyShadowToken, applyOuterBorder } from '../ThemeProvider/utils'
6
5
  import buttonPropTypes from './propTypes'
7
- import { a11yProps, hrefAttrsProp, linkProps } from '../utils/propTypes'
8
-
9
- const getCursorStyle = (inactive, accessibilityRole) => {
10
- if (inactive) return 'not-allowed'
11
- // These roles should result in cursor: pointer but don't in current RNW releases
12
- if (['checkbox', 'radio', 'switch'].includes(accessibilityRole)) return 'pointer'
13
- // For everything else, let React Native Web figure it out internally
14
- return undefined
15
- }
6
+ import {
7
+ a11yProps,
8
+ getCursorStyle,
9
+ linkProps,
10
+ resolvePressableState,
11
+ resolvePressableTokens,
12
+ wrapStringsInText
13
+ } from '../utils'
16
14
 
17
15
  const getOuterBorderOffset = ({ outerBorderGap = 0, outerBorderWidth = 0 }) =>
18
16
  outerBorderGap + outerBorderWidth
@@ -22,26 +20,26 @@ const selectOuterContainerStyles = ({
22
20
  opacity,
23
21
  outerBorderColor,
24
22
  outerBorderWidth,
25
- outerBorderGap = 0,
26
- outerBorderRadius = 0,
23
+ outerBorderGap,
24
+ borderRadius,
27
25
  outerBackgroundColor
28
26
  }) => ({
29
27
  alignSelf,
30
- padding: outerBorderGap,
31
- borderWidth: outerBorderWidth,
32
- borderColor: outerBorderColor,
33
- borderRadius: outerBorderRadius + outerBorderGap,
34
28
  backgroundColor: outerBackgroundColor,
35
- opacity
29
+ opacity,
30
+ ...applyOuterBorder({
31
+ outerBorderGap,
32
+ outerBorderWidth,
33
+ outerBorderColor,
34
+ borderRadius
35
+ })
36
36
  })
37
37
 
38
38
  const selectOuterWidthStyles = ({ outerBorderGap, outerBorderWidth, width }) => {
39
39
  // The inner container's bounding box is the bounding box of the button overall
40
40
  // so this many device pixels will sit outside of the overall bounding box
41
41
  const outerBorderOffset = getOuterBorderOffset({ outerBorderGap, outerBorderWidth })
42
- const widthStyles = {
43
- margin: 0 - outerBorderOffset
44
- }
42
+ const widthStyles = {}
45
43
 
46
44
  if (!width) {
47
45
  return {
@@ -83,7 +81,8 @@ const selectInnerContainerStyles = ({
83
81
  paddingTop,
84
82
  paddingBottom,
85
83
  shadow,
86
- borderWidth
84
+ borderWidth,
85
+ minWidth
87
86
  }) => {
88
87
  // Subtract border width from padding so overall button width/height doesn't
89
88
  // jump around if the border width changes (avoiding NaN and negative padding)
@@ -98,6 +97,7 @@ const selectInnerContainerStyles = ({
98
97
  paddingTop: offsetBorder(paddingTop),
99
98
  paddingBottom: offsetBorder(paddingBottom),
100
99
  backgroundColor,
100
+ minWidth,
101
101
  ...applyShadowToken(shadow)
102
102
  }
103
103
  }
@@ -118,107 +118,105 @@ const selectTextStyles = ({ fontSize, color, lineHeight, fontName, fontWeight, t
118
118
  textAlign
119
119
  })
120
120
 
121
- const selectWebOnlyStyles = (inactive, themeTokens, { accessibilityRole }) =>
122
- Platform.OS === 'web'
123
- ? {
124
- // if it would overflow the container, wraps instead
125
- maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
126
- cursor: getCursorStyle(inactive, accessibilityRole),
127
- outline: 'none' // removes the default browser :focus outline
128
- }
129
- : {}
130
-
131
- const ButtonBase = ({
132
- href,
133
- hrefAttrs,
134
- children,
135
- variant,
136
- onPress,
137
- tokens,
138
- disabled = false, // alias for inactive
139
- inactive = disabled,
140
- selected = false,
141
- ...rest
142
- }) => {
143
- const getTokens = useThemeTokensCallback('Button', tokens, variant)
144
- const getButtonState = ({ pressed, focused, hovered }) => ({
145
- pressed,
146
- focus: focused,
147
- hover: hovered,
148
- inactive,
149
- selected
121
+ const selectWebOnlyStyles = (inactive, themeTokens, { accessibilityRole }) => {
122
+ return Platform.select({
123
+ web: {
124
+ // if it would overflow the container, wraps instead
125
+ maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
126
+ outline: 'none', // removes the default browser :focus outline
127
+ ...getCursorStyle(inactive, accessibilityRole)
128
+ },
129
+ default: {}
150
130
  })
151
- const getTokensByPressableState = (pressableState) => getTokens(getButtonState(pressableState))
152
-
153
- const a11y = a11yProps.select(rest)
154
-
155
- const getPressableStyle = (pressableState) => {
156
- const themeTokens = getTokensByPressableState(pressableState)
157
- return [
158
- staticStyles.wrapper,
159
- selectWebOnlyStyles(inactive, themeTokens, a11y),
160
- selectOuterContainerStyles(themeTokens),
161
- selectOuterWidthStyles(themeTokens)
162
- ]
163
- }
164
-
165
- const handlePress = linkProps.handleHref({ href, onPress })
166
-
167
- return (
168
- <Pressable
169
- onPress={handlePress}
170
- style={getPressableStyle}
171
- disabled={inactive}
172
- href={href}
173
- {...hrefAttrsProp.spread(hrefAttrs)}
174
- {...a11y}
175
- >
176
- {(pressableState) => {
177
- const themeTokens = getTokensByPressableState(pressableState)
178
- const containerStyles = selectInnerContainerStyles(themeTokens)
179
- const borderStyles = selectBorderStyles(themeTokens)
180
- const textStyles = {
181
- ...selectTextStyles(themeTokens),
182
- ...Platform.select({
183
- // TODO: https://github.com/telus/universal-design-system/issues/487
184
- web: { transition: 'color 200ms' }
185
- })
186
- }
187
-
188
- // If the container has a width set, fill it instead of sizing from content.
189
- // If in future we support text alignments other than center, add here.
190
- const stretchStyles = !!themeTokens.width && staticStyles.center
191
-
192
- return (
193
- <View
194
- style={[
195
- containerStyles,
196
- borderStyles,
197
- stretchStyles,
198
- Platform.select({
199
- web: {
200
- maxWidth: '100%', // ensure overflowing content wraps
201
- // TODO: https://github.com/telus/universal-design-system/issues/487
202
- transition: 'background-color 200ms, border-color 200ms'
203
- }
204
- })
205
- ]}
206
- >
207
- {typeof children === 'function' ? (
208
- children({
209
- ...getButtonState(pressableState),
210
- textStyles
211
- })
212
- ) : (
213
- <Text style={textStyles}>{children}</Text>
214
- )}
215
- </View>
216
- )
217
- }}
218
- </Pressable>
219
- )
220
131
  }
221
132
 
133
+ const ButtonBase = forwardRef(
134
+ (
135
+ {
136
+ href,
137
+ hrefAttrs,
138
+ children,
139
+ onPress,
140
+ tokens = {},
141
+ disabled = false, // alias for inactive
142
+ inactive = disabled,
143
+ selected = false,
144
+ dataSet,
145
+ ...rest
146
+ },
147
+ ref
148
+ ) => {
149
+ const extraButtonState = { inactive, selected }
150
+ const resolveButtonTokens = (pressableState) =>
151
+ resolvePressableTokens(tokens, pressableState, extraButtonState)
152
+
153
+ const a11y = a11yProps.select(rest)
154
+
155
+ const getPressableStyle = (pressableState) => {
156
+ const themeTokens = resolveButtonTokens(pressableState)
157
+ return [
158
+ staticStyles.row,
159
+ selectWebOnlyStyles(inactive, themeTokens, a11y),
160
+ selectOuterContainerStyles(themeTokens),
161
+ selectOuterWidthStyles(themeTokens)
162
+ ]
163
+ }
164
+
165
+ return (
166
+ <Pressable
167
+ ref={ref}
168
+ href={href}
169
+ onPress={linkProps.handleHref({ href, onPress })}
170
+ style={getPressableStyle}
171
+ disabled={inactive}
172
+ dataSet={dataSet}
173
+ hrefAttrs={hrefAttrs}
174
+ {...a11y}
175
+ >
176
+ {(pressableState) => {
177
+ const themeTokens = resolveButtonTokens(pressableState)
178
+ const containerStyles = selectInnerContainerStyles(themeTokens)
179
+ const borderStyles = selectBorderStyles(themeTokens)
180
+ const textStyles = [selectTextStyles(themeTokens), staticStyles.text]
181
+
182
+ // If the container has a width set, fill it instead of sizing from content.
183
+ // If in future we support text alignments other than center, add here.
184
+ const stretchStyles = themeTokens.width ? staticStyles.stretch : staticStyles.align
185
+
186
+ return (
187
+ <View
188
+ style={[
189
+ containerStyles,
190
+ borderStyles,
191
+ stretchStyles,
192
+ staticStyles.row,
193
+ Platform.select({
194
+ web: {
195
+ maxWidth: '100%', // ensure overflowing content wraps
196
+ // TODO: https://github.com/telus/universal-design-system/issues/487
197
+ transition: 'background-color 200ms, border-color 200ms'
198
+ }
199
+ })
200
+ ]}
201
+ >
202
+ {wrapStringsInText(
203
+ typeof children === 'function'
204
+ ? children({
205
+ ...resolvePressableState(pressableState, extraButtonState),
206
+ textStyles
207
+ })
208
+ : children,
209
+ { style: textStyles }
210
+ )}
211
+ </View>
212
+ )
213
+ }}
214
+ </Pressable>
215
+ )
216
+ }
217
+ )
218
+ ButtonBase.displayName = 'ButtonBase'
219
+
222
220
  ButtonBase.propTypes = {
223
221
  ...a11yProps.types,
224
222
  ...buttonPropTypes,
@@ -226,10 +224,21 @@ ButtonBase.propTypes = {
226
224
  }
227
225
 
228
226
  const staticStyles = StyleSheet.create({
229
- wrapper: {
230
- flexDirection: 'row' // ensures alignSelf is horizontal
227
+ row: {
228
+ // Apply all button alignment horizontally; no vertical stacking within a button
229
+ flexDirection: 'row'
230
+ },
231
+ text: {
232
+ flexGrow: 1, // On native but not web, flexShrink here wraps text prematurely
233
+ ...Platform.select({
234
+ // TODO: https://github.com/telus/universal-design-system/issues/487
235
+ web: { transition: 'color 200ms' }
236
+ })
237
+ },
238
+ align: {
239
+ alignItems: 'center'
231
240
  },
232
- center: {
241
+ stretch: {
233
242
  flex: 1,
234
243
  alignItems: 'center',
235
244
  justifyContent: 'center'
@@ -1,11 +1,12 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
+ import ABBPropTypes from 'airbnb-prop-types'
3
4
  import { Platform } from 'react-native'
4
5
 
5
6
  import ButtonBase from './ButtonBase'
6
7
  import { StackWrap } from '../StackView'
7
8
  import { useViewport } from '../ViewportProvider'
8
- import { useThemeTokens } from '../ThemeProvider'
9
+ import { useThemeTokens, useThemeTokensCallback } from '../ThemeProvider'
9
10
  import {
10
11
  a11yProps,
11
12
  pressProps,
@@ -14,102 +15,96 @@ import {
14
15
  selectTokens
15
16
  } from '../utils/propTypes'
16
17
  import { useMultipleInputValues } from '../utils/input'
18
+ import { getPressHandlersWithArgs } from '../utils/pressability'
17
19
 
18
- const ButtonGroup = ({
19
- variant,
20
- buttonVariant = {},
21
- tokens,
22
- items = [],
23
- values,
24
- initialValues,
25
- maxValues = 1,
26
- onChange,
27
- readOnly = false,
28
- inactive = false,
29
- accessibilityRole = maxValues === 1
30
- ? 'radioGroup' // radioGroup is cross-platform; only web aria has generic groups
31
- : Platform.select({ web: 'group', default: 'none' }),
32
- ...rest
33
- }) => {
34
- const viewport = useViewport()
35
- const themeTokens = useThemeTokens('ButtonGroup', tokens, variant, { viewport })
36
- const stackTokens = selectTokens('StackView', themeTokens)
37
- const { direction, space } = themeTokens
20
+ const ButtonGroup = forwardRef(
21
+ (
22
+ {
23
+ variant,
24
+ tokens,
25
+ items = [],
26
+ values,
27
+ initialValues,
28
+ maxValues = 1,
29
+ onChange,
30
+ readOnly = false,
31
+ inactive = false,
32
+ accessibilityRole = maxValues === 1
33
+ ? 'radiogroup' // radiogroup is cross-platform; only web aria has generic groups
34
+ : Platform.select({ web: 'group', default: 'none' }),
35
+ ...rest
36
+ },
37
+ ref
38
+ ) => {
39
+ const viewport = useViewport()
40
+ const themeTokens = useThemeTokens('ButtonGroup', tokens, variant, { viewport })
41
+ const stackTokens = selectTokens('StackView', themeTokens)
42
+ const { direction, space } = themeTokens
38
43
 
39
- const { currentValues, toggleOneValue } = useMultipleInputValues({
40
- initialValues,
41
- values,
42
- maxValues,
43
- onChange,
44
- readOnly
45
- })
44
+ const getButtonTokens = useThemeTokensCallback('ButtonGroupItem', tokens, variant)
46
45
 
47
- const a11y = a11yProps.select({
48
- accessibilityRole,
49
- ...rest
50
- })
51
- const itemA11yRole = a11y.accessibilityRole === 'radioGroup' ? 'radio' : 'checkbox'
46
+ const { currentValues, toggleOneValue } = useMultipleInputValues({
47
+ initialValues,
48
+ values,
49
+ maxValues,
50
+ onChange,
51
+ readOnly
52
+ })
53
+
54
+ const a11y = a11yProps.select({
55
+ accessibilityRole,
56
+ ...rest
57
+ })
58
+ const itemA11yRole = a11y.accessibilityRole === 'radiogroup' ? 'radio' : 'checkbox'
52
59
 
53
- return (
54
- <StackWrap {...a11y} space={space} direction={direction} tokens={stackTokens}>
55
- {items.map(({ label, id = label, accessibilityLabel }, index) => {
56
- const isSelected = currentValues.includes(id)
60
+ return (
61
+ <StackWrap {...a11y} space={space} direction={direction} tokens={stackTokens} ref={ref}>
62
+ {items.map(({ label, id = label, accessibilityLabel, ref: itemRef }, index) => {
63
+ const isSelected = currentValues.includes(id)
57
64
 
58
- // Allow handlers to be passed down for blur, hover, focus, pressIn, etc
59
- const pressHandlers = Object.fromEntries(
60
- Object.entries(pressProps.select(rest)).map(([key, handler]) => ({
61
- [key]: (args) => {
62
- // Pass each handler data on this button and current selection
63
- handler({ id, label, currentValues }, ...args)
64
- }
65
- }))
66
- )
67
- const handlePress = () => {
68
- if (pressHandlers.onPress) pressHandlers.onPress()
69
- toggleOneValue(id)
70
- }
65
+ // Pass an object of relevant component state as first argument for any passed-in press handlers
66
+ const pressHandlers = getPressHandlersWithArgs(rest, [{ id, label, currentValues }])
71
67
 
72
- const itemA11y = {
73
- accessibilityState: { checked: isSelected },
74
- accessibilityRole: itemA11yRole,
75
- accessibilityLabel,
76
- ...Platform.select({
77
- web: {
78
- // accessibilityPosInSet etc exists in React Native Web main branch
79
- // but not in a release compatible with Expo etc; just use `aria-*`
80
- 'aria-setsize': items.length,
81
- 'aria-posinset': index + 1
82
- },
83
- default: {}
84
- })
85
- }
68
+ const handlePress = (event) => {
69
+ if (pressHandlers.onPress) pressHandlers.onPress()
70
+ toggleOneValue(id, event)
71
+ }
86
72
 
87
- // Ensure button is direct child of group as MacOS voiceover only applies "X of Y" to
88
- // "radio" if it's a direct child of "radiogroup", even if aria-posinset etc exists
89
- return (
90
- <ButtonBase
91
- key={id}
92
- {...pressHandlers}
93
- onPress={handlePress}
94
- variant={{ component: 'ButtonGroup', ...buttonVariant }}
95
- selected={isSelected}
96
- inactive={inactive}
97
- {...itemA11y}
98
- >
99
- {label}
100
- </ButtonBase>
101
- )
102
- })}
103
- </StackWrap>
104
- )
105
- }
73
+ const itemA11y = {
74
+ accessibilityState: { checked: isSelected },
75
+ accessibilityRole: itemA11yRole,
76
+ accessibilityLabel,
77
+ ...a11yProps.getPositionInSet(items.length, index)
78
+ }
79
+
80
+ // Ensure button is direct child of group as MacOS voiceover only applies "X of Y" to
81
+ // "radio" if it's a direct child of "radiogroup", even if aria-posinset etc exists
82
+ return (
83
+ <ButtonBase
84
+ ref={itemRef}
85
+ key={id}
86
+ {...pressHandlers}
87
+ onPress={handlePress}
88
+ tokens={getButtonTokens}
89
+ selected={isSelected}
90
+ inactive={inactive}
91
+ {...itemA11y}
92
+ >
93
+ {label}
94
+ </ButtonBase>
95
+ )
96
+ })}
97
+ </StackWrap>
98
+ )
99
+ }
100
+ )
101
+ ButtonGroup.displayName = 'ButtonGroup'
106
102
 
107
103
  ButtonGroup.propTypes = {
108
104
  ...a11yProps.propTypes,
109
105
  ...pressProps.propTypes,
110
106
  tokens: getTokensPropType('ButtonGroup'),
111
107
  variant: variantProp.propType,
112
- buttonVariant: variantProp.propType,
113
108
  /**
114
109
  * The maximum number of items a user may select at once. Defaults to 1 and behaves
115
110
  * like radio buttons. To have no limit and allow any number of selections, pass `null`.
@@ -135,7 +130,11 @@ ButtonGroup.propTypes = {
135
130
  * which will be used in code and passed to any onChange function.
136
131
  * If not provided, the label is used.
137
132
  */
138
- id: PropTypes.string
133
+ id: PropTypes.string,
134
+ /**
135
+ * An optional ref for one individual button in the ButtonGroup
136
+ */
137
+ ref: ABBPropTypes.ref()
139
138
  })
140
139
  ),
141
140
  /**
@@ -1,21 +1,36 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import ButtonBase from './ButtonBase'
3
- import buttonPropTypes from './propTypes'
3
+ import buttonPropTypes, { textAndA11yText } from './propTypes'
4
4
  import { a11yProps, hrefAttrsProp, linkProps } from '../utils/propTypes'
5
+ import { useThemeTokensCallback } from '../ThemeProvider'
5
6
 
6
7
  /**
7
8
  * `ButtonLink` is a component with the semantics and behaviour of a link, but with the visual appearance of a button.
8
9
  * ButtonLink is a block-level component and should not be used inline.
9
10
  */
10
- const ButtonLink = ({ accessibilityRole = 'link', ...props }) => {
11
- const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
12
- return <ButtonBase accessibilityRole={accessibilityRole} hrefAttrs={hrefAttrs} {...rest} />
13
- }
11
+ const ButtonLink = forwardRef(
12
+ ({ accessibilityRole = 'link', tokens, variant, dataSet, ...props }, ref) => {
13
+ const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
14
+ const getTokens = useThemeTokensCallback('Button', tokens, variant)
15
+ return (
16
+ <ButtonBase
17
+ ref={ref}
18
+ accessibilityRole={accessibilityRole}
19
+ tokens={getTokens}
20
+ hrefAttrs={hrefAttrs}
21
+ dataSet={dataSet}
22
+ {...rest}
23
+ />
24
+ )
25
+ }
26
+ )
27
+ ButtonLink.displayName = 'ButtonLink'
14
28
 
15
29
  ButtonLink.propTypes = {
16
30
  ...a11yProps.types,
17
31
  ...buttonPropTypes,
18
- ...linkProps.types
32
+ ...linkProps.types,
33
+ children: textAndA11yText
19
34
  }
20
35
 
21
36
  export default ButtonLink
@@ -1,5 +1,11 @@
1
1
  import PropTypes from 'prop-types'
2
+ import ABBPropTypes from 'airbnb-prop-types'
2
3
  import { variantProp } from '../utils/propTypes'
4
+ import A11yText from '../A11yText'
5
+
6
+ export const textAndA11yText = ABBPropTypes.childrenOf(
7
+ PropTypes.oneOfType([ABBPropTypes.elementType(A11yText), PropTypes.string])
8
+ )
3
9
 
4
10
  const buttonPropTypes = {
5
11
  /**
@@ -12,10 +18,14 @@ const buttonPropTypes = {
12
18
  */
13
19
  disabled: PropTypes.bool,
14
20
  /**
15
- * Button's children must be either a text string, or a render function which is passed an object of
21
+ * Button's children must be either:
22
+ * - One or more text strings and / or A11yText components
23
+ * - A render function with contents that responds to current button state by being passed an object of:
24
+ * ```
16
25
  * { hovered<bool>, focused<bool>, pressed<bool>, inactive<bool>, selected<bool>, textStyles<RNStyle> }
26
+ * ```
17
27
  */
18
- children: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
28
+ children: PropTypes.oneOfType([PropTypes.func, textAndA11yText]).isRequired,
19
29
  /**
20
30
  * Function called when the button is pressed. Required unless the button has a href.
21
31
  */
package/src/Card/Card.jsx CHANGED
@@ -1,34 +1,11 @@
1
1
  import React from 'react'
2
2
  import PropTypes from 'prop-types'
3
- import { View } from 'react-native'
4
3
 
5
- import { applyShadowToken, useThemeTokens } from '../ThemeProvider'
4
+ import { useThemeTokens } from '../ThemeProvider'
6
5
  import { getTokensPropType, variantProp } from '../utils'
7
6
  import { useViewport } from '../ViewportProvider'
8
7
  import { a11yProps } from '../utils/propTypes'
9
-
10
- // Ensure explicit selection of tokens
11
- const selectStyles = ({
12
- backgroundColor,
13
- borderColor,
14
- borderRadius,
15
- borderWidth,
16
- paddingBottom,
17
- paddingLeft,
18
- paddingRight,
19
- paddingTop,
20
- shadow
21
- }) => ({
22
- backgroundColor,
23
- borderColor,
24
- borderRadius,
25
- borderWidth,
26
- paddingBottom,
27
- paddingLeft,
28
- paddingRight,
29
- paddingTop,
30
- ...applyShadowToken(shadow)
31
- })
8
+ import CardBase from './CardBase'
32
9
 
33
10
  /**
34
11
  * A basic card component, unstyled by default.
@@ -78,16 +55,13 @@ const selectStyles = ({
78
55
  * you automatically make inaccessible its children, which may or may not be appropriate
79
56
  * depending on what you are trying to achieve.
80
57
  */
81
- const Card = ({ children, tokens, variant, ...rest }) => {
58
+ const Card = ({ children, tokens, variant, dataSet, ...rest }) => {
82
59
  const viewport = useViewport()
83
60
  const themeTokens = useThemeTokens('Card', tokens, variant, { viewport })
84
- const cardStyle = selectStyles(themeTokens)
85
- const a11y = a11yProps.select(rest)
86
-
87
61
  return (
88
- <View style={cardStyle} {...a11y}>
62
+ <CardBase tokens={themeTokens} dataSet={dataSet} {...rest}>
89
63
  {children}
90
- </View>
64
+ </CardBase>
91
65
  )
92
66
  }
93
67