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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/.eslintrc.js +9 -0
  2. package/.ultra.cache.json +1 -1
  3. package/CHANGELOG.md +71 -0
  4. package/README.md +4 -2
  5. package/__fixtures__/Accessible.js +33 -0
  6. package/__fixtures__/Accessible.native.js +32 -0
  7. package/__fixtures__/test-utils.js +25 -0
  8. package/__fixtures__/testTheme.js +438 -31
  9. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  10. package/__tests__/Button/ButtonGroup.test.jsx +6 -7
  11. package/__tests__/Checkbox/Checkbox.test.jsx +2 -2
  12. package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
  13. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
  14. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
  15. package/__tests__/Icon/Icon.test.jsx +3 -3
  16. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  17. package/__tests__/Link/LinkBase.test.jsx +0 -14
  18. package/__tests__/Modal/Modal.test.jsx +47 -0
  19. package/__tests__/Notification/Notification.test.jsx +20 -0
  20. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  21. package/__tests__/Progress/Progress.test.jsx +79 -0
  22. package/__tests__/Radio/Radio.test.jsx +2 -2
  23. package/__tests__/Radio/RadioGroup.test.jsx +220 -0
  24. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  25. package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
  26. package/__tests__/Search/Search.test.jsx +73 -0
  27. package/__tests__/Select/Select.test.jsx +3 -2
  28. package/__tests__/Skeleton/Skeleton.test.jsx +1 -1
  29. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  30. package/__tests__/Tabs/Tabs.test.jsx +40 -0
  31. package/__tests__/Tags/Tags.test.jsx +5 -6
  32. package/__tests__/TextInput/TextArea.test.jsx +3 -2
  33. package/__tests__/TextInput/TextInputBase.test.jsx +10 -5
  34. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
  35. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
  36. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
  37. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
  38. package/__tests__/utils/children.test.jsx +128 -0
  39. package/__tests__/utils/input.test.js +59 -1
  40. package/__tests__/utils/semantics.test.jsx +43 -0
  41. package/__tests__/utils/useCopy.test.js +14 -3
  42. package/babel.config.js +20 -0
  43. package/jest.config.js +6 -3
  44. package/lib/A11yInfoProvider/index.js +54 -26
  45. package/lib/A11yText/index.js +45 -17
  46. package/lib/ActivityIndicator/Spinner.js +81 -0
  47. package/lib/ActivityIndicator/Spinner.native.js +129 -91
  48. package/lib/ActivityIndicator/index.js +28 -12
  49. package/lib/ActivityIndicator/shared.js +27 -12
  50. package/lib/BaseProvider/index.js +34 -11
  51. package/lib/Box/Box.js +153 -35
  52. package/lib/Box/index.js +13 -2
  53. package/lib/Button/Button.js +38 -16
  54. package/lib/Button/ButtonBase.js +93 -79
  55. package/lib/Button/ButtonGroup.js +112 -73
  56. package/lib/Button/ButtonLink.js +45 -19
  57. package/lib/Button/index.js +31 -4
  58. package/lib/Button/propTypes.js +32 -9
  59. package/lib/Card/Card.js +38 -41
  60. package/lib/Card/CardBase.js +86 -0
  61. package/lib/Card/PressableCardBase.js +141 -0
  62. package/lib/Card/index.js +40 -2
  63. package/lib/Checkbox/Checkbox.js +158 -111
  64. package/lib/Checkbox/CheckboxGroup.js +241 -0
  65. package/lib/Checkbox/CheckboxInput.js +74 -0
  66. package/lib/Checkbox/CheckboxInput.native.js +9 -1
  67. package/lib/Checkbox/index.js +21 -2
  68. package/lib/Divider/Divider.js +59 -28
  69. package/lib/Divider/index.js +13 -2
  70. package/lib/ExpandCollapse/Accordion.js +26 -7
  71. package/lib/ExpandCollapse/Control.js +60 -31
  72. package/lib/ExpandCollapse/ExpandCollapse.js +50 -28
  73. package/lib/ExpandCollapse/Panel.js +83 -44
  74. package/lib/ExpandCollapse/index.js +25 -7
  75. package/lib/Feedback/Feedback.js +77 -43
  76. package/lib/Feedback/index.js +13 -2
  77. package/lib/Fieldset/Fieldset.js +165 -0
  78. package/lib/Fieldset/FieldsetContainer.js +46 -0
  79. package/lib/Fieldset/FieldsetContainer.native.js +38 -0
  80. package/lib/Fieldset/Legend.js +38 -0
  81. package/lib/Fieldset/Legend.native.js +48 -0
  82. package/lib/Fieldset/cssReset.js +21 -0
  83. package/lib/Fieldset/index.js +13 -0
  84. package/lib/FlexGrid/Col/Col.js +73 -41
  85. package/lib/FlexGrid/Col/index.js +13 -2
  86. package/lib/FlexGrid/FlexGrid.js +99 -49
  87. package/lib/FlexGrid/Row/Row.js +58 -30
  88. package/lib/FlexGrid/Row/index.js +13 -2
  89. package/lib/FlexGrid/helpers/index.js +9 -1
  90. package/lib/FlexGrid/index.js +13 -2
  91. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  92. package/lib/HorizontalScroll/HorizontalScroll.js +200 -0
  93. package/lib/HorizontalScroll/HorizontalScrollButton.js +127 -0
  94. package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
  95. package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
  96. package/lib/HorizontalScroll/dictionary.js +18 -0
  97. package/lib/HorizontalScroll/index.js +35 -0
  98. package/lib/HorizontalScroll/itemPositions.js +128 -0
  99. package/lib/Icon/Icon.js +57 -48
  100. package/lib/Icon/IconText.js +54 -25
  101. package/lib/Icon/index.js +31 -4
  102. package/lib/IconButton/IconButton.js +140 -0
  103. package/lib/IconButton/index.js +13 -0
  104. package/lib/InputLabel/InputLabel.js +102 -40
  105. package/lib/InputLabel/LabelContent.js +41 -0
  106. package/lib/InputLabel/LabelContent.native.js +32 -6
  107. package/lib/InputLabel/index.js +13 -2
  108. package/lib/InputSupports/InputSupports.js +71 -52
  109. package/lib/InputSupports/index.js +13 -2
  110. package/lib/InputSupports/propTypes.js +19 -8
  111. package/lib/InputSupports/useInputSupports.js +41 -0
  112. package/lib/Link/ChevronLink.js +44 -20
  113. package/lib/Link/InlinePressable.js +56 -0
  114. package/lib/Link/InlinePressable.native.js +39 -15
  115. package/lib/Link/Link.js +36 -13
  116. package/lib/Link/LinkBase.js +98 -61
  117. package/lib/Link/TextButton.js +41 -17
  118. package/lib/Link/index.js +39 -5
  119. package/lib/List/List.js +55 -26
  120. package/lib/List/ListItem.js +79 -41
  121. package/lib/List/index.js +13 -2
  122. package/lib/Modal/Modal.js +231 -0
  123. package/lib/Modal/dictionary.js +16 -0
  124. package/lib/Modal/index.js +13 -0
  125. package/lib/Notification/Notification.js +216 -0
  126. package/lib/Notification/dictionary.js +15 -0
  127. package/lib/Notification/index.js +13 -0
  128. package/lib/Pagination/PageButton.js +61 -28
  129. package/lib/Pagination/Pagination.js +78 -43
  130. package/lib/Pagination/SideButton.js +73 -42
  131. package/lib/Pagination/dictionary.js +9 -2
  132. package/lib/Pagination/index.js +13 -2
  133. package/lib/Pagination/usePagination.js +12 -2
  134. package/lib/Progress/Progress.js +104 -0
  135. package/lib/Progress/ProgressBar.js +157 -0
  136. package/lib/Progress/ProgressBarBackground.js +61 -0
  137. package/lib/Progress/index.js +16 -0
  138. package/lib/Radio/Radio.js +116 -114
  139. package/lib/Radio/RadioButton.js +152 -0
  140. package/lib/Radio/RadioGroup.js +244 -0
  141. package/lib/Radio/RadioInput.js +76 -0
  142. package/lib/Radio/RadioInput.native.js +9 -1
  143. package/lib/Radio/index.js +21 -2
  144. package/lib/RadioCard/RadioCard.js +244 -0
  145. package/lib/RadioCard/RadioCardGroup.js +252 -0
  146. package/lib/RadioCard/index.js +21 -0
  147. package/lib/Search/Search.js +254 -0
  148. package/lib/Search/dictionary.js +19 -0
  149. package/lib/Search/index.js +13 -0
  150. package/lib/Select/Group.js +33 -0
  151. package/lib/Select/Group.native.js +16 -5
  152. package/lib/Select/Item.js +29 -0
  153. package/lib/Select/Item.native.js +14 -4
  154. package/lib/Select/Picker.js +84 -0
  155. package/lib/Select/Picker.native.js +73 -30
  156. package/lib/Select/Select.js +155 -85
  157. package/lib/Select/index.js +19 -6
  158. package/lib/SideNav/Item.js +63 -37
  159. package/lib/SideNav/ItemContent.js +41 -15
  160. package/lib/SideNav/ItemsGroup.js +55 -31
  161. package/lib/SideNav/SideNav.js +100 -73
  162. package/lib/SideNav/index.js +15 -1
  163. package/lib/Skeleton/Skeleton.js +64 -46
  164. package/lib/Skeleton/index.js +13 -2
  165. package/lib/Skeleton/skeleton.constant.js +12 -0
  166. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  167. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  168. package/lib/Spacer/Spacer.js +49 -18
  169. package/lib/Spacer/index.js +13 -2
  170. package/lib/StackView/StackView.js +72 -31
  171. package/lib/StackView/StackWrap.js +43 -13
  172. package/lib/StackView/StackWrap.native.js +13 -2
  173. package/lib/StackView/StackWrapBox.js +77 -29
  174. package/lib/StackView/StackWrapGap.js +56 -26
  175. package/lib/StackView/common.js +23 -6
  176. package/lib/StackView/getStackedContent.js +47 -17
  177. package/lib/StackView/index.js +29 -5
  178. package/lib/StepTracker/Step.js +245 -0
  179. package/lib/StepTracker/StepTracker.js +202 -0
  180. package/lib/StepTracker/dictionary.js +17 -0
  181. package/lib/StepTracker/index.js +13 -0
  182. package/lib/Tabs/Tabs.js +124 -0
  183. package/lib/Tabs/TabsItem.js +238 -0
  184. package/lib/Tabs/index.js +13 -0
  185. package/lib/Tags/Tags.js +148 -99
  186. package/lib/Tags/index.js +13 -2
  187. package/lib/TextInput/TextArea.js +57 -28
  188. package/lib/TextInput/TextInput.js +50 -23
  189. package/lib/TextInput/TextInputBase.js +90 -63
  190. package/lib/TextInput/index.js +23 -3
  191. package/lib/TextInput/propTypes.js +18 -7
  192. package/lib/ThemeProvider/ThemeProvider.js +46 -18
  193. package/lib/ThemeProvider/index.js +61 -6
  194. package/lib/ThemeProvider/useSetTheme.js +19 -5
  195. package/lib/ThemeProvider/useTheme.js +13 -4
  196. package/lib/ThemeProvider/useThemeTokens.js +32 -16
  197. package/lib/ThemeProvider/utils/index.js +31 -2
  198. package/lib/ThemeProvider/utils/styles.js +50 -14
  199. package/lib/ThemeProvider/utils/theme-tokens.js +121 -12
  200. package/lib/ToggleSwitch/ToggleSwitch.js +85 -56
  201. package/lib/ToggleSwitch/index.js +13 -2
  202. package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +20 -8
  203. package/lib/Tooltip/Backdrop.native.js +39 -15
  204. package/lib/Tooltip/Tooltip.js +117 -74
  205. package/lib/Tooltip/dictionary.js +9 -2
  206. package/lib/Tooltip/getTooltipPosition.js +9 -1
  207. package/lib/Tooltip/index.js +13 -2
  208. package/lib/TooltipButton/TooltipButton.js +57 -38
  209. package/lib/TooltipButton/index.js +13 -2
  210. package/lib/Typography/Typography.js +87 -41
  211. package/lib/Typography/index.js +13 -2
  212. package/lib/ViewportProvider/ViewportProvider.js +34 -13
  213. package/lib/ViewportProvider/index.js +28 -3
  214. package/lib/ViewportProvider/useViewport.js +15 -3
  215. package/lib/ViewportProvider/useViewportListener.js +24 -10
  216. package/lib/index.js +539 -33
  217. package/lib/utils/a11y/index.js +31 -1
  218. package/lib/utils/a11y/semantics.js +173 -0
  219. package/lib/utils/a11y/textSize.js +23 -7
  220. package/lib/utils/animation/index.js +15 -2
  221. package/lib/utils/animation/useVerticalExpandAnimation.js +27 -10
  222. package/lib/utils/children.js +134 -0
  223. package/lib/utils/index.js +163 -10
  224. package/lib/utils/info/index.js +18 -6
  225. package/lib/utils/info/platform/index.js +19 -7
  226. package/lib/utils/info/platform/platform.android.js +8 -1
  227. package/lib/utils/info/platform/platform.ios.js +8 -1
  228. package/lib/utils/info/platform/platform.js +8 -0
  229. package/lib/utils/info/platform/platform.native.js +8 -1
  230. package/lib/utils/info/versions.js +15 -4
  231. package/lib/utils/input.js +53 -25
  232. package/lib/utils/pressability.js +38 -10
  233. package/lib/utils/propTypes.js +287 -141
  234. package/lib/utils/useCopy.js +40 -5
  235. package/lib/utils/useHash.js +52 -0
  236. package/lib/utils/useHash.native.js +15 -0
  237. package/lib/utils/useResponsiveProp.js +21 -9
  238. package/lib/utils/useSpacingScale.js +19 -9
  239. package/lib/utils/useUniqueId.js +12 -3
  240. package/package.json +14 -9
  241. package/release-context.json +4 -4
  242. package/src/A11yText/index.jsx +6 -4
  243. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +5 -3
  244. package/src/ActivityIndicator/Spinner.native.jsx +5 -3
  245. package/src/Box/Box.jsx +132 -39
  246. package/src/Button/Button.jsx +10 -6
  247. package/src/Button/ButtonBase.jsx +99 -99
  248. package/src/Button/ButtonGroup.jsx +81 -69
  249. package/src/Button/ButtonLink.jsx +21 -15
  250. package/src/Button/propTypes.js +12 -2
  251. package/src/Card/Card.jsx +5 -31
  252. package/src/Card/CardBase.jsx +59 -0
  253. package/src/Card/PressableCardBase.jsx +119 -0
  254. package/src/Card/index.js +3 -0
  255. package/src/Checkbox/Checkbox.jsx +121 -112
  256. package/src/Checkbox/CheckboxGroup.jsx +206 -0
  257. package/src/Checkbox/{CheckboxInput.web.jsx → CheckboxInput.jsx} +0 -0
  258. package/src/Checkbox/index.js +2 -0
  259. package/src/Divider/Divider.jsx +7 -4
  260. package/src/ExpandCollapse/Accordion.jsx +3 -2
  261. package/src/ExpandCollapse/Control.jsx +40 -43
  262. package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
  263. package/src/ExpandCollapse/Panel.jsx +69 -63
  264. package/src/Feedback/Feedback.jsx +36 -33
  265. package/src/Fieldset/Fieldset.jsx +136 -0
  266. package/src/Fieldset/FieldsetContainer.jsx +31 -0
  267. package/src/Fieldset/FieldsetContainer.native.jsx +19 -0
  268. package/src/Fieldset/Legend.jsx +21 -0
  269. package/src/Fieldset/Legend.native.jsx +27 -0
  270. package/src/Fieldset/cssReset.js +14 -0
  271. package/src/Fieldset/index.js +3 -0
  272. package/src/FlexGrid/Col/Col.jsx +139 -132
  273. package/src/FlexGrid/FlexGrid.jsx +79 -51
  274. package/src/FlexGrid/Row/Row.jsx +55 -48
  275. package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
  276. package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
  277. package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
  278. package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
  279. package/src/HorizontalScroll/dictionary.js +11 -0
  280. package/src/HorizontalScroll/index.js +17 -0
  281. package/src/HorizontalScroll/itemPositions.js +101 -0
  282. package/src/Icon/Icon.jsx +43 -50
  283. package/src/Icon/IconText.jsx +23 -18
  284. package/src/Icon/index.js +2 -2
  285. package/src/IconButton/IconButton.jsx +114 -0
  286. package/src/IconButton/index.js +3 -0
  287. package/src/InputLabel/InputLabel.jsx +57 -35
  288. package/src/InputLabel/LabelContent.jsx +21 -0
  289. package/src/InputLabel/LabelContent.native.jsx +11 -2
  290. package/src/InputSupports/InputSupports.jsx +29 -45
  291. package/src/InputSupports/useInputSupports.js +30 -0
  292. package/src/Link/ChevronLink.jsx +26 -16
  293. package/src/Link/{InlinePressable.web.jsx → InlinePressable.jsx} +5 -3
  294. package/src/Link/InlinePressable.native.jsx +5 -3
  295. package/src/Link/Link.jsx +22 -16
  296. package/src/Link/LinkBase.jsx +76 -65
  297. package/src/Link/TextButton.jsx +30 -23
  298. package/src/List/List.jsx +5 -4
  299. package/src/List/ListItem.jsx +77 -82
  300. package/src/Modal/Modal.jsx +190 -0
  301. package/src/Modal/dictionary.js +9 -0
  302. package/src/Modal/index.js +3 -0
  303. package/src/Notification/Notification.jsx +164 -0
  304. package/src/Notification/dictionary.js +8 -0
  305. package/src/Notification/index.js +3 -0
  306. package/src/Pagination/PageButton.jsx +42 -35
  307. package/src/Pagination/Pagination.jsx +88 -92
  308. package/src/Pagination/SideButton.jsx +44 -41
  309. package/src/Progress/Progress.jsx +78 -0
  310. package/src/Progress/ProgressBar.jsx +123 -0
  311. package/src/Progress/ProgressBarBackground.jsx +36 -0
  312. package/src/Progress/index.js +6 -0
  313. package/src/Radio/Radio.jsx +82 -112
  314. package/src/Radio/RadioButton.jsx +142 -0
  315. package/src/Radio/RadioGroup.jsx +209 -0
  316. package/src/Radio/{RadioInput.web.jsx → RadioInput.jsx} +0 -0
  317. package/src/Radio/index.js +2 -0
  318. package/src/RadioCard/RadioCard.jsx +198 -0
  319. package/src/RadioCard/RadioCardGroup.jsx +218 -0
  320. package/src/RadioCard/index.js +5 -0
  321. package/src/Search/Search.jsx +225 -0
  322. package/src/Search/dictionary.js +12 -0
  323. package/src/Search/index.js +3 -0
  324. package/src/Select/{Group.web.jsx → Group.jsx} +0 -0
  325. package/src/Select/{Item.web.jsx → Item.jsx} +0 -0
  326. package/src/Select/Picker.jsx +74 -0
  327. package/src/Select/Picker.native.jsx +56 -49
  328. package/src/Select/Select.jsx +125 -92
  329. package/src/SideNav/Item.jsx +54 -47
  330. package/src/SideNav/ItemsGroup.jsx +50 -43
  331. package/src/SideNav/SideNav.jsx +68 -60
  332. package/src/Skeleton/Skeleton.jsx +25 -32
  333. package/src/Skeleton/skeleton.constant.js +3 -0
  334. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  335. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  336. package/src/Spacer/Spacer.jsx +11 -4
  337. package/src/StackView/StackView.jsx +54 -23
  338. package/src/StackView/StackWrap.jsx +16 -7
  339. package/src/StackView/StackWrapBox.jsx +63 -28
  340. package/src/StackView/StackWrapGap.jsx +46 -24
  341. package/src/StackView/common.jsx +3 -2
  342. package/src/StackView/getStackedContent.jsx +8 -2
  343. package/src/StepTracker/Step.jsx +202 -0
  344. package/src/StepTracker/StepTracker.jsx +174 -0
  345. package/src/StepTracker/dictionary.js +10 -0
  346. package/src/StepTracker/index.js +3 -0
  347. package/src/Tabs/Tabs.jsx +97 -0
  348. package/src/Tabs/TabsItem.jsx +212 -0
  349. package/src/Tabs/index.js +3 -0
  350. package/src/Tags/Tags.jsx +115 -102
  351. package/src/TextInput/TextArea.jsx +5 -4
  352. package/src/TextInput/TextInput.jsx +5 -4
  353. package/src/TextInput/TextInputBase.jsx +95 -98
  354. package/src/ThemeProvider/ThemeProvider.jsx +11 -7
  355. package/src/ThemeProvider/useSetTheme.js +4 -0
  356. package/src/ThemeProvider/useThemeTokens.js +2 -2
  357. package/src/ThemeProvider/utils/styles.js +18 -5
  358. package/src/ThemeProvider/utils/theme-tokens.js +74 -5
  359. package/src/ToggleSwitch/ToggleSwitch.jsx +50 -52
  360. package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
  361. package/src/Tooltip/Tooltip.jsx +135 -131
  362. package/src/TooltipButton/TooltipButton.jsx +23 -27
  363. package/src/Typography/Typography.jsx +71 -47
  364. package/src/index.js +23 -2
  365. package/src/utils/a11y/index.js +1 -0
  366. package/src/utils/a11y/semantics.js +162 -0
  367. package/src/utils/children.jsx +119 -0
  368. package/src/utils/index.js +3 -0
  369. package/src/utils/info/platform/platform.js +1 -0
  370. package/src/utils/info/versions.js +2 -2
  371. package/src/utils/input.js +36 -25
  372. package/src/utils/pressability.js +4 -0
  373. package/src/utils/propTypes.js +199 -72
  374. package/src/utils/useCopy.js +30 -4
  375. package/src/utils/useHash.js +39 -0
  376. package/src/utils/useHash.native.js +6 -0
  377. package/stories/A11yText/A11yText.stories.jsx +6 -10
  378. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +1 -1
  379. package/stories/Box/Box.stories.jsx +1 -1
  380. package/stories/Button/Button.stories.jsx +2 -2
  381. package/stories/Button/ButtonGroup.stories.jsx +1 -1
  382. package/stories/Button/ButtonLink.stories.jsx +1 -1
  383. package/stories/Card/Card.stories.jsx +1 -1
  384. package/stories/Checkbox/Checkbox.stories.jsx +24 -1
  385. package/stories/Divider/Divider.stories.jsx +1 -1
  386. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +2 -2
  387. package/stories/Feedback/Feedback.stories.jsx +1 -1
  388. package/stories/FlexGrid/01 FlexGrid.stories.jsx +1 -1
  389. package/stories/FlexGrid/02 Row.stories.jsx +1 -1
  390. package/stories/FlexGrid/03 Col.stories.jsx +1 -1
  391. package/stories/Icon/Icon.stories.jsx +27 -7
  392. package/stories/IconButton/IconButton.stories.jsx +50 -0
  393. package/stories/InputLabel/InputLabel.stories.jsx +1 -1
  394. package/stories/Link/ChevronLink.stories.jsx +1 -1
  395. package/stories/Link/Link.stories.jsx +17 -21
  396. package/stories/Link/TextButton.stories.jsx +1 -1
  397. package/stories/List/List.stories.jsx +1 -1
  398. package/stories/Modal/Modal.stories.jsx +29 -0
  399. package/stories/Notification/Notification.stories.jsx +82 -0
  400. package/stories/Pagination/Pagination.stories.jsx +1 -1
  401. package/stories/Progress/Progress.stories.jsx +93 -0
  402. package/stories/Radio/Radio.stories.jsx +23 -36
  403. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  404. package/stories/Search/Search.stories.jsx +16 -0
  405. package/stories/Select/Select.stories.jsx +1 -1
  406. package/stories/SideNav/SideNav.stories.jsx +1 -1
  407. package/stories/SideNav/SideNavItem.stories.jsx +1 -1
  408. package/stories/SideNav/SideNavItemsGroup.stories.jsx +1 -1
  409. package/stories/Skeleton/Skeleton.stories.jsx +2 -2
  410. package/stories/Spacer/Spacer.stories.jsx +1 -1
  411. package/stories/StackView/StackView.stories.jsx +1 -1
  412. package/stories/StackView/StackWrap.stories.jsx +1 -1
  413. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  414. package/stories/Tabs/Tabs.stories.jsx +97 -0
  415. package/stories/Tags/Tags.stories.jsx +1 -1
  416. package/stories/TextInput/TextArea.stories.jsx +1 -1
  417. package/stories/TextInput/TextInput.stories.jsx +1 -1
  418. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +1 -1
  419. package/stories/Tooltip/Tooltip.stories.jsx +1 -1
  420. package/stories/TooltipButton/TooltipButton.stories.jsx +1 -1
  421. package/stories/Typography/Typography.stories.jsx +1 -1
  422. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  423. package/stories/supports.jsx +37 -3
  424. package/__fixtures__/accessible.icon.svg +0 -6
  425. package/babel.config.json +0 -8
  426. package/docs/Contributing.stories.mdx +0 -9
  427. package/docs/Fonts.stories.mdx +0 -104
  428. package/docs/Icons.stories.mdx +0 -144
  429. package/docs/Introduction.stories.mdx +0 -9
  430. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  431. package/lib/Checkbox/CheckboxInput.web.js +0 -57
  432. package/lib/InputLabel/LabelContent.web.js +0 -17
  433. package/lib/Link/InlinePressable.web.js +0 -32
  434. package/lib/Radio/RadioInput.web.js +0 -59
  435. package/lib/Select/Group.web.js +0 -18
  436. package/lib/Select/Item.web.js +0 -15
  437. package/lib/Select/Picker.web.js +0 -63
  438. package/lib/config/svgr-icons-web.js +0 -9
  439. package/lib/config/svgr-icons.js +0 -52
  440. package/lib/utils/info/platform/platform.web.js +0 -1
  441. package/src/InputLabel/LabelContent.web.jsx +0 -13
  442. package/src/Select/Picker.web.jsx +0 -67
  443. package/src/config/svgr-icons-web.js +0 -11
  444. package/src/config/svgr-icons.js +0 -46
  445. package/src/utils/info/platform/platform.web.js +0 -1
