Added compact sidebar. Added tag sections and posters.

This commit is contained in:
ThePendulum 2020-03-25 02:48:54 +01:00
parent d724f96728
commit 15a386ad05
48 changed files with 466 additions and 119 deletions

View File

@ -16,6 +16,7 @@
"tabWidth": 4, "tabWidth": 4,
"ignoreUrls": true "ignoreUrls": true
}], }],
"vue/no-v-html" 0: ,
"vue/html-indent": ["error", 4], "vue/html-indent": ["error", 4],
"vue/multiline-html-element-content-newline": 0, "vue/multiline-html-element-content-newline": 0,
"vue/singleline-html-element-content-newline": 0, "vue/singleline-html-element-content-newline": 0,

View File

@ -3,7 +3,12 @@
class="container" class="container"
:class="theme" :class="theme"
> >
<Header /> <Sidebar
v-if="showSidebar"
:toggle-sidebar="toggleSidebar"
/>
<Header :toggle-sidebar="toggleSidebar" />
<div class="content"> <div class="content">
<!-- key forces rerender when new and old path use same component --> <!-- key forces rerender when new and old path use same component -->
@ -15,21 +20,45 @@
<script> <script>
import { mapState } from 'vuex'; import { mapState } from 'vuex';
import EventBus from '../../js/event-bus';
import Header from '../header/header.vue'; import Header from '../header/header.vue';
import Sidebar from '../sidebar/sidebar.vue';
function theme(state) { function theme(state) {
return state.ui.theme; return state.ui.theme;
} }
function toggleSidebar(state) {
this.showSidebar = typeof state === 'boolean' ? state : !this.showSidebar;
}
function mounted() {
document.addEventListener('click', () => {
EventBus.$emit('blur');
this.showSidebar = false;
});
}
export default { export default {
components: { components: {
Header, Header,
Sidebar,
},
data() {
return {
showSidebar: false,
};
}, },
computed: { computed: {
...mapState({ ...mapState({
theme, theme,
}), }),
}, },
mounted,
methods: {
toggleSidebar,
},
}; };
</script> </script>
@ -37,11 +66,12 @@ export default {
@import 'theme'; @import 'theme';
.container { .container {
background: var(--background-dim); position: relative;
height: 100%; height: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
overflow: hidden; overflow: hidden;
background: var(--background-dim);
} }
.content { .content {

View File

@ -1,6 +1,12 @@
<template> <template>
<header class="header"> <header class="header">
<div class="header-nav"> <div class="header-nav">
<Icon
icon="menu"
class="sidebar-toggle"
@click.native.stop="toggleSidebar"
/>
<router-link <router-link
to="/home" to="/home"
class="logo-link" class="logo-link"
@ -8,11 +14,6 @@
<Icon <Icon
icon="logo" icon="logo"
/> />
<Icon
icon="logo_t"
class="logo-compact"
/>
</h1></router-link> </h1></router-link>
<nav class="nav"> <nav class="nav">
@ -148,6 +149,12 @@ export default {
components: { components: {
Search, Search,
}, },
props: {
toggleSidebar: {
type: Function,
default: null,
},
},
data() { data() {
return { return {
searching: false, searching: false,
@ -170,6 +177,7 @@ export default {
@import 'theme'; @import 'theme';
.header { .header {
height: 3rem;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
@ -182,6 +190,7 @@ export default {
.header-nav { .header-nav {
display: flex; display: flex;
align-items: center; align-items: center;
height: 100%;
} }
.header-section { .header-section {
@ -191,6 +200,19 @@ export default {
flex-direction: row; flex-direction: row;
} }
.sidebar-toggle {
display: none;
fill: var(--shadow);
padding: 0 1rem;
width: 1.75rem;
height: 100%;
&:hover {
fill: var(--primary);
cursor: pointer;
}
}
.logo-link { .logo-link {
color: inherit; color: inherit;
display: inline-block; display: inline-block;
@ -198,18 +220,15 @@ export default {
} }
.logo { .logo {
height: 100%;
display: inline-block; display: inline-block;
padding: .75rem 0 .75rem 1rem; padding: 0 0 0 1rem;
margin: 0 1rem 0 0; margin: 0 1rem 0 0;
.icon { .icon {
width: 6rem; width: 6rem;
height: 1.5rem; height: 1.5rem;
} }
.logo-compact {
display: none;
}
} }
.nav { .nav {
@ -264,21 +283,29 @@ export default {
} }
} }
.search-compact {
display: none;
height: 100%;
}
.search-button { .search-button {
height: 100%; height: 100%;
padding: 0 1rem; padding: .25rem 1rem 0 1rem;
background: none; background: none;
border: none; border: none;
outline: none; outline: none;
margin: .2rem 0 0 0;
.icon { .icon {
fill: var(--shadow); fill: var(--shadow);
} }
}
.search-compact { &:hover {
display: none; cursor: pointer;
.icon {
fill: var(--shadow-strong);
}
}
} }
@media(max-width: $breakpoint2) { @media(max-width: $breakpoint2) {
@ -289,33 +316,19 @@ export default {
.search-compact { .search-compact {
display: flex; display: flex;
} }
.header-toggles {
margin: 0;
}
} }
@media(max-width: $breakpoint0) { @media(max-width: $breakpoint0) {
.nav-label { .nav {
display: none; display: none;
} }
.nav .nolist { .sidebar-toggle {
display: flex; display: inline-block;
}
.nav,
.nav-item {
flex-grow: 1;
}
.logo {
margin: 0 .5rem 0 0;
.icon {
display: none;
}
.icon.logo-compact {
width: 1.5rem;
display: inline-block;
}
} }
} }
</style> </style>

View File

@ -0,0 +1,197 @@
<template>
<div
class="sidebar"
@click.stop
>
<div class="sidebar-header">
<Icon
icon="cross"
class="sidebar-close"
@click.native="toggleSidebar(false)"
/>
<router-link
to="/home"
class="logo-link"
@click.native="toggleSidebar(false)"
>
<h1 class="sidebar-logo">
<div
class="logo logo-primary"
v-html="logoPrimary"
/>
<div
class="logo logo-light"
v-html="logoLight"
/>
</h1>
</router-link>
</div>
<nav class="nav">
<ul class="nolist">
<li class="nav-item">
<router-link
v-slot="{ href, isActive, navigate }"
to="/actors"
@click.native="toggleSidebar(false)"
>
<a
class="nav-link"
:href="href"
:class="{ active: isActive }"
@click="navigate"
>Actors</a>
</router-link>
</li>
<li class="nav-item">
<router-link
v-slot="{ href, isActive, navigate }"
to="/networks"
@click.native="toggleSidebar(false)"
>
<a
class="nav-link"
:href="href"
:class="{ active: isActive }"
@click="navigate"
>Networks</a>
</router-link>
</li>
<li class="nav-item">
<router-link
v-slot="{ href, isActive, navigate }"
to="/tags"
@click.native="toggleSidebar(false)"
>
<a
class="nav-link"
:href="href"
:class="{ active: isActive }"
@click="navigate"
>Tags</a>
</router-link>
</li>
</ul>
</nav>
</div>
</template>
<script>
import logoPrimary from '../../img/logo.svg';
import logoLight from '../../img/logo-light.svg';
export default {
props: {
toggleSidebar: {
type: Function,
default: null,
},
},
data() {
return {
logoPrimary,
logoLight,
};
}
};
</script>
<style lang="scss" scoped>
.sidebar {
display: flex;
flex-direction: column;
width: 15rem;
height: 100%;
position: absolute;
z-index: 10;
color: var(--text-light);
background: var(--primary);
box-shadow: 0 0 3px var(--darken);
}
.sidebar-header {
display: flex;
justify-content: space-between;
height: 3rem;
border-bottom: solid 1px var(--shadow-hint);
margin: 0 0 .5rem 0;
}
.sidebar-close {
width: 1.25rem;
height: 100%;
padding: 0 1.25rem;
fill: var(--lighten);
&:hover {
fill: var(--text-light);
cursor: pointer;
}
}
.sidebar-logo {
height: 100%;
display: flex;
align-items: center;
margin: 0;
}
.logo-link {
display: block;
height: 100%;
padding: 0 1rem;
}
.logo {
width: 6rem;
display: flex;
align-items: center;
margin: 0;
}
.logo-primary {
display: none;
}
.nav-item {
display: block;
}
.nav-link {
color: var(--lighten-strong);
display: block;
padding: 1rem;
text-decoration: none;
font-weight: bold;
&:hover,
&.active {
background: var(--shadow-hint);
}
&.active {
color: var(--text-light);
}
}
.dark .sidebar {
background: var(--profile);
.nav-link.active {
color: var(--primary);
background: var(--shadow-hint);
}
.logo-primary {
display: flex;
}
.logo-light {
display: none;
}
}
</style>

View File

@ -1,11 +1,18 @@
<template> <template>
<div class="tags"> <div class="tags">
<div class="tiles"> <div
<Tag v-for="(tags, category) in categories"
v-for="tag in popularTags" :key="category"
:key="`tag-${tag.id}`" >
:tag="tag" <h3 class="heading">{{ category }}</h3>
/>
<div class="tiles">
<Tag
v-for="tag in tags"
:key="`tag-${tag.id}`"
:tag="tag"
/>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -14,63 +21,76 @@
import Tag from '../tile/tag.vue'; import Tag from '../tile/tag.vue';
async function mounted() { async function mounted() {
const tags = await this.$store.dispatch('fetchTags', { const tagSlugsByCategory = {
slugs: [ popular: [
'airtight',
'anal', 'anal',
'asian',
'blonde',
'blowjob',
'brunette',
'caucasian',
'creampie',
'deepthroat',
'double-penetration',
'ebony',
'facefucking',
'facial',
'gangbang',
'interracial',
'latina',
'lesbian', 'lesbian',
'maid',
'mff', 'mff',
'mfm', 'mfm',
'orgy',
'redhead',
'schoolgirl',
'teen', 'teen',
'milf',
'orgy',
'gangbang',
'double-penetration',
'airtight',
'facial',
'creampie',
'blowjob',
'interracial',
], ],
extreme: [
'double-anal',
'double-vaginal',
'da-tp',
'dv-tp',
],
oral: [
'deepthroat',
'facefucking',
'double-blowjob',
'blowbang',
'pussy-eating',
'ass-eating',
'ass-to-mouth',
],
cumshot: [
'facial',
'bukkake',
'creampie',
'anal-creampie',
'cum-in-mouth',
],
appearance: [
'asian',
'ebony',
'latina',
'caucasian',
'blonde',
'brunette',
'redhead',
],
roleplay: [
'family',
'schoolgirl',
'maid',
],
tricks: [
'gaping',
],
};
const tags = await this.$store.dispatch('fetchTags', {
slugs: Object.values(tagSlugsByCategory).flat(),
}); });
const tagsBySlug = tags.reduce((acc, tag) => ({ ...acc, [tag.slug]: tag }), {}); const tagsBySlug = tags.reduce((acc, tag) => ({ ...acc, [tag.slug]: tag }), {});
this.popularTags = [ this.categories = Object.entries(tagSlugsByCategory).reduce((acc, [category, tagSlugs]) => ({
'anal', ...acc,
'teen', [category]: tagSlugs.map(tagSlug => tagsBySlug[tagSlug]),
'lesbian', }), {});
'mff',
'mfm', console.log(this.categories);
'orgy',
'double-penetration',
'gangbang',
'airtight',
'creampie',
'facial',
'interracial',
'blowjob',
'deepthroat',
'facefucking',
'asian',
'ebony',
'latina',
'caucasian',
'blonde',
'brunette',
'redhead',
'schoolgirl',
'maid',
].map(tagSlug => tagsBySlug[tagSlug]);
this.pageTitle = 'Tags'; this.pageTitle = 'Tags';
} }
@ -81,7 +101,7 @@ export default {
}, },
data() { data() {
return { return {
popularTags: [], categories: {},
pageTitle: null, pageTitle: null,
}; };
}, },
@ -99,11 +119,13 @@ export default {
.tiles { .tiles {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(20rem, .25fr)); grid-template-columns: repeat(auto-fit, minmax(20rem, .25fr));
grid-gap: 2rem; grid-gap: 1rem;
margin: 0 0 1.5rem 0;
} }
.heading { .heading {
font-size: 1.3rem; font-size: 1.3rem;
text-transform: capitalize;
} }
@media(max-width: $breakpoint3) { @media(max-width: $breakpoint3) {

View File

@ -37,28 +37,27 @@ export default {
@import 'theme'; @import 'theme';
.tile { .tile {
color: var(--text); color: var(--text-light);
background: var(--background); background: var(--profile);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: left;
justify-content: flex-end;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 0 3px rgba(0, 0, 0, .25);
text-align: center; text-align: center;
text-decoration: none; text-decoration: none;
box-shadow: inset 0 0 3px var(--darken);
} }
.poster { .poster {
width: 100%; width: 100%;
height: 14rem; height: 14rem;
object-fit: cover; object-fit: cover;
box-shadow: 0 0 3px var(--darken);
} }
.title { .title {
height: 100%;
display: flex; display: flex;
align-items: center;
justify-content: center;
font-size: 1rem; font-size: 1rem;
padding: .5rem 1rem; padding: .5rem 1rem;
font-weight: bold; font-weight: bold;

View File

@ -29,7 +29,7 @@ $logo-highlight: drop-shadow(0 0 1px var(--highlight));
$profile: #222; $profile: #222;
$tile: #2a2a2a; $tile: #2a2a2a;
$link: #cc4466; $link: #dd6688;
$empty: #333; $empty: #333;
$male: #0af; $male: #0af;
@ -42,10 +42,16 @@ $female: #f0a;
--text-light: #fff; --text-light: #fff;
--darken: rgba(0, 0, 0, .5); --darken: rgba(0, 0, 0, .5);
--darken-strong: rgba(0, 0, 0, .7);
--darken-extreme: rgba(0, 0, 0, .9);
--darken-weak: rgba(0, 0, 0, .2); --darken-weak: rgba(0, 0, 0, .2);
--darken-hint: rgba(0, 0, 0, .1);
--lighten: rgba(255, 255, 255, .5); --lighten: rgba(255, 255, 255, .5);
--lighten-strong: rgba(255, 255, 255, .7);
--lighten-extreme: rgba(255, 255, 255, .9);
--lighten-weak: rgba(255, 255, 255, .2); --lighten-weak: rgba(255, 255, 255, .2);
--lighten-hint: rgba(255, 255, 255, .1);
--logo-shadow: drop-shadow(1px 0 0 $shadow-weak) drop-shadow(-1px 0 0 $shadow-weak) drop-shadow(0 1px 0 $shadow-weak) drop-shadow(0 -1px 0 $shadow-weak); --logo-shadow: drop-shadow(1px 0 0 $shadow-weak) drop-shadow(-1px 0 0 $shadow-weak) drop-shadow(0 1px 0 $shadow-weak) drop-shadow(0 -1px 0 $shadow-weak);
--logo-highlight: drop-shadow(0 0 1px $highlight); --logo-highlight: drop-shadow(0 0 1px $highlight);
@ -61,7 +67,7 @@ $female: #f0a;
--profile: #222; --profile: #222;
--tile: #2a2a2a; --tile: #2a2a2a;
--link: #cc4466; --link: #dd6688;
--empty: #333; --empty: #333;
--male: #0af; --male: #0af;
@ -90,7 +96,7 @@ $female: #f0a;
--profile: #222; --profile: #222;
--tile: #2a2a2a; --tile: #2a2a2a;
--link: #cc4466; --link: #dd6688;
--empty: #333; --empty: #333;
--male: #0af; --male: #0af;

60
assets/img/logo-light.svg Normal file
View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg8"
version="1.1"
viewBox="0 0 31.051453 7.9586663"
height="7.9586663mm"
width="31.051453mm">
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-77.20239,-97.922958)"
id="layer1">
<g
id="text4520"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff6c88;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="traxxx">
<path
id="path828"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'URW Gothic';-inkscape-font-specification:'URW Gothic Bold';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
d="m 77.890306,105.74404 h 1.407584 v -4.58258 h 0.846666 V 99.880875 H 79.29789 v -1.957917 h -1.407584 v 1.957917 H 77.20239 v 1.280585 h 0.687916 z" />
<path
id="path830"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'URW Gothic';-inkscape-font-specification:'URW Gothic Bold';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
d="M 80.917117,105.74404 H 82.3247 v -3.25967 c -0.03175,-0.86783 0.41275,-1.35466 1.259417,-1.38641 v -1.354668 h -0.105834 c -0.60325,0 -0.899583,0.169333 -1.27,0.709078 v -0.571495 h -1.291166 z" />
<path
id="path832"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'URW Gothic';-inkscape-font-specification:'URW Gothic Bold';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
d="m 90.071688,99.880875 h -1.291166 v 0.783165 c -0.486833,-0.64558 -1.068917,-0.920748 -1.915583,-0.920748 -1.735667,0 -2.9845,1.301748 -2.9845,3.090328 0,1.76742 1.23825,3.048 2.95275,3.048 0.8255,0 1.386416,-0.254 1.947333,-0.89958 v 0.762 h 1.291166 z m -3.058583,1.153585 c 1.005417,0 1.725084,0.75141 1.725084,1.82033 0,0.42333 -0.169334,0.91017 -0.423334,1.2065 -0.28575,0.34925 -0.740833,0.52917 -1.280583,0.52917 -1.026583,0 -1.735667,-0.6985 -1.735667,-1.72509 0,-1.06891 0.709084,-1.83091 1.7145,-1.83091 z" />
<path
id="path834"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'URW Gothic';-inkscape-font-specification:'URW Gothic Bold';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
d="m 90.558521,105.74404 h 1.693333 l 1.227667,-2.01083 1.227666,2.01083 h 1.693334 l -2.084917,-3.02683 1.788583,-2.836335 h -1.5875 l -1.037166,1.767415 -1.058334,-1.767415 h -1.5875 l 1.799167,2.836335 z" />
<path
id="path836"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'URW Gothic';-inkscape-font-specification:'URW Gothic Bold';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
d="m 96.485181,105.74404 h 1.693334 l 1.227666,-2.01083 1.227669,2.01083 h 1.69333 l -2.08492,-3.02683 1.78859,-2.836335 h -1.5875 l -1.037169,1.767415 -1.058333,-1.767415 h -1.5875 l 1.799167,2.836335 z" />
<path
id="path838"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'URW Gothic';-inkscape-font-specification:'URW Gothic Bold';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
d="m 102.41184,105.74404 h 1.69334 l 1.22766,-2.01083 1.22767,2.01083 h 1.69333 l -2.08491,-3.02683 1.78858,-2.836335 h -1.5875 l -1.03717,1.767415 -1.05833,-1.767415 h -1.5875 l 1.79917,2.836335 z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

5
assets/img/menu.svg Normal file
View File

@ -0,0 +1,5 @@
<!-- Generated by IcoMoon.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<title>menu</title>
<path d="M2 6h28v6h-28zM2 14h28v6h-28zM2 22h28v6h-28z"></path>
</svg>

After

Width:  |  Height:  |  Size: 221 B

5
assets/js/event-bus.js Normal file
View File

@ -0,0 +1,5 @@
import Vue from 'vue';
const EventBus = new Vue();
export default EventBus;

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 116 KiB

View File

Before

Width:  |  Height:  |  Size: 712 KiB

After

Width:  |  Height:  |  Size: 712 KiB

View File

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View File

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 213 KiB

View File

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 383 KiB

After

Width:  |  Height:  |  Size: 617 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 898 KiB

After

Width:  |  Height:  |  Size: 992 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 KiB

After

Width:  |  Height:  |  Size: 504 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 109 KiB

BIN
public/img/tags/maid/0.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

BIN
public/img/tags/milf/0.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
public/img/tags/orgy/1.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 965 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 103 KiB

BIN
public/img/tags/teen/0.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@ -403,7 +403,7 @@ const tags = [
{ {
name: 'gangbang', name: 'gangbang',
slug: 'gangbang', slug: 'gangbang',
description: 'A group of three or more guys fucking a woman, at least two at the same time, often but not necessarily involving a [blowbang](/tag/blowbang), [double penetration](/tag/airtight) and [airtight](/tag/airtight). If she only gets fucked by one guy at a time, it might be considered a [trainbang](/tag/trainbang) instead. In a reverse gangbang, multiple women fuck one man.', /* eslint-disable-line max-len */ description: 'A group of three or more guys fucking a woman, at least two at the same time, often but not necessarily involving a [blowbang](/tag/blowbang), [spitroast](/tag/mfm), [double penetration](/tag/double-penetration) and [airtight](/tag/airtight). If she only gets fucked by one guy at a time, it might be considered a [trainbang](/tag/trainbang) instead. In a reverse gangbang, multiple women fuck one man.', /* eslint-disable-line max-len */
priority: 9, priority: 9,
group: 'group', group: 'group',
}, },
@ -562,8 +562,8 @@ const tags = [
slug: 'oil', slug: 'oil',
}, },
{ {
name: 'oral creampie', name: 'cum in mouth',
slug: 'oral-creampie', slug: 'cum-in-mouth',
priority: 7, priority: 7,
group: 'finish', group: 'finish',
}, },
@ -1087,8 +1087,8 @@ const aliases = [
for: 'cuckold', for: 'cuckold',
}, },
{ {
name: 'cum in mouth', name: 'oral creampie',
for: 'oral-creampie', for: 'cum-in-mouth',
secondary: true, secondary: true,
}, },
{ {

View File

@ -1,7 +1,7 @@
const upsert = require('../src/utils/upsert'); const upsert = require('../src/utils/upsert');
const tagPosters = [ const tagPosters = [
['airtight', 1, 'Jynx Maze in "Pump My Ass Full of Cum 3" for Jules Jordan'], ['airtight', 6, 'Remy Lacroix in "Ass Worship 14" for Jules Jordan'],
['anal', 3, 'Dakota Skye for Brazzers'], ['anal', 3, 'Dakota Skye for Brazzers'],
['anal-creampie', 0, 'Gina Valentina and Jane Wilde in "A Very Special Anniversary" for Tushy'], ['anal-creampie', 0, 'Gina Valentina and Jane Wilde in "A Very Special Anniversary" for Tushy'],
['ass-eating', 0, 'Kendra Sunderland and Ana Foxxx in "Kendra\'s Obsession, Part 3" for Blacked'], ['ass-eating', 0, 'Kendra Sunderland and Ana Foxxx in "Kendra\'s Obsession, Part 3" for Blacked'],
@ -10,7 +10,7 @@ const tagPosters = [
['bdsm', 0, 'Dani Daniels in "The Traning of Dani Daniels, Day 2" for The Training of O at Kink'], ['bdsm', 0, 'Dani Daniels in "The Traning of Dani Daniels, Day 2" for The Training of O at Kink'],
['behind-the-scenes', 0, 'Janice Griffith in "Day With A Pornstar: Janice" for Brazzers'], ['behind-the-scenes', 0, 'Janice Griffith in "Day With A Pornstar: Janice" for Brazzers'],
['blonde', 0, 'Anikka Albrite and Lena Nicole or Cherie DeVille in the BTS of "New Zealand Holiday" for In The Crack'], ['blonde', 0, 'Anikka Albrite and Lena Nicole or Cherie DeVille in the BTS of "New Zealand Holiday" for In The Crack'],
['blowbang', 'poster'], ['blowbang', 'poster', 'Marsha May in "Feeding Frenzy 12" for Jules Jordan'],
['blowjob', 0, 'Adriana Chechik in "The Dinner Party" for Real Wife Stories (Brazzers)'], ['blowjob', 0, 'Adriana Chechik in "The Dinner Party" for Real Wife Stories (Brazzers)'],
['brunette', 0, 'Nicole Black in GIO971 for LegalPorno'], ['brunette', 0, 'Nicole Black in GIO971 for LegalPorno'],
['bukkake', 'poster'], ['bukkake', 'poster'],
@ -19,25 +19,29 @@ const tagPosters = [
['da-tp', 0, 'Natasha Teen in LegalPorno SZ2164'], ['da-tp', 0, 'Natasha Teen in LegalPorno SZ2164'],
['deepthroat', 0, 'Chanel Grey in "Deepthroating Is Fun" for Throated'], ['deepthroat', 0, 'Chanel Grey in "Deepthroating Is Fun" for Throated'],
['double-anal', 7, 'Adriana Chechik in "DP Masters 6" for Jules Jordan'], ['double-anal', 7, 'Adriana Chechik in "DP Masters 6" for Jules Jordan'],
['double-blowjob', 0, 'Kira Noir and Kali Roses for Brazzers'], ['double-blowjob', 1, 'Veronica Rodriguez and Penny Pax in "Fucking Older Guys 5" for Penthouse'],
['double-penetration', 2, 'Adriana Chechik in "DP Masters 6" for Jules Jordan'], ['double-penetration', 2, 'Megan Rain in "DP Masters 4" for Jules Jordan'],
['double-vaginal', 'poster', 'Riley Reid in "Pizza That Ass" for Reid My Lips'], ['double-vaginal', 'poster', 'Riley Reid in "Pizza That Ass" for Reid My Lips'],
['dv-tp', 'poster', 'Juelz Ventura in "Gangbanged 5" for Elegant Angel'], ['dv-tp', 'poster', 'Juelz Ventura in "Gangbanged 5" for Elegant Angel'],
['ebony', 1, 'Ana Foxxx in "DP Me 4" for HardX'], ['ebony', 1, 'Ana Foxxx in "DP Me 4" for HardX'],
['facefucking', 1, 'Carrie for Young Throats'], ['facefucking', 1, 'Carrie for Young Throats'],
['facial', 'poster'], ['facial', 0, 'Brooklyn Gray in "All About Ass 4" for Evil Angel'],
['gangbang', 'poster', 'Kristen Scott in "Interracial Gangbang!" for Jules Jordan'], ['gangbang', 'poster', 'Kristen Scott in "Interracial Gangbang!" for Jules Jordan'],
['gaping', 1, 'Vina Sky in "Vina Sky Does Anal" for HardX'], ['gaping', 1, 'Vina Sky in "Vina Sky Does Anal" for HardX'],
['interracial', 'poster'], ['interracial', 'poster'],
['latina', 'poster', 'Alexis Love for Penthouse'], ['latina', 'poster', 'Alexis Love for Penthouse'],
['lesbian', 0, 'Reena Sky and Sarah Banks for Brazzers'], ['lesbian', 0, 'Reena Sky and Sarah Banks for Brazzers'],
['maid', 0, 'Whitney Wright in "Dredd Up Your Ass 2" for Jules Jordan'],
['milf', 0, 'Olivia Austin in "Dredd 3" for Jules Jordan'],
['mff', 0, 'Madison Ivy and Adriana Chechik in "Day With A Pornstar" for Brazzers'], ['mff', 0, 'Madison Ivy and Adriana Chechik in "Day With A Pornstar" for Brazzers'],
['mfm', 5, 'Vina Sky in "Slut Puppies 15" for Jules Jordan'], ['mfm', 5, 'Vina Sky in "Slut Puppies 15" for Jules Jordan'],
['oral-creampie', 1, 'Keisha Grey in Brazzers House'], ['cum-in-mouth', 1, 'Keisha Grey in Brazzers House'],
['orgy', 'poster'], ['orgy', 1, 'Jessa Rhodes, Melissa moore, Kimmy Granger, Megan Rain and Morgan Lee in "Orgy Masters 8" for Jules Jordan'],
['redhead', 0, 'Penny Pax in "The Submission of Emma Marx: Evolved" for New Sensations'], ['pussy-eating', 0, 'Elena Kosha and Ivy Wolfe in "Bare" for Jules Jordan'],
['redhead', 0, 'Penny Pax in "The Submission of Emma Marx: Boundaries" for New Sensations'],
['schoolgirl', 1, 'Eliza Ibarra for Brazzers'], ['schoolgirl', 1, 'Eliza Ibarra for Brazzers'],
['swallowing', 'poster'], ['swallowing', 'poster'],
['teen', 0, 'Eva Elfie in "Fresh New Talent" for Club Seventeen'],
['tattoo', 'poster', 'Kali Roses in "Goes All In For Anal" for Hussie Pass'], ['tattoo', 'poster', 'Kali Roses in "Goes All In For Anal" for Hussie Pass'],
['trainbang', 'poster', 'Kali Roses in "Passing Me Around" for Blacked'], ['trainbang', 'poster', 'Kali Roses in "Passing Me Around" for Blacked'],
['triple-anal', 'poster', 'Kristy Black in SZ1986 for LegalPorno'], ['triple-anal', 'poster', 'Kristy Black in SZ1986 for LegalPorno'],
@ -52,6 +56,8 @@ const tagPosters = [
})); }));
const tagPhotos = [ const tagPhotos = [
['airtight', 5, 'Chloe Amour in "DP Masters 4" for Jules Jordan'],
['airtight', 1, 'Jynx Maze in "Pump My Ass Full of Cum 3" for Jules Jordan'],
['airtight', 2, 'Dakota Skye in "Dakota Goes Nuts" for ArchAngel'], ['airtight', 2, 'Dakota Skye in "Dakota Goes Nuts" for ArchAngel'],
['airtight', 3, 'Anita Bellini in "Triple Dick Gangbang" for Hands On Hardcore (DDF Network)'], ['airtight', 3, 'Anita Bellini in "Triple Dick Gangbang" for Hands On Hardcore (DDF Network)'],
['asian', 'poster', 'Vina Sky in "Slut Puppies 15" for Jules Jordan'], ['asian', 'poster', 'Vina Sky in "Slut Puppies 15" for Jules Jordan'],
@ -72,25 +78,28 @@ const tagPhotos = [
['double-anal', 'poster', 'Haley Reed in "Young Hot Ass" for Evil Angel'], ['double-anal', 'poster', 'Haley Reed in "Young Hot Ass" for Evil Angel'],
['double-anal', 0, 'Nicole Black doing double anal during a gangbang in GIO971 for LegalPorno'], ['double-anal', 0, 'Nicole Black doing double anal during a gangbang in GIO971 for LegalPorno'],
['double-anal', 1, 'Ria Sunn in SZ1801 for LegalPorno'], ['double-anal', 1, 'Ria Sunn in SZ1801 for LegalPorno'],
['double-blowjob', 0, 'Kira Noir and Kali Roses for Brazzers'],
['double-penetration', 'poster', 'Mia Malkova in "DP Me 8" for HardX'], ['double-penetration', 'poster', 'Mia Malkova in "DP Me 8" for HardX'],
['double-penetration', 0, 'Zoey Monroe in "Slut Puppies 7" for Jules Jordan'], ['double-penetration', 0, 'Zoey Monroe in "Slut Puppies 7" for Jules Jordan'],
['double-penetration', 1, 'Jynx Maze in "Don\'t Make Me Beg 4" for Evil Angel'], ['double-penetration', 1, 'Jynx Maze in "Don\'t Make Me Beg 4" for Evil Angel'],
['double-vaginal', 0, 'Aaliyah Hadid in "Squirting From Double Penetration With Anal" for Bang Bros'], ['double-vaginal', 0, 'Aaliyah Hadid in "Squirting From Double Penetration With Anal" for Bang Bros'],
['dv-tp', 1, 'Adriana Chechik in "Adriana\'s Triple Anal Penetration!"'], ['dv-tp', 1, 'Adriana Chechik in "Adriana\'s Triple Anal Penetration!"'],
['dv-tp', 0, 'Luna Rival in LegalPorno SZ1490'], ['dv-tp', 0, 'Luna Rival in LegalPorno SZ1490'],
['facial', 'poster', 'Jynx Maze'],
['facefucking', 2, 'Jynx Maze for Throated'], ['facefucking', 2, 'Jynx Maze for Throated'],
['latina', 0, 'Abby Lee Brazil for Bang Bros'], ['latina', 0, 'Abby Lee Brazil for Bang Bros'],
['gangbang', 0, '"4 On 1 Gangbangs" for Doghouse Digital'], ['gangbang', 0, '"4 On 1 Gangbangs" for Doghouse Digital'],
['gangbang', 1, 'Ginger Lynn in "Gangbang Mystique", a photoset shot by Suze Randall for Puritan No. 10, 1984. This photo pushed the boundaries of pornography at the time, as depicting a woman \'fully occupied\' was unheard of.'], ['gangbang', 1, 'Ginger Lynn in "Gangbang Mystique", a photoset shot by Suze Randall for Puritan No. 10, 1984. This photo pushed the boundaries of pornography at the time, as depicting a woman \'fully occupied\' was unheard of.'],
['gangbang', 2, 'Riley Reid\'s double anal in "The Gangbang of Riley Reid" for Jules Jordan'], ['gangbang', 2, 'Riley Reid\'s double anal in "The Gangbang of Riley Reid" for Jules Jordan'],
['gaping', 'poster', 'Paulina in "Anal Buffet 4" for Evil Angel'], ['gaping', 'poster', 'Zoey Monroe in "Manuel DPs Them All 5" for Jules Jordan'],
['gaping', 0, 'McKenzee Miles in "Anal Buffet 4" for Evil Angel'], ['gaping', 2, 'Alex Grey in "DP Masters 5" for Jules Jordan'],
// ['mfm', 0, 'Vina Sky in "Jules Jordan\'s Three Ways" for Jules Jordan'], // ['mfm', 0, 'Vina Sky in "Jules Jordan\'s Three Ways" for Jules Jordan'],
['mfm', 1, 'Jynx Maze in "Don\'t Make Me Beg 4" for Evil Angel'], ['mfm', 1, 'Jynx Maze in "Don\'t Make Me Beg 4" for Evil Angel'],
['orgy', 'poster', 'Frida Sante, Jillian Janson, Zoey Monroe, Katerina Kay and Natasha Starr in "Orgy Masters 6" for Jules Jordan'],
['trainbang', 0, 'Nicole Black in GIO971 for LegalPorno'], ['trainbang', 0, 'Nicole Black in GIO971 for LegalPorno'],
['triple-anal', 1, 'Natasha Teen in SZ2098 for LegalPorno'], ['triple-anal', 1, 'Natasha Teen in SZ2098 for LegalPorno'],
['triple-anal', 2, 'Kira Thorn in GIO1018 for LegalPorno'], ['triple-anal', 2, 'Kira Thorn in GIO1018 for LegalPorno'],
['oral-creampie', 'poster', 'Khloe Kapri'], ['cum-in-mouth', 'poster', 'Khloe Kapri'],
] ]
.map(([slug, fileIndex, comment], index) => ({ .map(([slug, fileIndex, comment], index) => ({
tagSlug: slug, tagSlug: slug,