@telus-uds/components-base 0.0.2-prerelease.9 → 1.1.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 (293) hide show
  1. package/.eslintrc.js +9 -0
  2. package/.storybook/main.js +4 -0
  3. package/.storybook/preview.js +37 -0
  4. package/.ultra.cache.json +1 -1
  5. package/CHANGELOG.md +50 -0
  6. package/README.md +4 -2
  7. package/__fixtures__/test-utils.js +25 -0
  8. package/__fixtures__/testTheme.js +4 -2
  9. package/__tests__/Button/ButtonGroup.test.jsx +4 -5
  10. package/__tests__/Checkbox/Checkbox.test.jsx +2 -2
  11. package/__tests__/Checkbox/CheckboxGroup.test.jsx +4 -5
  12. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
  13. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
  14. package/__tests__/Link/LinkBase.test.jsx +0 -14
  15. package/__tests__/Radio/Radio.test.jsx +2 -2
  16. package/__tests__/Radio/RadioGroup.test.jsx +4 -5
  17. package/__tests__/RadioCard/RadioCard.test.jsx +2 -2
  18. package/__tests__/RadioCard/RadioCardGroup.test.jsx +4 -5
  19. package/__tests__/Search/Search.test.jsx +9 -8
  20. package/__tests__/Select/Select.test.jsx +3 -2
  21. package/__tests__/Tabs/Tabs.test.jsx +1 -161
  22. package/__tests__/Tags/Tags.test.jsx +4 -5
  23. package/__tests__/TextInput/TextArea.test.jsx +3 -2
  24. package/__tests__/TextInput/TextInputBase.test.jsx +10 -5
  25. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
  26. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
  27. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
  28. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
  29. package/__tests__/utils/children.test.jsx +128 -0
  30. package/__tests__/utils/input.test.js +1 -1
  31. package/__tests__/utils/semantics.test.jsx +43 -0
  32. package/babel.config.js +9 -16
  33. package/component-docs.json +10313 -0
  34. package/generate-component-docs.js +56 -0
  35. package/lib/A11yText/index.js +10 -5
  36. package/lib/ActivityIndicator/Spinner.js +16 -13
  37. package/lib/ActivityIndicator/Spinner.native.js +12 -8
  38. package/lib/Box/Box.js +103 -8
  39. package/lib/Button/Button.js +9 -8
  40. package/lib/Button/ButtonBase.js +14 -7
  41. package/lib/Button/ButtonGroup.js +25 -10
  42. package/lib/Button/ButtonLink.js +10 -7
  43. package/lib/Card/Card.js +2 -0
  44. package/lib/Card/CardBase.js +13 -5
  45. package/lib/Card/PressableCardBase.js +12 -8
  46. package/lib/Checkbox/Checkbox.js +25 -14
  47. package/lib/Checkbox/CheckboxGroup.js +22 -12
  48. package/lib/Divider/Divider.js +12 -7
  49. package/lib/ExpandCollapse/Accordion.js +10 -4
  50. package/lib/ExpandCollapse/Control.js +12 -6
  51. package/lib/ExpandCollapse/ExpandCollapse.js +10 -5
  52. package/lib/ExpandCollapse/Panel.js +8 -7
  53. package/lib/Feedback/Feedback.js +10 -5
  54. package/lib/Fieldset/Fieldset.js +10 -5
  55. package/lib/Fieldset/FieldsetContainer.js +10 -5
  56. package/lib/Fieldset/FieldsetContainer.native.js +10 -5
  57. package/lib/Fieldset/Legend.js +10 -5
  58. package/lib/Fieldset/Legend.native.js +10 -5
  59. package/lib/FlexGrid/Col/Col.js +8 -5
  60. package/lib/FlexGrid/FlexGrid.js +31 -6
  61. package/lib/FlexGrid/Row/Row.js +12 -5
  62. package/lib/{Tabs → HorizontalScroll}/HorizontalScroll.js +5 -4
  63. package/lib/{Tabs/TabsScrollButton.js → HorizontalScroll/HorizontalScrollButton.js} +14 -8
  64. package/lib/{Tabs → HorizontalScroll}/ScrollViewEnd.js +0 -0
  65. package/lib/{Tabs → HorizontalScroll}/ScrollViewEnd.native.js +0 -0
  66. package/lib/{Tabs → HorizontalScroll}/dictionary.js +0 -0
  67. package/lib/HorizontalScroll/index.js +35 -0
  68. package/lib/{Tabs → HorizontalScroll}/itemPositions.js +0 -0
  69. package/lib/Icon/Icon.js +16 -9
  70. package/lib/Icon/IconText.js +8 -7
  71. package/lib/IconButton/IconButton.js +10 -5
  72. package/lib/InputLabel/InputLabel.js +33 -5
  73. package/lib/InputLabel/LabelContent.js +22 -12
  74. package/lib/InputLabel/LabelContent.native.js +23 -5
  75. package/lib/InputSupports/InputSupports.js +10 -5
  76. package/lib/Link/ChevronLink.js +12 -5
  77. package/lib/Link/InlinePressable.js +10 -4
  78. package/lib/Link/InlinePressable.native.js +5 -4
  79. package/lib/Link/Link.js +12 -5
  80. package/lib/Link/LinkBase.js +12 -5
  81. package/lib/Link/TextButton.js +10 -5
  82. package/lib/List/List.js +6 -6
  83. package/lib/List/ListItem.js +28 -33
  84. package/lib/List/index.js +15 -0
  85. package/lib/Modal/Modal.js +10 -5
  86. package/lib/Notification/Notification.js +21 -5
  87. package/lib/Pagination/PageButton.js +16 -11
  88. package/lib/Pagination/Pagination.js +12 -7
  89. package/lib/Pagination/SideButton.js +12 -7
  90. package/lib/Pagination/usePagination.js +2 -2
  91. package/lib/Progress/Progress.js +10 -5
  92. package/lib/Progress/ProgressBar.js +21 -10
  93. package/lib/Progress/ProgressBarBackground.js +12 -8
  94. package/lib/Radio/Radio.js +14 -13
  95. package/lib/Radio/RadioButton.js +20 -9
  96. package/lib/Radio/RadioGroup.js +24 -13
  97. package/lib/RadioCard/RadioCard.js +14 -10
  98. package/lib/RadioCard/RadioCardGroup.js +13 -12
  99. package/lib/Search/Search.js +29 -18
  100. package/lib/Select/Picker.js +11 -6
  101. package/lib/Select/Picker.native.js +21 -6
  102. package/lib/Select/Select.js +46 -4
  103. package/lib/SideNav/Item.js +10 -5
  104. package/lib/SideNav/ItemsGroup.js +10 -5
  105. package/lib/SideNav/SideNav.js +11 -7
  106. package/lib/Skeleton/Skeleton.js +15 -15
  107. package/lib/Skeleton/skeletonWebAnimation.js +1 -1
  108. package/lib/Spacer/Spacer.js +19 -7
  109. package/lib/StackView/StackView.js +26 -7
  110. package/lib/StackView/StackWrap.js +24 -13
  111. package/lib/StackView/StackWrapBox.js +34 -8
  112. package/lib/StackView/StackWrapGap.js +16 -7
  113. package/lib/StackView/common.js +4 -2
  114. package/lib/StackView/getStackedContent.js +2 -2
  115. package/lib/StepTracker/StepTracker.js +10 -5
  116. package/lib/Tabs/Tabs.js +26 -19
  117. package/lib/Tabs/TabsItem.js +16 -12
  118. package/lib/Tags/Tags.js +27 -11
  119. package/lib/TextInput/TextArea.js +7 -5
  120. package/lib/TextInput/TextInput.js +12 -6
  121. package/lib/TextInput/TextInputBase.js +12 -8
  122. package/lib/ThemeProvider/ThemeProvider.js +14 -10
  123. package/lib/ThemeProvider/useSetTheme.js +6 -1
  124. package/lib/ThemeProvider/utils/styles.js +2 -2
  125. package/lib/ThemeProvider/utils/theme-tokens.js +39 -8
  126. package/lib/ToggleSwitch/ToggleSwitch.js +11 -6
  127. package/lib/Tooltip/Backdrop.js +10 -2
  128. package/lib/Tooltip/Tooltip.js +5 -4
  129. package/lib/Typography/Typography.js +40 -24
  130. package/lib/index.js +36 -1
  131. package/lib/utils/a11y/index.js +13 -0
  132. package/lib/utils/a11y/propTypes.js +61 -0
  133. package/lib/utils/a11y/propTypes.native.js +47 -0
  134. package/lib/utils/a11y/semantics.js +173 -0
  135. package/lib/utils/animation/useVerticalExpandAnimation.js +1 -1
  136. package/lib/utils/children.js +55 -8
  137. package/lib/utils/input.js +27 -17
  138. package/lib/utils/propTypes.js +40 -68
  139. package/lib/utils/useCopy.js +1 -1
  140. package/lib/utils/useHash.js +8 -4
  141. package/lib/utils/useSpacingScale.js +1 -3
  142. package/lib/utils/useUniqueId.js +1 -1
  143. package/package.json +14 -6
  144. package/release-context.json +4 -4
  145. package/src/A11yText/index.jsx +6 -4
  146. package/src/ActivityIndicator/Spinner.jsx +5 -3
  147. package/src/ActivityIndicator/Spinner.native.jsx +5 -3
  148. package/src/Box/Box.jsx +125 -39
  149. package/src/Button/Button.jsx +7 -4
  150. package/src/Button/ButtonBase.jsx +86 -77
  151. package/src/Button/ButtonGroup.jsx +81 -69
  152. package/src/Button/ButtonLink.jsx +18 -13
  153. package/src/Card/Card.jsx +2 -2
  154. package/src/Card/CardBase.jsx +6 -4
  155. package/src/Card/PressableCardBase.jsx +71 -64
  156. package/src/Checkbox/Checkbox.jsx +118 -108
  157. package/src/Checkbox/CheckboxGroup.jsx +72 -62
  158. package/src/Divider/Divider.jsx +7 -4
  159. package/src/ExpandCollapse/Accordion.jsx +3 -2
  160. package/src/ExpandCollapse/Control.jsx +40 -43
  161. package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
  162. package/src/ExpandCollapse/Panel.jsx +69 -63
  163. package/src/Feedback/Feedback.jsx +36 -33
  164. package/src/Fieldset/Fieldset.jsx +63 -56
  165. package/src/Fieldset/FieldsetContainer.jsx +14 -5
  166. package/src/Fieldset/FieldsetContainer.native.jsx +7 -4
  167. package/src/Fieldset/Legend.jsx +7 -2
  168. package/src/Fieldset/Legend.native.jsx +7 -2
  169. package/src/FlexGrid/Col/Col.jsx +139 -132
  170. package/src/FlexGrid/FlexGrid.jsx +79 -51
  171. package/src/FlexGrid/Row/Row.jsx +55 -48
  172. package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
  173. package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
  174. package/src/{Tabs → HorizontalScroll}/ScrollViewEnd.jsx +0 -0
  175. package/src/{Tabs → HorizontalScroll}/ScrollViewEnd.native.jsx +0 -0
  176. package/src/{Tabs → HorizontalScroll}/dictionary.js +0 -0
  177. package/src/HorizontalScroll/index.js +17 -0
  178. package/src/{Tabs → HorizontalScroll}/itemPositions.js +0 -0
  179. package/src/Icon/Icon.jsx +37 -35
  180. package/src/Icon/IconText.jsx +22 -17
  181. package/src/IconButton/IconButton.jsx +49 -42
  182. package/src/InputLabel/InputLabel.jsx +53 -38
  183. package/src/InputLabel/LabelContent.jsx +14 -6
  184. package/src/InputLabel/LabelContent.native.jsx +11 -2
  185. package/src/InputSupports/InputSupports.jsx +29 -34
  186. package/src/Link/ChevronLink.jsx +26 -16
  187. package/src/Link/InlinePressable.jsx +5 -3
  188. package/src/Link/InlinePressable.native.jsx +5 -3
  189. package/src/Link/Link.jsx +22 -16
  190. package/src/Link/LinkBase.jsx +67 -58
  191. package/src/Link/TextButton.jsx +30 -23
  192. package/src/List/List.jsx +6 -7
  193. package/src/List/ListItem.jsx +70 -90
  194. package/src/List/index.js +5 -0
  195. package/src/Modal/Modal.jsx +9 -4
  196. package/src/Notification/Notification.jsx +58 -43
  197. package/src/Pagination/PageButton.jsx +37 -34
  198. package/src/Pagination/Pagination.jsx +88 -92
  199. package/src/Pagination/SideButton.jsx +44 -41
  200. package/src/Progress/Progress.jsx +5 -4
  201. package/src/Progress/ProgressBar.jsx +42 -29
  202. package/src/Progress/ProgressBarBackground.jsx +5 -3
  203. package/src/Radio/Radio.jsx +85 -78
  204. package/src/Radio/RadioButton.jsx +54 -43
  205. package/src/Radio/RadioGroup.jsx +74 -63
  206. package/src/RadioCard/RadioCard.jsx +75 -68
  207. package/src/RadioCard/RadioCardGroup.jsx +82 -75
  208. package/src/Search/Search.jsx +127 -106
  209. package/src/Select/Picker.jsx +49 -42
  210. package/src/Select/Picker.native.jsx +56 -49
  211. package/src/Select/Select.jsx +115 -72
  212. package/src/SideNav/Item.jsx +53 -46
  213. package/src/SideNav/ItemsGroup.jsx +50 -43
  214. package/src/SideNav/SideNav.jsx +68 -60
  215. package/src/Skeleton/Skeleton.jsx +9 -13
  216. package/src/Spacer/Spacer.jsx +11 -4
  217. package/src/StackView/StackView.jsx +47 -23
  218. package/src/StackView/StackWrap.jsx +14 -12
  219. package/src/StackView/StackWrapBox.jsx +62 -28
  220. package/src/StackView/StackWrapGap.jsx +46 -24
  221. package/src/StackView/common.jsx +3 -2
  222. package/src/StepTracker/StepTracker.jsx +73 -62
  223. package/src/Tabs/Tabs.jsx +70 -62
  224. package/src/Tabs/TabsItem.jsx +111 -103
  225. package/src/Tags/Tags.jsx +114 -102
  226. package/src/TextInput/TextArea.jsx +5 -4
  227. package/src/TextInput/TextInput.jsx +5 -4
  228. package/src/TextInput/TextInputBase.jsx +84 -77
  229. package/src/ThemeProvider/ThemeProvider.jsx +11 -7
  230. package/src/ThemeProvider/useSetTheme.js +4 -0
  231. package/src/ThemeProvider/utils/theme-tokens.js +28 -0
  232. package/src/ToggleSwitch/ToggleSwitch.jsx +49 -50
  233. package/src/Tooltip/Tooltip.jsx +134 -130
  234. package/src/Typography/Typography.jsx +67 -44
  235. package/src/index.js +3 -1
  236. package/src/utils/a11y/index.js +1 -0
  237. package/src/utils/a11y/propTypes.js +61 -0
  238. package/src/utils/a11y/propTypes.native.js +39 -0
  239. package/src/utils/a11y/semantics.js +162 -0
  240. package/src/utils/children.jsx +60 -7
  241. package/src/utils/input.js +20 -17
  242. package/src/utils/propTypes.js +30 -76
  243. package/src/utils/useCopy.js +1 -1
  244. package/src/utils/useHash.js +8 -3
  245. package/stories/A11yText/A11yText.stories.jsx +3 -3
  246. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +2 -2
  247. package/stories/Box/Box.stories.jsx +2 -2
  248. package/stories/Button/Button.stories.jsx +3 -3
  249. package/stories/Button/ButtonGroup.stories.jsx +2 -2
  250. package/stories/Button/ButtonLink.stories.jsx +2 -2
  251. package/stories/Card/Card.stories.jsx +2 -2
  252. package/stories/Checkbox/Checkbox.stories.jsx +2 -2
  253. package/stories/Divider/Divider.stories.jsx +2 -2
  254. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +3 -3
  255. package/stories/Feedback/Feedback.stories.jsx +2 -2
  256. package/stories/FlexGrid/01 FlexGrid.stories.jsx +2 -2
  257. package/stories/FlexGrid/02 Row.stories.jsx +2 -2
  258. package/stories/FlexGrid/03 Col.stories.jsx +2 -2
  259. package/stories/Icon/Icon.stories.jsx +2 -2
  260. package/stories/IconButton/IconButton.stories.jsx +2 -2
  261. package/stories/InputLabel/InputLabel.stories.jsx +2 -2
  262. package/stories/Link/ChevronLink.stories.jsx +2 -2
  263. package/stories/Link/Link.stories.jsx +2 -2
  264. package/stories/Link/TextButton.stories.jsx +2 -2
  265. package/stories/List/List.stories.jsx +2 -2
  266. package/stories/Modal/Modal.stories.jsx +2 -2
  267. package/stories/Notification/Notification.stories.jsx +2 -2
  268. package/stories/Pagination/Pagination.stories.jsx +2 -2
  269. package/stories/Progress/Progress.stories.jsx +2 -2
  270. package/stories/Radio/Radio.stories.jsx +2 -2
  271. package/stories/RadioCard/RadioCard.stories.jsx +2 -2
  272. package/stories/Search/Search.stories.jsx +2 -2
  273. package/stories/Select/Select.stories.jsx +2 -2
  274. package/stories/SideNav/SideNav.stories.jsx +2 -2
  275. package/stories/SideNav/SideNavItem.stories.jsx +2 -2
  276. package/stories/SideNav/SideNavItemsGroup.stories.jsx +2 -2
  277. package/stories/Skeleton/Skeleton.stories.jsx +3 -3
  278. package/stories/Spacer/Spacer.stories.jsx +2 -2
  279. package/stories/StackView/StackView.stories.jsx +2 -2
  280. package/stories/StackView/StackWrap.stories.jsx +2 -2
  281. package/stories/StepTracker/StepTracker.stories.jsx +2 -2
  282. package/stories/Tabs/Tabs.stories.jsx +2 -2
  283. package/stories/Tags/Tags.stories.jsx +2 -2
  284. package/stories/TextInput/TextArea.stories.jsx +2 -2
  285. package/stories/TextInput/TextInput.stories.jsx +2 -2
  286. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +2 -2
  287. package/stories/Tooltip/Tooltip.stories.jsx +2 -2
  288. package/stories/TooltipButton/TooltipButton.stories.jsx +2 -2
  289. package/stories/Typography/Typography.stories.jsx +2 -2
  290. package/stories/platform-supports.jsx +1 -1
  291. package/stories/supports.jsx +4 -5
  292. package/src/Tabs/HorizontalScroll.jsx +0 -165
  293. package/src/Tabs/TabsScrollButton.jsx +0 -100
