Panel

Layout foundation for fixed headers, contained scrolling, sections, and optional bottom actions.

Preview#

Controls
import {
  Panel,
  PanelBody,
  PanelFooter,
  PanelHeaderRoot,
  PanelScrollContent,
  PanelScrollViewport,
  PanelSection,
} from "raft-ui";

<Panel edge="inset">
  {/* Use PanelHeaderRoot directly for a fully custom fixed header. */}
  <PanelHeaderRoot />

  <PanelBody>
    <PanelScrollViewport>
      <PanelScrollContent>
        <PanelSection />
      </PanelScrollContent>
    </PanelScrollViewport>
  </PanelBody>

  {/* Optional bottom action boundary. */}
  <PanelFooter />
</Panel>
import {
  PanelAction,
  PanelActions,
  PanelHeader,
  PanelHeaderContent,
  PanelHeaderIcon,
  PanelHeading,
  PanelMeta,
  PanelSectionHeader,
  PanelStatus,
  PanelTitle,
} from "raft-ui";

<PanelHeader>
  <PanelHeaderIcon />
  <PanelHeaderContent>
    <PanelHeading>
      <PanelTitle />
      <PanelStatus />
    </PanelHeading>
    <PanelMeta />
  </PanelHeaderContent>
  <PanelActions>
    <PanelAction aria-label="Panel action">...</PanelAction>
  </PanelActions>
</PanelHeader>

{/* Use as an alternative fixed header for a section-level view. */}
<PanelSectionHeader />

On desktop the name and the description share one row. The name keeps its full width; the description only uses what is left and truncates, or disappears, first. The name itself truncates only when it alone is wider than the row.

Wide
proj-frontend
Raft web frontend. DRI: someone with a long name, plus the deploy checklist and the on-call rota
480px
proj-frontend
Raft web frontend. DRI: someone with a long name, plus the deploy checklist and the on-call rota
320px
proj-frontend
Raft web frontend. DRI: someone with a long name, plus the deploy checklist and the on-call rota
320px · name longer than the row
a-very-long-channel-name-that-cannot-fit-in-this-header
Raft web frontend. DRI: someone with a long name, plus the deploy checklist and the on-call rota

API#WIP

edge
"inset" | "attached"
Lets the panel own how its header and content meet adjacent regions. AppShell slots remain layout-only.
...props
useRender.ComponentProps<"section">
Panel root. The caller chooses sizing, placement, surface treatment, and header composition.
...props
useRender.ComponentProps<"div">
Low-level fixed header region. Use PanelHeader when the header needs the shared identity, metadata, status, and actions layout.
...props
useRender.ComponentProps<"div">
Shared panel header layout for caller-owned identity, metadata, status, and actions.
...props
useRender.ComponentProps<"div">
Fixed section-level header with the shared responsive panel treatment.
...props
useRender.ComponentProps<"div">
Optional identity region alongside PanelHeaderContent. It uses the contained sticker-chip icon treatment; the consumer owns the content's size, such as Avatar size or icon size classes.
...props
useRender.ComponentProps<"div">
Flexible region for an optional icon, title, metadata, and status parts.
...props
useRender.ComponentProps<"div">
Inline group for a title and its adjacent status.
...props
useRender.ComponentProps<"div">
Caller-owned panel or section title.
sizedefault: "sm"
"sm" | "md"
Secondary metadata size.
...props
useRender.ComponentProps<"div">
Optional secondary metadata below or alongside the title.
...props
useRender.ComponentProps<"span">
Attribute badge alongside the title, such as a muted marker.
...props
useRender.ComponentProps<"span">
Live status readout alongside the title, wrapping a Status.
...props
useRender.ComponentProps<"div">
Trailing region for caller-owned actions.
...props
Omit<StyledProps<BaseToggle.Props>, "type">
Base UI Toggle props for a pressed-state action (for example panel collapse). See the conversation-panel page for its header usage.
...props
Omit<StyledProps<BaseButton.Props>, "type">
Base UI Button props with className narrowed to string. The component always renders type="button", supports render/nativeButton for element substitution, and owns panel-action icon sizing and tabular number alignment.
...props
useRender.ComponentProps<"div">
Flexible min-height-zero body boundary that clips overflow around a contained viewport.
...props
useRender.ComponentProps<"div">
Native vertical scroll owner with overscroll containment and mobile momentum scrolling.
...props
useRender.ComponentProps<"div">
Minimum-full-height content wrapper.
...props
useRender.ComponentProps<"section">
Section boundary that owns the separator and panel-consistent inline padding.