Hiding header nav bar on small screens. Improved scene and movie tile scaling, added thumbnail placeholder. Added pagination to movies page.

This commit is contained in:
DebaucheryLibrarian 2024-03-17 23:55:36 +01:00
parent da5e02be3d
commit c7f8391e43
5 changed files with 120 additions and 62 deletions

View File

@ -218,6 +218,7 @@ async function logout() {
box-shadow: inset 0 0 3px var(--shadow-weak-40); box-shadow: inset 0 0 3px var(--shadow-weak-40);
.input { .input {
width: 14rem;
padding: .5rem 0 .5rem 1rem; padding: .5rem 0 .5rem 1rem;
border: none; border: none;
margin: 0; margin: 0;
@ -317,4 +318,16 @@ async function logout() {
fill: var(--error); fill: var(--error);
} }
} }
@media(--small) {
.search .input {
width: 10rem;
}
}
@media(--small-10) {
.nav-list {
display: none;
}
}
</style> </style>

View File

@ -3,7 +3,7 @@
<div <div
v-if="currentPage === pageTotal && total > env.maxMatches" v-if="currentPage === pageTotal && total > env.maxMatches"
class="more" class="more"
>Results are truncated, apply a filter to find more.</div> >Can't find what you're looking for? Narrow down the results using a filter.</div>
<nav class="pagination"> <nav class="pagination">
<ul class="pages nolist"> <ul class="pages nolist">

View File

@ -293,7 +293,7 @@ function updateFilter(prop, value, reload = true) {
.scenes { .scenes {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(22rem, 1fr)); grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
gap: .75rem .5rem; gap: .75rem .5rem;
padding: .5rem 1rem 1rem 1rem; padding: .5rem 1rem 1rem 1rem;
} }
@ -330,4 +330,16 @@ function updateFilter(prop, value, reload = true) {
display: flex; display: flex;
} }
} }
@media(--small-10) {
.scenes {
grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
}
}
@media(--small-20) {
.scenes {
grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
}
}
</style> </style>

View File

