@telus-uds/components-base 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.turbo/turbo-build.log +8 -0
  2. package/CHANGELOG.json +61 -0
  3. package/CHANGELOG.md +45 -2
  4. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +35 -0
  5. package/__tests__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +287 -0
  6. package/__tests__/FlexGrid/Col.test.jsx +6 -10
  7. package/__tests__/utils/props.test.js +36 -0
  8. package/__tests__/utils/semantics.test.jsx +1 -10
  9. package/babel.config.js +27 -5
  10. package/component-docs.json +170 -494
  11. package/generate-component-docs.js +3 -0
  12. package/lib/A11yText/index.js +6 -5
  13. package/lib/ActivityIndicator/Spinner.js +46 -37
  14. package/lib/ActivityIndicator/Spinner.native.js +26 -15
  15. package/lib/ActivityIndicator/index.js +3 -3
  16. package/lib/Box/Box.js +8 -8
  17. package/lib/Button/Button.js +2 -2
  18. package/lib/Button/ButtonBase.js +7 -8
  19. package/lib/Button/ButtonGroup.js +10 -12
  20. package/lib/Button/ButtonLink.js +4 -4
  21. package/lib/Button/propTypes.js +4 -2
  22. package/lib/Card/Card.js +6 -5
  23. package/lib/Card/CardBase.js +6 -9
  24. package/lib/Card/PressableCardBase.js +6 -11
  25. package/lib/Checkbox/Checkbox.js +4 -6
  26. package/lib/Divider/Divider.js +14 -13
  27. package/lib/ExpandCollapse/Control.js +7 -7
  28. package/lib/ExpandCollapse/ExpandCollapse.js +6 -2
  29. package/lib/ExpandCollapse/Panel.js +6 -7
  30. package/lib/Feedback/Feedback.js +6 -5
  31. package/lib/Fieldset/Fieldset.js +1 -3
  32. package/lib/FlexGrid/FlexGrid.js +4 -4
  33. package/lib/FlexGrid/helpers/index.js +1 -4
  34. package/lib/HorizontalScroll/HorizontalScroll.js +5 -6
  35. package/lib/IconButton/IconButton.js +6 -6
  36. package/lib/InputLabel/InputLabel.js +7 -2
  37. package/lib/InputSupports/InputSupports.js +2 -2
  38. package/lib/Link/LinkBase.js +12 -13
  39. package/lib/List/List.js +4 -6
  40. package/lib/List/ListItem.js +6 -2
  41. package/lib/Modal/Modal.js +6 -2
  42. package/lib/Notification/Notification.js +12 -8
  43. package/lib/Pagination/Pagination.js +8 -3
  44. package/lib/Progress/Progress.js +5 -4
  45. package/lib/Progress/ProgressBar.js +8 -7
  46. package/lib/Radio/Radio.js +4 -6
  47. package/lib/Radio/RadioButton.js +6 -3
  48. package/lib/Radio/RadioGroup.js +7 -2
  49. package/lib/RadioCard/RadioCard.js +4 -4
  50. package/lib/RadioCard/RadioCardGroup.js +9 -6
  51. package/lib/Search/Search.js +7 -2
  52. package/lib/Select/Select.js +10 -9
  53. package/lib/SideNav/Item.js +7 -7
  54. package/lib/SideNav/SideNav.js +7 -3
  55. package/lib/Skeleton/Skeleton.js +6 -2
  56. package/lib/Spacer/Spacer.js +9 -20
  57. package/lib/StackView/StackView.js +7 -7
  58. package/lib/StackView/StackWrapBox.js +6 -7
  59. package/lib/StackView/StackWrapGap.js +6 -5
  60. package/lib/StackView/getStackedContent.js +1 -1
  61. package/lib/StepTracker/Step.js +7 -3
  62. package/lib/StepTracker/StepTracker.js +7 -7
  63. package/lib/Tabs/Tabs.js +6 -2
  64. package/lib/Tabs/TabsItem.js +6 -5
  65. package/lib/Tags/Tags.js +11 -12
  66. package/lib/TextInput/TextArea.js +13 -14
  67. package/lib/TextInput/TextInput.js +13 -14
  68. package/lib/TextInput/TextInputBase.js +5 -3
  69. package/lib/ThemeProvider/useThemeTokens.js +3 -3
  70. package/lib/ThemeProvider/utils/theme-tokens.js +3 -3
  71. package/lib/ToggleSwitch/ToggleSwitch.js +10 -9
  72. package/lib/ToggleSwitch/ToggleSwitchGroup.js +10 -12
  73. package/lib/Tooltip/Tooltip.js +7 -2
  74. package/lib/TooltipButton/TooltipButton.js +7 -2
  75. package/lib/Typography/Typography.js +8 -6
  76. package/lib/index.js +7 -0
  77. package/lib/utils/a11y/semantics.js +4 -3
  78. package/lib/utils/children.js +5 -1
  79. package/lib/utils/index.js +18 -4
  80. package/lib/utils/pressability.js +2 -2
  81. package/lib/utils/props/a11yProps.js +153 -0
  82. package/lib/utils/props/clickProps.js +36 -0
  83. package/lib/utils/props/componentPropType.js +70 -0
  84. package/lib/utils/props/copyPropTypes.js +14 -0
  85. package/lib/utils/props/getPropSelector.js +13 -0
  86. package/lib/utils/props/hrefAttrsProp.js +41 -0
  87. package/lib/utils/props/index.js +158 -0
  88. package/lib/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -3
  89. package/lib/utils/props/linkProps.js +64 -0
  90. package/lib/utils/props/paddingProp.js +20 -0
  91. package/lib/utils/props/pressProps.js +57 -0
  92. package/lib/utils/props/rectProp.js +20 -0
  93. package/lib/utils/props/responsiveProps.js +40 -0
  94. package/lib/utils/props/selectSystemProps.js +31 -0
  95. package/lib/utils/props/spacingProps.js +71 -0
  96. package/lib/utils/props/tokens.js +145 -0
  97. package/lib/utils/props/variantProp.js +28 -0
  98. package/lib/utils/props/viewProps.js +34 -0
  99. package/lib/utils/ssr.js +51 -0
  100. package/lib/utils/useResponsiveProp.js +1 -1
  101. package/lib/utils/useSpacingScale.js +4 -4
  102. package/lib-module/A11yInfoProvider/index.js +62 -0
  103. package/lib-module/A11yText/index.js +55 -0
  104. package/lib-module/ActivityIndicator/Spinner.js +76 -0
  105. package/lib-module/ActivityIndicator/Spinner.native.js +143 -0
  106. package/lib-module/ActivityIndicator/index.js +40 -0
  107. package/lib-module/ActivityIndicator/shared.js +12 -0
  108. package/lib-module/BaseProvider/index.js +26 -0
  109. package/lib-module/Box/Box.js +243 -0
  110. package/lib-module/Box/index.js +2 -0
  111. package/lib-module/Button/Button.js +25 -0
  112. package/lib-module/Button/ButtonBase.js +254 -0
  113. package/lib-module/Button/ButtonGroup.js +164 -0
  114. package/lib-module/Button/ButtonLink.js +39 -0
  115. package/lib-module/Button/index.js +4 -0
  116. package/lib-module/Button/propTypes.js +36 -0
  117. package/lib-module/Card/Card.js +83 -0
  118. package/lib-module/Card/CardBase.js +62 -0
  119. package/lib-module/Card/PressableCardBase.js +113 -0
  120. package/lib-module/Card/index.js +4 -0
  121. package/lib-module/Checkbox/Checkbox.js +321 -0
  122. package/lib-module/Checkbox/CheckboxGroup.js +218 -0
  123. package/lib-module/Checkbox/CheckboxInput.js +58 -0
  124. package/lib-module/Checkbox/CheckboxInput.native.js +6 -0
  125. package/lib-module/Checkbox/index.js +3 -0
  126. package/lib-module/Divider/Divider.js +123 -0
  127. package/lib-module/Divider/index.js +2 -0
  128. package/lib-module/ExpandCollapse/Accordion.js +15 -0
  129. package/lib-module/ExpandCollapse/Control.js +130 -0
  130. package/lib-module/ExpandCollapse/ExpandCollapse.js +94 -0
  131. package/lib-module/ExpandCollapse/Panel.js +158 -0
  132. package/lib-module/ExpandCollapse/index.js +7 -0
  133. package/lib-module/Feedback/Feedback.js +144 -0
  134. package/lib-module/Feedback/index.js +2 -0
  135. package/lib-module/Fieldset/Fieldset.js +145 -0
  136. package/lib-module/Fieldset/FieldsetContainer.js +29 -0
  137. package/lib-module/Fieldset/FieldsetContainer.native.js +20 -0
  138. package/lib-module/Fieldset/Legend.js +21 -0
  139. package/lib-module/Fieldset/Legend.native.js +28 -0
  140. package/lib-module/Fieldset/cssReset.js +14 -0
  141. package/lib-module/Fieldset/index.js +2 -0
  142. package/lib-module/FlexGrid/Col/Col.js +265 -0
  143. package/lib-module/FlexGrid/Col/index.js +2 -0
  144. package/lib-module/FlexGrid/FlexGrid.js +147 -0
  145. package/lib-module/FlexGrid/Row/Row.js +177 -0
  146. package/lib-module/FlexGrid/Row/index.js +2 -0
  147. package/lib-module/FlexGrid/helpers/index.js +18 -0
  148. package/lib-module/FlexGrid/index.js +2 -0
  149. package/lib-module/FlexGrid/providers/GutterContext.js +3 -0
  150. package/lib-module/HorizontalScroll/HorizontalScroll.js +171 -0
  151. package/lib-module/HorizontalScroll/HorizontalScrollButton.js +102 -0
  152. package/lib-module/HorizontalScroll/ScrollViewEnd.js +47 -0
  153. package/lib-module/HorizontalScroll/ScrollViewEnd.native.js +24 -0
  154. package/lib-module/HorizontalScroll/dictionary.js +11 -0
  155. package/lib-module/HorizontalScroll/index.js +11 -0
  156. package/lib-module/HorizontalScroll/itemPositions.js +106 -0
  157. package/lib-module/Icon/Icon.js +61 -0
  158. package/lib-module/Icon/IconText.js +81 -0
  159. package/lib-module/Icon/index.js +4 -0
  160. package/lib-module/IconButton/IconButton.js +115 -0
  161. package/lib-module/IconButton/index.js +2 -0
  162. package/lib-module/InputLabel/InputLabel.js +131 -0
  163. package/lib-module/InputLabel/LabelContent.js +24 -0
  164. package/lib-module/InputLabel/LabelContent.native.js +16 -0
  165. package/lib-module/InputLabel/index.js +2 -0
  166. package/lib-module/InputSupports/InputSupports.js +88 -0
  167. package/lib-module/InputSupports/index.js +2 -0
  168. package/lib-module/InputSupports/useInputSupports.js +31 -0
  169. package/lib-module/Link/ChevronLink.js +51 -0
  170. package/lib-module/Link/InlinePressable.js +37 -0
  171. package/lib-module/Link/InlinePressable.native.js +85 -0
  172. package/lib-module/Link/Link.js +27 -0
  173. package/lib-module/Link/LinkBase.js +210 -0
  174. package/lib-module/Link/TextButton.js +43 -0
  175. package/lib-module/Link/index.js +5 -0
  176. package/lib-module/List/List.js +55 -0
  177. package/lib-module/List/ListItem.js +213 -0
  178. package/lib-module/List/index.js +5 -0
  179. package/lib-module/Modal/Modal.js +208 -0
  180. package/lib-module/Modal/dictionary.js +9 -0
  181. package/lib-module/Modal/index.js +2 -0
  182. package/lib-module/Notification/Notification.js +196 -0
  183. package/lib-module/Notification/dictionary.js +8 -0
  184. package/lib-module/Notification/index.js +2 -0
  185. package/lib-module/Pagination/PageButton.js +65 -0
  186. package/lib-module/Pagination/Pagination.js +140 -0
  187. package/lib-module/Pagination/SideButton.js +103 -0
  188. package/lib-module/Pagination/dictionary.js +18 -0
  189. package/lib-module/Pagination/index.js +2 -0
  190. package/lib-module/Pagination/usePagination.js +72 -0
  191. package/lib-module/Progress/Progress.js +85 -0
  192. package/lib-module/Progress/ProgressBar.js +134 -0
  193. package/lib-module/Progress/ProgressBarBackground.js +41 -0
  194. package/lib-module/Progress/index.js +4 -0
  195. package/lib-module/Radio/Radio.js +263 -0
  196. package/lib-module/Radio/RadioButton.js +128 -0
  197. package/lib-module/Radio/RadioGroup.js +225 -0
  198. package/lib-module/Radio/RadioInput.js +60 -0
  199. package/lib-module/Radio/RadioInput.native.js +6 -0
  200. package/lib-module/Radio/index.js +3 -0
  201. package/lib-module/RadioCard/RadioCard.js +218 -0
  202. package/lib-module/RadioCard/RadioCardGroup.js +232 -0
  203. package/lib-module/RadioCard/index.js +3 -0
  204. package/lib-module/Search/Search.js +233 -0
  205. package/lib-module/Search/dictionary.js +12 -0
  206. package/lib-module/Search/index.js +2 -0
  207. package/lib-module/Select/Group.js +20 -0
  208. package/lib-module/Select/Group.native.js +14 -0
  209. package/lib-module/Select/Item.js +17 -0
  210. package/lib-module/Select/Item.native.js +9 -0
  211. package/lib-module/Select/Picker.js +67 -0
  212. package/lib-module/Select/Picker.native.js +110 -0
  213. package/lib-module/Select/Select.js +317 -0
  214. package/lib-module/Select/index.js +6 -0
  215. package/lib-module/SideNav/Item.js +139 -0
  216. package/lib-module/SideNav/ItemContent.js +45 -0
  217. package/lib-module/SideNav/ItemsGroup.js +115 -0
  218. package/lib-module/SideNav/SideNav.js +133 -0
  219. package/lib-module/SideNav/index.js +1 -0
  220. package/lib-module/Skeleton/Skeleton.js +117 -0
  221. package/lib-module/Skeleton/index.js +2 -0
  222. package/lib-module/Skeleton/skeleton.constant.js +3 -0
  223. package/lib-module/Skeleton/skeletonWebAnimation.js +18 -0
  224. package/lib-module/Skeleton/useSkeletonNativeAnimation.js +24 -0
  225. package/lib-module/Spacer/Spacer.js +97 -0
  226. package/lib-module/Spacer/index.js +2 -0
  227. package/lib-module/StackView/StackView.js +124 -0
  228. package/lib-module/StackView/StackWrap.js +48 -0
  229. package/lib-module/StackView/StackWrap.native.js +3 -0
  230. package/lib-module/StackView/StackWrapBox.js +114 -0
  231. package/lib-module/StackView/StackWrapGap.js +58 -0
  232. package/lib-module/StackView/common.js +32 -0
  233. package/lib-module/StackView/getStackedContent.js +123 -0
  234. package/lib-module/StackView/index.js +5 -0
  235. package/lib-module/StepTracker/Step.js +229 -0
  236. package/lib-module/StepTracker/StepTracker.js +175 -0
  237. package/lib-module/StepTracker/dictionary.js +10 -0
  238. package/lib-module/StepTracker/index.js +2 -0
  239. package/lib-module/Tabs/Tabs.js +113 -0
  240. package/lib-module/Tabs/TabsItem.js +215 -0
  241. package/lib-module/Tabs/index.js +2 -0
  242. package/lib-module/Tags/Tags.js +238 -0
  243. package/lib-module/Tags/index.js +2 -0
  244. package/lib-module/TextInput/TextArea.js +88 -0
  245. package/lib-module/TextInput/TextInput.js +60 -0
  246. package/lib-module/TextInput/TextInputBase.js +233 -0
  247. package/lib-module/TextInput/index.js +3 -0
  248. package/lib-module/TextInput/propTypes.js +31 -0
  249. package/lib-module/ThemeProvider/ThemeProvider.js +35 -0
  250. package/lib-module/ThemeProvider/index.js +6 -0
  251. package/lib-module/ThemeProvider/useSetTheme.js +22 -0
  252. package/lib-module/ThemeProvider/useTheme.js +14 -0
  253. package/lib-module/ThemeProvider/useThemeTokens.js +105 -0
  254. package/lib-module/ThemeProvider/utils/index.js +2 -0
  255. package/lib-module/ThemeProvider/utils/styles.js +174 -0
  256. package/lib-module/ThemeProvider/utils/theme-tokens.js +151 -0
  257. package/lib-module/ToggleSwitch/ToggleSwitch.js +224 -0
  258. package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +202 -0
  259. package/lib-module/ToggleSwitch/index.js +3 -0
  260. package/lib-module/Tooltip/Backdrop.js +52 -0
  261. package/lib-module/Tooltip/Backdrop.native.js +43 -0
  262. package/lib-module/Tooltip/Tooltip.js +332 -0
  263. package/lib-module/Tooltip/dictionary.js +8 -0
  264. package/lib-module/Tooltip/getTooltipPosition.js +164 -0
  265. package/lib-module/Tooltip/index.js +2 -0
  266. package/lib-module/TooltipButton/TooltipButton.js +71 -0
  267. package/lib-module/TooltipButton/index.js +2 -0
  268. package/lib-module/Typography/Typography.js +118 -0
  269. package/lib-module/Typography/index.js +2 -0
  270. package/lib-module/ViewportProvider/ViewportProvider.js +28 -0
  271. package/lib-module/ViewportProvider/index.js +3 -0
  272. package/lib-module/ViewportProvider/useViewport.js +3 -0
  273. package/lib-module/ViewportProvider/useViewportListener.js +43 -0
  274. package/lib-module/index.js +48 -0
  275. package/lib-module/utils/a11y/index.js +2 -0
  276. package/lib-module/utils/a11y/semantics.js +154 -0
  277. package/lib-module/utils/a11y/textSize.js +34 -0
  278. package/lib-module/utils/animation/index.js +2 -0
  279. package/lib-module/utils/animation/useVerticalExpandAnimation.js +49 -0
  280. package/lib-module/utils/children.js +118 -0
  281. package/lib-module/utils/index.js +15 -0
  282. package/lib-module/utils/info/index.js +7 -0
  283. package/lib-module/utils/info/platform/index.js +11 -0
  284. package/lib-module/utils/info/platform/platform.android.js +1 -0
  285. package/lib-module/utils/info/platform/platform.ios.js +1 -0
  286. package/lib-module/utils/info/platform/platform.js +1 -0
  287. package/lib-module/utils/info/platform/platform.native.js +4 -0
  288. package/lib-module/utils/info/versions.js +5 -0
  289. package/lib-module/utils/input.js +180 -0
  290. package/lib-module/utils/pressability.js +97 -0
  291. package/lib-module/utils/props/a11yProps.js +140 -0
  292. package/lib-module/utils/props/clickProps.js +25 -0
  293. package/lib-module/utils/props/componentPropType.js +63 -0
  294. package/lib-module/utils/props/copyPropTypes.js +2 -0
  295. package/lib-module/utils/props/getPropSelector.js +6 -0
  296. package/lib-module/utils/props/hrefAttrsProp.js +30 -0
  297. package/lib-module/utils/props/index.js +16 -0
  298. package/lib-module/utils/props/inputSupportsProps.js +54 -0
  299. package/lib-module/utils/props/linkProps.js +47 -0
  300. package/lib-module/utils/props/paddingProp.js +9 -0
  301. package/lib-module/utils/props/pressProps.js +42 -0
  302. package/lib-module/utils/props/rectProp.js +9 -0
  303. package/lib-module/utils/props/responsiveProps.js +30 -0
  304. package/lib-module/utils/props/selectSystemProps.js +24 -0
  305. package/lib-module/utils/props/spacingProps.js +56 -0
  306. package/lib-module/utils/props/tokens.js +120 -0
  307. package/lib-module/utils/props/variantProp.js +18 -0
  308. package/lib-module/utils/props/viewProps.js +22 -0
  309. package/lib-module/utils/ssr.js +35 -0
  310. package/lib-module/utils/useCopy.js +42 -0
  311. package/lib-module/utils/useHash.js +44 -0
  312. package/lib-module/utils/useHash.native.js +7 -0
  313. package/lib-module/utils/useResponsiveProp.js +47 -0
  314. package/lib-module/utils/useSpacingScale.js +123 -0
  315. package/lib-module/utils/useUniqueId.js +12 -0
  316. package/lib-module/utils/withLinkRouter.js +82 -0
  317. package/package.json +9 -5
  318. package/src/A11yText/index.jsx +7 -3
  319. package/src/ActivityIndicator/Spinner.jsx +56 -44
  320. package/src/ActivityIndicator/Spinner.native.jsx +20 -12
  321. package/src/ActivityIndicator/index.jsx +1 -1
  322. package/src/Box/Box.jsx +15 -13
  323. package/src/Button/Button.jsx +1 -1
  324. package/src/Button/ButtonBase.jsx +9 -8
  325. package/src/Button/ButtonGroup.jsx +17 -8
  326. package/src/Button/ButtonLink.jsx +1 -1
  327. package/src/Button/propTypes.js +2 -1
  328. package/src/Card/Card.jsx +7 -4
  329. package/src/Card/CardBase.jsx +6 -5
  330. package/src/Card/PressableCardBase.jsx +12 -12
  331. package/src/Checkbox/Checkbox.jsx +12 -5
  332. package/src/Divider/Divider.jsx +19 -12
  333. package/src/ExpandCollapse/Control.jsx +12 -7
  334. package/src/ExpandCollapse/ExpandCollapse.jsx +13 -3
  335. package/src/ExpandCollapse/Panel.jsx +15 -5
  336. package/src/Feedback/Feedback.jsx +13 -3
  337. package/src/Fieldset/Fieldset.jsx +1 -1
  338. package/src/FlexGrid/FlexGrid.jsx +11 -5
  339. package/src/FlexGrid/helpers/index.js +1 -3
  340. package/src/HorizontalScroll/HorizontalScroll.jsx +12 -5
  341. package/src/IconButton/IconButton.jsx +12 -8
  342. package/src/InputLabel/InputLabel.jsx +16 -2
  343. package/src/InputSupports/InputSupports.jsx +1 -1
  344. package/src/Link/LinkBase.jsx +11 -10
  345. package/src/List/List.jsx +12 -5
  346. package/src/List/ListItem.jsx +16 -2
  347. package/src/Modal/Modal.jsx +63 -50
  348. package/src/Notification/Notification.jsx +23 -6
  349. package/src/Pagination/Pagination.jsx +10 -3
  350. package/src/Progress/Progress.jsx +5 -3
  351. package/src/Progress/ProgressBar.jsx +8 -6
  352. package/src/Radio/Radio.jsx +13 -5
  353. package/src/Radio/RadioButton.jsx +13 -3
  354. package/src/Radio/RadioGroup.jsx +14 -2
  355. package/src/RadioCard/RadioCard.jsx +9 -6
  356. package/src/RadioCard/RadioCardGroup.jsx +16 -4
  357. package/src/Search/Search.jsx +15 -3
  358. package/src/Select/Select.jsx +21 -7
  359. package/src/SideNav/Item.jsx +15 -7
  360. package/src/SideNav/SideNav.jsx +13 -2
  361. package/src/Skeleton/Skeleton.jsx +55 -43
  362. package/src/Spacer/Spacer.jsx +10 -18
  363. package/src/StackView/StackView.jsx +13 -12
  364. package/src/StackView/StackWrapBox.jsx +12 -12
  365. package/src/StackView/StackWrapGap.jsx +9 -7
  366. package/src/StackView/getStackedContent.jsx +1 -1
  367. package/src/StepTracker/Step.jsx +7 -4
  368. package/src/StepTracker/StepTracker.jsx +8 -8
  369. package/src/Tabs/Tabs.jsx +16 -3
  370. package/src/Tabs/TabsItem.jsx +13 -9
  371. package/src/Tags/Tags.jsx +16 -7
  372. package/src/TextInput/TextArea.jsx +20 -8
  373. package/src/TextInput/TextInput.jsx +20 -8
  374. package/src/TextInput/TextInputBase.jsx +13 -3
  375. package/src/ThemeProvider/useThemeTokens.js +3 -3
  376. package/src/ThemeProvider/utils/theme-tokens.js +3 -3
  377. package/src/ToggleSwitch/ToggleSwitch.jsx +12 -7
  378. package/src/ToggleSwitch/ToggleSwitchGroup.jsx +14 -6
  379. package/src/Tooltip/Tooltip.jsx +13 -3
  380. package/src/TooltipButton/TooltipButton.jsx +6 -4
  381. package/src/Typography/Typography.jsx +10 -6
  382. package/src/index.js +1 -1
  383. package/src/utils/a11y/semantics.js +3 -2
  384. package/src/utils/children.jsx +2 -1
  385. package/src/utils/index.js +2 -1
  386. package/src/utils/pressability.js +1 -1
  387. package/src/utils/props/a11yProps.js +151 -0
  388. package/src/utils/props/clickProps.js +31 -0
  389. package/src/utils/props/componentPropType.js +67 -0
  390. package/src/utils/props/copyPropTypes.js +3 -0
  391. package/src/utils/props/getPropSelector.js +14 -0
  392. package/src/utils/props/hrefAttrsProp.js +25 -0
  393. package/src/utils/props/index.js +16 -0
  394. package/src/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -4
  395. package/src/utils/props/linkProps.js +43 -0
  396. package/src/utils/props/paddingProp.js +10 -0
  397. package/src/utils/props/pressProps.js +45 -0
  398. package/src/utils/props/rectProp.js +10 -0
  399. package/src/utils/props/responsiveProps.js +30 -0
  400. package/src/utils/props/selectSystemProps.js +25 -0
  401. package/src/utils/props/spacingProps.js +58 -0
  402. package/src/utils/props/tokens.js +150 -0
  403. package/src/utils/props/variantProp.js +20 -0
  404. package/src/utils/props/viewProps.js +23 -0
  405. package/src/utils/ssr.js +35 -0
  406. package/src/utils/useResponsiveProp.js +1 -1
  407. package/src/utils/useSpacingScale.js +4 -4
  408. package/.ultra.cache.json +0 -1
  409. package/lib/utils/a11y/propTypes.js +0 -61
  410. package/lib/utils/a11y/propTypes.native.js +0 -47
  411. package/lib/utils/propTypes.js +0 -566
  412. package/release-context.json +0 -7
  413. package/src/utils/a11y/propTypes.js +0 -61
  414. package/src/utils/a11y/propTypes.native.js +0 -39
  415. package/src/utils/propTypes.js +0 -561
