PluginProbe ʕ •ᴥ•ʔ
Hostinger Tools / 3.0.71
Hostinger Tools v3.0.71
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 2.0.4 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.2 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 3.0.0 3.0.10 3.0.11 3.0.12 3.0.13 3.0.14 3.0.15 3.0.16 3.0.17 3.0.18 3.0.19 3.0.2 3.0.20 3.0.21 3.0.22 3.0.23 3.0.24 3.0.25 3.0.26 3.0.27 3.0.28 3.0.29 3.0.3 3.0.30 3.0.31 3.0.32 3.0.33 3.0.34 3.0.35 3.0.36 3.0.37 3.0.38 3.0.39 3.0.4 3.0.40 3.0.41 3.0.42 3.0.43 3.0.44 3.0.45 3.0.46 3.0.47 3.0.48 3.0.49 3.0.5 3.0.50 3.0.51 3.0.52 3.0.53 3.0.54 3.0.55 3.0.56 3.0.57 3.0.58 3.0.59 3.0.6 3.0.60 3.0.61 3.0.62 3.0.65 3.0.7 3.0.8 3.0.9 trunk 1.8.0
hostinger / vue-frontend / src / components / Loaders / SkeletonLoader.vue
hostinger / vue-frontend / src / components / Loaders Last commit date
CircleLoader.vue 10 months ago SkeletonLoader.vue 10 months ago
SkeletonLoader.vue
98 lines
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