@telus-uds/components-base 1.7.0 → 1.8.1

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 (183) hide show
  1. package/CHANGELOG.md +38 -2
  2. package/component-docs.json +264 -18
  3. package/lib/Button/ButtonGroup.js +118 -45
  4. package/lib/Checkbox/CheckboxGroup.js +3 -3
  5. package/lib/ExpandCollapse/Panel.js +2 -1
  6. package/lib/Fieldset/Fieldset.js +7 -0
  7. package/lib/InputLabel/InputLabel.js +8 -1
  8. package/lib/InputSupports/InputSupports.js +7 -0
  9. package/lib/Notification/Notification.js +1 -1
  10. package/lib/Radio/RadioGroup.js +12 -5
  11. package/lib/RadioCard/RadioCardGroup.js +7 -0
  12. package/lib/Search/Search.js +1 -1
  13. package/lib/Skeleton/Skeleton.js +48 -2
  14. package/lib/ToggleSwitch/ToggleSwitch.js +7 -0
  15. package/lib/ToggleSwitch/ToggleSwitchGroup.js +7 -0
  16. package/lib/Tooltip/Tooltip.js +1 -1
  17. package/lib/utils/animation/useVerticalExpandAnimation.js +26 -13
  18. package/lib/utils/props/inputSupportsProps.js +7 -0
  19. package/lib/utils/props/textInputProps.js +2 -1
  20. package/lib-module/Button/ButtonGroup.js +117 -45
  21. package/lib-module/Checkbox/CheckboxGroup.js +3 -3
  22. package/lib-module/ExpandCollapse/Panel.js +2 -1
  23. package/lib-module/Fieldset/Fieldset.js +7 -0
  24. package/lib-module/InputLabel/InputLabel.js +8 -1
  25. package/lib-module/InputSupports/InputSupports.js +7 -0
  26. package/lib-module/Notification/Notification.js +1 -1
  27. package/lib-module/Radio/RadioGroup.js +12 -5
  28. package/lib-module/RadioCard/RadioCardGroup.js +7 -0
  29. package/lib-module/Search/Search.js +1 -1
  30. package/lib-module/Skeleton/Skeleton.js +49 -3
  31. package/lib-module/ToggleSwitch/ToggleSwitch.js +7 -0
  32. package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +7 -0
  33. package/lib-module/Tooltip/Tooltip.js +1 -1
  34. package/lib-module/utils/animation/useVerticalExpandAnimation.js +26 -14
  35. package/lib-module/utils/props/inputSupportsProps.js +7 -0
  36. package/lib-module/utils/props/textInputProps.js +2 -1
  37. package/package.json +11 -6
  38. package/src/Button/ButtonGroup.jsx +106 -41
  39. package/src/Checkbox/Checkbox.jsx +7 -4
  40. package/src/Checkbox/CheckboxGroup.jsx +3 -3
  41. package/src/ExpandCollapse/Panel.jsx +3 -1
  42. package/src/Fieldset/Fieldset.jsx +6 -0
  43. package/src/InputLabel/InputLabel.jsx +17 -2
  44. package/src/InputSupports/InputSupports.jsx +9 -1
  45. package/src/Notification/Notification.jsx +1 -1
  46. package/src/Radio/Radio.jsx +5 -1
  47. package/src/Radio/RadioGroup.jsx +11 -5
  48. package/src/RadioCard/RadioCard.jsx +5 -1
  49. package/src/RadioCard/RadioCardGroup.jsx +6 -0
  50. package/src/Search/Search.jsx +1 -1
  51. package/src/Skeleton/Skeleton.jsx +56 -3
  52. package/src/ToggleSwitch/ToggleSwitch.jsx +6 -0
  53. package/src/ToggleSwitch/ToggleSwitchGroup.jsx +6 -0
  54. package/src/Tooltip/Tooltip.jsx +1 -1
  55. package/src/utils/animation/useVerticalExpandAnimation.js +25 -12
  56. package/src/utils/props/inputSupportsProps.js +6 -1
  57. package/src/utils/props/textInputProps.js +2 -1
  58. package/src/utils/props/tokens.js +21 -19
  59. package/.storybook/main.js +0 -4
  60. package/.storybook/preview.js +0 -37
  61. package/.turbo/turbo-build.log +0 -8
  62. package/.turbo/turbo-lint.log +0 -13
  63. package/CHANGELOG.json +0 -235
  64. package/__fixtures__/Accessible.js +0 -35
  65. package/__fixtures__/Accessible.native.js +0 -35
  66. package/__fixtures__/Theme.jsx +0 -13
  67. package/__fixtures__/Viewport.jsx +0 -17
  68. package/__fixtures__/test-utils.js +0 -25
  69. package/__fixtures__/testTheme.js +0 -1830
  70. package/__tests__/A11yText/A11yText.test.jsx +0 -34
  71. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +0 -68
  72. package/__tests__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +0 -287
  73. package/__tests__/Box/Box.test.jsx +0 -111
  74. package/__tests__/Button/Button.test.jsx +0 -86
  75. package/__tests__/Button/ButtonBase.test.jsx +0 -82
  76. package/__tests__/Button/ButtonGroup.test.jsx +0 -347
  77. package/__tests__/Button/ButtonLink.test.jsx +0 -61
  78. package/__tests__/Card/Card.test.jsx +0 -63
  79. package/__tests__/Checkbox/Checkbox.test.jsx +0 -94
  80. package/__tests__/Checkbox/CheckboxGroup.test.jsx +0 -246
  81. package/__tests__/Divider/Divider.test.jsx +0 -91
  82. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +0 -109
  83. package/__tests__/Feedback/Feedback.test.jsx +0 -42
  84. package/__tests__/FlexGrid/Col.test.jsx +0 -256
  85. package/__tests__/FlexGrid/FlexGrid.test.jsx +0 -136
  86. package/__tests__/FlexGrid/Row.test.jsx +0 -273
  87. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +0 -165
  88. package/__tests__/Icon/Icon.test.jsx +0 -61
  89. package/__tests__/IconButton/IconButton.test.jsx +0 -52
  90. package/__tests__/InputSupports/InputSupports.test.jsx +0 -50
  91. package/__tests__/Link/Link.test.jsx +0 -63
  92. package/__tests__/Link/TextButton.test.jsx +0 -35
  93. package/__tests__/List/List.test.jsx +0 -60
  94. package/__tests__/Modal/Modal.test.jsx +0 -47
  95. package/__tests__/Notification/Notification.test.jsx +0 -20
  96. package/__tests__/Pagination/Pagination.test.jsx +0 -160
  97. package/__tests__/Progress/Progress.test.jsx +0 -79
  98. package/__tests__/Radio/Radio.test.jsx +0 -87
  99. package/__tests__/Radio/RadioGroup.test.jsx +0 -220
  100. package/__tests__/RadioCard/RadioCard.test.jsx +0 -87
  101. package/__tests__/RadioCard/RadioCardGroup.test.jsx +0 -246
  102. package/__tests__/Search/Search.test.jsx +0 -73
  103. package/__tests__/Select/Select.test.jsx +0 -94
  104. package/__tests__/SideNav/SideNav.test.jsx +0 -110
  105. package/__tests__/Skeleton/Skeleton.test.jsx +0 -61
  106. package/__tests__/Spacer/Spacer.test.jsx +0 -63
  107. package/__tests__/StackView/StackView.test.jsx +0 -216
  108. package/__tests__/StackView/StackWrap.test.jsx +0 -47
  109. package/__tests__/StackView/getStackedContent.test.jsx +0 -295
  110. package/__tests__/StepTracker/StepTracker.test.jsx +0 -94
  111. package/__tests__/Tabs/Tabs.test.jsx +0 -40
  112. package/__tests__/Tags/Tags.test.jsx +0 -327
  113. package/__tests__/TextInput/TextArea.test.jsx +0 -35
  114. package/__tests__/TextInput/TextInputBase.test.jsx +0 -125
  115. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +0 -77
  116. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +0 -514
  117. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +0 -41
  118. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +0 -82
  119. package/__tests__/ToggleSwitch/ToggleSwitchGroup.test.jsx +0 -192
  120. package/__tests__/Tooltip/Tooltip.test.jsx +0 -65
  121. package/__tests__/Tooltip/getTooltipPosition.test.js +0 -79
  122. package/__tests__/Typography/typography.test.jsx +0 -90
  123. package/__tests__/utils/children.test.jsx +0 -128
  124. package/__tests__/utils/containUniqueFields.test.js +0 -25
  125. package/__tests__/utils/input.test.js +0 -375
  126. package/__tests__/utils/props.test.js +0 -36
  127. package/__tests__/utils/semantics.test.jsx +0 -34
  128. package/__tests__/utils/useCopy.test.js +0 -42
  129. package/__tests__/utils/useResponsiveProp.test.jsx +0 -202
  130. package/__tests__/utils/useSpacingScale.test.jsx +0 -273
  131. package/__tests__/utils/useUniqueId.test.js +0 -31
  132. package/babel.config.js +0 -35
  133. package/generate-component-docs.js +0 -72
  134. package/jest.config.js +0 -32
  135. package/stories/A11yText/A11yText.stories.jsx +0 -71
  136. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +0 -22
  137. package/stories/Box/Box.stories.jsx +0 -143
  138. package/stories/Button/Button.stories.jsx +0 -72
  139. package/stories/Button/ButtonGroup.stories.jsx +0 -81
  140. package/stories/Button/ButtonLink.stories.jsx +0 -30
  141. package/stories/Card/Card.stories.jsx +0 -62
  142. package/stories/Checkbox/Checkbox.stories.jsx +0 -94
  143. package/stories/Divider/Divider.stories.jsx +0 -68
  144. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +0 -112
  145. package/stories/Feedback/Feedback.stories.jsx +0 -96
  146. package/stories/FlexGrid/01 FlexGrid.stories.jsx +0 -54
  147. package/stories/FlexGrid/02 Row.stories.jsx +0 -41
  148. package/stories/FlexGrid/03 Col.stories.jsx +0 -141
  149. package/stories/Icon/Icon.stories.jsx +0 -79
  150. package/stories/IconButton/IconButton.stories.jsx +0 -50
  151. package/stories/InputLabel/InputLabel.stories.jsx +0 -39
  152. package/stories/Link/ChevronLink.stories.jsx +0 -48
  153. package/stories/Link/Link.stories.jsx +0 -90
  154. package/stories/Link/TextButton.stories.jsx +0 -79
  155. package/stories/List/List.stories.jsx +0 -117
  156. package/stories/Modal/Modal.stories.jsx +0 -54
  157. package/stories/Notification/Notification.stories.jsx +0 -82
  158. package/stories/Pagination/Pagination.stories.jsx +0 -64
  159. package/stories/Progress/Progress.stories.jsx +0 -93
  160. package/stories/Radio/Radio.stories.jsx +0 -100
  161. package/stories/RadioCard/RadioCard.stories.jsx +0 -98
  162. package/stories/Search/Search.stories.jsx +0 -66
  163. package/stories/Select/Select.stories.jsx +0 -55
  164. package/stories/SideNav/SideNav.stories.jsx +0 -42
  165. package/stories/SideNav/SideNavItem.stories.jsx +0 -9
  166. package/stories/SideNav/SideNavItemsGroup.stories.jsx +0 -17
  167. package/stories/Skeleton/Skeleton.stories.jsx +0 -36
  168. package/stories/Spacer/Spacer.stories.jsx +0 -38
  169. package/stories/StackView/StackView.stories.jsx +0 -75
  170. package/stories/StackView/StackWrap.stories.jsx +0 -64
  171. package/stories/StepTracker/StepTracker.stories.jsx +0 -71
  172. package/stories/Tabs/Tabs.stories.jsx +0 -97
  173. package/stories/Tags/Tags.stories.jsx +0 -69
  174. package/stories/TextInput/TextArea.stories.jsx +0 -101
  175. package/stories/TextInput/TextInput.stories.jsx +0 -141
  176. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +0 -64
  177. package/stories/ToggleSwitch/ToggleSwitchGroup.stories.jsx +0 -81
  178. package/stories/Tooltip/Tooltip.stories.jsx +0 -81
  179. package/stories/TooltipButton/TooltipButton.stories.jsx +0 -11
  180. package/stories/Typography/Typography.stories.jsx +0 -49
  181. package/stories/platform-supports.jsx +0 -32
  182. package/stories/platform-supports.native.jsx +0 -3
  183. package/stories/supports.jsx +0 -236
