Initial commit
This commit is contained in:
		
							
								
								
									
										193
									
								
								static/js/custom.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								static/js/custom.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,193 @@
 | 
			
		||||
var displayedMenu = "";
 | 
			
		||||
var hamburgerShown = false;
 | 
			
		||||
let width = screen.width;
 | 
			
		||||
var isMobile = width < 1024;
 | 
			
		||||
 | 
			
		||||
function toggleMenu(button) {
 | 
			
		||||
  if (displayedMenu === button.id.split("-")[0]) {
 | 
			
		||||
    button.className = button.className.replace(
 | 
			
		||||
      " text-gray-800 bg-stone-200 sm:bg-transparent",
 | 
			
		||||
      " text-gray-900"
 | 
			
		||||
    );
 | 
			
		||||
    hideMenu(button.id.split("-")[0]);
 | 
			
		||||
    button.lastElementChild.className = button.lastElementChild.className.replace(
 | 
			
		||||
      "rotate-0",
 | 
			
		||||
      "-rotate-90"
 | 
			
		||||
    );
 | 
			
		||||
    displayedMenu = "";
 | 
			
		||||
  } else {
 | 
			
		||||
    showMenu(button.id.split("-")[0]);
 | 
			
		||||
    button.lastElementChild.className = button.lastElementChild.className.replace(
 | 
			
		||||
      "-rotate-90",
 | 
			
		||||
      "rotate-0"
 | 
			
		||||
    );
 | 
			
		||||
    button.className = button.className.replace(
 | 
			
		||||
      " text-gray-900",
 | 
			
		||||
      " text-gray-800 bg-stone-200 sm:bg-transparent"
 | 
			
		||||
    );
 | 
			
		||||
    displayedMenu = button.id.split("-")[0];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  document.addEventListener("click", function (e) {
 | 
			
		||||
    if (!button.contains(e.target)) {
 | 
			
		||||
      hideMenu(button.id.split("-")[0]);
 | 
			
		||||
      button.lastElementChild.className = button.lastElementChild.className.replace(
 | 
			
		||||
        "rotate-0",
 | 
			
		||||
        "-rotate-90"
 | 
			
		||||
      );
 | 
			
		||||
      displayedMenu = "";
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function handleClick(button) {
 | 
			
		||||
  if (button.id === "hamburger-btn" || button.id === "close-hamburger-btn") {
 | 
			
		||||
    toggleHamburger();
 | 
			
		||||
  }
 | 
			
		||||
  if (button.id.indexOf("menu") !== -1) {
 | 
			
		||||
    toggleMenu(button);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function toggleHamburger() {
 | 
			
		||||
  if (hamburgerShown) {
 | 
			
		||||
    hideHamburger();
 | 
			
		||||
    hamburgerShown = false;
 | 
			
		||||
  } else {
 | 
			
		||||
    showHamburger();
 | 
			
		||||
    hamburgerShown = true;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function showMenu(menuName) {
 | 
			
		||||
  var menuId = menuName + (isMobile ? "-mobile-menu" : "-menu");
 | 
			
		||||
  var menuBtnId = menuName + (isMobile ? "-mobile-menu" : "-menu");
 | 
			
		||||
  var menuElement = document.getElementById(menuId);
 | 
			
		||||
  menuElement.className = menuElement.className.replace(" hidden", "");
 | 
			
		||||
  let children = document.querySelectorAll(".nav_menu");
 | 
			
		||||
  for (let i = 0; i < children.length; i++) {
 | 
			
		||||
    if (menuElement !== children[i]) {
 | 
			
		||||
      let btnId = `${children[i].id}-btn`;
 | 
			
		||||
      let btn = document.getElementById(btnId);
 | 
			
		||||
      if (btn && !children[i].classList.contains("hidden")) {
 | 
			
		||||
        children[i].classList.add("hidden");
 | 
			
		||||
        btn.lastElementChild.classList.replace("rotate-0", "-rotate-90");
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  setTimeout(function () {
 | 
			
		||||
    menuElement.className = menuElement.className.replace(
 | 
			
		||||
      "duration-200 ease-in opacity-0 -translate-y-1",
 | 
			
		||||
      "duration-150 ease-out opacity-1 -translate-y-0"
 | 
			
		||||
    );
 | 
			
		||||
  }, 10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function hideMenu(menuName) {
 | 
			
		||||
  var menuId = menuName + (isMobile ? "-mobile-menu" : "-menu");
 | 
			
		||||
  var menuElement = document.getElementById(menuId);
 | 
			
		||||
  var btnId = `${menuElement.id}-btn`;
 | 
			
		||||
  let btn = document.getElementById(btnId);
 | 
			
		||||
  menuElement.className = menuElement.className.replace(
 | 
			
		||||
    "duration-150 ease-out opacity-1 -translate-y-0",
 | 
			
		||||
    "duration-200 ease-in opacity-0 -translate-y-1"
 | 
			
		||||
  );
 | 
			
		||||
  btn.lastElementChild.className = btn.lastElementChild.className.replace(
 | 
			
		||||
    "rotate-0",
 | 
			
		||||
    "-rotate-90"
 | 
			
		||||
  );
 | 
			
		||||
  if (!menuElement.classList.contains("hidden")) {
 | 
			
		||||
    menuElement.classList.add("hidden");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function showHamburger() {
 | 
			
		||||
  document.getElementById("header-container").className = "overflow-hidden";
 | 
			
		||||
  document.getElementById("hamburger").className =
 | 
			
		||||
    "fixed mt-14 z-20 top-0 inset-x-0 transition transform origin-top-right";
 | 
			
		||||
  document.getElementById("hamburger-btn").className =
 | 
			
		||||
    "hidden lg:hidden inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out";
 | 
			
		||||
  document.getElementById("close-hamburger-btn").className =
 | 
			
		||||
    "inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function hideHamburger() {
 | 
			
		||||
  document.getElementById("header-container").className = "";
 | 
			
		||||
  document.getElementById("hamburger").className =
 | 
			
		||||
    "hidden absolute z-20 top-0 inset-x-0 transition transform origin-top-right lg:hidden";
 | 
			
		||||
  document.getElementById("hamburger-btn").className =
 | 
			
		||||
    "inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out";
 | 
			
		||||
  document.getElementById("close-hamburger-btn").className =
 | 
			
		||||
    "hidden lg:hidden inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out";
 | 
			
		||||
  if (displayedMenu !== "") {
 | 
			
		||||
    hideMenu(displayedMenu);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function toggleFilter() {
 | 
			
		||||
  var filterMenu = document.getElementById("filter-menu");
 | 
			
		||||
  if (filterMenu.className.includes("hidden")) {
 | 
			
		||||
    filterMenu.className = filterMenu.className.replace("hidden", " ");
 | 
			
		||||
  } else {
 | 
			
		||||
    filterMenu.className = filterMenu.className + " hidden";
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
window.onload = function () {
 | 
			
		||||
  let elements = document.getElementsByTagName("button");
 | 
			
		||||
  let buttons = [...elements];
 | 
			
		||||
 | 
			
		||||
  buttons.forEach((button) => {
 | 
			
		||||
    button.addEventListener("click", function () {
 | 
			
		||||
      handleClick(button);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  document.getElementById("filter-btn").addEventListener("click", toggleFilter);
 | 
			
		||||
  document
 | 
			
		||||
    .getElementById("mobile-learn-btn")
 | 
			
		||||
    .addEventListener("click", toggleMenu);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function openInNewTab(url) {
 | 
			
		||||
  window.open(url, "_blank").focus();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function readingTime() {
 | 
			
		||||
  let articles = document.querySelectorAll(".article");
 | 
			
		||||
  let times = document.querySelectorAll(".time");
 | 
			
		||||
  const wpm = 225;
 | 
			
		||||
  let words;
 | 
			
		||||
  for (var i = 0; i < articles.length; i++) {
 | 
			
		||||
    words = articles[i].innerText.trim().split(/\s+/).length;
 | 
			
		||||
    let time = Math.ceil(words / wpm);
 | 
			
		||||
    times[i].innerText = `${time} minute read`;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function getStats() {
 | 
			
		||||
  try {
 | 
			
		||||
    const stats = await fetch(
 | 
			
		||||
      "https://stats.grid.tf/api/stats-summary"
 | 
			
		||||
    ).then((res) => res.json());
 | 
			
		||||
    return formatStatsData(stats);
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    throw new Error(
 | 
			
		||||
      `Failed to retrieve data from network statistics: ${error}`
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function formatStatsData(stats) {
 | 
			
		||||
  let items = document.querySelector(".items");
 | 
			
		||||
  items.classList.remove("animate-pulse");
 | 
			
		||||
  document.getElementById("ssd").innerHTML = stats.ssd;
 | 
			
		||||
  document.getElementById("nodes").innerHTML = stats.nodes;
 | 
			
		||||
  document.getElementById("countries").innerHTML = stats.countries;
 | 
			
		||||
  document.getElementById("cores").innerHTML = stats.cores
 | 
			
		||||
    .toString()
 | 
			
		||||
    .replace(/\B(?=(\d{3})+(?!\d))/g, ",");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
readingTime();
 | 
			
		||||
getStats();
 | 
			
		||||
document.getElementById("year").innerHTML = new Date().getFullYear();
 | 
			
		||||
		Reference in New Issue
	
	Block a user