<div class="modal js-modal" id="modal">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur nemo commodi eius minima ratione suscipit, itaque odit incidunt, porro doloribus cumque placeat, fugiat modi dignissimos beatae optio nulla ad saepe.
</div>
<div class="modal {{ modifier }} {{ class }}" id="{{ id }}">
{{ data.content }}
</div>
{
"language": "en-US",
"class": "js-modal",
"id": "modal",
"data": {
"content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur nemo commodi eius minima ratione suscipit, itaque odit incidunt, porro doloribus cumque placeat, fugiat modi dignissimos beatae optio nulla ad saepe."
}
}
.modal-container {
position: relative;
z-index: map-get($zindex, 'modal');
top: 0;
left: 0;
right: 0;
bottom: 0;
display: none;
background: rgba($color-text-01, .82);
cursor: pointer;
&.is-visible {
display: flex;
flex-direction: column;
}
}
.modal-container__inner {
max-width: 1440px;
width: 100%;
min-height: 100vh;
margin: auto;
align-self: center;
display: flex;
align-items: flex-start;
@include bp(md-min) {
padding: 0 104px;
}
}
.modal {
display: none;
position: relative;
padding: 64px 0;
cursor: auto;
width: 100%;
@include bp(md-min) {
padding: 0 0 156px;
}
.modal-container & {
display: block;
pointer-events: normal;
}
}
.modal__header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 64px;
background: $color-brand-01;
@include bp(md-min) {
background: transparent;
}
}
.modal__close {
position: absolute;
top: 20px;
right: 20px;
background: transparent;
border: 0;
padding: 0;
outline: none;
color: $color-text-03;
font-size: 24px;
cursor: pointer;
@include bp(md-min) {
font-size: 36px;
top: 32px;
right: 32px;
}
}
import Component from '../component/component';
import Helpers from '../helpers/helpers';
import Icon from '../icon/icon';
import './modal.scss';
export default class Modal extends Component {
static initSelector: string = '.js-modal';
closeButton: JQuery;
container: JQuery;
hasContainer: boolean;
inner: JQuery;
header: JQuery;
keyboardHandler: () => void;
constructor(target: HTMLElement, open: boolean = true) {
super(target);
this.hasContainer = false;
this.container = $('<div class="modal-container"></div>');
this.inner = $('<div class="modal-container__inner"></div>');
this.header = $('<div class="modal__header"></div>');
this.closeButton = $('<button class="modal__close">' + Icon.render('close-24', 'modal__close-icon') + '</button>');
this.keyboardHandler = this.keyboard.bind(this);
if (open) {
this.open();
}
}
bindEventHandlers(): void {
this.container.on('click', (event: JQuery.TriggeredEvent): void => {
if (event.target === event.currentTarget || event.target === this.inner[0]) {
event.preventDefault();
this.close();
}
});
this.closeButton.on('click', (event: JQuery.Event): void => {
event.preventDefault();
this.close();
});
}
open(): void {
if (!this.hasContainer) {
this.inner.append(this.element);
this.container.append(this.inner);
this.element.prepend(this.header);
this.header.prepend(this.closeButton);
$('body').append(this.container);
this.bindEventHandlers();
this.hasContainer = true;
}
this.container.addClass('is-visible');
this.container.trigger('open-modal');
Helpers.disableScroll();
$(document).on('keyup.modal', this.keyboardHandler);
}
close(): void {
this.container.removeClass('is-visible');
Helpers.enableScroll();
$(document).off('keyup.modal', this.keyboardHandler);
$('.cursor-pet').removeClass('is-hover').removeClass('is-text').removeClass('is-modal');
$('.cursor-pet__label').text('');
}
keyboard(event: JQuery.Event): void {
if (event.keyCode === 27) {
this.close();
}
}
}
$(document).on('click', '[data-js="open-modal"]', (event: JQuery.TriggeredEvent): void => {
event.preventDefault();
const trigger: JQuery<EventTarget> = $(event.currentTarget);
const element: JQuery = $(trigger.attr('href'));
const type: string = Component.getDataName(Modal.initSelector);
const dataAttr: string = type + 'Class';
if (element.data(dataAttr)) {
const instance: Modal = element.data(dataAttr);
instance.open();
} else {
const instance: Modal = new Modal(element[0], true);
element.data(dataAttr, instance);
}
});
<a href="#modal" data-js="open-modal">open modal</a>
<div class="modal " id="modal">
<div class="text">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
</div>
</div>
<a href="#modal" data-js="open-modal">open modal</a>
{% set modalContent %}
<div class="text">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Inventore qui repellendus architecto consectetur hic, modi aut totam eveniet blanditiis ex rem aliquam aspernatur, ullam quibusdam dolorum accusamus temporibus consequatur aperiam.</p>
</div>
{% endset %}
{% include '@modal' with {
data: {
content: modalContent
},
id: 'modal',
class: ''
} %}
{
"language": "en-US",
"class": "js-modal",
"id": "modal",
"data": {
"content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur nemo commodi eius minima ratione suscipit, itaque odit incidunt, porro doloribus cumque placeat, fugiat modi dignissimos beatae optio nulla ad saepe."
}
}
.modal-container {
position: relative;
z-index: map-get($zindex, 'modal');
top: 0;
left: 0;
right: 0;
bottom: 0;
display: none;
background: rgba($color-text-01, .82);
cursor: pointer;
&.is-visible {
display: flex;
flex-direction: column;
}
}
.modal-container__inner {
max-width: 1440px;
width: 100%;
min-height: 100vh;
margin: auto;
align-self: center;
display: flex;
align-items: flex-start;
@include bp(md-min) {
padding: 0 104px;
}
}
.modal {
display: none;
position: relative;
padding: 64px 0;
cursor: auto;
width: 100%;
@include bp(md-min) {
padding: 0 0 156px;
}
.modal-container & {
display: block;
pointer-events: normal;
}
}
.modal__header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 64px;
background: $color-brand-01;
@include bp(md-min) {
background: transparent;
}
}
.modal__close {
position: absolute;
top: 20px;
right: 20px;
background: transparent;
border: 0;
padding: 0;
outline: none;
color: $color-text-03;
font-size: 24px;
cursor: pointer;
@include bp(md-min) {
font-size: 36px;
top: 32px;
right: 32px;
}
}
import Component from '../component/component';
import Helpers from '../helpers/helpers';
import Icon from '../icon/icon';
import './modal.scss';
export default class Modal extends Component {
static initSelector: string = '.js-modal';
closeButton: JQuery;
container: JQuery;
hasContainer: boolean;
inner: JQuery;
header: JQuery;
keyboardHandler: () => void;
constructor(target: HTMLElement, open: boolean = true) {
super(target);
this.hasContainer = false;
this.container = $('<div class="modal-container"></div>');
this.inner = $('<div class="modal-container__inner"></div>');
this.header = $('<div class="modal__header"></div>');
this.closeButton = $('<button class="modal__close">' + Icon.render('close-24', 'modal__close-icon') + '</button>');
this.keyboardHandler = this.keyboard.bind(this);
if (open) {
this.open();
}
}
bindEventHandlers(): void {
this.container.on('click', (event: JQuery.TriggeredEvent): void => {
if (event.target === event.currentTarget || event.target === this.inner[0]) {
event.preventDefault();
this.close();
}
});
this.closeButton.on('click', (event: JQuery.Event): void => {
event.preventDefault();
this.close();
});
}
open(): void {
if (!this.hasContainer) {
this.inner.append(this.element);
this.container.append(this.inner);
this.element.prepend(this.header);
this.header.prepend(this.closeButton);
$('body').append(this.container);
this.bindEventHandlers();
this.hasContainer = true;
}
this.container.addClass('is-visible');
this.container.trigger('open-modal');
Helpers.disableScroll();
$(document).on('keyup.modal', this.keyboardHandler);
}
close(): void {
this.container.removeClass('is-visible');
Helpers.enableScroll();
$(document).off('keyup.modal', this.keyboardHandler);
$('.cursor-pet').removeClass('is-hover').removeClass('is-text').removeClass('is-modal');
$('.cursor-pet__label').text('');
}
keyboard(event: JQuery.Event): void {
if (event.keyCode === 27) {
this.close();
}
}
}
$(document).on('click', '[data-js="open-modal"]', (event: JQuery.TriggeredEvent): void => {
event.preventDefault();
const trigger: JQuery<EventTarget> = $(event.currentTarget);
const element: JQuery = $(trigger.attr('href'));
const type: string = Component.getDataName(Modal.initSelector);
const dataAttr: string = type + 'Class';
if (element.data(dataAttr)) {
const instance: Modal = element.data(dataAttr);
instance.open();
} else {
const instance: Modal = new Modal(element[0], true);
element.data(dataAttr, instance);
}
});