Updated tag page layout. Added shoot date property. Showing parent favicon on compact entity page. Re-added 'new' indicator on tile. Added Family Sinner to Mile High Media. Various fixes and improvements.

This commit is contained in:
2020-07-03 01:28:22 +02:00
parent 749864e922
commit 945c2c45ce
81 changed files with 488 additions and 955 deletions

View File

@@ -4,14 +4,14 @@
<ul class="genders nolist">
<li class="gender">
<router-link
:to="{ name: 'actors', params: { gender: 'female', letter } }"
:to="{ name: 'actors', params: { gender: 'female', letter, pageNumber: 1 } }"
:class="{ selected: gender === 'female' }"
class="gender-link female"
><Gender gender="female" /></router-link>
</li>
<li class="gender">
<router-link
:to="{ name: 'actors', params: { gender: 'male', letter } }"
:to="{ name: 'actors', params: { gender: 'male', letter, pageNumber: 1 } }"
:class="{ selected: gender === 'male' }"
class="gender-link male"
replace
@@ -19,7 +19,7 @@
</li>
<li class="gender">
<router-link
:to="{ name: 'actors', params: { gender: 'trans', letter } }"
:to="{ name: 'actors', params: { gender: 'trans', letter, pageNumber: 1 } }"
:class="{ selected: gender === 'trans' }"
class="gender-link transsexual"
replace
@@ -27,7 +27,7 @@
</li>
<li class="gender">
<router-link
:to="{ name: 'actors', params: { gender: 'other', letter } }"
:to="{ name: 'actors', params: { gender: 'other', letter, pageNumber: 1 } }"
:class="{ selected: gender === 'other' }"
class="gender-link other"
replace
@@ -42,7 +42,7 @@
class="letter"
>
<router-link
:to="{ name: 'actors', params: { gender, letter: letterX } }"
:to="{ name: 'actors', params: { gender, letter: letterX, pageNumber: 1 } }"
:class="{ selected: letterX === letter }"
class="letter-link"
replace

View File

