How it works
The drawer uses drag="y" with dragConstraints top:0 and closes when offset or velocity crosses a threshold.
Animated modal plus a bottom sheet you can drag down to dismiss.
The drawer uses drag="y" with dragConstraints top:0 and closes when offset or velocity crosses a threshold.
Only transform and opacity are animated, so every frame is composite-only: no layout, no paint.
Both are role="dialog" aria-modal with Esc-to-close and focus return.
transition={{ type: 'spring', stiffness: 380, damping: 36, mass: 1 }}