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 */}