Skip to content
Highlight

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.

Source: packages/ui/src/components/sheet

tsx
import { Sheet } from '@highlight/ui'

Change the props; the preview and the snippet update together.

Props
Side
Show close
Footer
tsx
<Sheet>  <Sheet.Trigger>Open details</Sheet.Trigger>  <Sheet.Content>    <Sheet.Header>      <Sheet.Title>Meeting details</Sheet.Title>      <Sheet.Description>The page stays visible behind the panel.</Sheet.Description>    </Sheet.Header>    <Sheet.Body><p>Body scrolls independently.</p></Sheet.Body>    <Sheet.Footer>      <Sheet.Close variant="secondary">Cancel</Sheet.Close>      <Sheet.Close variant="primary">Save</Sheet.Close>    </Sheet.Footer>  </Sheet.Content></Sheet>
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-secondary text-sm">            Body scrolls independently when content is taller than the viewport.          </p>        </Sheet.Body>        <Sheet.Footer>          <Sheet.Close variant="outline">Cancel</Sheet.Close>          <Sheet.Close variant="primary">Save</Sheet.Close>        </Sheet.Footer>      </Sheet.Content>    </Sheet>  )}

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="outline" size="sm" 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-secondary text-sm">                Horizontal sheets are 600px wide; vertical ones are 300px tall.              </p>            </Sheet.Body>          </Sheet.Content>        </Sheet>      ))}    </div>  )}

The root, then any compound sub-components. Every part accepts className and forwards the rest of its props to the element or Base UI part beneath it.

Sheet
Base UI Dialog.Root. Owns open state; the sheet slides in from an edge.
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.