PageSourceSearch

https://estorilpraia.pt/js/functions.js

js estorilpraia.pt collected 2026-10-02 10:03:36 UTC 37,096 bytes, 1,316 lines download raw bytes

1if( typeof jQuery !== 'undefined' ) {
2	var $ = jQuery.noConflict();
3}
4
5(function (global, factory) {
6	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
7	typeof define === 'function' && define.amd ? define(factory) :
8	( global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SEMICOLON = factory() );
9} (this, (function() {
10
11	// USE STRICT
12	"use strict";
13
14	var options = {
15		pageTransition: false,
16		cursor: false,
17		tips: false,
18		headerSticky: true,
19		headerMobileSticky: false,
20		menuBreakpoint: 992,
21		pageMenuBreakpoint: 992,
22		gmapAPI: '',
23		scrollOffset: 60,
24		scrollExternalLinks: true,
25		smoothScroll: false,
26		jsFolder: 'js/',
27		cssFolder: 'css/',
28	};
29
30	if( typeof cnvsOptions !== 'undefined' ) {
31		options = Object.assign({}, options, cnvsOptions);
32	}
33
34	var vars = {
35		baseEl: document,
36		elRoot: document.documentElement,
37		elHead: document.head,
38		elBody: document.body,
39		viewport: {
40			width: 0,
41			height: 0,
42		},
43		hash: window.location.hash,
44		topScrollOffset: 0,
45		elWrapper: document.getElementById('wrapper'),
46		elHeader: document.getElementById('header'),
47		headerClasses: '',
48		elHeaderWrap: document.getElementById('header-wrap'),
49		headerWrapClasses: '',
50		headerHeight: 0,
51		headerOffset: 0,
52		headerWrapHeight: 0,
53		headerWrapOffset: 0,
54		elPrimaryMenus: document.querySelectorAll('.primary-menu'),
55		elPrimaryMenuTriggers: document.querySelectorAll('.primary-menu-trigger'),
56		elPageMenu: document.getElementById('page-menu'),
57		pageMenuOffset: 0,
58		elSlider: document.getElementById('slider'),
59		elFooter: document.getElementById('footer'),
60		elAppMenu: document.querySelector('.app-menu'),
61		portfolioAjax: {},
62		sliderParallax: {
63			el: document.querySelector('.slider-parallax'),
64			caption: document.querySelector('.slider-parallax .slider-caption'),
65			inner: document.querySelector('.slider-inner'),
66			offset: 0,
67		},
68		get menuBreakpoint() {
69			return this.elBody.getAttribute('data-menu-breakpoint') || options.menuBreakpoint;
70		},
71		get pageMenuBreakpoint() {
72			return this.elBody.getAttribute('data-pagemenu-breakpoint') || options.pageMenuBreakpoint;
73		},
74		get customCursor() {
75			var value = this.elBody.getAttribute('data-custom-cursor') || options.cursor;
76			return value == 'true' || value === true ? true : false;
77		},
78		get pageTransition() {
79			var value = this.elBody.classList.contains('page-transition') || options.pageTransition;
80			return value == 'true' || value === true ? true : false;
81		},
82		get tips() {
83			var value = this.elBody.getAttribute('data-tips') || options.tips;
84			return value == 'true' || value === true ? true : false;
85		},
86		get smoothScroll() {
87			var value = this.elBody.getAttribute('data-smooth-scroll') || options.smoothScroll;
88			return value == 'true' || value === true ? true : false;
89		},
90		get isRTL() {
91			return this.elRoot.getAttribute('dir') == 'rtl' ? true : false;
92		},
93		scrollPos: {
94			x: 0,
95			y: 0,
96		},
97		$jq: typeof jQuery !== "undefined" ? jQuery.noConflict() : '',
98		resizers: {},
99		recalls: {},
100		debounced: false,
101		events: {},
102		modules: {},
103		fn: {},
104		required: {
105			jQuery: {
106				plugin: 'jquery',
107				fn: function(){
108					return typeof jQuery !== 'undefined';
109				},
110				file: options.jsFolder+'jquery.js',
111				id: 'canvas-jquery',
112			}
113		},
114		fnInit: function() {
115			DocumentOnReady.init();
116			DocumentOnLoad.init();
117			DocumentOnResize.init();
118		}
119	};
120
121	var Core = function() {
122		return {
123			getOptions: options,
124			getVars: vars,
125
126			run: function(obj) {
127				Object.values(obj).map( function(fn) {
128					return typeof fn === 'function' && fn.call();
129				});
130			},
131
132			runBase: function() {
133				Core.run(Base);
134			},
135
136			runModules: function() {
137				Core.run(Modules);
138			},
139
140			runContainerModules: function(parent) {
141				if( typeof parent === 'undefined' ) {
142					return false;
143				}
144
145				Core.getVars.baseEl = parent;
146				Core.runModules();
147				Core.getVars.baseEl = document;
148			},
149
150			breakpoints: function() {
151				var viewWidth = Core.viewport().width;
152
153				var breakpoint = {
154					xxl: {
155						enter: 1400,
156						exit: 99999
157					},
158					xl: {
159						enter: 1200,
160						exit: 1399
161					},
162					lg: {
163						enter: 992,
164						exit: 1199.98
165					},
166					md: {
167						enter: 768,
168						exit: 991.98
169					},
170					sm: {
171						enter: 576,
172						exit: 767.98
173					},
174					xs: {
175						enter: 0,
176						exit: 575.98
177					}
178				};
179
180				var previous = '';
181
182				Object.keys( breakpoint ).forEach( function(key) {
183					if ( (viewWidth > breakpoint[key].enter) && (viewWidth <= breakpoint[key].exit) ) {
184						vars.elBody.classList.add( 'device-'+key );
185					} else {
186						vars.elBody.classList.remove( 'device-'+key );
187						if( previous != '' ) {
188							vars.elBody.classList.remove( 'device-down-'+previous );
189						}
190					}
191
192					if ( viewWidth <= breakpoint[key].exit ) {
193						if( previous != '' ) {
194							vars.elBody.classList.add( 'device-down-'+previous );
195						}
196					}
197
198					previous = key;
199
200					if ( viewWidth > breakpoint[key].enter ) {
201						vars.elBody.classList.add( 'device-up-'+key );
202						return;
203					} else {
204						vars.elBody.classList.remove( 'device-up-'+key );
205					}
206				});
207			},
208
209			colorScheme: function() {
210				if( vars.elBody.classList.contains('adaptive-color-scheme') ) {
211					window.matchMedia('(prefers-color-scheme: dark)').matches ? vars.elBody.classList.add( 'dark' ) : vars.elBody.classList.remove('dark');
212				}
213
214				var bodyColorScheme = Core.cookie.get('__cnvs_body_color_scheme');
215
216				if( bodyColorScheme && bodyColorScheme != '' ) {
217					bodyColorScheme.split(" ").includes('dark') ? vars.elBody.classList.add( 'dark' ) : vars.elBody.classList.remove( 'dark' );
218				}
219			},
220
221			throttle: function(timer, func, delay) {
222				if(timer) {
223					return;
224				}
225
226				timer = setTimeout( function() {
227					func();
228					timer = undefined;
229				}, delay);
230			},
231
232			debounce: function(callback, delay) {
233				clearTimeout(vars.debounced);
234				vars.debounced = setTimeout(callback, delay);
235			},
236
237			debouncedResize: function(func, delay) {
238				var timeoutId;
239				return function() {
240					var context = this;
241					var args = arguments;
242					clearTimeout(timeoutId);
243					timeoutId = setTimeout( function() {
244						func.apply(context, args);
245					}, delay);
246				};
247			},
248
249			addEvent: function(el, event, args = {}) {
250				if( typeof el === "undefined" || typeof event === "undefined" ) {
251					return;
252				}
253
254				var createEvent = new CustomEvent( event, {
255					detail: args
256				});
257
258				el.dispatchEvent( createEvent );
259				vars.events[event] = true;
260			},
261
262			scrollEnd: function(callback, refresh = 199) {
263				if (!callback || typeof callback !== 'function') return;
264
265				window.addEventListener('scroll', function() {
266					Core.debounce( callback, refresh );
267				}, {passive: true});
268			},
269
270			viewport: function() {
271				var viewport = {
272					width: window.innerWidth || vars.elRoot.clientWidth,
273					height: window.innerHeight || vars.elRoot.clientHeight
274				};
275
276				vars.viewport = viewport;
277
278				document.documentElement.style.setProperty('--cnvs-viewport-width', viewport.width);
279				document.documentElement.style.setProperty('--cnvs-viewport-height', viewport.height);
280				document.documentElement.style.setProperty('--cnvs-body-height', vars.elBody.clientHeight);
281
282				return viewport;
283			},
284
285			isElement: function(selector) {
286				if (typeof selector === 'object' && selector !== null) {
287					return true;
288				}
289
290				if (selector instanceof Element || selector instanceof HTMLElement) {
291					return true;
292				}
293
294				if (typeof selector.jquery !== 'undefined') {
295					selector = selector[0];
296				}
297
298				if (typeof selector.nodeType !== 'undefined') {
299					return true;
300				}
301
302				return false;
303			},
304
305			getSelector: function(selector, jquery=true, customjs=true) {
306				if(jquery) {
307					if( Core.getVars.baseEl !== document ) {
308						selector = jQuery(Core.getVars.baseEl).find(selector);
309					} else {
310						selector = jQuery(selector);
311					}
312
313					if( customjs ) {
314						if( typeof customjs == 'string' ) {
315							selector = selector.filter(':not('+ customjs +')');
316						} else {
317							selector = selector.filter(':not(.customjs)');
318						}
319					}
320				} else {
321					if( Core.isElement(selector) ) {
322						selector = selector;
323					} else {
324						if( customjs ) {
325							if( typeof customjs == 'string' ) {
326								selector = Core.getVars.baseEl.querySelectorAll(selector+':not('+customjs+')');
327							} else {
328								selector = Core.getVars.baseEl.querySelectorAll(selector+':not(.customjs)');
329							}
330						} else {
331							selector = Core.getVars.baseEl.querySelectorAll(selector);
332						}
333					}
334				}
335
336				return selector;
337			},
338
339			onResize: function(callback, refresh = 333) {
340				if (!callback || typeof callback !== 'function') return;
341
342				window.addEventListener('resize', function() {
343					Core.debounce( callback, refresh );
344				});
345			},
346
347			imagesLoaded: function(el) {
348				var imgs = el.getElementsByTagName('img') || document.images,
349					len = imgs.length,
350					counter = 0;
351
352				if(len < 1) {
353					Core.addEvent(el, 'CanvasImagesLoaded');
354				}
355
356				var incrementCounter = async function() {
357					counter++;
358					if(counter === len) {
359						Core.addEvent(el, 'CanvasImagesLoaded');
360					}
361				};
362
363				[].forEach.call( imgs, function( img ) {
364					if(img.complete) {
365						incrementCounter();
366					} else {
367						img.addEventListener('load', incrementCounter, false);
368					}
369				});
370			},
371
372			contains: function(classes, selector) {
373				var classArray = classes.split(" ");
374				var hasClass = false;
375
376				classArray.forEach( function(classTxt) {
377					if( vars.elBody.classList.contains(classTxt) ) {
378						hasClass = true;
379					}
380				});
381
382				return hasClass;
383			},
384
385			has: function(nodeList, selector) {
386				return [].slice.call(nodeList)?.filter( function(e) {
387					return e.querySelector(selector);
388				});
389			},
390
391			filtered: function(nodeList, selector) {
392				return [].slice.call(nodeList)?.filter( function(e) {
393					return e.matches(selector);
394				});
395			},
396
397			parents: function(elem, selector) {
398				if (!Element.prototype.matches) {
399					Element.prototype.matches =
400						Element.prototype.matchesSelector ||
401						Element.prototype.mozMatchesSelector ||
402						Element.prototype.msMatchesSelector ||
403						Element.prototype.oMatchesSelector ||
404						Element.prototype.webkitMatchesSelector ||
405						function(s) {
406							var matches = (this.document || this.ownerDocument).querySelectorAll(s),
407								i = matches.length;
408							while (--i >= 0 && matches.item(i) !== this) {}
409							return i > -1;
410						};
411				}
412
413				var parents = [];
414
415				for ( ; elem && elem !== document; elem = elem.parentNode ) {
416					if (selector) {
417						if (elem.matches(selector)) {
418							parents.push(elem);
419						}
420						continue;
421					}
422					parents.push(elem);
423				}
424
425				return parents;
426			},
427
428			siblings: function(elem, nodes = false) {
429				if( nodes ) {
430					return [].slice.call(nodes).filter( function(sibling) {
431						return sibling !== elem;
432					});
433				} else {
434					return [].slice.call(elem.parentNode.children).filter( function(sibling) {
435						return sibling !== elem;
436					});
437				}
438			},
439
440			getNext: function(elem, selector) {
441				var nextElem = elem.nextElementSibling;
442
443				if( !selector ) {
444					return nextElem;
445				}
446
447				if( nextElem && nextElem.matches(selector) ) {
448					return nextElem;
449				}
450
451				return null;
452			},
453
454			offset: function(el) {
455				var rect = el.getBoundingClientRect(),
456					scrollLeft = window.scrollX || document.documentElement.scrollLeft,
457					scrollTop = window.scrollY || document.documentElement.scrollTop;
458
459				return {top: rect.top + scrollTop, left: rect.left + scrollLeft};
460			},
461
462			isHidden: function(el) {
463				return (el.offsetParent === null);
464			},
465
466			classesFn: function(func, classes, selector) {
467				var classArray = classes.split(" ");
468				classArray.forEach( function(classTxt) {
469					if( func == 'add' ) {
470						selector.classList.add(classTxt);
471					} else if( func == 'toggle' ) {
472						selector.classList.toggle(classTxt);
473					} else {
474						selector.classList.remove(classTxt);
475					}
476				});
477			},
478
479			cookie: function() {
480				return {
481					set: function(name, value, daysToExpire) {
482						var date = new Date();
483						date.setTime(date.getTime() + (daysToExpire * 24 * 60 * 60 * 1000));
484						var expires = "expires=" + date.toUTCString();
485						document.cookie = name + "=" + value + ";" + expires + ";path=/";
486					},
487
488					get: function(name) {
489						var decodedCookies = decodeURIComponent(document.cookie);
490						var cookies = decodedCookies.split(";");
491
492						for (let i = 0; i < cookies.length; i++) {
493						  var cookie = cookies[i].trim();
494						  if (cookie.startsWith(name + "=")) {
495							return cookie.substring(name.length + 1);
496						  }
497						}
498
499						return null;
500					},
501
502					remove: function(name) {
503						document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
504					}
505				};
506			}(),
507
508			scrollTo: function(offset = 0, speed = 1250, easing, behavior = 'smooth') {
509				if( easing && (typeof jQuery !== 'undefined' && typeof jQuery.easing["easeOutQuad"] !== 'undefined') ) {
510					jQuery('body,html').stop(true).animate({
511						'scrollTop': Number(offset)
512					}, Number( speed ), easing );
513				} else {
514					var smoothScroll = 'scrollBehavior' in document.documentElement.style;
515
516					if( typeof window.scroll === 'function' && smoothScroll ) {
517						window.scroll({
518							top: Number(offset),
519							behavior: behavior
520						});
521					} else {
522						var body = Core.getVars.elBody;
523						var rootEl = Core.getVars.elRoot;
524
525						body.scrollIntoView();
526						rootEl.scrollIntoView();
527
528						var scrollToTop = function() {
529							if (body.scrollTop > Number(offset) || rootEl.scrollTop > Number(offset)) {
530								body.scrollTop -= 20;
531								rootEl.scrollTop -= 20;
532								setTimeout(scrollToTop, 10);
533							}
534						};
535
536						scrollToTop();
537					}
538				}
539			},
540
541			smoothScroll: function() {
542				new initSmoothScrollfunction(document,90,5);
543
544				function initSmoothScrollfunction(target, speed, smooth) {
545					if (target === document)
546						target = (document.scrollingElement
547							  || document.documentElement
548							  || document.body.parentNode
549							  || document.body); // cross browser support for document scrolling
550
551					var moving = false;
552					var pos = target.scrollTop;
553					var frame = target === document.body
554							  && document.documentElement
555							  ? document.documentElement
556							  : target; // safari is the new IE
557
558					target.addEventListener('mousewheel', scrolled, { passive: false });
559					target.addEventListener('DOMMouseScroll', scrolled, { passive: false });
560
561					function scrolled(e) {
562						e.preventDefault(); // disable default scrolling
563
564						var delta = normalizeWheelDelta(e);
565
566						pos += -delta * speed;
567						pos = Math.max(0, Math.min(pos, target.scrollHeight - frame.clientHeight)); // limit scrolling
568
569						if (!moving) update();
570					}
571
572					function normalizeWheelDelta(e){
573						if(e.detail){
574							if(e.wheelDelta)
575								return e.wheelDelta/e.detail/40 * (e.detail>0 ? 1 : -1); // Opera
576							else
577								return -e.detail/3; // Firefox
578						}else
579							return e.wheelDelta/120; // IE,Safari,Chrome
580					};
581
582					function update() {
583						moving = true;
584
585						var delta = (pos - target.scrollTop) / smooth;
586
587						target.scrollTop += delta;
588
589						if (Math.abs(delta) > 0.5)
590							requestFrame(update);
591						else
592							moving = false;
593					}
594
595					var requestFrame = function() { // requestAnimationFrame cross browser
596						return (
597							window.requestAnimationFrame ||
598							window.webkitRequestAnimationFrame ||
599							window.mozRequestAnimationFrame ||
600							window.oRequestAnimationFrame ||
601							window.msRequestAnimationFrame ||
602							function(func) {
603								window.setTimeout(func, 1000 / 50);
604							}
605						);
606					}();
607				}
608			},
609
610			loadCSS: function(params) {
611				var file = params.file;
612				var htmlID = params.id || false;
613				var cssFolder = params.cssFolder || false;
614
615				if( !file ) {
616					return false;
617				}
618
619				if( htmlID && document.getElementById(htmlID) ) {
620					return false;
621				}
622
623				var htmlStyle = document.createElement('link');
624
625				htmlStyle.id = htmlID;
626				htmlStyle.href = cssFolder ? options.cssFolder+file : file;
627				htmlStyle.rel = 'stylesheet';
628				htmlStyle.type = 'text/css';
629
630				vars.elHead.appendChild(htmlStyle);
631				return true;
632			},
633
634			loadJS: function(params) {
635				var file = params.file;
636				var htmlID = params.id || false;
637				var type = params.type || false;
638				var callback = params.callback;
639				var async = params.async || true;
640				var defer = params.defer || true;
641				var jsFolder = params.jsFolder || false;
642
643				if( !file ) {
644					return false;
645				}
646
647				if( htmlID && document.getElementById(htmlID) ) {
648					return false;
649				}
650
651				var htmlScript = document.createElement('script');
652
653				if ( typeof callback !== 'undefined' ) {
654					if( typeof callback != 'function' ) {
655						throw new Error('Not a valid callback!');
656					} else {
657						htmlScript.onload = callback;
658					}
659				}
660
661				htmlScript.id = htmlID;
662				htmlScript.src = jsFolder ? options.jsFolder+file : file;
663				if( type ) {
664					htmlScript.type = type;
665				}
666				htmlScript.async = async ? true : false;
667				htmlScript.defer = defer ? true : false;
668
669				vars.elBody.appendChild(htmlScript);
670				return true;
671			},
672
673			isFuncTrue: async function(fn) {
674				if( 'function' !== typeof fn ) {
675					return false;
676				}
677
678				var counter = 0;
679
680				return new Promise( function(resolve, reject) {
681					if(fn()) {
682						resolve(true);
683					} else {
684						var int = setInterval( function() {
685							if(fn()) {
686								clearInterval( int );
687								resolve(true);
688							} else {
689								if( counter > 30 ) {
690									clearInterval( int );
691									reject(true);
692								}
693							}
694							counter++;
695						}, 333);
696					}
697				}).catch( function(error) {
698					console.log('Function does not exist: ' + fn);
699				});
700			},
701
702			initFunction: function(params) {
703				vars.elBody.classList.add(params.class);
704				Core.addEvent(window, params.event);
705				vars.events[params.event] = true;
706			},
707
708			runModule: function(params) {
709				var pluginName = (params.plugin).toLowerCase();
710				var moduleFile = options.jsFolder + 'modules/' + pluginName + '.js';
711
712				if( params.file ) {
713					moduleFile = params.file;
714				}
715
716				var pluginCheck = function() {
717					return typeof CNVS[params.plugin] !== 'undefined';
718				};
719
720				if( !pluginCheck() ) {
721					Core.loadJS({ file: moduleFile, id: 'canvas-' + pluginName + '-fn' });
722
723					Core.isFuncTrue(pluginCheck).then( function(cond) {
724						if( !cond ) {
725							return false;
726						}
727
728						CNVS[params.plugin].init(params.selector);
729					});
730				} else {
731					CNVS[params.plugin].init(params.selector);
732				}
733
734				return true;
735			},
736
737			initModule: function(params) {
738				if( 'dependent' != params.selector ) {
739					if( typeof params.selector === 'object' ) {
740						if( params.selector instanceof jQuery ){
741							params.selector = params.selector[0];
742						}
743
744						var _el = params.selector;
745					} else {
746						var _el = Core.getVars.baseEl.querySelectorAll( params.selector );
747					}
748
749					if( _el.length < 1 ) {
750						return false;
751					}
752				}
753
754				var required = true;
755				var dependentActive = true;
756
757				if( params.required && Array.isArray( params.required ) ) {
758					var requireAll = {};
759					params.required.forEach( function(req) {
760						return requireAll[req.plugin] = !req.fn() ? false : true;
761					});
762
763					params.required.forEach( function(req) {
764						if( !req.fn() ) {
765							required = false;
766							var getjQuery = async function() {
767								Core.loadJS({ file: req.file, id: req.id });
768
769								var funcAvailable = new Promise( function(resolve) {
770									var int = setInterval( function() {
771										if( req.fn() ) {
772											requireAll[req.plugin] = true;
773											var allTrue = Object.values(requireAll).every( function(value) {
774												return value === true;
775											});
776
777											if( allTrue ) {
778												clearInterval(int);
779												resolve(true);
780											}
781										}
782									}, 333);
783								});
784
785								required = await funcAvailable;
786								Core.runModule( params );
787							}();
788						}
789					});
790				}
791
792				if( typeof params.dependency !== 'undefined' && typeof params.dependency === 'function' ) {
793					dependentActive = false;
794					var runDependent = async function() {
795						var depAvailable = new Promise( function(resolve) {
796							if( params.dependency.call( params, 'dependent' ) == true ) {
797								resolve(true);
798							}
799						});
800						return await depAvailable;
801					};
802					dependentActive = runDependent();
803				}
804
805				if( required && dependentActive ) {
806					Core.runModule( params );
807				}
808
809				return true;
810			},
811
812			topScrollOffset: function() {
813				var headerHeight = 0;
814				var pageMenuOffset = vars.elPageMenu?.querySelector('#page-menu-wrap')?.offsetHeight || 0;
815
816				if( vars.elBody.classList.contains('is-expanded-menu') ) {
817					if( vars.elHeader?.classList.contains('sticky-header') ) {
818						headerHeight = vars.elHeaderWrap.offsetHeight;
819					}
820
821					if( vars.elPageMenu?.classList.contains('dots-menu') || !vars.elPageMenu?.classList.contains('sticky-page-menu') ) {
822						pageMenuOffset = 0;
823					}
824				}
825
826				Core.getVars.topScrollOffset = headerHeight + pageMenuOffset + options.scrollOffset;
827			},
828		};
829	}();
830
831	var Base = function() {
832		return {
833			init: function() {
834				Mobile.any() && vars.elBody.classList.add('device-touch');
835			},
836
837			menuBreakpoint: function() {
838				if( Core.getVars.menuBreakpoint <= Core.viewport().width ) {
839					vars.elBody.classList.add( 'is-expanded-menu' );
840				} else {
841					vars.elBody.classList.remove( 'is-expanded-menu' );
842				}
843
844				if( vars.elPageMenu ) {
845					if( typeof Core.getVars.pageMenuBreakpoint === 'undefined' ) {
846						Core.getVars.pageMenuBreakpoint = Core.getVars.menuBreakpoint;
847					}
848
849					if( Core.getVars.pageMenuBreakpoint <= Core.viewport().width ) {
850						vars.elBody.classList.add( 'is-expanded-pagemenu' );
851					} else {
852						vars.elBody.classList.remove( 'is-expanded-pagemenu' );
853					}
854				}
855			},
856
857			goToTop: function() {
858				return Core.initModule({ selector: '#gotoTop', plugin: 'GoToTop' });
859			},
860
861			stickFooterOnSmall: function() {
862				return Core.initModule({ selector: '#footer', plugin: 'StickFooterOnSmall' });
863			},
864
865			logo: function() {
866				return Core.initModule({ selector: '#logo', plugin: 'Logo' });
867			},
868
869			headers: function() {
870				Core.getVars.headerClasses = vars.elHeader?.className || '';
871				Core.getVars.headerWrapClasses = vars.elHeaderWrap?.className || '';
872				return Core.initModule({ selector: '#header', plugin: 'Headers' });
873			},
874
875			menus: function() {
876				return Core.initModule({ selector: '#header', plugin: 'Menus' });
877			},
878
879			pageMenu: function() {
880				return Core.initModule({ selector: '#page-menu', plugin: 'PageMenu' });
881			},
882
883			sliderDimensions: function() {
884				return Core.initModule({ selector: '.slider-element', plugin: 'SliderDimensions' });
885			},
886
887			sliderMenuClass: function() {
888				return Core.initModule({ selector: '.transparent-header + .swiper_wrapper,.swiper_wrapper + .transparent-header,.transparent-header + .revslider-wrap,.revslider-wrap + .transparent-header', plugin: 'SliderMenuClass' });
889			},
890
891			topSearch: function() {
892				return Core.initModule({ selector: '#top-search-trigger', plugin: 'TopSearch' });
893			},
894
895			topCart: function() {
896				return Core.initModule({ selector: '#top-cart', plugin: 'TopCart' });
897			},
898
899			sidePanel: function() {
900				return Core.initModule({ selector: '#side-panel', plugin: 'SidePanel' });
901			},
902
903			adaptiveColorScheme: function() {
904				return Core.initModule({ selector: '.adaptive-color-scheme', plugin: 'AdaptiveColorScheme' });
905			},
906
907			portfolioAjax: function() {
908				return Core.initModule({ selector: '.portfolio-ajax', plugin: 'PortfolioAjax' });
909			},
910
911			cursor: function() {
912				if( vars.customCursor ) {
913					return Core.initModule({ selector: 'body', plugin: 'Cursor' });
914				}
915			},
916
917			setBSTheme: function() {
918				if( vars.elBody.classList.contains('dark') ) {
919					document.querySelector('html').setAttribute('data-bs-theme', 'dark');
920				} else {
921					document.querySelector('html').removeAttribute('data-bs-theme');
922					document.querySelectorAll('.dark')?.forEach( function(el) {
923						el.setAttribute('data-bs-theme', 'dark');
924					});
925				}
926
927				vars.elBody.querySelectorAll('.not-dark')?.forEach( function(el) {
928					el.setAttribute('data-bs-theme', 'light');
929				});
930			}
931		}
932	}();
933
934	var Modules = function() {
935		return {
936			easing: function() {
937				return Core.initModule({ selector: '[data-easing]', plugin: 'Easing', required: [ vars.required.jQuery ] });
938			},
939
940			bootstrap: function() {
941				var notExec = true;
942				document.querySelectorAll('*').forEach( function(el) {
943					if( notExec ) {
944						el.getAttributeNames().some( function(text) {
945							if( text.includes('data-bs') ) {
946								notExec = false;
947								return Core.initModule({ selector: 'body', plugin: 'Bootstrap' });
948							}
949						});
950					}
951				});
952			},
953
954			resizeVideos: function(element) {
955				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 ] });
956			},
957
958			pageTransition: function() {
959				if( vars.pageTransition ) {
960					return Core.initModule({ selector: 'body', plugin: 'PageTransition' });
961				}
962			},
963
964			lazyLoad: function(element) {
965				return Core.initModule({ selector: element ? element : '.lazy:not(.lazy-loaded)', plugin: 'LazyLoad' });
966			},
967
968			dataClasses: function() {
969				return Core.initModule({ selector: '[data-class]', plugin: 'DataClasses' });
970			},
971
972			dataHeights: function() {
973				return Core.initModule({ selector: '[data-height-xxl],[data-height-xl],[data-height-lg],[data-height-md],[data-height-sm],[data-height-xs]', plugin: 'DataHeights' });
974			},
975
976			lightbox: function(element) {
977				return Core.initModule({ selector: element ? element : '[data-lightbox]', plugin: 'Lightbox', required: [ vars.required.jQuery ] });
978			},
979
980			modal: function(element) {
981				return Core.initModule({ selector: element ? element : '.modal-on-load', plugin: 'Modal', required: [ vars.required.jQuery ] });
982			},
983
984			animations: function(element) {
985				return Core.initModule({ selector: element ? element : '[data-animate]', plugin: 'Animations' });
986			},
987
988			hoverAnimations: function(element) {
989				return Core.initModule({ selector: element ? element : '[data-hover-animate]', plugin: 'HoverAnimations' });
990			},
991
992			gridInit: function(element) {
993				return Core.initModule({ selector: element ? element : '.grid-container', plugin: 'Grid', required: [ vars.required.jQuery ] });
994			},
995
996			filterInit: function(element) {
997				return Core.initModule({ selector: element ? element : '.grid-filter,.custom-filter', plugin: 'Filter', required: [ vars.required.jQuery ] });
998			},
999
1000			canvasSlider: function(element) {
1001				return Core.initModule({ selector: element ? element : '.swiper_wrapper', plugin: 'CanvasSlider' });
1002			},
1003
1004			sliderParallax: function() {
1005				return Core.initModule({ selector: '.slider-parallax', plugin: 'SliderParallax' });
1006			},
1007
1008			flexSlider: function(element) {
1009				return Core.initModule({ selector: element ? element : '.fslider', plugin: 'FlexSlider', required: [ vars.required.jQuery ] });
1010			},
1011
1012			html5Video: function(element) {
1013				return Core.initModule({ selector: element ? element : '.video-wrap', plugin: 'FullVideo' });
1014			},
1015
1016			youtubeBgVideo: function(element) {
1017				return Core.initModule({ selector: element ? element : '.yt-bg-player', plugin: 'YoutubeBG', required: [ vars.required.jQuery ] });
1018			},
1019
1020			toggle: function(element) {
1021				return Core.initModule({ selector: element ? element : '.toggle', plugin: 'Toggle', required: [ vars.required.jQuery ] });
1022			},
1023
1024			accordion: function(element) {
1025				return Core.initModule({ selector: element ? element : '.accordion', plugin: 'Accordion', required: [ vars.required.jQuery ] });
1026			},
1027
1028			counter: function(element) {
1029				return Core.initModule({ selector: element ? element : '.counter', plugin: 'Counter', required: [ vars.required.jQuery ] });
1030			},
1031
1032			countdown: function(element) {
1033				return Core.initModule({ selector: element ? element : '.countdown', plugin: 'Countdown', required: [ vars.required.jQuery ] });
1034			},
1035
1036			gmap: function(element) {
1037				return Core.initModule({ selector: element ? element : '.gmap', plugin: 'GoogleMaps', required: [ vars.required.jQuery ] });
1038			},
1039
1040			roundedSkills: function(element) {
1041				return Core.initModule({ selector: element ? element : '.rounded-skill', plugin: 'RoundedSkills', required: [ vars.required.jQuery ] });
1042			},
1043
1044			progress: function(element) {
1045				return Core.initModule({ selector: element ? element : '.skill-progress', plugin: 'Progress' });
1046			},
1047
1048			twitterFeed: function(element) {
1049				return Core.initModule({ selector: element ? element : '.twitter-feed', plugin: 'Twitter', required: [ vars.required.jQuery ] });
1050			},
1051
1052			flickrFeed: function(element) {
1053				return Core.initModule({ selector: element ? element : '.flickr-feed', plugin: 'Flickr', required: [ vars.required.jQuery ] });
1054			},
1055
1056			instagram: function(element) {
1057				return Core.initModule({ selector: element ? element : '.instagram-photos', plugin: 'Instagram' });
1058			},
1059
1060			// Dribbble Pending
1061
1062			navTree: function(element) {
1063				return Core.initModule({ selector: element ? element : '.nav-tree', plugin: 'NavTree', required: [ vars.required.jQuery ] });
1064			},
1065
1066			carousel: function(element) {
1067				return Core.initModule({ selector: element ? element : '.carousel-widget', plugin: 'Carousel', required: [ vars.required.jQuery ] });
1068			},
1069
1070			masonryThumbs: function(element) {
1071				return Core.initModule({ selector: element ? element : '.masonry-thumbs', plugin: 'MasonryThumbs', required: [ vars.required.jQuery ] });
1072			},
1073
1074			notifications: function(element) {
1075				return Core.initModule({ selector: element ? element : false, plugin: 'Notifications', required: [ vars.required.jQuery ] });
1076			},
1077
1078			textRotator: function(element) {
1079				return Core.initModule({ selector: element ? element : '.text-rotater', plugin: 'TextRotator', required: [ vars.required.jQuery ] });
1080			},
1081
1082			onePage: function(element) {
1083				return Core.initModule({ selector: element ? element : '[data-scrollto],.one-page-menu', plugin: 'OnePage' });
1084			},
1085
1086			ajaxForm: function(element) {
1087				return Core.initModule({ selector: element ? element : '.form-widget', plugin: 'AjaxForm', required: [ vars.required.jQuery ] });
1088			},
1089
1090			subscribe: function(element) {
1091				return Core.initModule({ selector: element ? element : '.subscribe-widget', plugin: 'Subscribe', required: [ vars.required.jQuery ] });
1092			},
1093
1094			conditional: function(element) {
1095				return Core.initModule({ selector: element ? element : '.form-group[data-condition],.form-group[data-conditions]', plugin: 'Conditional' });
1096			},
1097
1098			shapeDivider: function(element) {
1099				return Core.initModule({ selector: element ? element : '.shape-divider', plugin: 'ShapeDivider' });
1100			},
1101
1102			stickySidebar: function(element) {
1103				return Core.initModule({ selector: element ? element : '.sticky-sidebar-wrap', plugin: 'StickySidebar', required: [ vars.required.jQuery ] });
1104			},
1105
1106			cookies: function(element) {
1107				return Core.initModule({ selector: element ? element : '.gdpr-settings,[data-cookies]', plugin: 'Cookies' });
1108			},
1109
1110			quantity: function(element) {
1111				return Core.initModule({ selector: element ? element : '.quantity', plugin: 'Quantity' });
1112			},
1113
1114			readmore: function(element) {
1115				return Core.initModule({ selector: element ? element : '[data-readmore]', plugin: 'ReadMore' });
1116			},
1117
1118			pricingSwitcher: function(element) {
1119				return Core.initModule({ selector: element ? element : '.pricing-tenure-switcher', plugin: 'PricingSwitcher' });
1120			},
1121
1122			ajaxTrigger: function(element) {
1123				return Core.initModule({ selector: element ? element : '[data-ajax-loader]', plugin: 'AjaxTrigger' });
1124			},
1125
1126			videoFacade: function(element) {
1127				return Core.initModule({ selector: element ? element : '.video-facade', plugin: 'VideoFacade' });
1128			},
1129
1130			schemeToggle: function(element) {
1131				return Core.initModule({ selector: element ? element : '.body-scheme-toggle', plugin: 'SchemeToggle' });
1132			},
1133
1134			clipboardCopy: function(element) {
1135				return Core.initModule({ selector: element ? element : '.clipboard-copy', plugin: 'Clipboard' });
1136			},
1137
1138			codeHighlight: function(element) {
1139				return Core.initModule({ selector: element ? element : '.code-highlight', plugin: 'CodeHighlight' });
1140			},
1141
1142			tips: function() {
1143				if( vars.tips ) {
1144					return Core.initModule({ selector: 'body', plugin: 'Tips' });
1145				}
1146			},
1147
1148			textSplitter: function(element) {
1149				return Core.initModule({ selector: element ? element : '.text-splitter', plugin: 'TextSplitter' });
1150			},
1151
1152			mediaActions: function(element) {
1153				return Core.initModule({ selector: element ? element : '.media-wrap', plugin: 'MediaActions' });
1154			},
1155
1156			viewportDetect: function(element) {
1157				return Core.initModule({ selector: element ? element : '.viewport-detect', plugin: 'ViewportDetect' });
1158			},
1159
1160			scrollDetect: function(element) {
1161				return Core.initModule({ selector: element ? element : '.scroll-detect', plugin: 'ScrollDetect' });
1162			},
1163
1164			fontSizer: function(element) {
1165				return Core.initModule({ selector: element ? element : '.font-sizer', plugin: 'FontSizer' });
1166			},
1167
1168			hover3D: function(element) {
1169				return Core.initModule({ selector: element ? element : '.hover-3d', plugin: 'Hover3D' });
1170			},
1171
1172			buttons: function(element) {
1173				return Core.initModule({ selector: element ? element : '.button-text-effect', plugin: 'Buttons' });
1174			},
1175
1176			bsComponents: function(element) {
1177				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' });
1178			}
1179		};
1180	}();
1181
1182	var Mobile = function() {
1183		return {
1184			Android: function()  {
1185				return navigator.userAgent.match(/Android/i);
1186			},
1187			BlackBerry: function()  {
1188				return navigator.userAgent.match(/BlackBerry/i);
1189			},
1190			iOS: function()  {
1191				return navigator.userAgent.match(/iPhone|iPad|iPod/i);
1192			},
1193			Opera: function()  {
1194				return navigator.userAgent.match(/Opera Mini/i);
1195			},
1196			Windows: function()  {
1197				return navigator.userAgent.match(/IEMobile/i);
1198			},
1199			any: function()  {
1200				return (Mobile.Android() || Mobile.BlackBerry() || Mobile.iOS() || Mobile.Opera() || Mobile.Windows());
1201			}
1202		}
1203	}();
1204
1205	// Add your Custom JS Codes here
1206	var Custom = function() {
1207		return {
1208			onReady: function() {
1209				// Add JS Codes here to Run on Document Ready
1210			},
1211
1212			onLoad: function() {
1213				// Add JS Codes here to Run on Window Load
1214			},
1215
1216			onResize: function() {
1217				// Add JS Codes here to Run on Window Resize
1218			}
1219		}
1220	}();
1221
1222	var DocumentOnResize = function() {
1223		return {
1224			init: function() {
1225				Core.viewport();
1226				Core.breakpoints();
1227				Base.menuBreakpoint();
1228
1229				Core.run(vars.resizers);
1230
1231				Custom.onResize();
1232				Core.addEvent( window, 'cnvsResize' );
1233			}
1234		};
1235	}();
1236
1237	var DocumentOnReady = function() {
1238		return {
1239			init: function() {
1240				Core.breakpoints();
1241				Core.colorScheme();
1242				Core.runBase();
1243				Core.runModules();
1244				Core.topScrollOffset();
1245
1246				if( vars.smoothScroll ) {
1247					new Core.smoothScroll();
1248				}
1249
1250				DocumentOnReady.windowscroll();
1251
1252				Custom.onReady();
1253			},
1254
1255			windowscroll: function() {
1256				Core.scrollEnd( function() {
1257					Base.pageMenu();
1258				});
1259			}
1260		};
1261	}();
1262
1263	var DocumentOnLoad = function() {
1264		return {
1265			init: function() {
1266				Custom.onLoad();
1267			}
1268		};
1269	}();
1270
1271	document.addEventListener( 'DOMContentLoaded', function() {
1272		DocumentOnReady.init();
1273	});
1274
1275	window.addEventListener('load', function() {
1276		DocumentOnLoad.init();
1277	});
1278
1279	var resizeFunctions = Core.debouncedResize( function() {
1280		DocumentOnResize.init();
1281	}, 250);
1282
1283	window.addEventListener('resize', function() {
1284		resizeFunctions();
1285	});
1286
1287	var canvas_umd = {
1288		Core,
1289		Base,
1290		Modules,
1291		Mobile,
1292		Custom,
1293	};
1294
1295	return canvas_umd;
1296})));
1297
1298(function (global, factory) {
1299	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
1300	typeof define === 'function' && define.amd ? define(factory) :
1301	( global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.CNVS = factory() );
1302} (this, (function() {
1303	// USE STRICT
1304	"use strict";
1305
1306	/**
1307	 * --------------------------------------------------------------------------
1308	 * DO NOT DELETE!! Start (Required)
1309	 * --------------------------------------------------------------------------
1310	 */
1311	if( SEMICOLON === 'undefined' || SEMICOLON.Core === 'undefined' || SEMICOLON.Base === 'undefined' || SEMICOLON.Modules === 'undefined' || SEMICOLON.Mobile === 'undefined' ) {
1312		return false;
1313	}
1314
1315	return {};
1316})));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.