From e46cdec05bc9cb8562981ca98af5683d9be8f061 Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Tue, 14 Apr 2026 19:08:30 -0400 Subject: [PATCH 1/9] feat(docs-next): dynamically redirect section URLs to first leaf page Previously, section-level URLs like /system/develop or /copy/patterns would 404 since no MD file or legacy fragment exists for them. These were handled by hardcoded Netlify _redirects entries that would drift out of sync with structure.yaml. Replace those hardcoded entries with a dynamic SvelteKit server-side redirect: when the active nav node has children (it's a section), the page server now walks to the first leaf descendant via a recursive firstLeafSlug helper and issues a 302 to that URL. The _redirects file retains only category-level redirects (e.g. /brand/, /system/) which have no matching SvelteKit route. Co-Authored-By: Claude Sonnet 4.6 --- packages/stacks-docs-next/_redirects | 12 +----------- .../[[section]]/[subsection]/+page.server.ts | 14 +++++++++++++- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/stacks-docs-next/_redirects b/packages/stacks-docs-next/_redirects index 7ec3031777..9ab744ec39 100644 --- a/packages/stacks-docs-next/_redirects +++ b/packages/stacks-docs-next/_redirects @@ -2,20 +2,10 @@ https://alpha.stackoverflow.design/* https://stackoverflow.design/:splat 301 https://beta.stackoverflow.design/* https://stackoverflow.design/:splat 302 -# Section index pages → first child (mirrors Navigation.svelte L67) +# Category index pages → first child (section-level pages handled dynamically by SvelteKit) /brand/ /brand/logo 302 - /copy/ /copy/voice 302 -/copy/patterns/ /copy/patterns/messages 302 - /system/ /system/develop/using-stacks 302 -/system/develop/ /system/develop/using-stacks 302 -/system/accessibility/ /system/accessibility/intro 302 -/system/foundation/ /system/foundation/color-fundamentals 302 -/system/base/ /system/base/backgrounds 302 -/system/forms/ /system/forms/checkbox 302 -/system/components/ /system/components/activity-indicator 302 - /handbook/ /handbook/story 302 /resources/ /resources/fonts 302 diff --git a/packages/stacks-docs-next/src/routes/[category]/[[section]]/[subsection]/+page.server.ts b/packages/stacks-docs-next/src/routes/[category]/[[section]]/[subsection]/+page.server.ts index 45d4bd9ae4..62eea33b0d 100644 --- a/packages/stacks-docs-next/src/routes/[category]/[[section]]/[subsection]/+page.server.ts +++ b/packages/stacks-docs-next/src/routes/[category]/[[section]]/[subsection]/+page.server.ts @@ -1,5 +1,5 @@ import type { PageServerLoad } from "./$types"; -import { error } from "@sveltejs/kit"; +import { error, redirect } from "@sveltejs/kit"; import type { Component } from "svelte"; import { render } from "svelte/server"; import TurndownService from "turndown"; @@ -10,6 +10,13 @@ const turndownService = new TurndownService({ const mdFiles = import.meta.glob("$docs/**/*.md"); +type NavItem = { slug: string; items?: NavItem[] }; + +function firstLeafSlug(prefix: string, item: NavItem): string { + if (!item.items?.length) return `${prefix}/${item.slug}`; + return firstLeafSlug(`${prefix}/${item.slug}`, item.items[0]); +} + export const load: PageServerLoad = async (event) => { // SECURITY: Check auth first - don't load any content if unauthorized const parent = await event.parent(); @@ -71,5 +78,10 @@ export const load: PageServerLoad = async (event) => { }; } + // If the active item is a section (has children), redirect to the first leaf page + if (parent.active?.items?.length > 0) { + throw redirect(302, `/${firstLeafSlug(slug, parent.active.items[0])}`); + } + throw error(404, `No content found for ${slug}`); }; From a8a6a851ebd1a9b3973d17d3b16f5586fdc568e9 Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Wed, 15 Apr 2026 11:55:38 -0400 Subject: [PATCH 2/9] Update packages/stacks-docs-next/_redirects Co-authored-by: David Longworth --- packages/stacks-docs-next/_redirects | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stacks-docs-next/_redirects b/packages/stacks-docs-next/_redirects index 9ab744ec39..f5203b97b4 100644 --- a/packages/stacks-docs-next/_redirects +++ b/packages/stacks-docs-next/_redirects @@ -2,7 +2,6 @@ https://alpha.stackoverflow.design/* https://stackoverflow.design/:splat 301 https://beta.stackoverflow.design/* https://stackoverflow.design/:splat 302 -# Category index pages → first child (section-level pages handled dynamically by SvelteKit) /brand/ /brand/logo 302 /copy/ /copy/voice 302 /system/ /system/develop/using-stacks 302 From bb8c60a1732c6f183ab9f6c662b21ada4e887b6f Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Wed, 15 Apr 2026 11:55:49 -0400 Subject: [PATCH 3/9] Update packages/stacks-docs-next/_redirects Co-authored-by: David Longworth --- packages/stacks-docs-next/_redirects | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stacks-docs-next/_redirects b/packages/stacks-docs-next/_redirects index f5203b97b4..5e49dadd69 100644 --- a/packages/stacks-docs-next/_redirects +++ b/packages/stacks-docs-next/_redirects @@ -2,7 +2,6 @@ https://alpha.stackoverflow.design/* https://stackoverflow.design/:splat 301 https://beta.stackoverflow.design/* https://stackoverflow.design/:splat 302 -/brand/ /brand/logo 302 /copy/ /copy/voice 302 /system/ /system/develop/using-stacks 302 /handbook/ /handbook/story 302 From e7a0f0a04dc2c83d4525dd65a52e797f13199dfd Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Wed, 15 Apr 2026 11:55:57 -0400 Subject: [PATCH 4/9] Update packages/stacks-docs-next/_redirects Co-authored-by: David Longworth --- packages/stacks-docs-next/_redirects | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stacks-docs-next/_redirects b/packages/stacks-docs-next/_redirects index 5e49dadd69..67f5c1a00d 100644 --- a/packages/stacks-docs-next/_redirects +++ b/packages/stacks-docs-next/_redirects @@ -3,7 +3,6 @@ https://alpha.stackoverflow.design/* https://stackoverflow.design/:s https://beta.stackoverflow.design/* https://stackoverflow.design/:splat 302 /copy/ /copy/voice 302 -/system/ /system/develop/using-stacks 302 /handbook/ /handbook/story 302 /resources/ /resources/fonts 302 From 86faf3b8c681dad9f2bcdc25fcda5b40cae8ce6d Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Wed, 15 Apr 2026 11:56:06 -0400 Subject: [PATCH 5/9] Update packages/stacks-docs-next/_redirects Co-authored-by: David Longworth --- packages/stacks-docs-next/_redirects | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stacks-docs-next/_redirects b/packages/stacks-docs-next/_redirects index 67f5c1a00d..a93b4ae630 100644 --- a/packages/stacks-docs-next/_redirects +++ b/packages/stacks-docs-next/_redirects @@ -2,7 +2,6 @@ https://alpha.stackoverflow.design/* https://stackoverflow.design/:splat 301 https://beta.stackoverflow.design/* https://stackoverflow.design/:splat 302 -/copy/ /copy/voice 302 /handbook/ /handbook/story 302 /resources/ /resources/fonts 302 From 2ceaaefa46798477a9c1fad14f3d7028fb7ff924 Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Wed, 15 Apr 2026 11:56:17 -0400 Subject: [PATCH 6/9] Update packages/stacks-docs-next/_redirects Co-authored-by: David Longworth --- packages/stacks-docs-next/_redirects | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stacks-docs-next/_redirects b/packages/stacks-docs-next/_redirects index a93b4ae630..d0fcebe747 100644 --- a/packages/stacks-docs-next/_redirects +++ b/packages/stacks-docs-next/_redirects @@ -2,7 +2,6 @@ https://alpha.stackoverflow.design/* https://stackoverflow.design/:splat 301 https://beta.stackoverflow.design/* https://stackoverflow.design/:splat 302 -/handbook/ /handbook/story 302 /resources/ /resources/fonts 302 # Email section → v2 docs From 350909f44195e16dedd4abc2eb3def629ebe2112 Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Wed, 15 Apr 2026 12:00:04 -0400 Subject: [PATCH 7/9] Update packages/stacks-docs-next/_redirects Co-authored-by: David Longworth --- packages/stacks-docs-next/_redirects | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stacks-docs-next/_redirects b/packages/stacks-docs-next/_redirects index d0fcebe747..10622254ec 100644 --- a/packages/stacks-docs-next/_redirects +++ b/packages/stacks-docs-next/_redirects @@ -2,7 +2,6 @@ https://alpha.stackoverflow.design/* https://stackoverflow.design/:splat 301 https://beta.stackoverflow.design/* https://stackoverflow.design/:splat 302 -/resources/ /resources/fonts 302 # Email section → v2 docs /email* https://v2.stackoverflow.design/email:splat 302 From 60e8729948afe43a2057c9f90c5f5ec6fac5f544 Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Fri, 24 Apr 2026 13:21:37 -0400 Subject: [PATCH 8/9] chore(docs-next): remove unused logo asset redirect Ported from v2 Netlify.toml but not needed. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/stacks-docs-next/_redirects | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/stacks-docs-next/_redirects b/packages/stacks-docs-next/_redirects index 10622254ec..470b841c97 100644 --- a/packages/stacks-docs-next/_redirects +++ b/packages/stacks-docs-next/_redirects @@ -49,9 +49,6 @@ https://beta.stackoverflow.design/* https://stackoverflow.design/:s # General catch-all: all remaining /product/* → /system/* /product/* /system/:splat 302 -# Assets -/assets/img/logo-stacks@2x.png /assets/img/logos/so/logo-stacks@2x.png 302 - # Legacy /content paths (brand & copywriting, migrated Feb 2026) /content /copy 302 /content/guidelines/principles /copy 302 From 2d87487599fa6caf2b42d12c8b33f2d37df98f11 Mon Sep 17 00:00:00 2001 From: Dan Cormier Date: Fri, 24 Apr 2026 13:42:00 -0400 Subject: [PATCH 9/9] fix(docs-next): return 404 for unknown category URLs Without a page.server.ts at the [category] level, invalid URLs like /resourceswww rendered an empty landing page because `active` was undefined but nothing threw. Guard it explicitly so +error.svelte gets a chance to render. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/routes/[category]/+page.server.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 packages/stacks-docs-next/src/routes/[category]/+page.server.ts diff --git a/packages/stacks-docs-next/src/routes/[category]/+page.server.ts b/packages/stacks-docs-next/src/routes/[category]/+page.server.ts new file mode 100644 index 0000000000..274aff5b63 --- /dev/null +++ b/packages/stacks-docs-next/src/routes/[category]/+page.server.ts @@ -0,0 +1,9 @@ +import type { PageServerLoad } from "./$types"; +import { error } from "@sveltejs/kit"; + +export const load: PageServerLoad = async (event) => { + const parent = await event.parent(); + if (!parent.active) { + throw error(404, `No content found for /${event.params.category}`); + } +};