From 798d1a7fbc4a7b0622d195c20b9f7e3d618c1755 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 15 May 2026 21:11:06 -0400 Subject: [PATCH] feat(fc2c-i): front-door redirect, /gallery move, discovery routes --- frontend/src/router.js | 24 +++++++++++++++++++----- frontend/test/router.spec.js | 24 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 frontend/test/router.spec.js diff --git a/frontend/src/router.js b/frontend/src/router.js index fab0176..082f049 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -2,13 +2,25 @@ import { createRouter, createWebHistory } from 'vue-router' import PlaceholderView from './views/PlaceholderView.vue' import SettingsView from './views/SettingsView.vue' import GalleryView from './views/GalleryView.vue' +import ShowcaseView from './views/ShowcaseView.vue' +import TagsView from './views/TagsView.vue' +import ArtistView from './views/ArtistView.vue' + +// The application's front door. `/` redirects here. Changing the front door +// is a one-line edit (e.g. '/gallery' or '/tags'). +export const FRONT_DOOR = '/showcase' const routes = [ + // Root is a redirect only — no meta.title so it stays out of the nav. + { path: '/', redirect: FRONT_DOOR }, + // FC-2: image backbone - { path: '/', name: 'gallery', component: GalleryView, meta: { title: 'Gallery' } }, - { path: '/showcase', name: 'showcase', component: PlaceholderView, meta: { title: 'Showcase' } }, - { path: '/tags', name: 'tags', component: PlaceholderView, meta: { title: 'Tags' } }, - { path: '/settings', name: 'settings', component: SettingsView, meta: { title: 'Settings' } }, + { path: '/gallery', name: 'gallery', component: GalleryView, meta: { title: 'Gallery' } }, + { path: '/showcase', name: 'showcase', component: ShowcaseView, meta: { title: 'Showcase' } }, + { path: '/tags', name: 'tags', component: TagsView, meta: { title: 'Tags' } }, + // Artist detail — no meta.title (reached by clicking an artist, not nav). + { path: '/artist/:slug', name: 'artist', component: ArtistView }, + { path: '/settings', name: 'settings', component: SettingsView, meta: { title: 'Settings' } }, // FC-3: subscription backbone { path: '/subscriptions', name: 'subscriptions', component: PlaceholderView, meta: { title: 'Subscriptions' } }, @@ -16,7 +28,9 @@ const routes = [ { path: '/downloads', name: 'downloads', component: PlaceholderView, meta: { title: 'Downloads' } } ] -export default createRouter({ +const router = createRouter({ history: createWebHistory(), routes }) + +export default router diff --git a/frontend/test/router.spec.js b/frontend/test/router.spec.js new file mode 100644 index 0000000..cc1a1ec --- /dev/null +++ b/frontend/test/router.spec.js @@ -0,0 +1,24 @@ +import { describe, it, expect } from 'vitest' +import router, { FRONT_DOOR } from '../src/router.js' + +describe('router', () => { + it('FRONT_DOOR defaults to /showcase', () => { + expect(FRONT_DOOR).toBe('/showcase') + }) + + it('/ redirects to FRONT_DOOR', () => { + const resolved = router.resolve('/') + expect(resolved.path).toBe(FRONT_DOOR) + }) + + it('gallery is reachable at /gallery', () => { + expect(router.resolve('/gallery').name).toBe('gallery') + }) + + it('showcase, tags, artist resolve to named routes', () => { + expect(router.resolve('/showcase').name).toBe('showcase') + expect(router.resolve('/tags').name).toBe('tags') + expect(router.resolve('/artist/some-slug').name).toBe('artist') + expect(router.resolve('/artist/some-slug').params.slug).toBe('some-slug') + }) +})