forked from Mirrors/elk
70 lines
2 KiB
Vue
70 lines
2 KiB
Vue
<script setup lang="ts">
|
|
const emit = defineEmits(['close'])
|
|
|
|
const current = computed(() => mediaPreviewList.value[mediaPreviewIndex.value])
|
|
const hasNext = computed(() => mediaPreviewIndex.value < mediaPreviewList.value.length - 1)
|
|
const hasPrev = computed(() => mediaPreviewIndex.value > 0)
|
|
|
|
const keys = useMagicKeys()
|
|
|
|
whenever(keys.arrowLeft, prev)
|
|
whenever(keys.arrowRight, next)
|
|
|
|
function next() {
|
|
if (hasNext.value)
|
|
mediaPreviewIndex.value++
|
|
}
|
|
|
|
function prev() {
|
|
if (hasPrev.value)
|
|
mediaPreviewIndex.value--
|
|
}
|
|
|
|
function onClick(e: MouseEvent) {
|
|
const path = e.composedPath() as HTMLElement[]
|
|
const el = path.find(el => ['A', 'BUTTON', 'IMG', 'VIDEO'].includes(el.tagName?.toUpperCase()))
|
|
if (!el)
|
|
emit('close')
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div relative h-full w-full flex select-none pointer-events-none>
|
|
<div absolute top-0 left-0 right-0 text-white text-center>
|
|
{{ mediaPreviewIndex + 1 }} / {{ mediaPreviewList.length }}
|
|
</div>
|
|
<button
|
|
v-if="hasNext"
|
|
pointer-events-auto
|
|
btn-action-icon bg="black/20" aria-label="Close"
|
|
hover:bg="black/40" dark:bg="white/30" dark:hover:bg="white/20"
|
|
absolute top="1/2" right-1
|
|
:title="$t('action.next')"
|
|
@click="next"
|
|
>
|
|
<div i-ri:arrow-right-s-line text-white />
|
|
</button>
|
|
<button
|
|
v-if="hasPrev"
|
|
pointer-events-auto
|
|
btn-action-icon bg="black/20" aria-label="Close"
|
|
hover:bg="black/40" dark:bg="white/30" dark:hover:bg="white/20"
|
|
absolute top="1/2" left-1
|
|
:title="$t('action.prev')"
|
|
@click="prev"
|
|
>
|
|
<div i-ri:arrow-left-s-line text-white />
|
|
</button>
|
|
<img :src="current.url || current.previewUrl" :alt="current.description || ''" max-h="95%" max-w="95%" ma>
|
|
|
|
<button
|
|
btn-action-icon bg="black/20" aria-label="Close"
|
|
hover:bg="black/40" dark:bg="white/30" dark:hover:bg="white/20"
|
|
absolute top-0 right-0 m1 pointer-events-auto
|
|
@click="emit('close')"
|
|
>
|
|
<div i-ri:close-fill text-white />
|
|
</button>
|
|
</div>
|
|
</template>
|