drupal-caravane/web/themes/custom/caravane/assets/js/vuejs/ImageModale.vue

93 lines
2.5 KiB
Vue
Raw Normal View History

2024-09-29 21:36:21 +02:00
<template>
<transition name="fade">
<div v-if="isOpen" class="image-viewer-wrapper">
<div v-if="!swiperContent.length" class="img-modale simple-viewer">
<figure class="img-wrapper">
<img :src="image.src" :alt="image.alt">
<figcaption>{{ image.alt }}</figcaption>
</figure>
</div>
<div v-else class="img-modale swiper-viewer">
<div class="swiper-wrapper">
<swiper-container
:slidesPerView="1"
:centeredSlides="true"
:loop="true"
:navigation="true"
:pagination="true"
:initialSlide="currentImgIndex"
:injectStyles="[`
.swiper-button-next, .swiper-button-prev {
color: white;
top: 50%;
}
.swiper-pagination-bullet:not(.swiper-pagination-bullet-active) {
background: white;
opacity: 0.8;
}
`]"
>
<swiper-slide v-for="media in swiperContent">
<figure>
<img :src="media.src" :alt="media.alt" class="popup-img">
<figcaption>{{ media.alt }}</figcaption>
</figure>
</swiper-slide>
</swiper-container>
</div>
</div>
<button @click="close" class="close-button">
<div></div>
<div></div>
</button>
</div>
</transition>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
isOpen: Boolean,
image: {
type: Object,
required: true,
},
swiperContent: {
type: Array,
required: true,
}
});
const currentImgIndex = ref(0);
watch(
() => props.isOpen,
() => {
if (props.isOpen && props.swiperContent.length) {
for (let i = 0; i < props.swiperContent.length; i++) {
const currentImgSrc = props.image.src;
const truncatedSrc = currentImgSrc.substring(currentImgSrc.indexOf("/sites"));
if (props.swiperContent[i].src === truncatedSrc) {
currentImgIndex.value = i;
break;
}
}
}
})
const emit = defineEmits(['close']);
const close = () => {
emit('close');
};
</script>
<style scoped>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.3s ease;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
</style>