@@ -1,15 +1,15 @@
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 { applyTextStyles, applyShadowToken } from '../ThemeProvider/utils'
4
+ import { applyTextStyles, applyShadowToken, applyOuterBorder } from '../ThemeProvider/utils'
5
5
  import buttonPropTypes from './propTypes'
6
6
  import {
7
7
  a11yProps,
8
8
  getCursorStyle,
9
- hrefAttrsProp,
10
9
  linkProps,
11
10
  resolvePressableState,
12
- resolvePressableTokens
11
+ resolvePressableTokens,
12
+ wrapStringsInText
13
13
  } from '../utils'
14
14
 
15
15
  const getOuterBorderOffset = ({ outerBorderGap = 0, outerBorderWidth = 0 }) =>
@@ -20,27 +20,26 @@ const selectOuterContainerStyles = ({
20
20
  opacity,
21
21
  outerBorderColor,
22
22
  outerBorderWidth,
23
- outerBorderGap = 0,
24
- outerBorderRadius = 0,
23
+ outerBorderGap,
24
+ borderRadius,
25
25
  outerBackgroundColor
26
26
  }) => ({
27
27
  alignSelf,
28
- padding: outerBorderGap,
29
- borderWidth: outerBorderWidth,
30
- borderColor: outerBorderColor,
31
- borderRadius: outerBorderRadius + outerBorderGap,
32
28
  backgroundColor: outerBackgroundColor,
33
- opacity
29
+ opacity,
30
+ ...applyOuterBorder({
31
+ outerBorderGap,
32
+ outerBorderWidth,
33
+ outerBorderColor,
34
+ borderRadius
35
+ })
34
36
  })
