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.