@telus-uds/components-base 1.2.0 → 1.4.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 (415) hide show
  1. package/.turbo/turbo-build.log +8 -0
  2. package/CHANGELOG.json +61 -0
  3. package/CHANGELOG.md +45 -2
  4. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +35 -0
  5. package/__tests__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +287 -0
  6. package/__tests__/FlexGrid/Col.test.jsx +6 -10
  7. package/__tests__/utils/props.test.js +36 -0
  8. package/__tests__/utils/semantics.test.jsx +1 -10
  9. package/babel.config.js +27 -5
  10. package/component-docs.json +170 -494
  11. package/generate-component-docs.js +3 -0
  12. package/lib/A11yText/index.js +6 -5
  13. package/lib/ActivityIndicator/Spinner.js +46 -37
  14. package/lib/ActivityIndicator/Spinner.native.js +26 -15
  15. package/lib/ActivityIndicator/index.js +3 -3
  16. package/lib/Box/Box.js +8 -8
  17. package/lib/Button/Button.js +2 -2
  18. package/lib/Button/ButtonBase.js +7 -8
  19. package/lib/Button/ButtonGroup.js +10 -12
  20. package/lib/Button/ButtonLink.js +4 -4
  21. package/lib/Button/propTypes.js +4 -2
  22. package/lib/Card/Card.js +6 -5
  23. package/lib/Card/CardBase.js +6 -9
  24. package/lib/Card/PressableCardBase.js +6 -11
  25. package/lib/Checkbox/Checkbox.js +4 -6
  26. package/lib/Divider/Divider.js +14 -13
  27. package/lib/ExpandCollapse/Control.js +7 -7
  28. package/lib/ExpandCollapse/ExpandCollapse.js +6 -2
  29. package/lib/ExpandCollapse/Panel.js +6 -7
  30. package/lib/Feedback/Feedback.js +6 -5
  31. package/lib/Fieldset/Fieldset.js +1 -3
  32. package/lib/FlexGrid/FlexGrid.js +4 -4
  33. package/lib/FlexGrid/helpers/index.js +1 -4
  34. package/lib/HorizontalScroll/HorizontalScroll.js +5 -6
  35. package/lib/IconButton/IconButton.js +6 -6
  36. package/lib/InputLabel/InputLabel.js +7 -2
  37. package/lib/InputSupports/InputSupports.js +2 -2
  38. package/lib/Link/LinkBase.js +12 -13
  39. package/lib/List/List.js +4 -6
  40. package/lib/List/ListItem.js +6 -2
  41. package/lib/Modal/Modal.js +6 -2
  42. package/lib/Notification/Notification.js +12 -8
  43. package/lib/Pagination/Pagination.js +8 -3
  44. package/lib/Progress/Progress.js +5 -4
  45. package/lib/Progress/ProgressBar.js +8 -7
  46. package/lib/Radio/Radio.js +4 -6
  47. package/lib/Radio/RadioButton.js +6 -3
  48. package/lib/Radio/RadioGroup.js +7 -2
  49. package/lib/RadioCard/RadioCard.js +4 -4
  50. package/lib/RadioCard/RadioCardGroup.js +9 -6
  51. package/lib/Search/Search.js +7 -2
  52. package/lib/Select/Select.js +10 -9
  53. package/lib/SideNav/Item.js +7 -7
  54. package/lib/SideNav/SideNav.js +7 -3
  55. package/lib/Skeleton/Skeleton.js +6 -2
  56. package/lib/Spacer/Spacer.js +9 -20
  57. package/lib/StackView/StackView.js +7 -7
  58. package/lib/StackView/StackWrapBox.js +6 -7
  59. package/lib/StackView/StackWrapGap.js +6 -5
  60. package/lib/StackView/getStackedContent.js +1 -1
  61. package/lib/StepTracker/Step.js +7 -3
  62. package/lib/StepTracker/StepTracker.js +7 -7
  63. package/lib/Tabs/Tabs.js +6 -2
  64. package/lib/Tabs/TabsItem.js +6 -5
  65. package/lib/Tags/Tags.js +11 -12
  66. package/lib/TextInput/TextArea.js +13 -14
  67. package/lib/TextInput/TextInput.js +13 -14
  68. package/lib/TextInput/TextInputBase.js +5 -3
  69. package/lib/ThemeProvider/useThemeTokens.js +3 -3
  70. package/lib/ThemeProvider/utils/theme-tokens.js +3 -3
  71. package/lib/ToggleSwitch/ToggleSwitch.js +10 -9
  72. package/lib/ToggleSwitch/ToggleSwitchGroup.js +10 -12
  73. package/lib/Tooltip/Tooltip.js +7 -2
  74. package/lib/TooltipButton/TooltipButton.js +7 -2
  75. package/lib/Typography/Typography.js +8 -6
  76. package/lib/index.js +7 -0
  77. package/lib/utils/a11y/semantics.js +4 -3
  78. package/lib/utils/children.js +5 -1
  79. package/lib/utils/index.js +18 -4
  80. package/lib/utils/pressability.js +2 -2
  81. package/lib/utils/props/a11yProps.js +153 -0
  82. package/lib/utils/props/clickProps.js +36 -0
  83. package/lib/utils/props/componentPropType.js +70 -0
  84. package/lib/utils/props/copyPropTypes.js +14 -0
  85. package/lib/utils/props/getPropSelector.js +13 -0
  86. package/lib/utils/props/hrefAttrsProp.js +41 -0
  87. package/lib/utils/props/index.js +158 -0
  88. package/lib/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -3
  89. package/lib/utils/props/linkProps.js +64 -0
  90. package/lib/utils/props/paddingProp.js +20 -0
  91. package/lib/utils/props/pressProps.js +57 -0
  92. package/lib/utils/props/rectProp.js +20 -0
  93. package/lib/utils/props/responsiveProps.js +40 -0
  94. package/lib/utils/props/selectSystemProps.js +31 -0
  95. package/lib/utils/props/spacingProps.js +71 -0
  96. package/lib/utils/props/tokens.js +145 -0
  97. package/lib/utils/props/variantProp.js +28 -0
  98. package/lib/utils/props/viewProps.js +34 -0
  99. package/lib/utils/ssr.js +51 -0
  100. package/lib/utils/useResponsiveProp.js +1 -1
  101. package/lib/utils/useSpacingScale.js +4 -4
  102. package/lib-module/A11yInfoProvider/index.js +62 -0
  103. package/lib-module/A11yText/index.js +55 -0
  104. package/lib-module/ActivityIndicator/Spinner.js +76 -0
  105. package/lib-module/ActivityIndicator/Spinner.native.js +143 -0
  106. package/lib-module/ActivityIndicator/index.js +40 -0
  107. package/lib-module/ActivityIndicator/shared.js +12 -0
  108. package/lib-module/BaseProvider/index.js +26 -0
  109. package/lib-module/Box/Box.js +243 -0
  110. package/lib-module/Box/index.js +2 -0
  111. package/lib-module/Button/Button.js +25 -0
  112. package/lib-module/Button/ButtonBase.js +254 -0
  113. package/lib-module/Button/ButtonGroup.js +164 -0
  114. package/lib-module/Button/ButtonLink.js +39 -0
  115. package/lib-module/Button/index.js +4 -0
  116. package/lib-module/Button/propTypes.js +36 -0
  117. package/lib-module/Card/Card.js +83 -0
  118. package/lib-module/Card/CardBase.js +62 -0
  119. package/lib-module/Card/PressableCardBase.js +113 -0
  120. package/lib-module/Card/index.js +4 -0
  121. package/lib-module/Checkbox/Checkbox.js +321 -0
  122. package/lib-module/Checkbox/CheckboxGroup.js +218 -0
  123. package/lib-module/Checkbox/CheckboxInput.js +58 -0
  124. package/lib-module/Checkbox/CheckboxInput.native.js +6 -0
  125. package/lib-module/Checkbox/index.js +3 -0
  126. package/lib-module/Divider/Divider.js +123 -0
  127. package/lib-module/Divider/index.js +2 -0
  128. package/lib-module/ExpandCollapse/Accordion.js +15 -0
  129. package/lib-module/ExpandCollapse/Control.js +130 -0
  130. package/lib-module/ExpandCollapse/ExpandCollapse.js +94 -0
  131. package/lib-module/ExpandCollapse/Panel.js +158 -0
  132. package/lib-module/ExpandCollapse/index.js +7 -0
  133. package/lib-module/Feedback/Feedback.js +144 -0
  134. package/lib-module/Feedback/index.js +2 -0
  135. package/lib-module/Fieldset/Fieldset.js +145 -0
  136. package/lib-module/Fieldset/FieldsetContainer.js +29 -0
  137. package/lib-module/Fieldset/FieldsetContainer.native.js +20 -0
  138. package/lib-module/Fieldset/Legend.js +21 -0
  139. package/lib-module/Fieldset/Legend.native.js +28 -0
  140. package/lib-module/Fieldset/cssReset.js +14 -0
  141. package/lib-module/Fieldset/index.js +2 -0
  142. package/lib-module/FlexGrid/Col/Col.js +265 -0
  143. package/lib-module/FlexGrid/Col/index.js +2 -0
  144. package/lib-module/FlexGrid/FlexGrid.js +147 -0
  145. package/lib-module/FlexGrid/Row/Row.js +177 -0
  146. package/lib-module/FlexGrid/Row/index.js +2 -0
  147. package/lib-module/FlexGrid/helpers/index.js +18 -0
  148. package/lib-module/FlexGrid/index.js +2 -0
  149. package/lib-module/FlexGrid/providers/GutterContext.js +3 -0
  150. package/lib-module/HorizontalScroll/HorizontalScroll.js +171 -0
  151. package/lib-module/HorizontalScroll/HorizontalScrollButton.js +102 -0
  152. package/lib-module/HorizontalScroll/ScrollViewEnd.js +47 -0
  153. package/lib-module/HorizontalScroll/ScrollViewEnd.native.js +24 -0
  154. package/lib-module/HorizontalScroll/dictionary.js +11 -0
  155. package/lib-module/HorizontalScroll/index.js +11 -0
  156. package/lib-module/HorizontalScroll/itemPositions.js +106 -0
  157. package/lib-module/Icon/Icon.js +61 -0
  158. package/lib-module/Icon/IconText.js +81 -0
  159. package/lib-module/Icon/index.js +4 -0
  160. package/lib-module/IconButton/IconButton.js +115 -0
  161. package/lib-module/IconButton/index.js +2 -0
  162. package/lib-module/InputLabel/InputLabel.js +131 -0
  163. package/lib-module/InputLabel/LabelContent.js +24 -0
  164. package/lib-module/InputLabel/LabelContent.native.js +16 -0
  165. package/lib-module/InputLabel/index.js +2 -0
  166. package/lib-module/InputSupports/InputSupports.js +88 -0
  167. package/lib-module/InputSupports/index.js +2 -0
  168. package/lib-module/InputSupports/useInputSupports.js +31 -0
  169. package/lib-module/Link/ChevronLink.js +51 -0
  170. package/lib-module/Link/InlinePressable.js +37 -0
  171. package/lib-module/Link/InlinePressable.native.js +85 -0
  172. package/lib-module/Link/Link.js +27 -0
  173. package/lib-module/Link/LinkBase.js +210 -0
  174. package/lib-module/Link/TextButton.js +43 -0
  175. package/lib-module/Link/index.js +5 -0
  176. package/lib-module/List/List.js +55 -0
  177. package/lib-module/List/ListItem.js +213 -0
  178. package/lib-module/List/index.js +5 -0
  179. package/lib-module/Modal/Modal.js +208 -0
  180. package/lib-module/Modal/dictionary.js +9 -0
  181. package/lib-module/Modal/index.js +2 -0
  182. package/lib-module/Notification/Notification.js +196 -0
  183. package/lib-module/Notification/dictionary.js +8 -0
  184. package/lib-module/Notification/index.js +2 -0
  185. package/lib-module/Pagination/PageButton.js +65 -0
  186. package/lib-module/Pagination/Pagination.js +140 -0
  187. package/lib-module/Pagination/SideButton.js +103 -0
  188. package/lib-module/Pagination/dictionary.js +18 -0
  189. package/lib-module/Pagination/index.js +2 -0
  190. package/lib-module/Pagination/usePagination.js +72 -0
  191. package/lib-module/Progress/Progress.js +85 -0
  192. package/lib-module/Progress/ProgressBar.js +134 -0
  193. package/lib-module/Progress/ProgressBarBackground.js +41 -0
  194. package/lib-module/Progress/index.js +4 -0
  195. package/lib-module/Radio/Radio.js +263 -0
  196. package/lib-module/Radio/RadioButton.js +128 -0
  197. package/lib-module/Radio/RadioGroup.js +225 -0
  198. package/lib-module/Radio/RadioInput.js +60 -0
  199. package/lib-module/Radio/RadioInput.native.js +6 -0
  200. package/lib-module/Radio/index.js +3 -0
  201. package/lib-module/RadioCard/RadioCard.js +218 -0
  202. package/lib-module/RadioCard/RadioCardGroup.js +232 -0
  203. package/lib-module/RadioCard/index.js +3 -0
  204. package/lib-module/Search/Search.js +233 -0
  205. package/lib-module/Search/dictionary.js +12 -0
  206. package/lib-module/Search/index.js +2 -0
  207. package/lib-module/Select/Group.js +20 -0
  208. package/lib-module/Select/Group.native.js +14 -0
  209. package/lib-module/Select/Item.js +17 -0
  210. package/lib-module/Select/Item.native.js +9 -0
  211. package/lib-module/Select/Picker.js +67 -0
  212. package/lib-module/Select/Picker.native.js +110 -0
  213. package/lib-module/Select/Select.js +317 -0
  214. package/lib-module/Select/index.js +6 -0
  215. package/lib-module/SideNav/Item.js +139 -0
  216. package/lib-module/SideNav/ItemContent.js +45 -0
  217. package/lib-module/SideNav/ItemsGroup.js +115 -0
  218. package/lib-module/SideNav/SideNav.js +133 -0
  219. package/lib-module/SideNav/index.js +1 -0
  220. package/lib-module/Skeleton/Skeleton.js +117 -0
  221. package/lib-module/Skeleton/index.js +2 -0
  222. package/lib-module/Skeleton/skeleton.constant.js +3 -0
  223. package/lib-module/Skeleton/skeletonWebAnimation.js +18 -0
  224. package/lib-module/Skeleton/useSkeletonNativeAnimation.js +24 -0
  225. package/lib-module/Spacer/Spacer.js +97 -0
  226. package/lib-module/Spacer/index.js +2 -0
  227. package/lib-module/StackView/StackView.js +124 -0
  228. package/lib-module/StackView/StackWrap.js +48 -0
  229. package/lib-module/StackView/StackWrap.native.js +3 -0
  230. package/lib-module/StackView/StackWrapBox.js +114 -0
  231. package/lib-module/StackView/StackWrapGap.js +58 -0
  232. package/lib-module/StackView/common.js +32 -0
  233. package/lib-module/StackView/getStackedContent.js +123 -0
  234. package/lib-module/StackView/index.js +5 -0
  235. package/lib-module/StepTracker/Step.js +229 -0
  236. package/lib-module/StepTracker/StepTracker.js +175 -0
  237. package/lib-module/StepTracker/dictionary.js +10 -0
  238. package/lib-module/StepTracker/index.js +2 -0
  239. package/lib-module/Tabs/Tabs.js +113 -0
  240. package/lib-module/Tabs/TabsItem.js +215 -0
  241. package/lib-module/Tabs/index.js +2 -0
  242. package/lib-module/Tags/Tags.js +238 -0
  243. package/lib-module/Tags/index.js +2 -0
  244. package/lib-module/TextInput/TextArea.js +88 -0
  245. package/lib-module/TextInput/TextInput.js +60 -0
  246. package/lib-module/TextInput/TextInputBase.js +233 -0
  247. package/lib-module/TextInput/index.js +3 -0
  248. package/lib-module/TextInput/propTypes.js +31 -0
  249. package/lib-module/ThemeProvider/ThemeProvider.js +35 -0
  250. package/lib-module/ThemeProvider/index.js +6 -0
  251. package/lib-module/ThemeProvider/useSetTheme.js +22 -0
  252. package/lib-module/ThemeProvider/useTheme.js +14 -0
  253. package/lib-module/ThemeProvider/useThemeTokens.js +105 -0
  254. package/lib-module/ThemeProvider/utils/index.js +2 -0
  255. package/lib-module/ThemeProvider/utils/styles.js +174 -0
  256. package/lib-module/ThemeProvider/utils/theme-tokens.js +151 -0
  257. package/lib-module/ToggleSwitch/ToggleSwitch.js +224 -0
  258. package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +202 -0
  259. package/lib-module/ToggleSwitch/index.js +3 -0
  260. package/lib-module/Tooltip/Backdrop.js +52 -0
  261. package/lib-module/Tooltip/Backdrop.native.js +43 -0
  262. package/lib-module/Tooltip/Tooltip.js +332 -0
  263. package/lib-module/Tooltip/dictionary.js +8 -0
  264. package/lib-module/Tooltip/getTooltipPosition.js +164 -0
  265. package/lib-module/Tooltip/index.js +2 -0
  266. package/lib-module/TooltipButton/TooltipButton.js +71 -0
  267. package/lib-module/TooltipButton/index.js +2 -0
  268. package/lib-module/Typography/Typography.js +118 -0
  269. package/lib-module/Typography/index.js +2 -0
  270. package/lib-module/ViewportProvider/ViewportProvider.js +28 -0
  271. package/lib-module/ViewportProvider/index.js +3 -0
  272. package/lib-module/ViewportProvider/useViewport.js +3 -0
  273. package/lib-module/ViewportProvider/useViewportListener.js +43 -0
  274. package/lib-module/index.js +48 -0
  275. package/lib-module/utils/a11y/index.js +2 -0
  276. package/lib-module/utils/a11y/semantics.js +154 -0
  277. package/lib-module/utils/a11y/textSize.js +34 -0
  278. package/lib-module/utils/animation/index.js +2 -0
  279. package/lib-module/utils/animation/useVerticalExpandAnimation.js +49 -0
  280. package/lib-module/utils/children.js +118 -0
  281. package/lib-module/utils/index.js +15 -0
  282. package/lib-module/utils/info/index.js +7 -0
  283. package/lib-module/utils/info/platform/index.js +11 -0
  284. package/lib-module/utils/info/platform/platform.android.js +1 -0
  285. package/lib-module/utils/info/platform/platform.ios.js +1 -0
  286. package/lib-module/utils/info/platform/platform.js +1 -0
  287. package/lib-module/utils/info/platform/platform.native.js +4 -0
  288. package/lib-module/utils/info/versions.js +5 -0
  289. package/lib-module/utils/input.js +180 -0
  290. package/lib-module/utils/pressability.js +97 -0
  291. package/lib-module/utils/props/a11yProps.js +140 -0
  292. package/lib-module/utils/props/clickProps.js +25 -0
  293. package/lib-module/utils/props/componentPropType.js +63 -0
  294. package/lib-module/utils/props/copyPropTypes.js +2 -0
  295. package/lib-module/utils/props/getPropSelector.js +6 -0
  296. package/lib-module/utils/props/hrefAttrsProp.js +30 -0
  297. package/lib-module/utils/props/index.js +16 -0
  298. package/lib-module/utils/props/inputSupportsProps.js +54 -0
  299. package/lib-module/utils/props/linkProps.js +47 -0
  300. package/lib-module/utils/props/paddingProp.js +9 -0
  301. package/lib-module/utils/props/pressProps.js +42 -0
  302. package/lib-module/utils/props/rectProp.js +9 -0
  303. package/lib-module/utils/props/responsiveProps.js +30 -0
  304. package/lib-module/utils/props/selectSystemProps.js +24 -0
  305. package/lib-module/utils/props/spacingProps.js +56 -0
  306. package/lib-module/utils/props/tokens.js +120 -0
  307. package/lib-module/utils/props/variantProp.js +18 -0
  308. package/lib-module/utils/props/viewProps.js +22 -0
  309. package/lib-module/utils/ssr.js +35 -0
  310. package/lib-module/utils/useCopy.js +42 -0
  311. package/lib-module/utils/useHash.js +44 -0
  312. package/lib-module/utils/useHash.native.js +7 -0
  313. package/lib-module/utils/useResponsiveProp.js +47 -0
  314. package/lib-module/utils/useSpacingScale.js +123 -0
  315. package/lib-module/utils/useUniqueId.js +12 -0
  316. package/lib-module/utils/withLinkRouter.js +82 -0
  317. package/package.json +9 -5
  318. package/src/A11yText/index.jsx +7 -3
  319. package/src/ActivityIndicator/Spinner.jsx +56 -44
  320. package/src/ActivityIndicator/Spinner.native.jsx +20 -12
  321. package/src/ActivityIndicator/index.jsx +1 -1
  322. package/src/Box/Box.jsx +15 -13
  323. package/src/Button/Button.jsx +1 -1
  324. package/src/Button/ButtonBase.jsx +9 -8
  325. package/src/Button/ButtonGroup.jsx +17 -8
  326. package/src/Button/ButtonLink.jsx +1 -1
  327. package/src/Button/propTypes.js +2 -1
  328. package/src/Card/Card.jsx +7 -4
  329. package/src/Card/CardBase.jsx +6 -5
  330. package/src/Card/PressableCardBase.jsx +12 -12
  331. package/src/Checkbox/Checkbox.jsx +12 -5
  332. package/src/Divider/Divider.jsx +19 -12
  333. package/src/ExpandCollapse/Control.jsx +12 -7
  334. package/src/ExpandCollapse/ExpandCollapse.jsx +13 -3
  335. package/src/ExpandCollapse/Panel.jsx +15 -5
  336. package/src/Feedback/Feedback.jsx +13 -3
  337. package/src/Fieldset/Fieldset.jsx +1 -1
  338. package/src/FlexGrid/FlexGrid.jsx +11 -5
  339. package/src/FlexGrid/helpers/index.js +1 -3
  340. package/src/HorizontalScroll/HorizontalScroll.jsx +12 -5
  341. package/src/IconButton/IconButton.jsx +12 -8
  342. package/src/InputLabel/InputLabel.jsx +16 -2
  343. package/src/InputSupports/InputSupports.jsx +1 -1
  344. package/src/Link/LinkBase.jsx +11 -10
  345. package/src/List/List.jsx +12 -5
  346. package/src/List/ListItem.jsx +16 -2
  347. package/src/Modal/Modal.jsx +63 -50
  348. package/src/Notification/Notification.jsx +23 -6
  349. package/src/Pagination/Pagination.jsx +10 -3
  350. package/src/Progress/Progress.jsx +5 -3
  351. package/src/Progress/ProgressBar.jsx +8 -6
  352. package/src/Radio/Radio.jsx +13 -5
  353. package/src/Radio/RadioButton.jsx +13 -3
  354. package/src/Radio/RadioGroup.jsx +14 -2
  355. package/src/RadioCard/RadioCard.jsx +9 -6
  356. package/src/RadioCard/RadioCardGroup.jsx +16 -4
  357. package/src/Search/Search.jsx +15 -3
  358. package/src/Select/Select.jsx +21 -7
  359. package/src/SideNav/Item.jsx +15 -7
  360. package/src/SideNav/SideNav.jsx +13 -2
  361. package/src/Skeleton/Skeleton.jsx +55 -43
  362. package/src/Spacer/Spacer.jsx +10 -18
  363. package/src/StackView/StackView.jsx +13 -12
  364. package/src/StackView/StackWrapBox.jsx +12 -12
  365. package/src/StackView/StackWrapGap.jsx +9 -7
  366. package/src/StackView/getStackedContent.jsx +1 -1
  367. package/src/StepTracker/Step.jsx +7 -4
  368. package/src/StepTracker/StepTracker.jsx +8 -8
  369. package/src/Tabs/Tabs.jsx +16 -3
  370. package/src/Tabs/TabsItem.jsx +13 -9
  371. package/src/Tags/Tags.jsx +16 -7
  372. package/src/TextInput/TextArea.jsx +20 -8
  373. package/src/TextInput/TextInput.jsx +20 -8
  374. package/src/TextInput/TextInputBase.jsx +13 -3
  375. package/src/ThemeProvider/useThemeTokens.js +3 -3
  376. package/src/ThemeProvider/utils/theme-tokens.js +3 -3
  377. package/src/ToggleSwitch/ToggleSwitch.jsx +12 -7
  378. package/src/ToggleSwitch/ToggleSwitchGroup.jsx +14 -6
  379. package/src/Tooltip/Tooltip.jsx +13 -3
  380. package/src/TooltipButton/TooltipButton.jsx +6 -4
  381. package/src/Typography/Typography.jsx +10 -6
  382. package/src/index.js +1 -1
  383. package/src/utils/a11y/semantics.js +3 -2
  384. package/src/utils/children.jsx +2 -1
  385. package/src/utils/index.js +2 -1
  386. package/src/utils/pressability.js +1 -1
  387. package/src/utils/props/a11yProps.js +151 -0
  388. package/src/utils/props/clickProps.js +31 -0
  389. package/src/utils/props/componentPropType.js +67 -0
  390. package/src/utils/props/copyPropTypes.js +3 -0
  391. package/src/utils/props/getPropSelector.js +14 -0
  392. package/src/utils/props/hrefAttrsProp.js +25 -0
  393. package/src/utils/props/index.js +16 -0
  394. package/src/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -4
  395. package/src/utils/props/linkProps.js +43 -0
  396. package/src/utils/props/paddingProp.js +10 -0
  397. package/src/utils/props/pressProps.js +45 -0
  398. package/src/utils/props/rectProp.js +10 -0
  399. package/src/utils/props/responsiveProps.js +30 -0
  400. package/src/utils/props/selectSystemProps.js +25 -0
  401. package/src/utils/props/spacingProps.js +58 -0
  402. package/src/utils/props/tokens.js +150 -0
  403. package/src/utils/props/variantProp.js +20 -0
  404. package/src/utils/props/viewProps.js +23 -0
  405. package/src/utils/ssr.js +35 -0
  406. package/src/utils/useResponsiveProp.js +1 -1
  407. package/src/utils/useSpacingScale.js +4 -4
  408. package/.ultra.cache.json +0 -1
  409. package/lib/utils/a11y/propTypes.js +0 -61
  410. package/lib/utils/a11y/propTypes.native.js +0 -47
  411. package/lib/utils/propTypes.js +0 -566
  412. package/release-context.json +0 -7
  413. package/src/utils/a11y/propTypes.js +0 -61
  414. package/src/utils/a11y/propTypes.native.js +0 -39
  415. package/src/utils/propTypes.js +0 -561
