@stormid/modal
Version:
Accessible modal dialog
114 lines (92 loc) • 3.38 kB
Markdown
# Modal
Accessible modal dialog.
Example implementations of specific types of modal are available for reference at https://storm-ui-patterns.netlify.app/.
---
## Usage
Create a modal dialog and button(s) to toggle in HTML
```
<button class="js-modal-toggle">Open modal</button>
<div id="modal-1" class="js-modal modal" data-modal-toggle="js-modal-toggle" hidden>
<div class="modal__inner" role="dialog" aria-labelledby="modal-label">
<h2 id="modal-label">Modal title</h2>
...
<button class="modal__close-btn js-modal-toggle" aria-label="close">
<svg focusable="false" fill="#fff" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
<path d="M0 0h24v24H0z" fill="none"/>
</svg>
</button>
</div>
</div>
```
Install the package
```
npm i -S /modal
```
Import the module
```
import modal from '@stormid/modal';
```
Initialise the module via selector string
```
const [ instance ] = modal('.js-modal');
```
Initialise with a DOM element
```
const element = document.querySelector('.js-modal');
const [ instance ] = modal(element);
```
Initialise with a Node list
```
const elements = document.querySelectorAll('.js-modal');
const [ instance ] = modal(elements);
```
Initialise with an Array of elements
```
const elements = [].slice.call(document.querySelectorAll('.js-modal'));
const [ instance ] = modal(elements);
```
CSS
The className 'is--modal' added to the document.body when the modal is open. This can be used to prevent the body from scrolling and to use CSS to modify other parts of the document.
```
.is--modal {
overflow: hidden;
}
```
## Options
Options can be set during initialising in an Object passed as the second argument to the modal function, e.g. `modal('.js-modal', { startOpen: true })`, or as data-attributes on the modal element (the element passed to the initialisation function), e.g. `data-start-open="true"`
```
{
onClassName: 'is--active', //className added to node when modal is open
toggleSelectorAttribute: 'data-modal-toggle', //attribute on node to use as toggle selector
callback: false, //optional function called after modal state change
delay: 0, //ms delay before focus on first focuable element
startOpen //boolean, to trigger modal to open when initialised
}
```
## API
modal() returns an array of instances. Each instance exposes the interface
```
{
getState, a Function that returns the current state Object
open, a Function that opens the modal
close a Function that closes the modal
}
```
## Events
There are two custom events that an instance of the cookie banner dispatches:
- `modal.open` when the modal is opened
- `modal.close` when it is closed
The events are dispatched on the document. A reference to the getState function of the instance is contained in the custom event detail.
```
const [instance] = modal('.js-modal', options);
document.addEventListener('modal.open', e => {
const state = e.detail.getState();
// do something with state if we want to
});
## Tests
```
npm t
```
## License
MIT