Copy environment

Modal

<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."
  }
}
  • Content:
    .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;
        }
    }
    
  • URL: /components/raw/modal/modal.scss
  • Filesystem Path: src/patterns/components/modal/modal.scss
  • Size: 1.3 KB
  • Content:
    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);
        }
    });
    
  • URL: /components/raw/modal/modal.ts
  • Filesystem Path: src/patterns/components/modal/modal.ts
  • Size: 3 KB
  • Handle: @modal--default
  • Filesystem Path: src/patterns/components/modal/modal.twig
  • Referenced by (2): @modal--example, @case-study

Example

<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."
  }
}
  • Content:
    .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;
        }
    }
    
  • URL: /components/raw/modal/modal.scss
  • Filesystem Path: src/patterns/components/modal/modal.scss
  • Size: 1.3 KB
  • Content:
    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);
        }
    });
    
  • URL: /components/raw/modal/modal.ts
  • Filesystem Path: src/patterns/components/modal/modal.ts
  • Size: 3 KB
  • Handle: @modal--example
  • Filesystem Path: src/patterns/components/modal/modal--example.twig
  • References (1): @modal