Skip to content

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.
  • false does 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

PropTypeDefaultDescription
openbooleanfalsev-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
snapPointnumber | string | nullnullv-model:snapPoint
snapToSequentialPointsbooleanfalseSnap to the next point in order, not the nearest
modalboolean | 'trap-focus'trueHow much of the page it takes over
dismissiblebooleantrueSwipe, Escape and overlay close it
handlebooleansheets onlyShow the drag handle
showClosebooleantrueRender the corner dismiss button
closeLabelstring'Close'Accessible name for that button
title / descriptionstringAs IDialog
unstyledbooleanDrop built-in classes
classstringMerged onto the panel
uiobjectoverlay, 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

The mobile navigation here is an IDrawer. Narrow your window and open it — if the component regresses, these docs stop navigating on a phone.