<template> <div class="banner" @wheel.prevent="scrollBanner" > <div class="trailer"> <video v-if="release.trailer" :src="`/media/${release.trailer.path}`" :poster="release.poster && (sfw ? `/img/${release.poster.sfw.thumbnail}` : `/media/${release.poster.thumbnail}`)" :alt="release.title" :class="{ sfw: sfw && paused }" class="item trailer-video" controls @playing="playing = true; paused = false;" @pause="playing = false; paused = true;" >Sorry, the tailer cannot be played in your browser</video> <video v-else-if="release.teaser && /^video\//.test(release.teaser.mime)" :src="`/media/${release.teaser.path}`" :poster="release.poster && (sfw ? `/img/${release.poster.sfw.thumbnail}` : `/media/${release.poster.thumbnail}`)" :alt="release.title" :class="{ sfw: sfw && paused }" class="item trailer-video" controls @playing="playing = true; paused = false;" @pause="playing = false; paused = true;" >Sorry, the tailer cannot be played in your browser</video> <img v-else-if="release.teaser && /^image\//.test(release.teaser.mime)" :src="sfw ? `/img/${release.teaser.sfw.thumbnail}` : `/media/${release.teaser.path}`" :alt="release.title" class="item trailer-video" > <a v-if="release.poster" :href="`/media/${release.poster.path}`" :class="{ playing }" target="_blank" rel="noopener noreferrer" class="poster-link" ><Icon icon="image" /></a> <span v-if="sfw && !playing" class="warning" > <Icon icon="warning2" />NSFW </span> </div> <template v-if="release.covers && release.covers.length > 0"> <a v-for="cover in release.covers" :key="`cover-${cover.id}`" :href="`/media/${cover.path}`" target="_blank" rel="noopener noreferrer" > <img :src="`/media/${cover.thumbnail}`" class="item cover" > </a> </template> <a v-for="photo in photos" :key="`banner-${photo.index}`" :href="`/media/${photo.path}`" :class="{ sfw }" class="item-link" target="_blank" rel="noopener noreferrer" > <img :src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`" :alt="`Photo ${photo.index + 1}`" class="item" > <span v-if="sfw" class="warning" > <Icon icon="warning2" />NSFW </span> </a> </div> </template> <script> function sfw() { return this.$store.state.ui.sfw; } function photos() { if (this.release.trailer || this.release.teaser) { // poster will be on trailer video return this.release.photos; } if (this.release.poster) { return [this.release.poster].concat(this.release.photos); } return this.release.photos; } function scrollBanner(event) { event.currentTarget.scrollLeft += event.deltaY; // eslint-disable-line no-param-reassign } export default { props: { release: { type: Object, default: null, }, }, data() { return { playing: false, paused: false, }; }, computed: { photos, sfw, }, methods: { scrollBanner, }, }; </script> <style lang="scss" scoped> @import 'theme'; .banner { background: var(--empty); flex-shrink: 0; white-space: nowrap; overflow-x: auto; scrollbar-width: none; box-shadow: 0 0 3px var(--shadow); font-size: 0; &::-webkit-scrollbar { display: none; } } .poster-link { position: absolute; top: .5rem; right: .5rem; transition: opacity .1s ease; .icon { width: 1.5rem; height: 1.5rem; fill: var(--lighten-strong); filter: drop-shadow(0 0 1px var(--darken-weak)); } &.playing { opacity: 0; } &:hover { cursor: pointer; opacity: 1; .icon { fill: var(--text-light); } } } .item-link, .trailer { position: relative; display: inline-flex; align-items: center; justify-content: center; .warning { display: none; width: 100%; height: 100%; flex-direction: column; align-items: center; justify-content: center; position: absolute; background: var(--darken-weak); color: var(--text-light); font-size: 1.2rem; font-weight: bold; text-shadow: 0 0 3px var(--darken-strong); pointer-events: none; animation: alert .5s ease infinite .1s; .icon { display: block; fill: var(--text-light); width: 3rem; height: 3rem; margin: 0 0 .25rem 0; filter: drop-shadow(0 0 3px var(--darken)); animation: alert .5s ease infinite .1s; } } &:hover .warning { display: inline-flex; } } .item { height: 18rem; vertical-align: middle; } .trailer { max-width: 100vw; } .trailer-video { max-width: 100%; object-fit: cover; &.sfw { filter: blur(2rem); } } @keyframes alert { 0% { color: var(--text-light); fill: var(--text-light); } 50% { color: var(--alert); fill: var(--alert); } } @media(max-width: $breakpoint2) { .trailer-video { object-fit: contain; } } </style>