Drop-in semantic component. See examples, sizes, variants, and source.
Sliding side panel for navigation, filters, or off-canvas forms. Wrap a
drawer in a drawer-overlay,
give the trigger a data-drawer="..." attribute, and add
modifiers for position (left right top bottom),
size (xs sm xl lg fullscreen), or accent color
(primary positive negative warning info). Open / close
behaviour is wired by drawer.js.
Drawer System
The drawer system provides sliding panels from screen edges. It requires three parts:
Trigger Button - A button with data-drawer="drawer-id" attribute
Drawer HTML - The drawer structure with matching id="drawer-id"
JavaScript - Automatically loaded via bluestack.core.js (no setup needed!)
Position Variants
Left Drawer (Default)
Left Drawer
Slides in from the left edge
This is a left-aligned drawer. Perfect for navigation menus.
<!-- Trigger Button -->
<button class="button primary" data-drawer="example-left">Open Left Drawer</button>
<!-- Drawer HTML -->
<div id="example-left" class="drawer-overlay hidden" aria-hidden="true">
<div class="drawer left">
<!-- 'left' is optional as it's default -->
<div class="header">
<div>
<h3 class="title">Left Drawer</h3>
<p class="description">Slides in from the left edge</p>
</div>
<button class="close">
<i class="icon x w-4 h-4"></i>
</button>
</div>
<div class="content">
<p>This is a left-aligned drawer. Perfect for navigation menus.</p>
</div>
<div class="footer">
<button class="button">Cancel</button>
<button class="button primary">Save Changes</button>
</div>
</div>
</div>
Right Drawer
Right Drawer
Slides from right. Great for filters and settings.
<!-- Trigger Button -->
<button class="button primary" data-drawer="example-right">Open Right Drawer</button>
<!-- Drawer HTML -->
<div id="example-right" class="drawer-overlay hidden" aria-hidden="true">
<div class="drawer right">
<div class="header">
<h3 class="title">Right Drawer</h3>
<button class="close">
<i class="icon x w-4 h-4"></i>
</button>
</div>
<div class="content">
<p>Slides from right. Great for filters and settings.</p>
</div>
<div class="footer center">
<button class="button primary">Close</button>
</div>
</div>
</div>
Top Drawer
Notification
Slides down from top. Perfect for notifications.
<!-- Trigger Button -->
<button class="button primary" data-drawer="example-top">Open Top Drawer</button>
<!-- Drawer HTML -->
<div id="example-top" class="drawer-overlay hidden" aria-hidden="true">
<div class="drawer top">
<div class="header">
<h3 class="title">Notification</h3>
<button class="close">
<i class="icon x w-4 h-4"></i>
</button>
</div>
<div class="content">
<p>Slides down from top. Perfect for notifications.</p>
</div>
</div>
</div>
Bottom Drawer
Actions
Slides up from bottom. Mobile-style action sheets.
// Open drawer
Drawer.open('drawer-id');
Drawer.open('drawer-id', { position: 'right', size: 'large' });
// Close drawer
Drawer.close('drawer-id');
// Toggle drawer
Drawer.toggle('drawer-id');
// Close all drawers
Drawer.closeAll();
// Check if drawer is open
if (Drawer.isOpen('drawer-id')) {
console.log('Drawer is open');
}
// Event listeners
document.getElementById('drawer-id').addEventListener('drawer:open', (e) => {
console.log('Drawer opened', e.detail);
});
document.getElementById('drawer-id').addEventListener('drawer:close', (e) => {
console.log('Drawer closed', e.detail);
});
// Open drawer Drawer.open('drawer-id'); Drawer.open('drawer-id', { position: 'right', size: 'large'
}); // Close drawer Drawer.close('drawer-id'); // Toggle drawer Drawer.toggle('drawer-id'); // Close
all drawers Drawer.closeAll(); // Check if drawer is open if (Drawer.isOpen('drawer-id')) {
console.log('Drawer is open'); } // Event listeners
document.getElementById('drawer-id').addEventListener('drawer:open', (e) => { console.log('Drawer
opened', e.detail); }); document.getElementById('drawer-id').addEventListener('drawer:close', (e) =>
{ console.log('Drawer closed', e.detail); });
Data Attributes
Advanced Trigger Options
<!-- Position and size via data attributes -->
<button
class="button"
data-drawer="my-drawer"
data-drawer-position="right"
data-drawer-size="large"
>
Open Right Large Drawer
</button>
<!-- Prevent closing on overlay click -->
<div id="my-drawer" class="drawer-overlay hidden" aria-hidden="true" data-no-close-on-overlay>
<div class="drawer">
<!-- Drawer content -->
</div>
</div>
<!-- Keep drawer open on button click -->
<button class="button primary" data-keep-open>Save without closing</button>
Interactive Examples
Left Drawer
Default position - slides from left
This drawer slides in from the left edge. It's the default position and commonly used for navigation menus.