@@ -1,273 +0,0 @@
1
- import React from 'react'
2
- import { renderHook } from '@testing-library/react-hooks'
3
- import { useSpacingScale } from '../../src/utils'
4
- import Theme from '../../__fixtures__/Theme'
5
- import Viewport from '../../__fixtures__/Viewport'
6
-
7
- describe('useSpacingScale', () => {
8
- // values from testTheme.js
9
- const expectedDefaultScale = [0, 4, 8, 16, 24, 32, 36]
10
- const expectedCompactScale = [0, 2, 4, 6, 8, 10, 12]
11
- const expectedResponsiveScale = {
12
- xs: [0, 1, 2, 3, 4, 5, 6],
13
- sm: [0, 3, 4, 5, 6, 7, 8],
14
- md: [0, 3, 4, 5, 6, 7, 8],
15
- lg: [0, 7, 8, 9, 10, 11, 12],
16
- xl: [0, 7, 8, 9, 10, 11, 12]
17
- }
18
-
19
- const wrapper = ({ children, viewport }) => (
20
- <Viewport viewport={viewport}>
21
- <Theme>{children}</Theme>
22
- </Viewport>
23
- )
24
-
25
- it.each(expectedDefaultScale.map((item, index) => [item, index]))(
26
- 'returns the expected size index %# from the theme spacing scale',
27
- (expectedSize, index) => {
28
- const { result } = renderHook(() => useSpacingScale(index), {
29
- wrapper
30
- })
31
- expect(result.current).toBe(expectedSize)
32
- }
33
- )
34
- it.each(expectedCompactScale.map((item, index) => [item, index]))(
35
- 'returns the expected size index %# from the theme spacing scale in a variant',
36
- (expectedSize, index) => {
37
- const { result } = renderHook(
38
- () => useSpacingScale({ space: index, options: { variant: { compact: true } } }),
39
- {
40
- wrapper
41
- }
42
- )
43
- expect(result.current).toBe(expectedSize)
44
- }
45
- )
46
- it.each(Object.entries(expectedResponsiveScale))(
47
- 'returns appropriate sizes from a responsive theme variant at %p viewport',
48
- (viewport, expectedValues) => {
49
- const { result, rerender } = renderHook(({ spacingValue }) => useSpacingScale(spacingValue), {
50
- wrapper
51
- })
52
- expectedValues.forEach((expectedSize, index) => {
53
- rerender({
54
- viewport,
55
- spacingValue: { space: index, options: { variant: { responsive: true } } }
56
- })
57
- expect(result.current).toBe(expectedSize)
58
- })
59
- }
60
- )
61
-
62
- it('returns the 0 index when passed a nullish spacing value', () => {
63
- const { result, rerender } = renderHook((spacingValue) => useSpacingScale(spacingValue), {
64
- wrapper
65
- })
66
- // implicit undefined
67
- expect(result.current).toBe(expectedDefaultScale[0])
68
- // explicit undefined
69
- rerender(undefined)
70
- expect(result.current).toBe(expectedDefaultScale[0])
71
- rerender(null)
72
- expect(result.current).toBe(expectedDefaultScale[0])
73
-
74
- // confim this test isn't a false positive misuing rerender etc
75
- rerender(1)
76
- expect(result.current).toBe(expectedDefaultScale[1])
77
- })
78
- it('returns the 0 index when passed a nullish spacing value in a variant', () => {
79
- const { result, rerender } = renderHook((spacingValue) => useSpacingScale(spacingValue), {
80
- wrapper,
81
- initialProps: { options: { variant: { compact: true } } }
82
- })
83
- // implicit undefined
84
- expect(result.current).toBe(expectedCompactScale[0])
85
- // explicit undefined
86
- rerender({ space: undefined, options: { variant: { compact: true } } })
87
- expect(result.current).toBe(expectedCompactScale[0])
88
- rerender({ space: null, options: { variant: { compact: true } } })
89
- expect(result.current).toBe(expectedCompactScale[0])
90
-
91
- // confim this test isn't a false positive misuing rerender etc
92
- rerender({ space: 1, options: { variant: { compact: true } } })
93
- expect(result.current).toBe(expectedCompactScale[1])
94
- })
95
-
96
- it('returns the highest index when passed an out-of-bounds spacing index', () => {
97
- const { result } = renderHook(() => useSpacingScale(99), {
98
- wrapper
99
- })
100
- expect(result.current).toBe(expectedDefaultScale[expectedDefaultScale.length - 1])
101
- })
102
- it('returns the highest index when passed an out-of-bounds spacing index in a variant', () => {
103
- const { result } = renderHook(
104
- () => useSpacingScale({ space: 99, options: { variant: { compact: true } } }),
105
- {
106
- wrapper
107
- }
108
- )
109
- expect(result.current).toBe(expectedCompactScale[expectedDefaultScale.length - 1])
110
- })
111
-
112
- it('returns viewport indexes that explicitly match current viewport', () => {
113
- const spacingValue = { xs: 1, sm: 2, md: 3, lg: 4, xl: 5 }
114
- const { rerender, result } = renderHook((args) => useSpacingScale(args.spacingValue), {
115
- wrapper,
116
- initialProps: { viewport: 'xs', spacingValue }
117
- })
118
- expect(result.current).toBe(expectedDefaultScale[1])
119
- rerender({ viewport: 'sm', spacingValue })
120
- expect(result.current).toBe(expectedDefaultScale[2])
121
- rerender({ viewport: 'md', spacingValue })
122
- expect(result.current).toBe(expectedDefaultScale[3])
123
- rerender({ viewport: 'lg', spacingValue })
124
- expect(result.current).toBe(expectedDefaultScale[4])
125
- rerender({ viewport: 'xl', spacingValue })
126
- expect(result.current).toBe(expectedDefaultScale[5])
127
- })
128
- it('returns viewport indexes that explicitly match current viewport in a variant', () => {
129
- const spacingValue = {
130
- xs: 1,
131
- sm: 2,
132
- md: 3,
133
- lg: 4,
134
- xl: 5,
135
- options: { variant: { compact: true } }
136
- }
137
- const { rerender, result } = renderHook((args) => useSpacingScale(args.spacingValue), {
138
- wrapper,
139
- initialProps: { viewport: 'xs', spacingValue }
140
- })
141
- expect(result.current).toBe(expectedCompactScale[1])
142
- rerender({ viewport: 'sm', spacingValue })
143
- expect(result.current).toBe(expectedCompactScale[2])
144
- rerender({ viewport: 'md', spacingValue })
145
- expect(result.current).toBe(expectedCompactScale[3])
146
- rerender({ viewport: 'lg', spacingValue })
147
- expect(result.current).toBe(expectedCompactScale[4])
148
- rerender({ viewport: 'xl', spacingValue })
149
- expect(result.current).toBe(expectedCompactScale[5])
150
- })
151
-
152
- it('returns viewport indexes that implicitly match current viewport', () => {
153
- const spacingValue = { xs: 1, md: 3 }
154
- const { rerender, result } = renderHook((args) => useSpacingScale(args.spacingValue), {
155
- wrapper,
156
- initialProps: { viewport: 'xs', spacingValue }
157
- })
158
- expect(result.current).toBe(expectedDefaultScale[1])
159
- rerender({ viewport: 'sm', spacingValue })
160
- expect(result.current).toBe(expectedDefaultScale[1])
161
- rerender({ viewport: 'md', spacingValue })
162
- expect(result.current).toBe(expectedDefaultScale[3])
163
- rerender({ viewport: 'lg', spacingValue })
164
- expect(result.current).toBe(expectedDefaultScale[3])
165
- rerender({ viewport: 'xl', spacingValue })
166
- expect(result.current).toBe(expectedDefaultScale[3])
167
- })
168
- it('returns viewport indexes that implicitly match current viewport in a variant', () => {
169
- const spacingValue = { xs: 1, md: 3, options: { variant: { compact: true } } }
170
- const { rerender, result } = renderHook((args) => useSpacingScale(args.spacingValue), {
171
- wrapper,
172
- initialProps: { viewport: 'xs', spacingValue }
173
- })
174
- expect(result.current).toBe(expectedCompactScale[1])
175
- rerender({ viewport: 'sm', spacingValue })
176
- expect(result.current).toBe(expectedCompactScale[1])
177
- rerender({ viewport: 'md', spacingValue })
178
- expect(result.current).toBe(expectedCompactScale[3])
179
- rerender({ viewport: 'lg', spacingValue })
180
- expect(result.current).toBe(expectedCompactScale[3])
181
- rerender({ viewport: 'xl', spacingValue })
182
- expect(result.current).toBe(expectedCompactScale[3])
183
- })
184
-
185
- it('chooses smallest provided viewport index if viewport is unavailable', () => {
186
- const spacingValue = { xs: 1, sm: 2, md: 3, lg: 4, xl: 5 }
187
- const { result } = renderHook((args) => useSpacingScale(args.spacingValue), {
188
- wrapper,
189
- initialProps: { viewport: null, spacingValue }
190
- })
191
- expect(result.current).toBe(expectedDefaultScale[1])
192
- })
193
- it('chooses 0 index if current viewport matches no provided index', () => {
194
- const spacingValue = { lg: 4 }
195
- const { result, rerender } = renderHook((args) => useSpacingScale(args.spacingValue), {
196
- wrapper,
197
- initialProps: { viewport: 'xs', spacingValue }
198
- })
199
- expect(result.current).toBe(expectedDefaultScale[0])
200
- rerender({ viewport: 'sm', spacingValue })
201
- expect(result.current).toBe(expectedDefaultScale[0])
202
- rerender({ viewport: 'md', spacingValue })
203
- expect(result.current).toBe(expectedDefaultScale[0])
204
- rerender({ viewport: 'lg', spacingValue })
205
- expect(result.current).toBe(expectedDefaultScale[4])
206
- rerender({ viewport: 'xl', spacingValue })
207
- expect(result.current).toBe(expectedDefaultScale[4])
208
- })
209
-
210
- it('subtracts a provided value from a spacing scale value', () => {
211
- const spacingValue = { viewport: 'xs', space: 2, options: { subtract: 3 } }
212
- const { result } = renderHook(() => useSpacingScale(spacingValue), {
213
- wrapper
214
- })
215
- expect(result.current).toBe(expectedDefaultScale[2] - 3)
216
- })
217
- it('subtracts a provided value from a spacing scale value in a variant', () => {
218
- const spacingValue = {
219
- space: 4,
220
- options: { subtract: 3, variant: { compact: true } }
221
- }
222
- const { result } = renderHook(() => useSpacingScale(spacingValue), {
223
- wrapper
224
- })
225
- expect(result.current).toBe(expectedCompactScale[4] - 3)
226
- })
227
- it('returns 0 if a subtraction would result in a negative number', () => {
228
- const spacingValue = { space: 2, options: { subtract: 999 } }
229
- const { result } = renderHook((args) => useSpacingScale(args.spacingValue), {
230
- wrapper,
231
- initialProps: { spacingValue }
232
- })
233
- expect(result.current).toBe(0)
234
- })
235
-
236
- it('gives an exact amount if `size` option is passed', () => {
237
- const size = 123456
238
- const spacingValue = { xs: 1, sm: 2, md: 3, lg: 4, xl: 5, options: { size } }
239
- const compactSpacingValue = { ...spacingValue, options: { size, variant: { compact: true } } }
240
- const { result, rerender } = renderHook((args) => useSpacingScale(args.spacingValue), {
241
- wrapper,
242
- initialProps: { viewport: 'xs', spacingValue }
243
- })
244
- expect(result.current).toBe(size)
245
- rerender({ viewport: 'sm', spacingValue })
246
- expect(result.current).toBe(size)
247
- rerender({ viewport: 'md', spacingValue })
248
- expect(result.current).toBe(size)
249
- rerender({ viewport: 'lg', spacingValue })
250
- expect(result.current).toBe(size)
251
- rerender({ viewport: 'xl', spacingValue })
252
- expect(result.current).toBe(size)
253
- rerender({ viewport: 'xs', spacingValue: compactSpacingValue })
254
- expect(result.current).toBe(size)
255
- rerender({ viewport: 'sm', spacingValue: compactSpacingValue })
256
- expect(result.current).toBe(size)
257
- rerender({ viewport: 'md', spacingValue: compactSpacingValue })
258
- expect(result.current).toBe(size)
259
- rerender({ viewport: 'lg', spacingValue: compactSpacingValue })
260
- expect(result.current).toBe(size)
261
- rerender({ viewport: 'xl', spacingValue: compactSpacingValue })
262
- expect(result.current).toBe(size)
263
- })
264
- it('subtracts from size if `subtract` and `size` options are provided', () => {
265
- const size = 123456
266
- const subtract = 12345
267
- const spacingValue = { options: { size, subtract } }
268
- const { result } = renderHook(() => useSpacingScale(spacingValue), {
269
- wrapper
270
- })
271
- expect(result.current).toBe(size - subtract)
272
- })
273
- })
@@ -1,31 +0,0 @@
1
- import { renderHook } from '@testing-library/react-hooks'
2
- import useUniqueId from '../../lib/utils/useUniqueId'
3
-
4
- describe('useUniqueId hook', () => {
5
- it('returns the same id for each re-render, but a different id for a new instance', () => {
6
- const { result, rerender } = renderHook(() => useUniqueId('prefix'))
7
-
8
- expect(result.current).toBe('prefix-1')
9
-
10
- rerender()
11
-
12
- expect(result.current).toBe('prefix-1')
13
-
14
- // has to be done within the same test case, as we can't ensure order in which tests are being run in parallel
15
- const { result: result2, rerender: rerender2 } = renderHook(() => useUniqueId('prefix'))
16
-
17
- expect(result.current).toBe('prefix-1')
18
- expect(result2.current).toBe('prefix-2')
19
-
20
- // ensure that instances' rerendering doesn't affect one another
21
- rerender2()
22
-
23
- expect(result.current).toBe('prefix-1')
24
- expect(result2.current).toBe('prefix-2')
25
-
26
- rerender()
27
-
28
- expect(result.current).toBe('prefix-1')
29
- expect(result2.current).toBe('prefix-2')
30
- })
31
- })
package/babel.config.js DELETED
@@ -1,35 +0,0 @@
1
- module.exports = (api) => {
2
- // configuration for jest
3
- if (api.env('test')) {
4
- return {
5
- presets: ['module:metro-react-native-babel-preset']
6
- }
7
- }
8
-
9
- // Default to CJS for docs generators etc; build as ESM modules when requested.
10
- const isModule = api.env('module')
11
-
12
- return {
13
- presets: [
14
- ['@babel/preset-react', { runtime: 'automatic' }],
15
- [
16
- '@babel/preset-env',
17
- {
18
- // `false` in babel env options means preserve ESM import / export syntax
19
- // https://babeljs.io/docs/en/babel-preset-env#modules
20
- modules: isModule ? false : 'cjs'
21
- }
22
- ]
23
- ],
24
- plugins: [
25
- [
26
- 'react-native-web',
27
- {
28
- // Use the build of React Native Web that matches our build. ESM prefered, for treeshaking etc.
29
- // Be careful not to have both RNW builds in an app as init will run twice, shuffling styles.
30
- commonjs: !isModule
31
- }
32
- ]
33
- ]
34
- }
35
- }
@@ -1,72 +0,0 @@
1
- const fs = require('fs')
2
- const schema = require('@telus-uds/system-theme-tokens')
3
- const allExports = require('./src')
4
-
5
- const { a11yProps } = allExports
6
- const a11yPropTypes = Object.keys(a11yProps.types)
7
-
8
- const parseComponentDocs = (name, generated) => {
9
- const { description } = generated // TODO parse markdown and split by heading
10
- const props = {} // store derived prop data
11
- const attributes = {
12
- // any other computed attributes
13
- acceptsRNA11yProps: a11yPropTypes.every((key) => key in generated.props)
14
- }
15
-
16
- Object.entries(generated.props).forEach(([propName, prop]) => {
17
- if (prop.description?.includes('@ignore')) {
18
- return // remove ignored props
19
- }
20
- if (attributes.acceptsRNA11yProps && a11yPropTypes.includes(propName)) {
21
- return // remove a11y props if all supported (there are 30+, instead we have the above attribute to show this)
22
- }
23
-
24
- const out = { ...prop }
25
-
26
- // check if this prop references the tokens schema;
27
- // this regex extracts unquoted parameter strings from function
28
- // calls like `getTokensPropType('ChevronLink', 'Link')` with the result
29
- // being an array: `['ChevronLink', 'Link']`
30
- const tokensProp = out.type?.raw?.match(/(?<=getTokensPropType\(.*)(\w+)+(?=.*\))/gs)
31
-
32
- // if so, try and read the schema from the base components
33
- if (tokensProp && tokensProp.length > 0) {
34
- let raw = {}
35
-
36
- tokensProp.forEach((componentName) => {
37
- if (!schema.components[componentName]) {
38
- // this would be a run-time error in the base components
39
- throw new Error(
40
- `Unknown schema component reference: ${componentName} from component: ${name}`
41
- )
42
- }
43
- raw = { ...raw, ...schema.components[componentName] }
44
- })
45
- out.type = { ...out.type, raw }
46
- }
47
- props[propName] = out
48
- })
49
-
50
- return { docs: { description, props, attributes } }
51
- }
52
-
53
- const components = {}
54
-
55
- Object.entries(allExports).forEach(([name, exp]) => {
56
- // fail fast with meaningful error on typos, missing exports, etc
57
- if (!exp) throw new Error(`components-base export "${name}" is ${exp} (typeof ${typeof exp})`)
58
-
59
- if (exp.__docgenInfo) {
60
- // populated by babel-plugin-react-docgen
61
- components[name] = parseComponentDocs(name, exp.__docgenInfo)
62
-
63
- // check for second-level components e.g List.Item (can only be on a component)
64
- Object.entries(exp).forEach(([subComponentName, prop]) => {
65
- if (prop.__docgenInfo) {
66
- components[name][subComponentName] = parseComponentDocs(subComponentName, prop.__docgenInfo)
67
- }
68
- })
69
- }
70
- }, {})
71
-
72
- fs.writeFileSync('./component-docs.json', JSON.stringify({ schema, components }, null, 2))
package/jest.config.js DELETED
@@ -1,32 +0,0 @@
1
- const preset = require('react-native/jest-preset')
2
- const name = require('./package.json').name.split('@telus-uds/').pop()
3
-
4
- // cherry-pick the bits of the preset we want to avoid it overriding the fix we have on L14
5
- module.exports = {
6
- haste: preset.haste,
7
- displayName: {
8
- name,
9
- color: 'blue'
10
- },
11
- setupFiles: preset.setupFiles,
12
- transform: {
13
- // Use babel-jest instead of react-native/jest/preprocessor.js so that the coverage report is correct as per:
14
- // https://github.com/facebook/react-native/issues/20404#issuecomment-593392763
15
- // https://kulshekhar.github.io/ts-jest/docs/guides/react-native/#jest-config
16
- // __dirname here tells babel to look in components-base for babel root when running from monorepo root
17
- '\\.(js|jsx)$': ['babel-jest', { cwd: __dirname }]
18
- },
19
- setupFilesAfterEnv: [
20
- '@testing-library/jest-native/extend-expect',
21
- // Fail tests that use console.error or console.warn
22
- '<rootDir>/../../jest-no-console'
23
- ],
24
- moduleNameMapper: {
25
- '.+\\.(otf|svg|png|jpg)$': 'identity-obj-proxy'
26
- },
27
- transformIgnorePatterns: [
28
- 'node_modules/(?!(jest-)?react-native|@react-native|@react-native-community|@react-native-picker)'
29
- ],
30
- // Count everything in src when calculating coverage
31
- collectCoverageFrom: ['src/**/*.{js,jsx}']
32
- }
@@ -1,71 +0,0 @@
1
- /* eslint-disable react/no-multi-comp */
2
- import React from 'react'
3
- import { StyleSheet, View } from 'react-native'
4
-
5
- import A11yText from '../../src/A11yText'
6
- import { Button, Typography } from '../../src'
7
- import { EachParentType, parentTypesParams } from '../supports'
8
-
9
- const defaultArgs = {
10
- text: 'This text is for screen readers,',
11
- heading: false
12
- }
13
-
14
- export default {
15
- title: 'A11yText',
16
- component: A11yText,
17
- parameters: defaultArgs
18
- }
19
-
20
- const Template = (args) => (
21
- <>
22
- <View style={styles.border}>
23
- <Typography>Some text visible to all users. A11yText is after this.</Typography>
24
- </View>
25
- <A11yText {...args} />
26
- <View style={styles.border}>
27
- <Typography>Enable a screen reader to access the text before this.</Typography>
28
- </View>
29
- <View style={styles.border}>
30
- <Typography>There is no A11yText before this line.</Typography>
31
- </View>
32
- </>
33
- )
34
-
35
- export const Default = (args) => <A11yText {...args} />
36
- Default.storyName = 'A11yText'
37
- Default.args = defaultArgs
38
-
39
- export const A11yTextInText = Template.bind({})
40
- A11yTextInText.args = defaultArgs
41
-
42
- export const A11yTextAsHeading = Template.bind({})
43
- A11yTextAsHeading.args = { ...defaultArgs, heading: true }
44
-
45
- export const A11yTextInButton = (args) => (
46
- <Button onPress={() => {}}>
47
- <A11yText {...args} />
48
- A11yText sandwich
49
- <A11yText {...args} />
50
- </Button>
51
- )
52
- A11yTextInButton.args = defaultArgs
53
-
54
- export const ParentTypes = (args) => (
55
- <EachParentType {...args}>
56
- {({ label }) => <Template {...args} key={label} text={label} />}
57
- </EachParentType>
58
- )
59
- ParentTypes.args = defaultArgs
60
- ParentTypes.parameters = parentTypesParams
61
-
62
- const styles = StyleSheet.create({
63
- // Use borders so any hairline gaps created by A11yText are visible
64
- border: {
65
- borderWidth: 1,
66
- borderColor: 'rgb(220, 220, 220)'
67
- },
68
- row: {
69
- flexDirection: 'row'
70
- }
71
- })
@@ -1,22 +0,0 @@
1
- /* eslint-disable react/no-multi-comp */
2
- import React from 'react'
3
- import { ActivityIndicator } from '../../src'
4
- import { EachParentType, parentTypesParams } from '../supports'
5
-
6
- export default {
7
- title: 'ActivityIndicator',
8
- component: ActivityIndicator,
9
- args: {
10
- label: 'loading...'
11
- }
12
- }
13
-
14
- export const Default = (args) => <ActivityIndicator {...args} />
15
- Default.storyName = 'ActivityIndicator'
16
-
17
- export const ParentTypes = (args) => (
18
- <EachParentType {...args}>
19
- {({ label }) => <ActivityIndicator {...args} label={label} />}
20
- </EachParentType>
21
- )
22
- ParentTypes.parameters = parentTypesParams
@@ -1,143 +0,0 @@
1
- /* eslint-disable react/no-multi-comp */
2
- import React from 'react'
3
-
4
- import { View, StyleSheet } from 'react-native'
5
- import { Box, Typography } from '../../src'
6
- import {
7
- spacingObjectArg,
8
- Container,
9
- Placeholder,
10
- EachParentType,
11
- parentTypesParams
12
- } from '../supports'
13
-
14
- export default {
15
- title: 'Box',
16
- component: Box
17
- }
18
-
19
- const Template = (args) => (
20
- <Container margin={0} padding={0} borderWidth={1} offWhite>
21
- <Box {...args}>
22
- <Placeholder>Box</Placeholder>
23
- </Box>
24
- </Container>
25
- )
26
-
27
- const ScrollTemplate = (args) => (
28
- <View style={styles.fixedHeight}>
29
- <Box {...args}>
30
- <Placeholder>
31
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
32
- labore et dolore magna aliqua. Nulla aliquet porttitor lacus luctus accumsan tortor posuere
33
- ac. Feugiat scelerisque varius morbi enim nunc faucibus a. Nec tincidunt praesent semper
34
- feugiat. Sed sed risus pretium quam vulputate dignissim. Id nibh tortor id aliquet lectus
35
- proin nibh nisl. Mattis ullamcorper velit sed ullamcorper morbi. Eu nisl nunc mi ipsum
36
- faucibus. Non pulvinar neque laoreet suspendisse interdum consectetur libero id faucibus.
37
- Integer enim neque volutpat ac tincidunt vitae semper. Pretium quam vulputate dignissim
38
- suspendisse in est. Amet venenatis urna cursus eget nunc scelerisque. Molestie at elementum
39
- eu facilisis sed. Egestas fringilla phasellus faucibus scelerisque eleifend donec. Vitae
40
- semper quis lectus nulla. Leo a diam sollicitudin tempor id eu nisl nunc mi. Venenatis
41
- tellus in metus vulputate eu scelerisque. Dapibus ultrices in iaculis nunc sed. Blandit
42
- turpis cursus in hac habitasse platea dictumst. Nam at lectus urna duis convallis. Mi proin
43
- sed libero enim sed faucibus turpis in. Molestie at elementum eu facilisis sed odio. Auctor
44
- elit sed vulputate mi sit amet mauris commodo quis. Commodo nulla facilisi nullam vehicula
45
- ipsum a arcu cursus. Quisque egestas diam in arcu cursus euismod quis viverra. Mauris vitae
46
- ultricies leo integer malesuada nunc. Mauris cursus mattis molestie a. Mauris augue neque
47
- gravida in fermentum. Elit ut aliquam purus sit amet luctus venenatis. Elementum eu
48
- facilisis sed odio morbi quis commodo. Lorem donec massa sapien faucibus. Arcu cursus
49
- euismod quis viverra nibh cras pulvinar mattis nunc. Ultricies mi eget mauris pharetra et
50
- ultrices neque. Accumsan lacus vel facilisis volutpat est velit egestas. Morbi tincidunt
51
- augue interdum velit euismod in. Eget mauris pharetra et ultrices neque ornare aenean
52
- euismod elementum. Sed risus pretium quam vulputate dignissim suspendisse in est. Egestas
53
- pretium aenean pharetra magna ac placerat vestibulum. Tortor id aliquet lectus proin nibh.
54
- Egestas fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien.
55
- Non curabitur gravida arcu ac tortor. Amet nulla facilisi morbi tempus iaculis urna id. Quam
56
- elementum pulvinar etiam non quam. Eleifend mi in nulla posuere sollicitudin aliquam
57
- ultrices. Diam maecenas sed enim ut sem viverra aliquet. Suspendisse sed nisi lacus sed
58
- viverra tellus in hac. Eu consequat ac felis donec et. Viverra adipiscing at in tellus
59
- integer feugiat. Sit amet mauris commodo quis imperdiet. Tristique senectus et netus et
60
- malesuada fames. Dolor sit amet consectetur adipiscing elit duis. Gravida in fermentum et
61
- sollicitudin ac orci. Amet consectetur adipiscing elit duis tristique. Viverra vitae congue
62
- eu consequat. Ridiculus mus mauris vitae ultricies leo integer malesuada. Viverra mauris in
63
- aliquam sem fringilla ut morbi tincidunt augue. Donec adipiscing tristique risus nec
64
- feugiat. Rhoncus aenean vel elit scelerisque. Maecenas volutpat blandit aliquam etiam erat
65
- velit scelerisque in. Risus feugiat in ante metus dictum at tempor commodo ullamcorper. Et
66
- malesuada fames ac turpis. Augue lacus viverra vitae congue eu consequat ac felis donec. Sit
67
- amet mauris commodo quis imperdiet massa tincidunt nunc. Vulputate dignissim suspendisse in
68
- est. Arcu ac tortor dignissim convallis aenean et. Mauris augue neque gravida in fermentum
69
- et. Velit egestas dui id ornare. Tincidunt eget nullam non nisi est sit amet facilisis
70
- magna. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras.
71
- </Placeholder>
72
- </Box>
73
- </View>
74
- )
75
-
76
- const styles = StyleSheet.create({
77
- fixedHeight: { height: 200, overflow: 'hidden' }
78
- })
79
-
80
- export const Default = (args) => <Box {...args} />
81
- Default.storyName = 'Box'
82
- Default.args = { children: <Typography>Box</Typography> }
83
- // By default the JSX object is shown as a huge human-unreadable JSON tree control; turn it off
84
- Default.argTypes = { children: { control: { disable: true } } }
85
-
86
- export const Top = Template.bind({})
87
- Top.args = {
88
- top: spacingObjectArg
89
- }
90
-
91
- export const Bottom = Template.bind({})
92
- Bottom.args = {
93
- bottom: spacingObjectArg
94
- }
95
-
96
- export const Left = Template.bind({})
97
- Left.args = {
98
- left: spacingObjectArg
99
- }
100
-
101
- export const Right = Template.bind({})
102
- Right.args = {
103
- right: spacingObjectArg
104
- }
105
-
106
- export const Horizontal = Template.bind({})
107
- Horizontal.args = {
108
- horizontal: spacingObjectArg
109
- }
110
-
111
- export const Vertical = Template.bind({})
112
- Vertical.args = {
113
- vertical: spacingObjectArg
114
- }
115
-
116
- export const AllSides = Template.bind({})
117
- AllSides.args = {
118
- space: spacingObjectArg
119
- }
120
-
121
- export const Scroll = ScrollTemplate.bind({})
122
- Scroll.args = {
123
- scroll: true
124
- }
125
-
126
- export const NoScroll = ScrollTemplate.bind({})
127
- NoScroll.args = {
128
- scroll: false
129
- }
130
-
131
- export const ParentTypes = (args) => (
132
- <EachParentType componentThemeName="Box" {...args}>
133
- {({ label, variant }) => (
134
- <Container key={label} margin={0} padding={0} borderWidth={1} dark>
135
- <Box {...args} variant={variant}>
136
- <Placeholder>{label}</Placeholder>
137
- </Box>
138
- </Container>
139
- )}
140
- </EachParentType>
141
- )
142
- ParentTypes.args = { space: 2 }
143
- ParentTypes.parameters = parentTypesParams