123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- <template>
- <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" />
- <svg v-else :class="svgClass" aria-hidden="true">
- <use v-if="color" :xlink:href="iconName" :fill="color" />
- <use v-else :xlink:href="iconName" />
- </svg>
- </template>
- <script setup name="SvgIcon">
- import { computed } from 'vue'
- const props = defineProps({
- iconClass: { type: String, required: true },
- className: { type: String, default: '' },
- color: { type: String, default: '#333' }
- })
- const isExternal = computed(() => {
- let isExternal = /^(https?:|mailto:|tel:)/.test(props.iconClass)
- return isExternal
- })
- const iconName = computed(() => {
- return `#icon-${props.iconClass}`
- })
- const svgClass = computed(() => {
- return props.className ? `svg-icon ${props.className}` : 'svg-icon'
- })
- const styleExternalIcon = computed(() => {
- return {
- mask: `url(${props.iconClass}) no-repeat 50% 50%`
- // "-webkit-mask": `url(${props.iconClass}) no-repeat 50% 50%`,
- }
- })
- </script>
- <style scoped>
- .svg-icon {
- display: inline-block;
- width: 1em;
- height: 1em;
- vertical-align: -0.15em;
- fill: currentColor;
- overflow: hidden;
- }
- .svg-external-icon {
- background-color: currentColor;
- mask-size: cover !important;
- display: inline-block;
- }
- </style>
|