@@ -0,0 +1,82 @@
1
+ import React, { forwardRef } from 'react';
2
+ import PropTypes from 'prop-types'; // Prototype-safe alternative to (linter-forbidden) someObject.hasOwnProperty()
3
+
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+
6
+ const hasOwnProperty = (object, prop) => Object.prototype.hasOwnProperty.call(object, prop);
7
+ /**
8
+ * Higher-order component that has no effect unless an additional prop `LinkRouter` is passed.
9
+ * This may be used to provide custom wrappers for integrations with third party libraries.
10
+ *
11
+ * If LinkRouter is passed, LinkRouter is rendered in place of the main component and is passed:
12
+ *
13
+ * - `linkRouterProps`: an optional object passed alongside LinkRouter, for props needed by the wrapper
14
+ * that are not valid props for the wrapped component.
15
+ * - `Component`: automatically provided, the original component to render inside the wrapper.
16
+ * - `ref`: forwarded `ref` passed down to `Component`
17
+ * - All other props passed to the outer component
18
+ *
19
+ * @example A LinkRouter component to be used with link-like components might look like:
20
+ *
21
+ * ```jsx
22
+ * const LinkLinkRouter = forwardRef(({ Component, linkRouterProps: { to, options }, href, ...rest }, ref) => {
23
+ * const { href: resolvedHref, onClick } = useSomeRouterHook({ to, href, options })
24
+ * return <Component href={resolvedHref} onPress={onClick} {...rest} />
25
+ * })
26
+ * ```
27
+ *
28
+ * Any component that takes href and onPress props may then use this wrapper:
29
+ *
30
+ * ```jsx
31
+ * <Link href={href} LinkRouter={LinkLinkRouter} linkRouterProps={{ to, options }}>Some link</Link>
32
+ * <IconButton icon={SomeIcon} LinkRouter={LinkLinkRouter} linkRouterProps={{ to, options }} ref={iconRef} />
33
+ * ```
34
+ */
35
+
36
+
37
+ const withLinkRouter = Component => {
38
+ const wrappedComponent = /*#__PURE__*/forwardRef(({
39
+ LinkRouter,
40
+ linkRouterProps,
41
+ ...props
42
+ }, ref) => {
43
+ if (!LinkRouter) return /*#__PURE__*/_jsx(Component, { ...props,
44
+ ref: ref
45
+ });
46
+ return /*#__PURE__*/_jsx(LinkRouter, {
47
+ linkRouterProps: linkRouterProps,
48
+ Component: Component,
49
+ ref: ref,
50
+ ...props
51
+ });
52
+ }); // Ensure the returned component has appropriate outer properties set:
53
+
54
+ /* eslint-disable-next-line react/forbid-foreign-prop-types */
55
+
56
+ const {
57
+ displayName,
58
+ name,
59
+ propTypes,
60
+ ...otherProperties
61
+ } = Component; // Apply unique component name as a displayName
62
+
63
+ wrappedComponent.displayName = Component.displayName || Component.name; // Apply proptypes including wrapper props - is safely { ...undefined, ...undefined } in prod
64
+
65
+ wrappedComponent.propTypes = { ...Component.propTypes,
66
+ ...withLinkRouter.propTypes
67
+ }; // Forward any other properties explicitly set e.g. Component.SubComponent
68
+
69
+ Object.keys(otherProperties).forEach(key => {
70
+ // Skip internal React properties from wrappedComponent's forwardRef (render, $$typeof, etc)
71
+ if (hasOwnProperty(Component, key) && !hasOwnProperty(wrappedComponent, key)) {
72
+ wrappedComponent[key] = Component[key];
73
+ }
74
+ });
75
+ return wrappedComponent;
76
+ };
77
+
78
+ withLinkRouter.propTypes = {
79
+ LinkRouter: PropTypes.elementType,
80
+ linkRouterProps: PropTypes.object
81
+ };
82
+ export default withLinkRouter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telus-uds/components-base",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "description": "Base components",
5
5
  "keywords": [
6
6
  "base"
@@ -9,7 +9,9 @@
9
9
  "homepage": "https://github.com/telus/universal-design-system#readme",
10
10
  "license": "UNLICENSED",
11
11
  "main": "lib/index.js",
12
+ "module": "lib-module/index.js",
12
13
  "react-native": "src/index.js",
14
+ "sideEffects": false,
13
15
  "directories": {
14
16
  "lib": "lib",
15
17
  "test": "__tests__"
@@ -24,7 +26,9 @@
24
26
  "lint:fix": "telus-standard --fix",
25
27
  "format": "prettier --write .",
26
28
  "build": "yarn build:code && yarn build:docs",
27
- "build:code": "babel src -d lib",
29
+ "build:main": "babel src -d lib",
30
+ "build:module": "babel src -d lib-module --env-name module",
31
+ "build:code": "yarn build:main && yarn build:module",
28
32
  "build:docs": "babel-node --plugins=react-docgen-alpha generate-component-docs.js",
29
33
  "storybook": "start-storybook",
30
34
  "dev": "yarn build:code --watch",
@@ -46,7 +50,7 @@
46
50
  "react-native-web": "^0.17.0"
47
51
  },
48
52
  "devDependencies": {
49
- "@telus-uds/browserslist-config": "^1.0.0",
53
+ "@telus-uds/browserslist-config": "^1.0.1",
50
54
  "@testing-library/jest-native": "^4.0.1",
51
55
  "@testing-library/react-hooks": "^7.0.1",
52
56
  "@testing-library/react-native": "^7.2.0",
@@ -54,8 +58,8 @@
54
58
  },
55
59
  "dependencies": {
56
60
  "airbnb-prop-types": "^2.16.0",
57
- "@telus-uds/system-constants": "^1.0.1-prerelease.0",
58
- "@telus-uds/system-theme-tokens": "^1.2.0",
61
+ "@telus-uds/system-constants": "^1.0.2",
62
+ "@telus-uds/system-theme-tokens": "^1.3.0",
59
63
  "lodash.debounce": "^4.0.8",
60
64
  "lodash.merge": "^4.6.2",
61
65
  "prop-types": "^15.7.2",
@@ -2,7 +2,9 @@ import React, { forwardRef } from 'react'
2
2
  import { Platform, StyleSheet, View } from 'react-native'
3
3
  import PropTypes from 'prop-types'
4
4
 
5
- import { a11yProps } from '../utils/propTypes'
5
+ import { a11yProps, selectSystemProps, viewProps } from '../utils/props'
6
+
7
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps])
6
8
 
