"use strict";
/* ---------------------
[Master JavaScript]
Template Name: Softora - IT Solutions & Technology HTML Template
Version: 1.0.0
Author: Nano Theme
--------------------- */
/* ---------------------
[Table of Contents]
1. Core Features
1.1.0 Sticky Header (sticky-header)
1.2.0 Mobile Dropdown Menu (mobile-menu)
1.3.0 Anchor Prevent Default (anchor-prevent)
1.4.0 Search Form (search-form)
2. Sliders & Carousels
2.1.0 Service Swiper Slide (service-slide)
2.2.0 Service Swiper Slide Two (service-slide-two)
2.3.0 Project Swiper Slide (portfolio-swiper)
2.4.0 Project Two Swiper Slide (portfolio-two-swiper)
2.5.0 Testimonial Swiper Slide (testimonial-swiper)
2.6.0 Testimonial Swiper Slide Two (testimonial-swiper-two)
2.7.0 Testimonial Swiper Slide Three (testimonial-swiper-three)
2.8.0 Team Swiper Slide (team-swiper)
3. UI Enhancements
3.1.0 Counter Up (counter-up)
3.2.0 Scroll to Top (scroll-top)
3.3.0 Video Popup
3.4.0 Isotope
3.5.0 Rotating Image
3.6.0 Progress Bar
3.7.0 Pricing Plan Switching
3.8.0 Copyright Year
3.9.0 WOW Activation
3.10.0 Tooltip Activation
3.11.0 Toast Activation
3.12.0 Popover Activation
3.13.0 Preloader
--------------------- */
// 1.1 Sticky Header
const navarToggler = document.querySelector('.navbar-toggler');
const header = document.querySelector('.header-area');
if (navarToggler) {
navarToggler.addEventListener('click', () => {
header.classList.toggle('mobile-menu-open');
});
}
/*
if (header) {
function stickyNavigation() {
if (window.pageYOffset > 10) {
header.classList.add('sticky-on');
} else {
header.classList.remove('sticky-on');
}
}
window.addEventListener('load', stickyNavigation);
window.addEventListener('scroll', stickyNavigation);
}
*/
// 1.2 Mobile Dropdown Menu
/*
function mobileDropdownMenu() {
const sbdropdown = document.querySelectorAll('.softora-dd');
if (sbdropdown.length > 0) {
const navUrl = document.querySelectorAll('.navbar-nav li ul');
navUrl.forEach(url => {
url.insertAdjacentHTML('beforebegin', '
');
});
const ddtrogglers = document.querySelectorAll('.dropdown-toggler');
ddtrogglers.forEach(ddtoggler => {
ddtoggler.addEventListener('click', () => {
const ddNext = ddtoggler.nextElementSibling;
slideToggle(ddNext, 300);
});
});
}
}
window.addEventListener('load', mobileDropdownMenu);
*/
// 1.3 Anchor Prevent Default
const anchors = document.querySelectorAll('a[href="#"]');
anchors.forEach(anchor => {
anchor.addEventListener('click', e => e.preventDefault());
});
// 1.4 Search Form
const searchButton = document.getElementById('searchButton');
const searchClose = document.getElementById('searchClose');
const searchFormPopup = document.querySelector('.search-form-popup');
const searchOverlay = document.getElementById('searchOverlay');
if (searchButton) {
searchButton.addEventListener('click', () => {
searchFormPopup.classList.add('open');
searchOverlay.classList.add('open');
});
searchClose.addEventListener('click', () => {
searchFormPopup.classList.remove('open');
searchOverlay.classList.remove('open');
});
}
// 2.1.0 Service Swiper Slide
const serviceSwiper = document.querySelector('.service-swiper-slider');
if (serviceSwiper) {
// Check if Swiper is defined
if (typeof Swiper !== 'undefined') {
new Swiper('.service-swiper-slider', {
loop: true,
slidesPerView: 3,
spaceBetween: 30,
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
pagination: {
el: ".service-pagination",
clickable: true,
},
breakpoints: {
320: {
slidesPerView: 1,
spaceBetween: 0,
},
768: {
slidesPerView: 2,
spaceBetween: 20,
},
1200: {
slidesPerView: 3,
spaceBetween: 30,
},
},
});
}
}
// 2.2.0 Service Swiper Slide Two
const serviceSwiperTwo = document.querySelector('.service-swiper-slider-two');
if (serviceSwiperTwo) {
if (typeof Swiper !== 'undefined') {
new Swiper('.service-swiper-slider-two', {
loop: true,
slidesPerView: 6,
spaceBetween: 30,
centeredSlides: true,
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
pagination: {
el: ".service-pagination-two",
clickable: true,
},
breakpoints: {
320: {
slidesPerView: 1,
spaceBetween: 10,
},
480: {
slidesPerView: 1.5,
spaceBetween: 20,
},
576: {
slidesPerView: 2,
spaceBetween: 20,
},
768: {
slidesPerView: 2.5,
spaceBetween: 20,
},
992: {
slidesPerView: 3,
spaceBetween: 20,
},
1200: {
slidesPerView: 4,
spaceBetween: 30,
},
1400: {
slidesPerView: 5,
spaceBetween: 30,
},
1800: {
slidesPerView: 6,
spaceBetween: 30,
},
},
});
}
}
// 2.3.0 Project Swiper Slide
const projectSwiper = document.querySelector('.project-swiper');
if (projectSwiper) {
if (typeof Swiper !== 'undefined') {
new Swiper('.project-swiper', {
loop: true,
slidesPerView: 4,
spaceBetween: 30,
navigation: {
nextEl: '.project-button-next',
prevEl: '.project-button-prev',
},
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
breakpoints: {
320: {
slidesPerView: 1,
spaceBetween: 10,
},
480: {
slidesPerView: 1,
spaceBetween: 20,
},
576: {
slidesPerView: 2,
spaceBetween: 20,
},
768: {
slidesPerView: 3,
spaceBetween: 20,
},
1200: {
slidesPerView: 4,
spaceBetween: 30,
},
},
});
}
}
// 2.4.0 Project Two Swiper Slide
const swiperInstances = [];
const projectTwoSwipers = document.querySelectorAll('.project-two-swiper');
if (projectTwoSwipers.length > 0) {
if (typeof Swiper !== 'undefined') {
projectTwoSwipers.forEach((swiperEl, index) => {
const projectSwiper = new Swiper(swiperEl, {
loop: true,
slidesPerView: 'auto',
spaceBetween: 30,
pagination: {
el: swiperEl.querySelector('.project-two-pagination'),
clickable: true,
},
grabCursor: true,
watchSlidesProgress: true,
});
swiperInstances.push(projectSwiper);
swiperEl.querySelectorAll('.project-two-card').forEach(slide => {
slide.addEventListener('click', () => {
swiperEl.querySelectorAll('.project-two-card').forEach(s => {
s.classList.remove('slide-expand');
});
slide.classList.add('slide-expand');
});
});
});
}
}
const tabSwipers = document.querySelectorAll('[data-bs-toggle="tab"]');
if (tabSwipers.length > 0) {
tabSwipers.forEach(tabBtn => {
tabBtn.addEventListener('shown.bs.tab', (e) => {
const targetTab = document.querySelector(e.target.getAttribute('data-bs-target'));
const targetSwiperEl = targetTab.querySelector('.project-two-swiper');
if (targetSwiperEl) {
const swiperIndex = Array.from(document.querySelectorAll('.project-two-swiper')).indexOf(targetSwiperEl);
const projectSwiper = swiperInstances[swiperIndex];
setTimeout(() => {
projectSwiper.update();
}, 100);
}
});
});
}
// 2.5.0 Testimonial Swiper Slide
const testimonialSwiper = document.querySelector('.testimonial-swiper');
if (testimonialSwiper) {
if (typeof Swiper !== 'undefined') {
new Swiper('.testimonial-swiper', {
loop: true,
spaceBetween: 0,
slidesPerView: 1,
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
pagination: {
el: ".testimonial-pagination",
clickable: true,
},
navigation: {
nextEl: '.testimonial-button-next',
prevEl: '.testimonial-button-prev',
},
});
}
}
// 2.6.0 Testimonial Swiper Slide Two
const testimonialSwiperTwo = document.querySelector('.testimonial-swiper-two');
if (testimonialSwiperTwo) {
if (typeof Swiper !== 'undefined') {
new Swiper('.testimonial-swiper-two', {
loop: true,
spaceBetween: 30,
slidesPerView: 3,
centeredSlides: true,
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
pagination: {
el: ".testimonial-swiper-two-pagination",
clickable: true,
},
breakpoints: {
320: {
slidesPerView: 1,
spaceBetween: 10,
},
480: {
slidesPerView: 1,
spaceBetween: 20,
},
768: {
slidesPerView: 2,
spaceBetween: 20,
},
1200: {
slidesPerView: 3,
spaceBetween: 30,
},
},
});
}
}
// 2.7.0 Team Swiper Slide
const teamSwiper = document.querySelector('.team-swiper');
if (teamSwiper) {
if (typeof Swiper !== 'undefined') {
new Swiper('.team-swiper', {
loop: true,
spaceBetween: 30,
slidesPerView: 4,
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
navigation: {
nextEl: '.team-button-next',
prevEl: '.team-button-prev',
},
breakpoints: {
320: {
slidesPerView: 1.5,
spaceBetween: 10,
},
480: {
slidesPerView: 2,
spaceBetween: 20,
},
576: {
slidesPerView: 2.5,
spaceBetween: 20,
},
768: {
slidesPerView: 3,
spaceBetween: 20,
},
992: {
slidesPerView: 4,
spaceBetween: 20,
}
},
});
}
}
// 3.1.0 Counter Up
const counterElements = document.querySelectorAll('.counter');
if (counterElements.length > 0) {
if (window.counterUp) {
const counterUp = window.counterUp.default;
const callback = (entries) => {
entries.forEach(entry => {
const counterElement = entry.target;
if (entry.isIntersecting && !counterElement.classList.contains('is-visible')) {
counterUp(counterElement, {
duration: 2000,
delay: 20
});
counterElement.classList.add('is-visible');
}
});
};
const IO = new IntersectionObserver(callback, {
threshold: 1
});
counterElements.forEach(element => IO.observe(element));
}
}
// 3.2.0 Scroll to Top
const scrollButton = document.getElementById('scrollTopButton');
const topDistance = 600;
if (scrollButton) {
window.addEventListener('scroll', () => {
if (document.body.scrollTop > topDistance || document.documentElement.scrollTop > topDistance) {
scrollButton.classList.add('scrolltop-show');
scrollButton.classList.remove('scrolltop-hide');
} else {
scrollButton.classList.add('scrolltop-hide');
scrollButton.classList.remove('scrolltop-show');
}
});
scrollButton.addEventListener('click', () => {
window.scrollTo({
top: 0,
left: 0,
behavior: 'smooth'
});
});
function updateScrollProgress() {
const scrollY = window.scrollY;
const windowHeight = window.innerHeight;
const documentHeight = document.documentElement.scrollHeight;
const scrollPercent = (scrollY / (documentHeight - windowHeight)) * 100;
scrollButton.style.setProperty('--scroll-progress', `${scrollPercent}%`);
}
window.addEventListener('scroll', updateScrollProgress);
}
// 3.3.0 Video Popup
const videoPopup = document.getElementById("videoPopup");
const videoFrame = document.getElementById("videoFrame");
const closeBtn = document.getElementById("videoCloseButton");
const videoBtns = document.querySelectorAll(".video-btn");
if (closeBtn && videoBtns.length > 0) {
videoBtns.forEach(button => {
button.addEventListener("click", function () {
let videoUrl = this.getAttribute("data-video");
if (videoUrl) {
let separator = videoUrl.includes("?") ? "&" : "?";
if (videoUrl.includes("youtu.be")) {
let videoId = videoUrl.split("/").pop();
videoUrl = `https://www.youtube.com/embed/${videoId}`;
}
if (videoUrl.includes("youtube.com/watch")) {
let videoId = new URL(videoUrl).searchParams.get("v");
videoUrl = `https://www.youtube.com/embed/${videoId}`;
}
if (videoUrl.includes("youtube.com") || videoUrl.includes("vimeo.com")) {
videoUrl += `${separator}autoplay=1`;
}
videoFrame.src = videoUrl;
videoFrame.setAttribute("allow", "autoplay; encrypted-media");
videoPopup.style.display = "flex";
}
});
});
closeBtn.addEventListener("click", () => {
videoPopup.style.display = "none";
videoFrame.src = "";
});
window.addEventListener("click", (event) => {
if (event.target === videoPopup) {
videoPopup.style.display = "none";
videoFrame.src = "";
}
});
}
// 3.4.0 Isotope
const grids = document.querySelectorAll('.softora-filter');
if (grids.length > 0) {
if (typeof Isotope !== 'undefined' && typeof imagesLoaded !== 'undefined') {
grids.forEach(grid => {
imagesLoaded(grid, () => {
const iso = new Isotope(grid, {
itemSelector: '.filter-item',
percentPosition: true,
layoutMode: 'masonry',
masonry: {
columnWidth: '.filter-item'
}
});
const filtersElem = grid.closest('.softora-container').querySelector('.softora-filter-nav');
if (filtersElem) {
filtersElem.addEventListener('click', (event) => {
if (!event.target.matches('button')) return;
const filterValue = event.target.getAttribute('data-filter');
iso.arrange({
filter: filterValue
});
});
const radioButtonGroup = (buttonGroup) => {
buttonGroup.addEventListener('click', (event) => {
if (!event.target.matches('button')) return;
buttonGroup.querySelector('.active').classList.remove('active');
event.target.classList.add('active');
});
};
radioButtonGroup(filtersElem);
}
});
});
}
}
// 3.5.0 Rotating Image
const rotatingImages = document.querySelectorAll('.rotatingImage');
if (rotatingImages.length > 0) {
window.addEventListener('scroll', () => {
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
const rotateValue = scrollTop % 360;
rotatingImages.forEach(image => {
image.style.transform = `rotate(${rotateValue}deg)`;
});
});
}
// 3.6.0 Progress Bar
const progressBars = document.querySelectorAll('.progress-bar');
if (progressBars.length > 0) {
progressBars.forEach(function (progressBar) {
const value = parseInt(progressBar.getAttribute('data-value'), 10); // Added radix
progressBar.style.width = value + '%';
const spanElements = progressBar.closest('.progress-item').querySelectorAll('.progress-info span');
if (spanElements.length > 1) {
const percentSpan = spanElements[1];
percentSpan.textContent = value + '%';
percentSpan.style.marginRight = (100 - value) + '%';
}
});
}
// 3.7.0 Pricing Plan Switching
const switchButtons = document.querySelectorAll(".pricing-plan-switching .btn");
const priceCards = document.querySelectorAll(".price-table-one");
if (switchButtons.length > 0 && priceCards.length > 0) {
switchButtons.forEach(btn => {
btn.addEventListener("click", () => {
switchButtons.forEach(b => b.classList.remove("active"));
btn.classList.add("active");
const isYearly = btn.textContent.trim().toLowerCase() === "yearly";
priceCards.forEach(card => {
const priceDisplay = card.querySelector(".price-display");
const priceAmountEl = card.querySelector(".price-amount");
const priceTypeEl = card.querySelector(".price-type");
priceDisplay.classList.add("fade-out");
setTimeout(() => {
const newPrice = isYearly ? card.dataset.yearly : card.dataset.monthly;
const newLabel = isYearly ? "/Year" : "/Month";
priceAmountEl.textContent = `$${newPrice}`;
priceTypeEl.textContent = newLabel;
priceDisplay.classList.remove("fade-out");
priceDisplay.classList.add("fade-in");
setTimeout(() => {
priceDisplay.classList.remove("fade-in");
}, 400);
}, 300);
});
});
});
}
// 3.8.0 Copyright Year
const year = document.getElementById("year");
if (year) {
const currentYear = new Date().getFullYear();
year.textContent = currentYear;
}
// 3.9.0 WOW Activation
const wowjs = document.querySelectorAll('.wow').length;
if (wowjs > 0) {
if (typeof WOW !== 'undefined') {
new WOW().init();
}
}
// 3.10 Tooltip Activation
if (typeof bootstrap !== 'undefined') {
let softoraTooltip = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
let tooltipList = softoraTooltip.map(function (sbTooltip) {
return new bootstrap.Tooltip(sbTooltip);
});
// 3.11 Toast Activation
let softoraToast = [].slice.call(document.querySelectorAll('.toast'));
let toastList = softoraToast.map(function (sbToast) {
return new bootstrap.Toast(sbToast);
});
toastList.forEach(toast => toast.show());
// 3.12 Popover Activation
let softoraPopover = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'))
let popoverList = softoraPopover.map(function (sbPopover) {
return new bootstrap.Popover(sbPopover);
});
}
// 3.13 Preloader
const preloader = document.getElementById('preloader');
if (preloader) {
window.addEventListener('load', function () {
let fadeOut = setInterval(function () {
if (!preloader.style.opacity) {
preloader.style.opacity = 1;
}
if (preloader.style.opacity > 0) {
preloader.style.opacity -= 0.1;
} else {
clearInterval(fadeOut);
preloader.remove();
}
}, 100);
});
}