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 @@
-->
+
+ Scenes
+
+
+
+
+
+
+
+
+
+
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 @@