Tabs Below the Header

The Tabs component docks itself below the fixed header — tablist semantics and arrow-key navigation included.

<Tabs> + <Tab>headertabstablist
Open fullscreen
9:41

In this demo

Orbit — profile

What to try

  • Scroll down — tabs hitch below the header
  • Arrow keys move between tabs
  • Switch tabs while everything stays docked

Code

app.tsx
import { AppShell, Header, Content, Tabs, Tab, MotionProvider } from "appshell-react";
import { framerMotionAdapter } from "appshell-react/motion-framer";
import { useState } from "react";

export default function App() {
  const [tab, setTab] = useState("posts");

  return (
    <MotionProvider adapter={framerMotionAdapter}>
      <AppShell safeArea>
        <Header
          behavior="fixed"
          logo={<span className="font-bold">Orbit</span>}
          title="Nadia Reyes"
          subtitle="@nadia · Product designer"
        />

        {/* Docks itself below the fixed header via --header-height —
            real tablist semantics, arrow-key navigation included. */}
        <Tabs value={tab} onValueChange={setTab} aria-label="Profile sections">
          <Tab value="posts" label="Posts" />
          <Tab value="replies" label="Replies" />
          <Tab value="media" label="Media" />
          <Tab value="likes" label="Likes" />
        </Tabs>

        <Content>{/* content for the active tab */}</Content>
      </AppShell>
    </MotionProvider>
  );
}