@telus-uds/components-base 0.0.2-prerelease.4 → 0.0.2-prerelease.8

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 (447) hide show
  1. package/.ultra.cache.json +1 -0
  2. package/CHANGELOG.md +76 -0
  3. package/__fixtures__/Accessible.js +33 -0
  4. package/__fixtures__/Accessible.native.js +32 -0
  5. package/__fixtures__/testTheme.js +940 -54
  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__/Divider/Divider.test.jsx +26 -5
  12. package/__tests__/Feedback/Feedback.test.jsx +42 -0
  13. package/__tests__/Icon/Icon.test.jsx +3 -3
  14. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  15. package/__tests__/List/List.test.jsx +60 -0
  16. package/__tests__/Modal/Modal.test.jsx +47 -0
  17. package/__tests__/Notification/Notification.test.jsx +20 -0
  18. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  19. package/__tests__/Progress/Progress.test.jsx +79 -0
  20. package/__tests__/Radio/Radio.test.jsx +87 -0
  21. package/__tests__/Radio/RadioGroup.test.jsx +221 -0
  22. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  23. package/__tests__/RadioCard/RadioCardGroup.test.jsx +247 -0
  24. package/__tests__/Search/Search.test.jsx +72 -0
  25. package/__tests__/Select/Select.test.jsx +93 -0
  26. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  27. package/__tests__/Spacer/Spacer.test.jsx +63 -0
  28. package/__tests__/StackView/StackView.test.jsx +216 -0
  29. package/__tests__/StackView/StackWrap.test.jsx +47 -0
  30. package/__tests__/StackView/getStackedContent.test.jsx +295 -0
  31. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  32. package/__tests__/Tabs/Tabs.test.jsx +200 -0
  33. package/__tests__/Tags/Tags.test.jsx +328 -0
  34. package/__tests__/TextInput/TextArea.test.jsx +34 -0
  35. package/__tests__/TextInput/TextInputBase.test.jsx +120 -0
  36. package/__tests__/Tooltip/Tooltip.test.jsx +65 -0
  37. package/__tests__/Tooltip/getTooltipPosition.test.js +79 -0
  38. package/__tests__/utils/input.test.js +58 -0
  39. package/__tests__/utils/useCopy.test.js +42 -0
  40. package/__tests__/utils/useResponsiveProp.test.jsx +202 -0
  41. package/__tests__/utils/{spacing.test.jsx → useSpacingScale.test.jsx} +1 -1
  42. package/__tests__/utils/useUniqueId.test.js +31 -0
  43. package/babel.config.js +20 -0
  44. package/jest.config.js +8 -2
  45. package/lib/A11yInfoProvider/index.js +54 -26
  46. package/lib/A11yText/index.js +37 -14
  47. package/lib/ActivityIndicator/Spinner.js +78 -0
  48. package/lib/ActivityIndicator/Spinner.native.js +121 -87
  49. package/lib/ActivityIndicator/index.js +28 -12
  50. package/lib/ActivityIndicator/shared.js +27 -12
  51. package/lib/BaseProvider/index.js +34 -11
  52. package/lib/Box/Box.js +56 -28
  53. package/lib/Box/index.js +13 -2
  54. package/lib/Button/Button.js +38 -10
  55. package/lib/Button/ButtonBase.js +120 -109
  56. package/lib/Button/ButtonGroup.js +98 -99
  57. package/lib/Button/ButtonLink.js +41 -13
  58. package/lib/Button/index.js +31 -4
  59. package/lib/Button/propTypes.js +32 -9
  60. package/lib/Card/Card.js +36 -41
  61. package/lib/Card/CardBase.js +78 -0
  62. package/lib/Card/PressableCardBase.js +137 -0
  63. package/lib/Card/index.js +40 -2
  64. package/lib/Checkbox/Checkbox.js +344 -0
  65. package/lib/Checkbox/CheckboxGroup.js +231 -0
  66. package/lib/Checkbox/CheckboxInput.js +74 -0
  67. package/lib/Checkbox/CheckboxInput.native.js +14 -0
  68. package/lib/Checkbox/index.js +21 -0
  69. package/lib/Divider/Divider.js +81 -17
  70. package/lib/Divider/index.js +13 -2
  71. package/lib/ExpandCollapse/Accordion.js +20 -7
  72. package/lib/ExpandCollapse/Control.js +50 -27
  73. package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
  74. package/lib/ExpandCollapse/Panel.js +75 -37
  75. package/lib/ExpandCollapse/index.js +25 -7
  76. package/lib/Feedback/Feedback.js +161 -0
  77. package/lib/Feedback/index.js +13 -0
  78. package/lib/Fieldset/Fieldset.js +160 -0
  79. package/lib/Fieldset/FieldsetContainer.js +41 -0
  80. package/lib/Fieldset/FieldsetContainer.native.js +33 -0
  81. package/lib/Fieldset/Legend.js +33 -0
  82. package/lib/Fieldset/Legend.native.js +43 -0
  83. package/lib/Fieldset/cssReset.js +21 -0
  84. package/lib/Fieldset/index.js +13 -0
  85. package/lib/FlexGrid/Col/Col.js +67 -38
  86. package/lib/FlexGrid/Col/index.js +13 -2
  87. package/lib/FlexGrid/FlexGrid.js +70 -45
  88. package/lib/FlexGrid/Row/Row.js +48 -27
  89. package/lib/FlexGrid/Row/index.js +13 -2
  90. package/lib/FlexGrid/helpers/index.js +9 -1
  91. package/lib/FlexGrid/index.js +13 -2
  92. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  93. package/lib/Icon/Icon.js +52 -47
  94. package/lib/Icon/IconText.js +100 -0
  95. package/lib/Icon/index.js +31 -3
  96. package/lib/InputLabel/InputLabel.js +122 -0
  97. package/lib/InputLabel/LabelContent.js +31 -0
  98. package/lib/InputLabel/LabelContent.native.js +16 -0
  99. package/lib/InputLabel/index.js +13 -0
  100. package/lib/InputSupports/InputSupports.js +104 -0
  101. package/lib/InputSupports/index.js +13 -0
  102. package/lib/InputSupports/propTypes.js +66 -0
  103. package/lib/InputSupports/useInputSupports.js +41 -0
  104. package/lib/Link/ChevronLink.js +57 -15
  105. package/lib/Link/InlinePressable.js +50 -0
  106. package/lib/Link/InlinePressable.native.js +101 -0
  107. package/lib/Link/Link.js +30 -13
  108. package/lib/Link/LinkBase.js +121 -146
  109. package/lib/Link/TextButton.js +47 -17
  110. package/lib/Link/index.js +39 -4
  111. package/lib/List/List.js +80 -0
  112. package/lib/List/ListItem.js +237 -0
  113. package/lib/List/index.js +13 -0
  114. package/lib/Modal/Modal.js +226 -0
  115. package/lib/Modal/dictionary.js +16 -0
  116. package/lib/Modal/index.js +13 -0
  117. package/lib/Notification/Notification.js +200 -0
  118. package/lib/Notification/dictionary.js +15 -0
  119. package/lib/Notification/index.js +13 -0
  120. package/lib/Pagination/PageButton.js +45 -46
  121. package/lib/Pagination/Pagination.js +70 -40
  122. package/lib/Pagination/SideButton.js +74 -58
  123. package/lib/Pagination/dictionary.js +9 -2
  124. package/lib/Pagination/index.js +13 -2
  125. package/lib/Pagination/usePagination.js +12 -2
  126. package/lib/Progress/Progress.js +99 -0
  127. package/lib/Progress/ProgressBar.js +146 -0
  128. package/lib/Progress/ProgressBarBackground.js +57 -0
  129. package/lib/Progress/index.js +16 -0
  130. package/lib/Radio/Radio.js +292 -0
  131. package/lib/Radio/RadioButton.js +141 -0
  132. package/lib/Radio/RadioGroup.js +233 -0
  133. package/lib/Radio/RadioInput.js +76 -0
  134. package/lib/Radio/RadioInput.native.js +14 -0
  135. package/lib/Radio/index.js +21 -0
  136. package/lib/RadioCard/RadioCard.js +240 -0
  137. package/lib/RadioCard/RadioCardGroup.js +251 -0
  138. package/lib/RadioCard/index.js +21 -0
  139. package/lib/Search/Search.js +243 -0
  140. package/lib/Search/dictionary.js +19 -0
  141. package/lib/Search/index.js +13 -0
  142. package/lib/Select/Group.js +33 -0
  143. package/lib/Select/Group.native.js +25 -0
  144. package/lib/Select/Item.js +29 -0
  145. package/lib/Select/Item.native.js +19 -0
  146. package/lib/Select/Picker.js +79 -0
  147. package/lib/Select/Picker.native.js +115 -0
  148. package/lib/Select/Select.js +300 -0
  149. package/lib/Select/index.js +19 -0
  150. package/lib/SideNav/Item.js +54 -33
  151. package/lib/SideNav/ItemContent.js +41 -15
  152. package/lib/SideNav/ItemsGroup.js +46 -27
  153. package/lib/SideNav/SideNav.js +92 -69
  154. package/lib/SideNav/index.js +15 -1
  155. package/lib/Skeleton/Skeleton.js +137 -0
  156. package/lib/Skeleton/index.js +13 -0
  157. package/lib/Skeleton/skeleton.constant.js +12 -0
  158. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  159. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  160. package/lib/Spacer/Spacer.js +117 -0
  161. package/lib/Spacer/index.js +13 -0
  162. package/lib/StackView/StackView.js +129 -0
  163. package/lib/StackView/StackWrap.js +55 -0
  164. package/lib/StackView/StackWrap.native.js +14 -0
  165. package/lib/StackView/StackWrapBox.js +112 -0
  166. package/lib/StackView/StackWrapGap.js +71 -0
  167. package/lib/StackView/common.js +45 -0
  168. package/lib/StackView/getStackedContent.js +141 -0
  169. package/lib/StackView/index.js +29 -0
  170. package/lib/StepTracker/Step.js +245 -0
  171. package/lib/StepTracker/StepTracker.js +197 -0
  172. package/lib/StepTracker/dictionary.js +17 -0
  173. package/lib/StepTracker/index.js +13 -0
  174. package/lib/Tabs/HorizontalScroll.js +199 -0
  175. package/lib/Tabs/ScrollViewEnd.js +66 -0
  176. package/lib/Tabs/ScrollViewEnd.native.js +41 -0
  177. package/lib/Tabs/Tabs.js +117 -0
  178. package/lib/Tabs/TabsItem.js +234 -0
  179. package/lib/Tabs/TabsScrollButton.js +121 -0
  180. package/lib/Tabs/dictionary.js +18 -0
  181. package/lib/Tabs/index.js +13 -0
  182. package/lib/Tabs/itemPositions.js +128 -0
  183. package/lib/Tags/Tags.js +250 -0
  184. package/lib/Tags/index.js +13 -0
  185. package/lib/TextInput/TextArea.js +109 -0
  186. package/lib/TextInput/TextInput.js +75 -0
  187. package/lib/TextInput/TextInputBase.js +252 -0
  188. package/lib/TextInput/index.js +23 -0
  189. package/lib/TextInput/propTypes.js +42 -0
  190. package/lib/ThemeProvider/ThemeProvider.js +38 -14
  191. package/lib/ThemeProvider/index.js +61 -6
  192. package/lib/ThemeProvider/useSetTheme.js +14 -5
  193. package/lib/ThemeProvider/useTheme.js +13 -4
  194. package/lib/ThemeProvider/useThemeTokens.js +86 -19
  195. package/lib/ThemeProvider/utils/index.js +31 -2
  196. package/lib/ThemeProvider/utils/styles.js +52 -16
  197. package/lib/ThemeProvider/utils/theme-tokens.js +94 -16
  198. package/lib/ToggleSwitch/ToggleSwitch.js +76 -52
  199. package/lib/ToggleSwitch/index.js +13 -2
  200. package/lib/Tooltip/Backdrop.js +56 -0
  201. package/lib/Tooltip/Backdrop.native.js +59 -0
  202. package/lib/Tooltip/Tooltip.js +357 -0
  203. package/lib/Tooltip/dictionary.js +15 -0
  204. package/lib/Tooltip/getTooltipPosition.js +172 -0
  205. package/lib/Tooltip/index.js +13 -0
  206. package/lib/TooltipButton/TooltipButton.js +83 -0
  207. package/lib/TooltipButton/index.js +13 -0
  208. package/lib/Typography/Typography.js +58 -47
  209. package/lib/Typography/index.js +13 -2
  210. package/lib/ViewportProvider/ViewportProvider.js +46 -0
  211. package/lib/ViewportProvider/index.js +22 -38
  212. package/lib/ViewportProvider/useViewport.js +15 -0
  213. package/lib/ViewportProvider/useViewportListener.js +57 -0
  214. package/lib/index.js +509 -19
  215. package/lib/utils/a11y/index.js +18 -0
  216. package/lib/utils/a11y/textSize.js +49 -0
  217. package/lib/utils/animation/index.js +15 -2
  218. package/lib/utils/animation/useVerticalExpandAnimation.js +28 -11
  219. package/lib/utils/children.js +87 -0
  220. package/lib/utils/index.js +163 -4
  221. package/lib/utils/info/index.js +19 -0
  222. package/lib/utils/info/platform/index.js +23 -0
  223. package/lib/utils/info/platform/platform.android.js +8 -0
  224. package/lib/utils/info/platform/platform.ios.js +8 -0
  225. package/lib/utils/info/platform/platform.js +8 -0
  226. package/lib/utils/info/platform/platform.native.js +11 -0
  227. package/lib/utils/info/versions.js +16 -0
  228. package/lib/utils/input.js +54 -34
  229. package/lib/utils/pressability.js +120 -0
  230. package/lib/utils/propTypes.js +269 -108
  231. package/lib/utils/useCopy.js +51 -0
  232. package/lib/utils/useHash.js +48 -0
  233. package/lib/utils/useHash.native.js +15 -0
  234. package/lib/utils/useResponsiveProp.js +59 -0
  235. package/lib/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +45 -12
  236. package/lib/utils/useUniqueId.js +21 -0
  237. package/package.json +11 -8
  238. package/release-context.json +4 -4
  239. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
  240. package/src/Box/Box.jsx +13 -4
  241. package/src/Button/Button.jsx +9 -5
  242. package/src/Button/ButtonBase.jsx +74 -86
  243. package/src/Button/ButtonGroup.jsx +24 -41
  244. package/src/Button/ButtonLink.jsx +14 -4
  245. package/src/Button/propTypes.js +12 -2
  246. package/src/Card/Card.jsx +4 -30
  247. package/src/Card/CardBase.jsx +57 -0
  248. package/src/Card/PressableCardBase.jsx +112 -0
  249. package/src/Card/index.js +3 -0
  250. package/src/Checkbox/Checkbox.jsx +274 -0
  251. package/src/Checkbox/CheckboxGroup.jsx +196 -0
  252. package/src/Checkbox/CheckboxInput.jsx +55 -0
  253. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  254. package/src/Checkbox/index.js +5 -0
  255. package/src/Divider/Divider.jsx +38 -3
  256. package/src/ExpandCollapse/Control.jsx +1 -1
  257. package/src/Feedback/Feedback.jsx +108 -0
  258. package/src/Feedback/index.js +3 -0
  259. package/src/Fieldset/Fieldset.jsx +129 -0
  260. package/src/Fieldset/FieldsetContainer.jsx +22 -0
  261. package/src/Fieldset/FieldsetContainer.native.jsx +16 -0
  262. package/src/Fieldset/Legend.jsx +16 -0
  263. package/src/Fieldset/Legend.native.jsx +22 -0
  264. package/src/Fieldset/cssReset.js +14 -0
  265. package/src/Fieldset/index.js +3 -0
  266. package/src/Icon/Icon.jsx +23 -27
  267. package/src/Icon/IconText.jsx +63 -0
  268. package/src/Icon/index.js +3 -2
  269. package/src/InputLabel/InputLabel.jsx +106 -0
  270. package/src/InputLabel/LabelContent.jsx +13 -0
  271. package/src/InputLabel/LabelContent.native.jsx +6 -0
  272. package/src/InputLabel/index.js +3 -0
  273. package/src/InputSupports/InputSupports.jsx +75 -0
  274. package/src/InputSupports/index.js +3 -0
  275. package/src/InputSupports/propTypes.js +44 -0
  276. package/src/InputSupports/useInputSupports.js +30 -0
  277. package/src/Link/ChevronLink.jsx +28 -7
  278. package/src/Link/InlinePressable.jsx +37 -0
  279. package/src/Link/InlinePressable.native.jsx +73 -0
  280. package/src/Link/Link.jsx +17 -13
  281. package/src/Link/LinkBase.jsx +71 -146
  282. package/src/Link/TextButton.jsx +25 -11
  283. package/src/Link/index.js +2 -1
  284. package/src/List/List.jsx +47 -0
  285. package/src/List/ListItem.jsx +187 -0
  286. package/src/List/index.js +3 -0
  287. package/src/Modal/Modal.jsx +185 -0
  288. package/src/Modal/dictionary.js +9 -0
  289. package/src/Modal/index.js +3 -0
  290. package/src/Notification/Notification.jsx +149 -0
  291. package/src/Notification/dictionary.js +8 -0
  292. package/src/Notification/index.js +3 -0
  293. package/src/Pagination/PageButton.jsx +3 -17
  294. package/src/Pagination/SideButton.jsx +27 -38
  295. package/src/Progress/Progress.jsx +77 -0
  296. package/src/Progress/ProgressBar.jsx +110 -0
  297. package/src/Progress/ProgressBarBackground.jsx +34 -0
  298. package/src/Progress/index.js +6 -0
  299. package/src/Radio/Radio.jsx +233 -0
  300. package/src/Radio/RadioButton.jsx +131 -0
  301. package/src/Radio/RadioGroup.jsx +198 -0
  302. package/src/Radio/RadioInput.jsx +57 -0
  303. package/src/Radio/RadioInput.native.jsx +6 -0
  304. package/src/Radio/index.js +5 -0
  305. package/src/RadioCard/RadioCard.jsx +191 -0
  306. package/src/RadioCard/RadioCardGroup.jsx +211 -0
  307. package/src/RadioCard/index.js +5 -0
  308. package/src/Search/Search.jsx +204 -0
  309. package/src/Search/dictionary.js +12 -0
  310. package/src/Search/index.js +3 -0
  311. package/src/Select/Group.jsx +15 -0
  312. package/src/Select/Group.native.jsx +14 -0
  313. package/src/Select/Item.jsx +11 -0
  314. package/src/Select/Item.native.jsx +10 -0
  315. package/src/Select/Picker.jsx +67 -0
  316. package/src/Select/Picker.native.jsx +95 -0
  317. package/src/Select/Select.jsx +255 -0
  318. package/src/Select/index.js +8 -0
  319. package/src/SideNav/Item.jsx +2 -2
  320. package/src/Skeleton/Skeleton.jsx +98 -0
  321. package/src/Skeleton/index.js +3 -0
  322. package/src/Skeleton/skeleton.constant.js +3 -0
  323. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  324. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  325. package/src/Spacer/Spacer.jsx +91 -0
  326. package/src/Spacer/index.js +3 -0
  327. package/src/StackView/StackView.jsx +111 -0
  328. package/src/StackView/StackWrap.jsx +41 -0
  329. package/src/StackView/StackWrap.native.jsx +4 -0
  330. package/src/StackView/StackWrapBox.jsx +94 -0
  331. package/src/StackView/StackWrapGap.jsx +49 -0
  332. package/src/StackView/common.jsx +28 -0
  333. package/src/StackView/getStackedContent.jsx +112 -0
  334. package/src/StackView/index.js +6 -0
  335. package/src/StepTracker/Step.jsx +202 -0
  336. package/src/StepTracker/StepTracker.jsx +163 -0
  337. package/src/StepTracker/dictionary.js +10 -0
  338. package/src/StepTracker/index.js +3 -0
  339. package/src/Tabs/HorizontalScroll.jsx +165 -0
  340. package/src/Tabs/ScrollViewEnd.jsx +53 -0
  341. package/src/Tabs/ScrollViewEnd.native.jsx +24 -0
  342. package/src/Tabs/Tabs.jsx +89 -0
  343. package/src/Tabs/TabsItem.jsx +204 -0
  344. package/src/Tabs/TabsScrollButton.jsx +100 -0
  345. package/src/Tabs/dictionary.js +11 -0
  346. package/src/Tabs/index.js +3 -0
  347. package/src/Tabs/itemPositions.js +101 -0
  348. package/src/Tags/Tags.jsx +207 -0
  349. package/src/Tags/index.js +3 -0
  350. package/src/TextInput/TextArea.jsx +78 -0
  351. package/src/TextInput/TextInput.jsx +52 -0
  352. package/src/TextInput/TextInputBase.jsx +210 -0
  353. package/src/TextInput/index.js +4 -0
  354. package/src/TextInput/propTypes.js +29 -0
  355. package/src/ThemeProvider/useThemeTokens.js +56 -5
  356. package/src/ThemeProvider/utils/styles.js +18 -5
  357. package/src/ThemeProvider/utils/theme-tokens.js +46 -5
  358. package/src/ToggleSwitch/ToggleSwitch.jsx +3 -4
  359. package/src/Tooltip/Backdrop.jsx +60 -0
  360. package/src/Tooltip/Backdrop.native.jsx +33 -0
  361. package/src/Tooltip/Tooltip.jsx +294 -0
  362. package/src/Tooltip/dictionary.js +8 -0
  363. package/src/Tooltip/getTooltipPosition.js +161 -0
  364. package/src/Tooltip/index.js +3 -0
  365. package/src/TooltipButton/TooltipButton.jsx +49 -0
  366. package/src/TooltipButton/index.js +3 -0
  367. package/src/Typography/Typography.jsx +10 -24
  368. package/src/ViewportProvider/ViewportProvider.jsx +21 -0
  369. package/src/ViewportProvider/index.jsx +2 -41
  370. package/src/ViewportProvider/useViewport.js +5 -0
  371. package/src/ViewportProvider/useViewportListener.js +43 -0
  372. package/src/index.js +34 -2
  373. package/src/utils/a11y/index.js +1 -0
  374. package/src/utils/a11y/textSize.js +30 -0
  375. package/src/utils/children.jsx +66 -0
  376. package/src/utils/index.js +11 -1
  377. package/src/utils/info/index.js +8 -0
  378. package/src/utils/info/platform/index.js +11 -0
  379. package/src/utils/info/platform/platform.android.js +1 -0
  380. package/src/utils/info/platform/platform.ios.js +1 -0
  381. package/src/utils/info/platform/platform.js +1 -0
  382. package/src/utils/info/platform/platform.native.js +4 -0
  383. package/src/utils/info/versions.js +6 -0
  384. package/src/utils/input.js +22 -13
  385. package/src/utils/pressability.js +96 -0
  386. package/src/utils/propTypes.js +195 -47
  387. package/src/utils/useCopy.js +39 -0
  388. package/src/utils/useHash.js +34 -0
  389. package/src/utils/useHash.native.js +6 -0
  390. package/src/utils/useResponsiveProp.js +50 -0
  391. package/src/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +25 -10
  392. package/src/utils/useUniqueId.js +14 -0
  393. package/stories/A11yText/A11yText.stories.jsx +15 -13
  394. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +11 -2
  395. package/stories/Box/Box.stories.jsx +29 -2
  396. package/stories/Button/Button.stories.jsx +21 -20
  397. package/stories/Button/ButtonGroup.stories.jsx +2 -1
  398. package/stories/Button/ButtonLink.stories.jsx +6 -4
  399. package/stories/Card/Card.stories.jsx +13 -1
  400. package/stories/Checkbox/Checkbox.stories.jsx +94 -0
  401. package/stories/Divider/Divider.stories.jsx +26 -2
  402. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +74 -79
  403. package/stories/Feedback/Feedback.stories.jsx +96 -0
  404. package/stories/FlexGrid/01 FlexGrid.stories.jsx +20 -7
  405. package/stories/Icon/Icon.stories.jsx +15 -6
  406. package/stories/InputLabel/InputLabel.stories.jsx +42 -0
  407. package/stories/Link/ChevronLink.stories.jsx +20 -4
  408. package/stories/Link/Link.stories.jsx +39 -3
  409. package/stories/Link/TextButton.stories.jsx +24 -2
  410. package/stories/List/List.stories.jsx +117 -0
  411. package/stories/Modal/Modal.stories.jsx +29 -0
  412. package/stories/Notification/Notification.stories.jsx +82 -0
  413. package/stories/Pagination/Pagination.stories.jsx +28 -14
  414. package/stories/Progress/Progress.stories.jsx +93 -0
  415. package/stories/Radio/Radio.stories.jsx +100 -0
  416. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  417. package/stories/Search/Search.stories.jsx +16 -0
  418. package/stories/Select/Select.stories.jsx +55 -0
  419. package/stories/SideNav/SideNav.stories.jsx +17 -2
  420. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  421. package/stories/Spacer/Spacer.stories.jsx +38 -0
  422. package/stories/StackView/StackView.stories.jsx +75 -0
  423. package/stories/StackView/StackWrap.stories.jsx +64 -0
  424. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  425. package/stories/Tabs/Tabs.stories.jsx +97 -0
  426. package/stories/Tags/Tags.stories.jsx +69 -0
  427. package/stories/TextInput/TextArea.stories.jsx +100 -0
  428. package/stories/TextInput/TextInput.stories.jsx +103 -0
  429. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +16 -3
  430. package/stories/Tooltip/Tooltip.stories.jsx +81 -0
  431. package/stories/TooltipButton/TooltipButton.stories.jsx +11 -0
  432. package/stories/Typography/Typography.stories.jsx +12 -3
  433. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  434. package/stories/supports.jsx +110 -14
  435. package/__fixtures__/accessible.icon.svg +0 -6
  436. package/babel.config.json +0 -8
  437. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  438. package/lib/Pagination/useCopy.js +0 -10
  439. package/lib/config/svgr-icons-web.js +0 -9
  440. package/lib/config/svgr-icons.js +0 -52
  441. package/lib/utils/spacing/index.js +0 -2
  442. package/lib/utils/spacing/utils.js +0 -32
  443. package/src/Pagination/useCopy.js +0 -7
  444. package/src/config/svgr-icons-web.js +0 -11
  445. package/src/config/svgr-icons.js +0 -46
  446. package/src/utils/spacing/index.js +0 -3
  447. 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;
