1.1.5 • Published 8 months ago
react-drag-mobile-drawer v1.1.5
react-drag-mobile-drawer
Mobile draggable drawer that falls back to modals on desktop
This is an updated fork of the original react-drag-drawer with some notable changes:
- New
<MobileDrawer/>component based off motion instead - Supports React 18 OR React 19
- Added a
disableBackDropprop - Updated dependencies for a much smaller bundle size
- Added TypeScript support
Install
$ npm i react-drag-mobile-drawerUsage
1. <MobileDrawer/> (🆕)
import { MobileDrawer } from 'react-drag-mobile-drawer'
...
const [open, setOpen] = useState(false)
return (
<MobileDrawer
open={open}
onRequestClose={setOpen}
>
<div>
A mobile drawer!
</div>
</MobileDrawer>
)2.1 API for MobileDrawer
| Param | Type | Functionality | Required |
|---|---|---|---|
| children | React.ReactNode | The content to render inside the drawer. | Yes |
| open | boolean | Indicates whether the drawer is open or closed. Default: false. | Yes |
| onRequestClose | () => void | Callback function when the drawer has closed. Use this to maintain the controlling open state | Yes |
| className | string | Additional class names for the drawer container. Default: "". | No |
| closeThreshold | string | The threshold at which the drawer should close when scrolled beyond its lower boundary, takes in any CSS value (e.g. 20px, 2rem). Default: "20px". | No |
| dragElastic | DragElastic | Controls the drag elasticity (how much the drawer can scroll beyond the boundaries) on the top and bottom edges. Default: { top: 0, bottom: 0.5 }. | No |
| dragTransition | DragTransition | Defines the drag transition behavior. Default: { bounceStiffness: 300, timeConstant: 150, bounceDamping: 30, power: 0.7 }. | No |
| parentElement | HTMLElement | The DOM element to which the drawer should be appended (portal target). Default: document.body. | No |
| peakHeight | string | The height of the drawer when it's peeking, takes in any CSS value (e.g. 200px, 20rem). Default: "200px". | No |
2. <Drawer/>
import { Drawer } from 'react-drag-mobile-drawer' // Note the named export change here
..
toggle = () => {
let { toggle } = this.state
this.setState({ toggle: !toggle })
}
render () {
const { open } = this.state
return (
<Drawer
open={open}
onRequestClose={this.toggle}
>
<div>Hey Im inside the drawer!</div>
</Drawer>
)
}2.1 API for Drawer
| Param | Type | functionality | required |
|---|---|---|---|
| allowClose | Boolean | block closing if allowClose={false}, default is true | false |
| children | Node | null | true |
| containerElementClass | String | className to be applied to the drawer container element | false |
| containerOpacity | Number | Controls the container's opacity (default 0.6) | false |
| direction | String | direction to translate drawer | false |
| disableBackDrop | Boolean | Disables the backdrop/background and allows for background scrolling (Note: There appears to be a bug with webkit browsers (Safari) which does causes this feature to not work as expected) | false |
| dontApplyListeners | Boolean | skip applying internal event listeners to the dom | false |
| getContainerRef | Function | get container (overlay) ref | false |
| getModalRef | Function | get modal (draggable element) ref | false |
| inViewportChange | Function | detect when drawer is at top of viewport | false |
| modalElementClass | String | className to be applied to top element | false |
| notifyWillClose | Function | notify consumer if the drawer will close at touch release | false |
| onDrag | Function | invoked on drag | false |
| onOpen | Function | invoked on drawer focus | false |
| open | Boolean | null | true |
| onRequestClose | Function | null | true |
| parentElement | Element | block scrolls on element if you're not using body scrolling | false |
Example modal style
.modal {
outline: none;
background: white;
font-size: 1.6rem;
width: 76rem;
max-width: 90%;
display: flex;
justify-content: space-between;
flex-direction: column;
z-index: 15;
min-height: 47rem;
will-change: transform;
transform: translate3d(0, 0, 0);
}
@media (max-width: 768px) {
.modal {
width: 100%;
max-width: 100%;
margin-bottom: 0;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
}
}License
MIT © Teo Kai Xiang (this maintained fork) and Jack Hanford (Original author)
1.1.1
8 months ago
1.1.0
8 months ago
1.0.17
8 months ago
1.0.16
8 months ago
1.1.5
8 months ago
1.1.3
8 months ago
1.1.2
8 months ago
1.0.15
8 months ago
1.0.14
1 year ago
1.0.13
1 year ago
1.0.9
1 year ago
1.0.11
1 year ago
1.0.10
1 year ago
1.0.12
1 year ago
1.0.8
2 years ago
1.0.71
2 years ago
1.0.7
2 years ago
1.0.6
2 years ago
1.0.51
2 years ago
1.0.5
2 years ago
1.0.4
2 years ago
1.0.3
2 years ago
1.0.2
2 years ago
1.0.1
2 years ago
1.0.0
2 years ago
