Drawer

The Drawer component provides a side navigation panel that slides in from the left or right. It supports modal mode with backdrop and focus trapping for accessibility.

Installation

npm install @duskmoon-dev/el-drawer

Usage

import '@duskmoon-dev/el-drawer/register';
<el-dm-drawer id="my-drawer" modal>
  <span slot="header">Menu</span>
  <nav>
    <a href="/">Home</a>
    <a href="/about">About</a>
    <a href="/contact">Contact</a>
  </nav>
</el-dm-drawer>

<el-dm-button onclick="document.querySelector('#my-drawer').show()">
  Open Drawer
</el-dm-button>

Live Demo

Drawer Demo

Open Left Drawer

Open Right Drawer

NavigationSettings

Drawer content on the right side.

Close

Properties

PropertyTypeDefaultDescription
openbooleanfalseWhether the drawer is open
position'left' | 'right''left'Which side the drawer appears from
modalbooleanfalseShows backdrop and traps focus when true
widthstring'280px'Custom width for the drawer (CSS value)

Methods

MethodDescription
show()Opens the drawer
hide()Closes the drawer
toggle()Toggles the drawer open/closed

Events

EventDescription
openFired when drawer opens
closeFired when drawer closes

Event Handling

const drawer = document.querySelector('el-dm-drawer');
drawer.addEventListener('open', () => {
  console.log('Drawer opened');
});
drawer.addEventListener('close', () => {
  console.log('Drawer closed');
});

Position Variants

<!-- Left drawer (default) -->
<el-dm-drawer position="left">...</el-dm-drawer>

<!-- Right drawer -->
<el-dm-drawer position="right">...</el-dm-drawer>
<!-- Modal drawer with backdrop -->
<el-dm-drawer modal>
  Content that requires focus
</el-dm-drawer>

<!-- Non-modal drawer (no backdrop) -->
<el-dm-drawer>
  Side navigation that doesn't block interaction
</el-dm-drawer>

Custom Width

<el-dm-drawer width="400px">...</el-dm-drawer>
<el-dm-drawer width="50vw">...</el-dm-drawer>

Slots

SlotDescription
defaultMain drawer content (body)
headerDrawer header section
footerDrawer footer section

CSS Parts

PartDescription
wrapperThe outer wrapper
drawerThe drawer container
backdropThe backdrop overlay (modal mode)
headerThe header section
bodyThe body section
footerThe footer section
closeThe close button

Styling Example

el-dm-drawer::part(drawer) {
  --drawer-width: 320px;
  background: linear-gradient(to bottom, #f8fafc, #ffffff);
}

el-dm-drawer::part(header) {
  background-color: var(--color-primary);
  color: white;
}

el-dm-drawer::part(close) {
  color: white;
}

Accessibility

  • Uses role="dialog" and aria-modal="true" for modal drawers
  • Escape key closes modal drawers
  • Focus is trapped within modal drawers when open
  • Body scroll is disabled when modal drawer is open
  • Focus returns to the previously focused element when closed
  • Close button has aria-label="Close drawer"