@@ -0,0 +1,21 @@
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
+
10
+ let id = 0;
11
+
12
+ function useUniqueId(prefix = '') {
13
+ const [uniqueId] = (0, _react.useState)(() => {
14
+ id += 1;
15
+ return "".concat(prefix, "-").concat(id);
16
+ });
17
+ return uniqueId;
18
+ }
19
+
20
+ var _default = useUniqueId;
21
+ exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telus-uds/components-base",
3
- "version": "0.0.2-prerelease.4",
3
+ "version": "0.0.2-prerelease.8",
4
4
  "description": "Base components",
5
5
  "keywords": [
6
6
  "base"
@@ -9,8 +9,7 @@
9
9
  "homepage": "https://github.com/telus/universal-design-system#readme",
10
10
  "license": "ISC",
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.2",
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.1",
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.3",
3
- "changelog": "### [0.0.2-prerelease.4](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v0.0.2-prerelease.3...@telus-uds/components-base/v0.0.2-prerelease.4) (2021-10-13)\n\n\n### Bug Fixes\n\n* same rnw dep specification for base as components-allium-web ([#642](https://github.com/telus/universal-design-system/issues/642)) ([d40a9a2](https://github.com/telus/universal-design-system/commit/d40a9a2eade0a6ab276f13d02758fff0a88c2ecd))\n",
4
- "releaseTag": "@telus-uds/components-base/v0.0.2-prerelease.4",
5
- "newVersion": "0.0.2-prerelease.4",
2
+ "previousReleaseTag": "@telus-uds/components-base/v0.0.2-prerelease.7",
3
+ "changelog": "### [0.0.2-prerelease.8](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v0.0.2-prerelease.7...@telus-uds/components-base/v0.0.2-prerelease.8) (2021-12-15)\n\n\n### Features\n\n* **base:** add `ProgressBar` component ([#890](https://github.com/telus/universal-design-system/issues/890)) ([b98315c](https://github.com/telus/universal-design-system/commit/b98315cc7dabb2c7130c62c9c3bbf6fdfb7419a0))\n* **base:** add `Tabs` component ([#908](https://github.com/telus/universal-design-system/issues/908)) ([073bbd2](https://github.com/telus/universal-design-system/commit/073bbd2a0b4282112aa434f8e97e505fa8b4b92f))\n* **base:** add base `StepTracker` component ([#800](https://github.com/telus/universal-design-system/issues/800)) ([aa7d472](https://github.com/telus/universal-design-system/commit/aa7d47297c1d9ba13daef60b5184ead07b95cd52))\n* **base:** add Group fieldsets for RadioCard, Radio, Checkbox ([#875](https://github.com/telus/universal-design-system/issues/875)) ([4b99987](https://github.com/telus/universal-design-system/commit/4b999872714144b643f676d3d473369d605b3eea))\n* **base:** add Notification ([#848](https://github.com/telus/universal-design-system/issues/848)) ([ee6a83e](https://github.com/telus/universal-design-system/commit/ee6a83e05dc991acef3b9449f78c17d43d63b248))\n* **base:** add RadioCard and PressableCardBase ([#865](https://github.com/telus/universal-design-system/issues/865)) ([55c6fa2](https://github.com/telus/universal-design-system/commit/55c6fa293f2fa09499aed763910d3791eefbc4a1))\n* **base:** add the Modal component ([#878](https://github.com/telus/universal-design-system/issues/878)) ([431d4cd](https://github.com/telus/universal-design-system/commit/431d4cd2c1a7f4ce30b453d437b9f5d7b69fd251))\n* **base:** add the Search component ([#798](https://github.com/telus/universal-design-system/issues/798)) ([7b974df](https://github.com/telus/universal-design-system/commit/7b974df12d2bf0cb94b6360091bac8ac57dd7245))\n* **base:** handle `Tabs` hashes, with `useHash` ([#910](https://github.com/telus/universal-design-system/issues/910)) ([8ad6507](https://github.com/telus/universal-design-system/commit/8ad65072c249e8439e7d1c7e55fee535a5f30b4e))\n* **ds-allium:** `PriceLockup` implmementation ([#858](https://github.com/telus/universal-design-system/issues/858)) ([8669b9e](https://github.com/telus/universal-design-system/commit/8669b9e3f80261bd18962dfba5d774c90a5f4ebb))\n* **ds-allium:** add `StoryCard` component ([#880](https://github.com/telus/universal-design-system/issues/880)) ([6f0616d](https://github.com/telus/universal-design-system/commit/6f0616dc761cbdcf470bc2505d773eb362bf800e))\n* **ds-allium:** add Modal content types ([#896](https://github.com/telus/universal-design-system/issues/896)) ([f070447](https://github.com/telus/universal-design-system/commit/f070447fc796139046a96892aab34b74bc1974a4))\n* **ds-allium:** add SubNavigation ([#931](https://github.com/telus/universal-design-system/issues/931)) ([834ee7b](https://github.com/telus/universal-design-system/commit/834ee7bbe811ea8477ac4870466ae573d73e3a8f))\n* use built icons ([#809](https://github.com/telus/universal-design-system/issues/809)) ([120802e](https://github.com/telus/universal-design-system/commit/120802e11bcb4352b9d2e171525f6dc5b687c023))\n\n\n### Bug Fixes\n\n* **base:** add outer border to Radio, extract RadioButton ([#847](https://github.com/telus/universal-design-system/issues/847)) ([b563335](https://github.com/telus/universal-design-system/commit/b563335087fbfffe6739ad185fe4fc7886ef4e4d))\n* **base:** fix Tags icon, update Allium Tags/ButtonGroup ([#888](https://github.com/telus/universal-design-system/issues/888)) ([6d6ff35](https://github.com/telus/universal-design-system/commit/6d6ff35caba4c9c6c99eacf015be56e8862ad170))\n* **components-base:** Remove named import of json file ([#930](https://github.com/telus/universal-design-system/issues/930)) ([9db1cbe](https://github.com/telus/universal-design-system/commit/9db1cbe501d3c049f1f6476720a3ee9bd8b4d736))\n* fix storybook error from proptypes ([#857](https://github.com/telus/universal-design-system/issues/857)) ([175537a](https://github.com/telus/universal-design-system/commit/175537a6ac4b48699f66b1a59eb35910cbf9930b))\n* update test theme icons + cleanup ds-allium icon usage ([#860](https://github.com/telus/universal-design-system/issues/860)) ([c2c0a84](https://github.com/telus/universal-design-system/commit/c2c0a84914eed9dafaf47acca30e1f5119f19e57))\n",
4
+ "releaseTag": "@telus-uds/components-base/v0.0.2-prerelease.8",
5
+ "newVersion": "0.0.2-prerelease.8",
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
@@ -99,9 +106,10 @@ const Box = ({
99
106
  variant,
100
107
  tokens,
101
108
  scroll,
109
+ testID,
102
110
  ...rest
103
111
  }) => {
104
- const a11y = a11yProps.select(rest)
112
+ const props = { ...a11yProps.select(rest), ...viewProps.select(rest) }
105
113
 
106
114
  const themeTokens = useThemeTokens('Box', tokens, variant)
107
115
  const styles = {
@@ -116,13 +124,13 @@ const Box = ({
116
124
  const scrollProps = typeof scroll === 'object' ? scroll : {}
117
125
  scrollProps.contentContainerStyle = [styles, scrollProps.contentContainerStyle]
118
126
  return (
119
- <ScrollView {...scrollProps} {...a11y}>
127
+ <ScrollView {...scrollProps} {...props} testID={testID}>
120
128
  {children}
121
129
  </ScrollView>
122
130
  )
123
131
  }
124
132
  return (
125
- <View {...a11y} style={styles}>
133
+ <View {...props} style={styles} testID={testID}>
126
134
  {children}
127
135
  </View>
128
136
  )
@@ -142,6 +150,7 @@ Box.propTypes = {
142
150
  ]),
143
151
  variant: variantProp.propType,
144
152
  tokens: getTokensPropType('Box'),
153
+ testID: PropTypes.string,
145
154
  children: PropTypes.node.isRequired
146
155
  }
147
156
 
@@ -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,67 +1,53 @@
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
19
17
 
20
18
  const selectOuterContainerStyles = ({
19
+ alignSelf,
21
20
  opacity,
22
21
  outerBorderColor,
23
22
  outerBorderWidth,
24
- outerBorderGap = 0,
25
- outerBorderRadius = 0,
23
+ outerBorderGap,
24
+ borderRadius,
26
25
  outerBackgroundColor
27
26
  }) => ({
28
- padding: outerBorderGap,
29
- borderWidth: outerBorderWidth,
30
- borderColor: outerBorderColor,
31
- borderRadius: outerBorderRadius + outerBorderGap,
27
+ alignSelf,
32
28
  backgroundColor: outerBackgroundColor,
33
- opacity
29
+ opacity,
30
+ ...applyOuterBorder({
31
+ outerBorderGap,
32
+ outerBorderWidth,
33
+ outerBorderColor,
34
+ borderRadius
35
+ })
34
36
  })
35
37
 
36
- const selectOuterWidthStyles = ({
37
- outerBorderGap,
38
- outerBorderWidth,
39
- width,
40
- // TODO: make margin the responsibility of a parent
41
- // https://github.com/telus/universal-design-system/issues/525
42
- marginTop = 0,
43
- marginBottom = 0,
44
- marginLeft = 0,
45
- marginRight = 0
46
- }) => {
38
+ const selectOuterWidthStyles = ({ outerBorderGap, outerBorderWidth, width }) => {
47
39
  // The inner container's bounding box is the bounding box of the button overall
48
40
  // so this many device pixels will sit outside of the overall bounding box
49
41
  const outerBorderOffset = getOuterBorderOffset({ outerBorderGap, outerBorderWidth })
50
- const widthStyles = {
51
- marginTop: marginTop - outerBorderOffset,
52
- marginBottom: marginBottom - outerBorderOffset,
53
- marginLeft: marginLeft - outerBorderOffset,
54
- marginRight: marginRight - outerBorderOffset
55
- }
42
+ const widthStyles = {}
56
43
 
57
44
  if (!width) {
58
45
  return {
59
46
  ...widthStyles,
60
47
  // Wrap content, stopping a flex parent's default align-items: stretch stretching focus ring beyond content
61
48
  ...Platform.select({
62
- web: { width: 'fit-content' },
63
- // No fit-content or inline-block in RN. TODO: we might need to provide a prop to allow flex-end or center
64
- native: { alignSelf: 'flex-start' }
49
+ // width: fit-content isn't supported on Firefox; can't cascade props like CSS `width: fit-content; width: --moz-fit-content;`
50
+ web: { display: 'inline-flex' }
65
51
  })
66
52
  }
67
53
  }
@@ -95,7 +81,8 @@ const selectInnerContainerStyles = ({
95
81
  paddingTop,
96
82
  paddingBottom,
97
83
  shadow,
98
- borderWidth
84
+ borderWidth,
85
+ minWidth
99
86
  }) => {
100
87
  // Subtract border width from padding so overall button width/height doesn't
101
88
  // jump around if the border width changes (avoiding NaN and negative padding)
@@ -110,6 +97,7 @@ const selectInnerContainerStyles = ({
110
97
  paddingTop: offsetBorder(paddingTop),
111
98
  paddingBottom: offsetBorder(paddingBottom),
112
99
  backgroundColor,
100
+ minWidth,
113
101
  ...applyShadowToken(shadow)
114
102
  }
115
103
  }
@@ -130,76 +118,63 @@ const selectTextStyles = ({ fontSize, color, lineHeight, fontName, fontWeight, t
130
118
  textAlign
131
119
  })
132
120
 
133
- const selectWebOnlyStyles = (inactive, themeTokens, { accessibilityRole }) =>
134
- Platform.OS === 'web'
135
- ? {
136
- // if it would overflow the container, wraps instead
137
- maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
138
- cursor: getCursorStyle(inactive, accessibilityRole),
139
- outline: 'none' // removes the default browser :focus outline
140
- }
141
- : {}
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
+ }
142
132
 
143
133
  const ButtonBase = ({
144
134
  href,
145
135
  hrefAttrs,
146
136
  children,
147
- variant,
148
137
  onPress,
149
- tokens,
138
+ tokens = {},
150
139
  disabled = false, // alias for inactive
151
140
  inactive = disabled,
152
141
  selected = false,
153
142
  ...rest
154
143
  }) => {
155
- const getTokens = useThemeTokensCallback('Button', tokens, variant)
156
- const getButtonState = ({ pressed, focused, hovered }) => ({
157
- pressed,
158
- focus: focused,
159
- hover: hovered,
160
- inactive,
161
- selected
162
- })
163
- const getTokensByPressableState = (pressableState) => getTokens(getButtonState(pressableState))
144
+ const extraButtonState = { inactive, selected }
145
+ const resolveButtonTokens = (pressableState) =>
146
+ resolvePressableTokens(tokens, pressableState, extraButtonState)
164
147
 
165
148
  const a11y = a11yProps.select(rest)
166
149
 
167
150
  const getPressableStyle = (pressableState) => {
168
- const themeTokens = getTokensByPressableState(pressableState)
151
+ const themeTokens = resolveButtonTokens(pressableState)
169
152
  return [
170
- staticStyles.wrapper,
153
+ staticStyles.row,
171
154
  selectWebOnlyStyles(inactive, themeTokens, a11y),
172
155
  selectOuterContainerStyles(themeTokens),
173
156
  selectOuterWidthStyles(themeTokens)
174
157
  ]
175
158
  }
176
159
 
177
- const handlePress = linkProps.handleHref({ href, onPress })
178
-
179
160
  return (
180
161
  <Pressable
181
- onPress={handlePress}
162
+ href={href}
163
+ onPress={linkProps.handleHref({ href, onPress })}
182
164
  style={getPressableStyle}
183
165
  disabled={inactive}
184
- href={href}
185
- {...hrefAttrsProp.spread(hrefAttrs)}
166
+ hrefAttrs={hrefAttrs}
186
167
  {...a11y}
187
168
  >
188
169
  {(pressableState) => {
189
- const themeTokens = getTokensByPressableState(pressableState)
170
+ const themeTokens = resolveButtonTokens(pressableState)
190
171
  const containerStyles = selectInnerContainerStyles(themeTokens)
191
172
  const borderStyles = selectBorderStyles(themeTokens)
192
- const textStyles = {
193
- ...selectTextStyles(themeTokens),
194
- ...Platform.select({
195
- // TODO: https://github.com/telus/universal-design-system/issues/487
196
- web: { transition: 'color 200ms' }
197
- })
198
- }
173
+ const textStyles = [selectTextStyles(themeTokens), staticStyles.text]
199
174
 
200
175
  // If the container has a width set, fill it instead of sizing from content.
201
176
  // If in future we support text alignments other than center, add here.
202
- const stretchStyles = !!themeTokens.width && staticStyles.center
177
+ const stretchStyles = themeTokens.width ? staticStyles.stretch : staticStyles.align
203
178
 
204
179
  return (
205
180
  <View
@@ -207,6 +182,7 @@ const ButtonBase = ({
207
182
  containerStyles,
208
183
  borderStyles,
209
184
  stretchStyles,
185
+ staticStyles.row,
210
186
  Platform.select({
211
187
  web: {
212
188
  maxWidth: '100%', // ensure overflowing content wraps
@@ -216,13 +192,14 @@ const ButtonBase = ({
216
192
  })
217
193
  ]}
218
194
  >
219
- {typeof children === 'function' ? (
220
- children({
221
- ...getButtonState(pressableState),
222
- textStyles
223
- })
224
- ) : (
225
- <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 }
226
203
  )}
227
204
  </View>
228
205
  )
@@ -238,10 +215,21 @@ ButtonBase.propTypes = {
238
215
  }
239
216
 
240
217
  const staticStyles = StyleSheet.create({
241
- wrapper: {
242
- 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'
243
231
  },
244
- center: {
232
+ stretch: {
245
233
  flex: 1,
246
234
  alignItems: 'center',
247
235
  justifyContent: 'center'