35
37
 
36
38
  const selectOuterWidthStyles = ({ outerBorderGap, outerBorderWidth, width }) => {
37
39
  // The inner container's bounding box is the bounding box of the button overall
38
40
  // so this many device pixels will sit outside of the overall bounding box
39
41
  const outerBorderOffset = getOuterBorderOffset({ outerBorderGap, outerBorderWidth })
40
-
41
- const widthStyles = {
42
- margin: 0 - outerBorderOffset
43
- }
42
+ const widthStyles = {}
44
43
 
45
44
  if (!width) {
46
45
  return {
@@ -131,91 +130,92 @@ const selectWebOnlyStyles = (inactive, themeTokens, { accessibilityRole }) => {
131
130
  })
132
131
  }
133
132
 
134
- // TODO: see if this can be made into a generalised utility, ideally when
135
- // there is a stable, generic, generalised approach to within-component text
136
- const resolveChildren = (children, { textStyles, state }) => {
137
- switch (typeof children) {
138
- case 'function':
139
- return children(state)
140
- case 'string':
141
- return <Text style={textStyles}>{children}</Text>
142
- default:
143
- return children
144
- }
145
- }
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
+ }
146
164
 
147
- const ButtonBase = ({
148
- href,
149
- hrefAttrs,
150
- children,
151
- onPress,
152
- tokens = {},
153
- disabled = false, // alias for inactive
154
- inactive = disabled,
155
- selected = false,
156
- ...rest
157
- }) => {
158
- const extraButtonState = { inactive, selected }
159
- const resolveTokens = (pressableState) =>
160
- resolvePressableTokens(tokens, pressableState, extraButtonState)
161
-
162
- const a11y = a11yProps.select(rest)
163
-
164
- const getPressableStyle = (pressableState) => {
165
- const themeTokens = resolveTokens(pressableState)
166
- return [
167
- staticStyles.row,
168
- selectWebOnlyStyles(inactive, themeTokens, a11y),
169
- selectOuterContainerStyles(themeTokens),
170
- selectOuterWidthStyles(themeTokens)
171
- ]
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
+ )
172
216
  }
