- Run:
npm i @dpsys/stimulus-modal-window
- Register this controller. This example uses vite-helpers. Use your own implementation if needed.
import { Application } from "@hotwired/stimulus";
import { registerControllers } from 'stimulus-vite-helpers'
import ModalWindow from "@dpsys/stimulus-modal-window";
const stimulusApp = Application.start();
const stimulusControllers = import.meta.glob('../**/*_controller.js', { eager: true })
registerControllers(stimulusApp, stimulusControllers);
stimulusApp.register('modal-window', ModalWindow);
- If not using bundler like vite you have to manually load style.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 openBeforeCallback()
{
alert('The window is going to open');
}
}
this.content
- content wrapper
this.opener
- clicked element used to open current window
this.closer
- closer element
Opens the window
Closes the window
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
Default state of a window on page load.
Possible values: CLOSED (default), OPENED, OPENING, CLOSING
Opening duration in milliseconds
Closing duration in milliseconds
CSS selector of element/s which opens the window
CSS selector/s of clicked element/s outside current window, which will not close the window
.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', ...) }}>