Overlays
IDrawer
A panel attached to an edge of the viewport. It shares IDialog's slots and dismissal behaviour, and can be dragged away.
side picks the edge — right (default), left, top or bottom — and doubles as the direction you drag to dismiss.
Size means different things per edge
On a left or right drawer, size is a width. On a top or bottom sheet it is a maximum height, so a short sheet hugs its content. Below the sm breakpoint a side drawer takes the full screen.
Snap points
snapPoints gives a sheet resting positions. Values are fractions of the viewport (0.45), pixel numbers, or CSS lengths like '20rem'. v-model:snapPoint reads or sets the current one.
With snap points set, size no longer caps the height: the panel is translated between resting positions rather than resized.
Modality
modal decides how much of the page the drawer takes over:
true(default) traps focus and blocks everything behind it.'trap-focus'keeps the page interactive while still holding the Tab ring — what a persistent side panel wants.falsedoes neither.
The handle
Sheets get a drag handle by default and side drawers do not; handle overrides that in both directions. The whole panel is the drag target, not just the handle.
Dismissal
:dismissible="false" refuses the swipe along with Escape and the overlay. The corner button still closes; hide it with :show-close="false".
Props
| Prop | Type | Default | Description |
|---|---|---|---|
open | boolean | false | v-model:open |
side | 'right' | 'left' | 'top' | 'bottom' | 'right' | Edge, and the dismiss direction |
size | 'sm' | 'md' | 'lg' | 'xl' | 'full' | 'md' | Width on a side drawer, max height on a sheet |
snapPoints | (number | string)[] | — | Resting positions |
snapPoint | number | string | null | null | v-model:snapPoint |
snapToSequentialPoints | boolean | false | Snap to the next point in order, not the nearest |
modal | boolean | 'trap-focus' | true | How much of the page it takes over |
dismissible | boolean | true | Swipe, Escape and overlay close it |
handle | boolean | sheets only | Show the drag handle |
showClose | boolean | true | Render the corner dismiss button |
closeLabel | string | 'Close' | Accessible name for that button |
title / description | string | — | As IDialog |
unstyled | boolean | — | Drop built-in classes |
class | string | — | Merged onto the panel |
ui | object | — | overlay, content, handle, header, title, description, body, footer, close |
Slots match IDialog: trigger, header, title, description, default (body), and footer (receives close).
This site uses one
IDrawer. Narrow your window and open it — if the component regresses, these docs stop navigating on a phone.