@telus-uds/components-base 0.0.2-prerelease.6 → 1.0.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 (458) hide show
  1. package/.eslintrc.js +9 -0
  2. package/.ultra.cache.json +1 -1
  3. package/CHANGELOG.md +85 -0
  4. package/README.md +4 -2
  5. package/__fixtures__/Accessible.js +33 -0
  6. package/__fixtures__/Accessible.native.js +32 -0
  7. package/__fixtures__/test-utils.js +25 -0
  8. package/__fixtures__/testTheme.js +851 -57
  9. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  10. package/__tests__/Button/ButtonBase.test.jsx +2 -31
  11. package/__tests__/Button/ButtonGroup.test.jsx +6 -7
  12. package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
  13. package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
  14. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
  15. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
  16. package/__tests__/Icon/Icon.test.jsx +3 -3
  17. package/__tests__/IconButton/IconButton.test.jsx +52 -0
  18. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  19. package/__tests__/Link/LinkBase.test.jsx +0 -14
  20. package/__tests__/List/List.test.jsx +60 -0
  21. package/__tests__/Modal/Modal.test.jsx +47 -0
  22. package/__tests__/Notification/Notification.test.jsx +20 -0
  23. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  24. package/__tests__/Progress/Progress.test.jsx +79 -0
  25. package/__tests__/Radio/Radio.test.jsx +87 -0
  26. package/__tests__/Radio/RadioGroup.test.jsx +220 -0
  27. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  28. package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
  29. package/__tests__/Search/Search.test.jsx +73 -0
  30. package/__tests__/Select/Select.test.jsx +94 -0
  31. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  32. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  33. package/__tests__/Tabs/Tabs.test.jsx +40 -0
  34. package/__tests__/Tags/Tags.test.jsx +327 -0
  35. package/__tests__/TextInput/TextArea.test.jsx +35 -0
  36. package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +29 -50
  37. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
  38. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
  39. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
  40. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
  41. package/__tests__/utils/children.test.jsx +128 -0
  42. package/__tests__/utils/input.test.js +59 -1
  43. package/__tests__/utils/semantics.test.jsx +43 -0
  44. package/__tests__/utils/useCopy.test.js +14 -3
  45. package/babel.config.js +20 -0
  46. package/jest.config.js +8 -3
  47. package/lib/A11yInfoProvider/index.js +54 -26
  48. package/lib/A11yText/index.js +45 -17
  49. package/lib/ActivityIndicator/Spinner.js +81 -0
  50. package/lib/ActivityIndicator/Spinner.native.js +129 -91
  51. package/lib/ActivityIndicator/index.js +28 -12
  52. package/lib/ActivityIndicator/shared.js +27 -12
  53. package/lib/BaseProvider/index.js +34 -11
  54. package/lib/Box/Box.js +152 -35
  55. package/lib/Box/index.js +13 -2
  56. package/lib/Button/Button.js +41 -12
  57. package/lib/Button/ButtonBase.js +125 -97
  58. package/lib/Button/ButtonGroup.js +112 -89
  59. package/lib/Button/ButtonLink.js +48 -17
  60. package/lib/Button/index.js +31 -4
  61. package/lib/Button/propTypes.js +32 -9
  62. package/lib/Card/Card.js +38 -41
  63. package/lib/Card/CardBase.js +85 -0
  64. package/lib/Card/PressableCardBase.js +141 -0
  65. package/lib/Card/index.js +40 -2
  66. package/lib/Checkbox/Checkbox.js +355 -0
  67. package/lib/Checkbox/CheckboxGroup.js +241 -0
  68. package/lib/Checkbox/CheckboxInput.js +74 -0
  69. package/lib/Checkbox/CheckboxInput.native.js +14 -0
  70. package/lib/Checkbox/index.js +21 -0
  71. package/lib/Divider/Divider.js +59 -28
  72. package/lib/Divider/index.js +13 -2
  73. package/lib/ExpandCollapse/Accordion.js +26 -7
  74. package/lib/ExpandCollapse/Control.js +60 -31
  75. package/lib/ExpandCollapse/ExpandCollapse.js +50 -28
  76. package/lib/ExpandCollapse/Panel.js +83 -44
  77. package/lib/ExpandCollapse/index.js +25 -7
  78. package/lib/Feedback/Feedback.js +90 -39
  79. package/lib/Feedback/index.js +13 -2
  80. package/lib/Fieldset/Fieldset.js +165 -0
  81. package/lib/Fieldset/FieldsetContainer.js +46 -0
  82. package/lib/Fieldset/FieldsetContainer.native.js +38 -0
  83. package/lib/Fieldset/Legend.js +38 -0
  84. package/lib/Fieldset/Legend.native.js +48 -0
  85. package/lib/Fieldset/cssReset.js +21 -0
  86. package/lib/Fieldset/index.js +13 -0
  87. package/lib/FlexGrid/Col/Col.js +73 -41
  88. package/lib/FlexGrid/Col/index.js +13 -2
  89. package/lib/FlexGrid/FlexGrid.js +99 -49
  90. package/lib/FlexGrid/Row/Row.js +58 -30
  91. package/lib/FlexGrid/Row/index.js +13 -2
  92. package/lib/FlexGrid/helpers/index.js +9 -1
  93. package/lib/FlexGrid/index.js +13 -2
  94. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  95. package/lib/HorizontalScroll/HorizontalScroll.js +200 -0
  96. package/lib/HorizontalScroll/HorizontalScrollButton.js +127 -0
  97. package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
  98. package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
  99. package/lib/HorizontalScroll/dictionary.js +18 -0
  100. package/lib/HorizontalScroll/index.js +35 -0
  101. package/lib/HorizontalScroll/itemPositions.js +128 -0
  102. package/lib/Icon/Icon.js +62 -50
  103. package/lib/Icon/IconText.js +101 -0
  104. package/lib/Icon/index.js +31 -3
  105. package/lib/IconButton/IconButton.js +140 -0
  106. package/lib/IconButton/index.js +13 -0
  107. package/lib/InputLabel/InputLabel.js +102 -40
  108. package/lib/InputLabel/LabelContent.js +41 -0
  109. package/lib/InputLabel/LabelContent.native.js +32 -6
  110. package/lib/InputLabel/index.js +13 -2
  111. package/lib/InputSupports/InputSupports.js +109 -0
  112. package/lib/InputSupports/index.js +13 -0
  113. package/lib/InputSupports/propTypes.js +66 -0
  114. package/lib/InputSupports/useInputSupports.js +41 -0
  115. package/lib/Link/ChevronLink.js +58 -31
  116. package/lib/Link/InlinePressable.js +56 -0
  117. package/lib/Link/InlinePressable.native.js +102 -0
  118. package/lib/Link/Link.js +39 -15
  119. package/lib/Link/LinkBase.js +126 -150
  120. package/lib/Link/TextButton.js +53 -18
  121. package/lib/Link/index.js +39 -4
  122. package/lib/List/List.js +81 -0
  123. package/lib/List/ListItem.js +245 -0
  124. package/lib/List/index.js +13 -0
  125. package/lib/Modal/Modal.js +231 -0
  126. package/lib/Modal/dictionary.js +16 -0
  127. package/lib/Modal/index.js +13 -0
  128. package/lib/Notification/Notification.js +216 -0
  129. package/lib/Notification/dictionary.js +15 -0
  130. package/lib/Notification/index.js +13 -0
  131. package/lib/Pagination/PageButton.js +58 -48
  132. package/lib/Pagination/Pagination.js +78 -43
  133. package/lib/Pagination/SideButton.js +79 -58
  134. package/lib/Pagination/dictionary.js +9 -2
  135. package/lib/Pagination/index.js +13 -2
  136. package/lib/Pagination/usePagination.js +12 -2
  137. package/lib/Progress/Progress.js +104 -0
  138. package/lib/Progress/ProgressBar.js +157 -0
  139. package/lib/Progress/ProgressBarBackground.js +61 -0
  140. package/lib/Progress/index.js +16 -0
  141. package/lib/Radio/Radio.js +293 -0
  142. package/lib/Radio/RadioButton.js +152 -0
  143. package/lib/Radio/RadioGroup.js +244 -0
  144. package/lib/Radio/RadioInput.js +76 -0
  145. package/lib/Radio/RadioInput.native.js +14 -0
  146. package/lib/Radio/index.js +21 -0
  147. package/lib/RadioCard/RadioCard.js +244 -0
  148. package/lib/RadioCard/RadioCardGroup.js +252 -0
  149. package/lib/RadioCard/index.js +21 -0
  150. package/lib/Search/Search.js +254 -0
  151. package/lib/Search/dictionary.js +19 -0
  152. package/lib/Search/index.js +13 -0
  153. package/lib/Select/Group.js +33 -0
  154. package/lib/Select/Group.native.js +25 -0
  155. package/lib/Select/Item.js +29 -0
  156. package/lib/Select/Item.native.js +19 -0
  157. package/lib/Select/Picker.js +84 -0
  158. package/lib/Select/Picker.native.js +130 -0
  159. package/lib/Select/Select.js +342 -0
  160. package/lib/Select/index.js +19 -0
  161. package/lib/SideNav/Item.js +63 -37
  162. package/lib/SideNav/ItemContent.js +41 -15
  163. package/lib/SideNav/ItemsGroup.js +55 -31
  164. package/lib/SideNav/SideNav.js +100 -73
  165. package/lib/SideNav/index.js +15 -1
  166. package/lib/Skeleton/Skeleton.js +137 -0
  167. package/lib/Skeleton/index.js +13 -0
  168. package/lib/Skeleton/skeleton.constant.js +12 -0
  169. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  170. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  171. package/lib/Spacer/Spacer.js +49 -18
  172. package/lib/Spacer/index.js +13 -2
  173. package/lib/StackView/StackView.js +71 -31
  174. package/lib/StackView/StackWrap.js +43 -13
  175. package/lib/StackView/StackWrap.native.js +13 -2
  176. package/lib/StackView/StackWrapBox.js +76 -29
  177. package/lib/StackView/StackWrapGap.js +56 -26
  178. package/lib/StackView/common.js +23 -6
  179. package/lib/StackView/getStackedContent.js +47 -17
  180. package/lib/StackView/index.js +29 -5
  181. package/lib/StepTracker/Step.js +245 -0
  182. package/lib/StepTracker/StepTracker.js +202 -0
  183. package/lib/StepTracker/dictionary.js +17 -0
  184. package/lib/StepTracker/index.js +13 -0
  185. package/lib/Tabs/Tabs.js +124 -0
  186. package/lib/Tabs/TabsItem.js +238 -0
  187. package/lib/Tabs/index.js +13 -0
  188. package/lib/Tags/Tags.js +266 -0
  189. package/lib/Tags/index.js +13 -0
  190. package/lib/TextInput/TextArea.js +111 -0
  191. package/lib/TextInput/TextInput.js +50 -304
  192. package/lib/TextInput/TextInputBase.js +256 -0
  193. package/lib/TextInput/index.js +23 -2
  194. package/lib/TextInput/propTypes.js +42 -0
  195. package/lib/ThemeProvider/ThemeProvider.js +46 -18
  196. package/lib/ThemeProvider/index.js +61 -6
  197. package/lib/ThemeProvider/useSetTheme.js +19 -5
  198. package/lib/ThemeProvider/useTheme.js +13 -4
  199. package/lib/ThemeProvider/useThemeTokens.js +86 -19
  200. package/lib/ThemeProvider/utils/index.js +31 -2
  201. package/lib/ThemeProvider/utils/styles.js +50 -14
  202. package/lib/ThemeProvider/utils/theme-tokens.js +121 -12
  203. package/lib/ToggleSwitch/ToggleSwitch.js +86 -57
  204. package/lib/ToggleSwitch/index.js +13 -2
  205. package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +20 -8
  206. package/lib/Tooltip/Backdrop.native.js +39 -15
  207. package/lib/Tooltip/Tooltip.js +117 -74
  208. package/lib/Tooltip/dictionary.js +9 -2
  209. package/lib/Tooltip/getTooltipPosition.js +9 -1
  210. package/lib/Tooltip/index.js +13 -2
  211. package/lib/TooltipButton/TooltipButton.js +57 -38
  212. package/lib/TooltipButton/index.js +13 -2
  213. package/lib/Typography/Typography.js +86 -55
  214. package/lib/Typography/index.js +13 -2
  215. package/lib/ViewportProvider/ViewportProvider.js +34 -13
  216. package/lib/ViewportProvider/index.js +28 -3
  217. package/lib/ViewportProvider/useViewport.js +15 -3
  218. package/lib/ViewportProvider/useViewportListener.js +24 -10
  219. package/lib/index.js +539 -26
  220. package/lib/utils/a11y/index.js +31 -0
  221. package/lib/utils/a11y/semantics.js +173 -0
  222. package/lib/utils/a11y/textSize.js +49 -0
  223. package/lib/utils/animation/index.js +15 -2
  224. package/lib/utils/animation/useVerticalExpandAnimation.js +27 -10
  225. package/lib/utils/children.js +134 -0
  226. package/lib/utils/index.js +163 -7
  227. package/lib/utils/info/index.js +19 -0
  228. package/lib/utils/info/platform/index.js +23 -0
  229. package/lib/utils/info/platform/platform.android.js +8 -0
  230. package/lib/utils/info/platform/platform.ios.js +8 -0
  231. package/lib/utils/info/platform/platform.js +8 -0
  232. package/lib/utils/info/platform/platform.native.js +11 -0
  233. package/lib/utils/info/versions.js +16 -0
  234. package/lib/utils/input.js +53 -25
  235. package/lib/utils/pressability.js +120 -0
  236. package/lib/utils/propTypes.js +338 -132
  237. package/lib/utils/useCopy.js +40 -5
  238. package/lib/utils/useHash.js +52 -0
  239. package/lib/utils/useHash.native.js +15 -0
  240. package/lib/utils/useResponsiveProp.js +21 -9
  241. package/lib/utils/useSpacingScale.js +19 -9
  242. package/lib/utils/useUniqueId.js +12 -3
  243. package/package.json +16 -10
  244. package/release-context.json +4 -4
  245. package/src/A11yText/index.jsx +6 -4
  246. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +5 -3
  247. package/src/ActivityIndicator/Spinner.native.jsx +5 -3
  248. package/src/Box/Box.jsx +131 -39
  249. package/src/Button/Button.jsx +13 -6
  250. package/src/Button/ButtonBase.jsx +134 -125
  251. package/src/Button/ButtonGroup.jsx +85 -86
  252. package/src/Button/ButtonLink.jsx +22 -7
  253. package/src/Button/propTypes.js +12 -2
  254. package/src/Card/Card.jsx +5 -31
  255. package/src/Card/CardBase.jsx +58 -0
  256. package/src/Card/PressableCardBase.jsx +119 -0
  257. package/src/Card/index.js +3 -0
  258. package/src/Checkbox/Checkbox.jsx +284 -0
  259. package/src/Checkbox/CheckboxGroup.jsx +206 -0
  260. package/src/Checkbox/CheckboxInput.jsx +55 -0
  261. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  262. package/src/Checkbox/index.js +5 -0
  263. package/src/Divider/Divider.jsx +7 -4
  264. package/src/ExpandCollapse/Accordion.jsx +3 -2
  265. package/src/ExpandCollapse/Control.jsx +40 -43
  266. package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
  267. package/src/ExpandCollapse/Panel.jsx +69 -63
  268. package/src/Feedback/Feedback.jsx +42 -30
  269. package/src/Fieldset/Fieldset.jsx +136 -0
  270. package/src/Fieldset/FieldsetContainer.jsx +31 -0
  271. package/src/Fieldset/FieldsetContainer.native.jsx +19 -0
  272. package/src/Fieldset/Legend.jsx +21 -0
  273. package/src/Fieldset/Legend.native.jsx +27 -0
  274. package/src/Fieldset/cssReset.js +14 -0
  275. package/src/Fieldset/index.js +3 -0
  276. package/src/FlexGrid/Col/Col.jsx +139 -132
  277. package/src/FlexGrid/FlexGrid.jsx +79 -51
  278. package/src/FlexGrid/Row/Row.jsx +55 -48
  279. package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
  280. package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
  281. package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
  282. package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
  283. package/src/HorizontalScroll/dictionary.js +11 -0
  284. package/src/HorizontalScroll/index.js +17 -0
  285. package/src/HorizontalScroll/itemPositions.js +101 -0
  286. package/src/Icon/Icon.jsx +46 -49
  287. package/src/Icon/IconText.jsx +68 -0
  288. package/src/Icon/index.js +3 -2
  289. package/src/IconButton/IconButton.jsx +114 -0
  290. package/src/IconButton/index.js +3 -0
  291. package/src/InputLabel/InputLabel.jsx +57 -35
  292. package/src/InputLabel/LabelContent.jsx +21 -0
  293. package/src/InputLabel/LabelContent.native.jsx +11 -2
  294. package/src/InputSupports/InputSupports.jsx +70 -0
  295. package/src/InputSupports/index.js +3 -0
  296. package/src/InputSupports/propTypes.js +44 -0
  297. package/src/InputSupports/useInputSupports.js +30 -0
  298. package/src/Link/ChevronLink.jsx +34 -21
  299. package/src/Link/InlinePressable.jsx +39 -0
  300. package/src/Link/InlinePressable.native.jsx +75 -0
  301. package/src/Link/Link.jsx +23 -13
  302. package/src/Link/LinkBase.jsx +98 -170
  303. package/src/Link/TextButton.jsx +37 -16
  304. package/src/Link/index.js +2 -1
  305. package/src/List/List.jsx +48 -0
  306. package/src/List/ListItem.jsx +182 -0
  307. package/src/List/index.js +3 -0
  308. package/src/Modal/Modal.jsx +190 -0
  309. package/src/Modal/dictionary.js +9 -0
  310. package/src/Modal/index.js +3 -0
  311. package/src/Notification/Notification.jsx +164 -0
  312. package/src/Notification/dictionary.js +8 -0
  313. package/src/Notification/index.js +3 -0
  314. package/src/Pagination/PageButton.jsx +42 -49
  315. package/src/Pagination/Pagination.jsx +88 -92
  316. package/src/Pagination/SideButton.jsx +58 -66
  317. package/src/Progress/Progress.jsx +78 -0
  318. package/src/Progress/ProgressBar.jsx +123 -0
  319. package/src/Progress/ProgressBarBackground.jsx +36 -0
  320. package/src/Progress/index.js +6 -0
  321. package/src/Radio/Radio.jsx +240 -0
  322. package/src/Radio/RadioButton.jsx +142 -0
  323. package/src/Radio/RadioGroup.jsx +209 -0
  324. package/src/Radio/RadioInput.jsx +57 -0
  325. package/src/Radio/RadioInput.native.jsx +6 -0
  326. package/src/Radio/index.js +5 -0
  327. package/src/RadioCard/RadioCard.jsx +198 -0
  328. package/src/RadioCard/RadioCardGroup.jsx +218 -0
  329. package/src/RadioCard/index.js +5 -0
  330. package/src/Search/Search.jsx +225 -0
  331. package/src/Search/dictionary.js +12 -0
  332. package/src/Search/index.js +3 -0
  333. package/src/Select/Group.jsx +15 -0
  334. package/src/Select/Group.native.jsx +14 -0
  335. package/src/Select/Item.jsx +11 -0
  336. package/src/Select/Item.native.jsx +10 -0
  337. package/src/Select/Picker.jsx +74 -0
  338. package/src/Select/Picker.native.jsx +102 -0
  339. package/src/Select/Select.jsx +298 -0
  340. package/src/Select/index.js +8 -0
  341. package/src/SideNav/Item.jsx +54 -47
  342. package/src/SideNav/ItemsGroup.jsx +50 -43
  343. package/src/SideNav/SideNav.jsx +68 -60
  344. package/src/Skeleton/Skeleton.jsx +94 -0
  345. package/src/Skeleton/index.js +3 -0
  346. package/src/Skeleton/skeleton.constant.js +3 -0
  347. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  348. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  349. package/src/Spacer/Spacer.jsx +11 -4
  350. package/src/StackView/StackView.jsx +53 -23
  351. package/src/StackView/StackWrap.jsx +16 -7
  352. package/src/StackView/StackWrapBox.jsx +62 -28
  353. package/src/StackView/StackWrapGap.jsx +46 -24
  354. package/src/StackView/common.jsx +3 -2
  355. package/src/StackView/getStackedContent.jsx +8 -2
  356. package/src/StepTracker/Step.jsx +202 -0
  357. package/src/StepTracker/StepTracker.jsx +174 -0
  358. package/src/StepTracker/dictionary.js +10 -0
  359. package/src/StepTracker/index.js +3 -0
  360. package/src/Tabs/Tabs.jsx +97 -0
  361. package/src/Tabs/TabsItem.jsx +212 -0
  362. package/src/Tabs/index.js +3 -0
  363. package/src/Tags/Tags.jsx +219 -0
  364. package/src/Tags/index.js +3 -0
  365. package/src/TextInput/TextArea.jsx +79 -0
  366. package/src/TextInput/TextInput.jsx +18 -284
  367. package/src/TextInput/TextInputBase.jsx +217 -0
  368. package/src/TextInput/index.js +2 -1
  369. package/src/TextInput/propTypes.js +29 -0
  370. package/src/ThemeProvider/ThemeProvider.jsx +11 -7
  371. package/src/ThemeProvider/useSetTheme.js +4 -0
  372. package/src/ThemeProvider/useThemeTokens.js +56 -5
  373. package/src/ThemeProvider/utils/styles.js +18 -5
  374. package/src/ThemeProvider/utils/theme-tokens.js +74 -5
  375. package/src/ToggleSwitch/ToggleSwitch.jsx +51 -53
  376. package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
  377. package/src/Tooltip/Tooltip.jsx +135 -131
  378. package/src/TooltipButton/TooltipButton.jsx +23 -27
  379. package/src/Typography/Typography.jsx +72 -59
  380. package/src/index.js +31 -3
  381. package/src/utils/a11y/index.js +2 -0
  382. package/src/utils/a11y/semantics.js +162 -0
  383. package/src/utils/a11y/textSize.js +30 -0
  384. package/src/utils/children.jsx +119 -0
  385. package/src/utils/index.js +6 -0
  386. package/src/utils/info/index.js +8 -0
  387. package/src/utils/info/platform/index.js +11 -0
  388. package/src/utils/info/platform/platform.android.js +1 -0
  389. package/src/utils/info/platform/platform.ios.js +1 -0
  390. package/src/utils/info/platform/platform.js +1 -0
  391. package/src/utils/info/platform/platform.native.js +4 -0
  392. package/src/utils/info/versions.js +6 -0
  393. package/src/utils/input.js +36 -25
  394. package/src/utils/pressability.js +96 -0
  395. package/src/utils/propTypes.js +291 -90
  396. package/src/utils/useCopy.js +30 -4
  397. package/src/utils/useHash.js +39 -0
  398. package/src/utils/useHash.native.js +6 -0
  399. package/stories/A11yText/A11yText.stories.jsx +6 -10
  400. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +1 -1
  401. package/stories/Box/Box.stories.jsx +1 -1
  402. package/stories/Button/Button.stories.jsx +7 -2
  403. package/stories/Button/ButtonGroup.stories.jsx +1 -1
  404. package/stories/Button/ButtonLink.stories.jsx +1 -1
  405. package/stories/Card/Card.stories.jsx +1 -1
  406. package/stories/Checkbox/Checkbox.stories.jsx +94 -0
  407. package/stories/Divider/Divider.stories.jsx +1 -1
  408. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +2 -2
  409. package/stories/Feedback/Feedback.stories.jsx +5 -6
  410. package/stories/FlexGrid/01 FlexGrid.stories.jsx +1 -1
  411. package/stories/FlexGrid/02 Row.stories.jsx +1 -1
  412. package/stories/FlexGrid/03 Col.stories.jsx +1 -1
  413. package/stories/Icon/Icon.stories.jsx +27 -7
  414. package/stories/IconButton/IconButton.stories.jsx +50 -0
  415. package/stories/InputLabel/InputLabel.stories.jsx +1 -1
  416. package/stories/Link/ChevronLink.stories.jsx +1 -1
  417. package/stories/Link/Link.stories.jsx +28 -18
  418. package/stories/Link/TextButton.stories.jsx +1 -1
  419. package/stories/List/List.stories.jsx +117 -0
  420. package/stories/Modal/Modal.stories.jsx +29 -0
  421. package/stories/Notification/Notification.stories.jsx +82 -0
  422. package/stories/Pagination/Pagination.stories.jsx +1 -1
  423. package/stories/Progress/Progress.stories.jsx +93 -0
  424. package/stories/Radio/Radio.stories.jsx +100 -0
  425. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  426. package/stories/Search/Search.stories.jsx +16 -0
  427. package/stories/Select/Select.stories.jsx +55 -0
  428. package/stories/SideNav/SideNav.stories.jsx +1 -1
  429. package/stories/SideNav/SideNavItem.stories.jsx +1 -1
  430. package/stories/SideNav/SideNavItemsGroup.stories.jsx +1 -1
  431. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  432. package/stories/Spacer/Spacer.stories.jsx +1 -1
  433. package/stories/StackView/StackView.stories.jsx +1 -1
  434. package/stories/StackView/StackWrap.stories.jsx +1 -1
  435. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  436. package/stories/Tabs/Tabs.stories.jsx +97 -0
  437. package/stories/Tags/Tags.stories.jsx +69 -0
  438. package/stories/TextInput/TextArea.stories.jsx +100 -0
  439. package/stories/TextInput/TextInput.stories.jsx +1 -1
  440. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +1 -1
  441. package/stories/Tooltip/Tooltip.stories.jsx +1 -1
  442. package/stories/TooltipButton/TooltipButton.stories.jsx +1 -1
  443. package/stories/Typography/Typography.stories.jsx +1 -1
  444. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
  445. package/stories/supports.jsx +38 -4
  446. package/__fixtures__/accessible.icon.svg +0 -6
  447. package/babel.config.json +0 -8
  448. package/docs/Contributing.stories.mdx +0 -9
  449. package/docs/Fonts.stories.mdx +0 -104
  450. package/docs/Icons.stories.mdx +0 -144
  451. package/docs/Introduction.stories.mdx +0 -9
  452. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  453. package/lib/InputLabel/LabelContent.web.js +0 -17
  454. package/lib/config/svgr-icons-web.js +0 -9
  455. package/lib/config/svgr-icons.js +0 -52
  456. package/src/InputLabel/LabelContent.web.jsx +0 -13
  457. package/src/config/svgr-icons-web.js +0 -11
  458. package/src/config/svgr-icons.js +0 -46
