@telus-uds/components-base 0.0.2-prerelease.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/.eslintrc.js +9 -0
  2. package/.ultra.cache.json +1 -1
  3. package/CHANGELOG.md +85 -0
  4. package/README.md +4 -2
  5. package/__fixtures__/Accessible.js +33 -0
  6. package/__fixtures__/Accessible.native.js +32 -0
  7. package/__fixtures__/test-utils.js +25 -0
  8. package/__fixtures__/testTheme.js +851 -57
  9. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  10. package/__tests__/Button/ButtonBase.test.jsx +2 -31
  11. package/__tests__/Button/ButtonGroup.test.jsx +6 -7
  12. package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
  13. package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
  14. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
  15. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
  16. package/__tests__/Icon/Icon.test.jsx +3 -3
  17. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  18. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  19. package/__tests__/Link/LinkBase.test.jsx +0 -14
  20. package/__tests__/List/List.test.jsx +60 -0
  21. package/__tests__/Modal/Modal.test.jsx +47 -0
  22. package/__tests__/Notification/Notification.test.jsx +20 -0
  23. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  24. package/__tests__/Progress/Progress.test.jsx +79 -0
  25. package/__tests__/Radio/Radio.test.jsx +87 -0
  26. package/__tests__/Radio/RadioGroup.test.jsx +220 -0
  27. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  28. package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
  29. package/__tests__/Search/Search.test.jsx +73 -0
  30. package/__tests__/Select/Select.test.jsx +94 -0
  31. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  32. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  33. package/__tests__/Tabs/Tabs.test.jsx +40 -0
  34. package/__tests__/Tags/Tags.test.jsx +327 -0
  35. package/__tests__/TextInput/TextArea.test.jsx +35 -0
  36. package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +29 -50
  37. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
  38. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
  39. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
  40. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
  41. package/__tests__/utils/children.test.jsx +128 -0
  42. package/__tests__/utils/input.test.js +59 -1
  43. package/__tests__/utils/semantics.test.jsx +43 -0
  44. package/__tests__/utils/useCopy.test.js +14 -3
  45. package/babel.config.js +20 -0
  46. package/jest.config.js +8 -3
  47. package/lib/A11yInfoProvider/index.js +54 -26
  48. package/lib/A11yText/index.js +45 -17
  49. package/lib/ActivityIndicator/Spinner.js +81 -0
  50. package/lib/ActivityIndicator/Spinner.native.js +129 -91
  51. package/lib/ActivityIndicator/index.js +28 -12
  52. package/lib/ActivityIndicator/shared.js +27 -12
  53. package/lib/BaseProvider/index.js +34 -11
  54. package/lib/Box/Box.js +152 -35
  55. package/lib/Box/index.js +13 -2
  56. package/lib/Button/Button.js +41 -12
  57. package/lib/Button/ButtonBase.js +125 -97
  58. package/lib/Button/ButtonGroup.js +112 -89
  59. package/lib/Button/ButtonLink.js +48 -17
  60. package/lib/Button/index.js +31 -4
  61. package/lib/Button/propTypes.js +32 -9
  62. package/lib/Card/Card.js +38 -41
  63. package/lib/Card/CardBase.js +85 -0
  64. package/lib/Card/PressableCardBase.js +141 -0
  65. package/lib/Card/index.js +40 -2
  66. package/lib/Checkbox/Checkbox.js +355 -0
  67. package/lib/Checkbox/CheckboxGroup.js +241 -0
  68. package/lib/Checkbox/CheckboxInput.js +74 -0
  69. package/lib/Checkbox/CheckboxInput.native.js +14 -0
  70. package/lib/Checkbox/index.js +21 -0
  71. package/lib/Divider/Divider.js +59 -28
  72. package/lib/Divider/index.js +13 -2
  73. package/lib/ExpandCollapse/Accordion.js +26 -7
  74. package/lib/ExpandCollapse/Control.js +60 -31
  75. package/lib/ExpandCollapse/ExpandCollapse.js +50 -28
  76. package/lib/ExpandCollapse/Panel.js +83 -44
  77. package/lib/ExpandCollapse/index.js +25 -7
  78. package/lib/Feedback/Feedback.js +90 -39
  79. package/lib/Feedback/index.js +13 -2
  80. package/lib/Fieldset/Fieldset.js +165 -0
  81. package/lib/Fieldset/FieldsetContainer.js +46 -0
  82. package/lib/Fieldset/FieldsetContainer.native.js +38 -0
  83. package/lib/Fieldset/Legend.js +38 -0
  84. package/lib/Fieldset/Legend.native.js +48 -0
  85. package/lib/Fieldset/cssReset.js +21 -0
  86. package/lib/Fieldset/index.js +13 -0
  87. package/lib/FlexGrid/Col/Col.js +73 -41
  88. package/lib/FlexGrid/Col/index.js +13 -2
  89. package/lib/FlexGrid/FlexGrid.js +99 -49
  90. package/lib/FlexGrid/Row/Row.js +58 -30
  91. package/lib/FlexGrid/Row/index.js +13 -2
  92. package/lib/FlexGrid/helpers/index.js +9 -1
  93. package/lib/FlexGrid/index.js +13 -2
  94. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  95. package/lib/HorizontalScroll/HorizontalScroll.js +200 -0
  96. package/lib/HorizontalScroll/HorizontalScrollButton.js +127 -0
  97. package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
  98. package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
  99. package/lib/HorizontalScroll/dictionary.js +18 -0
  100. package/lib/HorizontalScroll/index.js +35 -0
  101. package/lib/HorizontalScroll/itemPositions.js +128 -0
  102. package/lib/Icon/Icon.js +62 -50
  103. package/lib/Icon/IconText.js +101 -0
  104. package/lib/Icon/index.js +31 -3
  105. package/lib/IconButton/IconButton.js +140 -0
  106. package/lib/IconButton/index.js +13 -0
  107. package/lib/InputLabel/InputLabel.js +102 -40
  108. package/lib/InputLabel/LabelContent.js +41 -0
  109. package/lib/InputLabel/LabelContent.native.js +32 -6
  110. package/lib/InputLabel/index.js +13 -2
  111. package/lib/InputSupports/InputSupports.js +109 -0
  112. package/lib/InputSupports/index.js +13 -0
  113. package/lib/InputSupports/propTypes.js +66 -0
  114. package/lib/InputSupports/useInputSupports.js +41 -0
  115. package/lib/Link/ChevronLink.js +58 -31
  116. package/lib/Link/InlinePressable.js +56 -0
  117. package/lib/Link/InlinePressable.native.js +102 -0
  118. package/lib/Link/Link.js +39 -15
  119. package/lib/Link/LinkBase.js +126 -150
  120. package/lib/Link/TextButton.js +53 -18
  121. package/lib/Link/index.js +39 -4
  122. package/lib/List/List.js +81 -0
  123. package/lib/List/ListItem.js +245 -0
  124. package/lib/List/index.js +13 -0
  125. package/lib/Modal/Modal.js +231 -0
  126. package/lib/Modal/dictionary.js +16 -0
  127. package/lib/Modal/index.js +13 -0
  128. package/lib/Notification/Notification.js +216 -0
  129. package/lib/Notification/dictionary.js +15 -0
  130. package/lib/Notification/index.js +13 -0
  131. package/lib/Pagination/PageButton.js +58 -48
  132. package/lib/Pagination/Pagination.js +78 -43
  133. package/lib/Pagination/SideButton.js +79 -58
  134. package/lib/Pagination/dictionary.js +9 -2
  135. package/lib/Pagination/index.js +13 -2
  136. package/lib/Pagination/usePagination.js +12 -2
  137. package/lib/Progress/Progress.js +104 -0
  138. package/lib/Progress/ProgressBar.js +157 -0
  139. package/lib/Progress/ProgressBarBackground.js +61 -0
  140. package/lib/Progress/index.js +16 -0
  141. package/lib/Radio/Radio.js +293 -0
  142. package/lib/Radio/RadioButton.js +152 -0
  143. package/lib/Radio/RadioGroup.js +244 -0
  144. package/lib/Radio/RadioInput.js +76 -0
  145. package/lib/Radio/RadioInput.native.js +14 -0
  146. package/lib/Radio/index.js +21 -0
  147. package/lib/RadioCard/RadioCard.js +244 -0
  148. package/lib/RadioCard/RadioCardGroup.js +252 -0
  149. package/lib/RadioCard/index.js +21 -0
  150. package/lib/Search/Search.js +254 -0
  151. package/lib/Search/dictionary.js +19 -0
  152. package/lib/Search/index.js +13 -0
  153. package/lib/Select/Group.js +33 -0
  154. package/lib/Select/Group.native.js +25 -0
  155. package/lib/Select/Item.js +29 -0
  156. package/lib/Select/Item.native.js +19 -0
  157. package/lib/Select/Picker.js +84 -0
  158. package/lib/Select/Picker.native.js +130 -0
  159. package/lib/Select/Select.js +342 -0
  160. package/lib/Select/index.js +19 -0
  161. package/lib/SideNav/Item.js +63 -37
  162. package/lib/SideNav/ItemContent.js +41 -15
  163. package/lib/SideNav/ItemsGroup.js +55 -31
  164. package/lib/SideNav/SideNav.js +100 -73
  165. package/lib/SideNav/index.js +15 -1
  166. package/lib/Skeleton/Skeleton.js +137 -0
  167. package/lib/Skeleton/index.js +13 -0
  168. package/lib/Skeleton/skeleton.constant.js +12 -0
  169. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  170. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  171. package/lib/Spacer/Spacer.js +49 -18
  172. package/lib/Spacer/index.js +13 -2
  173. package/lib/StackView/StackView.js +71 -31
  174. package/lib/StackView/StackWrap.js +43 -13
  175. package/lib/StackView/StackWrap.native.js +13 -2
  176. package/lib/StackView/StackWrapBox.js +76 -29
  177. package/lib/StackView/StackWrapGap.js +56 -26
  178. package/lib/StackView/common.js +23 -6
  179. package/lib/StackView/getStackedContent.js +47 -17
  180. package/lib/StackView/index.js +29 -5
  181. package/lib/StepTracker/Step.js +245 -0
  182. package/lib/StepTracker/StepTracker.js +202 -0
  183. package/lib/StepTracker/dictionary.js +17 -0
  184. package/lib/StepTracker/index.js +13 -0
  185. package/lib/Tabs/Tabs.js +124 -0
  186. package/lib/Tabs/TabsItem.js +238 -0
  187. package/lib/Tabs/index.js +13 -0
  188. package/lib/Tags/Tags.js +266 -0
  189. package/lib/Tags/index.js +13 -0
  190. package/lib/TextInput/TextArea.js +111 -0
  191. package/lib/TextInput/TextInput.js +50 -304
  192. package/lib/TextInput/TextInputBase.js +256 -0
  193. package/lib/TextInput/index.js +23 -2
  194. package/lib/TextInput/propTypes.js +42 -0
  195. package/lib/ThemeProvider/ThemeProvider.js +46 -18
  196. package/lib/ThemeProvider/index.js +61 -6
  197. package/lib/ThemeProvider/useSetTheme.js +19 -5
  198. package/lib/ThemeProvider/useTheme.js +13 -4
  199. package/lib/ThemeProvider/useThemeTokens.js +86 -19
  200. package/lib/ThemeProvider/utils/index.js +31 -2
  201. package/lib/ThemeProvider/utils/styles.js +50 -14
  202. package/lib/ThemeProvider/utils/theme-tokens.js +121 -12
  203. package/lib/ToggleSwitch/ToggleSwitch.js +86 -57
  204. package/lib/ToggleSwitch/index.js +13 -2
  205. package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +20 -8
  206. package/lib/Tooltip/Backdrop.native.js +39 -15
  207. package/lib/Tooltip/Tooltip.js +117 -74
  208. package/lib/Tooltip/dictionary.js +9 -2
  209. package/lib/Tooltip/getTooltipPosition.js +9 -1
  210. package/lib/Tooltip/index.js +13 -2
  211. package/lib/TooltipButton/TooltipButton.js +57 -38
  212. package/lib/TooltipButton/index.js +13 -2
  213. package/lib/Typography/Typography.js +86 -55
  214. package/lib/Typography/index.js +13 -2
  215. package/lib/ViewportProvider/ViewportProvider.js +34 -13
  216. package/lib/ViewportProvider/index.js +28 -3
  217. package/lib/ViewportProvider/useViewport.js +15 -3
  218. package/lib/ViewportProvider/useViewportListener.js +24 -10
  219. package/lib/index.js +539 -26
  220. package/lib/utils/a11y/index.js +31 -0
  221. package/lib/utils/a11y/semantics.js +173 -0
  222. package/lib/utils/a11y/textSize.js +49 -0
  223. package/lib/utils/animation/index.js +15 -2
  224. package/lib/utils/animation/useVerticalExpandAnimation.js +27 -10
  225. package/lib/utils/children.js +134 -0
  226. package/lib/utils/index.js +163 -7
  227. package/lib/utils/info/index.js +19 -0
  228. package/lib/utils/info/platform/index.js +23 -0
  229. package/lib/utils/info/platform/platform.android.js +8 -0
  230. package/lib/utils/info/platform/platform.ios.js +8 -0
  231. package/lib/utils/info/platform/platform.js +8 -0
  232. package/lib/utils/info/platform/platform.native.js +11 -0
  233. package/lib/utils/info/versions.js +16 -0
  234. package/lib/utils/input.js +53 -25
  235. package/lib/utils/pressability.js +120 -0
  236. package/lib/utils/propTypes.js +338 -132
  237. package/lib/utils/useCopy.js +40 -5
  238. package/lib/utils/useHash.js +52 -0
  239. package/lib/utils/useHash.native.js +15 -0
  240. package/lib/utils/useResponsiveProp.js +21 -9
  241. package/lib/utils/useSpacingScale.js +19 -9
  242. package/lib/utils/useUniqueId.js +12 -3
  243. package/package.json +16 -10
  244. package/release-context.json +4 -4
  245. package/src/A11yText/index.jsx +6 -4
  246. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +5 -3
  247. package/src/ActivityIndicator/Spinner.native.jsx +5 -3
  248. package/src/Box/Box.jsx +131 -39
  249. package/src/Button/Button.jsx +13 -6
  250. package/src/Button/ButtonBase.jsx +134 -125
  251. package/src/Button/ButtonGroup.jsx +85 -86
  252. package/src/Button/ButtonLink.jsx +22 -7
  253. package/src/Button/propTypes.js +12 -2
  254. package/src/Card/Card.jsx +5 -31
  255. package/src/Card/CardBase.jsx +58 -0
  256. package/src/Card/PressableCardBase.jsx +119 -0
  257. package/src/Card/index.js +3 -0
  258. package/src/Checkbox/Checkbox.jsx +284 -0
  259. package/src/Checkbox/CheckboxGroup.jsx +206 -0
  260. package/src/Checkbox/CheckboxInput.jsx +55 -0
  261. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  262. package/src/Checkbox/index.js +5 -0
  263. package/src/Divider/Divider.jsx +7 -4
  264. package/src/ExpandCollapse/Accordion.jsx +3 -2
  265. package/src/ExpandCollapse/Control.jsx +40 -43
  266. package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
  267. package/src/ExpandCollapse/Panel.jsx +69 -63
  268. package/src/Feedback/Feedback.jsx +42 -30
  269. package/src/Fieldset/Fieldset.jsx +136 -0
  270. package/src/Fieldset/FieldsetContainer.jsx +31 -0
  271. package/src/Fieldset/FieldsetContainer.native.jsx +19 -0
  272. package/src/Fieldset/Legend.jsx +21 -0
  273. package/src/Fieldset/Legend.native.jsx +27 -0
  274. package/src/Fieldset/cssReset.js +14 -0
  275. package/src/Fieldset/index.js +3 -0
  276. package/src/FlexGrid/Col/Col.jsx +139 -132
  277. package/src/FlexGrid/FlexGrid.jsx +79 -51
  278. package/src/FlexGrid/Row/Row.jsx +55 -48
  279. package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
  280. package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
  281. package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
  282. package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
  283. package/src/HorizontalScroll/dictionary.js +11 -0
  284. package/src/HorizontalScroll/index.js +17 -0
  285. package/src/HorizontalScroll/itemPositions.js +101 -0
  286. package/src/Icon/Icon.jsx +46 -49
  287. package/src/Icon/IconText.jsx +68 -0
  288. package/src/Icon/index.js +3 -2
  289. package/src/IconButton/IconButton.jsx +114 -0
  290. package/src/IconButton/index.js +3 -0
  291. package/src/InputLabel/InputLabel.jsx +57 -35
  292. package/src/InputLabel/LabelContent.jsx +21 -0
  293. package/src/InputLabel/LabelContent.native.jsx +11 -2
  294. package/src/InputSupports/InputSupports.jsx +70 -0
  295. package/src/InputSupports/index.js +3 -0
  296. package/src/InputSupports/propTypes.js +44 -0
  297. package/src/InputSupports/useInputSupports.js +30 -0
  298. package/src/Link/ChevronLink.jsx +34 -21
  299. package/src/Link/InlinePressable.jsx +39 -0
  300. package/src/Link/InlinePressable.native.jsx +75 -0
  301. package/src/Link/Link.jsx +23 -13
  302. package/src/Link/LinkBase.jsx +98 -170
  303. package/src/Link/TextButton.jsx +37 -16
  304. package/src/Link/index.js +2 -1
  305. package/src/List/List.jsx +48 -0
  306. package/src/List/ListItem.jsx +182 -0
  307. package/src/List/index.js +3 -0
  308. package/src/Modal/Modal.jsx +190 -0
  309. package/src/Modal/dictionary.js +9 -0
  310. package/src/Modal/index.js +3 -0
  311. package/src/Notification/Notification.jsx +164 -0
  312. package/src/Notification/dictionary.js +8 -0
  313. package/src/Notification/index.js +3 -0
  314. package/src/Pagination/PageButton.jsx +42 -49
  315. package/src/Pagination/Pagination.jsx +88 -92
  316. package/src/Pagination/SideButton.jsx +58 -66
  317. package/src/Progress/Progress.jsx +78 -0
  318. package/src/Progress/ProgressBar.jsx +123 -0
  319. package/src/Progress/ProgressBarBackground.jsx +36 -0
  320. package/src/Progress/index.js +6 -0
  321. package/src/Radio/Radio.jsx +240 -0
  322. package/src/Radio/RadioButton.jsx +142 -0
  323. package/src/Radio/RadioGroup.jsx +209 -0
  324. package/src/Radio/RadioInput.jsx +57 -0
  325. package/src/Radio/RadioInput.native.jsx +6 -0
  326. package/src/Radio/index.js +5 -0
  327. package/src/RadioCard/RadioCard.jsx +198 -0
  328. package/src/RadioCard/RadioCardGroup.jsx +218 -0
  329. package/src/RadioCard/index.js +5 -0
  330. package/src/Search/Search.jsx +225 -0
  331. package/src/Search/dictionary.js +12 -0
  332. package/src/Search/index.js +3 -0
  333. package/src/Select/Group.jsx +15 -0
  334. package/src/Select/Group.native.jsx +14 -0
  335. package/src/Select/Item.jsx +11 -0
  336. package/src/Select/Item.native.jsx +10 -0
  337. package/src/Select/Picker.jsx +74 -0
  338. package/src/Select/Picker.native.jsx +102 -0
  339. package/src/Select/Select.jsx +298 -0
  340. package/src/Select/index.js +8 -0
  341. package/src/SideNav/Item.jsx +54 -47
  342. package/src/SideNav/ItemsGroup.jsx +50 -43
  343. package/src/SideNav/SideNav.jsx +68 -60
  344. package/src/Skeleton/Skeleton.jsx +94 -0
  345. package/src/Skeleton/index.js +3 -0
  346. package/src/Skeleton/skeleton.constant.js +3 -0
  347. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  348. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  349. package/src/Spacer/Spacer.jsx +11 -4
  350. package/src/StackView/StackView.jsx +53 -23
  351. package/src/StackView/StackWrap.jsx +16 -7
  352. package/src/StackView/StackWrapBox.jsx +62 -28
  353. package/src/StackView/StackWrapGap.jsx +46 -24
  354. package/src/StackView/common.jsx +3 -2
  355. package/src/StackView/getStackedContent.jsx +8 -2
  356. package/src/StepTracker/Step.jsx +202 -0
  357. package/src/StepTracker/StepTracker.jsx +174 -0
  358. package/src/StepTracker/dictionary.js +10 -0
  359. package/src/StepTracker/index.js +3 -0
  360. package/src/Tabs/Tabs.jsx +97 -0
  361. package/src/Tabs/TabsItem.jsx +212 -0
  362. package/src/Tabs/index.js +3 -0
  363. package/src/Tags/Tags.jsx +219 -0
  364. package/src/Tags/index.js +3 -0
  365. package/src/TextInput/TextArea.jsx +79 -0
  366. package/src/TextInput/TextInput.jsx +18 -284
  367. package/src/TextInput/TextInputBase.jsx +217 -0
  368. package/src/TextInput/index.js +2 -1
  369. package/src/TextInput/propTypes.js +29 -0
  370. package/src/ThemeProvider/ThemeProvider.jsx +11 -7
  371. package/src/ThemeProvider/useSetTheme.js +4 -0
  372. package/src/ThemeProvider/useThemeTokens.js +56 -5
  373. package/src/ThemeProvider/utils/styles.js +18 -5
  374. package/src/ThemeProvider/utils/theme-tokens.js +74 -5
  375. package/src/ToggleSwitch/ToggleSwitch.jsx +51 -53
  376. package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
  377. package/src/Tooltip/Tooltip.jsx +135 -131
  378. package/src/TooltipButton/TooltipButton.jsx +23 -27
  379. package/src/Typography/Typography.jsx +72 -59
  380. package/src/index.js +31 -3
  381. package/src/utils/a11y/index.js +2 -0
  382. package/src/utils/a11y/semantics.js +162 -0
  383. package/src/utils/a11y/textSize.js +30 -0
  384. package/src/utils/children.jsx +119 -0
  385. package/src/utils/index.js +6 -0
  386. package/src/utils/info/index.js +8 -0
  387. package/src/utils/info/platform/index.js +11 -0
  388. package/src/utils/info/platform/platform.android.js +1 -0
  389. package/src/utils/info/platform/platform.ios.js +1 -0
  390. package/src/utils/info/platform/platform.js +1 -0
  391. package/src/utils/info/platform/platform.native.js +4 -0
  392. package/src/utils/info/versions.js +6 -0
  393. package/src/utils/input.js +36 -25
  394. package/src/utils/pressability.js +96 -0
  395. package/src/utils/propTypes.js +291 -90
  396. package/src/utils/useCopy.js +30 -4
  397. package/src/utils/useHash.js +39 -0
  398. package/src/utils/useHash.native.js +6 -0
  399. package/stories/A11yText/A11yText.stories.jsx +6 -10
  400. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +1 -1
  401. package/stories/Box/Box.stories.jsx +1 -1
  402. package/stories/Button/Button.stories.jsx +7 -2
  403. package/stories/Button/ButtonGroup.stories.jsx +1 -1
  404. package/stories/Button/ButtonLink.stories.jsx +1 -1
  405. package/stories/Card/Card.stories.jsx +1 -1
  406. package/stories/Checkbox/Checkbox.stories.jsx +94 -0
  407. package/stories/Divider/Divider.stories.jsx +1 -1
  408. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +2 -2
  409. package/stories/Feedback/Feedback.stories.jsx +5 -6
  410. package/stories/FlexGrid/01 FlexGrid.stories.jsx +1 -1
  411. package/stories/FlexGrid/02 Row.stories.jsx +1 -1
  412. package/stories/FlexGrid/03 Col.stories.jsx +1 -1
  413. package/stories/Icon/Icon.stories.jsx +27 -7
  414. package/stories/IconButton/IconButton.stories.jsx +50 -0
  415. package/stories/InputLabel/InputLabel.stories.jsx +1 -1
  416. package/stories/Link/ChevronLink.stories.jsx +1 -1
  417. package/stories/Link/Link.stories.jsx +28 -18
  418. package/stories/Link/TextButton.stories.jsx +1 -1
  419. package/stories/List/List.stories.jsx +117 -0
  420. package/stories/Modal/Modal.stories.jsx +29 -0
  421. package/stories/Notification/Notification.stories.jsx +82 -0
  422. package/stories/Pagination/Pagination.stories.jsx +1 -1
  423. package/stories/Progress/Progress.stories.jsx +93 -0
  424. package/stories/Radio/Radio.stories.jsx +100 -0
  425. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  426. package/stories/Search/Search.stories.jsx +16 -0
  427. package/stories/Select/Select.stories.jsx +55 -0
  428. package/stories/SideNav/SideNav.stories.jsx +1 -1
  429. package/stories/SideNav/SideNavItem.stories.jsx +1 -1
  430. package/stories/SideNav/SideNavItemsGroup.stories.jsx +1 -1
  431. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  432. package/stories/Spacer/Spacer.stories.jsx +1 -1
  433. package/stories/StackView/StackView.stories.jsx +1 -1
  434. package/stories/StackView/StackWrap.stories.jsx +1 -1
  435. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  436. package/stories/Tabs/Tabs.stories.jsx +97 -0
  437. package/stories/Tags/Tags.stories.jsx +69 -0
  438. package/stories/TextInput/TextArea.stories.jsx +100 -0
  439. package/stories/TextInput/TextInput.stories.jsx +1 -1
  440. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +1 -1
  441. package/stories/Tooltip/Tooltip.stories.jsx +1 -1
  442. package/stories/TooltipButton/TooltipButton.stories.jsx +1 -1
  443. package/stories/Typography/Typography.stories.jsx +1 -1
  444. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  445. package/stories/supports.jsx +38 -4
  446. package/__fixtures__/accessible.icon.svg +0 -6
  447. package/babel.config.json +0 -8
  448. package/docs/Contributing.stories.mdx +0 -9
  449. package/docs/Fonts.stories.mdx +0 -104
  450. package/docs/Icons.stories.mdx +0 -144
  451. package/docs/Introduction.stories.mdx +0 -9
  452. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  453. package/lib/InputLabel/LabelContent.web.js +0 -17
  454. package/lib/config/svgr-icons-web.js +0 -9
  455. package/lib/config/svgr-icons.js +0 -52
  456. package/src/InputLabel/LabelContent.web.jsx +0 -13
  457. package/src/config/svgr-icons-web.js +0 -11
  458. package/src/config/svgr-icons.js +0 -46
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
 
