Drawer
A slide-out panel component that appears from the edge of the screen, with support for different placements, sizes, and content sections.
View component sourceImport
import { Drawer } from '@app-studio/components';New to the library? Complete installation and provider setup first.
Interactive examples
Try the component, then open Code to copy the complete example.
import React, { useState } from 'react';
import { Button, Drawer } from '@app-studio/components';
import { Vertical, Text } from 'app-studio';
export const DefaultDrawer = () => {
const [isOpen, setIsOpen] = useState(false);
return (
<Vertical>
<Button onClick={() => setIsOpen(true)}>Open Drawer</Button>
<Drawer isOpen={isOpen} onClose={() => setIsOpen(false)}>
<Drawer.Header onClose={() => setIsOpen(false)}>
<Text fontWeight="bold">Drawer Title</Text>
</Drawer.Header>
<Drawer.Body>
<Text>This is the body of the drawer.</Text>
</Drawer.Body>
<Drawer.Footer>
<Button variant="outline" onClick={() => setIsOpen(false)}>
Cancel
</Button>
<Button onClick={() => setIsOpen(false)}>Save</Button>
</Drawer.Footer>
</Drawer>
</Vertical>
);
};Props
Required props are marked below. A dash indicates an unspecified default. Design system configuration can override implementation defaults.
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
placement | Placement"bottom""left""right""top" | — | Placement relative to its trigger or container.Source |
side | string | — | See the type and source declaration for this property.Source |
size | Size"sm""md""lg""xs""xl""full" | — | Size preset for the component.Source |
isOpen Required | boolean | — | Controls whether the component is open.Source |
onClose Required | () => void | — | Called when the user requests dismissal.Source |
isClosePrevented | boolean | — | See the type and source declaration for this property.Source |
children | View typestring | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | — | Content rendered inside the component.Source |
Common inherited styling props (7)
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
media | Record<string, CssProps> | — | See the type and source declaration for this property. |
onClick | any | — | Called when the user activates the component. |
as | keyof JSX.IntrinsicElements"symbol""object""slot""style""title""pattern""form""animate""clipPath""filter""marker""mask""a""abbr""address""area""article""aside""audio""b""base""bdi""bdo""big""blockquote""body""br""button""canvas""caption""center""cite""code""col""colgroup""data""datalist""dd""del""details""dfn""dialog""div""dl""dt""em""embed""fieldset""figcaption""figure""footer""h1""h2""h3""h4""h5""h6""head""header""hgroup""hr""html""i""iframe""img""input""ins""kbd""keygen""label""legend""li""link""main""map""mark""menu""menuitem""meta""meter""nav""noindex""noscript""ol""optgroup""option""output""p""param""picture""pre""progress""q""rp""rt""ruby""s""samp""search""script""section""select""small""source""span""strong""sub""summary""sup""table""template""tbody""td""textarea""tfoot""th""thead""time""tr""track""u""ul""var""video""wbr""webview""svg""animateMotion""animateTransform""circle""defs""desc""ellipse""feBlend""feColorMatrix""feComponentTransfer""feComposite""feConvolveMatrix""feDiffuseLighting""feDisplacementMap""feDistantLight""feDropShadow""feFlood""feFuncA""feFuncB""feFuncG""feFuncR""feGaussianBlur""feImage""feMerge""feMergeNode""feMorphology""feOffset""fePointLight""feSpecularLighting""feSpotLight""feTile""feTurbulence""foreignObject""g""image""line""linearGradient""metadata""mpath""path""polygon""polyline""radialGradient""rect""set""stop""switch""text""textPath""tspan""use""view" | — | See the type and source declaration for this property. |
themeMode | "light" | "dark""light""dark" | — | See the type and source declaration for this property. |
_hover | string | CssProps | — | See the type and source declaration for this property. |
_active | string | CssProps | — | See the type and source declaration for this property. |
_focus | string | CssProps | — | See the type and source declaration for this property. |
Drawer.Overlay
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
isOpen Required | boolean | — | Controls whether the component is open.Source |
onClose Required | () => void | — | Called when the user requests dismissal.Source |
isClosePrevented | boolean | — | See the type and source declaration for this property.Source |
blur | number | — | See the type and source declaration for this property.Source |
children | View typestring | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | — | Content rendered inside the component.Source |
Drawer.Container
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
placement | Placement | — | Placement relative to its trigger or container.Source |
size | Size | — | Size preset for the component.Source |
isOpen | boolean | — | Controls whether the component is open.Source |
children | View typestring | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | — | Content rendered inside the component.Source |
Drawer.Header
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
onClose | (() => void) | — | Called when the user requests dismissal.Source |
buttonPosition | CloseButtonPosition | — | See the type and source declaration for this property.Source |
children | View typestring | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | — | Content rendered inside the component.Source |
Drawer.Body
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
children | View typestring | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | — | Content rendered inside the component.Source |
Drawer.Footer
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
children | View typestring | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | — | Content rendered inside the component.Source |
Drawer.Layout
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
drawers Required | { [key: string]: React.ComponentType<any>; } | — | See the type and source declaration for this property.Source |
onShow | ((name: string, props?: any) => void) | — | See the type and source declaration for this property.Source |
onHide | ((name?: string) => void) | — | See the type and source declaration for this property.Source |
For shared layout, color, and responsive properties, read Styling & composition and Responsive layouts. Additional native element attributes depend on the target platform.
Usage guidance
- Give controls a visible label or an accessible name, and verify keyboard interaction. See Accessibility.
- For controlled inputs, update the value from the callback shown in the props table. Keep application state in your component or form library.
- These previews run in the browser. Check React Native setup for platform requirements and differences.