From e6d4bbd03d98ee5e7c90d297864cb9ee7c0ec6eb Mon Sep 17 00:00:00 2001 From: Jeff Repanich Date: Sun, 26 Jul 2026 06:08:50 -0400 Subject: [PATCH 1/3] fix: show sidebar on documentation index --- scripts/verify-static-output.ts | 30 ++++++++++-------------------- src/pages/_routes.tsx | 20 -------------------- src/pages/docs/_layout.tsx | 8 ++++---- src/pages/docs/page.tsx | 3 ++- 4 files changed, 16 insertions(+), 45 deletions(-) diff --git a/scripts/verify-static-output.ts b/scripts/verify-static-output.ts index cabfa30..3ebe83d 100644 --- a/scripts/verify-static-output.ts +++ b/scripts/verify-static-output.ts @@ -22,9 +22,6 @@ const apiSymbolsByRoute = new Map( apiSymbolSets[entrypoint.symbolSet as keyof typeof apiSymbolSets], ]) ); -const docsHome = docsCatalog.find((page) => page.route === '/docs'); -if (!docsHome) throw new Error('Missing /docs catalog entry'); - const marketing = [ { route: '/', ...marketingRouteMetadata['/'] }, ...marketingPages.map((page) => ({ @@ -32,26 +29,19 @@ const marketing = [ title: page.title, description: page.description, })), - { - route: '/docs', - title: `${docsHome.title} | Askr`, - description: docsHome.description, - }, { route: '/404', ...marketingRouteMetadata['/404'] }, ].map((page) => ({ ...page, layout: 'marketing' })); -const docs = docsCatalog - .filter((page) => page.route !== '/docs') - .map((page) => ({ - route: page.route, - title: `${page.title} | Askr`, - description: page.description, - headings: page.headings.map(({ id }) => ({ id })), - apiSymbols: apiSymbolsByRoute - .get(page.route) - ?.map(({ anchor }) => ({ anchor })), - layout: 'docs', - })); +const docs = docsCatalog.map((page) => ({ + route: page.route, + title: `${page.title} | Askr`, + description: page.description, + headings: page.headings.map(({ id }) => ({ id })), + apiSymbols: apiSymbolsByRoute + .get(page.route) + ?.map(({ anchor }) => ({ anchor })), + layout: 'docs', +})); const expectations = [...marketing, ...docs]; const expectedRoutes = new Set(expectations.map(({ route }) => route)); diff --git a/src/pages/_routes.tsx b/src/pages/_routes.tsx index 5efab8a..f4eedb8 100644 --- a/src/pages/_routes.tsx +++ b/src/pages/_routes.tsx @@ -6,7 +6,6 @@ import { } from './marketing/_routes'; import { DocsLayout } from './docs/_layout'; import { docsCatalog } from './docs/catalog'; -import { MarketingLayout } from './marketing/_layout'; export type { RouteMetadata } from './marketing/_routes'; @@ -23,15 +22,8 @@ export const routeMetadata: Readonly> = { export const routeRegistry = createRouteRegistry(() => { registerMarketingRoutes(); - const docsHome = docsCatalog.find((page) => page.route === '/docs'); - if (!docsHome) throw new Error('Missing /docs catalog entry'); - group({ layout: MarketingLayout }, () => { - route('/docs', lazy(docsHome.loader), { meta: routeMetadata['/docs'] }); - }); - group({ layout: DocsLayout }, () => { for (const page of docsCatalog) { - if (page.route === '/docs') continue; route(page.route, lazy(page.loader), { meta: routeMetadata[page.route], }); @@ -49,20 +41,8 @@ export async function createStaticRouteRegistry() { const registry = createRouteRegistry(() => { registerMarketingRoutes(); - const docsHome = docsCatalog.find((page) => page.route === '/docs'); - if (!docsHome) throw new Error('Missing /docs catalog entry'); - group({ layout: MarketingLayout }, () => { - let component = components.get(docsHome.loader); - if (!component) { - component = lazy(docsHome.loader); - components.set(docsHome.loader, component); - } - route('/docs', component, { meta: routeMetadata['/docs'] }); - }); - group({ layout: DocsLayout }, () => { for (const page of docsCatalog) { - if (page.route === '/docs') continue; let component = components.get(page.loader); if (!component) { component = lazy(page.loader); diff --git a/src/pages/docs/_layout.tsx b/src/pages/docs/_layout.tsx index d09d24d..a228607 100644 --- a/src/pages/docs/_layout.tsx +++ b/src/pages/docs/_layout.tsx @@ -62,7 +62,7 @@ function DocsNavigation({ close }: { close?: () => void }) { }, new Map()); return ( - + @@ -76,13 +76,13 @@ function DocsNavigation({ close }: { close?: () => void }) { {active && ( {Array.from(subsections).map(([label, pages]) => ( -
+
{label !== section.label && ( {label} )} {pages.map((page) => ( - + On this page

    {headings.map((heading) => ( -
  • +
  • {heading.title}
  • ))} diff --git a/src/pages/docs/page.tsx b/src/pages/docs/page.tsx index 445ef12..51cd0db 100644 --- a/src/pages/docs/page.tsx +++ b/src/pages/docs/page.tsx @@ -83,6 +83,7 @@ function HeadingContent({ }: { item: DocsHeadingDefinition; page: DocsPageDefinition; + key?: string; }) { return (
    @@ -186,7 +187,7 @@ export default function DocsPage() { {page.headings.map((item) => ( - + ))} {page.route === '/docs' && ( <> From 1b5fba2b6cb2a5f3977cc81715c1310d824f0846 Mon Sep 17 00:00:00 2001 From: Jeff Repanich Date: Sun, 26 Jul 2026 06:12:46 -0400 Subject: [PATCH 2/3] fix: simplify docs sidebar navigation --- src/pages/docs/_layout.tsx | 114 ++++++++++--------------------------- 1 file changed, 31 insertions(+), 83 deletions(-) diff --git a/src/pages/docs/_layout.tsx b/src/pages/docs/_layout.tsx index a228607..9740e69 100644 --- a/src/pages/docs/_layout.tsx +++ b/src/pages/docs/_layout.tsx @@ -13,18 +13,6 @@ import { SidebarScope, SidebarTrigger, } from '@askrjs/themes/components'; -import { - BookOpenIcon, - CompassIcon, - Layers3Icon, - LibraryIcon, - MonitorIcon, - PanelsTopLeftIcon, - RocketIcon, - RouteIcon, - ServerIcon, - WrenchIcon, -} from '@askrjs/lucide'; import { SiteLayout } from '../site-layout'; import { docsByRoute, @@ -35,84 +23,44 @@ import { function DocsNavigation({ close }: { close?: () => void }) { const activePath = resolveDocsRoute(currentRoute()); - const sectionIcons = [ - BookOpenIcon, - RocketIcon, - Layers3Icon, - RouteIcon, - MonitorIcon, - ServerIcon, - PanelsTopLeftIcon, - WrenchIcon, - CompassIcon, - LibraryIcon, - ] as const; return ( - {docsSections.map((section, sectionIndex) => { - const active = section.pages.some((page) => page.route === activePath); - const SectionIcon = sectionIcons[sectionIndex] ?? BookOpenIcon; - const subsections = section.pages.reduce((groups, page) => { - const label = page.navSection ?? section.label; - const pages = groups.get(label) ?? []; - pages.push(page); - groups.set(label, pages); - return groups; - }, new Map()); - + {docsSections.map((section) => { return ( - - - - - - - - {active && ( - - {Array.from(subsections).map(([label, pages]) => ( -
    - {label !== section.label && ( - {label} - )} - - {pages.map((page) => ( - - {section.label} + + + {section.pages.map((page) => ( + + + + {page.title} + {page.status !== 'stable' && ( + - - {page.title} - {page.status !== 'stable' && ( - - • - - )} - - - - ))} - -
    + • + + )} + + + ))} -
    - )} + +
    ); })} From 63ce234b5f8210d2bac6c27d2149535b98d5e0c0 Mon Sep 17 00:00:00 2001 From: Jeff Repanich Date: Sun, 26 Jul 2026 06:17:57 -0400 Subject: [PATCH 3/3] fix: type keyed heading list --- src/pages/docs/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/docs/page.tsx b/src/pages/docs/page.tsx index 51cd0db..d9ee4a7 100644 --- a/src/pages/docs/page.tsx +++ b/src/pages/docs/page.tsx @@ -83,7 +83,7 @@ function HeadingContent({ }: { item: DocsHeadingDefinition; page: DocsPageDefinition; - key?: string; + [prop: string]: unknown; }) { return (