@telus-uds/components-base 1.3.0 → 1.5.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 (344) hide show
  1. package/.turbo/turbo-build.log +5 -2
  2. package/CHANGELOG.json +82 -0
  3. package/CHANGELOG.md +42 -2
  4. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +35 -0
  5. package/__tests__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +287 -0
  6. package/babel.config.js +27 -5
  7. package/component-docs.json +121 -438
  8. package/lib/A11yText/index.js +5 -4
  9. package/lib/ActivityIndicator/Spinner.js +46 -37
  10. package/lib/ActivityIndicator/Spinner.native.js +26 -15
  11. package/lib/Box/Box.js +4 -4
  12. package/lib/Button/ButtonBase.js +7 -8
  13. package/lib/Card/Card.js +5 -4
  14. package/lib/Card/PressableCardBase.js +6 -11
  15. package/lib/Checkbox/Checkbox.js +4 -6
  16. package/lib/Divider/Divider.js +12 -11
  17. package/lib/ExpandCollapse/Control.js +7 -7
  18. package/lib/ExpandCollapse/ExpandCollapse.js +6 -2
  19. package/lib/ExpandCollapse/Panel.js +6 -7
  20. package/lib/Feedback/Feedback.js +6 -5
  21. package/lib/Fieldset/Fieldset.js +1 -3
  22. package/lib/HorizontalScroll/HorizontalScroll.js +5 -7
  23. package/lib/HorizontalScroll/HorizontalScrollButton.js +23 -49
  24. package/lib/IconButton/IconButton.js +6 -6
  25. package/lib/InputLabel/InputLabel.js +7 -2
  26. package/lib/InputSupports/InputSupports.js +2 -2
  27. package/lib/Link/LinkBase.js +5 -6
  28. package/lib/List/List.js +4 -6
  29. package/lib/List/ListItem.js +6 -2
  30. package/lib/Modal/Modal.js +6 -2
  31. package/lib/Notification/Notification.js +12 -8
  32. package/lib/Pagination/Pagination.js +8 -3
  33. package/lib/Progress/Progress.js +5 -4
  34. package/lib/Progress/ProgressBar.js +8 -7
  35. package/lib/Radio/Radio.js +4 -6
  36. package/lib/Radio/RadioButton.js +6 -3
  37. package/lib/Radio/RadioGroup.js +7 -2
  38. package/lib/RadioCard/RadioCard.js +4 -4
  39. package/lib/RadioCard/RadioCardGroup.js +9 -6
  40. package/lib/Search/Search.js +7 -2
  41. package/lib/Select/Select.js +10 -9
  42. package/lib/SideNav/Item.js +7 -7
  43. package/lib/SideNav/SideNav.js +7 -3
  44. package/lib/Skeleton/Skeleton.js +6 -2
  45. package/lib/Spacer/Spacer.js +7 -18
  46. package/lib/StackView/StackView.js +7 -7
  47. package/lib/StackView/StackWrapBox.js +6 -7
  48. package/lib/StackView/StackWrapGap.js +6 -5
  49. package/lib/StepTracker/Step.js +7 -3
  50. package/lib/StepTracker/StepTracker.js +7 -7
  51. package/lib/Tabs/Tabs.js +6 -2
  52. package/lib/Tabs/TabsItem.js +6 -5
  53. package/lib/Tags/Tags.js +5 -6
  54. package/lib/TextInput/TextArea.js +13 -14
  55. package/lib/TextInput/TextInput.js +13 -14
  56. package/lib/TextInput/TextInputBase.js +5 -3
  57. package/lib/ToggleSwitch/ToggleSwitch.js +10 -9
  58. package/lib/ToggleSwitch/ToggleSwitchGroup.js +5 -7
  59. package/lib/Tooltip/Tooltip.js +7 -2
  60. package/lib/TooltipButton/TooltipButton.js +7 -2
  61. package/lib/Typography/Typography.js +8 -6
  62. package/lib/index.js +7 -0
  63. package/lib/utils/children.js +5 -1
  64. package/lib/utils/index.js +14 -0
  65. package/lib/utils/props/index.js +9 -0
  66. package/lib/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -3
  67. package/lib/utils/ssr.js +51 -0
  68. package/lib-module/A11yInfoProvider/index.js +62 -0
  69. package/lib-module/A11yText/index.js +55 -0
  70. package/lib-module/ActivityIndicator/Spinner.js +76 -0
  71. package/lib-module/ActivityIndicator/Spinner.native.js +143 -0
  72. package/lib-module/ActivityIndicator/index.js +40 -0
  73. package/lib-module/ActivityIndicator/shared.js +12 -0
  74. package/lib-module/BaseProvider/index.js +26 -0
  75. package/lib-module/Box/Box.js +243 -0
  76. package/lib-module/Box/index.js +2 -0
  77. package/lib-module/Button/Button.js +25 -0
  78. package/lib-module/Button/ButtonBase.js +254 -0
  79. package/lib-module/Button/ButtonGroup.js +164 -0
  80. package/lib-module/Button/ButtonLink.js +39 -0
  81. package/lib-module/Button/index.js +4 -0
  82. package/lib-module/Button/propTypes.js +36 -0
  83. package/lib-module/Card/Card.js +83 -0
  84. package/lib-module/Card/CardBase.js +62 -0
  85. package/lib-module/Card/PressableCardBase.js +113 -0
  86. package/lib-module/Card/index.js +4 -0
  87. package/lib-module/Checkbox/Checkbox.js +321 -0
  88. package/lib-module/Checkbox/CheckboxGroup.js +218 -0
  89. package/lib-module/Checkbox/CheckboxInput.js +58 -0
  90. package/lib-module/Checkbox/CheckboxInput.native.js +6 -0
  91. package/lib-module/Checkbox/index.js +3 -0
  92. package/lib-module/Divider/Divider.js +123 -0
  93. package/lib-module/Divider/index.js +2 -0
  94. package/lib-module/ExpandCollapse/Accordion.js +15 -0
  95. package/lib-module/ExpandCollapse/Control.js +130 -0
  96. package/lib-module/ExpandCollapse/ExpandCollapse.js +94 -0
  97. package/lib-module/ExpandCollapse/Panel.js +158 -0
  98. package/lib-module/ExpandCollapse/index.js +7 -0
  99. package/lib-module/Feedback/Feedback.js +144 -0
  100. package/lib-module/Feedback/index.js +2 -0
  101. package/lib-module/Fieldset/Fieldset.js +145 -0
  102. package/lib-module/Fieldset/FieldsetContainer.js +29 -0
  103. package/lib-module/Fieldset/FieldsetContainer.native.js +20 -0
  104. package/lib-module/Fieldset/Legend.js +21 -0
  105. package/lib-module/Fieldset/Legend.native.js +28 -0
  106. package/lib-module/Fieldset/cssReset.js +14 -0
  107. package/lib-module/Fieldset/index.js +2 -0
  108. package/lib-module/FlexGrid/Col/Col.js +265 -0
  109. package/lib-module/FlexGrid/Col/index.js +2 -0
  110. package/lib-module/FlexGrid/FlexGrid.js +147 -0
  111. package/lib-module/FlexGrid/Row/Row.js +177 -0
  112. package/lib-module/FlexGrid/Row/index.js +2 -0
  113. package/lib-module/FlexGrid/helpers/index.js +18 -0
  114. package/lib-module/FlexGrid/index.js +2 -0
  115. package/lib-module/FlexGrid/providers/GutterContext.js +3 -0
  116. package/lib-module/HorizontalScroll/HorizontalScroll.js +170 -0
  117. package/lib-module/HorizontalScroll/HorizontalScrollButton.js +77 -0
  118. package/lib-module/HorizontalScroll/ScrollViewEnd.js +47 -0
  119. package/lib-module/HorizontalScroll/ScrollViewEnd.native.js +24 -0
  120. package/lib-module/HorizontalScroll/dictionary.js +11 -0
  121. package/lib-module/HorizontalScroll/index.js +11 -0
  122. package/lib-module/HorizontalScroll/itemPositions.js +106 -0
  123. package/lib-module/Icon/Icon.js +61 -0
  124. package/lib-module/Icon/IconText.js +81 -0
  125. package/lib-module/Icon/index.js +4 -0
  126. package/lib-module/IconButton/IconButton.js +115 -0
  127. package/lib-module/IconButton/index.js +2 -0
  128. package/lib-module/InputLabel/InputLabel.js +131 -0
  129. package/lib-module/InputLabel/LabelContent.js +24 -0
  130. package/lib-module/InputLabel/LabelContent.native.js +16 -0
  131. package/lib-module/InputLabel/index.js +2 -0
  132. package/lib-module/InputSupports/InputSupports.js +88 -0
  133. package/lib-module/InputSupports/index.js +2 -0
  134. package/lib-module/InputSupports/useInputSupports.js +31 -0
  135. package/lib-module/Link/ChevronLink.js +51 -0
  136. package/lib-module/Link/InlinePressable.js +37 -0
  137. package/lib-module/Link/InlinePressable.native.js +85 -0
  138. package/lib-module/Link/Link.js +27 -0
  139. package/lib-module/Link/LinkBase.js +210 -0
  140. package/lib-module/Link/TextButton.js +43 -0
  141. package/lib-module/Link/index.js +5 -0
  142. package/lib-module/List/List.js +55 -0
  143. package/lib-module/List/ListItem.js +213 -0
  144. package/lib-module/List/index.js +5 -0
  145. package/lib-module/Modal/Modal.js +208 -0
  146. package/lib-module/Modal/dictionary.js +9 -0
  147. package/lib-module/Modal/index.js +2 -0
  148. package/lib-module/Notification/Notification.js +196 -0
  149. package/lib-module/Notification/dictionary.js +8 -0
  150. package/lib-module/Notification/index.js +2 -0
  151. package/lib-module/Pagination/PageButton.js +65 -0
  152. package/lib-module/Pagination/Pagination.js +140 -0
  153. package/lib-module/Pagination/SideButton.js +103 -0
  154. package/lib-module/Pagination/dictionary.js +18 -0
  155. package/lib-module/Pagination/index.js +2 -0
  156. package/lib-module/Pagination/usePagination.js +72 -0
  157. package/lib-module/Progress/Progress.js +85 -0
  158. package/lib-module/Progress/ProgressBar.js +134 -0
  159. package/lib-module/Progress/ProgressBarBackground.js +41 -0
  160. package/lib-module/Progress/index.js +4 -0
  161. package/lib-module/Radio/Radio.js +263 -0
  162. package/lib-module/Radio/RadioButton.js +128 -0
  163. package/lib-module/Radio/RadioGroup.js +225 -0
  164. package/lib-module/Radio/RadioInput.js +60 -0
  165. package/lib-module/Radio/RadioInput.native.js +6 -0
  166. package/lib-module/Radio/index.js +3 -0
  167. package/lib-module/RadioCard/RadioCard.js +218 -0
  168. package/lib-module/RadioCard/RadioCardGroup.js +232 -0
  169. package/lib-module/RadioCard/index.js +3 -0
  170. package/lib-module/Search/Search.js +233 -0
  171. package/lib-module/Search/dictionary.js +12 -0
  172. package/lib-module/Search/index.js +2 -0
  173. package/lib-module/Select/Group.js +20 -0
  174. package/lib-module/Select/Group.native.js +14 -0
  175. package/lib-module/Select/Item.js +17 -0
  176. package/lib-module/Select/Item.native.js +9 -0
  177. package/lib-module/Select/Picker.js +67 -0
  178. package/lib-module/Select/Picker.native.js +110 -0
  179. package/lib-module/Select/Select.js +317 -0
  180. package/lib-module/Select/index.js +6 -0
  181. package/lib-module/SideNav/Item.js +139 -0
  182. package/lib-module/SideNav/ItemContent.js +45 -0
  183. package/lib-module/SideNav/ItemsGroup.js +115 -0
  184. package/lib-module/SideNav/SideNav.js +133 -0
  185. package/lib-module/SideNav/index.js +1 -0
  186. package/lib-module/Skeleton/Skeleton.js +117 -0
  187. package/lib-module/Skeleton/index.js +2 -0
  188. package/lib-module/Skeleton/skeleton.constant.js +3 -0
  189. package/lib-module/Skeleton/skeletonWebAnimation.js +18 -0
  190. package/lib-module/Skeleton/useSkeletonNativeAnimation.js +24 -0
  191. package/lib-module/Spacer/Spacer.js +97 -0
  192. package/lib-module/Spacer/index.js +2 -0
  193. package/lib-module/StackView/StackView.js +124 -0
  194. package/lib-module/StackView/StackWrap.js +48 -0
  195. package/lib-module/StackView/StackWrap.native.js +3 -0
  196. package/lib-module/StackView/StackWrapBox.js +114 -0
  197. package/lib-module/StackView/StackWrapGap.js +58 -0
  198. package/lib-module/StackView/common.js +32 -0
  199. package/lib-module/StackView/getStackedContent.js +123 -0
  200. package/lib-module/StackView/index.js +5 -0
  201. package/lib-module/StepTracker/Step.js +229 -0
  202. package/lib-module/StepTracker/StepTracker.js +175 -0
  203. package/lib-module/StepTracker/dictionary.js +10 -0
  204. package/lib-module/StepTracker/index.js +2 -0
  205. package/lib-module/Tabs/Tabs.js +113 -0
  206. package/lib-module/Tabs/TabsItem.js +215 -0
  207. package/lib-module/Tabs/index.js +2 -0
  208. package/lib-module/Tags/Tags.js +238 -0
  209. package/lib-module/Tags/index.js +2 -0
  210. package/lib-module/TextInput/TextArea.js +88 -0
  211. package/lib-module/TextInput/TextInput.js +60 -0
  212. package/lib-module/TextInput/TextInputBase.js +233 -0
  213. package/lib-module/TextInput/index.js +3 -0
  214. package/lib-module/TextInput/propTypes.js +31 -0
  215. package/lib-module/ThemeProvider/ThemeProvider.js +35 -0
  216. package/lib-module/ThemeProvider/index.js +6 -0
  217. package/lib-module/ThemeProvider/useSetTheme.js +22 -0
  218. package/lib-module/ThemeProvider/useTheme.js +14 -0
  219. package/lib-module/ThemeProvider/useThemeTokens.js +105 -0
  220. package/lib-module/ThemeProvider/utils/index.js +2 -0
  221. package/lib-module/ThemeProvider/utils/styles.js +174 -0
  222. package/lib-module/ThemeProvider/utils/theme-tokens.js +151 -0
  223. package/lib-module/ToggleSwitch/ToggleSwitch.js +224 -0
  224. package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +202 -0
  225. package/lib-module/ToggleSwitch/index.js +3 -0
  226. package/lib-module/Tooltip/Backdrop.js +52 -0
  227. package/lib-module/Tooltip/Backdrop.native.js +43 -0
  228. package/lib-module/Tooltip/Tooltip.js +332 -0
  229. package/lib-module/Tooltip/dictionary.js +8 -0
  230. package/lib-module/Tooltip/getTooltipPosition.js +164 -0
  231. package/lib-module/Tooltip/index.js +2 -0
  232. package/lib-module/TooltipButton/TooltipButton.js +71 -0
  233. package/lib-module/TooltipButton/index.js +2 -0
  234. package/lib-module/Typography/Typography.js +118 -0
  235. package/lib-module/Typography/index.js +2 -0
  236. package/lib-module/ViewportProvider/ViewportProvider.js +28 -0
  237. package/lib-module/ViewportProvider/index.js +3 -0
  238. package/lib-module/ViewportProvider/useViewport.js +3 -0
  239. package/lib-module/ViewportProvider/useViewportListener.js +43 -0
  240. package/lib-module/index.js +48 -0
  241. package/lib-module/utils/a11y/index.js +2 -0
  242. package/lib-module/utils/a11y/semantics.js +154 -0
  243. package/lib-module/utils/a11y/textSize.js +34 -0
  244. package/lib-module/utils/animation/index.js +2 -0
  245. package/lib-module/utils/animation/useVerticalExpandAnimation.js +49 -0
  246. package/lib-module/utils/children.js +118 -0
  247. package/lib-module/utils/index.js +15 -0
  248. package/lib-module/utils/info/index.js +7 -0
  249. package/lib-module/utils/info/platform/index.js +11 -0
  250. package/lib-module/utils/info/platform/platform.android.js +1 -0
  251. package/lib-module/utils/info/platform/platform.ios.js +1 -0
  252. package/lib-module/utils/info/platform/platform.js +1 -0
  253. package/lib-module/utils/info/platform/platform.native.js +4 -0
  254. package/lib-module/utils/info/versions.js +5 -0
  255. package/lib-module/utils/input.js +180 -0
  256. package/lib-module/utils/pressability.js +97 -0
  257. package/lib-module/utils/props/a11yProps.js +140 -0
  258. package/lib-module/utils/props/clickProps.js +25 -0
  259. package/lib-module/utils/props/componentPropType.js +63 -0
  260. package/lib-module/utils/props/copyPropTypes.js +2 -0
  261. package/lib-module/utils/props/getPropSelector.js +6 -0
  262. package/lib-module/utils/props/hrefAttrsProp.js +30 -0
  263. package/lib-module/utils/props/index.js +16 -0
  264. package/lib-module/utils/props/inputSupportsProps.js +54 -0
  265. package/lib-module/utils/props/linkProps.js +47 -0
  266. package/lib-module/utils/props/paddingProp.js +9 -0
  267. package/lib-module/utils/props/pressProps.js +42 -0
  268. package/lib-module/utils/props/rectProp.js +9 -0
  269. package/lib-module/utils/props/responsiveProps.js +30 -0
  270. package/lib-module/utils/props/selectSystemProps.js +24 -0
  271. package/lib-module/utils/props/spacingProps.js +56 -0
  272. package/lib-module/utils/props/tokens.js +120 -0
  273. package/lib-module/utils/props/variantProp.js +18 -0
  274. package/lib-module/utils/props/viewProps.js +22 -0
  275. package/lib-module/utils/ssr.js +35 -0
  276. package/lib-module/utils/useCopy.js +42 -0
  277. package/lib-module/utils/useHash.js +44 -0
  278. package/lib-module/utils/useHash.native.js +7 -0
  279. package/lib-module/utils/useResponsiveProp.js +47 -0
  280. package/lib-module/utils/useSpacingScale.js +123 -0
  281. package/lib-module/utils/useUniqueId.js +12 -0
  282. package/lib-module/utils/withLinkRouter.js +82 -0
  283. package/package.json +9 -5
  284. package/src/A11yText/index.jsx +7 -3
  285. package/src/ActivityIndicator/Spinner.jsx +56 -44
  286. package/src/ActivityIndicator/Spinner.native.jsx +20 -12
  287. package/src/Box/Box.jsx +10 -9
  288. package/src/Button/ButtonBase.jsx +9 -8
  289. package/src/Card/Card.jsx +7 -4
  290. package/src/Card/PressableCardBase.jsx +12 -12
  291. package/src/Checkbox/Checkbox.jsx +12 -5
  292. package/src/Divider/Divider.jsx +17 -10
  293. package/src/ExpandCollapse/Control.jsx +12 -7
  294. package/src/ExpandCollapse/ExpandCollapse.jsx +13 -3
  295. package/src/ExpandCollapse/Panel.jsx +15 -5
  296. package/src/Feedback/Feedback.jsx +13 -3
  297. package/src/Fieldset/Fieldset.jsx +1 -1
  298. package/src/HorizontalScroll/HorizontalScroll.jsx +13 -6
  299. package/src/HorizontalScroll/HorizontalScrollButton.jsx +21 -58
  300. package/src/IconButton/IconButton.jsx +12 -8
  301. package/src/InputLabel/InputLabel.jsx +16 -2
  302. package/src/InputSupports/InputSupports.jsx +1 -1
  303. package/src/Link/LinkBase.jsx +10 -9
  304. package/src/List/List.jsx +12 -5
  305. package/src/List/ListItem.jsx +16 -2
  306. package/src/Modal/Modal.jsx +63 -50
  307. package/src/Notification/Notification.jsx +23 -6
  308. package/src/Pagination/Pagination.jsx +10 -3
  309. package/src/Progress/Progress.jsx +5 -3
  310. package/src/Progress/ProgressBar.jsx +8 -6
  311. package/src/Radio/Radio.jsx +13 -5
  312. package/src/Radio/RadioButton.jsx +13 -3
  313. package/src/Radio/RadioGroup.jsx +14 -2
  314. package/src/RadioCard/RadioCard.jsx +9 -6
  315. package/src/RadioCard/RadioCardGroup.jsx +16 -4
  316. package/src/Search/Search.jsx +15 -3
  317. package/src/Select/Select.jsx +21 -7
  318. package/src/SideNav/Item.jsx +15 -7
  319. package/src/SideNav/SideNav.jsx +13 -2
  320. package/src/Skeleton/Skeleton.jsx +55 -43
  321. package/src/Spacer/Spacer.jsx +8 -16
  322. package/src/StackView/StackView.jsx +13 -12
  323. package/src/StackView/StackWrapBox.jsx +12 -12
  324. package/src/StackView/StackWrapGap.jsx +9 -7
  325. package/src/StepTracker/Step.jsx +7 -4
  326. package/src/StepTracker/StepTracker.jsx +8 -8
  327. package/src/Tabs/Tabs.jsx +16 -3
  328. package/src/Tabs/TabsItem.jsx +13 -9
  329. package/src/Tags/Tags.jsx +20 -5
  330. package/src/TextInput/TextArea.jsx +20 -8
  331. package/src/TextInput/TextInput.jsx +20 -8
  332. package/src/TextInput/TextInputBase.jsx +13 -3
  333. package/src/ToggleSwitch/ToggleSwitch.jsx +16 -5
  334. package/src/ToggleSwitch/ToggleSwitchGroup.jsx +14 -6
  335. package/src/Tooltip/Tooltip.jsx +13 -3
  336. package/src/TooltipButton/TooltipButton.jsx +6 -4
  337. package/src/Typography/Typography.jsx +10 -6
  338. package/src/index.js +1 -1
  339. package/src/utils/children.jsx +2 -1
  340. package/src/utils/index.js +1 -0
  341. package/src/utils/props/index.js +1 -0
  342. package/src/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -4
  343. package/src/utils/ssr.js +35 -0
  344. package/release-context.json +0 -7
