2 changed files with 72 additions and 3 deletions
@ -0,0 +1,51 @@ |
|||
<template> |
|||
<Teleport to="body"> |
|||
<Transition name="fade"> |
|||
<div |
|||
v-if="isOpen" |
|||
class="fixed inset-0 z-50 flex items-center justify-center bg-black/90" |
|||
@click="close" |
|||
> |
|||
<button |
|||
class="absolute top-4 right-4 text-white text-2xl p-2 rounded-full hover:bg-white/10" |
|||
@click="close" |
|||
> |
|||
<fa icon="xmark" /> |
|||
</button> |
|||
|
|||
<img |
|||
:src="imageUrl" |
|||
class="max-h-screen max-w-screen-md w-full object-contain p-4" |
|||
@click.stop |
|||
alt="expanded shared content" |
|||
/> |
|||
</div> |
|||
</Transition> |
|||
</Teleport> |
|||
</template> |
|||
|
|||
<script lang="ts"> |
|||
import { Component, Vue, Prop } from "vue-facing-decorator"; |
|||
|
|||
@Component |
|||
export default class ImageViewer extends Vue { |
|||
@Prop() imageUrl!: string; |
|||
@Prop() isOpen!: boolean; |
|||
|
|||
close() { |
|||
this.$emit("update:isOpen", false); |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.fade-enter-active, |
|||
.fade-leave-active { |
|||
transition: opacity 0.2s ease; |
|||
} |
|||
|
|||
.fade-enter-from, |
|||
.fade-leave-to { |
|||
opacity: 0; |
|||
} |
|||
</style> |
Loading…
Reference in new issue