forked from DebaucheryLibrarian/traxxx
Added rudimentary timeline to display tag chapters.
This commit is contained in:
parent
1fb7d384fb
commit
398161b03b
|
@ -1,5 +1,26 @@
|
|||
<template>
|
||||
<ul class="chapters nolist">
|
||||
<div
|
||||
v-if="timeline"
|
||||
class="timeline"
|
||||
>
|
||||
<ul class="timeline-items nolist">
|
||||
<li
|
||||
v-for="chapter in timeline"
|
||||
:key="`chapter-${chapter.id}`"
|
||||
:style="{ left: `${(chapter.time / duration) * 100}%` }"
|
||||
:title="formatDuration(chapter.time)"
|
||||
class="timeline-item"
|
||||
><router-link
|
||||
:to="`/tag/${chapter.tags[0].slug}`"
|
||||
class="link"
|
||||
>{{ chapter.tags[0]?.name || ' ' }}</router-link></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<ul
|
||||
v-else
|
||||
class="chapters nolist"
|
||||
>
|
||||
<li
|
||||
v-for="chapter in chapters"
|
||||
:key="`chapter-${chapter.id}`"
|
||||
|
@ -55,6 +76,14 @@
|
|||
<script>
|
||||
import Tags from './tags.vue';
|
||||
|
||||
function timeline() {
|
||||
if (this.chapters.every(chapter => chapter.time)) {
|
||||
return this.chapters.filter(chapter => chapter.tags?.length > 0);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Tags,
|
||||
|
@ -65,6 +94,16 @@ export default {
|
|||
default: () => [],
|
||||
},
|
||||
},
|
||||
data() {
|
||||
const lastChapter = this.chapters[this.chapters.length - 1];
|
||||
|
||||
return {
|
||||
duration: lastChapter.time + lastChapter.duration,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
timeline,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
|
@ -153,6 +192,41 @@ export default {
|
|||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.timeline-items {
|
||||
position: relative;
|
||||
height: 5rem;
|
||||
border-bottom: solid 1px var(--shadow-weak);
|
||||
}
|
||||
|
||||
.timeline-item {
|
||||
position: absolute;
|
||||
bottom: -.25rem;
|
||||
padding: .1rem .5rem;
|
||||
border-radius: .6rem;
|
||||
color: var(--primary);
|
||||
background: var(--background);
|
||||
transform: rotate(-60deg);
|
||||
transform-origin: 0 50%;
|
||||
box-shadow: 0 0 3px var(--shadow-weak);
|
||||
font-size: .8rem;
|
||||
font-weight: bold;
|
||||
|
||||
.link {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
&:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
width: 1rem;
|
||||
height: 2px;
|
||||
position: absolute;
|
||||
left: calc(-1rem + 1px);
|
||||
margin: .3rem .5rem 0 0;
|
||||
background: var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $breakpoint-micro) {
|
||||
.chapters {
|
||||
grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
|
||||
|
|
|
@ -169,6 +169,10 @@ const tags = [
|
|||
group: 'oral',
|
||||
priority: 6,
|
||||
},
|
||||
{
|
||||
name: 'ass worship',
|
||||
slug: 'ass-worship',
|
||||
},
|
||||
{
|
||||
name: 'ball licking',
|
||||
slug: 'ball-licking',
|
||||
|
@ -494,6 +498,10 @@ const tags = [
|
|||
name: 'gag',
|
||||
slug: 'gag',
|
||||
},
|
||||
{
|
||||
name: 'gagging',
|
||||
slug: 'gagging',
|
||||
},
|
||||
{
|
||||
name: 'gangbang',
|
||||
slug: 'gangbang',
|
||||
|
@ -785,6 +793,10 @@ const tags = [
|
|||
slug: 'schoolgirl',
|
||||
group: 'roleplay',
|
||||
},
|
||||
{
|
||||
name: 'sex',
|
||||
slug: 'sex',
|
||||
},
|
||||
{
|
||||
name: 'shaved',
|
||||
slug: 'shaved',
|
||||
|
@ -1670,6 +1682,10 @@ const aliases = [
|
|||
name: 'prolapsing',
|
||||
for: 'anal-prolapse',
|
||||
},
|
||||
{
|
||||
name: 'pussy fingering',
|
||||
for: 'fingering',
|
||||
},
|
||||
{
|
||||
name: 'raven',
|
||||
for: 'black-hair',
|
||||
|
@ -1777,6 +1793,11 @@ const aliases = [
|
|||
for: 'mfm',
|
||||
secondary: true,
|
||||
},
|
||||
{
|
||||
name: 'spoon',
|
||||
for: 'spooning',
|
||||
secondary: true,
|
||||
},
|
||||
{
|
||||
name: 'sex toy',
|
||||
for: 'toys',
|
||||
|
|
Loading…
Reference in New Issue