From 143a9612cf2ccc9b217971bd63e489efa5660665 Mon Sep 17 00:00:00 2001 From: Hannah Casey <61227037+hanaCasey@users.noreply.github.com> Date: Thu, 13 Aug 2026 09:19:53 +0000 Subject: [PATCH 1/2] feat(frontend): separate Dashboard from All Hackathons, and drop About MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two distinct labels turned out not to be enough. "Dashboard" and "Hackathons" are both nouns for a list of hackathons and neither word says WHOSE — and the bar's own wordmark reads "Hackathons" too, so the noun appeared twice in one row, once as the platform and once as a page inside it. Pointing the two entries at two destinations (they used to be one entry that changed target with your session) stopped them fighting without making them tellable apart. The pair is separated three ways now instead of one: - the label states the scope — "All Hackathons" against a Dashboard that is yours, one label whoever is asking, because a word that renames itself with your session is the same bug as one that re-points itself; - an icon carries it before the label is read — layout-dashboard for the personal panel, compass for browsing; - a one-line hint spells it out: a `title` on the bar, and VISIBLE text in the mobile panel, where there is no hover for a tooltip to use. About leaves the navbar. The page stays exactly as it is — a CMS-backed, organiser-editable SitePage — and AppFooter's Platform column already links it from every route in both groups, since AppShell mounts that footer for (app) as well as (public). Privacy and Terms are the same kind of page and were never in the bar either. The "every entry present on every page" rule still holds: it forbids an entry that appears and disappears as you move through the app, not one that is consistently absent and linked from the footer instead. 02-login is re-specified rather than trimmed: it asserted About WAS in the bar, so it now asserts the two entries by their new names, counts the bar's links (a third has to argue for itself here first), and adds the claim removal actually rests on — About absent from the header and reachable from the footer on both a public and a signed-in page, clicked rather than merely read off an href. The footer locator is scoped to the Platform column: the SDSC column beside it links datascience.ch's own About, so a footer-wide match finds two links. --- .claude/CLAUDE.md | 19 ++- .../tests/smoke/02-login.spec.ts | 67 ++++++++-- .../src/lib/components/layout/NavBar.svelte | 126 +++++++++++++----- 3 files changed, 165 insertions(+), 47 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 7713693e..8ebb89d0 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -256,12 +256,27 @@ vote binds. This design has **no account menu at all** — identity is a monogram and sign-out is a top-bar button — so `02-login` and `07-account-menu` were re-specified -rather than repaired. Nav IA is one meaning per entry: Dashboard (yours), -Hackathons (all, searchable), About; the wordmark goes home for everyone. +rather than repaired. Nav IA is one meaning per entry: Dashboard (yours) and +**All Hackathons** (all, searchable); the wordmark goes home for everyone. "Hackathons" used to resolve to the dashboard when signed in and the browse page when not, so the same word meant two things and the browse page was unreachable from the chrome for exactly the people with an account. +**Two distinct labels were not enough** (fixed 2026-08-13). Pointing the two +entries at two destinations stopped them fighting, but "Dashboard" and +"Hackathons" are both nouns for a list of hackathons and neither word says +*whose* — and the bar's own wordmark reads "Hackathons" too, so the noun appeared +twice, once as the platform and once as a page inside it. The pair is separated +three ways now: the label states the scope (`All Hackathons`), an icon carries it +pre-reading (`layout-dashboard` vs `compass`), and a one-line hint spells it out — +as a `title` on the bar, as visible text in the mobile panel, where there is no +hover to reveal a tooltip. **About left the navbar in the same change**: the page +stays (it is CMS-backed and organiser-editable), `AppFooter`'s Platform column +links it from every route in both groups — `AppShell` mounts that footer for +`(app)` as well as `(public)` — and Privacy and Terms are the same kind of page +and were never in the bar either. Absent-everywhere is what the "every entry on +every page" rule asks for; absent-only-once-you-sign-in is what it forbids. + **3. Bringing `origin/main` in (2026-08-06)** — `docs/review-main-2026-08-06.md`: 183 commits, 746 files, reviewed from code on both sides. **The merge is not additive everywhere** — main DELETED the diff --git a/.claude/skills/hackathon-e2e/tests/smoke/02-login.spec.ts b/.claude/skills/hackathon-e2e/tests/smoke/02-login.spec.ts index 57f63209..c87e8a9f 100644 --- a/.claude/skills/hackathon-e2e/tests/smoke/02-login.spec.ts +++ b/.claude/skills/hackathon-e2e/tests/smoke/02-login.spec.ts @@ -29,21 +29,21 @@ for (const persona of ALL_PERSONAS) { await expect(page.getByRole("heading", { name: /Welcome back/ })).toBeVisible() }) - test(`the public shell links to the hackathon list and About`, async ({ page }) => { + test(`the public shell links to the hackathon list`, async ({ page }) => { await page.goto("/") // The footer is a