Modal

<button class="modalBtn button--icon--arrowRight">Open Modal</button>
<div id="modal-design-system" class="modal" tabindex="0">
    <div class="modal__content">
        <div class="modal__content_header">
            <div class="modal__content_header_title">
                <h3 id="focusId" tabindex="-1">Quam celeriter currit canis!</h3>
            </div>
            <div class="modal__content_header_close" id="modalCloseButton">
                <span class="modal__content_header_close_button" tabindex="0">
                    <svg x="0px" y="0px" width="16px" height="16px" viewBox="0 0 16 16">
                        <rect x="-2.1" y="6.7" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -3.3137 8)" width="20.1" height="2.5" />
                        <rect x="-2.1" y="6.7" transform="matrix(0.7071 0.7071 -0.7071 0.7071 8 -3.3137)" width="20.1" height="2.5" />
                    </svg>
                </span>
            </div>
        </div>
        <div class="modal__content_body" aria-describedby="modal_content">
            <hr>
            <div tabindex="-1">
                <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.</p>
                <p class="modal__content_suffix">Equitēs ad Caesarem vēnērunt. </p>
            </div>
            <hr>
        </div>
        <div class="modal__content_footer">
            <button type="button" class="button button--secondary medium modal_close">Annuleren</button>
            <button type="button" class="button button--primary medium">Verder</button>
        </div>
        <div id="placeholder" tabindex="0"></div>
    </div>
</div>
<button class="modalBtn button--icon--arrowRight">Open Modal</button>
<div id="modal-design-system" class="modal" tabindex="0">
  <div class="modal__content">
    <div class="modal__content_header">
        <div class="modal__content_header_title">
            <h3 id="focusId" tabindex="-1">Quam celeriter currit canis!</h3>
        </div>
        <div class="modal__content_header_close" id="modalCloseButton">
            <span class="modal__content_header_close_button" tabindex="0">{{> @icon--cross }}</span>
        </div>
    </div>
    <div class="modal__content_body" aria-describedby="modal_content">
        <hr>
        <div tabindex="-1">
          <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.</p>
          <p class="modal__content_suffix">Equitēs ad Caesarem vēnērunt.  </p>
        </div>
        <hr>
    </div>
    <div class="modal__content_footer">
        <button type="button" class="button button--secondary medium modal_close">Annuleren</button>
        <button type="button" class="button button--primary medium">Verder</button>
    </div>
    <div id="placeholder" tabindex="0"></div>
  </div>
