@@ -41,6 +41,7 @@ import { transformerMeta } from "@/lib/rehype-code-meta";
4141import {
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
0 commit comments