diff --git a/apps/website/e2e/docs.spec.ts b/apps/website/e2e/docs.spec.ts index 8cbed031..3175f9b1 100644 --- a/apps/website/e2e/docs.spec.ts +++ b/apps/website/e2e/docs.spec.ts @@ -56,6 +56,16 @@ test.describe('Docs slug page', () => { await expect(page.locator('article').first()).toBeVisible(); }); + test('renders the branded chrome (sidebar mark, page-header eyebrow, prev/next direction)', async ({ page }) => { + await page.goto(route); + // Sidebar shows the active library's logo mark + await expect(page.locator('aside img[src="/logos/langgraph.svg"]').first()).toBeVisible(); + // Branded page header eyebrow + await expect(page.getByText(/LangGraph\s+·\s+Getting Started/i).first()).toBeVisible(); + // Prev/Next: introduction is the first page, so a "Next →" card is present + await expect(page.getByText('Next →').first()).toBeVisible(); + }); + test('breadcrumb shows the library + page title', async ({ page }) => { await page.goto(route); const breadcrumb = page.locator('nav[aria-label="Breadcrumb"]').first(); diff --git a/apps/website/src/app/docs/[library]/[section]/[slug]/page.tsx b/apps/website/src/app/docs/[library]/[section]/[slug]/page.tsx index af130c5b..42aa5c15 100644 --- a/apps/website/src/app/docs/[library]/[section]/[slug]/page.tsx +++ b/apps/website/src/app/docs/[library]/[section]/[slug]/page.tsx @@ -5,6 +5,7 @@ import { DocsSidebar } from '../../../../../components/docs/DocsSidebar'; import { MdxRenderer } from '../../../../../components/docs/MdxRenderer'; import { DocsSearch } from '../../../../../components/docs/DocsSearch'; import { DocsBreadcrumb } from '../../../../../components/docs/DocsBreadcrumb'; +import { DocsPageHeader } from '../../../../../components/docs/DocsPageHeader'; import { DocsPrevNext } from '../../../../../components/docs/DocsPrevNext'; import { getDocBySlug, getAllDocSlugs, getDocMetadata } from '../../../../../lib/docs'; import { ApiDocRenderer, type ApiDocEntry } from '../../../../../components/docs/ApiDocRenderer'; @@ -73,6 +74,7 @@ export default async function DocsPage({ params }: DocsRouteProps) {
+
c.toUpperCase()); +} + +interface Props { + library: LibraryId; + section: string; + /** Right-aligned slot for per-page actions (Spec 2). Optional. */ + actions?: ReactNode; +} + +export function DocsPageHeader({ library, section, actions }: Props) { + const libTitle = getLibraryConfig(library)?.title ?? library; + const sectionTitle = getDocsSection(library, section)?.title ?? humanize(section); + + return ( +
+
+ + + {libTitle} · {sectionTitle} + +
+ {actions ?
{actions}
: null} +
+ ); +} diff --git a/apps/website/src/components/docs/DocsPrevNext.tsx b/apps/website/src/components/docs/DocsPrevNext.tsx index 23d8d9ac..41cdfd95 100644 --- a/apps/website/src/components/docs/DocsPrevNext.tsx +++ b/apps/website/src/components/docs/DocsPrevNext.tsx @@ -55,16 +55,21 @@ export function DocsPrevNext({ library, section, slug }: Props) { marginBottom: 16, }} > + {prev ? ( - + ← Previous
{prev.title} @@ -76,14 +81,14 @@ export function DocsPrevNext({ library, section, slug }: Props) { )} {next ? ( - + Next →
{next.title} diff --git a/apps/website/src/components/docs/DocsSidebar.tsx b/apps/website/src/components/docs/DocsSidebar.tsx index 05f94393..9adf5044 100644 --- a/apps/website/src/components/docs/DocsSidebar.tsx +++ b/apps/website/src/components/docs/DocsSidebar.tsx @@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation'; import { docsConfig, getLibraryConfig, type DocsSection, type LibraryId } from '../../lib/docs-config'; import { tokens } from '@threadplane/design-tokens'; import { Pill } from '../ui/Pill'; +import { LibraryMark } from './LibraryMark'; interface Props { activeLibrary: LibraryId; @@ -40,8 +41,11 @@ function LibraryDropdown({ activeLibrary }: { activeLibrary: LibraryId }) { fontWeight: 600, }} > - - {currentLib?.title ?? activeLibrary} + + + + {currentLib?.title ?? activeLibrary} + - - {lib.title} + + - - {lib.description} + + + {lib.title} + + + {lib.description} + ))} @@ -146,12 +155,10 @@ function SectionGroup({ {page.title} @@ -177,6 +184,20 @@ export function DocsSidebar({ activeLibrary, activeSection, activeSlug }: Props) top: '5rem', }} > + {/* Search trigger */}