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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/.eslintrc.js +9 -0
  2. package/.ultra.cache.json +1 -1
  3. package/CHANGELOG.md +71 -0
  4. package/README.md +4 -2
  5. package/__fixtures__/Accessible.js +33 -0
  6. package/__fixtures__/Accessible.native.js +32 -0
  7. package/__fixtures__/test-utils.js +25 -0
  8. package/__fixtures__/testTheme.js +438 -31
  9. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  10. package/__tests__/Button/ButtonGroup.test.jsx +6 -7
  11. package/__tests__/Checkbox/Checkbox.test.jsx +2 -2
  12. package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
  13. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
  14. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
  15. package/__tests__/Icon/Icon.test.jsx +3 -3
  16. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  17. package/__tests__/Link/LinkBase.test.jsx +0 -14
  18. package/__tests__/Modal/Modal.test.jsx +47 -0
  19. package/__tests__/Notification/Notification.test.jsx +20 -0
  20. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  21. package/__tests__/Progress/Progress.test.jsx +79 -0
  22. package/__tests__/Radio/Radio.test.jsx +2 -2
  23. package/__tests__/Radio/RadioGroup.test.jsx +220 -0
  24. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  25. package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
  26. package/__tests__/Search/Search.test.jsx +73 -0
  27. package/__tests__/Select/Select.test.jsx +3 -2
  28. package/__tests__/Skeleton/Skeleton.test.jsx +1 -1
  29. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  30. package/__tests__/Tabs/Tabs.test.jsx +40 -0
  31. package/__tests__/Tags/Tags.test.jsx +5 -6
  32. package/__tests__/TextInput/TextArea.test.jsx +3 -2
  33. package/__tests__/TextInput/TextInputBase.test.jsx +10 -5
  34. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
  35. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
  36. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
  37. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
  38. package/__tests__/utils/children.test.jsx +128 -0
  39. package/__tests__/utils/input.test.js +59 -1
  40. package/__tests__/utils/semantics.test.jsx +43 -0
  41. package/__tests__/utils/useCopy.test.js +14 -3
  42. package/babel.config.js +20 -0
  43. package/jest.config.js +6 -3
  44. package/lib/A11yInfoProvider/index.js +54 -26
  45. package/lib/A11yText/index.js +45 -17
  46. package/lib/ActivityIndicator/Spinner.js +81 -0
  47. package/lib/ActivityIndicator/Spinner.native.js +129 -91
  48. package/lib/ActivityIndicator/index.js +28 -12
  49. package/lib/ActivityIndicator/shared.js +27 -12
  50. package/lib/BaseProvider/index.js +34 -11
  51. package/lib/Box/Box.js +153 -35
  52. package/lib/Box/index.js +13 -2
  53. package/lib/Button/Button.js +38 -16
  54. package/lib/Button/ButtonBase.js +93 -79
  55. package/lib/Button/ButtonGroup.js +112 -73
  56. package/lib/Button/ButtonLink.js +45 -19
  57. package/lib/Button/index.js +31 -4
  58. package/lib/Button/propTypes.js +32 -9
  59. package/lib/Card/Card.js +38 -41
  60. package/lib/Card/CardBase.js +86 -0
  61. package/lib/Card/PressableCardBase.js +141 -0
  62. package/lib/Card/index.js +40 -2
  63. package/lib/Checkbox/Checkbox.js +158 -111
  64. package/lib/Checkbox/CheckboxGroup.js +241 -0
  65. package/lib/Checkbox/CheckboxInput.js +74 -0
  66. package/lib/Checkbox/CheckboxInput.native.js +9 -1
  67. package/lib/Checkbox/index.js +21 -2
  68. package/lib/Divider/Divider.js +59 -28
  69. package/lib/Divider/index.js +13 -2
  70. package/lib/ExpandCollapse/Accordion.js +26 -7
  71. package/lib/ExpandCollapse/Control.js +60 -31
  72. package/lib/ExpandCollapse/ExpandCollapse.js +50 -28
  73. package/lib/ExpandCollapse/Panel.js +83 -44
  74. package/lib/ExpandCollapse/index.js +25 -7
  75. package/lib/Feedback/Feedback.js +77 -43
  76. package/lib/Feedback/index.js +13 -2
  77. package/lib/Fieldset/Fieldset.js +165 -0
  78. package/lib/Fieldset/FieldsetContainer.js +46 -0
  79. package/lib/Fieldset/FieldsetContainer.native.js +38 -0
  80. package/lib/Fieldset/Legend.js +38 -0
  81. package/lib/Fieldset/Legend.native.js +48 -0
  82. package/lib/Fieldset/cssReset.js +21 -0
  83. package/lib/Fieldset/index.js +13 -0
  84. package/lib/FlexGrid/Col/Col.js +73 -41
  85. package/lib/FlexGrid/Col/index.js +13 -2
  86. package/lib/FlexGrid/FlexGrid.js +99 -49
  87. package/lib/FlexGrid/Row/Row.js +58 -30
  88. package/lib/FlexGrid/Row/index.js +13 -2
  89. package/lib/FlexGrid/helpers/index.js +9 -1
  90. package/lib/FlexGrid/index.js +13 -2
  91. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  92. package/lib/HorizontalScroll/HorizontalScroll.js +200 -0
  93. package/lib/HorizontalScroll/HorizontalScrollButton.js +127 -0
  94. package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
  95. package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
  96. package/lib/HorizontalScroll/dictionary.js +18 -0
  97. package/lib/HorizontalScroll/index.js +35 -0
  98. package/lib/HorizontalScroll/itemPositions.js +128 -0
  99. package/lib/Icon/Icon.js +57 -48
  100. package/lib/Icon/IconText.js +54 -25
  101. package/lib/Icon/index.js +31 -4
  102. package/lib/IconButton/IconButton.js +140 -0
  103. package/lib/IconButton/index.js +13 -0
  104. package/lib/InputLabel/InputLabel.js +102 -40
  105. package/lib/InputLabel/LabelContent.js +41 -0
  106. package/lib/InputLabel/LabelContent.native.js +32 -6
  107. package/lib/InputLabel/index.js +13 -2
  108. package/lib/InputSupports/InputSupports.js +71 -52
  109. package/lib/InputSupports/index.js +13 -2
  110. package/lib/InputSupports/propTypes.js +19 -8
  111. package/lib/InputSupports/useInputSupports.js +41 -0
  112. package/lib/Link/ChevronLink.js +44 -20
  113. package/lib/Link/InlinePressable.js +56 -0
  114. package/lib/Link/InlinePressable.native.js +39 -15
  115. package/lib/Link/Link.js +36 -13
  116. package/lib/Link/LinkBase.js +98 -61
  117. package/lib/Link/TextButton.js +41 -17
  118. package/lib/Link/index.js +39 -5
  119. package/lib/List/List.js +55 -26
  120. package/lib/List/ListItem.js +79 -41
  121. package/lib/List/index.js +13 -2
  122. package/lib/Modal/Modal.js +231 -0
  123. package/lib/Modal/dictionary.js +16 -0
  124. package/lib/Modal/index.js +13 -0
  125. package/lib/Notification/Notification.js +216 -0
  126. package/lib/Notification/dictionary.js +15 -0
  127. package/lib/Notification/index.js +13 -0
  128. package/lib/Pagination/PageButton.js +61 -28
  129. package/lib/Pagination/Pagination.js +78 -43
  130. package/lib/Pagination/SideButton.js +73 -42
  131. package/lib/Pagination/dictionary.js +9 -2
  132. package/lib/Pagination/index.js +13 -2
  133. package/lib/Pagination/usePagination.js +12 -2
  134. package/lib/Progress/Progress.js +104 -0
  135. package/lib/Progress/ProgressBar.js +157 -0
  136. package/lib/Progress/ProgressBarBackground.js +61 -0
  137. package/lib/Progress/index.js +16 -0
  138. package/lib/Radio/Radio.js +116 -114
  139. package/lib/Radio/RadioButton.js +152 -0
  140. package/lib/Radio/RadioGroup.js +244 -0
  141. package/lib/Radio/RadioInput.js +76 -0
  142. package/lib/Radio/RadioInput.native.js +9 -1
  143. package/lib/Radio/index.js +21 -2
  144. package/lib/RadioCard/RadioCard.js +244 -0
  145. package/lib/RadioCard/RadioCardGroup.js +252 -0
  146. package/lib/RadioCard/index.js +21 -0
  147. package/lib/Search/Search.js +254 -0
  148. package/lib/Search/dictionary.js +19 -0
  149. package/lib/Search/index.js +13 -0
  150. package/lib/Select/Group.js +33 -0
  151. package/lib/Select/Group.native.js +16 -5
  152. package/lib/Select/Item.js +29 -0
  153. package/lib/Select/Item.native.js +14 -4
  154. package/lib/Select/Picker.js +84 -0
  155. package/lib/Select/Picker.native.js +73 -30
  156. package/lib/Select/Select.js +155 -85
  157. package/lib/Select/index.js +19 -6
  158. package/lib/SideNav/Item.js +63 -37
  159. package/lib/SideNav/ItemContent.js +41 -15
  160. package/lib/SideNav/ItemsGroup.js +55 -31
  161. package/lib/SideNav/SideNav.js +100 -73
  162. package/lib/SideNav/index.js +15 -1
  163. package/lib/Skeleton/Skeleton.js +64 -46
  164. package/lib/Skeleton/index.js +13 -2
  165. package/lib/Skeleton/skeleton.constant.js +12 -0
  166. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  167. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  168. package/lib/Spacer/Spacer.js +49 -18
  169. package/lib/Spacer/index.js +13 -2
  170. package/lib/StackView/StackView.js +72 -31
  171. package/lib/StackView/StackWrap.js +43 -13
  172. package/lib/StackView/StackWrap.native.js +13 -2
  173. package/lib/StackView/StackWrapBox.js +77 -29
  174. package/lib/StackView/StackWrapGap.js +56 -26
  175. package/lib/StackView/common.js +23 -6
  176. package/lib/StackView/getStackedContent.js +47 -17
  177. package/lib/StackView/index.js +29 -5
  178. package/lib/StepTracker/Step.js +245 -0
  179. package/lib/StepTracker/StepTracker.js +202 -0
  180. package/lib/StepTracker/dictionary.js +17 -0
  181. package/lib/StepTracker/index.js +13 -0
  182. package/lib/Tabs/Tabs.js +124 -0
  183. package/lib/Tabs/TabsItem.js +238 -0
  184. package/lib/Tabs/index.js +13 -0
  185. package/lib/Tags/Tags.js +148 -99
  186. package/lib/Tags/index.js +13 -2
  187. package/lib/TextInput/TextArea.js +57 -28
  188. package/lib/TextInput/TextInput.js +50 -23
  189. package/lib/TextInput/TextInputBase.js +90 -63
  190. package/lib/TextInput/index.js +23 -3
  191. package/lib/TextInput/propTypes.js +18 -7
  192. package/lib/ThemeProvider/ThemeProvider.js +46 -18
  193. package/lib/ThemeProvider/index.js +61 -6
  194. package/lib/ThemeProvider/useSetTheme.js +19 -5
  195. package/lib/ThemeProvider/useTheme.js +13 -4
  196. package/lib/ThemeProvider/useThemeTokens.js +32 -16
  197. package/lib/ThemeProvider/utils/index.js +31 -2
  198. package/lib/ThemeProvider/utils/styles.js +50 -14
  199. package/lib/ThemeProvider/utils/theme-tokens.js +121 -12
  200. package/lib/ToggleSwitch/ToggleSwitch.js +85 -56
  201. package/lib/ToggleSwitch/index.js +13 -2
  202. package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +20 -8
  203. package/lib/Tooltip/Backdrop.native.js +39 -15
  204. package/lib/Tooltip/Tooltip.js +117 -74
  205. package/lib/Tooltip/dictionary.js +9 -2
  206. package/lib/Tooltip/getTooltipPosition.js +9 -1
  207. package/lib/Tooltip/index.js +13 -2
  208. package/lib/TooltipButton/TooltipButton.js +57 -38
  209. package/lib/TooltipButton/index.js +13 -2
  210. package/lib/Typography/Typography.js +87 -41
  211. package/lib/Typography/index.js +13 -2
  212. package/lib/ViewportProvider/ViewportProvider.js +34 -13
  213. package/lib/ViewportProvider/index.js +28 -3
  214. package/lib/ViewportProvider/useViewport.js +15 -3
  215. package/lib/ViewportProvider/useViewportListener.js +24 -10
  216. package/lib/index.js +539 -33
  217. package/lib/utils/a11y/index.js +31 -1
  218. package/lib/utils/a11y/semantics.js +173 -0
  219. package/lib/utils/a11y/textSize.js +23 -7
  220. package/lib/utils/animation/index.js +15 -2
  221. package/lib/utils/animation/useVerticalExpandAnimation.js +27 -10
  222. package/lib/utils/children.js +134 -0
  223. package/lib/utils/index.js +163 -10
  224. package/lib/utils/info/index.js +18 -6
  225. package/lib/utils/info/platform/index.js +19 -7
  226. package/lib/utils/info/platform/platform.android.js +8 -1
  227. package/lib/utils/info/platform/platform.ios.js +8 -1
  228. package/lib/utils/info/platform/platform.js +8 -0
  229. package/lib/utils/info/platform/platform.native.js +8 -1
  230. package/lib/utils/info/versions.js +15 -4
  231. package/lib/utils/input.js +53 -25
  232. package/lib/utils/pressability.js +38 -10
  233. package/lib/utils/propTypes.js +287 -141
  234. package/lib/utils/useCopy.js +40 -5
  235. package/lib/utils/useHash.js +52 -0
  236. package/lib/utils/useHash.native.js +15 -0
  237. package/lib/utils/useResponsiveProp.js +21 -9
  238. package/lib/utils/useSpacingScale.js +19 -9
  239. package/lib/utils/useUniqueId.js +12 -3
  240. package/package.json +14 -9
  241. package/release-context.json +4 -4
  242. package/src/A11yText/index.jsx +6 -4
  243. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +5 -3
  244. package/src/ActivityIndicator/Spinner.native.jsx +5 -3
  245. package/src/Box/Box.jsx +132 -39
  246. package/src/Button/Button.jsx +10 -6
  247. package/src/Button/ButtonBase.jsx +99 -99
  248. package/src/Button/ButtonGroup.jsx +81 -69
  249. package/src/Button/ButtonLink.jsx +21 -15
  250. package/src/Button/propTypes.js +12 -2
  251. package/src/Card/Card.jsx +5 -31
  252. package/src/Card/CardBase.jsx +59 -0
  253. package/src/Card/PressableCardBase.jsx +119 -0
  254. package/src/Card/index.js +3 -0
  255. package/src/Checkbox/Checkbox.jsx +121 -112
  256. package/src/Checkbox/CheckboxGroup.jsx +206 -0
  257. package/src/Checkbox/{CheckboxInput.web.jsx → CheckboxInput.jsx} +0 -0
  258. package/src/Checkbox/index.js +2 -0
  259. package/src/Divider/Divider.jsx +7 -4
  260. package/src/ExpandCollapse/Accordion.jsx +3 -2
  261. package/src/ExpandCollapse/Control.jsx +40 -43
  262. package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
  263. package/src/ExpandCollapse/Panel.jsx +69 -63
  264. package/src/Feedback/Feedback.jsx +36 -33
  265. package/src/Fieldset/Fieldset.jsx +136 -0
  266. package/src/Fieldset/FieldsetContainer.jsx +31 -0
  267. package/src/Fieldset/FieldsetContainer.native.jsx +19 -0
  268. package/src/Fieldset/Legend.jsx +21 -0
  269. package/src/Fieldset/Legend.native.jsx +27 -0
  270. package/src/Fieldset/cssReset.js +14 -0
  271. package/src/Fieldset/index.js +3 -0
  272. package/src/FlexGrid/Col/Col.jsx +139 -132
  273. package/src/FlexGrid/FlexGrid.jsx +79 -51
  274. package/src/FlexGrid/Row/Row.jsx +55 -48
  275. package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
  276. package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
  277. package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
  278. package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
  279. package/src/HorizontalScroll/dictionary.js +11 -0
  280. package/src/HorizontalScroll/index.js +17 -0
  281. package/src/HorizontalScroll/itemPositions.js +101 -0
  282. package/src/Icon/Icon.jsx +43 -50
  283. package/src/Icon/IconText.jsx +23 -18
  284. package/src/Icon/index.js +2 -2
  285. package/src/IconButton/IconButton.jsx +114 -0
  286. package/src/IconButton/index.js +3 -0
  287. package/src/InputLabel/InputLabel.jsx +57 -35
  288. package/src/InputLabel/LabelContent.jsx +21 -0
  289. package/src/InputLabel/LabelContent.native.jsx +11 -2
  290. package/src/InputSupports/InputSupports.jsx +29 -45
  291. package/src/InputSupports/useInputSupports.js +30 -0
  292. package/src/Link/ChevronLink.jsx +26 -16
  293. package/src/Link/{InlinePressable.web.jsx → InlinePressable.jsx} +5 -3
  294. package/src/Link/InlinePressable.native.jsx +5 -3
  295. package/src/Link/Link.jsx +22 -16
  296. package/src/Link/LinkBase.jsx +76 -65
  297. package/src/Link/TextButton.jsx +30 -23
  298. package/src/List/List.jsx +5 -4
  299. package/src/List/ListItem.jsx +77 -82
  300. package/src/Modal/Modal.jsx +190 -0
  301. package/src/Modal/dictionary.js +9 -0
  302. package/src/Modal/index.js +3 -0
  303. package/src/Notification/Notification.jsx +164 -0
  304. package/src/Notification/dictionary.js +8 -0
  305. package/src/Notification/index.js +3 -0
  306. package/src/Pagination/PageButton.jsx +42 -35
  307. package/src/Pagination/Pagination.jsx +88 -92
  308. package/src/Pagination/SideButton.jsx +44 -41
  309. package/src/Progress/Progress.jsx +78 -0
  310. package/src/Progress/ProgressBar.jsx +123 -0
  311. package/src/Progress/ProgressBarBackground.jsx +36 -0
  312. package/src/Progress/index.js +6 -0
  313. package/src/Radio/Radio.jsx +82 -112
  314. package/src/Radio/RadioButton.jsx +142 -0
  315. package/src/Radio/RadioGroup.jsx +209 -0
  316. package/src/Radio/{RadioInput.web.jsx → RadioInput.jsx} +0 -0
  317. package/src/Radio/index.js +2 -0
  318. package/src/RadioCard/RadioCard.jsx +198 -0
  319. package/src/RadioCard/RadioCardGroup.jsx +218 -0
  320. package/src/RadioCard/index.js +5 -0
  321. package/src/Search/Search.jsx +225 -0
  322. package/src/Search/dictionary.js +12 -0
  323. package/src/Search/index.js +3 -0
  324. package/src/Select/{Group.web.jsx → Group.jsx} +0 -0
  325. package/src/Select/{Item.web.jsx → Item.jsx} +0 -0
  326. package/src/Select/Picker.jsx +74 -0
  327. package/src/Select/Picker.native.jsx +56 -49
  328. package/src/Select/Select.jsx +125 -92
  329. package/src/SideNav/Item.jsx +54 -47
  330. package/src/SideNav/ItemsGroup.jsx +50 -43
  331. package/src/SideNav/SideNav.jsx +68 -60
  332. package/src/Skeleton/Skeleton.jsx +25 -32
  333. package/src/Skeleton/skeleton.constant.js +3 -0
  334. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  335. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  336. package/src/Spacer/Spacer.jsx +11 -4
  337. package/src/StackView/StackView.jsx +54 -23
  338. package/src/StackView/StackWrap.jsx +16 -7
  339. package/src/StackView/StackWrapBox.jsx +63 -28
  340. package/src/StackView/StackWrapGap.jsx +46 -24
  341. package/src/StackView/common.jsx +3 -2
  342. package/src/StackView/getStackedContent.jsx +8 -2
  343. package/src/StepTracker/Step.jsx +202 -0
  344. package/src/StepTracker/StepTracker.jsx +174 -0
  345. package/src/StepTracker/dictionary.js +10 -0
  346. package/src/StepTracker/index.js +3 -0
  347. package/src/Tabs/Tabs.jsx +97 -0
  348. package/src/Tabs/TabsItem.jsx +212 -0
  349. package/src/Tabs/index.js +3 -0
  350. package/src/Tags/Tags.jsx +115 -102
  351. package/src/TextInput/TextArea.jsx +5 -4
  352. package/src/TextInput/TextInput.jsx +5 -4
  353. package/src/TextInput/TextInputBase.jsx +95 -98
  354. package/src/ThemeProvider/ThemeProvider.jsx +11 -7
  355. package/src/ThemeProvider/useSetTheme.js +4 -0
  356. package/src/ThemeProvider/useThemeTokens.js +2 -2
  357. package/src/ThemeProvider/utils/styles.js +18 -5
  358. package/src/ThemeProvider/utils/theme-tokens.js +74 -5
  359. package/src/ToggleSwitch/ToggleSwitch.jsx +50 -52
  360. package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
  361. package/src/Tooltip/Tooltip.jsx +135 -131
  362. package/src/TooltipButton/TooltipButton.jsx +23 -27
  363. package/src/Typography/Typography.jsx +71 -47
  364. package/src/index.js +23 -2
  365. package/src/utils/a11y/index.js +1 -0
  366. package/src/utils/a11y/semantics.js +162 -0
  367. package/src/utils/children.jsx +119 -0
  368. package/src/utils/index.js +3 -0
  369. package/src/utils/info/platform/platform.js +1 -0
  370. package/src/utils/info/versions.js +2 -2
  371. package/src/utils/input.js +36 -25
  372. package/src/utils/pressability.js +4 -0
  373. package/src/utils/propTypes.js +199 -72
  374. package/src/utils/useCopy.js +30 -4
  375. package/src/utils/useHash.js +39 -0
  376. package/src/utils/useHash.native.js +6 -0
  377. package/stories/A11yText/A11yText.stories.jsx +6 -10
  378. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +1 -1
  379. package/stories/Box/Box.stories.jsx +1 -1
  380. package/stories/Button/Button.stories.jsx +2 -2
  381. package/stories/Button/ButtonGroup.stories.jsx +1 -1
  382. package/stories/Button/ButtonLink.stories.jsx +1 -1
  383. package/stories/Card/Card.stories.jsx +1 -1
  384. package/stories/Checkbox/Checkbox.stories.jsx +24 -1
  385. package/stories/Divider/Divider.stories.jsx +1 -1
  386. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +2 -2
  387. package/stories/Feedback/Feedback.stories.jsx +1 -1
  388. package/stories/FlexGrid/01 FlexGrid.stories.jsx +1 -1
  389. package/stories/FlexGrid/02 Row.stories.jsx +1 -1
  390. package/stories/FlexGrid/03 Col.stories.jsx +1 -1
  391. package/stories/Icon/Icon.stories.jsx +27 -7
  392. package/stories/IconButton/IconButton.stories.jsx +50 -0
  393. package/stories/InputLabel/InputLabel.stories.jsx +1 -1
  394. package/stories/Link/ChevronLink.stories.jsx +1 -1
  395. package/stories/Link/Link.stories.jsx +17 -21
  396. package/stories/Link/TextButton.stories.jsx +1 -1
  397. package/stories/List/List.stories.jsx +1 -1
  398. package/stories/Modal/Modal.stories.jsx +29 -0
  399. package/stories/Notification/Notification.stories.jsx +82 -0
  400. package/stories/Pagination/Pagination.stories.jsx +1 -1
  401. package/stories/Progress/Progress.stories.jsx +93 -0
  402. package/stories/Radio/Radio.stories.jsx +23 -36
  403. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  404. package/stories/Search/Search.stories.jsx +16 -0
  405. package/stories/Select/Select.stories.jsx +1 -1
  406. package/stories/SideNav/SideNav.stories.jsx +1 -1
  407. package/stories/SideNav/SideNavItem.stories.jsx +1 -1
  408. package/stories/SideNav/SideNavItemsGroup.stories.jsx +1 -1
  409. package/stories/Skeleton/Skeleton.stories.jsx +2 -2
  410. package/stories/Spacer/Spacer.stories.jsx +1 -1
  411. package/stories/StackView/StackView.stories.jsx +1 -1
  412. package/stories/StackView/StackWrap.stories.jsx +1 -1
  413. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  414. package/stories/Tabs/Tabs.stories.jsx +97 -0
  415. package/stories/Tags/Tags.stories.jsx +1 -1
  416. package/stories/TextInput/TextArea.stories.jsx +1 -1
  417. package/stories/TextInput/TextInput.stories.jsx +1 -1
  418. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +1 -1
  419. package/stories/Tooltip/Tooltip.stories.jsx +1 -1
  420. package/stories/TooltipButton/TooltipButton.stories.jsx +1 -1
  421. package/stories/Typography/Typography.stories.jsx +1 -1
  422. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  423. package/stories/supports.jsx +37 -3
  424. package/__fixtures__/accessible.icon.svg +0 -6
  425. package/babel.config.json +0 -8
  426. package/docs/Contributing.stories.mdx +0 -9
  427. package/docs/Fonts.stories.mdx +0 -104
  428. package/docs/Icons.stories.mdx +0 -144
  429. package/docs/Introduction.stories.mdx +0 -9
  430. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  431. package/lib/Checkbox/CheckboxInput.web.js +0 -57
  432. package/lib/InputLabel/LabelContent.web.js +0 -17
  433. package/lib/Link/InlinePressable.web.js +0 -32
  434. package/lib/Radio/RadioInput.web.js +0 -59
  435. package/lib/Select/Group.web.js +0 -18
  436. package/lib/Select/Item.web.js +0 -15
  437. package/lib/Select/Picker.web.js +0 -63
  438. package/lib/config/svgr-icons-web.js +0 -9
  439. package/lib/config/svgr-icons.js +0 -52
  440. package/lib/utils/info/platform/platform.web.js +0 -1
  441. package/src/InputLabel/LabelContent.web.jsx +0 -13
  442. package/src/Select/Picker.web.jsx +0 -67
  443. package/src/config/svgr-icons-web.js +0 -11
  444. package/src/config/svgr-icons.js +0 -46
  445. package/src/utils/info/platform/platform.web.js +0 -1