@@ -0,0 +1,243 @@
1
+ import React, { forwardRef } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import View from "react-native-web/dist/exports/View";
4
+ import ScrollView from "react-native-web/dist/exports/ScrollView";
5
+ import { useThemeTokens } from '../ThemeProvider';
6
+ import { a11yProps, getA11yPropsFromHtmlTag, getTokensPropType, layoutTags, selectSystemProps, spacingProps, useSpacingScale, variantProp, viewProps } from '../utils';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps]);
9
+ /**
10
+ * @typedef {import('../utils/props/spacingProps.js').SpacingValue} SpacingValue
11
+ * @typedef {import('../utils/props/spacingProps.js').SpacingIndex} SpacingIndex
12
+ * @typedef {import('../utils/props/spacingProps.js').SpacingObject} SpacingObject
13
+ * @typedef {import('../utils/props/spacingProps.js').SpacingOptions} SpacingOptions
14
+ */
15
+
16
+ const selectBoxStyles = tokens => {
17
+ const styles = {
18
+ backgroundColor: tokens.backgroundColor
19
+ };
20
+ const paddings = ['paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom']; // Only set on styles if token provided because we spread this object after the spacing scale values
21
+
22
+ paddings.forEach(side => {
23
+ if (tokens[side]) {
24
+ styles[side] = tokens[side];
25
+ }
26
+ });
27
+ return styles;
28
+ };
29
+ /**
30
+ * A layout utility component. Use Box to create space (padding) around content.
31
+ *
32
+ * ## Spacing
33
+ *
34
+ * For most simple uses, pass a number to Box's `space` prop referring to an index in the theme's
35
+ * spacing scale. For example, for a box with the theme's smallest non-zero amount of padding on all sides:
36
+ *
37
+ * ```jsx
38
+ * <Box space={1}>
39
+ * ```
40
+ *
41
+ * #### Targetting specific sides
42
+ *
43
+ * Box allows spacing value props to be assigned to any side or all sides using the following props:
44
+ *
45
+ * - `space` sets the default for all sides, which is overridden by other props below
46
+ * - `horizontal` sets defaults for `left` and `right` (overriding `space` there if it is set)
47
+ * - `vertical` sets defaults for `top` and `bottom` (overriding `space` there if it is set)
48
+ * - `left` sets the left side padding, inside the box's bounds
49
+ * - `right` sets the right side padding, inside the box's bounds
50
+ * - `top` sets the top side padding, inside the box's bounds
51
+ * - `bottom` sets the bottom side padding, inside the box's bounds
52
+ *
53
+ * Box only controls spacing within its bounds. If space is needed around a box outside of its bounds,
54
+ * use `Spacer`, `StackView` or wrap the `Box` inside another `Box`.
55
+ *
56
+ * #### Viewport-specific spacing
57
+ *
58
+ * Responsive behaviours may be set by passing any of the above props an object keyed by viewports.
59
+ *
60
+ * For example, if a theme's spacing scale is [0, 4, 8...], this below will have padding of 4px on top,
61
+ * bottom, and right, and its left padding will be 0px on xs, sm and md viewports and 8px on lg and xl viewports:
62
+ *
63
+ * ```jsx
64
+ * <Box space={1} left={{ xs: 0, lg: 2 }} />`
65
+ * ```
66
+ *
67
+ * #### Subtracting from spacing
68
+ *
69
+ * A parent may sometimes need to reduce the spacing size on one or more sides of a `Box` by some variable.
70
+ * For example, the parent may have a border on one side and want to reduce the spacing of a child box
71
+ * by the width of that border on that side. This can be achieved using the `subtract` option of the
72
+ * spacing object, for example:
73
+ *
74
+ * ```jsx
75
+ * <Box space={2} left={{ space: 2, options: { subtract: themeTokens.borderWidthLeft } }} />`
76
+ * ```
77
+ *
78
+ * See `useSpacingScale` hook for other spacing value options and documentation.
79
+ *
80
+ * ## Theming
81
+ *
82
+ * Box is intended for layout, so minimal theming is supported. Use components like `Card` for
83
+ * more sophisticated theming.
84
+ *
85
+ * ## Scroll
86
+ *
87
+ * If passed, the box will be scrollable. If an object is passed, it will be passed to React Native's
88
+ * `ScrollView` component as props.
89
+ *
90
+ * When building native iOS and Android apps, it is important to remember to ensure any screen containing
91
+ * text content is inside a scrollable box, as screens are not scrollable by default and even very
92
+ * short text will require scrolling on small devices at the highest accessibility text scaling settings.
93
+ */
94
+
95
+
96
+ const Box = /*#__PURE__*/forwardRef(({
97
+ space,
98
+ horizontal = space,
99
+ vertical = space,
100
+ top = vertical,
101
+ bottom = vertical,
102
+ left = horizontal,
103
+ right = horizontal,
104
+ flex,
105
+ children,
106
+ variant,
107
+ tokens,
108
+ scroll,
109
+ tag,
110
+ accessibilityRole,
111
+ testID,
112
+ dataSet,
113
+ ...rest
114
+ }, ref) => {
115
+ const props = { ...getA11yPropsFromHtmlTag(tag, accessibilityRole),
116
+ ...selectProps(rest)
117
+ };
118
+ const themeTokens = useThemeTokens('Box', tokens, variant);
119
+ const styles = {
120
+ flex,
121
+ paddingLeft: useSpacingScale(left),
122
+ paddingRight: useSpacingScale(right),
123
+ paddingTop: useSpacingScale(top),
124
+ paddingBottom: useSpacingScale(bottom),
125
+ ...selectBoxStyles(themeTokens)
126
+ };
127
+
128
+ if (scroll) {
129
+ const scrollProps = typeof scroll === 'object' ? scroll : {};
130
+ scrollProps.contentContainerStyle = [styles, scrollProps.contentContainerStyle];
131
+ return /*#__PURE__*/_jsx(ScrollView, { ...scrollProps,
132
+ ...props,
133
+ testID: testID,
134
+ dataSet: dataSet,
135
+ ref: ref,
136
+ children: children
137
+ });
138
+ }
139
+
140
+ return /*#__PURE__*/_jsx(View, { ...props,
141
+ style: styles,
142
+ testID: testID,
143
+ dataSet: dataSet,
144
+ ref: ref,
145
+ children: children
146
+ });
147
+ });
148
+ Box.displayName = 'Box';
149
+ Box.propTypes = { ...selectedSystemPropTypes,
150
+ variant: variantProp.propType,
151
+ tokens: getTokensPropType('Box'),
152
+
153
+ /**
154
+ * Sets default padding on all sides of the box using the theme's spacing scale.
155
+ *
156
+ * @see {@link SpacingValue}
157
+ */
158
+ space: spacingProps.types.spacingValue,
159
+
160
+ /**
161
+ * Sets top and bottom padding using the theme's spacing scale.
162
+ *
163
+ * @see {@link SpacingValue}
164
+ */
165
+ vertical: spacingProps.types.spacingValue,
166
+
167
+ /**
168
+ * Sets left and right padding using the theme's spacing scale.
169
+ *
170
+ * @see {@link SpacingValue}
171
+ */
172
+ horizontal: spacingProps.types.spacingValue,
173
+
174
+ /**
175
+ * Sets bottom padding using the theme's spacing scale.
176
+ *
177
+ * @see {@link SpacingValue}
178
+ */
179
+ bottom: spacingProps.types.spacingValue,
180
+
181
+ /**
182
+ * Sets left padding using the theme's spacing scale.
183
+ *
184
+ * @see {@link SpacingValue}
185
+ */
186
+ left: spacingProps.types.spacingValue,
187
+
188
+ /**
189
+ * Sets right padding using the theme's spacing scale.
190
+ *
191
+ * @see {@link SpacingValue}
192
+ */
193
+ right: spacingProps.types.spacingValue,
194
+
195
+ /**
196
+ * Sets top padding using the theme's spacing scale.
197
+ *
198
+ * @see {@link SpacingValue}
199
+ */
200
+ top: spacingProps.types.spacingValue,
201
+
202
+ /**
203
+ * Sets the `flex` style, which controls `flexGrow`, `flexShrink` and `flexBasis` styles.
204
+ *
205
+ * Set as 1 for the box to stretch and grow to fit in the available space, or another number to share
206
+ * space disproportionately with siblings. See https://reactnative.dev/docs/flexbox#flex for details.
207
+ *
208
+ * With the default `0`, the box takes its minimum width from its content.
209
+ */
210
+ flex: PropTypes.number,
211
+
212
+ /**
213
+ * Renders a scrollable ScrollView instead of an unscrollable View.
214
+ *
215
+ * May take an object of ScrollView props which are passed to the rendered ScrollView.
216
+ */
217
+ scroll: PropTypes.oneOfType([PropTypes.bool, ScrollView.propTypes ? PropTypes.shape(ScrollView.propTypes) : PropTypes.object]),
218
+
219
+ /**
220
+ * Optional semantic HTML tag, to apply to the container on web. Does not change styling.
221
+ *
222
+ * In native apps, if a header tag is provided ("h1", "h2" etc) and accessibilityRole prop
223
+ * is not defined, the accessibilityRole will default to "heading".
224
+ */
225
+ tag: PropTypes.oneOf(layoutTags),
226
+
227
+ /**
228
+ * Use in tests if the box itself needs to be targetted and no other way of selecting the
229
+ * box is available (e.g. it cannot be targetted using an appropriate `accessibilityRole`).
230
+ */
231
+ testID: PropTypes.string,
232
+
233
+ /**
234
+ * @ignore
235
+ */
236
+ dataSet: PropTypes.object,
237
+
238
+ /**
239
+ * Box accepts any content as children.
240
+ */
241
+ children: PropTypes.node.isRequired
242
+ };
243
+ export default Box;
@@ -0,0 +1,2 @@
1
+ import Box from './Box';
2
+ export default Box;
@@ -0,0 +1,25 @@
1
+ import React, { forwardRef } from 'react';
2
+ import ButtonBase from './ButtonBase';
3
+ import buttonPropTypes, { textAndA11yText } from './propTypes';
4
+ import { useThemeTokensCallback } from '../ThemeProvider';
5
+ import { a11yProps } from '../utils/props';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const Button = /*#__PURE__*/forwardRef(({
8
+ accessibilityRole = 'button',
9
+ tokens,
10
+ variant,
11
+ ...props
12
+ }, ref) => {
13
+ const getTokens = useThemeTokensCallback('Button', tokens, variant);
14
+ return /*#__PURE__*/_jsx(ButtonBase, { ...props,
15
+ tokens: getTokens,
16
+ accessibilityRole: accessibilityRole,
17
+ ref: ref
18
+ });
19
+ });
20
+ Button.displayName = 'Button';
21
+ Button.propTypes = { ...a11yProps.types,
22
+ ...buttonPropTypes,
23
+ children: textAndA11yText
24
+ };
25
+ export default Button;
@@ -0,0 +1,254 @@
1
+ import React, { forwardRef } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import Pressable from "react-native-web/dist/exports/Pressable";
4
+ import View from "react-native-web/dist/exports/View";
5
+ import StyleSheet from "react-native-web/dist/exports/StyleSheet";
6
+ import Platform from "react-native-web/dist/exports/Platform";
7
+ import { applyTextStyles, applyShadowToken, applyOuterBorder } from '../ThemeProvider/utils';
8
+ import buttonPropTypes from './propTypes';
9
+ import { a11yProps, getCursorStyle, clickProps, linkProps, resolvePressableState, resolvePressableTokens, selectSystemProps, viewProps, wrapStringsInText, withLinkRouter } from '../utils';
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, linkProps, viewProps]);
12
+
13
+ const getOuterBorderOffset = ({
14
+ outerBorderGap = 0,
15
+ outerBorderWidth = 0
16
+ }) => outerBorderGap + outerBorderWidth;
17
+
18
+ const selectOuterContainerStyles = ({
19
+ alignSelf,
20
+ opacity,
21
+ outerBorderColor,
22
+ outerBorderWidth,
23
+ outerBorderGap,
24
+ borderRadius,
25
+ outerBackgroundColor
26
+ }) => ({
27
+ alignSelf,
28
+ backgroundColor: outerBackgroundColor,
29
+ opacity,
30
+ ...applyOuterBorder({
31
+ outerBorderGap,
32
+ outerBorderWidth,
33
+ outerBorderColor,
34
+ borderRadius
35
+ })
36
+ });
37
+
38
+ const selectOuterWidthStyles = ({
39
+ outerBorderGap,
40
+ outerBorderWidth,
41
+ width
42
+ }) => {
43
+ // The inner container's bounding box is the bounding box of the button overall
44
+ // so this many device pixels will sit outside of the overall bounding box
45
+ const outerBorderOffset = getOuterBorderOffset({
46
+ outerBorderGap,
47
+ outerBorderWidth
48
+ });
49
+ const widthStyles = {};
50
+
51
+ if (!width) {
52
+ return { ...widthStyles,
53
+ // Wrap content, stopping a flex parent's default align-items: stretch stretching focus ring beyond content
54
+ ...Platform.select({
55
+ // width: fit-content isn't supported on Firefox; can't cascade props like CSS `width: fit-content; width: --moz-fit-content;`
56
+ web: {
57
+ display: 'inline-flex'
58
+ }
59
+ })
60
+ };
61
+ } // Apply width tokens: number === pixels, string === explicit units e.g. %
62
+
63
+
64
+ if (typeof width === 'number') {
65
+ widthStyles.width = width + outerBorderOffset * 2;
66
+ return widthStyles;
67
+ } // Ensure the negative margin doesn't make element off-centre
68
+
69
+
70
+ if (Platform.OS === 'web') {
71
+ widthStyles.width = `calc(${width} + ${outerBorderOffset * 2}px)`;
72
+ return widthStyles;
73
+ } // Can't use calc() on native but (unlike on web) flexGrow fills the container width here
74
+
75
+
76
+ if (width === '100%') {
77
+ widthStyles.flexGrow = 1;
78
+ return widthStyles;
79
+ } // Slight offset not such a concern if % width < 100%, as the button isn't centered anyway.
80
+ // If centering support is added (e.g. alignSelf: center), set marginHorizontal 0 when centered.
81
+
82
+
83
+ widthStyles.width = width;
84
+ return widthStyles;
85
+ };
86
+
87
+ const selectInnerContainerStyles = ({
88
+ backgroundColor,
89
+ paddingLeft,
90
+ paddingRight,
91
+ paddingTop,
92
+ paddingBottom,
93
+ shadow,
94
+ borderWidth,
95
+ minWidth
96
+ }) => {
97
+ // Subtract border width from padding so overall button width/height doesn't
98
+ // jump around if the border width changes (avoiding NaN and negative padding)
99
+ const offsetBorder = value => typeof value === 'number' && typeof borderWidth === 'number' ? Math.max(0, value - borderWidth) : value;
100
+
101
+ return {
102
+ paddingLeft: offsetBorder(paddingLeft),
103
+ paddingRight: offsetBorder(paddingRight),
104
+ paddingTop: offsetBorder(paddingTop),
105
+ paddingBottom: offsetBorder(paddingBottom),
106
+ backgroundColor,
107
+ minWidth,
108
+ ...applyShadowToken(shadow)
109
+ };
110
+ };
111
+
112
+ const selectBorderStyles = ({
113
+ borderColor,
114
+ borderWidth,
115
+ borderRadius
116
+ }) => ({
117
+ borderColor,
118
+ borderWidth,
119
+ borderRadius
120
+ });
121
+
122
+ const selectTextStyles = ({
123
+ fontSize,
124
+ color,
125
+ lineHeight,
126
+ fontName,
127
+ fontWeight,
128
+ textAlign
129
+ }) => applyTextStyles({
130
+ fontSize,
131
+ color,
132
+ lineHeight,
133
+ fontName,
134
+ fontWeight,
135
+ textAlign
136
+ });
137
+
138
+ const selectWebOnlyStyles = (inactive, themeTokens, {
139
+ accessibilityRole
140
+ }) => {
141
+ return Platform.select({
142
+ web: {
143
+ // if it would overflow the container, wraps instead
144
+ maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
145
+ outline: 'none',
146
+ // removes the default browser :focus outline
147
+ ...getCursorStyle(inactive, accessibilityRole)
148
+ },
149
+ default: {}
150
+ });
151
+ };
152
+
153
+ const ButtonBase = /*#__PURE__*/forwardRef(({
154
+ id,
155
+ href,
156
+ hrefAttrs,
157
+ children,
158
+ tokens = {},
159
+ disabled = false,
160
+ // alias for inactive
161
+ inactive = disabled,
162
+ selected = false,
163
+ ...rawRest
164
+ }, ref) => {
165
+ const {
166
+ onPress,
167
+ ...rest
168
+ } = clickProps.toPressProps(rawRest);
169
+ const extraButtonState = {
170
+ inactive,
171
+ selected
172
+ };
173
+
174
+ const resolveButtonTokens = pressableState => resolvePressableTokens(tokens, pressableState, extraButtonState);
175
+
176
+ const systemProps = selectProps(rest);
177
+
178
+ const getPressableStyle = pressableState => {
179
+ const themeTokens = resolveButtonTokens(pressableState);
180
+ return [staticStyles.row, selectWebOnlyStyles(inactive, themeTokens, systemProps), selectOuterContainerStyles(themeTokens), selectOuterWidthStyles(themeTokens)];
181
+ };
182
+
183
+ return /*#__PURE__*/_jsx(Pressable, {
184
+ ref: ref,
185
+ href: href,
186
+ onPress: linkProps.handleHref({
187
+ href,
188
+ onPress
189
+ }),
190
+ style: getPressableStyle,
191
+ disabled: inactive,
192
+ hrefAttrs: hrefAttrs,
193
+ ...systemProps,
194
+ children: pressableState => {
195
+ const themeTokens = resolveButtonTokens(pressableState);
196
+ const containerStyles = selectInnerContainerStyles(themeTokens);
197
+ const borderStyles = selectBorderStyles(themeTokens);
198
+ const textStyles = [selectTextStyles(themeTokens), staticStyles.text]; // If the container has a width set, fill it instead of sizing from content.
199
+ // If in future we support text alignments other than center, add here.
200
+
201
+ const stretchStyles = themeTokens.width ? staticStyles.stretch : staticStyles.align;
202
+ return /*#__PURE__*/_jsx(View, {
203
+ id: id,
204
+ style: [containerStyles, borderStyles, stretchStyles, staticStyles.row, Platform.select({
205
+ web: {
206
+ maxWidth: '100%',
207
+ // ensure overflowing content wraps
208
+ // TODO: https://github.com/telus/universal-design-system/issues/487
209
+ transition: 'background-color 200ms, border-color 200ms'
210
+ }
211
+ })],
212
+ children: wrapStringsInText(typeof children === 'function' ? children({ ...resolvePressableState(pressableState, extraButtonState),
213
+ textStyles
214
+ }) : children, {
215
+ style: textStyles
216
+ })
217
+ });
218
+ }
219
+ });
220
+ });
221
+ ButtonBase.displayName = 'ButtonBase';
222
+ ButtonBase.propTypes = {
223
+ id: PropTypes.string,
224
+ ...selectedSystemPropTypes,
225
+ ...buttonPropTypes
226
+ };
227
+ ButtonBase.defaultProps = {
228
+ id: undefined
229
+ };
230
+ const staticStyles = StyleSheet.create({
231
+ row: {
232
+ // Apply all button alignment horizontally; no vertical stacking within a button
233
+ flexDirection: 'row'
234
+ },
235
+ text: {
236
+ flexGrow: 1,
237
+ // On native but not web, flexShrink here wraps text prematurely
238
+ ...Platform.select({
239
+ // TODO: https://github.com/telus/universal-design-system/issues/487
240
+ web: {
241
+ transition: 'color 200ms'
242
+ }
243
+ })
244
+ },
245
+ align: {
246
+ alignItems: 'center'
247
+ },
248
+ stretch: {
249
+ flex: 1,
250
+ alignItems: 'center',
251
+ justifyContent: 'center'
252
+ }
253
+ });
254
+ export default withLinkRouter(ButtonBase);
@@ -0,0 +1,164 @@
1
+ import React, { forwardRef } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import ABBPropTypes from 'airbnb-prop-types';
4
+ import Platform from "react-native-web/dist/exports/Platform";
5
+ import ButtonBase from './ButtonBase';
6
+ import { StackWrap } from '../StackView';
7
+ import { useViewport } from '../ViewportProvider';
8
+ import { useThemeTokens, useThemeTokensCallback } from '../ThemeProvider';
9
+ import { a11yProps, pressProps, getTokensPropType, selectSystemProps, selectTokens, variantProp, viewProps } from '../utils/props';
10
+ import { useMultipleInputValues } from '../utils/input';
11
+ import { getPressHandlersWithArgs } from '../utils/pressability';
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, pressProps, viewProps]);
14
+ const ButtonGroup = /*#__PURE__*/forwardRef(({
15
+ variant,
16
+ tokens,
17
+ items = [],
18
+ values,
19
+ initialValues,
20
+ maxValues = 1,
21
+ onChange,
22
+ readOnly = false,
23
+ inactive = false,
24
+ accessibilityRole = maxValues === 1 ? 'radiogroup' // radiogroup is cross-platform; only web aria has generic groups
25
+ : Platform.select({
26
+ web: 'group',
27
+ default: 'none'
28
+ }),
29
+ ...rest
30
+ }, ref) => {
31
+ const viewport = useViewport();
32
+ const themeTokens = useThemeTokens('ButtonGroup', tokens, variant, {
33
+ viewport
34
+ });
35
+ const stackTokens = selectTokens('StackView', themeTokens);
36
+ const {
37
+ direction,
38
+ space
39
+ } = themeTokens;
40
+ const getButtonTokens = useThemeTokensCallback('ButtonGroupItem', tokens, variant);
41
+ const {
42
+ currentValues,
43
+ toggleOneValue
44
+ } = useMultipleInputValues({
45
+ initialValues,
46
+ values,
47
+ maxValues,
48
+ onChange,
49
+ readOnly
50
+ });
51
+ const systemProps = selectProps({
52
+ accessibilityRole,
53
+ ...rest
54
+ });
55
+ const itemA11yRole = systemProps.accessibilityRole === 'radiogroup' ? 'radio' : 'checkbox';
56
+ return /*#__PURE__*/_jsx(StackWrap, { ...systemProps,
57
+ space: space,
58
+ direction: direction,
59
+ tokens: stackTokens,
60
+ ref: ref,
61
+ children: items.map(({
62
+ label,
63
+ id = label,
64
+ accessibilityLabel,
65
+ ref: itemRef
66
+ }, index) => {
67
+ const isSelected = currentValues.includes(id); // Pass an object of relevant component state as first argument for any passed-in press handlers
68
+
69
+ const pressHandlers = getPressHandlersWithArgs(rest, [{
70
+ id,
71
+ label,
72
+ currentValues
73
+ }]);
74
+
75
+ const handlePress = event => {
76
+ if (pressHandlers.onPress) pressHandlers.onPress();
77
+ toggleOneValue(id, event);
78
+ };
79
+
80
+ const itemA11y = {
81
+ accessibilityState: {
82
+ checked: isSelected
83
+ },
84
+ accessibilityRole: itemA11yRole,
85
+ accessibilityLabel,
86
+ ...a11yProps.getPositionInSet(items.length, index)
87
+ }; // Ensure button is direct child of group as MacOS voiceover only applies "X of Y" to
88
+ // "radio" if it's a direct child of "radiogroup", even if aria-posinset etc exists
89
+
90
+ return /*#__PURE__*/_jsx(ButtonBase, {
91
+ ref: itemRef,
92
+ ...pressHandlers,
93
+ onPress: handlePress,
94
+ tokens: getButtonTokens,
95
+ selected: isSelected,
96
+ inactive: inactive,
97
+ ...itemA11y,
98
+ children: label
99
+ }, id);
100
+ })
101
+ });
102
+ });
103
+ ButtonGroup.displayName = 'ButtonGroup';
104
+ ButtonGroup.propTypes = { ...selectedSystemPropTypes,
105
+ tokens: getTokensPropType('ButtonGroup'),
106
+ variant: variantProp.propType,
107
+
108
+ /**
109
+ * The maximum number of items a user may select at once. Defaults to 1 and behaves
110
+ * like radio buttons. To have no limit and allow any number of selections, pass `null`.
111
+ */
112
+ maxValues: PropTypes.number,
113
+
114
+ /**
115
+ * The options a user may select
116
+ */
117
+ items: PropTypes.arrayOf(PropTypes.shape({
118
+ /**
119
+ * The text displayed to the user in the button, describing this option,
120
+ * passed to the button as its child.
121
+ */
122
+ label: PropTypes.string.isRequired,
123
+
124
+ /**
125
+ * An optional accessibility label may be passed to ButtonGroup Buttons
126
+ * which is applied as normal for a React Native accessibilityLabel prop.
127
+ */
128
+ accessibilityLabel: PropTypes.string,
129
+
130
+ /**
131
+ * An optional unique string may be provided to identify this option,
132
+ * which will be used in code and passed to any onChange function.
133
+ * If not provided, the label is used.
134
+ */
135
+ id: PropTypes.string,
136
+
137
+ /**
138
+ * An optional ref for one individual button in the ButtonGroup
139
+ */
140
+ ref: ABBPropTypes.ref()
141
+ })),
142
+
143
+ /**
144
+ * If provided, this function is called when the current selection is changed
145
+ * and is passed an array of the `id`s of all currently selected `items`.
146
+ */
147
+ onChange: PropTypes.func,
148
+
149
+ /**
150
+ * If the selected item(s) in the button group are to be controlled externally by
151
+ * a parent component, pass an array of strings as well as an `onChange` handler.
152
+ * Passing an array for "values" makes the ButtonGroup a "controlled" component that
153
+ * expects its state to be handled via `onChange` and so doesn't handle it itself.
154
+ */
155
+ values: PropTypes.arrayOf(PropTypes.string),
156
+
157
+ /**
158
+ * If `values` is not passed, making the ButtonGroup an "uncontrolled" component
159
+ * managing its own selected state, a default set of selections may be provided.
160
+ * Changing the `initialValues` does not change the user's selections.
161
+ */
162
+ initialValues: PropTypes.arrayOf(PropTypes.string)
163
+ };
164
+ export default ButtonGroup;