-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanimated-overlay-mixin.html
101 lines (88 loc) · 2.56 KB
/
animated-overlay-mixin.html
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
<link rel="import" href="overlay-mixin.html">
<script>
window.AnimatedOverlayMixin = subclass => class extends OverlayMixin(subclass) {
static get properties() {
return {
openAnimationConfig: {
type: Object,
value: _ => {
return {
keyframes: [
{opacity: 0, transform: 'translateY(100px)'},
{opacity: 1, transform: 'translateY(0)'}
],
options: {
duration: 225,
easing: 'cubic-bezier(0.165, 0.84, 0.44, 1)',
fill: 'forwards'
}
};
}
},
closeAnimationConfig: {
type: Object,
value: _ => {
return {
keyframes: [
{opacity: 1, transform: 'translateY(0)'},
{opacity: 0, transform: 'translateY(100px)'}
],
options: {
duration: 300,
easing: 'cubic-bezier(0.645, 0.045, 0.355, 1)',
fill: 'forwards'
}
};
}
}
};
}
_openedChanged(opened, old) {
super._openedChanged(opened, old);
if (opened) {
this.__animateIn();
} else if (old) {
this.__animateOut();
}
}
__animateIn() {
this.__beforeAnimate();
requestAnimationFrame(_ => {
const config = this.openAnimationConfig;
this.__animation = this.animate(config.keyframes, config.options);
this.__animation.onfinish = _ => {
this.__afterAnimate();
this.dispatchEvent(new CustomEvent('overlay-open-animation-finish', {
bubbles: true,
composed: true
}));
};
});
}
__animateOut() {
this.style.display = '';
this.__beforeAnimate();
requestAnimationFrame(_ => {
const config = this.closeAnimationConfig;
this.__animation = this.animate(config.keyframes, config.options);
this.__animation.onfinish = _ => {
this.__afterAnimate();
this.remove();
this.dispatchEvent(new CustomEvent('overlay-close-animation-finish', {
bubbles: true,
composed: true
}));
};
});
}
__beforeAnimate() {
document.body.style.overflow = 'hidden';
this.style.willChange = 'transform';
}
__afterAnimate() {
document.body.style.overflow = '';
this.style.willChange = '';
this.__animation = null;
}
};
</script>