import { AppShell, AppShellBody, AppShellFooter, AppShellHeader, AppShellMain, AppShellSidebar, Badge, Button, PageFooter, PageFooterActions, PageFooterDescription, PageFooterLeading, PageFooterTitle, PageHeader, PageHeaderActions, PageHeaderDescription, PageHeaderEyebrow, PageHeaderLeading, PageHeaderTitle, SidebarNav, SidebarNavContent, SidebarNavHeader, SidebarNavItem, SidebarNavItemIcon, SidebarNavItemLabel, SidebarNavItems, SidebarNavSection, SidebarNavSectionLabel, StatCard, StatCardDelta, StatCardDescription, StatCardHeader, StatCardLabel, StatCardMetric, StatCardValue } from "@ai-ui/ui"; import type { Meta, StoryObj } from "@storybook/react"; function ShellMark() { return ( ); } function RailIcon({ kind }: { kind: "overview" | "pipeline" | "team" }) { switch (kind) { case "pipeline": return ( ); case "team": return ( ); case "overview": default: return ( ); } } function AppShellExample() { return (

ScaleOps

Workspace shell

Main Overview Pipeline Team
Workspace shell One shared frame for navigation, header, and page body. AppShell owns the outer layout contract so product pages can swap content without reinventing the sidebar and body structure.
Live revenue pulse $101,820 +84 AI-assisted follow-up is still the strongest lift across the board window. Forecast confidence 31% +9.2% Strong enough for planning, but still worth watching through the anomaly lane.
Shell state is synchronized across the workspace. The page footer closes the shell with status and low-emphasis follow-up actions. Ready for review
); } const meta = { title: "Patterns/AppShell", component: AppShellExample, parameters: { docs: { description: { component: "AppShell is the shared outer layout pattern for workspace-style screens. Use it when a product view needs a repeatable sidebar/body frame that can host `SidebarNav`, `PageHeader`, `PageFooter`, and arbitrary content panels without each scene redefining the same shell grid. The shell should feel quietly awake through soft surface motion and focus-within depth changes, while leaving stronger animation work to the content living inside it." } }, layout: "centered" }, tags: ["autodocs"] } satisfies Meta; export default meta; type Story = StoryObj; export const Playground: Story = {}; export const Anatomy: Story = { render: () => (

App shell anatomy

The stable shell regions are the sidebar, body, header, main content lane, and footer. That keeps full-page scenes aligned around one layout contract instead of local CSS grids.

) }; export const Motion: Story = { parameters: { docs: { description: { story: "The panel shell should feel a little more alive than a static CSS grid, but it should still read as infrastructure. Hover and focus inside the shell to check the subtle surface wake-up without competing with the contained components." } } }, render: () => (

Motion review

AppShell now carries a restrained surface glow and depth response so the workspace frame feels staged, not inert. The motion should stay in the background behind the content.

) };