style(components): fix formatting on story listing components

This commit is contained in:
☙◦ The Tablet ❀ GamerGirlandCo ◦❧ 2023-10-10 22:07:57 -04:00
parent dd30f08d9a
commit 6f770a1cb8
Signed by: tablet
GPG Key ID: 924A5F6AF051E87C
3 changed files with 340 additions and 301 deletions

View File

@ -1,9 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
const props = defineProps<{ label?: string }>() const props = defineProps<{ label?: string }>();
</script> </script>
<template> <template>
<span> <span>
<b>{{ label }}</b>: <slot/> <b>{{ label }}</b> : <slot />
</span> </span>
</template> </template>

View File

@ -1,240 +1,268 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { IStory } from "~/models/stories/index"; import type { IStory } from "~/models/stories/index";
import { format } from "date-fns"; import { log } from "~/lib/server/logger";
import icon from "../icon.vue"; import { format } from "date-fns";
import { theme } from "ant-design-vue"; import icon from "../icon.vue";
import metaItem from "./metaItem.vue"; import { theme } from "ant-design-vue";
import metaItem from "./metaItem.vue";
const { useToken } = theme;
const { token } = useToken() const { useToken } = theme;
const dark = inject<Ref<boolean>>("dark") const { token } = useToken();
let prop = defineProps<{ story: IStory, last?: boolean }>() const dark = inject<Ref<boolean>>("dark");
const idxo = ((prop.last || false) ? prop.story.chapters.length : 1) - 1 let prop = defineProps<{ story: IStory; last?: boolean }>();
console.log("posti->", prop.story.chapters[ prop.story.chapters.length - 1 ]) const idxo = (prop.last || false ? prop.story.chapters.length : 1) - 1;
const shortDate = format(Date.parse( // log.debug("posti->", prop.story.chapters[ prop.story.chapters.length - 1 ]);
prop.story.chapters[ prop.story.chapters.length - 1 ].posted.toString() const shortDate = format(
), Date.parse(
"yyyy/MM/dd" prop.story.chapters[prop.story.chapters.length - 1]?.posted!.toString(),
) ),
const longDate = format(Date.parse( "yyyy/MM/dd",
prop.story.chapters[ prop.story.chapters.length - 1 ].posted.toString() );
), const longDate = format(
"iiii',' yyyy-MM-dd" Date.parse(
) prop.story.chapters[prop.story.chapters.length - 1]?.posted!.toString(),
</script> ),
<template> "iiii',' yyyy-MM-dd",
<a-card> );
<template #title> </script>
<div style="padding-top: 1em; padding-bottom: 0.8em;"> <template>
<NuxtLink :to="`/story/${story._id}/${idxo + 1}`"> <a-card>
{{ story.title }} <template #title>
</NuxtLink> <div style="padding-top: 1em; padding-bottom: 0.8em">
<div style="display: flex; font-size: 0.9em; align-items: baseline;" class="headerthing"> <NuxtLink :to="`/story/${story._id}/${idxo + 1}`">
<span> {{ story.title }}
a </NuxtLink>
</span> <div
<div style="" v-for="(band, idx) in story.chapters[ idxo ].bands.filter(a => !!a)"> style="display: flex; font-size: 0.9em; align-items: baseline"
<span> class="headerthing"
<NuxtLink :to="`/band/${band._id}`"> >
{{ band.name }} <span> a </span>
</NuxtLink>{{ idx < story.chapters[ idxo ].bands.length - 1 ? ", " : "" }} <div
</span> style=""
</div> v-for="(band, idx) in story.chapters[idxo].bands.filter((a) => !!a)"
<span> >
fic by <span>
</span> <NuxtLink :to="`/band/${band._id}`"> {{ band.name }} </NuxtLink
<span> >{{ idx < story.chapters[idxo].bands.length - 1 ? ", " : "" }}
<NuxtLink :to="`/user/${story.author._id}`"> </span>
{{ story.author.username }} </div>
</NuxtLink> <span> fic by </span>
</span> <span>
</div> <NuxtLink :to="`/user/${story.author._id}`">
</div> {{ story.author.username }}
</template> </NuxtLink>
<div v-html="story.chapters[ idxo ].summary"/> </span>
<a-card v-if="story.ficmas != null" class="ficmasBlurb lessPadding"> </div>
Written as a gift for </div>
<NuxtLink :to="`/user/${story.ficmas.wisher?._id || 1}`"> </template>
{{ story.ficmas.wisher?.username || "<...>" }} <div v-html="story.chapters[idxo].summary" />
</NuxtLink> as part of {{ story.ficmas.year }}&rsquo;s <a-card v-if="story.ficmas != null" class="ficmasBlurb lessPadding">
<span v-if="story.ficmas.anniversary"> Written as a gift for
Anniversary Ficmas Fest <NuxtLink :to="`/user/${story.ficmas.wisher?._id || 1}`">
</span> {{ story.ficmas.wisher?.username || "<...>" }}
<span v-else> </NuxtLink>
A Very Kinky Rockfic Ficmas Fest. as part of {{ story.ficmas.year }}&rsquo;s
</span> <span v-if="story.ficmas.anniversary"> Anniversary Ficmas Fest </span>
</a-card> <span v-else> A Very Kinky Rockfic Ficmas Fest. </span>
<a-card v-if="story.challenge != null" :style="{ </a-card>
background: story.challenge.color <a-card
}" class="lessPadding"> v-if="story.challenge != null"
Entry for the :style="{
<NuxtLink :to="`/challenge/${story.challenge._id}`"> background: story.challenge.color,
{{ story.challenge.name }} }"
</NuxtLink> class="lessPadding"
challenge. >
</a-card> Entry for the
<a-divider :style="{ borderColor: token[ 'pink-5' ], marginBottom: '1em' }"/> <NuxtLink :to="`/challenge/${story.challenge._id}`">
<div class="storyMeta"> {{ story.challenge.name }}
<div class="inner"> </NuxtLink>
<span v-if="story.chapters.length > 1"> challenge.
<NuxtLink :to="`/story/${story._id}/chapters`"> </a-card>
{{ story.chapters.length }} chapters <a-divider :style="{ borderColor: token['pink-5'], marginBottom: '1em' }" />
</NuxtLink> <div class="storyMeta">
</span> <div class="inner">
<span v-else> <span v-if="story.chapters.length > 1">
{{ story.chapters.length }} chapter <NuxtLink :to="`/story/${story._id}/chapters`">
</span> {{ story.chapters.length }} chapters
<span> </NuxtLink>
{{ story.chapters[ idxo ].nsfw ? "Adult" : "Not so adult" }} </span>
</span> <span v-else> {{ story.chapters.length }} chapter </span>
<span> <span>
{{ story.completed ? "Completed" : "WIP" }} {{ story.chapters[idxo].nsfw ? "Adult" : "Not so adult" }}
</span> </span>
</div> <span>
{{ story.completed ? "Completed" : "WIP" }}
<div class="outer"> </span>
<meta-item :span="1" label="Genre(s)"> </div>
{{ story.chapters[ idxo ].genre.join(", ") }}
</meta-item> <div class="outer">
<meta-item label="Characters"> <meta-item :span="1" label="Genre(s)">
{{ story.chapters[ idxo ].characters.join(", ") }} {{ story.chapters[idxo].genre.join(", ") }}
</meta-item> </meta-item>
<meta-item label="Relationship(s)"> <meta-item label="Characters">
<div style="display: inline-block" v-for="(rel, idx) in story.chapters[ idxo ].relationships"> {{ story.chapters[idxo].characters.join(", ") }}
<span> </meta-item>
{{ Array.isArray(rel) ? rel.join("/") : rel }} <meta-item label="Relationship(s)">
{{ idx < story.chapters[ idxo ].relationships.length - 1 ? "," : "" }} <div
</span> style="display: inline-block"
</div> v-for="(rel, idx) in story.chapters[idxo].relationships"
<span v-if="story.chapters[ idxo ].relationships.length < 1"> >
<i>N/A</i> <span>
</span> {{ Array.isArray(rel) ? rel.join("/") : rel }}
</meta-item> {{
<meta-item label="Last updated"> idx < story.chapters[idxo].relationships.length - 1 ? "," : ""
<a-tooltip> }}
<template #title> </span>
{{ longDate }} </div>
</template> <span v-if="story.chapters[idxo].relationships.length < 1">
{{ shortDate }} <i>N/A</i>
</a-tooltip> </span>
</meta-item> </meta-item>
</div> <meta-item label="Last updated">
</div> <a-tooltip>
<div class="stats"> <template #title>
<span> {{ longDate }}
<span class="staticon"> </template>
<icon :istyle="!dark ? 'solid' : 'regular'" icolor="#ff2883" :size="12" name="heart"/> {{ shortDate }}
</span> </a-tooltip>
<span> </meta-item>
{{ story.favs }} </div>
</span> </div>
</span> <div class="stats">
<span> <span>
<span class="staticon"> <span class="staticon">
<icon :istyle="!dark ? 'solid' : 'regular'" icolor="#1787d7" :size="12" name="book-open" /> <icon
</span> :istyle="!dark ? 'solid' : 'regular'"
<span> icolor="#ff2883"
{{ story.views }} :size="12"
</span> name="heart"
</span> />
<span> </span>
<span class="staticon"> <span>
<icon :istyle="!dark ? 'solid' : 'regular'" icolor="#51e07c" :size="12" name="thumbs-up" /> {{ story.favs }}
</span> </span>
<span> </span>
{{ story.recs }} <span>
</span> <span class="staticon">
</span> <icon
<span> :istyle="!dark ? 'solid' : 'regular'"
<span class="staticon"> icolor="#1787d7"
<icon :istyle="!dark ? 'solid' : 'regular'" icolor="#c2d420" :size="12" name="download" /> :size="12"
</span> name="book-open"
<span> />
{{ story.downloads }} </span>
</span> <span>
</span> {{ story.views }}
<span> </span>
<span class="staticon"> </span>
<icon istyle="solid" icolor="#0083aa" :size="12" name="comment" /> <span>
</span> <span class="staticon">
<span> <icon
{{ story.reviews }} :istyle="!dark ? 'solid' : 'regular'"
</span> icolor="#51e07c"
</span> :size="12"
</div> name="thumbs-up"
</a-card> />
</template> </span>
<style> <span>
.lessPadding>.ant-card-body { {{ story.recs }}
padding: 0.8em !important; </span>
} </span>
<span>
.ant-descriptions-view tr { <span class="staticon">
border: none; <icon
} :istyle="!dark ? 'solid' : 'regular'"
icolor="#c2d420"
.ant-descriptions-item { :size="12"
padding-bottom: 0 !important; name="download"
} />
</span>
.storyMeta .ant-descriptions-item-container, <span>
.storyMeta .ant-descriptions-item-container>* { {{ story.downloads }}
font-size: 1em !important; </span>
} </span>
</style> <span>
<style scoped> <span class="staticon">
.stats { <icon istyle="solid" icolor="#0083aa" :size="12" name="comment" />
padding-top: 0.25em; </span>
} <span>
{{ story.reviews }}
.stats>*+* { </span>
margin-left: 0.5em; </span>
} </div>
</a-card>
.stats>*>*+* { </template>
margin-left: 0.5em; <style>
} .lessPadding > .ant-card-body {
padding: 0.8em !important;
.headerthing>*+* { }
margin-left: 0.3em;
font-size: 0.9em !important; .ant-descriptions-view tr {
} border: none;
}
hr {
background-color: #aaa !important; .ant-descriptions-item {
border: none !important; padding-bottom: 0 !important;
} }
.ficmasBlurb { .storyMeta .ant-descriptions-item-container,
background-color: #13b658; .storyMeta .ant-descriptions-item-container > * {
color: white; font-size: 1em !important;
/* border-radius: */ }
} </style>
<style scoped>
.ficmasBlurb a { .stats {
color: #000; padding-top: 0.25em;
font-weight: bold; }
}
.stats > * + * {
.ficmasBlurb a:hover { margin-left: 0.5em;
text-decoration: underline; }
}
.stats > * > * + * {
.storyMeta { margin-left: 0.5em;
display: flex; }
flex-direction: column;
font-size: 0.857em !important; .headerthing > * + * {
} margin-left: 0.3em;
font-size: 0.9em !important;
.storyMeta .outer { }
display: flex;
flex-direction: column; hr {
margin-top: 0.5em; background-color: #aaa !important;
} border: none !important;
}
.storyMeta .inner>*+*::before {
content: "♪"; .ficmasBlurb {
color: #ff2883; background-color: #13b658;
margin: 0 0.7em; color: white;
} /* border-radius: */
</style> }
.ficmasBlurb a {
color: #000;
font-weight: bold;
}
.ficmasBlurb a:hover {
text-decoration: underline;
}
.storyMeta {
display: flex;
flex-direction: column;
font-size: 0.857em !important;
}
.storyMeta .outer {
display: flex;
flex-direction: column;
margin-top: 0.5em;
}
.storyMeta .inner > * + *::before {
content: "♪";
color: #ff2883;
margin: 0 0.7em;
}
</style>

