Compare commits
No commits in common. "229d74d26648a639803f763ce4074e524eeb868b" and "ced8f447a75764cc0015c60e33248ddf2d07e6c2" have entirely different histories.
229d74d266
...
ced8f447a7
|
@ -63,7 +63,10 @@
|
||||||
:items-per-page="limit"
|
:items-per-page="limit"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="tiles">
|
<div
|
||||||
|
v-lazy-container="{ selector: '.lazy' }"
|
||||||
|
class="tiles"
|
||||||
|
>
|
||||||
<Actor
|
<Actor
|
||||||
v-for="actor in actors"
|
v-for="actor in actors"
|
||||||
:key="`actor-${actor.id}`"
|
:key="`actor-${actor.id}`"
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
:src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
:src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
||||||
:style="{ 'background-image': sfw ? `/img/${actor.avatar.sfw.lazy}` : `/media/${actor.avatar.lazy}` }"
|
:data-src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
||||||
|
:data-loading="sfw ? `/img/${actor.avatar.sfw.lazy}` : `/media/${actor.avatar.lazy}`"
|
||||||
:title="actor.avatar.credit && `© ${actor.avatar.credit}`"
|
:title="actor.avatar.credit && `© ${actor.avatar.credit}`"
|
||||||
loading="lazy"
|
|
||||||
class="avatar photo"
|
class="avatar photo"
|
||||||
@load="$parent.$emit('load')"
|
@load="$parent.$emit('load')"
|
||||||
>
|
>
|
||||||
|
@ -34,9 +34,9 @@
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
:src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
:src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
||||||
:style="{ 'background-image': sfw ? `/img/${photo.sfw.lazy}` : `/media/${photo.lazy}` }"
|
:data-src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
||||||
|
:data-loading="sfw ? `/img/${photo.sfw.lazy}` : `/media/${photo.lazy}`"
|
||||||
:title="`© ${photo.credit || photo.entity.name}`"
|
:title="`© ${photo.credit || photo.entity.name}`"
|
||||||
loading="lazy"
|
|
||||||
class="photo"
|
class="photo"
|
||||||
@load="$parent.$emit('load')"
|
@load="$parent.$emit('load')"
|
||||||
>
|
>
|
||||||
|
@ -76,6 +76,9 @@ export default {
|
||||||
padding: .5rem 1rem;
|
padding: .5rem 1rem;
|
||||||
margin: 0 1rem 0 0;
|
margin: 0 1rem 0 0;
|
||||||
font-size: 0;
|
font-size: 0;
|
||||||
|
overflow-x: scroll;
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
scrollbar-width: none;
|
||||||
|
|
||||||
&.expanded {
|
&.expanded {
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
@ -98,6 +101,10 @@ export default {
|
||||||
.avatar-link {
|
.avatar-link {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.photo-link {
|
.photo-link {
|
||||||
|
@ -108,7 +115,6 @@ export default {
|
||||||
height: 15rem;
|
height: 15rem;
|
||||||
box-shadow: 0 0 3px var(--darken-weak);
|
box-shadow: 0 0 3px var(--darken-weak);
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
background-size: cover;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media(max-width: $breakpoint3) {
|
@media(max-width: $breakpoint3) {
|
||||||
|
|
|
@ -45,10 +45,9 @@
|
||||||
<div class="avatar-container">
|
<div class="avatar-container">
|
||||||
<img
|
<img
|
||||||
v-if="actor.avatar"
|
v-if="actor.avatar"
|
||||||
:src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
:data-src="sfw ? `/img/${actor.avatar.sfw.thumbnail}` : `/media/${actor.avatar.thumbnail}`"
|
||||||
:style="{ 'background-image': sfw ? `url(/img/${actor.avatar.sfw.lazy})`: `url(/img/${actor.avatar.lazy})` }"
|
:data-loading="sfw ? `/img/${actor.avatar.sfw.lazy}` : `/media/${actor.avatar.lazy}`"
|
||||||
loading="lazy"
|
class="avatar lazy"
|
||||||
class="avatar"
|
|
||||||
>
|
>
|
||||||
|
|
||||||
<span
|
<span
|
||||||
|
@ -233,7 +232,6 @@ export default {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
object-position: 50% 0;
|
object-position: 50% 0;
|
||||||
background-size: cover;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.avatar-fallback {
|
.avatar-fallback {
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="container">
|
<div
|
||||||
|
class="container"
|
||||||
|
:class="theme"
|
||||||
|
>
|
||||||
<Warning
|
<Warning
|
||||||
v-if="showWarning"
|
v-if="showWarning"
|
||||||
class="warning-container"
|
class="warning-container"
|
||||||
|
@ -23,10 +26,18 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { mapState } from 'vuex';
|
||||||
|
|
||||||
|
import EventBus from '../../js/event-bus';
|
||||||
|
|
||||||
import Warning from './warning.vue';
|
import Warning from './warning.vue';
|
||||||
import Header from '../header/header.vue';
|
import Header from '../header/header.vue';
|
||||||
import Sidebar from '../sidebar/sidebar.vue';
|
import Sidebar from '../sidebar/sidebar.vue';
|
||||||
|
|
||||||
|
function theme(state) {
|
||||||
|
return state.ui.theme;
|
||||||
|
}
|
||||||
|
|
||||||
function toggleSidebar(state) {
|
function toggleSidebar(state) {
|
||||||
this.showSidebar = typeof state === 'boolean' ? state : !this.showSidebar;
|
this.showSidebar = typeof state === 'boolean' ? state : !this.showSidebar;
|
||||||
}
|
}
|
||||||
|
@ -38,6 +49,12 @@ async function setConsent(consent) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function mounted() {
|
||||||
|
document.addEventListener('click', () => {
|
||||||
|
EventBus.$emit('blur');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
Header,
|
Header,
|
||||||
|
@ -50,6 +67,12 @@ export default {
|
||||||
showWarning: localStorage.getItem('consent') !== window.env.sessionId,
|
showWarning: localStorage.getItem('consent') !== window.env.sessionId,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState({
|
||||||
|
theme,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
mounted,
|
||||||
methods: {
|
methods: {
|
||||||
toggleSidebar,
|
toggleSidebar,
|
||||||
setConsent,
|
setConsent,
|
||||||
|
|
|
@ -113,7 +113,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { nextTick } from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
import FilterBar from '../filters/filter-bar.vue';
|
import FilterBar from '../filters/filter-bar.vue';
|
||||||
import Pagination from '../pagination/pagination.vue';
|
import Pagination from '../pagination/pagination.vue';
|
||||||
|
@ -135,7 +135,7 @@ async function fetchEntity() {
|
||||||
|
|
||||||
this.pageTitle = entity.name;
|
this.pageTitle = entity.name;
|
||||||
|
|
||||||
nextTick(() => {
|
Vue.nextTick(() => {
|
||||||
this.$refs.content.scrollTop = 0;
|
this.$refs.content.scrollTop = 0;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<Tooltip class="filter-container">
|
<v-popover class="filter-container">
|
||||||
<div class="filter">
|
<div class="filter">
|
||||||
<Icon icon="users" />
|
<Icon icon="users" />
|
||||||
|
|
||||||
|
@ -14,48 +14,46 @@
|
||||||
>Actors</div>
|
>Actors</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template v-slot:tooltip>
|
<div slot="popover">
|
||||||
<div>
|
<router-link
|
||||||
<router-link
|
class="filter-clear"
|
||||||
class="filter-clear"
|
:to="{ query: { ...$route.query, actors: undefined } }"
|
||||||
:to="{ query: { ...$route.query, actors: undefined } }"
|
:class="{ active: selectedActors.length > 0 }"
|
||||||
:class="{ active: selectedActors.length > 0 }"
|
>clear all<Icon icon="cross2" /></router-link>
|
||||||
>clear all<Icon icon="cross2" /></router-link>
|
|
||||||
|
|
||||||
<ul class="filter-items nolist">
|
<ul class="filter-items nolist">
|
||||||
<li
|
<li
|
||||||
v-for="actor in availableActors"
|
v-for="actor in availableActors"
|
||||||
:key="actor.id"
|
:key="actor.id"
|
||||||
class="filter-item"
|
class="filter-item"
|
||||||
:class="{ selected: selectedActors.includes(actor.slug) }"
|
:class="{ selected: selectedActors.includes(actor.slug) }"
|
||||||
|
>
|
||||||
|
<router-link
|
||||||
|
:to="{ query: {
|
||||||
|
...$route.query,
|
||||||
|
actors: actor.slug,
|
||||||
|
}, params: { pageNumber: 1 } }"
|
||||||
|
class="filter-name"
|
||||||
|
>{{ actor.name }}</router-link>
|
||||||
|
|
||||||
|
<router-link
|
||||||
|
:to="{ query: { ...$route.query, ...getNewRange(actor) }, params: { pageNumber: 1 } }"
|
||||||
|
class="filter-include"
|
||||||
>
|
>
|
||||||
<router-link
|
<Icon
|
||||||
:to="{ query: {
|
icon="checkmark"
|
||||||
...$route.query,
|
class="filter-add"
|
||||||
actors: actor.slug,
|
/>
|
||||||
}, params: { pageNumber: 1 } }"
|
|
||||||
class="filter-name"
|
|
||||||
>{{ actor.name }}</router-link>
|
|
||||||
|
|
||||||
<router-link
|
<Icon
|
||||||
:to="{ query: { ...$route.query, ...getNewRange(actor) }, params: { pageNumber: 1 } }"
|
icon="cross2"
|
||||||
class="filter-include"
|
class="filter-remove"
|
||||||
>
|
/>
|
||||||
<Icon
|
</router-link>
|
||||||
icon="checkmark"
|
</li>
|
||||||
class="filter-add"
|
</ul>
|
||||||
/>
|
</div>
|
||||||
|
</v-popover>
|
||||||
<Icon
|
|
||||||
icon="cross2"
|
|
||||||
class="filter-remove"
|
|
||||||
/>
|
|
||||||
</router-link>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</Tooltip>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<Tooltip class="filter-container">
|
<v-popover class="filter-container">
|
||||||
<div class="filter">
|
<div class="filter">
|
||||||
<Icon icon="antenna" />
|
<Icon icon="antenna" />
|
||||||
|
|
||||||
|
@ -14,62 +14,60 @@
|
||||||
>Channels</div>
|
>Channels</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template v-slot:popover>
|
<div slot="popover">
|
||||||
<div slot="popover">
|
<router-link
|
||||||
<router-link
|
class="filter-clear"
|
||||||
class="filter-clear"
|
:to="{ query: { ...$route.query, channels: undefined, networks: undefined } }"
|
||||||
:to="{ query: { ...$route.query, channels: undefined, networks: undefined } }"
|
:class="{ active: selectedLength > 0 }"
|
||||||
:class="{ active: selectedLength > 0 }"
|
>clear all<Icon icon="cross2" /></router-link>
|
||||||
>clear all<Icon icon="cross2" /></router-link>
|
|
||||||
|
|
||||||
<ul class="filter-items nolist">
|
<ul class="filter-items nolist">
|
||||||
<li
|
<li
|
||||||
v-for="channel in channelsPerNetwork"
|
v-for="channel in channelsPerNetwork"
|
||||||
:key="`channel-${channel.id}`"
|
:key="`channel-${channel.id}`"
|
||||||
class="filter-item"
|
class="filter-item"
|
||||||
:class="{
|
:class="{
|
||||||
[channel.type]: true,
|
[channel.type]: true,
|
||||||
independent: channel.independent,
|
independent: channel.independent,
|
||||||
selected: channel.type === 'network' ? selectedNetworks.includes(channel.slug) : selectedChannels.includes(channel.slug),
|
selected: channel.type === 'network' ? selectedNetworks.includes(channel.slug) : selectedChannels.includes(channel.slug),
|
||||||
disabled: channel.parent && selectedNetworks.includes(channel.parent.slug),
|
disabled: channel.parent && selectedNetworks.includes(channel.parent.slug),
|
||||||
}"
|
}"
|
||||||
|
>
|
||||||
|
<router-link
|
||||||
|
:to="{ query: {
|
||||||
|
...$route.query,
|
||||||
|
[channel.type === 'network' ? 'networks' : 'channels']: channel.slug,
|
||||||
|
[channel.type === 'network' ? 'channels' : 'networks']: undefined,
|
||||||
|
}, params: { pageNumber: 1 } }"
|
||||||
|
class="filter-name"
|
||||||
>
|
>
|
||||||
<router-link
|
<img
|
||||||
:to="{ query: {
|
v-if="channel.type === 'network' || channel.independent || !channel.parent "
|
||||||
...$route.query,
|
:src="`/img/logos/${channel.slug}/favicon.png`"
|
||||||
[channel.type === 'network' ? 'networks' : 'channels']: channel.slug,
|
class="favicon"
|
||||||
[channel.type === 'network' ? 'channels' : 'networks']: undefined,
|
|
||||||
}, params: { pageNumber: 1 } }"
|
|
||||||
class="filter-name"
|
|
||||||
>
|
>
|
||||||
<img
|
|
||||||
v-if="channel.type === 'network' || channel.independent || !channel.parent "
|
|
||||||
:src="`/img/logos/${channel.slug}/favicon.png`"
|
|
||||||
class="favicon"
|
|
||||||
>
|
|
||||||
|
|
||||||
{{ channel.name }}
|
{{ channel.name }}
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ query: { ...$route.query, ...getNewRange(channel) }, params: { pageNumber: 1 } }"
|
:to="{ query: { ...$route.query, ...getNewRange(channel) }, params: { pageNumber: 1 } }"
|
||||||
class="filter-include"
|
class="filter-include"
|
||||||
>
|
>
|
||||||
<Icon
|
<Icon
|
||||||
icon="checkmark"
|
icon="checkmark"
|
||||||
class="filter-add"
|
class="filter-add"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Icon
|
<Icon
|
||||||
icon="cross2"
|
icon="cross2"
|
||||||
class="filter-remove"
|
class="filter-remove"
|
||||||
/>
|
/>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</v-popover>
|
||||||
</Tooltip>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<Tooltip class="filter-container">
|
<v-popover class="filter-container">
|
||||||
<div class="filter">
|
<div class="filter">
|
||||||
<Icon icon="price-tag4" />
|
<Icon icon="price-tag4" />
|
||||||
|
|
||||||
|
@ -14,54 +14,52 @@
|
||||||
>Tags</div>
|
>Tags</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template v-slot:tooltip>
|
<div slot="popover">
|
||||||
<div>
|
<select
|
||||||
<select
|
v-model="mode"
|
||||||
v-model="mode"
|
class="filter-mode"
|
||||||
class="filter-mode"
|
@change="$router.push({ query: { ...$route.query, mode }, params: { pageNumber: 1 } })"
|
||||||
@change="$router.push({ query: { ...$route.query, mode }, params: { pageNumber: 1 } })"
|
>
|
||||||
|
<option value="all">match all selected</option>
|
||||||
|
<option value="any">match any selected</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<router-link
|
||||||
|
class="filter-clear"
|
||||||
|
:to="{ query: { ...$route.query, tags: undefined, mode: undefined } }"
|
||||||
|
:class="{ active: selectedTags.length > 0 }"
|
||||||
|
>clear all<Icon icon="cross2" /></router-link>
|
||||||
|
|
||||||
|
<ul class="filter-items nolist">
|
||||||
|
<li
|
||||||
|
v-for="tag in availableTags"
|
||||||
|
:key="`tag-${tag.id}`"
|
||||||
|
class="filter-item"
|
||||||
|
:class="{ selected: selectedTags.includes(tag.slug) }"
|
||||||
>
|
>
|
||||||
<option value="all">match all selected</option>
|
<router-link
|
||||||
<option value="any">match any selected</option>
|
:to="{ query: { ...$route.query, tags: tag.slug, mode }, params: { pageNumber: 1 } }"
|
||||||
</select>
|
class="filter-name"
|
||||||
|
>{{ tag.name }}</router-link>
|
||||||
|
|
||||||
<router-link
|
<router-link
|
||||||
class="filter-clear"
|
:to="{ query: { ...$route.query, ...getNewRange(tag.slug), mode }, params: { pageNumber: 1 } }"
|
||||||
:to="{ query: { ...$route.query, tags: undefined, mode: undefined } }"
|
class="filter-include"
|
||||||
:class="{ active: selectedTags.length > 0 }"
|
|
||||||
>clear all<Icon icon="cross2" /></router-link>
|
|
||||||
|
|
||||||
<ul class="filter-items nolist">
|
|
||||||
<li
|
|
||||||
v-for="tag in availableTags"
|
|
||||||
:key="`tag-${tag.id}`"
|
|
||||||
class="filter-item"
|
|
||||||
:class="{ selected: selectedTags.includes(tag.slug) }"
|
|
||||||
>
|
>
|
||||||
<router-link
|
<Icon
|
||||||
:to="{ query: { ...$route.query, tags: tag.slug, mode }, params: { pageNumber: 1 } }"
|
icon="checkmark"
|
||||||
class="filter-name"
|
class="filter-add"
|
||||||
>{{ tag.name }}</router-link>
|
/>
|
||||||
|
|
||||||
<router-link
|
<Icon
|
||||||
:to="{ query: { ...$route.query, ...getNewRange(tag.slug), mode }, params: { pageNumber: 1 } }"
|
icon="cross2"
|
||||||
class="filter-include"
|
class="filter-remove"
|
||||||
>
|
/>
|
||||||
<Icon
|
</router-link>
|
||||||
icon="checkmark"
|
</li>
|
||||||
class="filter-add"
|
</ul>
|
||||||
/>
|
</div>
|
||||||
|
</v-popover>
|
||||||
<Icon
|
|
||||||
icon="cross2"
|
|
||||||
class="filter-remove"
|
|
||||||
/>
|
|
||||||
</router-link>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</Tooltip>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/actors"
|
to="/actors"
|
||||||
custom
|
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
class="nav-link"
|
class="nav-link"
|
||||||
|
@ -32,7 +31,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/networks"
|
to="/networks"
|
||||||
custom
|
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
class="nav-link"
|
class="nav-link"
|
||||||
|
@ -47,7 +45,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/tags"
|
to="/tags"
|
||||||
custom
|
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
class="nav-link"
|
class="nav-link"
|
||||||
|
@ -62,7 +59,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/movies"
|
to="/movies"
|
||||||
custom
|
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
class="nav-link"
|
class="nav-link"
|
||||||
|
@ -82,7 +78,7 @@
|
||||||
@click.stop="toggleSidebar"
|
@click.stop="toggleSidebar"
|
||||||
><Icon icon="menu" /></div>
|
><Icon icon="menu" /></div>
|
||||||
|
|
||||||
<Tooltip>
|
<v-popover>
|
||||||
<div class="header-account">
|
<div class="header-account">
|
||||||
<div class="account">
|
<div class="account">
|
||||||
<Icon
|
<Icon
|
||||||
|
@ -92,68 +88,69 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template v-slot:tooltip>
|
<div
|
||||||
<div class="menu">
|
slot="popover"
|
||||||
<ul class="menu-items noselect">
|
class="menu"
|
||||||
<li class="menu-item disabled">
|
>
|
||||||
<Icon icon="enter2" />Sign in
|
<ul class="menu-items noselect">
|
||||||
</li>
|
<li class="menu-item disabled">
|
||||||
|
<Icon icon="enter2" />Sign in
|
||||||
|
</li>
|
||||||
|
|
||||||
<li
|
<li
|
||||||
v-show="!sfw"
|
v-show="!sfw"
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
@click="setSfw(true)"
|
@click="setSfw(true)"
|
||||||
>
|
>
|
||||||
<Icon
|
<Icon
|
||||||
icon="flower"
|
icon="flower"
|
||||||
class="toggle noselect"
|
class="toggle noselect"
|
||||||
/>Safe mode
|
/>Safe mode
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li
|
<li
|
||||||
v-show="sfw"
|
v-show="sfw"
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
@click="setSfw(false)"
|
@click="setSfw(false)"
|
||||||
>
|
>
|
||||||
<Icon
|
<Icon
|
||||||
icon="fire"
|
icon="fire"
|
||||||
class="toggle noselect"
|
class="toggle noselect"
|
||||||
/>Filth mode
|
/>Filth mode
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li
|
<li
|
||||||
v-show="theme === 'light'"
|
v-show="theme === 'light'"
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
@click="setTheme('dark')"
|
@click="setTheme('dark')"
|
||||||
>
|
>
|
||||||
<Icon
|
<Icon
|
||||||
icon="moon"
|
icon="moon"
|
||||||
class="toggle noselect"
|
class="toggle noselect"
|
||||||
/>Dark theme
|
/>Dark theme
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li
|
<li
|
||||||
v-show="theme === 'dark'"
|
v-show="theme === 'dark'"
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
@click="setTheme('light')"
|
@click="setTheme('light')"
|
||||||
>
|
>
|
||||||
<Icon
|
<Icon
|
||||||
icon="sun"
|
icon="sun"
|
||||||
class="toggle noselect"
|
class="toggle noselect"
|
||||||
/>Light theme
|
/>Light theme
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="menu-item">
|
<li class="menu-item">
|
||||||
<Icon icon="filter" />Filters
|
<Icon icon="filter" />Filters
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</v-popover>
|
||||||
</Tooltip>
|
|
||||||
|
|
||||||
<Search class="search-full" />
|
<Search class="search-full" />
|
||||||
|
|
||||||
<Tooltip
|
<v-popover
|
||||||
class="search-compact"
|
class="search-compact"
|
||||||
:open="searching"
|
:open="searching"
|
||||||
@show="searching = true"
|
@show="searching = true"
|
||||||
|
@ -167,12 +164,12 @@
|
||||||
/></button>
|
/></button>
|
||||||
|
|
||||||
<Search
|
<Search
|
||||||
slot="tooltip"
|
slot="popover"
|
||||||
:searching="searching"
|
:searching="searching"
|
||||||
class="compact"
|
class="compact"
|
||||||
@search="searching = false"
|
@search="searching = false"
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</v-popover>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="media">
|
<div
|
||||||
|
v-lazy-container
|
||||||
|
class="media"
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
v-if="release.trailer || release.teaser"
|
v-if="release.trailer || release.teaser"
|
||||||
class="trailer-container"
|
class="trailer-container"
|
||||||
|
@ -30,9 +33,8 @@
|
||||||
|
|
||||||
<img
|
<img
|
||||||
v-else-if="release.teaser && /^image\//.test(release.teaser.mime)"
|
v-else-if="release.teaser && /^image\//.test(release.teaser.mime)"
|
||||||
:src="sfw ? `/img/${release.teaser.sfw.thumbnail}` : `/media/${release.teaser.path}`"
|
:data-src="sfw ? `/img/${release.teaser.sfw.thumbnail}` : `/media/${release.teaser.path}`"
|
||||||
:alt="release.title"
|
:alt="release.title"
|
||||||
loading="lazy"
|
|
||||||
class="item trailer"
|
class="item trailer"
|
||||||
>
|
>
|
||||||
|
|
||||||
|
@ -63,11 +65,10 @@
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
:src="`/media/${cover.thumbnail}`"
|
:data-src="`/media/${cover.thumbnail}`"
|
||||||
:style="{ background: sfw ? `/media/${cover.sfw.lazy}` : `/media/${cover.lazy}` }"
|
:data-loading="`/media/${cover.lazy}`"
|
||||||
class="item cover"
|
class="item cover"
|
||||||
loading="lazy"
|
@load="$parent.$emit('load')"
|
||||||
@load="$emit('load', $event)"
|
|
||||||
>
|
>
|
||||||
</a>
|
</a>
|
||||||
</template>
|
</template>
|
||||||
|
@ -85,12 +86,11 @@
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
:src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
:data-src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
||||||
:style="{ background: sfw ? `/img/${photo.sfw.lazy}` : `/media/${photo.lazy}` }"
|
:data-loading="sfw ? `/img/${photo.sfw.lazy}` : `/media/${photo.lazy}`"
|
||||||
:alt="`Photo ${photo.index + 1}`"
|
:alt="`Photo ${photo.index + 1}`"
|
||||||
loading="lazy"
|
|
||||||
class="item"
|
class="item"
|
||||||
@load="$emit('load', $event)"
|
@load="$parent.$emit('load')"
|
||||||
>
|
>
|
||||||
|
|
||||||
<span
|
<span
|
||||||
|
@ -139,10 +139,6 @@ export default {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
test: {
|
|
||||||
type: String,
|
|
||||||
default: null,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -163,8 +159,15 @@ export default {
|
||||||
.media {
|
.media {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
overflow-x: auto;
|
||||||
|
scrollbar-width: none;
|
||||||
|
scroll-behavior: smooth;
|
||||||
font-size: 0;
|
font-size: 0;
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
&.expanded {
|
&.expanded {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(32rem, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(32rem, 1fr));
|
||||||
|
@ -246,7 +249,6 @@ export default {
|
||||||
height: 18rem;
|
height: 18rem;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
box-shadow: 0 0 3px var(--shadow-weak);
|
box-shadow: 0 0 3px var(--shadow-weak);
|
||||||
background-size: cover;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.trailer-container {
|
.trailer-container {
|
||||||
|
|
|
@ -11,14 +11,12 @@
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Scroll
|
<Scroll
|
||||||
v-slot="slotProps"
|
|
||||||
class="scroll-light"
|
class="scroll-light"
|
||||||
:expandable="false"
|
:expandable="false"
|
||||||
>
|
>
|
||||||
<Media
|
<Media
|
||||||
:release="release"
|
:release="release"
|
||||||
:class="{ expanded }"
|
:class="{ expanded }"
|
||||||
@load="slotProps.loaded"
|
|
||||||
/>
|
/>
|
||||||
</Scroll>
|
</Scroll>
|
||||||
|
|
||||||
|
@ -58,7 +56,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row associations">
|
<div class="row associations">
|
||||||
<ul class="actors nolist">
|
<ul
|
||||||
|
v-lazy-container="{ selector: '.lazy' }"
|
||||||
|
class="actors nolist"
|
||||||
|
>
|
||||||
<li
|
<li
|
||||||
v-for="actor in release.actors"
|
v-for="actor in release.actors"
|
||||||
:key="actor.id"
|
:key="actor.id"
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
<ul
|
<ul
|
||||||
v-if="releases.length > 0"
|
v-if="releases.length > 0"
|
||||||
:key="sfw"
|
:key="sfw"
|
||||||
|
v-lazy-container="{ selector: '.thumbnail' }"
|
||||||
class="nolist tiles"
|
class="nolist tiles"
|
||||||
>
|
>
|
||||||
<li
|
<li
|
||||||
|
|
|
@ -13,10 +13,10 @@
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
v-if="release.poster"
|
v-if="release.poster"
|
||||||
:src="sfw ? `/img/${release.poster.sfw.thumbnail}` : `/media/${release.poster.thumbnail}`"
|
:data-src="sfw ? `/img/${release.poster.sfw.thumbnail}` : `/media/${release.poster.thumbnail}`"
|
||||||
|
:data-loading="sfw ? `/img/${release.poster.sfw.lazy}` : `/media/${release.poster.lazy}`"
|
||||||
:alt="release.title"
|
:alt="release.title"
|
||||||
class="thumbnail"
|
class="thumbnail"
|
||||||
loading="lazy"
|
|
||||||
>
|
>
|
||||||
|
|
||||||
<span
|
<span
|
||||||
|
@ -26,10 +26,10 @@
|
||||||
<img
|
<img
|
||||||
v-for="cover in release.covers"
|
v-for="cover in release.covers"
|
||||||
:key="cover.id"
|
:key="cover.id"
|
||||||
:src="sfw ? `/img/${cover.sfw.thumbnail}` : `/media/${cover.thumbnail}`"
|
:data-src="sfw ? `/img/${cover.sfw.thumbnail}` : `/media/${cover.thumbnail}`"
|
||||||
|
:data-loading="sfw ? `/img/${cover.sfw.lazy}` : `/media/${cover.lazy}`"
|
||||||
:alt="release.title"
|
:alt="release.title"
|
||||||
class="thumbnail cover"
|
class="thumbnail cover"
|
||||||
loading="lazy"
|
|
||||||
>
|
>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
|
|
@ -22,12 +22,7 @@
|
||||||
@click="scroll('left')"
|
@click="scroll('left')"
|
||||||
><Icon icon="arrow-left3" /></div>
|
><Icon icon="arrow-left3" /></div>
|
||||||
|
|
||||||
<div
|
<slot />
|
||||||
ref="content"
|
|
||||||
class="content"
|
|
||||||
>
|
|
||||||
<slot :loaded="loaded" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-show="enabled && !expanded"
|
v-show="enabled && !expanded"
|
||||||
|
@ -57,35 +52,34 @@
|
||||||
import Expand from '../expand/expand.vue';
|
import Expand from '../expand/expand.vue';
|
||||||
|
|
||||||
function updateScroll() {
|
function updateScroll() {
|
||||||
this.scrollable = this.$refs.content.scrollWidth > this.$refs.content.clientWidth;
|
this.scrollable = this.target.scrollWidth > this.target.clientWidth;
|
||||||
this.scrollAtStart = this.$refs.content.scrollLeft === 0;
|
this.scrollAtStart = this.target.scrollLeft === 0;
|
||||||
this.scrollAtEnd = this.$refs.content.scrollWidth - this.$refs.content.clientWidth === this.$refs.content.scrollLeft;
|
this.scrollAtEnd = this.target.scrollWidth - this.target.clientWidth === this.target.scrollLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
function scroll(direction) {
|
function scroll(direction) {
|
||||||
if (direction === 'right') {
|
if (direction === 'right') {
|
||||||
this.$refs.content.scrollLeft = this.$refs.content.scrollLeft + this.$refs.content.clientWidth - 100;
|
this.target.scrollLeft = this.target.scrollLeft + this.target.clientWidth - 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (direction === 'left') {
|
if (direction === 'left') {
|
||||||
this.$refs.content.scrollLeft = this.$refs.content.scrollLeft - this.$refs.content.clientWidth + 100;
|
this.target.scrollLeft = this.target.scrollLeft - this.target.clientWidth + 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function loaded(_event) {
|
|
||||||
// typically triggered by slotted component when an image loads, affecting scrollWidth
|
|
||||||
this.updateScroll();
|
|
||||||
}
|
|
||||||
|
|
||||||
function mounted() {
|
function mounted() {
|
||||||
this.$refs.content.addEventListener('scroll', () => this.updateScroll());
|
this.target = this.$slots.default[0].elm;
|
||||||
|
|
||||||
|
this.target.addEventListener('scroll', () => this.updateScroll());
|
||||||
window.addEventListener('resize', this.updateScroll);
|
window.addEventListener('resize', this.updateScroll);
|
||||||
|
|
||||||
|
// typically triggered by slotted component when an image loads, affecting scrollWidth
|
||||||
|
this.$on('load', () => this.updateScroll());
|
||||||
this.updateScroll();
|
this.updateScroll();
|
||||||
}
|
}
|
||||||
|
|
||||||
function beforeDestroy() {
|
function beforeDestroy() {
|
||||||
this.$refs.content.removeEventListener('scroll', this.updateScroll);
|
this.target.removeEventListener('scroll', this.updateScroll);
|
||||||
|
|
||||||
window.removeEventListener('resize', this.updateScroll);
|
window.removeEventListener('resize', this.updateScroll);
|
||||||
}
|
}
|
||||||
|
@ -114,6 +108,7 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
target: null,
|
||||||
scrollable: true,
|
scrollable: true,
|
||||||
scrollAtStart: true,
|
scrollAtStart: true,
|
||||||
scrollAtEnd: false,
|
scrollAtEnd: false,
|
||||||
|
@ -124,7 +119,6 @@ export default {
|
||||||
beforeDestroy,
|
beforeDestroy,
|
||||||
methods: {
|
methods: {
|
||||||
scroll,
|
scroll,
|
||||||
loaded,
|
|
||||||
updateScroll,
|
updateScroll,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -149,16 +143,6 @@ export default {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
|
||||||
overflow-x: scroll;
|
|
||||||
scroll-behavior: smooth;
|
|
||||||
scrollbar-width: none;
|
|
||||||
|
|
||||||
&::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.expand-light {
|
.expand-light {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@ -249,14 +233,6 @@ export default {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.scroll-start {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.scroll-end {
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
display: flex;
|
display: flex;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/updates"
|
to="/updates"
|
||||||
custom
|
|
||||||
@click.native="$emit('toggle', false)"
|
@click.native="$emit('toggle', false)"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
@ -56,7 +55,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/actors"
|
to="/actors"
|
||||||
custom
|
|
||||||
@click.native="$emit('toggle', false)"
|
@click.native="$emit('toggle', false)"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
@ -72,7 +70,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/networks"
|
to="/networks"
|
||||||
custom
|
|
||||||
@click.native="$emit('toggle', false)"
|
@click.native="$emit('toggle', false)"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
@ -88,7 +85,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/movies"
|
to="/movies"
|
||||||
custom
|
|
||||||
@click.native="$emit('toggle', false)"
|
@click.native="$emit('toggle', false)"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
@ -104,7 +100,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
v-slot="{ href, isActive, navigate }"
|
v-slot="{ href, isActive, navigate }"
|
||||||
to="/tags"
|
to="/tags"
|
||||||
custom
|
|
||||||
@click.native="$emit('toggle', false)"
|
@click.native="$emit('toggle', false)"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
|
@ -254,7 +249,7 @@ export default {
|
||||||
fill: var(--primary);
|
fill: var(--primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.search) {
|
::v-deep .search {
|
||||||
height: 3rem;
|
height: 3rem;
|
||||||
border-bottom: solid 1px var(--shadow-hint);
|
border-bottom: solid 1px var(--shadow-hint);
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
<div
|
<div
|
||||||
:key="sfw"
|
:key="sfw"
|
||||||
|
v-lazy-container
|
||||||
class="tiles"
|
class="tiles"
|
||||||
>
|
>
|
||||||
<Tag
|
<Tag
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
<img
|
<img
|
||||||
v-if="!lazy && !sfw"
|
v-if="!lazy && !sfw"
|
||||||
:src="`/img/${tag.poster.thumbnail}`"
|
:src="`/img/${tag.poster.thumbnail}`"
|
||||||
:style="{ 'background-image': `url(/img/${tag.poster.lazy})` }"
|
|
||||||
:title="tag.poster.comment"
|
:title="tag.poster.comment"
|
||||||
:alt="tag.name"
|
:alt="tag.name"
|
||||||
class="poster"
|
class="poster"
|
||||||
|
@ -20,7 +19,6 @@
|
||||||
<img
|
<img
|
||||||
v-if="!lazy && sfw"
|
v-if="!lazy && sfw"
|
||||||
:src="`/img/${tag.poster.sfw.thumbnail}`"
|
:src="`/img/${tag.poster.sfw.thumbnail}`"
|
||||||
:style="{ 'background-image': `url(/img/${tag.poster.sfw.lazy})` }"
|
|
||||||
:title="tag.poster.sfw.comment"
|
:title="tag.poster.sfw.comment"
|
||||||
:alt="tag.name"
|
:alt="tag.name"
|
||||||
class="poster"
|
class="poster"
|
||||||
|
@ -28,21 +26,19 @@
|
||||||
|
|
||||||
<img
|
<img
|
||||||
v-if="lazy && !sfw"
|
v-if="lazy && !sfw"
|
||||||
:src="`/img/${tag.poster.thumbnail}`"
|
:data-src="`/img/${tag.poster.thumbnail}`"
|
||||||
:style="{ 'background-image': `url(/img/${tag.poster.lazy})` }"
|
:data-loading="`/img/${tag.poster.lazy}`"
|
||||||
:title="tag.poster.comment"
|
:title="tag.poster.comment"
|
||||||
:alt="tag.name"
|
:alt="tag.name"
|
||||||
loading="lazy"
|
|
||||||
class="poster"
|
class="poster"
|
||||||
>
|
>
|
||||||
|
|
||||||
<img
|
<img
|
||||||
v-if="lazy && sfw"
|
v-if="lazy && sfw"
|
||||||
:src="`/img/${tag.poster.sfw.thumbnail}`"
|
:data-src="`/img/${tag.poster.sfw.thumbnail}`"
|
||||||
:style="{ 'background-image': `url(/img/${tag.poster.sfw.lazy})` }"
|
:data-loading="`/img/${tag.poster.sfw.lazy}`"
|
||||||
:title="tag.poster.sfw.comment"
|
:title="tag.poster.sfw.comment"
|
||||||
:alt="tag.name"
|
:alt="tag.name"
|
||||||
loading="lazy"
|
|
||||||
class="poster"
|
class="poster"
|
||||||
>
|
>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
@ -103,11 +99,7 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
.poster {
|
.poster {
|
||||||
display: inline-block;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 13.5rem;
|
|
||||||
object-fit: cover;
|
|
||||||
background-size: cover;
|
|
||||||
box-shadow: 0 0 3px var(--darken-weak);
|
box-shadow: 0 0 3px var(--darken-weak);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="tooltip-container">
|
|
||||||
<div class="trigger">
|
|
||||||
<slot />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<teleport to="body">
|
|
||||||
<div class="tooltip">
|
|
||||||
<div class="tooltip-wrapper">
|
|
||||||
<slot name="tooltip" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</teleport>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.tooltip-container {
|
|
||||||
position: relative;
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltip-frame {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltip {
|
|
||||||
position: absolute;
|
|
||||||
z-index: 10;
|
|
||||||
top: 2rem;
|
|
||||||
background: var(--background-light);
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -12,9 +12,6 @@ $breakpoint4: 1500px;
|
||||||
--text-dark: #222;
|
--text-dark: #222;
|
||||||
--text-light: #fff;
|
--text-light: #fff;
|
||||||
|
|
||||||
--background-light: #fff;
|
|
||||||
--background-dark: #222;
|
|
||||||
|
|
||||||
--darken: rgba(0, 0, 0, .5);
|
--darken: rgba(0, 0, 0, .5);
|
||||||
--darken-strong: rgba(0, 0, 0, .7);
|
--darken-strong: rgba(0, 0, 0, .7);
|
||||||
--darken-extreme: rgba(0, 0, 0, .9);
|
--darken-extreme: rgba(0, 0, 0, .9);
|
||||||
|
@ -43,7 +40,7 @@ $breakpoint4: 1500px;
|
||||||
--text: #222;
|
--text: #222;
|
||||||
--text-contrast: #fff;
|
--text-contrast: #fff;
|
||||||
|
|
||||||
--background: var(--background-light);
|
--background: #fff;
|
||||||
--background-dim: #fafafa;
|
--background-dim: #fafafa;
|
||||||
--background-soft: #fdfdfd;
|
--background-soft: #fdfdfd;
|
||||||
|
|
||||||
|
@ -74,7 +71,7 @@ $breakpoint4: 1500px;
|
||||||
--text: #fff;
|
--text: #fff;
|
||||||
--text-contrast: #222;
|
--text-contrast: #222;
|
||||||
|
|
||||||
--background: var(--background-dark);
|
--background: #222;
|
||||||
--background-dim: #181818;
|
--background-dim: #181818;
|
||||||
--background-soft: #111;
|
--background-soft: #111;
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,6 @@ body {
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
#container {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nolist {
|
.nolist {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
const EventBus = new Vue();
|
||||||
|
|
||||||
|
export default EventBus;
|
|
@ -1,4 +1,6 @@
|
||||||
import { createApp, reactive } from 'vue';
|
import Vue from 'vue';
|
||||||
|
import VTooltip from 'v-tooltip';
|
||||||
|
import VueLazyLoad from 'vue-lazyload';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
import router from './router';
|
import router from './router';
|
||||||
|
@ -12,11 +14,9 @@ import '../css/style.scss';
|
||||||
import Container from '../components/container/container.vue';
|
import Container from '../components/container/container.vue';
|
||||||
import Icon from '../components/icon/icon.vue';
|
import Icon from '../components/icon/icon.vue';
|
||||||
import Footer from '../components/footer/footer.vue';
|
import Footer from '../components/footer/footer.vue';
|
||||||
import Tooltip from '../components/tooltip/tooltip.vue';
|
|
||||||
|
|
||||||
async function init() {
|
function init() {
|
||||||
const store = initStore(reactive(router));
|
const store = initStore(router);
|
||||||
const app = createApp(Container);
|
|
||||||
|
|
||||||
initUiObservers(store, router);
|
initUiObservers(store, router);
|
||||||
|
|
||||||
|
@ -24,17 +24,10 @@ async function init() {
|
||||||
store.dispatch('setSfw', true);
|
store.dispatch('setSfw', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
app.use(store);
|
Vue.mixin({
|
||||||
app.use(router);
|
|
||||||
|
|
||||||
await router.isReady();
|
|
||||||
|
|
||||||
app.mixin({
|
|
||||||
components: {
|
components: {
|
||||||
Icon,
|
Icon,
|
||||||
Footer,
|
Footer,
|
||||||
Tooltip,
|
|
||||||
'v-popover': Tooltip,
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
pageTitle(title) {
|
pageTitle(title) {
|
||||||
|
@ -54,14 +47,23 @@ async function init() {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
app.directive('tooltip', {
|
Vue.use(VTooltip, {
|
||||||
beforeMount(el, binding) {
|
popover: {
|
||||||
// console.log(binding.modifiers);
|
defaultContainer: '.container',
|
||||||
el.title = binding.value; // eslint-disable-line no-param-reassign
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
Vue.use(VueLazyLoad, {
|
||||||
|
throttleWait: 0,
|
||||||
|
});
|
||||||
|
|
||||||
app.mount('#container');
|
new Vue({ // eslint-disable-line no-new
|
||||||
|
el: '#container',
|
||||||
|
store,
|
||||||
|
router,
|
||||||
|
render(createElement) {
|
||||||
|
return createElement(Container);
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
|
@ -1 +1,14 @@
|
||||||
export default {};
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
function setCache(state, { target, releases }) {
|
||||||
|
Vue.set(state.cache, target, releases);
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteCache(state, target) {
|
||||||
|
Vue.delete(state.cache, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setCache,
|
||||||
|
deleteCache,
|
||||||
|
};
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { createRouter, createWebHistory } from 'vue-router';
|
import Vue from 'vue';
|
||||||
|
import VueRouter from 'vue-router';
|
||||||
|
|
||||||
import Home from '../components/home/home.vue';
|
import Home from '../components/home/home.vue';
|
||||||
import Release from '../components/releases/release.vue';
|
import Release from '../components/releases/release.vue';
|
||||||
|
@ -13,6 +14,8 @@ import Search from '../components/search/search.vue';
|
||||||
import Stats from '../components/stats/stats.vue';
|
import Stats from '../components/stats/stats.vue';
|
||||||
import NotFound from '../components/errors/404.vue';
|
import NotFound from '../components/errors/404.vue';
|
||||||
|
|
||||||
|
Vue.use(VueRouter);
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
|
@ -181,15 +184,15 @@ const routes = [
|
||||||
component: NotFound,
|
component: NotFound,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/:catchAll(.*)',
|
path: '*',
|
||||||
redirect: {
|
redirect: {
|
||||||
name: 'not-found',
|
name: 'not-found',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const router = createRouter({
|
const router = new VueRouter({
|
||||||
history: createWebHistory(),
|
mode: 'history',
|
||||||
routes,
|
routes,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import Vue from 'vue';
|
||||||
import Vuex from 'vuex';
|
import Vuex from 'vuex';
|
||||||
|
|
||||||
import initUiStore from './ui/ui';
|
import initUiStore from './ui/ui';
|
||||||
|
@ -8,6 +9,8 @@ import initActorsStore from './actors/actors';
|
||||||
import initTagsStore from './tags/tags';
|
import initTagsStore from './tags/tags';
|
||||||
|
|
||||||
function initStore(router) {
|
function initStore(router) {
|
||||||
|
Vue.use(Vuex);
|
||||||
|
|
||||||
const store = new Vuex.Store();
|
const store = new Vuex.Store();
|
||||||
|
|
||||||
store.registerModule('ui', initUiStore(store, router));
|
store.registerModule('ui', initUiStore(store, router));
|
||||||
|
|
|
@ -1,13 +1,4 @@
|
||||||
function initUiObservers(store, _router) {
|
function initUiObservers(store, _router) {
|
||||||
const body = document.querySelector('body');
|
|
||||||
|
|
||||||
body.classList.add(store.state.ui.theme);
|
|
||||||
|
|
||||||
store.watch(state => state.ui.theme, (newTheme, oldTheme) => {
|
|
||||||
body.classList.add(newTheme);
|
|
||||||
body.classList.remove(oldTheme);
|
|
||||||
});
|
|
||||||
|
|
||||||
document.addEventListener('keypress', (event) => {
|
document.addEventListener('keypress', (event) => {
|
||||||
if (event.target.tagName === 'INPUT') {
|
if (event.target.tagName === 'INPUT') {
|
||||||
return;
|
return;
|
||||||
|
|
19
package.json
|
@ -43,12 +43,11 @@
|
||||||
"@babel/plugin-proposal-optional-chaining": "^7.8.3",
|
"@babel/plugin-proposal-optional-chaining": "^7.8.3",
|
||||||
"@babel/preset-env": "^7.8.4",
|
"@babel/preset-env": "^7.8.4",
|
||||||
"@babel/register": "^7.8.3",
|
"@babel/register": "^7.8.3",
|
||||||
"@vue/compiler-sfc": "^3.0.4",
|
|
||||||
"autoprefixer": "^9.7.4",
|
"autoprefixer": "^9.7.4",
|
||||||
"babel-eslint": "^10.1.0",
|
"babel-eslint": "^10.1.0",
|
||||||
"babel-loader": "^8.0.6",
|
"babel-loader": "^8.0.6",
|
||||||
"babel-preset-airbnb": "^3.3.2",
|
"babel-preset-airbnb": "^3.3.2",
|
||||||
"css-loader": "^5.0.1",
|
"css-loader": "^2.1.1",
|
||||||
"eslint": "^5.16.0",
|
"eslint": "^5.16.0",
|
||||||
"eslint-config-airbnb": "^17.1.1",
|
"eslint-config-airbnb": "^17.1.1",
|
||||||
"eslint-config-airbnb-base": "^13.2.0",
|
"eslint-config-airbnb-base": "^13.2.0",
|
||||||
|
@ -58,14 +57,15 @@
|
||||||
"eslint-plugin-react": "^7.18.3",
|
"eslint-plugin-react": "^7.18.3",
|
||||||
"eslint-plugin-vue": "^6.2.1",
|
"eslint-plugin-vue": "^6.2.1",
|
||||||
"eslint-watch": "^4.0.2",
|
"eslint-watch": "^4.0.2",
|
||||||
"mini-css-extract-plugin": "^1.3.3",
|
"mini-css-extract-plugin": "^0.7.0",
|
||||||
"node-sass": "^4.13.1",
|
"node-sass": "^4.13.1",
|
||||||
"postcss-loader": "^3.0.0",
|
"postcss-loader": "^3.0.0",
|
||||||
"raw-loader": "^4.0.2",
|
"raw-loader": "^2.0.0",
|
||||||
"sass-loader": "^7.3.1",
|
"sass-loader": "^7.3.1",
|
||||||
"style-loader": "^0.23.1",
|
"style-loader": "^0.23.1",
|
||||||
"vue-loader": "^16.1.2",
|
"vue-loader": "^15.9.0",
|
||||||
"webpack": "^5.11.0",
|
"vue-template-compiler": "^2.6.11",
|
||||||
|
"webpack": "^4.41.6",
|
||||||
"webpack-cli": "^3.3.11"
|
"webpack-cli": "^3.3.11"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -126,9 +126,10 @@
|
||||||
"tunnel": "0.0.6",
|
"tunnel": "0.0.6",
|
||||||
"url-pattern": "^1.0.3",
|
"url-pattern": "^1.0.3",
|
||||||
"v-tooltip": "^2.0.3",
|
"v-tooltip": "^2.0.3",
|
||||||
"vue": "^3.0.4",
|
"vue": "^2.6.11",
|
||||||
"vue-router": "^4.0.1",
|
"vue-lazyload": "^1.3.3",
|
||||||
"vuex": "^4.0.0-rc.2",
|
"vue-router": "^3.1.6",
|
||||||
|
"vuex": "^3.1.2",
|
||||||
"winston": "^3.2.1",
|
"winston": "^3.2.1",
|
||||||
"winston-daily-rotate-file": "^4.4.2",
|
"winston-daily-rotate-file": "^4.4.2",
|
||||||
"yargs": "^13.3.0"
|
"yargs": "^13.3.0"
|
||||||
|
|
Before Width: | Height: | Size: 440 KiB After Width: | Height: | Size: 529 KiB |
After Width: | Height: | Size: 440 KiB |
Before Width: | Height: | Size: 529 KiB |
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 20 KiB |
|
@ -1,6 +1,6 @@
|
||||||
const webpack = require('webpack');
|
const webpack = require('webpack');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const { VueLoaderPlugin } = require('vue-loader');
|
const VueLoaderPlugin = require('vue-loader/lib/plugin');
|
||||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||||
const autoprefixer = require('autoprefixer');
|
const autoprefixer = require('autoprefixer');
|
||||||
|
|
||||||
|
@ -42,13 +42,7 @@ module.exports = {
|
||||||
test: /\.scss$/,
|
test: /\.scss$/,
|
||||||
use: [
|
use: [
|
||||||
MiniCssExtractPlugin.loader,
|
MiniCssExtractPlugin.loader,
|
||||||
{
|
'css-loader?sourceMap',
|
||||||
loader: 'css-loader',
|
|
||||||
options: {
|
|
||||||
sourceMap: true,
|
|
||||||
url: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
loader: 'postcss-loader',
|
loader: 'postcss-loader',
|
||||||
options: {
|
options: {
|
||||||
|
|