diff --git a/app/[[...slug]]/page.tsx b/app/[[...slug]]/page.tsx index 1c390be..8984065 100644 --- a/app/[[...slug]]/page.tsx +++ b/app/[[...slug]]/page.tsx @@ -1,14 +1,14 @@ import type { Metadata } from 'next'; import { DocsLayout } from 'fumadocs-ui/layouts/docs'; -import { HomeLayout } from 'fumadocs-ui/layouts/home'; import { DocsPage, DocsBody } from 'fumadocs-ui/page'; import { notFound } from 'next/navigation'; -import { source, mainSource, developmentSource, selfHostedSource } from '@/lib/source'; +import { source } from '@/lib/source'; import { generatePageMetadata, getCanonicalUrl } from '@/lib/seo-utils'; import { getFinalPageTitle } from '@/lib/h1-extractor'; import { readFile } from 'fs/promises'; import { getMDXComponents } from '@/mdx-components'; -import { homeOptions, docsOptions } from '../layout.config'; +import { docsOptions } from '../layout.config'; +import { generateTechArticleSchema, generateBreadcrumbSchema, combineSchemas } from '@/lib/structured-data'; export default async function Page({ params, @@ -24,53 +24,65 @@ export default async function Page({ const MDX = page.data.body; - // Determine if this is the root page (no sidebar needed) - const isRootPage = !slug || slug.length === 0; + // Generate structured data for all pages with content + let structuredData = ''; + if (slug && slug.length > 0) { + const slugString = slug.join('/'); + const url = `https://deploystack.io/docs/${slugString}`; + + // Get the final title (same logic as in generateMetadata) + let finalTitle = page.data.title; + try { + const filePath = page.file.path; + const absolutePath = `./docs/${filePath}`; + const rawContent = await readFile(absolutePath, 'utf-8'); + finalTitle = getFinalPageTitle(rawContent, page.data.title); + } catch (error) { + finalTitle = page.data.title; + } - // Use HomeLayout for root page (no sidebar), DocsLayout for all other pages - if (isRootPage) { - return ( - -
-
- -
-
-
- ); + const articleSchema = generateTechArticleSchema({ + title: finalTitle, + description: page.data.description, + slug, + url, + }); + + const breadcrumbSchema = generateBreadcrumbSchema(slug); + structuredData = combineSchemas(articleSchema, breadcrumbSchema); } - // Determine which section we're in and get the appropriate page tree - const firstSegment = slug[0]; - let pageTree = mainSource.pageTree; - let navTitle = 'DeployStack Docs'; - - if (firstSegment === 'development') { - pageTree = developmentSource.pageTree; - navTitle = 'Development Docs'; - } else if (firstSegment === 'self-hosted') { - pageTree = selfHostedSource.pageTree; - navTitle = 'Self-Hosted Docs'; - } + // Always use the unified source pageTree that includes all sections + // Instead of switching between different trees, show all sections together + const pageTree = source.pageTree; + // Always use DocsLayout with sidebar for all pages including root return ( - - - - - - - + <> + {structuredData && ( +