@@ -0,0 +1,114 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { Pressable, Platform, StyleSheet, View } from 'react-native'
4
+
5
+ import { applyOuterBorder, useThemeTokensCallback, applyShadowToken } from '../ThemeProvider'
6
+ import {
7
+ variantProp,
8
+ linkProps,
9
+ resolvePressableState,
10
+ hrefAttrsProp,
11
+ getTokensPropType,
12
+ selectTokens
13
+ } from '../utils'
14
+ import { a11yProps } from '../utils/propTypes'
15
+ import Icon from '../Icon'
16
+
17
+ const selectOuterStyle = ({
18
+ backgroundColor,
19
+ borderRadius,
20
+ outerBorderWidth,
21
+ outerBorderColor,
22
+ outerBorderGap,
23
+ shadow
24
+ }) => [
25
+ {
26
+ backgroundColor,
27
+ ...applyShadowToken(shadow),
28
+ ...applyOuterBorder({ borderRadius, outerBorderWidth, outerBorderColor, outerBorderGap }),
29
+ ...Platform.select({ web: { outline: 'none', display: 'inline-flex' } })
30
+ },
31
+ staticStyles.outer
32
+ ]
33
+
34
+ const selectInnerStyle = ({ borderColor, borderWidth = 0, borderRadius, padding = 0 }) => ({
35
+ // Inner borders animate with the icon and should be treated like a themable feature of the icon
36
+ borderColor,
37
+ borderRadius,
38
+ borderWidth,
39
+ padding: Math.max(0, padding - borderWidth) // Stable size as border changes
40
+ })
41
+
42
+ /**
43
+ * A pressable themeless base component that handles pressable states and passes tokens
44
+ * based on these to an outer border and a base Card component. Not intended to be used in
45
+ * apps or sites directly: build themed components on top of this.
46
+ */
47
+ const IconButton = forwardRef(
48
+ (
49
+ {
50
+ tokens,
51
+ variant,
52
+ icon: IconComponent,
53
+ href,
54
+ hrefAttrs,
55
+ onPress,
56
+ accessibilityRole = href ? 'link' : 'button',
57
+ ...rest
58
+ },
59
+ ref
60
+ ) => {
61
+ const a11y = a11yProps.select({
62
+ ...rest,
63
+ accessibilityRole
64
+ })
65
+ const handlePress = linkProps.handleHref({ href, onPress })
66
+
67
+ const getTokens = useThemeTokensCallback('IconButton', tokens, variant)
68
+ const getOuterStyle = (pressableState) =>
69
+ selectOuterStyle(getTokens(resolvePressableState(pressableState)))
70
+
71
+ return (
72
+ <Pressable
73
+ ref={ref}
74
+ href={href}
75
+ onPress={handlePress}
76
+ hrefAttrs={hrefAttrs}
77
+ style={getOuterStyle}
78
+ {...a11y}
79
+ >
80
+ {(pressableState) => {
81
+ const themeTokens = getTokens(resolvePressableState(pressableState))
82
+ return (
83
+ <View style={selectInnerStyle(themeTokens)}>
84
+ <Icon
85
+ icon={IconComponent}
86
+ title={a11y.accessibilityLabel}
87
+ tokens={selectTokens('Icon', themeTokens, 'icon')}
88
+ />
89
+ </View>
90
+ )
91
+ }}
92
+ </Pressable>
93
+ )
94
+ }
95
+ )
96
+ IconButton.displayName = 'IconButton'
97
+
98
+ IconButton.propTypes = {
99
+ ...a11yProps.types,
100
+ variant: variantProp.propType,
101
+ tokens: getTokensPropType('IconButton'),
102
+ icon: PropTypes.elementType.isRequired,
103
+ href: PropTypes.string,
104
+ hrefAttrs: PropTypes.shape(hrefAttrsProp.types),
105
+ onPress: PropTypes.func
106
+ }
107
+
108
+ const staticStyles = StyleSheet.create({
109
+ outer: {
110
+ alignSelf: 'flex-start'
111
+ }
112
+ })
113
+
114
+ export default IconButton
@@ -0,0 +1,3 @@
1
+ import IconButton from './IconButton'
2
+
3
+ export default IconButton
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import { StyleSheet, Text, View } from 'react-native'
3
3
  import PropTypes from 'prop-types'
