HOME


Mini Shell 1.0
DIR: /var/www/limehill_LIVE/wp-content/themes/oceanwp/assets/src/js/theme/menu/
Upload File :
Current File : /var/www/limehill_LIVE/wp-content/themes/oceanwp/assets/src/js/theme/menu/mega-menu.js
import { options } from "../../constants";
import { offset } from "../../lib/utils";

class MegaMenu {
  #elements;

  constructor() {
    this.#setElements();
    this.#start();
    this.#setupEventListeners();
  }

  #setElements = () => {
    this.#elements = {
      menuContents: document.querySelectorAll(
        ".navigation .megamenu-li.auto-mega .megamenu"
      ),
      menuItems: document.querySelectorAll(
        "#site-navigation .megamenu-li.full-mega"
      ),
      topbarMenuItems: document.querySelectorAll(
        "#top-bar-nav .megamenu-li.full-mega"
      ),
      header: document.querySelector("#site-header"),
      topbar: document.querySelector("#top-bar"),
      body: document.body,
    };
  };

  #start = () => {
    this.#elements.menuContents.forEach((menuContent) => {
      const menuItem = menuContent.parentNode;
      const menuItemLeftOffset = offset(menuItem).left;
      const menuContentWidth = parseInt(
        window.getComputedStyle(menuContent).width
      );
      let horizontalPosition;
      let horizontalMargin;

      if (menuItemLeftOffset - menuContentWidth / 2 < 0) {
        horizontalPosition = menuItemLeftOffset - 10;
        horizontalMargin = 0;
      } else {
        horizontalPosition = menuContentWidth / 2;
        horizontalMargin = menuItem.offsetWidth / 2;
      }

      if (!options.isRTL) {
        menuContent.style.left = `-${horizontalPosition}px`;
        menuContent.style.marginLeft = `${horizontalMargin}px`;
      } else {
        menuContent.style.right = `-${horizontalPosition}px`;
        menuContent.style.marginRight = `${horizontalMargin}px`;
      }

      if (
        window.innerWidth -
          menuItemLeftOffset -
          horizontalPosition +
          horizontalMargin +
          menuContentWidth <
        0
      ) {
        menuContent.style.left = "auto";
        menuContent.style.right = `-${
          window.innerWidth - menuItemLeftOffset - menuItem.offsetWidth - 10
        }px`;
      }
    });
  };

  #setupEventListeners = () => {
    this.#elements.menuItems.forEach((menuItem) => {
      menuItem.addEventListener("mouseenter", this.#onMenuItemMouseEnter);
      menuItem.addEventListener("keydown", this.#onMenuItemMouseEnter);
    });

    // Topbar menu items
    this.#elements.topbarMenuItems.forEach((menuItem) => {
      menuItem.addEventListener("mouseenter", this.#onTopbarMenuItemMouseEnter);
      menuItem.addEventListener("keydown", this.#onTopbarMenuItemMouseEnter);
    });
  };

  #onMenuItemMouseEnter = (event) => {
    const wrapper = this.#elements.header.classList.contains("medium-header")
      ? document.querySelector("#site-navigation-wrap > .container")
      : document.querySelector("#site-header-inner");

    this.#menuItemMouseEnter(wrapper, event);
  };

  #onTopbarMenuItemMouseEnter = (event) => {
    const wrapper = this.#elements.topbar;

    this.#menuItemMouseEnter(wrapper, event);
  };

  #menuItemMouseEnter = (wrapper, event) => {
    const menuItem = event.currentTarget;
    const content = menuItem.querySelector(".megamenu");
    let leftPosition = parseInt(
      offset(menuItem).left - offset(wrapper).left
    );

    if (!content) {
      return;
    }

    content.style.left = `-${leftPosition}px`;
    content.style.width = `${wrapper.offsetWidth}px`;
  };
}

export default MegaMenu;