Frame
Frame structures app surfaces such as settings panels, statistics, lists, and empty states.
Purpose
Frame structures app surfaces such as settings panels, statistics, lists, and empty states. It provides a muted outer shell and one or more surfaced panels.
Preview frame
Installation
With the Siteplane registry alias configured, add the component and import the installed source from your app.
CLI
pnpm dlx shadcn@4.16.1 add @siteplane/frameImport
import {
Frame,
FrameDescription,
FrameFooter,
FrameHeader,
FramePanel,
FrameTitle,
} from "@/components/ui/frame";Need the machine-readable source metadata? View registry JSON.
Usage
Frame is a soft surface wrapper for app panels and sections. Header and footer sit on the frame surface while each FramePanel reads as a card in between.
import { Frame, FrameHeader, FramePanel, FrameTitle } from "@/components/ui/frame";
export function Example() {
return (
<Frame>
<FrameHeader><FrameTitle>Preview</FrameTitle></FrameHeader>
<FramePanel>...</FramePanel>
</Frame>
);
}Examples
Panels, footer actions and settings rows are compositions of the same frame surface. Adjacent panels space themselves automatically.
Basic frame
Separated panels
Adjacent panels on one frame surface separate themselves automatically.
Settings panel
Empty state
API Reference
The reference lists the source-owned exports and props that are easy to miss in visual examples. Inherited Base UI props remain available unless the wrapper narrows them.
Frameis the outer shell andFramePanelis the bordered surface.- Multiple direct FramePanel children stack with the native panel gap.
- Use Header, Title, Description, and Footer as the intended content slots.
- Compose semantic content inside the panel; Frame does not replace forms, lists, headings, or landmarks.
Motion
Component motion uses the shared Siteplane motion contract. See the global motion guide for provider setup, tokens and reduced-motion behavior.
- Frame has no animation.
- Child controls and overlays retain their native motion.
- Preserve native radius, border, background, and inset-shadow treatment.
Accessibility
- Use headings and landmarks appropriate to the content inside Frame.
- Keep actions as real Button or link controls with visible focus.
- Do not rely on the surface boundary alone to explain relationships.
- Empty-state content inside Frame follows the Empty component contract.
Implementation Guidance
- Use FramePanel for the actual surfaced content.
- Do not create parallel shell or panel primitives.
- Keep native slots and surface styling intact.