MediaWiki:Timeless.js

From AnarchyMU Wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Timeless sidebar collapsible groups for AnarchyMU */
(function () {
  function initAnarchySidebar() {
    if (typeof mw === "undefined" || mw.config.get("skin") !== "timeless") {
      return;
    }

    var nav = document.querySelector("#site-navigation");
    if (!nav) {
      return;
    }

    var isMobile = window.matchMedia("(max-width: 850px)").matches;
    var portlets = nav.querySelectorAll(".mw-portlet");

    portlets.forEach(function (portlet, index) {
      var heading = portlet.querySelector("h3");
      var body = portlet.querySelector(".mw-portlet-body");

      if (!heading || !body) {
        return;
      }

      var key = "anarchymu.sidebar." + (portlet.id || "section_" + index);

      heading.setAttribute("role", "button");
      heading.setAttribute("tabindex", "0");
      heading.setAttribute("aria-expanded", "false");

      function setOpen(open) {
        if (open) {
          body.style.display = "";
          portlet.classList.add("amu-open");
          heading.setAttribute("aria-expanded", "true");
          localStorage.setItem(key, "1");
        } else {
          body.style.display = "none";
          portlet.classList.remove("amu-open");
          heading.setAttribute("aria-expanded", "false");
          localStorage.setItem(key, "0");
        }
      }

      if (isMobile) {
        setOpen(true);
      } else {
        var saved = localStorage.getItem(key);
        var openByDefault = index === 0;
        setOpen(saved === null ? openByDefault : saved === "1");
      }

      heading.addEventListener("click", function () {
        var isOpen = body.style.display !== "none";
        setOpen(!isOpen);
      });

      heading.addEventListener("keydown", function (event) {
        if (event.key === "Enter" || event.key === " ") {
          event.preventDefault();
          var isOpen = body.style.display !== "none";
          setOpen(!isOpen);
        }
      });
    });
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", initAnarchySidebar);
  } else {
    initAnarchySidebar();
  }
})();