Skip to main content

Drawer

Example

"use client"

import * as React from "react"
import { Minus, Plus } from "lucide-react"
import { Bar, BarChart, ResponsiveContainer } from "recharts"

import {
Button,
Drawer,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerTitle,
DrawerTrigger,
} from "@databricks/appkit-ui/react"

const data = [
{
goal: 400,
},
{
goal: 300,
},
{
goal: 200,
},
{
goal: 300,
},
{
goal: 200,
},
{
goal: 278,
},
{
goal: 189,
},
{
goal: 239,
},
{
goal: 300,
},
{
goal: 200,
},
{
goal: 278,
},
{
goal: 189,
},
{
goal: 349,
},
]

export default function DrawerExample() {
const [goal, setGoal] = React.useState(350)

function onClick(adjustment: number) {
setGoal(Math.max(200, Math.min(400, goal + adjustment)))
}

return (
<Drawer>
<DrawerTrigger asChild>
<Button variant="outline">Open Drawer</Button>
</DrawerTrigger>
<DrawerContent>
<div className="mx-auto w-full max-w-sm">
<DrawerHeader>
<DrawerTitle>Move Goal</DrawerTitle>
<DrawerDescription>Set your daily activity goal.</DrawerDescription>
</DrawerHeader>
<div className="p-4 pb-0">
<div className="flex items-center justify-center space-x-2">
<Button
variant="outline"
size="icon"
className="h-8 w-8 shrink-0 rounded-full"
onClick={() => onClick(-10)}
disabled={goal <= 200}
>
<Minus />
<span className="sr-only">Decrease</span>
</Button>
<div className="flex-1 text-center">
<div className="text-7xl font-bold tracking-tighter">
{goal}
</div>
<div className="text-[0.70rem] uppercase text-muted-foreground">
Calories/day
</div>
</div>
<Button
variant="outline"
size="icon"
className="h-8 w-8 shrink-0 rounded-full"
onClick={() => onClick(10)}
disabled={goal >= 400}
>
<Plus />
<span className="sr-only">Increase</span>
</Button>
</div>
<div className="mt-3 h-[120px]">
<ResponsiveContainer width="100%" height="100%">
<BarChart data={data}>
<Bar
dataKey="goal"
style={{
fill: "hsl(var(--foreground))",
opacity: 0.9,
}}
/>
</BarChart>
</ResponsiveContainer>
</div>
</div>
<DrawerFooter>
<Button>Submit</Button>
<DrawerClose asChild>
<Button variant="outline">Cancel</Button>
</DrawerClose>
</DrawerFooter>
</div>
</DrawerContent>
</Drawer>
)
}

Drawer

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

PropTypeRequiredDefaultDescription
activeSnapPointstring | number | null--
setActiveSnapPoint((snapPoint: string | number | null) => void)--
openboolean--
closeThresholdnumber0.25Number between 0 and 1 that determines when the drawer should be closed. Example: threshold of 0.5 would close the drawer if the user swiped for 50% of the height of the drawer or more.
noBodyStylesboolean-When true the body doesn't get any styles assigned from Vaul
onOpenChange((open: boolean) => void)--
shouldScaleBackgroundboolean--
setBackgroundColorOnScalebooleantrueWhen false we don't change body's background color when the drawer is open.
scrollLockTimeoutnumber500msDuration for which the drawer is not draggable after scrolling content inside of the drawer.
fixedboolean-When true, don't move the drawer upwards if there's space, but rather only change it's height so it's fully scrollable when the keyboard is open
handleOnlybooleanfalseWhen true only allows the drawer to be dragged by the &lt;Drawer.Handle /&gt; component.
dismissiblebooleantrueWhen false dragging, clicking outside, pressing esc, etc. will not close the drawer. Use this in comination with the open prop, otherwise you won't be able to open/close the drawer.
onDrag((event: PointerEvent<HTMLDivElement>, percentageDragged: number) => void)--
onRelease((event: PointerEvent<HTMLDivElement>, open: boolean) => void)--
modalbooleantrueWhen false it allows to interact with elements outside of the drawer without closing it.
nestedboolean--
onClose(() => void)--
directionenum'bottom'Direction of the drawer. Can be top or bottom, left, right.
defaultOpenbooleanfalseOpened by default, skips initial enter animation. Still reacts to open state changes
disablePreventScrollbooleanfalseWhen set to true prevents scrolling on the document body on mount, and restores it on unmount.
repositionInputsbooleantrue when {@link snapPoints } is definedWhen true Vaul will reposition inputs rather than scroll then into view if the keyboard is in the way. Setting it to false will fall back to the default browser behavior.
snapToSequentialPointbooleanfalseDisabled velocity based swiping for snap points. This means that a snap point won't be skipped even if the velocity is high enough. Useful if each snap point in a drawer is equally important.
containerHTMLElement | null--
onAnimationEnd((open: boolean) => void)-Gets triggered after the open or close animation ends, it receives an open argument with the open state of the drawer by the time the function was triggered. Useful to revert any state changes for example.
preventScrollRestorationboolean--
autoFocusboolean--
snapPoints(string | number)[]-Array of numbers from 0 to 100 that corresponds to % of the screen a given snap point should take up. Should go from least visible. Example [0.2, 0.5, 0.8]. You can also use px values, which doesn't take screen height into account.
fadeFromIndexnumber-Index of a snapPoint from which the overlay fade should be applied. Defaults to the last snap point.

