@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,123 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { Platform, StyleSheet, View } from 'react-native'
4
+
5
+ import ProgressBarBackground from './ProgressBarBackground'
6
+ import { a11yProps } from '../utils/propTypes'
7
+ import { useThemeTokens } from '../ThemeProvider'
8
+ import { getTokensPropType, variantProp } from '../utils'
9
+
10
+ const selectBarStyles = (
11
+ { backgroundColor, borderRadius, outlineWidth, outlineColor },
12
+ percentage
13
+ ) => ({
14
+ backgroundColor,
15
+ borderRadius,
16
+ outlineWidth,
17
+ outlineColor,
18
+ width: `${percentage}%`
19
+ })
20
+
21
+ /**
22
+ * The `ProgressBar` is a visual representation of linear progression.
23
+ * It provides simple but important information at a quick glance.
24
+ *
25
+ * ## Props
26
+ *
27
+ * - Use `percentage` prop to indicate completion
28
+ *
29
+ * ## Tokens
30
+ *
31
+ * - Use the following tokens to customize the appearance:
32
+ * - `backgroundColor` for the background color of the progress bar,
33
+ * - `borderRadius` for the rounded corners,
34
+ * - `outlineColor` to control the color of the border (outline),
35
+ * - `outlineWidth` to change the outline width.
36
+ *
37
+ * ## Variants
38
+ *
39
+ * - Use the following variants to render specific types of progress bars:
40
+ * - `negative`: set to `true` if you wish to use the negative theming for progress bar filling,
41
+ * - `inactive`: set to `true` if you wish to style the progress bar as inactive.
42
+ *
43
+ * ## Usability and A11y guidelines
44
+ *
45
+ * `ProgressBar` component accepts all the standard accessibility properties including the ones that
46
+ * are specific to the `progressbar` role. By default the following props are used:
47
+ *
48
+ * - `accessibilityRole` (`role`): `progressbar`,
49
+ * - `accessibilityValue.min` (`aria-valuemin`): `0`,
50
+ * - `accessibilityValue.max` (`aria-valuemax`): `100`,
51
+ * - `accessibilityValue.now` (`aria-valuenow`): `percentage`,
52
+ * - `accessibilityValue.text` (`aria-valuetext`): `%{percentage}%`,
53
+ *
54
+ */
55
+ const ProgressBar = forwardRef(
56
+ ({ children = null, percentage = 0, tokens, variant, ...rest }, ref) => {
57
+ const themeTokens = useThemeTokens('ProgressBar', tokens, variant)
58
+ if (percentage < 0) {
59
+ throw new Error('ProgressBar: `percentage` must be a positive number')
60
+ } else if (percentage > 100) {
61
+ throw new Error('ProgressBar: `percentage` cannot exceed 100')
62
+ }
63
+ const accessibilityProps = {
64
+ accessibilityRole: 'progressbar',
65
+ accessibilityValue: {
66
+ min: 0,
67
+ max: 100,
68
+ now: percentage,
69
+ text: `${percentage}%`
70
+ },
71
+ ...a11yProps.select(rest)
72
+ }
73
+
74
+ return percentage > 0 ? (
75
+ <View
76
+ ref={ref}
77
+ style={[staticStyles.bar, selectBarStyles(themeTokens, percentage)]}
78
+ {...accessibilityProps}
79
+ >
80
+ {children ?? <ProgressBarBackground variant={variant} />}
81
+ </View>
82
+ ) : null
83
+ }
84
+ )
85
+ ProgressBar.displayName = 'ProgressBar'
86
+
87
+ ProgressBar.propTypes = {
88
+ /**
89
+ * Optional children that can be used to customize the progress bar filling.
90
+ */
91
+ children: PropTypes.node,
92
+ /**
93
+ * Accessibility label for the progress bar.
94
+ */
95
+ accessibilityLabel: PropTypes.string.isRequired,
96
+ /**
97
+ * Percentage of completion.
98
+ */
99
+ percentage: PropTypes.number,
100
+ /**
101
+ * Progress bar tokens.
102
+ */
103
+ tokens: getTokensPropType('ProgressBar'),
104
+ /**
105
+ * Progress bar variant.
106
+ */
107
+ variant: variantProp.propType
108
+ }
109
+
110
+ export default ProgressBar
111
+
112
+ const staticStyles = StyleSheet.create({
113
+ bar: {
114
+ height: '100%',
115
+ overflow: 'hidden',
116
+ position: 'absolute',
117
+ ...Platform.select({
118
+ web: {
119
+ outlineStyle: 'solid'
120
+ }
121
+ })
122
+ }
123
+ })
@@ -0,0 +1,36 @@
1
+ import React, { forwardRef } from 'react'
2
+ import { ImageBackground, StyleSheet } from 'react-native'
3
+
4
+ import { variantProp } from '../utils'
5
+
6
+ const inactiveBackground = `%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='24'%3E%3Cdefs%3E%3Cpattern id='DisabledProgress7' patternUnits='userSpaceOnUse' width='8' height='8'%3E%3Crect width='8' height='8' fill='%23B2B9BF'%3E%3C/rect%3E%3Ccircle cx='4' cy='4' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3Ccircle cx='0' cy='0' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3Ccircle cx='0' cy='8' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3Ccircle cx='8' cy='0' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3Ccircle cx='8' cy='8' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3C/pattern%3E%3C/defs%3E%3Cpath d='M 0 0 L 0 140 L 2000 2000 L 2000 0 Z' style='fill: url(&quot;%23DisabledProgress7&quot;);'%3E%3C/path%3E%3C/svg%3E`
7
+ const negativeBackground = `%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='24'%3E%3Cdefs%3E%3Cpattern id='NegativeProgress6' patternUnits='userSpaceOnUse' width='8' height='8'%3E%3Crect width='8' height='8' fill='%23C12335'%3E%3C/rect%3E%3Cpath d='M 0,8 l 8,-8 M -2,2 l 4,-4 M 6,10 l 4,-4' stroke-width='2' shape-rendering='auto' stroke='%23e7adb4' stroke-linecap='square'%3E%3C/path%3E%3C/pattern%3E%3C/defs%3E%3Cpath d='M 0 0 L 0 140 L 2000 2000 L 2000 0 Z' style='fill: url(&quot;%23NegativeProgress6&quot;);'%3E%3C/path%3E%3C/svg%3E`
8
+ const ProgressBarBackground = forwardRef(({ variant }, ref) => {
9
+ let source = null
10
+ if (variant?.inactive) {
11
+ source = inactiveBackground
12
+ } else if (variant?.negative) {
13
+ source = negativeBackground
14
+ } else {
15
+ return null
16
+ }
17
+ return (
18
+ <ImageBackground
19
+ ref={ref}
20
+ source={{ uri: `data:image/svg+xml,${source}` }}
21
+ style={staticStyles.imageBackground}
22
+ />
23
+ )
24
+ })
25
+ ProgressBarBackground.displayName = 'ProgressBarBackground'
26
+
27
+ ProgressBarBackground.propTypes = {
28
+ /**
29
+ * Progress bar variant.
30
+ */
31
+ variant: variantProp.propType
32
+ }
33
+
34
+ export default ProgressBarBackground
35
+
36
+ const staticStyles = StyleSheet.create({ imageBackground: { height: '100%' } })
@@ -0,0 +1,6 @@
1
+ import Progress from './Progress'
2
+ import ProgressBar from './ProgressBar'
3
+
4
+ Progress.Bar = ProgressBar
5
+
6
+ export default Progress
@@ -1,26 +1,19 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { Pressable, StyleSheet, Text, View } from 'react-native'
4
4
 