@ -18,6 +18,11 @@
loading="lazy" loading="lazy"
class="thumbnail" class="thumbnail"
> >
<Icon
v-else
icon="clapboard"
/>
</Link> </Link>
<Icon <Icon
@ -166,19 +171,31 @@ async function unstash() {
.poster-container { .poster-container {
position: relative; position: relative;
overflow: hidden;
font-size: 0;
} }
.poster { .poster {
display: block; display: flex;
height: 14rem; justify-content: center;
align-items: center;
aspect-ratio: 16/9;
border-radius: .25rem .25rem 0 0; border-radius: .25rem .25rem 0 0;
overflow: hidden; overflow: hidden;
background: var(--background-dark-20);
.icon {
width: 3rem;
height: 3rem;
fill: var(--shadow-weak-40);
}
} }
.thumbnail { .thumbnail {
height: 100%;
width: 100%; width: 100%;
height: 100%;
object-fit: cover; object-fit: cover;
object-position: 50% 50%;
background-size: cover; background-size: cover;
background-position: center; background-position: center;
} }

View File

@ -79,69 +79,73 @@
> >
</a> </a>
<div class="tile-meta"> <div class="tile-info">
<div class="channel"> <div class="tile-meta">
<Link <div class="channel">
:href="movie.channel.isIndependent || !movie.network ? `/${movie.channel.type}/${movie.channel.slug}` : `/${movie.network.type}/${movie.network.slug}`" <Link
class="favicon-link" :href="movie.channel.isIndependent || !movie.network ? `/${movie.channel.type}/${movie.channel.slug}` : `/${movie.network.type}/${movie.network.slug}`"
> class="favicon-link"
<img
:src="movie.channel.isIndependent || !movie.network ? `/logos/${movie.channel.slug}/favicon.png` : `/logos/${movie.network.slug}/favicon.png`"
class="favicon"
> >
</Link> <img
:src="movie.channel.isIndependent || !movie.network ? `/logos/${movie.channel.slug}/favicon.png` : `/logos/${movie.network.slug}/favicon.png`"
class="favicon"
>
</Link>
<Link <Link
:href="`/${movie.channel.type}/${movie.channel.slug}`" :href="`/${movie.channel.type}/${movie.channel.slug}`"
class="nolink channel-link" class="nolink channel-link"
>{{ movie.channel.name }}</Link> >{{ movie.channel.name }}</Link>
</div>
<time
:datetime="movie.effectiveDate.toISOString()"
class="date"
:class="{ nodate: !movie.date }"
>{{ format(movie.effectiveDate, movie.effectiveDate.getFullYear() === currentYear ? 'MMM d' : 'MMM d, y') }}</time>
</div> </div>
<time <a
:datetime="movie.effectiveDate.toISOString()" :href="`/movie/${movie.id}/${movie.slug}`"
class="date" :title="movie.title"
:class="{ nodate: !movie.date }" class="title nolink"
>{{ format(movie.effectiveDate, movie.effectiveDate.getFullYear() === currentYear ? 'MMM d' : 'MMM d, y') }}</time> >{{ movie.title }}</a>
<ul
:title="movie.actors.map((actor) => actor.name).join(', ')"
class="actors nolist"
>
<li
v-for="actor in movie.actors"
:key="`actor-${movie.id}-${actor.slug}`"
class="actor-item"
>
<a
:href="`/actor/${actor.id}/${actor.slug}`"
class="actor nolink"
>{{ actor.name }}</a>
</li>
</ul>
<ul
:title="movie.tags.map((tag) => tag.name).join(', ')"
class="tags nolist"
>
<li
v-for="tag in movie.tags"
:key="`tag-${movie.id}-${tag.slug}`"
>
<a
:href="`/tag/${tag.slug}`"
class="tag nolink"
>{{ tag.name }}</a>
</li>
</ul>
</div> </div>
<a
:href="`/movie/${movie.id}/${movie.slug}`"
:title="movie.title"
class="title nolink"
>{{ movie.title }}</a>
<ul
:title="movie.actors.map((actor) => actor.name).join(', ')"
class="actors nolist"
>
<li
v-for="actor in movie.actors"
:key="`actor-${movie.id}-${actor.slug}`"
class="actor-item"
>
<a
:href="`/actor/${actor.id}/${actor.slug}`"
class="actor nolink"
>{{ actor.name }}</a>
</li>
</ul>
<ul
:title="movie.tags.map((tag) => tag.name).join(', ')"
class="tags nolist"
>
<li
v-for="tag in movie.tags"
:key="`tag-${movie.id}-${tag.slug}`"
>
<a
:href="`/tag/${tag.slug}`"
class="tag nolink"
>{{ tag.name }}</a>
</li>
</ul>
</li> </li>
</ul> </ul>
<Pagination />
</div> </div>
</div> </div>
</template> </template>
@ -160,6 +164,7 @@ import Filters from '#/components/filters/filters.vue';
import ActorsFilter from '#/components/filters/actors.vue'; import ActorsFilter from '#/components/filters/actors.vue';
import TagsFilter from '#/components/filters/tags.vue'; import TagsFilter from '#/components/filters/tags.vue';
import ChannelsFilter from '#/components/filters/channels.vue'; import ChannelsFilter from '#/components/filters/channels.vue';
import Pagination from '#/components/pagination/pagination.vue';
const pageContext = inject('pageContext'); const pageContext = inject('pageContext');
const { pageProps, routeParams, urlParsed } = pageContext; const { pageProps, routeParams, urlParsed } = pageContext;
@ -312,7 +317,6 @@ function updateFilter(prop, value, reload = true) {
} }
.movie { .movie {
max-height: 30rem;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
box-shadow: 0 0 3px var(--shadow-weak-30); box-shadow: 0 0 3px var(--shadow-weak-30);
@ -347,6 +351,11 @@ function updateFilter(prop, value, reload = true) {
opacity: .1; opacity: .1;
} }
.tile-info {
flex-shrink: 0;
font-size: 0;
}
.tile-meta { .tile-meta {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -399,6 +408,7 @@ function updateFilter(prop, value, reload = true) {
font-weight: bold; font-weight: bold;
padding: 0 .5rem; padding: 0 .5rem;
margin-bottom: .25rem; margin-bottom: .25rem;
font-size: 1rem;
} }
.actors { .actors {
@ -441,4 +451,10 @@ function updateFilter(prop, value, reload = true) {
color: var(--primary); color: var(--primary);
} }
} }
@media(--compact) {
.movies {
grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
}
}
</style> </style>