Task: Drawer / Bottom Sheet Component
Type: Component
Milestone: M0.5 — Shared Component Library
Estimate: M
Component Type
Props Interface
interface DrawerProps {
isOpen: boolean;
onClose: () => void;
title?: string;
children: ReactNode;
footer?: ReactNode;
side?: 'left' | 'right' | 'bottom';
size?: 'sm' | 'md' | 'lg'; // width for left/right, height for bottom
isDismissable?: boolean;
className?: string;
}
Variants / States
| State |
Description |
| Right drawer |
Slides in from right. Used for UserPanel detail view. |
| Bottom sheet |
Slides up from bottom. Used on mobile for detail views. |
| Left drawer |
Slides in from left. Reserved for mobile sidebar nav. |
sm / md / lg |
Right/left: 320px / 480px / 640px. Bottom: 40% / 60% / 90% viewport. |
| With footer |
Sticky bottom action bar inside the drawer |
Acceptance Criteria
Notes
UserPanel in M2 uses right drawer on desktop, bottom sheet on mobile — the auto-conversion at 768px must be built here, not in UserPanel
Task: Drawer / Bottom Sheet Component
Type: Component
Milestone: M0.5 — Shared Component Library
Estimate: M
Component Type
Props Interface
Variants / States
sm / md / lgAcceptance Criteria
createPortal— same as ModalsidedirectionESCcloses whenisDismissableis truebodyscroll locked while open< 768px) right drawer automatically becomes bottom sheetfooterslot is sticky — does not scroll with contentNotes
UserPanelin M2 uses right drawer on desktop, bottom sheet on mobile — the auto-conversion at768pxmust be built here, not inUserPanel