5
- import RadioInput from './RadioInput'
6
5
  // @todo move `LabelContent` outside of the `InputLabel` and fix
7
6
  // the issue with the cursor not being pointer on Web
8
7
  import RadioLabel from '../InputLabel/LabelContent'
8
+ import RadioButton, { selectRadioButtonTokens } from './RadioButton'
9
9
  import { applyShadowToken, applyTextStyles, useThemeTokensCallback } from '../ThemeProvider'
10
10
  import { getTokensPropType, useInputValue, useUniqueId, variantProp } from '../utils'
11
11
  import { a11yProps } from '../utils/propTypes'
12
12
  import StackView from '../StackView'
13
13
 
14
- const selectCheckedStyles = ({ checkedBackgroundColor, checkedSize }) => ({
15
- backgroundColor: checkedBackgroundColor,
16
- borderRadius: checkedSize / 2,
17
- height: checkedSize,
18
- width: checkedSize
19
- })
20
14
  const selectContainerStyles = ({
21
15
  containerBackgroundColor,
22
16
  containerBorderRadius,
23
- containerMarginBottom,
24
17
  containerOpacity,
25
18
  containerPaddingBottom,
26
19
  containerPaddingLeft,
@@ -30,7 +23,6 @@ const selectContainerStyles = ({
30
23
  }) => ({
31
24
  backgroundColor: containerBackgroundColor,
32
25
  borderRadius: containerBorderRadius,
33
- marginBottom: containerMarginBottom,
34
26
  opacity: containerOpacity,
35
27
  paddingBottom: containerPaddingBottom,
36
28
  paddingLeft: containerPaddingLeft,
@@ -49,24 +41,6 @@ const selectDescriptionStyles = ({
49
41
  marginLeft: descriptionMarginLeft ?? containerPaddingLeft + inputSize + labelMarginLeft,
50
42
  ...applyTextStyles({ fontSize: descriptionFontSize, lineHeight: descriptionLineHeight })
51
43
  })
52
- const selectInputStyles = ({
53
- inputBackgroundColor,
54
- inputBorderColor,
55
- inputBorderWidth,
56
- inputOutlineColor,
57
- inputOutlineWidth,
58
- inputSize
59
- }) => ({
60
- borderColor: inputBorderColor,
61
- borderRadius: inputSize / 2,
62
- borderWidth: inputBorderWidth,
63
- backgroundColor: inputBackgroundColor,
64
- height: inputSize,
65
- outlineStyle: 'solid',
66
- outlineColor: inputOutlineColor,
67
- outlineWidth: inputOutlineWidth,
68
- width: inputSize
69
- })
70
44
  const selectLabelStyles = ({
71
45
  labelColor,
72
46
  labelFontName,
@@ -116,99 +90,96 @@ const selectLabelStyles = ({
116
90
  * or the internal state in case of uncontrolled radio button.
117
91
  *
118
92
  */
119
- const Radio = ({
120
- checked,
121
- defaultChecked,
122
- description,
123
- error = false,
124
- id,
125
- inactive,
126
- label,
127
- name,
128
- onChange,
129
- tokens,
130
- value,
131
- variant,
132
- ...rest
133
- }) => {
134
- const { currentValue: isChecked, setValue: setIsChecked, isControlled } = useInputValue(
93
+ const Radio = forwardRef(
94
+ (
135
95
  {
136
- value: checked,
137
- initialValue: defaultChecked,
138
- onChange
96
+ checked,
97
+ defaultChecked,
98
+ description,
99
+ error = false,
100
+ id,
101
+ inactive,
102
+ label,
103
+ name: inputName,
104
+ onChange,
105
+ tokens,
106
+ value,
107
+ variant,
108
+ ...rest
139
109
  },
140
- 'useRadioValue'
141
- )
142
- const getTokens = useThemeTokensCallback('Radio', tokens, {
143
- checked: isChecked,
144
- inactive,
145
- error,
146
- ...variant
147
- })
148
- const handleChange = () => {
149
- if (!inactive && !isChecked) {
150
- setIsChecked(true)
110
+ ref
111
+ ) => {
112
+ const { currentValue: isChecked, setValue: setIsChecked, isControlled } = useInputValue(
113
+ {
114
+ value: checked,
115
+ initialValue: defaultChecked,
116
+ onChange
117
+ },
118
+ 'useRadioValue'
119
+ )
120
+ const getTokens = useThemeTokensCallback('Radio', tokens, {
121
+ checked: isChecked,
122
+ inactive,
123
+ error,
124
+ ...variant
125
+ })
126
+ const handleChange = (event) => {
127
+ if (!inactive && !isChecked) {
128
+ setIsChecked(true, event)
129
+ }
151
130
  }
152
- }
153
- const accessibilityProps = a11yProps.select(rest)
154
- const uniqueId = useUniqueId('radio')
155
- const inputId = id ?? uniqueId
131
+ const handleKeyDown = (event) => {
132
+ // The expected keyboard shortcut for activating a radio is the Space key
133
+ if (event?.key === ' ') handleChange(event)
134
+ }
135
+ const accessibilityProps = a11yProps.select(rest)
136
+ const uniqueId = useUniqueId('radio')
137
+ const inputId = id ?? uniqueId
156
138
 
157
- // @todo our current version of React Native Web doesn't include
158
- // keyboard support on `Pressable` (which starts with 0.15.3), so
159
- // the complete accessibility of the `Radio` component on Web
160
- // (namely, change on key pressed) is pending RNW upgrade
161
- // (see https://github.com/necolas/react-native-web/issues/1950)
162
- return (
163
- <Pressable
164
- disabled={inactive}
165
- onPress={handleChange}
166
- accessibilityRole="radio"
167
- accessibilityState={{ checked: isChecked, disabled: inactive }}
168
- {...accessibilityProps}
169
- >
170
- {({ focused: focus, hovered: hover, pressed }) => {
171
- const stateTokens = getTokens({ focus, hover, pressed })
139
+ return (
140
+ <Pressable
141
+ ref={ref}
142
+ disabled={inactive}
143
+ onKeyDown={handleKeyDown}
144
+ onPress={handleChange}
145
+ accessibilityRole="radio"
146
+ accessibilityState={{ checked: isChecked, disabled: inactive }}
147
+ {...accessibilityProps}
148
+ >
149
+ {({ focused: focus, hovered: hover, pressed }) => {
150
+ const stateTokens = getTokens({ focus, hover, pressed })
172
151
 
173
- return (
174
- <StackView space={0}>
175
- <View style={[staticStyles.container, selectContainerStyles(stateTokens)]}>
176
- <View
177
- style={StyleSheet.flatten([
178
- staticStyles.defaultInputStyles,
179
- selectInputStyles(stateTokens, isChecked)
180
- ])}
181
- testID="Radio-Input"
182
- >
183
- {/* Add a real input on Web, skip on native platforms */}
184
- <RadioInput
185
- checked={isChecked}
186
- defaultChecked={defaultChecked}
187
- disabled={inactive}
188
- id={inputId}
152
+ return (
153
+ <StackView space={0}>
154
+ <View style={[staticStyles.container, selectContainerStyles(stateTokens)]}>
155
+ <RadioButton
156
+ tokens={selectRadioButtonTokens(stateTokens)}
189
157
  isControlled={isControlled}
190
- name={name}
158
+ isChecked={isChecked}
159
+ inactive={inactive}
160
+ defaultChecked={defaultChecked}
161
+ inputId={inputId}
162
+ handleChange={handleChange}
163
+ name={inputName}
191
164
  value={value}
192
165
  />
193
- {isChecked && (
194
- <View style={selectCheckedStyles(stateTokens)} testID="Radio-Checked" />
166
+ {Boolean(label) && (
167
+ <Text style={selectLabelStyles(stateTokens)}>
168
+ <RadioLabel forId={inputId}>{label}</RadioLabel>
169
+ </Text>
195
170
  )}
196
171
  </View>
197
- {Boolean(label) && (
198
- <Text style={selectLabelStyles(stateTokens)}>
199
- <RadioLabel forId={inputId}>{label}</RadioLabel>
200
- </Text>
172
+ {Boolean(description) && (
173
+ <Text style={selectDescriptionStyles(getTokens())}>{description}</Text>
201
174
  )}
202
- </View>
203
- {Boolean(description) && (
204
- <Text style={selectDescriptionStyles(getTokens())}>{description}</Text>
205
- )}
206
- </StackView>
207
- )
208
- }}
209
- </Pressable>
210
- )
211
- }
175
+ </StackView>
176
+ )
177
+ }}
178
+ </Pressable>
179
+ )
180
+ }
181
+ )
182
+ Radio.displayName = 'Radio'
212
183
 
213
184
  Radio.propTypes = {
214
185
  ...a11yProps.propTypes,
@@ -265,6 +236,5 @@ Radio.propTypes = {
265
236
  export default Radio
266
237
 
267
238
  const staticStyles = StyleSheet.create({
268
- container: { flexDirection: 'row', alignItems: 'center' },
269
- defaultInputStyles: { alignItems: 'center', justifyContent: 'center' }
239
+ container: { flexDirection: 'row', alignItems: 'center' }
270
240
  })
@@ -0,0 +1,142 @@
1
+ import React, { forwardRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { Platform, StyleSheet, View } from 'react-native'
4
+
5
+ import RadioInput from './RadioInput'
6
+ import { applyOuterBorder, resolveThemeTokens, validateThemeTokens } from '../ThemeProvider'
7
+ import { getTokensSetPropType, selectTokens } from '../utils'
8
+
9
+ // TODO: roll out a standard approach to token sets
10
+ // https://github.com/telus/universal-design-system/issues/782
11
+ const tokenKeys = [
12
+ 'checkedBackgroundColor',
13
+ 'checkedSize',
14
+ 'inputBackgroundColor',
15
+ 'inputBorderColor',
16
+ 'inputBorderWidth',
17
+ 'inputOutlineColor',
18
+ 'inputOutlineWidth',
19
+ 'inputSize',
20
+ 'outerBorderColor',
21
+ 'outerBorderWidth',
22
+ 'outerBorderGap',
23
+ 'inputSize'
24
+ ]
25
+
26
+ export const selectRadioButtonTokens = (themeTokens, prefix) =>
27
+ selectTokens(tokenKeys, themeTokens, prefix)
28
+
29
+ const getBorderRadius = (inputSize) => inputSize / 2
30
+
31
+ const selectCheckedStyles = ({ checkedBackgroundColor, checkedSize }) => ({
32
+ backgroundColor: checkedBackgroundColor,
33
+ borderRadius: checkedSize / 2,
34
+ height: checkedSize,
35
+ width: checkedSize
36
+ })
37
+
38
+ const selectInputStyles = ({
39
+ inputBackgroundColor,
40
+ inputBorderColor,
41
+ inputBorderWidth,
42
+ inputOutlineColor,
43
+ inputOutlineWidth,
44
+ inputSize
45
+ }) => ({
46
+ borderColor: inputBorderColor,
47
+ borderRadius: getBorderRadius(inputSize),
48
+ borderWidth: inputBorderWidth,
49
+ backgroundColor: inputBackgroundColor,
50
+ height: inputSize,
51
+ width: inputSize,
52
+ ...Platform.select({
53
+ web: {
54
+ outlineStyle: 'solid',
55
+ outlineColor: inputOutlineColor,
56
+ outlineWidth: inputOutlineWidth
57
+ }
58
+ })
59
+ })
60
+
61
+ const selectOuterBorderStyles = ({
62
+ outerBorderColor,
63
+ outerBorderWidth,
64
+ outerBorderGap,
65
+ inputSize
66
+ }) => ({
67
+ ...applyOuterBorder({
68
+ outerBorderColor,
69
+ outerBorderWidth,
70
+ outerBorderGap,
71
+ borderRadius: getBorderRadius(inputSize)
72
+ })
73
+ })
74
+
75
+ /**
76
+ * The visual toggle of a radio input. Is not interactive on its own, should be used inside
77
+ * an interactive parent that passes down props when interacted with.
78
+ */
79
+ const RadioButton = forwardRef(
80
+ (
81
+ {
82
+ isChecked,
83
+ tokens,
84
+ inactive,
85
+ defaultChecked,
86
+ inputId,
87
+ isControlled,
88
+ handleChange,
89
+ name: inputName,
90
+ value
91
+ },
92
+ ref
93
+ ) => {
94
+ const themeTokens = validateThemeTokens(
95
+ resolveThemeTokens(tokens, { checked: isChecked }),
96
+ getTokensSetPropType(tokenKeys),
97
+ 'RadioButton'
98
+ )
99
+
100
+ return (
101
+ <View style={selectOuterBorderStyles(themeTokens)}>
102
+ <View
103
+ style={[staticStyles.defaultInputStyles, selectInputStyles(themeTokens, isChecked)]}
104
+ testID="Radio-Input"
105
+ >
106
+ {/* Add a real input on Web, skip on native platforms */}
107
+ <RadioInput
108
+ ref={ref}
109
+ checked={isChecked}
110
+ defaultChecked={defaultChecked}
111
+ disabled={inactive}
112
+ id={inputId}
113
+ isControlled={isControlled}
114
+ onChange={handleChange}
115
+ name={inputName}
116
+ value={value}
117
+ />
118
+ {isChecked && <View style={selectCheckedStyles(themeTokens)} testID="Radio-Checked" />}
119
+ </View>
120
+ </View>
121
+ )
122
+ }
123
+ )
124
+ RadioButton.displayName = 'RadioButton'
125
+
126
+ RadioButton.propTypes = {
127
+ isChecked: PropTypes.bool,
128
+ tokens: getTokensSetPropType(tokenKeys, { allowFunction: true }),
129
+ inactive: PropTypes.bool,
130
+ defaultChecked: PropTypes.bool,
131
+ inputId: PropTypes.string,
132
+ isControlled: PropTypes.bool,
133
+ handleChange: PropTypes.func,
134
+ name: PropTypes.string,
135
+ value: PropTypes.bool
136
+ }
137
+
138
+ const staticStyles = StyleSheet.create({
139
+ defaultInputStyles: { alignItems: 'center', justifyContent: 'center' }
140
+ })
141
+
142
+ export default RadioButton