Supports CJS, ESM and TypeScript.
- Run:
npm i @dpsys/stimulus-modal-window
- Register this controller in your bootstrap file:
import ModalWindow from "@dpsys/stimulus-modal-window";
...
stimulusApp.register('modal-window', ModalWindow);
- (Optional) Import the base CSS style:
import "@dpsys/stimulus-modal-window/base.css";
This example uses Symfony, Twig and Tailwind. Use your own implementation if needed.
<button class="main" data-mw-opener-something>Open window</button> {# Name of data attribute can be anything. E.g.: data-foo-bar #}
<div class="modal_window top-[15vh] right-[25vw]" {{ stimulus_controller('modal-window', {opener: '[data-mw-opener-something]'}) }}>
<div class="modal_window_closer">X</div> {# Optional. Specify if needed. #}
<div class="modal_window_content"> {# Optional. Gets created automatically if doesn't exist. #}
My content ...
</div>
</div>
-
Choose arbitrary name for a controller
... {{ stimulus_controller('mw-something', ...
-
Create such controller
// .../controllers/mw-something-controller.js
import ModalWindow from '@dpsys/stimulus-modal-window';
export default class extends ModalWindow
{
connect()
{
super.connect();
...
}
async customMethodOne()
{
...
}
async openBefore()
{
alert('The window is going to open');
}
}
this.element
- the window
this.content
- content wrapper of the window
this.opener
- last clicked element which opened the window
this.closer
- closer element
Opens the window
Closes the window
Default state of a window on page load.
Possible values: 'CLOSED' (default), 'OPENED', 'OPENING', 'CLOSING'
Opening duration in milliseconds
Default: 0
Closing duration in milliseconds
Default: 0
CSS selector of element/s which opens the window.
If the window has its own Controller, the opener doesn't need to be specified - window can be opened/closed just programatically.
Default: null
CSS selector/s of clicked element/s outside window, which will not close the window
Default: []
Define these methods in your extended class if you need to execute some code when the state of the window is being changed (see example above)
Do something before the window starts opening
Do something after the window finishes opening
Do something before the window starts closing
Do something after the window finishes closing
.modal_window.closed {opacity: 0; transition: opacity 0.5s ease-in;}
.modal_window.opening {opacity: 1;}
.modal_window.opened {opacity: 1; transition: opacity 0.5s ease-out;}
.modal_window.closing {opacity: 0;}
Add modal_window
class to the main element:
<div class="
modal_window
top-[15vh] right-[25vw]" {{ stimulus_controller('modal-window', ...) }}>