- React-Morphing-Modal
- Demo
- Installation
- Features
- Usage
- Api
- Browser Support
- Release Notes
- Contribute
- License
$ npm install --save react-morphing-modal
//or
$ yarn add react-morphing-modal
- Easy to setup for real, you can make it work in less than 10sec! π
- Super easy to customize π
- Fancy π
The library expose 2 ways to display the modal:
getTriggerPropsandopen. For the basic use casegetTriggerPropsis fine. But for most of the cases usingopenis the way to go. Please look at the api for more details.
import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps } = useModal();
return (
<div>
<button {...getTriggerProps()}>Show modal</button>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}If you just want to open the modal you can stick with getTriggerProps.
import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
const Button = props => (
<button {...props.getTriggerProps()}>Show modal</button>
);
function App() {
const { modalProps, getTriggerProps } = useModal();
return (
<div>
<Button getTriggerProps={getTriggerProps} />
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}Most of the time you need to perform different task when a user click a button like calling an api. In that case
use the open method as follow.
import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
const Button = ({ openModal }) => {
const btnRef = useRef(null);
function handleClick() {
// do some complicated stuff
openModal(btnRef);
}
return (
<button ref={btnRef} onClick={handleClick}>
Show modal
</button>
);
};
function App() {
const { modalProps, open } = useModal();
return (
<div>
<Button openModal={open} />
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal, open } = useModal();
const triggerRef = useRef(null);
const handleTrigger3 = () => open(triggerRef);
return (
<div>
<button {...getTriggerProps()}>Trigger 1</button>
<button {...getTriggerProps()}>Trigger 2</button>
<button ref={triggerRef} onClick={handleTrigger3}>
Trigger 3
</button>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal();
return (
<div>
<button {...getTriggerProps('trigger1')}>Trigger 1</button>
<button {...getTriggerProps('trigger2')}>Trigger 2</button>
{/* You can also pass an object */}
<button {...getTriggerProps({ id: 'trigger3' })}>Trigger 3</button>
<span>{activeModal}</span>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal({
onOpen() {
console.log('onOpen');
},
onClose() {
console.log('onClose');
},
});
return (
<div>
<button {...getTriggerProps()}>Trigger</button>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal();
return (
<div>
<button
{...getTriggerProps({
onOpen: () => console.log('open'),
onClose: () => console.log('close'),
})}
>
Trigger
</button>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}By default, the modal background is the same as the trigger one. However, you are free to define yours.
import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal({
background: '#666',
});
return (
<div>
<button {...getTriggerProps()}>Trigger</button>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal();
return (
<div>
<button
{...getTriggerProps({
background: '#666',
})}
>
Trigger
</button>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}By default, the onClick event is used on the trigger.
import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal({
event: 'onDoubleClick',
});
return (
<div>
<button {...getTriggerProps()}>Trigger</button>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal();
return (
<div>
<button
{...getTriggerProps({
event: 'onDoubleClick',
})}
>
Trigger
</button>
<Modal {...modalProps}>Hello World</Modal>
</div>
);
}import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal();
return (
<div>
<button {...getTriggerProps()}>Trigger</button>
<Modal {...modalProps} closeButton={false}>
Hello World
</Modal>
</div>
);
}import React from 'react';
import { useModal, Modal } from 'react-morphing-modal';
import 'react-morphing-modal/dist/ReactMorphingModal.css';
function App() {
const { modalProps, getTriggerProps, activeModal } = useModal();
return (
<div>
<button {...getTriggerProps()}>Trigger</button>
<Modal {...modalProps} padding={false}>
Hello World
</Modal>
</div>
);
}import { useModal } from 'react-morphing-modal';
const { open, close, activeModal, modalProps, getTriggerProps } = useModal({
event: 'onClick',
onOpen: () => console.log('will open'),
onClose: () => console.log('will close'),
background: 'purple',
});| Props | Type | Default | Description |
|---|---|---|---|
| event | string | onClick | Any valid react dom event: onClick, onDoubleClick, etc... |
| onOpen | function | - | A function to call when the modal will open |
| onClose | function | - | A function to call when the modal will close |
| background | string | - | Any valid css background: #fffff, rgb(1,1,1), etc |
open have 2 signatures
import { useModal } from 'react-morphing-modal';
const { open } = useModal();
// pass a ref to your trigger
const myRef = React.useRef(null);
//somewhere in your app
<MyComponent ref={myRef} />;
open(myRef, 'modalId');
open(myRef, {
id: 'modalId',
onOpen: () => console.log('will open'),
onClose: () => console.log('will close'),
background: 'purple',
});| Props | Type | Default | Description |
|---|---|---|---|
| id | string | number | symbol | null | - | Specify a modal id. It will be assigned to activeModal |
| onOpen | function | - | A function to call when the modal will open |
| onClose | function | - | A function to call when the modal will close |
| background | string | - | Any valid css background: #fffff, rgb(1,1,1), etc |
close does not require any options.
import { useModal } from 'react-morphing-modal';
const { close } = useModal();
close();activeModal hold the displayed modalId. activeModal is set to null if not id has been used.
import { useModal } from 'react-morphing-modal';
const { open, activeModal } = useModal();
open(triggerRef, 'modalId');
console, log(activeModal); // print modalIdmodalProps hold the props that must be passed to the Modal component.
import { useModal, Modal } from 'react-morphing-modal';
const { modalProps } = useModal();
<Modal {...modalProps} />;getTriggerProps is a convenient method for the simple use case. Under the hood a ref is created and bound to open.
getTriggerProps has also 2 signatures.
import { useModal } from 'react-morphing-modal';
const { getTriggerProps } = useModal();
<button {...trigger('modalId')}>trigger</button>;
<button {...trigger({
id: 'modalId',
event: 'onDoubleClcik'
onOpen: () => console.log('will open'),
onClose: () => console.log('will close'),
background: 'purple'
})}>trigger</button>| Props | Type | Default | Description |
|---|---|---|---|
| id | string | number | symbol | null | - | Specify a modal id. It will be assigned to activeModal |
| event | string | onClick | Any valid react dom event: onClick, onDoubleClick, etc... |
| onOpen | function | - | A function to call when the modal will open |
| onClose | function | - | A function to call when the modal will close |
| background | string | - | Any valid css background: #fffff, rgb(1,1,1), etc |
import { Modal } from 'react-morphing-modal';
<Modal closeButton={true} padding={true}>
hello
</Modal>;| Props | Type | Default | Description |
|---|---|---|---|
| closeButton | boolean | true | Display a close button |
| padding | boolean | true | Remove the default padding. Useful when doing some customisation |
![]() |
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|---|
| β | β | β | β | β |
You can find the release note for the latest release here
You can browse them all here
Show your β€οΈ and support by giving a β. Any suggestions are welcome ! Take a look at the contributing guide.
You can also find me on reactiflux. My pseudo is Fadi.
Licensed under MIT





