Modal

A modal is like a digital pop-up book, presenting information in a way that demands your attention. It's the trusty sidekick of web pages, helping users navigate and interact with a website without feeling overwhelmed by a barrage of text. With a modal, you can easily display important information, without having to scroll through endless pages of content.

Example

<div class="overlay show">
  <a href="#" onclick="event.preventDefault();modals.open(modals.elements[0])">Toggle Modal component</a>
  <dialog class="modal" role="alert">
    <div>
      <div>
        title
      </div>
      <div>
        <a href="#" onclick="event.preventDefault();modals.close(modals.elements[0])" class="btn blank">
          <svg width="16" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path></svg>
        </a>
      </div>
    </div>
    <div>
      Use Instagram posts to share your products with millions of people. Let shoppers buy from your store without leaving Instagram.
    </div>
    <div>
      <div style="display: flex, align-items: center; justify-content: end;gap: 7px;">
        <button class="btn">Submit</button>
        <button class="btn">Cancel</button>
      </div>
    </div>
  </dialog>
</div>
@use '~/styles/app.scss' as app;

$overlay: app.get-theme(app.$theme, 'components.overlay');

@include app.generate-component(
  $overlay,
  'overlay',
  app.$config,
  app.$theme
);

$button: app.get-theme(app.$theme, 'components.button');

@include app.generate-component(
  $button,
  'btn',
  app.$config,
  app.$theme
);

$modal: app.get-theme(app.$theme, 'components.modal');

@include app.generate-component(
  $modal,
  'modal',
  app.$config,
  app.$theme
);
const modal = (elements, options) => {

const defaults = {

};


// @TODO add scroll lock
// @TODO add ontransitionend
// @TODO add click outside event
// Options
const settings = Object.assign({}, defaults, options);

const _close = (modal) => {
  modal.toggleAttribute('open');
}

const _open = (modal) => {
  modal.toggleAttribute('open');
}

const _add_event_listeners_dom = () => {
  document.addEventListener('keydown', event => {
    if (event.key === 'Escape' || event.keyCode === 27) {
      [].forEach.call(elements, (modal) => {
        _close(modal);
      })
    }
  });
}

const _add_event_listeners = (modal) => {
  modal.addEventListener('click', (e) => {
    e.preventDefault();
  })
}

const _init = () => {
  _add_event_listeners_dom();
  [].forEach.call(elements, (sidecap) => {
    _add_event_listeners(sidecap);
  })
};

// Initiating the accordion
if(modal) {
  _init();
}

return ({
  elements : elements,
  open : (element) => {
    document.body.toggleAttribute('scroll-lock');
    _open(element);
  },
  close : (element) => {
    document.body.toggleAttribute('scroll-lock');
    _close(element);
  }
})
}

const modals = modal(document.querySelectorAll('.modal'), {
});