@hero-design/rn 8.82.2-alpha.2 → 8.83.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 (56) hide show
  1. package/.turbo/turbo-build.log +7 -0
  2. package/CHANGELOG.md +20 -0
  3. package/es/index.js +491 -21
  4. package/lib/index.js +490 -18
  5. package/package.json +6 -4
  6. package/rollup.config.mjs +1 -0
  7. package/src/components/AppCue/StyledAppCue.tsx +46 -0
  8. package/src/components/AppCue/__tests__/StyledAppCue.tsx +18 -0
  9. package/src/components/AppCue/__tests__/__snapshots__/StyledAppCue.tsx.snap +200 -0
  10. package/src/components/AppCue/__tests__/__snapshots__/index.spec.tsx.snap +391 -0
  11. package/src/components/AppCue/__tests__/index.spec.tsx +61 -0
  12. package/src/components/AppCue/__tests__/utils.spec.ts +90 -0
  13. package/src/components/AppCue/index.tsx +188 -0
  14. package/src/components/AppCue/utils.ts +122 -0
  15. package/src/components/Chip/StyledChip.tsx +9 -9
  16. package/src/components/Chip/__tests__/__snapshots__/index.spec.tsx.snap +434 -0
  17. package/src/components/Chip/__tests__/index.spec.tsx +4 -0
  18. package/src/components/Chip/index.tsx +32 -5
  19. package/src/components/Slider/RangeSlider.tsx +187 -0
  20. package/src/components/Slider/SingleSlider.tsx +89 -0
  21. package/src/components/Slider/StyledRangeSlider.tsx +16 -0
  22. package/src/components/Slider/__tests__/RangeSlider.spec.tsx +119 -0
  23. package/src/components/Slider/__tests__/{index.spec.tsx → SingleSlider.spec.tsx} +1 -1
  24. package/src/components/Slider/__tests__/__snapshots__/RangeSlider.spec.tsx.snap +252 -0
  25. package/src/components/Slider/index.tsx +8 -83
  26. package/src/components/Tabs/StyledScrollableTabs.tsx +2 -1
  27. package/src/components/Tabs/StyledTabs.tsx +1 -0
  28. package/src/components/Tabs/__tests__/__snapshots__/ScrollableTabs.spec.tsx.snap +3 -0
  29. package/src/components/Tabs/__tests__/__snapshots__/ScrollableTabsHeader.spec.tsx.snap +2 -0
  30. package/src/components/Tabs/__tests__/__snapshots__/index.spec.tsx.snap +3 -0
  31. package/src/index.ts +2 -0
  32. package/src/theme/__tests__/__snapshots__/index.spec.ts.snap +39 -0
  33. package/src/theme/components/appCue.ts +22 -0
  34. package/src/theme/components/slider.ts +19 -1
  35. package/src/theme/components/tabs.ts +1 -0
  36. package/src/theme/getTheme.ts +3 -0
  37. package/src/types.ts +2 -0
  38. package/stats/8.83.0/rn-stats.html +4844 -0
  39. package/testUtils/setup.tsx +17 -0
  40. package/types/components/AppCue/StyledAppCue.d.ts +20 -0
  41. package/types/components/AppCue/__tests__/StyledAppCue.d.ts +1 -0
  42. package/types/components/AppCue/index.d.ts +21 -0
  43. package/types/components/AppCue/utils.d.ts +63 -0
  44. package/types/components/Chip/StyledChip.d.ts +1 -1
  45. package/types/components/Chip/index.d.ts +2 -2
  46. package/types/components/Slider/RangeSlider.d.ts +60 -0
  47. package/types/components/Slider/SingleSlider.d.ts +53 -0
  48. package/types/components/Slider/StyledRangeSlider.d.ts +10 -0
  49. package/types/components/Slider/index.d.ts +6 -51
  50. package/types/index.d.ts +2 -1
  51. package/types/theme/components/appCue.d.ts +16 -0
  52. package/types/theme/components/slider.d.ts +24 -0
  53. package/types/theme/components/tabs.d.ts +1 -0
  54. package/types/theme/getTheme.d.ts +2 -0
  55. package/types/types.d.ts +2 -1
  56. /package/src/components/Slider/__tests__/__snapshots__/{index.spec.tsx.snap → SingleSlider.spec.tsx.snap} +0 -0
