@telus-uds/components-base 0.0.2-prerelease.5 → 0.0.2-prerelease.9

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 (429) hide show
  1. package/.ultra.cache.json +1 -0
  2. package/CHANGELOG.md +65 -0
  3. package/__fixtures__/Accessible.js +33 -0
  4. package/__fixtures__/Accessible.native.js +32 -0
  5. package/__fixtures__/testTheme.js +871 -52
  6. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  7. package/__tests__/Button/ButtonBase.test.jsx +3 -32
  8. package/__tests__/Button/ButtonGroup.test.jsx +2 -2
  9. package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
  10. package/__tests__/Checkbox/CheckboxGroup.test.jsx +247 -0
  11. package/__tests__/Icon/Icon.test.jsx +3 -3
  12. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  13. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  14. package/__tests__/List/List.test.jsx +60 -0
  15. package/__tests__/Modal/Modal.test.jsx +47 -0
  16. package/__tests__/Notification/Notification.test.jsx +20 -0
  17. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  18. package/__tests__/Progress/Progress.test.jsx +79 -0
  19. package/__tests__/Radio/Radio.test.jsx +87 -0
  20. package/__tests__/Radio/RadioGroup.test.jsx +221 -0
  21. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  22. package/__tests__/RadioCard/RadioCardGroup.test.jsx +247 -0
  23. package/__tests__/Search/Search.test.jsx +72 -0
  24. package/__tests__/Select/Select.test.jsx +93 -0
  25. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  26. package/__tests__/StackView/StackView.test.jsx +0 -26
  27. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  28. package/__tests__/Tabs/Tabs.test.jsx +200 -0
  29. package/__tests__/Tags/Tags.test.jsx +328 -0
  30. package/__tests__/TextInput/TextArea.test.jsx +34 -0
  31. package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +20 -46
  32. package/__tests__/Tooltip/Tooltip.test.jsx +65 -0
  33. package/__tests__/Tooltip/getTooltipPosition.test.js +79 -0
  34. package/__tests__/utils/input.test.js +58 -0
  35. package/__tests__/utils/useCopy.test.js +42 -0
  36. package/__tests__/utils/useResponsiveProp.test.jsx +202 -0
  37. package/__tests__/utils/{spacing.test.jsx → useSpacingScale.test.jsx} +1 -1
  38. package/babel.config.js +20 -0
  39. package/jest.config.js +13 -4
  40. package/lib/A11yInfoProvider/index.js +54 -26
  41. package/lib/A11yText/index.js +37 -14
  42. package/lib/ActivityIndicator/Spinner.js +78 -0
  43. package/lib/ActivityIndicator/Spinner.native.js +121 -87
  44. package/lib/ActivityIndicator/index.js +28 -12
  45. package/lib/ActivityIndicator/shared.js +27 -12
  46. package/lib/BaseProvider/index.js +34 -11
  47. package/lib/Box/Box.js +54 -31
  48. package/lib/Box/index.js +13 -2
  49. package/lib/Button/Button.js +38 -10
  50. package/lib/Button/ButtonBase.js +115 -94
  51. package/lib/Button/ButtonGroup.js +94 -86
  52. package/lib/Button/ButtonLink.js +41 -13
  53. package/lib/Button/index.js +31 -4
  54. package/lib/Button/propTypes.js +32 -9
  55. package/lib/Card/Card.js +36 -41
  56. package/lib/Card/CardBase.js +78 -0
  57. package/lib/Card/PressableCardBase.js +137 -0
  58. package/lib/Card/index.js +40 -2
  59. package/lib/Checkbox/Checkbox.js +344 -0
  60. package/lib/Checkbox/CheckboxGroup.js +231 -0
  61. package/lib/Checkbox/CheckboxInput.js +74 -0
  62. package/lib/Checkbox/CheckboxInput.native.js +14 -0
  63. package/lib/Checkbox/index.js +21 -0
  64. package/lib/Divider/Divider.js +50 -24
  65. package/lib/Divider/index.js +13 -2
  66. package/lib/ExpandCollapse/Accordion.js +20 -7
  67. package/lib/ExpandCollapse/Control.js +50 -27
  68. package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
  69. package/lib/ExpandCollapse/Panel.js +75 -37
  70. package/lib/ExpandCollapse/index.js +25 -7
  71. package/lib/Feedback/Feedback.js +85 -34
  72. package/lib/Feedback/index.js +13 -2
  73. package/lib/Fieldset/Fieldset.js +160 -0
  74. package/lib/Fieldset/FieldsetContainer.js +41 -0
  75. package/lib/Fieldset/FieldsetContainer.native.js +33 -0
  76. package/lib/Fieldset/Legend.js +33 -0
  77. package/lib/Fieldset/Legend.native.js +43 -0
  78. package/lib/Fieldset/cssReset.js +21 -0
  79. package/lib/Fieldset/index.js +13 -0
  80. package/lib/FlexGrid/Col/Col.js +67 -38
  81. package/lib/FlexGrid/Col/index.js +13 -2
  82. package/lib/FlexGrid/FlexGrid.js +70 -45
  83. package/lib/FlexGrid/Row/Row.js +48 -27
  84. package/lib/FlexGrid/Row/index.js +13 -2
  85. package/lib/FlexGrid/helpers/index.js +9 -1
  86. package/lib/FlexGrid/index.js +13 -2
  87. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  88. package/lib/Icon/Icon.js +52 -47
  89. package/lib/Icon/IconText.js +100 -0
  90. package/lib/Icon/index.js +31 -3
  91. package/lib/IconButton/IconButton.js +135 -0
  92. package/lib/IconButton/index.js +13 -0
  93. package/lib/InputLabel/InputLabel.js +70 -34
  94. package/lib/InputLabel/LabelContent.js +31 -0
  95. package/lib/InputLabel/LabelContent.native.js +9 -1
  96. package/lib/InputLabel/index.js +13 -2
  97. package/lib/InputSupports/InputSupports.js +104 -0
  98. package/lib/InputSupports/index.js +13 -0
  99. package/lib/InputSupports/propTypes.js +66 -0
  100. package/lib/InputSupports/useInputSupports.js +41 -0
  101. package/lib/Link/ChevronLink.js +57 -15
  102. package/lib/Link/InlinePressable.js +50 -0
  103. package/lib/Link/InlinePressable.native.js +101 -0
  104. package/lib/Link/Link.js +30 -13
  105. package/lib/Link/LinkBase.js +114 -145
  106. package/lib/Link/TextButton.js +47 -17
  107. package/lib/Link/index.js +39 -4
  108. package/lib/List/List.js +80 -0
  109. package/lib/List/ListItem.js +237 -0
  110. package/lib/List/index.js +13 -0
  111. package/lib/Modal/Modal.js +226 -0
  112. package/lib/Modal/dictionary.js +16 -0
  113. package/lib/Modal/index.js +13 -0
  114. package/lib/Notification/Notification.js +200 -0
  115. package/lib/Notification/dictionary.js +15 -0
  116. package/lib/Notification/index.js +13 -0
  117. package/lib/Pagination/PageButton.js +45 -46
  118. package/lib/Pagination/Pagination.js +70 -40
  119. package/lib/Pagination/SideButton.js +74 -58
  120. package/lib/Pagination/dictionary.js +9 -2
  121. package/lib/Pagination/index.js +13 -2
  122. package/lib/Pagination/usePagination.js +12 -2
  123. package/lib/Progress/Progress.js +99 -0
  124. package/lib/Progress/ProgressBar.js +146 -0
  125. package/lib/Progress/ProgressBarBackground.js +57 -0
  126. package/lib/Progress/index.js +16 -0
  127. package/lib/Radio/Radio.js +292 -0
  128. package/lib/Radio/RadioButton.js +141 -0
  129. package/lib/Radio/RadioGroup.js +233 -0
  130. package/lib/Radio/RadioInput.js +76 -0
  131. package/lib/Radio/RadioInput.native.js +14 -0
  132. package/lib/Radio/index.js +21 -0
  133. package/lib/RadioCard/RadioCard.js +240 -0
  134. package/lib/RadioCard/RadioCardGroup.js +251 -0
  135. package/lib/RadioCard/index.js +21 -0
  136. package/lib/Search/Search.js +243 -0
  137. package/lib/Search/dictionary.js +19 -0
  138. package/lib/Search/index.js +13 -0
  139. package/lib/Select/Group.js +33 -0
  140. package/lib/Select/Group.native.js +25 -0
  141. package/lib/Select/Item.js +29 -0
  142. package/lib/Select/Item.native.js +19 -0
  143. package/lib/Select/Picker.js +79 -0
  144. package/lib/Select/Picker.native.js +115 -0
  145. package/lib/Select/Select.js +300 -0
  146. package/lib/Select/index.js +19 -0
  147. package/lib/SideNav/Item.js +54 -33
  148. package/lib/SideNav/ItemContent.js +41 -15
  149. package/lib/SideNav/ItemsGroup.js +46 -27
  150. package/lib/SideNav/SideNav.js +92 -69
  151. package/lib/SideNav/index.js +15 -1
  152. package/lib/Skeleton/Skeleton.js +137 -0
  153. package/lib/Skeleton/index.js +13 -0
  154. package/lib/Skeleton/skeleton.constant.js +12 -0
  155. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  156. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  157. package/lib/Spacer/Spacer.js +31 -12
  158. package/lib/Spacer/index.js +13 -2
  159. package/lib/StackView/StackView.js +57 -33
  160. package/lib/StackView/StackWrap.js +33 -10
  161. package/lib/StackView/StackWrap.native.js +13 -2
  162. package/lib/StackView/StackWrapBox.js +50 -23
  163. package/lib/StackView/StackWrapGap.js +45 -19
  164. package/lib/StackView/common.js +19 -4
  165. package/lib/StackView/getStackedContent.js +49 -19
  166. package/lib/StackView/index.js +29 -5
  167. package/lib/StepTracker/Step.js +245 -0
  168. package/lib/StepTracker/StepTracker.js +197 -0
  169. package/lib/StepTracker/dictionary.js +17 -0
  170. package/lib/StepTracker/index.js +13 -0
  171. package/lib/Tabs/HorizontalScroll.js +199 -0
  172. package/lib/Tabs/ScrollViewEnd.js +66 -0
  173. package/lib/Tabs/ScrollViewEnd.native.js +41 -0
  174. package/lib/Tabs/Tabs.js +117 -0
  175. package/lib/Tabs/TabsItem.js +234 -0
  176. package/lib/Tabs/TabsScrollButton.js +121 -0
  177. package/lib/Tabs/dictionary.js +18 -0
  178. package/lib/Tabs/index.js +13 -0
  179. package/lib/Tabs/itemPositions.js +128 -0
  180. package/lib/Tags/Tags.js +250 -0
  181. package/lib/Tags/index.js +13 -0
  182. package/lib/TextInput/TextArea.js +109 -0
  183. package/lib/TextInput/TextInput.js +41 -303
  184. package/lib/TextInput/TextInputBase.js +252 -0
  185. package/lib/TextInput/index.js +23 -2
  186. package/lib/TextInput/propTypes.js +42 -0
  187. package/lib/ThemeProvider/ThemeProvider.js +38 -14
  188. package/lib/ThemeProvider/index.js +61 -6
  189. package/lib/ThemeProvider/useSetTheme.js +14 -5
  190. package/lib/ThemeProvider/useTheme.js +13 -4
  191. package/lib/ThemeProvider/useThemeTokens.js +86 -19
  192. package/lib/ThemeProvider/utils/index.js +31 -2
  193. package/lib/ThemeProvider/utils/styles.js +52 -16
  194. package/lib/ThemeProvider/utils/theme-tokens.js +94 -16
  195. package/lib/ToggleSwitch/ToggleSwitch.js +76 -52
  196. package/lib/ToggleSwitch/index.js +13 -2
  197. package/lib/Tooltip/Backdrop.js +56 -0
  198. package/lib/Tooltip/Backdrop.native.js +59 -0
  199. package/lib/Tooltip/Tooltip.js +357 -0
  200. package/lib/Tooltip/dictionary.js +15 -0
  201. package/lib/Tooltip/getTooltipPosition.js +172 -0
  202. package/lib/Tooltip/index.js +13 -0
  203. package/lib/TooltipButton/TooltipButton.js +83 -0
  204. package/lib/TooltipButton/index.js +13 -0
  205. package/lib/Typography/Typography.js +58 -43
  206. package/lib/Typography/index.js +13 -2
  207. package/lib/ViewportProvider/ViewportProvider.js +46 -0
  208. package/lib/ViewportProvider/index.js +22 -38
  209. package/lib/ViewportProvider/useViewport.js +15 -0
  210. package/lib/ViewportProvider/useViewportListener.js +57 -0
  211. package/lib/index.js +518 -24
  212. package/lib/utils/a11y/index.js +18 -0
  213. package/lib/utils/a11y/textSize.js +49 -0
  214. package/lib/utils/animation/index.js +15 -2
  215. package/lib/utils/animation/useVerticalExpandAnimation.js +28 -11
  216. package/lib/utils/children.js +87 -0
  217. package/lib/utils/index.js +163 -4
  218. package/lib/utils/info/index.js +19 -0
  219. package/lib/utils/info/platform/index.js +23 -0
  220. package/lib/utils/info/platform/platform.android.js +8 -0
  221. package/lib/utils/info/platform/platform.ios.js +8 -0
  222. package/lib/utils/info/platform/platform.js +8 -0
  223. package/lib/utils/info/platform/platform.native.js +11 -0
  224. package/lib/utils/info/versions.js +16 -0
  225. package/lib/utils/input.js +51 -33
  226. package/lib/utils/pressability.js +120 -0
  227. package/lib/utils/propTypes.js +269 -116
  228. package/lib/utils/useCopy.js +51 -0
  229. package/lib/utils/useHash.js +48 -0
  230. package/lib/utils/useHash.native.js +15 -0
  231. package/lib/utils/useResponsiveProp.js +59 -0
  232. package/lib/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +45 -12
  233. package/lib/utils/useUniqueId.js +13 -4
  234. package/package.json +12 -9
  235. package/release-context.json +4 -4
  236. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
  237. package/src/Box/Box.jsx +11 -4
  238. package/src/Button/Button.jsx +9 -5
  239. package/src/Button/ButtonBase.jsx +69 -69
  240. package/src/Button/ButtonGroup.jsx +11 -24
  241. package/src/Button/ButtonLink.jsx +14 -4
  242. package/src/Button/propTypes.js +12 -2
  243. package/src/Card/Card.jsx +4 -30
  244. package/src/Card/CardBase.jsx +57 -0
  245. package/src/Card/PressableCardBase.jsx +112 -0
  246. package/src/Card/index.js +3 -0
  247. package/src/Checkbox/Checkbox.jsx +274 -0
  248. package/src/Checkbox/CheckboxGroup.jsx +196 -0
  249. package/src/Checkbox/CheckboxInput.jsx +55 -0
  250. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  251. package/src/Checkbox/index.js +5 -0
  252. package/src/ExpandCollapse/Control.jsx +1 -1
  253. package/src/Feedback/Feedback.jsx +31 -22
  254. package/src/Fieldset/Fieldset.jsx +129 -0
  255. package/src/Fieldset/FieldsetContainer.jsx +22 -0
  256. package/src/Fieldset/FieldsetContainer.native.jsx +16 -0
  257. package/src/Fieldset/Legend.jsx +16 -0
  258. package/src/Fieldset/Legend.native.jsx +22 -0
  259. package/src/Fieldset/cssReset.js +14 -0
  260. package/src/Fieldset/index.js +3 -0
  261. package/src/Icon/Icon.jsx +21 -26
  262. package/src/Icon/IconText.jsx +63 -0
  263. package/src/Icon/index.js +3 -2
  264. package/src/IconButton/IconButton.jsx +107 -0
  265. package/src/IconButton/index.js +3 -0
  266. package/src/InputLabel/InputLabel.jsx +11 -4
  267. package/src/InputLabel/{LabelContent.web.jsx → LabelContent.jsx} +0 -0
  268. package/src/InputSupports/InputSupports.jsx +75 -0
  269. package/src/InputSupports/index.js +3 -0
  270. package/src/InputSupports/propTypes.js +44 -0
  271. package/src/InputSupports/useInputSupports.js +30 -0
  272. package/src/Link/ChevronLink.jsx +28 -7
  273. package/src/Link/InlinePressable.jsx +37 -0
  274. package/src/Link/InlinePressable.native.jsx +73 -0
  275. package/src/Link/Link.jsx +17 -13
  276. package/src/Link/LinkBase.jsx +67 -148
  277. package/src/Link/TextButton.jsx +25 -11
  278. package/src/Link/index.js +2 -1
  279. package/src/List/List.jsx +47 -0
  280. package/src/List/ListItem.jsx +187 -0
  281. package/src/List/index.js +3 -0
  282. package/src/Modal/Modal.jsx +185 -0
  283. package/src/Modal/dictionary.js +9 -0
  284. package/src/Modal/index.js +3 -0
  285. package/src/Notification/Notification.jsx +149 -0
  286. package/src/Notification/dictionary.js +8 -0
  287. package/src/Notification/index.js +3 -0
  288. package/src/Pagination/PageButton.jsx +3 -17
  289. package/src/Pagination/SideButton.jsx +27 -38
  290. package/src/Progress/Progress.jsx +77 -0
  291. package/src/Progress/ProgressBar.jsx +110 -0
  292. package/src/Progress/ProgressBarBackground.jsx +34 -0
  293. package/src/Progress/index.js +6 -0
  294. package/src/Radio/Radio.jsx +233 -0
  295. package/src/Radio/RadioButton.jsx +131 -0
  296. package/src/Radio/RadioGroup.jsx +198 -0
  297. package/src/Radio/RadioInput.jsx +57 -0
  298. package/src/Radio/RadioInput.native.jsx +6 -0
  299. package/src/Radio/index.js +5 -0
  300. package/src/RadioCard/RadioCard.jsx +191 -0
  301. package/src/RadioCard/RadioCardGroup.jsx +211 -0
  302. package/src/RadioCard/index.js +5 -0
  303. package/src/Search/Search.jsx +204 -0
  304. package/src/Search/dictionary.js +12 -0
  305. package/src/Search/index.js +3 -0
  306. package/src/Select/Group.jsx +15 -0
  307. package/src/Select/Group.native.jsx +14 -0
  308. package/src/Select/Item.jsx +11 -0
  309. package/src/Select/Item.native.jsx +10 -0
  310. package/src/Select/Picker.jsx +67 -0
  311. package/src/Select/Picker.native.jsx +95 -0
  312. package/src/Select/Select.jsx +255 -0
  313. package/src/Select/index.js +8 -0
  314. package/src/SideNav/Item.jsx +2 -2
  315. package/src/Skeleton/Skeleton.jsx +98 -0
  316. package/src/Skeleton/index.js +3 -0
  317. package/src/Skeleton/skeleton.constant.js +3 -0
  318. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  319. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  320. package/src/StackView/StackView.jsx +25 -17
  321. package/src/StackView/StackWrap.jsx +9 -1
  322. package/src/StackView/StackWrapBox.jsx +19 -7
  323. package/src/StackView/StackWrapGap.jsx +15 -5
  324. package/src/StackView/getStackedContent.jsx +8 -2
  325. package/src/StepTracker/Step.jsx +202 -0
  326. package/src/StepTracker/StepTracker.jsx +163 -0
  327. package/src/StepTracker/dictionary.js +10 -0
  328. package/src/StepTracker/index.js +3 -0
  329. package/src/Tabs/HorizontalScroll.jsx +165 -0
  330. package/src/Tabs/ScrollViewEnd.jsx +53 -0
  331. package/src/Tabs/ScrollViewEnd.native.jsx +24 -0
  332. package/src/Tabs/Tabs.jsx +89 -0
  333. package/src/Tabs/TabsItem.jsx +204 -0
  334. package/src/Tabs/TabsScrollButton.jsx +100 -0
  335. package/src/Tabs/dictionary.js +11 -0
  336. package/src/Tabs/index.js +3 -0
  337. package/src/Tabs/itemPositions.js +101 -0
  338. package/src/Tags/Tags.jsx +207 -0
  339. package/src/Tags/index.js +3 -0
  340. package/src/TextInput/TextArea.jsx +78 -0
  341. package/src/TextInput/TextInput.jsx +17 -290
  342. package/src/TextInput/TextInputBase.jsx +210 -0
  343. package/src/TextInput/index.js +2 -1
  344. package/src/TextInput/propTypes.js +29 -0
  345. package/src/ThemeProvider/useThemeTokens.js +56 -5
  346. package/src/ThemeProvider/utils/styles.js +18 -5
  347. package/src/ThemeProvider/utils/theme-tokens.js +46 -5
  348. package/src/ToggleSwitch/ToggleSwitch.jsx +3 -4
  349. package/src/Tooltip/Backdrop.jsx +60 -0
  350. package/src/Tooltip/Backdrop.native.jsx +33 -0
  351. package/src/Tooltip/Tooltip.jsx +294 -0
  352. package/src/Tooltip/dictionary.js +8 -0
  353. package/src/Tooltip/getTooltipPosition.js +161 -0
  354. package/src/Tooltip/index.js +3 -0
  355. package/src/TooltipButton/TooltipButton.jsx +49 -0
  356. package/src/TooltipButton/index.js +3 -0
  357. package/src/Typography/Typography.jsx +10 -20
  358. package/src/ViewportProvider/ViewportProvider.jsx +21 -0
  359. package/src/ViewportProvider/index.jsx +2 -41
  360. package/src/ViewportProvider/useViewport.js +5 -0
  361. package/src/ViewportProvider/useViewportListener.js +43 -0
  362. package/src/index.js +31 -3
  363. package/src/utils/a11y/index.js +1 -0
  364. package/src/utils/a11y/textSize.js +30 -0
  365. package/src/utils/children.jsx +66 -0
  366. package/src/utils/index.js +11 -1
  367. package/src/utils/info/index.js +8 -0
  368. package/src/utils/info/platform/index.js +11 -0
  369. package/src/utils/info/platform/platform.android.js +1 -0
  370. package/src/utils/info/platform/platform.ios.js +1 -0
  371. package/src/utils/info/platform/platform.js +1 -0
  372. package/src/utils/info/platform/platform.native.js +4 -0
  373. package/src/utils/info/versions.js +6 -0
  374. package/src/utils/input.js +20 -12
  375. package/src/utils/pressability.js +96 -0
  376. package/src/utils/propTypes.js +195 -56
  377. package/src/utils/useCopy.js +39 -0
  378. package/src/utils/useHash.js +34 -0
  379. package/src/utils/useHash.native.js +6 -0
  380. package/src/utils/useResponsiveProp.js +50 -0
  381. package/src/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +25 -10
  382. package/stories/A11yText/A11yText.stories.jsx +4 -8
  383. package/stories/Button/Button.stories.jsx +5 -0
  384. package/stories/Card/Card.stories.jsx +1 -1
  385. package/stories/Checkbox/Checkbox.stories.jsx +94 -0
  386. package/stories/Feedback/Feedback.stories.jsx +5 -6
  387. package/stories/Icon/Icon.stories.jsx +27 -7
  388. package/stories/IconButton/IconButton.stories.jsx +50 -0
  389. package/stories/InputLabel/InputLabel.stories.jsx +8 -3
  390. package/stories/Link/ChevronLink.stories.jsx +3 -3
  391. package/stories/Link/Link.stories.jsx +28 -18
  392. package/stories/List/List.stories.jsx +117 -0
  393. package/stories/Modal/Modal.stories.jsx +29 -0
  394. package/stories/Notification/Notification.stories.jsx +82 -0
  395. package/stories/Progress/Progress.stories.jsx +93 -0
  396. package/stories/Radio/Radio.stories.jsx +100 -0
  397. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  398. package/stories/Search/Search.stories.jsx +16 -0
  399. package/stories/Select/Select.stories.jsx +55 -0
  400. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  401. package/stories/Spacer/Spacer.stories.jsx +7 -2
  402. package/stories/StackView/StackView.stories.jsx +10 -0
  403. package/stories/StackView/StackWrap.stories.jsx +12 -0
  404. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  405. package/stories/Tabs/Tabs.stories.jsx +97 -0
  406. package/stories/Tags/Tags.stories.jsx +69 -0
  407. package/stories/TextInput/TextArea.stories.jsx +100 -0
  408. package/stories/Tooltip/Tooltip.stories.jsx +81 -0
  409. package/stories/TooltipButton/TooltipButton.stories.jsx +11 -0
  410. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +0 -0
  411. package/stories/supports.jsx +36 -2
  412. package/__fixtures__/accessible.icon.svg +0 -6
  413. package/babel.config.json +0 -8
  414. package/docs/Contributing.stories.mdx +0 -9
  415. package/docs/Fonts.stories.mdx +0 -104
  416. package/docs/Icons.stories.mdx +0 -144
  417. package/docs/Introduction.stories.mdx +0 -9
  418. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  419. package/lib/InputLabel/LabelContent.web.js +0 -17
  420. package/lib/Pagination/useCopy.js +0 -10
  421. package/lib/config/svgr-icons-web.js +0 -9
  422. package/lib/config/svgr-icons.js +0 -52
  423. package/lib/utils/spacing/index.js +0 -2
  424. package/lib/utils/spacing/utils.js +0 -32
  425. package/src/Pagination/useCopy.js +0 -7
  426. package/src/config/svgr-icons-web.js +0 -11
  427. package/src/config/svgr-icons.js +0 -46
  428. package/src/utils/spacing/index.js +0 -3
  429. package/src/utils/spacing/utils.js +0 -28
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.resolveResponsiveProp = void 0;
7
+
8
+ var _systemConstants = require("@telus-uds/system-constants");
9
+
10
+ var _ViewportProvider = require("../ViewportProvider");
11
+
12
+ const hasOwn = (objectProp, key) => Object.prototype.hasOwnProperty.call(objectProp, key);
13
+
14
+ const hasResponsiveProperties = objectProp => _systemConstants.viewports.keys.some(key => hasOwn(objectProp, key));
15
+ /**
16
+ * Resolves a prop which may be a responsive object with keys for viewports.
17
+ *
18
+ * Used internally in useResponsiveProp - see that for more details.
19
+ *
20
+ * @param {*} prop
21
+ * @param {"xs"|"sm"|"md"|"lg"|"xl"} viewport
22
+ * @param {*} [defaultValue]
23
+ * @returns {*}
24
+ */
25
+
26
+
27
+ const resolveResponsiveProp = (prop, viewport, defaultValue) => {
28
+ if (prop === undefined) return defaultValue;
29
+ if (!prop || typeof prop !== 'object' || !hasResponsiveProperties(prop)) return prop;
30
+ const value = _systemConstants.viewports.keys.includes(viewport) ? // If there's a current viewport, return the closest match at or below it
31
+ _systemConstants.viewports.inherit(prop)[viewport] : // If no current viewport is available, default to smallest viewport
32
+ prop[_systemConstants.viewports.keys.find(key => hasOwn(prop, key))];
33
+ return value === undefined ? defaultValue : value;
34
+ };
35
+ /**
36
+ * Takes any value and, if that value is a responsive prop (an object with one or more
37
+ * keys matching system viewport names), returns the value corresponding to the largest
38
+ * viewport key smaller than the current screen's viewport.
39
+ *
40
+ * For example, if passed `{ sm: 4, lg: 8 }`, it will return 8 on `xl` and `lg` viewports,
41
+ * 4 on `md` and `sm` viewports, and `undefined` (or a provided `defaultValue`) on `xs` viewports.
42
+ *
43
+ * To generate propTypes for responsive props, see `responsiveProps` in `./utils/propTypes.js`.
44
+ *
45
+ * @param {*} prop - any value which may be an object with viewport keys
46
+ * @param {*} [defaultValue] - default value to provide if no matches found for the current viewport
47
+ * @returns {*}
48
+ */
49
+
50
+
51
+ exports.resolveResponsiveProp = resolveResponsiveProp;
52
+
53
+ const useResponsiveProp = (prop, defaultValue) => {
54
+ const viewport = (0, _ViewportProvider.useViewport)();
55
+ return resolveResponsiveProp(prop, viewport, defaultValue);
56
+ };
57
+
58
+ var _default = useResponsiveProp;
59
+ exports.default = _default;
@@ -1,14 +1,43 @@
1
- import { useViewport } from '../../ViewportProvider';
2
- import { useThemeTokens } from '../../ThemeProvider';
3
- import { resolveSpacingValue, resolveSpacingOptions } from './utils';
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _ViewportProvider = require("../ViewportProvider");
9
+
10
+ var _ThemeProvider = require("../ThemeProvider");
11
+
12
+ var _useResponsiveProp = require("./useResponsiveProp");
13
+
4
14
  /**
5
15
  * @typedef {import('@telus-uds/system-constants/viewports').Viewport} Viewport
6
- * @typedef {import('../propTypes.js').SpacingValue} SpacingValue
7
- * @typedef {import('../propTypes.js').SpacingIndex} SpacingIndex
8
- * @typedef {import('../propTypes.js').SpacingObject} SpacingObject
9
- * @typedef {import('../propTypes.js').SpacingOptions} SpacingOptions
16
+ * @typedef {import('./propTypes.js').SpacingValue} SpacingValue
17
+ * @typedef {import('./propTypes.js').SpacingIndex} SpacingIndex
18
+ * @typedef {import('./propTypes.js').SpacingObject} SpacingObject
19
+ * @typedef {import('./propTypes.js').SpacingOptions} SpacingOptions
10
20
  */
