2019-10-06 13:08:24 +00:00
|
|
|
<template>
|
|
|
|
|
<button
|
|
|
|
|
@click="btnClicked"
|
2023-09-20 20:01:43 +00:00
|
|
|
:class="[btnClass, { loading: loading }, { 'pr-12': loading }]"
|
2019-10-06 13:08:24 +00:00
|
|
|
:disabled="loading"
|
2020-03-22 16:56:12 +00:00
|
|
|
class="relative select-none"
|
2019-10-06 13:08:24 +00:00
|
|
|
type="button"
|
|
|
|
|
>
|
|
|
|
|
<slot>Send</slot>
|
|
|
|
|
<span class="spinner absolute opacity-0 left-auto">
|
|
|
|
|
<span
|
2023-09-20 21:43:14 +00:00
|
|
|
class="inline-block absolute right-0 w-4 h-4 opacity-100 border-[3px] border-white rounded-full"
|
2019-10-06 13:08:24 +00:00
|
|
|
></span>
|
|
|
|
|
<span
|
2023-09-20 21:43:14 +00:00
|
|
|
class="inline-block absolute right-0 w-4 h-4 opacity-100 border-[3px] border-white rounded-full"
|
2019-10-06 13:08:24 +00:00
|
|
|
></span>
|
|
|
|
|
<span
|
2023-09-20 21:43:14 +00:00
|
|
|
class="inline-block absolute right-0 w-4 h-4 opacity-100 border-[3px] border-white rounded-full"
|
2019-10-06 13:08:24 +00:00
|
|
|
></span>
|
|
|
|
|
<span
|
2023-09-20 21:43:14 +00:00
|
|
|
class="inline-block absolute right-0 w-4 h-4 opacity-100 border-[3px] border-white rounded-full"
|
2019-10-06 13:08:24 +00:00
|
|
|
></span>
|
|
|
|
|
</span>
|
|
|
|
|
</button>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
export default {
|
|
|
|
|
props: {
|
|
|
|
|
btnClass: {
|
|
|
|
|
type: String,
|
|
|
|
|
required: false,
|
2023-09-20 20:01:43 +00:00
|
|
|
default: '',
|
2019-10-06 13:08:24 +00:00
|
|
|
},
|
|
|
|
|
loading: {
|
|
|
|
|
type: Boolean,
|
|
|
|
|
required: false,
|
2023-09-20 20:01:43 +00:00
|
|
|
default: false,
|
|
|
|
|
},
|
2019-10-06 13:08:24 +00:00
|
|
|
},
|
2020-06-11 18:55:39 +00:00
|
|
|
|
2019-10-06 13:08:24 +00:00
|
|
|
methods: {
|
|
|
|
|
btnClicked() {
|
|
|
|
|
this.$emit('clicked')
|
2023-09-20 20:01:43 +00:00
|
|
|
},
|
|
|
|
|
},
|
2019-10-06 13:08:24 +00:00
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
button {
|
|
|
|
|
transition: all 0.2s;
|
|
|
|
|
transition-timing-function: ease-in;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.spinner {
|
|
|
|
|
top: 50%;
|
|
|
|
|
right: 1.7rem;
|
|
|
|
|
margin: -0.5rem;
|
|
|
|
|
transition-property: padding, opacity;
|
|
|
|
|
transition-duration: 0.2s, 0.2s;
|
|
|
|
|
transition-timing-function: ease-in, ease;
|
|
|
|
|
transition-delay: 0s, 0.2s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.spinner span {
|
|
|
|
|
animation: spinner 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
|
|
|
|
|
border-color: #fff transparent transparent transparent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.spinner span:nth-child(1) {
|
|
|
|
|
animation-delay: 0.45s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.spinner span:nth-child(2) {
|
|
|
|
|
animation-delay: 0.3s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.spinner span:nth-child(3) {
|
|
|
|
|
animation-delay: 0.15s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.loading .spinner {
|
|
|
|
|
opacity: 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
button:not(:disabled) .spinner span {
|
|
|
|
|
box-shadow: 0 0 0 0.2rem #4fd1c5 inset;
|
|
|
|
|
border: 7.4px solid transparent;
|
|
|
|
|
transition: all 0.4s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
button:not(:disabled) .spinner span:nth-child(1) {
|
|
|
|
|
transform: rotate(0deg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
button:not(:disabled) .spinner span:nth-child(2) {
|
|
|
|
|
transform: rotate(90deg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
button:not(:disabled) .spinner span:nth-child(3) {
|
|
|
|
|
transform: rotate(180deg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
button:not(:disabled) .spinner span:nth-child(4) {
|
|
|
|
|
transform: rotate(270deg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@keyframes spinner {
|
|
|
|
|
0% {
|
|
|
|
|
transform: rotate(0deg);
|
|
|
|
|
}
|
|
|
|
|
100% {
|
|
|
|
|
transform: rotate(360deg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|