1317 lines
36 KiB
JavaScript
1317 lines
36 KiB
JavaScript
if( typeof jQuery !== 'undefined' ) {
|
|
var $ = jQuery.noConflict();
|
|
}
|
|
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
typeof define === 'function' && define.amd ? define(factory) :
|
|
( global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SEMICOLON = factory() );
|
|
} (this, (function() {
|
|
|
|
// USE STRICT
|
|
"use strict";
|
|
|
|
var options = {
|
|
pageTransition: false,
|
|
cursor: false,
|
|
tips: false,
|
|
headerSticky: true,
|
|
headerMobileSticky: false,
|
|
menuBreakpoint: 992,
|
|
pageMenuBreakpoint: 992,
|
|
gmapAPI: '',
|
|
scrollOffset: 60,
|
|
scrollExternalLinks: true,
|
|
smoothScroll: false,
|
|
jsFolder: 'js/',
|
|
cssFolder: 'css/',
|
|
};
|
|
|
|
if( typeof cnvsOptions !== 'undefined' ) {
|
|
options = Object.assign({}, options, cnvsOptions);
|
|
}
|
|
|
|
var vars = {
|
|
baseEl: document,
|
|
elRoot: document.documentElement,
|
|
elHead: document.head,
|
|
elBody: document.body,
|
|
viewport: {
|
|
width: 0,
|
|
height: 0,
|
|
},
|
|
hash: window.location.hash,
|
|
topScrollOffset: 0,
|
|
elWrapper: document.getElementById('wrapper'),
|
|
elHeader: document.getElementById('header'),
|
|
headerClasses: '',
|
|
elHeaderWrap: document.getElementById('header-wrap'),
|
|
headerWrapClasses: '',
|
|
headerHeight: 0,
|
|
headerOffset: 0,
|
|
headerWrapHeight: 0,
|
|
headerWrapOffset: 0,
|
|
elPrimaryMenus: document.querySelectorAll('.primary-menu'),
|
|
elPrimaryMenuTriggers: document.querySelectorAll('.primary-menu-trigger'),
|
|
elPageMenu: document.getElementById('page-menu'),
|
|
pageMenuOffset: 0,
|
|
elSlider: document.getElementById('slider'),
|
|
elFooter: document.getElementById('footer'),
|
|
elAppMenu: document.querySelector('.app-menu'),
|
|
portfolioAjax: {},
|
|
sliderParallax: {
|
|
el: document.querySelector('.slider-parallax'),
|
|
caption: document.querySelector('.slider-parallax .slider-caption'),
|
|
inner: document.querySelector('.slider-inner'),
|
|
offset: 0,
|
|
},
|
|
get menuBreakpoint() {
|
|
return this.elBody.getAttribute('data-menu-breakpoint') || options.menuBreakpoint;
|
|
},
|
|
get pageMenuBreakpoint() {
|
|
return this.elBody.getAttribute('data-pagemenu-breakpoint') || options.pageMenuBreakpoint;
|
|
},
|
|
get customCursor() {
|
|
var value = this.elBody.getAttribute('data-custom-cursor') || options.cursor;
|
|
return value == 'true' || value === true ? true : false;
|
|
},
|
|
get pageTransition() {
|
|
var value = this.elBody.classList.contains('page-transition') || options.pageTransition;
|
|
return value == 'true' || value === true ? true : false;
|
|
},
|
|
get tips() {
|
|
var value = this.elBody.getAttribute('data-tips') || options.tips;
|
|
return value == 'true' || value === true ? true : false;
|
|
},
|
|
get smoothScroll() {
|
|
var value = this.elBody.getAttribute('data-smooth-scroll') || options.smoothScroll;
|
|
return value == 'true' || value === true ? true : false;
|
|
},
|
|
get isRTL() {
|
|
return this.elRoot.getAttribute('dir') == 'rtl' ? true : false;
|
|
},
|
|
scrollPos: {
|
|
x: 0,
|
|
y: 0,
|
|
},
|
|
$jq: typeof jQuery !== "undefined" ? jQuery.noConflict() : '',
|
|
resizers: {},
|
|
recalls: {},
|
|
debounced: false,
|
|
events: {},
|
|
modules: {},
|
|
fn: {},
|
|
required: {
|
|
jQuery: {
|
|
plugin: 'jquery',
|
|
fn: function(){
|
|
return typeof jQuery !== 'undefined';
|
|
},
|
|
file: options.jsFolder+'jquery.js',
|
|
id: 'canvas-jquery',
|
|
}
|
|
},
|
|
fnInit: function() {
|
|
DocumentOnReady.init();
|
|
DocumentOnLoad.init();
|
|
DocumentOnResize.init();
|
|
}
|
|
};
|
|
|
|
var Core = function() {
|
|
return {
|
|
getOptions: options,
|
|
getVars: vars,
|
|
|
|
run: function(obj) {
|
|
Object.values(obj).map( function(fn) {
|
|
return typeof fn === 'function' && fn.call();
|
|
});
|
|
},
|
|
|
|
runBase: function() {
|
|
Core.run(Base);
|
|
},
|
|
|
|
runModules: function() {
|
|
Core.run(Modules);
|
|
},
|
|
|
|
runContainerModules: function(parent) {
|
|
if( typeof parent === 'undefined' ) {
|
|
return false;
|
|
}
|
|
|
|
Core.getVars.baseEl = parent;
|
|
Core.runModules();
|
|
Core.getVars.baseEl = document;
|
|
},
|
|
|
|
breakpoints: function() {
|
|
var viewWidth = Core.viewport().width;
|
|
|
|
var breakpoint = {
|
|
xxl: {
|
|
enter: 1400,
|
|
exit: 99999
|
|
},
|
|
xl: {
|
|
enter: 1200,
|
|
exit: 1399
|
|
},
|
|
lg: {
|
|
enter: 992,
|
|
exit: 1199.98
|
|
},
|
|
md: {
|
|
enter: 768,
|
|
exit: 991.98
|
|
},
|
|
sm: {
|
|
enter: 576,
|
|
exit: 767.98
|
|
},
|
|
xs: {
|
|
enter: 0,
|
|
exit: 575.98
|
|
}
|
|
};
|
|
|
|
var previous = '';
|
|
|
|
Object.keys( breakpoint ).forEach( function(key) {
|
|
if ( (viewWidth > breakpoint[key].enter) && (viewWidth <= breakpoint[key].exit) ) {
|
|
vars.elBody.classList.add( 'device-'+key );
|
|
} else {
|
|
vars.elBody.classList.remove( 'device-'+key );
|
|
if( previous != '' ) {
|
|
vars.elBody.classList.remove( 'device-down-'+previous );
|
|
}
|
|
}
|
|
|
|
if ( viewWidth <= breakpoint[key].exit ) {
|
|
if( previous != '' ) {
|
|
vars.elBody.classList.add( 'device-down-'+previous );
|
|
}
|
|
}
|
|
|
|
previous = key;
|
|
|
|
if ( viewWidth > breakpoint[key].enter ) {
|
|
vars.elBody.classList.add( 'device-up-'+key );
|
|
return;
|
|
} else {
|
|
vars.elBody.classList.remove( 'device-up-'+key );
|
|
}
|
|
});
|
|
},
|
|
|
|
colorScheme: function() {
|
|
if( vars.elBody.classList.contains('adaptive-color-scheme') ) {
|
|
window.matchMedia('(prefers-color-scheme: dark)').matches ? vars.elBody.classList.add( 'dark' ) : vars.elBody.classList.remove('dark');
|
|
}
|
|
|
|
var bodyColorScheme = Core.cookie.get('__cnvs_body_color_scheme');
|
|
|
|
if( bodyColorScheme && bodyColorScheme != '' ) {
|
|
bodyColorScheme.split(" ").includes('dark') ? vars.elBody.classList.add( 'dark' ) : vars.elBody.classList.remove( 'dark' );
|
|
}
|
|
},
|
|
|
|
throttle: function(timer, func, delay) {
|
|
if(timer) {
|
|
return;
|
|
}
|
|
|
|
timer = setTimeout( function() {
|
|
func();
|
|
timer = undefined;
|
|
}, delay);
|
|
},
|
|
|
|
debounce: function(callback, delay) {
|
|
clearTimeout(vars.debounced);
|
|
vars.debounced = setTimeout(callback, delay);
|
|
},
|
|
|
|
debouncedResize: function(func, delay) {
|
|
var timeoutId;
|
|
return function() {
|
|
var context = this;
|
|
var args = arguments;
|
|
clearTimeout(timeoutId);
|
|
timeoutId = setTimeout( function() {
|
|
func.apply(context, args);
|
|
}, delay);
|
|
};
|
|
},
|
|
|
|
addEvent: function(el, event, args = {}) {
|
|
if( typeof el === "undefined" || typeof event === "undefined" ) {
|
|
return;
|
|
}
|
|
|
|
var createEvent = new CustomEvent( event, {
|
|
detail: args
|
|
});
|
|
|
|
el.dispatchEvent( createEvent );
|
|
vars.events[event] = true;
|
|
},
|
|
|
|
scrollEnd: function(callback, refresh = 199) {
|
|
if (!callback || typeof callback !== 'function') return;
|
|
|
|
window.addEventListener('scroll', function() {
|
|
Core.debounce( callback, refresh );
|
|
}, {passive: true});
|
|
},
|
|
|
|
viewport: function() {
|
|
var viewport = {
|
|
width: window.innerWidth || vars.elRoot.clientWidth,
|
|
height: window.innerHeight || vars.elRoot.clientHeight
|
|
};
|
|
|
|
vars.viewport = viewport;
|
|
|
|
document.documentElement.style.setProperty('--cnvs-viewport-width', viewport.width);
|
|
document.documentElement.style.setProperty('--cnvs-viewport-height', viewport.height);
|
|
document.documentElement.style.setProperty('--cnvs-body-height', vars.elBody.clientHeight);
|
|
|
|
return viewport;
|
|
},
|
|
|
|
isElement: function(selector) {
|
|
if (typeof selector === 'object' && selector !== null) {
|
|
return true;
|
|
}
|
|
|
|
if (selector instanceof Element || selector instanceof HTMLElement) {
|
|
return true;
|
|
}
|
|
|
|
if (typeof selector.jquery !== 'undefined') {
|
|
selector = selector[0];
|
|
}
|
|
|
|
if (typeof selector.nodeType !== 'undefined') {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
getSelector: function(selector, jquery=true, customjs=true) {
|
|
if(jquery) {
|
|
if( Core.getVars.baseEl !== document ) {
|
|
selector = jQuery(Core.getVars.baseEl).find(selector);
|
|
} else {
|
|
selector = jQuery(selector);
|
|
}
|
|
|
|
if( customjs ) {
|
|
if( typeof customjs == 'string' ) {
|
|
selector = selector.filter(':not('+ customjs +')');
|
|
} else {
|
|
selector = selector.filter(':not(.customjs)');
|
|
}
|
|
}
|
|
} else {
|
|
if( Core.isElement(selector) ) {
|
|
selector = selector;
|
|
} else {
|
|
if( customjs ) {
|
|
if( typeof customjs == 'string' ) {
|
|
selector = Core.getVars.baseEl.querySelectorAll(selector+':not('+customjs+')');
|
|
} else {
|
|
selector = Core.getVars.baseEl.querySelectorAll(selector+':not(.customjs)');
|
|
}
|
|
} else {
|
|
selector = Core.getVars.baseEl.querySelectorAll(selector);
|
|
}
|
|
}
|
|
}
|
|
|
|
return selector;
|
|
},
|
|
|
|
onResize: function(callback, refresh = 333) {
|
|
if (!callback || typeof callback !== 'function') return;
|
|
|
|
window.addEventListener('resize', function() {
|
|
Core.debounce( callback, refresh );
|
|
});
|
|
},
|
|
|
|
imagesLoaded: function(el) {
|
|
var imgs = el.getElementsByTagName('img') || document.images,
|
|
len = imgs.length,
|
|
counter = 0;
|
|
|
|
if(len < 1) {
|
|
Core.addEvent(el, 'CanvasImagesLoaded');
|
|
}
|
|
|
|
var incrementCounter = async function() {
|
|
counter++;
|
|
if(counter === len) {
|
|
Core.addEvent(el, 'CanvasImagesLoaded');
|
|
}
|
|
};
|
|
|
|
[].forEach.call( imgs, function( img ) {
|
|
if(img.complete) {
|
|
incrementCounter();
|
|
} else {
|
|
img.addEventListener('load', incrementCounter, false);
|
|
}
|
|
});
|
|
},
|
|
|
|
contains: function(classes, selector) {
|
|
var classArray = classes.split(" ");
|
|
var hasClass = false;
|
|
|
|
classArray.forEach( function(classTxt) {
|
|
if( vars.elBody.classList.contains(classTxt) ) {
|
|
hasClass = true;
|
|
}
|
|
});
|
|
|
|
return hasClass;
|
|
},
|
|
|
|
has: function(nodeList, selector) {
|
|
return [].slice.call(nodeList)?.filter( function(e) {
|
|
return e.querySelector(selector);
|
|
});
|
|
},
|
|
|
|
filtered: function(nodeList, selector) {
|
|
return [].slice.call(nodeList)?.filter( function(e) {
|
|
return e.matches(selector);
|
|
});
|
|
},
|
|
|
|
parents: function(elem, selector) {
|
|
if (!Element.prototype.matches) {
|
|
Element.prototype.matches =
|
|
Element.prototype.matchesSelector ||
|
|
Element.prototype.mozMatchesSelector ||
|
|
Element.prototype.msMatchesSelector ||
|
|
Element.prototype.oMatchesSelector ||
|
|
Element.prototype.webkitMatchesSelector ||
|
|
function(s) {
|
|
var matches = (this.document || this.ownerDocument).querySelectorAll(s),
|
|
i = matches.length;
|
|
while (--i >= 0 && matches.item(i) !== this) {}
|
|
return i > -1;
|
|
};
|
|
}
|
|
|
|
var parents = [];
|
|
|
|
for ( ; elem && elem !== document; elem = elem.parentNode ) {
|
|
if (selector) {
|
|
if (elem.matches(selector)) {
|
|
parents.push(elem);
|
|
}
|
|
continue;
|
|
}
|
|
parents.push(elem);
|
|
}
|
|
|
|
return parents;
|
|
},
|
|
|
|
siblings: function(elem, nodes = false) {
|
|
if( nodes ) {
|
|
return [].slice.call(nodes).filter( function(sibling) {
|
|
return sibling !== elem;
|
|
});
|
|
} else {
|
|
return [].slice.call(elem.parentNode.children).filter( function(sibling) {
|
|
return sibling !== elem;
|
|
});
|
|
}
|
|
},
|
|
|
|
getNext: function(elem, selector) {
|
|
var nextElem = elem.nextElementSibling;
|
|
|
|
if( !selector ) {
|
|
return nextElem;
|
|
}
|
|
|
|
if( nextElem && nextElem.matches(selector) ) {
|
|
return nextElem;
|
|
}
|
|
|
|
return null;
|
|
},
|
|
|
|
offset: function(el) {
|
|
var rect = el.getBoundingClientRect(),
|
|
scrollLeft = window.scrollX || document.documentElement.scrollLeft,
|
|
scrollTop = window.scrollY || document.documentElement.scrollTop;
|
|
|
|
return {top: rect.top + scrollTop, left: rect.left + scrollLeft};
|
|
},
|
|
|
|
isHidden: function(el) {
|
|
return (el.offsetParent === null);
|
|
},
|
|
|
|
classesFn: function(func, classes, selector) {
|
|
var classArray = classes.split(" ");
|
|
classArray.forEach( function(classTxt) {
|
|
if( func == 'add' ) {
|
|
selector.classList.add(classTxt);
|
|
} else if( func == 'toggle' ) {
|
|
selector.classList.toggle(classTxt);
|
|
} else {
|
|
selector.classList.remove(classTxt);
|
|
}
|
|
});
|
|
},
|
|
|
|
cookie: function() {
|
|
return {
|
|
set: function(name, value, daysToExpire) {
|
|
var date = new Date();
|
|
date.setTime(date.getTime() + (daysToExpire * 24 * 60 * 60 * 1000));
|
|
var expires = "expires=" + date.toUTCString();
|
|
document.cookie = name + "=" + value + ";" + expires + ";path=/";
|
|
},
|
|
|
|
get: function(name) {
|
|
var decodedCookies = decodeURIComponent(document.cookie);
|
|
var cookies = decodedCookies.split(";");
|
|
|
|
for (let i = 0; i < cookies.length; i++) {
|
|
var cookie = cookies[i].trim();
|
|
if (cookie.startsWith(name + "=")) {
|
|
return cookie.substring(name.length + 1);
|
|
}
|
|
}
|
|
|
|
return null;
|
|
},
|
|
|
|
remove: function(name) {
|
|
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
|
|
}
|
|
};
|
|
}(),
|
|
|
|
scrollTo: function(offset = 0, speed = 1250, easing, behavior = 'smooth') {
|
|
if( easing && (typeof jQuery !== 'undefined' && typeof jQuery.easing["easeOutQuad"] !== 'undefined') ) {
|
|
jQuery('body,html').stop(true).animate({
|
|
'scrollTop': Number(offset)
|
|
}, Number( speed ), easing );
|
|
} else {
|
|
var smoothScroll = 'scrollBehavior' in document.documentElement.style;
|
|
|
|
if( typeof window.scroll === 'function' && smoothScroll ) {
|
|
window.scroll({
|
|
top: Number(offset),
|
|
behavior: behavior
|
|
});
|
|
} else {
|
|
var body = Core.getVars.elBody;
|
|
var rootEl = Core.getVars.elRoot;
|
|
|
|
body.scrollIntoView();
|
|
rootEl.scrollIntoView();
|
|
|
|
var scrollToTop = function() {
|
|
if (body.scrollTop > Number(offset) || rootEl.scrollTop > Number(offset)) {
|
|
body.scrollTop -= 20;
|
|
rootEl.scrollTop -= 20;
|
|
setTimeout(scrollToTop, 10);
|
|
}
|
|
};
|
|
|
|
scrollToTop();
|
|
}
|
|
}
|
|
},
|
|
|
|
smoothScroll: function() {
|
|
new initSmoothScrollfunction(document,90,5);
|
|
|
|
function initSmoothScrollfunction(target, speed, smooth) {
|
|
if (target === document)
|
|
target = (document.scrollingElement
|
|
|| document.documentElement
|
|
|| document.body.parentNode
|
|
|| document.body); // cross browser support for document scrolling
|
|
|
|
var moving = false;
|
|
var pos = target.scrollTop;
|
|
var frame = target === document.body
|
|
&& document.documentElement
|
|
? document.documentElement
|
|
: target; // safari is the new IE
|
|
|
|
target.addEventListener('mousewheel', scrolled, { passive: false });
|
|
target.addEventListener('DOMMouseScroll', scrolled, { passive: false });
|
|
|
|
function scrolled(e) {
|
|
e.preventDefault(); // disable default scrolling
|
|
|
|
var delta = normalizeWheelDelta(e);
|
|
|
|
pos += -delta * speed;
|
|
pos = Math.max(0, Math.min(pos, target.scrollHeight - frame.clientHeight)); // limit scrolling
|
|
|
|
if (!moving) update();
|
|
}
|
|
|
|
function normalizeWheelDelta(e){
|
|
if(e.detail){
|
|
if(e.wheelDelta)
|
|
return e.wheelDelta/e.detail/40 * (e.detail>0 ? 1 : -1); // Opera
|
|
else
|
|
return -e.detail/3; // Firefox
|
|
}else
|
|
return e.wheelDelta/120; // IE,Safari,Chrome
|
|
};
|
|
|
|
function update() {
|
|
moving = true;
|
|
|
|
var delta = (pos - target.scrollTop) / smooth;
|
|
|
|
target.scrollTop += delta;
|
|
|
|
if (Math.abs(delta) > 0.5)
|
|
requestFrame(update);
|
|
else
|
|
moving = false;
|
|
}
|
|
|
|
var requestFrame = function() { // requestAnimationFrame cross browser
|
|
return (
|
|
window.requestAnimationFrame ||
|
|
window.webkitRequestAnimationFrame ||
|
|
window.mozRequestAnimationFrame ||
|
|
window.oRequestAnimationFrame ||
|
|
window.msRequestAnimationFrame ||
|
|
function(func) {
|
|
window.setTimeout(func, 1000 / 50);
|
|
}
|
|
);
|
|
}();
|
|
}
|
|
},
|
|
|
|
loadCSS: function(params) {
|
|
var file = params.file;
|
|
var htmlID = params.id || false;
|
|
var cssFolder = params.cssFolder || false;
|
|
|
|
if( !file ) {
|
|
return false;
|
|
}
|
|
|
|
if( htmlID && document.getElementById(htmlID) ) {
|
|
return false;
|
|
}
|
|
|
|
var htmlStyle = document.createElement('link');
|
|
|
|
htmlStyle.id = htmlID;
|
|
htmlStyle.href = cssFolder ? options.cssFolder+file : file;
|
|
htmlStyle.rel = 'stylesheet';
|
|
htmlStyle.type = 'text/css';
|
|
|
|
vars.elHead.appendChild(htmlStyle);
|
|
return true;
|
|
},
|
|
|
|
loadJS: function(params) {
|
|
var file = params.file;
|
|
var htmlID = params.id || false;
|
|
var type = params.type || false;
|
|
var callback = params.callback;
|
|
var async = params.async || true;
|
|
var defer = params.defer || true;
|
|
var jsFolder = params.jsFolder || false;
|
|
|
|
if( !file ) {
|
|
return false;
|
|
}
|
|
|
|
if( htmlID && document.getElementById(htmlID) ) {
|
|
return false;
|
|
}
|
|
|
|
var htmlScript = document.createElement('script');
|
|
|
|
if ( typeof callback !== 'undefined' ) {
|
|
if( typeof callback != 'function' ) {
|
|
throw new Error('Not a valid callback!');
|
|
} else {
|
|
htmlScript.onload = callback;
|
|
}
|
|
}
|
|
|
|
htmlScript.id = htmlID;
|
|
htmlScript.src = jsFolder ? options.jsFolder+file : file;
|
|
if( type ) {
|
|
htmlScript.type = type;
|
|
}
|
|
htmlScript.async = async ? true : false;
|
|
htmlScript.defer = defer ? true : false;
|
|
|
|
vars.elBody.appendChild(htmlScript);
|
|
return true;
|
|
},
|
|
|
|
isFuncTrue: async function(fn) {
|
|
if( 'function' !== typeof fn ) {
|
|
return false;
|
|
}
|
|
|
|
var counter = 0;
|
|
|
|
return new Promise( function(resolve, reject) {
|
|
if(fn()) {
|
|
resolve(true);
|
|
} else {
|
|
var int = setInterval( function() {
|
|
if(fn()) {
|
|
clearInterval( int );
|
|
resolve(true);
|
|
} else {
|
|
if( counter > 30 ) {
|
|
clearInterval( int );
|
|
reject(true);
|
|
}
|
|
}
|
|
counter++;
|
|
}, 333);
|
|
}
|
|
}).catch( function(error) {
|
|
console.log('Function does not exist: ' + fn);
|
|
});
|
|
},
|
|
|
|
initFunction: function(params) {
|
|
vars.elBody.classList.add(params.class);
|
|
Core.addEvent(window, params.event);
|
|
vars.events[params.event] = true;
|
|
},
|
|
|
|
runModule: function(params) {
|
|
var pluginName = (params.plugin).toLowerCase();
|
|
var moduleFile = options.jsFolder + 'modules/' + pluginName + '.js';
|
|
|
|
if( params.file ) {
|
|
moduleFile = params.file;
|
|
}
|
|
|
|
var pluginCheck = function() {
|
|
return typeof CNVS[params.plugin] !== 'undefined';
|
|
};
|
|
|
|
if( !pluginCheck() ) {
|
|
Core.loadJS({ file: moduleFile, id: 'canvas-' + pluginName + '-fn' });
|
|
|
|
Core.isFuncTrue(pluginCheck).then( function(cond) {
|
|
if( !cond ) {
|
|
return false;
|
|
}
|
|
|
|
CNVS[params.plugin].init(params.selector);
|
|
});
|
|
} else {
|
|
CNVS[params.plugin].init(params.selector);
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
initModule: function(params) {
|
|
if( 'dependent' != params.selector ) {
|
|
if( typeof params.selector === 'object' ) {
|
|
if( params.selector instanceof jQuery ){
|
|
params.selector = params.selector[0];
|
|
}
|
|
|
|
var _el = params.selector;
|
|
} else {
|
|
var _el = Core.getVars.baseEl.querySelectorAll( params.selector );
|
|
}
|
|
|
|
if( _el.length < 1 ) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
var required = true;
|
|
var dependentActive = true;
|
|
|
|
if( params.required && Array.isArray( params.required ) ) {
|
|
var requireAll = {};
|
|
params.required.forEach( function(req) {
|
|
return requireAll[req.plugin] = !req.fn() ? false : true;
|
|
});
|
|
|
|
params.required.forEach( function(req) {
|
|
if( !req.fn() ) {
|
|
required = false;
|
|
var getjQuery = async function() {
|
|
Core.loadJS({ file: req.file, id: req.id });
|
|
|
|
var funcAvailable = new Promise( function(resolve) {
|
|
var int = setInterval( function() {
|
|
if( req.fn() ) {
|
|
requireAll[req.plugin] = true;
|
|
var allTrue = Object.values(requireAll).every( function(value) {
|
|
return value === true;
|
|
});
|
|
|
|
if( allTrue ) {
|
|
clearInterval(int);
|
|
resolve(true);
|
|
}
|
|
}
|
|
}, 333);
|
|
});
|
|
|
|
required = await funcAvailable;
|
|
Core.runModule( params );
|
|
}();
|
|
}
|
|
});
|
|
}
|
|
|
|
if( typeof params.dependency !== 'undefined' && typeof params.dependency === 'function' ) {
|
|
dependentActive = false;
|
|
var runDependent = async function() {
|
|
var depAvailable = new Promise( function(resolve) {
|
|
if( params.dependency.call( params, 'dependent' ) == true ) {
|
|
resolve(true);
|
|
}
|
|
});
|
|
return await depAvailable;
|
|
};
|
|
dependentActive = runDependent();
|
|
}
|
|
|
|
if( required && dependentActive ) {
|
|
Core.runModule( params );
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
topScrollOffset: function() {
|
|
var headerHeight = 0;
|
|
var pageMenuOffset = vars.elPageMenu?.querySelector('#page-menu-wrap')?.offsetHeight || 0;
|
|
|
|
if( vars.elBody.classList.contains('is-expanded-menu') ) {
|
|
if( vars.elHeader?.classList.contains('sticky-header') ) {
|
|
headerHeight = vars.elHeaderWrap.offsetHeight;
|
|
}
|
|
|
|
if( vars.elPageMenu?.classList.contains('dots-menu') || !vars.elPageMenu?.classList.contains('sticky-page-menu') ) {
|
|
pageMenuOffset = 0;
|
|
}
|
|
}
|
|
|
|
Core.getVars.topScrollOffset = headerHeight + pageMenuOffset + options.scrollOffset;
|
|
},
|
|
};
|
|
}();
|
|
|
|
var Base = function() {
|
|
return {
|
|
init: function() {
|
|
Mobile.any() && vars.elBody.classList.add('device-touch');
|
|
},
|
|
|
|
menuBreakpoint: function() {
|
|
if( Core.getVars.menuBreakpoint <= Core.viewport().width ) {
|
|
vars.elBody.classList.add( 'is-expanded-menu' );
|
|
} else {
|
|
vars.elBody.classList.remove( 'is-expanded-menu' );
|
|
}
|
|
|
|
if( vars.elPageMenu ) {
|
|
if( typeof Core.getVars.pageMenuBreakpoint === 'undefined' ) {
|
|
Core.getVars.pageMenuBreakpoint = Core.getVars.menuBreakpoint;
|
|
}
|
|
|
|
if( Core.getVars.pageMenuBreakpoint <= Core.viewport().width ) {
|
|
vars.elBody.classList.add( 'is-expanded-pagemenu' );
|
|
} else {
|
|
vars.elBody.classList.remove( 'is-expanded-pagemenu' );
|
|
}
|
|
}
|
|
},
|
|
|
|
goToTop: function() {
|
|
return Core.initModule({ selector: '#gotoTop', plugin: 'GoToTop' });
|
|
},
|
|
|
|
stickFooterOnSmall: function() {
|
|
return Core.initModule({ selector: '#footer', plugin: 'StickFooterOnSmall' });
|
|
},
|
|
|
|
logo: function() {
|
|
return Core.initModule({ selector: '#logo', plugin: 'Logo' });
|
|
},
|
|
|
|
headers: function() {
|
|
Core.getVars.headerClasses = vars.elHeader?.className || '';
|
|
Core.getVars.headerWrapClasses = vars.elHeaderWrap?.className || '';
|
|
return Core.initModule({ selector: '#header', plugin: 'Headers' });
|
|
},
|
|
|
|
menus: function() {
|
|
return Core.initModule({ selector: '#header', plugin: 'Menus' });
|
|
},
|
|
|
|
pageMenu: function() {
|
|
return Core.initModule({ selector: '#page-menu', plugin: 'PageMenu' });
|
|
},
|
|
|
|
sliderDimensions: function() {
|
|
return Core.initModule({ selector: '.slider-element', plugin: 'SliderDimensions' });
|
|
},
|
|
|
|
sliderMenuClass: function() {
|
|
return Core.initModule({ selector: '.transparent-header + .swiper_wrapper,.swiper_wrapper + .transparent-header,.transparent-header + .revslider-wrap,.revslider-wrap + .transparent-header', plugin: 'SliderMenuClass' });
|
|
},
|
|
|
|
topSearch: function() {
|
|
return Core.initModule({ selector: '#top-search-trigger', plugin: 'TopSearch' });
|
|
},
|
|
|
|
topCart: function() {
|
|
return Core.initModule({ selector: '#top-cart', plugin: 'TopCart' });
|
|
},
|
|
|
|
sidePanel: function() {
|
|
return Core.initModule({ selector: '#side-panel', plugin: 'SidePanel' });
|
|
},
|
|
|
|
adaptiveColorScheme: function() {
|
|
return Core.initModule({ selector: '.adaptive-color-scheme', plugin: 'AdaptiveColorScheme' });
|
|
},
|
|
|
|
portfolioAjax: function() {
|
|
return Core.initModule({ selector: '.portfolio-ajax', plugin: 'PortfolioAjax' });
|
|
},
|
|
|
|
cursor: function() {
|
|
if( vars.customCursor ) {
|
|
return Core.initModule({ selector: 'body', plugin: 'Cursor' });
|
|
}
|
|
},
|
|
|
|
setBSTheme: function() {
|
|
if( vars.elBody.classList.contains('dark') ) {
|
|
document.querySelector('html').setAttribute('data-bs-theme', 'dark');
|
|
} else {
|
|
document.querySelector('html').removeAttribute('data-bs-theme');
|
|
document.querySelectorAll('.dark')?.forEach( function(el) {
|
|
el.setAttribute('data-bs-theme', 'dark');
|
|
});
|
|
}
|
|
|
|
vars.elBody.querySelectorAll('.not-dark')?.forEach( function(el) {
|
|
el.setAttribute('data-bs-theme', 'light');
|
|
});
|
|
}
|
|
}
|
|
}();
|
|
|
|
var Modules = function() {
|
|
return {
|
|
easing: function() {
|
|
return Core.initModule({ selector: '[data-easing]', plugin: 'Easing', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
bootstrap: function() {
|
|
var notExec = true;
|
|
document.querySelectorAll('*').forEach( function(el) {
|
|
if( notExec ) {
|
|
el.getAttributeNames().some( function(text) {
|
|
if( text.includes('data-bs') ) {
|
|
notExec = false;
|
|
return Core.initModule({ selector: 'body', plugin: 'Bootstrap' });
|
|
}
|
|
});
|
|
}
|
|
});
|
|
},
|
|
|
|
resizeVideos: function(element) {
|
|
return Core.initModule({ selector: element ? element : 'iframe[src*="youtube"],iframe[src*="vimeo"],iframe[src*="dailymotion"],iframe[src*="maps.google.com"],iframe[src*="google.com/maps"]', plugin: 'ResizeVideos', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
pageTransition: function() {
|
|
if( vars.pageTransition ) {
|
|
return Core.initModule({ selector: 'body', plugin: 'PageTransition' });
|
|
}
|
|
},
|
|
|
|
lazyLoad: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.lazy:not(.lazy-loaded)', plugin: 'LazyLoad' });
|
|
},
|
|
|
|
dataClasses: function() {
|
|
return Core.initModule({ selector: '[data-class]', plugin: 'DataClasses' });
|
|
},
|
|
|
|
dataHeights: function() {
|
|
return Core.initModule({ selector: '[data-height-xxl],[data-height-xl],[data-height-lg],[data-height-md],[data-height-sm],[data-height-xs]', plugin: 'DataHeights' });
|
|
},
|
|
|
|
lightbox: function(element) {
|
|
return Core.initModule({ selector: element ? element : '[data-lightbox]', plugin: 'Lightbox', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
modal: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.modal-on-load', plugin: 'Modal', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
animations: function(element) {
|
|
return Core.initModule({ selector: element ? element : '[data-animate]', plugin: 'Animations' });
|
|
},
|
|
|
|
hoverAnimations: function(element) {
|
|
return Core.initModule({ selector: element ? element : '[data-hover-animate]', plugin: 'HoverAnimations' });
|
|
},
|
|
|
|
gridInit: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.grid-container', plugin: 'Grid', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
filterInit: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.grid-filter,.custom-filter', plugin: 'Filter', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
canvasSlider: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.swiper_wrapper', plugin: 'CanvasSlider' });
|
|
},
|
|
|
|
sliderParallax: function() {
|
|
return Core.initModule({ selector: '.slider-parallax', plugin: 'SliderParallax' });
|
|
},
|
|
|
|
flexSlider: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.fslider', plugin: 'FlexSlider', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
html5Video: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.video-wrap', plugin: 'FullVideo' });
|
|
},
|
|
|
|
youtubeBgVideo: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.yt-bg-player', plugin: 'YoutubeBG', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
toggle: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.toggle', plugin: 'Toggle', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
accordion: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.accordion', plugin: 'Accordion', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
counter: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.counter', plugin: 'Counter', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
countdown: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.countdown', plugin: 'Countdown', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
gmap: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.gmap', plugin: 'GoogleMaps', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
roundedSkills: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.rounded-skill', plugin: 'RoundedSkills', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
progress: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.skill-progress', plugin: 'Progress' });
|
|
},
|
|
|
|
twitterFeed: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.twitter-feed', plugin: 'Twitter', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
flickrFeed: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.flickr-feed', plugin: 'Flickr', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
instagram: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.instagram-photos', plugin: 'Instagram' });
|
|
},
|
|
|
|
// Dribbble Pending
|
|
|
|
navTree: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.nav-tree', plugin: 'NavTree', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
carousel: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.carousel-widget', plugin: 'Carousel', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
masonryThumbs: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.masonry-thumbs', plugin: 'MasonryThumbs', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
notifications: function(element) {
|
|
return Core.initModule({ selector: element ? element : false, plugin: 'Notifications', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
textRotator: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.text-rotater', plugin: 'TextRotator', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
onePage: function(element) {
|
|
return Core.initModule({ selector: element ? element : '[data-scrollto],.one-page-menu', plugin: 'OnePage' });
|
|
},
|
|
|
|
ajaxForm: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.form-widget', plugin: 'AjaxForm', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
subscribe: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.subscribe-widget', plugin: 'Subscribe', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
conditional: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.form-group[data-condition],.form-group[data-conditions]', plugin: 'Conditional' });
|
|
},
|
|
|
|
shapeDivider: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.shape-divider', plugin: 'ShapeDivider' });
|
|
},
|
|
|
|
stickySidebar: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.sticky-sidebar-wrap', plugin: 'StickySidebar', required: [ vars.required.jQuery ] });
|
|
},
|
|
|
|
cookies: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.gdpr-settings,[data-cookies]', plugin: 'Cookies' });
|
|
},
|
|
|
|
quantity: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.quantity', plugin: 'Quantity' });
|
|
},
|
|
|
|
readmore: function(element) {
|
|
return Core.initModule({ selector: element ? element : '[data-readmore]', plugin: 'ReadMore' });
|
|
},
|
|
|
|
pricingSwitcher: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.pricing-tenure-switcher', plugin: 'PricingSwitcher' });
|
|
},
|
|
|
|
ajaxTrigger: function(element) {
|
|
return Core.initModule({ selector: element ? element : '[data-ajax-loader]', plugin: 'AjaxTrigger' });
|
|
},
|
|
|
|
videoFacade: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.video-facade', plugin: 'VideoFacade' });
|
|
},
|
|
|
|
schemeToggle: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.body-scheme-toggle', plugin: 'SchemeToggle' });
|
|
},
|
|
|
|
clipboardCopy: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.clipboard-copy', plugin: 'Clipboard' });
|
|
},
|
|
|
|
codeHighlight: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.code-highlight', plugin: 'CodeHighlight' });
|
|
},
|
|
|
|
tips: function() {
|
|
if( vars.tips ) {
|
|
return Core.initModule({ selector: 'body', plugin: 'Tips' });
|
|
}
|
|
},
|
|
|
|
textSplitter: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.text-splitter', plugin: 'TextSplitter' });
|
|
},
|
|
|
|
mediaActions: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.media-wrap', plugin: 'MediaActions' });
|
|
},
|
|
|
|
viewportDetect: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.viewport-detect', plugin: 'ViewportDetect' });
|
|
},
|
|
|
|
scrollDetect: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.scroll-detect', plugin: 'ScrollDetect' });
|
|
},
|
|
|
|
fontSizer: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.font-sizer', plugin: 'FontSizer' });
|
|
},
|
|
|
|
hover3D: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.hover-3d', plugin: 'Hover3D' });
|
|
},
|
|
|
|
buttons: function(element) {
|
|
return Core.initModule({ selector: element ? element : '.button-text-effect', plugin: 'Buttons' });
|
|
},
|
|
|
|
bsComponents: function(element) {
|
|
return Core.initModule({ selector: element ? element : '[data-bs-toggle="tooltip"],[data-bs-toggle="popover"],[data-bs-toggle="tab"],[data-bs-toggle="pill"],.style-msg', plugin: 'BSComponents' });
|
|
}
|
|
};
|
|
}();
|
|
|
|
var Mobile = function() {
|
|
return {
|
|
Android: function() {
|
|
return navigator.userAgent.match(/Android/i);
|
|
},
|
|
BlackBerry: function() {
|
|
return navigator.userAgent.match(/BlackBerry/i);
|
|
},
|
|
iOS: function() {
|
|
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
|
|
},
|
|
Opera: function() {
|
|
return navigator.userAgent.match(/Opera Mini/i);
|
|
},
|
|
Windows: function() {
|
|
return navigator.userAgent.match(/IEMobile/i);
|
|
},
|
|
any: function() {
|
|
return (Mobile.Android() || Mobile.BlackBerry() || Mobile.iOS() || Mobile.Opera() || Mobile.Windows());
|
|
}
|
|
}
|
|
}();
|
|
|
|
// Add your Custom JS Codes here
|
|
var Custom = function() {
|
|
return {
|
|
onReady: function() {
|
|
// Add JS Codes here to Run on Document Ready
|
|
},
|
|
|
|
onLoad: function() {
|
|
// Add JS Codes here to Run on Window Load
|
|
},
|
|
|
|
onResize: function() {
|
|
// Add JS Codes here to Run on Window Resize
|
|
}
|
|
}
|
|
}();
|
|
|
|
var DocumentOnResize = function() {
|
|
return {
|
|
init: function() {
|
|
Core.viewport();
|
|
Core.breakpoints();
|
|
Base.menuBreakpoint();
|
|
|
|
Core.run(vars.resizers);
|
|
|
|
Custom.onResize();
|
|
Core.addEvent( window, 'cnvsResize' );
|
|
}
|
|
};
|
|
}();
|
|
|
|
var DocumentOnReady = function() {
|
|
return {
|
|
init: function() {
|
|
Core.breakpoints();
|
|
Core.colorScheme();
|
|
Core.runBase();
|
|
Core.runModules();
|
|
Core.topScrollOffset();
|
|
|
|
if( vars.smoothScroll ) {
|
|
new Core.smoothScroll();
|
|
}
|
|
|
|
DocumentOnReady.windowscroll();
|
|
|
|
Custom.onReady();
|
|
},
|
|
|
|
windowscroll: function() {
|
|
Core.scrollEnd( function() {
|
|
Base.pageMenu();
|
|
});
|
|
}
|
|
};
|
|
}();
|
|
|
|
var DocumentOnLoad = function() {
|
|
return {
|
|
init: function() {
|
|
Custom.onLoad();
|
|
}
|
|
};
|
|
}();
|
|
|
|
document.addEventListener( 'DOMContentLoaded', function() {
|
|
DocumentOnReady.init();
|
|
});
|
|
|
|
window.addEventListener('load', function() {
|
|
DocumentOnLoad.init();
|
|
});
|
|
|
|
var resizeFunctions = Core.debouncedResize( function() {
|
|
DocumentOnResize.init();
|
|
}, 250);
|
|
|
|
window.addEventListener('resize', function() {
|
|
resizeFunctions();
|
|
});
|
|
|
|
var canvas_umd = {
|
|
Core,
|
|
Base,
|
|
Modules,
|
|
Mobile,
|
|
Custom,
|
|
};
|
|
|
|
return canvas_umd;
|
|
})));
|
|
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
typeof define === 'function' && define.amd ? define(factory) :
|
|
( global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.CNVS = factory() );
|
|
} (this, (function() {
|
|
// USE STRICT
|
|
"use strict";
|
|
|
|
/**
|
|
* --------------------------------------------------------------------------
|
|
* DO NOT DELETE!! Start (Required)
|
|
* --------------------------------------------------------------------------
|
|
*/
|
|
if( SEMICOLON === 'undefined' || SEMICOLON.Core === 'undefined' || SEMICOLON.Base === 'undefined' || SEMICOLON.Modules === 'undefined' || SEMICOLON.Mobile === 'undefined' ) {
|
|
return false;
|
|
}
|
|
|
|
return {};
|
|
})));
|