From 013117507e2d6ce2ac09aa4497674145d21ec992 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 11 Mar 2026 00:14:49 +0100 Subject: [PATCH] Feat: Discover page (#108) * Add discover page components with category showcase * Add section page component for browsing discover categories * Add icons for discover page categories (spotlights, theater, compass, calendar, star) * Add discover icon (compass navigation) for main navigation * Update navigation to use IconDiscover for discover route * Add discover and section page routes with interfaces * Update home page and components to integrate with discover navigation * Remove deprecated ListPage component --- src/components/DiscoverMinimal.vue | 277 ++++++++++++ src/components/DiscoverShowcase.vue | 360 +++++++++++++++ src/components/PageHeader.vue | 14 +- src/components/ResultsSection.vue | 9 +- src/components/header/NavigationIcons.vue | 14 +- src/icons/IconCalendar.vue | 16 + src/icons/IconCompass.vue | 13 + src/icons/IconDiscover.vue | 19 + src/icons/IconSpotlights.vue | 6 + src/icons/IconStar.vue | 7 + src/icons/IconTheater.vue | 10 + src/interfaces/ISection.ts | 1 + src/pages/DiscoverPage.vue | 514 ++++++++++++++++++++++ src/pages/HomePage.vue | 56 +-- src/pages/ListPage.vue | 30 -- src/pages/SectionPage.vue | 40 ++ src/routes.ts | 20 +- 17 files changed, 1339 insertions(+), 67 deletions(-) create mode 100644 src/components/DiscoverMinimal.vue create mode 100644 src/components/DiscoverShowcase.vue create mode 100644 src/icons/IconCalendar.vue create mode 100644 src/icons/IconCompass.vue create mode 100644 src/icons/IconDiscover.vue create mode 100644 src/icons/IconSpotlights.vue create mode 100644 src/icons/IconStar.vue create mode 100644 src/icons/IconTheater.vue create mode 100644 src/pages/DiscoverPage.vue delete mode 100644 src/pages/ListPage.vue create mode 100644 src/pages/SectionPage.vue diff --git a/src/components/DiscoverMinimal.vue b/src/components/DiscoverMinimal.vue new file mode 100644 index 0000000..a2acf17 --- /dev/null +++ b/src/components/DiscoverMinimal.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/src/components/DiscoverShowcase.vue b/src/components/DiscoverShowcase.vue new file mode 100644 index 0000000..1a35122 --- /dev/null +++ b/src/components/DiscoverShowcase.vue @@ -0,0 +1,360 @@ + + + + + diff --git a/src/components/PageHeader.vue b/src/components/PageHeader.vue index 94280af..fb7b648 100644 --- a/src/components/PageHeader.vue +++ b/src/components/PageHeader.vue @@ -31,12 +31,22 @@ info?: string | Array; link?: string; shortList?: boolean; + sectionType?: "list" | "discover"; } - const props = defineProps(); + const props = withDefaults(defineProps(), { + sectionType: "list" + }); const urlify = computed(() => { - return `/list/${props.title.toLowerCase().replace(" ", "_")}`; + const normalizedTitle = props.title + .toLowerCase() + .replace(/'s\b/g, "") // Remove possessive 's + .replace(/[^\w\d\s-]/g, "") // Remove special characters (keep word chars, dashes, digits, spaces) + .replace(/\s+/g, "_") // Replace spaces with underscores + .replace(/-/g, "_") // Replace dash with underscore + .replace(/_+/g, "_"); // Replace multiple underscores with single underscore + return `/${props.sectionType}/${normalizedTitle}`; }); const prettify = computed(() => { diff --git a/src/components/ResultsSection.vue b/src/components/ResultsSection.vue index 08c051c..84d695c 100644 --- a/src/components/ResultsSection.vue +++ b/src/components/ResultsSection.vue @@ -1,6 +1,8 @@ diff --git a/src/pages/ListPage.vue b/src/pages/ListPage.vue deleted file mode 100644 index 4c65e4a..0000000 --- a/src/pages/ListPage.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - - - diff --git a/src/pages/SectionPage.vue b/src/pages/SectionPage.vue new file mode 100644 index 0000000..412a6c0 --- /dev/null +++ b/src/pages/SectionPage.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/routes.ts b/src/routes.ts index 3bc48af..b636375 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -39,7 +39,17 @@ const routes: RouteRecordRaw[] = [ { name: "list", path: "/list/:name", - component: () => import("./pages/ListPage.vue") + component: () => import("./pages/SectionPage.vue") + }, + { + name: "discover-section", + path: "/discover/:name", + component: () => import("./pages/SectionPage.vue") + }, + { + name: "discover", + path: "/discover", + component: () => import("./pages/DiscoverPage.vue") }, { name: "search", @@ -104,7 +114,13 @@ const router = createRouter({ history: createWebHistory("/"), // base: "/", routes, - linkActiveClass: "is-active" + linkActiveClass: "is-active", + scrollBehavior(to, from, savedPosition) { + if (to.name !== "discover") return; + + console.log("scrolling top"); + return { top: 0 }; + } }); const loggedIn = () => store.getters["user/loggedIn"];