Set isDismissable={false} on Drawer.Backdrop to prevent closing by clicking outside or dragging. The user must interact with the drawer's action buttons.
HeroUI preview
Scrollable Content
The Drawer.Body automatically handles overflow with native scrolling. Drag-to-dismiss is excluded from the body area to avoid scroll conflicts.
.drawer__backdrop--blur - Blurred backdrop with glass effect
.drawer__backdrop--transparent - Transparent backdrop (no overlay)
Placement Variants
.drawer__content--bottom - Slides up from the bottom edge (default)
.drawer__content--top - Slides down from the top edge
.drawer__content--left - Slides in from the left edge
.drawer__content--right - Slides in from the right edge
Dialog Variants
.drawer__dialog--top - Slides down from the top edge
.drawer__dialog--bottom - Slides up from the bottom edge
.drawer__dialog--left - Slides in from the left edge
.drawer__dialog--right - Slides in from the right edge
Interactive States
The component supports these interactive states:
Focus: :focus-visible or [data-focus-visible="true"] - Applied to trigger and close button
Hover: :hover or [data-hovered="true"] - Applied to close button on hover
Active: :active or [data-pressed="true"] - Applied to trigger and close button when pressed
Entering: [data-entering] - Applied during drawer opening animation
Exiting: [data-exiting] - Applied during drawer closing animation
Placement: [data-placement="*"] - Applied based on drawer position (top, bottom, left, right)
API Reference
Drawer
Prop
Type
Default
Description
children
ReactNode
-
Trigger and backdrop elements
state
UseOverlayStateReturn
-
Controlled overlay state
Drawer.Trigger
Prop
Type
Default
Description
children
ReactNode
-
Custom trigger content
className
string
-
CSS classes
Drawer.Backdrop
Prop
Type
Default
Description
variant
"opaque" | "blur" | "transparent"
"opaque"
Backdrop overlay style
isDismissable
boolean
true
Close on backdrop click
isKeyboardDismissDisabled
boolean
false
Disable ESC key to close
isOpen
boolean
-
Controlled open state
onOpenChange
(isOpen: boolean) => void
-
Open state change handler
className
string | (values) => string
-
Backdrop CSS classes
Drawer.Content
Prop
Type
Default
Description
placement
"top" | "bottom" | "left" | "right"
"bottom"
Edge the drawer slides from
className
string | (values) => string
-
Content CSS classes
Drawer.Dialog
Prop
Type
Default
Description
children
ReactNode
-
Dialog content
className
string
-
CSS classes
role
string
"dialog"
ARIA role
aria-label
string
-
Accessibility label
aria-labelledby
string
-
ID of label element
Drawer.Header
Prop
Type
Default
Description
children
ReactNode
-
Header content
className
string
-
CSS classes
Drawer.Heading
Prop
Type
Default
Description
children
ReactNode
-
Title text
className
string
-
CSS classes
Drawer.Body
Prop
Type
Default
Description
children
ReactNode
-
Body content
className
string
-
CSS classes
Drawer.Footer
Prop
Type
Default
Description
children
ReactNode
-
Footer content
className
string
-
CSS classes
Drawer.Handle
Prop
Type
Default
Description
className
string
-
CSS classes
Drawer.CloseTrigger
Prop
Type
Default
Description
children
ReactNode
-
Custom close button
className
string | (values) => string
-
CSS classes
useOverlayState Hook
import { useOverlayState } from "@heroui/react";
const state = useOverlayState({
defaultOpen: false,
onOpenChange: (isOpen) => console.log(isOpen),
});
state.isOpen; // Current state
state.open(); // Open drawer
state.close(); // Close drawer
state.toggle(); // Toggle state
state.setOpen(); // Set state directly