This commit is contained in:
toom1996
2025-07-11 14:47:56 +08:00
parent 9da2708d6d
commit 8b31aa1355
78 changed files with 4881 additions and 12 deletions

View File

@ -0,0 +1,259 @@
/* Template Name: Evea - Responsive App Landing Tailwind CSS Template
Author: Zoyothemes
Email: zoyothemes@gmail.com
Website: https://zoyothemes.com
Version: 1.0.0
Created: March 2024
File Description: Main JS file of the template
*/
/*********************************/
/* INDEX */
/*================================
* 01. Sticky Navbar *
* 02. Navbar active *
* 03. Back to top *
* 04. Accordions *
* 05. Lucide Icons *
================================*/
/*********************/
/* Sticky Navbar */
/*********************/
function windowScroll() {
const navbar = document.getElementById("navbar");
if (navbar) {
if (
document.body.scrollTop >= 50 ||
document.documentElement.scrollTop >= 50
) {
navbar.classList.add("is-sticky");
} else {
navbar.classList.remove("is-sticky");
}
}
}
window.addEventListener("scroll", (ev) => {
ev.preventDefault();
windowScroll();
});
/*********************/
/* Navbar Active */
/*********************/
try {
var spy = new Gumshoe("#navbar-navlist a", {
// Active classes
// navClass: 'active', // applied to the nav list item
// contentClass: 'active', // applied to the content
offset: 80,
});
} catch (error) {}
// Smooth scroll
try {
var scroll = new SmoothScroll("#navbar-navlist a", {
speed: 800,
offset: 80,
});
} catch (error) {}
/*********************/
/* Menu Collapse */
/*********************/
const toggleCollapse = (elementId, show = true) => {
const collapseEl = document.getElementById(elementId);
if (show) {
collapseEl.classList.remove("hidden");
} else {
collapseEl.classList.add("hidden");
}
};
document.addEventListener("DOMContentLoaded", () => {
// Toggle target elements using [data-collapse]
document
.querySelectorAll("[data-collapse]")
.forEach(function (collapseToggleEl) {
var collapseId = collapseToggleEl.getAttribute("data-collapse");
collapseToggleEl.addEventListener("click", function () {
toggleCollapse(
collapseId,
document.getElementById(collapseId).classList.contains("hidden")
);
});
});
});
window.toggleCollapse = toggleCollapse;
/*********************/
/* Back To Top */
/*********************/
var mybutton = document.getElementById("back-to-top");
window.onscroll = function () {
scrollFunction();
};
function scrollFunction() {
if(mybutton!=null){
if (document.body.scrollTop > 500 || document.documentElement.scrollTop > 500) {
mybutton.style.display = "inline-flex";
} else {
mybutton.style.display = "none";
}
}
}
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
/*********************/
/* Accordions */
/*********************/
try {
const Default = {
alwaysOpen: false,
activeClasses: 'bg-white text-black rounded-xl',
inactiveClasses: 'text-dark',
onOpen: () => { },
onClose: () => { },
onToggle: () => { }
}
class Accordion {
constructor(items = [], options = {}) {
this._items = items
this._options = { ...Default, ...options }
this._init()
}
_init() {
if (this._items.length) {
// show accordion item based on click
this._items.map(item => {
if (item.active) {
this.open(item.id)
}
item.triggerEl.addEventListener('click', () => {
this.toggle(item.id)
})
})
}
}
getItem(id) {
return this._items.filter(item => item.id === id)[0]
}
open(id) {
const item = this.getItem(id)
// don't hide other accordions if always open
if (!this._options.alwaysOpen) {
this._items.map(i => {
if (i !== item) {
i.triggerEl.classList.remove(...this._options.activeClasses.split(" "))
i.triggerEl.classList.add(...this._options.inactiveClasses.split(" "))
i.targetEl.classList.add('hidden')
i.triggerEl.setAttribute('aria-expanded', false)
i.active = false
// rotate icon if set
if (i.iconEl) {
i.iconEl.classList.remove('rotate-180')
}
}
})
}
// show active item
item.triggerEl.classList.add(...this._options.activeClasses.split(" "))
item.triggerEl.classList.remove(...this._options.inactiveClasses.split(" "))
item.triggerEl.setAttribute('aria-expanded', true)
item.targetEl.classList.remove('hidden')
item.active = true
// rotate icon if set
if (item.iconEl) {
item.iconEl.classList.add('rotate-180')
}
// callback function
this._options.onOpen(this, item)
}
toggle(id) {
const item = this.getItem(id)
if (item.active) {
this.close(id)
} else {
this.open(id)
}
// callback function
this._options.onToggle(this, item)
}
close(id) {
const item = this.getItem(id)
item.triggerEl.classList.remove(...this._options.activeClasses.split(" "))
item.triggerEl.classList.add(...this._options.inactiveClasses.split(" "))
item.targetEl.classList.add('hidden')
item.triggerEl.setAttribute('aria-expanded', false)
item.active = false
// rotate icon if set
if (item.iconEl) {
item.iconEl.classList.remove('rotate-180')
}
// callback function
this._options.onClose(this, item)
}
}
window.Accordion = Accordion;
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('[data-accordion]').forEach(accordionEl => {
const alwaysOpen = accordionEl.getAttribute('data-accordion')
const activeClasses = accordionEl.getAttribute('data-active-classes')
const inactiveClasses = accordionEl.getAttribute('data-inactive-classes')
const items = []
accordionEl.querySelectorAll('[data-accordion-target]').forEach(el => {
const item = {
id: el.getAttribute('data-accordion-target'),
triggerEl: el,
targetEl: document.querySelector(el.getAttribute('data-accordion-target')),
iconEl: el.querySelector('[data-accordion-icon]'),
active: el.getAttribute('aria-expanded') === 'true' ? true : false
}
items.push(item)
})
new Accordion(items, {
alwaysOpen: alwaysOpen === 'open' ? true : false,
activeClasses: activeClasses ? activeClasses : Default.activeClasses,
inactiveClasses: inactiveClasses ? inactiveClasses : Default.inactiveClasses
})
})
})
} catch (error) { }
/*********************/
/* Lucide Icons */
/*********************/
lucide.createIcons();

View File

@ -0,0 +1,28 @@
var swiper = new Swiper('.testi-swiper', {
// slidesPerView: 5,
centeredSlides: true,
spaceBetween: 24,
loop: true,
autoplay: {
delay: 3000,
disableOnInteraction: false,
},
navigation: {
nextEl: ".testi-button-next",
prevEl: ".testi-button-prev",
},
breakpoints: {
0: {
slidesPerView: 1,
},
768: {
slidesPerView: 2,
},
991: {
slidesPerView: 2.5,
},
1024: {
slidesPerView: 3,
},
}
});