View File

@ -1,52 +1,63 @@
<script setup lang="ts"> <script setup lang="ts">
; import singleStory from "~/components/listings/singleStory.vue";
import singleStory from '~/components/listings/singleStory.vue'; import { IStory } from "~/models/stories";
const route = useRoute() const route = useRoute();
let curPage = ref(route.query.page || 1) let curPage = ref(route.query.page || 1);
const props = defineProps<{ prefix: string; }>() const props = defineProps<{ prefix?: string; items?: IStory[] }>();
let { data }: any = await useApiFetch(`${props.prefix}/stories`, { let data;
query: { if (!props.prefix) {
page: curPage data = props.items;
} } else if (!props.items) {
}) data = (
let rdata = ref(data) await useApiFetch<any>(`${props.prefix}`, {
const pagiChange = async (page, pageSize) => { query: {
curPage.value = page; page: curPage,
// await navigateTo({ },
// path: useRoute().fullPath, })
// query: { ).data;
// page }
// } let rdata = ref(data);
// }) const pagiChange = async (page, pageSize) => {
// let { data }: any = await useApiFetch(`${props.prefix}/stories`, { curPage.value = page;
// query: { // await navigateTo({
// page: curPage // path: useRoute().fullPath,
// } // query: {
// }) // page
// rdata.value = data; // }
} // })
</script> // let {data: data } = await useApiFetch(`${props.prefix}/stories`, {
<template> // query: {
<a-list :pagination="{ // page: curPage
defaultPageSize: 20, // }
total: rdata.total, // })
defaultCurrent: curPage as number, // rdata.value = data;
// onChange: pagiChange, };
hideOnSinglePage: true, </script>
showSizeChanger: false <template>
}" :data-source="rdata.stories" item-layout="vertical"> <a-list
<template #renderItem="{ item }"> :pagination="{
<!-- {{ item.title }} --> defaultPageSize: 20,
<single-story :story="item"/> total: rdata.total,
</template> defaultCurrent: curPage as number,
</a-list> // onChange: pagiChange,
</template> hideOnSinglePage: true,
<style scoped> showSizeChanger: false,
.ant-list-items>*+* { }"
margin-top: 1.2em; :data-source="rdata.stories"
} item-layout="vertical"
>
.ant-pagination { <template #renderItem="{ item }">
text-align: center; <!-- {{ item.title }} -->
} <single-story :story="item" />
</style> </template>
</a-list>
</template>
<style scoped>
.ant-list-items > * + * {
margin-top: 1.2em;
}
.ant-pagination {
text-align: center;
}
</style>