package/rollup.config.mjs CHANGED
@@ -42,6 +42,7 @@ export default {
42
42
  'react-native-vector-icons',
43
43
  'react-native-linear-gradient',
44
44
  '@hero-design/react-native-month-year-picker',
45
+ '@ptomasroos/react-native-multi-slider',
45
46
  ],
46
47
  plugins: [
47
48
  replace({
@@ -0,0 +1,46 @@
1
+ import styled from '@emotion/native';
2
+ import { View, Animated } from 'react-native';
3
+
4
+ export type Placement = 'top' | 'bottom' | 'right' | 'left';
5
+
6
+ export const StyledContent = styled(View)(({ theme }) => ({
7
+ padding: theme.__hd__.appCue.space.padding,
8
+ backgroundColor: theme.__hd__.appCue.colors.background,
9
+ borderRadius: theme.__hd__.appCue.radii.container,
10
+ alignSelf: 'center',
11
+ }));
12
+
13
+ export const StyledContainer = styled(View)(({ theme }) => ({
14
+ width: '100%',
15
+ height: '100%',
16
+ backgroundColor: theme.__hd__.appCue.colors.backdropColor,
17
+ }));
18
+
19
+ export const StyledIconContainer = styled(Animated.View)<{
20
+ themePlacement: Placement;
21
+ }>(({ theme, themePlacement }) => ({
22
+ position: 'absolute',
23
+ color: theme.__hd__.appCue.colors.background,
24
+ display: 'flex',
25
+ alignItems: 'center',
26
+ justifyContent: 'center',
27
+ ...(themePlacement === 'top' && {
28
+ bottom: -theme.__hd__.appCue.space.arrowOffset,
29
+ width: '100%',
30
+ }),
31
+ ...(themePlacement === 'bottom' && {
32
+ top: -theme.__hd__.appCue.space.arrowOffset,
33
+ transform: [{ rotate: '180deg' }],
34
+ width: '100%',
35
+ }),
36
+ ...(themePlacement === 'right' && {
37
+ left: -theme.__hd__.appCue.space.arrowOffset,
38
+ transform: [{ rotate: '90deg' }],
39
+ height: '100%',
40
+ }),
41
+ ...(themePlacement === 'left' && {
42
+ right: -theme.__hd__.appCue.space.arrowOffset,
43
+ transform: [{ rotate: '-90deg' }],
44
+ height: '100%',
45
+ }),
46
+ }));
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import renderWithTheme from '../../../testHelpers/renderWithTheme';
3
+ import { StyledIconContainer } from '../StyledAppCue';
4
+
5
+ describe('AppCue', () => {
6
+ it.each`
7
+ placement
8
+ ${'top'}
9
+ ${'bottom'}
10
+ ${'left'}
11
+ ${'right'}
12
+ `('renders icon $placement correctly', ({ placement }) => {
13
+ const { toJSON } = renderWithTheme(
14
+ <StyledIconContainer themePlacement={placement} />
15
+ );
16
+ expect(toJSON()).toMatchSnapshot();
17
+ });
18
+ });
@@ -0,0 +1,200 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`AppCue renders icon bottom correctly 1`] = `
4
+ <View
5
+ style={
6
+ {
7
+ "flex": 1,
8
+ }
9
+ }
10
+ >
11
+ <View
12
+ collapsable={false}
13
+ style={
14
+ {
15
+ "alignItems": "center",
16
+ "color": "#001f23",
17
+ "display": "flex",
18
+ "justifyContent": "center",
19
+ "position": "absolute",
20
+ "top": -12,
21
+ "transform": [
22
+ {
23
+ "rotate": "180deg",
24
+ },
25
+ ],
26
+ "width": "100%",
27
+ }
28
+ }
29
+ themePlacement="bottom"
30
+ />
31
+ <View
32
+ pointerEvents="box-none"
33
+ position="bottom"
34
+ style={
35
+ [
36
+ {
37
+ "bottom": 0,
38
+ "elevation": 9999,
39
+ "flexDirection": "column-reverse",
40
+ "left": 0,
41
+ "paddingHorizontal": 24,
42
+ "paddingVertical": 16,
43
+ "position": "absolute",
44
+ "right": 0,
45
+ "top": 0,
46
+ },
47
+ undefined,
48
+ ]
49
+ }
50
+ />
51
+ </View>
52
+ `;
53
+
54
+ exports[`AppCue renders icon left correctly 1`] = `
55
+ <View
56
+ style={
57
+ {
58
+ "flex": 1,
59
+ }
60
+ }
61
+ >
62
+ <View
63
+ collapsable={false}
64
+ style={
65
+ {
66
+ "alignItems": "center",
67
+ "color": "#001f23",
68
+ "display": "flex",
69
+ "height": "100%",
70
+ "justifyContent": "center",
71
+ "position": "absolute",
72
+ "right": -12,
73
+ "transform": [
74
+ {
75
+ "rotate": "-90deg",
76
+ },
77
+ ],
78
+ }
79
+ }
80
+ themePlacement="left"
81
+ />
82
+ <View
83
+ pointerEvents="box-none"
84
+ position="bottom"
85
+ style={
86
+ [
87
+ {
88
+ "bottom": 0,
89
+ "elevation": 9999,
90
+ "flexDirection": "column-reverse",
91
+ "left": 0,
92
+ "paddingHorizontal": 24,
93
+ "paddingVertical": 16,
94
+ "position": "absolute",
95
+ "right": 0,
96
+ "top": 0,
97
+ },
98
+ undefined,
99
+ ]
100
+ }
101
+ />
102
+ </View>
103
+ `;
104
+
105
+ exports[`AppCue renders icon right correctly 1`] = `
106
+ <View
107
+ style={
108
+ {
109
+ "flex": 1,
110
+ }
111
+ }
112
+ >
113
+ <View
114
+ collapsable={false}
115
+ style={
116
+ {
117
+ "alignItems": "center",
118
+ "color": "#001f23",
119
+ "display": "flex",
120
+ "height": "100%",
121
+ "justifyContent": "center",
122
+ "left": -12,
123
+ "position": "absolute",
124
+ "transform": [
125
+ {
126
+ "rotate": "90deg",
127
+ },
128
+ ],
129
+ }
130
+ }
131
+ themePlacement="right"
132
+ />
133
+ <View
134
+ pointerEvents="box-none"
135
+ position="bottom"
136
+ style={
137
+ [
138
+ {
139
+ "bottom": 0,
140
+ "elevation": 9999,
141
+ "flexDirection": "column-reverse",
142
+ "left": 0,
143
+ "paddingHorizontal": 24,
144
+ "paddingVertical": 16,
145
+ "position": "absolute",
146
+ "right": 0,
147
+ "top": 0,
148
+ },
149
+ undefined,
150
+ ]
151
+ }
152
+ />
153
+ </View>
154
+ `;
155
+
156
+ exports[`AppCue renders icon top correctly 1`] = `
157
+ <View
158
+ style={
159
+ {
160
+ "flex": 1,
161
+ }
162
+ }
163
+ >
164
+ <View
165
+ collapsable={false}
166
+ style={
167
+ {
168
+ "alignItems": "center",
169
+ "bottom": -12,
170
+ "color": "#001f23",
171
+ "display": "flex",
172
+ "justifyContent": "center",
173
+ "position": "absolute",
174
+ "width": "100%",
175
+ }
176
+ }
177
+ themePlacement="top"
178
+ />
179
+ <View
180
+ pointerEvents="box-none"
181
+ position="bottom"
182
+ style={
183
+ [
184
+ {
185
+ "bottom": 0,
186
+ "elevation": 9999,
187
+ "flexDirection": "column-reverse",
188
+ "left": 0,
189
+ "paddingHorizontal": 24,
190
+ "paddingVertical": 16,
191
+ "position": "absolute",
192
+ "right": 0,
193
+ "top": 0,
194
+ },
195
+ undefined,
196
+ ]
197
+ }
198
+ />
199
+ </View>
200
+ `;
@@ -0,0 +1,391 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`AppCue renders custom content 1`] = `
4
+ <View
5
+ style={
6
+ {
7
+ "flex": 1,
8
+ }
9
+ }
10
+ >
11
+ <View
12
+ accessibilityState={
13
+ {
14
+ "busy": undefined,
15
+ "checked": undefined,
16
+ "disabled": undefined,
17
+ "expanded": undefined,
18
+ "selected": undefined,
19
+ }
20
+ }
21
+ accessible={true}
22
+ collapsable={false}
23
+ focusable={true}
24
+ onClick={[Function]}
25
+ onResponderGrant={[Function]}
26
+ onResponderMove={[Function]}
27
+ onResponderRelease={[Function]}
28
+ onResponderTerminate={[Function]}
29
+ onResponderTerminationRequest={[Function]}
30
+ onStartShouldSetResponder={[Function]}
31
+ style={
32
+ {
33
+ "alignSelf": "center",
34
+ }
35
+ }
36
+ >
37
+ <View
38
+ onPress={[Function]}
39
+ >
40
+ <Text>
41
+ Target
42
+ </Text>
43
+ </View>
44
+ </View>
45
+ <View
46
+ pointerEvents="box-none"
47
+ position="bottom"
48
+ style={
49
+ [
50
+ {
51
+ "bottom": 0,
52
+ "elevation": 9999,
53
+ "flexDirection": "column-reverse",
54
+ "left": 0,
55
+ "paddingHorizontal": 24,
56
+ "paddingVertical": 16,
57
+ "position": "absolute",
58
+ "right": 0,
59
+ "top": 0,
60
+ },
61
+ undefined,
62
+ ]
63
+ }
64
+ />
65
+ </View>
66
+ `;
67
+
68
+ exports[`AppCue renders placement bottom correctly 1`] = `
69
+ <View
70
+ style={
71
+ {
72
+ "flex": 1,
73
+ }
74
+ }
75
+ >
76
+ <View
77
+ accessibilityState={
78
+ {
79
+ "busy": undefined,
80
+ "checked": undefined,
81
+ "disabled": undefined,
82
+ "expanded": undefined,
83
+ "selected": undefined,
84
+ }
85
+ }
86
+ accessible={true}
87
+ collapsable={false}
88
+ focusable={true}
89
+ onClick={[Function]}
90
+ onResponderGrant={[Function]}
91
+ onResponderMove={[Function]}
92
+ onResponderRelease={[Function]}
93
+ onResponderTerminate={[Function]}
94
+ onResponderTerminationRequest={[Function]}
95
+ onStartShouldSetResponder={[Function]}
96
+ style={
97
+ {
98
+ "alignSelf": "center",
99
+ }
100
+ }
101
+ >
102
+ <View
103
+ onPress={[Function]}
104
+ >
105
+ <Text>
106
+ Target
107
+ </Text>
108
+ </View>
109
+ </View>
110
+ <View
111
+ pointerEvents="box-none"
112
+ position="bottom"
113
+ style={
114
+ [
115
+ {
116
+ "bottom": 0,
117
+ "elevation": 9999,
118
+ "flexDirection": "column-reverse",
119
+ "left": 0,
120
+ "paddingHorizontal": 24,
121
+ "paddingVertical": 16,
122
+ "position": "absolute",
123
+ "right": 0,
124
+ "top": 0,
125
+ },
126
+ undefined,
127
+ ]
128
+ }
129
+ />
130
+ </View>
131
+ `;
132
+
133
+ exports[`AppCue renders placement left correctly 1`] = `
134
+ <View
135
+ style={
136
+ {
137
+ "flex": 1,
138
+ }
139
+ }
140
+ >
141
+ <View
142
+ accessibilityState={
143
+ {
144
+ "busy": undefined,
145
+ "checked": undefined,
146
+ "disabled": undefined,
147
+ "expanded": undefined,
148
+ "selected": undefined,
149
+ }
150
+ }
151
+ accessible={true}
152
+ collapsable={false}
153
+ focusable={true}
154
+ onClick={[Function]}
155
+ onResponderGrant={[Function]}
156
+ onResponderMove={[Function]}
157
+ onResponderRelease={[Function]}
158
+ onResponderTerminate={[Function]}
159
+ onResponderTerminationRequest={[Function]}
160
+ onStartShouldSetResponder={[Function]}
161
+ style={
162
+ {
163
+ "alignSelf": "center",
164
+ }
165
+ }
166
+ >
167
+ <View
168
+ onPress={[Function]}
169
+ >
170
+ <Text>
171
+ Target
172
+ </Text>
173
+ </View>
174
+ </View>
175
+ <View
176
+ pointerEvents="box-none"
177
+ position="bottom"
178
+ style={
179
+ [
180
+ {
181
+ "bottom": 0,
182
+ "elevation": 9999,
183
+ "flexDirection": "column-reverse",
184
+ "left": 0,
185
+ "paddingHorizontal": 24,
186
+ "paddingVertical": 16,
187
+ "position": "absolute",
188
+ "right": 0,
189
+ "top": 0,
190
+ },
191
+ undefined,
192
+ ]
193
+ }
194
+ />
195
+ </View>
196
+ `;
197
+
198
+ exports[`AppCue renders placement right correctly 1`] = `
199
+ <View
200
+ style={
201
+ {
202
+ "flex": 1,
203
+ }
204
+ }
205
+ >
206
+ <View
207
+ accessibilityState={
208
+ {
209
+ "busy": undefined,
210
+ "checked": undefined,
211
+ "disabled": undefined,
212
+ "expanded": undefined,
213
+ "selected": undefined,
214
+ }
215
+ }
216
+ accessible={true}
217
+ collapsable={false}
218
+ focusable={true}
219
+ onClick={[Function]}
220
+ onResponderGrant={[Function]}
221
+ onResponderMove={[Function]}
222
+ onResponderRelease={[Function]}
223
+ onResponderTerminate={[Function]}
224
+ onResponderTerminationRequest={[Function]}
225
+ onStartShouldSetResponder={[Function]}
226
+ style={
227
+ {
228
+ "alignSelf": "center",
229
+ }
230
+ }
231
+ >
232
+ <View
233
+ onPress={[Function]}
234
+ >
235
+ <Text>
236
+ Target
237
+ </Text>
238
+ </View>
239
+ </View>
240
+ <View
241
+ pointerEvents="box-none"
242
+ position="bottom"
243
+ style={
244
+ [
245
+ {
246
+ "bottom": 0,
247
+ "elevation": 9999,
248
+ "flexDirection": "column-reverse",
249
+ "left": 0,
250
+ "paddingHorizontal": 24,
251
+ "paddingVertical": 16,
252
+ "position": "absolute",
253
+ "right": 0,
254
+ "top": 0,
255
+ },
256
+ undefined,
257
+ ]
258
+ }
259
+ />
260
+ </View>
261
+ `;
262
+
263
+ exports[`AppCue renders placement top correctly 1`] = `
264
+ <View
265
+ style={
266
+ {
267
+ "flex": 1,
268
+ }
269
+ }
270
+ >
271
+ <View
272
+ accessibilityState={
273
+ {
274
+ "busy": undefined,
275
+ "checked": undefined,
276
+ "disabled": undefined,
277
+ "expanded": undefined,
278
+ "selected": undefined,
279
+ }
280
+ }
281
+ accessible={true}
282
+ collapsable={false}
283
+ focusable={true}
284
+ onClick={[Function]}
285
+ onResponderGrant={[Function]}
286
+ onResponderMove={[Function]}
287
+ onResponderRelease={[Function]}
288
+ onResponderTerminate={[Function]}
289
+ onResponderTerminationRequest={[Function]}
290
+ onStartShouldSetResponder={[Function]}
291
+ style={
292
+ {
293
+ "alignSelf": "center",
294
+ }
295
+ }
296
+ >
297
+ <View
298
+ onPress={[Function]}
299
+ >
300
+ <Text>
301
+ Target
302
+ </Text>
303
+ </View>
304
+ </View>
305
+ <View
306
+ pointerEvents="box-none"
307
+ position="bottom"
308
+ style={
309
+ [
310
+ {
311
+ "bottom": 0,
312
+ "elevation": 9999,
313
+ "flexDirection": "column-reverse",
314
+ "left": 0,
315
+ "paddingHorizontal": 24,
316
+ "paddingVertical": 16,
317
+ "position": "absolute",
318
+ "right": 0,
319
+ "top": 0,
320
+ },
321
+ undefined,
322
+ ]
323
+ }
324
+ />
325
+ </View>
326
+ `;
327
+
328
+ exports[`AppCue renders placement undefined correctly 1`] = `
329
+ <View
330
+ style={
331
+ {
332
+ "flex": 1,
333
+ }
334
+ }
335
+ >
336
+ <View
337
+ accessibilityState={
338
+ {
339
+ "busy": undefined,
340
+ "checked": undefined,
341
+ "disabled": undefined,
342
+ "expanded": undefined,
343
+ "selected": undefined,
344
+ }
345
+ }
346
+ accessible={true}
347
+ collapsable={false}
348
+ focusable={true}
349
+ onClick={[Function]}
350
+ onResponderGrant={[Function]}
351
+ onResponderMove={[Function]}
352
+ onResponderRelease={[Function]}
353
+ onResponderTerminate={[Function]}
354
+ onResponderTerminationRequest={[Function]}
355
+ onStartShouldSetResponder={[Function]}
356
+ style={
357
+ {
358
+ "alignSelf": "center",
359
+ }
360
+ }
361
+ >
362
+ <View
363
+ onPress={[Function]}
364
+ >
365
+ <Text>
366
+ Target
367
+ </Text>
368
+ </View>
369
+ </View>
370
+ <View
371
+ pointerEvents="box-none"
372
+ position="bottom"
373
+ style={
374
+ [
375
+ {
376
+ "bottom": 0,
377
+ "elevation": 9999,
378
+ "flexDirection": "column-reverse",
379
+ "left": 0,
380
+ "paddingHorizontal": 24,
381
+ "paddingVertical": 16,
382
+ "position": "absolute",
383
+ "right": 0,
384
+ "top": 0,
385
+ },
386
+ undefined,
387
+ ]
388
+ }
389
+ />
390
+ </View>
391
+ `;
@@ -0,0 +1,61 @@
1
+ import React from 'react';
2
+ import { View, Text } from 'react-native';
3
+ import { fireEvent, waitFor } from '@testing-library/react-native';
4
+ import AppCue from '..';
5
+ import renderWithTheme from '../../../testHelpers/renderWithTheme';
6
+
7
+ describe('AppCue', () => {
8
+ it.each`
9
+ placement
10
+ ${undefined}
11
+ ${'top'}
12
+ ${'bottom'}
13
+ ${'left'}
14
+ ${'right'}
15
+ `('renders placement $placement correctly', ({ placement }) => {
16
+ const { toJSON, getByText, getByTestId } = renderWithTheme(
17
+ <AppCue
18
+ content="AppCue Content"
19
+ placement={placement}
20
+ target={
21
+ <View>
22
+ <Text>Target</Text>
23
+ </View>
24
+ }
25
+ testID="app-cue"
26
+ />
27
+ );
28
+
29
+ expect(toJSON()).toMatchSnapshot();
30
+ const target = getByText('Target');
31
+ expect(target).toBeDefined();
32
+ fireEvent.press(target);
33
+ waitFor(() => {
34
+ expect(getByTestId('app-cue-arrow')).toBeDefined();
35
+ expect(getByText('AppCue Content')).toBeDefined();
36
+ });
37
+ });
38
+
39
+ it('renders custom content', () => {
40
+ const { toJSON, getByText, getByTestId } = renderWithTheme(
41
+ <AppCue
42
+ content={<Text>Custom Content</Text>}
43
+ target={
44
+ <View>
45
+ <Text>Target</Text>
46
+ </View>
47
+ }
48
+ testID="app-cue"
49
+ />
50
+ );
51
+
52
+ expect(toJSON()).toMatchSnapshot();
53
+ const target = getByText('Target');
54
+ expect(target).toBeDefined();
55
+ fireEvent.press(target);
56
+ waitFor(() => {
57
+ expect(getByTestId('app-cue-arrow')).toBeDefined();
58
+ expect(getByText('Custom Content')).toBeDefined();
59
+ });
60
+ });
61
+ });