Ballmac UI home

Spring Drawer

A drawer with spring physics: drag the handle to snap between heights or flick it closed, or slide in from the left or right, on Radix Dialog for focus trapping and scroll lock.

Installation

$ pnpm dlx shadcn@latest add @ballmac/spring-drawer

Usage

import { SpringDrawer, SpringDrawerTrigger, SpringDrawerContent, SpringDrawerHeader, SpringDrawerBody, SpringDrawerFooter, SpringDrawerTitle, SpringDrawerDescription, SpringDrawerClose } from "@/components/ballmac/spring-drawer"

The full example is in the Code tab above.

Examples

Side drawers

API reference

<SpringDrawer>

PropTypeDefault
children*React.ReactNode—
open

Controlled open state.

boolean—
defaultOpen

Initial open state when uncontrolled.

booleanfalse
onOpenChange

Called when the drawer opens or closes.

(open: boolean) => void—
side

Edge the drawer comes from. Only the bottom drawer has snap points.

DrawerSide"bottom"
snapPoints

Heights the bottom drawer can rest at, as fractions of the screen from 0 to 1, smallest first.

number[][1]
defaultSnap

Index of the snap point the drawer opens at.

number0
snap

Controlled snap index.

number—
onSnapChange

Called when the drawer settles at another snap point.

(index: number) => void—

<SpringDrawerContent>

PropTypeDefault
showCloseButton

Show the close button in the corner.

booleantrue
closeLabel

Accessible name of the close button.

string—
handleLabel

Name of the resize handle (bottom drawer with several snap points).

string—
maxWidth

Largest width of a bottom drawer, or the width of a side drawer.

string—

Also accepts the standard attributes of its root element.

Accessibility

KeyAction
EscapeCloses the drawer
ArrowUp / ArrowDownOn the handle, moves between snap points
FocusTrapped in the drawer and returned to the trigger on close
Reduced motionThe drawer moves without springs

Use with AI

<SpringDrawer side snapPoints defaultSnap><SpringDrawerTrigger/><SpringDrawerContent><SpringDrawerHeader><SpringDrawerTitle/></SpringDrawerHeader><SpringDrawerBody/></SpringDrawerContent></SpringDrawer>. snapPoints are fractions of the screen height. The handle is a keyboard slider. With the shadcn MCP server set up (guide), ask your agent:

Add the Ballmac UI Spring Drawer (@ballmac/spring-drawer) to this project with the shadcn MCP, then use it where it fits.

Use it for

  • Mobile-style sheets that can sit half open
  • Details panels that can be pulled larger

Not for

  • Simple modals (dialog)
  • Vaul-style nested drawers (drawer)

Registry JSON: https://ui.ballmac.com/r/spring-drawer.json

Credits

Free to use in personal and commercial projects.