-
Notifications
You must be signed in to change notification settings - Fork 39
/
velocity-react-example.js
122 lines (117 loc) · 2.74 KB
/
velocity-react-example.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import React from 'react'
import { VelocityTransitionGroup, velocityHelpers } from 'velocity-react'
import 'velocity-animate/velocity.ui'
import animationTimings from './common/animationTimings'
const cardAnimationIn = velocityHelpers.registerEffect({
defaultDuration: animationTimings.cardEnter,
calls: [
[
{
opacity: [1, 0],
translateY: [0, -20],
translateZ: 0
},
1,
{
display: 'flex',
easing: 'spring'
}
]
]
})
const cardAnimationOut = velocityHelpers.registerEffect({
defaultDuration: animationTimings.cardLeave,
calls: [
[
{
opacity: [0, 1],
translateY: [20, 0],
translateZ: 0
},
1,
{
display: 'flex',
easing: 'spring'
}
]
]
})
const gridAnimationIn = velocityHelpers.registerEffect({
defaultDuration: animationTimings.gridEnter,
calls: [
[
{
opacity: [1, 0],
translateX: [0, -1000],
translateZ: 0
},
1,
{
display: 'flex',
easing: 'spring'
}
]
]
})
const gridAnimationOut = velocityHelpers.registerEffect({
defaultDuration: animationTimings.gridLeave,
calls: [
[
{
opacity: [1, 0],
translateX: [0, 1000]
},
1,
{
display: 'flex',
easing: 'spring',
delay: 2000
}
]
]
})
const TransitionGrid = ({ visible, items, removeItem }) => {
return (
<VelocityTransitionGroup
enter={{ animation: gridAnimationIn }}
leave={{ animation: gridAnimationOut, delay: 500 }}
>
{visible && (
<div className="animated-grid">
<VelocityTransitionGroup
component="ul"
className="grid"
runOnMount
enter={{
animation: cardAnimationIn,
stagger: animationTimings.cardStagger,
drag: true,
delay: animationTimings.gridEnter
}}
// velocity react is smart about applying the end stage of the leave animation
// (opacity : 0) to the enter animation
leave={{
animation: cardAnimationOut,
stagger: animationTimings.cardStagger,
drag: true
}}
>
{items.map(item => {
return (
<div
className="card"
key={item}
onClick={() => removeItem(item)}
>
<div className="close-card">✕</div>
<div>{item}</div>
</div>
)
})}
</VelocityTransitionGroup>
</div>
)}
</VelocityTransitionGroup>
)
}
export default TransitionGrid