7
9
  /**
8
10
  * A11yText is a zero-size invisible element that adds text to be read by screen readers.
@@ -11,7 +13,7 @@ import { a11yProps } from '../utils/propTypes'
11
13
  * as a sibling to blocks of text like paragraphs and interactive elements like buttons.
12
14
  */
13
15
  const A11yText = forwardRef(({ text, heading, ...rest }, ref) => {
14
- const a11y = a11yProps.select({
16
+ const selectedProps = selectProps({
15
17
  // On iOS, needs `accessible` to be true to be focusable without non-a11y content.
16
18
  // On Web, `accessible` causes RNW to set attributes that may make the element be treated as a group.
17
19
  // On Android, may cause this to be skipped when with `<Text>` siblings in an `accessible` View,
@@ -21,12 +23,14 @@ const A11yText = forwardRef(({ text, heading, ...rest }, ref) => {
21
23
  accessibilityRole: heading ? 'header' : 'text',
22
24
  ...rest
23
25
  })
24
- return <View style={styles.invisible} ref={ref} {...a11y} />
26
+
27
+ return <View style={styles.invisible} ref={ref} {...selectedProps} />
25
28
  })
26
29
 
27
30
  A11yText.displayName = 'A11yText'
28
31
 
29
32
  A11yText.propTypes = {
33
+ ...selectedSystemPropTypes,
30
34
  text: PropTypes.string.isRequired,
31
35
  heading: PropTypes.bool
32
36
  }
@@ -1,5 +1,6 @@
1
1
  import React, { forwardRef } from 'react'
2
2
  import { DURATION, MIN_EMPTY_ANGLE, MIN_STROKE_ANGLE, BEZIER, propTypes } from './shared'
3
+ import { useA11yInfo } from '../A11yInfoProvider'
3
4
 
4
5
  const SVG_RADIUS = 20
5
6
  const SVG_CIRCUMFERENCE = SVG_RADIUS * 2 * Math.PI
@@ -20,50 +21,61 @@ const bezierProps = {
20
21
  }
21
22
  // We're using svg rather than css here to define the animation to avoid needing to introduce css injection mechanism
22
23
  // 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 = forwardRef(({ size, color, thickness, label }, ref) => (
24
- <svg
25
- ref={ref}
26
- width={`${size}px`}
27
- height={`${size}px`}
28
- viewBox="0 0 48 48"
29
- aria-valuetext={label}
30
- role="progressbar"
31
- aria-busy={true}
32
- >
33
- <g>
34
- <animateTransform
35
- attributeName="transform"
36
- type="rotate"
37
- values={`-180 24 24;${360 + MIN_STROKE_ANGLE - 180} 24 24`}
38
- {...animationProps}
39
- />
40
- <circle
41
- fill="none"
42
- stroke={color}
43
- strokeWidth={(thickness * 48) / size}
44
- strokeLinecap="round"
45
- cx="24"
46
- cy="24"
47
- r="20"
48
- strokeDasharray={[MIN_SVG_LENGTH, SVG_CIRCUMFERENCE]}
49
- strokeDashoffset={0}
50
- >
51
- <animate
52
- attributeName="stroke-dashoffset"
53
- values={`0;-10;${MIN_SVG_LENGTH - SVG_CIRCUMFERENCE}`}
54
- {...animationProps}
55
- {...bezierProps}
56
- />
57
- <animate
58
- attributeName="stroke-dasharray"
59
- values={`${MIN_SVG_LENGTH}, 200;${MAX_SVG_LENGTH}, 200;${MIN_SVG_LENGTH}, 200`}
60
- {...animationProps}
61
- {...bezierProps}
62
- />
63
- </circle>
64
- </g>
65
- </svg>
66
- ))
24
+ const Spinner = forwardRef(({ size, color, thickness, label }, ref) => {
25
+ const { reduceMotionEnabled } = useA11yInfo()
26
+ return (
27
+ <svg
28
+ ref={ref}
29
+ width={`${size}px`}
30
+ height={`${size}px`}
31
+ viewBox="0 0 48 48"
32
+ aria-valuetext={label}
33
+ role="progressbar"
34
+ aria-busy={true}
35
+ >
36
+ <g>
37
+ {reduceMotionEnabled ? null : (
38
+ <animateTransform
39
+ attributeName="transform"
40
+ type="rotate"
41
+ values={`-180 24 24;${360 + MIN_STROKE_ANGLE - 180} 24 24`}
42
+ {...animationProps}
43
+ />
44
+ )}
45
+ <circle
46
+ fill="none"
47
+ stroke={color}
48
+ strokeWidth={(thickness * 48) / size}
49
+ strokeLinecap="round"
50
+ cx="24"
51
+ cy="24"
52
+ r="20"
53
+ strokeDasharray={
54
+ reduceMotionEnabled ? MAX_SVG_LENGTH : [MIN_SVG_LENGTH, SVG_CIRCUMFERENCE]
55
+ }
56
+ strokeDashoffset={0}
57
+ >
58
+ {reduceMotionEnabled ? null : (
59
+ <>
60
+ <animate
61
+ attributeName="stroke-dashoffset"
62
+ values={`0;-10;${MIN_SVG_LENGTH - SVG_CIRCUMFERENCE}`}
63
+ {...animationProps}
64
+ {...bezierProps}
65
+ />
66
+ <animate
67
+ attributeName="stroke-dasharray"
68
+ values={`${MIN_SVG_LENGTH}, 200;${MAX_SVG_LENGTH}, 200;${MIN_SVG_LENGTH}, 200`}
69
+ {...animationProps}
70
+ {...bezierProps}
71
+ />
72
+ </>
73
+ )}
74
+ </circle>
75
+ </g>
76
+ </svg>
77
+ )
78
+ })
67
79
  Spinner.displayName = 'Spinner'
68
80
 
69
81
  Spinner.propTypes = propTypes
@@ -1,12 +1,14 @@
1
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
+ import { useA11yInfo } from '../A11yInfoProvider'
4
5
 
5
6
  const ea = MIN_EMPTY_ANGLE / 2
6
7
  const sa = MIN_STROKE_ANGLE / 2
7
8
 
8
9
  const Spinner = forwardRef(({ size, color, thickness, label }, ref) => {
9
10
  const { current: timer } = React.useRef(new Animated.Value(0))
11
+ const { reduceMotionEnabled } = useA11yInfo()
10
12
 
11
13
  React.useLayoutEffect(() => {
12
14
  const loop = Animated.timing(timer, {
@@ -17,16 +19,19 @@ const Spinner = forwardRef(({ size, color, thickness, label }, ref) => {
17
19
  toValue: 1,
18
20
  isInteraction: false
19
21
  })
20
- Animated.loop(loop).start()
21
- }, [timer])
22
+
23
+ if (!reduceMotionEnabled) Animated.loop(loop).start()
24
+ else loop.stop()
25
+ }, [timer, reduceMotionEnabled])
22
26
 
23
27
  const frames = (60 * DURATION) / 1000
24
28
  const easing = Easing.bezier(...BEZIER)
25
29
  const containerStyle = {
26
30
  width: size,
27
- height: size / 2,
31
+ height: size / (reduceMotionEnabled ? 1.5 : 2),
28
32
  overflow: 'hidden'
29
33
  }
34
+ const animationFrequency = reduceMotionEnabled ? [0] : [0, 1]
30
35
 
31
36
  // Credit to https://github.com/n4kz/react-native-indicators and https://github.com/callstack/react-native-paper for this
32
37
  return (
@@ -39,7 +44,7 @@ const Spinner = forwardRef(({ size, color, thickness, label }, ref) => {
39
44
  accessibilityState={{ busy: true }}
40
45
  >
41
46
  <Animated.View style={[{ width: size, height: size }]} collapsable={false}>
42
- {[0, 1].map((index) => {
47
+ {animationFrequency.map((index) => {
43
48
  const inputRange = Array.from(
44
49
  new Array(frames),
45
50
  (_, frameIndex) => frameIndex / (frames - 1)
@@ -59,8 +64,16 @@ const Spinner = forwardRef(({ size, color, thickness, label }, ref) => {
59
64
 
60
65
  const layerStyle = {
61
66
  width: size,
62
- height: size,
63
- transform: [
67
+ height: size
68
+ }
69
+
70
+ const viewportStyle = {
71
+ width: size,
72
+ height: size
73
+ }
74
+
75
+ if (!reduceMotionEnabled) {
76
+ layerStyle.transform = [
64
77
  {
65
78
  rotate: timer.interpolate({
66
79
  inputRange: [0, 1],
@@ -68,12 +81,7 @@ const Spinner = forwardRef(({ size, color, thickness, label }, ref) => {
68
81
  })
69
82
  }
70
83
  ]
71
- }
72
-
73
- const viewportStyle = {
74
- width: size,
75
- height: size,
76
- transform: [
84
+ viewportStyle.transform = [
77
85
  {
78
86
  translateY: index ? -size / 2 : 0
79
87
  },
@@ -1,7 +1,7 @@
1
1
  import React from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { useThemeTokens } from '../ThemeProvider'
4
- import { getTokensPropType, variantProp } from '../utils/propTypes'
4
+ import { getTokensPropType, variantProp } from '../utils/props'
5
5
 
6
6
  import Spinner from './Spinner'
7
7
 
package/src/Box/Box.jsx CHANGED
@@ -4,19 +4,23 @@ import { View, ScrollView } from 'react-native'
4
4
  import { useThemeTokens } from '../ThemeProvider'
5
5
  import {
6
6
  a11yProps,
7
- spacingProps,
8
- variantProp,
7
+ getA11yPropsFromHtmlTag,
9
8
  getTokensPropType,
9
+ layoutTags,
10
+ selectSystemProps,
11
+ spacingProps,
10
12
  useSpacingScale,
11
- viewProps,
12
- getA11yPropsFromHtmlTag,
13
- layoutTags
13
+ variantProp,
14
+ viewProps
14
15
  } from '../utils'
16
+
17
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps])
18
+
15
19
  /**
16
- * @typedef {import('../utils/propTypes.js').SpacingValue} SpacingValue
17
- * @typedef {import('../utils/propTypes.js').SpacingIndex} SpacingIndex
18
- * @typedef {import('../utils/propTypes.js').SpacingObject} SpacingObject
19
- * @typedef {import('../utils/propTypes.js').SpacingOptions} SpacingOptions
20
+ * @typedef {import('../utils/props/spacingProps.js').SpacingValue} SpacingValue
21
+ * @typedef {import('../utils/props/spacingProps.js').SpacingIndex} SpacingIndex
22
+ * @typedef {import('../utils/props/spacingProps.js').SpacingObject} SpacingObject
23
+ * @typedef {import('../utils/props/spacingProps.js').SpacingOptions} SpacingOptions
20
24
  */
21
25
 
22
26
  const selectBoxStyles = (tokens) => {
@@ -121,8 +125,7 @@ const Box = forwardRef(
121
125
  ) => {
122
126
  const props = {
123
127
  ...getA11yPropsFromHtmlTag(tag, accessibilityRole),
124
- ...a11yProps.select(rest),
125
- ...viewProps.select(rest)
128
+ ...selectProps(rest)
126
129
  }
127
130
 
128
131
  const themeTokens = useThemeTokens('Box', tokens, variant)
@@ -154,8 +157,7 @@ const Box = forwardRef(
154
157
  Box.displayName = 'Box'
155
158
 
156
159
  Box.propTypes = {
157
- ...a11yProps.propTypes,
158
- ...viewProps.types,
160
+ ...selectedSystemPropTypes,
159
161
  variant: variantProp.propType,
160
162
  tokens: getTokensPropType('Box'),
161
163
  /**
@@ -3,7 +3,7 @@ import React, { forwardRef } from 'react'
3
3
  import ButtonBase from './ButtonBase'
4
4
  import buttonPropTypes, { textAndA11yText } from './propTypes'
5
5
  import { useThemeTokensCallback } from '../ThemeProvider'
6
- import { a11yProps } from '../utils/propTypes'
6
+ import { a11yProps } from '../utils/props'
7
7
 
8
8
  const Button = forwardRef(({ accessibilityRole = 'button', tokens, variant, ...props }, ref) => {
9
9
  const getTokens = useThemeTokensCallback('Button', tokens, variant)
@@ -11,10 +11,14 @@ import {
11
11
  linkProps,
12
12
  resolvePressableState,
13
13
  resolvePressableTokens,
14
+ selectSystemProps,
15
+ viewProps,
14
16
  wrapStringsInText,
15
17
  withLinkRouter
16
18
  } from '../utils'
17
19
 
20
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, linkProps, viewProps])
21
+
18
22
  const getOuterBorderOffset = ({ outerBorderGap = 0, outerBorderWidth = 0 }) =>
19
23
  outerBorderGap + outerBorderWidth
20
24
 
@@ -144,7 +148,6 @@ const ButtonBase = forwardRef(
144
148
  disabled = false, // alias for inactive
145
149
  inactive = disabled,
146
150
  selected = false,
147
- dataSet,
148
151
  ...rawRest
149
152
  },
150
153
  ref
@@ -154,13 +157,13 @@ const ButtonBase = forwardRef(
154
157
  const resolveButtonTokens = (pressableState) =>
155
158
  resolvePressableTokens(tokens, pressableState, extraButtonState)
156
159
 
157
- const a11y = a11yProps.select(rest)
160
+ const systemProps = selectProps(rest)
158
161
 
159
162
  const getPressableStyle = (pressableState) => {
160
163
  const themeTokens = resolveButtonTokens(pressableState)
161
164
  return [
162
165
  staticStyles.row,
163
- selectWebOnlyStyles(inactive, themeTokens, a11y),
166
+ selectWebOnlyStyles(inactive, themeTokens, systemProps),
164
167
  selectOuterContainerStyles(themeTokens),
165
168
  selectOuterWidthStyles(themeTokens)
166
169
  ]
@@ -173,9 +176,8 @@ const ButtonBase = forwardRef(
173
176
  onPress={linkProps.handleHref({ href, onPress })}
174
177
  style={getPressableStyle}
175
178
  disabled={inactive}
176
- dataSet={dataSet}
177
179
  hrefAttrs={hrefAttrs}
178
- {...a11y}
180
+ {...systemProps}
179
181
  >
180
182
  {(pressableState) => {
181
183
  const themeTokens = resolveButtonTokens(pressableState)
@@ -224,9 +226,8 @@ ButtonBase.displayName = 'ButtonBase'
224
226
 
225
227
  ButtonBase.propTypes = {
226
228
  id: PropTypes.string,
227
- ...a11yProps.types,
228
- ...buttonPropTypes,
229
- ...linkProps.types
229
+ ...selectedSystemPropTypes,
230
+ ...buttonPropTypes
230
231
  }
231
232
  ButtonBase.defaultProps = { id: undefined }
232
233
 
@@ -10,13 +10,17 @@ import { useThemeTokens, useThemeTokensCallback } from '../ThemeProvider'
10
10
  import {
11
11
  a11yProps,
12
12
  pressProps,
13
- variantProp,
14
13
  getTokensPropType,
15
- selectTokens
16
- } from '../utils/propTypes'
14
+ selectSystemProps,
15
+ selectTokens,
16
+ variantProp,
17
+ viewProps
18
+ } from '../utils/props'
17
19
  import { useMultipleInputValues } from '../utils/input'
18
20
  import { getPressHandlersWithArgs } from '../utils/pressability'
19
21
 
22
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, pressProps, viewProps])
23
+
20
24
  const ButtonGroup = forwardRef(
21
25
  (
22
26
  {
@@ -51,14 +55,20 @@ const ButtonGroup = forwardRef(
51
55
  readOnly
52
56
  })
53
57
 
54
- const a11y = a11yProps.select({
58
+ const systemProps = selectProps({
55
59
  accessibilityRole,
56
60
  ...rest
57
61
  })
58
- const itemA11yRole = a11y.accessibilityRole === 'radiogroup' ? 'radio' : 'checkbox'
62
+ const itemA11yRole = systemProps.accessibilityRole === 'radiogroup' ? 'radio' : 'checkbox'
59
63
 
60
64
  return (
61
- <StackWrap {...a11y} space={space} direction={direction} tokens={stackTokens} ref={ref}>
65
+ <StackWrap
66
+ {...systemProps}
67
+ space={space}
68
+ direction={direction}
69
+ tokens={stackTokens}
70
+ ref={ref}
71
+ >
62
72
  {items.map(({ label, id = label, accessibilityLabel, ref: itemRef }, index) => {
63
73
  const isSelected = currentValues.includes(id)
64
74
 
@@ -101,8 +111,7 @@ const ButtonGroup = forwardRef(
101
111
  ButtonGroup.displayName = 'ButtonGroup'
102
112
 
103
113
  ButtonGroup.propTypes = {
104
- ...a11yProps.propTypes,
105
- ...pressProps.propTypes,
114
+ ...selectedSystemPropTypes,
106
115
  tokens: getTokensPropType('ButtonGroup'),
107
116
  variant: variantProp.propType,
108
117
  /**
@@ -1,7 +1,7 @@
1
1
  import React, { forwardRef } from 'react'
2
2
  import ButtonBase from './ButtonBase'
3
3
  import buttonPropTypes, { textAndA11yText } from './propTypes'
4
- import { a11yProps, hrefAttrsProp, linkProps } from '../utils/propTypes'
4
+ import { a11yProps, hrefAttrsProp, linkProps } from '../utils/props'
5
5
  import { useThemeTokensCallback } from '../ThemeProvider'
6
6
 
7
7
  /**
@@ -1,6 +1,6 @@
1
1
  import PropTypes from 'prop-types'
2
2
  import ABBPropTypes from 'airbnb-prop-types'
3
- import { variantProp } from '../utils/propTypes'
3
+ import { variantProp, getTokensPropType } from '../utils/props'
4
4
  import A11yText from '../A11yText'
5
5
 
6
6
  export const textAndA11yText = ABBPropTypes.childrenOf(
@@ -8,6 +8,7 @@ export const textAndA11yText = ABBPropTypes.childrenOf(
8
8
  )
9
9
 
10
10
  const buttonPropTypes = {
11
+ tokens: getTokensPropType('Button'),
11
12
  /**
12
13
  * If true, prevents the button from being pressed, changes the cursor (on web) and accessibility
13
14
  * attributes to communicate this to the user, and applies `inactive: true` appearances from the theme
package/src/Card/Card.jsx CHANGED
@@ -4,9 +4,11 @@ import PropTypes from 'prop-types'
4
4
  import { useThemeTokens } from '../ThemeProvider'
5
5
  import { getTokensPropType, variantProp } from '../utils'
6
6
  import { useViewport } from '../ViewportProvider'
7
- import { a11yProps } from '../utils/propTypes'
7
+ import { a11yProps, selectSystemProps, viewProps } from '../utils/props'
8
8
  import CardBase from './CardBase'
9
9
 
10
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps])
11
+
10
12
  /**
11
13
  * A basic card component, unstyled by default.
12
14
  *
@@ -58,18 +60,19 @@ import CardBase from './CardBase'
58
60
  const Card = ({ children, tokens, variant, dataSet, ...rest }) => {
59
61
  const viewport = useViewport()
60
62
  const themeTokens = useThemeTokens('Card', tokens, variant, { viewport })
63
+
61
64
  return (
62
- <CardBase tokens={themeTokens} dataSet={dataSet} {...rest}>
65
+ <CardBase tokens={themeTokens} dataSet={dataSet} {...selectProps(rest)}>
63
66
  {children}
64
67
  </CardBase>
65
68
  )
66
69
  }
67
70
 
68
71
  Card.propTypes = {
72
+ ...selectedSystemPropTypes,
69
73
  children: PropTypes.node,
70
74
  tokens: getTokensPropType('Card'),
71
- variant: variantProp.propType,
72
- ...a11yProps.types
75
+ variant: variantProp.propType
73
76
  }
74
77
 
75
78
  export default Card
@@ -4,7 +4,9 @@ import { View } from 'react-native'
4
4
 
5
5
  import { applyShadowToken } from '../ThemeProvider'
6
6
  import { getTokensPropType } from '../utils'
7
- import { a11yProps, viewProps } from '../utils/propTypes'
7
+ import { a11yProps, viewProps, selectSystemProps } from '../utils/props'
8
+
9
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps])
8
10
 
9
11
  // Ensure explicit selection of tokens
10
12
  const selectStyles = ({
@@ -39,7 +41,7 @@ const selectStyles = ({
39
41
  */
40
42
  const CardBase = forwardRef(({ children, tokens, dataSet, ...rest }, ref) => {
41
43
  const cardStyle = selectStyles(typeof tokens === 'function' ? tokens() : tokens)
42
- const props = { ...a11yProps.select(rest), ...viewProps.select(rest) }
44
+ const props = selectProps(rest)
43
45
 
44
46
  return (
45
47
  <View style={cardStyle} dataSet={dataSet} ref={ref} {...props}>
@@ -50,10 +52,9 @@ const CardBase = forwardRef(({ children, tokens, dataSet, ...rest }, ref) => {
50
52
  CardBase.displayName = 'CardBase'
51
53
 
52
54
  CardBase.propTypes = {
55
+ ...selectedSystemPropTypes,
53
56
  children: PropTypes.node,
54
- tokens: getTokensPropType('Card'),
55
- ...viewProps.types,
56
- ...a11yProps.types
57
+ tokens: getTokensPropType('Card')
57
58
  }
58
59
 
59
60
  export default CardBase