mirror of
https://github.com/IT4Change/gradido.git
synced 2026-02-06 09:56:05 +00:00
85 lines
1.5 KiB
Vue
85 lines
1.5 KiB
Vue
<template>
|
|
<div
|
|
class="skeleton-loader my-2"
|
|
:class="{ 'with-animation': !disableAnimation }"
|
|
:style="{
|
|
width: computedWidth,
|
|
height: computedHeight,
|
|
borderRadius: computedRadius,
|
|
}"
|
|
/>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { computed } from 'vue'
|
|
|
|
const props = defineProps({
|
|
width: {
|
|
type: [String, Number],
|
|
default: '100%',
|
|
},
|
|
height: {
|
|
type: [String, Number],
|
|
default: '1rem',
|
|
},
|
|
disableAnimation: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
fullRadius: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
useGradidoRadius: {
|
|
type: Boolean,
|
|
},
|
|
})
|
|
|
|
const computedWidth = computed(() => {
|
|
if (typeof props.width === 'number') return `${props.width}px`
|
|
return props.width
|
|
})
|
|
|
|
const computedHeight = computed(() => {
|
|
if (typeof props.height === 'number') return `${props.height}px`
|
|
return props.height
|
|
})
|
|
|
|
const computedRadius = computed(() => {
|
|
return props.fullRadius ? '100%' : props.useGradidoRadius ? '26px' : '0'
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
.skeleton-loader {
|
|
background: #e9ecef; /* Bootstrap 5 gray-200 color */
|
|
border-radius: 0.25rem;
|
|
}
|
|
|
|
.with-animation {
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.with-animation::after {
|
|
position: absolute;
|
|
inset: 0;
|
|
transform: translateX(-100%);
|
|
background: linear-gradient(
|
|
90deg,
|
|
rgb(255 255 255 / 0%) 0%,
|
|
rgb(255 255 255 / 20%) 20%,
|
|
rgb(255 255 255 / 50%) 60%,
|
|
rgb(255 255 255 / 0%) 100%
|
|
);
|
|
animation: shimmer 2s infinite;
|
|
content: '';
|
|
}
|
|
|
|
@keyframes shimmer {
|
|
100% {
|
|
transform: translateX(100%);
|
|
}
|
|
}
|
|
</style>
|