@@ -1,4 +1,4 @@
1
- import React, { useContext } from 'react'
1
+ import React, { forwardRef, useContext } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { Platform, StyleSheet, View } from 'react-native'
4
4
  import { viewports } from '@telus-uds/system-constants'
@@ -8,166 +8,173 @@ import { useViewport } from '../../ViewportProvider'
8
8
  import applyInheritance from '../helpers'
9
9
  import { responsiveProps } from '../../utils'
10
10
 
11
- const Col = ({
12
- horizontalAlign,
13
- children,
14
- xs,
15
- sm,
16
- md,
17
- lg,
18
- xl,
19
- xsOffset,
20
- smOffset,
21
- mdOffset,
22
- lgOffset,
23
- xlOffset,
24
- ...viewProps
25
- }) => {
26
- const gutter = useContext(GutterContext)
27
- const viewPort = useViewport()
11
+ const Col = forwardRef(
12
+ (
13
+ {
14
+ horizontalAlign,
15
+ children,
16
+ xs,
17
+ sm,
18
+ md,
19
+ lg,
20
+ xl,
21
+ xsOffset,
22
+ smOffset,
23
+ mdOffset,
24
+ lgOffset,
25
+ xlOffset,
26
+ ...viewProps
27
+ },
28
+ ref
29
+ ) => {
30
+ const gutter = useContext(GutterContext)
31
+ const viewPort = useViewport()
28
32
 
29
- const hiddenLevels = applyInheritance([xs, sm, md, lg, xl])
33
+ const hiddenLevels = applyInheritance([xs, sm, md, lg, xl])
30
34
 
31
- const getHorizontalAlignLevel = () => {
32
- if (typeof horizontalAlign === 'object') {
33
- return applyInheritance([
34
- horizontalAlign.xs,
35
- horizontalAlign.sm,
36
- horizontalAlign.md,
37
- horizontalAlign.lg,
38
- horizontalAlign.xl
39
- ])
35
+ const getHorizontalAlignLevel = () => {
36
+ if (typeof horizontalAlign === 'object') {
37
+ return applyInheritance([
38
+ horizontalAlign.xs,
39
+ horizontalAlign.sm,
40
+ horizontalAlign.md,
41
+ horizontalAlign.lg,
42
+ horizontalAlign.xl
43
+ ])
44
+ }
45
+ if (typeof horizontalAlign === 'string') {
46
+ return [horizontalAlign, horizontalAlign, horizontalAlign, horizontalAlign, horizontalAlign]
47
+ }
48
+ return ['inherit', 'inherit', 'inherit', 'inherit', 'inherit']
40
49
  }
41
- if (typeof horizontalAlign === 'string') {
42
- return [horizontalAlign, horizontalAlign, horizontalAlign, horizontalAlign, horizontalAlign]
50
+ const horizontalAlignLevel = getHorizontalAlignLevel()
51
+
52
+ const toPercent = (num) => {
53
+ return `${(num / 12) * 100}%`
43
54
  }
44
- return ['inherit', 'inherit', 'inherit', 'inherit', 'inherit']
45
- }
46
- const horizontalAlignLevel = getHorizontalAlignLevel()
47
55
 
48
- const toPercent = (num) => {
49
- return `${(num / 12) * 100}%`
50
- }
56
+ const calculateWidth = (value) => {
57
+ if (typeof value === 'undefined') {
58
+ return {}
59
+ }
51
60
 
52
- const calculateWidth = (value) => {
53
- if (typeof value === 'undefined') {
54
- return {}
55
- }
61
+ if (typeof value === 'number') {
62
+ const percent = toPercent(value)
56
63
 
57
- if (typeof value === 'number') {
58
- const percent = toPercent(value)
64
+ return {
65
+ maxWidth: percent,
66
+ flexBasis: percent
67
+ }
68
+ }
59
69
 
60
70
  return {
61
- maxWidth: percent,
62
- flexBasis: percent
71
+ flexGrow: 1,
72
+ flexBasis: 0,
73
+ maxWidth: '100%'
63
74
  }
64
75
  }
65
76
 
66
- return {
67
- flexGrow: 1,
68
- flexBasis: 0,
69
- maxWidth: '100%'
70
- }
71
- }
72
-
73
- const calculateOffset = (value) => {
74
- if (typeof value === 'number') {
75
- const percent = toPercent(value)
77
+ const calculateOffset = (value) => {
78
+ if (typeof value === 'number') {
79
+ const percent = toPercent(value)
76
80
 
77
- return { marginLeft: percent }
81
+ return { marginLeft: percent }
82
+ }
83
+ return {}
78
84
  }
79
- return {}
80
- }
81
85
 
82
- const sizeStyles = (sizes) => {
83
- const currViewport = Object.keys(sizes).find((key) => key.startsWith(viewPort))
84
- const currSize = sizes[currViewport]
85
- return {
86
- ...calculateWidth(currSize)
86
+ const sizeStyles = (sizes) => {
87
+ const currViewport = Object.keys(sizes).find((key) => key.startsWith(viewPort))
88
+ const currSize = sizes[currViewport]
89
+ return {
90
+ ...calculateWidth(currSize)
91
+ }
87
92
  }
88
- }
89
93
 
90
- const offsetStyles = (offsets) => {
91
- const currViewport = Object.keys(offsets).find((key) => key.startsWith(viewPort))
92
- const currOffset = offsets[currViewport]
93
- return {
94
- ...calculateOffset(currOffset)
94
+ const offsetStyles = (offsets) => {
95
+ const currViewport = Object.keys(offsets).find((key) => key.startsWith(viewPort))
96
+ const currOffset = offsets[currViewport]
97
+ return {
98
+ ...calculateOffset(currOffset)
99
+ }
95
100
  }
96
- }
97
101
 
98
- const gutterPadding = {
99
- paddingLeft: gutter ? 16 : 0,
100
- paddingRight: gutter ? 16 : 0
101
- }
102
+ const gutterPadding = {
103
+ paddingLeft: gutter ? 16 : 0,
104
+ paddingRight: gutter ? 16 : 0
105
+ }
102
106
 
103
- let hidingStyles = {}
107
+ let hidingStyles = {}
104
108
 
105
- const shown = Platform.OS === 'web' ? 'block' : 'flex'
109
+ const shown = Platform.OS === 'web' ? 'block' : 'flex'
106
110
 
107
- if (viewPort === viewports.xs) {
108
- hidingStyles = {
109
- display: hiddenLevels[0] === 0 ? 'none' : shown,
110
- textAlign: horizontalAlignLevel[0]
111
+ if (viewPort === viewports.xs) {
112
+ hidingStyles = {
113
+ display: hiddenLevels[0] === 0 ? 'none' : shown,
114
+ textAlign: horizontalAlignLevel[0]
115
+ }
111
116
  }
112
- }
113
- if (viewPort === viewports.sm) {
114
- hidingStyles = {
115
- display: hiddenLevels[1] === 0 ? 'none' : shown,
116
- textAlign: horizontalAlignLevel[1]
117
+ if (viewPort === viewports.sm) {
118
+ hidingStyles = {
119
+ display: hiddenLevels[1] === 0 ? 'none' : shown,
120
+ textAlign: horizontalAlignLevel[1]
121
+ }
117
122
  }
118
- }
119
- if (viewPort === viewports.md) {
120
- hidingStyles = {
121
- display: hiddenLevels[2] === 0 ? 'none' : shown,
122
- textAlign: horizontalAlignLevel[2]
123
+ if (viewPort === viewports.md) {
124
+ hidingStyles = {
125
+ display: hiddenLevels[2] === 0 ? 'none' : shown,
126
+ textAlign: horizontalAlignLevel[2]
127
+ }
123
128
  }
124
- }
125
- if (viewPort === viewports.lg) {
126
- hidingStyles = {
127
- display: hiddenLevels[3] === 0 ? 'none' : shown,
128
- textAlign: horizontalAlignLevel[3]
129
+ if (viewPort === viewports.lg) {
130
+ hidingStyles = {
131
+ display: hiddenLevels[3] === 0 ? 'none' : shown,
132
+ textAlign: horizontalAlignLevel[3]
133
+ }
129
134
  }
130
- }
131
- if (viewPort === viewports.xl) {
132
- hidingStyles = {
133
- display: hiddenLevels[4] === 0 ? 'none' : shown,
134
- textAlign: horizontalAlignLevel[4]
135
+ if (viewPort === viewports.xl) {
136
+ hidingStyles = {
137
+ display: hiddenLevels[4] === 0 ? 'none' : shown,
138
+ textAlign: horizontalAlignLevel[4]
139
+ }
135
140
  }
136
- }
137
141
 
138
- const sizesArray = [xs, sm, md, lg, xl]
139
- const offSetsArray = [xsOffset, smOffset, mdOffset, lgOffset, xlOffset]
140
- const sizesWithIheritance = applyInheritance(sizesArray)
141
- const offsetsWithIheritance = applyInheritance(offSetsArray)
142
- const sizes = {
143
- xs: sizesWithIheritance[0],
144
- sm: sizesWithIheritance[1],
145
- md: sizesWithIheritance[2],
146
- lg: sizesWithIheritance[3],
147
- xl: sizesWithIheritance[4]
148
- }
149
- const offsets = {
150
- xs: offsetsWithIheritance[0],
151
- sm: offsetsWithIheritance[1],
152
- md: offsetsWithIheritance[2],
153
- lg: offsetsWithIheritance[3],
154
- xl: offsetsWithIheritance[4]
142
+ const sizesArray = [xs, sm, md, lg, xl]
143
+ const offSetsArray = [xsOffset, smOffset, mdOffset, lgOffset, xlOffset]
144
+ const sizesWithIheritance = applyInheritance(sizesArray)
145
+ const offsetsWithIheritance = applyInheritance(offSetsArray)
146
+ const sizes = {
147
+ xs: sizesWithIheritance[0],
148
+ sm: sizesWithIheritance[1],
149
+ md: sizesWithIheritance[2],
150
+ lg: sizesWithIheritance[3],
151
+ xl: sizesWithIheritance[4]
152
+ }
153
+ const offsets = {
154
+ xs: offsetsWithIheritance[0],
155
+ sm: offsetsWithIheritance[1],
156
+ md: offsetsWithIheritance[2],
157
+ lg: offsetsWithIheritance[3],
158
+ xl: offsetsWithIheritance[4]
159
+ }
160
+ return (
161
+ <View
162
+ ref={ref}
163
+ {...viewProps}
164
+ style={[
165
+ styles.col,
166
+ gutterPadding,
167
+ offsetStyles(offsets),
168
+ sizeStyles(sizes),
169
+ { ...hidingStyles }
170
+ ]}
171
+ >
172
+ {children}
173
+ </View>
174
+ )
155
175
  }
156
- return (
157
- <View
158
- {...viewProps}
159
- style={[
160
- styles.col,
161
- gutterPadding,
162
- offsetStyles(offsets),
163
- sizeStyles(sizes),
164
- { ...hidingStyles }
165
- ]}
166
- >
167
- {children}
168
- </View>
169
- )
170
- }
176
+ )
177
+ Col.displayName = 'Col'
171
178
 
172
179
  const styles = StyleSheet.create({
173
180
  col: {
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { View, StyleSheet } from 'react-native'
4
4
  import { viewports } from '@telus-uds/system-constants'
@@ -8,62 +8,81 @@ import Col from './Col'
8
8
  import { useViewport } from '../ViewportProvider'
9
9
  import GutterContext from './providers/GutterContext'
10
10
  import applyInheritance from './helpers'
11
+ import { a11yProps, viewProps, getA11yPropsFromHtmlTag, layoutTags } from '../utils'
11
12
 
12
13
  /**
13
14
  * A mobile-first flexbox grid.
14
15
  */
15
16
 
16
- const FlexGrid = ({
17
- limitWidth = true,
18
- gutter = true,
19
- outsideGutter = true,
20
- xsReverse,
21
- smReverse,
22
- mdReverse,
23
- lgReverse,
24
- xlReverse,
25
- children,
26
- ...rest
27
- }) => {
28
- const viewPort = useViewport()
29
- const reverseLevel = applyInheritance([xsReverse, smReverse, mdReverse, lgReverse, xlReverse])
30
- const marginVertical = 0
31
- const marginHorizontal = outsideGutter ? 'auto' : -16
32
- const width = outsideGutter ? '100%' : 'auto'
33
- let flexDirection
34
- let maxWidth
35
- if (viewPort === viewports.xs) {
36
- // no maxWidth for xs
37
- flexDirection = reverseLevel[0] ? 'column-reverse' : 'column'
38
- }
39
- if (viewPort === viewports.sm) {
40
- maxWidth = limitWidth && viewports.map.get(viewports.sm)
41
- flexDirection = reverseLevel[1] ? 'column-reverse' : 'column'
42
- }
43
- if (viewPort === viewports.md) {
44
- maxWidth = limitWidth && viewports.map.get(viewports.md)
45
- flexDirection = reverseLevel[2] ? 'column-reverse' : 'column'
46
- }
47
- if (viewPort === viewports.lg) {
48
- maxWidth = limitWidth && viewports.map.get(viewports.lg)
49
- flexDirection = reverseLevel[3] ? 'column-reverse' : 'column'
50
- }
51
- if (viewPort === viewports.xl) {
52
- maxWidth = limitWidth && viewports.map.get(viewports.xl)
53
- flexDirection = reverseLevel[4] ? 'column-reverse' : 'column'
54
- }
17
+ const FlexGrid = forwardRef(
18
+ (
19
+ {
20
+ limitWidth = true,
21
+ gutter = true,
22
+ outsideGutter = true,
23
+ xsReverse,
24
+ smReverse,
25
+ mdReverse,
26
+ lgReverse,
27
+ xlReverse,
28
+ tag,
29
+ accessibilityRole,
30
+ children,
31
+ ...rest
32
+ },
33
+ ref
34
+ ) => {
35
+ const viewPort = useViewport()
36
+ const reverseLevel = applyInheritance([xsReverse, smReverse, mdReverse, lgReverse, xlReverse])
37
+ const marginVertical = 0
38
+ const marginHorizontal = outsideGutter ? 'auto' : -16
39
+ const width = outsideGutter ? '100%' : 'auto'
40
+ let flexDirection
41
+ let maxWidth
42
+ if (viewPort === viewports.xs) {
43
+ // no maxWidth for xs
44
+ flexDirection = reverseLevel[0] ? 'column-reverse' : 'column'
45
+ }
46
+ if (viewPort === viewports.sm) {
47
+ maxWidth = limitWidth && viewports.map.get(viewports.sm)
48
+ flexDirection = reverseLevel[1] ? 'column-reverse' : 'column'
49
+ }
50
+ if (viewPort === viewports.md) {
51
+ maxWidth = limitWidth && viewports.map.get(viewports.md)
52
+ flexDirection = reverseLevel[2] ? 'column-reverse' : 'column'
53
+ }
54
+ if (viewPort === viewports.lg) {
55
+ maxWidth = limitWidth && viewports.map.get(viewports.lg)
56
+ flexDirection = reverseLevel[3] ? 'column-reverse' : 'column'
57
+ }
58
+ if (viewPort === viewports.xl) {
59
+ maxWidth = limitWidth && viewports.map.get(viewports.xl)
60
+ flexDirection = reverseLevel[4] ? 'column-reverse' : 'column'
61
+ }
55
62
 
56
- return (
57
- <GutterContext.Provider value={gutter}>
58
- <View
59
- {...rest}
60
- style={[styles.grid, { marginHorizontal, marginVertical, width, flexDirection, maxWidth }]}
61
- >
62
- {children}
63
- </View>
64
- </GutterContext.Provider>
65
- )
66
- }
63
+ const props = {
64
+ ...getA11yPropsFromHtmlTag(tag, accessibilityRole),
65
+ ...a11yProps.select(rest),
66
+ ...viewProps.select(rest)
67
+ }
68
+
69
+ return (
70
+ <GutterContext.Provider value={gutter}>
71
+ <View
72
+ ref={ref}
73
+ {...props}
74
+ style={[
75
+ styles.grid,
76
+ { marginHorizontal, marginVertical, width, flexDirection, maxWidth }
77
+ ]}
78
+ >
79
+ {children}
80
+ </View>
81
+ </GutterContext.Provider>
82
+ )
83
+ }
84
+ )
85
+ FlexGrid.displayName = 'FlexGrid'
67
86
 
68
87
  const styles = StyleSheet.create({
69
88
  grid: {
@@ -72,6 +91,8 @@ const styles = StyleSheet.create({
72
91
  })
73
92
 
74
93
  FlexGrid.propTypes = {
94
+ ...a11yProps.propTypes,
95
+ ...viewProps.types,
75
96
  /**
76
97
  * Whether or not to give the grid a fixed width. This also centres the grid horizontally.
77
98
  */
@@ -104,6 +125,13 @@ FlexGrid.propTypes = {
104
125
  * Choose if the item order should be reversed from the 'xl' breakpoint. When you pass in false, the order will be normal from the xl breakpoint. By default, it inherits the behaviour set by the preceding prop.
105
126
  */
106
127
  xlReverse: PropTypes.bool,
128
+ /**
129
+ * Optional semantic HTML tag, to apply to the container on web. Does not change styling.
130
+ *
131
+ * In native apps, if a header tag is provided ("h1", "h2" etc) and accessibilityRole prop
132
+ * is not defined, the accessibilityRole will default to "heading".
133
+ */
134
+ tag: PropTypes.oneOf(layoutTags),
107
135
  /**
108
136
  * The rows and columns of the Grid. Will typically be `FlexGrid.Row` and `FlexGrid.Col` components.
109
137
  */
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { View, StyleSheet } from 'react-native'
4
4
  import { viewports } from '@telus-uds/system-constants'
@@ -52,56 +52,63 @@ const distributeStyles = (distribute) => {
52
52
  }
53
53
  }
54
54
 
55
- const Row = ({
56
- horizontalAlign,
57
- verticalAlign,
58
- distribute,
59
- xsReverse,
60
- smReverse,
61
- mdReverse,
62
- lgReverse,
63
- xlReverse,
64
- children,
65
- ...rest
66
- }) => {
67
- const viewPort = useViewport()
68
- const reverseLevel = applyInheritance([xsReverse, smReverse, mdReverse, lgReverse, xlReverse])
55
+ const Row = forwardRef(
56
+ (
57
+ {
58
+ horizontalAlign,
59
+ verticalAlign,
60
+ distribute,
61
+ xsReverse,
62
+ smReverse,
63
+ mdReverse,
64
+ lgReverse,
65
+ xlReverse,
66
+ children,
67
+ ...rest
68
+ },
69
+ ref
70
+ ) => {
71
+ const viewPort = useViewport()
72
+ const reverseLevel = applyInheritance([xsReverse, smReverse, mdReverse, lgReverse, xlReverse])
69
73
 
70
- let flexDirection = ''
74
+ let flexDirection = ''
71
75
 
72
- if (viewPort === viewports.xs) {
73
- flexDirection = reverseLevel[0] ? 'row-reverse' : 'row'
74
- }
75
- if (viewPort === viewports.sm) {
76
- flexDirection = reverseLevel[1] ? 'row-reverse' : 'row'
77
- }
78
- if (viewPort === viewports.md) {
79
- flexDirection = reverseLevel[2] ? 'row-reverse' : 'row'
80
- }
81
- if (viewPort === viewports.lg) {
82
- flexDirection = reverseLevel[3] ? 'row-reverse' : 'row'
83
- }
84
- if (viewPort === viewports.xl) {
85
- flexDirection = reverseLevel[4] ? 'row-reverse' : 'row'
86
- }
76
+ if (viewPort === viewports.xs) {
77
+ flexDirection = reverseLevel[0] ? 'row-reverse' : 'row'
78
+ }
79
+ if (viewPort === viewports.sm) {
80
+ flexDirection = reverseLevel[1] ? 'row-reverse' : 'row'
81
+ }
82
+ if (viewPort === viewports.md) {
83
+ flexDirection = reverseLevel[2] ? 'row-reverse' : 'row'
84
+ }
85
+ if (viewPort === viewports.lg) {
86
+ flexDirection = reverseLevel[3] ? 'row-reverse' : 'row'
87
+ }
88
+ if (viewPort === viewports.xl) {
89
+ flexDirection = reverseLevel[4] ? 'row-reverse' : 'row'
90
+ }
87
91
 
88
- return (
89
- <View
90
- {...rest}
91
- style={[
92
- styles.row,
93
- {
94
- flexDirection,
95
- ...horizontalAlignStyles(horizontalAlign),
96
- ...verticalAlignStyles(verticalAlign),
97
- ...distributeStyles(distribute)
98
- }
99
- ]}
100
- >
101
- {children}
102
- </View>
103
- )
104
- }
92
+ return (
93
+ <View
94
+ ref={ref}
95
+ {...rest}
96
+ style={[
97
+ styles.row,
98
+ {
99
+ flexDirection,
100
+ ...horizontalAlignStyles(horizontalAlign),
101
+ ...verticalAlignStyles(verticalAlign),
102
+ ...distributeStyles(distribute)
103
+ }
104
+ ]}
105
+ >
106
+ {children}
107
+ </View>
108
+ )
109
+ }
110
+ )
111
+ Row.displayName = 'Row'
105
112
 
106
113
  const styles = StyleSheet.create({
107
114
  row: {