cmux/web/app/components/site-header.tsx
Lawrence Chen f502f84144
Add Read the Docs link below bottom CTA on homepage (#411)
* Add "Read the Docs" link below bottom CTA on homepage

* Increase top padding on Read the Docs link

* Reduce docs horizontal padding on mobile

* Align docs content with header on mobile, increase top padding

* Make sticky header fully opaque with subtle bottom border

* Fix sticky header on mobile by containing horizontal overflow in content area

Wide content (hierarchy diagrams, code blocks) was causing horizontal
page scroll, which breaks position:sticky on mobile browsers. Added
overflow-x:hidden to the main content area (below the header in DOM)
and overflow-x:auto to docs pre blocks so they scroll internally.

* Remove bottom border from sticky header
2026-02-23 20:09:44 -08:00

152 lines
4.7 KiB
TypeScript

"use client";
import Link from "next/link";
import posthog from "posthog-js";
import { NavLinks } from "./nav-links";
import { DownloadButton } from "./download-button";
import { ThemeToggle } from "../theme";
import {
useMobileDrawer,
MobileDrawerOverlay,
MobileDrawerToggle,
} from "./mobile-drawer";
export function SiteHeader({
section,
hideLogo,
}: {
section?: string;
hideLogo?: boolean;
}) {
const { open, toggle, close, drawerRef, buttonRef } = useMobileDrawer();
return (
<>
<header className="sticky top-0 z-30 w-full bg-background">
<div className="w-full max-w-6xl mx-auto flex items-center px-6 h-12">
{/* Left: logo + section */}
<div className="flex flex-1 items-center gap-3 min-w-0">
{!hideLogo && (
<>
<Link href="/" className="flex items-center gap-2.5">
<img
src="/logo.png"
alt="cmux"
width={24}
height={24}
className="rounded-md"
/>
<span className="text-sm font-semibold tracking-tight">
cmux
</span>
</Link>
{section && (
<>
<span className="text-border text-[13px]">/</span>
<span className="text-[13px] text-muted">{section}</span>
</>
)}
</>
)}
</div>
{/* Center: nav links */}
<nav className="hidden md:flex items-center justify-center gap-4 text-sm text-muted shrink-0">
<NavLinks />
</nav>
{/* Right: Download + theme + mobile */}
<div className="flex flex-1 items-center justify-end gap-1 min-w-0">
<div className="hidden md:block">
<DownloadButton size="sm" location="navbar" />
</div>
<ThemeToggle />
<MobileDrawerToggle
open={open}
onClick={toggle}
buttonRef={buttonRef}
/>
</div>
</div>
</header>
{/* Mobile overlay + drawer — outside header to avoid backdrop-filter breaking fixed positioning on iOS */}
<MobileDrawerOverlay open={open} onClose={close} />
<nav
ref={drawerRef}
role="navigation"
aria-label="Main navigation"
className={`fixed inset-y-0 right-0 z-50 w-56 bg-background border-l border-border overflow-y-auto transition-transform md:hidden ${
open ? "translate-x-0" : "translate-x-full invisible"
}`}
>
{/* Drawer header — mirrors the site header row */}
<div className="flex items-center justify-end gap-1 px-4 h-12">
<ThemeToggle />
<button
onClick={close}
className="w-8 h-8 flex items-center justify-center text-muted hover:text-foreground transition-colors"
aria-label="Close menu"
>
<svg
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
aria-hidden="true"
>
<path d="M18 6L6 18M6 6l12 12" />
</svg>
</button>
</div>
<div className="flex flex-col gap-3 text-sm text-muted px-4 pb-4">
<Link
href="/docs/getting-started"
onClick={close}
className="hover:text-foreground transition-colors py-1"
>
Docs
</Link>
<Link
href="/blog"
onClick={close}
className="hover:text-foreground transition-colors py-1"
>
Blog
</Link>
<Link
href="/docs/changelog"
onClick={close}
className="hover:text-foreground transition-colors py-1"
>
Changelog
</Link>
<Link
href="/community"
onClick={close}
className="hover:text-foreground transition-colors py-1"
>
Community
</Link>
<a
href="https://github.com/manaflow-ai/cmux"
target="_blank"
rel="noopener noreferrer"
onClick={() => posthog.capture("cmuxterm_github_clicked", { location: "mobile_drawer" })}
className="hover:text-foreground transition-colors py-1"
>
GitHub
</a>
<div className="pt-2">
<DownloadButton size="sm" location="mobile_drawer" />
</div>
</div>
</nav>
</>
);
}