@@ -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.3.0",
3
+ "version": "1.5.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",
58
- "@telus-uds/system-theme-tokens": "^1.2.1",
61
+ "@telus-uds/system-constants": "^1.0.2",
62
+ "@telus-uds/system-theme-tokens": "^1.4.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/props'
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/props'
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
  },
package/src/Box/Box.jsx CHANGED
@@ -4,15 +4,18 @@ 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'
15
16
 
17
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps])
18
+
16
19
  /**
17
20
  * @typedef {import('../utils/props/spacingProps.js').SpacingValue} SpacingValue
18
21
  * @typedef {import('../utils/props/spacingProps.js').SpacingIndex} SpacingIndex
@@ -122,8 +125,7 @@ const Box = forwardRef(
122
125
  ) => {
123
126
  const props = {
124
127
  ...getA11yPropsFromHtmlTag(tag, accessibilityRole),
125
- ...a11yProps.select(rest),
126
- ...viewProps.select(rest)
128
+ ...selectProps(rest)
127
129
  }
128
130
 
129
131
  const themeTokens = useThemeTokens('Box', tokens, variant)
@@ -155,8 +157,7 @@ const Box = forwardRef(
155
157
  Box.displayName = 'Box'
156
158
 
157
159
  Box.propTypes = {
158
- ...a11yProps.propTypes,
159
- ...viewProps.types,
160
+ ...selectedSystemPropTypes,
160
161
  variant: variantProp.propType,
161
162
  tokens: getTokensPropType('Box'),
162
163
  /**
@@ -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
 
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/props'
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
@@ -5,19 +5,23 @@ import { Pressable, Platform } from 'react-native'
5
5
  import { useViewport } from '../ViewportProvider'
6
6
  import { applyOuterBorder, validateThemeTokens } from '../ThemeProvider'
7
7
  import {
8
+ a11yProps,
9
+ clickProps,
10
+ getTokenNames,
11
+ getTokensSetPropType,
12
+ linkProps,
8
13
  resolvePressableState,
9
14
  resolvePressableTokens,
15
+ selectSystemProps,
10
16
  selectTokens,
11
- getTokenNames,
12
- getTokensSetPropType,
13
17
  variantProp,
14
- linkProps,
15
- clickProps,
18
+ viewProps,
16
19
  withLinkRouter
17
20
  } from '../utils'
18
- import { a11yProps } from '../utils/props'
19
21
  import CardBase from './CardBase'
20
22
 
23
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps])
24
+
21
25
  const tokenKeys = [
22
26
  ...getTokenNames('Card'),
23
27
 
@@ -52,10 +56,6 @@ const PressableCardBase = forwardRef(
52
56
  ) => {
53
57
  const { onPress, ...rest } = clickProps.toPressProps(rawRest)
54
58
  const viewport = useViewport()
55
- const a11y = a11yProps.select({
56
- ...rest,
57
- accessibilityRole
58
- })
59
59
  const additionalState = { checked, validation, inactive, viewport }
60
60
 
61
61
  const getCardState = (pressableState) => resolvePressableState(pressableState, additionalState)
@@ -98,7 +98,7 @@ const PressableCardBase = forwardRef(
98
98
  onKeyDown={handleKeyDown}
99
99
  hrefAttrs={hrefAttrs}
100
100
  style={getOuterBorderStyle}
101
- {...a11y}
101
+ {...selectProps({ ...rest, accessibilityRole })}
102
102
  >
103
103
  {(pressableState) => (
104
104
  <CardBase tokens={getCardTokens(pressableState)}>
@@ -112,10 +112,10 @@ const PressableCardBase = forwardRef(
112
112
  PressableCardBase.displayName = 'PressableCardBase'
113
113
 
114
114
  PressableCardBase.propTypes = {
115
+ ...selectedSystemPropTypes,
115
116
  children: PropTypes.oneOfType([PropTypes.func, PropTypes.node]),
116
117
  tokens: getTokensSetPropType(tokenKeys, { requireAll: true, allowFunction: true }),
117
- variant: variantProp.propType,
118
- ...a11yProps.types
118
+ variant: variantProp.propType
119
119
  }
120
120
 
121
121
  export default withLinkRouter(PressableCardBase)
@@ -7,10 +7,18 @@ import CheckboxLabel from '../InputLabel/LabelContent'
7
7
  import Feedback from '../Feedback'
8
8
  import StackView from '../StackView'
9
9
  import { applyShadowToken, applyTextStyles, useThemeTokensCallback } from '../ThemeProvider'
10
- import { getTokensPropType, useInputValue, variantProp } from '../utils'
11
- import { a11yProps } from '../utils/props'
10
+ import {
11
+ a11yProps,
12
+ getTokensPropType,
13
+ selectSystemProps,
14
+ useInputValue,
15
+ variantProp,
16
+ viewProps
17
+ } from '../utils'
12
18
  import useUniqueId from '../utils/useUniqueId'
13
19
 
20
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps])
21
+
14
22
  const selectInputStyles = (
15
23
  {
16
24
  iconBackgroundColor,
@@ -154,7 +162,6 @@ const Checkbox = forwardRef(
154
162
  // The expected keyboard shortcut for activating a checkbox is the Space key
155
163
  if (event?.key === ' ') handleChange(event)
156
164
  }
157
- const accessibilityProps = a11yProps.select(rest)
158
165
  const uniqueId = useUniqueId('checkbox')
159
166
  const inputId = id ?? uniqueId
160
167
 
@@ -167,7 +174,7 @@ const Checkbox = forwardRef(
167
174
  onPress={handleChange}
168
175
  accessibilityRole="checkbox"
169
176
  accessibilityState={{ checked: isChecked, disabled: inactive }}
170
- {...accessibilityProps}
177
+ {...selectProps(rest)}
171
178
  >
172
179
  {({ focused: focus, hovered: hover, pressed }) => {
173
180
  const { icon: IconComponent, ...stateTokens } = getTokens({ focus, hover, pressed })
@@ -222,7 +229,7 @@ const Checkbox = forwardRef(
222
229
  Checkbox.displayName = 'Checkbox'
223
230
 
224
231
  Checkbox.propTypes = {
225
- ...a11yProps.propTypes,
232
+ ...selectedSystemPropTypes,
226
233
  /**
227
234
  * Use `checked` for controlled Checkbox. For uncontrolled Checkbox, use the `defaultChecked` prop.
228
235
  */