4
4
  import ItemContent from './ItemContent'
@@ -16,52 +16,59 @@ import { useThemeTokensCallback } from '../ThemeProvider'
16
16
  ## Usage Criteria
17
17
  - Use `SideNav.ItemsGroup` with large pages that have multiple sections
18
18
  */
19
- const ItemsGroup = ({
20
- children,
21
- label,
22
- openGroups,
23
- groupId,
24
- isActive = false,
25
- variant,
26
- tokens,
27
- itemTokens,
28
- onToggle
29
- }) => {
30
- // A SideNav control uses the same style and theme as SideNavItem, with a 'parent' variant,
31
- // plus control-specific tokens from the SideNavItemsGroup theme (e.g. open/close icon, etc).
32
- const getAppearance = (appearance) => ({ ...variant, ...appearance, active: isActive })
33
- const getItemAppearance = (appearance) => ({ ...getAppearance(appearance), type: 'parent' })
19
+ const ItemsGroup = forwardRef(
20
+ (
21
+ {
22
+ children,
23
+ label,
24
+ openGroups,
25
+ groupId,
26
+ isActive = false,
27
+ variant,
28
+ tokens,
29
+ itemTokens,
30
+ onToggle
31
+ },
32
+ ref
33
+ ) => {
34
+ // A SideNav control uses the same style and theme as SideNavItem, with a 'parent' variant,
35
+ // plus control-specific tokens from the SideNavItemsGroup theme (e.g. open/close icon, etc).
36
+ const getAppearance = (appearance) => ({ ...variant, ...appearance, active: isActive })
37
+ const getItemAppearance = (appearance) => ({ ...getAppearance(appearance), type: 'parent' })
34
38
 
35
- const getGroupTokens = useThemeTokensCallback('SideNavItemsGroup', tokens, variant)
36
- const getPanelTokens = (appearance) =>
37
- selectTokens('ExpandCollapsePanel', getGroupTokens(getAppearance(appearance)))
39
+ const getGroupTokens = useThemeTokensCallback('SideNavItemsGroup', tokens, variant)
40
+ const getPanelTokens = (appearance) =>
41
+ selectTokens('ExpandCollapsePanel', getGroupTokens(getAppearance(appearance)))
38
42
 
39
- const getItemTokens = useThemeTokensCallback('SideNavItem', itemTokens, variant)
40
- const getControlTokens = (appearance) =>
41
- selectTokens('ExpandCollapseControl', {
42
- ...getItemTokens(getItemAppearance(appearance)), // main style from SideNavItem
43
- ...getGroupTokens(getAppearance(appearance)) // control-specific tokens like icon etc
44
- })
43
+ const getItemTokens = useThemeTokensCallback('SideNavItem', itemTokens, variant)
44
+ const getControlTokens = (appearance) =>
45
+ selectTokens('ExpandCollapseControl', {
46
+ ...getItemTokens(getItemAppearance(appearance)), // main style from SideNavItem
47
+ ...getGroupTokens(getAppearance(appearance)) // control-specific tokens like icon etc
48
+ })
45
49
 
46
- const controlContent = (controlState) => {
47
- const currentItemTokens = getItemTokens(getItemAppearance(controlState))
48
- return <ItemContent tokens={currentItemTokens}>{label}</ItemContent>
49
- }
50
+ const controlContent = (controlState) => {
51
+ const currentItemTokens = getItemTokens(getItemAppearance(controlState))
52
+ return <ItemContent tokens={currentItemTokens}>{label}</ItemContent>
53
+ }
50
54
 
51
- return (
52
- <ExpandCollapse.Panel
53
- openIds={openGroups}
54
- panelId={groupId}
55
- onToggle={onToggle}
56
- tokens={getPanelTokens}
57
- controlTokens={getControlTokens}
58
- control={controlContent}
59
- accessibilityState={{ active: isActive }} // ExpandCollapse.Panel handles expanded state
60
- >
61
- {children}
62
- </ExpandCollapse.Panel>
63
- )
64
- }
55
+ return (
56
+ <ExpandCollapse.Panel
57
+ ref={ref}
58
+ openIds={openGroups}
59
+ panelId={groupId}
60
+ onToggle={onToggle}
61
+ tokens={getPanelTokens}
62
+ controlTokens={getControlTokens}
63
+ control={controlContent}
64
+ accessibilityState={{ active: isActive }} // ExpandCollapse.Panel handles expanded state
65
+ >
66
+ {children}
67
+ </ExpandCollapse.Panel>
68
+ )
69
+ }
70
+ )
71
+ ItemsGroup.displayName = 'ItemsGroup'
65
72
 
