Skip to content

Commit 4e21ab1

Browse files
committed
fix(showcase): restore authored shell-docs sidebar
1 parent cbeb6c8 commit 4e21ab1

4 files changed

Lines changed: 37 additions & 33 deletions

File tree

showcase/shell-docs/src/app/[[...slug]]/page.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,13 @@ import { ShellDocsLayout } from "@/components/shell-docs-layout";
2323
import { SidebarFrameworkSelector } from "@/components/sidebar-framework-selector";
2424
import { UnscopedDocsPage } from "@/components/unscoped-docs-page";
2525
import { FrameworkLogo } from "@/components/icons/framework-icons";
26-
import { buildFrameworkNav, loadDoc } from "@/lib/docs-render";
26+
import {
27+
buildFrameworkNav,
28+
buildFrameworkOnlyNav,
29+
loadDoc,
30+
} from "@/lib/docs-render";
2731
import { navTreeToPageTree } from "@/lib/page-tree-bridge";
28-
import { getDocsFolder, getIntegration } from "@/lib/registry";
32+
import { getDocsFolder, getDocsMode, getIntegration } from "@/lib/registry";
2933
import { buildDocMetadata } from "@/lib/seo-metadata";
3034

3135
// Force dynamic rendering so unknown slugs reliably return HTTP 404
@@ -78,16 +82,14 @@ export async function generateMetadata({
7882

7983
function DocsOverview() {
8084
// Sidebar matches the soft-default framework so home `/` and
81-
// post-click `/built-in-agent/...` views share the same merged IA used
82-
// by every framework-scoped route.
85+
// post-click `/built-in-agent/...` views share the same authored IA.
8386
const docsFolder = getDocsFolder(HOME_DEFAULT_FRAMEWORK);
8487
const integrationName =
8588
getIntegration(HOME_DEFAULT_FRAMEWORK)?.name ?? "Built-in Agent";
86-
const navTree = buildFrameworkNav(
87-
docsFolder,
88-
integrationName,
89-
HOME_DEFAULT_FRAMEWORK,
90-
);
89+
const navTree =
90+
getDocsMode(HOME_DEFAULT_FRAMEWORK) === "authored"
91+
? buildFrameworkOnlyNav(docsFolder)
92+
: buildFrameworkNav(docsFolder, integrationName, HOME_DEFAULT_FRAMEWORK);
9193
const pageTree = navTreeToPageTree(navTree, `/${HOME_DEFAULT_FRAMEWORK}`);
9294

9395
// Rewrite the Introduction entry's URL from `/built-in-agent` (or

showcase/shell-docs/src/app/[framework]/[[...slug]]/page.tsx

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import { transformerMeta } from "@/lib/rehype-code-meta";
4141
import {
4242
CONTENT_DIR,
4343
buildFrameworkNav,
44+
buildFrameworkOnlyNav,
4445
findFrameworksWithCell,
4546
findFrameworksWithPage,
4647
loadDoc,
@@ -270,7 +271,8 @@ export default async function FrameworkScopedDocsPage({
270271
// Content resolution order depends on docs_mode:
271272
//
272273
// authored — per-framework MDX wins for every slug. Authored pages
273-
// can replace root pages without changing sidebar IA.
274+
// can replace root pages while keeping the framework's
275+
// authored sidebar IA.
274276
// Only fall back to root if the framework simply has no
275277
// file for the requested slug (preserves the "shared"
276278
// fallback for slugs the framework intentionally leaves
@@ -302,13 +304,13 @@ export default async function FrameworkScopedDocsPage({
302304
}
303305
}
304306

305-
// Sidebar IA is mode-independent: authored/generated controls which
306-
// MDX file renders, not the user's navigation structure.
307-
const navTree: NavNode[] = buildFrameworkNav(
308-
docsFolder,
309-
frameworkName,
310-
framework,
311-
);
307+
// Authored integrations own their full docs tree and sidebar IA.
308+
// Generated integrations use the root docs IA with a sparse
309+
// framework-specific override section.
310+
const navTree: NavNode[] =
311+
docsMode === "authored"
312+
? buildFrameworkOnlyNav(docsFolder)
313+
: buildFrameworkNav(docsFolder, frameworkName, framework);
312314

313315
if (!doc) {
314316
// No root MDX and no override for this framework. If the topic
@@ -433,8 +435,9 @@ async function FrameworkRootPage({ framework }: { framework: string }) {
433435
// let the Tier 1/2/3 cascade below decide whether to render or 404.
434436
const integration = getIntegration(framework);
435437

436-
// Same nav merge as the scoped-page route. Resolve the URL slug to
437-
// its docs folder — see comment in FrameworkScopedDocsPage above.
438+
// Resolve the URL slug to its docs folder — see comment in
439+
// FrameworkScopedDocsPage above. Authored frameworks get their own
440+
// sidebar tree; generated frameworks get the merged root/override IA.
438441
// `getDocsFolder` already falls back to the slug itself when there's
439442
// no override, so it's safe for docs-only frameworks.
440443
const docsFolder = getDocsFolder(framework);
@@ -445,11 +448,10 @@ async function FrameworkRootPage({ framework }: { framework: string }) {
445448
frameworkOverviews[framework]?.frameworkName ??
446449
framework;
447450
const docsMode = getDocsMode(framework);
448-
const navTree: NavNode[] = buildFrameworkNav(
449-
docsFolder,
450-
integrationName,
451-
framework,
452-
);
451+
const navTree: NavNode[] =
452+
docsMode === "authored"
453+
? buildFrameworkOnlyNav(docsFolder)
454+
: buildFrameworkNav(docsFolder, integrationName, framework);
453455

454456
// Tier 1: data-driven FrameworkOverview. ONLY for `generated` mode —
455457
// `authored` frameworks skip straight to Tier 2 so their ported

showcase/shell-docs/src/lib/docs-render.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -559,10 +559,9 @@ export function buildFrameworkOverridesNav(folder: string): NavNode[] {
559559

560560
/**
561561
* Build a sidebar that contains ONLY the per-framework MDX tree
562-
* (no merge with root nav, no root-equivalent filtering). Retained for
563-
* diagnostics and any callers that need to inspect a package-owned IA
564-
* directly; framework routes use `buildFrameworkNav` so authored and
565-
* generated modes share the same sidebar structure.
562+
* (no merge with root nav, no root-equivalent filtering). Authored
563+
* integrations use this because their `integrations/<folder>/meta.json`
564+
* is the source of truth for page order and section grouping.
566565
*
567566
* Slugs are rewritten to drop the `integrations/<folder>/` prefix and
568567
* the literal `index` → "" rewrite, so links resolve at
@@ -721,9 +720,9 @@ export function mergeFrameworkNav(
721720
}
722721

723722
/**
724-
* Build the framework-scoped sidebar IA used by every framework route.
725-
* This is intentionally independent of docs_mode: generated/authored
726-
* controls MDX resolution, not navigation structure.
723+
* Build the framework-scoped sidebar IA used by generated framework
724+
* routes. Generated docs share the root docs IA and layer sparse
725+
* framework-specific overrides into that tree.
727726
*/
728727
export function buildFrameworkNav(
729728
docsFolder: string,

showcase/shell-docs/src/lib/registry.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,10 @@ export interface Integration {
3838
* - `generated` (default): data-driven `FrameworkOverview` + agnostic
3939
* root MDX merged with per-framework overrides. Kept for the three
4040
* "ready" frameworks (langgraph-{python,typescript}, google-adk).
41-
* - `authored`: render only the per-framework MDX tree under
41+
* - `authored`: render the per-framework MDX tree under
4242
* `content/docs/integrations/<docsFolder>/` with its own sidebar
43-
* (built from that folder's meta.json). No root-MDX fallback.
43+
* (built from that folder's meta.json). Root MDX may still be used
44+
* as a fallback for intentionally shared pages.
4445
* - `hidden`: exclude from the docs site entirely — no `/<slug>`
4546
* route, no switcher entry. Single toggle for "framework has no
4647
* v1 docs to port" (or otherwise should not appear in docs yet).

0 commit comments

Comments
 (0)