173
-
174
- return (
175
- <Pressable
176
- href={href}
177
- onPress={linkProps.handleHref({ href, onPress })}
178
- style={getPressableStyle}
179
- disabled={inactive}
180
- {...hrefAttrsProp.spread(hrefAttrs)}
181
- {...a11y}
182
- >
183
- {(pressableState) => {
184
- const themeTokens = resolveTokens(pressableState)
185
- const containerStyles = selectInnerContainerStyles(themeTokens)
186
- const borderStyles = selectBorderStyles(themeTokens)
187
- const textStyles = [selectTextStyles(themeTokens), staticStyles.text]
188
-
189
- // If the container has a width set, fill it instead of sizing from content.
190
- // If in future we support text alignments other than center, add here.
191
- const stretchStyles = themeTokens.width ? staticStyles.stretch : staticStyles.align
192
-
193
- return (
194
- <View
195
- style={[
196
- containerStyles,
197
- borderStyles,
198
- stretchStyles,
199
- staticStyles.row,
200
- Platform.select({
201
- web: {
202
- maxWidth: '100%', // ensure overflowing content wraps
203
- // TODO: https://github.com/telus/universal-design-system/issues/487
204
- transition: 'background-color 200ms, border-color 200ms'
205
- }
206
- })
207
- ]}
208
- >
209
- {resolveChildren(children, {
210
- state: { ...resolvePressableState(pressableState, extraButtonState), textStyles },
211
- textStyles
212
- })}
213
- </View>
214
- )
215
- }}
216
- </Pressable>
217
- )
218
- }
217
+ )
218
+ ButtonBase.displayName = 'ButtonBase'
219
219
 
