The frame for an app: sidebar, workspace switcher, command bar and toasts.
Import it and pass your content. The props that matter most are listed next.
"use client";
import * as React from "react";
import { AppShell, ShellPage } from "@/components/ui/notchset/blocks/app-shell";
export function Workspace() {
const [page, setPage] = React.useState("home");
return (
<AppShell
workspaces={[{ id: "acme", initials: "AL", name: "Acme Labs", plan: "TEAM PLAN" }]}
workspace="acme"
nav={[
{ items: [{ id: "home", label: "Home", icon: "home" }] },
{ label: "AGENTS", items: [{ id: "planner", label: "Planner", status: "live", meta: "148/MIN" }] },
]}
active={page}
onNavigate={setPage}
breadcrumb={`ACME LABS / ${page.toUpperCase()}`}
user={{ name: "Maya Kerr", initials: "MK", email: "maya@acme.dev", status: "OWNER · ONLINE" }}
userMenu={[{ id: "out", label: "Sign out", tone: "signal", onSelect: () => "SIGNED OUT" }]}
>
<ShellPage title={page} description="Every agent in this workspace." />
</AppShell>
);
}workspaces / workspace / onWorkspaceChange–
{ id, initials, name, plan }[]The switcher's menu; switching confirms in a toast.
environments / environment / onEnvironmentChange–
{ value, label }[]Optional PROD / STAGING control under the switcher.
nav–
{ label?, items: { id, label, icon?, status?, meta? }[] }[]Sections; icon is home, inbox, runs, doc, settings or a node; status (live, paused, degraded) draws the agent node.
active / onNavigate–
stringThe current page; Jump to and the nav both call onNavigate.
breadcrumb–
stringThe header's path.
user / userMenu–
{ name, initials, email, status?, away? } / { id, label, shortcut?, tone?, onSelect? }[]The user row and its menu; return a string from onSelect to confirm it in the toast.
jumpItems–
{ id, label, kind }[]What Jump to searches; every nav item by default.
collapsed / defaultCollapsed / onCollapsedChangefalse
booleanThe rail (⌘\). Under 640px the sidebar stays a rail.
children–
ReactNodeThe page: compose it from ShellPage, ShellKpis, ShellSection, ShellRow and ShellSwitch, or your own.
AppShelldata-slot="app-shell"
The shell: sidebar, header, Jump to and toasts.
ShellPagedata-slot="shell-page"
A page head: status line, condensed title, description.
ShellKpisdata-slot="—"
A strip of rolling KPIs.
ShellSectiondata-slot="—"
A labelled ruled list.
ShellRowdata-slot="—"
A clickable ruled row on your grid.
ShellSwitchdata-slot="—"
A settings switch with a stretch thumb.
ShellStatusNodedata-slot="—"
Live, paused or degraded.
components/ui/notchset/blocks/app-shell.tsx
This component is included with Pro.
Try the live preview above. Get Pro to install the source.
pnpm dlx shadcn@latest add @beautiful-ui-pro/app-shellNeeds your registry key. Your components.json style picks the Base UI or Radix build: radix-*, new-york and default get Radix, base-* gets Base UI.
The CLI adds the styles to the CSS file named in components.json (tailwind.css). Check that it points at your global stylesheet, that the project uses Tailwind CSS v4, and that the file is imported in your root layout. Installed by hand: paste styles.css into that file.
Give your coding assistant the Markdown guide instead of screenshots.
https://beautiful-ui.dev/api/mcp (setup)v1.0.0 · 2026-10-03
First release
Pro is in early access.