66
73
  ItemsGroup.propTypes = {
67
74
  /**
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react'
1
+ import React, { forwardRef, useState } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
 
4
4
  import ExpandCollapse from '../ExpandCollapse'
@@ -20,73 +20,81 @@ function selectBorderStyles(tokens) {
20
20
  - Use in conjunction with a large amount of educational / informational content
21
21
  - Allow the user to navigate between options frequently and efficiently
22
22
  */
23
- const SideNav = ({ children, variant = {}, tokens, accordion = true, itemTokens, groupTokens }) => {
24
- const themeTokens = useThemeTokens('SideNav', tokens, variant)
25
- const [active, setActive] = useState({ groupId: undefined, itemId: undefined })
23
+ const SideNav = forwardRef(
24
+ ({ children, variant = {}, tokens, accordion = true, itemTokens, groupTokens }, ref) => {
25
+ const themeTokens = useThemeTokens('SideNav', tokens, variant)
26
+ const [active, setActive] = useState({ groupId: undefined, itemId: undefined })
26
27
 
27
- const onItemPress = (itemId, groupId) => {
28
- setActive({ itemId, groupId })
29
- }
30
-
31
- const isItemActive = (itemId, groupId) => {
32
- return active.groupId === groupId && active.itemId === itemId
33
- }
34
-
35
- return (
36
- <ExpandCollapse maxOpen={accordion ? 1 : null} style={selectBorderStyles(themeTokens)}>
37
- {({ openIds, onToggle }) => {
38
- const renderItem = (item, index, groupId) => {
39
- const { itemId = `item-${index}`, onPress } = item.props
40
- const handlePress = (...args) => {
41
- onItemPress(...args)
42
- if (onPress) onPress(...args)
43
- }
44
- return (
45
- <Item
46
- {...item.props}
47
- key={itemId}
48
- itemId={itemId}
49
- groupId={groupId}
50
- variant={groupId ? { ...variant, type: 'child' } : variant}
51
- tokens={itemTokens}
52
- isActive={isItemActive(itemId, groupId)}
53
- onPress={handlePress}
54
- />
55
- )
56
- }
28
+ const onItemPress = (itemId, groupId) => {
29
+ setActive({ itemId, groupId })
30
+ }
57
31
 
58
- return React.Children.map(children, (child, index) => {
59
- // iterate over children and identify them internally to later reference expanded groups and active items
60
- if (child.type === Item) return renderItem(child, index)
32
+ const isItemActive = (itemId, groupId) => {
33
+ return active.groupId === groupId && active.itemId === itemId
34
+ }
61
35
 
62
- if (child.type === ItemsGroup) {
63
- const { groupId = `group-${index}` } = child.props
64
- const isGroupActive = active.itemId !== undefined && active.groupId === groupId
36
+ return (
37
+ <ExpandCollapse
38
+ ref={ref}
39
+ maxOpen={accordion ? 1 : null}
40
+ style={selectBorderStyles(themeTokens)}
41
+ >
42
+ {({ openIds, onToggle }) => {
43
+ const renderItem = (item, index, groupId) => {
44
+ const { itemId = `item-${index}`, onPress } = item.props
45
+ const handlePress = (...args) => {
46
+ onItemPress(...args)
47
+ if (onPress) onPress(...args)
48
+ }
65
49
  return (
66
- <ItemsGroup
67
- {...child.props}
68
- key={groupId}
50
+ <Item
51
+ {...item.props}
52
+ key={itemId}
53
+ itemId={itemId}
69
54
  groupId={groupId}
70
- variant={variant}
71
- tokens={groupTokens}
72
- itemTokens={itemTokens}
73
- openGroups={openIds}
74
- isActive={isGroupActive}
75
- onToggle={() => onToggle(groupId)}
76
- >
77
- {React.Children.map(child.props.children, (item, itemIndex) =>
78
- renderItem(item, itemIndex, groupId)
79
- )}
80
- </ItemsGroup>
55
+ variant={groupId ? { ...variant, type: 'child' } : variant}
56
+ tokens={itemTokens}
57
+ isActive={isItemActive(itemId, groupId)}
58
+ onPress={handlePress}
59
+ />
81
60
  )
82
61
  }
83
62
 
84
- return null
85
- })
86
- }}
87
- </ExpandCollapse>
88
- )
89
- }
63
+ return React.Children.map(children, (child, index) => {
64
+ // iterate over children and identify them internally to later reference expanded groups and active items
65
+ if (child.type === Item) return renderItem(child, index)
66
+
67
+ if (child.type === ItemsGroup) {
68
+ const { groupId = `group-${index}` } = child.props
69
+ const isGroupActive = active.itemId !== undefined && active.groupId === groupId
70
+ const handleToggle = (event) => onToggle(groupId, event)
71
+ return (
72
+ <ItemsGroup
73
+ {...child.props}
74
+ key={groupId}
75
+ groupId={groupId}
76
+ variant={variant}
77
+ tokens={groupTokens}
78
+ itemTokens={itemTokens}
79
+ openGroups={openIds}
80
+ isActive={isGroupActive}
81
+ onToggle={handleToggle}
82
+ >
83
+ {React.Children.map(child.props.children, (item, itemIndex) =>
84
+ renderItem(item, itemIndex, groupId)
85
+ )}
86
+ </ItemsGroup>
87
+ )
88
+ }
89
+
90
+ return null
91
+ })
92
+ }}
93
+ </ExpandCollapse>
94
+ )
95
+ }
96
+ )
97
+ SideNav.displayName = 'SideNav'
90
98
 
91
99
  SideNav.propTypes = {
92
100
  /**
@@ -0,0 +1,94 @@
1
+ import React, { forwardRef } from 'react'
2
+ import { Animated, Platform } from 'react-native'
3
+ import propTypes from 'prop-types'
4
+ import StackView from '../StackView'
5
+ import { useThemeTokens } from '../ThemeProvider'
6
+ import { getTokensPropType, useSpacingScale, variantProp } from '../utils'
7
+ import useSkeletonNativeAnimation from './useSkeletonNativeAnimation'
8
+ import skeletonWebAnimation from './skeletonWebAnimation'
9
+
10
+ const selectSkeletonStyles = ({ color, radius, fadeAnimation }) => ({
11
+ backgroundColor: color,
12
+ borderRadius: radius,
13
+ ...fadeAnimation
14
+ })
15
+
16
+ const selectLineStyles = ({ skeletonHeight, lineWidth }) => ({
17
+ width: lineWidth,
18
+ height: skeletonHeight
19
+ })
20
+
21
+ const selectShapeStyles = ({ skeletonHeight }) => ({
22
+ height: skeletonHeight,
23
+ width: skeletonHeight
24
+ })
25
+
26
+ const selectSquareStyles = ({ radius }) => ({
27
+ borderRadius: radius
28
+ })
29
+
30
+ const Skeleton = forwardRef(({ tokens, variant, size, characters, lines, shape = 'line' }, ref) => {
31
+ const themeTokens = useThemeTokens('Skeleton', tokens, variant)
32
+ const skeletonHeight = useSpacingScale(size || themeTokens.size)
33
+ const nativeAnimation = useSkeletonNativeAnimation()
34
+
35
+ const getAnimationBaseOnPlatform = () => {
36
+ if (Platform.OS !== 'web') {
37
+ return nativeAnimation
38
+ }
39
+
40
+ return skeletonWebAnimation
41
+ }
42
+
43
+ const getLineWidth = () => {
44
+ if (characters) {
45
+ return characters * themeTokens.baseWidth
46
+ }
47
+
48
+ return themeTokens.characters * themeTokens.baseWidth
49
+ }
50
+
51
+ const getStyledBasedOnShape = () => {
52
+ if (shape === 'circle') {
53
+ return selectShapeStyles({ skeletonHeight })
54
+ }
55
+
56
+ if (shape === 'box') {
57
+ return [
58
+ selectShapeStyles({ skeletonHeight }),
59
+ selectSquareStyles({ radius: themeTokens.squareRadius })
60
+ ]
61
+ }
62
+
63
+ return selectLineStyles({ skeletonHeight, lineWidth: getLineWidth() })
64
+ }
65
+
66
+ const renderSkeleton = (index = 0) => (
67
+ <Animated.View
68
+ testID="skeleton"
69
+ key={`skeleton-${index + 1}`}
70
+ style={[
71
+ selectSkeletonStyles({ ...themeTokens, fadeAnimation: getAnimationBaseOnPlatform() }),
72
+ getStyledBasedOnShape()
73
+ ]}
74
+ />
75
+ )
76
+
77
+ return (
78
+ <StackView space={themeTokens.spaceBetweenLines} ref={ref}>
79
+ {lines > 1 ? [...Array(lines)].map((_, index) => renderSkeleton(index)) : renderSkeleton()}
80
+ </StackView>
81
+ )
82
+ })
83
+ Skeleton.displayName = 'Skeleton'
84
+
85
+ Skeleton.propTypes = {
86
+ tokens: getTokensPropType('Skeleton'),
87
+ variant: variantProp.propType,
88
+ size: propTypes.number,
89
+ characters: propTypes.number,
90
+ lines: propTypes.number,
91
+ shape: propTypes.oneOf(['line', 'circle', 'box'])
92
+ }
93
+
94
+ export default Skeleton
@@ -0,0 +1,3 @@
1
+ import Skeleton from './Skeleton'
2
+
3
+ export default Skeleton
@@ -0,0 +1,3 @@
1
+ export const DEFAULT_OPACITY = 1
2
+ export const OPACITY_STOP = 0.4
3
+ export const ANIMATION_DURATION = 1500
@@ -0,0 +1,13 @@
1
+ import { ANIMATION_DURATION, DEFAULT_OPACITY, OPACITY_STOP } from './skeleton.constant'
2
+
3
+ export default {
4
+ animationDuration: `${ANIMATION_DURATION}ms`,
5
+ animationTimingFunction: 'ease-in-out',
6
+ animationDelay: '0.5s',
7
+ animationIterationCount: 'infinite',
8
+ animationKeyframes: {
9
+ '0%': { opacity: DEFAULT_OPACITY },
10
+ '50%': { opacity: OPACITY_STOP },
11
+ '100%': { opacity: DEFAULT_OPACITY }
12
+ }
13
+ }
@@ -0,0 +1,27 @@
1
+ import { useEffect, useRef } from 'react'
2
+ import { Animated } from 'react-native'
3
+ import { ANIMATION_DURATION, DEFAULT_OPACITY, OPACITY_STOP } from './skeleton.constant'
4
+
5
+ const useSkeletonNativeAnimation = () => {
6
+ const fadeAnimation = useRef(new Animated.Value(DEFAULT_OPACITY)).current
7
+
8
+ useEffect(() => {
9
+ const fade = Animated.sequence([
10
+ Animated.timing(fadeAnimation, {
11
+ toValue: OPACITY_STOP,
12
+ duration: ANIMATION_DURATION,
13
+ useNativeDriver: true
14
+ }),
15
+ Animated.timing(fadeAnimation, {
16
+ toValue: DEFAULT_OPACITY,
17
+ duration: ANIMATION_DURATION,
18
+ useNativeDriver: true
19
+ })
20
+ ])
21
+ Animated.loop(fade).start()
22
+ }, [fadeAnimation])
23
+
24
+ return { opacity: fadeAnimation }
25
+ }
26
+
27
+ export default useSkeletonNativeAnimation
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { StyleSheet, View } from 'react-native'
4
4
 
@@ -54,11 +54,14 @@ const selectSizeStyle = (size, direction) => ({
54
54
  * Spacer has no content and is ignored by tools such as screen readers. Use `Divider` for
55
55
  * separations between elements that may be treated as semantically meaningful on web.
56
56
  */
57
- const Spacer = ({ space = 1, direction = 'column', testID }) => {
57
+ const Spacer = forwardRef(({ space = 1, direction = 'column', testID, dataSet }, ref) => {
58
58
  const size = useSpacingScale(space)
59
59
  const sizeStyle = selectSizeStyle(size, direction)
60
- return <View testID={testID} style={[staticStyles.stretch, sizeStyle]} />
61
- }
60
+ return (
61
+ <View ref={ref} testID={testID} style={[staticStyles.stretch, sizeStyle]} dataSet={dataSet} />
62
+ )
63
+ })
64
+ Spacer.displayName = 'Spacer'
62
65
 
63
66
  Spacer.propTypes = {
64
67
  /**
@@ -74,6 +77,10 @@ Spacer.propTypes = {
74
77
  * - `'row'` applies space horizontally; has a fixed width and not height.
75
78
  */
76
79
  direction: PropTypes.oneOf(['column', 'row']),
80
+ /**
81
+ * @ignore
82
+ */
83
+ dataSet: PropTypes.object,
77
84
  /**
78
85
  * @ignore
79
86
  * In tests, the only way to select Spacers is with testID prop and getByTestId, since they have no content,
@@ -1,9 +1,19 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { View } from 'react-native'
4
4
 
5
5
  import Divider from '../Divider'
6
- import { spacingProps, a11yProps, responsiveProps, variantProp, useResponsiveProp } from '../utils'
6
+ import {
7
+ spacingProps,
8
+ a11yProps,
9
+ getTokensPropType,
10
+ responsiveProps,
11
+ variantProp,
12
+ viewProps,
13
+ useResponsiveProp,
14
+ getA11yPropsFromHtmlTag,
15
+ layoutTags
16
+ } from '../utils'
7
17
  import { useThemeTokens } from '../ThemeProvider'
8
18
  import { useViewport } from '../ViewportProvider'
9
19
  import getStackedContent from './getStackedContent'
@@ -51,31 +61,44 @@ import { staticStyles, selectFlexStyles } from './common'
51
61
  * It applies no accessibility props of its own, unless `divider` prop is passed (`Divider` has a
52
62
  * semantic role but only on web, not within native apps).
53
63
  */
54
- const StackView = ({
55
- space = 1,
56
- divider,
57
- direction: directionProp = 'column',
58
- children,
59
- variant,
60
- tokens,
61
- ...rest
62
- }) => {
63
- const viewport = useViewport()
64
- const direction = useResponsiveProp(directionProp, 'column')
65
- const a11y = a11yProps.select({ ...rest })
66
- const content = getStackedContent(children, { direction, divider, space })
67
- const themeTokens = useThemeTokens('StackView', tokens, variant, { viewport })
68
- const flexStyles = selectFlexStyles(themeTokens)
64
+ const StackView = forwardRef(
65
+ (
66
+ {
67
+ space = 1,
68
+ divider,
69
+ direction: directionProp = 'column',
70
+ children,
71
+ variant,
72
+ tokens,
73
+ tag,
74
+ accessibilityRole,
75
+ ...rest
76
+ },
77
+ ref
78
+ ) => {
79
+ const viewport = useViewport()
80
+ const direction = useResponsiveProp(directionProp, 'column')
81
+ const props = {
82
+ ...getA11yPropsFromHtmlTag(tag, accessibilityRole),
83
+ ...a11yProps.select(rest),
84
+ ...viewProps.select(rest)
85
+ }
86
+ const content = getStackedContent(children, { direction, divider, space })
87
+ const themeTokens = useThemeTokens('StackView', tokens, variant, { viewport })
88
+ const flexStyles = selectFlexStyles(themeTokens)
69
89
 
70
- return (
71
- <View {...a11y} style={[flexStyles, staticStyles[direction]]}>
72
- {content}
73
- </View>
74
- )
75
- }
90
+ return (
91
+ <View ref={ref} {...props} style={[flexStyles, staticStyles[direction]]}>
92
+ {content}
93
+ </View>
94
+ )
95
+ }
96
+ )
97
+ StackView.displayName = 'StackView'
76
98
 
77
99
  StackView.propTypes = {
78
100
  ...a11yProps.propTypes,
101
+ tokens: getTokensPropType('StackView'),
79
102
  variant: variantProp.propType,
80
103
  /**
81
104
  * Sets the `flexDirection` of the container and, if `divider` is used, gives the Divider the appropriate direction.
@@ -94,6 +117,13 @@ StackView.propTypes = {
94
117
  * or, a SpacingObject with viewport keys and options (see `useSpacingScale` for details).
95
118
  */
96
119
  space: spacingProps.types.spacingValue,
120
+ /**
121
+ * Optional semantic HTML tag, to apply to the container on web. Does not change styling.
122
+ *
123
+ * In native apps, if a header tag is provided ("h1", "h2" etc) and accessibilityRole prop
124
+ * is not defined, the accessibilityRole will default to "heading".
125
+ */
126
+ tag: PropTypes.oneOf(layoutTags),
97
127
  /**
98
128
  * A StackView may take any children, but will have no effect if it is only passed one child or is passed children
99
129
  * wrapped in a component. If necessary, children may be wrapped in one React Fragment.
@@ -1,4 +1,5 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
+ import { Platform } from 'react-native'
2
3
 
3
4
  import StackWrapBox from './StackWrapBox'
4
5
  import StackWrapGap from './StackWrapGap'
@@ -14,20 +15,28 @@ const exampleGapValue = '1px'
14
15
  * wrapped lines of items. By default, this `gap` is the same as the gap between spaced items.
15
16
  * If a different spacing is desired between wrapped lines, pass a spacing value to the `gap` prop.
16
17
  */
17
- const StackWrap = (props) => {
18
+ const StackWrap = forwardRef((props, ref) => {
18
19
  const { space } = props
19
20
  // Don't apply separate gap if `null` or `undefined`, so can be unset in Storybook etc
20
- // eslint-disable-next-line react/destructuring-assignment
21
21
  const gap = props.gap ?? space
22
22
 
23
- return gap === space && CSS?.supports('gap', exampleGapValue) ? (
23
+ const canUseCSSGap =
24
+ Platform.OS === 'web' &&
25
+ gap === space &&
26
+ // In Jest/CI, global CSS isn't always available and doesn't always have .supports method
27
+ typeof CSS?.supports === 'function' &&
28
+ CSS.supports('gap', exampleGapValue)
29
+
30
+ return canUseCSSGap ? (
24
31
  // If possible, use the cleaner implementation that applies CSS `gap` styles to the container.
25
- <StackWrapGap {...props} />
32
+ <StackWrapGap ref={ref} {...props} />
26
33
  ) : (
27
34
  // Else, use the fallback implementation which renders a `Box` component around each child.
28
- <StackWrapBox {...props} />
35
+ <StackWrapBox ref={ref} {...props} />
29
36
  )
30
- }
37
+ })
38
+ StackWrap.displayName = 'StackWrap'
39
+
31
40
  StackWrap.propTypes = StackWrapBox.propTypes
32
41
 
33
42
  export default StackWrap