220
220
  ButtonBase.propTypes = {
221
221
  ...a11yProps.types,
@@ -1,5 +1,6 @@
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'
@@ -16,81 +17,88 @@ import {
16
17
  import { useMultipleInputValues } from '../utils/input'
17
18
  import { getPressHandlersWithArgs } from '../utils/pressability'
18
19
 
19
- const ButtonGroup = ({
20
- variant,
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 getButtonTokens = useThemeTokensCallback('ButtonGroupItem', tokens, variant)
44
+ const getButtonTokens = useThemeTokensCallback('ButtonGroupItem', tokens, variant)
40
45
 
41
- const { currentValues, toggleOneValue } = useMultipleInputValues({
42
- initialValues,
43
- values,
44
- maxValues,
45
- onChange,
46
- readOnly
47
- })
46
+ const { currentValues, toggleOneValue } = useMultipleInputValues({
47
+ initialValues,
48
+ values,
49
+ maxValues,
50
+ onChange,
51
+ readOnly
52
+ })
48
53
 
49
- const a11y = a11yProps.select({
50
- accessibilityRole,
51
- ...rest
52
- })
53
- const itemA11yRole = a11y.accessibilityRole === 'radioGroup' ? 'radio' : 'checkbox'
54
+ const a11y = a11yProps.select({
55
+ accessibilityRole,
56
+ ...rest
57
+ })
58
+ const itemA11yRole = a11y.accessibilityRole === 'radiogroup' ? 'radio' : 'checkbox'
54
59
 
55
- return (
56
- <StackWrap {...a11y} space={space} direction={direction} tokens={stackTokens}>
57
- {items.map(({ label, id = label, accessibilityLabel }, index) => {
58
- 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)
59
64
 
60
- // Pass an object of relevant component state as first argument for any passed-in press handlers
61
- const pressHandlers = getPressHandlersWithArgs(rest, [{ id, label, currentValues }])
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 }])
62
67
 
63
- const handlePress = () => {
64
- if (pressHandlers.onPress) pressHandlers.onPress()
65
- toggleOneValue(id)
66
- }
68
+ const handlePress = (event) => {
69
+ if (pressHandlers.onPress) pressHandlers.onPress()
70
+ toggleOneValue(id, event)
71
+ }
67
72
 
68
- const itemA11y = {
69
- accessibilityState: { checked: isSelected },
70
- accessibilityRole: itemA11yRole,
71
- accessibilityLabel,
72
- ...a11yProps.getPositionInSet(items.length, index)
73
- }
73
+ const itemA11y = {
74
+ accessibilityState: { checked: isSelected },
75
+ accessibilityRole: itemA11yRole,
76
+ accessibilityLabel,
77
+ ...a11yProps.getPositionInSet(items.length, index)
78
+ }
74
79
 
75
- // Ensure button is direct child of group as MacOS voiceover only applies "X of Y" to
76
- // "radio" if it's a direct child of "radiogroup", even if aria-posinset etc exists
77
- return (
78
- <ButtonBase
79
- key={id}
80
- {...pressHandlers}
81
- onPress={handlePress}
82
- tokens={getButtonTokens}
83
- selected={isSelected}
84
- inactive={inactive}
85
- {...itemA11y}
86
- >
87
- {label}
88
- </ButtonBase>
89
- )
90
- })}
91
- </StackWrap>
92
- )
93
- }
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'
94
102
 
