Composition
Drawer
Side-anchored slide-in panel for supplemental content or secondary navigation
import { Drawer } from '@amezquita/design-system/components/composition/Drawer'Live render
Props
| Prop | Type | Description |
|---|---|---|
open? | boolean | |
onOpenChange? | (open: boolean) => void | |
defaultOpen? | boolean | |
trigger? | React.ReactElement | Must be a single DOM element — React.Fragment is not supported (Radix asChild). |
title | string | |
description? | string | |
children | React.ReactNode | |
footer? | React.ReactNode | |
side? | 'right' | 'left' | 'bottom' | |
size? | 'sm' | 'md' | 'lg' | 'full' | |
modal? | boolean | |
onPointerDownOutside? | (e: Event) => void | Call e.preventDefault() to prevent the drawer from closing on outside click. |
onEscapeKeyDown? | (e: KeyboardEvent) => void | Call e.preventDefault() to prevent the drawer from closing on Escape key. |
Tokens
| Token | Type | Value |
|---|---|---|
--drawer-close-align-offset | dimension | 2px |
--drawer-close-size | dimension | 28px |
--drawer-max-height-full | dimension | 100vh |
--drawer-max-height-lg | dimension | 75vh |
--drawer-max-height-md | dimension | 90vh |
--drawer-max-height-sm | dimension | 40vh |
--drawer-max-width-lg | dimension | 640px |
--drawer-max-width-md | dimension | 480px |
--drawer-max-width-sm | dimension | 320px |
Usage example
() => {
const [open, setOpen] = useState(false)
return (
<Drawer
open={open}
onOpenChange={setOpen}
trigger={<Button onClick={() => setOpen(true)}>Open drawer</Button>}
title="Settings"
description="Configure your preferences below."
footer={
<>
<Button variant="ghost" onClick={() => setOpen(false)}>Cancel</Button>
<Button onClick={() => setOpen(false)}>Save changes</Button>
</>
}
>
<p style={{ margin: 0, color: 'var(--color-text-secondary)', fontSize: 'var(--font-size-sm)' }}>
Drawer body content goes here.
</p>
</Drawer>
)
}