Drawer
The Drawer
component is a panel that slides out from the edge of the screen.
It can be useful when you need users to complete a task or view some details
without leaving the current page.
Import#
import {Drawer,DrawerBody,DrawerFooter,DrawerHeader,DrawerOverlay,DrawerContent,DrawerCloseButton,} from "@chakra-ui/react"
Usage#
Basic Drawer#
Drawer placement#
The Drawer can appear from any edge of the screen. Pass the placement
prop and
set it to top
, right
, bottom
, or left
.
Focus on specific element#
When a form is in the drawer, you might need to set focus on a specific element
when the drawer opens. Pass the initialFocusRef
prop.
Without the
initialFocusRef
prop, the drawer will set focus on the first focusable element when it opens.
Drawer Widths#
Pass the size
prop if you need to adjust the size of the drawer. Values can be
xs
, sm
, md
, lg
, xl
, or full
.
Using a form in a Drawer#
If you need to put a form within the Drawer, you might need to use to form
validation library like react-hook-form
or formik
. Here's the recommended
way to do it:
Because the button is located outside the form, you can leverage its native HTML
form
attrbute and refer to theid
of theform
.
export const App = () => {const { isOpen, onOpen, onClose } = useDisclosure()return (<><Button onClick={onOpen}>Open</Button><Drawer isOpen={isOpen} onClose={onClose}><DrawerOverlay /><DrawerContent><DrawerCloseButton /><DrawerHeader>Create your account</DrawerHeader><DrawerBody><formid="my-form"onSubmit={(e) => {e.preventDefault()console.log("submitted")}}><Input name="nickname" placeholder="Type here..." /></form></DrawerBody><DrawerFooter><Button type="submit" form="my-form">Save</Button></DrawerFooter></DrawerContent></Drawer></>)}
Accessibility#
- When opening the Drawer, focus is trapped inside the Drawer.
- By default, the drawer sets focus on the first focusable element. If the
initialFocusRef
prop is passed, the drawer sets focus on the element with the assignedref
. - After the drawer closes, it'll return focus to the element that triggered it.
Props#
Drawer Props#
Drawer
composes the Modal
component with these extra props:
Name | Type | Description | Default |
---|---|---|---|
isOpen | requiredboolean | If `true`, the modal will be open. | - |
onClose | required() => void | Callback invoked to close the modal. | - |
allowPinchZoom | boolean | Handle zoom/pinch gestures on iOS devices when scroll locking is enabled. Defaults to `false`. | - |
autoFocus | boolean | If `true`, the modal will autofocus the first enabled and interactive element within the `ModalContent` | true |
blockScrollOnMount | boolean | If `true`, scrolling will be disabled on the `body` when the modal opens. | true |
closeOnEsc | boolean | If `true`, the modal will close when the `Esc` key is pressed | true |
closeOnOverlayClick | boolean | If `true`, the modal will close when the overlay is clicked | true |
colorScheme | "blue" | "cyan" | "gray" | "green" | "orange" | "pink" | "purple" | "red" | "teal" | "yellow" | "whiteAlpha" | "blackAlpha" | "linkedin" | "facebook" | "messenger" | "whatsapp" | "twitter" | "telegram" | Color Schemes for Drawer are not implemented in the default theme. You can extend the theme to implement them. | - |
finalFocusRef | RefObject<FocusableElement> | The `ref` of element to receive focus when the modal closes. | - |
id | string | The `id` of the modal | - |
initialFocusRef | RefObject<FocusableElement> | The `ref` of element to receive focus when the modal opens. | - |
isCentered | boolean | If `true`, the modal will be centered on screen. | false |
isFullHeight | boolean | If `true` and drawer's placement is `top` or `bottom`, the drawer will occupy the viewport height (100vh) | - |
lockFocusAcrossFrames | boolean | Enables aggressive focus capturing within iframes. - If `true`: keep focus in the lock, no matter where lock is active - If `false`: allows focus to move outside of iframe | - |
motionPreset | "scale" | "none" | "slideInBottom" | "slideInRight" | The transition that should be used for the modal | - |
onEsc | (() => void) | Callback fired when the escape key is pressed and focus is within modal | - |
onOverlayClick | (() => void) | Callback fired when the overlay is clicked. | - |
placement | "top" | "right" | "bottom" | "left" | The placement of the drawer | - |
portalProps | Pick<PortalProps, "appendToParentPortal" | "containerRef"> | Props to be forwarded to the portal component | - |
preserveScrollBarGap | boolean | If `true`, a `padding-right` will be applied to the body element that's equal to the width of the scrollbar. This can help prevent some unpleasant flickering effect and content adjustment when the modal opens | - |
returnFocusOnClose | boolean | If `true`, the modal will return focus to the element that triggered it when it closes. | true |
scrollBehavior | "inside" | "outside" | Where scroll behavior should originate. - If set to `inside`, scroll only occurs within the `ModalBody`. - If set to `outside`, the entire `ModalContent` will scroll within the viewport. | "outside" |
size | "sm" | "md" | "lg" | "xl" | "2xl" | "xs" | "3xl" | "4xl" | "5xl" | "6xl" | "full" | "xs" | |
trapFocus | boolean | If `false`, focus lock will be disabled completely. This is useful in situations where you still need to interact with other surrounding elements. 🚨Warning: We don't recommend doing this because it hurts the accessibility of the modal, based on WAI-ARIA specifications. | true |
useInert | boolean | A11y: If `true`, the siblings of the `modal` will have `aria-hidden` set to `true` so that screen readers can only see the `modal`. This is commonly known as making the other elements **inert** | true |
variant | string | Variants for Drawer are not implemented in the default theme. You can extend the theme to implement them. | - |
Other components#
DrawerOverlay
,DrawerFooter
,DrawerHeader
andDrawerBody
composesBox
componentDrawerCloseButton
composesCloseButton