Skip to content

Headless Core — Drawer

Powers Drawer internally. Same shape as Modal with one addition: placement, exposed as data-side on the content element for slide-in styling.

import { createDrawer } from '@andersseen/headless-components/drawer';
const drawer = createDrawer({
placement: 'left',
closeOnEscape: true,
closeOnOverlayClick: true,
onOpenChange: isOpen => console.log('Drawer:', isOpen),
});
drawer.actions.open();
window.addEventListener('keydown', drawer.handleKeyDown);
OptionTypeDefaultNotes
defaultOpenbooleanfalse
placement'top' | 'bottom' | 'left' | 'right''left'
onOpenChange(isOpen: boolean) => void
closeOnEscapebooleantrue
closeOnOverlayClickbooleantrue
disabledbooleanfalse
labelstring'Drawer'

isOpen, placement, disabled.

open(), close(), toggle(), setPlacement(v), setDisabled(v) — no queries bucket; read drawer.state.isOpen directly.

GetterReturns
getOverlayProps()data-state, aria-hidden
getContentProps()role: 'dialog', aria-modal: true, aria-hidden, aria-label, data-state, data-side (the placement), tabindex: -1
getCloseButtonProps()aria-label: 'Close', type: 'button'

handleKeyDown(event) / handleOverlayClick() — identical contract to Modal.

Toggle drawer Switch side

Modal — the same factory shape without the placement side.