Side sheet on Radix Dialog — slides from an edge; Sheet's desktop sibling.
Anatomy
┌─────────────────┐
▒▒▒▒▒▒│ Title [×]│ ← header pins
▒over-│ description │
▒lay▒▒│ children │ ← scrolls (flex-1)
▒▒▒▒▒▒│ │
│ [actions]│ ← footer pins (safe-area pb)
└─────────────────┘
← w-[min(88vw,340px)], inset-y-0, side borderProps
| Prop | Type | Default | Notes | |
|---|---|---|---|---|
open / onOpenChange | boolean / (open) => void | — | Controlled. | |
title | string | — | Required — a drawer must name itself. | |
description | string | — | Wired to aria-describedby. | |
side | "right" | "left"` | "right" | Edge it slides from. |
children | ReactNode | — | Scrollable body. | |
footer | ReactNode | — | Pinned action row. | |
className | string | — | Merged onto the panel. |
Motion
Panel slides from its edge (slide-in-from-right/left, 150ms enter +
exit via the animate presets); overlay fades. Neutralized by
prefers-reduced-motion.
A11y
Radix Dialog semantics: role="dialog", aria-modal, focus trap,
focus restore to the trigger on close, required accessible name from
title (+ optional description via aria-describedby, wired with
an explicit id). The close button carries aria-label="Close".