81 lines
1.5 KiB
Vue
81 lines
1.5 KiB
Vue
<template>
|
|
<transition-group v-if="$store.state.device.animation"
|
|
class="uupnnhew"
|
|
:data-direction="direction"
|
|
:data-reversed="reversed ? 'true' : 'false'"
|
|
name="staggered"
|
|
tag="div"
|
|
appear
|
|
>
|
|
<slot></slot>
|
|
</transition-group>
|
|
<div v-else>
|
|
<slot></slot>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Vue from 'vue';
|
|
|
|
export default Vue.extend({
|
|
props: {
|
|
delay: {
|
|
type: Number,
|
|
required: false,
|
|
default: 40
|
|
},
|
|
direction: {
|
|
type: String,
|
|
required: false,
|
|
default: 'down'
|
|
},
|
|
reversed: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false
|
|
}
|
|
},
|
|
methods: {
|
|
focus() {
|
|
this.$slots.default[0].elm.focus();
|
|
}
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.staggered-move {
|
|
transition: transform 0.7s cubic-bezier(0.23, 1, 0.32, 1) !important;
|
|
}
|
|
|
|
.uupnnhew[data-direction="up"] {
|
|
.staggered-enter {
|
|
opacity: 0;
|
|
transform: translateY(64px);
|
|
}
|
|
}
|
|
|
|
.uupnnhew[data-direction="down"] {
|
|
.staggered-enter {
|
|
opacity: 0;
|
|
transform: translateY(-64px);
|
|
}
|
|
}
|
|
|
|
.uupnnhew[data-reversed="true"] {
|
|
@for $i from 1 through 30 {
|
|
.staggered-enter-active:nth-last-child(#{$i}) {
|
|
transition: transform 0.7s cubic-bezier(0.23, 1, 0.32, 1) (15ms * ($i - 1)), opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1) (15ms * ($i - 1));
|
|
}
|
|
}
|
|
}
|
|
|
|
.uupnnhew[data-reversed="false"] {
|
|
@for $i from 1 through 30 {
|
|
.staggered-enter-active:nth-child(#{$i}) {
|
|
transition: transform 0.7s cubic-bezier(0.23, 1, 0.32, 1) (15ms * ($i - 1)), opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1) (15ms * ($i - 1));
|
|
}
|
|
}
|
|
}
|
|
</style>
|