@@ -0,0 +1,128 @@
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { render } from '@testing-library/react-native'
4
+ import { Text, View } from 'react-native'
5
+
6
+ import { wrapStringsInText } from '../../src/utils'
7
+ import A11yText from '../../src/A11yText'
8
+
9
+ const TestComponent = ({ children }) => (
10
+ <View testID="wrapper">{wrapStringsInText(children, { testID: 'text' })}</View>
11
+ )
12
+ TestComponent.propTypes = {
13
+ children: PropTypes.node
14
+ }
15
+
16
+ describe('wrapStringsInText', () => {
17
+ it('combines adjacent strings into one text', () => {
18
+ const secondString = 'Second string'
19
+ const { queryAllByTestId } = render(
20
+ <TestComponent>
21
+ First string
22
+ {secondString}
23
+ Third string
24
+ </TestComponent>
25
+ )
26
+ expect(queryAllByTestId('text')).toHaveLength(1)
27
+ })
28
+ it('combines adjacent strings and numbers into one `Text`', () => {
29
+ const { queryAllByTestId } = render(
30
+ <TestComponent>
31
+ First string
32
+ {12345}
33
+ Third string
34
+ </TestComponent>
35
+ )
36
+ expect(queryAllByTestId('text')).toHaveLength(1)
37
+ })
38
+ it('combines adjacent strings, numbers and A11yText into one `Text`', () => {
39
+ const { queryAllByTestId } = render(
40
+ <TestComponent>
41
+ First string
42
+ <A11yText text="Some inserted A11yText" />
43
+ Third string
44
+ </TestComponent>
45
+ )
46
+ expect(queryAllByTestId('text')).toHaveLength(1)
47
+ })
48
+ it('combines clusters seperated by another component into multiple `Text`s', () => {
49
+ const { queryAllByTestId } = render(
50
+ <TestComponent>
51
+ First string
52
+ {12345}
53
+ Third string
54
+ <View />
55
+ Fourth string
56
+ <A11yText text="Some inserted A11yText" />
57
+ Fifth string
58
+ <View />
59
+ Sixth string
60
+ {12345}
61
+ <A11yText text="Some inserted A11yText" />
62
+ Seventh string
63
+ </TestComponent>
64
+ )
65
+ expect(queryAllByTestId('text')).toHaveLength(3)
66
+ })
67
+ it('does not wrap elements that do not need wrapping', () => {
68
+ const { getByTestId, queryAllByTestId } = render(
69
+ <TestComponent>
70
+ Unwrapped text
71
+ {12345}
72
+ <View>
73
+ <Text>
74
+ Wrapped text inside View
75
+ {12345}
76
+ </Text>
77
+ </View>
78
+ More unwrapped text
79
+ {12345}
80
+ <Text>
81
+ Wrapped text separate from above unwrapped text
82
+ {12345}
83
+ </Text>
84
+ </TestComponent>
85
+ )
86
+ expect(queryAllByTestId('text')).toHaveLength(2)
87
+ expect(getByTestId('wrapper').children.map((child) => child.type)).toEqual([
88
+ Text,
89
+ View,
90
+ Text,
91
+ Text
92
+ ])
93
+ })
94
+ it('does not wrap a singular A11yText in `Text`', () => {
95
+ const { queryAllByTestId } = render(
96
+ <TestComponent>
97
+ <A11yText text="Some inserted A11yText" />
98
+ </TestComponent>
99
+ )
100
+ expect(queryAllByTestId('text')).toHaveLength(0)
101
+ })
102
+ it('does not wrap an A11yText in `Text` if it is sandwiched by non-text', () => {
103
+ const { queryAllByTestId } = render(
104
+ <TestComponent>
105
+ First string
106
+ {12345}
107
+ Third string
108
+ <View />
109
+ <A11yText text="Some inserted A11yText" />
110
+ <View />
111
+ Sixth string
112
+ {12345}
113
+ <A11yText text="Some inserted A11yText" />
114
+ Seventh string
115
+ </TestComponent>
116
+ )
117
+ expect(queryAllByTestId('text')).toHaveLength(2)
118
+ })
119
+ it('does not double-wrap already wrapped `Text`', () => {
120
+ const { queryAllByTestId } = render(
121
+ <TestComponent>
122
+ <Text>Already wrapped</Text>
123
+ <Text>Also already wrapped</Text>
124
+ </TestComponent>
125
+ )
126
+ expect(queryAllByTestId('text')).toHaveLength(0)
127
+ })
128
+ })
@@ -1,6 +1,6 @@
1
1
  import { renderHook, act } from '@testing-library/react-hooks'
