-
Notifications
You must be signed in to change notification settings - Fork 38
/
react-move-example.js
118 lines (115 loc) · 3.56 KB
/
react-move-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
import React, { Component } from 'react'
import NodeGroup from 'react-move/NodeGroup'
import Animate from 'react-move/Animate'
import { easeElastic } from 'd3-ease'
import animationTimings from './common/animationTimings'
class TransitionGrid extends Component {
render() {
const { visible, items, removeItem } = this.props
return (
<Animate
show={visible}
start={{
// values have to be in an array for some reason or else they won't tween (?)
translateX: [-100],
opacity: [1]
}}
enter={[
{
opacity: [1],
timing: { duration: animationTimings.gridEnter }
},
{
translateX: [0],
timing: { duration: animationTimings.gridEnter, ease: easeElastic }
}
]}
leave={[
{
opacity: [0]
},
{
translateX: [1000],
timing: { duration: animationTimings.gridLeave, ease: easeElastic }
}
]}
>
{({ opacity, translateX }) => {
return (
<div
className="animated-grid"
style={{
opacity: opacity,
transform: `translateX(${translateX}px)`
}}
>
{
<NodeGroup
data={items}
keyAccessor={item => item}
start={(item, i) => {
return {
opacity: [0],
translateY: [-50],
timing: { delay: i * 100 }
}
}}
enter={(item, i) => {
return [
{
opacity: [1],
timing: {
duration: animationTimings.cardEnter,
delay: i * 100
}
},
{
translateY: [0],
timing: {
duration: animationTimings.cardEnter,
ease: easeElastic,
delay: i * 100
}
}
]
}}
leave={(item, i) => {
return {
opacity: 0,
translateY: -50,
timing: { delay: (items.length - i) * 100 }
}
}}
>
{nodes => {
return (
<ul className="grid">
{nodes.map(({ key, data, state }) => {
return (
<li
key={key}
className="card"
style={{
opacity: state.opacity,
transform: `translateY(${state.translateY}px)`
}}
onClick={() => removeItem(data)}
>
<div className="close-card">✕</div>
<div>{data}</div>
</li>
)
})}
</ul>
)
}}
</NodeGroup>
}
</div>
)
}}
</Animate>
)
}
}
export default TransitionGrid