4
4
 
@@ -27,52 +27,71 @@ const selectHintStyles = ({
27
27
 
28
28
  const selectGapStyles = ({ gap }) => ({ marginRight: gap })
29
29
 
30
- function InputLabel({
31
- label,
32
- forId,
33
- hint,
34
- hintPosition = 'inline',
35
- hintId,
36
- tooltip,
37
- tokens,
38
- variant
39
- }) {
40
- const themeTokens = useThemeTokens('InputLabel', tokens, variant)
30
+ const InputLabel = forwardRef(
31
+ ({ label, forId, hint, hintPosition = 'inline', hintId, tooltip, tokens, variant }, ref) => {
32
+ const themeTokens = useThemeTokens('InputLabel', tokens, variant)
41
33
 
42
- const hasTooltip = tooltip !== undefined
43
- const isHintInline = hintPosition === 'inline'
34
+ const hasTooltip = tooltip !== undefined
35
+ const isHintInline = hintPosition === 'inline'
44
36
 
45
- return (
46
- <View style={[staticStyles.container, !isHintInline && staticStyles.containerWithHintBelow]}>
47
- <Text
48
- style={[selectLabelStyles(themeTokens), selectGapStyles(themeTokens), staticStyles.label]}
37
+ return (
38
+ <View
39
+ ref={ref}
40
+ style={[staticStyles.container, !isHintInline && staticStyles.containerWithHintBelow]}
49
41
  >
50
- <LabelContent forId={forId}>{label}</LabelContent>
51
- </Text>
52
- {hint && isHintInline && (
53
42
  <Text
54
- style={[selectHintStyles(themeTokens), hasTooltip && selectGapStyles(themeTokens)]}
55
- nativeID={hintId}
43
+ style={[selectLabelStyles(themeTokens), selectGapStyles(themeTokens), staticStyles.label]}
56
44
  >
57
- {hint}
45
+ <LabelContent forId={forId}>{label}</LabelContent>
58
46
  </Text>
59
- )}
60
- {hasTooltip && <Tooltip content={tooltip} />}
61
- {hint && !isHintInline && (
62
- <Text style={[selectHintStyles(themeTokens), staticStyles.hintBelow]} nativeID={hintId}>
63
- {hint}
64
- </Text>
65
- )}
66
- </View>
67
- )
68
- }
47
+ {hint && isHintInline && (
48
+ <Text
49
+ style={[selectHintStyles(themeTokens), hasTooltip && selectGapStyles(themeTokens)]}
50
+ nativeID={hintId}
51
+ >
52
+ {hint}
53
+ </Text>
54
+ )}
55
+ {hasTooltip && (
56
+ <View style={staticStyles.tooltipAlign}>
57
+ <Tooltip content={tooltip} />
58
+ </View>
59
+ )}
60
+ {hint && !isHintInline && (
61
+ <Text style={[selectHintStyles(themeTokens), staticStyles.hintBelow]} nativeID={hintId}>
62
+ {hint}
63
+ </Text>
64
+ )}
65
+ </View>
66
+ )
67
+ }
68
+ )
69
+ InputLabel.displayName = 'InputLabel'
69
70
 
70
71
  InputLabel.propTypes = {
72
+ /**
73
+ * The input label.
74
+ */
71
75
  label: PropTypes.string.isRequired,
76
+ /**
77
+ * The id attribute of the input which this label refers to.
78
+ */
72
79
  forId: PropTypes.string,
80
+ /**
81
+ * A short description of the expected input.
82
+ */
73
83
  hint: PropTypes.string,
84
+ /**
85
+ * Position of the hint relative to label. Use `below` to display a larger hint below the label.
86
+ */
74
87
  hintPosition: PropTypes.oneOf(['inline', 'below']),
88
+ /**
89
+ * The id attribute passed down to the hint element.
90
+ */
75
91
  hintId: PropTypes.string,
92
+ /**
93
+ * Content of an optional `Tooltip`. If set, a tooltip button will be shown next to the label.
94
+ */
76
95
  tooltip: PropTypes.string,
77
96
  tokens: getTokensPropType('InputLabel'),
78
97
  variant: variantProp.propType
@@ -84,7 +103,7 @@ const staticStyles = StyleSheet.create({
84
103
  container: {
85
104
  display: 'flex',
86
105
  flexDirection: 'row',
87
- alignItems: 'center'
106
+ alignItems: 'baseline'
88
107
  },
89
108
  containerWithHintBelow: {
90
109
  flexWrap: 'wrap'
@@ -95,5 +114,8 @@ const staticStyles = StyleSheet.create({
95
114
  hintBelow: {
96
115
  flexBasis: '100%',
97
116
  flexShrink: 0
117
+ },
118
+ tooltipAlign: {
119
+ alignSelf: 'center'
98
120
  }
99
121
  })
@@ -0,0 +1,21 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+
4
+ const LabelContent = forwardRef(({ children, forId }, ref) => (
5
+ <label ref={ref} htmlFor={forId} style={staticStyles.inheritCursor}>
6
+ {children}
7
+ </label>
8
+ ))
9
+ LabelContent.displayName = 'LabelContent'
10
+
11
+ LabelContent.propTypes = {
12
+ children: PropTypes.string,
13
+ forId: PropTypes.string
14
+ }
15
+
16
+ // Note that <label> is not React Native, so we can't use `StyleSheet.create` here
17
+ const staticStyles = {
18
+ inheritCursor: { cursor: 'inherit' }
19
+ }
20
+
21
+ export default LabelContent
@@ -1,6 +1,15 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { View } from 'react-native'
4
+
1
5
  // Since there's no equivalent for web's <label> element we're simply rendering whatever is passed to this component.
2
- function LabelContent({ children }) {
3
- return children
6
+ const LabelContent = forwardRef(({ children }, ref) =>
7
+ ref ? <View ref={ref}>{children}</View> : children
8
+ )
9
+ LabelContent.displayName = 'LabelContent'
10
+
11
+ LabelContent.propTypes = {
12
+ children: PropTypes.node
4
13
  }
5
14
 
6
15
  export default LabelContent
@@ -1,58 +1,42 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
 
3
3
  import PropTypes from 'prop-types'
4
4
  import InputLabel from '../InputLabel'
5
5
  import Feedback from '../Feedback'
6
6
  import StackView from '../StackView'
7
7
  import { useThemeTokens } from '../ThemeProvider'
8
- import useUniqueId from '../utils/useUniqueId'
8
+ import useInputSupports from './useInputSupports'
9
9
 
10
- const joinDefined = (array) => array.filter((item) => item !== undefined).join(' ')
10
+ const InputSupports = forwardRef(
11
+ ({ children, label, hint, hintPosition = 'inline', feedback, tooltip, validation }, ref) => {
12
+ const { space } = useThemeTokens('InputSupports')
11
13
 
12
- function InputSupports({
13
- children,
14
- label,
15
- hint,
16
- hintPosition = 'inline',
17
- feedback,
18
- tooltip,
19
- validation
20
- }) {
21
- const { space } = useThemeTokens('InputSupports')
14
+ const { inputId, hintId, feedbackId, a11yProps } = useInputSupports({
15
+ feedback,
16
+ hint,
17
+ label,
18
+ validation
19
+ })
22
20
 
23
- const hasValidationError = validation === 'error'
24
-
25
- const inputId = useUniqueId('input')
26
- const hintId = useUniqueId('input-hint')
27
- const feedbackId = useUniqueId('input-feedback')
28
-
29
- const a11yProps = {
30
- accessibilityLabel: label,
31
- accessibilityHint: joinDefined([!hasValidationError && feedback, hint]), // native only -> replaced with describedBy on web
32
- accessibilityDescribedBy: joinDefined([
33
- !hasValidationError && feedback && feedbackId, // feedback receives a11yRole=alert on error, so there's no need to include it here
34
- hint && hintId
35
- ]), // introduced in RNW 0.15.0
36
- accessibilityInvalid: hasValidationError // introduced in RNW 0.15.0
21
+ return (
22
+ <StackView space={space} ref={ref}>
23
+ {label && (
24
+ <InputLabel
25
+ label={label}
26
+ hint={hint}
27
+ hintPosition={hintPosition}
28
+ hintId={hintId}
29
+ tooltip={tooltip}
30
+ forId={inputId}
31
+ />
32
+ )}
33
+ {typeof children === 'function' ? children({ a11yProps, inputId }) : children}
34
+ {feedback && <Feedback id={feedbackId} title={feedback} validation={validation} />}
35
+ </StackView>
36
+ )
37
37
  }
38
-
39
- return (
40
- <StackView space={space}>
41
- {label && (
42
- <InputLabel
43
- label={label}
44
- hint={hint}
45
- hintPosition={hintPosition}
46
- hintId={hintId}
47
- tooltip={tooltip}
48
- forId={inputId}
49
- />
50
- )}
51
- {typeof children === 'function' ? children({ a11yProps, inputId }) : children}
52
- {feedback && <Feedback id={feedbackId} title={feedback} validation={validation} />}
53
- </StackView>
54
- )
55
- }
38
+ )
39
+ InputSupports.displayName = 'InputSupports'
56
40
 
57
41
  InputSupports.propTypes = {
58
42
  children: PropTypes.oneOfType([PropTypes.func, PropTypes.node]),
@@ -0,0 +1,30 @@
1
+ import useUniqueId from '../utils/useUniqueId'
2
+
3
+ const joinDefined = (array) => array.filter((item) => item !== undefined).join(' ')
4
+
5
+ const useInputSupports = ({ label, feedback, validation, hint }) => {
6
+ const hasValidationError = validation === 'error'
7
+
8
+ const inputId = useUniqueId('input')
9
+ const hintId = useUniqueId('input-hint')
10
+ const feedbackId = useUniqueId('input-feedback')
11
+
12
+ const a11yProps = {
13
+ accessibilityLabel: label,
14
+ accessibilityHint: joinDefined([!hasValidationError && feedback, hint]), // native only -> replaced with describedBy on web
15
+ accessibilityDescribedBy: joinDefined([
16
+ !hasValidationError && feedback && feedbackId, // feedback receives a11yRole=alert on error, so there's no need to include it here
17
+ hint && hintId
18
+ ]),
19
+ accessibilityInvalid: hasValidationError
20
+ }
21
+
22
+ return {
23
+ inputId,
24
+ hintId,
25
+ feedbackId,
26
+ a11yProps
27
+ }
28
+ }
29
+
30
+ export default useInputSupports
@@ -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 { useThemeTokensCallback } from '../ThemeProvider'
@@ -11,24 +11,34 @@ import LinkBase from './LinkBase'
11
11
  *
12
12
  * ChevronLink is not intended to be deeply themable; variants passed to ChevronLink are forwarded to Link.
13
13
  */
14
- const ChevronLink = ({ direction = 'right', children, tokens, variant, ...linkProps }) => {
15
- const getChevronTokens = useThemeTokensCallback('ChevronLink', tokens, variant)
16
- const applyChevronTokens = (linkState) => {
17
- const { leftIcon, rightIcon, iconDisplace, ...otherTokens } = getChevronTokens(linkState)
18
- return {
19
- ...selectTokens('Link', otherTokens),
20
- icon: direction === 'right' ? rightIcon : leftIcon,
21
- iconTranslateX: iconDisplace * (direction === 'right' ? 1 : -1) || 0
14
+ const ChevronLink = forwardRef(
15
+ ({ direction = 'right', children, tokens, variant, dataSet, ...linkProps }, ref) => {
16
+ const getChevronTokens = useThemeTokensCallback('ChevronLink', tokens, variant)
17
+ const applyChevronTokens = (linkState) => {
18
+ const { leftIcon, rightIcon, iconDisplace, ...otherTokens } = getChevronTokens(linkState)
19
+ return {
20
+ ...selectTokens('Link', otherTokens),
21
+ icon: direction === 'right' ? rightIcon : leftIcon,
22
+ iconTranslateX: iconDisplace * (direction === 'right' ? 1 : -1) || 0
23
+ }
22
24
  }
25
+
26
+ const getTokens = useThemeTokensCallback('Link', applyChevronTokens, variant)
27
+ return (
28
+ <LinkBase
29
+ {...linkProps}
30
+ iconPosition={direction}
31
+ tokens={getTokens}
32
+ dataSet={dataSet}
33
+ ref={ref}
34
+ >
35
+ {children}
36
+ </LinkBase>
37
+ )
23
38
  }
39
+ )
24
40
 
25
- const getTokens = useThemeTokensCallback('Link', applyChevronTokens, variant)
26
- return (
27
- <LinkBase {...linkProps} iconPosition={direction} tokens={getTokens}>
28
- {children}
29
- </LinkBase>
30
- )
31
- }
41
+ ChevronLink.displayName = 'ChevronLink'
32
42
  ChevronLink.propTypes = {
33
43
  ...LinkBase.propTypes,
34
44
  tokens: getTokensPropType('ChevronLink', 'Link'),
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import { Pressable, StyleSheet } from 'react-native'
3
3
 
4
4
  /**
@@ -15,8 +15,9 @@ import { Pressable, StyleSheet } from 'react-native'
15
15
  */
16
16
  // React Native exports prop Types but not propTypes, use JSDoc types here rather than duplicate RN
17
17
  // eslint-disable-next-line react/prop-types
18
- const InlinePressable = ({ children, style, ...props }) => (
18
+ const InlinePressable = forwardRef(({ children, style, ...props }, ref) => (
19
19
  <Pressable
20
+ ref={ref}
20
21
  style={(pressState) => [
21
22
  staticStyles.inline,
22
23
  typeof style === 'function' ? style(pressState) : style
@@ -25,7 +26,8 @@ const InlinePressable = ({ children, style, ...props }) => (
25
26
  >
26
27
  {(pressState) => (typeof children === 'function' ? children(pressState) : children)}
27
28
  </Pressable>
28
- )
29
+ ))
30
+ InlinePressable.displayName = 'InlinePressable'
29
31
 
30
32
  const staticStyles = StyleSheet.create({
31
33
  inline: {
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable camelcase */
2
- import React, { useState } from 'react'
2
+ import React, { forwardRef, useState } from 'react'
3
3
  import { Text, TouchableWithoutFeedback } from 'react-native'
4
4
 
5
5
  /**
@@ -38,7 +38,7 @@ const pressablePropsToTouchable = ({
38
38
  */
39
39
  // React Native exports prop Types but not propTypes, use JSDoc types here rather than duplicate RN
40
40
  // eslint-disable-next-line react/prop-types
41
- const InlinePressable = ({ onPress, children, style, ...rest }) => {
41
+ const InlinePressable = forwardRef(({ onPress, children, style, ...rest }, ref) => {
42
42
  const [isFocused, setIsFocused] = useState(false)
43
43
  const handleFocus = () => setIsFocused(true)
44
44
  const handleBlur = () => setIsFocused(false)
@@ -61,6 +61,7 @@ const InlinePressable = ({ onPress, children, style, ...rest }) => {
61
61
  onPressOut={handlePressOut}
62
62
  onFocus={handleFocus}
63
63
  onBlur={handleBlur}
64
+ ref={ref}
64
65
  {...pressablePropsToTouchable(rest)}
65
66
  >
66
67
  <Text style={currentStyle}>
@@ -68,6 +69,7 @@ const InlinePressable = ({ onPress, children, style, ...rest }) => {
68
69
  </Text>
69
70
  </TouchableWithoutFeedback>
70
71
  )
71
- }
72
+ })
73
+ InlinePressable.displayName = 'InlinePressable'
72
74
 
73
75
  export default InlinePressable
package/src/Link/Link.jsx CHANGED
@@ -1,23 +1,29 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
 
3
3
  import { useThemeTokensCallback } from '../ThemeProvider'
4
4
  import LinkBase from './LinkBase'
5
5
 
6
- const Link = ({
7
- href,
8
- children,
9
- accessibilityRole = 'link',
10
- variant = {},
11
- tokens,
12
- ...linkProps
13
- }) => {
14
- const getTokens = useThemeTokensCallback('Link', tokens, variant)
15
- return (
16
- <LinkBase href={href} accessibilityRole={accessibilityRole} tokens={getTokens} {...linkProps}>
17
- {children}
18
- </LinkBase>
19
- )
20
- }
6
+ const Link = forwardRef(
7
+ (
8
+ { href, children, accessibilityRole = 'link', variant = {}, tokens, dataSet, ...linkProps },
9
+ ref
10
+ ) => {
11
+ const getTokens = useThemeTokensCallback('Link', tokens, variant)
12
+ return (
13
+ <LinkBase
14
+ href={href}
15
+ accessibilityRole={accessibilityRole}
16
+ tokens={getTokens}
17
+ ref={ref}
18
+ dataSet={dataSet}
19
+ {...linkProps}
20
+ >
21
+ {children}
22
+ </LinkBase>
23
+ )
24
+ }
25
+ )
26
+ Link.displayName = 'Link'
21
27
 
22
28
  Link.propTypes = LinkBase.propTypes
23
29