</div>
/* No context defined for this component. */
  • Content:
    $offset: 7px;
    
    .modal {
      $parent: &;
      display: none; /* Hidden by default */
      position: fixed;
      z-index: 1;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      overflow: auto; /* Enable scroll if needed */
      background-color: rgb(0, 0, 0); /* Fallback color */
      background-color: rgba(0, 0, 0, 0.4); /* Black w/ opacity */
      z-index: 999; //On top of everything
    
      /* Modal Content/Box */
      &__content {
        position: relative;
        background-color: $white;
        margin: 15% auto;
        padding: $space-s;
        padding-bottom: $space-s - $space-xs;
        max-width: 80%;
    
        p {
          text-align: left;
        }
    
        hr {
          width: calc(100% + 30px);
          margin: 0px -15px;
        }
    
        &_header {
          display: flex;
          flex-wrap: nowrap;
          justify-content: space-between;
          text-align: left;
    
          &_title {
            max-width: 80%;
    
            h3 {
              display: inline-block;
              height: 100%;
              margin-top: $space-xxs;
              margin-bottom: $space-xs;
            }
    
            h3:focus {
              outline: none;
            }
          }
    
          &_close {
            position: relative;
            top: $offset;
    
            &_button {
              color: $grey-dark;
              outline-color: $black;
            }
    
            &_button:hover {
              cursor: pointer;
            }
          }
        }
    
        &_body {
          p {
            color: $grey-dark;
            font-size: $fs-down-1;
            margin: $space-m 0;
          }
    
          p:focus {
            outline: none;
          }
        }
    
        &_footer {
          display: flex;
          justify-content: flex-end;
          flex-wrap: wrap;
          padding-top: $space-s;
    
          .button {
            margin-left: $space-xs;
          }
    
          .button--primary,
          .button--secondary {
            margin-bottom: $space-xs;
            cursor: pointer;
          }
        }
      }
    
      /* top colored border */
      &__content:after {
        background: linear-gradient(
            to left,
            #ffda45 25%,
            #d9ba66 25%,
            #d9ba66 50%,
            #ffda45 50%
        );
        position: absolute;
        content: "";
        height: 4px;
        right: 0;
        left: 0;
        top: 0;
      }
    }
    
    @media (min-width: $desktop-wide * 1.1) {
      .modal__content {
        max-width: 31%;
      }
    }
    
    @media (min-width: $desktop) {
      .modal {
        overflow: hidden;
    
        .modal__content {
          padding-left: $space-m;
    
          hr {
            width: calc(100% + 40px);
            margin: 0px -24px;
          }
        }
    
      }
    }
    
    @media (max-width: $mobile) {
    
      .modal__content_footer {
    
        flex-flow: column-reverse;
    
        .button {
          width: 100%;
          margin-left: 0;
        }
      }
    }
    
  • URL: /components/raw/modal/_modal.scss
  • Filesystem Path: src/components/01-componenten/modal/_modal.scss
  • Size: 2.5 KB
  • Content:
    /**
     * Component
     *
     * @param {Element} element
     */
    
    export default function Modal(id, event) {
      /* eslint-disable */
      var modal = document.getElementById(id);
    
      //button for testing purposes design system
      var btn = document.getElementsByClassName("modalBtn")[0];
      var modalElement = document.getElementById(id);
      if(modalElement) {
        var closeArrow = modalElement.getElementsByClassName("modal__content_header_close")[0];
        var buttonClose = modalElement.getElementsByClassName("modal_close")[0];
        var modalButtonDone = modalElement.getElementsByClassName("button--primary")[0];
        var modalButtonExpired = modalElement.getElementsByClassName("modal_session_expired")[0];
      }
    
    
      if (typeof btn !== "undefined") {
        if (id === 'modal-design-system') {
          btn.addEventListener("click", function () {
            showModal();
          });
        }
      }
    
      window.addEventListener(event, function () {
        var handle;
        showModal();
        if (event === 'session_timeout') {
          var suffix = document.getElementById("modal-suffix");
          if (suffix) {
            handle = startCountDown(300, document.querySelector('#countdown'));
          }
          if (modalButtonDone) {
            modalButtonDone.addEventListener("click", function () {
              hideModal();
              clearInterval(handle);
              //Send request to extend session
              var xhttp = new XMLHttpRequest();
              xhttp.open("GET", document.location.href);
              xhttp.send();
              window.setTimeout(function () {
                //A lot of code for just IE
                var event;
                if(typeof(Event) === 'function') {
                  event = new CustomEvent('session_timeout');
                }else{
                  event = document.createEvent('Event');
                  event.initEvent('session_timeout', true, true);
                }
                window.dispatchEvent(new CustomEvent('session_timeout'));
              }, 600000)
            });
          }
          if (event === 'session_expired') {
            clearInterval(handle);
          }
        }
      });
    
      function showModal() {
        if (modal) {
          modal.style.display = "block";
          focusTrap(modal);
          if (modalButtonDone) {
            modalButtonDone.focus();
          }
        }
      };
    
      function hideModal() {
        if (modal) {
          modal.style.display = "none";
        }
      }
    
      if (closeArrow) {
        closeArrow.addEventListener("click", function() {
          hideModal();
        });
        closeArrow.addEventListener("keyup", function (i) {
          if (i.keyCode == 13 || i.keyCode == 32) {
            hideModal();
          }
        });
        var placeholder = document.getElementById("placeholder");
        closeArrow.addEventListener("keydown", function (e) {
          if (e.keyCode == 9 && e.shiftKey) {
            placeholder.focus();
          }
        });
      }
    
      if (buttonClose) {
        buttonClose.addEventListener("click", function() {
          hideModal();
        })
      }
    
      if (modalButtonExpired) {
        modalButtonExpired.addEventListener("click", function () {
          window.location.href=window.location.href;
        });
      }
    
      window.onclick = function (event) {
        if (event.target == modal) {
          modal.style.display = "none";
        }
      };
    
      // Handle ESC key (key code 27)
      document.addEventListener("keyup", function (e) {
        if (e.keyCode == 27) {
          hideModal();
        }
      });
    
      //Stay focus in modal with tab (key code 9)
      if (modalButtonDone) {
        var modalHeader = document.getElementById("focusId");
        modalButtonDone.addEventListener("keydown", function (e) {
          if (e.keyCode == 9 && !e.shiftKey) {
            modalHeader.focus();
          }
        });
      }
    
      function startCountDown(duration, display) {
        var timer = duration, minutes, seconds;
        return setInterval(function () {
          minutes = parseInt(timer / 60, 10)
          seconds = parseInt(timer % 60, 10);
    
          minutes = minutes < 10 ? "0" + minutes : minutes;
          seconds = seconds < 10 ? "0" + seconds : seconds;
    
          display.textContent = minutes + ":" + seconds;
    
          if (--timer < 0) {
            hideModal();
            //A lot of code to make it compatible with IE
            var event;
            if(typeof(Event) === 'function') {
              event = new CustomEvent('session_expired');
            }else{
              event = document.createEvent('Event');
              event.initEvent('session_expired', true, true);
            }
            window.dispatchEvent(event);
          }
        }, 1000);
      }
    
      function focusTrap(element) {
        var focusableEls = element.querySelectorAll('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])');
        var firstFocusableEl = focusableEls[0];
        var lastFocusableEl = focusableEls[focusableEls.length - 1];
        var KEYCODE_TAB = 9;
    
        element.addEventListener('keydown', function(e) {
          var isTabPressed = (e.key === 'Tab' || e.keyCode === KEYCODE_TAB);
    
          if (!isTabPressed) {
            return;
          }
    
          if ( e.shiftKey ) /* shift + tab */ {
            if (document.activeElement === firstFocusableEl) {
              lastFocusableEl.focus();
              e.preventDefault();
            }
          } else /* tab */ {
            if (document.activeElement === lastFocusableEl) {
              firstFocusableEl.focus();
              e.preventDefault();
            }
          }
    
        });
      }
    }
    
  • URL: /components/raw/modal/modal.js
  • Filesystem Path: src/components/01-componenten/modal/modal.js
  • Size: 5.3 KB

There are no notes for this item.