"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Theme = /*#__PURE__*/function () {
  function Theme() {
    var _this = this;

    _classCallCheck(this, Theme);

    // looper color scheme refer from our _variable-bs-overrides.scss
    this.colors = {
      black: '#14141F',
      brand: {
        blue: '#0179A8',
        indigo: '#346CB0',
        purple: '#5F4B8B',
        pink: '#B76BA3',
        red: '#EA6759',
        orange: '#EC935E',
        yellow: '#F7C46C',
        green: '#A7C796',
        teal: '#00A28A',
        cyan: '#3686A0'
      },
      gray: {
        100: '#f6f7f9',
        200: '#e6e8ed',
        300: '#d6d8e1',
        400: '#c6c9d5',
        500: '#a6abbd',
        600: '#888c9b',
        700: '#363642',
        800: '#222230',
        900: '#191927'
      },
      white: '#ffffff'
    }; // list of supported skin

    this.skins = ['default', 'dark']; // current skin

    this.skin = localStorage.getItem('skin') || 'default'; // current aside menu mode

    this.hasCompactMenu = JSON.parse(localStorage.getItem('hasCompactMenu')) || false; // get auto initialize variable

    this.autoInit = localStorage.getItem('autoInit') || true; // initialized

    $(document).ready(function () {
      if (_this.autoInit) _this.init();
    });
  }

  _createClass(Theme, [{
    key: "init",
    value: function init() {
      // handle polyfill
      // =============================================================
      this.placeholderShown();
      this.objectFitFallback(); // handle bootstrap components
      // =============================================================

      this.tooltips();
      this.popovers();
      this.nestedDropdown();
      this.inputClearable();
      this.inputGroup();
      this.inputNumber();
      this.fileInputBehavior();
      this.togglePasswordVisibility();
      this.indeterminateCheckboxes();
      this.formValidation();
      this.cardExpansion();
      this.modalScrollable();
      this.autofocusInputBehaviour(); // handle theme skins (default, dark)
      // =============================================================

      this.setSkin(this.skin);

      if (this.skin === 'dark') {
        this.invertGrays();
      } // handle theme layouts
      // =============================================================


      this.asideBackdrop();
      this.toggleAside();
      this.asideMenu();
      this.handleAsideMenu();
      this.sidebar();
      this.pageExpander(); // handle theme components
      // =============================================================

      this.hamburger();
      this.publisher();
      this.tasksStyle();
      this.filterList();
      this.radioList();
      this.checkboxList();
      this.smoothScroll(); // handle plugins initialization
      // =============================================================

      this.perfectScrollbar();
      this.masonry();
      this.chartjs();
      this.sparkline();
      this.easypie();
      this.knob();
      this.sortable();
      this.nestable();
      this.plyr();
      this.bootstrapSelect();
      this.select2();
      this.atwho();
      this.tribute();
      this.flatpickr();
      this.colorpicker();
      this.touchspin();
      this.nouislider();
      this.summernote();
      this.quill();
      this.simplemde();
      this.maskInput();
      this.headroom();
      this.zxcvbn();
      this.aos(); // handle events – how our components should react on events?
      // =============================================================

      this.eventProps();
      this.watchMQ();
      this.watchIE(); // utilities
      // =============================================================

      this.browserFlagging();
      this.osFlagging(); // trigger the document

      $(document).trigger('theme:init', this);
    } // Polifyll
    // =============================================================

    /**
     * Polyfill for Array.values()
     * returns an array of a given object's own enumerable property values,
     * in the same order as that provided
     */

  }, {
    key: "objToArray",
    value: function objToArray(obj) {
      return Object.keys(obj).map(function (key) {
        return obj[key];
      });
    }
    /**
     * Polyfill for :placeholder-shown
     * used by floating label input
     */

  }, {
    key: "placeholderShown",
    value: function placeholderShown() {
      $(document).on('focus blur keyup change', '.form-label-group > input', function () {
        this.classList[this.value ? 'remove' : 'add']('placeholder-shown');
      }); // toggle .placeholder-shown onload

      $('.form-label-group > input').trigger('change');
    }
    /**
     * object-fit fallbaack for ie and edge
     */

  }, {
    key: "objectFitFallback",
    value: function objectFitFallback() {
      if (this.isIE() || this.isEdge()) {
        var selectors = ['.user-avatar img', '.tile > img', '.figure-attachment > img', '.page-cover > .cover-img', '.list-group-item-figure > img'];
        $(selectors.toString()).each(function () {
          var $img = $(this);
          var url = $img.prop('src');
          var $container = $img.parent(); // .user-avatar with dropdown has deep markup

          if ($container.is('[data-toggle="dropdown"]')) {
            $container = $container.parent();
          }

          if (url) {
            // copy img url then put as container bg
            $container.css({
              backgroundImage: "url(".concat(url, ")"),
              backgroundSize: 'cover',
              backgroundPosition: 'center center'
            });

            if ($container.hasClass('user-avatar') || $container.hasClass('user-avatar')) {
              $container.css('background-position', 'top center');
            } // hide the image


            $img.css('opacity', 0);
          }
        });
      }
    } // Bootstrap Components
    // =============================================================

    /**
     * Init bootstrap tooltips
     */

  }, {
    key: "tooltips",
    value: function tooltips() {
      // Turn off the transform placement on Popper
      Popper.Defaults.modifiers.computeStyle.gpuAcceleration = false;
      $('[data-toggle="tooltip"]').tooltip();
    }
    /**
     * Init bootstrap popovers
     */

  }, {
    key: "popovers",
    value: function popovers() {
      $('[data-toggle="popover"]').popover();
    }
    /**
     * Init nested dropdown
     */

  }, {
    key: "nestedDropdown",
    value: function nestedDropdown() {
      $('.dropdown-menu [data-toggle="dropdown"]').on('click', function (e) {
        e.preventDefault();
        e.stopPropagation();
        var $trigger = $(this);
        var $dropdown = $trigger.parent();
        var $dropdownMenu = $trigger.next(); // close all dropdown menu

        $dropdown.siblings().find('.dropdown-menu').removeClass('show');
        $dropdownMenu.toggleClass('show');
        $trigger.parents('.nav-item').on('hidden.bs.dropdown', function () {
          return $dropdownMenu.removeClass('show');
        });
      });
    }
    /**
     * Hide/show clearable button due to input value
     */

  }, {
    key: "inputClearable",
    value: function inputClearable() {
      // hide/show due to input value
      var toggleClear = function toggleClear(input) {
        var isEmpty = !$(input).val();
        var clearable = $(input).parent().children('.close');
        clearable.toggleClass('show', !isEmpty);
      }; // give natural state onload
      // show close button when input has value


      $('.has-clearable > .form-control').each(function () {
        toggleClear(this);
      }); // handle input clearable events

      $(document).on('keyup', '.has-clearable > .form-control', function () {
        toggleClear(this);
      }).on('click', '.has-clearable > .close', function () {
        var $input = $(this).parent().children('.form-control');
        $input.val('').focus();
        toggleClear($input[0]);
        $input.trigger('keyup');
      });
    }
    /**
     * Toggle focus class in input-group when input is focused
     */

  }, {
    key: "inputGroup",
    value: function inputGroup() {
      // handle input group events
      $(document).on('focusin focusout', '.input-group:not(.input-group-alt) .form-control', function (e) {
        var $parent = $(this).parent();
        var hasInputGroup = $parent.has('.input-group');
        var hasFocus = e.type === 'focusin';

        if (hasInputGroup) {
          $parent.toggleClass('focus', hasFocus);
        }
      });
    }
    /**
     * Toggle focus class in input-group when input is focused
     */

  }, {
    key: "inputNumber",
    value: function inputNumber() {
      $('.custom-number').each(function () {
        var spinner = $(this);
        var input = spinner.children('.form-control[type="number"]');
        var min = parseFloat(input.attr('min'));
        var max = parseFloat(input.attr('max'));
        var step = parseFloat(input.attr('step')) || 1;
        var newVal = 0;
        var controls = $('<div class="custom-number-controls"></div>');
        var btnUp = $('<div class="custom-number-btn custom-number-up">+</div>');
        var btnDown = $('<div class="custom-number-btn custom-number-down">-</div>');
        controls.prepend(btnUp).append(btnDown);
        spinner.append(controls);
        btnUp.on('click', function () {
          var oldValue = parseFloat(input.val()) || 0;
          newVal = oldValue >= max ? oldValue : oldValue + step;
          input.val(newVal).trigger('change');
        });
        btnDown.on('click', function () {
          var oldValue = parseFloat(input.val()) || 0;
          newVal = oldValue <= min ? oldValue : oldValue - step;
          input.val(newVal).trigger('change');
        });
      });
    }
    /**
     * Add text value to our custom file input
     */

  }, {
    key: "fileInputBehavior",
    value: function fileInputBehavior() {
      // copy label text to data label which we'll use later
      $('.custom-file > .custom-file-label').each(function () {
        var label = $(this).text();
        $(this).data('label', label);
      }); // update label text with current input value

      $(document).on('change', '.custom-file > .custom-file-input', function () {
        var files = this.files;
        var $fileLabel = $(this).next('.custom-file-label'); // use when no file chosen

        var $originLabel = $fileLabel.data('label'); // truncate text when user chose more than 2 files

        $fileLabel.text(files.length + ' files selected');

        if (files.length <= 2) {
          var fileNames = [];

          for (var i = 0; i < files.length; i++) {
            fileNames.push(files[i].name);
          }

          $fileLabel.text(fileNames.join(', '));
        } // reset label text if no file chosen


        if (!files.length) {
          $fileLabel.text($originLabel);
        }
      });
    }
    /**
     * Toggle visibility password input value
     */

  }, {
    key: "togglePasswordVisibility",
    value: function togglePasswordVisibility() {
      $(document).on('click', '[data-toggle="password"]', function (e) {
        e.preventDefault();
        var target = $(this).attr('href');
        var $input = $(target);
        var hasFa = $(this).has('.fa');
        var isPassword = $input.is('[type="password"]');
        var inputType = isPassword ? 'text' : 'password';
        var triggerText = isPassword ? 'Hide' : 'Show'; // toggle icon

        $(this).children('.fa, .far').toggleClass('fa-eye fa-eye-slash', hasFa); // toggle trigger text

        $(this).children().last().text(triggerText); // toggle input type

        $input.prop('type', inputType);
      });
    }
    /**
     * Add indeterminate state in custom checkbox
     */

  }, {
    key: "indeterminateCheckboxes",
    value: function indeterminateCheckboxes() {
      $('input[type="checkbox"][indeterminate], input[type="checkbox"][data-indeterminate="true"]').prop('indeterminate', true);
    }
    /**
     * Validate form on submit
     */

  }, {
    key: "formValidation",
    value: function formValidation() {
      $(window).on('load', function () {
        // Fetch all the forms we want to apply custom Bootstrap validation styles to
        var forms = $('.needs-validation'); // Loop over them and prevent submission

        forms.each(function (i, form) {
          $(form).on('submit', function (e) {
            if (form.checkValidity() === false) {
              e.preventDefault();
              e.stopPropagation();
            }

            $(form).addClass('was-validated');
          });
        });
      });
    }
    /**
     * Toggle card expansion like accordion
     */

  }, {
    key: "cardExpansion",
    value: function cardExpansion() {
      $(document).on('show.bs.collapse hide.bs.collapse', '.card-expansion-item > .collapse', function (e) {
        var $item = $(this).parent();
        var isShown = e.type === 'show';
        $item.toggleClass('expanded', isShown);
      });
    }
    /**
     * Toggle class scrollable when the modal body scroll reach the top/bottom
     */

  }, {
    key: "modalScrollable",
    value: function modalScrollable() {
      $('.modal').on('shown.bs.modal', function () {
        $(this).addClass('has-shown').find('.modal-body').trigger('scroll');
      });
      $('.modal-dialog-scrollable .modal-body, .modal-drawer .modal-body').on('scroll', function () {
        var $elem = $(this);
        var elem = $elem[0];
        var isTop = $elem.scrollTop() === 0;
        var isBottom = elem.scrollHeight - $elem.scrollTop() === $elem.outerHeight();
        $elem.prev().toggleClass('modal-body-scrolled', isTop);
        $elem.next().toggleClass('modal-body-scrolled', isBottom);
      });
    }
    /**
     * Make input with [autofocus] attribute in modal and dropdown work as native [autofocus]
     */

  }, {
    key: "autofocusInputBehaviour",
    value: function autofocusInputBehaviour() {
      $(document).on('shown.bs.modal shown.bs.dropdown', '.modal, .dropdown', function (e) {
        var $modal = $(e.target);
        $modal.find('input[autofocus]:first, input[data-autofocus="true"]:first').focus();
      });
    } // Theme Skins
    // =============================================================

    /**
     * Get gray colors from colors
     */

  }, {
    key: "getColors",
    value: function getColors(color) {
      return this.colors[color];
    }
    /**
     * Get muted colors based on active skin
     */

  }, {
    key: "getMutedColor",
    value: function getMutedColor() {
      return this.skin === 'dark' ? this.colors.gray[400] : this.colors.gray[600];
    }
    /**
     * Get light color based on active skin
     */

  }, {
    key: "getLightColor",
    value: function getLightColor() {
      return this.colors.gray[100];
    }
    /**
     * Get dark color based on active skin
     */

  }, {
    key: "getDarkColor",
    value: function getDarkColor() {
      return this.colors.gray[900];
    }
    /**
     * Set current skin to given value
     * We need to reload the browser when perform this method
     * to apply changes to all components
     */

  }, {
    key: "setSkin",
    value: function setSkin(skin) {
      // reset to default when using un-appropriate value
      skin = this.skins.indexOf(skin) < 0 ? 'default' : skin; // inverse gray colors

      if (this.skin !== skin) {
        this.invertGrays();
      } // flagging class


      $('body').removeClass('dark-skin default-skin').addClass("".concat(skin, "-skin"));
      localStorage.setItem('skin', skin);
      this.skin = skin;
    }
    /**
     * Invert gray colors due to active skin
     */

  }, {
    key: "invertGrays",
    value: function invertGrays() {
      var _this2 = this;

      var self = this;
      var gray = this.getColors('gray'); // get gray colors in array that reserve it

      var reverseGray = this.objToArray(gray).reverse();
      var x = 0;
      $.each(gray, function (i, v) {
        _this2.colors.gray[i] = reverseGray[x];
        x++;
      });
    } // Theme Layout
    // =============================================================

    /**
     * Append aside-backdrop to .app
     */

  }, {
    key: "asideBackdrop",
    value: function asideBackdrop() {
      $('.app').append('<div class="aside-backdrop"/>');
    }
    /**
     * Showing aside-backdrop
     */

  }, {
    key: "showAsideBackdrop",
    value: function showAsideBackdrop() {
      $('.aside-backdrop').addClass('show');
      return $('.aside-backdrop');
    }
    /**
     * Hiding aside-backdrop
     */

  }, {
    key: "hideAsideBackdrop",
    value: function hideAsideBackdrop() {
      $('.aside-backdrop').removeClass('show');
      return $('.aside-backdrop');
    }
    /**
     * Show aside
     */

  }, {
    key: "showAside",
    value: function showAside() {
      var _this3 = this;

      // show aside-backdrop
      var backdrop = this.showAsideBackdrop(); // add .show class to aside

      $('.app-aside').addClass('show'); // add .active state to trigger button

      $('[data-toggle="aside"]').addClass('active');
      backdrop.one('click', function () {
        _this3.hideAside();
      });
    }
    /**
     * Hide aside
     */

  }, {
    key: "hideAside",
    value: function hideAside() {
      // hide aside-backdrop
      this.hideAsideBackdrop(); // remove .show class to aside

      $('.app-aside').removeClass('show'); // remove .active state to trigger button

      $('[data-toggle="aside"]').removeClass('active');
    }
    /**
     * Handle show/hide aside
     */

  }, {
    key: "toggleAside",
    value: function toggleAside() {
      var _this4 = this;

      var $trigger = $('[data-toggle="aside"]');
      $trigger.on('click', function () {
        var isShown = $('.app-aside').hasClass('show');
        $trigger.toggleClass('active', !isShown);
        if (isShown) _this4.hideAside();else _this4.showAside();
      });
    }
    /**
     * Get the appropriate StackedMenu options
     */

  }, {
    key: "getMenuOptions",
    value: function getMenuOptions() {
      return {
        compact: this.hasCompactMenu,
        hoverable: this.hasCompactMenu
      };
    }
    /**
     * Handle aside menu
     */

  }, {
    key: "asideMenu",
    value: function asideMenu() {
      var ps;

      if (window.StackedMenu && this.isExists('#stacked-menu')) {
        // init stackedMenu
        this.stackedMenu = new StackedMenu(this.getMenuOptions());
        $('.app').toggleClass('has-compact-menu', this.hasCompactMenu); // watch aside

        this.watchAside(); // update perfect scrollbar

        $(this.stackedMenu.selector).on('menu:open menu:close', function () {
          // wait until translation done
          setTimeout(function () {
            if (window.PerfectScrollbar) {
              ps.update();
            }
          }, 300);
        }); // perfect scrollbar for aside menu

        if (window.PerfectScrollbar) {
          ps = new PerfectScrollbar('.aside-menu', {
            suppressScrollX: true
          });
        }
      }
    }
    /**
     * Collapse aside menu to compact mode
     */

  }, {
    key: "collapseAsideMenu",
    value: function collapseAsideMenu() {
      if (typeof this.stackedMenu !== 'undefined') {
        this.stackedMenu.compact(true).hoverable(true); // update aside mode

        this.hasCompactMenu = true; // as well as localStorage data

        localStorage.setItem('hasCompactMenu', true); // update flag class

        $('.app').addClass('has-compact-menu');
      } // watch aside


      this.watchAside();
    }
    /**
     * Expand aside menu to normal mode
     */

  }, {
    key: "expandAsideMenu",
    value: function expandAsideMenu() {
      if (typeof this.stackedMenu !== 'undefined') {
        this.stackedMenu.compact(false).hoverable(false); // update aside mode

        this.hasCompactMenu = false; // as well as localStorage data

        localStorage.setItem('hasCompactMenu', false); // update flag class

        $('.app').removeClass('has-compact-menu');
      } // watch aside


      this.watchAside();
    }
    /**
     * Toggle aside menu mode
     */

  }, {
    key: "toggleAsideMenu",
    value: function toggleAsideMenu() {
      if (this.hasCompactMenu == true) {
        this.expandAsideMenu();
      } else {
        this.collapseAsideMenu();
      }
    }
    /**
     *  Watch aside on toggle screen
     */

  }, {
    key: "watchAside",
    value: function watchAside() {
      var $appWrapper = $('.app');

      if (typeof this.stackedMenu !== 'undefined') {
        if (!this.isToggleScreenUp() || $appWrapper.hasClass('has-fullwidth')) {
          this.stackedMenu.compact(false).hoverable(false);
          $appWrapper.removeClass('has-compact-menu');
        } else {
          this.stackedMenu.compact(this.hasCompactMenu).hoverable(this.hasCompactMenu);
          $appWrapper.toggleClass('has-compact-menu', this.hasCompactMenu);
        }
      }
    }
    /**
     * handle aside compact
     */

  }, {
    key: "handleAsideMenu",
    value: function handleAsideMenu() {
      var _this5 = this;

      $('body').on('click', '[data-toggle="aside-collapse"]', function (e) {
        e.preventDefault();

        _this5.collapseAsideMenu();
      }).on('click', '[data-toggle="aside-expand"]', function (e) {
        e.preventDefault();

        _this5.expandAsideMenu();
      }).on('click', '[data-toggle="aside-menu"]', function (e) {
        e.preventDefault();

        _this5.toggleAsideMenu();
      }); // remove any preparation classes here

      $('html').removeClass('preparing-compact-menu');
    }
    /**
     * Showing sidebar
     */

  }, {
    key: "showSidebar",
    value: function showSidebar(relatedTarget) {
      $('.has-sidebar').addClass('has-sidebar-open'); // trigger event

      $('.page-sidebar').trigger({
        type: 'toggle.sidebar',
        isOpen: true,
        relatedTarget: relatedTarget
      });
    }
    /**
     * Hiding sidebar
     */

  }, {
    key: "hideSidebar",
    value: function hideSidebar(relatedTarget) {
      $('.has-sidebar').removeClass('has-sidebar-open'); // trigger event

      $('.page-sidebar').trigger({
        type: 'toggle.sidebar',
        isOpen: false,
        relatedTarget: relatedTarget
      });
    }
    /**
     * Toggle sidebar
     */

  }, {
    key: "toggleSidebar",
    value: function toggleSidebar(relatedTarget) {
      var $target = $('.has-sidebar');
      var isOpen = $target.hasClass('has-sidebar-open');

      if (this.isExists('.has-sidebar') && isOpen) {
        this.hideSidebar(relatedTarget);
      } else if (this.isExists('.has-sidebar') && !isOpen) {
        this.showSidebar(relatedTarget);
      }
    }
    /**
     * Add sidebar backdrop to the .page
     */

  }, {
    key: "sidebarBackdrop",
    value: function sidebarBackdrop() {
      // append backdrop only when .page has .sidebar component
      if (this.isExists('.has-sidebar')) {
        $('.page').prepend('<div class="sidebar-backdrop" />');
      }
    }
    /**
     * Handle sidebar
     */

  }, {
    key: "sidebar",
    value: function sidebar() {
      var self = this; // handle sidebar

      this.sidebarBackdrop();
      $(document).on('click', '[data-toggle="sidebar"], .sidebar-backdrop', function (e) {
        e.preventDefault();
        var state = $(this).data('sidebar');

        switch (state) {
          case 'show':
            self.showSidebar(this);
            break;

          case 'hide':
            self.hideSidebar(this);
            break;

          default:
            self.toggleSidebar(this);
        }
      });
    }
    /**
     * Toggle .page-expanded class on .page
     * best fit to used in board layout
     */

  }, {
    key: "pageExpander",
    value: function pageExpander() {
      $(document).on('click', '[data-toggle="page-expander"]', function (e) {
        e.preventDefault();
        $('.page').toggleClass('page-expanded');
      });
    } // Theme Components
    // =============================================================

    /**
     * Handle hamburger .active state
     */

  }, {
    key: "hamburger",
    value: function hamburger() {
      $(document).on('click', '.hamburger-toggle', function () {
        $(this).toggleClass('active');
      });
    }
    /**
     * Handle publisher focus state
     */

  }, {
    key: "publisher",
    value: function publisher() {
      $(document).on('focusin', '.publisher .form-control', function () {
        var $publisher = $(this).parents('.publisher'); // normalize all empty publisher

        $('.publisher').each(function () {
          var hasEmpty = !$(this).find('.form-control').val();

          if (hasEmpty) {
            $(this).removeClass('active');
            $(this).not('.keep-focus').removeClass('focus');
          }
        }); // add state classes

        $publisher.addClass('focus active');
      }).on('click', 'html', function () {
        var $publisher = $('.publisher.active');
        var isEmpty = !$publisher.find('.form-control').val(); // always remove active state

        $publisher.removeClass('active'); // remove focus if input is empty

        if (isEmpty) {
          $publisher.not('.keep-focus').removeClass('focus');
        }
      }).on('click', '.publisher.active', function (e) {
        e.stopPropagation();
      });
    }
    /**
     * Add hover state when task header is hovered
     */

  }, {
    key: "tasksStyle",
    value: function tasksStyle() {
      $(document).on('mouseenter mouseleave', '.task-header', function (e) {
        var isHover = e.type === 'mouseenter';
        $(this).parent().toggleClass('hover', isHover);
      });
    }
    /**
     * Filter list(s) through input
     */

  }, {
    key: "filterList",
    value: function filterList() {
      $(document).on('keyup', '[data-filter]', function () {
        var target = $(this).data('filter');
        var value = $(this).val().toLowerCase();
        $(target).filter(function () {
          var text = $(this).text().toLowerCase();
          $(this).toggle(text.indexOf(value) > -1);
        });
      });
    }
    /**
     * Make list items selectable like input[radio]
     */

  }, {
    key: "radioList",
    value: function radioList() {
      $(document).on('click', '[data-toggle="radiolist"] > *', function () {
        var $list = $(this).parent();
        var $listItems = $list.children(); // remove all selected item

        $listItems.removeClass('active'); // selected item

        $(this).addClass('active');
        $list.trigger({
          type: 'change',
          relatedTarget: this
        });
      });
    }
    /**
     * Make list items selectable like input[checkbox]
     */

  }, {
    key: "checkboxList",
    value: function checkboxList() {
      $(document).on('click', '[data-toggle="checkboxlist"] > *', function () {
        var $list = $(this).parent();
        var isActive = $(this).hasClass('active'); // selected item

        $(this).toggleClass('active', !isActive);
        $list.trigger({
          type: 'change',
          relatedTarget: $list.children('.active')
        });
      });
    }
    /**
     * Animate scroll on internal link
     */

  }, {
    key: "smoothScroll",
    value: function smoothScroll() {
      $(document).on('click', 'a.smooth-scroll[href^="#"]', function (e) {
        var hash = $(this).attr('href');
        var target = $(hash);

        if (!target.length) {
          return;
        }

        e.preventDefault();
        var headerHeight = $('.app-header').height() + 20;
        var offset = target.offset().top - headerHeight;
        $('html, body').animate({
          scrollTop: offset < 0 ? 0 : offset
        }, 700);
      });
    } // Theme Plugins
    // =============================================================

    /**
     * Handle perfect scrollbar
     */

  }, {
    key: "perfectScrollbar",
    value: function perfectScrollbar() {
      // initialization for any components
      if (window.PerfectScrollbar && this.isExists('.perfect-scrollbar')) {
        $('.perfect-scrollbar:not(".aside-menu")').each(function () {
          new PerfectScrollbar(this, {
            suppressScrollX: true
          });
        });
      }
    }
    /**
     * Handle masonry
     */

  }, {
    key: "masonry",
    value: function masonry() {
      if (window.Masonry) {
        $(document).ready(function () {
          $('.masonry-layout').masonry({
            itemSelector: '.masonry-item',
            columnWidth: '.masonry-item:first-child',
            percentPosition: true
          });
        });
      }
    }
    /**
     * Handle ChartJS default options
     */

  }, {
    key: "chartjs",
    value: function chartjs() {
      if (window.Chart) {
        var colors = this.colors;
        var skin = this.skin;
        var isDarkSkin = skin === 'dark';
        var gray = this.getColors('gray'); // our settings for Chart JS

        var settings = {
          global: {
            responsive: true,
            maintainAspectRatio: false,
            defaultColor: isDarkSkin ? this.hexToRgba(colors.white, .08) : this.hexToRgba(colors.black, .1),
            defaultFontColor: isDarkSkin ? gray[400] : gray[600],
            fontFamily: '-apple-system, BlinkMacSystemFont, "Fira Sans", "Helvetica Neue", "Apple Color Emoji", sans-serif',
            tooltips: {
              backgroundColor: isDarkSkin ? this.hexToRgba(colors.white, .98) : this.hexToRgba(colors.black, .98),
              xPadding: 8,
              yPadding: 8,
              titleMarginBottom: 8,
              footerMarginTop: 8,
              titleFontColor: gray[200],
              bodyFontColor: gray[200],
              footerFontColor: gray[200],
              multiKeyBackground: gray[200]
            },
            title: {
              fontColor: gray[700],
              fontStyle: 500
            },
            legend: {
              display: false
            }
          },
          scale: {
            gridLines: {
              color: isDarkSkin ? this.hexToRgba(colors.white, .08) : this.hexToRgba(colors.black, .1),
              zeroLineColor: isDarkSkin ? this.hexToRgba(colors.white, .08) : this.hexToRgba(colors.black, .1)
            }
          }
        }; // Merge settings to Chart JS default options

        $.extend(true, Chart.defaults, settings);
      }
    }
    /**
     * Handle Flot default options
     */

  }, {
    key: "flotDefaultOptions",
    value: function flotDefaultOptions() {
      var colors = this.colors;
      var skin = this.skin;
      var isDarkSkin = skin === 'dark';
      var gray = this.getColors('gray'); // our setting to merge with flot default options

      return {
        xaxis: {
          tickColor: isDarkSkin ? this.hexToRgba(colors.white, .08) : this.hexToRgba(colors.black, .1),
          color: isDarkSkin ? gray[400] : gray[600]
        },
        yaxis: {
          tickColor: isDarkSkin ? this.hexToRgba(colors.white, .08) : this.hexToRgba(colors.black, .1),
          color: isDarkSkin ? gray[400] : gray[600]
        }
      };
    }
    /**
     * Handle Sparkline initialization
     */

  }, {
    key: "sparkline",
    value: function sparkline() {
      if ($.fn.sparkline) {
        $('[data-toggle="sparkline"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          var values = options.values || 'html';
          $(selector).sparkline(values, options);
        });
      }
    }
    /**
     * Handle easyPieChart initialization
     */

  }, {
    key: "easypie",
    value: function easypie() {
      if ($.fn.easyPieChart) {
        var self = this;
        $('[data-toggle="easypiechart"]').each(function () {
          var selector = this;
          var options = $(selector).data(); // default for undefined

          options.barColor = options.barColor || self.colors.brand.teal;
          options.trackColor = options.trackColor || self.skin === 'dark' ? self.getColors('gray')[200] : self.colors.white;
          options.scaleColor = options.scaleColor || 'transparent';
          options.lineWidth = options.lineWidth ? parseInt(options.lineWidth) : 8;
          options.size = options.size ? parseInt(options.size) : 120;
          options.rotate = options.rotate ? parseInt(options.rotate) : 0;
          options.trackColor = options.trackColor == 'false' || options.trackColor == '' ? false : options.trackColor;
          options.scaleColor = options.scaleColor == 'false' || options.scaleColor == '' ? false : options.scaleColor;
          $(selector).easyPieChart(options);
        });
      }
    }
    /**
     * Handle knob initialization
     */

  }, {
    key: "knob",
    value: function knob() {
      if ($.fn.knob) {
        var self = this;
        $('[data-toggle="knob"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          options.bgColor = options.bgcolor || self.getLightColor();
          options.fgColor = options.fgcolor || self.colors.brand.teal;

          options.draw = function () {
            // 'tron' case
            if (this.$.data('skin') == 'tron') {
              this.cursorExt = 0.3;
              var a = this.arc(this.cv); // Arc

              var pa; // Previous arc

              var r = 1;
              this.g.lineWidth = this.lineWidth;

              if (this.o.displayPrevious) {
                pa = this.arc(this.v);
                this.g.beginPath();
                this.g.strokeStyle = this.pColor;
                this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, pa.s, pa.e, pa.d);
                this.g.stroke();
              }

              this.g.beginPath();
              this.g.strokeStyle = r ? this.o.fgColor : this.fgColor;
              this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, a.s, a.e, a.d);
              this.g.stroke();
              this.g.lineWidth = 2;
              this.g.beginPath();
              this.g.strokeStyle = this.o.fgColor;
              this.g.arc(this.xy, this.xy, this.radius - this.lineWidth + 1 + this.lineWidth * 2 / 3, 0, 2 * Math.PI, false);
              this.g.stroke();
              return false;
            }
          };

          $(selector).knob(options);
        });
      }
    }
    /**
     * Handle Sortable initialization
     */

  }, {
    key: "sortable",
    value: function sortable() {
      if (window.Sortable) {
        $('[data-toggle="sortable"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          options.animation = options.animation || 150;
          options.filter = options.filter || '.ignore-sort';
          Sortable.create(selector, options);
        });
      }
    }
    /**
     * Handle Nestable initialization
     */

  }, {
    key: "nestable",
    value: function nestable() {
      if ($.fn.nestable) {
        $('[data-toggle="nestable"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          $(selector).nestable(options);
        });
      }
    }
    /**
     * Handle Plyr initialization
     */

  }, {
    key: "plyr",
    value: function plyr() {
      if (window.Plyr) {
        $('[data-toggle="plyr"]').each(function () {
          var selector = this;
          new Plyr(selector);
        });
      }
    }
    /**
     * jsTree common types setup
     */

  }, {
    key: "jsTreeTypes",
    value: function jsTreeTypes() {
      return {
        '#': {
          max_children: 1,
          max_depth: 4,
          valid_children: ['root']
        },
        'root': {
          icon: 'fa fa-hdd text-yellow',
          valid_children: ['default', 'file']
        },
        default: {
          icon: 'fa fa-folder text-yellow',
          valid_children: ['default', 'file']
        },
        file: {
          icon: 'fa fa-file',
          valid_children: []
        },
        text: {
          icon: 'far fa-file-alt',
          valid_children: []
        },
        word: {
          icon: 'far fa-file-word',
          valid_children: []
        },
        excel: {
          icon: 'far fa-file-excel',
          valid_children: []
        },
        ppt: {
          icon: 'far fa-file-powerpoint',
          valid_children: []
        },
        pdf: {
          icon: 'far fa-file-pdf',
          valid_children: []
        },
        archive: {
          icon: 'far fa-file-archive',
          valid_children: []
        },
        image: {
          icon: 'far fa-file-image',
          valid_children: []
        },
        audio: {
          icon: 'far fa-file-audio',
          valid_children: []
        },
        video: {
          icon: 'far fa-file-video',
          valid_children: []
        }
      };
    }
    /**
     * Handle bootstrap select initialization
     * See https://developer.snapappointments.com/bootstrap-select
     */

  }, {
    key: "bootstrapSelect",
    value: function bootstrapSelect() {
      if ($.fn.selectpicker) {
        // use fontawesome as default icon
        $.fn.selectpicker.Constructor.DEFAULTS.style = '';
        $.fn.selectpicker.Constructor.DEFAULTS.styleBase = 'custom-select';
        $.fn.selectpicker.Constructor.DEFAULTS.iconBase = 'mr-1 fa';
        $.fn.selectpicker.Constructor.DEFAULTS.tickIcon = 'fa-check font-size-sm mt-2';
        $('[data-toggle="selectpicker"]').each(function () {
          var selector = this; // initialize

          $(selector).selectpicker() // add dropdown menu arrow
          .on('loaded.bs.select', function (e) {
            $(e.target).nextAll('.dropdown-menu').prepend('<div class="dropdown-arrow" />');
          });
        });
      }
    }
    /**
     * Handle select2 initialization
     * See https://select2.org/configuration/data-attributes
     * to use select2 with data-* attributes
     */

  }, {
    key: "select2",
    value: function select2() {
      if ($.fn.select2) {
        // responsive setting
        $.fn.select2.defaults.set('width', '100%');
        $('[data-toggle="select2"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          options = options.options ? options.options : options;
          $(selector).select2(options);
        });
      }
    }
    /**
     * Handle At.js initialization
     */

  }, {
    key: "atwho",
    value: function atwho() {
      if ($.fn.atwho) {
        $('[data-toggle="atwho"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          $(selector).atwho(options);
        });
      }
    }
    /**
     * Handle Tribute initialization
     */

  }, {
    key: "tribute",
    value: function tribute() {
      if (window.Tribute) {
        $('[data-toggle="tribute"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          options.menuContainer = document.querySelector(options.menuContainer) || false; // define custom template

          if (options.itemTemplate == true) {
            options.menuItemTemplate = function (item) {
              return "<span class=\"user-avatar user-avatar-sm mr-2\"><img src=\"".concat(item.original.avatar, "\"></span> ").concat(item.string);
            };
          } // define select template


          if (options.selectTemplate == true) {
            options.selectTemplate = function (item) {
              // function called on select that returns the content to insert
              return "<a href=\"#\" class=\"mention\">@".concat(item.original.value, "</a>");
            };
          } // set values from data-remote if exist


          if (options.remote) {
            $.ajax({
              async: false,
              dataType: 'json',
              url: options.remote,
              success: function success(data) {
                options.values = data;
              }
            });
          }

          var tribute = new Tribute(options);
          tribute.attach(this);
        });
      }
    }
    /**
     * Handle flatpickr initialization
     */

  }, {
    key: "flatpickr",
    value: function (_flatpickr) {
      function flatpickr() {
        return _flatpickr.apply(this, arguments);
      }

      flatpickr.toString = function () {
        return _flatpickr.toString();
      };

      return flatpickr;
    }(function () {
      if (window.flatpickr) {
        flatpickr.defaultConfig.disableMobile = true;
        $('[data-toggle="flatpickr"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          options.plugins = [];
          options.disable = options.disables || [];
          options.defaultDate = options.defaultDates || null; // flatpickr plugins

          if (options.confirmdate) {
            options.plugins.push(new confirmDatePlugin({
              showAlways: true
            }));
          }

          if (options.weekselect) {
            options.plugins.push(new weekSelect({}));
          }

          if (options.monthselect) {
            options.plugins.push(new monthSelectPlugin({
              shorthand: true,
              //defaults to false
              dateFormat: 'm/y',
              //defaults to 'F Y'
              altFormat: 'F Y' //defaults to 'F Y'

            }));
          }

          if (options.rangeplugin) {
            options.plugins.push(new range({
              input: "#".concat(options.secondInput)
            }));
          }

          flatpickr(selector, options);
        });
      }
    })
    /**
     * Handle colorpicker initialization
     */

  }, {
    key: "colorpicker",
    value: function colorpicker() {
      if ($.fn.colorpicker) {
        $('[data-toggle="colorpicker"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          $(selector).colorpicker(options);
        });
      }
    }
    /**
     * Handle TouchSpin initialization
     */

  }, {
    key: "touchspin",
    value: function touchspin() {
      if ($.fn.TouchSpin) {
        $('[data-toggle="touchspin"]').each(function () {
          var selector = this;
          var settings = $(selector).data();
          var options = {
            buttondown_class: 'btn btn-secondary',
            buttonup_class: 'btn btn-secondary',
            verticalupclass: '+',
            verticaldownclass: '-'
          }; // Merge options

          $.extend(true, options, settings);
          $(selector).TouchSpin(options);
        });
      }
    }
    /**
     * Handle nouislider initialization
     */

  }, {
    key: "nouislider",
    value: function nouislider() {
      if (window.noUiSlider) {
        $('[data-toggle="nouislider"]').each(function () {
          var selector = this;
          var options = $(selector).data();

          if (window.wNumb && options.formatWnumb) {
            options.format = wNumb(options.formatWnumb);
          }

          noUiSlider.create(selector, options);
        });
      }
    }
    /**
     * Handle summernote initialization
     */

  }, {
    key: "summernote",
    value: function summernote() {
      if ($.fn.summernote) {
        $('[data-toggle="summernote"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          options.callbacks = {
            // fix broken checkbox on link modal
            onInit: function onInit(e) {
              var editor = $(e.editor);
              editor.find('.custom-control-description').addClass('custom-control-label d-block').parent().removeAttr('for');
            }
          };
          $(selector).summernote(options);
        });
      }
    }
    /**
     * Handle Quill initialization
     */

  }, {
    key: "quill",
    value: function quill() {
      if (window.Quill) {
        $('[data-toggle="quill"]').each(function () {
          var selector = this;
          var options = $(selector).data();

          if (options.modules == null) {
            options.modules = {
              'formula': true,
              'syntax': true,
              'toolbar': [[{
                'font': []
              }, {
                'size': []
              }], ['bold', 'italic', 'underline', 'strike'], [{
                'color': []
              }, {
                'background': []
              }], [{
                'script': 'super'
              }, {
                'script': 'sub'
              }], [{
                'header': [false, 1, 2, 3, 4, 5, 6]
              }, 'blockquote', 'code-block'], [{
                'list': 'ordered'
              }, {
                'list': 'bullet'
              }, {
                'indent': '-1'
              }, {
                'indent': '+1'
              }], ['direction', {
                'align': []
              }], ['link', 'image', 'video', 'formula'], ['clean']]
            };
          }

          options.theme = options.theme ? options.theme : 'snow';
          new Quill(selector, options);
        });
      }
    }
    /**
     * Handle SimpleMDE initialization
     */

  }, {
    key: "simplemde",
    value: function simplemde() {
      if (window.SimpleMDE) {
        $('[data-toggle="simplemde"]').each(function () {
          var selector = this;
          var options = $(selector).data();
          options.element = this;
          new SimpleMDE(options);
        });
      }
    }
    /*
     * Handle Vanilla Text Mask
     */

  }, {
    key: "maskInput",
    value: function maskInput() {
      if (window.vanillaTextMask) {
        $('[data-mask]').each(function () {
          var selector = this;
          var options = $(selector).data();
          var patterns = {
            date: [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/],
            usphone: ['(', /[1-9]/, /\d/, /\d/, ')', ' ', /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/],
            usphonecode: ['+', '1', ' ', '(', /[1-9]/, /\d/, /\d/, ')', ' ', /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/],
            uszip: [/\d/, /\d/, /\d/, /\d/, /\d/],
            cazip: [/[A-Z]/i, /\d/, /[A-Z]/i, ' ', /\d/, /[A-Z]/i, /\d/],
            cc: [/\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/],
            expdatecc: [/\d/, /\d/, '/', /\d/, /\d/],
            cvc: [/\d/, /\d/, /\d/]
          };
          var pattern = options.mask;
          options.inputElement = selector;
          options.mask = patterns[options.mask] || [];
          options.placeholderChar = options.placeholderChar || '#';

          if (pattern == 'cazip') {
            options.pipe = function (val) {
              return val.toUpperCase();
            };
          } else if (pattern == 'email') {
            options.mask = textMaskAddons.emailMask || [];
          } else if (pattern == 'currency') {
            options.prefix = options.prefix || '';
            options.mask = textMaskAddons.createNumberMask ? textMaskAddons.createNumberMask(options) : [];
          } else if (pattern == 'percentage') {
            options.prefix = '';
            options.suffix = '%';
            options.mask = textMaskAddons.createNumberMask ? textMaskAddons.createNumberMask(options) : [];
          }

          if (options.autoCorrectDate) {
            var autoCorrectedDatePipe = textMaskAddons.createAutoCorrectedDatePipe ? textMaskAddons.createAutoCorrectedDatePipe(options.autoCorrectDate) : null;
            options.pipe = autoCorrectedDatePipe;
          }

          vanillaTextMask.maskInput(options);
        });
      }
    }
    /*
     * Handle headroom.js
     */

  }, {
    key: "headroom",
    value: function headroom() {
      if (window.Headroom) {
        $('[data-toggle="headroom"]').each(function () {
          var options = $(this).data();
          var headroom = new Headroom(this, options); // initialise

          headroom.init();
        });
      }
    }
    /*
     * Handle zxcvbn (password strength meter)
     */

  }, {
    key: "zxcvbn",
    value: function (_zxcvbn) {
      function zxcvbn() {
        return _zxcvbn.apply(this, arguments);
      }

      zxcvbn.toString = function () {
        return _zxcvbn.toString();
      };

      return zxcvbn;
    }(function () {
      if (window.zxcvbn) {
        $('.form-strength-meter').each(function () {
          var input = this;
          var indicator = $(this).data('indicator');
          var feedback = $(this).data('indicatorFeedback');
          var strength = ['bg-red', 'bg-orange', 'bg-yellow', 'bg-teal', 'bg-indigo'];
          $(input).on('keyup', function () {
            var val = input.value;
            var result = zxcvbn(val);
            var indicatorWidth = "".concat((result.score + 1) / strength.length * 100, "%"); // Update the password strength meter

            if (val !== '') {
              $(indicator).removeClass("d-none ".concat(strength.join(' '))).addClass("".concat(strength[result.score])).css('width', indicatorWidth);
              $(feedback).html("<strong>".concat(result.feedback.warning, "</strong> ").concat(result.feedback.suggestions));
            } else {
              $(indicator).addClass('d-none');
              $(feedback).html('');
            }
          });
        });
      }
    })
    /*
     * Handle AOS
     */

  }, {
    key: "aos",
    value: function aos() {
      if (window.AOS) {
        AOS.init({
          duration: 1000,
          once: true
        });
      }
    } // Events
    // =============================================================

    /**
     * Handle prevent default & propagation
     */

  }, {
    key: "eventProps",
    value: function eventProps() {
      $('body').on('click', '.stop-propagation', function (e) {
        e.stopPropagation();
      }).on('click', '.prevent-default', function (e) {
        e.preventDefault();
      });
    }
    /**
     * Handle window resize
     */

  }, {
    key: "watchMQ",
    value: function watchMQ() {
      var _this6 = this;

      $(window).on('resize', function () {
        // force close aside on toggle screen up
        if (_this6.isToggleScreenUp() && $('.app-aside').hasClass('has-open') && !$('.app').hasClass('has-fullwidth')) {
          _this6.hideAside();
        } // handle appropriate aside by screen sizes


        _this6.watchAside(); // disable transition temporarily


        $('.app-aside, .page-sidebar').addClass('notransition');
        setTimeout(function () {
          $('.app-aside, .page-sidebar').removeClass('notransition');
        }, 1);
      });
    }
    /**
     * Handle IE 11 lack render
     */

  }, {
    key: "watchIE",
    value: function watchIE() {
      if (this.isIE()) {
        $('.metric').each(function () {
          var height = $(this).height();
          $(this).height("".concat(height, "px"));
        });
      }
    } // Utilities
    // =============================================================

    /**
     * Opera 8.0+
     * @return {Boolean}
     */

  }, {
    key: "isOpera",
    value: function isOpera() {
      return !!window.opr && !!opr.addons || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    }
    /**
     * Firefox 1.0+
     * @return {Boolean}
     */

  }, {
    key: "isFirefox",
    value: function isFirefox() {
      return typeof InstallTrigger !== 'undefined';
    }
    /**
     * Safari 3.0+ "[object HTMLElementConstructor]"
     * @return {Boolean}
     */

  }, {
    key: "isSafari",
    value: function isSafari() {
      // Safari 3.0+ "[object HTMLElementConstructor]"
      return /constructor/i.test(window.HTMLElement) || function (p) {
        return p.toString() === '[object SafariRemoteNotification]';
      }(!window['safari'] || typeof safari !== 'undefined' && safari.pushNotification);
    }
    /**
     * Internet Explorer 6-11
     * @return {Boolean}
     */

  }, {
    key: "isIE",
    value: function isIE() {
      return (
        /*@cc_on!@*/
        false || !!document.documentMode
      );
    }
    /**
     * Edge 20+
     * @return {Boolean}
     */

  }, {
    key: "isEdge",
    value: function isEdge() {
      return !this.isIE() && !!window.StyleMedia;
    }
    /**
     * Chrome 1+
     * @return {Boolean}
     */

  }, {
    key: "isChrome",
    value: function isChrome() {
      return !!window.chrome && !!window.chrome.webstore;
    }
    /**
     * Blink engine detection
     * @return {Boolean}
     */

  }, {
    key: "isBlink",
    value: function isBlink() {
      return (this.isChrome() || this.isOpera()) && !!window.CSS;
    }
    /**
     * Add class to body by browser name
     */

  }, {
    key: "browserFlagging",
    value: function browserFlagging() {
      if (this.isOpera()) {
        $('body').addClass('opera');
      }

      if (this.isFirefox()) {
        $('body').addClass('firefox');
      }

      if (this.isSafari()) {
        $('body').addClass('safari');
      }

      if (this.isIE()) {
        $('body').addClass('ie');
      }

      if (this.isEdge()) {
        $('body').addClass('edge');
      }

      if (this.isChrome()) {
        $('body').addClass('chrome');
      }

      if (this.isBlink()) {
        $('body').addClass('blink');
      }
    }
    /**
     * We used diferent font-family between mac and other os
     * so we need to flaggin it to avoid unconsistent line-height
     */

  }, {
    key: "osFlagging",
    value: function osFlagging() {
      // add flagging class on macos due to fonts line-height issue
      if (navigator.appVersion.toLowerCase().indexOf('mac') != -1) {
        $('body').addClass('macos');
      }
    }
    /**
     * Detect if current screen size wider than our toggleScreen
     * refer to our media-breakpoint-up("md")
     */

  }, {
    key: "isToggleScreenUp",
    value: function isToggleScreenUp() {
      return window.matchMedia('(min-width: 768px)').matches;
    }
    /**
     * Detect if current screen size lower than our toggleScreen
     * refer to our media-breakpoint-down("md")
     */

  }, {
    key: "isToggleScreenDown",
    value: function isToggleScreenDown() {
      return window.matchMedia('(max-width: 767.98px)').matches;
    }
    /**
     * Check the existence of an element
     */

  }, {
    key: "isExists",
    value: function isExists(selector) {
      return $(selector).length > 0;
    }
    /**
     * Convert rgb color to hex
     * Credit: https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb?rq=1
     */

  }, {
    key: "rgbToHex",
    value: function rgbToHex(r, g, b) {
      return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
    }
    /**
     * Convert hex color to rgb
     * Credit: https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb?rq=1
     */

  }, {
    key: "hexToRgb",
    value: function hexToRgb(hex) {
      // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
      var regex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
      hex = hex.replace(regex, function (m, r, g, b) {
        return r + r + g + g + b + b;
      });
      var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
      return result ? "rgb(".concat(parseInt(result[1], 16), ", ").concat(parseInt(result[2], 16), ", ").concat(parseInt(result[3], 16), ")") : null;
    }
    /**
     * Convert hex color to rgba
     */

  }, {
    key: "hexToRgba",
    value: function hexToRgba(hex, alpha) {
      // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
      var regex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
      hex = hex.replace(regex, function (m, r, g, b) {
        return r + r + g + g + b + b;
      });
      var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
      return result ? "rgba(".concat(parseInt(result[1], 16), ", ").concat(parseInt(result[2], 16), ", ").concat(parseInt(result[3], 16), ", ").concat(alpha, ")") : null;
    }
  }]);

  return Theme;
}();
/**
 * Initialize Theme as Looper,
 * we can use it as global variable.
 * @example
 * Looper.setSkin('dark')
 */


var Looper = function () {
  var Looper = new Theme(); // toggle skin thought button

  $('[data-toggle="skin"]').on('click', function (e) {
    e.preventDefault();
    var skin = Looper.skin === 'dark' ? 'default' : 'dark';
    Looper.setSkin(skin); // we need to refresh our page after change the skin

    location.reload();
  }).each(function () {
    var isDarkSkin = Looper.skin === 'dark';
    var $icon = $(this).find('.fa-moon');

    if (isDarkSkin) {
      $icon.addClass('far');
      $icon.removeClass('fas');
    }
  }); // make it global

  return Looper;
}();