ComponentsUpdated Sep 9, 2026
Sheet
A panel that slides in from an edge and dims the page. Use it for secondary detail that benefits from context staying visible.
Import
Source: packages/ui/src/components/sheet
tsx
import { Sheet } from '@highlight/ui'tsx
import { Sheet } from '@highlight/ui'
export default function SheetBasic() {
return (
<Sheet>
<Sheet.Trigger>Open details</Sheet.Trigger>
<Sheet.Content>
<Sheet.Header>
<Sheet.Title>Meeting details</Sheet.Title>
<Sheet.Description>Slides in from the right; the page stays visible behind it.</Sheet.Description>
</Sheet.Header>
<Sheet.Body>
<p className="text-foreground/70 text-sm">
Body scrolls independently when content is taller than the viewport.
</p>
</Sheet.Body>
<Sheet.Footer>
<Sheet.Close variant="secondary">Cancel</Sheet.Close>
<Sheet.Close variant="primary">Save</Sheet.Close>
</Sheet.Footer>
</Sheet.Content>
</Sheet>
)
}Sides
side on Content picks the edge.
tsx
import { Sheet } from '@highlight/ui'
const SIDES = ['left', 'right', 'top', 'bottom'] as const
export default function SheetSides() {
return (
<div className="flex flex-wrap items-center justify-center gap-3">
{SIDES.map((side) => (
<Sheet key={side}>
<Sheet.Trigger variant="secondary" size="small" className="capitalize">
{side}
</Sheet.Trigger>
<Sheet.Content side={side}>
<Sheet.Header>
<Sheet.Title className="capitalize">{side}</Sheet.Title>
</Sheet.Header>
<Sheet.Body>
<p className="text-foreground/70 text-sm">
Horizontal sheets are 600px wide; vertical ones are 300px tall.
</p>
</Sheet.Body>
</Sheet.Content>
</Sheet>
))}
</div>
)
}Parts
Compound sub-components. Every part accepts className and forwards the rest of its props to Base UI.
Sheet.Trigger / Close- Buttons, shared with Dialog.
Sheet.Content- Portal + Backdrop + Popup. side: 'right' | 'left' | 'top' | 'bottom'; showClose.
Sheet.Header / Body / Footer / Title / Description- Layout and accessibility slots.