Usage

import { Drawer } from '@databricks/appkit-ui';

<Drawer /* props */ />

DrawerClose

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

PropTypeRequiredDefaultDescription
asChildboolean--

Usage

import { DrawerClose } from '@databricks/appkit-ui';

<DrawerClose /* props */ />

DrawerContent

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

PropTypeRequiredDefaultDescription
asChildboolean--
forceMounttrue-Used to force mounting when more control is needed. Useful when controlling animation with React animation libraries.
onEscapeKeyDown((event: KeyboardEvent) => void)-Event handler called when the escape key is down. Can be prevented.
onPointerDownOutside((event: PointerDownOutsideEvent) => void)-Event handler called when the a pointerdown event happens outside of the DismissableLayer. Can be prevented.
onFocusOutside((event: FocusOutsideEvent) => void)-Event handler called when the focus moves outside of the DismissableLayer. Can be prevented.
onInteractOutside((event: FocusOutsideEvent | PointerDownOutsideEvent) => void)-Event handler called when an interaction happens outside the DismissableLayer. Specifically, when a pointerdown event happens outside or focus moves outside of it. Can be prevented.
onOpenAutoFocus((event: Event) => void)-Event handler called when auto-focusing on open. Can be prevented.
onCloseAutoFocus((event: Event) => void)-Event handler called when auto-focusing on close. Can be prevented.

Usage

import { DrawerContent } from '@databricks/appkit-ui';

<DrawerContent /* props */ />

DrawerDescription

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

PropTypeRequiredDefaultDescription
asChildboolean--

Usage

import { DrawerDescription } from '@databricks/appkit-ui';

<DrawerDescription /* props */ />

DrawerFooter

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

This component extends standard HTML element attributes.

Usage

import { DrawerFooter } from '@databricks/appkit-ui';

<DrawerFooter /* props */ />

DrawerHeader

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

This component extends standard HTML element attributes.

Usage

import { DrawerHeader } from '@databricks/appkit-ui';

<DrawerHeader /* props */ />

DrawerOverlay

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

PropTypeRequiredDefaultDescription
asChildboolean--
forceMounttrue-Used to force mounting when more control is needed. Useful when controlling animation with React animation libraries.

Usage

import { DrawerOverlay } from '@databricks/appkit-ui';

<DrawerOverlay /* props */ />

DrawerPortal

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

PropTypeRequiredDefaultDescription
containerElement | DocumentFragment | null-Specify a container element to portal the content into.
forceMounttrue-Used to force mounting when more control is needed. Useful when controlling animation with React animation libraries.

Usage

import { DrawerPortal } from '@databricks/appkit-ui';

<DrawerPortal /* props */ />

DrawerTitle

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

PropTypeRequiredDefaultDescription
asChildboolean--

Usage

import { DrawerTitle } from '@databricks/appkit-ui';

<DrawerTitle /* props */ />

DrawerTrigger

Source: packages/appkit-ui/src/react/ui/drawer.tsx

Props

PropTypeRequiredDefaultDescription
asChildboolean--

Usage

import { DrawerTrigger } from '@databricks/appkit-ui';

<DrawerTrigger /* props */ />