@@ -86,5 +86,6 @@ export default {
.content-inner {
flex-grow: 1;
overflow-y: auto;
overflow-x: hidden;
}
</style>

View File

@@ -34,6 +34,8 @@
v-else
class="name"
>{{ entity.name }}</h2>
<Icon icon="share2" />
</a>
<router-link
@@ -47,6 +49,12 @@
:src="`/img/logos/${entity.parent.slug}/thumbs/network.png`"
>
<img
v-if="entity.parent.hasLogo"
class="favicon"
:src="`/img/logos/${entity.parent.slug}/favicon.png`"
>
<h3
v-else
class="name parent-name"
@@ -123,6 +131,7 @@ async function mounted() {
async function route() {
await this.fetchEntity();
this.expanded = false;
}
export default {
@@ -155,35 +164,50 @@ export default {
@import 'theme';
.info {
height: 2.5rem;
display: flex;
justify-content: space-between;
padding: 1rem;
background: var(--profile);
border-bottom: solid 1px var(--lighten-hint);
}
.link {
display: flex;
align-items: center;
text-decoration: none;
flex-grow: 1;
.link {
max-width: 20rem;
display: flex;
align-items: center;
box-sizing: border-box;
padding: 1rem;
text-decoration: none;
}
.link-child {
.icon {
fill: var(--lighten);
margin: 0 0 0 1rem;
}
.link-child {
margin: 0 2rem 0 0;
&:hover .icon {
fill: var(--text-light);
}
}
.link-parent {
flex-direction: row-reverse;
}
.link-parent {
flex-direction: row-reverse;
margin: 0 0 0 2rem;
}
.logo {
height: 100%;
width: 100%;
max-width: 20rem;
max-width: 100%;
object-fit: contain;
object-position: 0 50%;
}
.logo-child {
height: 2.5rem;
}
.logo-parent,
.favicon {
height: 1.5rem;
}
.name {
@@ -191,11 +215,23 @@ export default {
display: flex;
align-items: center;
padding: 0;
margin: 0;
white-space: nowrap;
font-size: 1.5rem;
}
.logo-parent {
object-position: 100% 50%;
.favicon {
display: none;
}
@media(max-width: $breakpoint0) {
.logo-parent,
.link-child .icon {
display: none;
}
.favicon {
display: inline-block;
}
}
</style>

View File

@@ -6,7 +6,7 @@
>
<template v-if="entity.hasLogo">
<img
v-if="entity.type === 'network'"
v-if="entity.type === 'network' || entity.independent"
:src="`/img/logos/${entity.slug}/thumbs/network.png`"
:alt="entity.name"
class="logo"

View File

@@ -1,331 +0,0 @@
<template>
<div
v-if="network"
class="content"
>
<div
class="network"
:class="{ nosites: sites.length === 0 && networks.length === 0 }"
>
<div
v-show="sites.length > 0 || networks.length > 0"
class="sidebar"
:class="{ expanded }"
>
<a
v-tooltip.bottom="`Go to ${network.url}`"
:href="network.url"
target="_blank"
rel="noopener noreferrer"
class="title"
>
<img
:src="`/img/logos/${network.slug}/thumbs/network.png`"
class="logo"
>
</a>
<p
v-if="network.description"
class="description"
>{{ network.description }}</p>
<Sites
v-if="sites.length"
:sites="sites"
:class="{ expanded }"
/>
<div
v-if="networks.length > 0"
class="networks"
>
<Network
v-for="childNetwork in networks"
:key="`network-${childNetwork.id}`"
:network="childNetwork"
/>
</div>
<Network
v-if="network.parent"
:network="network.parent"
class="parent"
/>
</div>
<template v-if="sites.length > 0 || networks.length > 0">
<span
v-show="!expanded"
class="expand expand-sidebar noselect"
@click="expanded = true"
><Icon icon="arrow-right3" /></span>
<span
v-show="expanded"
class="expand expand-sidebar noselect"
@click="expanded = false"
><Icon icon="arrow-left3" /></span>
</template>
<div
class="header"
:class="{ hideable: sites.length > 0 || networks.length > 0 }"
>
<a
v-tooltip.bottom="`Go to ${network.url}`"
:href="network.url"
target="_blank"
rel="noopener noreferrer"
class="title"
>
<img
:src="`/img/logos/${network.slug}/thumbs/network.png`"
class="logo"
>
</a>
</div>
<div class="content-inner">
<FilterBar
:fetch-releases="fetchNetwork"
:items-total="totalCount"
:items-per-page="10"
/>
<template v-if="sites.length > 0 || networks.length > 0">
<span
v-show="expanded"
class="expand collapse-header noselect"
@click="expanded = false"
><Icon icon="arrow-up3" /></span>
<Sites
:sites="sites"
:class="{ expanded }"
class="compact"
/>
<span
v-show="!expanded"
class="expand expand-header noselect"
@click="expanded = true"
><Icon icon="arrow-down3" /></span>
<span
v-show="expanded"
class="expand expand-header noselect"
@click="expanded = false"
><Icon icon="arrow-up3" /></span>
</template>
<Releases :releases="releases" />
</div>
</div>
</div>
</template>
<script>
import FilterBar from '../header/filter-bar.vue';
import Releases from '../releases/releases.vue';
import Sites from '../sites/sites.vue';
import Network from '../tile/network.vue';
async function fetchNetwork() {
const { entity, totalCount } = await this.$store.dispatch('fetchEntityBySlugAndType', {
entitySlug: this.$route.params.networkSlug,
entityType: 'network',
limit: this.limit,
range: this.$route.params.range,
pageNumber: Number(this.$route.params.pageNumber),
});
this.network = entity;
this.networks = this.network.children;
this.releases = this.network.releases;
this.totalCount = totalCount;
}
async function route() {
await this.fetchNetwork();
}
async function mounted() {
await this.fetchNetwork();
this.pageTitle = this.network.name;
}
export default {
components: {
FilterBar,
Releases,
Sites,
Network,
},
data() {
return {
network: null,
sites: [],
networks: [],
studios: [],
releases: [],
totalCount: null,
limit: 10,
pageTitle: null,
expanded: false,
};
},
watch: {
$route: route,
},
mounted,
methods: {
fetchNetwork,
},
};
</script>
<style lang="scss" scoped>
@import 'theme';
.network {
display: flex;
flex-direction: row;
flex-grow: 1;
justify-content: stretch;
overflow-y: auto;
&.nosites {
flex-direction: column;
}
}
.content-inner {
padding: 0;
overflow-y: auto;
}
.releases {
padding: 1rem 1rem 1rem .5rem;
border-top: solid 1px var(--crease);
}
.sidebar {
background: var(--profile);
height: 100%;
width: 18rem;
display: flex;
flex-direction: column;
flex-shrink: 0;
color: var(--text-light);
overflow: hidden;
.title {
display: flex;
justify-content: center;
border-bottom: solid 1px var(--highlight-hint);
}
&.expanded {
width: calc(100% - 25rem);
.logo {
max-width: 18rem;
}
}
}
.networks {
display: grid;
grid-gap: 0 1rem;
flex-grow: 1;
padding: 1rem;
grid-template-columns: 1fr;
grid-template-rows: repeat(auto-fit, 6rem);
overflow-y: auto;
scrollbar-color: var(--highlight-weak) var(--profile);
}
.logo {
width: 100%;
max-height: 8rem;
display: flex;
justify-content: center;
object-fit: contain;
box-sizing: border-box;
padding: 1rem;
filter: var(--logo-highlight);
}
.parent {
display: inline-block;
height: 3rem;
}
.header {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
flex-shrink: 0;
border-bottom: solid 1px var(--shadow-hint);
background: var(--profile);
&.hideable {
display: none;
}
.logo {
max-width: 20rem;
max-height: 3rem;
padding: .5rem;
}
}
.sites.compact {
display: none;
background: var(--profile);
grid-row: 1;
}
.collapse-header {
display: none;
}
@media(max-width: $breakpoint3) {
.header,
.header.hideable {
display: flex;
}
.sites.compact {
display: flex;
&.expanded {
display: grid;
}
}
.expand-header,
.collapse-header {
display: flex;
}
.expand-sidebar,
.collapse-sidebar {
display: none;
}
.network {
flex-direction: column;
}
.sidebar {
display: none;
height: auto;
width: 100%;
overflow: hidden;
}
}
</style>

View File

@@ -144,8 +144,8 @@ export default {
padding: 1rem 0;
}
@media(max-width: $breakpoint) {
.networks {
@media(max-width: $breakpoint0) {
.entity-tiles {
grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
}
}

View File

@@ -1,5 +1,8 @@
<template>
<div class="pagination">
<div
v-if="itemsTotal > 0 || !hideEmpty"
class="pagination"
>
<span
v-show="pageNumber > 1"
class="cursors"
@@ -79,6 +82,10 @@ export default {
type: Number,
default: 10,
},
hideEmpty: {
type: Boolean,
default: true,
},
},
computed: {
pageNumber,

View File

@@ -149,6 +149,10 @@ export default {
scroll-behavior: smooth;
font-size: 0;
&::-webkit-scrollbar {
display: none;
}
&.expanded {
display: flex;
justify-content: center;
@@ -165,10 +169,6 @@ export default {
height: 100%;
}
}
&::-webkit-scrollbar {
display: none;
}
}
.poster-link {
@@ -241,7 +241,7 @@ export default {
height: 18rem;
vertical-align: middle;
object-fit: cover;
box-shadow: 0 0 3px var(--shadow);
box-shadow: 0 0 3px var(--shadow-weak);
}
.trailer-container {

View File

@@ -25,7 +25,6 @@
<div class="tidbits">
<a
v-if="release.date"
v-tooltip.bottom="release.url && `View scene on ${release.entity.name}`"
:title="release.url && `View scene on ${release.entity.name}`"
:href="release.url"
:class="{ link: release.url }"
@@ -35,18 +34,22 @@
>
<span class="showable">{{ formatDate(release.date, 'MMM D, YYYY') }}</span>
<span class="hideable">{{ formatDate(release.date, 'MMMM D, YYYY') }}</span>
<Icon icon="share2" />
<Icon
v-if="release.url"
icon="share2"
/>
</a>
</div>
<div class="site">
<template v-if="release.entity.parent">
<template v-if="release.entity.parent && !release.entity.independent">
<a :href="`/network/${release.entity.parent.slug}`">
<img
:src="`/img/logos/${release.entity.parent.slug}/thumbs/network.png`"
:title="release.entity.parent.name"
:alt="release.entity.parent.name"
class="logo logo-network"
class="logo logo-parent"
>
</a>
@@ -191,14 +194,22 @@
class="link studio"
>{{ release.studio.name }}</router-link>
</div>
<div
v-if="release.productionDate"
class="row-tidbit"
>
<span class="row-label">Production date</span>
{{ formatDate(release.productionDate, 'MMMM D, YYYY') }}
</div>
</div>
<div class="row">
<span class="row-label">Added</span>
<span class="row-label">Indexed</span>
<router-link
:to="`/added/${formatDate(release.dateAdded, 'YYYY/MM/DD')}`"
:title="`Added on ${formatDate(release.dateAdded, 'MMMM D, YYYY')}`"
:to="`/added/${formatDate(release.createdAt, 'YYYY/MM/DD')}`"
:title="`Added on ${formatDate(release.createdAt, 'MMMM D, YYYY HH:mm')}`"
class="link added"
>{{ formatDate(release.createdAt, 'MMMM D, YYYY HH:mm') }}</router-link>
</div>
@@ -207,9 +218,6 @@
</template>
<script>
// import config from 'config';
// import format from 'template-format';
import Media from './media.vue';
import Actor from '../actors/tile.vue';
import Release from './tile.vue';
@@ -273,6 +281,18 @@ export default {
.link {
color: var(--text-light);
.icon {
fill: var(--lighten);
}
&:hover {
color: var(--text-light);
.icon {
fill: var(--text-light);
}
}
}
}
@@ -293,7 +313,7 @@ export default {
.icon {
fill: var(--lighten);
margin: -.2rem 0 0 .5rem;
margin: -.2rem 0 0 .75rem;
}
}
}
@@ -317,7 +337,7 @@ export default {
object-position: 100% 50%;
}
.logo-network {
.logo-parent {
height: 1.5rem;
max-width: 10rem;
object-fit: contain;
@@ -343,7 +363,7 @@ export default {
}
.row {
margin: 0 0 1rem 0;
margin: 0 0 1.5rem 0;
&.associations {
align-items: start;
@@ -364,7 +384,7 @@ export default {
.row-tidbit {
display: inline-block;
margin: 0 1rem 0 0;
margin: 0 2rem 0 0;
}
.title {
@@ -432,7 +452,7 @@ export default {
}
@media(max-width: $breakpoint3) {
.logo-network,
.logo-parent,
.chain {
display: none;
}

View File

@@ -43,7 +43,7 @@
target="_blank"
rel="noopener noreferrer"
class="date"
>{{ formatDate(release.date, 'MMM D, YYYY') }}</a>
>{{ formatDate(release.date, 'MMMM D, YYYY') }}</a>
<a
v-else
@@ -53,7 +53,7 @@
target="_blank"
rel="noopener noreferrer"
class="date"
>{{ `(${formatDate(release.dateAdded, 'MMM D, YYYY')})` }}</a>
>{{ `(${formatDate(release.dateAdded, 'MMMM D, YYYY')})` }}</a>
</span>
</template>

View File

@@ -1,12 +1,12 @@
<template>
<div
:id="`${release.type}-${release.id}`"
:class="{ [release.type]: true }"
:class="{ new: release.isNew }"
class="tile"
>
<span class="poster">
<a
:href="`/${release.type || 'scene'}/${release.id}/${release.slug}`"
:href="`/scene/${release.id}/${release.slug}`"
target="_blank"
rel="noopener noreferrer"
class="link"
@@ -39,13 +39,13 @@
class="thumbnail"
>No thumbnail available</div>
</a>
</span>
<Details :release="release" />
<Details :release="release" />
</span>
<div class="info">
<a
:href="`/${release.type || 'scene'}/${release.id}/${release.slug}`"
:href="`/scene/${release.id}/${release.slug}`"
target="_blank"
rel="noopener noreferrer"
class="row link"
@@ -138,10 +138,23 @@ export default {
overflow: hidden;
box-shadow: 0 0 3px var(--darken-weak);
height: 100%;
&.new .poster::after {
content: 'new';
position: absolute;
top: 0;
right: 0;
padding: .15rem .25rem;
color: var(--text-light);
background: var(--primary);
font-size: .8rem;
font-weight: bold;
}
}
.poster {
position: relative;
margin: 0 0 .6rem 0;
}
.covers {
@@ -167,10 +180,6 @@ export default {
text-shadow: 1px 1px 0 var(--highlight);
}
.details {
margin: 0 0 .6rem 0;
}
.row {
display: flex;
justify-content: space-between;
@@ -193,9 +202,9 @@ export default {
.title {
margin: 0 .25rem .25rem 0;
color: var(--text);
max-height: 2.75rem;
font-size: 1rem;
line-height: 1.5;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}

View File

@@ -77,7 +77,7 @@ function mounted() {
window.addEventListener('resize', this.updateScroll);
this.updateScroll();
setTimeout(() => this.updateScroll(), 500); // allow CSS to calculate
setTimeout(() => this.updateScroll(), 50); // allow CSS to calculate
}
function beforeDestroy() {
@@ -250,9 +250,11 @@ export default {
padding: 1rem .5rem 1rem 2rem;
}
/*
@media(max-width: $breakpoint) {
.scroll-button {
display: none;
}
}
*/
</style>

View File

@@ -1,166 +0,0 @@
<template>
<div
v-if="site"
class="content site"
>
<div class="header">
<a
v-tooltip.bottom="site.url && `Go to ${site.url}`"
:href="site.url"
target="_blank"
rel="noopener noreferrer"
class="link link-site"
>
<img
:src="`/img/logos/${site.network.slug}/${site.slug}.png`"
:title="site.name"
:alt="site.name"
class="logo logo-site"
>
</a>
<ul class="tags nolist">
<li
v-for="tag in site.tags"
:key="`tag-${tag.slug}`"
class="tag"
>{{ tag.name }}</li>
</ul>
<router-link
v-tooltip.bottom="`Go to ${site.network.name} overview`"
:to="{ name: 'network', params: { networkSlug: site.network.slug } }"
class="link link-network"
>
<img
:src="`/img/logos/${site.network.slug}/network.png`"
:title="site.network.name"
:alt="site.network.name"
class="logo logo-network"
>
</router-link>
</div>
<FilterBar
:fetch-releases="fetchSite"
:items-total="totalCount"
:items-per-page="limit"
/>
<div class="content-inner">
<Releases :releases="releases" />
</div>
</div>
</template>
<script>
import FilterBar from '../header/filter-bar.vue';
import Releases from '../releases/releases.vue';
async function fetchSite() {
const { site, releases, totalCount } = await this.$store.dispatch('fetchSiteBySlug', {
siteSlug: this.$route.params.siteSlug,
range: this.$route.params.range,
pageNumber: Number(this.$route.params.pageNumber) || 1,
limit: this.limit,
});
this.site = site;
this.releases = releases;
this.totalCount = totalCount;
}
async function route() {
await this.fetchSite();
}
async function mounted() {
await this.fetchSite();
this.pageTitle = this.site.name;
}
export default {
components: {
FilterBar,
Releases,
},
data() {
return {
site: null,
releases: null,
totalCount: 0,
limit: 10,
pageTitle: null,
};
},
watch: {
$route: route,
},
mounted,
methods: {
fetchSite,
},
};
</script>
<style lang="scss" scoped>
@import 'theme';
.header {
background: $profile;
color: $text-contrast;
display: flex;
align-items: center;
justify-content: space-between;
}
.link {
padding: 1rem;
}
.link-site {
margin: 0 1rem 0 0;
justify-content: flex-start;
.logo {
object-position: 0 0;
}
}
.link-network {
justify-content: flex-end;
.logo {
object-position: 100% 0;
}
}
.logo {
width: 100%;
max-width: 15rem;
max-height: 5rem;
object-fit: contain;
filter: $logo-highlight;
}
.tag {
background: $shadow;
padding: .5rem;
margin: 0 .5rem .5rem 0;
}
@media(max-width: $breakpoint) {
.link {
padding: .5rem 1rem;
}
.logo {
max-height: 2.5rem;
}
.tags {
display: none;
}
}
</style>

View File

@@ -1,95 +0,0 @@
<template>
<div class="sites">
<ul class="nolist tiles">
<li
v-for="site in sites"
:key="`site-${site.id}`"
class="site"
>
<SiteTile :site="site" />
</li>
</ul>
</div>
</template>
<script>
import SiteTile from '../tile/site.vue';
export default {
components: {
SiteTile,
},
props: {
network: {
type: Object,
default: null,
},
sites: {
type: Array,
default: () => [],
},
},
};
</script>
<style lang="scss" scoped>
@import 'theme';
.sites {
overflow: hidden;
display: flex;
flex-grow: 1;
&.compact:not(.expanded) {
flex-direction: row;
.tiles {
display: flex;
overflow-x: auto;
}
.tile {
width: 15rem;
margin: 0 1rem 0 0;
}
}
&.expanded {
.tiles {
grid-template-columns: repeat(auto-fit, minmax(15rem, .5fr));
}
&.compact .tiles {
padding: 0 1rem 1rem 1rem;
}
}
}
.tiles {
display: grid;
grid-gap: 0 1rem;
flex-grow: 1;
padding: 1rem;
grid-template-columns: 1fr;
grid-template-rows: min-content;
overflow-y: auto;
scrollbar-color: $highlight-weak $profile;
}
.site {
/* vertical grid-gap not compatible with bottom padding on scrolling containers */
margin: 0 0 1rem 0;
}
@media(max-width: $breakpoint3) {
.sites.expanded .tiles {
grid-template-columns: repeat(auto-fit, minmax(12rem, .5fr));
}
}
@media(max-width: $breakpoint0) {
.sites.expanded .tiles {
grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
}
}
</style>

View File

@@ -1,104 +1,105 @@
<template>
<div class="photos">
<ul class="nolist photos-inner">
<li>
<a
v-if="tag.poster"
:href="`/img/${poster.path}`"
:title="poster.comment"
target="_blank"
rel="noopener noreferrer"
class="photo-link"
>
<img
:src="`/img/${poster.thumbnail}`"
:alt="tag.poster.comment"
class="poster"
>
</a>
</li>
<div class="photos">
<a
v-if="tag.poster"
:href="`/img/${poster.path}`"
:title="poster.comment"
target="_blank"
rel="noopener noreferrer"
class="photo-link"
>
<img
:src="`/img/${poster.thumbnail}`"
:alt="tag.poster.comment"
class="poster"
>
</a>
<li
v-for="photo in photos"
:key="`photo-${photo.id}`"
>
<a
:title="photo.comment"
:href="`/img/${photo.path}`"
target="_blank"
rel="noopener noreferrer"
class="photo-link"
>
<img
:src="`/img/${photo.thumbnail}`"
:alt="photo.comment"
class="photo"
>
</a>
</li>
</ul>
</div>
<a
v-for="photo in photos"
:key="`photo-${photo.id}`"
:title="photo.comment"
:href="`/img/${photo.path}`"
target="_blank"
rel="noopener noreferrer"
class="photo-link"
>
<img
:src="`/img/${photo.thumbnail}`"
:alt="photo.comment"
class="photo"
>
</a>
</div>
</template>
<script>
function poster() {
if (this.$store.state.ui.sfw) {
return this.tag.poster.sfw;
}
if (this.$store.state.ui.sfw) {
return this.tag.poster.sfw;
}
return this.tag.poster;
return this.tag.poster;
}
function photos() {
if (this.$store.state.ui.sfw) {
return this.tag.photos.map(photo => photo.sfw);
}
if (this.$store.state.ui.sfw) {
return this.tag.photos.map(photo => photo.sfw);
}
return this.tag.photos;
return this.tag.photos;
}
export default {
props: {
tag: {
type: Object,
default: null,
},
},
computed: {
poster,
photos,
},
props: {
tag: {
type: Object,
default: null,
},
},
computed: {
poster,
photos,
},
};
</script>
<style lang="scss" scoped>
@import 'theme';
.photos {
background: $profile;
display: flex;
padding: 0 1rem;
overflow: hidden;
width: 100%;
padding: 1rem 1rem 0 1rem;
box-sizing: border-box;
overflow-x: auto;
white-space: nowrap;
scrollbar-width: none;
scroll-behavior: smooth;
font-size: 0;
&.compact {
&::-webkit-scrollbar {
display: none;
padding: 0 1rem 0 1rem;
overflow-x: auto;
.photos-inner {
flex-shrink: 0;
}
.photo-link {
display: inline-block;
margin: 0 .5rem 0 0;
}
}
&.expanded {
display: flex;
justify-content: center;
flex-wrap: wrap;
padding: 0 1rem;
.poster,
.photo {
height: 18rem;
margin: 0 .5rem .5rem 0;
}
}
}
.photo-link:not(:last-child) {
margin: 0 .5rem 0 0;
}
.poster,
.photo {
width: 100%;
margin: 0 0 .5rem 0;
height: 15rem;
box-shadow: 0 0 3px var(--shadow-weak);
}
</style>

View File

@@ -13,41 +13,26 @@
{{ tag.name }}
</h2>
<p
<div
v-if="description"
class="description header-description"
v-html="description"
/>
</div>
<div class="sidebar">
<h2 class="title">
<Icon icon="price-tag4" />
{{ tag.name }}
</h2>
<div class="sidebar-content">
<p
v-if="description"
class="description"
v-html="description"
/>
<Photos
v-if="hasMedia"
:tag="tag"
/>
</div>
</div>
<Scroll
v-if="hasMedia"
:expanded="expanded"
class="scroll-light"
@expand="(state) => expanded = state"
>
<Photos
:tag="tag"
:class="{ expanded }"
/>
</Scroll>
<div class="content-inner">
<Photos
v-if="hasMedia"
:tag="tag"
class="compact"
/>
<FilterBar :fetch-releases="fetchReleases" />
<Releases :releases="tag.releases" />
</div>
@@ -64,6 +49,7 @@ import escapeHtml from '../../../src/utils/escape-html';
import FilterBar from '../header/filter-bar.vue';
import Photos from './photos.vue';
import Releases from '../releases/releases.vue';
import Scroll from '../scroll/scroll.vue';
const converter = new Converter();
@@ -89,8 +75,9 @@ async function mounted() {
export default {
components: {
FilterBar,
Photos,
Releases,
Photos,
Scroll,
},
data() {
return {
@@ -99,6 +86,7 @@ export default {
releases: null,
pageTitle: null,
hasMedia: false,
expanded: false,
};
},
watch: {
@@ -133,71 +121,14 @@ export default {
<style lang="scss" scoped>
@import 'theme';
.tag {
display: flex;
flex-grow: 1;
overflow: hidden;
&.nomedia {
flex-direction: column;
.sidebar {
display: none;
}
.header {
display: flex;
}
}
}
.content-inner {
padding: 0;
overflow-y: auto;
}
.header {
background: var(--profile);
color: var(--text-light);
display: none;
justify-content: space-between;
padding: .5rem 1rem;
.title {
margin: 0 2rem 0 0;
}
}
.sidebar {
background: var(--profile);
color: var(--text-light);
display: flex;
flex-direction: column;
flex-shrink: 0;
width: 25rem;
box-sizing: border-box;
overflow: hidden;
.title {
padding: 1rem;
}
.description {
padding: 0 1rem;
margin: -1rem 0 0 0;
}
&.empty {
display: none;
}
}
.sidebar-content {
overflow-y: auto;
}
.title {
padding: 0;
padding: 1rem;
margin: 0;
flex-shrink: 0;
text-transform: capitalize;
@@ -210,33 +141,11 @@ export default {
}
.description {
margin: 0;
padding: 0 1rem 1rem 1rem;
line-height: 1.5;
}
.releases {
padding: 1rem;
}
.dark .sidebar {
border-right: solid 1px var(--shadow-hint);
}
@media(max-width: $breakpoint3) {
.tag {
flex-direction: column;
}
.sidebar {
display: none;
}
.header {
display: flex;
}
.photos.compact {
display: flex;
}
}
</style>