PluginProbe ʕ •ᴥ•ʔ
Hostinger Tools / 3.0.72
Hostinger Tools v3.0.72
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 / Icon / Icon.vue
hostinger / vue-frontend / src / components / Icon Last commit date
Icons 10 months ago Icon.vue 10 months ago
Icon.vue
57 lines
1 <script lang="ts" setup>
2 import { computed, defineAsyncComponent } from "vue";
3
4 import type { Color } from "@/types";
5 import type { IconUnion } from "@/types/enums/iconModels";
6 import { toTitleCase, wrapInCssVar } from "@/utils/helpers";
7 import { kebabToCamel } from "@/utils/services/snakeCamelService";
8
9 interface Props {
10 dimensions?: number;
11 color?: Color;
12 name: IconUnion;
13 }
14
15 const props = withDefaults(defineProps<Props>(), {
16 dimensions: 24,
17 color: "white"
18 });
19
20 const iconColor = computed(() => {
21 if (!props.color) return "";
22
23 return wrapInCssVar(props.color);
24 });
25
26 const selectedIcon = computed(() =>
27 defineAsyncComponent(
28 () =>
29 import(
30 `@/components/Icon/Icons/${kebabToCamel(toTitleCase(props.name))}.vue`
31 )
32 )
33 );
34 </script>
35
36 <template>
37 <svg
38 class="icon"
39 aria-hidden="true"
40 >
41 <g>
42 <Component :is="selectedIcon" />
43 </g>
44 </svg>
45 </template>
46
47 <style lang="scss" scoped>
48 .icon {
49 transition: 0.3s ease transform;
50 fill: currentColor;
51 color: v-bind(iconColor);
52 width: v-bind("dimensions + 'px'");
53 height: v-bind("dimensions + 'px'");
54 min-width: v-bind("dimensions + 'px'");
55 }
56 </style>
57