2
2
 
3
- import { useInputValue, useMultipleInputValues } from '../../lib/utils'
3
+ import { useInputValue, useMultipleInputValues } from '../../src/utils'
4
4
 
5
5
  /**
6
6
  * Tests for errors thrown on incorrect props usage
@@ -90,6 +90,17 @@ describe('useInputValue (uncontrolled)', () => {
90
90
  expect(result.current.currentValue).toBe('some value')
91
91
  })
92
92
 
93
+ it('Changes currentValue based on old value when `setValue` is passed a function', () => {
94
+ const { result } = renderHook(() => useInputValue({ initialValue: 1 }))
95
+ expect(result.current.currentValue).toBe(1)
96
+
97
+ act(() => result.current.setValue((oldValue) => oldValue + 1))
98
+ expect(result.current.currentValue).toBe(2)
99
+
100
+ act(() => result.current.setValue((oldValue) => oldValue + 2))
101
+ expect(result.current.currentValue).toBe(4)
102
+ })
103
+
93
104
  it('Sets currentValue to initialValue if provided, which may be changed', () => {
94
105
  const { result } = renderHook(() => useInputValue({ initialValue: 'first value' }))
95
106
  expect(result.current.currentValue).toBe('first value')
@@ -210,6 +221,29 @@ describe('useMultipleInputValues (uncontrolled)', () => {
210
221
  expect(result.current.currentValues).toEqual(['second value', 'third value'])
211
222
  })
212
223
 
224
+ it('Replaces values on calling setValues', () => {
225
+ const { result } = renderHook(() =>
226
+ useMultipleInputValues({
227
+ initialValues: ['first value', 'second value', 'third value']
228
+ })
229
+ )
230
+ act(() => result.current.setValues(['new value', 'another value']))
231
+ expect(result.current.currentValues).toEqual(['new value', 'another value'])
232
+ })
233
+
234
+ it('Replaces values based on old values on passing function to setValues', () => {
235
+ const { result } = renderHook(() =>
236
+ useMultipleInputValues({
237
+ initialValues: [1, 2, 3, 4]
238
+ })
239
+ )
240
+ act(() => result.current.setValues((oldValues) => oldValues.map((value) => value + 1)))
241
+ expect(result.current.currentValues).toEqual([2, 3, 4, 5])
242
+
243
+ act(() => result.current.setValues((oldValues) => oldValues.map((value) => value + 2)))
244
+ expect(result.current.currentValues).toEqual([4, 5, 6, 7])
245
+ })
246
+
213
247
  it('Empties values on calling unsetValues', () => {
214
248
  const { result } = renderHook(() =>
215
249
  useMultipleInputValues({
@@ -237,6 +271,18 @@ describe('useInputValue (controlled)', () => {
237
271
  expect(onChange.mock.calls[0][0]).toEqual('second value')
238
272
  })
239
273
 
274
+ it('Calls `onChange` with result from old value when `setValue` is passed a function', () => {
275
+ const onChange = jest.fn((arg) => arg)
276
+ const { result } = renderHook(() => useInputValue({ value: 1, onChange }))
277
+ expect(result.current.currentValue).toBe(1)
278
+ expect(onChange).toHaveBeenCalledTimes(0)
279
+
280
+ act(() => result.current.setValue((oldValue) => oldValue + 1))
281
+ expect(result.current.currentValue).toBe(1)
282
+ expect(onChange).toHaveBeenCalledTimes(1)
283
+ expect(onChange.mock.calls[0][0]).toEqual(2)
284
+ })
285
+
240
286
  it('Returns updated `currentValue` when non-undefined `value` prop changes', () => {
241
287
  const onChange = () => {}
242
288
  const { result, rerender } = renderHook(({ value }) => useInputValue({ value, onChange }), {
@@ -296,6 +342,18 @@ describe('useMultipleInputValues (controlled)', () => {
296
342
  expect(onChange.mock.calls[0][0]).toEqual(['second value', 'third value'])
297
343
  })
298
344
 
345
+ it('Calls `onChange` with results from old values when `setValues` is passed a function', () => {
346
+ const onChange = jest.fn((arg) => arg)
347
+ const { result } = renderHook(() => useMultipleInputValues({ values: [1, 2, 3, 4], onChange }))
348
+ expect(result.current.currentValues).toEqual([1, 2, 3, 4])
349
+ expect(onChange).toHaveBeenCalledTimes(0)
350
+
351
+ act(() => result.current.setValues((oldValues) => oldValues.map((value) => value + 1)))
352
+ expect(result.current.currentValues).toEqual([1, 2, 3, 4])
353
+ expect(onChange).toHaveBeenCalledTimes(1)
354
+ expect(onChange.mock.calls[0][0]).toEqual([2, 3, 4, 5])
355
+ })
356
+
299
357
  it('Calls onChange with an empty array on calling unsetValues', () => {
300
358
  const onChange = jest.fn((arg) => arg)
301
359
  const { result, rerender } = renderHook(
@@ -0,0 +1,43 @@
1
+ import { Platform } from 'react-native'
2
+
3
+ import { getA11yPropsFromHtmlTag, tagsToRoles, supportedTags } from '../../src'
4
+
5
+ // Note that currently all tests run as ios so only native logic can be tested here
6
+ // until cross-platform tests are set up. See issue:
7
+ // https://github.com/telus/universal-design-system/issues/319
8
+
9
+ // As a temporary measure, there are tests on web-context HTML output for Box component
10
+ // in @telus-uds/ds-allium which test the actual output when the tags are rendered.
11
+
12
+ // These tests will therefore just test the values returned in a native context.
13
+ describe('getA11yPropsFromHtmlTag', () => {
14
+ it.each(Object.entries(tagsToRoles))(
15
+ 'responds to tag "%s" with accessibilityRole "%s"',
16
+ (tag, role) => {
17
+ expect(getA11yPropsFromHtmlTag(tag)).toEqual({ accessibilityRole: role })
18
+ }
19
+ )
20
+
21
+ it.each([
22
+ [1, 'h1'],
23
+ [2, 'h2'],
24
+ [3, 'h3'],
25
+ [4, 'h4'],
26
+ [5, 'h5'],
27
+ [6, 'h6']
28
+ ])('returns accessibility role "header" and level "%s" for header tag "%s"', (level, tag) => {
29
+ expect(getA11yPropsFromHtmlTag(tag)).toEqual({
30
+ accessibilityRole: 'header',
31
+ accessibilityLevel: level
32
+ })
33
+ })
34
+
35
+ if (Platform.OS !== 'web') {
36
+ it.each(supportedTags.map((tag) => [tag]))(
37
+ 'responds to tag "%s" and an arbitrary nativeRole with given nativeRole override',
38
+ (tag) => {
39
+ expect(getA11yPropsFromHtmlTag(tag, 'link')).toEqual({ accessibilityRole: 'link' })
40
+ }
41
+ )
42
+ }
43
+ })
@@ -14,18 +14,29 @@ describe('useCopy hook', () => {
14
14
  it('returns a correct english translation', () => {
15
15
  const { result } = renderHook(() => useCopy({ dictionary, copy: 'en' }))
16
16
 
17
- expect(result.current('translation key')).toBe('english version')
17
+ const getCopy = result.current
18
+ expect(getCopy('translation key')).toBe('english version')
18
19
  })
19
20
 
20
21
  it('returns a correct french translation', () => {
21
22
  const { result } = renderHook(() => useCopy({ dictionary, copy: 'fr' }))
22
23
 
23
- expect(result.current('translation key')).toBe('french version')
24
+ const getCopy = result.current
25
+ expect(getCopy('translation key')).toBe('french version')
24
26
  })
25
27
 
26
28
  it('returns undefined when no translation is found', () => {
27
29
  const { result } = renderHook(() => useCopy({ dictionary, copy: 'en' }))
28
30
 
29
- expect(result.current('non-existing key')).toBe(undefined)
31
+ const getCopy = result.current
32
+ expect(getCopy('non-existing key')).toBe(undefined)
33
+ })
34
+
35
+ it('allows for overriding the entire dictionary with a copy object (ignoring the dictionary argument)', () => {
36
+ const { result } = renderHook(() => useCopy({ dictionary, copy: dictionary.en }))
37
+
38
+ const getCopy = result.current
39
+ expect(getCopy('non-existing key')).toBe(undefined)
40
+ expect(getCopy('translation key')).toBe('english version')
30
41
  })
31
42
  })
@@ -0,0 +1,20 @@
1
+ module.exports = {
2
+ env: {
3
+ /*
4
+ * we actually want this setup to be used whenever we're not in `test` but
5
+ * babel merges plugins array rather than replacing so we can't set it as a
6
+ * default. However the default BABEL_ENV value is development (jest sets it
7
+ * to test)
8
+ */
9
+ development: {
10
+ presets: ['@babel/preset-env', ['@babel/preset-react', { runtime: 'automatic' }]],
11
+ plugins: [['react-native-web', { commonjs: true }]]
12
+ },
13
+ /*
14
+ * jest is testing for just ios at the moment, use a preset which best matches that env
15
+ */
16
+ test: {
17
+ presets: ['module:metro-react-native-babel-preset']
18
+ }
19
+ }
20
+ }
package/jest.config.js CHANGED
@@ -1,10 +1,13 @@
1
1
  const preset = require('react-native/jest-preset')
