214 lines
5.7 KiB
JavaScript
214 lines
5.7 KiB
JavaScript
(function () {
|
|
"use strict";
|
|
|
|
/**
|
|
* Apply .scrolled class to the body as the page is scrolled down
|
|
*/
|
|
function toggleScrolled() {
|
|
const selectBody = document.querySelector("body");
|
|
const selectHeader = document.querySelector("#header");
|
|
if (
|
|
!selectHeader.classList.contains("scroll-up-sticky") &&
|
|
!selectHeader.classList.contains("sticky-top") &&
|
|
!selectHeader.classList.contains("fixed-top")
|
|
)
|
|
return;
|
|
window.scrollY > 100
|
|
? selectBody.classList.add("scrolled")
|
|
: selectBody.classList.remove("scrolled");
|
|
}
|
|
|
|
document.addEventListener("scroll", toggleScrolled);
|
|
window.addEventListener("load", toggleScrolled);
|
|
|
|
/**
|
|
* Mobile nav toggle
|
|
*/
|
|
const mobileNavToggleBtn = document.querySelector(".mobile-nav-toggle");
|
|
|
|
function mobileNavToogle() {
|
|
document.querySelector("body").classList.toggle("mobile-nav-active");
|
|
mobileNavToggleBtn.classList.toggle("bi-list");
|
|
mobileNavToggleBtn.classList.toggle("bi-x");
|
|
}
|
|
mobileNavToggleBtn.addEventListener("click", mobileNavToogle);
|
|
|
|
/**
|
|
* Hide mobile nav on same-page/hash links
|
|
*/
|
|
document.querySelectorAll("#navmenu a").forEach((navmenu) => {
|
|
navmenu.addEventListener("click", () => {
|
|
if (document.querySelector(".mobile-nav-active")) {
|
|
mobileNavToogle();
|
|
}
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Toggle mobile nav dropdowns
|
|
*/
|
|
document.querySelectorAll(".navmenu .toggle-dropdown").forEach((navmenu) => {
|
|
navmenu.addEventListener("click", function (e) {
|
|
e.preventDefault();
|
|
this.parentNode.classList.toggle("active");
|
|
this.parentNode.nextElementSibling.classList.toggle("dropdown-active");
|
|
e.stopImmediatePropagation();
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Preloader
|
|
*/
|
|
const preloader = document.querySelector("#preloader");
|
|
if (preloader) {
|
|
window.addEventListener("load", () => {
|
|
preloader.remove();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Scroll top button
|
|
*/
|
|
let scrollTop = document.querySelector(".scroll-top");
|
|
|
|
function toggleScrollTop() {
|
|
if (scrollTop) {
|
|
window.scrollY > 100
|
|
? scrollTop.classList.add("active")
|
|
: scrollTop.classList.remove("active");
|
|
}
|
|
}
|
|
scrollTop.addEventListener("click", (e) => {
|
|
e.preventDefault();
|
|
window.scrollTo({
|
|
top: 0,
|
|
behavior: "smooth",
|
|
});
|
|
});
|
|
|
|
window.addEventListener("load", toggleScrollTop);
|
|
document.addEventListener("scroll", toggleScrollTop);
|
|
|
|
/**
|
|
* Animation on scroll function and init
|
|
*/
|
|
function aosInit() {
|
|
AOS.init({
|
|
duration: 600,
|
|
easing: "ease-in-out",
|
|
once: true,
|
|
mirror: false,
|
|
});
|
|
}
|
|
window.addEventListener("load", aosInit);
|
|
|
|
/**
|
|
* Auto generate the carousel indicators
|
|
*/
|
|
document
|
|
.querySelectorAll(".carousel-indicators")
|
|
.forEach((carouselIndicator) => {
|
|
carouselIndicator
|
|
.closest(".carousel")
|
|
.querySelectorAll(".carousel-item")
|
|
.forEach((carouselItem, index) => {
|
|
if (index === 0) {
|
|
carouselIndicator.innerHTML += `<li data-bs-target="#${
|
|
carouselIndicator.closest(".carousel").id
|
|
}" data-bs-slide-to="${index}" class="active"></li>`;
|
|
} else {
|
|
carouselIndicator.innerHTML += `<li data-bs-target="#${
|
|
carouselIndicator.closest(".carousel").id
|
|
}" data-bs-slide-to="${index}"></li>`;
|
|
}
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Initiate glightbox
|
|
*/
|
|
const glightbox = GLightbox({
|
|
selector: ".glightbox",
|
|
});
|
|
|
|
/**
|
|
* Initiate Pure Counter
|
|
*/
|
|
new PureCounter();
|
|
|
|
/**
|
|
* Init swiper sliders
|
|
*/
|
|
function initSwiper() {
|
|
document.querySelectorAll(".init-swiper").forEach(function (swiperElement) {
|
|
let config = JSON.parse(
|
|
swiperElement.querySelector(".swiper-config").innerHTML.trim()
|
|
);
|
|
|
|
if (swiperElement.classList.contains("swiper-tab")) {
|
|
initSwiperWithCustomPagination(swiperElement, config);
|
|
} else {
|
|
new Swiper(swiperElement, config);
|
|
}
|
|
});
|
|
}
|
|
|
|
window.addEventListener("load", initSwiper);
|
|
|
|
/**
|
|
* Frequently Asked Questions Toggle
|
|
*/
|
|
document
|
|
.querySelectorAll(".faq-item h3, .faq-item .faq-toggle")
|
|
.forEach((faqItem) => {
|
|
faqItem.addEventListener("click", () => {
|
|
faqItem.parentNode.classList.toggle("faq-active");
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Correct scrolling position upon page load for URLs containing hash links.
|
|
*/
|
|
window.addEventListener("load", function (e) {
|
|
if (window.location.hash) {
|
|
if (document.querySelector(window.location.hash)) {
|
|
setTimeout(() => {
|
|
let section = document.querySelector(window.location.hash);
|
|
let scrollMarginTop = getComputedStyle(section).scrollMarginTop;
|
|
window.scrollTo({
|
|
top: section.offsetTop - parseInt(scrollMarginTop),
|
|
behavior: "smooth",
|
|
});
|
|
}, 100);
|
|
}
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Navmenu Scrollspy
|
|
*/
|
|
let navmenulinks = document.querySelectorAll(".navmenu a");
|
|
|
|
function navmenuScrollspy() {
|
|
navmenulinks.forEach((navmenulink) => {
|
|
if (!navmenulink.hash) return;
|
|
let section = document.querySelector(navmenulink.hash);
|
|
if (!section) return;
|
|
let position = window.scrollY + 200;
|
|
if (
|
|
position >= section.offsetTop &&
|
|
position <= section.offsetTop + section.offsetHeight
|
|
) {
|
|
document
|
|
.querySelectorAll(".navmenu a.active")
|
|
.forEach((link) => link.classList.remove("active"));
|
|
navmenulink.classList.add("active");
|
|
} else {
|
|
navmenulink.classList.remove("active");
|
|
}
|
|
});
|
|
}
|
|
window.addEventListener("load", navmenuScrollspy);
|
|
document.addEventListener("scroll", navmenuScrollspy);
|
|
})();
|