95
103
  ButtonGroup.propTypes = {
96
104
  ...a11yProps.propTypes,
@@ -122,7 +130,11 @@ ButtonGroup.propTypes = {
122
130
  * which will be used in code and passed to any onChange function.
123
131
  * If not provided, the label is used.
124
132
  */
125
- id: PropTypes.string
133
+ id: PropTypes.string,
134
+ /**
135
+ * An optional ref for one individual button in the ButtonGroup
136
+ */
137
+ ref: ABBPropTypes.ref()
126
138
  })
127
139
  ),
128
140
  /**
@@ -1,6 +1,6 @@
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
5
  import { useThemeTokensCallback } from '../ThemeProvider'
6
6
 
@@ -8,23 +8,29 @@ import { useThemeTokensCallback } from '../ThemeProvider'
8
8
  * `ButtonLink` is a component with the semantics and behaviour of a link, but with the visual appearance of a button.
9
9
  * ButtonLink is a block-level component and should not be used inline.
10
10
  */
11
- const ButtonLink = ({ accessibilityRole = 'link', tokens, variant, ...props }) => {
12
- const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
13
- const getTokens = useThemeTokensCallback('Button', tokens, variant)
14
- return (
15
- <ButtonBase
16
- accessibilityRole={accessibilityRole}
17
- tokens={getTokens}
18
- hrefAttrs={hrefAttrs}
19
- {...rest}
20
- />
21
- )
22
- }
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'
23
28
 
