corso/website/src/assets/js/plugins.init.js
Niraj Tolia 5e0fe9561c
Corso website template + build framework (#723)
## Description

This PR imports a Tailwind-based website template and adds a
build hardness for it.

Please check the type of change your PR introduces:
- [x] 🌻 Feature

## Test Plan

- [x] 💪 Manual
2022-09-02 00:03:10 +00:00

1644 lines
51 KiB
JavaScript

/* Template Name: Techwind - Multipurpose Tailwind CSS Landing Page Template
Author: Shreethemes
Email: support@shreethemes.in
Website: https://shreethemes.in
Version: 1.4.0
Created: May 2022
File Description: Common JS file of the template(plugins.init.js)
*/
/*********************************/
/* INDEX */
/*================================
* 01. Tiny Slider *
* 02. Swiper slider *
* 03. Countdown Js * (For Comingsoon pages)
* 04. Maintenance js * (For Maintenance page)
* 05. Data Counter *
* 06. Datepicker js *
* 07. Gallery filter js * (For Portfolio pages)
* 08. Tobii lightbox * (For Portfolio pages)
* 09. CK Editor * (For Compose mail)
* 10. Fade Animation *
* 11. Typed Text animation (animation) *
* 12. Validation Form *
* 13. Switcher Pricing Plan*
* 14. Cookies Policy *
* 15. Back Button *
* 16. Particles *
* 17. Components *
* 1. Navtabs *
* 2. Modal *
* 3. Carousel *
* 4. Accordions *
================================*/
//=========================================//
/* 01) Tiny slider */
//=========================================//
if(document.getElementsByClassName('tiny-single-item').length > 0) {
var slider = tns({
container: '.tiny-single-item',
items: 1,
controls: false,
mouseDrag: true,
loop: true,
rewind: true,
autoplay: true,
autoplayButtonOutput: false,
autoplayTimeout: 3000,
navPosition: "bottom",
speed: 400,
gutter: 16,
});
};
if(document.getElementsByClassName('tiny-one-item').length > 0) {
var slider = tns({
container: '.tiny-one-item',
items: 1,
controls: true,
mouseDrag: true,
loop: true,
rewind: true,
autoplay: true,
autoplayButtonOutput: false,
autoplayTimeout: 3000,
navPosition: "bottom",
controlsText: ['<i class="mdi mdi-chevron-left "></i>', '<i class="mdi mdi-chevron-right"></i>'],
nav: false,
speed: 400,
gutter: 0,
});
};
if(document.getElementsByClassName('tiny-two-item').length > 0) {
var slider = tns({
container: '.tiny-two-item',
controls: true,
mouseDrag: true,
loop: true,
rewind: true,
autoplay: true,
autoplayButtonOutput: false,
autoplayTimeout: 3000,
navPosition: "bottom",
controlsText: ['<i class="mdi mdi-chevron-left "></i>', '<i class="mdi mdi-chevron-right"></i>'],
nav: false,
speed: 400,
gutter: 0,
responsive: {
768: {
items: 2
},
},
});
};
if(document.getElementsByClassName('tiny-three-item').length > 0) {
var slider = tns({
container: '.tiny-three-item',
controls: false,
mouseDrag: true,
loop: true,
rewind: true,
autoplay: true,
autoplayButtonOutput: false,
autoplayTimeout: 3000,
navPosition: "bottom",
speed: 400,
gutter: 12,
responsive: {
992: {
items: 3
},
767: {
items: 2
},
320: {
items: 1
},
},
});
};
if(document.getElementsByClassName('tiny-six-item').length > 0) {
var slider = tns({
container: '.tiny-six-item',
controls: true,
mouseDrag: true,
loop: true,
rewind: true,
autoplay: true,
autoplayButtonOutput: false,
autoplayTimeout: 3000,
navPosition: "bottom",
controlsText: ['<i class="mdi mdi-chevron-left "></i>', '<i class="mdi mdi-chevron-right"></i>'],
nav: false,
speed: 400,
gutter: 0,
responsive: {
1025: {
items: 6
},
992: {
items: 4
},
767: {
items: 3
},
320: {
items: 1
},
},
});
};
if(document.getElementsByClassName('tiny-twelve-item').length > 0) {
var slider = tns({
container: '.tiny-twelve-item',
controls: true,
mouseDrag: true,
loop: true,
rewind: true,
autoplay: true,
autoplayButtonOutput: false,
autoplayTimeout: 3000,
navPosition: "bottom",
controlsText: ['<i class="mdi mdi-chevron-left "></i>', '<i class="mdi mdi-chevron-right"></i>'],
nav: false,
speed: 400,
gutter: 0,
responsive: {
1025: {
items: 12
},
992: {
items: 8
},
767: {
items: 6
},
320: {
items: 2
},
},
});
};
if(document.getElementsByClassName('tiny-five-item').length > 0) {
var slider = tns({
container: '.tiny-five-item',
controls: true,
mouseDrag: true,
loop: true,
rewind: true,
autoplay: true,
autoplayButtonOutput: false,
autoplayTimeout: 3000,
navPosition: "bottom",
controlsText: ['<i class="mdi mdi-chevron-left "></i>', '<i class="mdi mdi-chevron-right"></i>'],
nav: false,
speed: 400,
gutter: 0,
responsive: {
1025: {
items: 5
},
992: {
items: 4
},
767: {
items: 3
},
425: {
items: 1
},
},
});
};
if(document.getElementsByClassName('tiny-home-slide-four').length > 0) {
var slider = tns({
container: '.tiny-home-slide-four',
controls: true,
mouseDrag: true,
loop: true,
rewind: true,
autoplay: true,
autoplayButtonOutput: false,
autoplayTimeout: 3000,
navPosition: "bottom",
controlsText: ['<i class="mdi mdi-chevron-left "></i>', '<i class="mdi mdi-chevron-right"></i>'],
nav: false,
speed: 400,
gutter: 0,
responsive: {
1025: {
items: 4
},
992: {
items: 3
},
767: {
items: 2
},
320: {
items: 1
},
},
});
};
//=========================================//
/* 02) Swiper slider */
//=========================================//
try {
var menu = [];
var interleaveOffset = 0.5;
var swiperOptions = {
loop: true,
speed: 1000,
parallax: true,
autoplay: {
delay: 6500,
disableOnInteraction: false,
},
watchSlidesProgress: true,
pagination: {
el: '.swiper-pagination',
clickable: true,
renderBullet: function (index, className) {
return '<span class="' + className + '">' + 0 + (index + 1) + '</span>';
},
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
on: {
progress: function () {
var swiper = this;
for (var i = 0; i < swiper.slides.length; i++) {
var slideProgress = swiper.slides[i].progress;
var innerOffset = swiper.width * interleaveOffset;
var innerTranslate = slideProgress * innerOffset;
swiper.slides[i].querySelector(".slide-inner").style.transform =
"translate3d(" + innerTranslate + "px, 0, 0)";
}
},
touchStart: function () {
var swiper = this;
for (var i = 0; i < swiper.slides.length; i++) {
swiper.slides[i].style.transition = "";
}
},
setTransition: function (speed) {
var swiper = this;
for (var i = 0; i < swiper.slides.length; i++) {
swiper.slides[i].style.transition = speed + "ms";
swiper.slides[i].querySelector(".slide-inner").style.transition =
speed + "ms";
}
}
}
};
// DATA BACKGROUND IMAGE
var swiper = new Swiper(".swiper-container", swiperOptions);
let data = document.querySelectorAll(".slide-bg-image")
data.forEach((e) => {
e.style.backgroundImage =
`url(${e.getAttribute('data-background')})`;
})
} catch (err) {
}
//=========================================//
/*/* 03) Countdown js */
//=========================================//
//=========================================//
/* 06) Countdown */
//=========================================//
try {
var setEndDate1 = "October 29, 2022 6:0:0";
var setEndDate2 = "Novenber 03, 2022 5:3:1";
var setEndDate3 = "Novenber 10, 2022 1:0:1";
var setEndDate4 = "Novenber 18, 2022 1:2:1";
var setEndDate5 = "December 01, 2022 1:6:6";
var setEndDate6 = "December 15, 2022 2:5:5";
var setEndDate7 = "January 08, 2023 5:1:4";
var setEndDate8 = "January 20, 2023 1:6:3";
var setEndDate9 = "February 30, 2023 1:5:2";
function startCountDownDate(dateVal) {
var countDownDate = new Date(dateVal).getTime();
return countDownDate;
}
function countDownTimer(start, targetDOM) {
// Get todays date and time
var now = new Date().getTime();
// Find the distance between now and the count down date
var distance = start - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// add 0 at the beginning if days, hours, minutes, seconds values are less than 10
days = (days < 10) ? "0" + days : days;
hours = (hours < 10) ? "0" + hours : hours;
minutes = (minutes < 10) ? "0" + minutes : minutes;
seconds = (seconds < 10) ? "0" + seconds : seconds;
// Output the result in an element with auction-item-x"
document.querySelector("#" + targetDOM).textContent = days + " : " + hours + " : " + minutes + " : " + seconds;
// If the count down is over, write some text
if (distance < 0) {
// clearInterval();
document.querySelector("#" + targetDOM).textContent = "00 : 00 : 00 : 00";
}
}
var cdd1 = startCountDownDate(setEndDate1);
var cdd2 = startCountDownDate(setEndDate2);
var cdd3 = startCountDownDate(setEndDate3);
var cdd4 = startCountDownDate(setEndDate4);
var cdd5 = startCountDownDate(setEndDate5);
var cdd6 = startCountDownDate(setEndDate6);
var cdd7 = startCountDownDate(setEndDate7);
var cdd8 = startCountDownDate(setEndDate8);
var cdd9 = startCountDownDate(setEndDate9);
if(document.getElementById("auction-item-1"))
setInterval(function(){ countDownTimer(cdd1, "auction-item-1"); }, 1000);
if(document.getElementById("auction-item-2"))
setInterval(function(){ countDownTimer(cdd2, "auction-item-2"); }, 1000);
if(document.getElementById("auction-item-3"))
setInterval(function(){ countDownTimer(cdd3, "auction-item-3"); }, 1000);
if(document.getElementById("auction-item-4"))
setInterval(function(){ countDownTimer(cdd4, "auction-item-4"); }, 1000);
if(document.getElementById("auction-item-5"))
setInterval(function(){ countDownTimer(cdd5, "auction-item-5"); }, 1000);
if(document.getElementById("auction-item-6"))
setInterval(function(){ countDownTimer(cdd6, "auction-item-6"); }, 1000);
if(document.getElementById("auction-item-7"))
setInterval(function(){ countDownTimer(cdd7, "auction-item-7"); }, 1000);
if(document.getElementById("auction-item-8"))
setInterval(function(){ countDownTimer(cdd8, "auction-item-8"); }, 1000);
if(document.getElementById("auction-item-9"))
setInterval(function(){ countDownTimer(cdd9, "auction-item-9"); }, 1000);
} catch (error) {
}
try {
if(document.getElementById("days")){
// The data/time we want to countdown to
var eventCountDown = new Date("December 25, 2022 16:37:52").getTime();
// Run myfunc every second
var myfunc = setInterval(function () {
var now = new Date().getTime();
var timeleft = eventCountDown - now;
// Calculating the days, hours, minutes and seconds left
var days = Math.floor(timeleft / (1000 * 60 * 60 * 24));
var hours = Math.floor((timeleft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((timeleft % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((timeleft % (1000 * 60)) / 1000);
// Result is output to the specific element
document.getElementById("days").innerHTML = days + "<p class='count-head'>Days</p> "
document.getElementById("hours").innerHTML = hours + "<p class='count-head'>Hours</p> "
document.getElementById("mins").innerHTML = minutes + "<p class='count-head'>Mins</p> "
document.getElementById("secs").innerHTML = seconds + "<p class='count-head'>Secs</p> "
// Display the message when countdown is over
if (timeleft < 0) {
clearInterval(myfunc);
document.getElementById("days").innerHTML = ""
document.getElementById("hours").innerHTML = ""
document.getElementById("mins").innerHTML = ""
document.getElementById("secs").innerHTML = ""
document.getElementById("end").innerHTML = "00:00:00:00";
}
}, 1000);
}
} catch (err) {
}
//=========================================//
/*/* 04) Maintenance js */
//=========================================//
try {
if(document.getElementById("maintenance")){
var seconds = 3599;
function secondPassed() {
var minutes = Math.round((seconds - 30) / 60);
var remainingSeconds = seconds % 60;
if (remainingSeconds < 10) {
remainingSeconds = "0" + remainingSeconds;
}
document.getElementById('maintenance').innerHTML = minutes + ":" + remainingSeconds;
if (seconds == 0) {
clearInterval(countdownTimer);
document.getElementById('maintenance').innerHTML = "Buzz Buzz";
} else {
seconds--;
}
}
var countdownTimer = setInterval('secondPassed()', 1000);
}
} catch (err) {
}
//=========================================//
/*/* 05) Data Counter */
//=========================================//
try {
const counter = document.querySelectorAll('.counter-value');
const speed = 2500; // The lower the slower
counter.forEach(counter_value => {
const updateCount = () => {
const target = +counter_value.getAttribute('data-target');
const count = +counter_value.innerText;
// Lower inc to slow and higher to slow
var inc = target / speed;
if (inc < 1) {
inc = 1;
}
// Check if target is reached
if (count < target) {
// Add inc to count and output in counter_value
counter_value.innerText = (count + inc).toFixed(0);
// Call function every ms
setTimeout(updateCount, 1);
} else {
counter_value.innerText = target;
}
};
updateCount();
});
} catch (err) {
}
//=========================================//
/*/* 06) Datepicker js*/
//=========================================//
try {
const start = datepicker('.start', { id: 1 })
const end = datepicker('.end', { id: 1 })
} catch (err) {
}
//=========================================//
/*/* 07) Gallery filter js */
//=========================================//
try {
var Shuffle = window.Shuffle;
class Demo {
constructor(element) {
if(element){
this.element = element;
this.shuffle = new Shuffle(element, {
itemSelector: '.picture-item',
sizer: element.querySelector('.my-sizer-element'),
});
// Log events.
this.addShuffleEventListeners();
this._activeFilters = [];
this.addFilterButtons();
}
}
/**
* Shuffle uses the CustomEvent constructor to dispatch events. You can listen
* for them like you normally would (with jQuery for example).
*/
addShuffleEventListeners() {
this.shuffle.on(Shuffle.EventType.LAYOUT, (data) => {
console.log('layout. data:', data);
});
this.shuffle.on(Shuffle.EventType.REMOVED, (data) => {
console.log('removed. data:', data);
});
}
addFilterButtons() {
const options = document.querySelector('.filter-options');
if (!options) {
return;
}
const filterButtons = Array.from(options.children);
const onClick = this._handleFilterClick.bind(this);
filterButtons.forEach((button) => {
button.addEventListener('click', onClick, false);
});
}
_handleFilterClick(evt) {
const btn = evt.currentTarget;
const isActive = btn.classList.contains('active');
const btnGroup = btn.getAttribute('data-group');
this._removeActiveClassFromChildren(btn.parentNode);
let filterGroup;
if (isActive) {
btn.classList.remove('active');
filterGroup = Shuffle.ALL_ITEMS;
} else {
btn.classList.add('active');
filterGroup = btnGroup;
}
this.shuffle.filter(filterGroup);
}
_removeActiveClassFromChildren(parent) {
const { children } = parent;
for (let i = children.length - 1; i >= 0; i--) {
children[i].classList.remove('active');
}
}
}
document.addEventListener('DOMContentLoaded', () => {
window.demo = new Demo(document.getElementById('grid'));
});
} catch (err) {
}
//=========================================//
/*/* 08) Tobii lightbox */
//=========================================//
try {
const tobii = new Tobii()
} catch (err) {
}
//=========================================//
/*/* 09) CK Editor */
//=========================================//
try {
ClassicEditor
.create(document.querySelector('#editor'))
.catch(error => {
console.error(error);
});
} catch(err) {
}
//=========================================//
/*/* 10) Fade Animation */
//=========================================//
try {
AOS.init({
easing: 'ease-in-out-sine',
duration: 1000
});
} catch (err) {
}
//=========================================//
/*/* 11) Typed Text animation (animation) */
//=========================================//
try {
var TxtType = function (el, toRotate, period) {
this.toRotate = toRotate;
this.el = el;
this.loopNum = 0;
this.period = parseInt(period, 10) || 2000;
this.txt = '';
this.tick();
this.isDeleting = false;
};
TxtType.prototype.tick = function () {
var i = this.loopNum % this.toRotate.length;
var fullTxt = this.toRotate[i];
if (this.isDeleting) {
this.txt = fullTxt.substring(0, this.txt.length - 1);
} else {
this.txt = fullTxt.substring(0, this.txt.length + 1);
}
this.el.innerHTML = '<span class="wrap">' + this.txt + '</span>';
var that = this;
var delta = 200 - Math.random() * 100;
if (this.isDeleting) { delta /= 2; }
if (!this.isDeleting && this.txt === fullTxt) {
delta = this.period;
this.isDeleting = true;
} else if (this.isDeleting && this.txt === '') {
this.isDeleting = false;
this.loopNum++;
delta = 500;
}
setTimeout(function () {
that.tick();
}, delta);
};
function typewrite() {
if (toRotate === 'undefined') {
changeText()
}
else
var elements = document.getElementsByClassName('typewrite');
for (var i = 0; i < elements.length; i++) {
var toRotate = elements[i].getAttribute('data-type');
var period = elements[i].getAttribute('data-period');
if (toRotate) {
new TxtType(elements[i], JSON.parse(toRotate), period);
}
}
// INJECT CSS
var css = document.createElement("style");
css.type = "text/css";
css.innerHTML = ".typewrite > .wrap { border-right: 0.08em solid transparent}";
document.body.appendChild(css);
};
window.onload(typewrite());
} catch(err) {
}
//=========================================//
/*/* 12) Validation Shop Checkouts */
//=========================================//
(function () {
'use strict'
if(document.getElementsByClassName('needs-validation').length > 0) {
// Fetch all the forms we want to apply custom Bootstrap validation styles to
var forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission
Array.prototype.slice.call(forms)
.forEach(function (form) {
form.addEventListener('submit', function (event) {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
}
})()
//=========================================//
/*/* 13) Switcher Pricing Plans */
//=========================================//
try {
var e = document.getElementById("filt-monthly"),
d = document.getElementById("filt-yearly"),
t = document.getElementById("switcher"),
m = document.getElementById("monthly"),
y = document.getElementById("yearly");
e.addEventListener("click", function(){
t.checked = false;
e.classList.add("toggler--is-active");
d.classList.remove("toggler--is-active");
m.classList.remove("hide");
y.classList.add("hide");
});
d.addEventListener("click", function(){
t.checked = true;
d.classList.add("toggler--is-active");
e.classList.remove("toggler--is-active");
m.classList.add("hide");
y.classList.remove("hide");
});
t.addEventListener("click", function(){
d.classList.toggle("toggler--is-active");
e.classList.toggle("toggler--is-active");
m.classList.toggle("hide");
y.classList.toggle("hide");
})
} catch(err) {
}
//=========================================//
/*/* 14) Cookies Policy */
//=========================================//
try {
/* common fuctions */
function el(selector) { return document.querySelector(selector) }
function els(selector) { return document.querySelectorAll(selector) }
function on(selector, event, action) { els(selector).forEach(e => e.addEventListener(event, action)) }
function cookie(name) {
let c = document.cookie.split('; ').find(cookie => cookie && cookie.startsWith(name+'='))
return c ? c.split('=')[1] : false;
}
/* popup button hanler */
on('.cookie-popup button', 'click', () => {
el('.cookie-popup').classList.add('cookie-popup-accepted');
document.cookie = `cookie-accepted=true`
});
/* popup init hanler */
if (cookie('cookie-accepted') !== "true") {
el('.cookie-popup').classList.add('cookie-popup-not-accepted');
}
} catch (error) {
}
//=========================================//
/*/* 15) Back Button */
//=========================================//
document.getElementsByClassName("back-button")[0]?.addEventListener("click", (e)=>{
if (document.referrer !== "") {
e.preventDefault();
window.location.href = document.referrer;
}
})
//=========================================//
/* 16) Particles */
//=========================================//
try {
particlesJS("particles-snow", {
"particles": {
"number": {
"value": 250,
"density": {
"enable": false,
"value_area": 800
}
},
"color": {
"value": "#ffffff"
},
"shape": {
"type": "circle",
"stroke": {
"width": 0,
"color": "#000000"
},
"polygon": {
"nb_sides": 36
},
"image": {
"src": "",
"width": 1000,
"height": 1000
}
},
"opacity": {
"value": 0.5,
"random": false,
"anim": {
"enable": false,
"speed": 0.5,
"opacity_min": 1,
"sync": false
}
},
"size": {
"value": 3.2,
"random": true,
"anim": {
"enable": false,
"speed": 20,
"size_min": 0.1,
"sync": false
}
},
"line_linked": {
"enable": false,
"distance": 100,
"color": "#ffffff",
"opacity": 0.4,
"width": 2
},
"move": {
"enable": true,
"speed": 1,
"direction": "bottom",
"random": false,
"straight": false,
"out_mode": "out",
"bounce": false,
"attract": {
"enable": false,
"rotateX": 800,
"rotateY": 1200
}
}
},
"interactivity": {
"detect_on": "canvas",
"events": {
"onhover": {
"enable": false,
"mode": "repulse"
},
"onclick": {
"enable": false,
"mode": "push"
},
"resize": true
},
"modes": {
"grab": {
"distance": 200,
"line_linked": {
"opacity": 1
}
},
"bubble": {
"distance": 400,
"size": 40,
"duration": 2,
"opacity": 8,
"speed": 3
},
"repulse": {
"distance": 71,
"duration": 0.4
},
"push": {
"particles_nb": 4
},
"remove": {
"particles_nb": 2
}
}
},
"retina_detect": true
});
} catch (error) {
}
//=========================================//
/* 11) Choice js */
//=========================================//
try {
var singleLocation = new Choices('#choices-location');
var singleCategorie = document.getElementById('choices-type');
if(singleCategorie){
var singleCategories = new Choices('#choices-type');
}
} catch (error) {
}
try {
var choicescatagory = new Choices('#choices-catagory');
var choicesmin = document.getElementById('choices-min-price');
var choicesmax = document.getElementById('choices-max-price');
if(choicesmin){
var choicesmins = new Choices('#choices-min-price');
}
if(choicesmax){
var choicesmaxs = new Choices('#choices-max-price');
}
} catch (error) {
}
//=========================================//
/* 17) Components */
//=========================================//
//============= 01) Navtabs ===============//
try {
const Default = {
defaultTabId: null,
activeClasses: 'text-white bg-indigo-600',
inactiveClasses: 'hover:text-indigo-600 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-slate-800',
onShow: () => { }
}
class Tabs {
constructor(items = [], options = {}) {
this._items = items
this._activeTab = options ? this.getTab(options.defaultTabId) : null
this._options = { ...Default, ...options }
this._init()
}
_init() {
if (this._items.length) {
// set the first tab as active if not set by explicitly
if (!this._activeTab) {
this._setActiveTab(this._items[0])
}
// force show the first default tab
this.show(this._activeTab.id, true)
// show tab content based on click
this._items.map(tab => {
tab.triggerEl.addEventListener('click', () => {
this.show(tab.id)
})
})
}
}
getActiveTab() {
return this._activeTab
}
_setActiveTab(tab) {
this._activeTab = tab
}
getTab(id) {
return this._items.filter(t => t.id === id)[0]
}
show(id, forceShow = false) {
const tab = this.getTab(id)
// don't do anything if already active
if (tab === this._activeTab && !forceShow) {
return
}
// hide other tabs
this._items.map(t => {
if (t !== tab) {
t.triggerEl.classList.remove(...this._options.activeClasses.split(" "));
t.triggerEl.classList.add(...this._options.inactiveClasses.split(" "));
t.targetEl.classList.add('hidden')
t.triggerEl.setAttribute('aria-selected', false)
}
})
// show active tab
tab.triggerEl.classList.add(...this._options.activeClasses.split(" "));
tab.triggerEl.classList.remove(...this._options.inactiveClasses.split(" "));
tab.triggerEl.setAttribute('aria-selected', true)
tab.targetEl.classList.remove('hidden')
this._setActiveTab(tab)
// callback function
this._options.onShow(this, tab)
}
}
window.Tabs = Tabs;
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('[data-tabs-toggle]').forEach(triggerEl => {
const tabElements = []
let defaultTabId = null
triggerEl.querySelectorAll('[role="tab"]').forEach(el => {
const isActive = el.getAttribute('aria-selected') === 'true'
const tab = {
id: el.getAttribute('data-tabs-target'),
triggerEl: el,
targetEl: document.querySelector(el.getAttribute('data-tabs-target'))
}
tabElements.push(tab)
if (isActive) {
defaultTabId = tab.id
}
})
new Tabs(tabElements, {
defaultTabId: defaultTabId
})
})
})
} catch (error) {
}
//********* 2) Modals ********//
try {
const Default = {
placement: 'center',
backdropClasses: 'bg-gray-900 bg-opacity-50 dark:bg-opacity-80 fixed inset-0 z-40',
onHide: () => {},
onShow: () => {},
onToggle: () => {}
}
class Modal {
constructor(targetEl = null, options = {}) {
this._targetEl = targetEl
this._options = { ...Default, ...options }
this._isHidden = true
this._init()
}
_init() {
this._getPlacementClasses().map(c => {
this._targetEl.classList.add(c)
})
}
_createBackdrop() {
if(this._isHidden) {
const backdropEl = document.createElement('div');
backdropEl.setAttribute('modal-backdrop', '');
backdropEl.classList.add(...this._options.backdropClasses.split(" "));
document.querySelector('body').append(backdropEl);
}
}
_destroyBackdropEl() {
if (!this._isHidden) {
document.querySelector('[modal-backdrop]').remove();
}
}
_getPlacementClasses() {
switch (this._options.placement) {
// top
case 'top-left':
return ['justify-start', 'items-start']
case 'top-center':
return ['justify-center', 'items-start']
case 'top-right':
return ['justify-end', 'items-start']
// center
case 'center-left':
return ['justify-start', 'items-center']
case 'center':
return ['justify-center', 'items-center']
case 'center-right':
return ['justify-end', 'items-center']
// bottom
case 'bottom-left':
return ['justify-start', 'items-end']
case 'bottom-center':
return ['justify-center', 'items-end']
case 'bottom-right':
return ['justify-end', 'items-end']
default:
return ['justify-center', 'items-center']
}
}
toggle() {
if (this._isHidden) {
this.show()
} else {
this.hide()
}
// callback function
this._options.onToggle(this)
}
show() {
this._targetEl.classList.add('flex')
this._targetEl.classList.remove('hidden')
this._targetEl.setAttribute('aria-modal', 'true')
this._targetEl.setAttribute('role', 'dialog')
this._targetEl.removeAttribute('aria-hidden')
this._createBackdrop()
this._isHidden = false
// callback function
this._options.onShow(this)
}
hide() {
this._targetEl.classList.add('hidden')
this._targetEl.classList.remove('flex')
this._targetEl.setAttribute('aria-hidden', 'true')
this._targetEl.removeAttribute('aria-modal')
this._targetEl.removeAttribute('role')
this._destroyBackdropEl()
this._isHidden = true
// callback function
this._options.onHide(this)
}
}
window.Modal = Modal;
const getModalInstance = (id, instances) => {
if (instances.some(modalInstance => modalInstance.id === id)) {
return instances.find(modalInstance => modalInstance.id === id)
}
return false
}
document.addEventListener('DOMContentLoaded', () => {
let modalInstances = []
document.querySelectorAll('[data-modal-toggle]').forEach(el => {
const modalId = el.getAttribute('data-modal-toggle');
const modalEl = document.getElementById(modalId);
const placement = modalEl.getAttribute('data-modal-placement')
if (modalEl) {
if (!modalEl.hasAttribute('aria-hidden') && !modalEl.hasAttribute('aria-modal')) {
modalEl.setAttribute('aria-hidden', 'true');
}
}
let modal = null
if (getModalInstance(modalId, modalInstances)) {
modal = getModalInstance(modalId, modalInstances)
modal = modal.object
} else {
modal = new Modal(modalEl, {
placement: placement ? placement : Default.placement
})
modalInstances.push({
id: modalId,
object: modal
})
}
el.addEventListener('click', () => {
modal.toggle()
})
})
})
} catch (error) {
}
//******** 3) Carousel********//
try {
const Default = {
defaultPosition: 0,
indicators: {
items: [],
activeClasses: 'bg-white dark:bg-gray-800',
inactiveClasses: 'bg-white/50 dark:bg-gray-800/50 hover:bg-white dark:hover:bg-gray-800'
},
interval: 6000,
onNext: () => { },
onPrev: () => { },
onChange: () => { }
}
class Carousel {
constructor(items = [], options = {}) {
this._items = items
this._options = { ...Default, ...options, indicators : { ...Default.indicators, ...options.indicators } }
this._activeItem = this.getItem(this._options.defaultPosition)
this._indicators = this._options.indicators.items
this._interval = null
this._init()
this.cycle()
}
/**
* Initialise carousel and items based on active one
*/
_init() {
this._items.map(item => {
item.el.classList.add('absolute', 'inset-0', 'transition-all', 'transform')
})
// if no active item is set then first position is default
if (this._getActiveItem()) {
this.slideTo(this._getActiveItem().position)
} else {
this.slideTo(0)
}
this._indicators.map((indicator, position) => {
indicator.el.addEventListener('click', () => {
this.slideTo(position)
})
})
}
getItem(position) {
return this._items[position]
}
/**
* Slide to the element based on id
* @param {*} position
*/
slideTo(position) {
const nextItem = this._items[position]
const rotationItems = {
'left': nextItem.position === 0 ? this._items[this._items.length - 1] : this._items[nextItem.position - 1],
'middle': nextItem,
'right': nextItem.position === this._items.length - 1 ? this._items[0] : this._items[nextItem.position + 1]
}
this._rotate(rotationItems)
this._setActiveItem(nextItem.position)
if (this._interval) {
this.pause()
this.cycle()
}
this._options.onChange(this)
}
/**
* Based on the currently active item it will go to the next position
*/
next() {
const activeItem = this._getActiveItem()
let nextItem = null
// check if last item
if (activeItem.position === this._items.length - 1) {
nextItem = this._items[0]
} else {
nextItem = this._items[activeItem.position + 1]
}
this.slideTo(nextItem.position)
// callback function
this._options.onNext(this)
}
/**
* Based on the currently active item it will go to the previous position
*/
prev() {
const activeItem = this._getActiveItem()
let prevItem = null
// check if first item
if (activeItem.position === 0) {
prevItem = this._items[this._items.length - 1]
} else {
prevItem = this._items[activeItem.position - 1]
}
this.slideTo(prevItem.position)
// callback function
this._options.onPrev(this)
}
/**
* This method applies the transform classes based on the left, middle, and right rotation carousel items
* @param {*} rotationItems
*/
_rotate(rotationItems) {
// reset
this._items.map(item => {
item.el.classList.add('hidden')
})
// left item (previously active)
rotationItems.left.el.classList.remove('-translate-x-full', 'translate-x-full', 'translate-x-0', 'hidden', 'z-20')
rotationItems.left.el.classList.add('-translate-x-full', 'z-10')
// currently active item
rotationItems.middle.el.classList.remove('-translate-x-full', 'translate-x-full', 'translate-x-0', 'hidden', 'z-10')
rotationItems.middle.el.classList.add('translate-x-0', 'z-20')
// right item (upcoming active)
rotationItems.right.el.classList.remove('-translate-x-full', 'translate-x-full', 'translate-x-0', 'hidden', 'z-20')
rotationItems.right.el.classList.add('translate-x-full', 'z-10')
}
/**
* Set an interval to cycle through the carousel items
*/
cycle() {
this._interval = setInterval(() => {
this.next();
}, this._options.interval)
}
/**
* Clears the cycling interval
*/
pause() {
clearInterval(this._interval);
}
/**
* Get the currently active item
*/
_getActiveItem() {
return this._activeItem
}
/**
* Set the currently active item and data attribute
* @param {*} position
*/
_setActiveItem(position) {
this._activeItem = this._items[position]
// update the indicators if available
if (this._indicators.length) {
this._indicators.map(indicator => {
indicator.el.setAttribute('aria-current', 'false')
indicator.el.classList.remove(...this._options.indicators.activeClasses.split(" "))
indicator.el.classList.add(...this._options.indicators.inactiveClasses.split(" "))
})
this._indicators[position].el.classList.add(...this._options.indicators.activeClasses.split(" "))
this._indicators[position].el.classList.remove(...this._options.indicators.inactiveClasses.split(" "))
this._indicators[position].el.setAttribute('aria-current', 'true')
}
}
}
window.Carousel = Carousel;
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('[data-carousel]').forEach(carouselEl => {
const interval = carouselEl.getAttribute('data-carousel-interval')
const slide = carouselEl.getAttribute('data-carousel') === 'slide' ? true : false
const items = []
let defaultPosition = 0
if (carouselEl.querySelectorAll('[data-carousel-item]').length) {
[...carouselEl.querySelectorAll('[data-carousel-item]')].map((carouselItemEl, position) => {
items.push({
position: position,
el: carouselItemEl
})
if (carouselItemEl.getAttribute('data-carousel-item') === 'active') {
defaultPosition = position
}
})
}
const indicators = [];
if (carouselEl.querySelectorAll('[data-carousel-slide-to]').length) {
[...carouselEl.querySelectorAll('[data-carousel-slide-to]')].map((indicatorEl) => {
indicators.push({
position: indicatorEl.getAttribute('data-carousel-slide-to'),
el: indicatorEl
})
})
}
const carousel = new Carousel(items, {
defaultPosition: defaultPosition,
indicators: {
items: indicators
},
interval: interval ? interval : Default.interval
})
if (slide) {
carousel.cycle();
}
// check for controls
const carouselNextEl = carouselEl.querySelector('[data-carousel-next]')
const carouselPrevEl = carouselEl.querySelector('[data-carousel-prev]')
if (carouselNextEl) {
carouselNextEl.addEventListener('click', () => {
carousel.next()
})
}
if (carouselPrevEl) {
carouselPrevEl.addEventListener('click', () => {
carousel.prev()
})
}
})
})
} catch (error) {
}
//********4) Accordions********/
try {
const Default = {
alwaysOpen: false,
activeClasses: 'bg-gray-50 dark:bg-slate-800 text-indigo-600',
inactiveClasses: 'text-dark dark:text-white',
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) {
}
//=========================================//
/* 18) Upload Profile */
//=========================================//
try {
var loadFile = function (event) {
var image = document.getElementById(event.target.name);
image.src = URL.createObjectURL(event.target.files[0]);
};
} catch (error) {
}