@@ -3,7 +3,17 @@ import PropTypes from 'prop-types'
3
3
  import { View, StyleSheet, Platform } from 'react-native'
4
4
  import { useThemeTokens } from '../ThemeProvider'
5
5
  import Spacer from '../Spacer'
6
- import { getTokensPropType, variantProp, spacingProps } from '../utils'
6
+ import {
7
+ a11yProps,
8
+ getTokensPropType,
9
+ selectSystemProps,
10
+ spacingProps,
11
+ variantProp,
12
+ viewProps
13
+ } from '../utils'
14
+
15
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps])
16
+
7
17
  /**
8
18
  * @typedef {import('../utils/props/spacingProps.js').SpacingIndex} SpacingIndex
9
19
  * @typedef {import('../utils/props/spacingProps.js').SpacingObject} SpacingObject
@@ -45,7 +55,7 @@ import { getTokensPropType, variantProp, spacingProps } from '../utils'
45
55
  *
46
56
  * For accessibility purposes a divider component will be described with ARIA attributes, i.e. `role="separator"` and `aria-orientation="vertical/horizontal"`.
47
57
  */
48
- const Divider = forwardRef(({ variant, vertical = false, space, tokens, testID }, ref) => {
58
+ const Divider = forwardRef(({ variant, vertical = false, space, tokens, ...rest }, ref) => {
49
59
  const { color, width } = useThemeTokens('Divider', tokens, variant)
50
60
 
51
61
  const borderStyles = vertical
@@ -68,8 +78,10 @@ const Divider = forwardRef(({ variant, vertical = false, space, tokens, testID }
68
78
  : // There are no such equivalent attributes for native
69
79
  {}
70
80
 
81
+ const { testID, ...selectedProps } = selectProps({ ...a11y, ...rest })
82
+
71
83
  const divider = (
72
- <View ref={ref} style={[styles.divider, borderStyles]} testID={testID} {...a11y} />
84
+ <View ref={ref} style={[styles.divider, borderStyles]} testID={testID} {...selectedProps} />
73
85
  )
74
86
  if (!space) return divider
75
87
  const spacerProps = { space, direction: vertical ? 'row' : 'column' }
@@ -84,6 +96,7 @@ const Divider = forwardRef(({ variant, vertical = false, space, tokens, testID }
84
96
  Divider.displayName = 'Divider'
85
97
 
86
98
  Divider.propTypes = {
99
+ ...selectedSystemPropTypes,
87
100
  tokens: getTokensPropType('Divider'),
88
101
  space: spacingProps.types.spacingValue,
89
102
  variant: variantProp.propType,
@@ -91,13 +104,7 @@ Divider.propTypes = {
91
104
  * By default, the divider is a horizontal line the full width of its parent.
92
105
  * With `vertical` prop and when inside a container with { flexDirection: row }, draws a full height vertical line.
93
106
  */
94
- vertical: PropTypes.bool,
95
- /**
96
- * @ignore
97
- * In tests, the only way to select dividers is with testID prop and getByTestId, since they have no content,
98
- * no accessibility role on native, and there is no equivalent of nextSibling in React Native Testing Library.
99
- */
100
- testID: PropTypes.string
107
+ vertical: PropTypes.bool
101
108
  }
102
109
 
103
110
  const styles = StyleSheet.create({