24
29
  ButtonLink.propTypes = {
25
30
  ...a11yProps.types,
26
31
  ...buttonPropTypes,
27
- ...linkProps.types
32
+ ...linkProps.types,
33
+ children: textAndA11yText
28
34
  }
29
35
 
30
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
 
@@ -0,0 +1,59 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { View } from 'react-native'
4
+
5
+ import { applyShadowToken } from '../ThemeProvider'
6
+ import { getTokensPropType } from '../utils'
7
+ import { a11yProps, viewProps } from '../utils/propTypes'
8
+
9
+ // Ensure explicit selection of tokens
10
+ const selectStyles = ({
11
+ flex,
12
+ backgroundColor,
13
+ borderColor,
14
+ borderRadius,
15
+ borderWidth,
16
+ paddingBottom,
17
+ paddingLeft,
18
+ paddingRight,
19
+ paddingTop,
20
+ minWidth,
21
+ shadow
22
+ }) => ({
23
+ flex,
24
+ backgroundColor,
25
+ borderColor,
26
+ borderRadius,
27
+ borderWidth,
28
+ paddingBottom,
29
+ paddingLeft,
30
+ paddingRight,
31
+ paddingTop,
32
+ minWidth,
33
+ ...applyShadowToken(shadow)
34
+ })
35
+
36
+ /**
37
+ * A themeless base component for Card which components can apply theme tokens to. Not
38
+ * intended to be used in apps or sites directly: build themed components on top of this.
39
+ */
40
+ const CardBase = forwardRef(({ children, tokens, dataSet, ...rest }, ref) => {
41
+ const cardStyle = selectStyles(typeof tokens === 'function' ? tokens() : tokens)
42
+ const props = { ...a11yProps.select(rest), ...viewProps.select(rest) }
43
+
44
+ return (
45
+ <View style={cardStyle} dataSet={dataSet} ref={ref} {...props}>
46
+ {children}
47
+ </View>
48
+ )
49
+ })
50
+ CardBase.displayName = 'CardBase'
51
+
52
+ CardBase.propTypes = {
53
+ children: PropTypes.node,
54
+ tokens: getTokensPropType('Card'),
55
+ ...viewProps.types,
56
+ ...a11yProps.types
57
+ }
58
+
59
+ export default CardBase