21
+ const resolveSpacingOptions = space => {
22
+ if (!(space !== null && space !== void 0 && space.options)) return {};
23
+ const {
24
+ size,
25
+ variant,
26
+ subtract = 0
27
+ } = space.options;
28
+ const overridden = typeof size === 'number'; // Might need an option that adapts the size value by current user's system font scale, so that
29
+ // meaningful spacing between items doesn't disappear on the highest a11y font scale settings.
30
+ // https://github.com/telus/universal-design-system/issues/583
11
31
 
32
+ return {
33
+ tokens: {
34
+ size
35
+ },
36
+ variant,
37
+ overridden,
38
+ subtract
39
+ };
40
+ };
12
41
  /**
13
42
  * Pass a {@link SpacingValue}, which is one of:
14
43
  *
@@ -79,24 +108,28 @@ import { resolveSpacingValue, resolveSpacingOptions } from './utils';
79
108
  * @returns {number}
80
109
  */
81
110
 
111
+
82
112
  const useSpacingScale = spaceValue => {
113
+ var _spaceValue$space;
114
+
83
115
  // In future, may need to consider window height as well as width, particularly for native apps,
84
116
  // e.g. to ensure designs don't look lost on large, tall, not-so-wide portrait screens.
85
- const viewport = useViewport();
117
+ const viewport = (0, _ViewportProvider.useViewport)();
86
118
  const {
87
119
  tokens,
88
120
  variant,
89
121
  overridden,
90
122
  subtract = 0
91
123
  } = resolveSpacingOptions(spaceValue);
92
- const space = overridden ? null : resolveSpacingValue(spaceValue, viewport);
124
+ const space = !overridden && ((_spaceValue$space = spaceValue === null || spaceValue === void 0 ? void 0 : spaceValue.space) !== null && _spaceValue$space !== void 0 ? _spaceValue$space : (0, _useResponsiveProp.resolveResponsiveProp)(spaceValue, viewport, 0));
93
125
  const {
94
126
  size
95
- } = useThemeTokens('spacingScale', tokens, variant, {
96
- space,
127
+ } = (0, _ThemeProvider.useThemeTokens)('spacingScale', tokens, variant, {
128
+ space: typeof space === 'number' ? space : 0,
97
129
  viewport
98
130
  });
99
131
  return Math.max(size - subtract, 0);
100
132
  };
101
133
 
102
- export default useSpacingScale;
134
+ var _default = useSpacingScale;
135
+ exports.default = _default;
@@ -1,12 +1,21 @@
1
- import { useState } from 'react';
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
2
10
  let id = 0;
3
11
 
4
12
  function useUniqueId(prefix = '') {
5
- const [uniqueId] = useState(() => {
13
+ const [uniqueId] = (0, _react.useState)(() => {
6
14
  id += 1;
7
- return `${prefix}-${id}`;
15
+ return "".concat(prefix, "-").concat(id);
8
16
  });
9
17
  return uniqueId;
10
18
  }
11
19
 
12
- export default useUniqueId;
20
+ var _default = useUniqueId;
21
+ exports.default = _default;
package/package.json CHANGED
@@ -1,16 +1,15 @@
1
1
  {
2
2
  "name": "@telus-uds/components-base",
3
- "version": "0.0.2-prerelease.5",
3
+ "version": "0.0.2-prerelease.9",
4
4
  "description": "Base components",
5
5
  "keywords": [
6
6
  "base"
7
7
  ],
8
8
  "author": "TELUS Digital",
9
9
  "homepage": "https://github.com/telus/universal-design-system#readme",
10
- "license": "ISC",
10
+ "license": "UNLICENSED",
11
11
  "main": "lib/index.js",
12
- "module": "lib/index.js",
13
- "react-native": "lib/index.js",
12
+ "react-native": "src/index.js",
14
13
  "directories": {
15
14
  "lib": "lib",
16
15
  "test": "__tests__"
@@ -35,9 +34,10 @@
35
34
  "skip": true
36
35
  },
37
36
  "peerDependencies": {
38
- "react": "*",
37
+ "react": "^17.0.2",
38
+ "react-dom": "*",
39
39
  "react-native": "*",
40
- "react-native-web": "~0.14.13"
40
+ "react-native-web": "^0.17.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@testing-library/jest-native": "^4.0.1",
@@ -46,9 +46,12 @@
46
46
  "react-test-renderer": "^16.3.2"
47
47
  },
48
48
  "dependencies": {
49
- "@telus-uds/system-constants": "^0.0.2-prerelease.1",
50
- "@telus-uds/tools-theme": "^0.0.2-prerelease.3",
49
+ "airbnb-prop-types": "^2.16.0",
50
+ "@telus-uds/system-constants": "^0.0.2-prerelease.2",
51
+ "@telus-uds/system-themes": "^0.0.2-prerelease.2",
52
+ "lodash.debounce": "^4.0.8",
51
53
  "lodash.merge": "^4.6.2",
52
- "prop-types": "^15.7.2"
54
+ "prop-types": "^15.7.2",
55
+ "react-native-picker-select": "^8.0.4"
53
56
  }
54
57
  }
@@ -1,7 +1,7 @@
1
1
  {
2
- "previousReleaseTag": "@telus-uds/components-base/v0.0.2-prerelease.4",
3
- "changelog": "### [0.0.2-prerelease.5](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v0.0.2-prerelease.4...@telus-uds/components-base/v0.0.2-prerelease.5) (2021-10-27)\n\n\n### Features\n\n* **allium-web:** Add `ExpandCollapseMiniControl` component ([#661](https://github.com/telus/universal-design-system/issues/661)) ([227407e](https://github.com/telus/universal-design-system/commit/227407ec6a48c0a170b8e39761ba33293f13eb3c)), closes [#605](https://github.com/telus/universal-design-system/issues/605) [#605](https://github.com/telus/universal-design-system/issues/605) [#605](https://github.com/telus/universal-design-system/issues/605) [#605](https://github.com/telus/universal-design-system/issues/605) [#605](https://github.com/telus/universal-design-system/issues/605)\n* **allium:** add Allium `Card` ([#639](https://github.com/telus/universal-design-system/issues/639)) ([f88179c](https://github.com/telus/universal-design-system/commit/f88179c503dfe574bf7bac6bb36ce4726a9af338))\n* **base, allium:** add reverse directions and switch Allium card to using `StackView` ([#676](https://github.com/telus/universal-design-system/issues/676)) ([819a15f](https://github.com/telus/universal-design-system/commit/819a15f059faa47d1bc4e96c6370e9694effc003))\n* **base:** add StackView and Spacer ([#662](https://github.com/telus/universal-design-system/issues/662)) ([cc3965e](https://github.com/telus/universal-design-system/commit/cc3965e83c1ec2fa0f0dd006a03eeeeda5384940))\n* **base:** add StackWrap component ([#666](https://github.com/telus/universal-design-system/issues/666)) ([f34fb60](https://github.com/telus/universal-design-system/commit/f34fb60d0a923b1e4b3105c21b4a762b630ab309))\n* **base:** add TextInput component ([#649](https://github.com/telus/universal-design-system/issues/649)) ([245c073](https://github.com/telus/universal-design-system/commit/245c073ed3ba3a022f989d234fbf5cf972edec25))\n* **base:** add the Feedback component ([#656](https://github.com/telus/universal-design-system/issues/656)) ([5d7a5b6](https://github.com/telus/universal-design-system/commit/5d7a5b69c870ce1077adfdb230fddd1aa120b373))\n\n\n### Bug Fixes\n\n* **base:** control stretch from a row parent ([#668](https://github.com/telus/universal-design-system/issues/668)) ([fa13c37](https://github.com/telus/universal-design-system/commit/fa13c37b2bd6b4118dbeb39bc2cdf59d13d5b151))\n* **base:** fix icon link width in block container ([#645](https://github.com/telus/universal-design-system/issues/645)) ([ff60d1d](https://github.com/telus/universal-design-system/commit/ff60d1d1d0a66b7735b902098c7ca22e442265e1))\n",
4
- "releaseTag": "@telus-uds/components-base/v0.0.2-prerelease.5",
5
- "newVersion": "0.0.2-prerelease.5",
2
+ "previousReleaseTag": "@telus-uds/components-base/v0.0.2-prerelease.8",
3
+ "changelog": "### [0.0.2-prerelease.9](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v0.0.2-prerelease.8...@telus-uds/components-base/v0.0.2-prerelease.9) (2021-12-29)\n\n\n### Features\n\n* **base:** implement IconButton ([#958](https://github.com/telus/universal-design-system/issues/958)) ([c3ff7dd](https://github.com/telus/universal-design-system/commit/c3ff7dd9fb76123d3ff8409e507c89ad91b7fef2))\n",
4
+ "releaseTag": "@telus-uds/components-base/v0.0.2-prerelease.9",
5
+ "newVersion": "0.0.2-prerelease.9",
6
6
  "packageName": "@telus-uds/components-base"
7
7
  }
package/src/Box/Box.jsx CHANGED
@@ -2,7 +2,14 @@ import React from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { View, ScrollView } from 'react-native'
4
4
  import { useThemeTokens } from '../ThemeProvider'
5
- import { a11yProps, spacingProps, variantProp, getTokensPropType, useSpacingScale } from '../utils'
5
+ import {
6
+ a11yProps,
7
+ spacingProps,
8
+ variantProp,
9
+ getTokensPropType,
10
+ useSpacingScale,
11
+ viewProps
12
+ } from '../utils'
6
13
  /**
7
14
  * @typedef {import('../utils/propTypes.js').SpacingValue} SpacingValue
8
15
  * @typedef {import('../utils/propTypes.js').SpacingIndex} SpacingIndex
@@ -102,7 +109,7 @@ const Box = ({
102
109
  testID,
103
110
  ...rest
104
111
  }) => {
105
- const a11y = a11yProps.select(rest)
112
+ const props = { ...a11yProps.select(rest), ...viewProps.select(rest) }
106
113
 
107
114
  const themeTokens = useThemeTokens('Box', tokens, variant)
108
115
  const styles = {
@@ -117,13 +124,13 @@ const Box = ({
117
124
  const scrollProps = typeof scroll === 'object' ? scroll : {}
118
125
  scrollProps.contentContainerStyle = [styles, scrollProps.contentContainerStyle]
119
126
  return (
120
- <ScrollView {...scrollProps} {...a11y} testID={testID}>
127
+ <ScrollView {...scrollProps} {...props} testID={testID}>
121
128
  {children}
122
129
  </ScrollView>
123
130
  )
124
131
  }
125
132
  return (
126
- <View {...a11y} style={styles} testID={testID}>
133
+ <View {...props} style={styles} testID={testID}>
127
134
  {children}
128
135
  </View>
129
136
  )
@@ -1,15 +1,19 @@
1
1
  import React from 'react'
2
+
2
3
  import ButtonBase from './ButtonBase'
3
- import buttonPropTypes from './propTypes'
4
+ import buttonPropTypes, { textAndA11yText } from './propTypes'
5
+ import { useThemeTokensCallback } from '../ThemeProvider'
4
6
  import { a11yProps } from '../utils/propTypes'
5
7
 
6
- const Button = ({ accessibilityRole = 'button', ...props }) => (
7
- <ButtonBase {...props} accessibilityRole={accessibilityRole} />
8
- )
8
+ const Button = ({ accessibilityRole = 'button', tokens, variant, ...props }) => {
9
+ const getTokens = useThemeTokensCallback('Button', tokens, variant)
10
+ return <ButtonBase {...props} tokens={getTokens} accessibilityRole={accessibilityRole} />
11
+ }
9
12
 
10
13
  Button.propTypes = {
11
14
  ...a11yProps.types,
12
- ...buttonPropTypes
15
+ ...buttonPropTypes,
16
+ children: textAndA11yText
13
17
  }
14
18
 
15
19
  export default Button
@@ -1,18 +1,16 @@
1
1
  import React from 'react'
2
- import { Pressable, Text, View, StyleSheet, Platform } from 'react-native'
2
+ import { Pressable, View, StyleSheet, Platform } from 'react-native'
3
3
 
4
- import { useThemeTokensCallback } from '../ThemeProvider'
5
- import { applyTextStyles, applyShadowToken } from '../ThemeProvider/utils'
4
+ import { applyTextStyles, applyShadowToken, applyOuterBorder } from '../ThemeProvider/utils'
6
5
  import buttonPropTypes from './propTypes'
7
- import { a11yProps, hrefAttrsProp, linkProps } from '../utils/propTypes'
8
-
9
- const getCursorStyle = (inactive, accessibilityRole) => {
10
- if (inactive) return 'not-allowed'
11
- // These roles should result in cursor: pointer but don't in current RNW releases
12
- if (['checkbox', 'radio', 'switch'].includes(accessibilityRole)) return 'pointer'
13
- // For everything else, let React Native Web figure it out internally
14
- return undefined
15
- }
6
+ import {
7
+ a11yProps,
8
+ getCursorStyle,
9
+ linkProps,
10
+ resolvePressableState,
11
+ resolvePressableTokens,
12
+ wrapStringsInText
13
+ } from '../utils'
16
14
 
17
15
  const getOuterBorderOffset = ({ outerBorderGap = 0, outerBorderWidth = 0 }) =>
18
16
  outerBorderGap + outerBorderWidth
@@ -22,26 +20,26 @@ const selectOuterContainerStyles = ({
22
20
  opacity,
23
21
  outerBorderColor,
24
22
  outerBorderWidth,
25
- outerBorderGap = 0,
26
- outerBorderRadius = 0,
23
+ outerBorderGap,
24
+ borderRadius,
27
25
  outerBackgroundColor
28
26
  }) => ({
29
27
  alignSelf,
30
- padding: outerBorderGap,
31
- borderWidth: outerBorderWidth,
32
- borderColor: outerBorderColor,
33
- borderRadius: outerBorderRadius + outerBorderGap,
34
28
  backgroundColor: outerBackgroundColor,
35
- opacity
29
+ opacity,
30
+ ...applyOuterBorder({
31
+ outerBorderGap,
32
+ outerBorderWidth,
33
+ outerBorderColor,
34
+ borderRadius
35
+ })
36
36
  })
37
37
 
38
38
  const selectOuterWidthStyles = ({ outerBorderGap, outerBorderWidth, width }) => {
39
39
  // The inner container's bounding box is the bounding box of the button overall
40
40
  // so this many device pixels will sit outside of the overall bounding box
41
41
  const outerBorderOffset = getOuterBorderOffset({ outerBorderGap, outerBorderWidth })
42
- const widthStyles = {
43
- margin: 0 - outerBorderOffset
44
- }
42
+ const widthStyles = {}
45
43
 
46
44
  if (!width) {
47
45
  return {
@@ -83,7 +81,8 @@ const selectInnerContainerStyles = ({
83
81
  paddingTop,
84
82
  paddingBottom,
85
83
  shadow,
86
- borderWidth
84
+ borderWidth,
85
+ minWidth
87
86
  }) => {
88
87
  // Subtract border width from padding so overall button width/height doesn't
89
88
  // jump around if the border width changes (avoiding NaN and negative padding)
@@ -98,6 +97,7 @@ const selectInnerContainerStyles = ({
98
97
  paddingTop: offsetBorder(paddingTop),
99
98
  paddingBottom: offsetBorder(paddingBottom),
100
99
  backgroundColor,
100
+ minWidth,
101
101
  ...applyShadowToken(shadow)
102
102
  }
103
103
  }
@@ -118,76 +118,63 @@ const selectTextStyles = ({ fontSize, color, lineHeight, fontName, fontWeight, t
118
118
  textAlign
119
119
  })
120
120
 
121
- const selectWebOnlyStyles = (inactive, themeTokens, { accessibilityRole }) =>
122
- Platform.OS === 'web'
123
- ? {
124
- // if it would overflow the container, wraps instead
125
- maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
126
- cursor: getCursorStyle(inactive, accessibilityRole),
127
- outline: 'none' // removes the default browser :focus outline
128
- }
129
- : {}
121
+ const selectWebOnlyStyles = (inactive, themeTokens, { accessibilityRole }) => {
122
+ return Platform.select({
123
+ web: {
124
+ // if it would overflow the container, wraps instead
125
+ maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
126
+ outline: 'none', // removes the default browser :focus outline
127
+ ...getCursorStyle(inactive, accessibilityRole)
128
+ },
129
+ default: {}
130
+ })
131
+ }
130
132
 
131
133
  const ButtonBase = ({
132
134
  href,
133
135
  hrefAttrs,
134
136
  children,
135
- variant,
136
137
  onPress,
137
- tokens,
138
+ tokens = {},
138
139
  disabled = false, // alias for inactive
139
140
  inactive = disabled,
140
141
  selected = false,
141
142
  ...rest
142
143
  }) => {
143
- const getTokens = useThemeTokensCallback('Button', tokens, variant)
144
- const getButtonState = ({ pressed, focused, hovered }) => ({
145
- pressed,
146
- focus: focused,
147
- hover: hovered,
148
- inactive,
149
- selected
150
- })
151
- const getTokensByPressableState = (pressableState) => getTokens(getButtonState(pressableState))
144
+ const extraButtonState = { inactive, selected }
145
+ const resolveButtonTokens = (pressableState) =>
146
+ resolvePressableTokens(tokens, pressableState, extraButtonState)
152
147
 
153
148
  const a11y = a11yProps.select(rest)
154
149
 
155
150
  const getPressableStyle = (pressableState) => {
156
- const themeTokens = getTokensByPressableState(pressableState)
151
+ const themeTokens = resolveButtonTokens(pressableState)
157
152
  return [
158
- staticStyles.wrapper,
153
+ staticStyles.row,
159
154
  selectWebOnlyStyles(inactive, themeTokens, a11y),
160
155
  selectOuterContainerStyles(themeTokens),
161
156
  selectOuterWidthStyles(themeTokens)
162
157
  ]
163
158
  }
164
159
 
165
- const handlePress = linkProps.handleHref({ href, onPress })
166
-
167
160
  return (
168
161
  <Pressable
169
- onPress={handlePress}
162
+ href={href}
163
+ onPress={linkProps.handleHref({ href, onPress })}
170
164
  style={getPressableStyle}
171
165
  disabled={inactive}
172
- href={href}
173
- {...hrefAttrsProp.spread(hrefAttrs)}
166
+ hrefAttrs={hrefAttrs}
174
167
  {...a11y}
175
168
  >
176
169
  {(pressableState) => {
177
- const themeTokens = getTokensByPressableState(pressableState)
170
+ const themeTokens = resolveButtonTokens(pressableState)
178
171
  const containerStyles = selectInnerContainerStyles(themeTokens)
179
172
  const borderStyles = selectBorderStyles(themeTokens)
180
- const textStyles = {
181
- ...selectTextStyles(themeTokens),
182
- ...Platform.select({
183
- // TODO: https://github.com/telus/universal-design-system/issues/487
184
- web: { transition: 'color 200ms' }
185
- })
186
- }
173
+ const textStyles = [selectTextStyles(themeTokens), staticStyles.text]
187
174
 
188
175
  // If the container has a width set, fill it instead of sizing from content.
189
176
  // If in future we support text alignments other than center, add here.
190
- const stretchStyles = !!themeTokens.width && staticStyles.center
177
+ const stretchStyles = themeTokens.width ? staticStyles.stretch : staticStyles.align
191
178
 
192
179
  return (
193
180
  <View
@@ -195,6 +182,7 @@ const ButtonBase = ({
195
182
  containerStyles,
196
183
  borderStyles,
197
184
  stretchStyles,
185
+ staticStyles.row,
198
186
  Platform.select({
199
187
  web: {
200
188
  maxWidth: '100%', // ensure overflowing content wraps
@@ -204,13 +192,14 @@ const ButtonBase = ({
204
192
  })
205
193
  ]}
206
194
  >
207
- {typeof children === 'function' ? (
208
- children({
209
- ...getButtonState(pressableState),
210
- textStyles
211
- })
212
- ) : (
213
- <Text style={textStyles}>{children}</Text>
195
+ {wrapStringsInText(
196
+ typeof children === 'function'
197
+ ? children({
198
+ ...resolvePressableState(pressableState, extraButtonState),
199
+ textStyles
200
+ })
201
+ : children,
202
+ { style: textStyles }
214
203
  )}
215
204
  </View>
216
205
  )
@@ -226,10 +215,21 @@ ButtonBase.propTypes = {
226
215
  }
227
216
 
228
217
  const staticStyles = StyleSheet.create({
229
- wrapper: {
230
- flexDirection: 'row' // ensures alignSelf is horizontal
218
+ row: {
219
+ // Apply all button alignment horizontally; no vertical stacking within a button
220
+ flexDirection: 'row'
221
+ },
222
+ text: {
223
+ flexGrow: 1, // On native but not web, flexShrink here wraps text prematurely
224
+ ...Platform.select({
225
+ // TODO: https://github.com/telus/universal-design-system/issues/487
226
+ web: { transition: 'color 200ms' }
227
+ })
228
+ },
229
+ align: {
230
+ alignItems: 'center'
231
231
  },
232
- center: {
232
+ stretch: {
233
233
  flex: 1,
234
234
  alignItems: 'center',
235
235
  justifyContent: 'center'
@@ -5,7 +5,7 @@ import { Platform } from 'react-native'
5
5
  import ButtonBase from './ButtonBase'
6
6
  import { StackWrap } from '../StackView'
7
7
  import { useViewport } from '../ViewportProvider'
8
- import { useThemeTokens } from '../ThemeProvider'
8
+ import { useThemeTokens, useThemeTokensCallback } from '../ThemeProvider'
9
9
  import {
10
10
  a11yProps,
11
11
  pressProps,
@@ -14,10 +14,10 @@ import {
14
14
  selectTokens
15
15
  } from '../utils/propTypes'
16
16
  import { useMultipleInputValues } from '../utils/input'
17
+ import { getPressHandlersWithArgs } from '../utils/pressability'
17
18
 
18
19
  const ButtonGroup = ({
19
20
  variant,
20
- buttonVariant = {},
21
21
  tokens,
22
22
  items = [],
23
23
  values,
@@ -27,7 +27,7 @@ const ButtonGroup = ({
27
27
  readOnly = false,
28
28
  inactive = false,
29
29
  accessibilityRole = maxValues === 1
30
- ? 'radioGroup' // radioGroup is cross-platform; only web aria has generic groups
30
+ ? 'radiogroup' // radiogroup is cross-platform; only web aria has generic groups
31
31
  : Platform.select({ web: 'group', default: 'none' }),
32
32
  ...rest
33
33
  }) => {
@@ -36,6 +36,8 @@ const ButtonGroup = ({
36
36
  const stackTokens = selectTokens('StackView', themeTokens)
37
37
  const { direction, space } = themeTokens
38
38
 
39
+ const getButtonTokens = useThemeTokensCallback('ButtonGroupItem', tokens, variant)
40
+
39
41
  const { currentValues, toggleOneValue } = useMultipleInputValues({
40
42
  initialValues,
41
43
  values,
@@ -48,22 +50,16 @@ const ButtonGroup = ({
48
50
  accessibilityRole,
49
51
  ...rest
50
52
  })
51
- const itemA11yRole = a11y.accessibilityRole === 'radioGroup' ? 'radio' : 'checkbox'
53
+ const itemA11yRole = a11y.accessibilityRole === 'radiogroup' ? 'radio' : 'checkbox'
52
54
 
53
55
  return (
54
56
  <StackWrap {...a11y} space={space} direction={direction} tokens={stackTokens}>
55
57
  {items.map(({ label, id = label, accessibilityLabel }, index) => {
56
58
  const isSelected = currentValues.includes(id)
57
59
 
58
- // Allow handlers to be passed down for blur, hover, focus, pressIn, etc
59
- const pressHandlers = Object.fromEntries(
60
- Object.entries(pressProps.select(rest)).map(([key, handler]) => ({
61
- [key]: (args) => {
62
- // Pass each handler data on this button and current selection
63
- handler({ id, label, currentValues }, ...args)
64
- }
65
- }))
66
- )
60
+ // Pass an object of relevant component state as first argument for any passed-in press handlers
61
+ const pressHandlers = getPressHandlersWithArgs(rest, [{ id, label, currentValues }])
62
+
67
63
  const handlePress = () => {
68
64
  if (pressHandlers.onPress) pressHandlers.onPress()
69
65
  toggleOneValue(id)
@@ -73,15 +69,7 @@ const ButtonGroup = ({
73
69
  accessibilityState: { checked: isSelected },
74
70
  accessibilityRole: itemA11yRole,
75
71
  accessibilityLabel,
76
- ...Platform.select({
77
- web: {
78
- // accessibilityPosInSet etc exists in React Native Web main branch
79
- // but not in a release compatible with Expo etc; just use `aria-*`
80
- 'aria-setsize': items.length,
81
- 'aria-posinset': index + 1
82
- },
83
- default: {}
84
- })
72
+ ...a11yProps.getPositionInSet(items.length, index)
85
73
  }
86
74
 
87
75
  // Ensure button is direct child of group as MacOS voiceover only applies "X of Y" to
@@ -91,7 +79,7 @@ const ButtonGroup = ({
91
79
  key={id}
92
80
  {...pressHandlers}
93
81
  onPress={handlePress}
94
- variant={{ component: 'ButtonGroup', ...buttonVariant }}
82
+ tokens={getButtonTokens}
95
83
  selected={isSelected}
96
84
  inactive={inactive}
97
85
  {...itemA11y}
@@ -109,7 +97,6 @@ ButtonGroup.propTypes = {
109
97
  ...pressProps.propTypes,
110
98
  tokens: getTokensPropType('ButtonGroup'),
111
99
  variant: variantProp.propType,
112
- buttonVariant: variantProp.propType,
113
100
  /**
114
101
  * The maximum number of items a user may select at once. Defaults to 1 and behaves
115
102
  * like radio buttons. To have no limit and allow any number of selections, pass `null`.