mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 04:01:10 -04:00
124 lines
2.3 KiB
Vue
124 lines
2.3 KiB
Vue
<template>
|
|
<div
|
|
:class="{ 'bg-gray-400': showBgOverlay }"
|
|
class="absolute top-0 left-0 z-20 flex items-center justify-center w-full h-full bg-opacity-25 base-loader"
|
|
>
|
|
<div class="absolute top-0 left-0 w-full h-full overlay">
|
|
<div
|
|
class="absolute flex items-center justify-center ball-scale-ripple-multiple"
|
|
>
|
|
<div></div>
|
|
<div></div>
|
|
<div></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
showBgOverlay: {
|
|
default: false,
|
|
type: Boolean,
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
// function.scss
|
|
|
|
@function delay($interval, $count, $index) {
|
|
@return ($index * $interval) - ($interval * $count);
|
|
}
|
|
|
|
// mixins.scss
|
|
|
|
@mixin global-bg() {
|
|
background-color: #5851d8;
|
|
}
|
|
|
|
@mixin global-animation() {
|
|
animation-fill-mode: both;
|
|
}
|
|
|
|
@mixin balls() {
|
|
@include global-bg();
|
|
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 100%;
|
|
margin: 2px;
|
|
}
|
|
|
|
@mixin lines() {
|
|
@include global-bg();
|
|
|
|
width: $line-width;
|
|
height: $line-height;
|
|
border-radius: 2px;
|
|
margin: $margin;
|
|
}
|
|
|
|
.base-loader {
|
|
.overlay {
|
|
@keyframes ball-scale-ripple-multiple {
|
|
0% {
|
|
transform: scale(0.1);
|
|
opacity: 1;
|
|
}
|
|
70% {
|
|
transform: scale(1);
|
|
opacity: 0.7;
|
|
}
|
|
100% {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
@mixin ball-scale-ripple-multiple($n: 3, $start: 0) {
|
|
@for $i from $start through $n {
|
|
> div:nth-child(#{$i}) {
|
|
animation-delay: delay(0.2s, $n, $i - 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
.loader {
|
|
width: 100%;
|
|
position: relative;
|
|
min-height: 500px;
|
|
}
|
|
|
|
.ball-scale-ripple-multiple {
|
|
transform: translateY(-25px);
|
|
top: 50%;
|
|
left: 50%;
|
|
@include ball-scale-ripple-multiple();
|
|
transform: translateY(-50px / 2);
|
|
|
|
> div {
|
|
@include global-animation();
|
|
|
|
position: absolute;
|
|
top: -2px;
|
|
left: -26px;
|
|
width: 50px;
|
|
height: 50px;
|
|
border-radius: 100%;
|
|
border: 2px solid #5851d8;
|
|
animation: ball-scale-ripple-multiple 1.25s 0s infinite
|
|
cubic-bezier(0.21, 0.53, 0.56, 0.8);
|
|
}
|
|
}
|
|
}
|
|
|
|
&.table-loader .overlay {
|
|
background: rgba(255, 255, 255, 0.5);
|
|
height: calc(100% - 80px);
|
|
top: 80px;
|
|
}
|
|
}
|
|
</style>
|