From f06df01e704b3db253d92253690196f450d9de02 Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Tue, 30 Dec 2025 04:49:29 +0100 Subject: [PATCH] Added easily accessible global scenes page with filters. --- components/filters/filters.vue | 6 ++--- components/header/header.vue | 8 ++++++ components/scenes/scenes.vue | 2 +- components/sidebar/sidebar.vue | 6 ++--- pages/scenes/+Page.vue | 24 +++++++++++++++++ pages/scenes/+onBeforeRender.js | 47 +++++++++++++++++++++++++++++++++ pages/scenes/+route.js | 21 +++++++++++++++ pages/updates/+Page.vue | 12 ++++----- static | 2 +- 9 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 pages/scenes/+Page.vue create mode 100644 pages/scenes/+onBeforeRender.js create mode 100644 pages/scenes/+route.js diff --git a/components/filters/filters.vue b/components/filters/filters.vue index 054424e..de05bb0 100644 --- a/components/filters/filters.vue +++ b/components/filters/filters.vue @@ -385,15 +385,15 @@ function toggleFilters(state) { } .filters-toggle { - min-width: 2rem; - height: 2.5rem; + min-width: 2.75rem; + height: 3rem; display: none; justify-content: center; align-items: center; padding: 0 .25rem; position: absolute; top: .35rem; - right: -2.5rem; + right: -3.25rem; border-radius: 0 .5rem .5rem 0; background: var(--background); color: var(--glass); diff --git a/components/header/header.vue b/components/header/header.vue index 1664623..c9008bb 100644 --- a/components/header/header.vue +++ b/components/header/header.vue @@ -21,6 +21,14 @@ --> + +
  • +
    + +
    + + + + + diff --git a/pages/scenes/+onBeforeRender.js b/pages/scenes/+onBeforeRender.js new file mode 100644 index 0000000..19dbb94 --- /dev/null +++ b/pages/scenes/+onBeforeRender.js @@ -0,0 +1,47 @@ +import { fetchScenes } from '#/src/scenes.js'; +import { curateScenesQuery } from '#/src/web/scenes.js'; +import { getRandomCampaigns, getCampaignIndex } from '#/src/campaigns.js'; + +export async function onBeforeRender(pageContext) { + const [ + sceneResults, + campaigns, + ] = await Promise.all([ + fetchScenes(await curateScenesQuery({ + ...pageContext.urlQuery, + scope: pageContext.routeParams.scope || 'latest', + isShowcased: null, + tagFilter: pageContext.tagFilter, + }), { + page: Number(pageContext.routeParams.page) || 1, + limit: Number(pageContext.urlParsed.search.limit) || 29, + aggregate: true, + dedupe: true, + }, pageContext.user), + getRandomCampaigns([ + { minRatio: 0.75, maxRatio: 1.25 }, + { minRatio: 1.5 }, + ], { tagFilter: pageContext.tagFilter }), + ]); + + const { + scenes, + } = sceneResults; + + const campaignIndex = getCampaignIndex(scenes.length); + const [sceneCampaign, paginationCampaign] = campaigns; + + return { + pageContext: { + title: pageContext.routeParams.scope, + pageProps: { + ...sceneResults, + }, + campaigns: { + index: campaignIndex, + scenes: scenes.length > 5 && sceneCampaign, + pagination: paginationCampaign, + }, + }, + }; +} diff --git a/pages/scenes/+route.js b/pages/scenes/+route.js new file mode 100644 index 0000000..44b3656 --- /dev/null +++ b/pages/scenes/+route.js @@ -0,0 +1,21 @@ +import { match } from 'path-to-regexp'; +// import { resolveRoute } from 'vike/routing'; // eslint-disable-line import/extensions + +const path = '/scenes/:scope?/:page?'; +const urlMatch = match(path, { decode: decodeURIComponent }); + +export default (pageContext) => { + const matched = urlMatch(pageContext.urlPathname); + + if (matched) { + return { + routeParams: { + scope: matched.params.scope || 'latest', + page: matched.params.page || '1', + path, + }, + }; + } + + return false; +}; diff --git a/pages/updates/+Page.vue b/pages/updates/+Page.vue index 3318a3c..1f615e3 100644 --- a/pages/updates/+Page.vue +++ b/pages/updates/+Page.vue @@ -1,20 +1,20 @@