2
- const displayName = require('./package.json').name.split('@telus-uds/').pop()
2
+ const name = require('./package.json').name.split('@telus-uds/').pop()
3
3
 
4
4
  // cherry-pick the bits of the preset we want to avoid it overriding the fix we have on L14
5
5
  module.exports = {
6
6
  haste: preset.haste,
7
- displayName,
7
+ displayName: {
8
+ name,
9
+ color: 'blue'
10
+ },
8
11
  setupFiles: preset.setupFiles,
9
12
  transform: {
10
13
  // Use babel-jest instead of react-native/jest/preprocessor.js so that the coverage report is correct as per:
@@ -21,7 +24,9 @@ module.exports = {
21
24
  moduleNameMapper: {
22
25
  '.+\\.(otf|svg|png|jpg)$': 'identity-obj-proxy'
23
26
  },
24
- transformIgnorePatterns: preset.transformIgnorePatterns,
27
+ transformIgnorePatterns: [
28
+ 'node_modules/(?!(jest-)?react-native|@react-native|@react-native-community|@react-native-picker)'
29
+ ],
25
30
  // Count everything in src when calculating coverage
26
31
  collectCoverageFrom: ['src/**/*.{js,jsx}']
27
32
  }
@@ -1,58 +1,86 @@
1
- import React, { createContext, useContext, useEffect, useState } from 'react';
2
- import PropTypes from 'prop-types';
3
- import { AccessibilityInfo, Platform } from 'react-native';
4
- const ScreenReaderContext = /*#__PURE__*/createContext(false);
5
- const ReducedMotionContext = /*#__PURE__*/createContext(false);
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useA11yInfo = exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _AccessibilityInfo = _interopRequireDefault(require("react-native-web/dist/cjs/exports/AccessibilityInfo"));
13
+
14
+ var _Platform = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Platform"));
15
+
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
21
+
22
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
23
+
24
+ const ScreenReaderContext = /*#__PURE__*/(0, _react.createContext)(false);
25
+ const ReducedMotionContext = /*#__PURE__*/(0, _react.createContext)(false);
6
26
 
7
27
  const A11yInfoProvider = ({
8
28
  children
9
29
  }) => {
10
- const [reduceMotionEnabled, setReduceMotionEnabled] = useState(false);
11
- const [screenReaderEnabled, setScreenReaderEnabled] = useState(false);
12
- useEffect(() => {
30
+ const [reduceMotionEnabled, setReduceMotionEnabled] = (0, _react.useState)(false);
31
+ const [screenReaderEnabled, setScreenReaderEnabled] = (0, _react.useState)(false);
32
+ (0, _react.useEffect)(() => {
13
33
  if (process.env.NODE_ENV === 'test') {
14
34
  // On Jest these effects do nothing but can cause `act` state change warnings
15
35
  // and "...after the Jest environment has been torn down" errors, so skip them.
16
36
  return () => {};
17
37
  }
18
38
 
19
- AccessibilityInfo.addEventListener('reduceMotionChanged', setReduceMotionEnabled);
20
- AccessibilityInfo.addEventListener('screenReaderChanged', setScreenReaderEnabled);
39
+ _AccessibilityInfo.default.addEventListener('reduceMotionChanged', setReduceMotionEnabled);
40
+
41
+ _AccessibilityInfo.default.addEventListener('screenReaderChanged', setScreenReaderEnabled);
21
42
 
22
43
  const setInitialA11yInfo = async () => {
23
- const [initialReduceMotionEnabled, initialScreenReaderEnabled] = await Promise.all([AccessibilityInfo.isReduceMotionEnabled(), AccessibilityInfo.isScreenReaderEnabled()]); // Browsers can't detect screen readers; in RNW isScreenReaderEnabled() is always `true`
44
+ const [initialReduceMotionEnabled, initialScreenReaderEnabled] = await Promise.all([_AccessibilityInfo.default.isReduceMotionEnabled(), _AccessibilityInfo.default.isScreenReaderEnabled()]); // Browsers can't detect screen readers; in RNW isScreenReaderEnabled() is always `true`
24
45
  // https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/AccessibilityInfo/index.js#L14
25
46
 
26
- setScreenReaderEnabled(Platform.OS !== 'web' && !!initialScreenReaderEnabled); // RNW does support isReduceMotionEnabled looking for 'prefers-reduced-motion' state
47
+ setScreenReaderEnabled(_Platform.default.OS !== 'web' && !!initialScreenReaderEnabled); // RNW does support isReduceMotionEnabled looking for 'prefers-reduced-motion' state
27
48
 
28
49
  setReduceMotionEnabled(!!initialReduceMotionEnabled);
29
50
  };
30
51
 
31
- if (AccessibilityInfo.isReduceMotionEnabled && AccessibilityInfo.isScreenReaderEnabled) {
52
+ if (_AccessibilityInfo.default.isReduceMotionEnabled && _AccessibilityInfo.default.isScreenReaderEnabled) {
32
53
  setInitialA11yInfo();
33
54
  }
34
55
 
35
56
  return () => {
36
- AccessibilityInfo.removeEventListener('reduceMotionChanged', setReduceMotionEnabled);
37
- AccessibilityInfo.removeEventListener('screenReaderChanged', setScreenReaderEnabled);
57
+ _AccessibilityInfo.default.removeEventListener('reduceMotionChanged', setReduceMotionEnabled);
58
+
59
+ _AccessibilityInfo.default.removeEventListener('screenReaderChanged', setScreenReaderEnabled);
38
60
  };
39
61
  }, []);
40
- return /*#__PURE__*/React.createElement(ReducedMotionContext.Provider, {
41
- value: reduceMotionEnabled
42
- }, /*#__PURE__*/React.createElement(ScreenReaderContext.Provider, {
43
- value: screenReaderEnabled
44
- }, children));
62
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(ReducedMotionContext.Provider, {
63
+ value: reduceMotionEnabled,
64
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ScreenReaderContext.Provider, {
65
+ value: screenReaderEnabled,
66
+ children: children
67
+ })
68
+ });
45
69
  };
46
70
 
47
71
  A11yInfoProvider.propTypes = {
48
- children: PropTypes.node.isRequired
72
+ children: _propTypes.default.node.isRequired
49
73
  };
50
- export default A11yInfoProvider;
51
- export const useA11yInfo = () => {
52
- const screenReaderEnabled = useContext(ScreenReaderContext);
53
- const reduceMotionEnabled = useContext(ReducedMotionContext);
74
+ var _default = A11yInfoProvider;
75
+ exports.default = _default;
76
+
77
+ const useA11yInfo = () => {
78
+ const screenReaderEnabled = (0, _react.useContext)(ScreenReaderContext);
79
+ const reduceMotionEnabled = (0, _react.useContext)(ReducedMotionContext);
54
80
  return {
55
81
  reduceMotionEnabled,
56
82
  screenReaderEnabled
57
83
  };
58
- };
84
+ };
85
+
86
+ exports.useA11yInfo = useA11yInfo;
@@ -1,39 +1,65 @@
1
- import React from 'react';
2
- import { Platform, StyleSheet, View } from 'react-native';
3
- import PropTypes from 'prop-types';
4
- import { a11yProps } from '../utils/propTypes';
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _Platform = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Platform"));
11
+
12
+ var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
13
+
14
+ var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
15
+
16
+ var _propTypes = _interopRequireDefault(require("prop-types"));
17
+
18
+ var _propTypes2 = require("../utils/propTypes");
19
+
20
+ var _jsxRuntime = require("react/jsx-runtime");
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
5
28
  /**
6
29
  * A11yText is a zero-size invisible element that adds text to be read by screen readers.
7
30
  *
8
31
  * It should be used to add selectable screen-reader-only text to the main document flow,
9
32
  * as a sibling to blocks of text like paragraphs and interactive elements like buttons.
10
33
  */
11
-
12
- const A11yText = ({
34
+ const A11yText = /*#__PURE__*/(0, _react.forwardRef)(({
13
35
  text,
14
36
  heading,
15
37
  ...rest
16
- }) => {
17
- const a11y = a11yProps.select({
38
+ }, ref) => {
39
+ const a11y = _propTypes2.a11yProps.select({
18
40
  // On iOS, needs `accessible` to be true to be focusable without non-a11y content.
19
41
  // On Web, `accessible` causes RNW to set attributes that may make the element be treated as a group.
20
42
  // On Android, may cause this to be skipped when with `<Text>` siblings in an `accessible` View,
21
43
  // see https://github.com/facebook/react-native/issues/30851#issuecomment-790165489
22
- accessible: Platform.OS === 'ios',
44
+ accessible: _Platform.default.OS === 'ios',
23
45
  accessibilityLabel: text,
24
46
  accessibilityRole: heading ? 'header' : 'text',
25
47
  ...rest
26
48
  });
27
- return /*#__PURE__*/React.createElement(View, Object.assign({
28
- style: styles.invisible
29
- }, a11y));
30
- };
31
49
 
50
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
51
+ style: styles.invisible,
52
+ ref: ref,
53
+ ...a11y
54
+ });
55
+ });
56
+ A11yText.displayName = 'A11yText';
32
57
  A11yText.propTypes = {
33
- text: PropTypes.string.isRequired,
34
- heading: PropTypes.bool
58
+ text: _propTypes.default.string.isRequired,
59
+ heading: _propTypes.default.bool
35
60
  };
36
- const styles = StyleSheet.create({
61
+
62
+ const styles = _StyleSheet.default.create({
37
63
  invisible: {
38
64
  // Without width or height it is not shown
39
65
  minHeight: 1,
@@ -46,4 +72,6 @@ const styles = StyleSheet.create({
46
72
  top: -1
47
73
  }
48
74
  });
49
- export default A11yText;
75
+
76
+ var _default = A11yText;
77
+ exports.default = _default;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _shared = require("./shared");
11
+
12
+ var _jsxRuntime = require("react/jsx-runtime");
13
+
14
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
+
16
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
+
18
+ const SVG_RADIUS = 20;
19
+ const SVG_CIRCUMFERENCE = SVG_RADIUS * 2 * Math.PI;
20
+ const MIN_SVG_LENGTH = _shared.MIN_STROKE_ANGLE / 360 * SVG_CIRCUMFERENCE;
21
+ const MAX_SVG_LENGTH = (1 - _shared.MIN_EMPTY_ANGLE / 360) * SVG_CIRCUMFERENCE;
22
+ const animationProps = {
23
+ begin: '0s',
24
+ dur: `${_shared.DURATION}ms`,
25
+ fill: 'freeze',
26
+ repeatCount: 'indefinite'
27
+ };
28
+ const bezierProps = {
29
+ calcMode: 'spline',
30
+ keyTimes: '0; 0.5; 1',
31
+ keySplines: `${_shared.BEZIER.join(', ')} ; ${_shared.BEZIER.join(', ')}`
32
+ }; // We're using svg rather than css here to define the animation to avoid needing to introduce css injection mechanism
33
+ // It's possible to replicate this functionality with RNW animations, but it snags on chrome at least, see https://github.com/telus/universal-design-system/pull/477 for details.
34
+
35
+ const Spinner = /*#__PURE__*/(0, _react.forwardRef)(({
36
+ size,
37
+ color,
38
+ thickness,
39
+ label
40
+ }, ref) => /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
41
+ ref: ref,
42
+ width: `${size}px`,
43
+ height: `${size}px`,
44
+ viewBox: "0 0 48 48",
45
+ "aria-valuetext": label,
46
+ role: "progressbar",
47
+ "aria-busy": true,
48
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("g", {
49
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("animateTransform", {
50
+ attributeName: "transform",
51
+ type: "rotate",
52
+ values: `-180 24 24;${360 + _shared.MIN_STROKE_ANGLE - 180} 24 24`,
53
+ ...animationProps
54
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("circle", {
55
+ fill: "none",
56
+ stroke: color,
57
+ strokeWidth: thickness * 48 / size,
58
+ strokeLinecap: "round",
59
+ cx: "24",
60
+ cy: "24",
61
+ r: "20",
62
+ strokeDasharray: [MIN_SVG_LENGTH, SVG_CIRCUMFERENCE],
63
+ strokeDashoffset: 0,
64
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("animate", {
65
+ attributeName: "stroke-dashoffset",
66
+ values: `0;-10;${MIN_SVG_LENGTH - SVG_CIRCUMFERENCE}`,
67
+ ...animationProps,
68
+ ...bezierProps
69
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("animate", {
70
+ attributeName: "stroke-dasharray",
71
+ values: `${MIN_SVG_LENGTH}, 200;${MAX_SVG_LENGTH}, 200;${MIN_SVG_LENGTH}, 200`,
72
+ ...animationProps,
73
+ ...bezierProps
74
+ })]
75
+ })]
76
+ })
77
+ }));
78
+ Spinner.displayName = 'Spinner';
79
+ Spinner.propTypes = _shared.propTypes;
80
+ var _default = Spinner;
81
+ exports.default = _default;