@momo-kits/carousel 0.0.64-beta → 0.0.65-alpha.2

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.
package/index.js CHANGED
@@ -1,4 +1,5 @@
1
- import Carousel from './Carousel';
1
+ //import Carousel from './Carousel';
2
+ import Carousel from './CarouselV2';
2
3
  import Pagination from './pagination/Pagination';
3
4
 
4
5
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momo-kits/carousel",
3
- "version": "0.0.64-beta",
3
+ "version": "0.0.65-alpha.2",
4
4
  "private": false,
5
5
  "main": "index.js",
6
6
  "dependencies": {
@@ -13,4 +13,4 @@
13
13
  },
14
14
  "devDependencies": {},
15
15
  "license": "MoMo"
16
- }
16
+ }
@@ -36,7 +36,7 @@ export default class PaginationDot extends PureComponent {
36
36
  toValue,
37
37
  duration: 250,
38
38
  isInteraction: false,
39
- useNativeDriver: !this._shouldAnimateColor
39
+ useNativeDriver: false
40
40
  };
41
41
 
42
42
  const animations = [
package/publish.sh CHANGED
@@ -21,7 +21,7 @@ rsync -r --verbose --exclude '*.mdx' --exclude '*Demo.js' --exclude 'props-type
21
21
  #npm login
22
22
  #publish dist to npm
23
23
  cd dist
24
- npm publish --access=public
24
+ npm publish --tag beta --access=public
25
25
  cd ..
26
26
  rm -rf dist
27
27
 
@@ -0,0 +1,340 @@
1
+ import {Platform, Animated} from 'react-native';
2
+
3
+ const IS_ANDROID = Platform.OS === 'android';
4
+
5
+ // Get scroll interpolator's input range from an array of slide indexes
6
+ // Indexes are relative to the current active slide (index 0)
7
+ // For example, using [3, 2, 1, 0, -1] will return:
8
+ // [
9
+ // (index - 3) * sizeRef, // active + 3
10
+ // (index - 2) * sizeRef, // active + 2
11
+ // (index - 1) * sizeRef, // active + 1
12
+ // index * sizeRef, // active
13
+ // (index + 1) * sizeRef // active - 1
14
+ // ]
15
+ export function getInputRangeFromIndexes(range, index, carouselProps) {
16
+ const sizeRef = carouselProps.vertical
17
+ ? carouselProps.itemHeight
18
+ : carouselProps.itemWidth;
19
+ const inputRange = [];
20
+
21
+ for (let i = 0; i < range.length; i++) {
22
+ inputRange.push((index - range[i]) * sizeRef);
23
+ }
24
+
25
+ return inputRange;
26
+ }
27
+
28
+ // Default behavior
29
+ // Scale and/or opacity effect
30
+ // Based on props 'inactiveSlideOpacity' and 'inactiveSlideScale'
31
+ export function defaultScrollInterpolator(index, carouselProps) {
32
+ const range = [1, 0, -1];
33
+ const inputRange = getInputRangeFromIndexes(range, index, carouselProps);
34
+ const outputRange = [0, 1, 0];
35
+
36
+ return {
37
+ inputRange,
38
+ outputRange,
39
+ };
40
+ }
41
+
42
+ export function defaultAnimatedStyles(_index, animatedValue, carouselProps) {
43
+ let animatedOpacity = {};
44
+ let animatedScale = {};
45
+
46
+ if (carouselProps.inactiveSlideOpacity < 1) {
47
+ animatedOpacity = {
48
+ opacity: animatedValue.interpolate({
49
+ inputRange: [0, 1],
50
+ outputRange: [carouselProps.inactiveSlideOpacity, 1],
51
+ }),
52
+ };
53
+ }
54
+
55
+ if (carouselProps.inactiveSlideScale < 1) {
56
+ animatedScale = {
57
+ transform: [
58
+ {
59
+ scale: animatedValue.interpolate({
60
+ inputRange: [0, 1],
61
+ outputRange: [carouselProps.inactiveSlideScale, 1],
62
+ }),
63
+ },
64
+ ],
65
+ };
66
+ }
67
+
68
+ return {
69
+ ...animatedOpacity,
70
+ ...animatedScale,
71
+ };
72
+ }
73
+
74
+ // Shift animation
75
+ // Same as the default one, but the active slide is also shifted up or down
76
+ // Based on prop 'inactiveSlideShift'
77
+ export function shiftAnimatedStyles(_index, animatedValue, carouselProps) {
78
+ let animatedOpacity = {};
79
+ let animatedScale = {};
80
+ let animatedTranslate = {};
81
+
82
+ if (carouselProps.inactiveSlideOpacity < 1) {
83
+ animatedOpacity = {
84
+ opacity: animatedValue.interpolate({
85
+ inputRange: [0, 1],
86
+ outputRange: [carouselProps.inactiveSlideOpacity, 1],
87
+ }),
88
+ };
89
+ }
90
+
91
+ if (carouselProps.inactiveSlideScale < 1) {
92
+ animatedScale = {
93
+ scale: animatedValue.interpolate({
94
+ inputRange: [0, 1],
95
+ outputRange: [carouselProps.inactiveSlideScale, 1],
96
+ }),
97
+ };
98
+ }
99
+
100
+ if (carouselProps.inactiveSlideShift !== 0) {
101
+ const translateProp = carouselProps.vertical ? 'translateX' : 'translateY';
102
+ animatedTranslate = {
103
+ [translateProp]: animatedValue.interpolate({
104
+ inputRange: [0, 1],
105
+ outputRange: [carouselProps.inactiveSlideShift, 0],
106
+ }),
107
+ };
108
+ }
109
+
110
+ return {
111
+ ...animatedOpacity,
112
+ transform: [{...animatedScale}, {...animatedTranslate}],
113
+ };
114
+ }
115
+
116
+ // Stack animation
117
+ // Imitate a deck/stack of cards (see #195)
118
+ // WARNING: The effect had to be visually inverted on Android because this OS doesn't honor the `zIndex`property
119
+ // This means that the item with the higher zIndex (and therefore the tap receiver) remains the one AFTER the currently active item
120
+ // The `elevation` property compensates for that only visually, which is not good enough
121
+ export function stackScrollInterpolator(index, carouselProps) {
122
+ const range = [3, 2, 1, 0, -1];
123
+ const inputRange = getInputRangeFromIndexes(range, index, carouselProps);
124
+ const outputRange = range;
125
+
126
+ return {
127
+ inputRange,
128
+ outputRange,
129
+ };
130
+ }
131
+
132
+ export function stackAnimatedStyles(
133
+ index,
134
+ animatedValue,
135
+ carouselProps,
136
+ cardOffset,
137
+ ) {
138
+ const sizeRef = carouselProps.vertical
139
+ ? carouselProps.itemHeight
140
+ : carouselProps.itemWidth;
141
+ const translateProp = carouselProps.vertical ? 'translateY' : 'translateX';
142
+
143
+ const card1Scale = 0.9;
144
+ const card2Scale = 0.8;
145
+
146
+ const newCardOffset = cardOffset ?? 18;
147
+
148
+ const getTranslateFromScale = (cardIndex, scale) => {
149
+ const centerFactor = (1 / scale) * cardIndex;
150
+ const centeredPosition = -Math.round(sizeRef * centerFactor);
151
+ const edgeAlignment = Math.round((sizeRef - sizeRef * scale) / 2);
152
+ const offset = Math.round((newCardOffset * Math.abs(cardIndex)) / scale);
153
+
154
+ return centeredPosition + edgeAlignment + offset;
155
+ };
156
+
157
+ const opacityOutputRange =
158
+ carouselProps.inactiveSlideOpacity === 1 ? [1, 1, 1, 0] : [1, 0.75, 0.5, 0];
159
+
160
+ return {
161
+ zIndex: carouselProps.data.length - index,
162
+ opacity: animatedValue.interpolate({
163
+ inputRange: [0, 1, 2, 3],
164
+ outputRange: opacityOutputRange,
165
+ extrapolate: 'clamp',
166
+ }),
167
+ transform: [
168
+ {
169
+ scale: animatedValue.interpolate({
170
+ inputRange: [-1, 0, 1, 2],
171
+ outputRange: [card1Scale, 1, card1Scale, card2Scale],
172
+ extrapolate: 'clamp',
173
+ }),
174
+ },
175
+ {
176
+ [translateProp]: animatedValue.interpolate({
177
+ inputRange: [-1, 0, 1, 2, 3],
178
+ outputRange: [
179
+ -sizeRef * 0.5,
180
+ 0,
181
+ getTranslateFromScale(1, card1Scale),
182
+ getTranslateFromScale(2, card2Scale),
183
+ getTranslateFromScale(3, card2Scale),
184
+ ],
185
+ extrapolate: 'clamp',
186
+ }),
187
+ },
188
+ ],
189
+ };
190
+ }
191
+
192
+ // Tinder animation
193
+ // Imitate the popular Tinder layout
194
+ // WARNING: The effect had to be visually inverted on Android because this OS doesn't honor the `zIndex`property
195
+ // This means that the item with the higher zIndex (and therefore the tap receiver) remains the one AFTER the currently active item
196
+ // The `elevation` property compensates for that only visually, which is not good enough
197
+ export function tinderScrollInterpolator(index, carouselProps) {
198
+ const range = IS_ANDROID ? [1, 0, -1, -2, -3] : [3, 2, 1, 0, -1];
199
+ const inputRange = getInputRangeFromIndexes(range, index, carouselProps);
200
+ const outputRange = range;
201
+
202
+ return {
203
+ inputRange,
204
+ outputRange,
205
+ };
206
+ }
207
+
208
+ export function tinderAnimatedStyles(
209
+ index,
210
+ animatedValue,
211
+ carouselProps,
212
+ cardOffset,
213
+ ) {
214
+ const sizeRef = carouselProps.vertical
215
+ ? carouselProps.itemHeight
216
+ : carouselProps.itemWidth;
217
+ const mainTranslateProp = carouselProps.vertical
218
+ ? 'translateY'
219
+ : 'translateX';
220
+ const secondaryTranslateProp = carouselProps.vertical
221
+ ? 'translateX'
222
+ : 'translateY';
223
+
224
+ const card1Scale = 0.96;
225
+ const card2Scale = 0.92;
226
+ const card3Scale = 0.88;
227
+
228
+ const peekingCardsOpacity = IS_ANDROID ? 0.92 : 1;
229
+
230
+ const newCardOffset = cardOffset ?? 9;
231
+
232
+ const getMainTranslateFromScale = (cardIndex, scale) => {
233
+ const centerFactor = (1 / scale) * cardIndex;
234
+ return -Math.round(sizeRef * centerFactor);
235
+ };
236
+
237
+ const getSecondaryTranslateFromScale = (cardIndex, scale) => {
238
+ return Math.round((newCardOffset * Math.abs(cardIndex)) / scale);
239
+ };
240
+
241
+ return IS_ANDROID
242
+ ? {
243
+ // elevation.data.length - index, // fix zIndex bug visually, but not from a logic point of view
244
+ opacity: animatedValue.interpolate({
245
+ inputRange: [-3, -2, -1, 0, 1],
246
+ outputRange: [0, peekingCardsOpacity, peekingCardsOpacity, 1, 0],
247
+ extrapolate: 'clamp',
248
+ }),
249
+ transform: [
250
+ {
251
+ scale: animatedValue.interpolate({
252
+ inputRange: [-3, -2, -1, 0],
253
+ outputRange: [card3Scale, card2Scale, card1Scale, 1],
254
+ extrapolate: 'clamp',
255
+ }),
256
+ },
257
+ {
258
+ rotate: animatedValue.interpolate({
259
+ inputRange: [0, 1],
260
+ outputRange: ['0deg', '22deg'],
261
+ extrapolate: 'clamp',
262
+ }),
263
+ },
264
+ {
265
+ [mainTranslateProp]: animatedValue.interpolate({
266
+ inputRange: [-3, -2, -1, 0, 1],
267
+ outputRange: [
268
+ getMainTranslateFromScale(-3, card3Scale),
269
+ getMainTranslateFromScale(-2, card2Scale),
270
+ getMainTranslateFromScale(-1, card1Scale),
271
+ 0,
272
+ sizeRef * 1.1,
273
+ ],
274
+ extrapolate: 'clamp',
275
+ }),
276
+ },
277
+ {
278
+ [secondaryTranslateProp]: animatedValue.interpolate({
279
+ inputRange: [-3, -2, -1, 0],
280
+ outputRange: [
281
+ getSecondaryTranslateFromScale(-3, card3Scale),
282
+ getSecondaryTranslateFromScale(-2, card2Scale),
283
+ getSecondaryTranslateFromScale(-1, card1Scale),
284
+ 0,
285
+ ],
286
+ extrapolate: 'clamp',
287
+ }),
288
+ },
289
+ ],
290
+ }
291
+ : {
292
+ zIndex: carouselProps.data.length - index,
293
+ opacity: animatedValue.interpolate({
294
+ inputRange: [-1, 0, 1, 2, 3],
295
+ outputRange: [0, 1, peekingCardsOpacity, peekingCardsOpacity, 0],
296
+ extrapolate: 'clamp',
297
+ }),
298
+ transform: [
299
+ {
300
+ scale: animatedValue.interpolate({
301
+ inputRange: [0, 1, 2, 3],
302
+ outputRange: [1, card1Scale, card2Scale, card3Scale],
303
+ extrapolate: 'clamp',
304
+ }),
305
+ },
306
+ {
307
+ rotate: animatedValue.interpolate({
308
+ inputRange: [-1, 0],
309
+ outputRange: ['-22deg', '0deg'],
310
+ extrapolate: 'clamp',
311
+ }),
312
+ },
313
+ {
314
+ [mainTranslateProp]: animatedValue.interpolate({
315
+ inputRange: [-1, 0, 1, 2, 3],
316
+ outputRange: [
317
+ -sizeRef * 1.1,
318
+ 0,
319
+ getMainTranslateFromScale(1, card1Scale),
320
+ getMainTranslateFromScale(2, card2Scale),
321
+ getMainTranslateFromScale(3, card3Scale),
322
+ ],
323
+ extrapolate: 'clamp',
324
+ }),
325
+ },
326
+ {
327
+ [secondaryTranslateProp]: animatedValue.interpolate({
328
+ inputRange: [0, 1, 2, 3],
329
+ outputRange: [
330
+ 0,
331
+ getSecondaryTranslateFromScale(1, card1Scale),
332
+ getSecondaryTranslateFromScale(2, card2Scale),
333
+ getSecondaryTranslateFromScale(3, card3Scale),
334
+ ],
335
+ extrapolate: 'clamp',
336
+ }),
337
+ },
338
+ ],
339
+ };
340
+ }