PluginProbe
Hostinger Tools / trunk
Hostinger Tools vtrunk
3.0.78 3.0.77 3.0.76 3.0.75 3.0.74 3.0.73 3.0.72 3.0.71 3.0.70 3.0.69 3.0.68 3.0.67 3.0.66 1.8.1 1.8.2 1.8.3 1.9.1 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 All 109 releases
hostinger / vue-frontend / src / components / Loaders / SkeletonLoader.vue

SkeletonLoader.vue in Hostinger Tools trunk, at vue-frontend/src/components/Loaders/SkeletonLoader.vue

98 lines 1.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <script lang="ts" setup>
2 import { computed } from "vue";
3
4 type DimensionValue = number | string;
5
6 type Props = {
7 circle?: boolean;
8 rounded?: boolean;
9 roundedXs?: boolean;
10 roundedXl?: boolean;
11 width?: DimensionValue;
12 height?: DimensionValue;
13 isInline?: boolean;
14 };
15
16 const props = defineProps<Props>();
17
18 const classes = computed(() => ({
19 "skeleton-loader--circle": props.circle,
20 "skeleton-loader--rounded": props.rounded,
21 "skeleton-loader--rounded-xs": props.roundedXs,
22 "skeleton-loader--rounded-xl": props.roundedXl,
23 "skeleton-loader--inline": props.isInline
24 }));
25
26 const getSkeletonSize = (value?: DimensionValue) => {
27 if (Number.isInteger(value)) {
28 return `${value}px`;
29 }
30
31 return value;
32 };
33 </script>
34
35 <template>
36 <div
37 class="skeleton-loader"
38 :class="{ ...classes }"
39 :style="{
40 'max-width': getSkeletonSize(width),
41 height: getSkeletonSize(height),
42 width: props.isInline ? getSkeletonSize(width) : undefined,
43 }"
44 />
45 </template>
46
47 <style lang="scss" scoped>
48 .skeleton-loader {
49 position: relative;
50 overflow: hidden;
51 background-color: var(--gray-1);
52 width: 100%;
53
54 &::after {
55 top: 0;
56 left: 0;
57 right: 0;
58 bottom: 0;
59 content: "";
60 position: absolute;
61 animation: HSkeletonLoader-keyframes-wave 1.6s linear 0.5s infinite;
62 transform: translateX(-100%);
63 background: linear-gradient(90deg, transparent, var(--gray-2));
64 }
65
66 &--circle {
67 border-radius: 50%;
68 }
69
70 &--rounded {
71 border-radius: 8px;
72 }
73 &--rounded-xs {
74 border-radius: 4px;
75 }
76 &--rounded-xl {
77 border-radius: 24px;
78 }
79
80 &--inline {
81 display: inline-block;
82 vertical-align: middle;
83 }
84 }
85
86 @keyframes HSkeletonLoader-keyframes-wave {
87 0% {
88 transform: translateX(-100%);
89 }
90 60% {
91 transform: translateX(100%);
92 }
93 100% {
94 transform: translateX(100%);
95 }
96 }
97 </style>
98